İçeriğe geç

Tool Calling (Function Calling)

LLMTR gateway, OpenAI Chat Completions ile birebir uyumlu tool calling (function calling) destekler. Modele bir araç listesi verirsiniz, model gerektiğinde araç çağrısı döndürür, siz aracı çalıştırıp sonucu geri gönderirsiniz. Akış https://llmtr.com/v1/chat/completions üzerinden ilerler ve OpenAI SDK'ları, LangChain, Flowise gibi ajan çerçeveleri ile kod araçları (Cursor, Cline) sorunsuz çalışır.

  1. İstekte tools (ve isteğe bağlı tool_choice) gönderirsiniz.

  2. Model bir araç çağırmaya karar verirse, yanıt finish_reason: "tool_calls" ve message.tool_calls ile döner; message.content null olur.

    Dallanmayı message.tool_calls alanının varlığına göre yapın, finish_reason etiketine göre değil. Tek bir istisna var ve sessizdir: tencent/hy4-preview, isimli fonksiyon seçiminde doğru çağrıyı döndürür ama etiketi "stop" bırakır — yalnızca etikete bakan bir istemci o çağrıyı kaçırır. Ayrıntı: Hy4 Preview tool_choice sınırları.

  3. Aracı kendi tarafınızda çalıştırırsınız.

  4. Sonucu role: "tool" mesajı olarak (aynı tool_call_id ile) geçmişe ekleyip isteği tekrar gönderirsiniz. Model nihai cevabı üretir.

Terminal window
curl https://llmtr.com/v1/chat/completions \
-H "Authorization: Bearer llmtr-your_key" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-4o-mini",
"messages": [
{"role": "user", "content": "Istanbul'\''da hava nasil?"}
],
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Bir sehir icin guncel hava durumunu dondurur",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "Sehir adi"}
},
"required": ["location"]
}
}
}
],
"tool_choice": "auto"
}'

Model araç çağırdığında content null, finish_reason tool_calls olur ve tool_calls dizisi gelir. function.arguments her zaman JSON string'idir (JSON nesnesi değil), kullanmadan önce parse edin.

{
"id": "chatcmpl-xxx",
"object": "chat.completion",
"model": "openai/gpt-4o-mini",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"location\":\"Istanbul\"}"
}
}
]
},
"finish_reason": "tool_calls"
}
],
"usage": { "prompt_tokens": 62, "completion_tokens": 18, "total_tokens": 80 }
}

2. Araç sonucunu geri gönderme (çok turlu döngü)

Section titled “2. Araç sonucunu geri gönderme (çok turlu döngü)”

Aracı çalıştırdıktan sonra iki mesajı geçmişe ekleyin: modelin döndürdüğü assistant mesajı (tool_calls ile) ve sonucu taşıyan tool mesajı. tool mesajında tool_call_id, modelin verdiği çağrı id'siyle aynı olmalıdır.

Terminal window
curl https://llmtr.com/v1/chat/completions \
-H "Authorization: Bearer llmtr-your_key" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-4o-mini",
"messages": [
{"role": "user", "content": "Istanbul'\''da hava nasil?"},
{
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "call_abc123",
"type": "function",
"function": {"name": "get_weather", "arguments": "{\"location\":\"Istanbul\"}"}
}
]
},
{
"role": "tool",
"tool_call_id": "call_abc123",
"content": "{\"temp_c\":24,\"condition\":\"sunny\"}"
}
]
}'

Model nihai cevabı düz metin olarak döndürür (finish_reason: "stop"):

{
"choices": [
{
"message": {"role": "assistant", "content": "Istanbul su an 24°C ve gunesli."},
"finish_reason": "stop"
}
]
}

Bir turda birden çok araç çağrısı dönebilir (paralel tool calls). Her tool_call için ayrı bir role: "tool" mesajı eklemeniz gerekir; biri eksikse sonraki istek hata döndürür.

tencent/hy3:low veya tencent/hy3:high bir tool çağırdığında assistant mesajı reasoning_content da içerebilir. Sonraki turda bu alanı aynen geri gönderin:

{
"role": "assistant",
"content": "Hava aracını çağıracağım.",
"reasoning_content": "Kullanıcının verdiği şehir için aracı seçiyorum...",
"tool_calls": [{
"id": "call_abc123",
"type": "function",
"function": {"name": "get_weather", "arguments": "{\"location\":\"Istanbul\"}"}
}]
}

Bu assistant mesajının arkasına eşleşen role: "tool" sonucunu ekleyin. low + tools istekleri Hy3 tarafından adaptif olarak high reasoning ile yürütülür.

Hy3'te tool_choice alanını "auto" veya "required" ile kullanın. Belirli bir fonksiyonu ada göre zorlamak ({"type": "function", "function": {"name": "..."}}) bu modelde güvenilir çalışmıyor: sağlayıcı isteği ya reddediyor ya da arguments alanında geçerli JSON yerine ayrıştırılmamış içerik döndürüyor.

tencent/hy4-preview, kardeşi Hy3'ün tam tersi davranıyor: isimli fonksiyon seçimi çalışır, "required" çalışmaz.

tool_choice: "required" bu modelde kabul edilip yok sayılıyor — model araç çağırmadan düz metinle yanıt veriyor ve yanıtta kısıtın düşürüldüğünü söyleyen hiçbir işaret olmuyor. LLMTR bu birleşimi sessizce geçirmek yerine 400 ile reddeder; sessiz geçirilseydi ajan döngünüz beklediği araç çağrısını hiç almadan devam ederdi. "auto" kullanın ya da fonksiyonu adıyla zorlayın.

İsimli fonksiyon seçiminde çağrı doğru üretilir, ama finish_reason alanı "tool_calls" yerine "stop" döner. Yanıt olduğu gibi iletildiği için istemcinizde etikete değil tool_calls alanının varlığına bakın:

const message = response.choices[0].message;
if (message.tool_calls?.length) {
// araç çağrısını işle
}

auto modunda finish_reason doğru döner; sapma yalnızca isimli seçimde görülür.

tool_choice ile modelin araç kullanımını yönlendirebilirsiniz:

DeğerAnlamı
"auto" (varsayılan)Model araç çağırıp çağırmamaya kendisi karar verir
"none"Araç çağrısı yapılmaz, düz metin üretilir
"required"Model en az bir araç çağırmaya zorlanır
{"type": "function", "function": {"name": "get_weather"}}Belirli bir aracın çağrılması zorlanır

Bazı modeller yalnızca auto ve none kabul eder (örn. Moonshot Kimi K2 ailesi; kimi-k3 ek olarak required destekler). Sağlayıcıya özgü kısıtlar için Chat Completions sayfasına bakın.

stream: true ile araç çağrıları delta.tool_calls içinde akar. İlk chunk araç çağrısını (id, ad, argümanlar) taşır; kapanış chunk'ı finish_reason: "tool_calls" ile gelir, ardından data: [DONE].

data: {"choices":[{"index":0,"delta":{"role":"assistant","tool_calls":[{"index":0,"id":"call_abc123","type":"function","function":{"name":"get_weather","arguments":"{\"location\":\"Istanbul\"}"}}]},"finish_reason":null}]}
data: {"choices":[{"index":0,"delta":{},"finish_reason":"tool_calls"}]}
data: [DONE]

Akış formatının genel detayları için Streaming sayfasına bakın.

Resmi OpenAI SDK'ları base_url / baseURL LLMTR'ye yönlendirildiğinde tool calling ile değişiklik gerektirmeden çalışır.

from openai import OpenAI
client = OpenAI(api_key="llmtr-your_key", base_url="https://llmtr.com/v1")
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Bir sehir icin guncel hava durumunu dondurur",
"parameters": {
"type": "object",
"properties": {"location": {"type": "string"}},
"required": ["location"],
},
},
}]
resp = client.chat.completions.create(
model="openai/gpt-4o-mini",
messages=[{"role": "user", "content": "Istanbul'da hava nasil?"}],
tools=tools,
)
print(resp.choices[0].message.tool_calls)
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "llmtr-your_key",
baseURL: "https://llmtr.com/v1",
});
const resp = await client.chat.completions.create({
model: "openai/gpt-4o-mini",
messages: [{ role: "user", content: "Istanbul'da hava nasil?" }],
tools: [
{
type: "function",
function: {
name: "get_weather",
parameters: {
type: "object",
properties: { location: { type: "string" } },
required: ["location"],
},
},
},
],
});
console.log(resp.choices[0].message.tool_calls);

Tool calling, global sağlayıcıların sohbet modellerinde desteklenir: OpenAI (GPT / o-serisi), Anthropic Claude, Google Gemini, xAI Grok, Tencent Hy3 ve Hy4 Preview, zai GLM, Qwen, DeepSeek, Moonshot Kimi, MiniMax, Xiaomi MiMo, StepFun, AionLabs ve Mistral. Bir modelin desteği, katalogdaki / model detay sayfasındaki function_calling yeteneği ile işaretlenir.

Türkiye-barındırmalı modeller arasında llmtr/gemma-4, llmtr/qwen3-5-4b ve llmtr/muse-glimmer-30b-tr tool calling destekler; verilerinizin Türkiye'de işlenmesi gereken ajan akışlarında bu modelleri kullanabilirsiniz. llmtr/gemma-4 ayrıca 128K bağlam ve görsel girdi kabul eder.

Desteklemeyen modeller:

  • Diğer Türkiye-barındırmalı first-party modeller (llmtr/qwen3-6-35b, llmtr/trendyol-asure-12b, llmtr/magibu-11b-v8) şu an function calling parse etmez; bu modellere tools gönderdiğinizde araç çağrısı yapılandırılmış biçimde dönmez.
  • poolside/laguna-xs.2 için tools / tool_choice gönderildiğinde istek 400 unsupported_operation döner.

Üretim trafiğine geçmeden önce hedef modelin tool calling desteğini doğrulayın.