ccproxy-api 0.1.5__tar.gz → 0.1.6__tar.gz
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.
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/.pre-commit-config.yaml +4 -3
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/CHANGELOG.md +171 -23
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/Makefile +8 -0
- ccproxy_api-0.1.6/PKG-INFO +615 -0
- ccproxy_api-0.1.6/README.md +582 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/_version.py +2 -2
- ccproxy_api-0.1.6/ccproxy/adapters/codex/__init__.py +11 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/adapters/openai/models.py +1 -1
- ccproxy_api-0.1.6/ccproxy/adapters/openai/response_adapter.py +355 -0
- ccproxy_api-0.1.6/ccproxy/adapters/openai/response_models.py +178 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/app.py +16 -0
- ccproxy_api-0.1.6/ccproxy/api/routes/codex.py +1231 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/routes/health.py +228 -3
- ccproxy_api-0.1.6/ccproxy/auth/openai/__init__.py +13 -0
- ccproxy_api-0.1.6/ccproxy/auth/openai/credentials.py +166 -0
- ccproxy_api-0.1.6/ccproxy/auth/openai/oauth_client.py +334 -0
- ccproxy_api-0.1.6/ccproxy/auth/openai/storage.py +184 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/claude_sdk/options.py +1 -1
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/cli/commands/auth.py +398 -1
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/cli/commands/serve.py +3 -1
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/config/claude.py +1 -1
- ccproxy_api-0.1.6/ccproxy/config/codex.py +100 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/config/scheduler.py +4 -4
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/config/settings.py +19 -0
- ccproxy_api-0.1.6/ccproxy/core/codex_transformers.py +389 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/core/http_transformers.py +153 -2
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/models/detection.py +82 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/models/requests.py +22 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/models/responses.py +16 -0
- ccproxy_api-0.1.6/ccproxy/services/codex_detection_service.py +263 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/services/proxy_service.py +530 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/utils/model_mapping.py +7 -5
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/utils/startup_helpers.py +62 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/devenv.lock +4 -4
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/api-reference.md +45 -1
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/user-guide/authentication.md +108 -11
- ccproxy_api-0.1.6/docs/user-guide/codex-api.md +549 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/pyproject.toml +2 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/conftest.py +101 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/fixtures/claude_sdk/client_mocks.py +6 -2
- ccproxy_api-0.1.6/tests/fixtures/external_apis/openai_codex_api.py +153 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/helpers/assertions.py +27 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/helpers/test_data.py +84 -0
- ccproxy_api-0.1.6/tests/test_cache_control_limiter.py +321 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/api/test_api.py +101 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/auth/test_auth.py +186 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/config/test_claude_sdk_options.py +18 -13
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/services/test_claude_sdk_client.py +1 -1
- ccproxy_api-0.1.6/tests/unit/services/test_codex_proxy.py +379 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/services/test_scheduler.py +7 -3
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/uv.lock +1634 -1611
- ccproxy_api-0.1.5/PKG-INFO +0 -396
- ccproxy_api-0.1.5/README.md +0 -364
- ccproxy_api-0.1.5/SESSION_POOL_FIX_PLAN.md +0 -118
- ccproxy_api-0.1.5/cleanup.sh +0 -13
- ccproxy_api-0.1.5/debug_stream.sh +0 -18
- ccproxy_api-0.1.5/debug_stream_openai.sh +0 -17
- ccproxy_api-0.1.5/reddit.md +0 -471
- ccproxy_api-0.1.5/reddit_soft.md +0 -101
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/.env.example +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/.github/workflows/backend.yml +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/.github/workflows/build.yml +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/.github/workflows/ci.yml +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/.github/workflows/docs.yml +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/.github/workflows/frontend.yml.disabled +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/.github/workflows/release.yml +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/.gitignore +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/.python-version +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/CONTRIBUTING.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/CONVENTIONS.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/Dockerfile +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/LICENSE +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/TESTING.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/__main__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/adapters/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/adapters/base.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/adapters/openai/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/adapters/openai/adapter.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/adapters/openai/streaming.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/dependencies.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/middleware/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/middleware/auth.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/middleware/cors.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/middleware/errors.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/middleware/headers.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/middleware/logging.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/middleware/request_content_logging.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/middleware/request_id.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/middleware/server_header.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/responses.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/routes/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/routes/claude.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/routes/mcp.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/routes/metrics.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/routes/permissions.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/routes/proxy.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/services/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/services/permission_service.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/ui/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/ui/permission_handler_protocol.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/api/ui/terminal_permission_handler.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/auth/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/auth/bearer.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/auth/conditional.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/auth/credentials_adapter.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/auth/dependencies.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/auth/exceptions.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/auth/manager.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/auth/models.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/auth/oauth/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/auth/oauth/models.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/auth/oauth/routes.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/auth/oauth/storage.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/auth/storage/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/auth/storage/base.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/auth/storage/json_file.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/auth/storage/keyring.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/claude_sdk/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/claude_sdk/client.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/claude_sdk/converter.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/claude_sdk/exceptions.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/claude_sdk/manager.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/claude_sdk/message_queue.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/claude_sdk/parser.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/claude_sdk/session_client.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/claude_sdk/session_pool.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/claude_sdk/stream_handle.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/claude_sdk/stream_worker.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/claude_sdk/streaming.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/cli/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/cli/commands/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/cli/commands/config/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/cli/commands/config/commands.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/cli/commands/config/schema_commands.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/cli/commands/permission_handler.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/cli/docker/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/cli/docker/adapter_factory.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/cli/docker/params.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/cli/helpers.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/cli/main.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/cli/options/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/cli/options/claude_options.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/cli/options/core_options.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/cli/options/security_options.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/cli/options/server_options.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/config/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/config/auth.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/config/cors.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/config/discovery.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/config/docker_settings.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/config/observability.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/config/pricing.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/config/reverse_proxy.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/config/security.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/config/server.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/config/validators.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/core/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/core/async_utils.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/core/constants.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/core/errors.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/core/http.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/core/interfaces.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/core/logging.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/core/middleware.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/core/proxy.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/core/system.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/core/transformers.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/core/types.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/core/validators.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/docker/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/docker/adapter.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/docker/docker_path.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/docker/middleware.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/docker/models.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/docker/protocol.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/docker/stream_process.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/docker/validators.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/models/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/models/claude_sdk.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/models/errors.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/models/messages.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/models/permissions.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/models/types.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/observability/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/observability/access_logger.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/observability/context.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/observability/metrics.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/observability/pushgateway.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/observability/sse_events.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/observability/stats_printer.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/observability/storage/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/observability/storage/duckdb_simple.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/observability/storage/models.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/observability/streaming_response.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/pricing/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/pricing/cache.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/pricing/loader.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/pricing/models.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/pricing/updater.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/scheduler/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/scheduler/core.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/scheduler/errors.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/scheduler/manager.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/scheduler/registry.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/scheduler/tasks.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/services/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/services/claude_detection_service.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/services/claude_sdk_service.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/services/credentials/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/services/credentials/config.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/services/credentials/manager.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/services/credentials/oauth_client.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/static/.keep +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/testing/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/testing/config.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/testing/content_generation.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/testing/mock_responses.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/testing/response_handlers.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/testing/scenarios.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/utils/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/utils/cost_calculator.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/utils/disconnection_monitor.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/utils/id_generator.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/utils/models_provider.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/utils/simple_request_logger.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/utils/streaming_metrics.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/ccproxy/utils/version_checker.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/data/metrics.db +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/devenv.nix +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docker-compose.monitoring.yml +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docker-compose.yml +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/README.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/assets/extra.css +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/assets/extra.js +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/contributing.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/development/debugging-with-proxy.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/examples.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/gen_ref_pages.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/getting-started/configuration.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/getting-started/installation.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/getting-started/quickstart.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/index.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/metrics-api.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/observability.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/systemd-setup.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/user-guide/api-usage.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/user-guide/claude-code-options.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/user-guide/claude-sdk-compatibility.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/user-guide/mcp-integration.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/user-guide/pool-configuration.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/docs/user-guide/understanding-pool-logs.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/README.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/README_chat_agent.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/ai_code_discussion_demo.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/anthropic_streaming_demo.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/anthropic_tools_demo.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/client.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/common_utils.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/console_utils.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/debug_anthropic_streaming.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/openai_anthropic_conversation_demo.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/openai_claude_code_options_example.sh +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/openai_json_object_example.sh +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/openai_json_schema_example.sh +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/openai_streaming_demo.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/openai_structured_response_demo.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/openai_thinking_demo.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/openai_tools_demo.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/project_code_access_demo.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/simple_thinking_demo.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/examples/textual_chat_agent.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/mkdocs.yml +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/monitoring/grafana/dashboards/ccproxy-dashboard.json +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/monitoring/grafana/provisioning/dashboards/dashboard.yml +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/monitoring/grafana/provisioning/datasources/victoria-metrics.yml +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/scripts/act-run.sh +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/scripts/build-docs.sh +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/scripts/entrypoint.sh +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/scripts/format_version.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/scripts/serve-docs.sh +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/scripts/setup-systemd.sh +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/scripts/setup.sh +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/scripts/traffic_generator.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/systemd/ccproxy.service.template +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/.gitignore +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/factories/README.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/factories/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/factories/fastapi_factory.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/fixtures/README.md +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/fixtures/auth/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/fixtures/auth/example_usage.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/fixtures/claude_sdk/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/fixtures/claude_sdk/internal_mocks.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/fixtures/claude_sdk/responses.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/fixtures/credentials.json +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/fixtures/external_apis/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/fixtures/external_apis/anthropic_api.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/fixtures/proxy_service/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/fixtures/proxy_service/oauth_mocks.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/fixtures/responses.json +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/helpers/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/integration/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/integration/test_access_logger_integration.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/integration/test_confirmation_integration.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/integration/test_duckdb_settings_integration.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/integration/test_streaming_access_logging.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/api/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/api/test_confirmation_routes.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/api/test_mcp_route.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/api/test_metrics_api.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/api/test_reset_endpoint.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/auth/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/cli/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/cli/test_cli_auth_commands.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/cli/test_cli_config.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/cli/test_cli_confirmation_handler.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/cli/test_cli_serve.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/config/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/config/test_claude_sdk_parser.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/config/test_terminal_handler.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/observability/test_streaming_response.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/services/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/services/test_adapters.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/services/test_confirmation_service.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/services/test_docker.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/services/test_fastapi_factory.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/services/test_http_transformers.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/services/test_observability.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/services/test_pricing.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/services/test_pushgateway_error_handling.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/services/test_queue_duckdb_storage.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/services/test_scheduler_tasks.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/services/test_session_pool_race_condition.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/services/test_sse_events.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/services/test_sse_stream_filtering.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/services/test_stats_printer.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/services/test_streaming.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/utils/__init__.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/utils/test_duckdb_lifecycle.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/utils/test_startup_helpers.py +0 -0
- {ccproxy_api-0.1.5 → ccproxy_api-0.1.6}/tests/unit/utils/test_version_checker.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
repos:
|
|
2
2
|
# Ruff linting and formatting
|
|
3
3
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
4
|
-
rev: v0.12.
|
|
4
|
+
rev: v0.12.8
|
|
5
5
|
hooks:
|
|
6
6
|
# Ruff linting (matches: make lint -> uv run ruff check .)
|
|
7
7
|
- id: ruff
|
|
@@ -16,7 +16,7 @@ repos:
|
|
|
16
16
|
|
|
17
17
|
# MyPy type checking (matches: make typecheck -> uv run mypy .)
|
|
18
18
|
- repo: https://github.com/pre-commit/mirrors-mypy
|
|
19
|
-
rev: v1.
|
|
19
|
+
rev: v1.17.1
|
|
20
20
|
hooks:
|
|
21
21
|
- id: mypy
|
|
22
22
|
name: mypy type check
|
|
@@ -58,6 +58,7 @@ repos:
|
|
|
58
58
|
- textual>=3.7.1
|
|
59
59
|
- aiofiles>=24.1.0
|
|
60
60
|
- types-aiofiles>=24.0.0
|
|
61
|
+
- pyjwt>=2.10.0
|
|
61
62
|
args: [--config-file=pyproject.toml]
|
|
62
63
|
exclude: ^(docs/|examples/)
|
|
63
64
|
|
|
@@ -81,7 +82,7 @@ repos:
|
|
|
81
82
|
|
|
82
83
|
# General file checks
|
|
83
84
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
84
|
-
rev:
|
|
85
|
+
rev: v6.0.0
|
|
85
86
|
hooks:
|
|
86
87
|
# Basic file checks
|
|
87
88
|
- id: trailing-whitespace
|
|
@@ -5,48 +5,196 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
-
## [
|
|
8
|
+
## [0.1.6] - 2025-08-04
|
|
9
|
+
|
|
10
|
+
## Added OpenAI Codex Provider with Full Proxy Support
|
|
11
|
+
|
|
12
|
+
### Overview
|
|
13
|
+
|
|
14
|
+
Implemented comprehensive support for OpenAI Codex CLI integration, enabling users to proxy requests through their OpenAI subscription via the ChatGPT backend API. This feature provides an alternative to the Claude provider while maintaining full compatibility with the existing proxy architecture. The implementation uses the OpenAI Responses API endpoint as documented at https://platform.openai.com/docs/api-reference/responses/get.
|
|
15
|
+
|
|
16
|
+
### Key Features
|
|
17
|
+
|
|
18
|
+
**Complete Codex API Proxy**
|
|
19
|
+
|
|
20
|
+
- Full reverse proxy to `https://chatgpt.com/backend-api/codex`
|
|
21
|
+
- Support for both `/codex/responses` and `/codex/{session_id}/responses` endpoints
|
|
22
|
+
- Compatible with Codex CLI 0.21.0 and authentication flow
|
|
23
|
+
- Implements OpenAI Responses API protocol
|
|
24
|
+
|
|
25
|
+
**OAuth PKCE Authentication Flow**
|
|
26
|
+
|
|
27
|
+
- Implements complete OpenAI OAuth 2.0 PKCE flow matching official Codex CLI
|
|
28
|
+
- Local callback server on port 1455 for authorization code exchange
|
|
29
|
+
- Token refresh and credential management with persistent storage
|
|
30
|
+
- Support for `~/.codex/auth.json` configuration file format
|
|
31
|
+
|
|
32
|
+
**Intelligent Request/Response Handling**
|
|
33
|
+
|
|
34
|
+
- Automatic detection and injection of Codex CLI instructions field
|
|
35
|
+
- Smart streaming behavior based on user's explicit `stream` parameter
|
|
36
|
+
- Session management with flexible session ID handling (auto-generated, persistent, header-forwarded)
|
|
37
|
+
- Request transformation preserving Codex CLI identity headers
|
|
38
|
+
|
|
39
|
+
**Advanced Configuration**
|
|
40
|
+
|
|
41
|
+
- Environment variable support: `CODEX__BASE_URL`
|
|
42
|
+
- Configurable via TOML: `[codex]` section in configuration files
|
|
43
|
+
- Debug logging with request/response capture capabilities
|
|
44
|
+
- Comprehensive error handling with proper HTTP status codes
|
|
45
|
+
- Enabled by default
|
|
46
|
+
|
|
47
|
+
### Technical Implementation
|
|
48
|
+
|
|
49
|
+
**New Components Added:**
|
|
50
|
+
|
|
51
|
+
- `ccproxy/auth/openai.py` - OAuth token management and credential storage
|
|
52
|
+
- `ccproxy/core/codex_transformers.py` - Request/response transformation for Codex format
|
|
53
|
+
- `ccproxy/api/routes/codex.py` - FastAPI routes for Codex endpoints
|
|
54
|
+
- `ccproxy/models/detection.py` - Codex CLI detection and header management
|
|
55
|
+
- `ccproxy/services/codex_detection_service.py` - Runtime detection of Codex CLI requests
|
|
56
|
+
|
|
57
|
+
**Enhanced Proxy Service:**
|
|
58
|
+
|
|
59
|
+
- Extended `ProxyService.handle_codex_request()` with full Codex support
|
|
60
|
+
- Intelligent streaming response conversion when user doesn't explicitly request streaming
|
|
61
|
+
- Comprehensive request/response logging for debugging
|
|
62
|
+
- Error handling with proper OpenAI-compatible error responses
|
|
63
|
+
|
|
64
|
+
### Streaming Behavior Fix
|
|
65
|
+
|
|
66
|
+
**Problem Resolved:** Fixed issue where requests without explicit `stream` field were incorrectly returning streaming responses.
|
|
67
|
+
|
|
68
|
+
**Solution Implemented:**
|
|
69
|
+
|
|
70
|
+
- When `"stream"` field is missing: Inject `"stream": true` for upstream (Codex requirement) but return JSON response to client
|
|
71
|
+
- When `"stream": true` explicitly set: Return streaming response to client
|
|
72
|
+
- When `"stream": false` explicitly set: Return JSON response to client
|
|
73
|
+
- Smart response conversion: collects streaming data and converts to single JSON response when user didn't request streaming
|
|
74
|
+
|
|
75
|
+
### Usage Examples
|
|
76
|
+
|
|
77
|
+
**Basic Request (JSON Response):**
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
curl -X POST "http://127.0.0.1:8000/codex/responses" \
|
|
81
|
+
-H "Content-Type: application/json" \
|
|
82
|
+
-d '{
|
|
83
|
+
"input": [{"type": "message", "role": "user", "content": [{"type": "input_text", "text": "Hello!"}]}],
|
|
84
|
+
"model": "gpt-5",
|
|
85
|
+
"store": false
|
|
86
|
+
}'
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Streaming Request:**
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
curl -X POST "http://127.0.0.1:8000/codex/responses" \
|
|
93
|
+
-H "Content-Type: application/json" \
|
|
94
|
+
-d '{
|
|
95
|
+
"input": [{"type": "message", "role": "user", "content": [{"type": "input_text", "text": "Hello!"}]}],
|
|
96
|
+
"model": "gpt-5",
|
|
97
|
+
"stream": true,
|
|
98
|
+
"store": false
|
|
99
|
+
}'
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Authentication Setup
|
|
103
|
+
|
|
104
|
+
**Environment Variables:**
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
export CODEX__BASE_URL="https://chatgpt.com/backend-api/codex"
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Configuration File (`~/.ccproxy.toml`):**
|
|
111
|
+
|
|
112
|
+
```toml
|
|
113
|
+
[codex]
|
|
114
|
+
base_url = "https://chatgpt.com/backend-api/codex"
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Compatibility
|
|
118
|
+
|
|
119
|
+
- Codex CLI: Full compatibility with `codex-cli 0.21.0`
|
|
120
|
+
- OpenAI OAuth: Complete PKCE flow implementation
|
|
121
|
+
- Session Management: Supports persistent and auto-generated sessions
|
|
122
|
+
- Model Support: All Codex-supported models (`gpt-5`, `gpt-4`, etc.)
|
|
123
|
+
- Streaming: Both streaming and non-streaming responses
|
|
124
|
+
- Error Handling: Proper HTTP status codes and OpenAI-compatible errors
|
|
125
|
+
- API Compliance: Follows OpenAI Responses API specification
|
|
126
|
+
|
|
127
|
+
### Files Modified/Added
|
|
128
|
+
|
|
129
|
+
**New Files:**
|
|
130
|
+
|
|
131
|
+
- `ccproxy/auth/openai.py` - OpenAI authentication management
|
|
132
|
+
- `ccproxy/core/codex_transformers.py` - Codex request/response transformation
|
|
133
|
+
- `ccproxy/api/routes/codex.py` - Codex API endpoints
|
|
134
|
+
- `ccproxy/models/detection.py` - Codex detection models
|
|
135
|
+
- `ccproxy/services/codex_detection_service.py` - Codex CLI detection service
|
|
136
|
+
|
|
137
|
+
**Modified Files:**
|
|
138
|
+
|
|
139
|
+
- `ccproxy/services/proxy_service.py` - Added `handle_codex_request()` method
|
|
140
|
+
- `ccproxy/config/settings.py` - Added Codex configuration section
|
|
141
|
+
- `ccproxy/api/app.py` - Integrated Codex routes
|
|
142
|
+
- `ccproxy/api/routes/health.py` - Added Codex health checks
|
|
143
|
+
|
|
144
|
+
### Breaking Changes
|
|
145
|
+
|
|
146
|
+
None. This is a purely additive feature that doesn't affect existing Claude provider functionality.
|
|
147
|
+
|
|
148
|
+
### Migration Notes
|
|
149
|
+
|
|
150
|
+
For users wanting to use Codex provider:
|
|
151
|
+
|
|
152
|
+
1. Authenticate: Use existing OpenAI credentials or run Codex CLI login
|
|
153
|
+
2. Update endpoints: Change from `/v1/messages` to `/codex/responses`
|
|
154
|
+
|
|
155
|
+
This implementation provides a complete, production-ready OpenAI Codex proxy solution that maintains the same standards as the existing Claude provider while offering users choice in their AI provider preferences.
|
|
156
|
+
|
|
157
|
+
## [0.1.5] - 2025-08-03
|
|
9
158
|
|
|
10
159
|
### Added
|
|
11
160
|
|
|
12
161
|
- **Advanced Session and Pool Management**:
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
162
|
+
- Implemented a robust session-aware pool for persistent Claude SDK connections, significantly improving performance and maintaining conversation continuity.
|
|
163
|
+
- Introduced a hybrid pooling system that automatically transfers clients from a general pool to the session pool upon receiving a session ID.
|
|
164
|
+
- Developed a queue-based streaming architecture to efficiently handle and broadcast messages to multiple listeners, improving session management and disconnection handling.
|
|
16
165
|
- **Enhanced Observability and Logging**:
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
166
|
+
- Upgraded logging capabilities to include detailed session metadata, providing deeper insights into session lifecycle and reuse.
|
|
167
|
+
- Implemented a pool monitoring system to track the health and performance of both general and session-based connection pools.
|
|
168
|
+
- Reduced logging noise by adjusting log levels for operational SDK messages, focusing on essential access logs, warnings, and errors.
|
|
20
169
|
- **Improved Configuration and Control**:
|
|
21
|
-
|
|
22
|
-
|
|
170
|
+
- Introduced a `builtin_permissions` flag to provide granular control over the built-in permission handling infrastructure (MCP and SSE).
|
|
171
|
+
- Implemented configurable system prompt injection modes (`minimal` and `full`) to customize how the Claude Code identity is presented in requests.
|
|
23
172
|
- **Robust Streaming and Header Management**:
|
|
24
|
-
|
|
25
|
-
|
|
173
|
+
- Implemented `StreamingResponseWithLogging` for unified and consistent access logging across all streaming endpoints.
|
|
174
|
+
- Ensured critical upstream headers (e.g., `cf-ray`, `anthropic-ratelimit-*`) are correctly forwarded in SSE streaming responses.
|
|
26
175
|
|
|
27
176
|
### Changed
|
|
28
177
|
|
|
29
178
|
- **Default Behavior**:
|
|
30
|
-
|
|
179
|
+
- The Claude SDK connection pool is now disabled by default, requiring an explicit opt-in for safer and more predictable behavior.
|
|
31
180
|
- **Architectural Improvements**:
|
|
32
|
-
|
|
33
|
-
|
|
181
|
+
- Refactored the application's startup and shutdown logic into a modular, component-based architecture for better maintainability and testability.
|
|
182
|
+
- Renamed `SessionContext` to `SessionClient` for improved clarity and consistency in the session pooling implementation.
|
|
34
183
|
- **Testing Infrastructure**:
|
|
35
|
-
|
|
36
|
-
|
|
184
|
+
- Reorganized the entire test suite into a hierarchical structure (`unit` and `integration`) to improve navigation and maintainability.
|
|
185
|
+
- Migrated from legacy test fixtures to a more flexible and maintainable factory pattern for creating test clients and application instances.
|
|
37
186
|
|
|
38
187
|
### Fixed
|
|
39
188
|
|
|
40
189
|
- **Session and Streaming Stability**:
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
190
|
+
- Eliminated critical race conditions and `AttributeError` exceptions in the session pool and stream handling logic.
|
|
191
|
+
- Replaced fragile `asyncio.sleep` calls with a robust, event-based synchronization mechanism to prevent timing-related failures.
|
|
192
|
+
- Implemented a more accurate message-based stale detection mechanism to prevent the incorrect termination of active sessions.
|
|
44
193
|
- **Resource Management**:
|
|
45
|
-
|
|
194
|
+
- Corrected several resource leak issues by improving stream interruption handling, ensuring that hanging sessions are properly cleaned up.
|
|
46
195
|
- **Header and Content Formatting**:
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
196
|
+
- Resolved an issue that prevented the forwarding of upstream headers in SSE streaming responses.
|
|
197
|
+
- Fixed a formatting bug in the OpenAI adapter that caused message content to be improperly concatenated.
|
|
50
198
|
|
|
51
199
|
### Added
|
|
52
200
|
|
|
@@ -81,6 +81,14 @@ clean:
|
|
|
81
81
|
# - 'unit': Fast unit tests (< 1s each, no external dependencies)
|
|
82
82
|
# - Tests without 'real_api' marker are considered unit tests by default
|
|
83
83
|
|
|
84
|
+
# Fix code with unsafe fixes
|
|
85
|
+
fix-hard:
|
|
86
|
+
uv run ruff check . --fix --unsafe-fixes
|
|
87
|
+
uv run uv run ruff check . --select F401 --fix --unsafe-fixes # Used variable import
|
|
88
|
+
uv run uv run ruff check . --select I --fix --unsafe-fixes # Import order
|
|
89
|
+
uv run ruff format .
|
|
90
|
+
|
|
91
|
+
|
|
84
92
|
fix: format lint-fix
|
|
85
93
|
ruff check . --fix --unsafe-fixes
|
|
86
94
|
|