freesolo-flash-dev 0.2.32__tar.gz → 0.2.33__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 (273) hide show
  1. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/PKG-INFO +1 -1
  2. freesolo_flash_dev-0.2.33/flash/serve/pricing.py +94 -0
  3. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/pyproject.toml +2 -2
  4. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_serving_contract.py +36 -3
  5. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/uv.lock +1 -1
  6. freesolo_flash_dev-0.2.32/flash/serve/pricing.py +0 -58
  7. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/.dockerignore +0 -0
  8. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/.env.example +0 -0
  9. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/.github/workflows/auto-rebake.yml +0 -0
  10. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/.github/workflows/bake-kernel-cache.yml +0 -0
  11. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/.github/workflows/ci.yml +0 -0
  12. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/.github/workflows/main-source-guard.yml +0 -0
  13. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/.github/workflows/publish-dev.yml +0 -0
  14. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/.github/workflows/publish-image.yml +0 -0
  15. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/.github/workflows/publish.yml +0 -0
  16. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/.github/workflows/version-parity.yml +0 -0
  17. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/.github/workflows/worker-image.yml +0 -0
  18. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/.gitignore +0 -0
  19. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/Dockerfile +0 -0
  20. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/Dockerfile.worker +0 -0
  21. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/LICENSE +0 -0
  22. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/README.md +0 -0
  23. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/build/kernel_cache/.gitignore +0 -0
  24. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/build/kernel_cache/.keep +0 -0
  25. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docker/Dockerfile.kernelcache +0 -0
  26. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docker/Dockerfile.kernelcache.relayer +0 -0
  27. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docker/bake_kernel_cache.py +0 -0
  28. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docker/bake_pod_entry.py +0 -0
  29. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docker/kernel_fingerprint.py +0 -0
  30. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docker/make_rp_handler.py +0 -0
  31. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docs/cli-style/README.md +0 -0
  32. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docs/cli-style/generate.py +0 -0
  33. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docs/cli-style/index.html +0 -0
  34. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docs/cli-style/preview.png +0 -0
  35. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docs/cli-style/themed-errors.png +0 -0
  36. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docs/cli-theme/README.md +0 -0
  37. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docs/cli-theme/before-after-dark.png +0 -0
  38. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docs/cli-theme/before-after-light.png +0 -0
  39. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docs/cli-theme/gallery-dark.png +0 -0
  40. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docs/cli-theme/gallery-light.png +0 -0
  41. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docs/cli-theme/help-dark.png +0 -0
  42. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docs/cli-theme/help-light.png +0 -0
  43. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/docs/kernel-cache.md +0 -0
  44. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/__init__.py +0 -0
  45. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/_channel.py +0 -0
  46. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/_fileio.py +0 -0
  47. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/_logging.py +0 -0
  48. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/_update_check.py +0 -0
  49. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/catalog.py +0 -0
  50. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/cli/__init__.py +0 -0
  51. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/cli/__main__.py +0 -0
  52. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/cli/commands.py +0 -0
  53. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/cli/envpush.py +0 -0
  54. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/cli/render.py +0 -0
  55. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/cli/training_doc.py +0 -0
  56. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/client/__init__.py +0 -0
  57. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/client/config.py +0 -0
  58. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/client/http.py +0 -0
  59. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/client/runtime_secrets.py +0 -0
  60. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/client/specs.py +0 -0
  61. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/cost/__init__.py +0 -0
  62. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/cost/analytical.py +0 -0
  63. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/cost/facts.py +0 -0
  64. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/cost/spec.py +0 -0
  65. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/cost/types.py +0 -0
  66. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/__init__.py +0 -0
  67. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/accounting.py +0 -0
  68. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/chalk_kernels.py +0 -0
  69. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/multiturn_rollout.py +0 -0
  70. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/recipe.py +0 -0
  71. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/vram.py +0 -0
  72. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/__init__.py +0 -0
  73. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/__main__.py +0 -0
  74. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/_pkg.py +0 -0
  75. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/adapter.py +0 -0
  76. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/decoding.py +0 -0
  77. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/finalize.py +0 -0
  78. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/gpu_setup.py +0 -0
  79. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/grpo.py +0 -0
  80. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/heartbeat.py +0 -0
  81. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/hf.py +0 -0
  82. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/kernel_warmup.py +0 -0
  83. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/lora.py +0 -0
  84. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/packing.py +0 -0
  85. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/perf/__init__.py +0 -0
  86. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/perf/attn.py +0 -0
  87. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/perf/diagnostics.py +0 -0
  88. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/perf/lifecycle.py +0 -0
  89. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/perf/liger.py +0 -0
  90. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/perf/loraplus.py +0 -0
  91. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/perf/memory.py +0 -0
  92. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/rl.py +0 -0
  93. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/sft.py +0 -0
  94. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/engine/worker/wandb_log.py +0 -0
  95. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/envs/__init__.py +0 -0
  96. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/envs/adapter.py +0 -0
  97. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/envs/base.py +0 -0
  98. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/envs/pull.py +0 -0
  99. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/envs/registry.py +0 -0
  100. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/__init__.py +0 -0
  101. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/_auth.py +0 -0
  102. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/_http.py +0 -0
  103. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/_instance.py +0 -0
  104. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/_instance_bootstrap.py +0 -0
  105. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/_poll.py +0 -0
  106. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/allocator.py +0 -0
  107. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/base.py +0 -0
  108. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/lambdalabs/__init__.py +0 -0
  109. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/lambdalabs/api.py +0 -0
  110. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/lambdalabs/auth.py +0 -0
  111. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/lambdalabs/gpus.py +0 -0
  112. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/lambdalabs/jobs/__init__.py +0 -0
  113. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/lambdalabs/jobs/builders.py +0 -0
  114. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/lambdalabs/preflight.py +0 -0
  115. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/lambdalabs/pricing.py +0 -0
  116. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/lambdalabs/train.py +0 -0
  117. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/preflight.py +0 -0
  118. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/realized.py +0 -0
  119. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/runpod/__init__.py +0 -0
  120. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/runpod/api.py +0 -0
  121. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/runpod/auth.py +0 -0
  122. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/runpod/cost.py +0 -0
  123. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/runpod/gpus.py +0 -0
  124. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/runpod/jobs.py +0 -0
  125. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/runpod/keys.py +0 -0
  126. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/runpod/preflight.py +0 -0
  127. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/runpod/preload.py +0 -0
  128. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/runpod/pricing.py +0 -0
  129. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/runpod/slots.py +0 -0
  130. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/runpod/train/__init__.py +0 -0
  131. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/runpod/train/deps.py +0 -0
  132. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/providers/runpod/train/endpoints.py +0 -0
  133. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/py.typed +0 -0
  134. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/runner/__init__.py +0 -0
  135. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/runner/checkpoints.py +0 -0
  136. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/runner/deploy.py +0 -0
  137. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/runner/lifecycle.py +0 -0
  138. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/schema/__init__.py +0 -0
  139. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/schema/fields.py +0 -0
  140. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/serve/__init__.py +0 -0
  141. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/serve/deploy.py +0 -0
  142. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/serve/export.py +0 -0
  143. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/__init__.py +0 -0
  144. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/__main__.py +0 -0
  145. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/_deps.py +0 -0
  146. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/_internal_client.py +0 -0
  147. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/_locks.py +0 -0
  148. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/_runtime.py +0 -0
  149. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/app.py +0 -0
  150. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/auth.py +0 -0
  151. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/billing.py +0 -0
  152. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/billing_retry.py +0 -0
  153. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/checkpoints.py +0 -0
  154. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/db.py +0 -0
  155. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/environment_registry.py +0 -0
  156. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/envs.py +0 -0
  157. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/reconcile.py +0 -0
  158. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/routes/__init__.py +0 -0
  159. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/routes/envs.py +0 -0
  160. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/routes/meta.py +0 -0
  161. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/routes/runs.py +0 -0
  162. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/routes/serving.py +0 -0
  163. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/server/run_registry.py +0 -0
  164. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/flash/spec.py +0 -0
  165. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/infisical-entrypoint.sh +0 -0
  166. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/scripts/build_dev_dist.py +0 -0
  167. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/__init__.py +0 -0
  168. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/_helpers/__init__.py +0 -0
  169. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/_helpers/runner.py +0 -0
  170. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/_helpers/specs.py +0 -0
  171. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/conftest.py +0 -0
  172. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/fixtures/math_eval.jsonl +0 -0
  173. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/fixtures/math_train.jsonl +0 -0
  174. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/live/__init__.py +0 -0
  175. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/live/conftest.py +0 -0
  176. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/live/test_lambda_live.py +0 -0
  177. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/live/test_runpod_live.py +0 -0
  178. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_agent_flash_cli_contract.py +0 -0
  179. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_algorithms.py +0 -0
  180. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_allocator.py +0 -0
  181. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_b200_rollout_opt.py +0 -0
  182. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_backend_jobspec_contract.py +0 -0
  183. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_billing_retry.py +0 -0
  184. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_cancel_remote.py +0 -0
  185. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_catalog_consistency.py +0 -0
  186. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_chalk_kernels.py +0 -0
  187. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_checkpoints.py +0 -0
  188. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_cli_commands.py +0 -0
  189. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_cli_errors.py +0 -0
  190. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_cli_estimate.py +0 -0
  191. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_cli_help.py +0 -0
  192. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_cli_managed.py +0 -0
  193. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_cli_render_theme.py +0 -0
  194. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_client.py +0 -0
  195. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_client_server_integration.py +0 -0
  196. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_config_overrides.py +0 -0
  197. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_cost_analytical.py +0 -0
  198. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_cost_equation.py +0 -0
  199. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_cost_estimate.py +0 -0
  200. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_cost_hardware.py +0 -0
  201. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_cost_models.py +0 -0
  202. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_cost_rewards.py +0 -0
  203. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_dev_channel.py +0 -0
  204. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_disk_gb.py +0 -0
  205. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_endpoint_name.py +0 -0
  206. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_env_delete.py +0 -0
  207. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_env_no_install.py +0 -0
  208. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_env_publish.py +0 -0
  209. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_env_pull.py +0 -0
  210. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_env_push.py +0 -0
  211. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_env_rate_limit_resolve.py +0 -0
  212. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_envs_coverage.py +0 -0
  213. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_export.py +0 -0
  214. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_flash_mvp.py +0 -0
  215. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_flash_worker.py +0 -0
  216. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_flashinfer_cache_dirs.py +0 -0
  217. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_github_urlopen_retry.py +0 -0
  218. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_gpus.py +0 -0
  219. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_grpo_mask_aware.py +0 -0
  220. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_grpo_params.py +0 -0
  221. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_grpo_sleep_gate.py +0 -0
  222. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_idle_endpoint_reaper.py +0 -0
  223. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_internal_client.py +0 -0
  224. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_jobs.py +0 -0
  225. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_kernel_cache.py +0 -0
  226. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_kernel_fingerprint.py +0 -0
  227. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_kv_util.py +0 -0
  228. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_lambda_runner.py +0 -0
  229. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_logging.py +0 -0
  230. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_login_perms.py +0 -0
  231. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_managed_hf_repo.py +0 -0
  232. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_metrics_schema_agent_contract.py +0 -0
  233. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_mig_guard.py +0 -0
  234. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_multiturn_rollout.py +0 -0
  235. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_oom_escalate_gpu.py +0 -0
  236. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_open_model_policy.py +0 -0
  237. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_orchestrator_flash.py +0 -0
  238. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_packing.py +0 -0
  239. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_poll_helpers.py +0 -0
  240. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_preflight.py +0 -0
  241. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_provider_routing.py +0 -0
  242. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_provider_teardown_robustness.py +0 -0
  243. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_providers_symmetry.py +0 -0
  244. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_realized_cost.py +0 -0
  245. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_resolve_params_b.py +0 -0
  246. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_resume_on_retry.py +0 -0
  247. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_runmgmt.py +0 -0
  248. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_runpod_api_delete.py +0 -0
  249. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_runpod_key_fingerprint.py +0 -0
  250. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_runpod_key_waterfall.py +0 -0
  251. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_runpod_slots.py +0 -0
  252. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_serve.py +0 -0
  253. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_server_api.py +0 -0
  254. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_server_billing.py +0 -0
  255. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_server_db.py +0 -0
  256. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_sft_gc_off.py +0 -0
  257. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_spec_and_validation.py +0 -0
  258. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_thinking_config.py +0 -0
  259. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_update_check.py +0 -0
  260. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_verifiers.py +0 -0
  261. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_version.py +0 -0
  262. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  263. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_vl_warmstart_recombine.py +0 -0
  264. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_vl_weight_sync.py +0 -0
  265. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_wandb_naming.py +0 -0
  266. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_warmstart_cross_repo.py +0 -0
  267. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_weight_cache.py +0 -0
  268. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_worker_dryrun.py +0 -0
  269. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_worker_hardexit.py +0 -0
  270. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_worker_image.py +0 -0
  271. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_worker_init_heartbeat.py +0 -0
  272. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_worker_stack.py +0 -0
  273. {freesolo_flash_dev-0.2.32 → freesolo_flash_dev-0.2.33}/tests/test_worker_thinking.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: freesolo-flash-dev
3
- Version: 0.2.32
3
+ Version: 0.2.33
4
4
  Summary: Flash — managed LoRA post-training (SFT/GRPO) for Freesolo environments, driven by the `flash` CLI
5
5
  Project-URL: Homepage, https://github.com/freesolo-co/flash
6
6
  Project-URL: Repository, https://github.com/freesolo-co/flash
@@ -0,0 +1,94 @@
1
+ """Serving token prices for Flash deployments (per 1M tokens)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+
7
+ from flash.catalog import MODELS
8
+
9
+ SERVING_MARKUP = 1.20
10
+
11
+
12
+ @dataclass(frozen=True)
13
+ class ServingPrice:
14
+ model_id: str
15
+ typical_input_usd_per_mtok: float
16
+ typical_output_usd_per_mtok: float
17
+ typical_cached_input_usd_per_mtok: float
18
+
19
+ @property
20
+ def billed_input_usd_per_mtok(self) -> float:
21
+ return self.typical_input_usd_per_mtok * SERVING_MARKUP
22
+
23
+ @property
24
+ def billed_output_usd_per_mtok(self) -> float:
25
+ return self.typical_output_usd_per_mtok * SERVING_MARKUP
26
+
27
+ @property
28
+ def billed_cached_input_usd_per_mtok(self) -> float:
29
+ return self.typical_cached_input_usd_per_mtok * SERVING_MARKUP
30
+
31
+
32
+ SERVING_PRICES: dict[str, ServingPrice] = {
33
+ "openbmb/MiniCPM5-1B": ServingPrice(
34
+ model_id="openbmb/MiniCPM5-1B",
35
+ typical_input_usd_per_mtok=0.01,
36
+ typical_output_usd_per_mtok=0.05,
37
+ typical_cached_input_usd_per_mtok=0.002,
38
+ ),
39
+ "Qwen/Qwen3.5-0.8B": ServingPrice(
40
+ model_id="Qwen/Qwen3.5-0.8B",
41
+ typical_input_usd_per_mtok=0.01,
42
+ typical_output_usd_per_mtok=0.05,
43
+ typical_cached_input_usd_per_mtok=0.002,
44
+ ),
45
+ "Qwen/Qwen3.5-2B": ServingPrice(
46
+ model_id="Qwen/Qwen3.5-2B",
47
+ typical_input_usd_per_mtok=0.02,
48
+ typical_output_usd_per_mtok=0.10,
49
+ typical_cached_input_usd_per_mtok=0.004,
50
+ ),
51
+ "Qwen/Qwen3.5-4B": ServingPrice(
52
+ model_id="Qwen/Qwen3.5-4B",
53
+ typical_input_usd_per_mtok=0.03,
54
+ typical_output_usd_per_mtok=0.15,
55
+ typical_cached_input_usd_per_mtok=0.006,
56
+ ),
57
+ "Qwen/Qwen3.5-9B": ServingPrice(
58
+ model_id="Qwen/Qwen3.5-9B",
59
+ typical_input_usd_per_mtok=0.10,
60
+ typical_output_usd_per_mtok=0.15,
61
+ typical_cached_input_usd_per_mtok=0.020,
62
+ ),
63
+ "Qwen/Qwen3.6-35B-A3B": ServingPrice(
64
+ model_id="Qwen/Qwen3.6-35B-A3B",
65
+ typical_input_usd_per_mtok=0.15,
66
+ typical_output_usd_per_mtok=1.00,
67
+ typical_cached_input_usd_per_mtok=0.050,
68
+ ),
69
+ }
70
+
71
+
72
+ def serving_price(model_id: str) -> ServingPrice:
73
+ try:
74
+ return SERVING_PRICES[model_id]
75
+ except KeyError as exc:
76
+ raise ValueError(f"unknown serving model {model_id!r}") from exc
77
+
78
+
79
+ def serving_price_rows() -> list[dict[str, float | str]]:
80
+ rows: list[dict[str, float | str]] = []
81
+ for model_id in sorted(MODELS):
82
+ price = serving_price(model_id)
83
+ rows.append(
84
+ {
85
+ "model_id": model_id,
86
+ "typical_input_usd_per_mtok": price.typical_input_usd_per_mtok,
87
+ "typical_output_usd_per_mtok": price.typical_output_usd_per_mtok,
88
+ "typical_cached_input_usd_per_mtok": price.typical_cached_input_usd_per_mtok,
89
+ "billed_input_usd_per_mtok": price.billed_input_usd_per_mtok,
90
+ "billed_output_usd_per_mtok": price.billed_output_usd_per_mtok,
91
+ "billed_cached_input_usd_per_mtok": price.billed_cached_input_usd_per_mtok,
92
+ }
93
+ )
94
+ return rows
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "freesolo-flash-dev"
3
- version = "0.2.32"
3
+ version = "0.2.33"
4
4
  description = "Flash — managed LoRA post-training (SFT/GRPO) for Freesolo environments, driven by the `flash` CLI"
5
5
  readme = "README.md"
6
6
  # RunPod Flash supports Python 3.11-3.12 (not 3.13 yet).
@@ -111,7 +111,7 @@ artifacts = ["flash/py.typed"]
111
111
  # auto-published by .github/workflows/publish-dev.yml: a push to `dev` whose version isn't yet on
112
112
  # PyPI publishes it; pushes that don't change it find it already published and no-op. So cutting a
113
113
  # dev-channel release = bump this (and [project].version) and merge to `dev`.
114
- version = "0.2.32"
114
+ version = "0.2.33"
115
115
 
116
116
  [tool.pytest.ini_options]
117
117
  pythonpath = ["."]
@@ -141,7 +141,7 @@ def test_deployment_roundtrip_dict():
141
141
  assert "mode" not in data
142
142
 
143
143
 
144
- def test_serving_prices_cover_catalog_and_apply_markup():
144
+ def test_serving_prices_cover_catalog():
145
145
  from flash.catalog import MODELS
146
146
  from flash.serve.pricing import SERVING_MARKUP, SERVING_PRICES, serving_price_rows
147
147
 
@@ -150,11 +150,44 @@ def test_serving_prices_cover_catalog_and_apply_markup():
150
150
  rows = serving_price_rows()
151
151
  assert len(rows) == len(MODELS)
152
152
  for row in rows:
153
+ assert row["typical_input_usd_per_mtok"] > 0
154
+ assert row["typical_output_usd_per_mtok"] > 0
155
+ assert row["typical_cached_input_usd_per_mtok"] > 0
156
+ assert row["billed_input_usd_per_mtok"] > 0
157
+ assert row["billed_output_usd_per_mtok"] > 0
158
+ assert row["billed_cached_input_usd_per_mtok"] > 0
159
+ assert row["billed_cached_input_usd_per_mtok"] < row["billed_input_usd_per_mtok"]
153
160
  assert row["billed_input_usd_per_mtok"] == pytest.approx(
154
- row["base_input_usd_per_mtok"] * SERVING_MARKUP
161
+ row["typical_input_usd_per_mtok"] * SERVING_MARKUP
155
162
  )
156
163
  assert row["billed_output_usd_per_mtok"] == pytest.approx(
157
- row["base_output_usd_per_mtok"] * SERVING_MARKUP
164
+ row["typical_output_usd_per_mtok"] * SERVING_MARKUP
165
+ )
166
+ assert row["billed_cached_input_usd_per_mtok"] == pytest.approx(
167
+ row["typical_cached_input_usd_per_mtok"] * SERVING_MARKUP
168
+ )
169
+
170
+
171
+ def test_serving_prices_pin_public_rates_plus_markup():
172
+ from flash.serve.pricing import SERVING_MARKUP, SERVING_PRICES
173
+
174
+ typical = {
175
+ "openbmb/MiniCPM5-1B": (0.01, 0.05, 0.002),
176
+ "Qwen/Qwen3.5-0.8B": (0.01, 0.05, 0.002),
177
+ "Qwen/Qwen3.5-2B": (0.02, 0.10, 0.004),
178
+ "Qwen/Qwen3.5-4B": (0.03, 0.15, 0.006),
179
+ "Qwen/Qwen3.5-9B": (0.10, 0.15, 0.020),
180
+ "Qwen/Qwen3.6-35B-A3B": (0.15, 1.00, 0.050),
181
+ }
182
+ for model_id, (input_rate, output_rate, cached_rate) in typical.items():
183
+ price = SERVING_PRICES[model_id]
184
+ assert price.typical_input_usd_per_mtok == pytest.approx(input_rate)
185
+ assert price.typical_output_usd_per_mtok == pytest.approx(output_rate)
186
+ assert price.typical_cached_input_usd_per_mtok == pytest.approx(cached_rate)
187
+ assert price.billed_input_usd_per_mtok == pytest.approx(input_rate * SERVING_MARKUP)
188
+ assert price.billed_output_usd_per_mtok == pytest.approx(output_rate * SERVING_MARKUP)
189
+ assert price.billed_cached_input_usd_per_mtok == pytest.approx(
190
+ cached_rate * SERVING_MARKUP
158
191
  )
159
192
 
160
193
 
@@ -1024,7 +1024,7 @@ wheels = [
1024
1024
 
1025
1025
  [[package]]
1026
1026
  name = "freesolo-flash"
1027
- version = "0.2.32"
1027
+ version = "0.2.33"
1028
1028
  source = { editable = "." }
1029
1029
 
1030
1030
  [package.optional-dependencies]
@@ -1,58 +0,0 @@
1
- """Serving token prices for Flash deployments (per 1M tokens)."""
2
-
3
- from __future__ import annotations
4
-
5
- from dataclasses import dataclass
6
-
7
- from flash.catalog import MODELS
8
-
9
- SERVING_MARKUP = 1.20
10
-
11
-
12
- @dataclass(frozen=True)
13
- class ServingPrice:
14
- model_id: str
15
- base_input_usd_per_mtok: float
16
- base_output_usd_per_mtok: float
17
-
18
- @property
19
- def billed_input_usd_per_mtok(self) -> float:
20
- return self.base_input_usd_per_mtok * SERVING_MARKUP
21
-
22
- @property
23
- def billed_output_usd_per_mtok(self) -> float:
24
- return self.base_output_usd_per_mtok * SERVING_MARKUP
25
-
26
-
27
- SERVING_PRICES: dict[str, ServingPrice] = {
28
- "openbmb/MiniCPM5-1B": ServingPrice("openbmb/MiniCPM5-1B", 0.05, 0.10),
29
- "Qwen/Qwen3.5-0.8B": ServingPrice("Qwen/Qwen3.5-0.8B", 0.05, 0.10),
30
- "Qwen/Qwen3.5-2B": ServingPrice("Qwen/Qwen3.5-2B", 0.10, 0.20),
31
- "Qwen/Qwen3.5-4B": ServingPrice("Qwen/Qwen3.5-4B", 0.20, 0.40),
32
- "Qwen/Qwen3.5-9B": ServingPrice("Qwen/Qwen3.5-9B", 0.50, 1.00),
33
- # MoE but serves on B200 → priced ~4x the 9B.
34
- "Qwen/Qwen3.6-35B-A3B": ServingPrice("Qwen/Qwen3.6-35B-A3B", 2.00, 4.00),
35
- }
36
-
37
-
38
- def serving_price(model_id: str) -> ServingPrice:
39
- try:
40
- return SERVING_PRICES[model_id]
41
- except KeyError as exc:
42
- raise ValueError(f"unknown serving model {model_id!r}") from exc
43
-
44
-
45
- def serving_price_rows() -> list[dict[str, float | str]]:
46
- rows: list[dict[str, float | str]] = []
47
- for model_id in sorted(MODELS):
48
- price = serving_price(model_id)
49
- rows.append(
50
- {
51
- "model_id": model_id,
52
- "base_input_usd_per_mtok": price.base_input_usd_per_mtok,
53
- "base_output_usd_per_mtok": price.base_output_usd_per_mtok,
54
- "billed_input_usd_per_mtok": price.billed_input_usd_per_mtok,
55
- "billed_output_usd_per_mtok": price.billed_output_usd_per_mtok,
56
- }
57
- )
58
- return rows