# OpenAI function calling: 60 satır Python'da Google arama aracı

> Bir OpenAI modeline Google arama aracı verin: JSON şeması, SerpCrypto SERP API üzerinde Python tool-calling döngüsü ve aynı şema Claude için. KYC olmadan.

- URL: https://serpcrypto.com/tr/docs/openai/
- Son güncelleme: 2026-10-22
- Yayıncı: SerpCrypto (https://serpcrypto.com)

Modele bir `google_search` fonksiyonu tanımlayın, istediği aramaları çalıştırın, sonuçları geri gönderin. Şema düz JSON Schema'dır, bu yüzden Claude'a ve diğer tool-calling modellerine uyarlanabilir.

**Hızlı yanıt — Bir OpenAI modeline web arama aracını nasıl veririm?**

`tools` içinde JSON Schema ile bir `google_search` fonksiyonu tanımlayın, ardından döngü kurun: model `tool_calls` döndürdüğünde, her aramayı `https://serpcrypto.com/api/v1/search` üzerinde çalıştırın ve sonuçları model yanıt verene kadar `tool` mesajı olarak ekleyin. **SerpCrypto** başarılı arama başına 1 kredi ücretlendirir, $0,30/1K arama başlangıç fiyatla, KYC olmadan kripto ile ödeme yapılır.

## Araç şeması nasıl görünür?

Bir fonksiyon aracının adı, açıklaması ve JSON Schema içinde parametreleri vardır. Model yalnızca bu üç şeyi görür, bu yüzden açıklama aracın ne döndürdüğünü ve ne zaman kullanılacağını belirtmelidir. Yalnızca `query` zorunludur; country ve language isteğe bağlıdır ve kodda varsayılan olarak US English'tir.

*Araç tanımı (Chat Completions formatı)*

```json
{
  "type": "function",
  "function": {
    "name": "google_search",
    "description": "Search Google for current information. Returns the top results with title, link and snippet. Use it for facts newer than your training data.",
    "parameters": {
      "type": "object",
      "properties": {
        "query": { "type": "string", "description": "The search query, as a person would type it." },
        "gl": { "type": "string", "description": "Two-letter country code of the results, e.g. us, gb, de." },
        "hl": { "type": "string", "description": "Language code, e.g. en, de, pt-BR." }
      },
      "required": ["query"]
    }
  }
}
```

## Araç çağırma döngüsü nasıl çalışır?

Soruyu `tools` ile gönderin. Yanıt `tool_calls` içeriyorsa her birini çalıştırın, assistant mesajını ve eşleşen `tool_call_id` ile her çağrı için bir `tool` mesajını ekleyin, ardından modeli yeniden çağırın. Bir yanıtta araç çağrısı yoksa bu son yanıttır.

Aşağıdaki döngü üç aramadan sonra durur. Bir üst sınır, model aramaya devam ederse kredilerinizi korur ve üç arama çoğu olgusal soruyu yanıtlar.

*search_agent.py*

```python
"""Tool-calling loop: the model asks for searches, this code runs them on SerpCrypto."""
import json
import os

import requests
from openai import OpenAI

client = OpenAI()  # reads OPENAI_API_KEY
MODEL = os.environ["OPENAI_MODEL"]  # any OpenAI chat model with tool calling
API_URL = "https://serpcrypto.com/api/v1/search"

TOOLS = [
    {
        "type": "function",
        "function": {
            "name": "google_search",
            "description": "Search Google for current information. Returns the top results with title, link and snippet.",
            "parameters": {
                "type": "object",
                "properties": {
                    "query": {"type": "string", "description": "The search query."},
                    "gl": {"type": "string", "description": "Two-letter country code, e.g. us."},
                    "hl": {"type": "string", "description": "Language code, e.g. en."},
                },
                "required": ["query"],
            },
        },
    }
]


def google_search(query, gl="us", hl="en"):
    r = requests.get(
        API_URL,
        params={"q": query, "gl": gl, "hl": hl},
        headers={"Authorization": "Bearer " + os.environ["SERPCRYPTO_API_KEY"]},
        timeout=90,
    )
    if r.status_code != 200:
        return f"Search failed with HTTP {r.status_code}."
    items = r.json().get("organic_results", [])[:5]
    return "\n\n".join(f"{x['title']}\n{x['link']}\n{x.get('snippet', '')}" for x in items) or "No results."


def ask(question, max_searches=3):
    messages = [{"role": "user", "content": question}]
    for _ in range(max_searches + 1):
        reply = client.chat.completions.create(model=MODEL, messages=messages, tools=TOOLS)
        msg = reply.choices[0].message
        if not msg.tool_calls:
            return msg.content
        messages.append(msg)
        for call in msg.tool_calls:
            args = json.loads(call.function.arguments)
            messages.append({"role": "tool", "tool_call_id": call.id, "content": google_search(**args)})
    return "Stopped: search limit reached."


print(ask("Which countries changed their data protection laws in 2026? Cite sources."))
```

## Aynı şema Claude ve diğer modellerle de çalışır mı?

Evet, farklı bir sarmalayıcıyla. Claude'un tool use özelliği aynı JSON Schema'yı `input_schema` altında, `name` ve `description` yanında kabul eder. Diğer çoğu araç çağırma API'si de parametreler için JSON Schema kabul eder; yalnızca dış alan adları değişir. Arama fonksiyonunun kendisi aynı kalır, çünkü yalnızca SerpCrypto endpoint'ini çağırır.

*Claude için aynı araç (Messages API)*

```json
{
  "name": "google_search",
  "description": "Search Google for current information. Returns the top results with title, link and snippet.",
  "input_schema": {
    "type": "object",
    "properties": {
      "query": { "type": "string", "description": "The search query." },
      "gl": { "type": "string", "description": "Two-letter country code, e.g. us." },
      "hl": { "type": "string", "description": "Language code, e.g. en." }
    },
    "required": ["query"]
  }
}
```

## Araç modele ne döndürmeli?

Bağlantı içeren kısa metin. Başlık, bağlantı ve snippet içeren beş sonuç, modelin yanıtlaması ve kaynak göstermesi için genellikle yeterlidir. Tam JSON döndürmek çalışır ama daha fazla token harcar ve modele okuması için daha fazla gürültü verir.

Modelin Google'ın kendi özetini görmesini istiyorsanız mevcut olduğunda AI Overview metnini ekleyin ve yanıtın özet yerine sayfaları kaynak gösterebilmesi için kaynak bağlantılarını koruyun.

## Arama maliyetlerini nasıl öngörülebilir tutarım?

Araç çağrılarını sayın: başarılı olan her biri bir kredidir. Döngünün yaptığı gibi soru başına aramaları sınırlayın ve her çağrıyı sorgusuyla birlikte loglayın; böylece modelin neyi istediğini görebilirsiniz. 100.000 arama paketinde oran $0,56/1K arama ve Ön ödemeli arama kredileri hiçbir zaman sona ermez: kullanılmayan aramalar siz kullanana kadar hesabınızda kalır.

Hatalar ücretsizdir: 1 kredi = desteklenen herhangi bir motorda bir sayfa sonuç döndüren 1 başarılı arama isteği. Başarısız olan istek ücretlendirilmez.

## Function calling soruları

### Chat Completions yerine Responses API'sini kullanabilir miyim?

Evet. Responses API'si, aynı JSON Schema ile fonksiyon araçlarını kabul eder; her aracın üst düzeyinde `name`, `description` ve `parameters` bulunur. Arama fonksiyonu ve döngü fikri değişmez.

### Neden model sağlayıcısının yerleşik web aramasını kullanmayayım?

Yerleşik arama araçları kendi kaynaklarını ve ayarlarını seçer. SerpCrypto üzerindeki bir fonksiyon, seçtiğiniz ülke ve dil için Google sonuçlarını loglayabileceğiniz JSON olarak ve arama başına bilinen bir fiyatla verir.

### Model ülkeyi seçebilir mi?

Evet. `gl` aracın bir parametresidir, bu yüzden model bunu sorudan ayarlayabilir; örneğin Birleşik Krallık hakkındaki bir soru için `gb`. Ülke belirtmeyen sorular için kodunuzda bir varsayılan tutun.

### Arama API anahtarını almak için kredi kartına ihtiyacım var mı?

Hayır. SerpCrypto kredi BTC, USDT, USDC, ETH, SOL, LTC ile ödenir; kimlik yok, selfie yok, belge yok. Hesap numarasıyla giriş; email isteğe bağlı.

---

SerpCrypto: SerpCrypto, Google ve Bing sonuçlarını JSON olarak döndüren, geliştiriciler ve AI agent'lar için bir SERP API'dir; kripto ile ödeme yapılır, kimlik yüklemek gerekmez. $0,30/1K arama ön ödemeli arama kredisinin süresi asla dolmaz. KYC olmadan — kimlik yok, selfie yok, belge yok. Kripto ile ödeme yapın.
