UNPKG

@agenite/ollama

Version:
1 lines 24 kB
{"version":3,"sources":["../src/utils.ts","../src/provider.ts"],"names":["msg","BaseLLMProvider","Ollama","convertStringToMessages"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n BaseMessage,\n ContentBlock,\n GenerateResponse,\n StopReason,\n ToolDefinition,\n ToolUseBlock,\n ToolResultBlock,\n TokenUsage,\n} from '@agenite/llm';\nimport type { Tool } from 'ollama';\nimport type {\n OllamaMessage,\n ToolParameterValue,\n OllamaToolCall,\n} from './types';\n\n/**\n * Creates token information for a response\n */\nfunction createTokenInfo(\n model: string,\n inputTokens: number = 0,\n outputTokens: number = 0\n) {\n return {\n inputTokens,\n outputTokens,\n model,\n inputCost: 0,\n outputCost: 0,\n } as TokenUsage;\n}\n\n/**\n * Creates a response object with common metadata\n */\nexport function createResponse(\n content: ContentBlock[],\n model: string,\n inputTokens: number = 0,\n outputTokens: number = 0,\n stopReason?: StopReason\n): GenerateResponse {\n return {\n content,\n tokenUsage: createTokenInfo(model, inputTokens, outputTokens),\n stopReason,\n };\n}\n\n/**\n * Creates a text content block\n */\nexport function createTextContent(text: string): ContentBlock {\n return { type: 'text', text };\n}\n\n/**\n * Creates a tool use content block\n */\nexport function createToolUseContent(\n name: string,\n input: Record<string, unknown>\n): ToolUseBlock {\n return {\n type: 'toolUse',\n id: crypto.randomUUID(),\n name,\n input,\n };\n}\n\n/**\n * Parses tool arguments from string or record\n */\nfunction parseToolArguments(\n args: string | Record<string, unknown>\n): Record<string, unknown> {\n return typeof args === 'string' ? JSON.parse(args) : args;\n}\n\n/**\n * Converts Ollama's function calls to our tool use format\n */\nexport function convertFunctionCallsToToolUses(\n toolCalls: OllamaToolCall[]\n): ContentBlock[] {\n return toolCalls.map((toolCall) =>\n createToolUseContent(\n toolCall.function.name,\n parseToolArguments(toolCall.function.arguments)\n )\n );\n}\n\n/**\n * Maps Ollama finish reasons to our standard stop reasons\n */\nexport function mapStopReason(\n finishReason: string | null\n): StopReason | undefined {\n if (!finishReason) return undefined;\n\n const stopReasonMap: Record<string, StopReason> = {\n stop: 'endTurn',\n length: 'maxTokens',\n tool_calls: 'toolUse',\n };\n\n return stopReasonMap[finishReason] || undefined;\n}\n\n/**\n * Extracts text content from message blocks\n */\nexport function extractTextContent(blocks: ContentBlock[]): string {\n return blocks\n .map((block) => (block.type === 'text' ? block.text : ''))\n .join('\\n')\n .trim();\n}\n\n/**\n * Extracts base64 images from message blocks\n */\nexport function extractImages(blocks: ContentBlock[]): string[] {\n return blocks\n .map((block) => {\n if (block.type === 'image' && block.source.type === 'base64') {\n return block.source.data;\n }\n return null;\n })\n .filter((img): img is string => img !== null);\n}\n\n/**\n * Creates a tool result message in Ollama's format\n */\nfunction createToolResultMessage(\n toolResult: ToolResultBlock,\n toolUse: ToolUseBlock\n): OllamaMessage {\n return {\n role: 'tool',\n content: JSON.stringify({\n output: toolResult.content,\n isError: toolResult.isError,\n function_call: {\n name: toolUse.name,\n arguments: toolUse.input,\n },\n }),\n name: toolResult.toolName,\n };\n}\n\n/**\n * Creates a regular message in Ollama's format\n */\nfunction createRegularMessage(msg: BaseMessage): OllamaMessage {\n const images = extractImages(msg.content);\n const content = extractTextContent(msg.content);\n\n return {\n role: msg.role,\n content,\n ...(images.length > 0 && { images }),\n };\n}\n\n/**\n * Finds a tool result for a given tool use\n */\nfunction findToolResult(\n toolUse: ToolUseBlock,\n nextMsg?: BaseMessage\n): ToolResultBlock | undefined {\n return nextMsg?.content.find(\n (block): block is ToolResultBlock =>\n block.type === 'toolResult' && block.toolUseId === toolUse.id\n );\n}\n\n/**\n * Processes a message pair (current and next) into Ollama messages\n */\nfunction processMessagePair(\n msg: BaseMessage,\n nextMsg?: BaseMessage\n): {\n messages: OllamaMessage[];\n skipNext: boolean;\n} {\n const toolUses = msg.content.filter(\n (block): block is ToolUseBlock => block.type === 'toolUse'\n );\n\n if (!toolUses.length) {\n return {\n messages: [createRegularMessage(msg)],\n skipNext: false,\n };\n }\n\n // Create a single message with all tool calls\n const toolCallsMessage: OllamaMessage = {\n role: 'assistant',\n content: '',\n tool_calls: toolUses.map((toolUse) => ({\n function: {\n name: toolUse.name,\n arguments: toolUse.input as Record<string, unknown>,\n },\n })),\n };\n\n const messages: OllamaMessage[] = [toolCallsMessage];\n\n // Add individual tool results if they exist\n for (const toolUse of toolUses) {\n const toolResult = findToolResult(toolUse, nextMsg);\n if (toolResult) {\n messages.push(createToolResultMessage(toolResult, toolUse));\n }\n }\n\n // Skip next message if we found at least one tool result\n const hasToolResults = messages.some((msg) => msg.role === 'tool');\n return { messages, skipNext: hasToolResults };\n}\n\n/**\n * Converts our message format to Ollama's format\n */\nexport function convertMessages(messages: BaseMessage[]): OllamaMessage[] {\n const ollamaMessages: OllamaMessage[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n if (!msg) continue;\n\n const { messages: newMessages, skipNext } = processMessagePair(\n msg,\n messages[i + 1]\n );\n ollamaMessages.push(...newMessages);\n\n if (skipNext) {\n i++; // Skip the next message since we've handled it\n }\n }\n\n return ollamaMessages;\n}\n\n/**\n * Extracts type information from a tool parameter\n */\nfunction extractParameterType(value: unknown): string {\n return typeof value === 'object' && value && 'type' in value\n ? String(value.type)\n : 'string';\n}\n\n/**\n * Extracts description from a tool parameter\n */\nfunction extractParameterDescription(value: unknown, key: string): string {\n return typeof value === 'object' && value && 'description' in value\n ? String(value.description)\n : key;\n}\n\n/**\n * Extracts enum values from a tool parameter if they exist\n */\nfunction extractParameterEnum(value: unknown): { enum?: string[] } {\n return typeof value === 'object' && value && 'enum' in value\n ? { enum: (value as ToolParameterValue).enum }\n : {};\n}\n\n/**\n * Converts a single parameter definition to Ollama's format\n */\nfunction convertParameterDefinition(key: string, value: unknown) {\n return [\n key,\n {\n type: extractParameterType(value),\n description: extractParameterDescription(value, key),\n ...extractParameterEnum(value),\n },\n ];\n}\n\n/**\n * Converts tool parameters to Ollama's format\n */\nfunction convertToolParameters(tool: ToolDefinition) {\n return {\n type: 'object',\n properties: Object.fromEntries(\n Object.entries(tool.inputSchema.properties || {}).map(([key, value]) =>\n convertParameterDefinition(key, value)\n )\n ),\n required: tool.inputSchema.required ?? [],\n } as unknown as Tool['function']['parameters'];\n}\n\n/**\n * Converts a single tool definition to Ollama's format\n */\nfunction convertToolDefinition(tool: ToolDefinition): Tool {\n return {\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: convertToolParameters(tool),\n },\n };\n}\n\n/**\n * Converts tool definitions to Ollama's format\n */\nexport function convertToolDefinitions(\n tools?: ToolDefinition[]\n): Tool[] | undefined {\n if (!tools?.length) return undefined;\n return tools.map(convertToolDefinition);\n}\n\n/**\n * Creates error with consistent format\n */\nexport function createError(error: unknown, context: string): Error {\n console.error(`Ollama ${context} failed:`, error);\n return error instanceof Error\n ? new Error(`Ollama ${context} failed: ${error.message}`)\n : new Error(`Ollama ${context} failed with unknown error`);\n}\n","import { Ollama } from 'ollama';\nimport { convertStringToMessages, BaseLLMProvider } from '@agenite/llm';\nimport type {\n BaseMessage,\n GenerateResponse,\n GenerateOptions,\n PartialReturn,\n ContentBlock,\n} from '@agenite/llm';\nimport type { OllamaConfig, OllamaMessage } from './types';\nimport {\n createResponse,\n createTextContent,\n mapStopReason,\n convertMessages,\n convertToolDefinitions,\n convertFunctionCallsToToolUses,\n createError,\n createToolUseContent,\n} from './utils';\n\nexport class OllamaProvider extends BaseLLMProvider {\n private client: Ollama;\n private config: OllamaConfig;\n readonly name = 'Ollama';\n readonly version = '1.0';\n\n constructor(config: OllamaConfig) {\n super();\n this.config = config;\n this.client = new Ollama({\n host: config.host,\n });\n }\n\n /**\n * Creates base chat request parameters\n */\n private createBaseRequest(\n messages: OllamaMessage[],\n options?: Partial<GenerateOptions>\n ) {\n if (options?.systemPrompt) {\n messages.unshift({\n role: 'system',\n content: options.systemPrompt,\n });\n }\n\n return {\n model: this.config.model,\n messages,\n options: {\n temperature: options?.temperature,\n num_predict: options?.maxTokens,\n stop: options?.stopSequences,\n ...this.config.parameters,\n },\n tools: convertToolDefinitions(options?.tools),\n };\n }\n\n /**\n * Prepares messages for chat request\n */\n private prepareMessages(input: string | BaseMessage[]): OllamaMessage[] {\n const messageArray = convertStringToMessages(input);\n return convertMessages(messageArray);\n }\n\n /**\n * Combines text and tool calls into a single response content\n */\n private combineResponseContent(\n text: string | null | undefined,\n toolCalls?: Array<{\n function: {\n name: string;\n arguments: string | Record<string, unknown>;\n };\n }>\n ): ContentBlock[] {\n const content: ContentBlock[] = [];\n\n // Add text content if present\n if (text) {\n content.push(createTextContent(text));\n }\n\n // Add tool calls if present\n if (toolCalls?.length) {\n content.push(...convertFunctionCallsToToolUses(toolCalls));\n }\n\n return content;\n }\n\n async generate(\n input: string | BaseMessage[],\n options?: Partial<GenerateOptions>\n ): Promise<GenerateResponse> {\n try {\n const ollamaMessages = this.prepareMessages(input);\n const response = await this.client.chat({\n ...this.createBaseRequest(ollamaMessages, options),\n stream: false,\n } as const);\n\n return createResponse(\n this.combineResponseContent(\n response.message.content,\n response.message.tool_calls\n ),\n this.config.model,\n response.prompt_eval_count,\n response.eval_count,\n response.message.tool_calls?.length ? 'toolUse' : mapStopReason('stop')\n );\n } catch (error) {\n throw createError(error, 'generation');\n }\n }\n\n async *stream(\n input: string | BaseMessage[],\n options?: Partial<GenerateOptions>\n ): AsyncGenerator<PartialReturn, GenerateResponse, unknown> {\n try {\n const ollamaMessages = this.prepareMessages(input);\n let buffer = '';\n let finalResponse = undefined;\n let textAccumulator = '';\n const toolCalls = [];\n const response = await this.client.chat({\n ...this.createBaseRequest(ollamaMessages, options),\n stream: true,\n } as const);\n\n let hasTextStart = false;\n let hasTextEnd = false;\n\n for await (const chunk of response) {\n // Handle text content\n const content = chunk.message?.content;\n if (content) {\n if (!hasTextStart) {\n yield {\n type: 'text' as const,\n text: '',\n isStart: true,\n };\n hasTextStart = true;\n }\n buffer += content;\n textAccumulator += content;\n // Yield chunks when buffer has reasonable size\n if (buffer.length > 4) {\n yield {\n type: 'text' as const,\n text: buffer,\n };\n buffer = '';\n }\n }\n\n // Handle tool calls\n if (chunk.message?.tool_calls?.length) {\n // First yield any remaining text in buffer\n if (buffer.length > 0) {\n yield {\n type: 'text' as const,\n text: buffer,\n isEnd: true,\n };\n hasTextEnd = true;\n buffer = '';\n }\n\n // Then yield each tool call\n for (const toolCall of chunk.message.tool_calls) {\n const tool = {\n type: 'toolUse' as const,\n toolUse: createToolUseContent(\n toolCall.function.name,\n toolCall.function.arguments\n ),\n isEnd: true,\n };\n\n toolCalls.push(toolCall);\n\n yield tool;\n }\n }\n\n finalResponse = chunk;\n }\n\n // Yield any remaining content in buffer\n if (buffer.length > 0) {\n yield {\n type: 'text' as const,\n text: buffer,\n isEnd: true,\n };\n } else if (!hasTextEnd && hasTextStart) {\n yield {\n type: 'text' as const,\n text: '',\n isEnd: true,\n };\n }\n\n if (!finalResponse) {\n throw new Error('No final response received');\n }\n\n // Return final response with combined content\n return createResponse(\n this.combineResponseContent(textAccumulator, toolCalls),\n this.config.model,\n finalResponse.prompt_eval_count,\n finalResponse.eval_count,\n toolCalls?.length\n ? 'toolUse'\n : mapStopReason(finalResponse.done ? 'stop' : null)\n );\n } catch (error) {\n throw createError(error, 'stream');\n }\n }\n}\n"]}