Skip to content

Navigation Menu

Sign in
Sign up

Repository files navigation

πŸ› οΈ LLM Toolkit

A TypeScript toolkit for integrating Large Language Models with tool execution capabilities.

🎯 Purpose & Features

A toolkit for integrating LLM applications with tool execution capabilities. Provides functionality for handling tool calls, managing chat sessions, and executing operations.

  • 🎯 Clean API: Simple interface with minimal setup required
  • πŸ“ Type Safety: Full TypeScript support with type definitions
  • πŸ“± Session Management: Session handling with abort controls and permission inheritance
  • 🧠 Context: System prompts with environment-aware ContextSys integration
  • πŸ”§ Tool Execution: Tool registration with error handling and validation
  • πŸ”’ Permission System: Approval controls for tool execution with approve, deny, and allow_all options
  • πŸ›‘οΈ Security: Security measures with tool usage restrictions and validation
  • 🌊 Streaming Support: API for both streaming and standard responses
  • ⚑ Event-Driven: Real-time callbacks for thinking, messages, tool calls, and results

Note

This toolkit provides LLM-tool integration with permission controls. The Orchestrator handles chat interactions, tool execution, and user permissions, while ContextSys provides environment context for AI responses.

πŸ—οΈ Architecture

sequenceDiagram
 participant User
 participant Orchestrator
 participant ContextSys
 participant ChatManager
 participant ToolExecutor
 participant LLM
 participant Tools
 User->>Orchestrator: Send chat request
 Orchestrator->>ContextSys: Get system prompt
 ContextSys-->>Orchestrator: Return context
 Orchestrator->>ChatManager: Add user message + system context
 Orchestrator->>LLM: Send request with tools
 LLM-->>Orchestrator: Response with tool calls
 loop For each tool call
 Orchestrator->>User: Request permission
 User-->>Orchestrator: Approve/Deny/Allow All
 alt Permission Granted
 Orchestrator->>ToolExecutor: Execute tool
 ToolExecutor->>Tools: Run tool logic
 Tools-->>ToolExecutor: Return result
 ToolExecutor-->>Orchestrator: Tool result
 Orchestrator->>ChatManager: Add tool result to session
 else Permission Denied
 Orchestrator->>User: Abort session
 end
 end
 Orchestrator->>LLM: Send updated context
 LLM-->>Orchestrator: Final response
 Orchestrator->>ChatManager: Add final message
 Orchestrator-->>User: Return session with abort capability
Loading

🧩 Components:

  • Core: Tool execution logic and validation
  • Integrator: Chat orchestration, session management, and permission handling
  • Interfaces: TypeScript type definitions for all components
  • Schemas: Tool schema definitions for LLM integration
  • Utils: Utility functions for ID generation and common operations

πŸ§ͺ How to Test

πŸ”§ Prerequisites

  1. πŸ‘€ Create Ollama Account

  2. πŸ“¦ Clone Repository

    git clone https://github.com/NeaByteLab/LLM-Toolkit.git
    cd LLM-Toolkit
  3. βš™οΈ Environment Setup

    # Create environment file
    echo "OLLAMA_KEY=your_api_key_here" > .env
    # Edit .env and replace with your actual API key
    # OLLAMA_KEY=your_actual_api_key_here
  4. πŸ“¦ Install Dependencies

    npm install

πŸš€ Running Tests

🎯 Main Example

npx tsx ./src/index.ts

This demonstrates the complete toolkit with:

  • Permission system (denies TerminalCmd, approves FileCreate/FileEdit)
  • Streaming responses
  • Auto-abort after 3 seconds
  • All event callbacks

πŸ”§ Adding Custom Tools

πŸ“ File Structure

src/
β”œβ”€β”€ schemas/ # Tool schema definitions
β”œβ”€β”€ core/
β”‚ β”œβ”€β”€ base/ # Tool implementation logic
β”‚ └── ToolExecutor.ts # Tool registration & execution

πŸ“‹ Steps

  1. Create Schema (/src/schemas/YourTool.ts)

    export default {
     type: 'function',
     function: {
     name: 'your_tool_name',
     description: 'What your tool does',
     parameters: {
     type: 'object',
     properties: {
     param1: { type: 'string', description: 'Description' }
     },
     required: ['param1']
     }
     }
    }
  2. Implement Logic (/src/core/base/YourTool.ts)

    export default class YourTool {
     private readonly param1: string
     constructor(args: SchemaYourTool) {
     const { param1 } = args
     this.param1 = param1
     }
     async execute(): Promise<string> {
     const resValidate = this.validate()
     if (resValidate !== 'ok') {
     return resValidate
     }
     // Your logic here
     return 'Success message'
     }
     private validate(): string {
     if (typeof this.param1 !== 'string') {
     return '`param1` must be a string.'
     }
     return 'ok'
     }
    }
  3. Register in ToolExecutor.ts

    // Add import
    import YourTool from '@core/base/YourTool'
    import type { SchemaYourTool } from '@root/interfaces/index'
    // Add to switch statement
    case 'your_tool_name':
     return new YourTool(args as SchemaYourTool).execute()

🎨 Customizing Prompts & Context

πŸ€– System Prompt (/src/integrator/ContextSys.ts)

To edit the AI's behavior and personality:

  • πŸ”§ Modify getSystemPrompt() method
  • βž•βž– Add/remove capabilities, guidelines, or instructions
  • 🎭 Customize the AI agent's behavior and personality
  • πŸ”’ Update security guidelines or tool usage rules

🌍 Context Information (/src/integrator/ContextEnv.ts)

To edit the environment context:

  • πŸ”§ Modify getContext() to change format or add/remove information
  • βž• Add new methods to gather additional system information
  • ⏰ Customize time format in getTimeInfo()
  • πŸ’» Add more OS details in getOSInfo()
  • πŸ“ Include additional path information in getPathInfo()

πŸ”’ Permission System

The toolkit includes a permission system for controlling tool execution:

Permission Actions

  • approve: Allow this specific tool call
  • deny: Block this tool call and abort session
  • allow_all: Approve this call and all future calls in this session

Example Usage

const session = await orchestrator.chat(message, {
 onAskPermission: (data) => {
 console.log(`Permission requested for: ${data.toolName}`)
 // Custom permission logic
 if (data.toolName === 'TerminalCmd') {
 return { action: 'deny' } // Block terminal commands
 }
 return { action: 'approve' } // Allow everything else
 },
 // ... other options
})

πŸ›‘ Session Management

Session Control

// Abort specific session
session.abort()
// Check if session is active
const isActive = session.isActive()
// Abort all sessions
orchestrator.abort()

Session Lifecycle

  1. Auto-creation: Sessions are created when you call chat()
  2. Context injection: System prompt is added on first message
  3. Permission tracking: Session remembers "allow all" settings
  4. Termination: Abort stops all operations

πŸ”§ Additional Modules

🧠 Embedding Module

  • Embedding README : Text vectorization and similarity search using transformer models
  • Provides semantic search, text similarity, and content clustering capabilities
  • Independent module for advanced text processing features

πŸ“„ License

This project is licensed under the MIT license. See the LICENSE file for more info.

About

A simple toolkit that provides basic schemas and validation logic for tool calling functionality in Large Language Model applications.

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Contributors

Languages

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /