coding-proxy 0.5.1a5__tar.gz → 0.5.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.5.1a5 → coding_proxy-0.5.1a6}/PKG-INFO +1 -1
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/pyproject.toml +1 -1
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/executor.py +27 -4
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_router_executor.py +34 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/uv.lock +1 -1
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/.github/workflows/ci.yml +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/.github/workflows/coverage.yml +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/.github/workflows/release.yml +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/.gitignore +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/.pre-commit-config.yaml +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/AGENTS.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/CHANGELOG.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/CLAUDE.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/LICENSE +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/README.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/assets/dashboard-v0.4.0.png +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/assets/model-calling-v0.5.0.png +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/assets/session-v0.4.0.png +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/.agents/browser-validation.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/.agents/issue.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/.agents/knowledge-map.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/.agents/reference-specifications.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/arch/config-reference.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/arch/convert.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/arch/design-patterns.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/arch/routing.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/arch/testing.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/arch/vendors.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/framework.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/guide/api-reference.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/guide/cli-reference.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/guide/dashboard.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/guide/monitoring.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/guide/quickstart.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/guide/vendors.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/ops/ci-cd.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/user-guide.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/zh-CN/README.md +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/__init__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/__init__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/__main__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/auth/__init__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/auth/providers/__init__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/auth/providers/base.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/auth/providers/github.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/auth/providers/google.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/auth/runtime.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/auth/store.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/cli/__init__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/cli/auth_commands.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/cli/banner.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/compat/__init__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/compat/canonical.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/compat/session_store.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/__init__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/auth_schema.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/config.default.yaml +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/loader.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/resiliency.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/routing.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/schema.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/server.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/session_policy.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/vendors.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/convert/__init__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/convert/anthropic_to_gemini.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/convert/anthropic_to_openai.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/convert/gemini_sse_adapter.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/convert/gemini_to_anthropic.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/convert/openai_to_anthropic.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/convert/vendor_channels.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/logging/__init__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/logging/db.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/logging/formatters.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/logging/stats.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/model/__init__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/model/auth.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/model/compat.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/model/constants.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/model/pricing.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/model/token.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/model/vendor.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/__init__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/config.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/extractors/__init__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/extractors/anthropic.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/extractors/gemini.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/extractors/openai.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/handler.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/operation.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/routes.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/usage_registry.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/pricing.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/__init__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/circuit_breaker.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/error_classifier.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/model_mapper.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/quota_guard.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/rate_limit.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/retry.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/router.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/session_manager.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/session_policy.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/tier.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/usage_parser.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/usage_recorder.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/server/__init__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/server/app.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/server/dashboard.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/server/factory.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/server/responses.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/server/routes.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/streaming/__init__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/streaming/anthropic_compat.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/__init__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/alibaba.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/anthropic.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/antigravity.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/base.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/concurrency.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/copilot.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/copilot_models.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/copilot_token_manager.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/copilot_urls.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/doubao.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/kimi.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/minimax.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/mixins.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/native_anthropic.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/token_manager.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/xiaomi.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/zhipu.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/__init__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/e2e/__init__.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/e2e/conftest.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/e2e/test_e2e_http.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/e2e/test_e2e_token.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/e2e/test_e2e_vendor.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_antigravity.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_app_routes.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_auto_login.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_banner.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_circuit_breaker.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_cli_usage.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_compat.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_concurrency_monitor.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_config_init.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_config_loader.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_convert_request.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_convert_response.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_convert_sse.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_copilot.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_copilot_convert_request.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_copilot_convert_response.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_copilot_models.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_copilot_urls.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_currency.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_error_classifier.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_executor_in_flight_tracking.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_logging_dual_write.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_mixins.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_model_auth.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_model_compat.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_model_constants.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_model_mapper.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_model_pricing.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_model_token.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_model_vendor.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_native_api_base_url_override.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_native_api_extractors.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_native_api_handler.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_native_api_operation.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_native_api_routes.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_native_vendors.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_parse_usage.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_parse_usage_gemini.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_pricing.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_quota_guard.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_rate_limit.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_router_chain.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_runtime_reauth.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_schema.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_session_aware.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_streaming_anthropic_compat.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_tier.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_tiers_config.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_time_range.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_token_logger.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_token_logger_native_columns.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_token_manager.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_types.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_vendor_channels.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_vendor_streaming.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_vendors.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_zhipu.py +0 -0
- {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_zhipu_concurrency.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coding-proxy
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.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.5.
|
|
3
|
+
version = "0.5.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"
|
|
@@ -71,6 +71,11 @@ _NOISE_TAG_PATTERN = re.compile(
|
|
|
71
71
|
flags=re.DOTALL | re.IGNORECASE,
|
|
72
72
|
)
|
|
73
73
|
|
|
74
|
+
# <session> 标签需要特殊处理:当用户文本在 <session> 标签内部时,
|
|
75
|
+
# 完整块剥离会连同用户文本一起删除。此模式仅去除外壳标签(保留内容),
|
|
76
|
+
# 用于首轮完整剥离结果为空时的二次回退提取。
|
|
77
|
+
_SESSION_TAG_WRAPPER = re.compile(r"</?session\b[^>]*>", flags=re.IGNORECASE)
|
|
78
|
+
|
|
74
79
|
# Slash command 子标签:用于识别 /commit、/review 等命令式调用,
|
|
75
80
|
# 合成"命令 + 参数"式标题。
|
|
76
81
|
_CMD_NAME_PATTERN = re.compile(r"<command-name>(.*?)</command-name>", flags=re.DOTALL)
|
|
@@ -80,6 +85,9 @@ _CMD_WRAPPER_PATTERN = re.compile(
|
|
|
80
85
|
r"<command-[\w-]+>.*?</command-[\w-]+>", flags=re.DOTALL
|
|
81
86
|
)
|
|
82
87
|
|
|
88
|
+
# 空白折叠
|
|
89
|
+
_WHITESPACE_PATTERN = re.compile(r"\s+")
|
|
90
|
+
|
|
83
91
|
|
|
84
92
|
def _sanitize_user_text(raw: str) -> str:
|
|
85
93
|
"""剔除 Claude Code 注入的系统级 XML 块,还原真实用户输入。
|
|
@@ -88,8 +96,10 @@ def _sanitize_user_text(raw: str) -> str:
|
|
|
88
96
|
1. Slash command 优先识别 — 若检测到 <command-name>,合成"命令 + 参数"
|
|
89
97
|
式标题(因为残留文本通常为空,直接取标签内容更有意义)。
|
|
90
98
|
2. 通用噪声剥离 — 移除已知白名单内的 system-reminder 等标签。
|
|
91
|
-
3.
|
|
92
|
-
|
|
99
|
+
3. <session> 二次回退 — 若首轮剥离后为空,说明用户文本可能在 <session>
|
|
100
|
+
标签内部;此时仅去除外壳标签,保留内部文本再做噪声剥离。
|
|
101
|
+
4. 残留 command-* 包裹清除 — 兜底去除 command-message 等次要标签。
|
|
102
|
+
5. 前后空白归一化 — 折叠连续空白为单空格。
|
|
93
103
|
"""
|
|
94
104
|
if not raw:
|
|
95
105
|
return ""
|
|
@@ -107,9 +117,22 @@ def _sanitize_user_text(raw: str) -> str:
|
|
|
107
117
|
# 阶段二: 通用噪声剥离
|
|
108
118
|
cleaned = _NOISE_TAG_PATTERN.sub("", raw)
|
|
109
119
|
cleaned = _CMD_WRAPPER_PATTERN.sub("", cleaned)
|
|
120
|
+
cleaned = _WHITESPACE_PATTERN.sub(" ", cleaned).strip()
|
|
121
|
+
if cleaned:
|
|
122
|
+
return cleaned
|
|
123
|
+
|
|
124
|
+
# 阶段三: <session> 二次回退
|
|
125
|
+
# 当首轮全部剥离为空时,用户文本很可能被 <session> 标签完整包裹。
|
|
126
|
+
# 此时不去除 <session> 块,而是仅剥掉外壳标签,保留内部文本后重新剥离。
|
|
127
|
+
if "<session" in raw.lower():
|
|
128
|
+
inner = _SESSION_TAG_WRAPPER.sub("", raw)
|
|
129
|
+
cleaned = _NOISE_TAG_PATTERN.sub("", inner)
|
|
130
|
+
cleaned = _CMD_WRAPPER_PATTERN.sub("", cleaned)
|
|
131
|
+
cleaned = _WHITESPACE_PATTERN.sub(" ", cleaned).strip()
|
|
132
|
+
if cleaned:
|
|
133
|
+
return cleaned
|
|
110
134
|
|
|
111
|
-
|
|
112
|
-
return re.sub(r"\s+", " ", cleaned).strip()
|
|
135
|
+
return ""
|
|
113
136
|
|
|
114
137
|
|
|
115
138
|
# ── Session 标题提取: 多层级回退策略 ──────────────────────────────
|
|
@@ -2277,6 +2277,40 @@ class TestSanitizeUserText:
|
|
|
2277
2277
|
raw = "<thinking>\nline1\nline2\n</thinking>清理后文本"
|
|
2278
2278
|
assert _sanitize_user_text(raw) == "清理后文本"
|
|
2279
2279
|
|
|
2280
|
+
# ── <session> 标签包裹用户文本的二次回退 ──
|
|
2281
|
+
|
|
2282
|
+
def test_session_tag_wrapping_user_text(self):
|
|
2283
|
+
"""当 <session> 标签包裹用户文本时,二次回退应提取内部文本.
|
|
2284
|
+
|
|
2285
|
+
注: session 元数据可能残留在标题前部,但用户文本现在可见,
|
|
2286
|
+
远优于完全回退到 '[Session] model_name'.
|
|
2287
|
+
"""
|
|
2288
|
+
raw = "<session>session metadata\n用户真实提问内容</session>"
|
|
2289
|
+
result = _sanitize_user_text(raw)
|
|
2290
|
+
assert "用户真实提问内容" in result
|
|
2291
|
+
|
|
2292
|
+
def test_session_tag_wrapping_with_inner_noise(self):
|
|
2293
|
+
"""<session> 内部混合噪声标签时,二次回退应正确剥离噪声."""
|
|
2294
|
+
raw = (
|
|
2295
|
+
"<session>session_key: abc\n"
|
|
2296
|
+
"<system-reminder>噪声内容</system-reminder>"
|
|
2297
|
+
"用户真实输入"
|
|
2298
|
+
"</session>"
|
|
2299
|
+
)
|
|
2300
|
+
result = _sanitize_user_text(raw)
|
|
2301
|
+
assert "用户真实输入" in result
|
|
2302
|
+
assert "噪声内容" not in result
|
|
2303
|
+
|
|
2304
|
+
def test_session_tag_prefix_still_works(self):
|
|
2305
|
+
"""用户文本在 <session> 标签之后(原有行为)仍正确."""
|
|
2306
|
+
raw = "<session>metadata</session>用户文本在外部"
|
|
2307
|
+
assert _sanitize_user_text(raw) == "用户文本在外部"
|
|
2308
|
+
|
|
2309
|
+
def test_all_noise_inside_session_tag(self):
|
|
2310
|
+
"""<session> 内部全是噪声时,二次回退仍返回空."""
|
|
2311
|
+
raw = "<session><system-reminder>纯噪声</system-reminder></session>"
|
|
2312
|
+
assert _sanitize_user_text(raw) == ""
|
|
2313
|
+
|
|
2280
2314
|
|
|
2281
2315
|
class TestExtractSessionTitle:
|
|
2282
2316
|
"""``_extract_session_title`` — 端到端从 CanonicalRequest 抽取标题."""
|
|
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
|
{coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/convert/anthropic_to_gemini.py
RENAMED
|
File without changes
|
{coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/convert/anthropic_to_openai.py
RENAMED
|
File without changes
|
{coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/convert/gemini_sse_adapter.py
RENAMED
|
File without changes
|
{coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/convert/gemini_to_anthropic.py
RENAMED
|
File without changes
|
{coding_proxy-0.5.1a5 → coding_proxy-0.5.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.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/extractors/__init__.py
RENAMED
|
File without changes
|
{coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/extractors/anthropic.py
RENAMED
|
File without changes
|
{coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/extractors/gemini.py
RENAMED
|
File without changes
|
{coding_proxy-0.5.1a5 → coding_proxy-0.5.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.5.1a5 → coding_proxy-0.5.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
|
|
File without changes
|
{coding_proxy-0.5.1a5 → coding_proxy-0.5.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
|
|
File without changes
|
|
File without changes
|