eggpool 0.4.3__tar.gz → 0.4.4__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 (283) hide show
  1. {eggpool-0.4.3 → eggpool-0.4.4}/CHANGELOG.md +8 -0
  2. {eggpool-0.4.3 → eggpool-0.4.4}/PKG-INFO +1 -1
  3. {eggpool-0.4.3 → eggpool-0.4.4}/pyproject.toml +1 -1
  4. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/api/proxy_request.py +2 -0
  5. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/app.py +2 -1
  6. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/catalog/cache.py +13 -6
  7. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/cli_full.py +23 -0
  8. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/request/coordinator.py +7 -1
  9. eggpool-0.4.4/src/eggpool/routing/config.py +21 -0
  10. {eggpool-0.4.3 → eggpool-0.4.4}/uv.lock +1 -1
  11. {eggpool-0.4.3 → eggpool-0.4.4}/.env.example +0 -0
  12. {eggpool-0.4.3 → eggpool-0.4.4}/.github/workflows/ci.yml +0 -0
  13. {eggpool-0.4.3 → eggpool-0.4.4}/.github/workflows/release.yml +0 -0
  14. {eggpool-0.4.3 → eggpool-0.4.4}/.gitignore +0 -0
  15. {eggpool-0.4.3 → eggpool-0.4.4}/AGENTS.md +0 -0
  16. {eggpool-0.4.3 → eggpool-0.4.4}/LICENSE +0 -0
  17. {eggpool-0.4.3 → eggpool-0.4.4}/README.md +0 -0
  18. {eggpool-0.4.3 → eggpool-0.4.4}/architecture/README.md +0 -0
  19. {eggpool-0.4.3 → eggpool-0.4.4}/config-examples/claude-code.env +0 -0
  20. {eggpool-0.4.3 → eggpool-0.4.4}/config-examples/opencode.jsonc +0 -0
  21. {eggpool-0.4.3 → eggpool-0.4.4}/config.example.toml +0 -0
  22. {eggpool-0.4.3 → eggpool-0.4.4}/deploy/eggpool-logrotate.conf +0 -0
  23. {eggpool-0.4.3 → eggpool-0.4.4}/deploy/eggpool.service +0 -0
  24. {eggpool-0.4.3 → eggpool-0.4.4}/deploy/env.example +0 -0
  25. {eggpool-0.4.3 → eggpool-0.4.4}/docs/backup-restore.md +0 -0
  26. {eggpool-0.4.3 → eggpool-0.4.4}/docs/deployment.md +0 -0
  27. {eggpool-0.4.3 → eggpool-0.4.4}/docs/filesystem-layout.md +0 -0
  28. {eggpool-0.4.3 → eggpool-0.4.4}/docs/firewall.md +0 -0
  29. {eggpool-0.4.3 → eggpool-0.4.4}/docs/model-limits.md +0 -0
  30. {eggpool-0.4.3 → eggpool-0.4.4}/docs/network-diagnostics.md +0 -0
  31. {eggpool-0.4.3 → eggpool-0.4.4}/docs/providers.md +0 -0
  32. {eggpool-0.4.3 → eggpool-0.4.4}/docs/proxy.md +0 -0
  33. {eggpool-0.4.3 → eggpool-0.4.4}/docs/raspberry-pi.md +0 -0
  34. {eggpool-0.4.3 → eggpool-0.4.4}/docs/transcoding.md +0 -0
  35. {eggpool-0.4.3 → eggpool-0.4.4}/scripts/__init__.py +0 -0
  36. {eggpool-0.4.3 → eggpool-0.4.4}/scripts/check_database.py +0 -0
  37. {eggpool-0.4.3 → eggpool-0.4.4}/scripts/install.sh +0 -0
  38. {eggpool-0.4.3 → eggpool-0.4.4}/scripts/install_prompt.py +0 -0
  39. {eggpool-0.4.3 → eggpool-0.4.4}/scripts/smoke_test.py +0 -0
  40. {eggpool-0.4.3 → eggpool-0.4.4}/scripts/validate_routing.py +0 -0
  41. {eggpool-0.4.3 → eggpool-0.4.4}/scripts/verify_upstream_auth.py +0 -0
  42. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/__init__.py +0 -0
  43. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/__main__.py +0 -0
  44. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/_share/.env.example +0 -0
  45. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/_share/config.example.toml +0 -0
  46. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/accounts/__init__.py +0 -0
  47. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/accounts/registry.py +0 -0
  48. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/accounts/state.py +0 -0
  49. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/api/__init__.py +0 -0
  50. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/api/backoff.py +0 -0
  51. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/api/chat_completions.py +0 -0
  52. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/api/errors.py +0 -0
  53. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/api/messages.py +0 -0
  54. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/api/model_info.py +0 -0
  55. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/api/models.py +0 -0
  56. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/api/network.py +0 -0
  57. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/api/runtime.py +0 -0
  58. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/api/stats.py +0 -0
  59. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/api/update.py +0 -0
  60. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/auth.py +0 -0
  61. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/background/__init__.py +0 -0
  62. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/background/backup.py +0 -0
  63. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/background/cleanup.py +0 -0
  64. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/catalog/__init__.py +0 -0
  65. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/catalog/catalog_resolvers.py +0 -0
  66. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/catalog/fetcher.py +0 -0
  67. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/catalog/limits.py +0 -0
  68. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/catalog/normalizer.py +0 -0
  69. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/catalog/pricing.py +0 -0
  70. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/catalog/pricing_aliases.py +0 -0
  71. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/catalog/pricing_resolver.py +0 -0
  72. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/catalog/protocols.py +0 -0
  73. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/catalog/service.py +0 -0
  74. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/cli.py +0 -0
  75. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/config.py +0 -0
  76. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/config_utils.py +0 -0
  77. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/constants.py +0 -0
  78. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/cost_recompute.py +0 -0
  79. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/__init__.py +0 -0
  80. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/_resources.py +0 -0
  81. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/escape.py +0 -0
  82. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/render.py +0 -0
  83. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/routes.py +0 -0
  84. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/static/chart.umd.min.js +0 -0
  85. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/static/dashboard.css +0 -0
  86. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/static/dashboard.js +0 -0
  87. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/static/favicon.svg +0 -0
  88. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/theme.py +0 -0
  89. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Booberry.toml +0 -0
  90. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Catppuccin Latte.toml +0 -0
  91. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Catppuccin Macchiato.toml +0 -0
  92. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Catppuccin Mocha.toml +0 -0
  93. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Cyber Red.toml +0 -0
  94. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Cyberpunk.toml +0 -0
  95. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Dark Green.toml +0 -0
  96. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Discord (80_ Saturation).toml +0 -0
  97. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Discord.toml +0 -0
  98. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Dracula.toml +0 -0
  99. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Ferra Light.toml +0 -0
  100. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Flexor Dark.toml +0 -0
  101. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Gruvbox.toml +0 -0
  102. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Halcyon Dark.toml +0 -0
  103. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/IntelliJ Light.toml +0 -0
  104. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Kanagawa.toml +0 -0
  105. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Macaw Dark.toml +0 -0
  106. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Macaw Light.toml +0 -0
  107. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Matrix.toml +0 -0
  108. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Noctis Lilac.toml +0 -0
  109. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Nord.toml +0 -0
  110. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Nostromo Terminal.toml +0 -0
  111. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/One Dark.toml +0 -0
  112. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Oxocarbon.toml +0 -0
  113. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Rose Pine Dawn.toml +0 -0
  114. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Rose Pine Moon.toml +0 -0
  115. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Rose Pine.toml +0 -0
  116. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Solarized Dark.toml +0 -0
  117. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Sonokai.toml +0 -0
  118. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Tokyo Night Storm.toml +0 -0
  119. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/VESPER.toml +0 -0
  120. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/Zenburn.toml +0 -0
  121. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/acton.toml +0 -0
  122. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/bam.toml +0 -0
  123. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/base16-atelier-forest-light.toml +0 -0
  124. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/berlin.toml +0 -0
  125. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/black but with important highlights.toml +0 -0
  126. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/broc.toml +0 -0
  127. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/cork.toml +0 -0
  128. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/ferra.toml +0 -0
  129. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/forest.toml +0 -0
  130. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/lisbon.toml +0 -0
  131. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/midnight.toml +0 -0
  132. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/oslo.toml +0 -0
  133. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/plum.toml +0 -0
  134. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/portland.toml +0 -0
  135. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/sunset.toml +0 -0
  136. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/tofino.toml +0 -0
  137. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/vanimo.toml +0 -0
  138. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/dashboard/themes/vik.toml +0 -0
  139. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/__init__.py +0 -0
  140. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/connection.py +0 -0
  141. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/migrations.py +0 -0
  142. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/repositories.py +0 -0
  143. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/rollup_repository.py +0 -0
  144. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0001_initial.sql +0 -0
  145. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0002_indexes.sql +0 -0
  146. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0003_request_attempts.sql +0 -0
  147. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0004_integration_hardening.sql +0 -0
  148. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0005_price_microdollars.sql +0 -0
  149. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0006_correct_price_microdollars.sql +0 -0
  150. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0007_price_cache_rates.sql +0 -0
  151. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0008_proxy_request_identity.sql +0 -0
  152. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0009_model_protocol_source.sql +0 -0
  153. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0010_health_probe.sql +0 -0
  154. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0011_model_resolution_status.sql +0 -0
  155. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0012_drop_reservations_estimated_microdollars.sql +0 -0
  156. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0013_request_attempts_account_id_index.sql +0 -0
  157. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0014_bandwidth_tracking.sql +0 -0
  158. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0015_multi_provider.sql +0 -0
  159. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0016_requests_provider_id.sql +0 -0
  160. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0017_price_snapshots_provider_id.sql +0 -0
  161. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0018_provider_pings.sql +0 -0
  162. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0019_client_ip.sql +0 -0
  163. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0020_performance_indexes.sql +0 -0
  164. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0021_provider_model_metadata.sql +0 -0
  165. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0022_dashboard_indexes.sql +0 -0
  166. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0023_deprecated_model_placeholder.sql +0 -0
  167. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0024_account_backoffs.sql +0 -0
  168. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0025_stale_request_index.sql +0 -0
  169. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0026_attempt_observability.sql +0 -0
  170. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0027_routing_decisions.sql +0 -0
  171. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0028_operational_events.sql +0 -0
  172. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0029_latency_phases.sql +0 -0
  173. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0030_model_pricing_aliases.sql +0 -0
  174. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0031_price_snapshot_provenance.sql +0 -0
  175. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0032_usage_rollups.sql +0 -0
  176. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0033_request_provider_local_cost.sql +0 -0
  177. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0034_transcoding_daily.sql +0 -0
  178. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0035_routing_decision_score_components.sql +0 -0
  179. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0036_model_info.sql +0 -0
  180. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0037_model_info_failure_count.sql +0 -0
  181. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/0038_model_info_phase5.sql +0 -0
  182. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/db/schema/checksums.json +0 -0
  183. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/deploy/__init__.py +0 -0
  184. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/deploy_user.py +0 -0
  185. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/errors.py +0 -0
  186. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/fastcli.py +0 -0
  187. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/health/__init__.py +0 -0
  188. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/health/backoff.py +0 -0
  189. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/health/circuit_breaker.py +0 -0
  190. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/health/health_manager.py +0 -0
  191. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/integrations/__init__.py +0 -0
  192. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/integrations/aider.py +0 -0
  193. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/integrations/cline.py +0 -0
  194. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/integrations/codex.py +0 -0
  195. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/integrations/common.py +0 -0
  196. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/integrations/continue_dev.py +0 -0
  197. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/integrations/goose.py +0 -0
  198. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/integrations/kilo.py +0 -0
  199. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/integrations/opencode.py +0 -0
  200. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/integrations/openhands.py +0 -0
  201. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/integrations/qwen_code.py +0 -0
  202. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/integrations/roo_code.py +0 -0
  203. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/lifecycle/__init__.py +0 -0
  204. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/lifecycle/backup.py +0 -0
  205. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/lifecycle/uninstall.py +0 -0
  206. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/logging.py +0 -0
  207. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/metrics/__init__.py +0 -0
  208. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/metrics/buffer.py +0 -0
  209. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/model_info/__init__.py +0 -0
  210. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/model_info/dedup.py +0 -0
  211. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/model_info/identity.py +0 -0
  212. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/model_info/repository.py +0 -0
  213. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/model_info/scheduler.py +0 -0
  214. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/model_info/service.py +0 -0
  215. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/model_info/sources/__init__.py +0 -0
  216. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/model_info/sources/artificial_analysis.py +0 -0
  217. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/model_info/sources/base.py +0 -0
  218. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/model_info/sources/huggingface.py +0 -0
  219. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/model_info/sources/openrouter.py +0 -0
  220. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/model_info/sources/provider_catalog.py +0 -0
  221. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/model_info/types.py +0 -0
  222. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/models/__init__.py +0 -0
  223. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/models/api.py +0 -0
  224. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/models/config.py +0 -0
  225. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/models/database.py +0 -0
  226. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/models/domain.py +0 -0
  227. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/onboard.py +0 -0
  228. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/providers/__init__.py +0 -0
  229. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/providers/_templates.toml +0 -0
  230. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/providers/auth.py +0 -0
  231. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/providers/client_pool.py +0 -0
  232. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/providers/connect.py +0 -0
  233. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/providers/contract.py +0 -0
  234. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/providers/dns_cache.py +0 -0
  235. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/providers/outbound.py +0 -0
  236. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/providers/pproxy_transport.py +0 -0
  237. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/proxy/__init__.py +0 -0
  238. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/proxy/client.py +0 -0
  239. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/proxy/cost_reporting.py +0 -0
  240. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/proxy/sse_observer.py +0 -0
  241. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/proxy/usage.py +0 -0
  242. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/py.typed +0 -0
  243. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/quota/__init__.py +0 -0
  244. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/quota/audit.py +0 -0
  245. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/quota/estimation.py +0 -0
  246. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/quota/reservation.py +0 -0
  247. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/quota/scorer.py +0 -0
  248. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/request/__init__.py +0 -0
  249. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/request/attempt_finalizer.py +0 -0
  250. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/request/body.py +0 -0
  251. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/request/finalizer.py +0 -0
  252. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/request/limits.py +0 -0
  253. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/retry/__init__.py +0 -0
  254. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/retry/classification.py +0 -0
  255. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/routing/__init__.py +0 -0
  256. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/routing/eligibility.py +0 -0
  257. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/routing/fairness.py +0 -0
  258. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/routing/provider.py +0 -0
  259. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/routing/router.py +0 -0
  260. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/runtime.py +0 -0
  261. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/runtime_dispatch.py +0 -0
  262. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/runtime_metrics.py +0 -0
  263. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/runtime_paths.py +0 -0
  264. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/security/__init__.py +0 -0
  265. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/security/redaction.py +0 -0
  266. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/stats/__init__.py +0 -0
  267. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/stats/grouped_timeseries.py +0 -0
  268. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/stats/queries.py +0 -0
  269. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/stats/service.py +0 -0
  270. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/toml_edit.py +0 -0
  271. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/transcoder/__init__.py +0 -0
  272. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/transcoder/anthropic_to_openai.py +0 -0
  273. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/transcoder/context.py +0 -0
  274. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/transcoder/errors.py +0 -0
  275. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/transcoder/ids.py +0 -0
  276. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/transcoder/json_helpers.py +0 -0
  277. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/transcoder/openai_to_anthropic.py +0 -0
  278. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/transcoder/policy.py +0 -0
  279. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/transcoder/protocol.py +0 -0
  280. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/transcoder/static_headers.py +0 -0
  281. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/transcoder/streaming.py +0 -0
  282. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/transcoder/usage.py +0 -0
  283. {eggpool-0.4.3 → eggpool-0.4.4}/src/eggpool/update_checker.py +0 -0
@@ -9,6 +9,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  Nothing yet.
11
11
 
12
+ ## [0.4.4] - 2026-06-30
13
+
14
+ ### Fixed
15
+
16
+ - **Provider-scoped transcodable protocol lookup**. `get_transcodable_protocols` and `count_eligible_accounts_for_protocol` on `ModelCatalogCache` now accept an optional `provider_id` filter so protocol inference and eligibility counting only consider accounts that belong to a specific provider. `_infer_upstream_protocol` in `proxy_request.py` and `RequestCoordinator._resolve_upstream_protocol` pass the selected account's `provider_id`, preventing cross-provider protocol leakage when the same model is served by providers with different protocol surfaces.
17
+ - **MiniMax token-plan contract warning**. `check-config` now emits a warning when a MiniMax provider entry targets `api.minimax.io` with `openai` protocol but does not use the `/anthropic` path — token-plan keys hitting the OpenAI `/v1/chat/completions` surface can return upstream `insufficient balance (1008)` errors.
18
+ - **`build_upstream_headers` now receives the upstream protocol**. The coordinator passes `context.upstream_protocol` to `build_upstream_headers` so protocol-specific auth header construction (e.g. `x-api-key` for Anthropic vs `Authorization: Bearer` for OpenAI) uses the correct upstream protocol instead of the client's protocol.
19
+
12
20
  ## [0.4.3] - 2026-06-30
13
21
 
14
22
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eggpool
3
- Version: 0.4.3
3
+ Version: 0.4.4
4
4
  Summary: A lightweight proxy that aggregates multiple LLM provider accounts behind one OpenAI-compatible endpoint
5
5
  Project-URL: Homepage, https://github.com/eggstack/eggpool
6
6
  Project-URL: Repository, https://github.com/eggstack/eggpool
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "eggpool"
3
- version = "0.4.3"
3
+ version = "0.4.4"
4
4
  description = "A lightweight proxy that aggregates multiple LLM provider accounts behind one OpenAI-compatible endpoint"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -147,6 +147,7 @@ def _infer_upstream_protocol(
147
147
  candidates = catalog.cache.get_transcodable_protocols(
148
148
  model_id,
149
149
  client_protocol=client_protocol,
150
+ provider_id=provider_id,
150
151
  )
151
152
  if not candidates:
152
153
  return None
@@ -155,6 +156,7 @@ def _infer_upstream_protocol(
155
156
  p: catalog.cache.count_eligible_accounts_for_protocol(
156
157
  model_id,
157
158
  p,
159
+ provider_id=provider_id,
158
160
  )
159
161
  for p in candidates
160
162
  }
@@ -67,6 +67,7 @@ from eggpool.providers.client_pool import ProviderClientPool
67
67
  from eggpool.providers.dns_cache import DnsNetworkBackend
68
68
  from eggpool.providers.outbound import OutboundClientManager, default_network_backend
69
69
  from eggpool.request.coordinator import RequestCoordinator
70
+ from eggpool.routing.config import routing_stale_after_s
70
71
  from eggpool.routing.router import Router
71
72
  from eggpool.runtime_dispatch import DispatchOverheadRecorder
72
73
  from eggpool.stats import StatsService
@@ -784,7 +785,7 @@ async def _lifespan_runtime(app: FastAPI) -> AsyncGenerator[None]:
784
785
  registry,
785
786
  catalog,
786
787
  health_manager=health_manager,
787
- stale_after_s=float(config.models.stale_after_s),
788
+ stale_after_s=routing_stale_after_s(config),
788
789
  local_quota_mode=config.routing.local_quota_mode,
789
790
  fairness_mode=config.routing.fairness_mode,
790
791
  fairness_epsilon=config.routing.fairness_epsilon,
@@ -789,6 +789,7 @@ class ModelCatalogCache:
789
789
  model_id: str,
790
790
  *,
791
791
  client_protocol: str,
792
+ provider_id: str | None = None,
792
793
  ) -> set[str]:
793
794
  """Return the set of protocols a model can reach, minus the client protocol.
794
795
 
@@ -798,11 +799,13 @@ class ModelCatalogCache:
798
799
  supporting = self.get_supporting_accounts(model_id)
799
800
  protocols: set[str] = set()
800
801
  for account_name in supporting:
801
- provider_id = self._account_providers.get(account_name)
802
- if provider_id is None:
802
+ account_provider_id = self._account_providers.get(account_name)
803
+ if account_provider_id is None:
804
+ continue
805
+ if provider_id is not None and account_provider_id != provider_id:
803
806
  continue
804
807
  if self._config is not None:
805
- provider = self._config.providers.get(provider_id)
808
+ provider = self._config.providers.get(account_provider_id)
806
809
  if provider is not None:
807
810
  for proto in provider.protocols:
808
811
  protocols.add(proto)
@@ -813,17 +816,21 @@ class ModelCatalogCache:
813
816
  self,
814
817
  model_id: str,
815
818
  protocol: str,
819
+ *,
820
+ provider_id: str | None = None,
816
821
  ) -> int:
817
822
  """Count enabled accounts whose provider supports *protocol* and
818
823
  has the model in its catalogue."""
819
824
  supporting = self.get_supporting_accounts(model_id)
820
825
  n = 0
821
826
  for account_name in supporting:
822
- provider_id = self._account_providers.get(account_name)
823
- if provider_id is None:
827
+ account_provider_id = self._account_providers.get(account_name)
828
+ if account_provider_id is None:
829
+ continue
830
+ if provider_id is not None and account_provider_id != provider_id:
824
831
  continue
825
832
  if self._config is not None:
826
- provider = self._config.providers.get(provider_id)
833
+ provider = self._config.providers.get(account_provider_id)
827
834
  if provider is not None and protocol in provider.protocols:
828
835
  n += 1
829
836
  return n
@@ -11,6 +11,7 @@ import zipfile
11
11
  from contextlib import suppress
12
12
  from pathlib import Path
13
13
  from typing import TYPE_CHECKING, Any, cast
14
+ from urllib.parse import urlsplit
14
15
 
15
16
  if TYPE_CHECKING:
16
17
  from collections.abc import Callable, Coroutine
@@ -599,6 +600,22 @@ def _check_stale_contracts(config: AppConfig, config_path: str) -> list[str]:
599
600
  "in protocols; the field will be ignored"
600
601
  )
601
602
 
603
+ parsed_base = urlsplit(provider.base_url)
604
+ if (
605
+ parsed_base.hostname == "api.minimax.io"
606
+ and "openai" in provider.protocols
607
+ and parsed_base.path.rstrip("/") != "/anthropic"
608
+ ):
609
+ warnings.append(
610
+ f"[{provider.id}] api.minimax.io token-plan keys should use "
611
+ "the Anthropic-compatible MiniMax contract "
612
+ "(base_url='https://api.minimax.io/anthropic', "
613
+ "protocols=['anthropic'], anthropic_path='/v1/messages', "
614
+ "auth.header='x-api-key'); the OpenAI "
615
+ "/v1/chat/completions surface can return upstream "
616
+ "'insufficient balance (1008)' for token-plan keys"
617
+ )
618
+
602
619
  if endpoint is not None:
603
620
  try:
604
621
  compose_provider_url(provider, endpoint.path)
@@ -3296,6 +3313,7 @@ def accounts_explain(
3296
3313
  from eggpool.catalog.cache import ModelCatalogCache
3297
3314
  from eggpool.models.config import AppConfig
3298
3315
  from eggpool.quota.estimation import QuotaEstimator
3316
+ from eggpool.routing.config import routing_stale_after_s
3299
3317
  from eggpool.routing.router import Router
3300
3318
 
3301
3319
  config_path: str = ctx.obj["config_path"]
@@ -3342,6 +3360,11 @@ def accounts_explain(
3342
3360
  registry,
3343
3361
  catalog, # type: ignore[reportArgumentType]
3344
3362
  quota_estimator=quota_estimator,
3363
+ stale_after_s=routing_stale_after_s(config),
3364
+ local_quota_mode=config.routing.local_quota_mode,
3365
+ fairness_mode=config.routing.fairness_mode,
3366
+ fairness_epsilon=config.routing.fairness_epsilon,
3367
+ fairness_scope=config.routing.fairness_scope,
3345
3368
  )
3346
3369
  rows = await router.explain_account_eligibility(
3347
3370
  model_id=model_id,
@@ -1858,7 +1858,11 @@ class RequestCoordinator:
1858
1858
  else None
1859
1859
  )
1860
1860
  if provider_cfg is not None:
1861
- auth_headers = build_upstream_headers(provider_cfg, selected.api_key)
1861
+ auth_headers = build_upstream_headers(
1862
+ provider_cfg,
1863
+ selected.api_key,
1864
+ protocol=context.upstream_protocol,
1865
+ )
1862
1866
  sanitized.update(auth_headers)
1863
1867
  if logger.isEnabledFor(logging.DEBUG):
1864
1868
  auth_shape = build_auth_headers(provider_cfg, selected.api_key)
@@ -2573,6 +2577,7 @@ class RequestCoordinator:
2573
2577
  candidates = self._catalog.cache.get_transcodable_protocols(
2574
2578
  context.model_id,
2575
2579
  client_protocol=context.protocol,
2580
+ provider_id=context.provider_id,
2576
2581
  )
2577
2582
  if not candidates:
2578
2583
  return None
@@ -2582,6 +2587,7 @@ class RequestCoordinator:
2582
2587
  p: self._catalog.cache.count_eligible_accounts_for_protocol(
2583
2588
  context.model_id,
2584
2589
  p,
2590
+ provider_id=context.provider_id,
2585
2591
  )
2586
2592
  for p in candidates
2587
2593
  }
@@ -0,0 +1,21 @@
1
+ """Routing configuration helpers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING
6
+
7
+ if TYPE_CHECKING:
8
+ from eggpool.models.config import AppConfig
9
+
10
+
11
+ def routing_stale_after_s(config: AppConfig) -> float | None:
12
+ """Return the per-account catalog stale gate for routing.
13
+
14
+ ``allow_stale_catalog`` means EggPool may continue serving from
15
+ previously known catalog support when refreshes are uncertain. In
16
+ that mode, routing must not silently de-pool healthy sibling
17
+ accounts just because their per-account refresh timestamp aged out.
18
+ """
19
+ if config.models.allow_stale_catalog:
20
+ return None
21
+ return float(config.models.stale_after_s)
@@ -196,7 +196,7 @@ wheels = [
196
196
 
197
197
  [[package]]
198
198
  name = "eggpool"
199
- version = "0.4.3"
199
+ version = "0.4.4"
200
200
  source = { editable = "." }
201
201
  dependencies = [
202
202
  { name = "aiosqlite" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes