UNPKG

rocket-ai

Version:

Simple AI Client that lets you access different LLMs in a unified way.

1 lines 51.7 kB
{"version":3,"sources":["../src/client/clients/open-ai.ts","../src/client/clients/anthropic.ts","../src/client/clients/google.ts","../src/client/clients/fireworks-ai.ts","../src/types/ai-model-type.ts","../src/client/libs/get-fw-model.ts","../src/client/prompts/structured-output.ts","../src/client/ai-client.ts","../src/client/agents/agent.ts","../src/client/agents/tools/tool-registry.ts","../src/client/agents/tools/tool.ts","../src/client/agents/tools/tool-helper.ts","../src/client/libs/usage-counter.ts","../src/client/prompts/react-template.ts","../src/client/prompts/templates.ts"],"sourcesContent":["import {\n AiImageSize, AiMessage, AiMessageResponse, AiMessageResponseImage, AiVoice, LlmGenerateImage,\n LlmGenerateSpeech, LlmInvoke, LlmStream\n} from \"../../types\";\nimport dotenv from \"dotenv\";\nimport OpenAi from \"openai\";\n\n\ndotenv.config();\n\n\nexport class OpenAiClient implements LlmInvoke, LlmStream, LlmGenerateImage, LlmGenerateSpeech {\n\n protected apiKey: string;\n protected baseUrl: string;\n\n\n constructor(protected client = new OpenAi(), apiKey?: string, baseUrl?: string) {\n this.apiKey = apiKey ?? process.env.OPENAI_API_KEY!;\n this.baseUrl = baseUrl ?? 'https://api.openai.com/v1';\n\n\n if (!this.apiKey) {\n throw new Error('OpenAI API key is required. Set it in config or via OPENAI_API_KEY environment variable.');\n }\n }\n\n async invoke(model: string, messages: AiMessage[], systemPrompt: string, temperature: number = 0.7): Promise<AiMessageResponse> {\n\n messages.unshift({\n role: 'system',\n content: systemPrompt\n })\n\n const response = await this.client.chat.completions.create({\n model: model,\n messages: messages as any,\n temperature\n });\n\n return {\n content: response.choices[0]?.message?.content ?? '',\n usage: {\n inputTokens: response.usage?.prompt_tokens ?? 0,\n outputTokens: response.usage?.completion_tokens ?? 0,\n totalTokens: response.usage?.total_tokens ?? 0\n }\n }\n }\n\n async* stream(model: string, messages: AiMessage[], systemPrompt: string, temperature: number = 0.7): AsyncGenerator<AiMessageResponse, void, unknown> {\n\n messages.unshift({\n role: 'system',\n content: systemPrompt,\n })\n\n const stream = await this.client.chat.completions.create({\n model: model,\n messages: messages as any,\n temperature,\n stream: true,\n stream_options: {\n include_usage: true\n }\n })\n\n for await (const chunk of stream) {\n yield {\n content: chunk.choices[0]?.delta?.content ?? '',\n usage: {\n inputTokens: chunk.usage?.prompt_tokens ?? 0,\n outputTokens: chunk.usage?.completion_tokens ?? 0,\n totalTokens: chunk.usage?.total_tokens ?? 0\n }\n }\n }\n }\n\n async generateImage(model: string, messages: string, size: AiImageSize, n = 1): Promise<AiMessageResponseImage> {\n const response = await this.client.images.generate({\n model: 'dall-e-3',\n prompt: messages,\n n: n,\n size: size\n });\n\n return {\n url: response.data[0]?.url ?? '',\n revisedPrompt: response.data[0]?.revised_prompt ?? '',\n }\n }\n\n async generateSpeech(model: string, messages: string, voice: AiVoice): Promise<string> {\n const voiceResponse = await this.client.audio.speech.create({\n model: 'tts-1',\n input: messages,\n voice: voice,\n });\n\n const buffer = Buffer.from(await voiceResponse.arrayBuffer());\n return buffer.toString('base64');\n }\n\n}","import {AiMessage, AiMessageResponse, LlmInvoke, LlmStream} from \"../../types\";\nimport Anthropic from '@anthropic-ai/sdk';\nimport dotenv from \"dotenv\";\n\ndotenv.config();\n\n\n/**\n * The AnthropicAiClient class provides methods to interact with the Anthropic AI API.\n * It supports both synchronous invocation and streaming of AI responses.\n */\nexport class AnthropicAiClient implements LlmInvoke, LlmStream {\n\n protected apiKey: string;\n protected baseUrl: string;\n\n\n /**\n * Constructs an AnthropicAiClient instance.\n * @param {Anthropic} client - An instance of the Anthropic client.\n * @param {string} [apiKey] - The API key for authenticating with the Anthropic API.\n * @param {string} [baseUrl] - The base URL for the Anthropic API.\n * @throws Will throw an error if the API key is not provided.\n */\n constructor(protected client = new Anthropic(), apiKey?: string, baseUrl?: string) {\n this.apiKey = apiKey ?? process.env.ANTHROPIC_API_KEY!;\n this.baseUrl = baseUrl ?? 'https://api.anthropic.com/v1';\n\n\n if (!this.apiKey) {\n throw new Error('Anthropic API key is required. Set it in config or via ANTHROPIC_API_KEY environment variable.');\n }\n }\n\n /**\n * Invokes the AI model with the provided messages and system prompt.\n * @param {string} model - The model to use for the invocation.\n * @param {AiMessage[]} messages - An array of messages to send to the model.\n * @param {string} systemPrompt - The system prompt to use for the invocation.\n * @returns {Promise<AiMessageResponse>} - The response from the AI model.\n */\n async invoke(model: string, messages: AiMessage[], systemPrompt: string): Promise<AiMessageResponse> {\n\n\n const response = await this.client.messages.create({\n model: model,\n max_tokens: 4096,\n stream: false,\n messages: messages as any,\n system: systemPrompt\n });\n\n return {\n content: response.content[0].type === 'text' ? response.content[0].text : '',\n usage: {\n inputTokens: response.usage?.input_tokens ?? 0,\n outputTokens: response.usage?.output_tokens ?? 0,\n totalTokens: response.usage?.input_tokens + response.usage?.output_tokens\n }\n }\n }\n\n /**\n * Streams the AI model responses for the provided messages and system prompt.\n * @param {string} model - The model to use for the streaming.\n * @param {AiMessage[]} messages - An array of messages to send to the model.\n * @param {string} systemPrompt - The system prompt to use for the streaming.\n * @returns {AsyncGenerator<AiMessageResponse, void, unknown>} - An async generator yielding AI model responses.\n */\n async* stream(model: string, messages: AiMessage[], systemPrompt: string): AsyncGenerator<AiMessageResponse, void, unknown> {\n const stream = this.client.messages.stream({\n model: model,\n messages: messages as any,\n max_tokens: 4096,\n system: systemPrompt\n })\n\n for await (const chunk of stream) {\n\n if (chunk.type === 'content_block_delta') {\n yield {\n // @ts-expect-error - TS doesn't know about the content_block_delta type\n content: chunk.delta.text ?? '',\n usage: {\n // @ts-expect-error - TS doesn't know about the content_block_delta type\n inputTokens: chunk.usage?.prompt_tokens ?? 0,\n // @ts-expect-error - TS doesn't know about the content_block_delta type\n outputTokens: chunk.usage?.completion_tokens ?? 0,\n // @ts-expect-error - TS doesn't know about the content_block_delta type\n totalTokens: chunk.usage?.total_tokens ?? 0\n }\n }\n }\n\n if (chunk.type === 'message_delta') {\n yield {\n // @ts-expect-error - TS doesn't know about the content_block_delta type\n content: chunk.delta.text ?? '',\n usage: {\n // @ts-expect-error - TS doesn't know about the content_block_delta type\n inputTokens: chunk.usage?.prompt_tokens ?? 0,\n outputTokens: chunk.usage?.output_tokens ?? 0,\n // @ts-expect-error - TS doesn't know about the content_block_delta type\n totalTokens: chunk.usage?.total_tokens ?? 0\n }\n }\n }\n }\n }\n}","import {AiMessage, AiMessageResponse, LlmInvoke, LlmStream} from \"../../types\";\nimport dotenv from \"dotenv\";\nimport {GoogleGenerativeAI, Content} from '@google/generative-ai';\n\ndotenv.config();\n\nexport class GoogleAiClient implements LlmInvoke, LlmStream {\n\n protected apiKey: string;\n protected client: GoogleGenerativeAI;\n\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey ?? process.env.GOOGLE_API_KEY!;\n this.client = new GoogleGenerativeAI(this.apiKey);\n\n\n if (!this.apiKey) {\n throw new Error('Gemini API key is required. Set it in config or via GEMINI_API_KEY environment variable.');\n }\n }\n\n async invoke(model: string, messages: AiMessage[]): Promise<AiMessageResponse> {\n\n const chatModel = this.client.getGenerativeModel({\n model\n })\n\n const mappedMessages: Content[] = messages.map((message) => {\n if (message.role === 'user') {\n return {\n role: 'user',\n parts: [{text: message.content}],\n };\n } else {\n return {\n role: 'model',\n parts: [{text: message.content}],\n };\n }\n });\n\n\n const chat = chatModel.startChat({\n history: mappedMessages,\n generationConfig: {\n maxOutputTokens: 4096,\n temperature: 0.7,\n },\n });\n\n const result = await chat.sendMessage(messages[messages.length - 1].content);\n const response = result.response;\n\n return {\n content: response.text(),\n usage: {\n inputTokens: response.usageMetadata?.promptTokenCount ?? 0,\n outputTokens: response.usageMetadata?.candidatesTokenCount ?? 0,\n totalTokens: response.usageMetadata?.totalTokenCount ?? 0\n }\n }\n\n }\n\n async *stream(model: string, messages: AiMessage[], systemPrompt: string): AsyncGenerator<AiMessageResponse, void, unknown> {\n\n const chatModel = this.client.getGenerativeModel({\n systemInstruction: systemPrompt,\n model\n })\n\n const mappedMessages: Content[] = messages.map((message) => {\n if (message.role === 'user') {\n return {\n role: 'user',\n parts: [{text: message.content}],\n };\n } else {\n return {\n role: 'model',\n parts: [{text: message.content}],\n };\n }\n });\n\n\n const chat = chatModel.startChat({\n history: mappedMessages,\n generationConfig: {\n maxOutputTokens: 4096,\n temperature: 0.7,\n },\n });\n\n const stream = await chat.sendMessageStream(messages[messages.length - 1].content);\n\n for await (const chunk of stream.stream) {\n yield {\n content: chunk.text(),\n usage: {\n inputTokens: chunk.usageMetadata?.promptTokenCount ?? 0,\n outputTokens: chunk.usageMetadata?.candidatesTokenCount ?? 0,\n totalTokens: chunk.usageMetadata?.totalTokenCount ?? 0\n }\n }\n }\n }\n}","import {\n AiMessage,\n AiMessageResponse,\n LlmInvoke,\n LlmStream\n} from \"../../types\";\nimport dotenv from \"dotenv\";\nimport OpenAi from \"openai\";\nimport {getFwModel} from \"../libs/get-fw-model\";\n\n\ndotenv.config();\n\n\nexport class FireworksAiClient implements LlmInvoke, LlmStream {\n\n protected apiKey: string;\n protected baseUrl: string;\n\n\n constructor(protected client = new OpenAi(), apiKey?: string, baseUrl?: string) {\n this.apiKey = apiKey ?? process.env.FIREWORKS_API_KEY!;\n this.baseUrl = baseUrl ?? 'https://api.fireworks.ai/inference/v1';\n\n\n if (!this.apiKey) {\n throw new Error('FireworksAI API key is required. Set it in config or via FIREWORKS_API_KEY environment variable.');\n }\n }\n\n async invoke(model: string, messages: AiMessage[], systemPrompt: string): Promise<AiMessageResponse> {\n\n messages.unshift({\n role: 'system',\n content: systemPrompt\n })\n\n const response = await this.client.chat.completions.create({\n model: getFwModel(model),\n messages: messages as any\n });\n\n return {\n content: response.choices[0]?.message?.content ?? '',\n usage: {\n inputTokens: response.usage?.prompt_tokens ?? 0,\n outputTokens: response.usage?.completion_tokens ?? 0,\n totalTokens: response.usage?.total_tokens ?? 0\n }\n }\n }\n\n async* stream(model: string, messages: AiMessage[], systemPrompt: string): AsyncGenerator<AiMessageResponse, void, unknown> {\n\n messages.unshift({\n role: 'system',\n content: systemPrompt\n })\n\n const stream = await this.client.chat.completions.create({\n model: getFwModel(model),\n messages: messages as any,\n stream: true,\n stream_options: {\n include_usage: true\n }\n })\n\n for await (const chunk of stream) {\n yield {\n content: chunk.choices[0]?.delta?.content ?? '',\n usage: {\n inputTokens: chunk.usage?.prompt_tokens ?? 0,\n outputTokens: chunk.usage?.completion_tokens ?? 0,\n totalTokens: chunk.usage?.total_tokens ?? 0\n }\n }\n }\n }\n}","export enum AiModelType {\n Gpt4o = 'gpt-4o',\n Gpt4oMini = 'gpt-4o-mini',\n DallE3 = 'dall-e3',\n GptTextToSpeech = 'tts-1',\n O1Preview = 'o1-preview',\n O1Mini = 'o1-mini',\n Claude37SonnetLatest = 'claude-3-7-sonnet-latest',\n Claude35HaikuLatest = 'claude-3-5-haiku-latest',\n Gemini20FlashLatest = 'gemini-2.0-flash-latest',\n Gemini15FlashLatest = 'gemini-1.5-flash-latest',\n Gemini15ProLatest = 'gemini-1.5-pro-latest',\n Llama33 = 'fw-llama-3-3',\n DeepSeekV3 = 'fw-deepseek-v3',\n DeepSeekR1 = 'fw-deepseek-r1',\n}","import { AiModelType } from \"../../types\"\n\nexport const getFwModel = (model: string) => {\n if (model === AiModelType.Llama33) {\n return \"accounts/fireworks/models/llama-v3p3-70b-instruct\"\n }\n\n if (model === AiModelType.DeepSeekV3) {\n return \"accounts/fireworks/models/deepseek-v3\"\n }\n\n if (model === AiModelType.DeepSeekR1) {\n return \"accounts/fireworks/models/deepseek-r1\"\n }\n\n return \"accounts/fireworks/models/llama-v3p3-70b-instruct\"\n}","import zodToJsonSchema from \"zod-to-json-schema\";\nimport {z} from \"zod\";\n\nexport class StructuredOutputTemplate {\n public static getFormatInstructions(schema: z.ZodSchema<any>): string {\n return `\\n\\nYou must format your output as a JSON value that adheres to a given \"JSON Schema\" instance.\n\n \"JSON Schema\" is a declarative language that allows you to annotate and validate JSON documents.\n \n For example, the example \"JSON Schema\" instance {{\"properties\": {{\"foo\": {{\"description\": \"a list of test words\", \"type\": \"array\", \"items\": {{\"type\": \"string\"}}}}}}, \"required\": [\"foo\"]}}}}\n would match an object with one required property, \"foo\". The \"type\" property specifies \"foo\" must be an \"array\", and the \"description\" property semantically describes it as \"a list of test words\". The items within \"foo\" must be strings.\n Thus, the object {{\"foo\": [\"bar\", \"baz\"]}} is a well-formatted instance of this example \"JSON Schema\". The object {{\"properties\": {{\"foo\": [\"bar\", \"baz\"]}}}} is not well-formatted.\n \n Your output will be parsed and type-checked according to the provided schema instance, so make sure all fields in your output match the schema exactly and there are no trailing commas!\n \n Here is the JSON Schema instance your output must adhere to. Do not include the enclosing markdown codeblock:\n \\`\\`\\`json\n ${JSON.stringify(zodToJsonSchema(schema))}\n \\`\\`\\`\n `;\n }\n}","import {OpenAiClient} from \"./clients/open-ai\";\nimport {AnthropicAiClient} from \"./clients/anthropic\";\nimport {GoogleAiClient} from \"./clients/google\";\nimport {FireworksAiClient} from \"./clients/fireworks-ai\";\nimport {z} from \"zod\";\nimport {\n InvokeOptions,\n StreamOptions,\n AiMessageResponse,\n AiMessageResponseImage,\n AiModelType,\n AiVoice,\n GenerateImageOptions\n} from '../types';\nimport {StructuredOutputTemplate} from \"./prompts/structured-output\";\n\n/**\n * AiClient class provides methods to interact with various AI model providers.\n * It supports invoking models, streaming responses, generating images, and generating speech.\n */\nexport class AiClient {\n private structuredOutputSchema?: z.ZodSchema<any>;\n private options: Partial<InvokeOptions & StreamOptions> = {};\n\n /**\n * Constructs an instance of AiClient.\n * @param clients - Optional custom clients for AI providers.\n * @param modelProviderMap - Optional custom mapping of models to providers.\n */\n constructor(private clients?: any, private modelProviderMap?: any) {\n this.clients = {\n openai: new OpenAiClient(),\n anthropic: new AnthropicAiClient(),\n gemini: new GoogleAiClient(),\n fireworks: new FireworksAiClient()\n };\n\n this.modelProviderMap = {\n [AiModelType.Gpt4o]: 'openai',\n [AiModelType.Gpt4oMini]: 'openai',\n [AiModelType.GptTextToSpeech]: 'openai',\n [AiModelType.DallE3]: 'openai',\n [AiModelType.O1Preview]: 'openai',\n [AiModelType.O1Mini]: 'openai',\n [AiModelType.Claude37SonnetLatest]: 'anthropic',\n [AiModelType.Claude35HaikuLatest]: 'anthropic',\n [AiModelType.Gemini20FlashLatest]: 'gemini',\n [AiModelType.Gemini15FlashLatest]: 'gemini',\n [AiModelType.Gemini15ProLatest]: 'gemini',\n [AiModelType.Llama33]: 'fireworks',\n [AiModelType.DeepSeekV3]: 'fireworks',\n [AiModelType.DeepSeekR1]: 'fireworks',\n };\n }\n\n /**\n * Gets the provider name by model type.\n * @param model - The model type.\n * @returns The provider name.\n * @throws Will throw an error if no provider is found for the model.\n */\n _getProviderByModel(model: string) {\n const provider = this.modelProviderMap[model];\n if (!provider) {\n throw new Error(`No provider found for model: ${model}`);\n }\n return provider;\n }\n\n /**\n * Sets the structured output schema for the client.\n * @param schema - The Zod schema for structured output.\n * @returns The AiClient instance.\n */\n withStructuredOutput(schema: z.ZodSchema<any>): AiClient {\n this.structuredOutputSchema = schema;\n return this;\n }\n\n /**\n * Sets options for invoking or streaming.\n * @param options - The options to set.\n * @returns The AiClient instance.\n */\n setOptions(options: Partial<InvokeOptions & StreamOptions>): AiClient {\n this.options = {...this.options, ...options};\n return this;\n }\n\n /**\n * Invokes an AI model with the given options.\n * @param options - The options for invoking the model.\n * @returns A promise that resolves to the AI message response.\n */\n async invoke(options: InvokeOptions): Promise<AiMessageResponse> {\n const fullOptions = this.prepareOptions(options);\n return this._invokeOrStream(fullOptions, 'invoke');\n }\n\n /**\n * Streams responses from an AI model with the given options.\n * @param options - The options for streaming responses.\n * @returns A promise that resolves to an async generator of AI message responses.\n */\n async stream(options: StreamOptions): Promise<AsyncGenerator<AiMessageResponse, void, unknown>> {\n const fullOptions = this.prepareOptions(options);\n return this._invokeOrStream(fullOptions, 'stream');\n }\n\n /**\n * Prepares options by adding the structured output schema to the system prompt if available.\n * @param options - The options to prepare.\n * @returns The prepared options.\n */\n private prepareOptions(options: InvokeOptions | StreamOptions): InvokeOptions | StreamOptions {\n let {systemPrompt} = options;\n\n if (this.structuredOutputSchema) {\n systemPrompt += StructuredOutputTemplate.getFormatInstructions(this.structuredOutputSchema);\n }\n\n return {...options, systemPrompt};\n }\n\n /**\n * Invokes or streams responses from an AI model based on the method specified.\n * @param options - The options for invoking or streaming.\n * @param method - The method to use ('invoke' or 'stream').\n * @returns A promise that resolves to the AI message response or an async generator of AI message responses.\n * @throws Will throw an error if the provider is not configured.\n */\n private async _invokeOrStream(\n options: InvokeOptions | StreamOptions,\n method: 'invoke',\n ): Promise<AiMessageResponse>;\n private async _invokeOrStream(\n options: InvokeOptions | StreamOptions,\n method: 'stream',\n ): Promise<AsyncGenerator<AiMessageResponse, void, unknown>>;\n private async _invokeOrStream(\n options: InvokeOptions | StreamOptions,\n method: 'invoke' | 'stream'\n ): Promise<any> {\n const {model, messages, systemPrompt} = options;\n const provider = this._getProviderByModel(model);\n const client = this.clients[provider];\n\n if (!client) {\n throw new Error(`Provider ${provider} is not configured.`);\n }\n\n // eslint-disable-next-line no-useless-catch\n try {\n const res = await client[method](model, messages, systemPrompt);\n this.structuredOutputSchema = undefined;\n return res;\n } catch (e) {\n throw e;\n }\n }\n\n /**\n * Generates an image using the specified options.\n * @param options - The options for generating the image.\n * @returns A promise that resolves to the AI message response image.\n * @throws Will throw an error if the provider is not configured.\n */\n async generateImage(options: GenerateImageOptions): Promise<AiMessageResponseImage> {\n const {model, prompt, size, n} = options;\n const provider = this._getProviderByModel(model);\n const client = this.clients[provider];\n\n if (!client) {\n throw new Error(`Provider ${provider} is not configured.`);\n }\n try {\n return await client.generateImage(model, prompt, size, n);\n } catch (e) {\n throw e;\n }\n }\n\n /**\n * Generates speech using the specified model, messages, and voice.\n * @param model - The model type.\n * @param messages - The messages to convert to speech.\n * @param voice - The voice to use for speech generation.\n * @returns A promise that resolves to the generated speech as a string.\n * @throws Will throw an error if the provider is not configured.\n */\n async generateSpeech(model: string, messages: string, voice: AiVoice): Promise<string> {\n const provider = this._getProviderByModel(model);\n const client = this.clients[provider];\n\n if (!client) {\n throw new Error(`Provider ${provider} is not configured.`);\n }\n try {\n return await client.generateSpeech(model, messages, voice);\n } catch (e) {\n throw e;\n }\n }\n}","import {AiClient} from \"../ai-client\";\nimport {z, ZodSchema} from \"zod\";\nimport {ToolRegistry} from \"./tools\";\nimport {UsageCounter} from \"../libs/usage-counter\";\nimport {ReActTemplate} from \"../prompts/react-template\";\nimport {AiMessageResponse} from \"../../types\";\n\n/**\n * The Agent class is responsible for managing the interaction with the AI client,\n * handling tool registration, and executing tasks based on user input.\n */\nexport class Agent {\n private client: AiClient;\n private toolRegistry: ToolRegistry;\n private promptTemplate: ReActTemplate;\n private usageCounter: UsageCounter;\n\n /**\n * Constructs an Agent instance.\n * @param {string} name - The name of the agent.\n * @param {string} [systemPrompt] - An optional system prompt to initialize the agent with.\n */\n constructor(name: string, systemPrompt?: string) {\n this.client = new AiClient();\n this.toolRegistry = new ToolRegistry();\n\n this.promptTemplate = new ReActTemplate(name);\n systemPrompt ? this.promptTemplate.addInstruction(systemPrompt) : this.promptTemplate.useDefaultInstructions();\n this.usageCounter = new UsageCounter();\n }\n\n /**\n * Registers a list of tools with the agent.\n * @param {Array<any>} tools - An array of tools to register.\n */\n registerTools(tools: Array<any>) {\n this.toolRegistry.registerTools(tools);\n }\n\n /**\n * Executes a task based on the provided input.\n * @param {string} input - The input string for the task.\n * @returns {Promise<AiMessageResponse>} - The final response from the agent.\n */\n async executeTask(input: string): Promise<AiMessageResponse> {\n this.promptTemplate.addOriginalRequest(input);\n\n const toolInfos: Array<any> = [];\n const schemas: Record<string, ZodSchema<any>> = {};\n for (const toolName in this.toolRegistry.getAllTools()) {\n const toolInfo = this.toolRegistry.getToolInfo(toolName);\n if (toolInfo) {\n toolInfos.push(toolInfo);\n schemas[toolName] = toolInfo.queryFormat;\n }\n }\n\n this.promptTemplate.addTool(`You have these tools at your disposal: ${JSON.stringify(toolInfos, null, 2)}`);\n\n let nextPrompt = input;\n let finalResponse: any = null;\n const maxIterations = 10;\n let count = 0;\n\n while (count < maxIterations) {\n count++;\n const prompt = this.promptTemplate.getInstructions();\n\n const reActSchema = z.object({\n thought: z.string(),\n action: z.object({\n tool: z.string().refine((toolName) => toolName in schemas, {message: \"Invalid tool\"}),\n input: z.any(),\n }).optional(),\n answer: z.string(),\n });\n\n const response = await this.client.withStructuredOutput(\n reActSchema\n ).invoke({\n model: 'gpt-4o-mini',\n messages: [{role: \"user\", content: nextPrompt}],\n systemPrompt: prompt,\n temperature: 0,\n });\n\n this.usageCounter.addUsageTokens(response.usage);\n const parsedResponse = reActSchema.safeParse(JSON.parse(response.content));\n\n if (parsedResponse.success && parsedResponse.data.answer) {\n finalResponse = parsedResponse.data.answer;\n break;\n }\n\n if (parsedResponse.success && parsedResponse.data.action) {\n const action = parsedResponse.data.action;\n\n const selectedSchema = schemas[action.tool];\n const toolResponse = await this.toolRegistry.callTool(action.tool, action.input);\n nextPrompt = `Observation: ${toolResponse}`;\n this.promptTemplate.addIteration(count, nextPrompt);\n } else {\n break; // No action or answer and to prevent infinite loop\n }\n }\n\n return {\n content: finalResponse ? finalResponse : \"No valid answer could be provided.\",\n usage: this.usageCounter.getUsage()\n };\n }\n}","import {Tool} from \"./tool\";\n\nexport class ToolRegistry {\n private tools: Record<string, Tool> = {};\n\n registerTools(tools: Tool[]): void {\n tools.forEach((tool) => {\n this.tools[tool.name] = tool;\n console.log(`Registered tool: ${tool.name}`);\n });\n }\n\n async callTool(toolName: string, ...args: any[]): Promise<any> {\n const tool = this.tools[toolName];\n if (tool) {\n console.log(`Calling tool: ${tool.name}`);\n return await tool.execute(...args);\n } else {\n throw new Error(`Tool '${toolName}' not found.`);\n }\n }\n\n getToolInfo(toolName: string): { name: string; description: string, queryFormat: any } {\n const tool = this.tools[toolName];\n if (!tool) {\n throw new Error(`Tool '${toolName}' not found.`);\n }\n return { name: tool.name, description: tool.description, queryFormat: tool.getQueryFormat() };\n }\n\n getAllTools(): Record<string, { name: string; description: string; queryFormat: any }> {\n const toolInfos: Record<string, { name: string; description: string; queryFormat: any }> = {};\n for (const toolName in this.tools) {\n const tool = this.tools[toolName];\n toolInfos[toolName] = {\n name: tool.name,\n description: tool.description,\n queryFormat: tool.getQueryFormat(),\n };\n }\n return toolInfos;\n }\n\n}","import {z} from \"zod\";\nimport zodToJsonSchema from 'zod-to-json-schema';\nimport {generateSchema} from \"@anatine/zod-openapi\";\n\nexport class Tool {\n name: string;\n description: string;\n queryFormat: z.ZodType<any>;\n func: Function;\n\n constructor(func: Function, options: { name: string; description: string; queryFormat: z.ZodType<any> }) {\n this.name = options.name;\n this.description = options.description;\n this.queryFormat = options.queryFormat;\n this.func = func;\n }\n\n async execute(...args: any[]): Promise<any> {\n const validation = this.queryFormat.safeParse(args[0]);\n if (!validation.success) throw new Error(\"Invalid argument: \" + validation.error.message);\n return await this.func(...args);\n }\n\n public getQueryFormat() {\n return JSON.stringify(generateSchema(this.queryFormat));\n }\n}\n","import {Tool} from \"./tool\";\nimport {z} from \"zod\";\n\nexport function tool(func: Function, options: { name: string; description: string; queryFormat: z.ZodType<any> }) {\n return new Tool(func, options);\n}\n","import { Usage } from \"../../types\";\n\n/**\n * The UsageCounter class is responsible for tracking the usage of input, output, and total tokens.\n */\nexport class UsageCounter {\n private inputTokens: number;\n private outputTokens: number;\n private totalTokens: number;\n\n /**\n * Constructs a UsageCounter instance and initializes token counts to zero.\n */\n constructor() {\n this.inputTokens = 0;\n this.outputTokens = 0;\n this.totalTokens = 0;\n }\n\n /**\n * Adds the usage tokens to the current counts.\n * @param {Usage} usage - The usage object containing input, output, and total tokens.\n */\n public addUsageTokens(usage: Usage) {\n this.inputTokens += usage.inputTokens;\n this.outputTokens += usage.outputTokens;\n this.totalTokens += usage.totalTokens;\n }\n\n /**\n * Retrieves the current usage counts.\n * @returns {Object} An object containing the counts of input, output, and total tokens.\n */\n public getUsage() {\n return {\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n totalTokens: this.totalTokens\n }\n }\n}","/**\n * The ReActTemplate class is responsible for managing the template used by the ReAct Agent.\n * It provides methods to add various sections to the template and retrieve the final template.\n */\nexport class ReActTemplate {\n private template: string;\n private originalRequestTemplate: string = '## Original Request\\n\\n';\n private toolTemplate: string = '## Tools\\n\\n';\n private instructionTemplate: string = '## Instructions\\n\\n';\n private iterationTemplate: string = '## Iterations\\n\\n';\n\n /**\n * Constructs a ReActTemplate instance.\n * @param {string} name - The name of the agent.\n */\n constructor(name: string) {\n this.template = \"# ReAct Agent\\n\\n\";\n }\n\n /**\n * Adds the default instructions to the instruction template.\n */\n public useDefaultInstructions(): void {\n this.addInstruction(\"You run in a loop of Thought, Action, PAUSE, Observation.\\n\" +\n \"At the end of the loop you output an Answer\\n\" +\n \"Strictly follow the provided response format.\\n\" +\n \"Use Thought to describe your thoughts about the question you have been asked.\\n\" +\n \"Use Action to run one of the actions available to you\\n\" +\n \"Observation will be the result of running those actions.\\n\"\n );\n }\n\n /**\n * Adds the original request to the original request template.\n * @param {string} request - The original request to add.\n */\n public addOriginalRequest(request: string): void {\n this.originalRequestTemplate += `${request}\\n\\n`;\n }\n\n /**\n * Adds an instruction to the instruction template.\n * @param {string} instruction - The instruction to add.\n */\n public addInstruction(instruction: string): void {\n this.instructionTemplate += `${instruction}\\n\\n`;\n }\n\n /**\n * Adds a tool to the tool template.\n * @param {string} tool - The tool to add.\n */\n public addTool(tool: string): void {\n this.toolTemplate += `${tool}\\n\\n`;\n }\n\n /**\n * Adds an iteration to the iteration template.\n * @param {number} iteration - The iteration number.\n * @param {string} content - The content of the iteration.\n */\n public addIteration(iteration: number, content: string): void {\n this.iterationTemplate += `### Iteration ${iteration}\\n\\n${content}\\n\\n`;\n }\n\n /**\n * Retrieves the complete template including all sections.\n * @returns {string} The complete template.\n */\n public getTemplate(): string {\n return this.template + this.originalRequestTemplate + this.instructionTemplate + this.toolTemplate + this.iterationTemplate;\n }\n\n /**\n * Retrieves the template with instructions, original request, and tools.\n * @returns {string} The template with instructions.\n */\n public getInstructions(): string {\n return this.template + this.originalRequestTemplate + this.instructionTemplate + this.toolTemplate;\n }\n}","export class BasicPromptTemplate {\n private template = '';\n\n\n constructor(name: string) {\n this.template += `# ${name}\\n\\n`;\n }\n\n public addTemplateSection(name: string, content: string): void {\n this.template += `## ${name}\\n\\n${content}\\n\\n`;\n }\n\n public getTemplate(): string {\n return this.template;\n }\n}\n"],"mappings":"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