File size: 2,236 Bytes
852e525
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# z.ai provider (Anthropic-compatible passthrough)

## Idea
Support z.ai (GLM) as an optional upstream for **Anthropic-compatible requests** (`/v1/messages`), without applying any Google/Gemini-specific transformations when z.ai is selected.

This keeps compatibility high (request/response shapes stay Anthropic-like) and avoids coupling z.ai traffic to the Google account pool.

## Result
We added an optional “z.ai provider” that:
- Is configured in proxy settings (`proxy.zai.*`).
- Can be enabled/disabled and used via dispatch modes.
- Forwards `/v1/messages` and `/v1/messages/count_tokens` to a z.ai Anthropic-compatible base URL.
- Streams responses back without parsing SSE.

## Configuration
Schema: `src-tauri/src/proxy/config.rs`
- `ZaiConfig` in `src-tauri/src/proxy/config.rs`
- `ZaiDispatchMode` in `src-tauri/src/proxy/config.rs`

Key fields:
- `proxy.zai.enabled`
- `proxy.zai.base_url` (default `https://api.z.ai/api/anthropic`)
- `proxy.zai.api_key`
- `proxy.zai.dispatch_mode`:
  - `off`
  - `exclusive`
  - `pooled`
  - `fallback`
- `proxy.zai.models` default mapping for `claude-*` request models:
  - `opus`, `sonnet`, `haiku`

## Routing logic
Entry point: [`src-tauri/src/proxy/handlers/claude.rs`](../../src-tauri/src/proxy/handlers/claude.rs)
- `handle_messages(...)` decides whether to route the request to z.ai or to the existing Google-backed flow.
- `pooled` mode uses round-robin across `(google_accounts + 1)` slots, where slot `0` is z.ai.

## Upstream implementation
Provider implementation: [`src-tauri/src/proxy/providers/zai_anthropic.rs`](../../src-tauri/src/proxy/providers/zai_anthropic.rs)
- Forwarding is conservative about headers (does not forward the proxy’s own auth key).
- Injects z.ai auth (`Authorization` / `x-api-key`) and forwards the request body as-is.
- Uses the global upstream proxy config when configured.

## Validation
1) Enable z.ai in the UI (`src/pages/ApiProxy.tsx`) and set `dispatch_mode=exclusive`.
   - UI: [`src/pages/ApiProxy.tsx`](../../src/pages/ApiProxy.tsx)
2) Start the proxy.
3) Send a normal Anthropic request to `POST /v1/messages`.
4) Verify the request is served by z.ai (and Google accounts are not involved for this endpoint in exclusive mode).