Bu kılavuzda OpenAI işlev/araç çağırmayı uçtan uca uygulayacaksınız: aracı tanımlayacak, modele gönderecek, modelin döndürdüğü araç çağrısını ayrıştıracak, kendi fonksiyonunuzu çalıştıracak ve sonucu modele geri vereceksiniz. Son bölümde katı mod, paralel çağrılar ve üretime çıkmadan önce Apidog ile argüman doğrulama ve API taklidi akışını kuracaksınız. Referans için OpenAI’ın işlev çağırma dokümantasyonunu açık tutabilir, daha üst seviye bir mimari bakış için OpenAI Agents SDK ile aracı oluşturma yazısına göz atabilirsiniz.
Başlamadan önce
İşlev çağırma, modelin uygulamanızdaki kodla veya harici sistemlerle güvenli şekilde etkileşime geçmesini sağlar.
Önemli nokta şudur:
- Model fonksiyonu çalıştırmaz.
- Model hangi fonksiyonun çağrılması gerektiğine karar verir.
- Model fonksiyon adı ve JSON argümanlarını döndürür.
- Fonksiyonu sizin uygulama kodunuz çalıştırır.
- Sonucu tekrar modele gönderirsiniz.
Örneğin kullanıcı şunu yazabilir:
Paris'teki hava durumu nasıl?
Model bunu serbest metin olarak yorumlamak yerine şu yapıda bir çağrıya çevirebilir:
get_weather({ location: "Paris, France" })
Devam etmek için ihtiyacınız olanlar:
- OpenAI API anahtarı
- Modelin çağırmasını istediğiniz bir uygulama fonksiyonu
- Fonksiyon argümanlarını tanımlayan JSON Schema
- İsteğe bağlı olarak API sözleşmesini test etmek için Apidog
Bu özellik hem eski Chat Completions API hem de daha yeni Responses API ile kullanılabilir. Mantık aynıdır, ancak istek/yanıt şekilleri biraz farklıdır.
Adım 1: Aracınızı tanımlayın
Bir araç, modele sunduğunuz fonksiyon tanımıdır. Temel olarak şunları içerir:
-
name: Fonksiyon adı -
description: Modelin bu fonksiyonu ne zaman kullanacağını açıklayan talimat -
parameters: Fonksiyonun beklediği argümanları tanımlayan JSON Schema
Açıklamayı kısa bir etiket gibi değil, model için davranış talimatı gibi yazın.
Chat Completions formatı
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get the current weather for a city. Use when the user asks about temperature or conditions.",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "City and country, e.g. Bogotá, Colombia"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["location"],
"additionalProperties": false
}
}
}
Responses API formatı
Responses API’de aynı bilgiler daha düz bir yapıyla verilir. name, description, parameters ve strict alanları doğrudan araç nesnesinin üst seviyesinde yer alır.
Örneğin:
{
"type": "function",
"name": "get_weather",
"description": "Get the current weather for a city. Use when the user asks about temperature or conditions.",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "City and country, e.g. Bogotá, Colombia"
}
},
"required": ["location"],
"additionalProperties": false
},
"strict": true
}
Eğer temel servisiniz için zaten bir OpenAPI spesifikasyonunuz varsa, parametre tanımları büyük ölçüde bu şemaya karşılık gelir. Bu yaklaşımı test tarafında da kullanmak için OpenAPI spesifikasyonlarından test koleksiyonları oluşturma rehberine bakabilirsiniz.
Adım 2: İlk isteği gönderin
Aracı, kullanıcının mesajıyla birlikte modele gönderin.
Chat Completions için örnek istek:
curl https://api.openai.com/v1/chat/completions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4.1",
"messages": [
{
"role": "user",
"content": "What is the weather in Paris right now?"
}
],
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get the current weather for a city.",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string"
}
},
"required": ["location"],
"additionalProperties": false
}
}
}
]
}'
Bu istekte:
-
messages: Kullanıcı girdisini taşır. -
tools: Modele sunulan fonksiyonları listeler. - Model uygun görürse düz metin yerine araç çağrısı döndürür.
Adım 3: Modelin döndürdüğü araç çağrısını okuyun
Model bir fonksiyonu çağırmak istediğinde, yanıt içinde araç çağrısı döner.
Chat Completions yanıtı
Chat Completions’ta araç çağrıları tool_calls dizisinde yer alır:
{
"id": "call_12345xyz",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"location\":\"Paris, France\"}"
}
}
Burada dikkat edilmesi gereken alanlar:
-
id: Bu çağrının kimliği -
function.name: Çağrılacak fonksiyon -
function.arguments: JSON kodlu argüman dizesi
Responses API yanıtı
Responses API’de çağrı output dizisi içinde daha düz bir yapıyla gelir:
{
"type": "function_call",
"call_id": "call_12345xyz",
"name": "get_weather",
"arguments": "{\"location\":\"Paris, France\"}"
}
Burada da önemli alanlar:
-
call_id: Çağrı kimliği -
name: Fonksiyon adı -
arguments: JSON kodlu argüman dizesi
arguments alanı nesne değil, string olarak gelir. Bu nedenle uygulama kodunuzda ayrıştırmanız gerekir.
Örnek JavaScript ayrıştırma:
const toolCall = response.choices[0].message.tool_calls[0];
const functionName = toolCall.function.name;
const args = JSON.parse(toolCall.function.arguments);
console.log(functionName); // get_weather
console.log(args.location); // Paris, France
Adım 4: Kendi fonksiyonunuzu çalıştırın
Model yalnızca neyin çağrılacağını söyler. Asıl yürütme sizin kodunuzdadır.
Basit bir örnek:
async function getWeather({ location }) {
// Gerçek uygulamada burada hava durumu sağlayıcınızı çağırırsınız.
return {
location,
temperature: 21,
unit: "celsius",
condition: "cloudy"
};
}
Araç çağrısını aldıktan sonra fonksiyonu çalıştırabilirsiniz:
const args = JSON.parse(toolCall.function.arguments);
let result;
if (toolCall.function.name === "get_weather") {
result = await getWeather(args);
}
Bu aşamada mutlaka şunları yapın:
-
JSON.parsehatalarını yakalayın. - Argümanları şemanıza göre doğrulayın.
- Beklenmeyen fonksiyon adlarını reddedin.
- Harici API hatalarını yönetin.
Adım 5: Sonucu modele geri gönderin
Fonksiyon sonucunu aldıktan sonra, modelin nihai kullanıcı yanıtını oluşturabilmesi için sonucu tekrar modele göndermeniz gerekir.
Chat Completions mantığı
Chat Completions’ta fonksiyon sonucunu tool rolüyle gönderirsiniz. Bu mesaj, önceki çağrının tool_call_id değerine bağlanır.
Örnek yapı:
{
"role": "tool",
"tool_call_id": "call_12345xyz",
"content": "{\"location\":\"Paris, France\",\"temperature\":21,\"unit\":\"celsius\",\"condition\":\"cloudy\"}"
}
Akış şu şekildedir:
- Kullanıcı mesaj gönderir.
- Model araç çağrısı döndürür.
- Uygulama fonksiyonu çalıştırır.
- Uygulama sonucu
toolmesajı olarak modele döndürür. - Model kullanıcıya nihai cevabı üretir.
Responses API mantığı
Responses API’de fonksiyon sonucu function_call_output olarak gönderilir ve call_id ile eşleştirilir:
{
"type": "function_call_output",
"call_id": "call_12345xyz",
"output": "{\"location\":\"Paris, France\",\"temperature\":21,\"unit\":\"celsius\",\"condition\":\"cloudy\"}"
}
Her iki API’de de temel döngü aynıdır:
Model çağrı ister → Kodunuz çalıştırır → Sonuç modele döner → Model yanıt üretir
Adım 6: Paralel çağrıları ve katı modu ayarlayın
Temel akış çalıştıktan sonra iki ayarı yapılandırın:
parallel_tool_callsstrict
| Ayar | Ne Kontrol Eder | Varsayılan | Ne Zaman Değiştirilir |
|---|---|---|---|
parallel_tool_calls |
Tek bir dönüşte birden fazla araç çağrısı gelip gelemeyeceği | true |
Çağrılar birbirine bağlıysa veya sırayla çalışması gerekiyorsa false yapın |
strict |
Argümanların JSON Schema ile eşleşmeye zorlanıp zorlanmadığı | Ayarlanmadıkça en iyi çaba | Argümanları doğrudan ayrıştırıp çalıştıracağınız durumlarda açın |
tool_choice |
Modelin araç çağırıp çağıramayacağını veya hangi aracı çağıracağını | auto |
Çağrıyı zorlamak için required, kapatmak için none, belirli aracı seçmek için araç adı kullanın |
Paralel araç çağrıları
Varsayılan olarak model aynı turda birden fazla araç çağrısı döndürebilir.
Örneğin kullanıcı şunu sorarsa:
Paris, Berlin ve Roma'daki hava durumu nasıl?
Model üç ayrı get_weather çağrısı döndürebilir. Bunları eş zamanlı çalıştırabilirsiniz.
Eğer çağrıların sırayla çalışması gerekiyorsa:
{
"parallel_tool_calls": false
}
Katı mod
Katı mod için fonksiyon tanımında strict: true kullanın.
Katı modda modelin döndürdüğü argümanların JSON Schema ile eşleşmesi beklenir. OpenAI bunu etkinleştirmeyi önerir.
Ancak katı modun önemli kuralları vardır:
- Her nesnede
additionalProperties: falsebulunmalıdır. -
propertiesiçindeki her alanrequirediçinde yer almalıdır. - İsteğe bağlı alanlar için alanı
requiredlistesinden çıkarmak yerinenulltipine izin verilir.
Örneğin unit alanını opsiyonel yapmak istiyorsanız:
{
"type": "object",
"properties": {
"location": {
"type": "string"
},
"unit": {
"type": ["string", "null"],
"enum": ["celsius", "fahrenheit", null]
}
},
"required": ["location", "unit"],
"additionalProperties": false
}
Bu durumda model şu iki değerden birini geçebilir:
{
"location": "Paris, France",
"unit": "celsius"
}
veya:
{
"location": "Paris, France",
"unit": null
}
Böylece ayrıştırma kodunuz her zaman aynı anahtarları bekler.
Katı mod yapısal güvenilirliği artırır, ancak iş mantığını garanti etmez. Örneğin location alanı şemaya göre geçerli bir string olabilir, ancak servisinizin desteklemediği bir şehir içerebilir. Bu nedenle ayrıca doğrulama ve test yapmanız gerekir.
Apidog’da nasıl test edilir
Modelden gelen araç çağrısını canlı fonksiyona bağlamadan önce iki şeyi doğrulamanız gerekir:
- Modelin ürettiği argümanlar beklenen şemaya uyuyor mu?
- Fonksiyonunuzun çağıracağı alt sistem API’si beklediğiniz gibi davranıyor mu?
Apidog bu iki sözleşme noktasını test etmenize yardımcı olur.
Apidog uygulama fonksiyonunuzu çalıştırmaz. Bunun yerine:
- Modelden gelen argüman yapısını doğrulamanıza yardımcı olur.
- Fonksiyonunuzun bağlı olduğu API’yi taklit etmenizi sağlar.
- Gerçek API’ye istek atmadan hata ve başarı senaryolarını test etmenize izin verir.
1. Araç argümanlarını doğrulayın
Modelden gelen arguments dizesini alın:
"{\"location\":\"Paris, France\",\"unit\":\"celsius\"}"
Bunu JSON’a çevirin:
{
"location": "Paris, France",
"unit": "celsius"
}
Ardından Apidog’da bu yapıyı istek gövdesi gibi doğrulayabilirsiniz.
Kontrol edilecek örnekler:
-
locationvar mı? -
locationstring mi? -
unityalnızcacelsius,fahrenheitveyanullmı? - Gerekli alanların tamamı mevcut mu?
- Beklenmeyen ek alan var mı?
Belirli alanları çekmek için JSONPath ifadeleri kullanabilirsiniz.
Daha güçlü doğrulama için OpenAI’a verdiğiniz şemayı yansıtan JSON Schema doğrulaması kurabilirsiniz.
Böylece aynı sözleşme iki yerde uygulanır:
- Model tarafında araç parametresi olarak
- Test tarafında doğrulama şeması olarak
2. Alt sistem API’sini taklit edin
get_weather fonksiyonunuz muhtemelen gerçek bir hava durumu sağlayıcısını çağırır.
Geliştirme sırasında bu API:
- Ücretli olabilir
- Rate limit uygulayabilir
- Henüz hazır olmayabilir
- Hata senaryolarını kolay üretmeyebilir
Bu durumda Apidog’da bir sahte API oluşturabilirsiniz.
Örnek mock yanıt:
{
"location": "Paris, France",
"temperature": 21,
"unit": "celsius",
"condition": "cloudy"
}
Ardından uygulama fonksiyonunuzu gerçek sağlayıcı yerine bu mock endpoint’e yönlendirin.
Test etmeniz gereken senaryolar:
- Başarılı hava durumu yanıtı
- Geçersiz şehir
- Zaman aşımı
429 Too Many Requests500 Internal Server Error- Eksik veya beklenmeyen alanlar
Bu sayede gerçek API kotası harcamadan tüm araç çağırma yolunu test edebilirsiniz.
Özet akış:
OpenAI araç çağrısı üretir
→ arguments alanını yakalarsınız
→ Apidog ile şemaya göre doğrularsınız
→ Fonksiyonunuzu Apidog mock API’ye yönlendirirsiniz
→ Başarı ve hata senaryolarını test edersiniz
→ Üretime daha güvenli çıkarsınız
Sıkça sorulan sorular
İşlev çağırma hem Chat Completions hem de Responses API’de çalışır mı?
Evet. Her iki uç nokta da işlev çağırmayı destekler.
Temel fark yanıt ve araç tanımı şeklidir:
- Chat Completions, fonksiyon tanımını
functionanahtarı altında taşır vetool_callsdöndürür. - Responses API, daha düz bir araç tanımı kullanır ve
outputiçindefunction_callöğeleri döndürür.
Model neden argümanları nesne yerine string olarak döndürüyor?
arguments alanı JSON kodlu metindir. Bu nedenle kullanmadan önce uygulama kodunuzda ayrıştırmanız gerekir.
Örnek:
const args = JSON.parse(toolCall.function.arguments);
Ayrıştırdıktan sonra da doğrulama yapmalısınız. Bu argümanları JSON Schema doğrulamasından geçirmek, hatalı biçimlendirilmiş yükleri fonksiyonunuza ulaşmadan yakalamanıza yardımcı olur.
Katı mod fonksiyonun başarılı çalışacağını garanti eder mi?
Hayır.
Katı mod yalnızca argümanların JSON Schema ile eşleşmesini sağlar. Şunları garanti etmez:
- Konum gerçekten destekleniyor mu?
- Harici API çalışıyor mu?
- İş mantığı başarılı olacak mı?
- API rate limit’e takılacak mı?
Bu kontroller hâlâ uygulama kodunuzda ve test sürecinizde yapılmalıdır.
Apidog gerçek fonksiyonumu çalıştırabilir mi?
Hayır. Apidog uygulama içindeki fonksiyonunuzu çalıştırmaz.
Apidog’un rolü şudur:
- Modelin ürettiği argümanları doğrulamak
- Fonksiyonunuzun bağlı olduğu API’yi mocklamak
- API sözleşmesini ve hata senaryolarını test etmek
Fonksiyon yürütme yine sizin uygulamanızda kalır.
Sonuç
OpenAI işlev çağırma akışı şu döngüden oluşur:
Aracı tanımla
→ Modele gönder
→ tool_calls veya function_call çıktısını oku
→ arguments değerini ayrıştır
→ Kendi fonksiyonunu çalıştır
→ Sonucu modele geri gönder
→ Nihai yanıtı üret
Üretime yaklaşırken:
-
strict: truekullanın. -
additionalProperties: falseekleyin. - Argümanları JSON Schema ile doğrulayın.
- Paralel çağrıların uygulamanıza uygun olup olmadığını belirleyin.
- Harici API’leri mocklayarak başarı ve hata senaryolarını test edin.
Test tarafını denemek için araç çağırma argümanlarını şemanıza göre doğrulayabilir ve fonksiyonlarınızın bağlı olduğu API’leri tek yerden taklit etmek için Apidog’u indirebilirsiniz.

Top comments (0)