Repository navigation
docs: refresh What's New and strengthen the comparison matrix - #570
Merged
Merged
Conversation
commit: |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refreshes the docs overview "What's New" cards for the last month of work, and adds three verified rows to the comparison matrix (homepage and the four scanned migration pages).
What's New (
docs/docs/index.html)The cards were last updated in May. The 5 old cards are replaced with 8 cards (two full rows of the 4-column grid). They cover CHANGELOG 1.43.0 (2026-09-22) through
[Unreleased](1.46.0, #562):/v1/modelsis opt-in (modelCatalog). Anthropiccount_tokensand GeminicountTokensestimates (#542, #551, #568)/claude-messages#model-catalogauthErrors) and the opt-in required-header policy (requiredHeaders) (#542, #566)/claude-messages#authentication-errors/model-misbehavior/mcp-mock#recorded-fakesnonStreamingTimingfor OpenAI non-streaming replies (#545, #561, #567)/streaming-physics#non-streamingresponsesTools: "extended") namespaced and custom tool calls, plus message phases (#511, #513, #531)/responses-api#namespaced-and-custom-tool-calls/vector-stores/websocket#openai-liveThe Model Catalogs & Token Counts, Native Auth Errors and Stream Realism cards carry a "New in 1.46.0" label, and the Responses API Tools card marks its message phases "(new in 1.46.0)". Every opt-in is called out on its card:
requiredHeaders,authErrors,modelCatalog(the Anthropic shared list),nonStreamingTiming, misbehavior and extended Responses tools. The version banner is not touched.Comparison matrix
New rows
Homepage (
docs/index.html), inserted before "Dependencies":The migration pages for VidaiMock, mock-llm, piyook and Mokksy get the same three rows, in each page's own style: VidaiMock uses text cells, and the other three use the ✓/✗ glyphs with text for partial or manual values. No new legend marks are needed. The MSW, Python-mocks and openai-responses pages have different columns, so they are unchanged.
Every aimock ✓ cell on the three new rows carries a muted "1.46.0+" label, on the homepage and on the four migration pages. The label uses a
.version-noteclass in the muted style of the existing "Requires 1.45.0+" table note.Rows considered and not added
Per-cell evidence (checked 2026-10-20)
Competitor sources are the repos listed in
scripts/update-competitive-matrix.ts, at the default-branch HEAD on that date: VidaiMocke61b8ba, mock-llmaeb04d6, piyook/llm-mock9e7a3ce, mokksy/ai-mocksfc70777, MockServerc892f58. The homepage table has an HTML comment on each new row with a short evidence note.Native model catalogs
GET /v1beta/modelslist and detail are native by default. Anthropic/v1/models/{id}detail is native by default. The Anthropic list on shared/v1/modelsneedsmodelCatalog: "native". See/claude-messages#model-catalogand/gemini#model-catalog.src/server.rsregistersGET /v1/models,/v1beta/modelsand/v1beta/openai/modelsonmodels_handler. (Its AnthropicGET /v1/models/{model_action}route is never registered, because the GeminiPOST /v1/models/{model_action}route claims the path first.) Insrc/handlers.rs,models_handleralways returns the OpenAI list shape:{"object":"list","data":[{"id","object":"model","created","owned_by":"vidai"}]}. So its Gemini catalog route is not in native format, and there is no Anthropic catalog./v1/modelsrule ({"object":"list","data":[{"id":"gpt-5.2",...}]}). There is no Anthropic or Gemini catalog./v1/messagesand/v1/embeddings.src/api/has onlycompletionsandembeddings.MockAnthropicexposes onlymessages()(POST /v1/messages), andMockGeminiexposes onlygenerateContentandgenerateContentStream. The repo has no models route (code search forv1/modelsfinds nothing).httpLlmResponsesupported-provider path table (mock-server.comllm_response_mocking.html) has no models route.docs/code/llm-mocking.mdnamesGET /v1/modelsonly as proxied traffic that gets no telemetry.wiremock.org/docs/solutions/ai/is about using AI to write stubs). It is ND, the same as WireMock's other LLM-endpoint cells.Token-count endpoints
POST /v1/messages/count_tokensand Gemini:countTokensestimate tokens from the translated request. See/claude-messages#token-countsand/gemini#token-counts.config/providers/gemini_count_tokens.yamlmatches^/v1(beta)?/models/[^:]+:countTokens$. Its templateconfig/templates/gemini/count_tokens.json.j2always returns"totalTokens": 9. There is no Anthropiccount_tokensprovider config.count_tokens(mock-llm) andcountTokens(mokksy) finds nothing. Neither README or API has a count route.src/api/has onlycompletionsandembeddings, and the endpoint list has no count route.docs/code/llm-mocking.mdnames Anthropic/v1/messages/count_tokensonly as unaccounted proxied traffic. There is nohttpLlmResponsefor it.Native 401 auth errors
policy.authErrors: "native"returns Anthropicauthentication_errorand GeminiUNAUTHENTICATEDbodies. See/claude-messages#authentication-errorsand/gemini#authentication-errors.X-Mock-Statusand?chaos_status=overrides that return "real provider error envelopes".config/templates/anthropic/error.json.j2maps 401 toauthentication_error.config/templates/gemini/error.json.j2maps 401 toUNAUTHENTICATED.statusaccepts any status from 400 to 599.src/utilities/chaos.tstypes every status except 429/529 (Claude) or 429/503 (Gemini) asapi_errororINTERNAL. So a 401 is not typedauthentication_errororUNAUTHENTICATED. The README also says "LLMock has no authentication".invalid_api_key401.AbstractBuildingStep.respondsErrorlets you set any status and body.errorStatusaccepts 401. With noerrorKind,LlmErrorBodies.kindForStatus(mockserver-core/src/main/java/org/mockserver/llm/LlmErrorBodies.java) maps every status except 429 and 529 toSERVER_ERROR. So a 401 gets the provider envelope typedapi_errororINTERNAL, notauthentication_errororUNAUTHENTICATED. This is the same behavior as piyook.Weekly scanner compatibility
No
FEATURE_RULESentry or migration variant names the new rows, so the Monday scan never reads or writes them. TheGET /v1/modelsrule stays row-less. Its keyword (/v1/models) would match any OpenAI models endpoint, which is not what the catalog row compares.A new test,
hand-reviewed homepage rows with no scan ruleincompetitive-matrix-homepage.test.ts, checks four things:I mutation-tested it: adding
"Token-count endpoints"as a migration variant fails 4 of its tests.docs-matrix-legend.test.ts: the homepage ND count goes from 45 to 47, because of the two WireMock ND cells.Dry run (
npx tsx scripts/update-competitive-matrix.ts --dry-run, with a GitHub token), before and after the change:The only difference is the row count. No change is proposed to the new rows or anywhere else.
Checks
prettier --check .,eslint .andtsdownbuild: pass.docs-*,competitive-matrix*,mcp-fakes-doc-samples): 13 files, 530 tests, all pass.vitest run: 17610 passed. One test failed: a timing assertion inchaos-fal-single-roll.test.ts. That file only measures chaos latency, and this PR does not change it. It passes when run alone (4/4).