Resposta rápida
Como o tool calling funciona no LLMwithCrypto?
Envie suas funções em tools, no formato OpenAI. Quando o modelo quiser uma, LLMwithCrypto retorna finish_reason: "tool_calls" com o nome da função e os argumentos em JSON; seu código a executa e envia o resultado de volta como uma mensagem tool. Para respostas estruturadas, response_format: {"type": "json_object"} pede JSON válido. Ambos funcionam nos modelos que os suportam, conforme documentado em 23 de outubro de 2026.
Quais modelos suportam tools e JSON?
O streaming funciona em todos os modelos; tool calling e saída em JSON seguem o que cada modelo suporta por si.
Teste seu próprio schema no modelo que você pretende usar antes de depender dele. Um modelo que não suporta tools responde em texto simples em vez de chamar a função; um modelo que não suporta o modo JSON retorna um erro 400 para response_format.
O que é o ciclo?
Descreva as funções
Cada tool tem um
name, umadescriptionque o modelo lê para decidir quando usá-la, eparameterscomo JSON Schema.Envie a conversa com tools
O modelo ou responde em texto, ou para com
finish_reason: "tool_calls"e uma ou mais chamadas emmessage.tool_calls.Execute cada chamada
Faça o parse de
function.arguments(uma string JSON), execute sua função e nunca confie nos argumentos às cegas: valide-os como qualquer entrada do usuário.Envie os resultados de volta
Anexe a mensagem do assistant e, depois, uma mensagem
toolpor chamada com seutool_call_ide o resultado como texto. Chame a API de novo; repita até o modelo responder em texto.
import json
import os
from openai import OpenAI
client = OpenAI(
base_url="https://llmwithcrypto.com/api/v1",
api_key=os.environ["LLMWITHCRYPTO_API_KEY"],
)
tools = [
{
"type": "function",
"function": {
"name": "get_order_status",
"description": "Return the delivery status of an order.",
"parameters": {
"type": "object",
"properties": {"order_id": {"type": "string"}},
"required": ["order_id"],
},
},
}
]
def get_order_status(order_id):
return {"order_id": order_id, "status": "shipped", "eta": "2026-10-25"}
messages = [{"role": "user", "content": "Where is my order A-1042?"}]
while True:
resp = client.chat.completions.create(model="gpt-oss-120b", messages=messages, tools=tools, max_tokens=300)
msg = resp.choices[0].message
if not msg.tool_calls:
print(msg.content)
break
messages.append(msg)
for call in msg.tool_calls:
args = json.loads(call.function.arguments)
result = get_order_status(**args)
messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(result)})
Como é uma chamada de tool na resposta?
A mensagem do assistant não tem texto, tem um array tool_calls, e a escolha termina com finish_reason: "tool_calls". Os argumentos vêm como uma string JSON, não como um objeto. Os ids e contagens abaixo são ilustrativos.
{
"id": "chatcmpl-3c9d27e1",
"object": "chat.completion",
"created": 1792742400,
"model": "gpt-oss-120b",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "call_7f31",
"type": "function",
"function": {
"name": "get_order_status",
"arguments": "{\"order_id\": \"A-1042\"}"
}
}
]
},
"finish_reason": "tool_calls"
}
],
"usage": {
"prompt_tokens": 118,
"completion_tokens": 22,
"total_tokens": 140
}
}
Como controlo quando as tools são usadas?
"tool_choice": "auto"(o padrão quandotoolsestá definido): o modelo decide."tool_choice": "none": o modelo responde em texto mesmo com tools listadas."tool_choice": "required": o modelo precisa chamar pelo menos uma tool.{"type": "function", "function": {"name": "get_order_status"}}: o modelo precisa chamar aquela tool específica.
Toda definição de tool é enviada como entrada em cada chamada, então descrições longas e muitas tools aumentam os tokens de entrada. Mantenha as descrições curtas e envie apenas as tools que cada etapa precisa.
Como recebo JSON válido de volta?
Defina response_format como {"type": "json_object"} e descreva as chaves esperadas na mensagem de sistema: o modo JSON garante que a resposta faz parse, não que ela tem as chaves que você quer. Mantenha temperature baixo para uma saída estável e verifique o objeto após o parse no seu código antes de usá-lo.
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'https://llmwithcrypto.com/api/v1',
apiKey: process.env.LLMWITHCRYPTO_API_KEY,
});
const resp = await client.chat.completions.create({
model: 'gpt-oss-120b',
messages: [
{ role: 'system', content: 'Reply with a JSON object {"sentiment": "positive" | "negative" | "neutral", "reason": string}.' },
{ role: 'user', content: 'The delivery was late but support fixed it in an hour.' },
],
response_format: { type: 'json_object' },
temperature: 0.2,
max_tokens: 150,
});
const result = JSON.parse(resp.choices[0].message.content);
console.log(result.sentiment, '-', result.reason);
Tools e JSON: perguntas frequentes
Chamadas de tool custam a mais?
Não há taxa própria. As definições de tool, a chamada e os resultados que você envia de volta são todos tokens, cobrados como quaisquer outros. Você paga por token a partir do seu saldo: tokens de entrada e de saída são contados pelo tokenizer do próprio modelo e cobrados ao preço daquele modelo por 1M de tokens. Uma chamada que termina em erro não custa nada.
O modelo pode chamar várias tools ao mesmo tempo?
Alguns modelos retornam mais de uma chamada em tool_calls. Execute todas e envie uma mensagem tool por chamada antes da próxima requisição.
A API executa minhas funções?
Não. O modelo apenas diz qual função chamar e com quais argumentos; seu código a executa. Nada é executado do nosso lado, e nada da troca é armazenado: Não armazenamos seus prompts nem as respostas do modelo: assim que uma resposta é enviada, o texto dela se vai. Cada chamada deixa uma linha de log com o horário, a conta, o modelo e as contagens de tokens, apagada após 30 dias.