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.
Files changed (182) hide show
  1. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/CHANGELOG.md +7 -0
  2. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/PKG-INFO +11 -11
  3. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/README.md +10 -10
  4. coding_proxy-0.3.0a2/assets/dashboard-v0.2.4.png +0 -0
  5. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/arch/config-reference.md +52 -1
  6. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/arch/testing.md +1 -1
  7. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/framework.md +2 -11
  8. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/guide/api-reference.md +14 -14
  9. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/guide/cli-reference.md +4 -4
  10. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/guide/dashboard.md +1 -1
  11. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/guide/monitoring.md +8 -8
  12. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/guide/quickstart.md +4 -4
  13. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/user-guide.md +49 -4
  14. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/zh-CN/README.md +10 -10
  15. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/pyproject.toml +1 -1
  16. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/cli/__init__.py +2 -2
  17. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/cli/auth_commands.py +1 -1
  18. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/cli/banner.py +2 -2
  19. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/config/config.default.yaml +39 -1
  20. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/config/schema.py +11 -0
  21. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/config/server.py +1 -1
  22. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/vendor_channels.py +177 -9
  23. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/logging/db.py +78 -11
  24. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/logging/stats.py +102 -26
  25. coding_proxy-0.3.0a2/src/coding/proxy/native_api/__init__.py +84 -0
  26. coding_proxy-0.3.0a2/src/coding/proxy/native_api/config.py +110 -0
  27. coding_proxy-0.3.0a2/src/coding/proxy/native_api/extractors/__init__.py +12 -0
  28. coding_proxy-0.3.0a2/src/coding/proxy/native_api/extractors/anthropic.py +111 -0
  29. coding_proxy-0.3.0a2/src/coding/proxy/native_api/extractors/gemini.py +112 -0
  30. coding_proxy-0.3.0a2/src/coding/proxy/native_api/extractors/openai.py +231 -0
  31. coding_proxy-0.3.0a2/src/coding/proxy/native_api/handler.py +485 -0
  32. coding_proxy-0.3.0a2/src/coding/proxy/native_api/operation.py +167 -0
  33. coding_proxy-0.3.0a2/src/coding/proxy/native_api/routes.py +68 -0
  34. coding_proxy-0.3.0a2/src/coding/proxy/native_api/usage_registry.py +279 -0
  35. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/pricing.py +17 -1
  36. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/executor.py +19 -4
  37. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/usage_parser.py +65 -5
  38. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/usage_recorder.py +39 -1
  39. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/server/app.py +26 -0
  40. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/server/routes.py +31 -14
  41. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/anthropic.py +2 -1
  42. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_app_routes.py +17 -20
  43. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_banner.py +2 -2
  44. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_config_init.py +1 -1
  45. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_config_loader.py +6 -6
  46. coding_proxy-0.3.0a2/tests/test_native_api_base_url_override.py +166 -0
  47. coding_proxy-0.3.0a2/tests/test_native_api_extractors.py +331 -0
  48. coding_proxy-0.3.0a2/tests/test_native_api_handler.py +374 -0
  49. coding_proxy-0.3.0a2/tests/test_native_api_operation.py +130 -0
  50. coding_proxy-0.3.0a2/tests/test_native_api_routes.py +132 -0
  51. coding_proxy-0.3.0a2/tests/test_parse_usage_gemini.py +196 -0
  52. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_router_executor.py +162 -0
  53. coding_proxy-0.3.0a2/tests/test_token_logger_native_columns.py +334 -0
  54. coding_proxy-0.3.0a2/tests/test_vendor_channels.py +1731 -0
  55. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_zhipu.py +1 -1
  56. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/uv.lock +1 -1
  57. coding_proxy-0.2.4a5/assets/dashboard-v0.2.3.png +0 -0
  58. coding_proxy-0.2.4a5/src/coding/proxy/server/request_normalizer.py +0 -162
  59. coding_proxy-0.2.4a5/tests/test_request_normalizer.py +0 -811
  60. coding_proxy-0.2.4a5/tests/test_vendor_channels.py +0 -761
  61. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/.github/workflows/ci.yml +0 -0
  62. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/.github/workflows/coverage.yml +0 -0
  63. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/.github/workflows/release.yml +0 -0
  64. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/.gitignore +0 -0
  65. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/.pre-commit-config.yaml +0 -0
  66. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/AGENTS.md +0 -0
  67. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/CLAUDE.md +0 -0
  68. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/LICENSE +0 -0
  69. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/arch/convert.md +0 -0
  70. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/arch/design-patterns.md +0 -0
  71. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/arch/routing.md +0 -0
  72. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/arch/vendors.md +0 -0
  73. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/ci-cd.md +0 -0
  74. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/docs/guide/vendors.md +0 -0
  75. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/__init__.py +0 -0
  76. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/__init__.py +0 -0
  77. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/__main__.py +0 -0
  78. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/__init__.py +0 -0
  79. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/providers/__init__.py +0 -0
  80. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/providers/base.py +0 -0
  81. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/providers/github.py +0 -0
  82. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/providers/google.py +0 -0
  83. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/runtime.py +0 -0
  84. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/auth/store.py +0 -0
  85. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/compat/__init__.py +0 -0
  86. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/compat/canonical.py +0 -0
  87. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/compat/session_store.py +0 -0
  88. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/config/__init__.py +0 -0
  89. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/config/auth_schema.py +0 -0
  90. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/config/loader.py +0 -0
  91. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/config/resiliency.py +0 -0
  92. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/config/routing.py +0 -0
  93. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/config/vendors.py +0 -0
  94. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/__init__.py +0 -0
  95. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/anthropic_to_gemini.py +0 -0
  96. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/anthropic_to_openai.py +0 -0
  97. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/gemini_sse_adapter.py +0 -0
  98. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/gemini_to_anthropic.py +0 -0
  99. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/convert/openai_to_anthropic.py +0 -0
  100. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/logging/__init__.py +0 -0
  101. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/logging/formatters.py +0 -0
  102. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/model/__init__.py +0 -0
  103. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/model/auth.py +0 -0
  104. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/model/compat.py +0 -0
  105. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/model/constants.py +0 -0
  106. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/model/pricing.py +0 -0
  107. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/model/token.py +0 -0
  108. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/model/vendor.py +0 -0
  109. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/__init__.py +0 -0
  110. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/circuit_breaker.py +0 -0
  111. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/error_classifier.py +0 -0
  112. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/model_mapper.py +0 -0
  113. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/quota_guard.py +0 -0
  114. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/rate_limit.py +0 -0
  115. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/retry.py +0 -0
  116. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/router.py +0 -0
  117. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/session_manager.py +0 -0
  118. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/routing/tier.py +0 -0
  119. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/server/__init__.py +0 -0
  120. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/server/dashboard.py +0 -0
  121. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/server/factory.py +0 -0
  122. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/server/responses.py +0 -0
  123. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/streaming/__init__.py +0 -0
  124. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/streaming/anthropic_compat.py +0 -0
  125. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/__init__.py +0 -0
  126. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/alibaba.py +0 -0
  127. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/antigravity.py +0 -0
  128. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/base.py +0 -0
  129. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/copilot.py +0 -0
  130. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/copilot_models.py +0 -0
  131. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/copilot_token_manager.py +0 -0
  132. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/copilot_urls.py +0 -0
  133. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/doubao.py +0 -0
  134. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/kimi.py +0 -0
  135. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/minimax.py +0 -0
  136. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/mixins.py +0 -0
  137. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/native_anthropic.py +0 -0
  138. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/token_manager.py +0 -0
  139. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/xiaomi.py +0 -0
  140. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/src/coding/proxy/vendors/zhipu.py +0 -0
  141. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/__init__.py +0 -0
  142. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_antigravity.py +0 -0
  143. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_auto_login.py +0 -0
  144. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_circuit_breaker.py +0 -0
  145. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_cli_usage.py +0 -0
  146. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_compat.py +0 -0
  147. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_convert_request.py +0 -0
  148. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_convert_response.py +0 -0
  149. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_convert_sse.py +0 -0
  150. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_copilot.py +0 -0
  151. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_copilot_convert_request.py +0 -0
  152. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_copilot_convert_response.py +0 -0
  153. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_copilot_models.py +0 -0
  154. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_copilot_urls.py +0 -0
  155. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_currency.py +0 -0
  156. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_error_classifier.py +0 -0
  157. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_logging_dual_write.py +0 -0
  158. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_mixins.py +0 -0
  159. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_model_auth.py +0 -0
  160. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_model_compat.py +0 -0
  161. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_model_constants.py +0 -0
  162. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_model_mapper.py +0 -0
  163. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_model_pricing.py +0 -0
  164. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_model_token.py +0 -0
  165. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_model_vendor.py +0 -0
  166. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_native_vendors.py +0 -0
  167. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_parse_usage.py +0 -0
  168. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_pricing.py +0 -0
  169. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_quota_guard.py +0 -0
  170. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_rate_limit.py +0 -0
  171. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_router_chain.py +0 -0
  172. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_runtime_reauth.py +0 -0
  173. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_schema.py +0 -0
  174. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_streaming_anthropic_compat.py +0 -0
  175. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_tier.py +0 -0
  176. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_tiers_config.py +0 -0
  177. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_time_range.py +0 -0
  178. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_token_logger.py +0 -0
  179. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_token_manager.py +0 -0
  180. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_types.py +0 -0
  181. {coding_proxy-0.2.4a5 → coding_proxy-0.3.0a2}/tests/test_vendor_streaming.py +0 -0
  182. {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.2.4a5
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.3.png">
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=8046
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:8046 (Press CTRL+C to quit)
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:8046
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 | Example Usage |
123
- | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------- |
124
- | `start` | **Fire up the proxy server.** Supports custom ports and configuration paths. | `coding-proxy start -p 8080 -c ~/config.yaml` |
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. | `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` |
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.3.png">
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=8046
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:8046 (Press CTRL+C to quit)
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:8046
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 | Example Usage |
96
- | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------- |
97
- | `start` | **Fire up the proxy server.** Supports custom ports and configuration paths. | `coding-proxy start -p 8080 -c ~/config.yaml` |
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. | `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` |
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
 
@@ -49,7 +49,7 @@ flowchart TD
49
49
  | 字段 | 类型 | 默认值 | 说明 |
50
50
  | ------ | ---- | ------------- | -------- |
51
51
  | `host` | str | `"127.0.0.1"` | 监听地址 |
52
- | `port` | int | `8046` | 监听端口 |
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
- subgraph Normalize ["请求标准化"]
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:8046/
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:8046/v1/messages/count_tokens \
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:8046/health
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:8046/api/status
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:8046/api/reset
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:8046/api/reset \
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:8046/api/reset \
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:8046/api/copilot/diagnostics
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:8046/api/copilot/models
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:8046/api/reauth/status
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:8046/api/reauth/github
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:8046/dashboard
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:8046/api/dashboard/summary?days=7"
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:8046/api/dashboard/timeline?days=30"
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 8046
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` | 代理服务端口(默认 8046) |
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` | 代理服务端口(默认 8046) |
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` | 代理服务端口(默认 8046) |
214
+ | `--port` | `-p` | 代理服务端口(默认 3392) |
215
215
 
216
216
  **示例**:
217
217
 
@@ -7,7 +7,7 @@ coding-proxy 内置 Web 可视化看板,提供流量、用量、故障转移
7
7
  启动代理后,浏览器访问:
8
8
 
9
9
  ```
10
- http://127.0.0.1:8046/dashboard
10
+ http://127.0.0.1:3392/dashboard
11
11
  ```
12
12
 
13
13
  ## 功能概览
@@ -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:8046/health
70
+ curl http://127.0.0.1:3392/health
71
71
 
72
72
  # 详细状态(所有层级的熔断器、配额守卫、Rate Limit、诊断信息)
73
- curl http://127.0.0.1:8046/api/status
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:8046/dashboard` 查看 Web 可视化看板。详见 [Dashboard 文档](./dashboard.md)。
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:8046/api/reauth/github
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 :8046
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:8046`)
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:8046/api/copilot/diagnostics
188
+ curl http://127.0.0.1:3392/api/copilot/diagnostics
189
189
 
190
190
  # 探查可用模型
191
- curl http://127.0.0.1:8046/api/copilot/models
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:8046 (Press CTRL+C to quit)
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:8046/health
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:8046
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:8046/dashboard`
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:8046
122
+ export ANTHROPIC_BASE_URL=http://127.0.0.1:3392
122
123
 
123
124
  # 5. 验证
124
- curl http://127.0.0.1:8046/health
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: 8046
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:8046/dashboard` |
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.3.png">
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=8046
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:8046 (Press CTRL+C to quit)
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:8046
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` | **启动代理服务器**。支持自定义端口与配置路径。 | `coding-proxy start -p 8080 -c ~/config.yaml` |
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)与配额状态。 | `coding-proxy status` |
100
- | `usage` | **Token 统计看板**。按天/供应商/模型维度追踪每一次的 Token 消耗、故障转移及耗时。 | `coding-proxy usage -d 7 -v anthropic` |
101
- | `reset` | **强制一键重置**。人工确认主供应商恢复可用后,立刻初始化所有熔断器和配额状态。 | `coding-proxy 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