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ó comComplete.- O provider não executa ferramenta nenhuma. O chamador executa o que o
modelo pediu e devolve o resultado numa mensagem
llm.RoleToolcom oToolCallIDda 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": nulletool_calls[].function.argumentscomo string JSON. - Resultado de ferramenta sai como
{"role":"tool","tool_call_id":...,"content":...}. Completesem 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.