coding-proxy 0.4.1a5__tar.gz → 0.4.1a6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/PKG-INFO +1 -1
  2. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/pyproject.toml +1 -1
  3. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/executor.py +67 -1
  4. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/uv.lock +1 -1
  5. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/.github/workflows/ci.yml +0 -0
  6. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/.github/workflows/coverage.yml +0 -0
  7. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/.github/workflows/release.yml +0 -0
  8. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/.gitignore +0 -0
  9. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/.pre-commit-config.yaml +0 -0
  10. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/AGENTS.md +0 -0
  11. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/CHANGELOG.md +0 -0
  12. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/CLAUDE.md +0 -0
  13. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/LICENSE +0 -0
  14. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/README.md +0 -0
  15. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/assets/dashboard-v0.4.0.png +0 -0
  16. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/assets/session-v0.4.0.png +0 -0
  17. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/agents/browser-validation.md +0 -0
  18. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/agents/issue.md +0 -0
  19. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/agents/knowledge-map.md +0 -0
  20. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/agents/reference-specifications.md +0 -0
  21. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/arch/config-reference.md +0 -0
  22. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/arch/convert.md +0 -0
  23. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/arch/design-patterns.md +0 -0
  24. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/arch/routing.md +0 -0
  25. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/arch/testing.md +0 -0
  26. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/arch/vendors.md +0 -0
  27. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/framework.md +0 -0
  28. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/guide/api-reference.md +0 -0
  29. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/guide/cli-reference.md +0 -0
  30. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/guide/dashboard.md +0 -0
  31. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/guide/monitoring.md +0 -0
  32. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/guide/quickstart.md +0 -0
  33. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/guide/vendors.md +0 -0
  34. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/ops/ci-cd.md +0 -0
  35. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/user-guide.md +0 -0
  36. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/docs/zh-CN/README.md +0 -0
  37. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/__init__.py +0 -0
  38. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/__init__.py +0 -0
  39. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/__main__.py +0 -0
  40. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/auth/__init__.py +0 -0
  41. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/auth/providers/__init__.py +0 -0
  42. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/auth/providers/base.py +0 -0
  43. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/auth/providers/github.py +0 -0
  44. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/auth/providers/google.py +0 -0
  45. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/auth/runtime.py +0 -0
  46. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/auth/store.py +0 -0
  47. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/cli/__init__.py +0 -0
  48. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/cli/auth_commands.py +0 -0
  49. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/cli/banner.py +0 -0
  50. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/compat/__init__.py +0 -0
  51. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/compat/canonical.py +0 -0
  52. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/compat/session_store.py +0 -0
  53. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/__init__.py +0 -0
  54. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/auth_schema.py +0 -0
  55. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/config.default.yaml +0 -0
  56. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/loader.py +0 -0
  57. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/resiliency.py +0 -0
  58. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/routing.py +0 -0
  59. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/schema.py +0 -0
  60. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/server.py +0 -0
  61. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/session_policy.py +0 -0
  62. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/config/vendors.py +0 -0
  63. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/__init__.py +0 -0
  64. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/anthropic_to_gemini.py +0 -0
  65. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/anthropic_to_openai.py +0 -0
  66. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/gemini_sse_adapter.py +0 -0
  67. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/gemini_to_anthropic.py +0 -0
  68. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/openai_to_anthropic.py +0 -0
  69. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/convert/vendor_channels.py +0 -0
  70. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/logging/__init__.py +0 -0
  71. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/logging/db.py +0 -0
  72. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/logging/formatters.py +0 -0
  73. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/logging/stats.py +0 -0
  74. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/model/__init__.py +0 -0
  75. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/model/auth.py +0 -0
  76. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/model/compat.py +0 -0
  77. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/model/constants.py +0 -0
  78. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/model/pricing.py +0 -0
  79. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/model/token.py +0 -0
  80. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/model/vendor.py +0 -0
  81. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/__init__.py +0 -0
  82. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/config.py +0 -0
  83. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/extractors/__init__.py +0 -0
  84. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/extractors/anthropic.py +0 -0
  85. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/extractors/gemini.py +0 -0
  86. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/extractors/openai.py +0 -0
  87. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/handler.py +0 -0
  88. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/operation.py +0 -0
  89. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/routes.py +0 -0
  90. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/native_api/usage_registry.py +0 -0
  91. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/pricing.py +0 -0
  92. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/__init__.py +0 -0
  93. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/circuit_breaker.py +0 -0
  94. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/error_classifier.py +0 -0
  95. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/model_mapper.py +0 -0
  96. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/quota_guard.py +0 -0
  97. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/rate_limit.py +0 -0
  98. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/retry.py +0 -0
  99. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/router.py +0 -0
  100. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/session_manager.py +0 -0
  101. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/session_policy.py +0 -0
  102. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/tier.py +0 -0
  103. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/usage_parser.py +0 -0
  104. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/routing/usage_recorder.py +0 -0
  105. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/server/__init__.py +0 -0
  106. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/server/app.py +0 -0
  107. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/server/dashboard.py +0 -0
  108. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/server/factory.py +0 -0
  109. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/server/responses.py +0 -0
  110. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/server/routes.py +0 -0
  111. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/streaming/__init__.py +0 -0
  112. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/streaming/anthropic_compat.py +0 -0
  113. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/__init__.py +0 -0
  114. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/alibaba.py +0 -0
  115. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/anthropic.py +0 -0
  116. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/antigravity.py +0 -0
  117. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/base.py +0 -0
  118. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/copilot.py +0 -0
  119. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/copilot_models.py +0 -0
  120. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/copilot_token_manager.py +0 -0
  121. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/copilot_urls.py +0 -0
  122. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/doubao.py +0 -0
  123. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/kimi.py +0 -0
  124. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/minimax.py +0 -0
  125. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/mixins.py +0 -0
  126. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/native_anthropic.py +0 -0
  127. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/token_manager.py +0 -0
  128. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/xiaomi.py +0 -0
  129. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/src/coding/proxy/vendors/zhipu.py +0 -0
  130. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/__init__.py +0 -0
  131. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/e2e/__init__.py +0 -0
  132. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/e2e/conftest.py +0 -0
  133. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/e2e/test_e2e_http.py +0 -0
  134. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/e2e/test_e2e_token.py +0 -0
  135. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/e2e/test_e2e_vendor.py +0 -0
  136. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_antigravity.py +0 -0
  137. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_app_routes.py +0 -0
  138. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_auto_login.py +0 -0
  139. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_banner.py +0 -0
  140. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_circuit_breaker.py +0 -0
  141. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_cli_usage.py +0 -0
  142. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_compat.py +0 -0
  143. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_config_init.py +0 -0
  144. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_config_loader.py +0 -0
  145. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_convert_request.py +0 -0
  146. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_convert_response.py +0 -0
  147. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_convert_sse.py +0 -0
  148. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_copilot.py +0 -0
  149. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_copilot_convert_request.py +0 -0
  150. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_copilot_convert_response.py +0 -0
  151. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_copilot_models.py +0 -0
  152. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_copilot_urls.py +0 -0
  153. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_currency.py +0 -0
  154. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_error_classifier.py +0 -0
  155. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_logging_dual_write.py +0 -0
  156. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_mixins.py +0 -0
  157. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_model_auth.py +0 -0
  158. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_model_compat.py +0 -0
  159. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_model_constants.py +0 -0
  160. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_model_mapper.py +0 -0
  161. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_model_pricing.py +0 -0
  162. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_model_token.py +0 -0
  163. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_model_vendor.py +0 -0
  164. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_native_api_base_url_override.py +0 -0
  165. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_native_api_extractors.py +0 -0
  166. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_native_api_handler.py +0 -0
  167. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_native_api_operation.py +0 -0
  168. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_native_api_routes.py +0 -0
  169. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_native_vendors.py +0 -0
  170. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_parse_usage.py +0 -0
  171. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_parse_usage_gemini.py +0 -0
  172. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_pricing.py +0 -0
  173. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_quota_guard.py +0 -0
  174. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_rate_limit.py +0 -0
  175. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_router_chain.py +0 -0
  176. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_router_executor.py +0 -0
  177. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_runtime_reauth.py +0 -0
  178. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_schema.py +0 -0
  179. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_session_aware.py +0 -0
  180. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_streaming_anthropic_compat.py +0 -0
  181. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_tier.py +0 -0
  182. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_tiers_config.py +0 -0
  183. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_time_range.py +0 -0
  184. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_token_logger.py +0 -0
  185. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_token_logger_native_columns.py +0 -0
  186. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_token_manager.py +0 -0
  187. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_types.py +0 -0
  188. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_vendor_channels.py +0 -0
  189. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_vendor_streaming.py +0 -0
  190. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_vendors.py +0 -0
  191. {coding_proxy-0.4.1a5 → coding_proxy-0.4.1a6}/tests/test_zhipu.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coding-proxy
3
- Version: 0.4.1a5
3
+ Version: 0.4.1a6
4
4
  Summary: A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao...
5
5
  Project-URL: Source Code, https://github.com/ThreeFish-AI/coding-proxy
6
6
  Project-URL: User Guide, https://github.com/ThreeFish-AI/coding-proxy/blob/master/docs/user-guide.md
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "coding-proxy"
3
- version = "0.4.1a5"
3
+ version = "0.4.1a6"
4
4
  description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -48,6 +48,58 @@ from ..compat.canonical import CompatibilityStatus, build_canonical_request
48
48
  logger = logging.getLogger(__name__)
49
49
 
50
50
 
51
+ def _build_semantic_rejection_diagnostic(body: dict[str, Any]) -> str:
52
+ """构建语义拒绝的请求体诊断上下文.
53
+
54
+ 在 semantic rejection 日志中附加请求体的可疑参数快照,
55
+ 用于定位供应商参数校验失败的具体祸根参数。
56
+ """
57
+ parts: list[str] = []
58
+ # 顶层不兼容参数
59
+ for key in ("thinking", "extended_thinking", "reasoning_effort"):
60
+ if key in body:
61
+ val = body[key]
62
+ parts.append(f"{key}={val!r:.80}")
63
+ # 会话历史中的 thinking blocks
64
+ thinking_count = 0
65
+ for msg in body.get("messages", []):
66
+ content = msg.get("content")
67
+ if not isinstance(content, list):
68
+ continue
69
+ for block in content:
70
+ if isinstance(block, dict) and block.get("type") in (
71
+ "thinking",
72
+ "redacted_thinking",
73
+ ):
74
+ thinking_count += 1
75
+ if thinking_count:
76
+ parts.append(f"thinking_blocks_in_history={thinking_count}")
77
+ # cache_control 存在检测
78
+ has_cc = False
79
+ for section in (
80
+ body.get("system", []) if isinstance(body.get("system"), list) else [],
81
+ *(
82
+ m.get("content", [])
83
+ for m in body.get("messages", [])
84
+ if isinstance(m.get("content"), list)
85
+ ),
86
+ body.get("tools", []),
87
+ ):
88
+ if isinstance(section, list):
89
+ for item in section:
90
+ if isinstance(item, dict) and "cache_control" in item:
91
+ has_cc = True
92
+ break
93
+ if has_cc:
94
+ break
95
+ if has_cc:
96
+ parts.append("cache_control_fields=present")
97
+ # 模型 + 消息数
98
+ parts.append(f"model={body.get('model', 'N/A')}")
99
+ parts.append(f"messages={len(body.get('messages', []))}")
100
+ return f" [{', '.join(parts)}]" if parts else ""
101
+
102
+
51
103
  def _log_http_error_detail(
52
104
  tier_name: str,
53
105
  exc: Exception,
@@ -601,12 +653,14 @@ class _RouteExecutor:
601
653
  )
602
654
 
603
655
  if not is_last and is_semantic:
656
+ diagnostic = _build_semantic_rejection_diagnostic(body)
604
657
  logger.warning(
605
- "Tier %s semantic rejection (type=%s, msg=%s), "
658
+ "Tier %s semantic rejection (type=%s, msg=%s)%s, "
606
659
  "trying next tier without recording failure",
607
660
  tier.name,
608
661
  resp.error_type or resp.status_code,
609
662
  (resp.error_message or "N/A")[:200],
663
+ diagnostic,
610
664
  )
611
665
  failed_tier_name = tier.name
612
666
  continue
@@ -838,6 +892,18 @@ class _RouteExecutor:
838
892
  )
839
893
 
840
894
  if semantic_rejection and not is_last:
895
+ if request_body is not None:
896
+ diagnostic = _build_semantic_rejection_diagnostic(request_body)
897
+ logger.warning(
898
+ "Tier %s stream semantic rejection (type=%s, msg=%s)%s, "
899
+ "trying next tier without recording failure",
900
+ tier.name,
901
+ error.get("type") if isinstance(error, dict) else None,
902
+ (error.get("message") if isinstance(error, dict) else "N/A")[
903
+ :200
904
+ ],
905
+ diagnostic,
906
+ )
841
907
  return True, tier.name, exc
842
908
 
843
909
  rl_info = parse_rate_limit_headers(
@@ -74,7 +74,7 @@ wheels = [
74
74
 
75
75
  [[package]]
76
76
  name = "coding-proxy"
77
- version = "0.4.1a5"
77
+ version = "0.4.1a6"
78
78
  source = { editable = "." }
79
79
  dependencies = [
80
80
  { name = "aiosqlite" },
File without changes
File without changes
File without changes
File without changes