feat: add tool-calling passthrough for all providers
Implement full OpenAI-compatible tool-calling support across the proxy, enabling OpenCode to use llm-proxy as its sole LLM backend. - Add 9 tool-calling types (Tool, FunctionDef, ToolChoice, ToolCall, etc.) - Update ChatCompletionRequest/ChatMessage/ChatStreamDelta with tool fields - Update UnifiedRequest/UnifiedMessage to carry tool data through the pipeline - Shared helpers: messages_to_openai_json handles tool messages, build_openai_body includes tools/tool_choice, parse/stream extract tool_calls from responses - Gemini: full OpenAI<->Gemini format translation (functionDeclarations, functionCall/functionResponse, synthetic call IDs, tool_config mapping) - Gemini: extract duplicated message-conversion into shared convert_messages() - Server: SSE streams include tool_calls deltas, finish_reason='tool_calls' - AggregatingStream: accumulate tool call deltas across stream chunks - OpenAI provider: add o4- prefix to supports_model()
This commit is contained in:
@@ -174,6 +174,7 @@ async fn chat_completions(
|
||||
role: None,
|
||||
content: Some(chunk.content),
|
||||
reasoning_content: chunk.reasoning_content,
|
||||
tool_calls: chunk.tool_calls,
|
||||
},
|
||||
finish_reason: chunk.finish_reason,
|
||||
}],
|
||||
@@ -248,6 +249,12 @@ async fn chat_completions(
|
||||
.await;
|
||||
|
||||
// Convert ProviderResponse to ChatCompletionResponse
|
||||
let finish_reason = if response.tool_calls.is_some() {
|
||||
"tool_calls".to_string()
|
||||
} else {
|
||||
"stop".to_string()
|
||||
};
|
||||
|
||||
let chat_response = ChatCompletionResponse {
|
||||
id: format!("chatcmpl-{}", Uuid::new_v4()),
|
||||
object: "chat.completion".to_string(),
|
||||
@@ -261,8 +268,11 @@ async fn chat_completions(
|
||||
content: response.content,
|
||||
},
|
||||
reasoning_content: response.reasoning_content,
|
||||
tool_calls: response.tool_calls,
|
||||
name: None,
|
||||
tool_call_id: None,
|
||||
},
|
||||
finish_reason: Some("stop".to_string()),
|
||||
finish_reason: Some(finish_reason),
|
||||
}],
|
||||
usage: Some(Usage {
|
||||
prompt_tokens: response.prompt_tokens,
|
||||
|
||||
Reference in New Issue
Block a user