dh-cli 0.17.2__tar.gz → 0.17.3__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 (137) hide show
  1. {dh_cli-0.17.2 → dh_cli-0.17.3}/PKG-INFO +1 -1
  2. {dh_cli-0.17.2 → dh_cli-0.17.3}/pyproject.toml +1 -1
  3. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/bedrock/cost_report.py +1 -0
  4. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/bedrock/pricing.yaml +7 -0
  5. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/test_resolve_base_model.py +22 -0
  6. {dh_cli-0.17.2 → dh_cli-0.17.3}/.gitignore +0 -0
  7. {dh_cli-0.17.2 → dh_cli-0.17.3}/LICENSE +0 -0
  8. {dh_cli-0.17.2 → dh_cli-0.17.3}/README.md +0 -0
  9. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/__init__.py +0 -0
  10. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/_identity.py +0 -0
  11. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/__init__.py +0 -0
  12. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/aws_batch.py +0 -0
  13. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/__init__.py +0 -0
  14. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/boltz.py +0 -0
  15. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/cancel.py +0 -0
  16. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/clean.py +0 -0
  17. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/cost.py +0 -0
  18. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/disco.py +0 -0
  19. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/embed_esmc.py +0 -0
  20. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/embed_t5.py +0 -0
  21. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/equilibrator.py +0 -0
  22. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/esmfold2.py +0 -0
  23. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/finalize.py +0 -0
  24. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/list_jobs.py +0 -0
  25. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/local.py +0 -0
  26. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/logs.py +0 -0
  27. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/orca.py +0 -0
  28. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/protmpnn.py +0 -0
  29. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/protmpnn_to_boltz.py +0 -0
  30. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/retry.py +0 -0
  31. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/rfd3.py +0 -0
  32. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/status.py +0 -0
  33. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/submit.py +0 -0
  34. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/commands/wait_for.py +0 -0
  35. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/cost_report.py +0 -0
  36. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/fasta_utils.py +0 -0
  37. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/h5_utils.py +0 -0
  38. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/job_id.py +0 -0
  39. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/manifest.py +0 -0
  40. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/batch/s3_transport.py +0 -0
  41. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/bedrock/__init__.py +0 -0
  42. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/bedrock/commands.py +0 -0
  43. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/cloud_commands.py +0 -0
  44. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/codeartifact.py +0 -0
  45. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/engines_studios/__init__.py +0 -0
  46. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/engines_studios/api_client.py +0 -0
  47. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/engines_studios/auth.py +0 -0
  48. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/engines_studios/engine_commands.py +0 -0
  49. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/engines_studios/progress.py +0 -0
  50. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/engines_studios/retry.py +0 -0
  51. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/engines_studios/ssh_config.py +0 -0
  52. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/engines_studios/studio_commands.py +0 -0
  53. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/engines_studios/studio_resolve.py +0 -0
  54. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/github_commands.py +0 -0
  55. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/hz/__init__.py +0 -0
  56. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/hz/auth.py +0 -0
  57. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/hz/deploy.py +0 -0
  58. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/hz/local.py +0 -0
  59. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/hz/mcp_server.py +0 -0
  60. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/hz/test.py +0 -0
  61. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/hz/tf.py +0 -0
  62. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/hz/users.py +0 -0
  63. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/main.py +0 -0
  64. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/sweep.py +0 -0
  65. {dh_cli-0.17.2 → dh_cli-0.17.3}/src/dh_cli/warehouse.py +0 -0
  66. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/batch/__init__.py +0 -0
  67. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/batch/cur_fixtures.py +0 -0
  68. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/batch/test_aws_batch_resources.py +0 -0
  69. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/batch/test_batch_cost_command.py +0 -0
  70. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/batch/test_batch_cost_filters.py +0 -0
  71. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/batch/test_batch_cost_reader.py +0 -0
  72. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/batch/test_batch_cost_reconcile.py +0 -0
  73. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/batch/test_batch_cost_report.py +0 -0
  74. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/batch/test_image_override.py +0 -0
  75. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/batch/test_import_without_pandas.py +0 -0
  76. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/batch/test_no_train_command.py +0 -0
  77. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/batch/test_submit_cpu_only.py +0 -0
  78. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/batch/test_submit_image_validation.py +0 -0
  79. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/batch/test_submit_job_tags.py +0 -0
  80. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/batch/test_submit_merge.py +0 -0
  81. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/batch/test_submit_mlflow_env.py +0 -0
  82. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/conftest.py +0 -0
  83. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/fixtures/A_cache_write.json +0 -0
  84. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/fixtures/B_cache_read.json +0 -0
  85. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/fixtures/C_plain.json +0 -0
  86. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/fixtures/D_cursor_user.json +0 -0
  87. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/fixtures/E_service_role.json +0 -0
  88. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/fixtures/F_legacy_shared.json +0 -0
  89. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/fixtures/G_unknown_model.json +0 -0
  90. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/test_build_report.py +0 -0
  91. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/test_classify_arn.py +0 -0
  92. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/test_cli_exit_codes.py +0 -0
  93. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/test_cost_calc.py +0 -0
  94. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/test_cost_command.py +0 -0
  95. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/test_cur_reconciliation.py +0 -0
  96. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/test_key_command.py +0 -0
  97. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/test_render_formats.py +0 -0
  98. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/test_rotate.py +0 -0
  99. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/bedrock/test_s3_walker.py +0 -0
  100. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/engines_studios/__init__.py +0 -0
  101. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/engines_studios/test_engine_retry_commands.py +0 -0
  102. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/engines_studios/test_retry.py +0 -0
  103. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/engines_studios/test_ssh_config.py +0 -0
  104. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/engines_studios/test_studio_resolution_commands.py +0 -0
  105. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/engines_studios/test_studio_resolve.py +0 -0
  106. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/github/__init__.py +0 -0
  107. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/github/conftest.py +0 -0
  108. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/github/test_engine_role_cannot_read_github_pat.py +0 -0
  109. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/github/test_identity.py +0 -0
  110. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/github/test_login.py +0 -0
  111. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/github/test_login_error_paths.py +0 -0
  112. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/github/test_login_security.py +0 -0
  113. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/github/test_logout.py +0 -0
  114. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/github/test_rotate.py +0 -0
  115. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/github/test_status.py +0 -0
  116. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/hz/live_smoke.py +0 -0
  117. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/hz/test_auth.py +0 -0
  118. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/hz/test_init.py +0 -0
  119. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/hz/test_mcp_server.py +0 -0
  120. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/hz/test_suites.py +0 -0
  121. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/hz/test_users.py +0 -0
  122. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/test_aws_status.py +0 -0
  123. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/test_cloud_gcp.py +0 -0
  124. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/test_disco_command.py +0 -0
  125. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/test_disco_jobdef.py +0 -0
  126. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/test_embed_esmc_cli.py +0 -0
  127. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/test_equilibrator_command.py +0 -0
  128. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/test_esmfold2_cli.py +0 -0
  129. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/test_finalize_boltz_tar.py +0 -0
  130. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/test_finalize_disco.py +0 -0
  131. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/test_finalize_disco_dispatch.py +0 -0
  132. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/test_finalize_equilibrator.py +0 -0
  133. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/test_finalize_esmfold2.py +0 -0
  134. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/test_finalize_protmpnn.py +0 -0
  135. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/test_finalize_rfd3.py +0 -0
  136. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/test_rfd3_command.py +0 -0
  137. {dh_cli-0.17.2 → dh_cli-0.17.3}/tests/test_sweep.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: dh-cli
3
- Version: 0.17.2
3
+ Version: 0.17.3
4
4
  Summary: Dayhoff Labs developer CLI
5
5
  Author-email: Dayhoff Labs <dev@dayhofflabs.com>
6
6
  License: # PolyForm Noncommercial License 1.0.0
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "dh-cli"
7
- version = "0.17.2"
7
+ version = "0.17.3"
8
8
  description = "Dayhoff Labs developer CLI"
9
9
  requires-python = ">=3.11"
10
10
  readme = "README.md"
@@ -111,6 +111,7 @@ _BASE_MODELS = (
111
111
  "opus-4-8",
112
112
  "opus-4-7",
113
113
  "opus-4-6",
114
+ "sonnet-5-5",
114
115
  "sonnet-5",
115
116
  "sonnet-4-6",
116
117
  "sonnet-4-5",
@@ -37,6 +37,13 @@ models:
37
37
  cache_write_per_1m: 12.50
38
38
  # Fable 5.1 cut cache reads 75% vs Fable 5; the only rate that differs.
39
39
  cache_read_per_1m: 0.25
40
+ # Sonnet 5.5: Marketplace rate card `*_global_standard`, 2026-09-29; same
41
+ # rates as Sonnet 5.
42
+ sonnet-5-5:
43
+ input_per_1m: 2.00
44
+ output_per_1m: 10.00
45
+ cache_write_per_1m: 2.50
46
+ cache_read_per_1m: 0.20
40
47
  sonnet-5:
41
48
  input_per_1m: 2.00
42
49
  output_per_1m: 10.00
@@ -52,6 +52,14 @@ import pytest
52
52
  ("anthropic.claude-opus-5-5", "opus-5-5"),
53
53
  ("us.anthropic.claude-opus-5-5", "opus-5-5"),
54
54
  ("global.anthropic.claude-opus-5-5", "opus-5-5"),
55
+ # Third occurrence: `sonnet-5` is a substring of `claude-sonnet-5-5`.
56
+ # Rates are identical, so a collapse leaves totals right but merges the
57
+ # two models in any per-model breakdown.
58
+ ("anthropic.claude-sonnet-5", "sonnet-5"),
59
+ ("us.anthropic.claude-sonnet-5", "sonnet-5"),
60
+ ("global.anthropic.claude-sonnet-5", "sonnet-5"),
61
+ ("anthropic.claude-sonnet-5-5", "sonnet-5-5"),
62
+ ("global.anthropic.claude-sonnet-5-5", "sonnet-5-5"),
55
63
  # OpenAI models on `bedrock-runtime` do write invocation logs (only
56
64
  # mantle traffic doesn't). Seen in the dev bucket 2026-09, in both the
57
65
  # bare and inference-profile-ARN shapes.
@@ -97,6 +105,7 @@ def test_resolve_prefers_the_most_specific_base():
97
105
  assert cost_report.resolve_base_model("global.anthropic.claude-fable-5") == "fable-5"
98
106
  assert cost_report.resolve_base_model("global.anthropic.claude-opus-5-5") == "opus-5-5"
99
107
  assert cost_report.resolve_base_model("global.anthropic.claude-opus-5") == "opus-5"
108
+ assert cost_report.resolve_base_model("global.anthropic.claude-sonnet-5-5") == "sonnet-5-5"
100
109
  finally:
101
110
  cost_report._BASE_MODELS = original
102
111
 
@@ -140,6 +149,19 @@ def test_opus_55_is_priced_below_opus_5():
140
149
  assert pricing["opus-5-5"][rate] < pricing["opus-5"][rate]
141
150
 
142
151
 
152
+ def test_sonnet_55_rates_match_marketplace_card():
153
+ """Marketplace `offer-5fu2rhus3byrs`, `*_global_standard`, 2026-09-29."""
154
+ from dh_cli.bedrock.cost_report import default_pricing_path, load_pricing
155
+
156
+ pricing = load_pricing(default_pricing_path())
157
+ assert pricing["sonnet-5-5"] == {
158
+ "input_per_1m": 2.00,
159
+ "output_per_1m": 10.00,
160
+ "cache_write_per_1m": 2.50,
161
+ "cache_read_per_1m": 0.20,
162
+ }
163
+
164
+
143
165
  @pytest.mark.parametrize(
144
166
  "base, rates",
145
167
  [
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