ccproxy-api 0.1.6__py3-none-any.whl → 0.2.0__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.
- ccproxy/api/__init__.py +1 -15
- ccproxy/api/app.py +439 -212
- ccproxy/api/bootstrap.py +30 -0
- ccproxy/api/decorators.py +85 -0
- ccproxy/api/dependencies.py +145 -176
- ccproxy/api/format_validation.py +54 -0
- ccproxy/api/middleware/cors.py +6 -3
- ccproxy/api/middleware/errors.py +402 -530
- ccproxy/api/middleware/hooks.py +563 -0
- ccproxy/api/middleware/normalize_headers.py +59 -0
- ccproxy/api/middleware/request_id.py +35 -16
- ccproxy/api/middleware/streaming_hooks.py +292 -0
- ccproxy/api/routes/__init__.py +5 -14
- ccproxy/api/routes/health.py +39 -672
- ccproxy/api/routes/plugins.py +277 -0
- ccproxy/auth/__init__.py +2 -19
- ccproxy/auth/bearer.py +25 -15
- ccproxy/auth/dependencies.py +123 -157
- ccproxy/auth/exceptions.py +0 -12
- ccproxy/auth/manager.py +35 -49
- ccproxy/auth/managers/__init__.py +10 -0
- ccproxy/auth/managers/base.py +523 -0
- ccproxy/auth/managers/base_enhanced.py +63 -0
- ccproxy/auth/managers/token_snapshot.py +77 -0
- ccproxy/auth/models/base.py +65 -0
- ccproxy/auth/models/credentials.py +40 -0
- ccproxy/auth/oauth/__init__.py +4 -18
- ccproxy/auth/oauth/base.py +533 -0
- ccproxy/auth/oauth/cli_errors.py +37 -0
- ccproxy/auth/oauth/flows.py +430 -0
- ccproxy/auth/oauth/protocol.py +366 -0
- ccproxy/auth/oauth/registry.py +408 -0
- ccproxy/auth/oauth/router.py +396 -0
- ccproxy/auth/oauth/routes.py +186 -113
- ccproxy/auth/oauth/session.py +151 -0
- ccproxy/auth/oauth/templates.py +342 -0
- ccproxy/auth/storage/__init__.py +2 -5
- ccproxy/auth/storage/base.py +279 -5
- ccproxy/auth/storage/generic.py +134 -0
- ccproxy/cli/__init__.py +1 -2
- ccproxy/cli/_settings_help.py +351 -0
- ccproxy/cli/commands/auth.py +1519 -793
- ccproxy/cli/commands/config/commands.py +209 -276
- ccproxy/cli/commands/plugins.py +669 -0
- ccproxy/cli/commands/serve.py +75 -810
- ccproxy/cli/commands/status.py +254 -0
- ccproxy/cli/decorators.py +83 -0
- ccproxy/cli/helpers.py +22 -60
- ccproxy/cli/main.py +359 -10
- ccproxy/cli/options/claude_options.py +0 -25
- ccproxy/config/__init__.py +7 -11
- ccproxy/config/core.py +227 -0
- ccproxy/config/env_generator.py +232 -0
- ccproxy/config/runtime.py +67 -0
- ccproxy/config/security.py +36 -3
- ccproxy/config/settings.py +382 -441
- ccproxy/config/toml_generator.py +299 -0
- ccproxy/config/utils.py +452 -0
- ccproxy/core/__init__.py +7 -271
- ccproxy/{_version.py → core/_version.py} +16 -3
- ccproxy/core/async_task_manager.py +516 -0
- ccproxy/core/async_utils.py +47 -14
- ccproxy/core/auth/__init__.py +6 -0
- ccproxy/core/constants.py +16 -50
- ccproxy/core/errors.py +53 -0
- ccproxy/core/id_utils.py +20 -0
- ccproxy/core/interfaces.py +16 -123
- ccproxy/core/logging.py +473 -18
- ccproxy/core/plugins/__init__.py +77 -0
- ccproxy/core/plugins/cli_discovery.py +211 -0
- ccproxy/core/plugins/declaration.py +455 -0
- ccproxy/core/plugins/discovery.py +604 -0
- ccproxy/core/plugins/factories.py +967 -0
- ccproxy/core/plugins/hooks/__init__.py +30 -0
- ccproxy/core/plugins/hooks/base.py +58 -0
- ccproxy/core/plugins/hooks/events.py +46 -0
- ccproxy/core/plugins/hooks/implementations/__init__.py +16 -0
- ccproxy/core/plugins/hooks/implementations/formatters/__init__.py +11 -0
- ccproxy/core/plugins/hooks/implementations/formatters/json.py +552 -0
- ccproxy/core/plugins/hooks/implementations/formatters/raw.py +370 -0
- ccproxy/core/plugins/hooks/implementations/http_tracer.py +431 -0
- ccproxy/core/plugins/hooks/layers.py +44 -0
- ccproxy/core/plugins/hooks/manager.py +186 -0
- ccproxy/core/plugins/hooks/registry.py +139 -0
- ccproxy/core/plugins/hooks/thread_manager.py +203 -0
- ccproxy/core/plugins/hooks/types.py +22 -0
- ccproxy/core/plugins/interfaces.py +416 -0
- ccproxy/core/plugins/loader.py +166 -0
- ccproxy/core/plugins/middleware.py +233 -0
- ccproxy/core/plugins/models.py +59 -0
- ccproxy/core/plugins/protocol.py +180 -0
- ccproxy/core/plugins/runtime.py +519 -0
- ccproxy/{observability/context.py → core/request_context.py} +137 -94
- ccproxy/core/status_report.py +211 -0
- ccproxy/core/transformers.py +13 -8
- ccproxy/data/claude_headers_fallback.json +558 -0
- ccproxy/data/codex_headers_fallback.json +121 -0
- ccproxy/http/__init__.py +30 -0
- ccproxy/http/base.py +95 -0
- ccproxy/http/client.py +323 -0
- ccproxy/http/hooks.py +642 -0
- ccproxy/http/pool.py +279 -0
- ccproxy/llms/formatters/__init__.py +7 -0
- ccproxy/llms/formatters/anthropic_to_openai/__init__.py +55 -0
- ccproxy/llms/formatters/anthropic_to_openai/errors.py +65 -0
- ccproxy/llms/formatters/anthropic_to_openai/requests.py +356 -0
- ccproxy/llms/formatters/anthropic_to_openai/responses.py +153 -0
- ccproxy/llms/formatters/anthropic_to_openai/streams.py +1546 -0
- ccproxy/llms/formatters/base.py +140 -0
- ccproxy/llms/formatters/base_model.py +33 -0
- ccproxy/llms/formatters/common/__init__.py +51 -0
- ccproxy/llms/formatters/common/identifiers.py +48 -0
- ccproxy/llms/formatters/common/streams.py +254 -0
- ccproxy/llms/formatters/common/thinking.py +74 -0
- ccproxy/llms/formatters/common/usage.py +135 -0
- ccproxy/llms/formatters/constants.py +55 -0
- ccproxy/llms/formatters/context.py +116 -0
- ccproxy/llms/formatters/mapping.py +33 -0
- ccproxy/llms/formatters/openai_to_anthropic/__init__.py +55 -0
- ccproxy/llms/formatters/openai_to_anthropic/_helpers.py +141 -0
- ccproxy/llms/formatters/openai_to_anthropic/errors.py +53 -0
- ccproxy/llms/formatters/openai_to_anthropic/requests.py +674 -0
- ccproxy/llms/formatters/openai_to_anthropic/responses.py +285 -0
- ccproxy/llms/formatters/openai_to_anthropic/streams.py +530 -0
- ccproxy/llms/formatters/openai_to_openai/__init__.py +53 -0
- ccproxy/llms/formatters/openai_to_openai/_helpers.py +325 -0
- ccproxy/llms/formatters/openai_to_openai/errors.py +6 -0
- ccproxy/llms/formatters/openai_to_openai/requests.py +388 -0
- ccproxy/llms/formatters/openai_to_openai/responses.py +594 -0
- ccproxy/llms/formatters/openai_to_openai/streams.py +1832 -0
- ccproxy/llms/formatters/utils.py +306 -0
- ccproxy/llms/models/__init__.py +9 -0
- ccproxy/llms/models/anthropic.py +619 -0
- ccproxy/llms/models/openai.py +844 -0
- ccproxy/llms/streaming/__init__.py +26 -0
- ccproxy/llms/streaming/accumulators.py +1074 -0
- ccproxy/llms/streaming/formatters.py +251 -0
- ccproxy/{adapters/openai/streaming.py → llms/streaming/processors.py} +193 -240
- ccproxy/models/__init__.py +8 -159
- ccproxy/models/detection.py +92 -193
- ccproxy/models/provider.py +75 -0
- ccproxy/plugins/access_log/README.md +32 -0
- ccproxy/plugins/access_log/__init__.py +20 -0
- ccproxy/plugins/access_log/config.py +33 -0
- ccproxy/plugins/access_log/formatter.py +126 -0
- ccproxy/plugins/access_log/hook.py +763 -0
- ccproxy/plugins/access_log/logger.py +254 -0
- ccproxy/plugins/access_log/plugin.py +137 -0
- ccproxy/plugins/access_log/writer.py +109 -0
- ccproxy/plugins/analytics/README.md +24 -0
- ccproxy/plugins/analytics/__init__.py +1 -0
- ccproxy/plugins/analytics/config.py +5 -0
- ccproxy/plugins/analytics/ingest.py +85 -0
- ccproxy/plugins/analytics/models.py +97 -0
- ccproxy/plugins/analytics/plugin.py +121 -0
- ccproxy/plugins/analytics/routes.py +163 -0
- ccproxy/plugins/analytics/service.py +284 -0
- ccproxy/plugins/claude_api/README.md +29 -0
- ccproxy/plugins/claude_api/__init__.py +10 -0
- ccproxy/plugins/claude_api/adapter.py +829 -0
- ccproxy/plugins/claude_api/config.py +52 -0
- ccproxy/plugins/claude_api/detection_service.py +461 -0
- ccproxy/plugins/claude_api/health.py +175 -0
- ccproxy/plugins/claude_api/hooks.py +284 -0
- ccproxy/plugins/claude_api/models.py +256 -0
- ccproxy/plugins/claude_api/plugin.py +298 -0
- ccproxy/plugins/claude_api/routes.py +118 -0
- ccproxy/plugins/claude_api/streaming_metrics.py +68 -0
- ccproxy/plugins/claude_api/tasks.py +84 -0
- ccproxy/plugins/claude_sdk/README.md +35 -0
- ccproxy/plugins/claude_sdk/__init__.py +80 -0
- ccproxy/plugins/claude_sdk/adapter.py +749 -0
- ccproxy/plugins/claude_sdk/auth.py +57 -0
- ccproxy/{claude_sdk → plugins/claude_sdk}/client.py +63 -39
- ccproxy/plugins/claude_sdk/config.py +210 -0
- ccproxy/{claude_sdk → plugins/claude_sdk}/converter.py +6 -6
- ccproxy/plugins/claude_sdk/detection_service.py +163 -0
- ccproxy/{services/claude_sdk_service.py → plugins/claude_sdk/handler.py} +123 -304
- ccproxy/plugins/claude_sdk/health.py +113 -0
- ccproxy/plugins/claude_sdk/hooks.py +115 -0
- ccproxy/{claude_sdk → plugins/claude_sdk}/manager.py +42 -32
- ccproxy/{claude_sdk → plugins/claude_sdk}/message_queue.py +8 -8
- ccproxy/{models/claude_sdk.py → plugins/claude_sdk/models.py} +64 -16
- ccproxy/plugins/claude_sdk/options.py +154 -0
- ccproxy/{claude_sdk → plugins/claude_sdk}/parser.py +23 -5
- ccproxy/plugins/claude_sdk/plugin.py +269 -0
- ccproxy/plugins/claude_sdk/routes.py +104 -0
- ccproxy/{claude_sdk → plugins/claude_sdk}/session_client.py +124 -12
- ccproxy/plugins/claude_sdk/session_pool.py +700 -0
- ccproxy/{claude_sdk → plugins/claude_sdk}/stream_handle.py +48 -43
- ccproxy/{claude_sdk → plugins/claude_sdk}/stream_worker.py +22 -18
- ccproxy/{claude_sdk → plugins/claude_sdk}/streaming.py +50 -16
- ccproxy/plugins/claude_sdk/tasks.py +97 -0
- ccproxy/plugins/claude_shared/README.md +18 -0
- ccproxy/plugins/claude_shared/__init__.py +12 -0
- ccproxy/plugins/claude_shared/model_defaults.py +171 -0
- ccproxy/plugins/codex/README.md +35 -0
- ccproxy/plugins/codex/__init__.py +6 -0
- ccproxy/plugins/codex/adapter.py +635 -0
- ccproxy/{config/codex.py → plugins/codex/config.py} +78 -12
- ccproxy/plugins/codex/detection_service.py +544 -0
- ccproxy/plugins/codex/health.py +162 -0
- ccproxy/plugins/codex/hooks.py +263 -0
- ccproxy/plugins/codex/model_defaults.py +39 -0
- ccproxy/plugins/codex/models.py +263 -0
- ccproxy/plugins/codex/plugin.py +275 -0
- ccproxy/plugins/codex/routes.py +129 -0
- ccproxy/plugins/codex/streaming_metrics.py +324 -0
- ccproxy/plugins/codex/tasks.py +106 -0
- ccproxy/plugins/codex/utils/__init__.py +1 -0
- ccproxy/plugins/codex/utils/sse_parser.py +106 -0
- ccproxy/plugins/command_replay/README.md +34 -0
- ccproxy/plugins/command_replay/__init__.py +17 -0
- ccproxy/plugins/command_replay/config.py +133 -0
- ccproxy/plugins/command_replay/formatter.py +432 -0
- ccproxy/plugins/command_replay/hook.py +294 -0
- ccproxy/plugins/command_replay/plugin.py +161 -0
- ccproxy/plugins/copilot/README.md +39 -0
- ccproxy/plugins/copilot/__init__.py +11 -0
- ccproxy/plugins/copilot/adapter.py +465 -0
- ccproxy/plugins/copilot/config.py +155 -0
- ccproxy/plugins/copilot/data/copilot_fallback.json +41 -0
- ccproxy/plugins/copilot/detection_service.py +255 -0
- ccproxy/plugins/copilot/manager.py +275 -0
- ccproxy/plugins/copilot/model_defaults.py +284 -0
- ccproxy/plugins/copilot/models.py +148 -0
- ccproxy/plugins/copilot/oauth/__init__.py +16 -0
- ccproxy/plugins/copilot/oauth/client.py +494 -0
- ccproxy/plugins/copilot/oauth/models.py +385 -0
- ccproxy/plugins/copilot/oauth/provider.py +602 -0
- ccproxy/plugins/copilot/oauth/storage.py +170 -0
- ccproxy/plugins/copilot/plugin.py +360 -0
- ccproxy/plugins/copilot/routes.py +294 -0
- ccproxy/plugins/credential_balancer/README.md +124 -0
- ccproxy/plugins/credential_balancer/__init__.py +6 -0
- ccproxy/plugins/credential_balancer/config.py +270 -0
- ccproxy/plugins/credential_balancer/factory.py +415 -0
- ccproxy/plugins/credential_balancer/hook.py +51 -0
- ccproxy/plugins/credential_balancer/manager.py +587 -0
- ccproxy/plugins/credential_balancer/plugin.py +146 -0
- ccproxy/plugins/dashboard/README.md +25 -0
- ccproxy/plugins/dashboard/__init__.py +1 -0
- ccproxy/plugins/dashboard/config.py +8 -0
- ccproxy/plugins/dashboard/plugin.py +71 -0
- ccproxy/plugins/dashboard/routes.py +67 -0
- ccproxy/plugins/docker/README.md +32 -0
- ccproxy/{docker → plugins/docker}/__init__.py +3 -0
- ccproxy/{docker → plugins/docker}/adapter.py +108 -10
- ccproxy/plugins/docker/config.py +82 -0
- ccproxy/{docker → plugins/docker}/docker_path.py +4 -3
- ccproxy/{docker → plugins/docker}/middleware.py +2 -2
- ccproxy/plugins/docker/plugin.py +198 -0
- ccproxy/{docker → plugins/docker}/stream_process.py +3 -3
- ccproxy/plugins/duckdb_storage/README.md +26 -0
- ccproxy/plugins/duckdb_storage/__init__.py +1 -0
- ccproxy/plugins/duckdb_storage/config.py +22 -0
- ccproxy/plugins/duckdb_storage/plugin.py +128 -0
- ccproxy/plugins/duckdb_storage/routes.py +51 -0
- ccproxy/plugins/duckdb_storage/storage.py +633 -0
- ccproxy/plugins/max_tokens/README.md +38 -0
- ccproxy/plugins/max_tokens/__init__.py +12 -0
- ccproxy/plugins/max_tokens/adapter.py +235 -0
- ccproxy/plugins/max_tokens/config.py +86 -0
- ccproxy/plugins/max_tokens/models.py +53 -0
- ccproxy/plugins/max_tokens/plugin.py +200 -0
- ccproxy/plugins/max_tokens/service.py +271 -0
- ccproxy/plugins/max_tokens/token_limits.json +54 -0
- ccproxy/plugins/metrics/README.md +35 -0
- ccproxy/plugins/metrics/__init__.py +10 -0
- ccproxy/{observability/metrics.py → plugins/metrics/collector.py} +20 -153
- ccproxy/plugins/metrics/config.py +85 -0
- ccproxy/plugins/metrics/grafana/dashboards/ccproxy-dashboard.json +1720 -0
- ccproxy/plugins/metrics/hook.py +403 -0
- ccproxy/plugins/metrics/plugin.py +268 -0
- ccproxy/{observability → plugins/metrics}/pushgateway.py +57 -59
- ccproxy/plugins/metrics/routes.py +107 -0
- ccproxy/plugins/metrics/tasks.py +117 -0
- ccproxy/plugins/oauth_claude/README.md +35 -0
- ccproxy/plugins/oauth_claude/__init__.py +14 -0
- ccproxy/plugins/oauth_claude/client.py +270 -0
- ccproxy/plugins/oauth_claude/config.py +84 -0
- ccproxy/plugins/oauth_claude/manager.py +482 -0
- ccproxy/plugins/oauth_claude/models.py +266 -0
- ccproxy/plugins/oauth_claude/plugin.py +149 -0
- ccproxy/plugins/oauth_claude/provider.py +571 -0
- ccproxy/plugins/oauth_claude/storage.py +212 -0
- ccproxy/plugins/oauth_codex/README.md +38 -0
- ccproxy/plugins/oauth_codex/__init__.py +14 -0
- ccproxy/plugins/oauth_codex/client.py +224 -0
- ccproxy/plugins/oauth_codex/config.py +95 -0
- ccproxy/plugins/oauth_codex/manager.py +256 -0
- ccproxy/plugins/oauth_codex/models.py +239 -0
- ccproxy/plugins/oauth_codex/plugin.py +146 -0
- ccproxy/plugins/oauth_codex/provider.py +574 -0
- ccproxy/plugins/oauth_codex/storage.py +92 -0
- ccproxy/plugins/permissions/README.md +28 -0
- ccproxy/plugins/permissions/__init__.py +22 -0
- ccproxy/plugins/permissions/config.py +28 -0
- ccproxy/{cli/commands/permission_handler.py → plugins/permissions/handlers/cli.py} +49 -25
- ccproxy/plugins/permissions/handlers/protocol.py +33 -0
- ccproxy/plugins/permissions/handlers/terminal.py +675 -0
- ccproxy/{api/routes → plugins/permissions}/mcp.py +34 -7
- ccproxy/{models/permissions.py → plugins/permissions/models.py} +65 -1
- ccproxy/plugins/permissions/plugin.py +153 -0
- ccproxy/{api/routes/permissions.py → plugins/permissions/routes.py} +20 -16
- ccproxy/{api/services/permission_service.py → plugins/permissions/service.py} +65 -11
- ccproxy/{api → plugins/permissions}/ui/permission_handler_protocol.py +1 -1
- ccproxy/{api → plugins/permissions}/ui/terminal_permission_handler.py +66 -10
- ccproxy/plugins/pricing/README.md +34 -0
- ccproxy/plugins/pricing/__init__.py +6 -0
- ccproxy/{pricing → plugins/pricing}/cache.py +7 -6
- ccproxy/{config/pricing.py → plugins/pricing/config.py} +32 -6
- ccproxy/plugins/pricing/exceptions.py +35 -0
- ccproxy/plugins/pricing/loader.py +440 -0
- ccproxy/{pricing → plugins/pricing}/models.py +13 -23
- ccproxy/plugins/pricing/plugin.py +169 -0
- ccproxy/plugins/pricing/service.py +191 -0
- ccproxy/plugins/pricing/tasks.py +300 -0
- ccproxy/{pricing → plugins/pricing}/updater.py +86 -72
- ccproxy/plugins/pricing/utils.py +99 -0
- ccproxy/plugins/request_tracer/README.md +40 -0
- ccproxy/plugins/request_tracer/__init__.py +7 -0
- ccproxy/plugins/request_tracer/config.py +120 -0
- ccproxy/plugins/request_tracer/hook.py +415 -0
- ccproxy/plugins/request_tracer/plugin.py +255 -0
- ccproxy/scheduler/__init__.py +2 -14
- ccproxy/scheduler/core.py +26 -41
- ccproxy/scheduler/manager.py +63 -107
- ccproxy/scheduler/registry.py +6 -32
- ccproxy/scheduler/tasks.py +346 -314
- ccproxy/services/__init__.py +0 -1
- ccproxy/services/adapters/__init__.py +11 -0
- ccproxy/services/adapters/base.py +123 -0
- ccproxy/services/adapters/chain_composer.py +88 -0
- ccproxy/services/adapters/chain_validation.py +44 -0
- ccproxy/services/adapters/chat_accumulator.py +200 -0
- ccproxy/services/adapters/delta_utils.py +142 -0
- ccproxy/services/adapters/format_adapter.py +136 -0
- ccproxy/services/adapters/format_context.py +11 -0
- ccproxy/services/adapters/format_registry.py +158 -0
- ccproxy/services/adapters/http_adapter.py +1045 -0
- ccproxy/services/adapters/mock_adapter.py +118 -0
- ccproxy/services/adapters/protocols.py +35 -0
- ccproxy/services/adapters/simple_converters.py +571 -0
- ccproxy/services/auth_registry.py +180 -0
- ccproxy/services/cache/__init__.py +6 -0
- ccproxy/services/cache/response_cache.py +261 -0
- ccproxy/services/cli_detection.py +437 -0
- ccproxy/services/config/__init__.py +6 -0
- ccproxy/services/config/proxy_configuration.py +111 -0
- ccproxy/services/container.py +256 -0
- ccproxy/services/factories.py +380 -0
- ccproxy/services/handler_config.py +76 -0
- ccproxy/services/interfaces.py +298 -0
- ccproxy/services/mocking/__init__.py +6 -0
- ccproxy/services/mocking/mock_handler.py +291 -0
- ccproxy/services/tracing/__init__.py +7 -0
- ccproxy/services/tracing/interfaces.py +61 -0
- ccproxy/services/tracing/null_tracer.py +57 -0
- ccproxy/streaming/__init__.py +23 -0
- ccproxy/streaming/buffer.py +1056 -0
- ccproxy/streaming/deferred.py +897 -0
- ccproxy/streaming/handler.py +117 -0
- ccproxy/streaming/interfaces.py +77 -0
- ccproxy/streaming/simple_adapter.py +39 -0
- ccproxy/streaming/sse.py +109 -0
- ccproxy/streaming/sse_parser.py +127 -0
- ccproxy/templates/__init__.py +6 -0
- ccproxy/templates/plugin_scaffold.py +695 -0
- ccproxy/testing/endpoints/__init__.py +33 -0
- ccproxy/testing/endpoints/cli.py +215 -0
- ccproxy/testing/endpoints/config.py +874 -0
- ccproxy/testing/endpoints/console.py +57 -0
- ccproxy/testing/endpoints/models.py +100 -0
- ccproxy/testing/endpoints/runner.py +1903 -0
- ccproxy/testing/endpoints/tools.py +308 -0
- ccproxy/testing/mock_responses.py +70 -1
- ccproxy/testing/response_handlers.py +20 -0
- ccproxy/utils/__init__.py +0 -6
- ccproxy/utils/binary_resolver.py +476 -0
- ccproxy/utils/caching.py +327 -0
- ccproxy/utils/cli_logging.py +101 -0
- ccproxy/utils/command_line.py +251 -0
- ccproxy/utils/headers.py +228 -0
- ccproxy/utils/model_mapper.py +120 -0
- ccproxy/utils/startup_helpers.py +95 -342
- ccproxy/utils/version_checker.py +279 -6
- ccproxy_api-0.2.0.dist-info/METADATA +212 -0
- ccproxy_api-0.2.0.dist-info/RECORD +417 -0
- {ccproxy_api-0.1.6.dist-info → ccproxy_api-0.2.0.dist-info}/WHEEL +1 -1
- ccproxy_api-0.2.0.dist-info/entry_points.txt +24 -0
- ccproxy/__init__.py +0 -4
- ccproxy/adapters/__init__.py +0 -11
- ccproxy/adapters/base.py +0 -80
- ccproxy/adapters/codex/__init__.py +0 -11
- ccproxy/adapters/openai/__init__.py +0 -42
- ccproxy/adapters/openai/adapter.py +0 -953
- ccproxy/adapters/openai/models.py +0 -412
- ccproxy/adapters/openai/response_adapter.py +0 -355
- ccproxy/adapters/openai/response_models.py +0 -178
- ccproxy/api/middleware/headers.py +0 -49
- ccproxy/api/middleware/logging.py +0 -180
- ccproxy/api/middleware/request_content_logging.py +0 -297
- ccproxy/api/middleware/server_header.py +0 -58
- ccproxy/api/responses.py +0 -89
- ccproxy/api/routes/claude.py +0 -371
- ccproxy/api/routes/codex.py +0 -1231
- ccproxy/api/routes/metrics.py +0 -1029
- ccproxy/api/routes/proxy.py +0 -211
- ccproxy/api/services/__init__.py +0 -6
- ccproxy/auth/conditional.py +0 -84
- ccproxy/auth/credentials_adapter.py +0 -93
- ccproxy/auth/models.py +0 -118
- ccproxy/auth/oauth/models.py +0 -48
- ccproxy/auth/openai/__init__.py +0 -13
- ccproxy/auth/openai/credentials.py +0 -166
- ccproxy/auth/openai/oauth_client.py +0 -334
- ccproxy/auth/openai/storage.py +0 -184
- ccproxy/auth/storage/json_file.py +0 -158
- ccproxy/auth/storage/keyring.py +0 -189
- ccproxy/claude_sdk/__init__.py +0 -18
- ccproxy/claude_sdk/options.py +0 -194
- ccproxy/claude_sdk/session_pool.py +0 -550
- ccproxy/cli/docker/__init__.py +0 -34
- ccproxy/cli/docker/adapter_factory.py +0 -157
- ccproxy/cli/docker/params.py +0 -274
- ccproxy/config/auth.py +0 -153
- ccproxy/config/claude.py +0 -348
- ccproxy/config/cors.py +0 -79
- ccproxy/config/discovery.py +0 -95
- ccproxy/config/docker_settings.py +0 -264
- ccproxy/config/observability.py +0 -158
- ccproxy/config/reverse_proxy.py +0 -31
- ccproxy/config/scheduler.py +0 -108
- ccproxy/config/server.py +0 -86
- ccproxy/config/validators.py +0 -231
- ccproxy/core/codex_transformers.py +0 -389
- ccproxy/core/http.py +0 -328
- ccproxy/core/http_transformers.py +0 -812
- ccproxy/core/proxy.py +0 -143
- ccproxy/core/validators.py +0 -288
- ccproxy/models/errors.py +0 -42
- ccproxy/models/messages.py +0 -269
- ccproxy/models/requests.py +0 -107
- ccproxy/models/responses.py +0 -270
- ccproxy/models/types.py +0 -102
- ccproxy/observability/__init__.py +0 -51
- ccproxy/observability/access_logger.py +0 -457
- ccproxy/observability/sse_events.py +0 -303
- ccproxy/observability/stats_printer.py +0 -753
- ccproxy/observability/storage/__init__.py +0 -1
- ccproxy/observability/storage/duckdb_simple.py +0 -677
- ccproxy/observability/storage/models.py +0 -70
- ccproxy/observability/streaming_response.py +0 -107
- ccproxy/pricing/__init__.py +0 -19
- ccproxy/pricing/loader.py +0 -251
- ccproxy/services/claude_detection_service.py +0 -269
- ccproxy/services/codex_detection_service.py +0 -263
- ccproxy/services/credentials/__init__.py +0 -55
- ccproxy/services/credentials/config.py +0 -105
- ccproxy/services/credentials/manager.py +0 -561
- ccproxy/services/credentials/oauth_client.py +0 -481
- ccproxy/services/proxy_service.py +0 -1827
- ccproxy/static/.keep +0 -0
- ccproxy/utils/cost_calculator.py +0 -210
- ccproxy/utils/disconnection_monitor.py +0 -83
- ccproxy/utils/model_mapping.py +0 -199
- ccproxy/utils/models_provider.py +0 -150
- ccproxy/utils/simple_request_logger.py +0 -284
- ccproxy/utils/streaming_metrics.py +0 -199
- ccproxy_api-0.1.6.dist-info/METADATA +0 -615
- ccproxy_api-0.1.6.dist-info/RECORD +0 -189
- ccproxy_api-0.1.6.dist-info/entry_points.txt +0 -4
- /ccproxy/{api/middleware/auth.py → auth/models/__init__.py} +0 -0
- /ccproxy/{claude_sdk → plugins/claude_sdk}/exceptions.py +0 -0
- /ccproxy/{docker → plugins/docker}/models.py +0 -0
- /ccproxy/{docker → plugins/docker}/protocol.py +0 -0
- /ccproxy/{docker → plugins/docker}/validators.py +0 -0
- /ccproxy/{auth/oauth/storage.py → plugins/permissions/handlers/__init__.py} +0 -0
- /ccproxy/{api → plugins/permissions}/ui/__init__.py +0 -0
- {ccproxy_api-0.1.6.dist-info → ccproxy_api-0.2.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,615 +0,0 @@
|
|
|
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
|