ccproxy-api 0.1.6__tar.gz → 0.2.0__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.6 → ccproxy_api-0.2.0}/.gitignore +5 -0
- ccproxy_api-0.2.0/PKG-INFO +212 -0
- ccproxy_api-0.2.0/README.md +172 -0
- ccproxy_api-0.2.0/ccproxy/api/__init__.py +11 -0
- ccproxy_api-0.2.0/ccproxy/api/app.py +581 -0
- ccproxy_api-0.2.0/ccproxy/api/bootstrap.py +30 -0
- ccproxy_api-0.2.0/ccproxy/api/decorators.py +85 -0
- ccproxy_api-0.2.0/ccproxy/api/dependencies.py +191 -0
- ccproxy_api-0.2.0/ccproxy/api/format_validation.py +54 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/api/middleware/cors.py +6 -3
- ccproxy_api-0.2.0/ccproxy/api/middleware/errors.py +595 -0
- ccproxy_api-0.2.0/ccproxy/api/middleware/hooks.py +563 -0
- ccproxy_api-0.2.0/ccproxy/api/middleware/normalize_headers.py +59 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/api/middleware/request_id.py +35 -16
- ccproxy_api-0.2.0/ccproxy/api/middleware/streaming_hooks.py +292 -0
- ccproxy_api-0.2.0/ccproxy/api/routes/__init__.py +15 -0
- ccproxy_api-0.2.0/ccproxy/api/routes/health.py +135 -0
- ccproxy_api-0.2.0/ccproxy/api/routes/plugins.py +277 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/auth/__init__.py +2 -19
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/auth/bearer.py +25 -15
- ccproxy_api-0.2.0/ccproxy/auth/dependencies.py +195 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/auth/exceptions.py +0 -12
- ccproxy_api-0.2.0/ccproxy/auth/manager.py +88 -0
- ccproxy_api-0.2.0/ccproxy/auth/managers/__init__.py +10 -0
- ccproxy_api-0.2.0/ccproxy/auth/managers/base.py +523 -0
- ccproxy_api-0.2.0/ccproxy/auth/managers/base_enhanced.py +63 -0
- ccproxy_api-0.2.0/ccproxy/auth/managers/token_snapshot.py +77 -0
- ccproxy_api-0.2.0/ccproxy/auth/models/base.py +65 -0
- ccproxy_api-0.2.0/ccproxy/auth/models/credentials.py +40 -0
- ccproxy_api-0.2.0/ccproxy/auth/oauth/__init__.py +12 -0
- ccproxy_api-0.2.0/ccproxy/auth/oauth/base.py +533 -0
- ccproxy_api-0.2.0/ccproxy/auth/oauth/cli_errors.py +37 -0
- ccproxy_api-0.2.0/ccproxy/auth/oauth/flows.py +430 -0
- ccproxy_api-0.2.0/ccproxy/auth/oauth/protocol.py +366 -0
- ccproxy_api-0.2.0/ccproxy/auth/oauth/registry.py +408 -0
- ccproxy_api-0.2.0/ccproxy/auth/oauth/router.py +396 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/auth/oauth/routes.py +186 -113
- ccproxy_api-0.2.0/ccproxy/auth/oauth/session.py +151 -0
- ccproxy_api-0.2.0/ccproxy/auth/oauth/templates.py +342 -0
- ccproxy_api-0.2.0/ccproxy/auth/storage/__init__.py +9 -0
- ccproxy_api-0.2.0/ccproxy/auth/storage/base.py +331 -0
- ccproxy_api-0.2.0/ccproxy/auth/storage/generic.py +134 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/cli/__init__.py +1 -2
- ccproxy_api-0.2.0/ccproxy/cli/_settings_help.py +351 -0
- ccproxy_api-0.2.0/ccproxy/cli/commands/auth.py +1690 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/cli/commands/config/commands.py +209 -276
- ccproxy_api-0.2.0/ccproxy/cli/commands/plugins.py +669 -0
- ccproxy_api-0.2.0/ccproxy/cli/commands/serve.py +251 -0
- ccproxy_api-0.2.0/ccproxy/cli/commands/status.py +254 -0
- ccproxy_api-0.2.0/ccproxy/cli/decorators.py +83 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/cli/helpers.py +22 -60
- ccproxy_api-0.2.0/ccproxy/cli/main.py +453 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/cli/options/claude_options.py +0 -25
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/config/__init__.py +7 -11
- ccproxy_api-0.2.0/ccproxy/config/core.py +227 -0
- ccproxy_api-0.2.0/ccproxy/config/env_generator.py +232 -0
- ccproxy_api-0.2.0/ccproxy/config/runtime.py +67 -0
- ccproxy_api-0.2.0/ccproxy/config/security.py +52 -0
- ccproxy_api-0.2.0/ccproxy/config/settings.py +518 -0
- ccproxy_api-0.2.0/ccproxy/config/toml_generator.py +299 -0
- ccproxy_api-0.2.0/ccproxy/config/utils.py +452 -0
- ccproxy_api-0.2.0/ccproxy/core/__init__.py +10 -0
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/core}/_version.py +16 -3
- ccproxy_api-0.2.0/ccproxy/core/async_task_manager.py +516 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/core/async_utils.py +47 -14
- ccproxy_api-0.2.0/ccproxy/core/auth/__init__.py +6 -0
- ccproxy_api-0.2.0/ccproxy/core/constants.py +63 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/core/errors.py +53 -0
- ccproxy_api-0.2.0/ccproxy/core/id_utils.py +20 -0
- ccproxy_api-0.2.0/ccproxy/core/interfaces.py +140 -0
- ccproxy_api-0.2.0/ccproxy/core/logging.py +742 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/__init__.py +77 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/cli_discovery.py +211 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/declaration.py +455 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/discovery.py +604 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/factories.py +967 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/hooks/__init__.py +30 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/hooks/base.py +58 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/hooks/events.py +46 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/hooks/implementations/__init__.py +16 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/hooks/implementations/formatters/__init__.py +11 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/hooks/implementations/formatters/json.py +552 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/hooks/implementations/formatters/raw.py +370 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/hooks/implementations/http_tracer.py +431 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/hooks/layers.py +44 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/hooks/manager.py +186 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/hooks/registry.py +139 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/hooks/thread_manager.py +203 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/hooks/types.py +22 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/interfaces.py +416 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/loader.py +166 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/middleware.py +233 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/models.py +59 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/protocol.py +180 -0
- ccproxy_api-0.2.0/ccproxy/core/plugins/runtime.py +519 -0
- ccproxy_api-0.1.6/ccproxy/observability/context.py → ccproxy_api-0.2.0/ccproxy/core/request_context.py +137 -94
- ccproxy_api-0.2.0/ccproxy/core/status_report.py +211 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/core/transformers.py +13 -8
- ccproxy_api-0.2.0/ccproxy/data/claude_headers_fallback.json +558 -0
- ccproxy_api-0.2.0/ccproxy/data/codex_headers_fallback.json +121 -0
- ccproxy_api-0.2.0/ccproxy/http/__init__.py +30 -0
- ccproxy_api-0.2.0/ccproxy/http/base.py +95 -0
- ccproxy_api-0.2.0/ccproxy/http/client.py +323 -0
- ccproxy_api-0.2.0/ccproxy/http/hooks.py +642 -0
- ccproxy_api-0.2.0/ccproxy/http/pool.py +279 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/__init__.py +7 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/anthropic_to_openai/__init__.py +55 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/anthropic_to_openai/errors.py +65 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/anthropic_to_openai/requests.py +356 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/anthropic_to_openai/responses.py +153 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/anthropic_to_openai/streams.py +1546 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/base.py +140 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/base_model.py +33 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/common/__init__.py +51 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/common/identifiers.py +48 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/common/streams.py +254 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/common/thinking.py +74 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/common/usage.py +135 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/constants.py +55 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/context.py +116 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/mapping.py +33 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/openai_to_anthropic/__init__.py +55 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/openai_to_anthropic/_helpers.py +141 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/openai_to_anthropic/errors.py +53 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/openai_to_anthropic/requests.py +674 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/openai_to_anthropic/responses.py +285 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/openai_to_anthropic/streams.py +530 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/openai_to_openai/__init__.py +53 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/openai_to_openai/_helpers.py +325 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/openai_to_openai/errors.py +6 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/openai_to_openai/requests.py +388 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/openai_to_openai/responses.py +594 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/openai_to_openai/streams.py +1832 -0
- ccproxy_api-0.2.0/ccproxy/llms/formatters/utils.py +306 -0
- ccproxy_api-0.2.0/ccproxy/llms/models/__init__.py +9 -0
- ccproxy_api-0.2.0/ccproxy/llms/models/anthropic.py +619 -0
- ccproxy_api-0.2.0/ccproxy/llms/models/openai.py +844 -0
- ccproxy_api-0.2.0/ccproxy/llms/streaming/__init__.py +26 -0
- ccproxy_api-0.2.0/ccproxy/llms/streaming/accumulators.py +1074 -0
- ccproxy_api-0.2.0/ccproxy/llms/streaming/formatters.py +251 -0
- ccproxy_api-0.1.6/ccproxy/adapters/openai/streaming.py → ccproxy_api-0.2.0/ccproxy/llms/streaming/processors.py +193 -240
- ccproxy_api-0.2.0/ccproxy/models/__init__.py +13 -0
- ccproxy_api-0.2.0/ccproxy/models/detection.py +107 -0
- ccproxy_api-0.2.0/ccproxy/models/provider.py +75 -0
- ccproxy_api-0.2.0/ccproxy/plugins/access_log/README.md +32 -0
- ccproxy_api-0.2.0/ccproxy/plugins/access_log/__init__.py +20 -0
- ccproxy_api-0.2.0/ccproxy/plugins/access_log/config.py +33 -0
- ccproxy_api-0.2.0/ccproxy/plugins/access_log/formatter.py +126 -0
- ccproxy_api-0.2.0/ccproxy/plugins/access_log/hook.py +763 -0
- ccproxy_api-0.2.0/ccproxy/plugins/access_log/logger.py +254 -0
- ccproxy_api-0.2.0/ccproxy/plugins/access_log/plugin.py +137 -0
- ccproxy_api-0.2.0/ccproxy/plugins/access_log/writer.py +109 -0
- ccproxy_api-0.2.0/ccproxy/plugins/analytics/README.md +24 -0
- ccproxy_api-0.2.0/ccproxy/plugins/analytics/__init__.py +1 -0
- ccproxy_api-0.2.0/ccproxy/plugins/analytics/config.py +5 -0
- ccproxy_api-0.2.0/ccproxy/plugins/analytics/ingest.py +85 -0
- ccproxy_api-0.2.0/ccproxy/plugins/analytics/models.py +97 -0
- ccproxy_api-0.2.0/ccproxy/plugins/analytics/plugin.py +121 -0
- ccproxy_api-0.2.0/ccproxy/plugins/analytics/routes.py +163 -0
- ccproxy_api-0.2.0/ccproxy/plugins/analytics/service.py +284 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_api/README.md +29 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_api/__init__.py +10 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_api/adapter.py +829 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_api/config.py +52 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_api/detection_service.py +461 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_api/health.py +175 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_api/hooks.py +284 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_api/models.py +256 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_api/plugin.py +298 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_api/routes.py +118 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_api/streaming_metrics.py +68 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_api/tasks.py +84 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_sdk/README.md +35 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_sdk/__init__.py +80 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_sdk/adapter.py +749 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_sdk/auth.py +57 -0
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/claude_sdk/client.py +63 -39
- ccproxy_api-0.2.0/ccproxy/plugins/claude_sdk/config.py +210 -0
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/claude_sdk/converter.py +6 -6
- ccproxy_api-0.2.0/ccproxy/plugins/claude_sdk/detection_service.py +163 -0
- ccproxy_api-0.1.6/ccproxy/services/claude_sdk_service.py → ccproxy_api-0.2.0/ccproxy/plugins/claude_sdk/handler.py +123 -304
- ccproxy_api-0.2.0/ccproxy/plugins/claude_sdk/health.py +113 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_sdk/hooks.py +115 -0
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/claude_sdk/manager.py +42 -32
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/claude_sdk/message_queue.py +8 -8
- ccproxy_api-0.1.6/ccproxy/models/claude_sdk.py → ccproxy_api-0.2.0/ccproxy/plugins/claude_sdk/models.py +64 -16
- ccproxy_api-0.2.0/ccproxy/plugins/claude_sdk/options.py +154 -0
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/claude_sdk/parser.py +23 -5
- ccproxy_api-0.2.0/ccproxy/plugins/claude_sdk/plugin.py +269 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_sdk/routes.py +104 -0
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/claude_sdk/session_client.py +124 -12
- ccproxy_api-0.2.0/ccproxy/plugins/claude_sdk/session_pool.py +700 -0
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/claude_sdk/stream_handle.py +48 -43
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/claude_sdk/stream_worker.py +22 -18
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/claude_sdk/streaming.py +50 -16
- ccproxy_api-0.2.0/ccproxy/plugins/claude_sdk/tasks.py +97 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_shared/README.md +18 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_shared/__init__.py +12 -0
- ccproxy_api-0.2.0/ccproxy/plugins/claude_shared/model_defaults.py +171 -0
- ccproxy_api-0.2.0/ccproxy/plugins/codex/README.md +35 -0
- ccproxy_api-0.2.0/ccproxy/plugins/codex/__init__.py +6 -0
- ccproxy_api-0.2.0/ccproxy/plugins/codex/adapter.py +635 -0
- ccproxy_api-0.1.6/ccproxy/config/codex.py → ccproxy_api-0.2.0/ccproxy/plugins/codex/config.py +78 -12
- ccproxy_api-0.2.0/ccproxy/plugins/codex/detection_service.py +544 -0
- ccproxy_api-0.2.0/ccproxy/plugins/codex/health.py +162 -0
- ccproxy_api-0.2.0/ccproxy/plugins/codex/hooks.py +263 -0
- ccproxy_api-0.2.0/ccproxy/plugins/codex/model_defaults.py +39 -0
- ccproxy_api-0.2.0/ccproxy/plugins/codex/models.py +263 -0
- ccproxy_api-0.2.0/ccproxy/plugins/codex/plugin.py +275 -0
- ccproxy_api-0.2.0/ccproxy/plugins/codex/routes.py +129 -0
- ccproxy_api-0.2.0/ccproxy/plugins/codex/streaming_metrics.py +324 -0
- ccproxy_api-0.2.0/ccproxy/plugins/codex/tasks.py +106 -0
- ccproxy_api-0.2.0/ccproxy/plugins/codex/utils/__init__.py +1 -0
- ccproxy_api-0.2.0/ccproxy/plugins/codex/utils/sse_parser.py +106 -0
- ccproxy_api-0.2.0/ccproxy/plugins/command_replay/README.md +34 -0
- ccproxy_api-0.2.0/ccproxy/plugins/command_replay/__init__.py +17 -0
- ccproxy_api-0.2.0/ccproxy/plugins/command_replay/config.py +133 -0
- ccproxy_api-0.2.0/ccproxy/plugins/command_replay/formatter.py +432 -0
- ccproxy_api-0.2.0/ccproxy/plugins/command_replay/hook.py +294 -0
- ccproxy_api-0.2.0/ccproxy/plugins/command_replay/plugin.py +161 -0
- ccproxy_api-0.2.0/ccproxy/plugins/copilot/README.md +39 -0
- ccproxy_api-0.2.0/ccproxy/plugins/copilot/__init__.py +11 -0
- ccproxy_api-0.2.0/ccproxy/plugins/copilot/adapter.py +465 -0
- ccproxy_api-0.2.0/ccproxy/plugins/copilot/config.py +155 -0
- ccproxy_api-0.2.0/ccproxy/plugins/copilot/data/copilot_fallback.json +41 -0
- ccproxy_api-0.2.0/ccproxy/plugins/copilot/detection_service.py +255 -0
- ccproxy_api-0.2.0/ccproxy/plugins/copilot/manager.py +275 -0
- ccproxy_api-0.2.0/ccproxy/plugins/copilot/model_defaults.py +284 -0
- ccproxy_api-0.2.0/ccproxy/plugins/copilot/models.py +148 -0
- ccproxy_api-0.2.0/ccproxy/plugins/copilot/oauth/__init__.py +16 -0
- ccproxy_api-0.2.0/ccproxy/plugins/copilot/oauth/client.py +494 -0
- ccproxy_api-0.2.0/ccproxy/plugins/copilot/oauth/models.py +385 -0
- ccproxy_api-0.2.0/ccproxy/plugins/copilot/oauth/provider.py +602 -0
- ccproxy_api-0.2.0/ccproxy/plugins/copilot/oauth/storage.py +170 -0
- ccproxy_api-0.2.0/ccproxy/plugins/copilot/plugin.py +360 -0
- ccproxy_api-0.2.0/ccproxy/plugins/copilot/routes.py +294 -0
- ccproxy_api-0.2.0/ccproxy/plugins/credential_balancer/README.md +124 -0
- ccproxy_api-0.2.0/ccproxy/plugins/credential_balancer/__init__.py +6 -0
- ccproxy_api-0.2.0/ccproxy/plugins/credential_balancer/config.py +270 -0
- ccproxy_api-0.2.0/ccproxy/plugins/credential_balancer/factory.py +415 -0
- ccproxy_api-0.2.0/ccproxy/plugins/credential_balancer/hook.py +51 -0
- ccproxy_api-0.2.0/ccproxy/plugins/credential_balancer/manager.py +587 -0
- ccproxy_api-0.2.0/ccproxy/plugins/credential_balancer/plugin.py +146 -0
- ccproxy_api-0.2.0/ccproxy/plugins/dashboard/README.md +25 -0
- ccproxy_api-0.2.0/ccproxy/plugins/dashboard/__init__.py +1 -0
- ccproxy_api-0.2.0/ccproxy/plugins/dashboard/config.py +8 -0
- ccproxy_api-0.2.0/ccproxy/plugins/dashboard/plugin.py +71 -0
- ccproxy_api-0.2.0/ccproxy/plugins/dashboard/routes.py +67 -0
- ccproxy_api-0.2.0/ccproxy/plugins/docker/README.md +32 -0
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/docker/__init__.py +3 -0
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/docker/adapter.py +108 -10
- ccproxy_api-0.2.0/ccproxy/plugins/docker/config.py +82 -0
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/docker/docker_path.py +4 -3
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/docker/middleware.py +2 -2
- ccproxy_api-0.2.0/ccproxy/plugins/docker/plugin.py +198 -0
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/docker/stream_process.py +3 -3
- ccproxy_api-0.2.0/ccproxy/plugins/duckdb_storage/README.md +26 -0
- ccproxy_api-0.2.0/ccproxy/plugins/duckdb_storage/__init__.py +1 -0
- ccproxy_api-0.2.0/ccproxy/plugins/duckdb_storage/config.py +22 -0
- ccproxy_api-0.2.0/ccproxy/plugins/duckdb_storage/plugin.py +128 -0
- ccproxy_api-0.2.0/ccproxy/plugins/duckdb_storage/routes.py +51 -0
- ccproxy_api-0.2.0/ccproxy/plugins/duckdb_storage/storage.py +633 -0
- ccproxy_api-0.2.0/ccproxy/plugins/max_tokens/README.md +38 -0
- ccproxy_api-0.2.0/ccproxy/plugins/max_tokens/__init__.py +12 -0
- ccproxy_api-0.2.0/ccproxy/plugins/max_tokens/adapter.py +235 -0
- ccproxy_api-0.2.0/ccproxy/plugins/max_tokens/config.py +86 -0
- ccproxy_api-0.2.0/ccproxy/plugins/max_tokens/models.py +53 -0
- ccproxy_api-0.2.0/ccproxy/plugins/max_tokens/plugin.py +200 -0
- ccproxy_api-0.2.0/ccproxy/plugins/max_tokens/service.py +271 -0
- ccproxy_api-0.2.0/ccproxy/plugins/max_tokens/token_limits.json +54 -0
- ccproxy_api-0.2.0/ccproxy/plugins/metrics/README.md +35 -0
- ccproxy_api-0.2.0/ccproxy/plugins/metrics/__init__.py +10 -0
- ccproxy_api-0.1.6/ccproxy/observability/metrics.py → ccproxy_api-0.2.0/ccproxy/plugins/metrics/collector.py +20 -153
- ccproxy_api-0.2.0/ccproxy/plugins/metrics/config.py +85 -0
- ccproxy_api-0.2.0/ccproxy/plugins/metrics/hook.py +403 -0
- ccproxy_api-0.2.0/ccproxy/plugins/metrics/plugin.py +268 -0
- {ccproxy_api-0.1.6/ccproxy/observability → ccproxy_api-0.2.0/ccproxy/plugins/metrics}/pushgateway.py +57 -59
- ccproxy_api-0.2.0/ccproxy/plugins/metrics/routes.py +107 -0
- ccproxy_api-0.2.0/ccproxy/plugins/metrics/tasks.py +117 -0
- ccproxy_api-0.2.0/ccproxy/plugins/oauth_claude/README.md +35 -0
- ccproxy_api-0.2.0/ccproxy/plugins/oauth_claude/__init__.py +14 -0
- ccproxy_api-0.2.0/ccproxy/plugins/oauth_claude/client.py +270 -0
- ccproxy_api-0.2.0/ccproxy/plugins/oauth_claude/config.py +84 -0
- ccproxy_api-0.2.0/ccproxy/plugins/oauth_claude/manager.py +482 -0
- ccproxy_api-0.2.0/ccproxy/plugins/oauth_claude/models.py +266 -0
- ccproxy_api-0.2.0/ccproxy/plugins/oauth_claude/plugin.py +149 -0
- ccproxy_api-0.2.0/ccproxy/plugins/oauth_claude/provider.py +571 -0
- ccproxy_api-0.2.0/ccproxy/plugins/oauth_claude/storage.py +212 -0
- ccproxy_api-0.2.0/ccproxy/plugins/oauth_codex/README.md +38 -0
- ccproxy_api-0.2.0/ccproxy/plugins/oauth_codex/__init__.py +14 -0
- ccproxy_api-0.2.0/ccproxy/plugins/oauth_codex/client.py +224 -0
- ccproxy_api-0.2.0/ccproxy/plugins/oauth_codex/config.py +95 -0
- ccproxy_api-0.2.0/ccproxy/plugins/oauth_codex/manager.py +256 -0
- ccproxy_api-0.2.0/ccproxy/plugins/oauth_codex/models.py +239 -0
- ccproxy_api-0.2.0/ccproxy/plugins/oauth_codex/plugin.py +146 -0
- ccproxy_api-0.2.0/ccproxy/plugins/oauth_codex/provider.py +574 -0
- ccproxy_api-0.2.0/ccproxy/plugins/oauth_codex/storage.py +92 -0
- ccproxy_api-0.2.0/ccproxy/plugins/permissions/README.md +28 -0
- ccproxy_api-0.2.0/ccproxy/plugins/permissions/__init__.py +22 -0
- ccproxy_api-0.2.0/ccproxy/plugins/permissions/config.py +28 -0
- ccproxy_api-0.1.6/ccproxy/cli/commands/permission_handler.py → ccproxy_api-0.2.0/ccproxy/plugins/permissions/handlers/cli.py +49 -25
- ccproxy_api-0.2.0/ccproxy/plugins/permissions/handlers/protocol.py +33 -0
- ccproxy_api-0.2.0/ccproxy/plugins/permissions/handlers/terminal.py +675 -0
- {ccproxy_api-0.1.6/ccproxy/api/routes → ccproxy_api-0.2.0/ccproxy/plugins/permissions}/mcp.py +34 -7
- ccproxy_api-0.1.6/ccproxy/models/permissions.py → ccproxy_api-0.2.0/ccproxy/plugins/permissions/models.py +65 -1
- ccproxy_api-0.2.0/ccproxy/plugins/permissions/plugin.py +153 -0
- ccproxy_api-0.1.6/ccproxy/api/routes/permissions.py → ccproxy_api-0.2.0/ccproxy/plugins/permissions/routes.py +20 -16
- ccproxy_api-0.1.6/ccproxy/api/services/permission_service.py → ccproxy_api-0.2.0/ccproxy/plugins/permissions/service.py +65 -11
- {ccproxy_api-0.1.6/ccproxy/api → ccproxy_api-0.2.0/ccproxy/plugins/permissions}/ui/permission_handler_protocol.py +1 -1
- {ccproxy_api-0.1.6/ccproxy/api → ccproxy_api-0.2.0/ccproxy/plugins/permissions}/ui/terminal_permission_handler.py +66 -10
- ccproxy_api-0.2.0/ccproxy/plugins/pricing/README.md +34 -0
- ccproxy_api-0.2.0/ccproxy/plugins/pricing/__init__.py +6 -0
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/pricing/cache.py +7 -6
- ccproxy_api-0.1.6/ccproxy/config/pricing.py → ccproxy_api-0.2.0/ccproxy/plugins/pricing/config.py +32 -6
- ccproxy_api-0.2.0/ccproxy/plugins/pricing/exceptions.py +35 -0
- ccproxy_api-0.2.0/ccproxy/plugins/pricing/loader.py +440 -0
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/pricing/models.py +13 -23
- ccproxy_api-0.2.0/ccproxy/plugins/pricing/plugin.py +169 -0
- ccproxy_api-0.2.0/ccproxy/plugins/pricing/service.py +191 -0
- ccproxy_api-0.2.0/ccproxy/plugins/pricing/tasks.py +300 -0
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/pricing/updater.py +86 -72
- ccproxy_api-0.2.0/ccproxy/plugins/pricing/utils.py +99 -0
- ccproxy_api-0.2.0/ccproxy/plugins/request_tracer/README.md +40 -0
- ccproxy_api-0.2.0/ccproxy/plugins/request_tracer/__init__.py +7 -0
- ccproxy_api-0.2.0/ccproxy/plugins/request_tracer/config.py +120 -0
- ccproxy_api-0.2.0/ccproxy/plugins/request_tracer/hook.py +415 -0
- ccproxy_api-0.2.0/ccproxy/plugins/request_tracer/plugin.py +255 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/scheduler/__init__.py +2 -14
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/scheduler/core.py +26 -41
- ccproxy_api-0.2.0/ccproxy/scheduler/manager.py +195 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/scheduler/registry.py +6 -32
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/scheduler/tasks.py +346 -314
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/services/__init__.py +0 -1
- ccproxy_api-0.2.0/ccproxy/services/adapters/__init__.py +11 -0
- ccproxy_api-0.2.0/ccproxy/services/adapters/base.py +123 -0
- ccproxy_api-0.2.0/ccproxy/services/adapters/chain_composer.py +88 -0
- ccproxy_api-0.2.0/ccproxy/services/adapters/chain_validation.py +44 -0
- ccproxy_api-0.2.0/ccproxy/services/adapters/chat_accumulator.py +200 -0
- ccproxy_api-0.2.0/ccproxy/services/adapters/delta_utils.py +142 -0
- ccproxy_api-0.2.0/ccproxy/services/adapters/format_adapter.py +136 -0
- ccproxy_api-0.2.0/ccproxy/services/adapters/format_context.py +11 -0
- ccproxy_api-0.2.0/ccproxy/services/adapters/format_registry.py +158 -0
- ccproxy_api-0.2.0/ccproxy/services/adapters/http_adapter.py +1045 -0
- ccproxy_api-0.2.0/ccproxy/services/adapters/mock_adapter.py +118 -0
- ccproxy_api-0.2.0/ccproxy/services/adapters/protocols.py +35 -0
- ccproxy_api-0.2.0/ccproxy/services/adapters/simple_converters.py +571 -0
- ccproxy_api-0.2.0/ccproxy/services/auth_registry.py +180 -0
- ccproxy_api-0.2.0/ccproxy/services/cache/__init__.py +6 -0
- ccproxy_api-0.2.0/ccproxy/services/cache/response_cache.py +261 -0
- ccproxy_api-0.2.0/ccproxy/services/cli_detection.py +437 -0
- ccproxy_api-0.2.0/ccproxy/services/config/__init__.py +6 -0
- ccproxy_api-0.2.0/ccproxy/services/config/proxy_configuration.py +111 -0
- ccproxy_api-0.2.0/ccproxy/services/container.py +256 -0
- ccproxy_api-0.2.0/ccproxy/services/factories.py +380 -0
- ccproxy_api-0.2.0/ccproxy/services/handler_config.py +76 -0
- ccproxy_api-0.2.0/ccproxy/services/interfaces.py +298 -0
- ccproxy_api-0.2.0/ccproxy/services/mocking/__init__.py +6 -0
- ccproxy_api-0.2.0/ccproxy/services/mocking/mock_handler.py +291 -0
- ccproxy_api-0.2.0/ccproxy/services/tracing/__init__.py +7 -0
- ccproxy_api-0.2.0/ccproxy/services/tracing/interfaces.py +61 -0
- ccproxy_api-0.2.0/ccproxy/services/tracing/null_tracer.py +57 -0
- ccproxy_api-0.2.0/ccproxy/streaming/__init__.py +23 -0
- ccproxy_api-0.2.0/ccproxy/streaming/buffer.py +1056 -0
- ccproxy_api-0.2.0/ccproxy/streaming/deferred.py +897 -0
- ccproxy_api-0.2.0/ccproxy/streaming/handler.py +117 -0
- ccproxy_api-0.2.0/ccproxy/streaming/interfaces.py +77 -0
- ccproxy_api-0.2.0/ccproxy/streaming/simple_adapter.py +39 -0
- ccproxy_api-0.2.0/ccproxy/streaming/sse.py +109 -0
- ccproxy_api-0.2.0/ccproxy/streaming/sse_parser.py +127 -0
- ccproxy_api-0.2.0/ccproxy/templates/__init__.py +6 -0
- ccproxy_api-0.2.0/ccproxy/templates/plugin_scaffold.py +695 -0
- ccproxy_api-0.2.0/ccproxy/testing/endpoints/__init__.py +33 -0
- ccproxy_api-0.2.0/ccproxy/testing/endpoints/cli.py +215 -0
- ccproxy_api-0.2.0/ccproxy/testing/endpoints/config.py +874 -0
- ccproxy_api-0.2.0/ccproxy/testing/endpoints/console.py +57 -0
- ccproxy_api-0.2.0/ccproxy/testing/endpoints/models.py +100 -0
- ccproxy_api-0.2.0/ccproxy/testing/endpoints/runner.py +1903 -0
- ccproxy_api-0.2.0/ccproxy/testing/endpoints/tools.py +308 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/testing/mock_responses.py +70 -1
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/testing/response_handlers.py +20 -0
- ccproxy_api-0.2.0/ccproxy/utils/__init__.py +8 -0
- ccproxy_api-0.2.0/ccproxy/utils/binary_resolver.py +476 -0
- ccproxy_api-0.2.0/ccproxy/utils/caching.py +327 -0
- ccproxy_api-0.2.0/ccproxy/utils/cli_logging.py +101 -0
- ccproxy_api-0.2.0/ccproxy/utils/command_line.py +251 -0
- ccproxy_api-0.2.0/ccproxy/utils/headers.py +228 -0
- ccproxy_api-0.2.0/ccproxy/utils/model_mapper.py +120 -0
- ccproxy_api-0.2.0/ccproxy/utils/startup_helpers.py +223 -0
- ccproxy_api-0.2.0/ccproxy/utils/version_checker.py +457 -0
- ccproxy_api-0.2.0/pyproject.toml +422 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/tests/factories/README.md +3 -2
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/tests/fixtures/README.md +8 -9
- ccproxy_api-0.1.6/.env.example +0 -31
- ccproxy_api-0.1.6/.github/workflows/backend.yml +0 -117
- ccproxy_api-0.1.6/.github/workflows/build.yml +0 -72
- ccproxy_api-0.1.6/.github/workflows/ci.yml +0 -44
- ccproxy_api-0.1.6/.github/workflows/docs.yml +0 -115
- ccproxy_api-0.1.6/.github/workflows/frontend.yml.disabled +0 -122
- ccproxy_api-0.1.6/.github/workflows/release.yml +0 -151
- ccproxy_api-0.1.6/.pre-commit-config.yaml +0 -132
- ccproxy_api-0.1.6/.python-version +0 -1
- ccproxy_api-0.1.6/CHANGELOG.md +0 -403
- ccproxy_api-0.1.6/CONTRIBUTING.md +0 -402
- ccproxy_api-0.1.6/CONVENTIONS.md +0 -259
- ccproxy_api-0.1.6/Dockerfile +0 -99
- ccproxy_api-0.1.6/Makefile +0 -252
- ccproxy_api-0.1.6/PKG-INFO +0 -615
- ccproxy_api-0.1.6/README.md +0 -582
- ccproxy_api-0.1.6/TESTING.md +0 -578
- ccproxy_api-0.1.6/ccproxy/__init__.py +0 -4
- ccproxy_api-0.1.6/ccproxy/adapters/__init__.py +0 -11
- ccproxy_api-0.1.6/ccproxy/adapters/base.py +0 -80
- ccproxy_api-0.1.6/ccproxy/adapters/codex/__init__.py +0 -11
- ccproxy_api-0.1.6/ccproxy/adapters/openai/__init__.py +0 -42
- ccproxy_api-0.1.6/ccproxy/adapters/openai/adapter.py +0 -953
- ccproxy_api-0.1.6/ccproxy/adapters/openai/models.py +0 -412
- ccproxy_api-0.1.6/ccproxy/adapters/openai/response_adapter.py +0 -355
- ccproxy_api-0.1.6/ccproxy/adapters/openai/response_models.py +0 -178
- ccproxy_api-0.1.6/ccproxy/api/__init__.py +0 -25
- ccproxy_api-0.1.6/ccproxy/api/app.py +0 -354
- ccproxy_api-0.1.6/ccproxy/api/dependencies.py +0 -222
- ccproxy_api-0.1.6/ccproxy/api/middleware/auth.py +0 -0
- ccproxy_api-0.1.6/ccproxy/api/middleware/errors.py +0 -723
- ccproxy_api-0.1.6/ccproxy/api/middleware/headers.py +0 -49
- ccproxy_api-0.1.6/ccproxy/api/middleware/logging.py +0 -180
- ccproxy_api-0.1.6/ccproxy/api/middleware/request_content_logging.py +0 -297
- ccproxy_api-0.1.6/ccproxy/api/middleware/server_header.py +0 -58
- ccproxy_api-0.1.6/ccproxy/api/responses.py +0 -89
- ccproxy_api-0.1.6/ccproxy/api/routes/__init__.py +0 -24
- ccproxy_api-0.1.6/ccproxy/api/routes/claude.py +0 -371
- ccproxy_api-0.1.6/ccproxy/api/routes/codex.py +0 -1231
- ccproxy_api-0.1.6/ccproxy/api/routes/health.py +0 -768
- ccproxy_api-0.1.6/ccproxy/api/routes/metrics.py +0 -1029
- ccproxy_api-0.1.6/ccproxy/api/routes/proxy.py +0 -211
- ccproxy_api-0.1.6/ccproxy/api/services/__init__.py +0 -6
- ccproxy_api-0.1.6/ccproxy/auth/conditional.py +0 -84
- ccproxy_api-0.1.6/ccproxy/auth/credentials_adapter.py +0 -93
- ccproxy_api-0.1.6/ccproxy/auth/dependencies.py +0 -229
- ccproxy_api-0.1.6/ccproxy/auth/manager.py +0 -102
- ccproxy_api-0.1.6/ccproxy/auth/models.py +0 -118
- ccproxy_api-0.1.6/ccproxy/auth/oauth/__init__.py +0 -26
- ccproxy_api-0.1.6/ccproxy/auth/oauth/models.py +0 -48
- ccproxy_api-0.1.6/ccproxy/auth/oauth/storage.py +0 -0
- ccproxy_api-0.1.6/ccproxy/auth/openai/__init__.py +0 -13
- ccproxy_api-0.1.6/ccproxy/auth/openai/credentials.py +0 -166
- ccproxy_api-0.1.6/ccproxy/auth/openai/oauth_client.py +0 -334
- ccproxy_api-0.1.6/ccproxy/auth/openai/storage.py +0 -184
- ccproxy_api-0.1.6/ccproxy/auth/storage/__init__.py +0 -12
- ccproxy_api-0.1.6/ccproxy/auth/storage/base.py +0 -57
- ccproxy_api-0.1.6/ccproxy/auth/storage/json_file.py +0 -158
- ccproxy_api-0.1.6/ccproxy/auth/storage/keyring.py +0 -189
- ccproxy_api-0.1.6/ccproxy/claude_sdk/__init__.py +0 -18
- ccproxy_api-0.1.6/ccproxy/claude_sdk/options.py +0 -194
- ccproxy_api-0.1.6/ccproxy/claude_sdk/session_pool.py +0 -550
- ccproxy_api-0.1.6/ccproxy/cli/commands/auth.py +0 -964
- ccproxy_api-0.1.6/ccproxy/cli/commands/serve.py +0 -986
- ccproxy_api-0.1.6/ccproxy/cli/docker/__init__.py +0 -34
- ccproxy_api-0.1.6/ccproxy/cli/docker/adapter_factory.py +0 -157
- ccproxy_api-0.1.6/ccproxy/cli/docker/params.py +0 -274
- ccproxy_api-0.1.6/ccproxy/cli/main.py +0 -104
- ccproxy_api-0.1.6/ccproxy/config/auth.py +0 -153
- ccproxy_api-0.1.6/ccproxy/config/claude.py +0 -348
- ccproxy_api-0.1.6/ccproxy/config/cors.py +0 -79
- ccproxy_api-0.1.6/ccproxy/config/discovery.py +0 -95
- ccproxy_api-0.1.6/ccproxy/config/docker_settings.py +0 -264
- ccproxy_api-0.1.6/ccproxy/config/observability.py +0 -158
- ccproxy_api-0.1.6/ccproxy/config/reverse_proxy.py +0 -31
- ccproxy_api-0.1.6/ccproxy/config/scheduler.py +0 -108
- ccproxy_api-0.1.6/ccproxy/config/security.py +0 -19
- ccproxy_api-0.1.6/ccproxy/config/server.py +0 -86
- ccproxy_api-0.1.6/ccproxy/config/settings.py +0 -577
- ccproxy_api-0.1.6/ccproxy/config/validators.py +0 -231
- ccproxy_api-0.1.6/ccproxy/core/__init__.py +0 -274
- ccproxy_api-0.1.6/ccproxy/core/codex_transformers.py +0 -389
- ccproxy_api-0.1.6/ccproxy/core/constants.py +0 -97
- ccproxy_api-0.1.6/ccproxy/core/http.py +0 -328
- ccproxy_api-0.1.6/ccproxy/core/http_transformers.py +0 -812
- ccproxy_api-0.1.6/ccproxy/core/interfaces.py +0 -247
- ccproxy_api-0.1.6/ccproxy/core/logging.py +0 -287
- ccproxy_api-0.1.6/ccproxy/core/proxy.py +0 -143
- ccproxy_api-0.1.6/ccproxy/core/validators.py +0 -288
- ccproxy_api-0.1.6/ccproxy/models/__init__.py +0 -164
- ccproxy_api-0.1.6/ccproxy/models/detection.py +0 -208
- ccproxy_api-0.1.6/ccproxy/models/errors.py +0 -42
- ccproxy_api-0.1.6/ccproxy/models/messages.py +0 -269
- ccproxy_api-0.1.6/ccproxy/models/requests.py +0 -107
- ccproxy_api-0.1.6/ccproxy/models/responses.py +0 -270
- ccproxy_api-0.1.6/ccproxy/models/types.py +0 -102
- ccproxy_api-0.1.6/ccproxy/observability/__init__.py +0 -51
- ccproxy_api-0.1.6/ccproxy/observability/access_logger.py +0 -457
- ccproxy_api-0.1.6/ccproxy/observability/sse_events.py +0 -303
- ccproxy_api-0.1.6/ccproxy/observability/stats_printer.py +0 -753
- ccproxy_api-0.1.6/ccproxy/observability/storage/__init__.py +0 -1
- ccproxy_api-0.1.6/ccproxy/observability/storage/duckdb_simple.py +0 -677
- ccproxy_api-0.1.6/ccproxy/observability/storage/models.py +0 -70
- ccproxy_api-0.1.6/ccproxy/observability/streaming_response.py +0 -107
- ccproxy_api-0.1.6/ccproxy/pricing/__init__.py +0 -19
- ccproxy_api-0.1.6/ccproxy/pricing/loader.py +0 -251
- ccproxy_api-0.1.6/ccproxy/scheduler/manager.py +0 -239
- ccproxy_api-0.1.6/ccproxy/services/claude_detection_service.py +0 -269
- ccproxy_api-0.1.6/ccproxy/services/codex_detection_service.py +0 -263
- ccproxy_api-0.1.6/ccproxy/services/credentials/__init__.py +0 -55
- ccproxy_api-0.1.6/ccproxy/services/credentials/config.py +0 -105
- ccproxy_api-0.1.6/ccproxy/services/credentials/manager.py +0 -561
- ccproxy_api-0.1.6/ccproxy/services/credentials/oauth_client.py +0 -481
- ccproxy_api-0.1.6/ccproxy/services/proxy_service.py +0 -1827
- ccproxy_api-0.1.6/ccproxy/static/.keep +0 -0
- ccproxy_api-0.1.6/ccproxy/utils/__init__.py +0 -14
- ccproxy_api-0.1.6/ccproxy/utils/cost_calculator.py +0 -210
- ccproxy_api-0.1.6/ccproxy/utils/disconnection_monitor.py +0 -83
- ccproxy_api-0.1.6/ccproxy/utils/model_mapping.py +0 -199
- ccproxy_api-0.1.6/ccproxy/utils/models_provider.py +0 -150
- ccproxy_api-0.1.6/ccproxy/utils/simple_request_logger.py +0 -284
- ccproxy_api-0.1.6/ccproxy/utils/startup_helpers.py +0 -470
- ccproxy_api-0.1.6/ccproxy/utils/streaming_metrics.py +0 -199
- ccproxy_api-0.1.6/ccproxy/utils/version_checker.py +0 -184
- ccproxy_api-0.1.6/data/metrics.db +0 -0
- ccproxy_api-0.1.6/devenv.lock +0 -103
- ccproxy_api-0.1.6/devenv.nix +0 -119
- ccproxy_api-0.1.6/docker-compose.monitoring.yml +0 -56
- ccproxy_api-0.1.6/docker-compose.yml +0 -22
- ccproxy_api-0.1.6/docs/README.md +0 -221
- ccproxy_api-0.1.6/docs/api-reference.md +0 -142
- ccproxy_api-0.1.6/docs/assets/extra.css +0 -0
- ccproxy_api-0.1.6/docs/assets/extra.js +0 -15
- ccproxy_api-0.1.6/docs/contributing.md +0 -1
- ccproxy_api-0.1.6/docs/development/debugging-with-proxy.md +0 -198
- ccproxy_api-0.1.6/docs/examples.md +0 -384
- ccproxy_api-0.1.6/docs/gen_ref_pages.py +0 -41
- ccproxy_api-0.1.6/docs/getting-started/configuration.md +0 -747
- ccproxy_api-0.1.6/docs/getting-started/installation.md +0 -169
- ccproxy_api-0.1.6/docs/getting-started/quickstart.md +0 -678
- ccproxy_api-0.1.6/docs/index.md +0 -337
- ccproxy_api-0.1.6/docs/metrics-api.md +0 -529
- ccproxy_api-0.1.6/docs/observability.md +0 -82
- ccproxy_api-0.1.6/docs/systemd-setup.md +0 -261
- ccproxy_api-0.1.6/docs/user-guide/api-usage.md +0 -103
- ccproxy_api-0.1.6/docs/user-guide/authentication.md +0 -295
- ccproxy_api-0.1.6/docs/user-guide/claude-code-options.md +0 -199
- ccproxy_api-0.1.6/docs/user-guide/claude-sdk-compatibility.md +0 -229
- ccproxy_api-0.1.6/docs/user-guide/codex-api.md +0 -549
- ccproxy_api-0.1.6/docs/user-guide/mcp-integration.md +0 -146
- ccproxy_api-0.1.6/docs/user-guide/pool-configuration.md +0 -162
- ccproxy_api-0.1.6/docs/user-guide/understanding-pool-logs.md +0 -166
- ccproxy_api-0.1.6/examples/README_chat_agent.md +0 -79
- ccproxy_api-0.1.6/examples/ai_code_discussion_demo.py +0 -1458
- ccproxy_api-0.1.6/examples/anthropic_streaming_demo.py +0 -263
- ccproxy_api-0.1.6/examples/anthropic_tools_demo.py +0 -188
- ccproxy_api-0.1.6/examples/client.py +0 -311
- ccproxy_api-0.1.6/examples/common_utils.py +0 -263
- ccproxy_api-0.1.6/examples/console_utils.py +0 -359
- ccproxy_api-0.1.6/examples/debug_anthropic_streaming.py +0 -391
- ccproxy_api-0.1.6/examples/openai_anthropic_conversation_demo.py +0 -703
- ccproxy_api-0.1.6/examples/openai_claude_code_options_example.sh +0 -50
- ccproxy_api-0.1.6/examples/openai_json_object_example.sh +0 -46
- ccproxy_api-0.1.6/examples/openai_json_schema_example.sh +0 -61
- ccproxy_api-0.1.6/examples/openai_streaming_demo.py +0 -126
- ccproxy_api-0.1.6/examples/openai_structured_response_demo.py +0 -237
- ccproxy_api-0.1.6/examples/openai_thinking_demo.py +0 -225
- ccproxy_api-0.1.6/examples/openai_tools_demo.py +0 -211
- ccproxy_api-0.1.6/examples/project_code_access_demo.py +0 -587
- ccproxy_api-0.1.6/examples/simple_thinking_demo.py +0 -118
- ccproxy_api-0.1.6/examples/textual_chat_agent.py +0 -440
- ccproxy_api-0.1.6/mkdocs.yml +0 -217
- ccproxy_api-0.1.6/monitoring/grafana/provisioning/dashboards/dashboard.yml +0 -12
- ccproxy_api-0.1.6/monitoring/grafana/provisioning/datasources/victoria-metrics.yml +0 -18
- ccproxy_api-0.1.6/pyproject.toml +0 -349
- ccproxy_api-0.1.6/scripts/act-run.sh +0 -7
- ccproxy_api-0.1.6/scripts/build-docs.sh +0 -24
- ccproxy_api-0.1.6/scripts/entrypoint.sh +0 -183
- ccproxy_api-0.1.6/scripts/format_version.py +0 -50
- ccproxy_api-0.1.6/scripts/serve-docs.sh +0 -18
- ccproxy_api-0.1.6/scripts/setup-systemd.sh +0 -210
- ccproxy_api-0.1.6/scripts/setup.sh +0 -45
- ccproxy_api-0.1.6/scripts/traffic_generator.py +0 -674
- ccproxy_api-0.1.6/systemd/ccproxy.service.template +0 -20
- ccproxy_api-0.1.6/tests/.gitignore +0 -7
- ccproxy_api-0.1.6/tests/conftest.py +0 -1117
- ccproxy_api-0.1.6/tests/factories/__init__.py +0 -24
- ccproxy_api-0.1.6/tests/factories/fastapi_factory.py +0 -422
- ccproxy_api-0.1.6/tests/fixtures/auth/__init__.py +0 -51
- ccproxy_api-0.1.6/tests/fixtures/auth/example_usage.py +0 -287
- ccproxy_api-0.1.6/tests/fixtures/claude_sdk/__init__.py +0 -5
- ccproxy_api-0.1.6/tests/fixtures/claude_sdk/client_mocks.py +0 -146
- ccproxy_api-0.1.6/tests/fixtures/claude_sdk/internal_mocks.py +0 -255
- ccproxy_api-0.1.6/tests/fixtures/claude_sdk/responses.py +0 -95
- ccproxy_api-0.1.6/tests/fixtures/credentials.json +0 -9
- ccproxy_api-0.1.6/tests/fixtures/external_apis/__init__.py +0 -5
- ccproxy_api-0.1.6/tests/fixtures/external_apis/anthropic_api.py +0 -178
- ccproxy_api-0.1.6/tests/fixtures/external_apis/openai_codex_api.py +0 -153
- ccproxy_api-0.1.6/tests/fixtures/proxy_service/__init__.py +0 -5
- ccproxy_api-0.1.6/tests/fixtures/proxy_service/oauth_mocks.py +0 -91
- ccproxy_api-0.1.6/tests/fixtures/responses.json +0 -177
- ccproxy_api-0.1.6/tests/helpers/__init__.py +0 -1
- ccproxy_api-0.1.6/tests/helpers/assertions.py +0 -135
- ccproxy_api-0.1.6/tests/helpers/test_data.py +0 -234
- ccproxy_api-0.1.6/tests/integration/test_access_logger_integration.py +0 -476
- ccproxy_api-0.1.6/tests/integration/test_confirmation_integration.py +0 -361
- ccproxy_api-0.1.6/tests/integration/test_duckdb_settings_integration.py +0 -149
- ccproxy_api-0.1.6/tests/integration/test_streaming_access_logging.py +0 -488
- ccproxy_api-0.1.6/tests/test_cache_control_limiter.py +0 -321
- ccproxy_api-0.1.6/tests/unit/__init__.py +0 -0
- ccproxy_api-0.1.6/tests/unit/api/__init__.py +0 -0
- ccproxy_api-0.1.6/tests/unit/api/test_api.py +0 -551
- ccproxy_api-0.1.6/tests/unit/api/test_confirmation_routes.py +0 -514
- ccproxy_api-0.1.6/tests/unit/api/test_mcp_route.py +0 -346
- ccproxy_api-0.1.6/tests/unit/api/test_metrics_api.py +0 -485
- ccproxy_api-0.1.6/tests/unit/api/test_reset_endpoint.py +0 -301
- ccproxy_api-0.1.6/tests/unit/auth/__init__.py +0 -0
- ccproxy_api-0.1.6/tests/unit/auth/test_auth.py +0 -951
- ccproxy_api-0.1.6/tests/unit/cli/__init__.py +0 -0
- ccproxy_api-0.1.6/tests/unit/cli/test_cli_auth_commands.py +0 -569
- ccproxy_api-0.1.6/tests/unit/cli/test_cli_config.py +0 -382
- ccproxy_api-0.1.6/tests/unit/cli/test_cli_confirmation_handler.py +0 -527
- ccproxy_api-0.1.6/tests/unit/cli/test_cli_serve.py +0 -481
- ccproxy_api-0.1.6/tests/unit/config/__init__.py +0 -0
- ccproxy_api-0.1.6/tests/unit/config/test_claude_sdk_options.py +0 -208
- ccproxy_api-0.1.6/tests/unit/config/test_claude_sdk_parser.py +0 -417
- ccproxy_api-0.1.6/tests/unit/config/test_terminal_handler.py +0 -202
- ccproxy_api-0.1.6/tests/unit/observability/test_streaming_response.py +0 -274
- ccproxy_api-0.1.6/tests/unit/services/__init__.py +0 -0
- ccproxy_api-0.1.6/tests/unit/services/test_adapters.py +0 -1136
- ccproxy_api-0.1.6/tests/unit/services/test_claude_sdk_client.py +0 -491
- ccproxy_api-0.1.6/tests/unit/services/test_codex_proxy.py +0 -379
- ccproxy_api-0.1.6/tests/unit/services/test_confirmation_service.py +0 -409
- ccproxy_api-0.1.6/tests/unit/services/test_docker.py +0 -518
- ccproxy_api-0.1.6/tests/unit/services/test_fastapi_factory.py +0 -171
- ccproxy_api-0.1.6/tests/unit/services/test_http_transformers.py +0 -1384
- ccproxy_api-0.1.6/tests/unit/services/test_observability.py +0 -1204
- ccproxy_api-0.1.6/tests/unit/services/test_pricing.py +0 -877
- ccproxy_api-0.1.6/tests/unit/services/test_pushgateway_error_handling.py +0 -324
- ccproxy_api-0.1.6/tests/unit/services/test_queue_duckdb_storage.py +0 -459
- ccproxy_api-0.1.6/tests/unit/services/test_scheduler.py +0 -702
- ccproxy_api-0.1.6/tests/unit/services/test_scheduler_tasks.py +0 -804
- ccproxy_api-0.1.6/tests/unit/services/test_session_pool_race_condition.py +0 -208
- ccproxy_api-0.1.6/tests/unit/services/test_sse_events.py +0 -475
- ccproxy_api-0.1.6/tests/unit/services/test_sse_stream_filtering.py +0 -526
- ccproxy_api-0.1.6/tests/unit/services/test_stats_printer.py +0 -881
- ccproxy_api-0.1.6/tests/unit/services/test_streaming.py +0 -148
- ccproxy_api-0.1.6/tests/unit/utils/__init__.py +0 -0
- ccproxy_api-0.1.6/tests/unit/utils/test_duckdb_lifecycle.py +0 -266
- ccproxy_api-0.1.6/tests/unit/utils/test_startup_helpers.py +0 -917
- ccproxy_api-0.1.6/tests/unit/utils/test_version_checker.py +0 -317
- ccproxy_api-0.1.6/uv.lock +0 -3447
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/LICENSE +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/__main__.py +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/api/middleware/__init__.py +0 -0
- {ccproxy_api-0.1.6/tests → ccproxy_api-0.2.0/ccproxy/auth/models}/__init__.py +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/cli/commands/__init__.py +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/cli/commands/config/__init__.py +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/cli/commands/config/schema_commands.py +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/cli/options/__init__.py +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/cli/options/core_options.py +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/cli/options/security_options.py +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/cli/options/server_options.py +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/core/middleware.py +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/core/system.py +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/core/types.py +0 -0
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/claude_sdk/exceptions.py +0 -0
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/docker/models.py +0 -0
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/docker/protocol.py +0 -0
- {ccproxy_api-0.1.6/ccproxy → ccproxy_api-0.2.0/ccproxy/plugins}/docker/validators.py +0 -0
- {ccproxy_api-0.1.6/monitoring → ccproxy_api-0.2.0/ccproxy/plugins/metrics}/grafana/dashboards/ccproxy-dashboard.json +0 -0
- {ccproxy_api-0.1.6/tests/integration → ccproxy_api-0.2.0/ccproxy/plugins/permissions/handlers}/__init__.py +0 -0
- {ccproxy_api-0.1.6/ccproxy/api → ccproxy_api-0.2.0/ccproxy/plugins/permissions}/ui/__init__.py +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/scheduler/errors.py +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/testing/__init__.py +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/testing/config.py +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/testing/content_generation.py +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/testing/scenarios.py +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/ccproxy/utils/id_generator.py +0 -0
- {ccproxy_api-0.1.6 → ccproxy_api-0.2.0}/examples/README.md +0 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ccproxy-api
|
|
3
|
+
Version: 0.2.0
|
|
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: fastapi[standard]>=0.115.14
|
|
9
|
+
Requires-Dist: httpx[http2]>=0.28.1
|
|
10
|
+
Requires-Dist: packaging>=25.0
|
|
11
|
+
Requires-Dist: pydantic-settings>=2.4.0
|
|
12
|
+
Requires-Dist: pydantic>=2.8.0
|
|
13
|
+
Requires-Dist: pyjwt>=2.10.1
|
|
14
|
+
Requires-Dist: rich-toolkit>=0.14.8
|
|
15
|
+
Requires-Dist: rich>=13.0.0
|
|
16
|
+
Requires-Dist: sortedcontainers>=2.4.0
|
|
17
|
+
Requires-Dist: structlog>=25.4.0
|
|
18
|
+
Requires-Dist: typer>=0.16.0
|
|
19
|
+
Requires-Dist: typing-extensions>=4.0.0
|
|
20
|
+
Requires-Dist: uvicorn>=0.34.0
|
|
21
|
+
Provides-Extra: plugins-claude
|
|
22
|
+
Requires-Dist: claude-agent-sdk>=0.1.0; extra == 'plugins-claude'
|
|
23
|
+
Requires-Dist: qrcode>=8.2; extra == 'plugins-claude'
|
|
24
|
+
Provides-Extra: plugins-codex
|
|
25
|
+
Requires-Dist: pyjwt>=2.10.1; extra == 'plugins-codex'
|
|
26
|
+
Requires-Dist: qrcode>=8.2; extra == 'plugins-codex'
|
|
27
|
+
Provides-Extra: plugins-mcp
|
|
28
|
+
Requires-Dist: fastapi-mcp>=0.3.7; extra == 'plugins-mcp'
|
|
29
|
+
Provides-Extra: plugins-metrics
|
|
30
|
+
Requires-Dist: prometheus-client>=0.22.1; extra == 'plugins-metrics'
|
|
31
|
+
Provides-Extra: plugins-storage
|
|
32
|
+
Requires-Dist: duckdb-engine>=0.17.0; extra == 'plugins-storage'
|
|
33
|
+
Requires-Dist: duckdb<1.4.0,>=1.1.0; extra == 'plugins-storage'
|
|
34
|
+
Requires-Dist: sqlalchemy>=2.0.0; extra == 'plugins-storage'
|
|
35
|
+
Requires-Dist: sqlmodel>=0.0.24; extra == 'plugins-storage'
|
|
36
|
+
Provides-Extra: plugins-tui
|
|
37
|
+
Requires-Dist: aioconsole>=0.8.1; extra == 'plugins-tui'
|
|
38
|
+
Requires-Dist: textual>=3.7.1; extra == 'plugins-tui'
|
|
39
|
+
Description-Content-Type: text/markdown
|
|
40
|
+
|
|
41
|
+
# CCProxy API Server
|
|
42
|
+
|
|
43
|
+
CCProxy is a local, plugin-based reverse proxy that unifies access to
|
|
44
|
+
multiple AI providers (e.g., Claude SDK/API and OpenAI Codex) behind a
|
|
45
|
+
consistent API. It ships with bundled plugins for providers, logging,
|
|
46
|
+
tracing, metrics, analytics, and more.
|
|
47
|
+
|
|
48
|
+
## Supported Providers
|
|
49
|
+
|
|
50
|
+
- Anthropic Claude API/SDK (OAuth2 flow or Claude CLI/SDK token files)
|
|
51
|
+
- OpenAI Codex (ChatGPT backend Responses API using OAuth for paid/pro accounts)
|
|
52
|
+
- GitHub Copilot (chat and completions for free, paid, or business accounts)
|
|
53
|
+
|
|
54
|
+
Each provider adapter exposes the same surface area: OpenAI Chat
|
|
55
|
+
Completions, OpenAI Responses, and Anthropic Messages. The proxy maintains a
|
|
56
|
+
shared model-mapping layer so you can reuse the same `model` identifier
|
|
57
|
+
across providers without rewriting client code.
|
|
58
|
+
|
|
59
|
+
Authentication can reuse existing provider files (e.g., Claude CLI SDK
|
|
60
|
+
tokens and the Codex CLI credential store), or you can run
|
|
61
|
+
`ccproxy auth login <provider>` to complete the OAuth flow from the CLI;
|
|
62
|
+
stored secrets are picked up automatically by the proxy.
|
|
63
|
+
|
|
64
|
+
## Extensibility
|
|
65
|
+
|
|
66
|
+
CCProxy's plugin system lets you add instrumentation and storage layers
|
|
67
|
+
without patching the core server. Bundled plugins currently include:
|
|
68
|
+
|
|
69
|
+
- [`access_log`](ccproxy/plugins/access_log/README.md): structured access
|
|
70
|
+
logging for client and provider traffic
|
|
71
|
+
- [`analytics`](ccproxy/plugins/analytics/README.md): DuckDB-backed analytics
|
|
72
|
+
APIs for captured request logs
|
|
73
|
+
- [`claude_api`](ccproxy/plugins/claude_api/README.md): Anthropic Claude HTTP
|
|
74
|
+
API adapter with health and metrics
|
|
75
|
+
- [`claude_sdk`](ccproxy/plugins/claude_sdk/README.md): local Claude CLI/SDK
|
|
76
|
+
adapter with session pooling
|
|
77
|
+
- [`codex`](ccproxy/plugins/codex/README.md): OpenAI Codex provider adapter
|
|
78
|
+
with OAuth support
|
|
79
|
+
- [`command_replay`](ccproxy/plugins/command_replay/README.md): generates
|
|
80
|
+
`curl`/`xh` commands for captured requests
|
|
81
|
+
- [`copilot`](ccproxy/plugins/copilot/README.md): GitHub Copilot provider
|
|
82
|
+
adapter with OAuth token management
|
|
83
|
+
- [`credential_balancer`](ccproxy/plugins/credential_balancer/README.md):
|
|
84
|
+
rotates upstream credentials based on health
|
|
85
|
+
- [`dashboard`](ccproxy/plugins/dashboard/README.md): serves the CCProxy
|
|
86
|
+
dashboard SPA and APIs
|
|
87
|
+
- [`docker`](ccproxy/plugins/docker/README.md): runs providers inside Docker via
|
|
88
|
+
CLI extensions
|
|
89
|
+
- [`duckdb_storage`](ccproxy/plugins/duckdb_storage/README.md): exposes
|
|
90
|
+
DuckDB-backed storage for logs and analytics
|
|
91
|
+
- [`max_tokens`](ccproxy/plugins/max_tokens/README.md): normalizes
|
|
92
|
+
`max_tokens` fields to provider limits
|
|
93
|
+
- [`metrics`](ccproxy/plugins/metrics/README.md): Prometheus-compatible metrics
|
|
94
|
+
with optional Pushgateway
|
|
95
|
+
- [`oauth_claude`](ccproxy/plugins/oauth_claude/README.md): standalone OAuth
|
|
96
|
+
provider for Claude integrations
|
|
97
|
+
- [`oauth_codex`](ccproxy/plugins/oauth_codex/README.md): standalone OAuth
|
|
98
|
+
provider for Codex integrations
|
|
99
|
+
- [`permissions`](ccproxy/plugins/permissions/README.md): interactive approval
|
|
100
|
+
flow for privileged tool actions
|
|
101
|
+
- [`pricing`](ccproxy/plugins/pricing/README.md): caches model pricing data for
|
|
102
|
+
cost-aware features
|
|
103
|
+
- [`request_tracer`](ccproxy/plugins/request_tracer/README.md): detailed
|
|
104
|
+
request/response tracing for debugging
|
|
105
|
+
|
|
106
|
+
Shared helpers such as
|
|
107
|
+
[`claude_shared`](ccproxy/plugins/claude_shared/README.md) provide metadata
|
|
108
|
+
consumed by the Claude plugins. Each plugin directory contains its own README
|
|
109
|
+
with configuration examples.
|
|
110
|
+
|
|
111
|
+
## Quick Links
|
|
112
|
+
|
|
113
|
+
- Docs site entry: `docs/index.md`
|
|
114
|
+
- Getting started: `docs/getting-started/quickstart.md`
|
|
115
|
+
- Configuration reference: `docs/getting-started/configuration.md`
|
|
116
|
+
- Examples: `docs/examples.md`
|
|
117
|
+
- Migration (0.2): `docs/migration/0.2-plugin-first.md`
|
|
118
|
+
|
|
119
|
+
## Plugin Config Quickstart
|
|
120
|
+
|
|
121
|
+
The plugin system is enabled by default (`enable_plugins = true`), and all
|
|
122
|
+
discovered plugins load automatically when no additional filters are set. Use
|
|
123
|
+
these knobs to adjust what runs:
|
|
124
|
+
|
|
125
|
+
- `enabled_plugins`: optional allow list; when set, only the listed plugins run.
|
|
126
|
+
- `disabled_plugins`: optional block list applied when `enabled_plugins` is not
|
|
127
|
+
set.
|
|
128
|
+
- `plugins.<name>.enabled`: per-plugin flag (defaults to `true`) that you can
|
|
129
|
+
override in TOML or environment variables. Any plugin set to `false` is added
|
|
130
|
+
to the deny list alongside `disabled_plugins` during startup.
|
|
131
|
+
|
|
132
|
+
During startup we merge `disabled_plugins` and any `plugins.<name>.enabled = false`
|
|
133
|
+
entries into a single deny list. At runtime the loader checks the allow list
|
|
134
|
+
first and then confirms the plugin is not deny listed. Configure plugins under
|
|
135
|
+
`plugins.<name>` in TOML or via nested environment variables.
|
|
136
|
+
|
|
137
|
+
Use `ccproxy plugins list` to inspect discovered plugins and
|
|
138
|
+
`ccproxy plugins settings <name>` to review configuration fields.
|
|
139
|
+
|
|
140
|
+
### TOML example (`.ccproxy.toml`)
|
|
141
|
+
|
|
142
|
+
```toml
|
|
143
|
+
enable_plugins = true
|
|
144
|
+
# enabled_plugins = ["metrics", "analytics"] # Optional allow list
|
|
145
|
+
disabled_plugins = ["duckdb_storage"] # Optional block list
|
|
146
|
+
|
|
147
|
+
[plugins.access_log]
|
|
148
|
+
client_enabled = true
|
|
149
|
+
client_format = "structured"
|
|
150
|
+
client_log_file = "/tmp/ccproxy/access.log"
|
|
151
|
+
|
|
152
|
+
[plugins.request_tracer]
|
|
153
|
+
json_logs_enabled = true
|
|
154
|
+
raw_http_enabled = true
|
|
155
|
+
log_dir = "/tmp/ccproxy/traces"
|
|
156
|
+
|
|
157
|
+
[plugins.duckdb_storage]
|
|
158
|
+
enabled = false
|
|
159
|
+
|
|
160
|
+
[plugins.analytics]
|
|
161
|
+
enabled = true
|
|
162
|
+
|
|
163
|
+
# Metrics plugin
|
|
164
|
+
[plugins.metrics]
|
|
165
|
+
enabled = true
|
|
166
|
+
# pushgateway_enabled = true
|
|
167
|
+
# pushgateway_url = "http://localhost:9091"
|
|
168
|
+
# pushgateway_job = "ccproxy"
|
|
169
|
+
# pushgateway_push_interval = 60
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Environment variables (nested with `__`)
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
export DISABLED_PLUGINS="duckdb_storage" # Optional block list
|
|
176
|
+
export PLUGINS__ACCESS_LOG__ENABLED=true
|
|
177
|
+
export PLUGINS__ACCESS_LOG__CLIENT_ENABLED=true
|
|
178
|
+
export PLUGINS__ACCESS_LOG__CLIENT_FORMAT=structured
|
|
179
|
+
export PLUGINS__ACCESS_LOG__CLIENT_LOG_FILE=/tmp/ccproxy/access.log
|
|
180
|
+
|
|
181
|
+
export PLUGINS__REQUEST_TRACER__ENABLED=true
|
|
182
|
+
export PLUGINS__REQUEST_TRACER__JSON_LOGS_ENABLED=true
|
|
183
|
+
export PLUGINS__REQUEST_TRACER__RAW_HTTP_ENABLED=true
|
|
184
|
+
export PLUGINS__REQUEST_TRACER__LOG_DIR=/tmp/ccproxy/traces
|
|
185
|
+
|
|
186
|
+
export PLUGINS__DUCKDB_STORAGE__ENABLED=true
|
|
187
|
+
export PLUGINS__ANALYTICS__ENABLED=true
|
|
188
|
+
export PLUGINS__METRICS__ENABLED=true
|
|
189
|
+
# export PLUGINS__METRICS__PUSHGATEWAY_ENABLED=true
|
|
190
|
+
# export PLUGINS__METRICS__PUSHGATEWAY_URL=http://localhost:9091
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Running
|
|
194
|
+
|
|
195
|
+
To install the latest stable release without cloning the repository, use `uvx`
|
|
196
|
+
to grab the published wheel and launch the CLI:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
uvx --with "ccproxy-api[all]" ccproxy serve --port 8000
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
If you prefer `pipx`, install the package (optionally with extras) and use the
|
|
203
|
+
local shim:
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
pipx install "ccproxy-api[all]"
|
|
207
|
+
ccproxy serve # default on localhost:8000
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## License
|
|
211
|
+
|
|
212
|
+
See `LICENSE`.
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# CCProxy API Server
|
|
2
|
+
|
|
3
|
+
CCProxy is a local, plugin-based reverse proxy that unifies access to
|
|
4
|
+
multiple AI providers (e.g., Claude SDK/API and OpenAI Codex) behind a
|
|
5
|
+
consistent API. It ships with bundled plugins for providers, logging,
|
|
6
|
+
tracing, metrics, analytics, and more.
|
|
7
|
+
|
|
8
|
+
## Supported Providers
|
|
9
|
+
|
|
10
|
+
- Anthropic Claude API/SDK (OAuth2 flow or Claude CLI/SDK token files)
|
|
11
|
+
- OpenAI Codex (ChatGPT backend Responses API using OAuth for paid/pro accounts)
|
|
12
|
+
- GitHub Copilot (chat and completions for free, paid, or business accounts)
|
|
13
|
+
|
|
14
|
+
Each provider adapter exposes the same surface area: OpenAI Chat
|
|
15
|
+
Completions, OpenAI Responses, and Anthropic Messages. The proxy maintains a
|
|
16
|
+
shared model-mapping layer so you can reuse the same `model` identifier
|
|
17
|
+
across providers without rewriting client code.
|
|
18
|
+
|
|
19
|
+
Authentication can reuse existing provider files (e.g., Claude CLI SDK
|
|
20
|
+
tokens and the Codex CLI credential store), or you can run
|
|
21
|
+
`ccproxy auth login <provider>` to complete the OAuth flow from the CLI;
|
|
22
|
+
stored secrets are picked up automatically by the proxy.
|
|
23
|
+
|
|
24
|
+
## Extensibility
|
|
25
|
+
|
|
26
|
+
CCProxy's plugin system lets you add instrumentation and storage layers
|
|
27
|
+
without patching the core server. Bundled plugins currently include:
|
|
28
|
+
|
|
29
|
+
- [`access_log`](ccproxy/plugins/access_log/README.md): structured access
|
|
30
|
+
logging for client and provider traffic
|
|
31
|
+
- [`analytics`](ccproxy/plugins/analytics/README.md): DuckDB-backed analytics
|
|
32
|
+
APIs for captured request logs
|
|
33
|
+
- [`claude_api`](ccproxy/plugins/claude_api/README.md): Anthropic Claude HTTP
|
|
34
|
+
API adapter with health and metrics
|
|
35
|
+
- [`claude_sdk`](ccproxy/plugins/claude_sdk/README.md): local Claude CLI/SDK
|
|
36
|
+
adapter with session pooling
|
|
37
|
+
- [`codex`](ccproxy/plugins/codex/README.md): OpenAI Codex provider adapter
|
|
38
|
+
with OAuth support
|
|
39
|
+
- [`command_replay`](ccproxy/plugins/command_replay/README.md): generates
|
|
40
|
+
`curl`/`xh` commands for captured requests
|
|
41
|
+
- [`copilot`](ccproxy/plugins/copilot/README.md): GitHub Copilot provider
|
|
42
|
+
adapter with OAuth token management
|
|
43
|
+
- [`credential_balancer`](ccproxy/plugins/credential_balancer/README.md):
|
|
44
|
+
rotates upstream credentials based on health
|
|
45
|
+
- [`dashboard`](ccproxy/plugins/dashboard/README.md): serves the CCProxy
|
|
46
|
+
dashboard SPA and APIs
|
|
47
|
+
- [`docker`](ccproxy/plugins/docker/README.md): runs providers inside Docker via
|
|
48
|
+
CLI extensions
|
|
49
|
+
- [`duckdb_storage`](ccproxy/plugins/duckdb_storage/README.md): exposes
|
|
50
|
+
DuckDB-backed storage for logs and analytics
|
|
51
|
+
- [`max_tokens`](ccproxy/plugins/max_tokens/README.md): normalizes
|
|
52
|
+
`max_tokens` fields to provider limits
|
|
53
|
+
- [`metrics`](ccproxy/plugins/metrics/README.md): Prometheus-compatible metrics
|
|
54
|
+
with optional Pushgateway
|
|
55
|
+
- [`oauth_claude`](ccproxy/plugins/oauth_claude/README.md): standalone OAuth
|
|
56
|
+
provider for Claude integrations
|
|
57
|
+
- [`oauth_codex`](ccproxy/plugins/oauth_codex/README.md): standalone OAuth
|
|
58
|
+
provider for Codex integrations
|
|
59
|
+
- [`permissions`](ccproxy/plugins/permissions/README.md): interactive approval
|
|
60
|
+
flow for privileged tool actions
|
|
61
|
+
- [`pricing`](ccproxy/plugins/pricing/README.md): caches model pricing data for
|
|
62
|
+
cost-aware features
|
|
63
|
+
- [`request_tracer`](ccproxy/plugins/request_tracer/README.md): detailed
|
|
64
|
+
request/response tracing for debugging
|
|
65
|
+
|
|
66
|
+
Shared helpers such as
|
|
67
|
+
[`claude_shared`](ccproxy/plugins/claude_shared/README.md) provide metadata
|
|
68
|
+
consumed by the Claude plugins. Each plugin directory contains its own README
|
|
69
|
+
with configuration examples.
|
|
70
|
+
|
|
71
|
+
## Quick Links
|
|
72
|
+
|
|
73
|
+
- Docs site entry: `docs/index.md`
|
|
74
|
+
- Getting started: `docs/getting-started/quickstart.md`
|
|
75
|
+
- Configuration reference: `docs/getting-started/configuration.md`
|
|
76
|
+
- Examples: `docs/examples.md`
|
|
77
|
+
- Migration (0.2): `docs/migration/0.2-plugin-first.md`
|
|
78
|
+
|
|
79
|
+
## Plugin Config Quickstart
|
|
80
|
+
|
|
81
|
+
The plugin system is enabled by default (`enable_plugins = true`), and all
|
|
82
|
+
discovered plugins load automatically when no additional filters are set. Use
|
|
83
|
+
these knobs to adjust what runs:
|
|
84
|
+
|
|
85
|
+
- `enabled_plugins`: optional allow list; when set, only the listed plugins run.
|
|
86
|
+
- `disabled_plugins`: optional block list applied when `enabled_plugins` is not
|
|
87
|
+
set.
|
|
88
|
+
- `plugins.<name>.enabled`: per-plugin flag (defaults to `true`) that you can
|
|
89
|
+
override in TOML or environment variables. Any plugin set to `false` is added
|
|
90
|
+
to the deny list alongside `disabled_plugins` during startup.
|
|
91
|
+
|
|
92
|
+
During startup we merge `disabled_plugins` and any `plugins.<name>.enabled = false`
|
|
93
|
+
entries into a single deny list. At runtime the loader checks the allow list
|
|
94
|
+
first and then confirms the plugin is not deny listed. Configure plugins under
|
|
95
|
+
`plugins.<name>` in TOML or via nested environment variables.
|
|
96
|
+
|
|
97
|
+
Use `ccproxy plugins list` to inspect discovered plugins and
|
|
98
|
+
`ccproxy plugins settings <name>` to review configuration fields.
|
|
99
|
+
|
|
100
|
+
### TOML example (`.ccproxy.toml`)
|
|
101
|
+
|
|
102
|
+
```toml
|
|
103
|
+
enable_plugins = true
|
|
104
|
+
# enabled_plugins = ["metrics", "analytics"] # Optional allow list
|
|
105
|
+
disabled_plugins = ["duckdb_storage"] # Optional block list
|
|
106
|
+
|
|
107
|
+
[plugins.access_log]
|
|
108
|
+
client_enabled = true
|
|
109
|
+
client_format = "structured"
|
|
110
|
+
client_log_file = "/tmp/ccproxy/access.log"
|
|
111
|
+
|
|
112
|
+
[plugins.request_tracer]
|
|
113
|
+
json_logs_enabled = true
|
|
114
|
+
raw_http_enabled = true
|
|
115
|
+
log_dir = "/tmp/ccproxy/traces"
|
|
116
|
+
|
|
117
|
+
[plugins.duckdb_storage]
|
|
118
|
+
enabled = false
|
|
119
|
+
|
|
120
|
+
[plugins.analytics]
|
|
121
|
+
enabled = true
|
|
122
|
+
|
|
123
|
+
# Metrics plugin
|
|
124
|
+
[plugins.metrics]
|
|
125
|
+
enabled = true
|
|
126
|
+
# pushgateway_enabled = true
|
|
127
|
+
# pushgateway_url = "http://localhost:9091"
|
|
128
|
+
# pushgateway_job = "ccproxy"
|
|
129
|
+
# pushgateway_push_interval = 60
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Environment variables (nested with `__`)
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
export DISABLED_PLUGINS="duckdb_storage" # Optional block list
|
|
136
|
+
export PLUGINS__ACCESS_LOG__ENABLED=true
|
|
137
|
+
export PLUGINS__ACCESS_LOG__CLIENT_ENABLED=true
|
|
138
|
+
export PLUGINS__ACCESS_LOG__CLIENT_FORMAT=structured
|
|
139
|
+
export PLUGINS__ACCESS_LOG__CLIENT_LOG_FILE=/tmp/ccproxy/access.log
|
|
140
|
+
|
|
141
|
+
export PLUGINS__REQUEST_TRACER__ENABLED=true
|
|
142
|
+
export PLUGINS__REQUEST_TRACER__JSON_LOGS_ENABLED=true
|
|
143
|
+
export PLUGINS__REQUEST_TRACER__RAW_HTTP_ENABLED=true
|
|
144
|
+
export PLUGINS__REQUEST_TRACER__LOG_DIR=/tmp/ccproxy/traces
|
|
145
|
+
|
|
146
|
+
export PLUGINS__DUCKDB_STORAGE__ENABLED=true
|
|
147
|
+
export PLUGINS__ANALYTICS__ENABLED=true
|
|
148
|
+
export PLUGINS__METRICS__ENABLED=true
|
|
149
|
+
# export PLUGINS__METRICS__PUSHGATEWAY_ENABLED=true
|
|
150
|
+
# export PLUGINS__METRICS__PUSHGATEWAY_URL=http://localhost:9091
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Running
|
|
154
|
+
|
|
155
|
+
To install the latest stable release without cloning the repository, use `uvx`
|
|
156
|
+
to grab the published wheel and launch the CLI:
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
uvx --with "ccproxy-api[all]" ccproxy serve --port 8000
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
If you prefer `pipx`, install the package (optionally with extras) and use the
|
|
163
|
+
local shim:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
pipx install "ccproxy-api[all]"
|
|
167
|
+
ccproxy serve # default on localhost:8000
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## License
|
|
171
|
+
|
|
172
|
+
See `LICENSE`.
|