Pular para conteúdo

AUR-525 — Tool calling no provider OpenAI-compatível

Contrato

  • llm.ToolCaller é a interface opcional de quem suporta ferramentas: CompleteWithTools(messages []llm.Message, tools []llm.ToolSpec, opts llm.Options) (llm.ToolResponse, error).
  • llm.AsToolCaller(provider) diz, antes de qualquer requisição, se o provider suporta ferramentas. Quem não suporta continua só com Complete.
  • O provider não executa ferramenta nenhuma. O chamador executa o que o modelo pediu e devolve o resultado numa mensagem llm.RoleTool com o ToolCallID da chamada.
  • Argumentos de chamada que não são um objeto JSON viram *llm.MalformedToolCallError (errors.Is(err, llm.ErrMalformedToolArguments)); nenhuma chamada parcial é devolvida.

Formato no fio (litellm)

  • tools: [{"type":"function","function":{"name","description","parameters"}}], com o schema de parâmetros repassado sem alteração.
  • Mensagem do assistente só com chamadas sai com "content": null e tool_calls[].function.arguments como string JSON.
  • Resultado de ferramenta sai como {"role":"tool","tool_call_id":...,"content":...}.
  • Complete sem ferramentas manda exatamente a mesma requisição de antes.

Prova

tests/acceptance/AUR-525.sh roda os testes TestAUR525* de internal/llm/provider/litellm (AC-001 a AC-005). O seletor AC-002-MUT-001 remove o tool_call_id do resultado e exige que o AC-002 falhe.