coding-proxy 0.3.0a1__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.3.0a1 → coding_proxy-0.3.0a2}/CHANGELOG.md +2 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/PKG-INFO +4 -4
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/README.md +3 -3
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/docs/arch/config-reference.md +52 -1
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/docs/guide/api-reference.md +14 -14
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/docs/guide/cli-reference.md +4 -4
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/docs/guide/dashboard.md +1 -1
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/docs/guide/monitoring.md +8 -8
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/docs/guide/quickstart.md +4 -4
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/docs/user-guide.md +49 -4
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/docs/zh-CN/README.md +3 -3
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/pyproject.toml +1 -1
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/cli/__init__.py +2 -2
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/cli/auth_commands.py +1 -1
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/cli/banner.py +2 -2
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/config/config.default.yaml +33 -1
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/config/server.py +1 -1
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/native_api/config.py +32 -6
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_banner.py +2 -2
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_config_init.py +1 -1
- {coding_proxy-0.3.0a1 → 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.0a1 → coding_proxy-0.3.0a2}/tests/test_zhipu.py +1 -1
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/uv.lock +1 -1
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/.github/workflows/ci.yml +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/.github/workflows/coverage.yml +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/.github/workflows/release.yml +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/.gitignore +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/.pre-commit-config.yaml +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/AGENTS.md +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/CLAUDE.md +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/LICENSE +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/assets/dashboard-v0.2.4.png +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/docs/arch/convert.md +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/docs/arch/design-patterns.md +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/docs/arch/routing.md +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/docs/arch/testing.md +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/docs/arch/vendors.md +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/docs/ci-cd.md +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/docs/framework.md +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/docs/guide/vendors.md +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/__init__.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/__init__.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/__main__.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/__init__.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/providers/__init__.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/providers/base.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/providers/github.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/providers/google.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/runtime.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/store.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/compat/__init__.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/compat/canonical.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/compat/session_store.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/config/__init__.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/config/auth_schema.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/config/loader.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/config/resiliency.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/config/routing.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/config/schema.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/config/vendors.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/__init__.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/anthropic_to_gemini.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/anthropic_to_openai.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/gemini_sse_adapter.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/gemini_to_anthropic.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/openai_to_anthropic.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/vendor_channels.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/logging/__init__.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/logging/db.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/logging/formatters.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/logging/stats.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/model/__init__.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/model/auth.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/model/compat.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/model/constants.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/model/pricing.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/model/token.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/model/vendor.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/native_api/__init__.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/native_api/extractors/__init__.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/native_api/extractors/anthropic.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/native_api/extractors/gemini.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/native_api/extractors/openai.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/native_api/handler.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/native_api/operation.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/native_api/routes.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/native_api/usage_registry.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/pricing.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/__init__.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/circuit_breaker.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/error_classifier.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/executor.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/model_mapper.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/quota_guard.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/rate_limit.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/retry.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/router.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/session_manager.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/tier.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/usage_parser.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/usage_recorder.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/server/__init__.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/server/app.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/server/dashboard.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/server/factory.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/server/responses.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/server/routes.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/streaming/__init__.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/streaming/anthropic_compat.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/__init__.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/alibaba.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/anthropic.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/antigravity.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/base.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/copilot.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/copilot_models.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/copilot_token_manager.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/copilot_urls.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/doubao.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/kimi.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/minimax.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/mixins.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/native_anthropic.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/token_manager.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/xiaomi.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/zhipu.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/__init__.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_antigravity.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_app_routes.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_auto_login.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_circuit_breaker.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_cli_usage.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_compat.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_convert_request.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_convert_response.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_convert_sse.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_copilot.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_copilot_convert_request.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_copilot_convert_response.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_copilot_models.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_copilot_urls.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_currency.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_error_classifier.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_logging_dual_write.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_mixins.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_model_auth.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_model_compat.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_model_constants.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_model_mapper.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_model_pricing.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_model_token.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_model_vendor.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_native_api_extractors.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_native_api_handler.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_native_api_operation.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_native_api_routes.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_native_vendors.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_parse_usage.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_parse_usage_gemini.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_pricing.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_quota_guard.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_rate_limit.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_router_chain.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_router_executor.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_runtime_reauth.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_schema.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_streaming_anthropic_compat.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_tier.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_tiers_config.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_time_range.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_token_logger.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_token_logger_native_columns.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_token_manager.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_types.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_vendor_channels.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_vendor_streaming.py +0 -0
- {coding_proxy-0.3.0a1 → coding_proxy-0.3.0a2}/tests/test_vendors.py +0 -0
|
@@ -4,6 +4,8 @@
|
|
|
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`;
|
|
7
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 等全量端点;
|
|
8
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` 维度;
|
|
9
11
|
- feat(usage-parser): `parse_usage_from_chunk` 扩展识别 Gemini SSE `usageMetadata.*`(promptTokenCount / candidatesTokenCount / cachedContentTokenCount / thoughtsTokenCount / toolUsePromptTokenCount),新增 `gemini_usage_metadata` evidence kind,既有 Anthropic/OpenAI 分支行为零变更;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coding-proxy
|
|
3
|
-
Version: 0.3.
|
|
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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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-透传)。
|
|
@@ -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
|
|
|
@@ -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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "coding-proxy"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.0a2"
|
|
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"
|
|
@@ -121,7 +121,7 @@ def start(
|
|
|
121
121
|
|
|
122
122
|
@app.command()
|
|
123
123
|
def status(
|
|
124
|
-
port: int = typer.Option(
|
|
124
|
+
port: int = typer.Option(3392, "--port", "-p", help="代理服务端口"),
|
|
125
125
|
) -> None:
|
|
126
126
|
"""查看代理状态和当前活跃供应商."""
|
|
127
127
|
import httpx
|
|
@@ -215,7 +215,7 @@ async def _run_usage(
|
|
|
215
215
|
|
|
216
216
|
@app.command()
|
|
217
217
|
def reset(
|
|
218
|
-
port: int = typer.Option(
|
|
218
|
+
port: int = typer.Option(3392, "--port", "-p", help="代理服务端口"),
|
|
219
219
|
vendor: str | None = typer.Option(
|
|
220
220
|
None,
|
|
221
221
|
"--vendor",
|
|
@@ -114,7 +114,7 @@ def auth_status() -> None:
|
|
|
114
114
|
@app.command("reauth")
|
|
115
115
|
def auth_reauth(
|
|
116
116
|
provider: str = typer.Argument(..., help="provider 名称 (github/google)"),
|
|
117
|
-
port: int = typer.Option(
|
|
117
|
+
port: int = typer.Option(3392, "--port", "-p", help="代理服务端口"),
|
|
118
118
|
) -> None:
|
|
119
119
|
"""触发运行中代理的 OAuth 重认证."""
|
|
120
120
|
import httpx as _httpx
|
|
@@ -22,7 +22,7 @@ if TYPE_CHECKING:
|
|
|
22
22
|
from .. import __version__
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
def build_banner(host: str = "127.0.0.1", port: int =
|
|
25
|
+
def build_banner(host: str = "127.0.0.1", port: int = 3392) -> Panel:
|
|
26
26
|
"""构建品牌横幅 Panel.
|
|
27
27
|
|
|
28
28
|
Args:
|
|
@@ -48,7 +48,7 @@ def build_banner(host: str = "127.0.0.1", port: int = 8046) -> Panel:
|
|
|
48
48
|
return Panel(brand_text, border_style="cyan", padding=(1, 2), expand=False)
|
|
49
49
|
|
|
50
50
|
|
|
51
|
-
def print_banner(console: Console, host: str = "127.0.0.1", port: int =
|
|
51
|
+
def print_banner(console: Console, host: str = "127.0.0.1", port: int = 3392) -> None:
|
|
52
52
|
"""通过指定 Console 打印品牌横幅.
|
|
53
53
|
|
|
54
54
|
Args:
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
server:
|
|
6
6
|
host: "127.0.0.1"
|
|
7
|
-
port:
|
|
7
|
+
port: 3392
|
|
8
8
|
|
|
9
9
|
logging:
|
|
10
10
|
level: "INFO"
|
|
@@ -522,3 +522,35 @@ auth:
|
|
|
522
522
|
# google_client_id: ""
|
|
523
523
|
# google_client_secret: ""
|
|
524
524
|
token_store_path: "~/.coding-proxy/tokens.json"
|
|
525
|
+
|
|
526
|
+
# === 原生 API 透传(/api/{openai,gemini,anthropic}/**)===
|
|
527
|
+
#
|
|
528
|
+
# 三家 provider 默认 enabled=true(开箱即用)。
|
|
529
|
+
# 客户端将 SDK base_url 改为 http://127.0.0.1:3392/api/{openai,gemini,anthropic}
|
|
530
|
+
# 即可直接触达官方上游;认证(Authorization / x-api-key / ?key=)由客户端自带,
|
|
531
|
+
# proxy 不保管凭据。
|
|
532
|
+
#
|
|
533
|
+
# 将 base_url 指向第三方代理的两种方式(优先级:env > yaml > 内置默认):
|
|
534
|
+
# 方式 A(推荐部署/容器场景):设置环境变量
|
|
535
|
+
# NATIVE_OPENAI_BASE_URL / NATIVE_GEMINI_BASE_URL / NATIVE_ANTHROPIC_BASE_URL
|
|
536
|
+
# 方式 B(推荐本地开发/团队共享):直接编辑下方 base_url 字段
|
|
537
|
+
#
|
|
538
|
+
# 如需禁用某家 provider,将对应 enabled 改为 false 即可。
|
|
539
|
+
# base_url 字段的值与 Pydantic 内置默认保持一致(由 tests/test_native_api_base_url_override.py
|
|
540
|
+
# 的 test_default_config_yaml_matches_pydantic_builtin 守护双写同步)。
|
|
541
|
+
native_api:
|
|
542
|
+
openai:
|
|
543
|
+
enabled: true
|
|
544
|
+
base_url: "https://api.openai.com"
|
|
545
|
+
timeout_ms: 300000
|
|
546
|
+
connect_timeout_ms: 15000
|
|
547
|
+
gemini:
|
|
548
|
+
enabled: true
|
|
549
|
+
base_url: "https://generativelanguage.googleapis.com"
|
|
550
|
+
timeout_ms: 300000
|
|
551
|
+
connect_timeout_ms: 15000
|
|
552
|
+
anthropic:
|
|
553
|
+
enabled: true
|
|
554
|
+
base_url: "https://api.anthropic.com"
|
|
555
|
+
timeout_ms: 300000
|
|
556
|
+
connect_timeout_ms: 15000
|