copilot-session-usage 0.9.2__tar.gz → 0.9.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 (130) hide show
  1. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/PKG-INFO +1 -1
  2. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/src/copilot_session_usage/data/models-and-pricing.lock +3 -3
  3. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/src/copilot_session_usage/data/models-and-pricing.yml +9 -72
  4. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/tests/test_core.py +23 -10
  5. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.editorconfig +0 -0
  6. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.gitattributes +0 -0
  7. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  8. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  9. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.github/changes/requests/skill-breakdown/01-request.md +0 -0
  10. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.github/guidelines/git-commit-message.guideline.md +0 -0
  11. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.github/guidelines/knowledge-base.guidelines.md +0 -0
  12. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.github/pull_request_template.md +0 -0
  13. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.github/skills/consolidate-knowledge-base/SKILL.md +0 -0
  14. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.github/skills/gh-commit-changes/SKILL.md +0 -0
  15. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.github/skills/gh-create-pull-request/SKILL.md +0 -0
  16. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.github/skills/gh-release-notes/SKILL.md +0 -0
  17. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.github/skills/gh-release-notes/scripts/generate_release_notes.py +0 -0
  18. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.github/skills/record-finding/README.md +0 -0
  19. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.github/skills/record-finding/SKILL.md +0 -0
  20. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.github/workflows/ci.yml +0 -0
  21. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.github/workflows/publish.yml +0 -0
  22. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.github/workflows/refresh-pricing.yml +0 -0
  23. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.github/workflows/release-notes.yml +0 -0
  24. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.github/workflows/release.yml +0 -0
  25. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.gitignore +0 -0
  26. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/.readthedocs.yaml +0 -0
  27. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/AGENTS.md +0 -0
  28. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/CHANGELOG.md +0 -0
  29. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/CONSTITUTION.md +0 -0
  30. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/CONTRIBUTING.md +0 -0
  31. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/LICENSE +0 -0
  32. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/README.md +0 -0
  33. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/articles/presentation.md +0 -0
  34. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/internal/automated_release_proces.md +0 -0
  35. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/_static/changelog.js +0 -0
  36. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/_static/custom.css +0 -0
  37. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/changelog.md +0 -0
  38. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/conf.py +0 -0
  39. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/explanation/how-cost-estimation-works.md +0 -0
  40. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/explanation/index.md +0 -0
  41. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/how-to/add-commit-trailer.md +0 -0
  42. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/how-to/analyze-specific-session.md +0 -0
  43. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/how-to/batch-and-spending.md +0 -0
  44. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/how-to/copilot-cli-provider.md +0 -0
  45. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/how-to/export-json.md +0 -0
  46. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/how-to/index.md +0 -0
  47. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/how-to/wsl2.md +0 -0
  48. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/index.md +0 -0
  49. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/installation.md +0 -0
  50. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/reference/api.md +0 -0
  51. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/reference/cli.md +0 -0
  52. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/reference/index.md +0 -0
  53. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/reference/pricing.md +0 -0
  54. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/tutorials/getting-started.md +0 -0
  55. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/docs/source/tutorials/index.md +0 -0
  56. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/guidelines.yml +0 -0
  57. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/justfile +0 -0
  58. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/_schema/Base.schema.yaml +0 -0
  59. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/_schema/Concept.schema.yaml +0 -0
  60. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/_schema/Experiment.schema.yaml +0 -0
  61. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/_schema/Finding.schema.yaml +0 -0
  62. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/_schema/Hypothesis.schema.yaml +0 -0
  63. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/_schema/Outcome.schema.yaml +0 -0
  64. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/_schema/Playbook.schema.yaml +0 -0
  65. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/_schema/Principle.schema.yaml +0 -0
  66. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/_schema/Reference.schema.yaml +0 -0
  67. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/_schema/Structure.schema.yaml +0 -0
  68. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/concepts/copilot-cli.md +0 -0
  69. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/concepts/index.md +0 -0
  70. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/concepts/overview.md +0 -0
  71. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/concepts/session-cost-analysis.md +0 -0
  72. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/concepts/threshold-based-pricing.md +0 -0
  73. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/experiments/index.md +0 -0
  74. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/experiments/verify-subagent-cost-attribution.md +0 -0
  75. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/findings/2026.07.02-00.00-subagent-logs-runsubagent-prefix.md +0 -0
  76. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/findings/2026.07.02-22.00-title-generation-not-counted-as-model-turn.md +0 -0
  77. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/findings/2026.07.02-23.00-cache-write-approximation.md +0 -0
  78. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/findings/2026.07.13-14.27-release-notes-overreported-maintainer-changes.md +0 -0
  79. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/findings/2026.07.24-15.01-actions-token-cannot-create-pr.md +0 -0
  80. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/findings/2026.08.05-16.24-utility-models-appear-in-logs-but-are-not-billed.md +0 -0
  81. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/findings/2026.10.07-17.30-cli-billed-nanoaiu-and-cache-write.md +0 -0
  82. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/findings/2026.10.07-request-billing-and-cache-write.md +0 -0
  83. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/findings/index.md +0 -0
  84. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/guides/automation-scripts.md +0 -0
  85. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/guides/cost-optimization.md +0 -0
  86. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/guides/index.md +0 -0
  87. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/guides/wsl2-setup.md +0 -0
  88. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/ideas/index.md +0 -0
  89. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/ideas/multi-session-efficiency-analytics.md +0 -0
  90. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/index.md +0 -0
  91. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/log.md +0 -0
  92. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/principles/findings-are-immutable.md +0 -0
  93. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/principles/index.md +0 -0
  94. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/reference/debug-log-format.md +0 -0
  95. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/reference/index.md +0 -0
  96. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/reference/pricing-formats.md +0 -0
  97. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/structures/cache-cost-approximation.md +0 -0
  98. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/structures/index.md +0 -0
  99. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/structures/knowledge-base-information-types.md +0 -0
  100. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/structures/session-discovery-algorithm.md +0 -0
  101. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/structures/subagent-cost-tracking.md +0 -0
  102. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/knowledge/structures/vscode-copilot-extension.md +0 -0
  103. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/pyproject.toml +0 -0
  104. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/scripts/refresh_pricing.py +0 -0
  105. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/skills/copilot-session-usage/SKILL.md +0 -0
  106. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/skills/copilot-session-usage/references/span-analysis-template.md +0 -0
  107. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/src/copilot_session_usage/__init__.py +0 -0
  108. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/src/copilot_session_usage/_internal/__init__.py +0 -0
  109. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/src/copilot_session_usage/_internal/copilot_cli.py +0 -0
  110. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/src/copilot_session_usage/_internal/core.py +0 -0
  111. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/src/copilot_session_usage/_internal/git.py +0 -0
  112. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/src/copilot_session_usage/_internal/vscode.py +0 -0
  113. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/src/copilot_session_usage/api.py +0 -0
  114. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/src/copilot_session_usage/cli.py +0 -0
  115. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/src/copilot_session_usage/data/__init__.py +0 -0
  116. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/src/copilot_session_usage/data/custom-models-pricing.yml +0 -0
  117. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/tests/conftest.py +0 -0
  118. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/tests/test_api.py +0 -0
  119. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/tests/test_cli.py +0 -0
  120. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/tests/test_copilot_cli.py +0 -0
  121. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/tests/test_coverage_gaps.py +0 -0
  122. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/tests/test_generate_release_notes.py +0 -0
  123. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/tests/test_git.py +0 -0
  124. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/tests/test_pricing_runtime.py +0 -0
  125. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/tests/test_release_notes.py +0 -0
  126. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/tests/test_rendering.py +0 -0
  127. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/tests/test_vscode.py +0 -0
  128. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/tests/test_vscode_platform.py +0 -0
  129. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/uv.lock +0 -0
  130. {copilot_session_usage-0.9.2 → copilot_session_usage-0.9.4}/uv.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: copilot-session-usage
3
- Version: 0.9.2
3
+ Version: 0.9.4
4
4
  Summary: Usage and cost analytics for GitHub Copilot and Copilot-CLI session logs
5
5
  Project-URL: Homepage, https://github.com/gsemet/copilot-session-usage
6
6
  Project-URL: Documentation, https://copilot-session-usage.readthedocs.io/en/stable/
@@ -1,7 +1,7 @@
1
1
  {
2
- "_captured": "2026-10-08T09:01:09.111216+00:00",
2
+ "_captured": "2026-10-24T07:19:50.423455+00:00",
3
3
  "_source": "https://raw.githubusercontent.com/github/docs/main/data/tables/copilot/models-and-pricing.yml",
4
4
  "_yaml_path": "/home/runner/work/copilot-session-usage/copilot-session-usage/src/copilot_session_usage/data/models-and-pricing.yml",
5
- "model_count": 45,
6
- "checksum": "d1c7540b412c58b3"
5
+ "model_count": 39,
6
+ "checksum": "2d756a85aa519212"
7
7
  }
@@ -21,17 +21,6 @@
21
21
  # - notes: Optional notes about the model.
22
22
 
23
23
  # OpenAI
24
- - model: 'GPT-5 mini'
25
- provider: openai
26
- release_status: GA
27
- category: Lightweight
28
- threshold: Not applicable
29
- tier: Default
30
- input: $0.25
31
- cached_input: $0.025
32
- output: $2.00
33
- cache_write: Not applicable
34
-
35
24
  - model: GPT-5.3-Codex
36
25
  provider: openai
37
26
  release_status: GA
@@ -43,39 +32,6 @@
43
32
  output: $14.00
44
33
  cache_write: Not applicable
45
34
 
46
- - model: 'GPT-5.4'
47
- provider: openai
48
- release_status: GA
49
- category: Versatile
50
- threshold: '≤ 272K'
51
- tier: Default
52
- input: $2.50
53
- cached_input: $0.25
54
- output: $15.00
55
- cache_write: Not applicable
56
-
57
- - model: GPT-5.4
58
- provider: openai
59
- release_status: GA
60
- category: Versatile
61
- threshold: '> 272K'
62
- tier: Long context
63
- input: $5.00
64
- cached_input: $0.50
65
- output: $22.50
66
- cache_write: Not applicable
67
-
68
- - model: GPT-5.4 mini
69
- provider: openai
70
- release_status: GA
71
- category: Lightweight
72
- threshold: Not applicable
73
- tier: Default
74
- input: $0.75
75
- cached_input: $0.075
76
- output: $4.50
77
- cache_write: Not applicable
78
-
79
35
  - model: GPT-5.4 nano
80
36
  provider: openai
81
37
  release_status: GA
@@ -87,28 +43,6 @@
87
43
  output: $1.25
88
44
  cache_write: Not applicable
89
45
 
90
- - model: GPT-5.5
91
- provider: openai
92
- release_status: GA
93
- category: Powerful
94
- threshold: '≤ 272K'
95
- tier: Default
96
- input: $5.00
97
- cached_input: $0.50
98
- output: $30.00
99
- cache_write: Not applicable
100
-
101
- - model: GPT-5.5
102
- provider: openai
103
- release_status: GA
104
- category: Powerful
105
- threshold: '> 272K'
106
- tier: 'Long context'
107
- input: $10.00
108
- cached_input: $1.00
109
- output: $45.00
110
- cache_write: Not applicable
111
-
112
46
  - model: GPT-5.6 Luna
113
47
  provider: openai
114
48
  release_status: GA
@@ -386,7 +320,7 @@
386
320
  cache_write: $12.50
387
321
 
388
322
  # Google
389
- - model: 'Gemini 3.7 Flash[^gemini-flash-promo]'
323
+ - model: 'Gemini 3.8 Flash[^gemini-flash-promo]'
390
324
  provider: google
391
325
  release_status: GA
392
326
  category: Versatile
@@ -396,15 +330,18 @@
396
330
  cached_input: $0.075
397
331
  output: $3.75
398
332
 
399
- - model: 'Gemini 3.8 Flash[^gemini-flash-promo]'
333
+ # Promotional pricing expires 2026-12-01. Google hasn't shared post-promo pricing yet.
334
+ # When it does, update input, cached_input, and output below, then remove the
335
+ # [^gemini-4-argon-promo] footnote here and in models-and-pricing.md.
336
+ - model: 'Gemini 4 Argon[^gemini-4-argon-promo]'
400
337
  provider: google
401
338
  release_status: GA
402
- category: Versatile
339
+ category: Powerful
403
340
  threshold: 'Not applicable'
404
341
  tier: 'Default'
405
- input: $0.75
406
- cached_input: $0.075
407
- output: $3.75
342
+ input: $2.00
343
+ cached_input: $0.10
344
+ output: $10.00
408
345
 
409
346
  # xAI
410
347
  - model: 'Grok 4.5'
@@ -111,8 +111,29 @@ def test_get_model_rates_prefix_match():
111
111
  assert rates["input_per_m"] == 0.08
112
112
 
113
113
 
114
+ def _gpt_54_row(model, threshold, tier, input_, cached, output):
115
+ return {
116
+ "model": model,
117
+ "threshold": threshold,
118
+ "tier": tier,
119
+ "input": input_,
120
+ "cached_input": cached,
121
+ "output": output,
122
+ "cache_write": "Not applicable",
123
+ }
124
+
125
+
126
+ GPT_54_ROWS = [
127
+ _gpt_54_row("GPT-5.4", "≤ 272K", "Default", "$2.50", "$0.25", "$15.00"),
128
+ _gpt_54_row("GPT-5.4", "> 272K", "Long context", "$5.00", "$0.50", "$22.50"),
129
+ ]
130
+
131
+
114
132
  def test_versioned_model_uses_most_specific_pricing():
115
- pricing = core.load_pricing(Path(core.__file__).parents[1] / "data")
133
+ rows = GPT_54_ROWS + [
134
+ _gpt_54_row("GPT-5.4 mini", "Not applicable", "Default", "$0.75", "$0.075", "$4.50")
135
+ ]
136
+ pricing = core._build_pricing_from_yaml(rows, "test")
116
137
  rates = core._get_model_rates("gpt-5.4-mini-2026-10-01", 100_000, pricing)
117
138
  assert rates == pricing["models"]["gpt-5.4-mini"][0]
118
139
 
@@ -315,15 +336,7 @@ def test_threshold_aware_pricing_exact_boundary():
315
336
  ],
316
337
  )
317
338
  def test_threshold_aware_pricing_is_order_independent(reverse, upper, lower, boundary):
318
- text = core._read_data_file("models-and-pricing.yml")
319
- assert text is not None
320
- rows = [
321
- row
322
- for row in core._parse_pricing_entries(text, "test")
323
- if core._normalize_model_name(row.get("model", "")) == "gpt-5.4"
324
- ]
325
- assert len(rows) == 2
326
- rows = [{**rows[0], "threshold": upper}, {**rows[1], "threshold": lower}]
339
+ rows = [{**GPT_54_ROWS[0], "threshold": upper}, {**GPT_54_ROWS[1], "threshold": lower}]
327
340
  pricing = core._build_pricing_from_yaml(list(reversed(rows)) if reverse else rows, "test")
328
341
  pricing["models"]["gpt-5.4"].reverse()
329
342
  for tokens in [0, boundary - 1, boundary, boundary + 1, 500_000]: