|
1 | 1 | --- |
2 | 2 | translation: |
3 | | - sections: [9cac816674181eb0, 7c157764133fea1f, 40b4916d82eaf1d4, 10d151f2cc75317f, 3d0832f39b0d7059, 92742ba36533633d, 0aeca6145e7bd302] |
| 3 | + sections: [9cac816674181eb0, 5619e950d206e6c8, 40b4916d82eaf1d4, 10d151f2cc75317f, 3d0832f39b0d7059, 92742ba36533633d, 991c10e47fda2636] |
4 | 4 | tool: 1 |
5 | 5 | --- |
6 | 6 | # Client-Transporte {#client-transports} |
@@ -44,23 +44,41 @@ Zwei Dinge fallen auf: |
44 | 44 | * Der `httpx2.AsyncClient` gehört dir, also betrittst und verlässt **du** ihn. Das SDK schließt nie einen Client, den es nicht selbst erzeugt hat. |
45 | 45 | * `streamable_http_client(url, http_client=...)` gibt einen Transport zurück, und `Client(transport)` nimmt ihn an wie alles andere auch. |
46 | 46 |
|
| 47 | +Behalte das `timeout=` bei. Es ist dasselbe, das der SDK-eigene Client verwendet (30 Sekunden, 300 für Lesevorgänge); ein `httpx2.AsyncClient`, der ohne gebaut wird, bekommt den 5-Sekunden-Standardwert von `httpx2`, und ein Tool-Aufruf, der länger läuft, schlägt mit einem Read-Timeout fehl. |
| 48 | + |
47 | 49 | Eine Anmerkung zu TLS: `httpx2` prüft Zertifikate gegen den Trust Store des Betriebssystems (über |
48 | 50 | [`truststore`](https://pypi.org/project/truststore/)), nicht gegen eine mitgelieferte CA-Liste. In einer Umgebung ohne |
49 | 51 | nutzbaren System-CA-Store (manche minimalen Container) setzt du die Standard-Umgebungsvariablen `SSL_CERT_FILE`/`SSL_CERT_DIR` |
50 | 52 | oder übergibst deinem `httpx2.AsyncClient` ein explizites `verify=ssl_context` |
51 | 53 | (Hintergrund in |
52 | 54 | [`httpx` und `httpx-sse` durch `httpx2` ersetzt](../migration.md#httpx-and-httpx-sse-replaced-by-httpx2)). |
53 | 55 |
|
| 56 | +### Größere SSE-Events {#larger-sse-events} |
| 57 | + |
| 58 | +Übergib `max_sse_event_size`, wenn ein Server ein großes Tool-Ergebnis oder eine große Benachrichtigung in einem einzigen SSE-Event sendet: |
| 59 | + |
| 60 | +```python title="client.py" hl_lines="6-9" |
| 61 | +--8<-- "docs_src/client_transports/tutorial005.py" |
| 62 | +``` |
| 63 | + |
| 64 | +Der Standardwert ist 1 MiB pro Event, gemessen in Bytes, bevor das Event geparst wird. Das Limit gilt für |
| 65 | +POST-Responses, den GET-Stream und wiederaufgenommene Streams. Ein zu großes Event in einer POST-Response oder einem |
| 66 | +wiederaufgenommenen Stream lässt diesen Request mit einem SSE-Fehler fehlschlagen. Beim GET-Stream im Hintergrund loggt |
| 67 | +der Client den Fehler und startet den Stream neu. Setze `max_sse_event_size=None`, um die Obergrenze abzuschalten, wenn du dem |
| 68 | +Server vertraust und größere Events brauchst. JSON-Responses sind nicht betroffen. Wenn du `ClientSessionGroup` verwendest, setze |
| 69 | +dieselbe Option an `StreamableHttpParameters`. |
| 70 | + |
54 | 71 | !!! warning |
55 | 72 | `streamable_http_client` nahm früher `headers=` und `timeout=` direkt entgegen. Das tut er nicht mehr: |
56 | | - seine einzigen Parameter sind `url`, `http_client` und `terminate_on_close`. Greifst du aus |
| 73 | + Seine Parameter sind `url`, `http_client`, `terminate_on_close` und `max_sse_event_size`. Greifst du aus |
57 | 74 | Gewohnheit zu `headers=`, bekommst du: |
58 | 75 |
|
59 | 76 | ```text |
60 | 77 | TypeError: streamable_http_client() got an unexpected keyword argument 'headers' |
61 | 78 | ``` |
62 | 79 |
|
63 | | - Alles, was mit HTTP zu tun hat, lebt jetzt auf dem einen `httpx2.AsyncClient`, den du übergibst. |
| 80 | + Header, Authentifizierung, Proxys und Timeouts leben auf dem einen `httpx2.AsyncClient`, den du übergibst. |
| 81 | + `max_sse_event_size` gilt dagegen für die SSE-Reader des MCP-Transports. |
64 | 82 |
|
65 | 83 | !!! info |
66 | 84 | `httpx2` behält die vertraute `httpx`-API bei. Wenn du `httpx` kennst, weißt du hier also bereits, wie Auth, |
@@ -137,6 +155,7 @@ Ein **Transport** ist ein beliebiger asynchroner Kontextmanager, der ein `(read, |
137 | 155 |
|
138 | 156 | * `Client("http://.../mcp")` (eine URL) verbindet über Streamable HTTP, den Produktions-Transport. |
139 | 157 | * Header, Auth, Proxys und Timeouts gehören auf einen `httpx2.AsyncClient`, den du an `streamable_http_client(url, http_client=...)` übergibst. Es gibt kein Keyword `headers=`. |
| 158 | +* Verwende `streamable_http_client(url, max_sse_event_size=...)`, um das Byte-Limit für jedes SSE-Event zu ändern. |
140 | 159 | * Redirects wird nur innerhalb des eigenen Origins der URL gefolgt (ein Trailing-Slash-`307`/`308`), plus `http`→`https` auf demselben Host. Alles andere schlägt mit `Redirect to … not followed` fehl; konfiguriere die endgültige URL. |
141 | 160 | * stdio ist `Client(StdioServerParameters(...))`. Pack es nur dann selbst in `stdio_client(...)` ein, wenn du die stderr des Kindprozesses umleiten willst. |
142 | 161 | * Der Subprozess bekommt eine Umgebung per Allow-List, nicht deine; `env=` ergänzt sie. |
|
0 commit comments