{"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"]}