# OpenAI function calling: alat pencarian Google dalam 60 baris Python

> Beri model OpenAI sebuah alat pencarian Google: skema JSON, loop tool-calling Python pada SerpCrypto SERP API, dan skema yang sama untuk Claude. Tanpa KYC.

- URL: https://serpcrypto.com/id/docs/openai/
- Terakhir diperbarui: 2026-10-22
- Penerbit: SerpCrypto (https://serpcrypto.com)

Jelaskan fungsi `google_search` kepada model, jalankan pencarian yang dimintanya, kirim hasilnya kembali. Skemanya adalah JSON Schema biasa, jadi bisa dipakai juga untuk Claude dan model tool-calling lainnya.

**Jawaban singkat — Bagaimana cara memberi model OpenAI alat pencarian web?**

Deklarasikan fungsi `google_search` dengan JSON Schema di `tools`, lalu lakukan loop: saat model mengembalikan `tool_calls`, jalankan setiap pencarian di `https://serpcrypto.com/api/v1/search` dan tambahkan hasilnya sebagai pesan `tool` sampai ia menjawab. **SerpCrypto** menagih 1 kredit per pencarian yang berhasil, mulai dari US$0,30/1K pencarian, dibayar dengan kripto tanpa KYC.

## Seperti apa skema tool-nya?

Sebuah function tool memiliki nama, deskripsi, dan parameter dalam JSON Schema. Model hanya melihat ketiga hal ini, jadi deskripsi harus menjelaskan apa yang dikembalikan tool dan kapan menggunakannya. Hanya `query` yang wajib; country dan language bersifat opsional dan secara default disetel ke US English di dalam kode.

*Definisi tool (format Chat Completions)*

```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"]
    }
  }
}
```

## Bagaimana cara kerja loop tool-calling?

Kirim pertanyaan dengan `tools`. Jika balasan berisi `tool_calls`, jalankan masing-masing, tambahkan pesan assistant dan satu pesan `tool` per panggilan dengan `tool_call_id` yang sesuai, lalu panggil model lagi. Saat balasan tidak berisi tool call, itulah jawaban akhir.

Loop di bawah berhenti setelah tiga pencarian. Batas ini melindungi kredit Anda jika model terus mencari, dan tiga pencarian sudah menjawab sebagian besar pertanyaan faktual.

*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."))
```

## Apakah schema yang sama berfungsi dengan Claude dan model lain?

Ya, dengan wrapper yang berbeda. Tool use Claude menerima JSON Schema yang sama di bawah `input_schema`, di samping `name` dan `description`. Sebagian besar API tool-calling lain juga menerima JSON Schema untuk parameter; hanya nama field luarnya yang berubah. Fungsi pencariannya sendiri tetap sama, karena hanya memanggil endpoint SerpCrypto.

*Tool yang sama untuk Claude (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"]
  }
}
```

## Apa yang sebaiknya dikembalikan tool ke model?

Teks singkat dengan link. Lima hasil berisi title, link dan snippet biasanya cukup bagi model untuk menjawab dan mengutip. Mengembalikan JSON penuh juga bisa, tetapi memakan lebih banyak token dan memberi model lebih banyak noise untuk dibaca.

Tambahkan teks AI Overview jika ada bila Anda ingin model melihat ringkasan dari Google sendiri, dan pertahankan link sumbernya agar jawaban dapat mengutip halaman, bukan overview-nya.

## Bagaimana cara menjaga biaya pencarian tetap terprediksi?

Hitung tool call: setiap panggilan yang berhasil berarti satu kredit. Batasi jumlah pencarian per pertanyaan, seperti yang dilakukan loop, dan catat setiap panggilan beserta kuerinya agar Anda bisa melihat apa yang diminta model. Pada paket 100.000 pencarian tarifnya US$0,56/1K pencarian, dan Kredit pencarian prabayar tidak pernah kedaluwarsa: pencarian yang belum terpakai tetap ada di akun Anda sampai Anda menggunakannya.

Error tidak dikenakan biaya: 1 kredit = 1 permintaan pencarian yang berhasil, yang mengembalikan satu halaman hasil di mesin mana pun yang didukung. Permintaan yang gagal tidak dikenai biaya.

## Pertanyaan seputar function calling

### Bisakah saya memakai Responses API alih-alih Chat Completions?

Ya. Responses API menerima function tool dengan JSON Schema yang sama, dengan `name`, `description` dan `parameters` di level teratas setiap tool. Fungsi pencarian dan konsep loop-nya tidak berubah.

### Mengapa tidak memakai web search bawaan penyedia model?

Tool search bawaan memilih sumber dan pengaturannya sendiri. Function pada SerpCrypto memberi Anda hasil pencarian Google untuk negara dan bahasa yang Anda pilih, berupa JSON yang bisa Anda catat, dengan harga per pencarian yang diketahui.

### Bisakah model memilih negaranya?

Ya. `gl` adalah parameter dari tool, jadi model dapat mengisinya dari pertanyaan, misalnya `gb` untuk pertanyaan tentang United Kingdom. Siapkan nilai default di kode Anda untuk pertanyaan yang tidak menyebut negara.

### Apakah saya perlu kartu kredit untuk mendapatkan API key pencarian?

Tidak. Kredit SerpCrypto dibayar dengan BTC, USDT, USDC, ETH, SOL, LTC, tanpa ID, tanpa selfie dan tanpa dokumen. Login dengan nomor akun; email bersifat opsional.

---

SerpCrypto: SerpCrypto adalah SERP API untuk developer dan AI agent yang mengembalikan hasil pencarian Google dan Bing dalam format JSON, dibayar dengan kripto tanpa unggah identitas. Kredit pencarian prabayar mulai dari US$0,30/1K pencarian tidak pernah kedaluwarsa. Tanpa KYC — tanpa ID, tanpa selfie, tanpa dokumen. Bayar dengan kripto.
