dh-cli 0.17.1__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.1 → dh_cli-0.17.3}/PKG-INFO +1 -1
  2. {dh_cli-0.17.1 → dh_cli-0.17.3}/pyproject.toml +1 -1
  3. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/bedrock/cost_report.py +3 -0
  4. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/bedrock/pricing.yaml +19 -0
  5. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/test_resolve_base_model.py +34 -0
  6. {dh_cli-0.17.1 → dh_cli-0.17.3}/.gitignore +0 -0
  7. {dh_cli-0.17.1 → dh_cli-0.17.3}/LICENSE +0 -0
  8. {dh_cli-0.17.1 → dh_cli-0.17.3}/README.md +0 -0
  9. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/__init__.py +0 -0
  10. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/_identity.py +0 -0
  11. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/__init__.py +0 -0
  12. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/aws_batch.py +0 -0
  13. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/__init__.py +0 -0
  14. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/boltz.py +0 -0
  15. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/cancel.py +0 -0
  16. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/clean.py +0 -0
  17. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/cost.py +0 -0
  18. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/disco.py +0 -0
  19. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/embed_esmc.py +0 -0
  20. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/embed_t5.py +0 -0
  21. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/equilibrator.py +0 -0
  22. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/esmfold2.py +0 -0
  23. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/finalize.py +0 -0
  24. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/list_jobs.py +0 -0
  25. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/local.py +0 -0
  26. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/logs.py +0 -0
  27. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/orca.py +0 -0
  28. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/protmpnn.py +0 -0
  29. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/protmpnn_to_boltz.py +0 -0
  30. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/retry.py +0 -0
  31. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/rfd3.py +0 -0
  32. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/status.py +0 -0
  33. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/submit.py +0 -0
  34. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/commands/wait_for.py +0 -0
  35. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/cost_report.py +0 -0
  36. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/fasta_utils.py +0 -0
  37. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/h5_utils.py +0 -0
  38. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/job_id.py +0 -0
  39. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/manifest.py +0 -0
  40. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/batch/s3_transport.py +0 -0
  41. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/bedrock/__init__.py +0 -0
  42. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/bedrock/commands.py +0 -0
  43. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/cloud_commands.py +0 -0
  44. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/codeartifact.py +0 -0
  45. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/engines_studios/__init__.py +0 -0
  46. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/engines_studios/api_client.py +0 -0
  47. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/engines_studios/auth.py +0 -0
  48. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/engines_studios/engine_commands.py +0 -0
  49. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/engines_studios/progress.py +0 -0
  50. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/engines_studios/retry.py +0 -0
  51. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/engines_studios/ssh_config.py +0 -0
  52. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/engines_studios/studio_commands.py +0 -0
  53. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/engines_studios/studio_resolve.py +0 -0
  54. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/github_commands.py +0 -0
  55. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/hz/__init__.py +0 -0
  56. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/hz/auth.py +0 -0
  57. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/hz/deploy.py +0 -0
  58. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/hz/local.py +0 -0
  59. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/hz/mcp_server.py +0 -0
  60. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/hz/test.py +0 -0
  61. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/hz/tf.py +0 -0
  62. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/hz/users.py +0 -0
  63. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/main.py +0 -0
  64. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/sweep.py +0 -0
  65. {dh_cli-0.17.1 → dh_cli-0.17.3}/src/dh_cli/warehouse.py +0 -0
  66. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/batch/__init__.py +0 -0
  67. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/batch/cur_fixtures.py +0 -0
  68. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/batch/test_aws_batch_resources.py +0 -0
  69. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/batch/test_batch_cost_command.py +0 -0
  70. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/batch/test_batch_cost_filters.py +0 -0
  71. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/batch/test_batch_cost_reader.py +0 -0
  72. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/batch/test_batch_cost_reconcile.py +0 -0
  73. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/batch/test_batch_cost_report.py +0 -0
  74. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/batch/test_image_override.py +0 -0
  75. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/batch/test_import_without_pandas.py +0 -0
  76. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/batch/test_no_train_command.py +0 -0
  77. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/batch/test_submit_cpu_only.py +0 -0
  78. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/batch/test_submit_image_validation.py +0 -0
  79. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/batch/test_submit_job_tags.py +0 -0
  80. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/batch/test_submit_merge.py +0 -0
  81. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/batch/test_submit_mlflow_env.py +0 -0
  82. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/conftest.py +0 -0
  83. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/fixtures/A_cache_write.json +0 -0
  84. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/fixtures/B_cache_read.json +0 -0
  85. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/fixtures/C_plain.json +0 -0
  86. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/fixtures/D_cursor_user.json +0 -0
  87. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/fixtures/E_service_role.json +0 -0
  88. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/fixtures/F_legacy_shared.json +0 -0
  89. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/fixtures/G_unknown_model.json +0 -0
  90. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/test_build_report.py +0 -0
  91. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/test_classify_arn.py +0 -0
  92. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/test_cli_exit_codes.py +0 -0
  93. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/test_cost_calc.py +0 -0
  94. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/test_cost_command.py +0 -0
  95. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/test_cur_reconciliation.py +0 -0
  96. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/test_key_command.py +0 -0
  97. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/test_render_formats.py +0 -0
  98. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/test_rotate.py +0 -0
  99. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/bedrock/test_s3_walker.py +0 -0
  100. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/engines_studios/__init__.py +0 -0
  101. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/engines_studios/test_engine_retry_commands.py +0 -0
  102. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/engines_studios/test_retry.py +0 -0
  103. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/engines_studios/test_ssh_config.py +0 -0
  104. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/engines_studios/test_studio_resolution_commands.py +0 -0
  105. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/engines_studios/test_studio_resolve.py +0 -0
  106. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/github/__init__.py +0 -0
  107. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/github/conftest.py +0 -0
  108. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/github/test_engine_role_cannot_read_github_pat.py +0 -0
  109. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/github/test_identity.py +0 -0
  110. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/github/test_login.py +0 -0
  111. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/github/test_login_error_paths.py +0 -0
  112. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/github/test_login_security.py +0 -0
  113. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/github/test_logout.py +0 -0
  114. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/github/test_rotate.py +0 -0
  115. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/github/test_status.py +0 -0
  116. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/hz/live_smoke.py +0 -0
  117. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/hz/test_auth.py +0 -0
  118. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/hz/test_init.py +0 -0
  119. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/hz/test_mcp_server.py +0 -0
  120. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/hz/test_suites.py +0 -0
  121. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/hz/test_users.py +0 -0
  122. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/test_aws_status.py +0 -0
  123. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/test_cloud_gcp.py +0 -0
  124. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/test_disco_command.py +0 -0
  125. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/test_disco_jobdef.py +0 -0
  126. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/test_embed_esmc_cli.py +0 -0
  127. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/test_equilibrator_command.py +0 -0
  128. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/test_esmfold2_cli.py +0 -0
  129. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/test_finalize_boltz_tar.py +0 -0
  130. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/test_finalize_disco.py +0 -0
  131. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/test_finalize_disco_dispatch.py +0 -0
  132. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/test_finalize_equilibrator.py +0 -0
  133. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/test_finalize_esmfold2.py +0 -0
  134. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/test_finalize_protmpnn.py +0 -0
  135. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/test_finalize_rfd3.py +0 -0
  136. {dh_cli-0.17.1 → dh_cli-0.17.3}/tests/test_rfd3_command.py +0 -0
  137. {dh_cli-0.17.1 → 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.1
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.1"
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",
@@ -118,6 +119,8 @@ _BASE_MODELS = (
118
119
  "fable-5",
119
120
  "fable-5-1",
120
121
  "gpt-6-astra",
122
+ "gpt-6-sol",
123
+ "gpt-6-luna",
121
124
  "gpt-5.6-sol",
122
125
  "gpt-5.6-terra",
123
126
  "gpt-5.6-luna",
@@ -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
@@ -65,6 +72,18 @@ models:
65
72
  output_per_1m: 50.00
66
73
  cache_write_per_1m: 12.50
67
74
  cache_read_per_1m: 1.00
75
+ # GPT-6 Sol/Luna: Marketplace rate card `*_global_standard`, 2026-09-25;
76
+ # cache write is the 30-minute tier.
77
+ gpt-6-sol:
78
+ input_per_1m: 2.00
79
+ output_per_1m: 10.00
80
+ cache_write_per_1m: 2.50
81
+ cache_read_per_1m: 0.20
82
+ gpt-6-luna:
83
+ input_per_1m: 0.10
84
+ output_per_1m: 0.50
85
+ cache_write_per_1m: 0.125
86
+ cache_read_per_1m: 0.01
68
87
  gpt-5.6-sol:
69
88
  input_per_1m: 4.00
70
89
  output_per_1m: 20.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.
@@ -67,6 +75,14 @@ import pytest
67
75
  "arn:aws:bedrock:us-east-1:074735440724:inference-profile/global.openai.gpt-6-astra",
68
76
  "gpt-6-astra",
69
77
  ),
78
+ ("global.openai.gpt-6-sol", "gpt-6-sol"),
79
+ ("us.openai.gpt-6-sol", "gpt-6-sol"),
80
+ ("openai.gpt-6-sol", "gpt-6-sol"),
81
+ ("global.openai.gpt-6-luna", "gpt-6-luna"),
82
+ (
83
+ "arn:aws:bedrock:us-east-1:074735440724:inference-profile/global.openai.gpt-6-luna",
84
+ "gpt-6-luna",
85
+ ),
70
86
  ],
71
87
  )
72
88
  def test_resolve_base_model_known(model_id: str, expected_base: str):
@@ -89,6 +105,7 @@ def test_resolve_prefers_the_most_specific_base():
89
105
  assert cost_report.resolve_base_model("global.anthropic.claude-fable-5") == "fable-5"
90
106
  assert cost_report.resolve_base_model("global.anthropic.claude-opus-5-5") == "opus-5-5"
91
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"
92
109
  finally:
93
110
  cost_report._BASE_MODELS = original
94
111
 
@@ -132,6 +149,19 @@ def test_opus_55_is_priced_below_opus_5():
132
149
  assert pricing["opus-5-5"][rate] < pricing["opus-5"][rate]
133
150
 
134
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
+
135
165
  @pytest.mark.parametrize(
136
166
  "base, rates",
137
167
  [
@@ -139,6 +169,10 @@ def test_opus_55_is_priced_below_opus_5():
139
169
  # (`USE1-MP:USE1_*_global_standard` unit cost). Sol's regional rate
140
170
  # fell from $5.50/$33 in Aug to $4.40/$22 in Sep; Sep is current.
141
171
  ("gpt-6-astra", (10.00, 50.00, 12.50, 1.00)),
172
+ # GPT-6 Sol/Luna: Marketplace rate card, `*_global_standard`,
173
+ # 2026-09-25 (cache write is the 30-minute tier).
174
+ ("gpt-6-sol", (2.00, 10.00, 2.50, 0.20)),
175
+ ("gpt-6-luna", (0.10, 0.50, 0.125, 0.01)),
142
176
  ("gpt-5.6-sol", (4.00, 20.00, 5.00, 0.40)),
143
177
  ("gpt-5.6-terra", (2.00, 12.00, 2.50, 0.20)),
144
178
  ("gpt-5.6-luna", (0.20, 1.20, 0.25, 0.02)),
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