# Açık ağırlıklı modellerle araç çağırma ve JSON çıktısı

> OpenAI biçimindeki açık ağırlıklı modellerle fonksiyon çağırma: tools, tool_choice, çağrı-yanıt döngüsü ve geçerli JSON çıktısı için response_format.

- URL: https://llmwithcrypto.com/tr/docs/tool-calling/
- Son güncelleme: 2026-10-23
- Yayıncı: LLMwithCrypto (https://llmwithcrypto.com)

Model, kodunuzdan bir fonksiyon çalıştırmasını isteyebilir ve sonucu yanıtında kullanabilir; ya da programınızın doğrudan okuduğu bir JSON nesnesiyle yanıt verebilir. Her ikisi de OpenAI istek biçimini kullanır ve her ikisi de seçtiğiniz modele bağlıdır.

**Kısa yanıt — LLMwithCrypto üzerinde araç çağırma nasıl çalışır?**

Fonksiyonlarınızı OpenAI biçiminde `tools` içinde gönderin. Model bir fonksiyon istediğinde, **LLMwithCrypto** fonksiyon adı ve JSON argümanlarıyla birlikte `finish_reason: "tool_calls"` döndürür; kodunuz bunu çalıştırır ve sonucu bir `tool` mesajı olarak geri gönderir. Yapılandırılmış yanıtlar için `response_format: {"type": "json_object"}` geçerli JSON ister. Her ikisi de, 23 Ekim 2026 tarihinde belgelendiği üzere, bunları destekleyen modellerde çalışır.

## Hangi modeller araçları ve JSON'u destekler?

Streaming her modelde çalışır; tool calling ve JSON çıktısı, her modelin kendi desteklediğiyle sınırlıdır.

Bunlara bağımlı hale gelmeden önce kendi şemanızı kullanmayı planladığınız modelde test edin. Araçları desteklemeyen bir model, fonksiyonu çağırmak yerine düz metinle yanıt verir; JSON modunu desteklemeyen bir model `response_format` için `400` hatası döndürür.

## Döngü nedir?

1. **Fonksiyonları tanımlayın** — Her aracın bir name, modelin ne zaman kullanacağına karar vermek için okuduğu bir description ve bir JSON Schema olarak parameters vardır.
2. **Konuşmayı araçlarla gönderin** — Model ya metinle yanıt verir ya da finish_reason: "tool_calls" ile durup message.tool_calls içinde bir veya daha fazla çağrı döndürür.
3. **Her çağrıyı çalıştırın** — function.arguments (bir JSON dizesi) ayrıştırın, fonksiyonunuzu çalıştırın ve argümanlara asla körü körüne güvenmeyin: onları herhangi bir kullanıcı girdisi gibi doğrulayın.
4. **Sonuçları geri gönderin** — Assistant mesajını, ardından her çağrı için tool_call_id ve sonucu metin olarak içeren bir tool mesajı ekleyin. API'yi yeniden çağırın; model metinle yanıt verene kadar tekrarlayın.

*Python: gpt-oss-120b ile eksiksiz bir araç döngüsü*

```python
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)})

```

## Yanıtta bir araç çağrısı nasıl görünür?

Assistant mesajında metin yoktur, bir `tool_calls` dizisi vardır ve seçim `finish_reason: "tool_calls"` ile biter. Argümanlar bir nesne değil, JSON dizesi olarak gelir. Aşağıdaki kimlikler ve sayımlar örnektir.

*Fonksiyon çağrısı isteyen yanıt (örnek)*

```json
{
  "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
  }
}

```

## Araçların ne zaman kullanılacağını nasıl kontrol ederim?

- **`"tool_choice": "auto"`** (`tools` ayarlandığında varsayılan): model karar verir.
- **`"tool_choice": "none"`**: araçlar listelense bile model metinle yanıt verir.
- **`"tool_choice": "required"`**: model en az bir araç çağırmalıdır.
- **`{"type": "function", "function": {"name": "get_order_status"}}`**: model o tek aracı çağırmalıdır.

Her araç tanımı her çağrıda girdi olarak gönderilir, bu nedenle uzun açıklamalar ve çok sayıda araç girdi tokenlarını artırır. Açıklamaları kısa tutun ve yalnızca bir adımın ihtiyaç duyduğu araçları gönderin.

## Geçerli JSON'u nasıl alırım?

`response_format` değerini `{"type": "json_object"}` yapın ve beklenen anahtarları system mesajında açıklayın: JSON modu yanıtın ayrıştırılabilir olduğunu garanti eder, istediğiniz anahtarları içerdiğini değil. Kararlı çıktı için `temperature` değerini düşük tutun ve kullanmadan önce ayrıştırılmış nesneyi kodunuzda kontrol edin.

*Node.js: response_format ile bir JSON yanıtı*

```javascript
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);

```

## Araçlar ve JSON: sık sorulan sorular

### Araç çağrıları ekstra ücrete tabi mi?

Kendilerine ait bir ücret yoktur. Araç tanımları, çağrı ve geri gönderdiğiniz sonuçların hepsi token'dır ve diğerleri gibi faturalandırılır. Token başına bakiyenizden ödersiniz: girdi ve çıktı token'ları modelin kendi tokenizer'ı ile sayılır ve o modelin 1M token başına fiyatından ücretlendirilir. Hata ile sonuçlanan bir çağrı ücretsizdir.

### Model aynı anda birkaç aracı çağırabilir mi?

Bazı modeller `tool_calls` içinde birden fazla çağrı döndürür. Hepsini çalıştırın ve bir sonraki istekten önce her çağrı için bir `tool` mesajı gönderin.

### API fonksiyonlarımı çalıştırır mı?

Hayır. Model yalnızca hangi fonksiyonun hangi argümanlarla çağrılacağını söyler; onu kodunuz çalıştırır. Bizim tarafımızda hiçbir şey yürütülmez ve alışverişin hiçbir parçası saklanmaz: Prompt'larınızı veya modelin yanıtlarını saklamayız: bir yanıt gönderildiğinde metni kaybolur. Her çağrı, zaman, hesap, model ve token sayılarını içeren tek bir log satırı bırakır; bu satırlar 30 gün sonra silinir.

---

LLMwithCrypto: LLMwithCrypto, açık ağırlıklı modeller için OpenAI uyumlu bir LLM API'sidir — DeepSeek V4 Pro, DeepSeek V4.1 Flash, DeepSeek R1, Qwen3.5 397B A17B, Qwen3 235B A22B Instruct, gpt-oss-120b, gpt-oss-20b, GLM-4.7, Llama 3.3 70B Instruct, Gemma 4 31B, Mistral Large 3, Mistral Small 4 — ön ödemeli kripto bakiyesinden token başına ödenir ve genel barındırıcıların medyan fiyatının %5 altındadır. KYC yok: kimlik yok, selfie yok, belge yok. İstemler ve çıktılar saklanmaz.
