( request: ProviderRequest, config: OllamaCoreConfig )
| 66 | * call drops tools entirely rather than relying on `tool_choice: 'none'`. |
| 67 | */ |
| 68 | export async function executeOllamaProviderRequest( |
| 69 | request: ProviderRequest, |
| 70 | config: OllamaCoreConfig |
| 71 | ): Promise<ProviderResponse | StreamingExecution> { |
| 72 | const { providerId, providerLabel, logger } = config |
| 73 | |
| 74 | logger.info(`Preparing ${providerLabel} request`, { |
| 75 | model: request.model, |
| 76 | hasSystemPrompt: !!request.systemPrompt, |
| 77 | hasMessages: !!request.messages?.length, |
| 78 | hasTools: !!request.tools?.length, |
| 79 | toolCount: request.tools?.length || 0, |
| 80 | hasResponseFormat: !!request.responseFormat, |
| 81 | stream: !!request.stream, |
| 82 | }) |
| 83 | |
| 84 | const ollama = config.createClient() |
| 85 | |
| 86 | const allMessages: Message[] = [] |
| 87 | |
| 88 | if (request.systemPrompt) { |
| 89 | allMessages.push({ |
| 90 | role: 'system', |
| 91 | content: request.systemPrompt, |
| 92 | }) |
| 93 | } |
| 94 | |
| 95 | if (request.context) { |
| 96 | allMessages.push({ |
| 97 | role: 'user', |
| 98 | content: request.context, |
| 99 | }) |
| 100 | } |
| 101 | |
| 102 | if (request.messages) { |
| 103 | allMessages.push(...request.messages) |
| 104 | } |
| 105 | const formattedMessages = formatMessagesForProvider(allMessages, providerId) as Message[] |
| 106 | |
| 107 | const tools = request.tools?.length |
| 108 | ? request.tools.map((tool) => adaptOpenAIChatToolSchema(tool)) |
| 109 | : undefined |
| 110 | |
| 111 | const payload: any = { |
| 112 | model: request.model, |
| 113 | messages: formattedMessages, |
| 114 | } |
| 115 | |
| 116 | if (request.temperature !== undefined) payload.temperature = request.temperature |
| 117 | if (request.maxTokens != null) payload.max_tokens = request.maxTokens |
| 118 | |
| 119 | let hasActiveTools = false |
| 120 | if (tools?.length) { |
| 121 | const filteredTools = tools.filter((tool) => { |
| 122 | const toolId = tool.function?.name |
| 123 | const toolConfig = request.tools?.find((t) => t.id === toolId) |
| 124 | return toolConfig?.usageControl !== 'none' |
| 125 | }) |
no test coverage detected