Repository navigation
feat(evals): move Vocabulary Complexity to gpt-6-luna ahead of the gpt-4o and gpt-4.1 retirement - #421
feat(evals): move Vocabulary Complexity to gpt-6-luna ahead of the gpt-4o and gpt-4.1 retirement#421gary-mu wants to merge 4 commits into
Conversation
…t-4o and gpt-4.1 retirement OpenAI retires gpt-4o-2024-11-20 and gpt-4.1-2025-04-14 on Jan 14, 2027. Vocabulary Complexity uses gpt-4o for background knowledge in every grade and gpt-4.1 to rate grades 5-12. Both steps move to gpt-6-luna. It rejects temperature 0, so both steps pin temperature 1. Grades 3-4 keep gemini-2.5-pro at temperature 0 for the rating. Prompts, schemas and parsers are unchanged. The Python contract copy is regenerated with make generate-contracts; both SDKs' vocabulary unit tests and two doc comments now name the new model. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With background knowledge and the grades 5-12 rating both on gpt-6-luna, the TypeScript SDK reported "openai:gpt-6-luna+openai:gpt-6-luna" while the Python SDK reported "openai:gpt-6-luna". SPEC §3.4 gives one model one label, so TypeScript now names a shared model once, as Python and the model-override path already do. The registry conformance test derives the expected label the same way, and the tests that counted three distinct vocabulary models now count two. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
🔵 Needs a closer look
Validation covered only Python, leaving the TypeScript Vercel AI SDK path awaiting a credentialed live smoke test to confirm the new default model supports both prose generation and strict structured output.
No open issues 🎉
What changed in this PR
Migrates Vocabulary Complexity’s OpenAI steps to gpt-6-luna ahead of the scheduled model retirements, while keeping the grades 3–4 rating model and output shape unchanged.
Changes:
- Sets background knowledge and grades 5–12 rating to
gpt-6-lunaat temperature 1, including the generated Python contract. - Deduplicates TypeScript model labels when both stages use the same model, matching Python.
- Updates SDK test expectations and TypeScript documentation comments.
| File | Description |
|---|---|
sdks/typescript/tests/unit/registry-conformance.test.ts |
Expects distinct model labels in execution order. |
sdks/typescript/tests/unit/evaluators/vocabulary-complexity.test.ts |
Updates model labels, temperatures, and grade-specific expectations. |
sdks/typescript/tests/unit/evaluators/anthropic-override.test.ts |
Updates the expected distinct model count to two. |
sdks/typescript/src/evaluators/text-complexity/ela-reading/vocabulary-complexity.ts |
Deduplicates shared model labels and updates the rating-model comment. |
sdks/typescript/src/evaluators/base.ts |
Updates model-override documentation to describe the two models. |
sdks/python/tests/unit/evaluators/text_complexity/ela_reading/test_vocabulary_complexity.py |
Updates model expectations and verifies the shared-model label. |
sdks/python/src/learning_commons_evaluators/contracts/_generated/text_complexity/ela_reading/vocabulary_complexity/config.json |
Synchronizes the generated Python contract with the migration. |
evals/text-complexity/ela-reading/vocabulary-complexity/config.json |
Sets both OpenAI steps to gpt-6-luna at temperature 1. |
Review effort: Balanced
|
@gary-mu My understanding is that also tagging @adnanrhussain here since I think we had this conversation back in August. |
|
Thanks @slee430. No change made:
If OpenAI later starts rejecting any temperature at non- |
|
@gary-mu Thanks! I thought we agreed to follow the model's default settings going forwad. @aychi1 @adnanrhussain, could you confirm if that matches your understanding? If so, I think we should use null instead of 1, since null omits the parameter and lets the model use its default. But, given that this eval may be revamped again and this is a quick fix, I don't think this needs to block the PR. But I think it would be good to follow a consistent approach going forward :) |
gpt-6-luna takes no temperature but its default: temperature 0 returns "Unsupported parameter: 'temperature' is not supported with this model", while 1 and an omitted parameter are both accepted. That is the case config.schema.json reserves null for, and the team has agreed to run models at their own defaults going forward. Both gpt-6-luna steps (background_knowledge and vocab_complexity_other_grades) now pin null, so neither SDK sends the parameter. The model's default is 1, the value the migration analysis ran at, so outputs should not change. The Gemini grades 3-4 step keeps temperature 0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sounds good! Changed to |
OpenAI retires
gpt-4o-2024-11-20andgpt-4.1-2025-04-14on Jan 14, 2027. Vocabulary Complexity uses gpt-4o to write students' background knowledge (stage 1, every grade) and gpt-4.1 to rate grades 5–12 (stage 2). This PR moves both steps togpt-6-luna.Reports (private Learning Commons Pages site; sign in with a
chanzuckerbergGitHub account):What changed
background_knowledge(all grades)openai/gpt-4o-2024-11-20, temperature 0openai/gpt-6-luna, no temperature sent (model default)vocab_complexity_grades_3_4google/gemini-2.5-pro, temperature 0vocab_complexity_other_grades(5–12)openai/gpt-4.1-2025-04-14, temperature 0openai/gpt-6-luna, no temperature sent (model default)evals/text-complexity/ela-reading/vocabulary-complexity/config.json: model and temperature for the two OpenAI steps. Prompts, prompt hashes, schemas and parsers are unchanged.make generate-contracts(generated file, not hand-edited).evaluators/base.ts,vocabulary-complexity.ts) now name gpt-6-luna.openai:gpt-6-luna+openai:gpt-6-lunawhile Python reportedopenai:gpt-6-luna. SPEC §3.4 gives one model one label, so TypeScript now names a shared model once, as Python and themodelOverridepath already did. The registry conformance test derives its expected label the same way, and two tests that counted three distinct vocabulary models now count two.Why no temperature (third commit). gpt-6-luna takes only its default:
temperature: 0returns "Unsupported parameter: 'temperature' is not supported with this model", while 1 and no parameter are both accepted.config.schema.jsonreservesnullfor exactly this case (a model that rejects any non-default value), and review asked to run models at their own defaults, so both steps pinnulland neither SDK sends the parameter. The evaluation sent 1, which is also the OpenAI API default, so this should not change outputs. The first version of this PR pinned 1.Why
gpt-6-lunawith no date. OpenAI lists it as the model's only snapshot, so it meets SPEC's rule for pinned model IDs (an immutable release with no dated alias).Reasoning effort. gpt-6-luna is a reasoning model. Both SDKs send no effort setting, so it runs at the vendor default (medium); the contract has no field for it.
Expected effect
Paired runs against today's pipeline on the same texts, with the request shape the Python SDK sends (Responses API, strict structured output, no output cap). "Pass" means not significantly worse, which is the bar the migration agreed on.
Grades 3–4 (stage 1 only; 233 texts, run
2026_10_26_23_38_20):Grades 5–12 (both stages; ≥1 Match Accuracy rule, 81 three-rater texts, run
2026_10_28_16_13_25):What callers will notice:
metadata.modelchanges toopenai:gpt-6-lunafor grades 5–12 andopenai:gpt-6-luna+google:gemini-2.5-profor grades 3–4, in both SDKs.The output shape is unchanged.
Test plan
python3 scripts/check.py --fix: all 6 checks pass (config hashes, schemas, fixtures, notebooks, requirements).sdks/python:make verifypasses (1,755 passed, 108 skipped, after mergingmain).sdks/typescript:npm run lint && npm run typecheck && npm run test:unitpass (1,648 tests, after mergingmain).RUN_INTEGRATION_TESTS=true npm run test:integration -- vocabulary-complexitywithOPENAI_API_KEYandGOOGLE_API_KEY. The suite already accepts an adjacent level and retries up to 3 times, so sampling variation shouldn't make it flaky.example_notebook.ipynbfor one grade 3–4 and one grade 5–12 text and checkmetadata.model.Not in this PR
hurricanes_grade7fixture reuses an example from the grades 5–12 prompt and should be swapped before release.gpt-4o-2024-08-06retires on the same date; that is a separate migration.