ccproxy-api 0.2.4__tar.gz → 0.2.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/PKG-INFO +19 -19
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/_version.py +2 -2
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/factories.py +25 -1
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/anthropic_to_openai/_helpers.py +30 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/anthropic_to_openai/streams.py +6 -5
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/context.py +24 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/openai_to_openai/responses.py +6 -1
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/openai_to_openai/streams.py +17 -10
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/models/anthropic.py +9 -1
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/models/openai.py +12 -1
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_api/adapter.py +4 -5
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/codex/adapter.py +140 -27
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/codex/config.py +7 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/codex/detection_service.py +61 -6
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/codex/plugin.py +1 -0
- ccproxy_api-0.2.6/ccproxy/plugins/codex/routes.py +604 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/adapters/base.py +1 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/adapters/format_adapter.py +8 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/adapters/mock_adapter.py +59 -11
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/factories.py +18 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/mocking/mock_handler.py +227 -18
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/pyproject.toml +27 -27
- ccproxy_api-0.2.4/ccproxy/plugins/codex/routes.py +0 -129
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/.gitignore +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/LICENSE +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/__main__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/api/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/api/app.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/api/bootstrap.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/api/decorators.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/api/dependencies.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/api/format_validation.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/api/middleware/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/api/middleware/cors.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/api/middleware/errors.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/api/middleware/hooks.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/api/middleware/normalize_headers.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/api/middleware/request_id.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/api/middleware/streaming_hooks.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/api/routes/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/api/routes/health.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/api/routes/plugins.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/bearer.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/dependencies.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/exceptions.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/manager.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/managers/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/managers/base.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/managers/base_enhanced.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/managers/token_snapshot.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/models/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/models/base.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/models/credentials.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/oauth/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/oauth/base.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/oauth/cli_errors.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/oauth/flows.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/oauth/protocol.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/oauth/registry.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/oauth/router.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/oauth/routes.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/oauth/session.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/oauth/templates.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/storage/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/storage/base.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/auth/storage/generic.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/cli/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/cli/_settings_help.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/cli/commands/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/cli/commands/auth.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/cli/commands/config/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/cli/commands/config/commands.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/cli/commands/config/schema_commands.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/cli/commands/plugins.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/cli/commands/serve.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/cli/commands/status.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/cli/decorators.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/cli/helpers.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/cli/main.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/cli/options/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/cli/options/claude_options.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/cli/options/core_options.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/cli/options/security_options.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/cli/options/server_options.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/config/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/config/core.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/config/env_generator.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/config/runtime.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/config/security.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/config/settings.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/config/toml_generator.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/config/utils.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/async_task_manager.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/async_utils.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/auth/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/constants.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/errors.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/id_utils.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/interfaces.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/logging.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/middleware.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/cli_discovery.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/declaration.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/discovery.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/hooks/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/hooks/base.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/hooks/events.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/hooks/implementations/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/hooks/implementations/formatters/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/hooks/implementations/formatters/json.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/hooks/implementations/formatters/raw.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/hooks/implementations/http_tracer.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/hooks/layers.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/hooks/manager.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/hooks/registry.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/hooks/thread_manager.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/hooks/types.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/interfaces.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/loader.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/middleware.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/models.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/protocol.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/plugins/runtime.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/request_context.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/status_report.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/system.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/transformers.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/core/types.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/data/claude_headers_fallback.json +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/data/codex_headers_fallback.json +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/http/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/http/base.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/http/client.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/http/hooks.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/http/pool.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/anthropic_to_openai/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/anthropic_to_openai/errors.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/anthropic_to_openai/requests.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/anthropic_to_openai/responses.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/base.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/base_model.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/common/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/common/identifiers.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/common/streams.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/common/thinking.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/common/usage.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/constants.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/mapping.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/openai_to_anthropic/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/openai_to_anthropic/_helpers.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/openai_to_anthropic/errors.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/openai_to_anthropic/requests.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/openai_to_anthropic/responses.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/openai_to_anthropic/streams.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/openai_to_openai/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/openai_to_openai/_helpers.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/openai_to_openai/errors.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/openai_to_openai/requests.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/utils.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/models/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/streaming/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/streaming/accumulators.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/streaming/formatters.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/streaming/processors.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/models/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/models/detection.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/models/provider.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/access_log/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/access_log/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/access_log/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/access_log/formatter.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/access_log/hook.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/access_log/logger.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/access_log/plugin.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/access_log/writer.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/analytics/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/analytics/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/analytics/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/analytics/ingest.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/analytics/models.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/analytics/plugin.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/analytics/routes.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/analytics/service.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_api/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_api/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_api/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_api/detection_service.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_api/health.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_api/hooks.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_api/models.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_api/plugin.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_api/routes.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_api/streaming_metrics.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_api/tasks.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/adapter.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/auth.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/client.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/converter.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/detection_service.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/exceptions.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/handler.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/health.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/hooks.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/manager.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/message_queue.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/models.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/options.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/parser.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/plugin.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/routes.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/session_client.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/session_pool.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/stream_handle.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/stream_worker.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/streaming.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_sdk/tasks.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_shared/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_shared/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/claude_shared/model_defaults.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/codex/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/codex/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/codex/health.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/codex/hooks.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/codex/model_defaults.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/codex/models.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/codex/streaming_metrics.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/codex/tasks.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/codex/utils/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/codex/utils/sse_parser.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/command_replay/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/command_replay/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/command_replay/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/command_replay/formatter.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/command_replay/hook.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/command_replay/plugin.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/copilot/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/copilot/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/copilot/adapter.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/copilot/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/copilot/data/copilot_fallback.json +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/copilot/detection_service.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/copilot/manager.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/copilot/model_defaults.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/copilot/models.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/copilot/oauth/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/copilot/oauth/client.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/copilot/oauth/models.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/copilot/oauth/provider.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/copilot/oauth/storage.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/copilot/plugin.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/copilot/routes.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/credential_balancer/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/credential_balancer/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/credential_balancer/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/credential_balancer/factory.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/credential_balancer/hook.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/credential_balancer/manager.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/credential_balancer/plugin.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/dashboard/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/dashboard/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/dashboard/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/dashboard/plugin.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/dashboard/routes.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/docker/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/docker/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/docker/adapter.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/docker/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/docker/docker_path.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/docker/middleware.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/docker/models.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/docker/plugin.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/docker/protocol.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/docker/stream_process.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/docker/validators.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/duckdb_storage/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/duckdb_storage/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/duckdb_storage/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/duckdb_storage/plugin.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/duckdb_storage/routes.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/duckdb_storage/storage.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/max_tokens/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/max_tokens/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/max_tokens/adapter.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/max_tokens/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/max_tokens/models.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/max_tokens/plugin.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/max_tokens/service.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/max_tokens/token_limits.json +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/metrics/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/metrics/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/metrics/collector.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/metrics/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/metrics/grafana/dashboards/ccproxy-dashboard.json +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/metrics/hook.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/metrics/plugin.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/metrics/pushgateway.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/metrics/routes.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/metrics/tasks.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/oauth_claude/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/oauth_claude/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/oauth_claude/client.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/oauth_claude/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/oauth_claude/manager.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/oauth_claude/models.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/oauth_claude/plugin.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/oauth_claude/provider.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/oauth_claude/storage.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/oauth_codex/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/oauth_codex/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/oauth_codex/client.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/oauth_codex/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/oauth_codex/manager.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/oauth_codex/models.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/oauth_codex/plugin.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/oauth_codex/provider.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/oauth_codex/storage.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/permissions/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/permissions/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/permissions/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/permissions/handlers/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/permissions/handlers/cli.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/permissions/handlers/protocol.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/permissions/handlers/terminal.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/permissions/mcp.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/permissions/models.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/permissions/plugin.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/permissions/routes.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/permissions/service.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/permissions/ui/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/permissions/ui/permission_handler_protocol.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/permissions/ui/terminal_permission_handler.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/pricing/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/pricing/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/pricing/cache.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/pricing/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/pricing/exceptions.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/pricing/loader.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/pricing/models.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/pricing/plugin.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/pricing/service.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/pricing/tasks.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/pricing/updater.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/pricing/utils.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/request_tracer/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/request_tracer/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/request_tracer/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/request_tracer/hook.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/plugins/request_tracer/plugin.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/scheduler/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/scheduler/core.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/scheduler/errors.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/scheduler/manager.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/scheduler/registry.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/scheduler/tasks.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/adapters/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/adapters/chain_composer.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/adapters/chain_validation.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/adapters/chat_accumulator.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/adapters/delta_utils.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/adapters/format_context.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/adapters/format_registry.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/adapters/http_adapter.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/adapters/protocols.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/adapters/simple_converters.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/auth_registry.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/cache/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/cache/response_cache.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/cli_detection.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/config/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/config/proxy_configuration.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/container.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/handler_config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/interfaces.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/mocking/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/tracing/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/tracing/interfaces.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/services/tracing/null_tracer.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/streaming/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/streaming/buffer.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/streaming/deferred.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/streaming/handler.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/streaming/interfaces.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/streaming/simple_adapter.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/streaming/sse.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/streaming/sse_parser.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/templates/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/templates/plugin_scaffold.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/testing/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/testing/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/testing/content_generation.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/testing/endpoints/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/testing/endpoints/cli.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/testing/endpoints/config.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/testing/endpoints/console.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/testing/endpoints/models.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/testing/endpoints/runner.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/testing/endpoints/tools.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/testing/mock_responses.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/testing/response_handlers.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/testing/scenarios.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/utils/__init__.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/utils/binary_resolver.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/utils/caching.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/utils/cli_logging.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/utils/command_line.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/utils/headers.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/utils/id_generator.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/utils/model_mapper.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/utils/startup_helpers.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/utils/version_checker.py +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/examples/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/tests/factories/README.md +0 -0
- {ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/tests/fixtures/README.md +0 -0
|
@@ -1,42 +1,42 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ccproxy-api
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.6
|
|
4
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
5
|
License-File: LICENSE
|
|
6
6
|
Requires-Python: >=3.11
|
|
7
|
-
Requires-Dist: aiofiles>=
|
|
8
|
-
Requires-Dist: fastapi[standard]>=0.
|
|
7
|
+
Requires-Dist: aiofiles>=25.1.0
|
|
8
|
+
Requires-Dist: fastapi[standard]>=0.119.0
|
|
9
9
|
Requires-Dist: httpx[http2]>=0.28.1
|
|
10
10
|
Requires-Dist: packaging>=25.0
|
|
11
|
-
Requires-Dist: pydantic-settings>=2.
|
|
12
|
-
Requires-Dist: pydantic>=2.
|
|
11
|
+
Requires-Dist: pydantic-settings>=2.11.0
|
|
12
|
+
Requires-Dist: pydantic>=2.12.2
|
|
13
13
|
Requires-Dist: pyjwt>=2.10.1
|
|
14
|
-
Requires-Dist: rich-toolkit>=0.
|
|
15
|
-
Requires-Dist: rich>=
|
|
14
|
+
Requires-Dist: rich-toolkit>=0.15.1
|
|
15
|
+
Requires-Dist: rich>=14.2.0
|
|
16
16
|
Requires-Dist: sortedcontainers>=2.4.0
|
|
17
17
|
Requires-Dist: structlog>=25.4.0
|
|
18
|
-
Requires-Dist: typer>=0.
|
|
19
|
-
Requires-Dist: typing-extensions>=4.
|
|
20
|
-
Requires-Dist: uvicorn>=0.
|
|
18
|
+
Requires-Dist: typer>=0.19.2
|
|
19
|
+
Requires-Dist: typing-extensions>=4.15.0
|
|
20
|
+
Requires-Dist: uvicorn>=0.37.0
|
|
21
21
|
Provides-Extra: plugins-claude
|
|
22
|
-
Requires-Dist: claude-agent-sdk>=0.1.
|
|
23
|
-
Requires-Dist: keyring>=25.
|
|
22
|
+
Requires-Dist: claude-agent-sdk>=0.1.4; extra == 'plugins-claude'
|
|
23
|
+
Requires-Dist: keyring>=25.7.0; extra == 'plugins-claude'
|
|
24
24
|
Requires-Dist: qrcode>=8.2; extra == 'plugins-claude'
|
|
25
25
|
Provides-Extra: plugins-codex
|
|
26
26
|
Requires-Dist: pyjwt>=2.10.1; extra == 'plugins-codex'
|
|
27
27
|
Requires-Dist: qrcode>=8.2; extra == 'plugins-codex'
|
|
28
28
|
Provides-Extra: plugins-mcp
|
|
29
|
-
Requires-Dist: fastapi-mcp>=0.
|
|
29
|
+
Requires-Dist: fastapi-mcp>=0.4.0; extra == 'plugins-mcp'
|
|
30
30
|
Provides-Extra: plugins-metrics
|
|
31
|
-
Requires-Dist: prometheus-client>=0.
|
|
31
|
+
Requires-Dist: prometheus-client>=0.23.1; extra == 'plugins-metrics'
|
|
32
32
|
Provides-Extra: plugins-storage
|
|
33
33
|
Requires-Dist: duckdb-engine>=0.17.0; extra == 'plugins-storage'
|
|
34
|
-
Requires-Dist: duckdb
|
|
35
|
-
Requires-Dist: sqlalchemy>=2.0.
|
|
36
|
-
Requires-Dist: sqlmodel>=0.0.
|
|
34
|
+
Requires-Dist: duckdb>=1.3.2; extra == 'plugins-storage'
|
|
35
|
+
Requires-Dist: sqlalchemy>=2.0.44; extra == 'plugins-storage'
|
|
36
|
+
Requires-Dist: sqlmodel>=0.0.27; extra == 'plugins-storage'
|
|
37
37
|
Provides-Extra: plugins-tui
|
|
38
|
-
Requires-Dist: aioconsole>=0.8.
|
|
39
|
-
Requires-Dist: textual>=3.
|
|
38
|
+
Requires-Dist: aioconsole>=0.8.2; extra == 'plugins-tui'
|
|
39
|
+
Requires-Dist: textual>=6.3.0; extra == 'plugins-tui'
|
|
40
40
|
Description-Content-Type: text/markdown
|
|
41
41
|
|
|
42
42
|
# CCProxy API Server
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '0.2.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 2,
|
|
31
|
+
__version__ = version = '0.2.6'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 2, 6)
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -14,6 +14,7 @@ from fastapi import APIRouter
|
|
|
14
14
|
from ccproxy.models.provider import ProviderConfig
|
|
15
15
|
from ccproxy.services.adapters.base import BaseAdapter
|
|
16
16
|
from ccproxy.services.adapters.http_adapter import BaseHTTPAdapter
|
|
17
|
+
from ccproxy.services.adapters.mock_adapter import MockAdapter
|
|
17
18
|
from ccproxy.services.interfaces import (
|
|
18
19
|
IMetricsCollector,
|
|
19
20
|
IRequestTracer,
|
|
@@ -104,6 +105,7 @@ class BaseProviderPluginFactory(ProviderPluginFactory):
|
|
|
104
105
|
cli_commands: list[CliCommandSpec] = []
|
|
105
106
|
cli_arguments: list[CliArgumentSpec] = []
|
|
106
107
|
tool_accumulator_class: type | None = None
|
|
108
|
+
use_mock_adapter_in_bypass_mode: bool = True
|
|
107
109
|
|
|
108
110
|
def __init__(self) -> None:
|
|
109
111
|
"""Initialize factory with manifest built from class attributes."""
|
|
@@ -215,6 +217,24 @@ class BaseProviderPluginFactory(ProviderPluginFactory):
|
|
|
215
217
|
Returns:
|
|
216
218
|
Adapter instance
|
|
217
219
|
"""
|
|
220
|
+
settings = context.get("settings")
|
|
221
|
+
service_container = context.get("service_container")
|
|
222
|
+
if settings and getattr(settings.server, "bypass_mode", False):
|
|
223
|
+
if not service_container:
|
|
224
|
+
raise RuntimeError(
|
|
225
|
+
f"Cannot initialize plugin '{self.plugin_name}' in bypass mode: "
|
|
226
|
+
"service container is required to create mock adapter. "
|
|
227
|
+
"This is likely a configuration issue."
|
|
228
|
+
)
|
|
229
|
+
logger.warning(
|
|
230
|
+
"plugin_bypass_mode_enabled",
|
|
231
|
+
plugin=self.plugin_name,
|
|
232
|
+
adapter=self.adapter_class.__name__,
|
|
233
|
+
category="lifecycle",
|
|
234
|
+
)
|
|
235
|
+
if self.use_mock_adapter_in_bypass_mode:
|
|
236
|
+
return MockAdapter(service_container.get_mock_handler())
|
|
237
|
+
|
|
218
238
|
# Extract services from context (one-time extraction)
|
|
219
239
|
http_pool_manager: HTTPPoolManager | None = cast(
|
|
220
240
|
"HTTPPoolManager | None", context.get("http_pool_manager")
|
|
@@ -232,7 +252,6 @@ class BaseProviderPluginFactory(ProviderPluginFactory):
|
|
|
232
252
|
config = context.get("config")
|
|
233
253
|
|
|
234
254
|
# Get all adapter dependencies from service container
|
|
235
|
-
service_container = context.get("service_container")
|
|
236
255
|
if not service_container:
|
|
237
256
|
raise RuntimeError("Service container is required for adapter services")
|
|
238
257
|
|
|
@@ -268,6 +287,8 @@ class BaseProviderPluginFactory(ProviderPluginFactory):
|
|
|
268
287
|
if hasattr(context, "get")
|
|
269
288
|
else None,
|
|
270
289
|
}
|
|
290
|
+
if settings and getattr(settings.server, "bypass_mode", False):
|
|
291
|
+
adapter_kwargs["mock_handler"] = service_container.get_mock_handler()
|
|
271
292
|
if self.tool_accumulator_class:
|
|
272
293
|
adapter_kwargs["tool_accumulator_class"] = self.tool_accumulator_class
|
|
273
294
|
|
|
@@ -303,6 +324,9 @@ class BaseProviderPluginFactory(ProviderPluginFactory):
|
|
|
303
324
|
"model_mapper": context.get("model_mapper")
|
|
304
325
|
if hasattr(context, "get")
|
|
305
326
|
else None,
|
|
327
|
+
"mock_handler": service_container.get_mock_handler()
|
|
328
|
+
if settings and getattr(settings.server, "bypass_mode", False)
|
|
329
|
+
else None,
|
|
306
330
|
}
|
|
307
331
|
if self.tool_accumulator_class:
|
|
308
332
|
non_http_adapter_kwargs["tool_accumulator_class"] = (
|
{ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/anthropic_to_openai/_helpers.py
RENAMED
|
@@ -42,3 +42,33 @@ def build_openai_tool_call(
|
|
|
42
42
|
arguments=str(args_str),
|
|
43
43
|
),
|
|
44
44
|
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def build_openai_tool_call_chunk(
|
|
48
|
+
*,
|
|
49
|
+
index: int,
|
|
50
|
+
tool_id: str | None,
|
|
51
|
+
tool_name: str | None,
|
|
52
|
+
tool_input: Any,
|
|
53
|
+
arguments: Any = None,
|
|
54
|
+
fallback_index: int = 0,
|
|
55
|
+
) -> openai_models.ToolCallChunk:
|
|
56
|
+
args_str = (
|
|
57
|
+
arguments
|
|
58
|
+
if isinstance(arguments, str) and arguments
|
|
59
|
+
else serialize_tool_arguments(tool_input)
|
|
60
|
+
)
|
|
61
|
+
call_id = (
|
|
62
|
+
tool_id if isinstance(tool_id, str) and tool_id else f"call_{fallback_index}"
|
|
63
|
+
)
|
|
64
|
+
name = tool_name if isinstance(tool_name, str) and tool_name else "function"
|
|
65
|
+
|
|
66
|
+
return openai_models.ToolCallChunk(
|
|
67
|
+
index=index,
|
|
68
|
+
id=str(call_id),
|
|
69
|
+
type="function",
|
|
70
|
+
function=openai_models.FunctionCall(
|
|
71
|
+
name=str(name),
|
|
72
|
+
arguments=str(args_str),
|
|
73
|
+
),
|
|
74
|
+
)
|
{ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/anthropic_to_openai/streams.py
RENAMED
|
@@ -27,7 +27,7 @@ from ccproxy.llms.models import anthropic as anthropic_models
|
|
|
27
27
|
from ccproxy.llms.models import openai as openai_models
|
|
28
28
|
from ccproxy.llms.streaming.accumulators import ClaudeAccumulator
|
|
29
29
|
|
|
30
|
-
from ._helpers import
|
|
30
|
+
from ._helpers import build_openai_tool_call_chunk
|
|
31
31
|
from .requests import _build_responses_payload_from_anthropic_request
|
|
32
32
|
from .responses import convert__anthropic_usage_to_openai_responses__usage
|
|
33
33
|
|
|
@@ -88,10 +88,10 @@ def _anthropic_delta_to_text(
|
|
|
88
88
|
return None
|
|
89
89
|
|
|
90
90
|
|
|
91
|
-
def
|
|
91
|
+
def _build_openai_tool_call_chunk(
|
|
92
92
|
accumulator: ClaudeAccumulator,
|
|
93
93
|
block_index: int,
|
|
94
|
-
) -> openai_models.
|
|
94
|
+
) -> openai_models.ToolCallChunk | None:
|
|
95
95
|
for tool_call in accumulator.get_complete_tool_calls():
|
|
96
96
|
if tool_call.get("index") != block_index:
|
|
97
97
|
continue
|
|
@@ -102,7 +102,8 @@ def _build_openai_tool_call(
|
|
|
102
102
|
tool_name = function_payload.get("name") or tool_call.get("name")
|
|
103
103
|
arguments = function_payload.get("arguments")
|
|
104
104
|
|
|
105
|
-
return
|
|
105
|
+
return build_openai_tool_call_chunk(
|
|
106
|
+
index=tool_call.get("index", block_index),
|
|
106
107
|
tool_id=tool_call.get("id"),
|
|
107
108
|
tool_name=tool_name,
|
|
108
109
|
tool_input=tool_call.get("input", {}),
|
|
@@ -1413,7 +1414,7 @@ class AnthropicToOpenAIChatStreamAdapter:
|
|
|
1413
1414
|
continue
|
|
1414
1415
|
if block_index in emitted_tool_indices:
|
|
1415
1416
|
continue
|
|
1416
|
-
tool_call =
|
|
1417
|
+
tool_call = _build_openai_tool_call_chunk(accumulator, block_index)
|
|
1417
1418
|
if tool_call is None:
|
|
1418
1419
|
continue
|
|
1419
1420
|
emitted_tool_indices.add(block_index)
|
|
@@ -11,6 +11,9 @@ _INSTRUCTIONS_VAR: ContextVar[str | None] = ContextVar(
|
|
|
11
11
|
"formatter_instructions", default=None
|
|
12
12
|
)
|
|
13
13
|
_TOOLS_VAR: ContextVar[list[Any] | None] = ContextVar("formatter_tools", default=None)
|
|
14
|
+
_OPENAI_THINKING_XML_VAR: ContextVar[bool | None] = ContextVar(
|
|
15
|
+
"formatter_openai_thinking_xml", default=None
|
|
16
|
+
)
|
|
14
17
|
|
|
15
18
|
|
|
16
19
|
def register_request(request: Any | None, instructions: str | None = None) -> None:
|
|
@@ -114,3 +117,24 @@ def get_last_request_tools() -> list[Any] | None:
|
|
|
114
117
|
|
|
115
118
|
cached = _TOOLS_VAR.get()
|
|
116
119
|
return list(cached) if cached else None
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def register_openai_thinking_xml(enabled: bool | None) -> None:
|
|
123
|
+
"""Cache OpenAI thinking serialization preference for active conversions.
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
enabled: Whether thinking blocks should be serialized with XML wrappers.
|
|
127
|
+
``None`` means downstream conversion logic should use its default.
|
|
128
|
+
|
|
129
|
+
Note:
|
|
130
|
+
The value is stored in a ``ContextVar``, so concurrent async requests
|
|
131
|
+
keep independent preferences without leaking into each other.
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
_OPENAI_THINKING_XML_VAR.set(enabled)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def get_openai_thinking_xml() -> bool | None:
|
|
138
|
+
"""Return the OpenAI thinking serialization preference for active conversions."""
|
|
139
|
+
|
|
140
|
+
return _OPENAI_THINKING_XML_VAR.get()
|
{ccproxy_api-0.2.4 → ccproxy_api-0.2.6}/ccproxy/llms/formatters/openai_to_openai/responses.py
RENAMED
|
@@ -15,6 +15,7 @@ from ccproxy.llms.formatters.common import (
|
|
|
15
15
|
convert_openai_responses_usage_to_completion_usage,
|
|
16
16
|
merge_thinking_segments,
|
|
17
17
|
)
|
|
18
|
+
from ccproxy.llms.formatters.context import get_openai_thinking_xml
|
|
18
19
|
from ccproxy.llms.models import openai as openai_models
|
|
19
20
|
|
|
20
21
|
from ._helpers import (
|
|
@@ -333,6 +334,10 @@ def convert__openai_responses_to_openai_chat__response(
|
|
|
333
334
|
response: openai_models.ResponseObject,
|
|
334
335
|
) -> openai_models.ChatCompletionResponse:
|
|
335
336
|
"""Convert an OpenAI ResponseObject to a ChatCompletionResponse."""
|
|
337
|
+
include_thinking = get_openai_thinking_xml()
|
|
338
|
+
if include_thinking is None:
|
|
339
|
+
include_thinking = True
|
|
340
|
+
|
|
336
341
|
text_segments: list[str] = []
|
|
337
342
|
added_reasoning: set[tuple[str, str]] = set()
|
|
338
343
|
tool_calls: list[openai_models.ToolCall] = []
|
|
@@ -353,7 +358,7 @@ def convert__openai_responses_to_openai_chat__response(
|
|
|
353
358
|
if thinking_text and len(thinking_text) > 30
|
|
354
359
|
else thinking_text,
|
|
355
360
|
)
|
|
356
|
-
if thinking_text:
|
|
361
|
+
if include_thinking and thinking_text:
|
|
357
362
|
key = (signature or "", thinking_text)
|
|
358
363
|
if key not in added_reasoning:
|
|
359
364
|
text_segments.append(_wrap_thinking(signature, thinking_text))
|
|
@@ -27,16 +27,14 @@ from ccproxy.llms.formatters.context import (
|
|
|
27
27
|
get_last_instructions,
|
|
28
28
|
get_last_request,
|
|
29
29
|
get_last_request_tools,
|
|
30
|
+
get_openai_thinking_xml,
|
|
30
31
|
register_request,
|
|
31
32
|
register_request_tools,
|
|
32
33
|
)
|
|
33
34
|
from ccproxy.llms.models import openai as openai_models
|
|
34
35
|
from ccproxy.llms.streaming.accumulators import OpenAIAccumulator
|
|
35
36
|
|
|
36
|
-
from ._helpers import
|
|
37
|
-
_convert_tools_chat_to_responses,
|
|
38
|
-
_get_attr,
|
|
39
|
-
)
|
|
37
|
+
from ._helpers import _convert_tools_chat_to_responses, _get_attr
|
|
40
38
|
from .requests import _build_responses_payload_from_chat_request
|
|
41
39
|
from .responses import (
|
|
42
40
|
_collect_reasoning_segments,
|
|
@@ -61,6 +59,10 @@ class OpenAIResponsesToChatStreamAdapter:
|
|
|
61
59
|
async def generator() -> AsyncGenerator[
|
|
62
60
|
openai_models.ChatCompletionChunk, None
|
|
63
61
|
]:
|
|
62
|
+
include_thinking = get_openai_thinking_xml()
|
|
63
|
+
if include_thinking is None:
|
|
64
|
+
include_thinking = True
|
|
65
|
+
|
|
64
66
|
model_id = ""
|
|
65
67
|
role_sent = False
|
|
66
68
|
|
|
@@ -387,7 +389,8 @@ class OpenAIResponsesToChatStreamAdapter:
|
|
|
387
389
|
|
|
388
390
|
# Emit initial tool call chunk to surface id/name information
|
|
389
391
|
if not state.initial_emitted:
|
|
390
|
-
tool_call = openai_models.
|
|
392
|
+
tool_call = openai_models.ToolCallChunk(
|
|
393
|
+
index=state.index,
|
|
391
394
|
id=state.id,
|
|
392
395
|
type="function",
|
|
393
396
|
function=openai_models.FunctionCall(
|
|
@@ -440,7 +443,8 @@ class OpenAIResponsesToChatStreamAdapter:
|
|
|
440
443
|
state.name = guessed
|
|
441
444
|
|
|
442
445
|
if state.initial_emitted:
|
|
443
|
-
tool_call = openai_models.
|
|
446
|
+
tool_call = openai_models.ToolCallChunk(
|
|
447
|
+
index=state.index,
|
|
444
448
|
id=state.id,
|
|
445
449
|
type="function",
|
|
446
450
|
function=openai_models.FunctionCall(
|
|
@@ -492,7 +496,8 @@ class OpenAIResponsesToChatStreamAdapter:
|
|
|
492
496
|
if guessed:
|
|
493
497
|
state.name = guessed
|
|
494
498
|
|
|
495
|
-
tool_call = openai_models.
|
|
499
|
+
tool_call = openai_models.ToolCallChunk(
|
|
500
|
+
index=state.index,
|
|
496
501
|
id=state.id,
|
|
497
502
|
type="function",
|
|
498
503
|
function=openai_models.FunctionCall(
|
|
@@ -537,7 +542,7 @@ class OpenAIResponsesToChatStreamAdapter:
|
|
|
537
542
|
for entry in summary_list:
|
|
538
543
|
text = _get_attr(entry, "text")
|
|
539
544
|
signature = _get_attr(entry, "signature")
|
|
540
|
-
if isinstance(text, str) and text:
|
|
545
|
+
if include_thinking and isinstance(text, str) and text:
|
|
541
546
|
chunk_text = _wrap_thinking(signature, text)
|
|
542
547
|
sequence_counter += 1
|
|
543
548
|
yield openai_models.ChatCompletionChunk(
|
|
@@ -584,7 +589,8 @@ class OpenAIResponsesToChatStreamAdapter:
|
|
|
584
589
|
if guessed:
|
|
585
590
|
state.name = guessed
|
|
586
591
|
if not state.arguments_emitted:
|
|
587
|
-
tool_call = openai_models.
|
|
592
|
+
tool_call = openai_models.ToolCallChunk(
|
|
593
|
+
index=state.index,
|
|
588
594
|
id=state.id,
|
|
589
595
|
type="function",
|
|
590
596
|
function=openai_models.FunctionCall(
|
|
@@ -614,7 +620,8 @@ class OpenAIResponsesToChatStreamAdapter:
|
|
|
614
620
|
|
|
615
621
|
# Emit a patch chunk if the name was never surfaced earlier
|
|
616
622
|
if state.name and not state.name_emitted:
|
|
617
|
-
tool_call = openai_models.
|
|
623
|
+
tool_call = openai_models.ToolCallChunk(
|
|
624
|
+
index=state.index,
|
|
618
625
|
id=state.id,
|
|
619
626
|
type="function",
|
|
620
627
|
function=openai_models.FunctionCall(
|
|
@@ -352,8 +352,16 @@ class ThinkingConfigDisabled(ThinkingConfigBase):
|
|
|
352
352
|
type: Literal["disabled"] = Field(default="disabled", alias="type")
|
|
353
353
|
|
|
354
354
|
|
|
355
|
+
class ThinkingConfigAdaptive(ThinkingConfigBase):
|
|
356
|
+
"""Configuration for adaptive thinking (Claude 4-6+)."""
|
|
357
|
+
|
|
358
|
+
type: Literal["adaptive"] = Field(default="adaptive", alias="type")
|
|
359
|
+
display: Literal["summarized", "omitted"] | None = None
|
|
360
|
+
|
|
361
|
+
|
|
355
362
|
ThinkingConfig = Annotated[
|
|
356
|
-
ThinkingConfigEnabled | ThinkingConfigDisabled,
|
|
363
|
+
ThinkingConfigEnabled | ThinkingConfigDisabled | ThinkingConfigAdaptive,
|
|
364
|
+
Field(discriminator="type"),
|
|
357
365
|
]
|
|
358
366
|
|
|
359
367
|
|
|
@@ -185,11 +185,22 @@ class FunctionCall(LlmBaseModel):
|
|
|
185
185
|
|
|
186
186
|
|
|
187
187
|
class ToolCall(LlmBaseModel):
|
|
188
|
+
"""Non-streaming tool call (ChatCompletionMessageToolCall)."""
|
|
189
|
+
|
|
188
190
|
id: str
|
|
189
191
|
type: Literal["function"] = Field(default="function")
|
|
190
192
|
function: FunctionCall
|
|
191
193
|
|
|
192
194
|
|
|
195
|
+
class ToolCallChunk(LlmBaseModel):
|
|
196
|
+
"""Streaming tool call delta (ChoiceDeltaToolCall)."""
|
|
197
|
+
|
|
198
|
+
index: int
|
|
199
|
+
id: str | None = None
|
|
200
|
+
type: Literal["function"] | None = None
|
|
201
|
+
function: FunctionCall | None = None
|
|
202
|
+
|
|
203
|
+
|
|
193
204
|
class ChatMessage(LlmBaseModel):
|
|
194
205
|
"""
|
|
195
206
|
A message within a chat conversation.
|
|
@@ -309,7 +320,7 @@ class ChatCompletionResponse(LlmBaseModel):
|
|
|
309
320
|
class DeltaMessage(LlmBaseModel):
|
|
310
321
|
role: Literal["assistant"] | None = None
|
|
311
322
|
content: str | list[Any] | None = None
|
|
312
|
-
tool_calls: list[
|
|
323
|
+
tool_calls: list[ToolCallChunk] | None = None
|
|
313
324
|
audio: dict[str, Any] | None = None
|
|
314
325
|
reasoning: ResponseMessageReasoning | None = None
|
|
315
326
|
|
|
@@ -85,15 +85,14 @@ class ClaudeAPIAdapter(BaseHTTPAdapter):
|
|
|
85
85
|
# Always set Authorization from OAuth-managed access token
|
|
86
86
|
filtered_headers["authorization"] = f"Bearer {token_value}"
|
|
87
87
|
|
|
88
|
-
#
|
|
89
|
-
# These are required for browser automation tools to work
|
|
88
|
+
# Minimal beta tags required for OAuth-based Claude Code auth
|
|
90
89
|
filtered_headers["anthropic-version"] = "2023-06-01"
|
|
91
|
-
filtered_headers["anthropic-beta"] = "
|
|
90
|
+
filtered_headers["anthropic-beta"] = "claude-code-20250219,oauth-2025-04-20"
|
|
92
91
|
|
|
93
|
-
# Add CLI headers if available, but never allow overriding auth
|
|
92
|
+
# Add CLI headers if available, but never allow overriding auth or beta
|
|
94
93
|
cli_headers = self._collect_cli_headers()
|
|
95
94
|
if cli_headers:
|
|
96
|
-
blocked_overrides = {"authorization", "x-api-key"}
|
|
95
|
+
blocked_overrides = {"authorization", "x-api-key", "anthropic-beta"}
|
|
97
96
|
for key, value in cli_headers.items():
|
|
98
97
|
lk = key.lower()
|
|
99
98
|
if lk in blocked_overrides:
|