# OpenAI function calling: narzędzie wyszukiwania Google w 60 liniach Pythona

> Daj modelowi OpenAI narzędzie wyszukiwania Google: schemat JSON, pętlę tool-calling w Pythonie na API SERP SerpCrypto i ten sam schemat dla Claude. Bez KYC.

- URL: https://serpcrypto.com/pl/docs/openai/
- Ostatnia aktualizacja: 2026-10-22
- Wydawca: SerpCrypto (https://serpcrypto.com)

Opisz modelowi funkcję `google_search`, wykonuj wyszukiwania, o które prosi, i odsyłaj wyniki z powrotem. Schemat to zwykły JSON Schema, więc przenosi się do Claude i innych modeli obsługujących tool-calling.

**Szybka odpowiedź — Jak dać modelowi OpenAI narzędzie wyszukiwania w sieci?**

Zadeklaruj funkcję `google_search` ze schematem JSON w `tools`, a następnie pętl: gdy model zwróci `tool_calls`, wykonaj każde wyszukiwanie na `https://serpcrypto.com/api/v1/search` i dołącz wyniki jako wiadomości `tool`, aż odpowie. **SerpCrypto** pobiera 1 kredyt za każde udane wyszukiwanie, od 0,30 USD/1K wyszukiwań, płatne kryptowalutą bez KYC.

## Jak wygląda schemat narzędzia?

Narzędzie funkcyjne ma nazwę, opis i parametry w JSON Schema. Model widzi tylko te trzy rzeczy, więc opis musi mówić, co zwraca narzędzie i kiedy go użyć. Wymagane jest tylko `query`; kraj i język są opcjonalne, a w kodzie domyślnie przyjmują angielski (US).

*Definicja narzędzia (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"]
    }
  }
}
```

## Jak działa pętla wywoływania narzędzi?

Wyślij pytanie z `tools`. Jeśli odpowiedź zawiera `tool_calls`, uruchom każde z nich, dołącz wiadomość asystenta i po jednej wiadomości `tool` na każde wywołanie z pasującym `tool_call_id`, a następnie ponownie wywołaj model. Gdy odpowiedź nie zawiera wywołania narzędzia, jest to odpowiedź końcowa.

Pętla poniżej zatrzymuje się po trzech wyszukiwaniach. Limit chroni Twoje kredyty, jeśli model wyszukuje w kółko, a trzy wyszukiwania wystarczają, by odpowiedzieć na większość pytań faktograficznych.

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

## Czy ten sam schema działa z Claude i innymi modelami?

Tak, z innym wrapperem. Tool use w Claude przyjmuje ten sam JSON Schema pod `input_schema`, obok `name` i `description`. Większość innych API do wywoływania narzędzi również akceptuje JSON Schema dla parametrów; zmieniają się tylko nazwy zewnętrznych pól. Sama funkcja wyszukiwania pozostaje bez zmian, ponieważ wywołuje tylko endpoint SerpCrypto.

*To samo narzędzie dla 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"]
  }
}
```

## Co narzędzie powinno zwracać modelowi?

Krótki tekst z linkami. Pięć wyników z tytułem, linkiem i snippetem zwykle wystarcza modelowi, by odpowiedzieć i zacytować źródła. Zwrócenie pełnego JSON działa, ale kosztuje więcej tokenów i daje modelowi więcej szumu do czytania.

Dodaj tekst AI Overview, jeśli jest obecny, gdy chcesz, aby model zobaczył własne podsumowanie Google, i zachowaj linki do źródeł, aby odpowiedź mogła cytować strony, a nie overview.

## Jak utrzymać przewidywalne koszty wyszukiwania?

Licz wywołania narzędzi: każde udane to jeden kredyt. Ogranicz liczbę wyszukiwań na pytanie, tak jak robi to pętla, i loguj każde wywołanie wraz z zapytaniem, aby widzieć, o co pyta model. W pakiecie 100 000 wyszukiwań stawka wynosi 0,56 USD/1K wyszukiwań, a Prepaid kredyty wyszukiwania nigdy nie wygasają: niewykorzystane wyszukiwania pozostają na Twoim koncie, dopóki ich nie wykorzystasz.

Błędy nic nie kosztują: 1 kredyt = 1 udane zapytanie wyszukiwania, które zwraca jedną stronę wyników na dowolnym obsługiwanym silniku. Nieudane zapytanie nie jest rozliczane.

## Pytania o function calling

### Czy mogę użyć Responses API zamiast Chat Completions?

Tak. Responses API przyjmuje narzędzia funkcyjne z tym samym JSON Schema, z `name`, `description` i `parameters` na najwyższym poziomie każdego narzędzia. Funkcja wyszukiwania i idea pętli się nie zmieniają.

### Dlaczego nie użyć wbudowanego wyszukiwania w sieci dostawcy modelu?

Wbudowane narzędzia wyszukiwania same wybierają źródła i ustawienia. Funkcja na SerpCrypto daje wyniki wyszukiwania Google dla wybranego kraju i języka, jako JSON, który możesz logować, w znanej cenie za wyszukiwanie.

### Czy model może wybrać kraj?

Tak. `gl` to parametr narzędzia, więc model może ustawić go na podstawie pytania, na przykład `gb` dla pytania o Wielką Brytanię. Zachowaj w kodzie wartość domyślną dla pytań, które nie wskazują kraju.

### Czy potrzebuję karty kredytowej, aby uzyskać klucz API do wyszukiwania?

Nie. Kredyty SerpCrypto są opłacane w BTC, USDT, USDC, ETH, SOL, LTC, bez dowodu, bez selfie i bez dokumentów. Logowanie numerem konta; email jest opcjonalny.

---

SerpCrypto: SerpCrypto to API SERP dla deweloperów i agentów AI, które zwraca wyniki wyszukiwania Google i Bing w formacie JSON, z płatnością kryptowalutą i bez przesyłania dokumentów tożsamości. Przedpłacone kredyty wyszukiwania od 0,30 USD/1K wyszukiwań nigdy nie wygasają. Bez KYC — bez dokumentu, bez selfie, bez dokumentów. Płatność kryptowalutą.
