ccproxy-api 0.1.5__py3-none-any.whl → 0.1.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. ccproxy/_version.py +2 -2
  2. ccproxy/adapters/codex/__init__.py +11 -0
  3. ccproxy/adapters/openai/models.py +1 -1
  4. ccproxy/adapters/openai/response_adapter.py +355 -0
  5. ccproxy/adapters/openai/response_models.py +178 -0
  6. ccproxy/api/app.py +16 -0
  7. ccproxy/api/routes/codex.py +1231 -0
  8. ccproxy/api/routes/health.py +228 -3
  9. ccproxy/auth/openai/__init__.py +13 -0
  10. ccproxy/auth/openai/credentials.py +166 -0
  11. ccproxy/auth/openai/oauth_client.py +334 -0
  12. ccproxy/auth/openai/storage.py +184 -0
  13. ccproxy/claude_sdk/options.py +1 -1
  14. ccproxy/cli/commands/auth.py +398 -1
  15. ccproxy/cli/commands/serve.py +3 -1
  16. ccproxy/config/claude.py +1 -1
  17. ccproxy/config/codex.py +100 -0
  18. ccproxy/config/scheduler.py +4 -4
  19. ccproxy/config/settings.py +19 -0
  20. ccproxy/core/codex_transformers.py +389 -0
  21. ccproxy/core/http_transformers.py +153 -2
  22. ccproxy/models/detection.py +82 -0
  23. ccproxy/models/requests.py +22 -0
  24. ccproxy/models/responses.py +16 -0
  25. ccproxy/services/codex_detection_service.py +263 -0
  26. ccproxy/services/proxy_service.py +530 -0
  27. ccproxy/utils/model_mapping.py +7 -5
  28. ccproxy/utils/startup_helpers.py +62 -0
  29. ccproxy_api-0.1.6.dist-info/METADATA +615 -0
  30. {ccproxy_api-0.1.5.dist-info → ccproxy_api-0.1.6.dist-info}/RECORD +33 -22
  31. ccproxy_api-0.1.5.dist-info/METADATA +0 -396
  32. {ccproxy_api-0.1.5.dist-info → ccproxy_api-0.1.6.dist-info}/WHEEL +0 -0
  33. {ccproxy_api-0.1.5.dist-info → ccproxy_api-0.1.6.dist-info}/entry_points.txt +0 -0
  34. {ccproxy_api-0.1.5.dist-info → ccproxy_api-0.1.6.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,615 @@
1
+ Metadata-Version: 2.4
2
+ Name: ccproxy-api
3
+ Version: 0.1.6
4
+ Summary: API server that provides an Anthropic and OpenAI compatible interface over Claude Code, allowing to use your Claude OAuth account or over the API.
5
+ License-File: LICENSE
6
+ Requires-Python: >=3.11
7
+ Requires-Dist: aiofiles>=24.1.0
8
+ Requires-Dist: aiosqlite>=0.21.0
9
+ Requires-Dist: claude-code-sdk>=0.0.19
10
+ Requires-Dist: duckdb-engine>=0.17.0
11
+ Requires-Dist: duckdb>=1.1.0
12
+ Requires-Dist: fastapi-mcp
13
+ Requires-Dist: fastapi[standard]>=0.115.14
14
+ Requires-Dist: httpx-sse>=0.4.1
15
+ Requires-Dist: httpx>=0.28.1
16
+ Requires-Dist: jsonschema>=0.33.2
17
+ Requires-Dist: keyring>=25.6.0
18
+ Requires-Dist: openai>=1.93.0
19
+ Requires-Dist: prometheus-client>=0.22.1
20
+ Requires-Dist: pydantic-settings>=2.4.0
21
+ Requires-Dist: pydantic>=2.8.0
22
+ Requires-Dist: pyjwt>=2.10.1
23
+ Requires-Dist: rich-toolkit>=0.14.8
24
+ Requires-Dist: rich>=13.0.0
25
+ Requires-Dist: sqlmodel>=0.0.24
26
+ Requires-Dist: structlog>=25.4.0
27
+ Requires-Dist: textual>=3.7.1
28
+ Requires-Dist: tomli>=2.0.0; python_version < '3.11'
29
+ Requires-Dist: typer>=0.16.0
30
+ Requires-Dist: typing-extensions>=4.0.0
31
+ Requires-Dist: uvicorn>=0.34.0
32
+ Description-Content-Type: text/markdown
33
+
34
+ # CCProxy API Server
35
+
36
+ `ccproxy` is a local reverse proxy server that provides unified access to multiple AI providers through a single interface. It supports both Anthropic Claude and OpenAI Codex backends, allowing you to use your existing subscriptions without separate API key billing.
37
+
38
+ ## Supported Providers
39
+
40
+ ### Anthropic Claude
41
+
42
+ Access Claude via your Claude Max subscription at `api.anthropic.com/v1/messages`.
43
+
44
+ The server provides two primary modes of operation:
45
+
46
+ - **SDK Mode (`/sdk`):** Routes requests through the local `claude-code-sdk`. This enables access to tools configured in your Claude environment and includes an integrated MCP (Model Context Protocol) server for permission management.
47
+ - **API Mode (`/api`):** Acts as a direct reverse proxy, injecting the necessary authentication headers. This provides full access to the underlying API features and model settings.
48
+
49
+ ### OpenAI Codex Response API (Experimental)
50
+
51
+ Access OpenAI's [Response API](https://platform.openai.com/docs/api-reference/responses) via your ChatGPT Plus subscription. This provides programmatic access to ChatGPT models through the `chatgpt.com/backend-api/codex` endpoint.
52
+
53
+ - **Response API (`/codex/responses`):** Direct reverse proxy to ChatGPT backend for conversation responses
54
+ - **Session Management:** Supports both auto-generated and persistent session IDs for conversation continuity
55
+ - **OpenAI OAuth:** Uses the same OAuth2 PKCE authentication flow as the official Codex CLI
56
+ - **ChatGPT Plus Required:** Requires an active ChatGPT Plus subscription for API access
57
+ - **Instruction Prompt:** Automatically injects the Codex instruction prompt into conversations
58
+
59
+ The server includes a translation layer to support both Anthropic and OpenAI-compatible API formats for requests and responses, including streaming.
60
+
61
+ ## Installation
62
+
63
+ ```bash
64
+ # The official claude-code CLI is required for SDK mode
65
+ npm install -g @anthropic-ai/claude-code
66
+
67
+ # run it with uv
68
+ uvx ccproxy-api
69
+
70
+ # run it with pipx
71
+ pipx run ccproxy-api
72
+
73
+ # install with uv
74
+ uv tool install ccproxy-api
75
+
76
+ # Install ccproxy with pip
77
+ pipx install ccproxy-api
78
+
79
+ # Optional: Enable shell completion
80
+ eval "$(ccproxy --show-completion zsh)" # For zsh
81
+ eval "$(ccproxy --show-completion bash)" # For bash
82
+ ```
83
+
84
+ For dev version replace `ccproxy-api` with `git+https://github.com/caddyglow/ccproxy-api.git@dev`
85
+
86
+ ## Authentication
87
+
88
+ The proxy uses different authentication mechanisms depending on the provider and mode.
89
+
90
+ ### Claude Authentication
91
+
92
+ 1. **Claude CLI (`sdk` mode):**
93
+ This mode relies on the authentication handled by the `claude-code-sdk`.
94
+
95
+ ```bash
96
+ claude /login
97
+ ```
98
+
99
+ It's also possible now to get a long live token to avoid renewing issues
100
+ using
101
+
102
+ ```bash
103
+ claude setup-token
104
+ ```
105
+
106
+ 2. **ccproxy (`api` mode):**
107
+ This mode uses its own OAuth2 flow to obtain credentials for direct API access.
108
+
109
+ ```bash
110
+ ccproxy auth login
111
+ ```
112
+
113
+ If you are already connected with Claude CLI the credentials should be found automatically
114
+
115
+ ### OpenAI Codex Authentication (Experimental)
116
+
117
+ The Codex Response API requires ChatGPT Plus subscription and OAuth2 authentication:
118
+
119
+ ```bash
120
+ # Enable Codex provider
121
+ ccproxy config codex --enable
122
+
123
+ # Authentication options:
124
+
125
+ # Option 1: Use existing Codex CLI credentials (if available)
126
+ # CCProxy will automatically detect and use valid credentials from:
127
+ # - $HOME/.codex/auth.json (Codex CLI credentials)
128
+ # - Automatically renews tokens if expired but refresh token is valid
129
+
130
+ # Option 2: Login via CCProxy CLI (opens browser)
131
+ ccproxy auth login-openai
132
+
133
+ # Option 3: Use the official Codex CLI
134
+ codex auth login
135
+
136
+ # Check authentication status for all providers
137
+ ccproxy auth status
138
+ ```
139
+
140
+ **Important Notes:**
141
+
142
+ - Credentials are stored in `$HOME/.codex/auth.json`
143
+ - CCProxy reuses existing Codex CLI credentials when available
144
+ - If credentials are expired, CCProxy attempts automatic renewal
145
+ - Without valid credentials, users must authenticate using either CCProxy or Codex CLI
146
+
147
+ ### Authentication Status
148
+
149
+ You can check the status of all credentials with:
150
+
151
+ ```bash
152
+ ccproxy auth status # All providers
153
+ ccproxy auth validate # Claude only
154
+ ccproxy auth info # Claude only
155
+ ```
156
+
157
+ Warning is shown on startup if no credentials are setup.
158
+
159
+ ## Usage
160
+
161
+ ### Running the Server
162
+
163
+ ```bash
164
+ # Start the proxy server
165
+ ccproxy
166
+ ```
167
+
168
+ The server will start on `http://127.0.0.1:8000` by default.
169
+
170
+ ### Client Configuration
171
+
172
+ Point your existing tools and applications to the local proxy instance by setting the appropriate environment variables. A dummy API key is required by most client libraries but is not used by the proxy itself.
173
+
174
+ **For Claude (OpenAI-compatible clients):**
175
+
176
+ ```bash
177
+ # For SDK mode
178
+ export OPENAI_BASE_URL="http://localhost:8000/sdk/v1"
179
+ # For API mode
180
+ export OPENAI_BASE_URL="http://localhost:8000/api/v1"
181
+
182
+ export OPENAI_API_KEY="dummy-key"
183
+ ```
184
+
185
+ **For Claude (Anthropic-compatible clients):**
186
+
187
+ ```bash
188
+ # For SDK mode
189
+ export ANTHROPIC_BASE_URL="http://localhost:8000/sdk"
190
+ # For API mode
191
+ export ANTHROPIC_BASE_URL="http://localhost:8000/api"
192
+
193
+ export ANTHROPIC_API_KEY="dummy-key"
194
+ ```
195
+
196
+ **For OpenAI Codex Response API:**
197
+
198
+ ```bash
199
+ # Create a new conversation response (auto-generated session)
200
+ curl -X POST http://localhost:8000/codex/responses \
201
+ -H "Content-Type: application/json" \
202
+ -d '{
203
+ "model": "gpt-5",
204
+ "messages": [
205
+ {"role": "user", "content": "Hello, can you help me with Python?"}
206
+ ]
207
+ }'
208
+
209
+ # Continue conversation with persistent session ID
210
+ curl -X POST http://localhost:8000/codex/my_session_123/responses \
211
+ -H "Content-Type: application/json" \
212
+ -d '{
213
+ "model": "gpt-5",
214
+ "messages": [
215
+ {"role": "user", "content": "Show me an example of async/await"}
216
+ ]
217
+ }'
218
+
219
+ # Stream responses (SSE format)
220
+ curl -X POST http://localhost:8000/codex/responses \
221
+ -H "Content-Type: application/json" \
222
+ -d '{
223
+ "model": "gpt-5",
224
+ "messages": [{"role": "user", "content": "Explain quantum computing"}],
225
+ "stream": true
226
+ }'
227
+ ```
228
+
229
+ **For OpenAI-compatible clients using Codex:**
230
+
231
+ ```yaml
232
+ # Example aichat configuration (~/.config/aichat/config.yaml)
233
+ clients:
234
+ - type: claude
235
+ api_base: http://127.0.0.1:8000/codex
236
+
237
+ # Usage
238
+ aichat --model openai:gpt-5 "hello"
239
+ ```
240
+
241
+ **Important Codex Limitations:**
242
+
243
+ - Limited model support (e.g., `gpt-5` works, others may not)
244
+ - Many OpenAI parameters not supported (temperature, top_p, etc.)
245
+ - Reasoning content appears in XML tags for capable models
246
+
247
+ **Note:** The Codex instruction prompt is automatically injected into all conversations to maintain compatibility with the ChatGPT backend.
248
+
249
+ ### Codex Response API Details
250
+
251
+ #### Session Management
252
+
253
+ The Codex Response API supports flexible session management for conversation continuity:
254
+
255
+ - **Auto-generated sessions**: `POST /codex/responses` - Creates a new session ID for each request
256
+ - **Persistent sessions**: `POST /codex/{session_id}/responses` - Maintains conversation context across requests
257
+ - **Header forwarding**: Optional `session_id` header for custom session tracking
258
+
259
+ #### Instruction Prompt Injection
260
+
261
+ **Important:** CCProxy automatically injects the Codex instruction prompt into every conversation. This is required for proper interaction with the ChatGPT backend but affects your token usage:
262
+
263
+ - The instruction prompt is prepended to your messages
264
+ - This consumes additional tokens in each request
265
+ - The prompt ensures compatibility with ChatGPT's response generation
266
+ - You cannot disable this injection as it's required by the backend
267
+
268
+ #### Model Differences
269
+
270
+ The Response API models differ from standard OpenAI API models:
271
+
272
+ - Uses ChatGPT Plus models (e.g., `gpt-4`, `gpt-4-turbo`)
273
+ - Model behavior matches ChatGPT web interface
274
+ - Token limits and pricing follow ChatGPT Plus subscription terms
275
+ - See [OpenAI Response API Documentation](https://platform.openai.com/docs/api-reference/responses) for details
276
+
277
+ ## MCP Server Integration & Permission System
278
+
279
+ In SDK mode, CCProxy automatically configures an MCP (Model Context Protocol) server that provides permission checking tools for Claude Code. This enables interactive permission management for tool execution.
280
+
281
+ ### Permission Management
282
+
283
+ **Starting the Permission Handler:**
284
+
285
+ ```bash
286
+ # In a separate terminal, start the permission handler
287
+ ccproxy permission-handler
288
+
289
+ # Or with custom settings
290
+ ccproxy permission-handler --host 127.0.0.1 --port 8000
291
+ ```
292
+
293
+ The permission handler provides:
294
+
295
+ - **Real-time Permission Requests**: Streams permission requests via Server-Sent Events (SSE)
296
+ - **Interactive Approval/Denial**: Command-line interface for managing tool permissions
297
+ - **Automatic MCP Integration**: Works seamlessly with Claude Code SDK tools
298
+
299
+ **Working Directory Control:**
300
+ Control which project the Claude SDK API can access using the `--cwd` flag:
301
+
302
+ ```bash
303
+ # Set working directory for Claude SDK
304
+ ccproxy --claude-code-options-cwd /path/to/your/project
305
+
306
+ # Example with permission bypass and formatted output
307
+ ccproxy --claude-code-options-cwd /tmp/tmp.AZyCo5a42N \
308
+ --claude-code-options-permission-mode bypassPermissions \
309
+ --claude-sdk-message-mode formatted
310
+
311
+ # Alternative: Change to project directory and start ccproxy
312
+ cd /path/to/your/project
313
+ ccproxy
314
+ ```
315
+
316
+ ### Claude SDK Message Formatting
317
+
318
+ CCProxy supports flexible message formatting through the `sdk_message_mode` configuration:
319
+
320
+ - **`forward`** (default): Preserves original Claude SDK content blocks with full metadata
321
+ - **`formatted`**: Converts content to XML tags with pretty-printed JSON data
322
+ - **`ignore`**: Filters out Claude SDK-specific content entirely
323
+
324
+ Configure via environment variables:
325
+
326
+ ```bash
327
+ # Use formatted XML output
328
+ CLAUDE__SDK_MESSAGE_MODE=formatted ccproxy
329
+
330
+ # Use compact formatting without pretty-printing
331
+ CLAUDE__PRETTY_FORMAT=false ccproxy
332
+ ```
333
+
334
+ ## Claude SDK Pool Mode
335
+
336
+ CCProxy supports connection pooling for Claude Code SDK clients to improve request performance by maintaining a pool of pre-initialized Claude instances.
337
+
338
+ ### Benefits
339
+
340
+ - **Reduced Latency**: Eliminates Claude Code startup overhead on each request
341
+ - **Improved Performance**: Reuses established connections for faster response times
342
+ - **Resource Efficiency**: Maintains a configurable pool size to balance performance and resource usage
343
+
344
+ ### Usage
345
+
346
+ Pool mode is disabled by default and can be enabled using the CLI flag:
347
+
348
+ ```bash
349
+ # Enable pool mode with default settings
350
+ ccproxy --sdk-enable-pool
351
+
352
+ # Configure pool size (default: 3)
353
+ ccproxy --sdk-enable-pool --sdk-pool-size 5
354
+ ```
355
+
356
+ ### Limitations
357
+
358
+ - **No Dynamic Options**: Pool instances cannot change Claude options (max_tokens, model, etc.) after initialization
359
+ - **Shared Configuration**: All requests using the pool must use identical Claude configuration
360
+ - **Memory Usage**: Each pool instance consumes additional memory
361
+
362
+ Pool mode is most effective for high-frequency requests with consistent configuration requirements.
363
+
364
+ ## Using with Aider
365
+
366
+ CCProxy works seamlessly with Aider and other AI coding assistants:
367
+
368
+ ### Anthropic Mode
369
+
370
+ ```bash
371
+ export ANTHROPIC_API_KEY=dummy
372
+ export ANTHROPIC_BASE_URL=http://127.0.0.1:8000/api
373
+ aider --model claude-sonnet-4-20250514
374
+ ```
375
+
376
+ ### OpenAI Mode with Model Mapping
377
+
378
+ If your tool only supports OpenAI settings, ccproxy automatically maps OpenAI models to Claude:
379
+
380
+ ```bash
381
+ export OPENAI_API_KEY=dummy
382
+ export OPENAI_BASE_URL=http://127.0.0.1:8000/api/v1
383
+ aider --model o3-mini
384
+ ```
385
+
386
+ ### API Mode (Direct Proxy)
387
+
388
+ For minimal interference and direct API access:
389
+
390
+ ```bash
391
+ export OPENAI_API_KEY=dummy
392
+ export OPENAI_BASE_URL=http://127.0.0.1:8000/api/v1
393
+ aider --model o3-mini
394
+ ```
395
+
396
+ ### Using with OpenAI Codex
397
+
398
+ For tools that support custom API bases, you can use the Codex provider. Note that this has significant limitations compared to Claude providers.
399
+
400
+ **Example with aichat:**
401
+
402
+ ```yaml
403
+ # ~/.config/aichat/config.yaml
404
+ clients:
405
+ - type: claude
406
+ api_base: http://127.0.0.1:8000/codex
407
+ ```
408
+
409
+ ```bash
410
+ # Usage with confirmed working model
411
+ aichat --model openai:gpt-5 "hello"
412
+ ```
413
+
414
+ **Codex Limitations:**
415
+
416
+ - Only select models work (gpt-5 confirmed, others may fail)
417
+ - No support for temperature, top_p, or most OpenAI parameters
418
+ - When using reasoning models, reasoning appears as XML tags in output
419
+
420
+ ### `curl` Example
421
+
422
+ ```bash
423
+ # SDK mode
424
+ curl -X POST http://localhost:8000/sdk/v1/messages \
425
+ -H "Content-Type: application/json" \
426
+ -d '{
427
+ "model": "claude-3-5-sonnet-20241022",
428
+ "messages": [{"role": "user", "content": "Hello!"}],
429
+ "max_tokens": 100
430
+ }'
431
+
432
+ # API mode
433
+ curl -X POST http://localhost:8000/api/v1/messages \
434
+ -H "Content-Type: application/json" \
435
+ -d '{
436
+ "model": "claude-3-5-sonnet-20241022",
437
+ "messages": [{"role": "user", "content": "Hello!"}],
438
+ "max_tokens": 100
439
+ }'
440
+ ```
441
+
442
+ More examples are available in the `examples/` directory.
443
+
444
+ ## Endpoints
445
+
446
+ The proxy exposes endpoints under multiple prefixes for different providers and modes.
447
+
448
+ ### Claude Endpoints
449
+
450
+ | Mode | URL Prefix | Description | Use Case |
451
+ | ------- | ---------- | ------------------------------------------------- | ---------------------------------- |
452
+ | **SDK** | `/sdk/` | Uses `claude-code-sdk` with its configured tools. | Accessing Claude with local tools. |
453
+ | **API** | `/api/` | Direct proxy with header injection. | Full API control, direct access. |
454
+
455
+ - **Anthropic Format:**
456
+ - `POST /sdk/v1/messages`
457
+ - `POST /api/v1/messages`
458
+ - **OpenAI-Compatible Format:**
459
+ - `POST /sdk/v1/chat/completions`
460
+ - `POST /api/v1/chat/completions`
461
+
462
+ ### OpenAI Codex Endpoints
463
+
464
+ - **Response API:**
465
+ - `POST /codex/responses` - Create response with auto-generated session
466
+ - `POST /codex/{session_id}/responses` - Create response with persistent session
467
+ - `POST /codex/chat/completions` - OpenAI-compatible chat completions endpoint
468
+ - `POST /codex/v1/chat/completions` - Alternative OpenAI-compatible endpoint
469
+ - Supports streaming via SSE when `stream: true` is set
470
+ - See [Response API docs](https://platform.openai.com/docs/api-reference/responses)
471
+
472
+ **Codex Chat Completions Limitations:**
473
+
474
+ - **No Tool/Function Calling Support**: Tool use and function calling are not supported (use `/codex/responses` for tool calls)
475
+ - **Limited Parameter Support**: Many OpenAI parameters (temperature, top_p, frequency_penalty, etc.) are not supported
476
+ - **Restricted Model Support**: Only certain models work (e.g., `gpt-5` confirmed working, others may fail)
477
+ - **No Custom System Prompts**: System messages and instructions are overridden by the required Codex instruction prompt
478
+ - **Reasoning Mode**: GPT models with reasoning capabilities pass reasoning content between XML tags (`<reasoning>...</reasoning>`)
479
+ - **Session Management**: Uses auto-generated sessions; persistent sessions require the `/codex/{session_id}/responses` endpoint
480
+ - **ChatGPT Plus Required**: Requires active ChatGPT Plus subscription for access
481
+
482
+ **Note**: The `/codex/responses` endpoint supports tool calling and more parameters, but specific feature availability depends on ChatGPT's backend - users should test individual capabilities.
483
+
484
+ ### Utility Endpoints
485
+
486
+ - **Health & Status:**
487
+ - `GET /health`
488
+ - `GET /sdk/models`, `GET /api/models`
489
+ - `GET /sdk/status`, `GET /api/status`
490
+ - **Authentication:**
491
+ - `GET /oauth/callback` - OAuth callback for both Claude and OpenAI
492
+ - **MCP & Permissions:**
493
+ - `POST /mcp/permission/check` - MCP permission checking endpoint
494
+ - `GET /permissions/stream` - SSE stream for permission requests
495
+ - `GET /permissions/{id}` - Get permission request details
496
+ - `POST /permissions/{id}/respond` - Respond to permission request
497
+ - **Observability (Optional):**
498
+ - `GET /metrics`
499
+ - `GET /logs/status`, `GET /logs/query`
500
+ - `GET /dashboard`
501
+
502
+ ## Supported Models
503
+
504
+ CCProxy supports recent Claude models including Opus, Sonnet, and Haiku variants. The specific models available to you will depend on your Claude account and the features enabled for your subscription.
505
+
506
+ - `claude-opus-4-20250514`
507
+ - `claude-sonnet-4-20250514`
508
+ - `claude-3-7-sonnet-20250219`
509
+ - `claude-3-5-sonnet-20241022`
510
+ - `claude-3-5-sonnet-20240620`
511
+
512
+ ## Configuration
513
+
514
+ Settings can be configured through (in order of precedence):
515
+
516
+ 1. Command-line arguments
517
+ 2. Environment variables
518
+ 3. `.env` file
519
+ 4. TOML configuration files (`.ccproxy.toml`, `ccproxy.toml`, or `~/.config/ccproxy/config.toml`)
520
+ 5. Default values
521
+
522
+ For complex configurations, you can use a nested syntax for environment variables with `__` as a delimiter:
523
+
524
+ ```bash
525
+ # Server settings
526
+ SERVER__HOST=0.0.0.0
527
+ SERVER__PORT=8080
528
+ # etc.
529
+ ```
530
+
531
+ ## Securing the Proxy (Optional)
532
+
533
+ You can enable token authentication for the proxy. This supports multiple header formats (`x-api-key` for Anthropic, `Authorization: Bearer` for OpenAI) for compatibility with standard client libraries.
534
+
535
+ **1. Generate a Token:**
536
+
537
+ ```bash
538
+ ccproxy generate-token
539
+ # Output: SECURITY__AUTH_TOKEN=abc123xyz789...
540
+ ```
541
+
542
+ **2. Configure the Token:**
543
+
544
+ ```bash
545
+ # Set environment variable
546
+ export SECURITY__AUTH_TOKEN=abc123xyz789...
547
+
548
+ # Or add to .env file
549
+ echo "SECURITY__AUTH_TOKEN=abc123xyz789..." >> .env
550
+ ```
551
+
552
+ **3. Use in Requests:**
553
+ When authentication is enabled, include the token in your API requests.
554
+
555
+ ```bash
556
+ # Anthropic Format (x-api-key)
557
+ curl -H "x-api-key: your-token" ...
558
+
559
+ # OpenAI/Bearer Format
560
+ curl -H "Authorization: Bearer your-token" ...
561
+ ```
562
+
563
+ ## Observability
564
+
565
+ `ccproxy` includes an optional but powerful observability suite for monitoring and analytics. When enabled, it provides:
566
+
567
+ - **Prometheus Metrics:** A `/metrics` endpoint for real-time operational monitoring.
568
+ - **Access Log Storage:** Detailed request logs, including token usage and costs, are stored in a local DuckDB database.
569
+ - **Analytics API:** Endpoints to query and analyze historical usage data.
570
+ - **Real-time Dashboard:** A live web interface at `/dashboard` to visualize metrics and request streams.
571
+
572
+ These features are disabled by default and can be enabled via configuration. For a complete guide on setting up and using these features, see the [Observability Documentation](docs/observability.md).
573
+
574
+ ## Troubleshooting
575
+
576
+ ### Common Issues
577
+
578
+ 1. **Authentication Error:** Ensure you're using the correct mode (`/sdk` or `/api`) for your authentication method.
579
+ 2. **Claude Credentials Expired:** Run `ccproxy auth login` to refresh credentials for API mode. Run `claude /login` for SDK mode.
580
+ 3. **OpenAI/Codex Authentication Failed:**
581
+ - Check if valid credentials exist: `ccproxy auth status`
582
+ - Ensure you have an active ChatGPT Plus subscription
583
+ - Try re-authenticating: `ccproxy auth login-openai` or `codex auth login`
584
+ - Verify credentials in `$HOME/.codex/auth.json`
585
+ 4. **Codex Response API Errors:**
586
+ - "Instruction prompt injection failed": The backend requires the Codex prompt; this is automatic
587
+ - "Session not found": Use persistent session IDs for conversation continuity
588
+ - "Model not available": Ensure you're using ChatGPT Plus compatible models
589
+ 5. **Missing API Auth Token:** If you've enabled security, include the token in your request headers.
590
+ 6. **Port Already in Use:** Start the server on a different port: `ccproxy --port 8001`.
591
+ 7. **Model Not Available:** Check that your subscription includes the requested model.
592
+
593
+ ## Contributing
594
+
595
+ Please see [CONTRIBUTING.md](CONTRIBUTING.md) for details.
596
+
597
+ ## License
598
+
599
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
600
+
601
+ ## Documentation
602
+
603
+ - **[Online Documentation](https://caddyglow.github.io/ccproxy-api)**
604
+ - **[API Reference](https://caddyglow.github.io/ccproxy-api/api-reference/overview/)**
605
+ - **[Developer Guide](https://caddyglow.github.io/ccproxy-api/developer-guide/architecture/)**
606
+
607
+ ## Support
608
+
609
+ - Issues: [GitHub Issues](https://github.com/CaddyGlow/ccproxy-api/issues)
610
+ - Documentation: [Project Documentation](https://caddyglow.github.io/ccproxy-api)
611
+
612
+ ## Acknowledgments
613
+
614
+ - [Anthropic](https://anthropic.com) for Claude and the Claude Code SDK
615
+ - The open-source community