# OpenAI function calling: ein read_url-Tool für Ihr Modell

> OpenAI function calling mit read_url-Tool: JSON-Schema und Python-Schleife, die Links in sauberes Markdown verwandelt. Ohne KYC, mit Krypto zahlen.

- URL: https://webreaderapi.com/de/docs/openai/
- Zuletzt aktualisiert: 2026-10-22
- Herausgeber: WebReaderAPI (https://webreaderapi.com)

Beschreiben Sie eine Funktion, `read_url`, und rufen Sie sie auf, wenn das Modell danach fragt. Das Modell entscheidet, welche Seiten gelesen werden; Ihr Code ruft die API auf und gibt das Markdown zurück. Dasselbe Schema funktioniert mit anderen Modellen, die Tool-Calling unterstützen.

**Kurze Antwort — Wie lasse ich ein OpenAI-Modell Webseiten per Function Calling lesen?**

Deklarieren Sie eine `read_url`-Funktion in der Liste `tools` und führen Sie dann eine Schleife aus: Wenn das Modell einen Tool-Aufruf zurückgibt, rufen Sie den `/read`-Endpoint von **WebReaderAPI** mit der URL auf und schicken Sie das Markdown als `tool`-Nachricht zurück. Jede Seite kostet 1 Credit, mit Browser 2, ab 0,07 $/1K Seiten Stand Oktober 2026. Ohne KYC; mit Krypto bezahlen.

## Wie sieht das read_url-Schema aus?

Zwei Parameter reichen: die zu lesende `url`, erforderlich, und ein optionales `max_chars`, mit dem das Modell eine lange Seite kurz halten kann. Die Description ist der wichtigste Teil: Sie sagt dem Modell, was das Tool zurückgibt und wann es zu verwenden ist. Halten Sie sie sachlich und kurz.

Wir nennen das Tool `read_url` statt `web_fetch`, um nicht mit Tools zu kollidieren, die einige Agent-Runtimes bereits unter diesem Namen bereitstellen.

*Die Tool-Definition*

```json
{
  "type": "function",
  "function": {
    "name": "read_url",
    "description": "Read a public web page and return its main content as Markdown, with its title and source URL. Use it when the user gives a link or when a page must be read to answer.",
    "parameters": {
      "type": "object",
      "properties": {
        "url": { "type": "string", "description": "The http or https address of the page." },
        "max_chars": { "type": "integer", "description": "Most characters to return, 1000 to 500000. Default 20000." }
      },
      "required": ["url"],
      "additionalProperties": false
    }
  }
}
```

## Wie funktioniert die Tool-Calling-Schleife?

Senden Sie die Konversation mit der Liste `tools`. Enthält die Antwort Tool-Aufrufe, führen Sie jeden aus, hängen Sie das Ergebnis als Nachricht mit der Rolle `tool` und der passenden `tool_call_id` an und fragen Sie das Modell erneut. Kommt eine Antwort ohne Tool-Aufruf zurück, ist das die finale Antwort.

Begrenzen Sie die Anzahl der Runden. Drei oder vier reichen für eine Frage zu einer Handvoll Seiten, und die Obergrenze schützt Sie vor einem Modell, das immer mehr anfordert.

*Python: die vollständige Schleife mit dem openai-Paket*

```python
import json
import os

import requests
from openai import OpenAI

READ_URL = {
    "type": "function",
    "function": {
        "name": "read_url",
        "description": "Read a public web page and return its main content as Markdown, with its title and source URL.",
        "parameters": {
            "type": "object",
            "properties": {
                "url": {"type": "string", "description": "The http or https address of the page."},
                "max_chars": {"type": "integer", "description": "Most characters to return. Default 20000."},
            },
            "required": ["url"],
            "additionalProperties": False,
        },
    },
}


def read_url(url, max_chars=20000):
    resp = requests.get(
        "https://webreaderapi.com/api/v1/read",
        headers={"Authorization": "Bearer " + os.environ["WEBREADER_API_KEY"]},
        params={"url": url, "max_chars": max_chars},
        timeout=75,
    )
    body = resp.json()
    if resp.status_code != 200:
        return "Could not read the page: " + body["error"]["code"]
    return "# " + (body.get("title") or url) + "\nSource: " + body["final_url"] + "\n\n" + body["markdown"]


client = OpenAI()
model = os.environ.get("OPENAI_MODEL", "gpt-4.1-mini")
messages = [{"role": "user", "content": "What does https://example.com/blog/first-post announce? Answer in two sentences."}]

for _ in range(4):
    reply = client.chat.completions.create(model=model, messages=messages, tools=[READ_URL])
    msg = reply.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)
        messages.append({"role": "tool", "tool_call_id": call.id, "content": read_url(**args)})

```

## Wie halte ich Token-Verbrauch und Kosten niedrig?

Drei Einstellungen zählen. Halten Sie `max_chars` moderat, etwa 8.000 bis 20.000 Zeichen pro Seite, denn jedes Zeichen, das Sie zurückgeben, wird vom Modell gelesen. Behalten Sie die Standardeinstellung `main_content=true` bei, damit Menüs und Fußzeilen nie in den Kontext gelangen. Und begrenzen Sie die Schleife wie oben, damit eine Frage nicht Dutzende Lesevorgänge auslöst.

Auf unserer Seite fallen Kosten pro Seite an, nicht pro Zeichen: 1 Credit = 1 gelesene Seite ohne Browser; 2 Credits, wenn die Seite einen Browser braucht, um JavaScript auszuführen. Eine Suchanfrage, die fehlschlägt oder die eine robots.txt einer Website verweigert, wird nicht abgerechnet. Ein Support-Assistent, der 300 Seiten pro Tag liest, verbraucht etwa 9.000 Credits pro Monat, innerhalb von 10.000 Seiten (3,75 $).

## Funktioniert das Schema mit anderen Modellen?

Ja, mit kleinen Anpassungen im Wrapper. Die meisten Tool-Calling-APIs nehmen ein JSON-Schema für die Parameter sowie einen Namen und eine Description für das Tool, daher lässt sich `read_url` unverändert zwischen Anbietern übertragen. Die [MCP-Seite](https://webreaderapi.com/de/docs/mcp/)] verpackt dieselbe Funktion für Clients, die das Model Context Protocol sprechen, und die [LangChain-Seite](https://webreaderapi.com/de/docs/langchain/)] verpackt sie für LangChain- und LlamaIndex-Agenten.

## Was sollte das Modell sehen, wenn eine Seite abgelehnt wird?

Einen kurzen, klaren Satz, wie ihn die obige Schleife zurückgibt: "Could not read the page: blocked_by_robots". Modelle gehen damit gut um und weichen auf andere Quellen aus oder informieren den Nutzer. Wir respektieren robots.txt: Unser Crawler identifiziert sich als WebReaderAPI, befolgt die Regeln, die für ihn oder für alle Roboter geschrieben sind, und liest keine Seite, die eine Website nicht erlaubt. Verweigerte Seiten werden nicht abgerechnet. Wenn eine Website unsere Suchanfrage ablehnt, geben wir ihre Antwort zurück: Wir lösen nie CAPTCHAs, melden uns nie in Konten an und versuchen nie, eine Sperre oder eine Paywall zu umgehen. Keine dieser Ablehnungen verbraucht einen Credit.

## Function Calling: häufige Fragen

### Braucht das die Responses API oder Chat Completions?

Das Beispiel verwendet Chat Completions mit dem Parameter `tools`. Dieselbe Funktionsdefinition und derselbe `read_url`-Body funktionieren mit anderen OpenAI-Schnittstellen, die Function Tools akzeptieren; nur die Schleife darum ändert sich.

### Kann das Modell mehrere Seiten in einem Durchgang lesen?

Ja. Eine Antwort kann mehrere Tool-Aufrufe enthalten; die Schleife führt jeden aus und gibt jedes Ergebnis zurück, bevor sie das Modell erneut fragt. Halten Sie `max_chars` niedriger, wenn das Modell viele Seiten auf einmal liest.

### Wird der API-Schlüssel dem Modell offengelegt?

Nein. Der Schlüssel bleibt in der Umgebung Ihres Codes. Das Modell sieht nur den Namen des Tools, seine Description und den Text, den Ihre Funktion zurückgibt.

### Was kostet eine abgelehnte Seite?

Nichts. 1 Credit = 1 gelesene Seite ohne Browser; 2 Credits, wenn die Seite einen Browser braucht, um JavaScript auszuführen. Eine Suchanfrage, die fehlschlägt oder die eine robots.txt einer Website verweigert, wird nicht abgerechnet.

---

WebReaderAPI: WebReaderAPI ist eine Web-Reader-API für KI-Agenten, die jede öffentliche Webseite in sauberes Markdown umwandelt und die Sie mit Krypto bezahlen – ohne ID-Upload. Prepaid-Credits ab 0,07 $/1K Seiten verfallen nie, und robots.txt wird respektiert. Ohne KYC – keine ID, kein Selfie, keine Dokumente. Mit Krypto bezahlen.
