Skip to content

docs: refresh What's New and strengthen the comparison matrix - #570

Merged
jpr5 merged 3 commits into
mainfrom
docs/whats-new-and-matrix
Oct 21, 2026
Merged

jpr5 merged 3 commits into
mainfrom
docs/whats-new-and-matrix

Conversation

@jpr5

@jpr5 jpr5 commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

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):

Card Covers Links to
Model Catalogs & Token Counts Native Anthropic/Gemini model list and detail routes. The Anthropic list on shared /v1/models is opt-in (modelCatalog). Anthropic count_tokens and Gemini countTokens estimates (#542, #551, #568) /claude-messages#model-catalog
Native Auth Errors Opt-in provider-native 401 bodies (authErrors) and the opt-in required-header policy (requiredHeaders) (#542, #566) /claude-messages#authentication-errors
Model Misbehavior Opt-in misbehavior faults (#508, #518) /model-misbehavior
MCP Record & Replay MCP recording/replay, scenario-scoped tool fakes, per-test fake reports (#490, #509, #517) /mcp-mock#recorded-fakes
Stream Realism Anthropic streams stop and journal on client disconnect (#557). Opt-in nonStreamingTiming for OpenAI non-streaming replies (#545, #561, #567) /streaming-physics#non-streaming
Responses API Tools Opt-in (responsesTools: "extended") namespaced and custom tool calls, plus message phases (#511, #513, #531) /responses-api#namespaced-and-custom-tool-calls
OpenAI Platform APIs Files, Batches, Fine-tuning jobs, Vector Stores (#445, #446, #447, #497) /vector-stores
GPT-Live Sessions GPT-Live mock, record and replay (#468) /websocket#openai-live

The 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":

Row aimock MSW VidaiMock mock-llm piyook/llm-mock mokksy/ai-mocks MockServer WireMock
Native model catalogs (Anthropic, Gemini) Built-in ✓ ✗ OpenAI format only OpenAI format only ✗ ✗ ✗ ND
Token-count endpoints Built-in ✓ ✗ Gemini only (fixed count) ✗ ✗ ✗ ✗ ND
Native 401 auth errors Opt-in ✓ manual ✓ manual partial manual partial manual

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-note class in the muted style of the existing "Requires 1.45.0+" table note.

Rows considered and not added

  • Already on the matrix: record & replay, drift detection, MCP / A2A / AG-UI, streaming physics, chaos testing, model misbehavior, provider count.
  • Client-disconnect handling: dropped. Most competitors' source and docs say nothing about it, so the row would be mostly ND. A server that drops a closed stream is normal framework behavior, not something a competitor's docs state.
  • Recorded timing replay: dropped. I could not verify the MockServer and WireMock cells from their docs, and Streaming physics already covers timing.

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: VidaiMock e61b8ba, mock-llm aeb04d6, piyook/llm-mock 9e7a3ce, mokksy/ai-mocks fc70777, MockServer c892f58. The homepage table has an HTML comment on each new row with a short evidence note.

Native model catalogs

  • aimock: Gemini GET /v1beta/models list and detail are native by default. Anthropic /v1/models/{id} detail is native by default. The Anthropic list on shared /v1/models needs modelCatalog: "native". See /claude-messages#model-catalog and /gemini#model-catalog.
  • MSW: has no LLM endpoints. It is marked ✗, the same as the Embeddings and Image rows.
  • VidaiMock: src/server.rs registers GET /v1/models, /v1beta/models and /v1beta/openai/models on models_handler. (Its Anthropic GET /v1/models/{model_action} route is never registered, because the Gemini POST /v1/models/{model_action} route claims the path first.) In src/handlers.rs, models_handler always 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.
  • mock-llm: the README's default config ships one OpenAI-format /v1/models rule ({"object":"list","data":[{"id":"gpt-5.2",...}]}). There is no Anthropic or Gemini catalog.
  • piyook/llm-mock: the README's "Available endpoints" lists only chat completions, /v1/messages and /v1/embeddings. src/api/ has only completions and embeddings.
  • mokksy/ai-mocks: MockAnthropic exposes only messages() (POST /v1/messages), and MockGemini exposes only generateContent and generateContentStream. The repo has no models route (code search for v1/models finds nothing).
  • MockServer: the httpLlmResponse supported-provider path table (mock-server.com llm_response_mocking.html) has no models route. docs/code/llm-mocking.md names GET /v1/models only as proxied traffic that gets no telemetry.
  • WireMock: has no LLM-specific docs (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

  • aimock: Anthropic POST /v1/messages/count_tokens and Gemini :countTokens estimate tokens from the translated request. See /claude-messages#token-counts and /gemini#token-counts.
  • VidaiMock: config/providers/gemini_count_tokens.yaml matches ^/v1(beta)?/models/[^:]+:countTokens$. Its template config/templates/gemini/count_tokens.json.j2 always returns "totalTokens": 9. There is no Anthropic count_tokens provider config.
  • mock-llm and mokksy/ai-mocks: GitHub code search for count_tokens (mock-llm) and countTokens (mokksy) finds nothing. Neither README or API has a count route.
  • piyook/llm-mock: src/api/ has only completions and embeddings, and the endpoint list has no count route.
  • MockServer: docs/code/llm-mocking.md names Anthropic /v1/messages/count_tokens only as unaccounted proxied traffic. There is no httpLlmResponse for it.
  • MSW ✗ and WireMock ND, for the same reasons as the catalog row.

Native 401 auth errors

  • aimock: opt-in policy.authErrors: "native" returns Anthropic authentication_error and Gemini UNAUTHENTICATED bodies. See /claude-messages#authentication-errors and /gemini#authentication-errors.
  • VidaiMock ✓: the README lists X-Mock-Status and ?chaos_status= overrides that return "real provider error envelopes". config/templates/anthropic/error.json.j2 maps 401 to authentication_error. config/templates/gemini/error.json.j2 maps 401 to UNAUTHENTICATED.
  • piyook/llm-mock partial: chaos status accepts any status from 400 to 599. src/utilities/chaos.ts types every status except 429/529 (Claude) or 429/503 (Gemini) as api_error or INTERNAL. So a 401 is not typed authentication_error or UNAUTHENTICATED. The README also says "LLMock has no authentication".
  • mock-llm manual: the README example is a hand-written rule that returns an OpenAI invalid_api_key 401.
  • mokksy/ai-mocks manual: AbstractBuildingStep.respondsError lets you set any status and body.
  • MockServer partial: the LLM chaos errorStatus accepts 401. With no errorKind, LlmErrorBodies.kindForStatus (mockserver-core/src/main/java/org/mockserver/llm/LlmErrorBodies.java) maps every status except 429 and 529 to SERVER_ERROR. So a 401 gets the provider envelope typed api_error or INTERNAL, not authentication_error or UNAUTHENTICATED. This is the same behavior as piyook.
  • MSW and WireMock manual: both are generic HTTP stubs with any status and body.

Weekly scanner compatibility

No FEATURE_RULES entry or migration variant names the new rows, so the Monday scan never reads or writes them. The GET /v1/models rule 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 rule in competitive-matrix-homepage.test.ts, checks four things:

  • every new label is on the homepage;
  • no rule or migration variant names a new label;
  • when every competitor matches every rule, the homepage keeps every new-row cell;
  • when every rule matches, each scanned migration page keeps its new rows.

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:

before: Parsed 41 capability rows, 8 competitor columns.
after:  Parsed 44 capability rows, 8 competitor columns.
both:   No homepage matrix changes detected.
        1 migration page row(s) to check by hand: mock-llm / Azure OpenAI (combined-row)   [pre-existing]
        12 row-less detection(s) to check by hand                                        [identical list]

The only difference is the row count. No change is proposed to the new rows or anywhere else.

Checks

  • prettier --check ., eslint . and tsdown build: pass.
  • The docs and competitive-matrix tests (docs-*, competitive-matrix*, mcp-fakes-doc-samples): 13 files, 530 tests, all pass.
  • Full vitest run: 17610 passed. One test failed: a timing assertion in chaos-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).
  • Local Playwright CLI screenshots, at 375x667, 430x932 and 1440x900:
    • What's New, on this branch and on main.
    • The homepage matrix, on this branch and on main.
    • The four edited migration pages.
  • On phones, the homepage matrix scrolls sideways inside its wrapper, as it does on main. The new rows add no width.
  • What's New now fills two full grid rows. On main, the fifth card sat alone in a second row.
  • The "On this page" panel overlaps the quick-start card at 1440 wide. Main does the same.

@pkg-pr-new

pkg-pr-new Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@copilotkit/aimock@570

commit: 89cc21a

@jpr5
jpr5 merged commit c5a6373 into main Oct 21, 2026
30 checks passed
@jpr5
jpr5 deleted the docs/whats-new-and-matrix branch October 21, 2026 03:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant