UNPKG

@nomyx/assistant

Version:

A powerful assistant library and cli for your AI projects. works with Vertex AI (Claude and Gemini)

109 lines (91 loc) 2.75 kB
import readline from 'readline'; import { AIAssistant } from './AIAssistant'; import dotenv from 'dotenv'; import path from 'path'; import { ExecutionOptions } from './types/execution'; import { Tool } from './types/tool'; dotenv.config({ path: path.resolve(__dirname, '../.env') }); const tools: Tool[] = []; const executionOptions: ExecutionOptions & { maxHistoryLength?: number; initialWorkingDirectory?: string; providerName?: string; tools?: Tool[]; } = { maxRetries: 3, retryDelayMs: 1000, timeoutMs: 30000, statePersistenceDir: './state', maxHistoryLength: 5, initialWorkingDirectory: process.cwd(), providerName: process.env.AI_PROVIDER || 'openai', tools: tools }; async function initializeAssistant(): Promise<AIAssistant> { const assistant = new AIAssistant(console as any, executionOptions); await assistant.initialize(); return assistant; } async function processQuery(query: string): Promise<void> { const assistant = await initializeAssistant(); try { const stream = await assistant.processRequestStreamWithDetails(query); let buffer = ''; for await (const chunk of stream) { buffer += chunk; let parsedData; try { parsedData = JSON.parse(buffer); buffer = ''; // Reset buffer after successful parse } catch (e) { // If parsing fails, continue to next chunk continue; } if (parsedData.choices && parsedData.choices[0] && parsedData.choices[0].delta) { const delta = parsedData.choices[0].delta; if (delta.content) { process.stdout.write(delta.content); } if (delta.tool_calls) { for (const toolCall of delta.tool_calls) { process.stdout.write(`[Tool Execution: ${toolCall.function.name}]\n`); process.stdout.write(`Arguments: ${JSON.stringify(toolCall.function.arguments)}\n`); } } } } } catch (error) { process.stderr.write(`Error: ${error}\n`); } } async function startInteractiveMode(): Promise<void> { const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.on('line', async (input) => { if (input.trim()) { await processQuery(input); rl.prompt(); } }); rl.on('close', () => { process.exit(0); }); rl.prompt(); } export async function main(): Promise<void> { const args = process.argv.slice(2); if (args.length > 0) { const query = args.join(' '); await processQuery(query); } else { await startInteractiveMode(); } } if (require.main === module) { main().catch((error) => { process.stderr.write(`Unhandled error: ${error}\n`); process.exit(1); }); }