coding-proxy 0.4.1a5__tar.gz → 0.4.1a6__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.
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/PKG-INFO +1 -1
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/pyproject.toml +1 -1
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/executor.py +67 -1
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/uv.lock +1 -1
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/.github/workflows/ci.yml +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/.github/workflows/coverage.yml +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/.github/workflows/release.yml +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/.gitignore +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/.pre-commit-config.yaml +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/AGENTS.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/CHANGELOG.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/CLAUDE.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/LICENSE +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/README.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/assets/dashboard-v0.4.0.png +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/assets/session-v0.4.0.png +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/agents/browser-validation.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/agents/issue.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/agents/knowledge-map.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/agents/reference-specifications.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/arch/config-reference.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/arch/convert.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/arch/design-patterns.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/arch/routing.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/arch/testing.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/arch/vendors.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/framework.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/guide/api-reference.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/guide/cli-reference.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/guide/dashboard.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/guide/monitoring.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/guide/quickstart.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/guide/vendors.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/ops/ci-cd.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/user-guide.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/zh-CN/README.md +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/__init__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/__init__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/__main__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/auth/__init__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/auth/providers/__init__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/auth/providers/base.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/auth/providers/github.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/auth/providers/google.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/auth/runtime.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/auth/store.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/cli/__init__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/cli/auth_commands.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/cli/banner.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/compat/__init__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/compat/canonical.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/compat/session_store.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/__init__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/auth_schema.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/config.default.yaml +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/loader.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/resiliency.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/routing.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/schema.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/server.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/session_policy.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/vendors.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/__init__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/anthropic_to_gemini.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/anthropic_to_openai.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/gemini_sse_adapter.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/gemini_to_anthropic.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/openai_to_anthropic.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/vendor_channels.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/logging/__init__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/logging/db.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/logging/formatters.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/logging/stats.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/model/__init__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/model/auth.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/model/compat.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/model/constants.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/model/pricing.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/model/token.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/model/vendor.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/__init__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/config.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/extractors/__init__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/extractors/anthropic.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/extractors/gemini.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/extractors/openai.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/handler.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/operation.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/routes.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/usage_registry.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/pricing.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/__init__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/circuit_breaker.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/error_classifier.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/model_mapper.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/quota_guard.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/rate_limit.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/retry.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/router.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/session_manager.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/session_policy.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/tier.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/usage_parser.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/usage_recorder.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/server/__init__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/server/app.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/server/dashboard.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/server/factory.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/server/responses.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/server/routes.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/streaming/__init__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/streaming/anthropic_compat.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/__init__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/alibaba.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/anthropic.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/antigravity.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/base.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/copilot.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/copilot_models.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/copilot_token_manager.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/copilot_urls.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/doubao.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/kimi.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/minimax.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/mixins.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/native_anthropic.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/token_manager.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/xiaomi.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/zhipu.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/__init__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/e2e/__init__.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/e2e/conftest.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/e2e/test_e2e_http.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/e2e/test_e2e_token.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/e2e/test_e2e_vendor.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_antigravity.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_app_routes.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_auto_login.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_banner.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_circuit_breaker.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_cli_usage.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_compat.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_config_init.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_config_loader.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_convert_request.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_convert_response.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_convert_sse.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_copilot.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_copilot_convert_request.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_copilot_convert_response.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_copilot_models.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_copilot_urls.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_currency.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_error_classifier.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_logging_dual_write.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_mixins.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_model_auth.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_model_compat.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_model_constants.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_model_mapper.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_model_pricing.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_model_token.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_model_vendor.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_native_api_base_url_override.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_native_api_extractors.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_native_api_handler.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_native_api_operation.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_native_api_routes.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_native_vendors.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_parse_usage.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_parse_usage_gemini.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_pricing.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_quota_guard.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_rate_limit.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_router_chain.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_router_executor.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_runtime_reauth.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_schema.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_session_aware.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_streaming_anthropic_compat.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_tier.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_tiers_config.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_time_range.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_token_logger.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_token_logger_native_columns.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_token_manager.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_types.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_vendor_channels.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_vendor_streaming.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_vendors.py +0 -0
- {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_zhipu.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coding-proxy
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.1a6
|
|
4
4
|
Summary: A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao...
|
|
5
5
|
Project-URL: Source Code, https://github.com/ThreeFish-AI/coding-proxy
|
|
6
6
|
Project-URL: User Guide, https://github.com/ThreeFish-AI/coding-proxy/blob/master/docs/user-guide.md
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "coding-proxy"
|
|
3
|
-
version = "0.4.
|
|
3
|
+
version = "0.4.1a6"
|
|
4
4
|
description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
@@ -48,6 +48,58 @@ from ..compat.canonical import CompatibilityStatus, build_canonical_request
|
|
|
48
48
|
logger = logging.getLogger(__name__)
|
|
49
49
|
|
|
50
50
|
|
|
51
|
+
def _build_semantic_rejection_diagnostic(body: dict[str, Any]) -> str:
|
|
52
|
+
"""构建语义拒绝的请求体诊断上下文.
|
|
53
|
+
|
|
54
|
+
在 semantic rejection 日志中附加请求体的可疑参数快照,
|
|
55
|
+
用于定位供应商参数校验失败的具体祸根参数。
|
|
56
|
+
"""
|
|
57
|
+
parts: list[str] = []
|
|
58
|
+
# 顶层不兼容参数
|
|
59
|
+
for key in ("thinking", "extended_thinking", "reasoning_effort"):
|
|
60
|
+
if key in body:
|
|
61
|
+
val = body[key]
|
|
62
|
+
parts.append(f"{key}={val!r:.80}")
|
|
63
|
+
# 会话历史中的 thinking blocks
|
|
64
|
+
thinking_count = 0
|
|
65
|
+
for msg in body.get("messages", []):
|
|
66
|
+
content = msg.get("content")
|
|
67
|
+
if not isinstance(content, list):
|
|
68
|
+
continue
|
|
69
|
+
for block in content:
|
|
70
|
+
if isinstance(block, dict) and block.get("type") in (
|
|
71
|
+
"thinking",
|
|
72
|
+
"redacted_thinking",
|
|
73
|
+
):
|
|
74
|
+
thinking_count += 1
|
|
75
|
+
if thinking_count:
|
|
76
|
+
parts.append(f"thinking_blocks_in_history={thinking_count}")
|
|
77
|
+
# cache_control 存在检测
|
|
78
|
+
has_cc = False
|
|
79
|
+
for section in (
|
|
80
|
+
body.get("system", []) if isinstance(body.get("system"), list) else [],
|
|
81
|
+
*(
|
|
82
|
+
m.get("content", [])
|
|
83
|
+
for m in body.get("messages", [])
|
|
84
|
+
if isinstance(m.get("content"), list)
|
|
85
|
+
),
|
|
86
|
+
body.get("tools", []),
|
|
87
|
+
):
|
|
88
|
+
if isinstance(section, list):
|
|
89
|
+
for item in section:
|
|
90
|
+
if isinstance(item, dict) and "cache_control" in item:
|
|
91
|
+
has_cc = True
|
|
92
|
+
break
|
|
93
|
+
if has_cc:
|
|
94
|
+
break
|
|
95
|
+
if has_cc:
|
|
96
|
+
parts.append("cache_control_fields=present")
|
|
97
|
+
# 模型 + 消息数
|
|
98
|
+
parts.append(f"model={body.get('model', 'N/A')}")
|
|
99
|
+
parts.append(f"messages={len(body.get('messages', []))}")
|
|
100
|
+
return f" [{', '.join(parts)}]" if parts else ""
|
|
101
|
+
|
|
102
|
+
|
|
51
103
|
def _log_http_error_detail(
|
|
52
104
|
tier_name: str,
|
|
53
105
|
exc: Exception,
|
|
@@ -601,12 +653,14 @@ class _RouteExecutor:
|
|
|
601
653
|
)
|
|
602
654
|
|
|
603
655
|
if not is_last and is_semantic:
|
|
656
|
+
diagnostic = _build_semantic_rejection_diagnostic(body)
|
|
604
657
|
logger.warning(
|
|
605
|
-
"Tier %s semantic rejection (type=%s, msg=%s), "
|
|
658
|
+
"Tier %s semantic rejection (type=%s, msg=%s)%s, "
|
|
606
659
|
"trying next tier without recording failure",
|
|
607
660
|
tier.name,
|
|
608
661
|
resp.error_type or resp.status_code,
|
|
609
662
|
(resp.error_message or "N/A")[:200],
|
|
663
|
+
diagnostic,
|
|
610
664
|
)
|
|
611
665
|
failed_tier_name = tier.name
|
|
612
666
|
continue
|
|
@@ -838,6 +892,18 @@ class _RouteExecutor:
|
|
|
838
892
|
)
|
|
839
893
|
|
|
840
894
|
if semantic_rejection and not is_last:
|
|
895
|
+
if request_body is not None:
|
|
896
|
+
diagnostic = _build_semantic_rejection_diagnostic(request_body)
|
|
897
|
+
logger.warning(
|
|
898
|
+
"Tier %s stream semantic rejection (type=%s, msg=%s)%s, "
|
|
899
|
+
"trying next tier without recording failure",
|
|
900
|
+
tier.name,
|
|
901
|
+
error.get("type") if isinstance(error, dict) else None,
|
|
902
|
+
(error.get("message") if isinstance(error, dict) else "N/A")[
|
|
903
|
+
:200
|
|
904
|
+
],
|
|
905
|
+
diagnostic,
|
|
906
|
+
)
|
|
841
907
|
return True, tier.name, exc
|
|
842
908
|
|
|
843
909
|
rl_info = parse_rate_limit_headers(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/anthropic_to_gemini.py
RENAMED
|
File without changes
|
{coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/anthropic_to_openai.py
RENAMED
|
File without changes
|
{coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/gemini_sse_adapter.py
RENAMED
|
File without changes
|
{coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/gemini_to_anthropic.py
RENAMED
|
File without changes
|
{coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/openai_to_anthropic.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/extractors/__init__.py
RENAMED
|
File without changes
|
{coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/extractors/anthropic.py
RENAMED
|
File without changes
|
{coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/extractors/gemini.py
RENAMED
|
File without changes
|
{coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/extractors/openai.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/streaming/anthropic_compat.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/copilot_token_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|