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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/PKG-INFO +1 -1
  2. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/pyproject.toml +1 -1
  3. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/executor.py +27 -4
  4. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_router_executor.py +34 -0
  5. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/uv.lock +1 -1
  6. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/.github/workflows/ci.yml +0 -0
  7. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/.github/workflows/coverage.yml +0 -0
  8. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/.github/workflows/release.yml +0 -0
  9. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/.gitignore +0 -0
  10. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/.pre-commit-config.yaml +0 -0
  11. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/AGENTS.md +0 -0
  12. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/CHANGELOG.md +0 -0
  13. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/CLAUDE.md +0 -0
  14. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/LICENSE +0 -0
  15. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/README.md +0 -0
  16. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/assets/dashboard-v0.4.0.png +0 -0
  17. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/assets/model-calling-v0.5.0.png +0 -0
  18. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/assets/session-v0.4.0.png +0 -0
  19. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/.agents/browser-validation.md +0 -0
  20. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/.agents/issue.md +0 -0
  21. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/.agents/knowledge-map.md +0 -0
  22. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/.agents/reference-specifications.md +0 -0
  23. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/arch/config-reference.md +0 -0
  24. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/arch/convert.md +0 -0
  25. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/arch/design-patterns.md +0 -0
  26. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/arch/routing.md +0 -0
  27. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/arch/testing.md +0 -0
  28. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/arch/vendors.md +0 -0
  29. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/framework.md +0 -0
  30. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/guide/api-reference.md +0 -0
  31. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/guide/cli-reference.md +0 -0
  32. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/guide/dashboard.md +0 -0
  33. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/guide/monitoring.md +0 -0
  34. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/guide/quickstart.md +0 -0
  35. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/guide/vendors.md +0 -0
  36. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/ops/ci-cd.md +0 -0
  37. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/user-guide.md +0 -0
  38. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/docs/zh-CN/README.md +0 -0
  39. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/__init__.py +0 -0
  40. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/__init__.py +0 -0
  41. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/__main__.py +0 -0
  42. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/auth/__init__.py +0 -0
  43. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/auth/providers/__init__.py +0 -0
  44. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/auth/providers/base.py +0 -0
  45. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/auth/providers/github.py +0 -0
  46. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/auth/providers/google.py +0 -0
  47. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/auth/runtime.py +0 -0
  48. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/auth/store.py +0 -0
  49. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/cli/__init__.py +0 -0
  50. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/cli/auth_commands.py +0 -0
  51. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/cli/banner.py +0 -0
  52. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/compat/__init__.py +0 -0
  53. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/compat/canonical.py +0 -0
  54. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/compat/session_store.py +0 -0
  55. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/__init__.py +0 -0
  56. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/auth_schema.py +0 -0
  57. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/config.default.yaml +0 -0
  58. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/loader.py +0 -0
  59. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/resiliency.py +0 -0
  60. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/routing.py +0 -0
  61. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/schema.py +0 -0
  62. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/server.py +0 -0
  63. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/session_policy.py +0 -0
  64. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/config/vendors.py +0 -0
  65. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/convert/__init__.py +0 -0
  66. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/convert/anthropic_to_gemini.py +0 -0
  67. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/convert/anthropic_to_openai.py +0 -0
  68. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/convert/gemini_sse_adapter.py +0 -0
  69. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/convert/gemini_to_anthropic.py +0 -0
  70. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/convert/openai_to_anthropic.py +0 -0
  71. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/convert/vendor_channels.py +0 -0
  72. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/logging/__init__.py +0 -0
  73. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/logging/db.py +0 -0
  74. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/logging/formatters.py +0 -0
  75. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/logging/stats.py +0 -0
  76. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/model/__init__.py +0 -0
  77. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/model/auth.py +0 -0
  78. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/model/compat.py +0 -0
  79. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/model/constants.py +0 -0
  80. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/model/pricing.py +0 -0
  81. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/model/token.py +0 -0
  82. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/model/vendor.py +0 -0
  83. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/__init__.py +0 -0
  84. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/config.py +0 -0
  85. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/extractors/__init__.py +0 -0
  86. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/extractors/anthropic.py +0 -0
  87. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/extractors/gemini.py +0 -0
  88. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/extractors/openai.py +0 -0
  89. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/handler.py +0 -0
  90. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/operation.py +0 -0
  91. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/routes.py +0 -0
  92. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/native_api/usage_registry.py +0 -0
  93. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/pricing.py +0 -0
  94. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/__init__.py +0 -0
  95. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/circuit_breaker.py +0 -0
  96. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/error_classifier.py +0 -0
  97. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/model_mapper.py +0 -0
  98. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/quota_guard.py +0 -0
  99. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/rate_limit.py +0 -0
  100. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/retry.py +0 -0
  101. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/router.py +0 -0
  102. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/session_manager.py +0 -0
  103. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/session_policy.py +0 -0
  104. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/tier.py +0 -0
  105. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/usage_parser.py +0 -0
  106. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/routing/usage_recorder.py +0 -0
  107. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/server/__init__.py +0 -0
  108. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/server/app.py +0 -0
  109. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/server/dashboard.py +0 -0
  110. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/server/factory.py +0 -0
  111. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/server/responses.py +0 -0
  112. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/server/routes.py +0 -0
  113. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/streaming/__init__.py +0 -0
  114. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/streaming/anthropic_compat.py +0 -0
  115. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/__init__.py +0 -0
  116. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/alibaba.py +0 -0
  117. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/anthropic.py +0 -0
  118. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/antigravity.py +0 -0
  119. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/base.py +0 -0
  120. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/concurrency.py +0 -0
  121. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/copilot.py +0 -0
  122. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/copilot_models.py +0 -0
  123. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/copilot_token_manager.py +0 -0
  124. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/copilot_urls.py +0 -0
  125. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/doubao.py +0 -0
  126. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/kimi.py +0 -0
  127. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/minimax.py +0 -0
  128. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/mixins.py +0 -0
  129. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/native_anthropic.py +0 -0
  130. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/token_manager.py +0 -0
  131. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/xiaomi.py +0 -0
  132. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/src/coding/proxy/vendors/zhipu.py +0 -0
  133. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/__init__.py +0 -0
  134. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/e2e/__init__.py +0 -0
  135. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/e2e/conftest.py +0 -0
  136. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/e2e/test_e2e_http.py +0 -0
  137. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/e2e/test_e2e_token.py +0 -0
  138. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/e2e/test_e2e_vendor.py +0 -0
  139. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_antigravity.py +0 -0
  140. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_app_routes.py +0 -0
  141. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_auto_login.py +0 -0
  142. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_banner.py +0 -0
  143. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_circuit_breaker.py +0 -0
  144. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_cli_usage.py +0 -0
  145. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_compat.py +0 -0
  146. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_concurrency_monitor.py +0 -0
  147. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_config_init.py +0 -0
  148. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_config_loader.py +0 -0
  149. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_convert_request.py +0 -0
  150. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_convert_response.py +0 -0
  151. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_convert_sse.py +0 -0
  152. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_copilot.py +0 -0
  153. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_copilot_convert_request.py +0 -0
  154. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_copilot_convert_response.py +0 -0
  155. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_copilot_models.py +0 -0
  156. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_copilot_urls.py +0 -0
  157. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_currency.py +0 -0
  158. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_error_classifier.py +0 -0
  159. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_executor_in_flight_tracking.py +0 -0
  160. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_logging_dual_write.py +0 -0
  161. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_mixins.py +0 -0
  162. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_model_auth.py +0 -0
  163. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_model_compat.py +0 -0
  164. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_model_constants.py +0 -0
  165. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_model_mapper.py +0 -0
  166. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_model_pricing.py +0 -0
  167. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_model_token.py +0 -0
  168. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_model_vendor.py +0 -0
  169. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_native_api_base_url_override.py +0 -0
  170. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_native_api_extractors.py +0 -0
  171. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_native_api_handler.py +0 -0
  172. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_native_api_operation.py +0 -0
  173. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_native_api_routes.py +0 -0
  174. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_native_vendors.py +0 -0
  175. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_parse_usage.py +0 -0
  176. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_parse_usage_gemini.py +0 -0
  177. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_pricing.py +0 -0
  178. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_quota_guard.py +0 -0
  179. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_rate_limit.py +0 -0
  180. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_router_chain.py +0 -0
  181. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_runtime_reauth.py +0 -0
  182. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_schema.py +0 -0
  183. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_session_aware.py +0 -0
  184. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_streaming_anthropic_compat.py +0 -0
  185. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_tier.py +0 -0
  186. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_tiers_config.py +0 -0
  187. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_time_range.py +0 -0
  188. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_token_logger.py +0 -0
  189. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_token_logger_native_columns.py +0 -0
  190. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_token_manager.py +0 -0
  191. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_types.py +0 -0
  192. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_vendor_channels.py +0 -0
  193. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_vendor_streaming.py +0 -0
  194. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_vendors.py +0 -0
  195. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_zhipu.py +0 -0
  196. {coding_proxy-0.5.1a5 → coding_proxy-0.5.1a6}/tests/test_zhipu_concurrency.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coding-proxy
3
- Version: 0.5.1a5
3
+ Version: 0.5.1a6
4
4
  Summary: A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao...
5
5
  Project-URL: Source Code, https://github.com/ThreeFish-AI/coding-proxy
6
6
  Project-URL: User Guide, https://github.com/ThreeFish-AI/coding-proxy/blob/master/docs/user-guide.md
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "coding-proxy"
3
- version = "0.5.1a5"
3
+ version = "0.5.1a6"
4
4
  description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -71,6 +71,11 @@ _NOISE_TAG_PATTERN = re.compile(
71
71
  flags=re.DOTALL | re.IGNORECASE,
72
72
  )
73
73
 
74
+ # <session> 标签需要特殊处理:当用户文本在 <session> 标签内部时,
75
+ # 完整块剥离会连同用户文本一起删除。此模式仅去除外壳标签(保留内容),
76
+ # 用于首轮完整剥离结果为空时的二次回退提取。
77
+ _SESSION_TAG_WRAPPER = re.compile(r"</?session\b[^>]*>", flags=re.IGNORECASE)
78
+
74
79
  # Slash command 子标签:用于识别 /commit、/review 等命令式调用,
75
80
  # 合成"命令 + 参数"式标题。
76
81
  _CMD_NAME_PATTERN = re.compile(r"<command-name>(.*?)</command-name>", flags=re.DOTALL)
@@ -80,6 +85,9 @@ _CMD_WRAPPER_PATTERN = re.compile(
80
85
  r"<command-[\w-]+>.*?</command-[\w-]+>", flags=re.DOTALL
81
86
  )
82
87
 
88
+ # 空白折叠
89
+ _WHITESPACE_PATTERN = re.compile(r"\s+")
90
+
83
91
 
84
92
  def _sanitize_user_text(raw: str) -> str:
85
93
  """剔除 Claude Code 注入的系统级 XML 块,还原真实用户输入。
@@ -88,8 +96,10 @@ def _sanitize_user_text(raw: str) -> str:
88
96
  1. Slash command 优先识别 — 若检测到 <command-name>,合成"命令 + 参数"
89
97
  式标题(因为残留文本通常为空,直接取标签内容更有意义)。
90
98
  2. 通用噪声剥离 — 移除已知白名单内的 system-reminder 等标签。
91
- 3. 残留 command-* 包裹清除 兜底去除 command-message 等次要标签。
92
- 4. 前后空白归一化 — 折叠连续空白为单空格,便于 30 字截断。
99
+ 3. <session> 二次回退若首轮剥离后为空,说明用户文本可能在 <session>
100
+ 标签内部;此时仅去除外壳标签,保留内部文本再做噪声剥离。
101
+ 4. 残留 command-* 包裹清除 — 兜底去除 command-message 等次要标签。
102
+ 5. 前后空白归一化 — 折叠连续空白为单空格。
93
103
  """
94
104
  if not raw:
95
105
  return ""
@@ -107,9 +117,22 @@ def _sanitize_user_text(raw: str) -> str:
107
117
  # 阶段二: 通用噪声剥离
108
118
  cleaned = _NOISE_TAG_PATTERN.sub("", raw)
109
119
  cleaned = _CMD_WRAPPER_PATTERN.sub("", cleaned)
120
+ cleaned = _WHITESPACE_PATTERN.sub(" ", cleaned).strip()
121
+ if cleaned:
122
+ return cleaned
123
+
124
+ # 阶段三: <session> 二次回退
125
+ # 当首轮全部剥离为空时,用户文本很可能被 <session> 标签完整包裹。
126
+ # 此时不去除 <session> 块,而是仅剥掉外壳标签,保留内部文本后重新剥离。
127
+ if "<session" in raw.lower():
128
+ inner = _SESSION_TAG_WRAPPER.sub("", raw)
129
+ cleaned = _NOISE_TAG_PATTERN.sub("", inner)
130
+ cleaned = _CMD_WRAPPER_PATTERN.sub("", cleaned)
131
+ cleaned = _WHITESPACE_PATTERN.sub(" ", cleaned).strip()
132
+ if cleaned:
133
+ return cleaned
110
134
 
111
- # 阶段三: 空白折叠
112
- return re.sub(r"\s+", " ", cleaned).strip()
135
+ return ""
113
136
 
114
137
 
115
138
  # ── Session 标题提取: 多层级回退策略 ──────────────────────────────
@@ -2277,6 +2277,40 @@ class TestSanitizeUserText:
2277
2277
  raw = "<thinking>\nline1\nline2\n</thinking>清理后文本"
2278
2278
  assert _sanitize_user_text(raw) == "清理后文本"
2279
2279
 
2280
+ # ── <session> 标签包裹用户文本的二次回退 ──
2281
+
2282
+ def test_session_tag_wrapping_user_text(self):
2283
+ """当 <session> 标签包裹用户文本时,二次回退应提取内部文本.
2284
+
2285
+ 注: session 元数据可能残留在标题前部,但用户文本现在可见,
2286
+ 远优于完全回退到 '[Session] model_name'.
2287
+ """
2288
+ raw = "<session>session metadata\n用户真实提问内容</session>"
2289
+ result = _sanitize_user_text(raw)
2290
+ assert "用户真实提问内容" in result
2291
+
2292
+ def test_session_tag_wrapping_with_inner_noise(self):
2293
+ """<session> 内部混合噪声标签时,二次回退应正确剥离噪声."""
2294
+ raw = (
2295
+ "<session>session_key: abc\n"
2296
+ "<system-reminder>噪声内容</system-reminder>"
2297
+ "用户真实输入"
2298
+ "</session>"
2299
+ )
2300
+ result = _sanitize_user_text(raw)
2301
+ assert "用户真实输入" in result
2302
+ assert "噪声内容" not in result
2303
+
2304
+ def test_session_tag_prefix_still_works(self):
2305
+ """用户文本在 <session> 标签之后(原有行为)仍正确."""
2306
+ raw = "<session>metadata</session>用户文本在外部"
2307
+ assert _sanitize_user_text(raw) == "用户文本在外部"
2308
+
2309
+ def test_all_noise_inside_session_tag(self):
2310
+ """<session> 内部全是噪声时,二次回退仍返回空."""
2311
+ raw = "<session><system-reminder>纯噪声</system-reminder></session>"
2312
+ assert _sanitize_user_text(raw) == ""
2313
+
2280
2314
 
2281
2315
  class TestExtractSessionTitle:
2282
2316
  """``_extract_session_title`` — 端到端从 CanonicalRequest 抽取标题."""
@@ -74,7 +74,7 @@ wheels = [
74
74
 
75
75
  [[package]]
76
76
  name = "coding-proxy"
77
- version = "0.5.1a5"
77
+ version = "0.5.1a6"
78
78
  source = { editable = "." }
79
79
  dependencies = [
80
80
  { name = "aiosqlite" },
File without changes
File without changes
File without changes
File without changes