coding-proxy 0.2.4a5__tar.gz → 0.3.0a2__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.2.4a5 → coding_proxy-0.3.0a2}/CHANGELOG.md +7 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/PKG-INFO +11 -11
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/README.md +10 -10
- coding_proxy-0.3.0a2/assets/dashboard-v0.2.4.png +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/arch/config-reference.md +52 -1
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/arch/testing.md +1 -1
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/framework.md +2 -11
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/guide/api-reference.md +14 -14
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/guide/cli-reference.md +4 -4
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/guide/dashboard.md +1 -1
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/guide/monitoring.md +8 -8
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/guide/quickstart.md +4 -4
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/user-guide.md +49 -4
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/zh-CN/README.md +10 -10
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/pyproject.toml +1 -1
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/cli/__init__.py +2 -2
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/cli/auth_commands.py +1 -1
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/cli/banner.py +2 -2
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/config/config.default.yaml +39 -1
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/config/schema.py +11 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/config/server.py +1 -1
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/vendor_channels.py +177 -9
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/logging/db.py +78 -11
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/logging/stats.py +102 -26
- coding_proxy-0.3.0a2/src/coding/proxy/native_api/__init__.py +84 -0
- coding_proxy-0.3.0a2/src/coding/proxy/native_api/config.py +110 -0
- coding_proxy-0.3.0a2/src/coding/proxy/native_api/extractors/__init__.py +12 -0
- coding_proxy-0.3.0a2/src/coding/proxy/native_api/extractors/anthropic.py +111 -0
- coding_proxy-0.3.0a2/src/coding/proxy/native_api/extractors/gemini.py +112 -0
- coding_proxy-0.3.0a2/src/coding/proxy/native_api/extractors/openai.py +231 -0
- coding_proxy-0.3.0a2/src/coding/proxy/native_api/handler.py +485 -0
- coding_proxy-0.3.0a2/src/coding/proxy/native_api/operation.py +167 -0
- coding_proxy-0.3.0a2/src/coding/proxy/native_api/routes.py +68 -0
- coding_proxy-0.3.0a2/src/coding/proxy/native_api/usage_registry.py +279 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/pricing.py +17 -1
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/executor.py +19 -4
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/usage_parser.py +65 -5
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/usage_recorder.py +39 -1
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/server/app.py +26 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/server/routes.py +31 -14
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/anthropic.py +2 -1
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_app_routes.py +17 -20
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_banner.py +2 -2
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_config_init.py +1 -1
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_config_loader.py +6 -6
- coding_proxy-0.3.0a2/tests/test_native_api_base_url_override.py +166 -0
- coding_proxy-0.3.0a2/tests/test_native_api_extractors.py +331 -0
- coding_proxy-0.3.0a2/tests/test_native_api_handler.py +374 -0
- coding_proxy-0.3.0a2/tests/test_native_api_operation.py +130 -0
- coding_proxy-0.3.0a2/tests/test_native_api_routes.py +132 -0
- coding_proxy-0.3.0a2/tests/test_parse_usage_gemini.py +196 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_router_executor.py +162 -0
- coding_proxy-0.3.0a2/tests/test_token_logger_native_columns.py +334 -0
- coding_proxy-0.3.0a2/tests/test_vendor_channels.py +1731 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_zhipu.py +1 -1
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/uv.lock +1 -1
- coding_proxy-0.2.4a5/assets/dashboard-v0.2.3.png +0 -0
- coding_proxy-0.2.4a5/src/coding/proxy/server/request_normalizer.py +0 -162
- coding_proxy-0.2.4a5/tests/test_request_normalizer.py +0 -811
- coding_proxy-0.2.4a5/tests/test_vendor_channels.py +0 -761
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/.github/workflows/ci.yml +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/.github/workflows/coverage.yml +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/.github/workflows/release.yml +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/.gitignore +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/.pre-commit-config.yaml +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/AGENTS.md +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/CLAUDE.md +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/LICENSE +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/arch/convert.md +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/arch/design-patterns.md +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/arch/routing.md +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/arch/vendors.md +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/ci-cd.md +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/guide/vendors.md +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/__init__.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/__init__.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/__main__.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/__init__.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/providers/__init__.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/providers/base.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/providers/github.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/providers/google.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/runtime.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/store.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/compat/__init__.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/compat/canonical.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/compat/session_store.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/config/__init__.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/config/auth_schema.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/config/loader.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/config/resiliency.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/config/routing.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/config/vendors.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/__init__.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/anthropic_to_gemini.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/anthropic_to_openai.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/gemini_sse_adapter.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/gemini_to_anthropic.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/openai_to_anthropic.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/logging/__init__.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/logging/formatters.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/model/__init__.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/model/auth.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/model/compat.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/model/constants.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/model/pricing.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/model/token.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/model/vendor.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/__init__.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/circuit_breaker.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/error_classifier.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/model_mapper.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/quota_guard.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/rate_limit.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/retry.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/router.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/session_manager.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/tier.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/server/__init__.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/server/dashboard.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/server/factory.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/server/responses.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/streaming/__init__.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/streaming/anthropic_compat.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/__init__.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/alibaba.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/antigravity.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/base.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/copilot.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/copilot_models.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/copilot_token_manager.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/copilot_urls.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/doubao.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/kimi.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/minimax.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/mixins.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/native_anthropic.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/token_manager.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/xiaomi.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/zhipu.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/__init__.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_antigravity.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_auto_login.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_circuit_breaker.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_cli_usage.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_compat.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_convert_request.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_convert_response.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_convert_sse.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_copilot.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_copilot_convert_request.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_copilot_convert_response.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_copilot_models.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_copilot_urls.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_currency.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_error_classifier.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_logging_dual_write.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_mixins.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_model_auth.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_model_compat.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_model_constants.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_model_mapper.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_model_pricing.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_model_token.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_model_vendor.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_native_vendors.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_parse_usage.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_pricing.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_quota_guard.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_rate_limit.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_router_chain.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_runtime_reauth.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_schema.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_streaming_anthropic_compat.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_tier.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_tiers_config.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_time_range.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_token_logger.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_token_manager.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_types.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_vendor_streaming.py +0 -0
- {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_vendors.py +0 -0
|
@@ -4,6 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
- feat(server): 默认监听端口 `8046` → `3392`,避免与常见企业端口段冲突;BREAKING: 已将端口固化进客户端 `ANTHROPIC_BASE_URL` / SDK `base_url` / 监控看板 URL 的用户需同步更新,或显式通过 `--port 8046` / `server.port: 8046` 回退到旧值;
|
|
8
|
+
- feat(native-api): 原生 API 透传三家 provider (`openai` / `gemini` / `anthropic`) `enabled` 默认由 `false` → `true` 开箱即用;`config.default.yaml` 顶层追加 `native_api:` 实体配置块(首次启动自动拷贝至 `~/.coding-proxy/config.yaml`,用户直接编辑 `base_url` 即可将上游切换至第三方代理);同时新增 `NATIVE_OPENAI_BASE_URL` / `NATIVE_GEMINI_BASE_URL` / `NATIVE_ANTHROPIC_BASE_URL` 三枚环境变量覆写通道(空串/纯空白视作未设置),三级优先级 **env > yaml > 内置默认** 由 `NativeApiConfig._apply_env_overrides` `@model_validator(mode="after")` 统一注入;BREAKING: 升级后 `/api/{openai,gemini,anthropic}/**` 默认暴露,proxy 仍不保管凭据(`Authorization` / `x-api-key` / `?key=` 均由客户端透传),如需关闭显式设置 `native_api.<provider>.enabled: false`;
|
|
9
|
+
- feat(native-api): 新增 `/api/{openai,gemini,anthropic}/**` 原生 LLM API 全量 catch-all 透传通道——客户端只需改 SDK `base_url` 即可复用 proxy 链路访问 OpenAI / Gemini / Anthropic 官方 API,认证完全透传不保管凭据;核心由 `NativeProxyHandler` + `OperationClassifier` + `NativeUsageExtractor` Registry 三件套组成,与既有 `/v1/messages` Claude Code 链路正交共存、零回归;首版覆盖 chat / completions / responses / embeddings / audio / image / count_tokens / moderations / cachedContents / messages / batches 等全量端点;
|
|
10
|
+
- feat(usage): `usage_log` 新增 `client_category` / `operation` / `endpoint` / `extra_usage_json` 四列(全部 `DEFAULT`、幂等迁移),区分 Claude Code 场景(`'cc'`)与原生 API 场景(`'api'`),承载规范化操作名与非规范 token 字段(reasoning / audio / thoughts / server_tool_use 等);`query_usage` 支持按新列过滤,`_PERIOD_SQL` 聚合追加 `client_category, operation` 维度;
|
|
11
|
+
- feat(usage-parser): `parse_usage_from_chunk` 扩展识别 Gemini SSE `usageMetadata.*`(promptTokenCount / candidatesTokenCount / cachedContentTokenCount / thoughtsTokenCount / toolUsePromptTokenCount),新增 `gemini_usage_metadata` evidence kind,既有 Anthropic/OpenAI 分支行为零变更;
|
|
12
|
+
- refactor(vendor-channels): 彻底收敛跨供应商兼容性逻辑——删除 `server/request_normalizer.py` 入口通用规范化层,将 `srvtoolu_*` ID 重写、`server_tool_use_delta` 私有块剥离全部迁入源→目标绑定通道(`prepare_zhipu_to_anthropic`、`prepare_zhipu_to_copilot`);新增 `infer_source_vendor_from_body` 内容感知源推断,在无会话状态的首次请求场景下兜底识别源供应商;`_RouteExecutor._determine_source_vendor` 扩充为三级优先级(failed_tier → session_state → body inference),确保未注册转换对不触发任何清洗;
|
|
13
|
+
- refactor(count-tokens): `/v1/messages/count_tokens` 端点移除无条件 `strip_thinking_blocks` 过度防御,改为基于 `infer_source_vendor_from_body` + `get_transition_channel` 的按需通道清洗,语义与 `/v1/messages` 对齐;
|
|
7
14
|
- fix(request-normalizer): 重设计 zhipu→anthropic 跨供应商 tool_use/tool_result 配对修复——以单遍自包含 `enforce_anthropic_tool_pairing` 替代原有多步串联管线(剥离→重定位→孤儿修复),消除步骤间隐式依赖导致的孤儿 tool_use 漏修问题,彻底根治 `tool_use ids were found without tool_result blocks` 400 异常;
|
|
8
15
|
- refactor(vendor-channels): 将供应商转换通道从「目标 vendor 专属」重构为「源→目标绑定」模型——注册表键从 `target_vendor` 改为 `(source, target)` 二元组,通道函数从 `prepare_for_X` 重命名为 `prepare_X_to_Y`,触发逻辑从 `_needs_vendor_channel` 替换为 `_determine_source_vendor`(基于请求内 `failed_tier_name` 和会话历史推断源 vendor),未注册的转换对(如 anthropic→zhipu)不触发任何通道;
|
|
9
16
|
- feat(vendor-channels): 新增 zhipu→anthropic、zhipu→copilot、copilot→zhipu 三条源→目标绑定转换通道,在跨供应商故障转移时自动清理源 vendor 产物(thinking 块、cache_control 字段、thinking 参数、tool_use/tool_result 配对),消除 `likely format incompatibility (400 + tool_results)` 错误;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coding-proxy
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0a2
|
|
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
|
|
@@ -57,7 +57,7 @@ When you're deeply immersed in your coding "zone" with **Claude Code** (or any A
|
|
|
57
57
|
## 🌟 Core Features
|
|
58
58
|
|
|
59
59
|
<div align="center">
|
|
60
|
-
<img src="assets/dashboard-v0.2.
|
|
60
|
+
<img src="assets/dashboard-v0.2.4.png">
|
|
61
61
|
</div>
|
|
62
62
|
|
|
63
63
|
- **⛓️ N-tier Chained Failover**: Autonomous descending sequence, supporting Claude's official plans, as well as Coding Plans from GitHub Copilot, Google Antigravity, Z AI, MiniMax, Alibaba Qwen, Xiaomi, Kimi, Doubao, etc.
|
|
@@ -97,9 +97,9 @@ uv run coding-proxy start
|
|
|
97
97
|
# INFO: Started server process [1403]
|
|
98
98
|
# INFO: Waiting for application startup.
|
|
99
99
|
# ...
|
|
100
|
-
# INFO: coding-proxy started: host=127.0.0.1 port=
|
|
100
|
+
# INFO: coding-proxy started: host=127.0.0.1 port=3392
|
|
101
101
|
# INFO: Application startup complete.
|
|
102
|
-
# INFO: Uvicorn running on http://127.0.0.1:
|
|
102
|
+
# INFO: Uvicorn running on http://127.0.0.1:3392 (Press CTRL+C to quit)
|
|
103
103
|
```
|
|
104
104
|
|
|
105
105
|
### 4. Seamless Claude Code Integration
|
|
@@ -107,7 +107,7 @@ uv run coding-proxy start
|
|
|
107
107
|
Open a fresh terminal tab and route your traffic through coding-proxy before firing up Claude Code:
|
|
108
108
|
|
|
109
109
|
```bash
|
|
110
|
-
export ANTHROPIC_BASE_URL=http://127.0.0.1:
|
|
110
|
+
export ANTHROPIC_BASE_URL=http://127.0.0.1:3392
|
|
111
111
|
|
|
112
112
|
# Enjoy blissful, silky-smooth, and uninterrupted coding nirvana:
|
|
113
113
|
claude
|
|
@@ -119,13 +119,13 @@ claude
|
|
|
119
119
|
|
|
120
120
|
`coding-proxy` comes equipped with a badass suite of CLI tools to help you boss around your proxy state.
|
|
121
121
|
|
|
122
|
-
| Command | Description
|
|
123
|
-
| :------- |
|
|
124
|
-
| `start` | **Fire up the proxy server.** Supports custom ports and configuration paths.
|
|
122
|
+
| Command | Description | Example Usage |
|
|
123
|
+
| :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------- |
|
|
124
|
+
| `start` | **Fire up the proxy server.** Supports custom ports and configuration paths. | `coding-proxy start -p 8080 -c ~/config.yaml` |
|
|
125
125
|
| `auth` | **Manage OAuth credentials.** Sub-commands: `login` (browser OAuth), `status` (token validity), `reauth` (re-authenticate), `logout` (clear tokens). | `coding-proxy auth login -p github` |
|
|
126
|
-
| `status` | **Check proxy health.** Shows circuit breaker states (OPEN/CLOSED) and quota status across all tiers.
|
|
127
|
-
| `usage` | **Token Stats Dashboard.** Stalks every single token consumed, failovers triggered, and latency across day/vendor/model dimensions.
|
|
128
|
-
| `reset` | **The emergency flush button.** Force-reset all circuit breakers and quotas instantly when you've confirmed the main vendor is back from the dead.
|
|
126
|
+
| `status` | **Check proxy health.** Shows circuit breaker states (OPEN/CLOSED) and quota status across all tiers. | `coding-proxy status` |
|
|
127
|
+
| `usage` | **Token Stats Dashboard.** Stalks every single token consumed, failovers triggered, and latency across day/vendor/model dimensions. | `coding-proxy usage -d 7 -v anthropic` |
|
|
128
|
+
| `reset` | **The emergency flush button.** Force-reset all circuit breakers and quotas instantly when you've confirmed the main vendor is back from the dead. | `coding-proxy reset` |
|
|
129
129
|
|
|
130
130
|
---
|
|
131
131
|
|
|
@@ -30,7 +30,7 @@ When you're deeply immersed in your coding "zone" with **Claude Code** (or any A
|
|
|
30
30
|
## 🌟 Core Features
|
|
31
31
|
|
|
32
32
|
<div align="center">
|
|
33
|
-
<img src="assets/dashboard-v0.2.
|
|
33
|
+
<img src="assets/dashboard-v0.2.4.png">
|
|
34
34
|
</div>
|
|
35
35
|
|
|
36
36
|
- **⛓️ N-tier Chained Failover**: Autonomous descending sequence, supporting Claude's official plans, as well as Coding Plans from GitHub Copilot, Google Antigravity, Z AI, MiniMax, Alibaba Qwen, Xiaomi, Kimi, Doubao, etc.
|
|
@@ -70,9 +70,9 @@ uv run coding-proxy start
|
|
|
70
70
|
# INFO: Started server process [1403]
|
|
71
71
|
# INFO: Waiting for application startup.
|
|
72
72
|
# ...
|
|
73
|
-
# INFO: coding-proxy started: host=127.0.0.1 port=
|
|
73
|
+
# INFO: coding-proxy started: host=127.0.0.1 port=3392
|
|
74
74
|
# INFO: Application startup complete.
|
|
75
|
-
# INFO: Uvicorn running on http://127.0.0.1:
|
|
75
|
+
# INFO: Uvicorn running on http://127.0.0.1:3392 (Press CTRL+C to quit)
|
|
76
76
|
```
|
|
77
77
|
|
|
78
78
|
### 4. Seamless Claude Code Integration
|
|
@@ -80,7 +80,7 @@ uv run coding-proxy start
|
|
|
80
80
|
Open a fresh terminal tab and route your traffic through coding-proxy before firing up Claude Code:
|
|
81
81
|
|
|
82
82
|
```bash
|
|
83
|
-
export ANTHROPIC_BASE_URL=http://127.0.0.1:
|
|
83
|
+
export ANTHROPIC_BASE_URL=http://127.0.0.1:3392
|
|
84
84
|
|
|
85
85
|
# Enjoy blissful, silky-smooth, and uninterrupted coding nirvana:
|
|
86
86
|
claude
|
|
@@ -92,13 +92,13 @@ claude
|
|
|
92
92
|
|
|
93
93
|
`coding-proxy` comes equipped with a badass suite of CLI tools to help you boss around your proxy state.
|
|
94
94
|
|
|
95
|
-
| Command | Description
|
|
96
|
-
| :------- |
|
|
97
|
-
| `start` | **Fire up the proxy server.** Supports custom ports and configuration paths.
|
|
95
|
+
| Command | Description | Example Usage |
|
|
96
|
+
| :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------- |
|
|
97
|
+
| `start` | **Fire up the proxy server.** Supports custom ports and configuration paths. | `coding-proxy start -p 8080 -c ~/config.yaml` |
|
|
98
98
|
| `auth` | **Manage OAuth credentials.** Sub-commands: `login` (browser OAuth), `status` (token validity), `reauth` (re-authenticate), `logout` (clear tokens). | `coding-proxy auth login -p github` |
|
|
99
|
-
| `status` | **Check proxy health.** Shows circuit breaker states (OPEN/CLOSED) and quota status across all tiers.
|
|
100
|
-
| `usage` | **Token Stats Dashboard.** Stalks every single token consumed, failovers triggered, and latency across day/vendor/model dimensions.
|
|
101
|
-
| `reset` | **The emergency flush button.** Force-reset all circuit breakers and quotas instantly when you've confirmed the main vendor is back from the dead.
|
|
99
|
+
| `status` | **Check proxy health.** Shows circuit breaker states (OPEN/CLOSED) and quota status across all tiers. | `coding-proxy status` |
|
|
100
|
+
| `usage` | **Token Stats Dashboard.** Stalks every single token consumed, failovers triggered, and latency across day/vendor/model dimensions. | `coding-proxy usage -d 7 -v anthropic` |
|
|
101
|
+
| `reset` | **The emergency flush button.** Force-reset all circuit breakers and quotas instantly when you've confirmed the main vendor is back from the dead. | `coding-proxy reset` |
|
|
102
102
|
|
|
103
103
|
---
|
|
104
104
|
|
|
Binary file
|
|
@@ -49,7 +49,7 @@ flowchart TD
|
|
|
49
49
|
| 字段 | 类型 | 默认值 | 说明 |
|
|
50
50
|
| ------ | ---- | ------------- | -------- |
|
|
51
51
|
| `host` | str | `"127.0.0.1"` | 监听地址 |
|
|
52
|
-
| `port` | int | `
|
|
52
|
+
| `port` | int | `3392` | 监听端口 |
|
|
53
53
|
|
|
54
54
|
### 3.2 DatabaseConfig
|
|
55
55
|
|
|
@@ -257,3 +257,54 @@ tiers: [anthropic, copilot, zhipu] # 显式优先级(可选)
|
|
|
257
257
|
2. `zhipu` 字段名 → `fallback`
|
|
258
258
|
3. 若无 `vendors` 字段,从 legacy flat 字段自动生成 vendors 列表
|
|
259
259
|
4. 迁移时发出 INFO 日志建议迁移至新格式
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 10. native_api — 原生 API 透传配置
|
|
264
|
+
|
|
265
|
+
> **定义位置**:[`native_api/config.py`](../../src/coding/proxy/native_api/config.py)
|
|
266
|
+
>
|
|
267
|
+
> **端点**:`/api/{openai,gemini,anthropic}/**` catch-all 透传通道;认证头由客户端自带,proxy 不保管凭据。
|
|
268
|
+
|
|
269
|
+
### 10.1 NativeApiConfig 顶层字段
|
|
270
|
+
|
|
271
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
272
|
+
| ------------- | ---------------------- | -------------------------------------- | ----------------------------------------- |
|
|
273
|
+
| `openai` | `NativeProviderConfig` | 内置官方 URL,`enabled=true` | OpenAI chat / responses / embeddings 等 |
|
|
274
|
+
| `gemini` | `NativeProviderConfig` | 内置官方 URL,`enabled=true` | Gemini generateContent / embedContent 等 |
|
|
275
|
+
| `anthropic` | `NativeProviderConfig` | 内置官方 URL,`enabled=true` | Anthropic messages / count_tokens / batches |
|
|
276
|
+
|
|
277
|
+
### 10.2 NativeProviderConfig 字段
|
|
278
|
+
|
|
279
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
280
|
+
| --------------------- | ---- | ------------------- | --------------------------------------------------------------------- |
|
|
281
|
+
| `enabled` | bool | `true` | 是否启用该 provider 的原生透传端点(默认启用,开箱即用) |
|
|
282
|
+
| `base_url` | str | 见下方内置默认 | 上游 API base_url(纯域名前缀,不含 `/v1`) |
|
|
283
|
+
| `timeout_ms` | int | `300000` | 单次请求超时(毫秒),LLM 大模型建议 ≥ 120s |
|
|
284
|
+
| `connect_timeout_ms` | int | `15000` | 连接建立超时(毫秒) |
|
|
285
|
+
|
|
286
|
+
### 10.3 内置默认 `base_url`
|
|
287
|
+
|
|
288
|
+
| Provider | 内置默认 |
|
|
289
|
+
| ------------ | ----------------------------------------------------- |
|
|
290
|
+
| `openai` | `https://api.openai.com` |
|
|
291
|
+
| `gemini` | `https://generativelanguage.googleapis.com` |
|
|
292
|
+
| `anthropic` | `https://api.anthropic.com` |
|
|
293
|
+
|
|
294
|
+
### 10.4 `base_url` 三级覆写优先级
|
|
295
|
+
|
|
296
|
+
由 `NativeApiConfig._apply_env_overrides` `@model_validator(mode="after")` 注入:
|
|
297
|
+
|
|
298
|
+
```text
|
|
299
|
+
env var(运行时) > YAML 显式字段(部署时) > Pydantic 内置默认(兜底)
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
| 环境变量 | 覆写目标 |
|
|
303
|
+
| ---------------------------- | ------------------------- |
|
|
304
|
+
| `NATIVE_OPENAI_BASE_URL` | `openai.base_url` |
|
|
305
|
+
| `NATIVE_GEMINI_BASE_URL` | `gemini.base_url` |
|
|
306
|
+
| `NATIVE_ANTHROPIC_BASE_URL` | `anthropic.base_url` |
|
|
307
|
+
|
|
308
|
+
空串或纯空白视作未设置,保留上一层值(避免"未设置 env → 空串覆盖内置默认"陷阱)。
|
|
309
|
+
|
|
310
|
+
> `ANTHROPIC_BASE_URL`(client → proxy,Claude Code 使用)与 `NATIVE_ANTHROPIC_BASE_URL`(proxy → upstream,原生透传使用)方向正交,勿混用。参见 [用户指引 § 4.7 native_api](../user-guide.md#47-native_api--原生-api-透传)。
|
|
@@ -65,6 +65,7 @@
|
|
|
65
65
|
| `test_convert_sse.py` | Gemini SSE→Anthropic SSE 流适配(单/多 chunk、各 finishReason、边界情况) |
|
|
66
66
|
| `test_copilot_convert_request.py` | Anthropic→OpenAI 请求格式转换 |
|
|
67
67
|
| `test_copilot_convert_response.py` | OpenAI→Anthropic 响应格式转换 |
|
|
68
|
+
| `test_vendor_channels.py` | 源→目标通道:zhipu/copilot 兼容性清洗、tool_use 配对、内容感知源推断 |
|
|
68
69
|
|
|
69
70
|
### 2.5 数据模型(model)
|
|
70
71
|
|
|
@@ -95,7 +96,6 @@
|
|
|
95
96
|
| 测试文件 | 覆盖范围 |
|
|
96
97
|
| ---------------------------- | ------------------------------------------------------- |
|
|
97
98
|
| `test_app_routes.py` | FastAPI 路由端点测试 |
|
|
98
|
-
| `test_request_normalizer.py` | 请求标准化:私有块清洗、tool_use_id 重写、fatal_reasons |
|
|
99
99
|
| `test_cli_usage.py` | CLI 用量查询命令 |
|
|
100
100
|
| `test_banner.py` | CLI Banner 显示 |
|
|
101
101
|
| `test_logging_dual_write.py` | 日志双写机制 |
|
|
@@ -69,7 +69,6 @@ graph TD
|
|
|
69
69
|
App["<code>app.py</code><br/>应用工厂 + lifespan"]
|
|
70
70
|
Routes["<code>routes.py</code><br/>路由注册"]
|
|
71
71
|
Factory["<code>factory.py</code><br/>Vendor/Tier 构建工厂"]
|
|
72
|
-
Normalizer["<code>request_normalizer.py</code><br/>请求标准化"]
|
|
73
72
|
Dashboard["<code>dashboard.py</code><br/>状态面板"]
|
|
74
73
|
end
|
|
75
74
|
|
|
@@ -179,15 +178,8 @@ graph TD
|
|
|
179
178
|
```mermaid
|
|
180
179
|
flowchart TD
|
|
181
180
|
Client["Client POST /v1/messages"] --> Server["server.routes.messages()"]
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
Body["body = await request.json()"]
|
|
185
|
-
Norm["normalize_anthropic_request(body)<br/>清洗私有块 + 重写 tool_use_id"]
|
|
186
|
-
Body --> Norm
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
Server --> Normalize
|
|
190
|
-
Norm --> RouteType{"stream?"}
|
|
181
|
+
Server --> Body["body = await request.json()"]
|
|
182
|
+
Body --> RouteType{"stream?"}
|
|
191
183
|
|
|
192
184
|
RouteType -- "true" --> StreamRoute["route_stream()"]
|
|
193
185
|
RouteType -- "false" --> MsgRoute["route_message()"]
|
|
@@ -401,7 +393,6 @@ flowchart TD
|
|
|
401
393
|
| [`app.py`](../src/coding/proxy/server/app.py) | FastAPI 应用工厂 `create_app()` + `lifespan` 生命周期管理 |
|
|
402
394
|
| [`factory.py`](../src/coding/proxy/server/factory.py) | Vendor/Tier 构建工厂 + 凭证解析 |
|
|
403
395
|
| [`routes.py`](../src/coding/proxy/server/routes.py) | 路由端点按职责分组注册 |
|
|
404
|
-
| [`request_normalizer.py`](../src/coding/proxy/server/request_normalizer.py) | 入站请求标准化(清洗供应商私有块) |
|
|
405
396
|
| [`responses.py`](../src/coding/proxy/server/responses.py) | 响应辅助工具(JSON error / stream error 构建) |
|
|
406
397
|
| [`dashboard.py`](../src/coding/proxy/server/dashboard.py) | 状态面板(Web Dashboard) |
|
|
407
398
|
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
根路径连通性探针。Claude Code 在建立连接前发送 `HEAD /` 作为健康检查,代理返回 HTTP 200 空响应。
|
|
32
32
|
|
|
33
33
|
```bash
|
|
34
|
-
curl -I http://127.0.0.1:
|
|
34
|
+
curl -I http://127.0.0.1:3392/
|
|
35
35
|
# HTTP/1.1 200 OK
|
|
36
36
|
```
|
|
37
37
|
|
|
@@ -189,7 +189,7 @@ curl -I http://127.0.0.1:8046/
|
|
|
189
189
|
Token 计数 API 透传。支持所有提供 Anthropic 兼容端点的供应商。
|
|
190
190
|
|
|
191
191
|
```bash
|
|
192
|
-
curl -X POST http://127.0.0.1:
|
|
192
|
+
curl -X POST http://127.0.0.1:3392/v1/messages/count_tokens \
|
|
193
193
|
-H "Content-Type: application/json" \
|
|
194
194
|
-H "anthropic-version: 2023-06-01" \
|
|
195
195
|
-d '{"model":"claude-sonnet-4-6","messages":[{"role":"user","content":"Hello"}]}'
|
|
@@ -206,7 +206,7 @@ curl -X POST http://127.0.0.1:8046/v1/messages/count_tokens \
|
|
|
206
206
|
健康检查。
|
|
207
207
|
|
|
208
208
|
```bash
|
|
209
|
-
curl http://127.0.0.1:
|
|
209
|
+
curl http://127.0.0.1:3392/health
|
|
210
210
|
# {"status":"ok"}
|
|
211
211
|
```
|
|
212
212
|
|
|
@@ -215,7 +215,7 @@ curl http://127.0.0.1:8046/health
|
|
|
215
215
|
查询所有层级的熔断器、配额守卫、周级配额守卫、Rate Limit 及诊断信息。
|
|
216
216
|
|
|
217
217
|
```bash
|
|
218
|
-
curl http://127.0.0.1:
|
|
218
|
+
curl http://127.0.0.1:3392/api/status
|
|
219
219
|
```
|
|
220
220
|
|
|
221
221
|
**返回示例**:
|
|
@@ -258,15 +258,15 @@ curl http://127.0.0.1:8046/api/status
|
|
|
258
258
|
|
|
259
259
|
```bash
|
|
260
260
|
# 仅重置(向后兼容)
|
|
261
|
-
curl -X POST http://127.0.0.1:
|
|
261
|
+
curl -X POST http://127.0.0.1:3392/api/reset
|
|
262
262
|
|
|
263
263
|
# 重置 + 提升 anthropic 到最高优先级
|
|
264
|
-
curl -X POST http://127.0.0.1:
|
|
264
|
+
curl -X POST http://127.0.0.1:3392/api/reset \
|
|
265
265
|
-H "Content-Type: application/json" \
|
|
266
266
|
-d '{"vendors": ["anthropic"]}'
|
|
267
267
|
|
|
268
268
|
# 重置 + 替换整条链路顺序
|
|
269
|
-
curl -X POST http://127.0.0.1:
|
|
269
|
+
curl -X POST http://127.0.0.1:3392/api/reset \
|
|
270
270
|
-H "Content-Type: application/json" \
|
|
271
271
|
-d '{"vendors": ["zhipu", "anthropic", "copilot"]}'
|
|
272
272
|
```
|
|
@@ -282,7 +282,7 @@ curl -X POST http://127.0.0.1:8046/api/reset \
|
|
|
282
282
|
返回 Copilot 认证与交换链路的脱敏诊断信息。
|
|
283
283
|
|
|
284
284
|
```bash
|
|
285
|
-
curl http://127.0.0.1:
|
|
285
|
+
curl http://127.0.0.1:3392/api/copilot/diagnostics
|
|
286
286
|
```
|
|
287
287
|
|
|
288
288
|
若 Copilot 供应商未启用,返回 404。
|
|
@@ -292,7 +292,7 @@ curl http://127.0.0.1:8046/api/copilot/diagnostics
|
|
|
292
292
|
按需探测当前 Copilot 会话可见的模型列表。
|
|
293
293
|
|
|
294
294
|
```bash
|
|
295
|
-
curl http://127.0.0.1:
|
|
295
|
+
curl http://127.0.0.1:3392/api/copilot/models
|
|
296
296
|
```
|
|
297
297
|
|
|
298
298
|
需要有效的 Copilot 凭证;凭证无效时返回 503。
|
|
@@ -302,7 +302,7 @@ curl http://127.0.0.1:8046/api/copilot/models
|
|
|
302
302
|
查询运行时重认证状态。
|
|
303
303
|
|
|
304
304
|
```bash
|
|
305
|
-
curl http://127.0.0.1:
|
|
305
|
+
curl http://127.0.0.1:3392/api/reauth/status
|
|
306
306
|
```
|
|
307
307
|
|
|
308
308
|
## 10. POST /api/reauth/{provider}
|
|
@@ -310,7 +310,7 @@ curl http://127.0.0.1:8046/api/reauth/status
|
|
|
310
310
|
手动触发指定 provider 的运行时重认证。
|
|
311
311
|
|
|
312
312
|
```bash
|
|
313
|
-
curl -X POST http://127.0.0.1:
|
|
313
|
+
curl -X POST http://127.0.0.1:3392/api/reauth/github
|
|
314
314
|
# HTTP/1.1 202 Accepted
|
|
315
315
|
# {"status":"reauth requested"}
|
|
316
316
|
```
|
|
@@ -330,7 +330,7 @@ curl -X POST http://127.0.0.1:8046/api/reauth/github
|
|
|
330
330
|
返回 Dashboard HTML 页面。
|
|
331
331
|
|
|
332
332
|
```bash
|
|
333
|
-
curl http://127.0.0.1:
|
|
333
|
+
curl http://127.0.0.1:3392/dashboard
|
|
334
334
|
```
|
|
335
335
|
|
|
336
336
|
### 11.2 GET /api/dashboard/summary
|
|
@@ -338,7 +338,7 @@ curl http://127.0.0.1:8046/dashboard
|
|
|
338
338
|
返回 Dashboard 汇总数据(今日 + 所选区间)。
|
|
339
339
|
|
|
340
340
|
```bash
|
|
341
|
-
curl "http://127.0.0.1:
|
|
341
|
+
curl "http://127.0.0.1:3392/api/dashboard/summary?days=7"
|
|
342
342
|
```
|
|
343
343
|
|
|
344
344
|
| 参数 | 类型 | 默认值 | 说明 |
|
|
@@ -352,7 +352,7 @@ curl "http://127.0.0.1:8046/api/dashboard/summary?days=7"
|
|
|
352
352
|
返回按天分组的时序数据(用于图表绘制)。
|
|
353
353
|
|
|
354
354
|
```bash
|
|
355
|
-
curl "http://127.0.0.1:
|
|
355
|
+
curl "http://127.0.0.1:3392/api/dashboard/timeline?days=30"
|
|
356
356
|
```
|
|
357
357
|
|
|
358
358
|
| 参数 | 类型 | 默认值 | 说明 |
|
|
@@ -39,7 +39,7 @@ coding-proxy start
|
|
|
39
39
|
coding-proxy start -p 9000 -c ~/my-config.yaml
|
|
40
40
|
|
|
41
41
|
# 自定义监听地址和端口
|
|
42
|
-
coding-proxy start --host 0.0.0.0 --port
|
|
42
|
+
coding-proxy start --host 0.0.0.0 --port 3392
|
|
43
43
|
```
|
|
44
44
|
|
|
45
45
|
> 若启用了 Copilot 或 Antigravity 供应商但未配置凭证,启动时会自动触发 OAuth 浏览器登录流程。
|
|
@@ -54,7 +54,7 @@ coding-proxy status [OPTIONS]
|
|
|
54
54
|
|
|
55
55
|
| 参数 | 缩写 | 说明 |
|
|
56
56
|
| -------- | ---- | ------------------------- |
|
|
57
|
-
| `--port` | `-p` | 代理服务端口(默认
|
|
57
|
+
| `--port` | `-p` | 代理服务端口(默认 3392) |
|
|
58
58
|
|
|
59
59
|
**输出示例**:
|
|
60
60
|
|
|
@@ -143,7 +143,7 @@ coding-proxy reset [OPTIONS]
|
|
|
143
143
|
|
|
144
144
|
| 参数 | 缩写 | 说明 |
|
|
145
145
|
| ---------- | ---- | ----------------------------------------------- |
|
|
146
|
-
| `--port` | `-p` | 代理服务端口(默认
|
|
146
|
+
| `--port` | `-p` | 代理服务端口(默认 3392) |
|
|
147
147
|
| `--vendor` | `-v` | 提升/重排序 vendor 优先级(单个或逗号分隔多个) |
|
|
148
148
|
|
|
149
149
|
**重排序语义**:
|
|
@@ -211,7 +211,7 @@ coding-proxy auth reauth PROVIDER [OPTIONS]
|
|
|
211
211
|
| 参数 | 缩写 | 说明 |
|
|
212
212
|
| ---------- | ---- | ------------------------------------------ |
|
|
213
213
|
| `PROVIDER` | — | provider 名称(必填):`github` / `google` |
|
|
214
|
-
| `--port` | `-p` | 代理服务端口(默认
|
|
214
|
+
| `--port` | `-p` | 代理服务端口(默认 3392) |
|
|
215
215
|
|
|
216
216
|
**示例**:
|
|
217
217
|
|
|
@@ -67,17 +67,17 @@ coding-proxy usage --db /path/to/usage.db
|
|
|
67
67
|
|
|
68
68
|
```bash
|
|
69
69
|
# 基础检查
|
|
70
|
-
curl http://127.0.0.1:
|
|
70
|
+
curl http://127.0.0.1:3392/health
|
|
71
71
|
|
|
72
72
|
# 详细状态(所有层级的熔断器、配额守卫、Rate Limit、诊断信息)
|
|
73
|
-
curl http://127.0.0.1:
|
|
73
|
+
curl http://127.0.0.1:3392/api/status
|
|
74
74
|
```
|
|
75
75
|
|
|
76
76
|
> 端点详情参见 [API 参考](./api-reference.md)。
|
|
77
77
|
|
|
78
78
|
## 4. Dashboard 监控
|
|
79
79
|
|
|
80
|
-
浏览器访问 `http://127.0.0.1:
|
|
80
|
+
浏览器访问 `http://127.0.0.1:3392/dashboard` 查看 Web 可视化看板。详见 [Dashboard 文档](./dashboard.md)。
|
|
81
81
|
|
|
82
82
|
## 5. 数据库维护
|
|
83
83
|
|
|
@@ -138,7 +138,7 @@ coding-proxy reset -v anthropic
|
|
|
138
138
|
coding-proxy auth reauth github
|
|
139
139
|
|
|
140
140
|
# API
|
|
141
|
-
curl -X POST http://127.0.0.1:
|
|
141
|
+
curl -X POST http://127.0.0.1:3392/api/reauth/github
|
|
142
142
|
```
|
|
143
143
|
|
|
144
144
|
重认证请求发出后(HTTP 202),在浏览器中完成授权即可,无需重启。
|
|
@@ -150,7 +150,7 @@ curl -X POST http://127.0.0.1:8046/api/reauth/github
|
|
|
150
150
|
**端口占用**:
|
|
151
151
|
|
|
152
152
|
```bash
|
|
153
|
-
lsof -i :
|
|
153
|
+
lsof -i :3392
|
|
154
154
|
coding-proxy start --port 8080
|
|
155
155
|
```
|
|
156
156
|
|
|
@@ -161,7 +161,7 @@ coding-proxy start --port 8080
|
|
|
161
161
|
### 8.2 Claude Code 无法连接代理
|
|
162
162
|
|
|
163
163
|
1. 确认代理正在运行:`coding-proxy status`
|
|
164
|
-
2. 确认环境变量:`echo $ANTHROPIC_BASE_URL`(应为 `http://127.0.0.1:
|
|
164
|
+
2. 确认环境变量:`echo $ANTHROPIC_BASE_URL`(应为 `http://127.0.0.1:3392`)
|
|
165
165
|
3. 确认端口一致
|
|
166
166
|
|
|
167
167
|
### 8.3 频繁触发故障转移
|
|
@@ -185,10 +185,10 @@ coding-proxy start --port 8080
|
|
|
185
185
|
|
|
186
186
|
```bash
|
|
187
187
|
# 查看诊断信息
|
|
188
|
-
curl http://127.0.0.1:
|
|
188
|
+
curl http://127.0.0.1:3392/api/copilot/diagnostics
|
|
189
189
|
|
|
190
190
|
# 探查可用模型
|
|
191
|
-
curl http://127.0.0.1:
|
|
191
|
+
curl http://127.0.0.1:3392/api/copilot/models
|
|
192
192
|
|
|
193
193
|
# 重认证
|
|
194
194
|
coding-proxy auth reauth github
|
|
@@ -59,7 +59,7 @@ coding-proxy start --config /path/to/config.yaml
|
|
|
59
59
|
INFO: Started server process [75773]
|
|
60
60
|
INFO: Waiting for application startup.
|
|
61
61
|
INFO: Application startup complete.
|
|
62
|
-
INFO: Uvicorn running on http://127.0.0.1:
|
|
62
|
+
INFO: Uvicorn running on http://127.0.0.1:3392 (Press CTRL+C to quit)
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
> 若启用了 Copilot 或 Antigravity 供应商但未配置凭证,启动时会自动触发 OAuth 浏览器登录。
|
|
@@ -68,7 +68,7 @@ INFO: Uvicorn running on http://127.0.0.1:8046 (Press CTRL+C to quit)
|
|
|
68
68
|
|
|
69
69
|
```bash
|
|
70
70
|
# 健康检查
|
|
71
|
-
curl http://127.0.0.1:
|
|
71
|
+
curl http://127.0.0.1:3392/health
|
|
72
72
|
# 期望返回: {"status":"ok"}
|
|
73
73
|
|
|
74
74
|
# 查看代理状态
|
|
@@ -80,7 +80,7 @@ coding-proxy status
|
|
|
80
80
|
将 Claude Code 的 API 端点指向 coding-proxy:
|
|
81
81
|
|
|
82
82
|
```bash
|
|
83
|
-
export ANTHROPIC_BASE_URL=http://127.0.0.1:
|
|
83
|
+
export ANTHROPIC_BASE_URL=http://127.0.0.1:3392
|
|
84
84
|
```
|
|
85
85
|
|
|
86
86
|
Claude Code 使用的 OAuth token 会被代理透传到 Anthropic API,无需额外配置认证信息。
|
|
@@ -100,4 +100,4 @@ Claude Code 使用的 OAuth token 会被代理透传到 Anthropic API,无需
|
|
|
100
100
|
4. **定期查看用量**:[`coding-proxy usage`](./cli-reference.md#3-coding-proxy-usage)
|
|
101
101
|
5. **按需手动干预**:[`coding-proxy reset`](./cli-reference.md#4-coding-proxy-reset) 强制切回最高优先级供应商
|
|
102
102
|
6. **运行时重认证**:[`coding-proxy auth reauth`](./cli-reference.md#7-coding-proxy-auth-reauth) 无需重启即可刷新凭证
|
|
103
|
-
7. **查看可视化看板**:浏览器访问 `http://127.0.0.1:
|
|
103
|
+
7. **查看可视化看板**:浏览器访问 `http://127.0.0.1:3392/dashboard`
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
- [4.4 环境变量引用](#44-环境变量引用)
|
|
18
18
|
- [4.5 auth — OAuth 登录配置](#45-auth--oauth-登录配置)
|
|
19
19
|
- [4.6 server / database / logging](#46-server--database--logging)
|
|
20
|
+
- [4.7 native_api — 原生 API 透传](#47-native_api--原生-api-透传)
|
|
20
21
|
- [5. 日常操作速查](#5-日常操作速查)
|
|
21
22
|
- [附录:术语对照表](#附录术语对照表)
|
|
22
23
|
|
|
@@ -118,10 +119,10 @@ cp config.default.yaml config.yaml
|
|
|
118
119
|
coding-proxy start
|
|
119
120
|
|
|
120
121
|
# 4. 配置 Claude Code
|
|
121
|
-
export ANTHROPIC_BASE_URL=http://127.0.0.1:
|
|
122
|
+
export ANTHROPIC_BASE_URL=http://127.0.0.1:3392
|
|
122
123
|
|
|
123
124
|
# 5. 验证
|
|
124
|
-
curl http://127.0.0.1:
|
|
125
|
+
curl http://127.0.0.1:3392/health
|
|
125
126
|
```
|
|
126
127
|
|
|
127
128
|
---
|
|
@@ -194,7 +195,7 @@ auth:
|
|
|
194
195
|
```yaml
|
|
195
196
|
server:
|
|
196
197
|
host: "127.0.0.1" # 设为 "0.0.0.0" 接受外部连接
|
|
197
|
-
port:
|
|
198
|
+
port: 3392
|
|
198
199
|
|
|
199
200
|
database:
|
|
200
201
|
path: "~/.coding-proxy/usage.db"
|
|
@@ -208,6 +209,50 @@ logging:
|
|
|
208
209
|
|
|
209
210
|
> 完整字段定义参见 [配置字段参考](./arch/config-reference.md#3-服务器配置)。
|
|
210
211
|
|
|
212
|
+
### 4.7 native_api — 原生 API 透传
|
|
213
|
+
|
|
214
|
+
`coding-proxy` 在 Claude Code 主链路 (`/v1/messages`) 之外,额外暴露 `/api/{openai,gemini,anthropic}/**` catch-all 透传通道,供直接调用 OpenAI / Gemini / Anthropic 官方 API 的客户端复用 proxy(认证头 `Authorization` / `x-api-key` / `?key=` 全部由客户端透传,proxy 不保管凭据)。
|
|
215
|
+
|
|
216
|
+
```yaml
|
|
217
|
+
native_api:
|
|
218
|
+
openai:
|
|
219
|
+
enabled: true # 默认开箱即用
|
|
220
|
+
base_url: "https://api.openai.com" # 或填入自选第三方代理
|
|
221
|
+
timeout_ms: 300000
|
|
222
|
+
connect_timeout_ms: 15000
|
|
223
|
+
gemini:
|
|
224
|
+
enabled: true
|
|
225
|
+
base_url: "https://generativelanguage.googleapis.com"
|
|
226
|
+
anthropic:
|
|
227
|
+
enabled: true
|
|
228
|
+
base_url: "https://api.anthropic.com"
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**上游 `base_url` 三级优先级**(env > yaml > 内置默认)由 `NativeApiConfig._apply_env_overrides` `@model_validator(mode="after")` 统一注入,空串/纯空白视作未设置:
|
|
232
|
+
|
|
233
|
+
| 变量名 | 方向(谁 → 谁) | 典型值 | 备注 |
|
|
234
|
+
| --- | --- | --- | --- |
|
|
235
|
+
| `ANTHROPIC_BASE_URL` | client → proxy | `http://127.0.0.1:3392` | Claude Code 等客户端指向本 proxy |
|
|
236
|
+
| `NATIVE_OPENAI_BASE_URL` | proxy → upstream | `https://api.openai.com` 或自选代理 | 覆写 OpenAI 上游 |
|
|
237
|
+
| `NATIVE_GEMINI_BASE_URL` | proxy → upstream | `https://generativelanguage.googleapis.com` 或自选代理 | 覆写 Gemini 上游 |
|
|
238
|
+
| `NATIVE_ANTHROPIC_BASE_URL` | proxy → upstream | `https://api.anthropic.com` 或自选代理 | 覆写原生 Anthropic 上游 |
|
|
239
|
+
|
|
240
|
+
> `ANTHROPIC_BASE_URL` 与 `NATIVE_ANTHROPIC_BASE_URL` **方向正交**:前者是**客户端指向 proxy**(client → proxy),后者是 **proxy 指向上游**(proxy → upstream)。`NATIVE_` 前缀用于彻底切分两者语义。
|
|
241
|
+
|
|
242
|
+
**客户端用法示例**:
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
# 1. 将 OpenAI SDK base_url 指向本 proxy
|
|
246
|
+
export OPENAI_BASE_URL="http://127.0.0.1:3392/api/openai/v1"
|
|
247
|
+
|
|
248
|
+
# 2. 或直接 curl
|
|
249
|
+
curl http://127.0.0.1:3392/api/openai/v1/chat/completions \
|
|
250
|
+
-H "Authorization: Bearer $OPENAI_API_KEY" \
|
|
251
|
+
-d '{"model":"gpt-4o","messages":[{"role":"user","content":"ping"}]}'
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
如需禁用某家 provider,将对应 `enabled` 改为 `false` 即可。完整字段定义参见 [配置字段参考 — NativeApiConfig](./arch/config-reference.md#10-native_api--原生-api-透传配置)。
|
|
255
|
+
|
|
211
256
|
---
|
|
212
257
|
|
|
213
258
|
## 5. 日常操作速查
|
|
@@ -224,7 +269,7 @@ logging:
|
|
|
224
269
|
| GitHub 登录 | `coding-proxy auth login -p github` |
|
|
225
270
|
| 重认证 | `coding-proxy auth reauth github` |
|
|
226
271
|
| 查看凭证 | `coding-proxy auth status` |
|
|
227
|
-
| Dashboard | 浏览器访问 `http://127.0.0.1:
|
|
272
|
+
| Dashboard | 浏览器访问 `http://127.0.0.1:3392/dashboard` |
|
|
228
273
|
|
|
229
274
|
> 完整命令选项参见 [CLI 命令参考](./guide/cli-reference.md)。
|
|
230
275
|
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
## 🌟 核心特性 (Core Features)
|
|
31
31
|
|
|
32
32
|
<div align="center">
|
|
33
|
-
<img src="../../assets/dashboard-v0.2.
|
|
33
|
+
<img src="../../assets/dashboard-v0.2.4.png">
|
|
34
34
|
</div>
|
|
35
35
|
|
|
36
36
|
- **⛓️ N-tier 链式故障转移 (Failover)**:自主降序序列,支持 Claude 官方 Plans,以及 GitHub Copilot、Google Antigravity、智谱、MiniMax、阿里千问、小米、Kimi、豆包等的 Coding Plan。
|
|
@@ -70,9 +70,9 @@ uv run coding-proxy start
|
|
|
70
70
|
# INFO: Started server process [1403]
|
|
71
71
|
# INFO: Waiting for application startup.
|
|
72
72
|
# ...
|
|
73
|
-
# INFO: coding-proxy started: host=127.0.0.1 port=
|
|
73
|
+
# INFO: coding-proxy started: host=127.0.0.1 port=3392
|
|
74
74
|
# INFO: Application startup complete.
|
|
75
|
-
# INFO: Uvicorn running on http://127.0.0.1:
|
|
75
|
+
# INFO: Uvicorn running on http://127.0.0.1:3392 (Press CTRL+C to quit)
|
|
76
76
|
```
|
|
77
77
|
|
|
78
78
|
### 4. 一键接入 Claude Code
|
|
@@ -80,7 +80,7 @@ uv run coding-proxy start
|
|
|
80
80
|
打开一个新的终端标签页,启动 Claude Code 前将流量指向 coding-proxy:
|
|
81
81
|
|
|
82
82
|
```bash
|
|
83
|
-
export ANTHROPIC_BASE_URL=http://127.0.0.1:
|
|
83
|
+
export ANTHROPIC_BASE_URL=http://127.0.0.1:3392
|
|
84
84
|
|
|
85
85
|
# 享受如丝般顺滑、永不断连的编程心流:
|
|
86
86
|
claude
|
|
@@ -92,13 +92,13 @@ claude
|
|
|
92
92
|
|
|
93
93
|
`coding-proxy` 附带了强大的 CLI 工具套件,帮助您全面掌控代理状态。
|
|
94
94
|
|
|
95
|
-
| 指令 | 说明
|
|
96
|
-
| :------- |
|
|
97
|
-
| `start` | **启动代理服务器**。支持自定义端口与配置路径。
|
|
95
|
+
| 指令 | 说明 | 示例用法 |
|
|
96
|
+
| :------- | :------------------------------------------------------------------------------------------------------------------------------ | :-------------------------------------------- |
|
|
97
|
+
| `start` | **启动代理服务器**。支持自定义端口与配置路径。 | `coding-proxy start -p 8080 -c ~/config.yaml` |
|
|
98
98
|
| `auth` | **管理 OAuth 登录凭证**。子命令:`login`(浏览器 OAuth 登录)、`status`(令牌状态)、`reauth`(重认证)、`logout`(清除令牌)。 | `coding-proxy auth login -p github` |
|
|
99
|
-
| `status` | **查看代理健康状态**。展示各层级熔断器(OPEN/CLOSED)与配额状态。
|
|
100
|
-
| `usage` | **Token 统计看板**。按天/供应商/模型维度追踪每一次的 Token 消耗、故障转移及耗时。
|
|
101
|
-
| `reset` | **强制一键重置**。人工确认主供应商恢复可用后,立刻初始化所有熔断器和配额状态。
|
|
99
|
+
| `status` | **查看代理健康状态**。展示各层级熔断器(OPEN/CLOSED)与配额状态。 | `coding-proxy status` |
|
|
100
|
+
| `usage` | **Token 统计看板**。按天/供应商/模型维度追踪每一次的 Token 消耗、故障转移及耗时。 | `coding-proxy usage -d 7 -v anthropic` |
|
|
101
|
+
| `reset` | **强制一键重置**。人工确认主供应商恢复可用后,立刻初始化所有熔断器和配额状态。 | `coding-proxy reset` |
|
|
102
102
|
|
|
103
103
|
---
|
|
104
104
|
|