- Microsoft Agent Framework (MAF) integration guide with Python and .NET examples.
- Generic
.code-tabslanguage switcher with cross-section sync and localStorage persistence.
- Updated Claude model references from
claude-sonnet-4-20250514(retiring 2026-06-15) toclaude-sonnet-4-6.
Journal.getFixtureMatchCount()is now read-only: calling it with an unknown testId no longer inserts an empty map or triggers FIFO eviction of a live testId. Reads never mutate cache state.- CLI rejects negative values for
--journal-maxand--fixture-counts-maxwith a clear error (previously silently treated as unbounded).
createServer()programmatic default:journalMaxEntriesandfixtureCountsMaxTestIdsnow default to finite caps (1000 / 500) instead of unbounded. Long-running embedders that relied on unbounded retention must now opt in explicitly by passing0. Back-compat with test harnesses usingnew Journal()directly is preserved (they still default to unbounded).
- New
--fixture-counts-max <n>CLI flag (default 500) to cap the fixture-match-counts map by testId.
- Cap in-memory journal (and fixture-match-counts map) to prevent heap OOM under sustained load.
Journal.entrieswas unbounded, causing heap growth ~3.8MB/sec to 4GB → OOM in ~18 minutes on production Railway deployments. Default cap for CLI (serve) is now 1000 entries; programmaticcreateServer()remains unbounded by default (back-compat). See--journal-maxflag.
- Response template merging — override
id,created,model,usage,finishReason,role,systemFingerprinton fixture responses across all 4 provider formats (OpenAI, Claude, Gemini, Responses API) (#111) - JSON auto-stringify — fixture
argumentsandcontentfields accept objects that are auto-stringified by the loader, eliminating escaped JSON pain (#111) - Migration guide from openai-responses-python (#111)
- All fixture examples and docs converted to object syntax (#111)
- Fix
onTranscriptiondocs to show correct 1-argument signature - Fix
validateFixturesto recognize ContentWithToolCalls and multimedia response types - Add
ResponseOverridesfield validation invalidateFixtures— catches invalid types forid,created,model,usage,finishReason,role,systemFingerprint
- Add GitHub Action for one-line CI setup —
uses: CopilotKit/aimock@v1with fixtures, config, port, args, and health check (#102) - Wire fixture converters into CLI —
npx @copilotkit/aimock convert vidaimockandnpx @copilotkit/aimock convert mockllmas first-class subcommands (#102) - Add 30 npm keywords for search discoverability (#102)
- Add fixture gallery with 11 examples covering all mock types, plus browsable docs page at /examples (#102)
- Add vitest and jest plugins for zero-config testing —
import { useAimock } from "@copilotkit/aimock/vitest"(#102) - Strip video URLs from README for npm publishing (#102)
- Multimedia endpoint support: image generation (OpenAI DALL-E + Gemini Imagen), text-to-speech, audio transcription, and video generation with async polling (#101)
match.endpointfield for fixture isolation — prevents cross-matching between chat, image, speech, transcription, video, and embedding fixtures (#101)- Bidirectional endpoint filtering — generic fixtures only match compatible endpoint types (#101)
- Convenience methods:
onImage,onSpeech,onTranscription,onVideo(#101) - Record & replay for all multimedia endpoints — proxy to real APIs, save fixtures with correct format/type detection (#101)
_endpointTypeexplicit field onChatCompletionRequestfor type safety (#101)- Comparison matrix and drift detection rules updated for multimedia (#101)
- 54 new tests (32 integration, 11 record/replay, 12 type/routing)
- Add
AGUIMock— mock the AG-UI (Agent-to-UI) protocol for CopilotKit frontend testing. All 33 event types, 11 convenience builders, fluent registration API, SSE streaming with disconnect handling (#100) - Add AG-UI record & replay with tee streaming — proxy to real AG-UI agents, record event streams as fixtures, replay on subsequent requests. Includes
--proxy-onlymode for demos (#100) - Add AG-UI schema drift detection — compares aimock event types against canonical
@ag-ui/coreZod schemas to catch protocol changes (#100) - Add
--agui-record,--agui-upstream,--agui-proxy-onlyCLI flags (#100) - Remove section bar from docs pages (cleanup)
- Add
--proxy-onlyflag — proxy unmatched requests to upstream providers without saving fixtures to disk or caching in memory. Every unmatched request always hits the real provider, preventing stale recorded responses in demo/live environments (#99)
- Per-test sequence isolation via
X-Test-Idheader — each test gets its own fixture match counters, wired through all 12 HTTP handlers and 3 WebSocket handlers. No more test pollution from shared sequential state (#93) - Combined
content + toolCallsin fixture responses — newContentWithToolCallsResponsetype and type guard, supported across OpenAI Chat, OpenAI Responses, Anthropic Messages, and Gemini, with stream collapse support (#92) - OpenRouter
reasoning_contentsupport in chat completions (#88)
- Fix
web_search_callitems to useaction.querymatching real OpenAI API format (#89) - Clean up homepage URL (remove
/index.htmlsuffix) (#90) - Center Record & Replay section title and top-align terminal panel (#87)
- Add demo video to README (#91)
- CI: Slack notifications for drift tests, competitive matrix updates, and new PRs (#86)
- CI: use
pull_request_targetfor fork PR Slack alerts - Docs: add reasoning and webSearches to Response Types table
- Add
requestTransformoption for deterministic matching and recording — normalizes requests before matching (strips timestamps, UUIDs, session IDs) and switches to exact equality when set. Applied across all 15 provider handlers and the recorder. (#79, based on design by @iskhakovt in #63) - Add reasoning/thinking support for OpenAI Chat Completions —
reasoningfield in fixtures generatesreasoning_contentin responses and streamingreasoningdeltas (#62 by @erezcor) - Add reasoning support for Gemini (
thoughtParts), AWS Bedrock InvokeModel + Converse (thinkingblocks), and Ollama (thinktags) (#81) - Add web search result events for OpenAI Responses API (#62)
- Fix migration page examples: replace fragile
time.sleepwith health check loops against/__aimock/health; fix Python npx examplestderr=subprocess.PIPEdeadlock (#80) - Fix stream collapse to handle reasoning events correctly
- Update all GitHub repo URLs from CopilotKit/llmock to CopilotKit/aimock
- Add Open Graph image and meta tags for social sharing
- Reframe drift detection docs for users ("your mocks never go stale") with restored drift report output
- CI: add
npmenvironment to release workflow for deployment tracking; addworkflow_dispatchto Python test workflow
- Rename package from
@copilotkit/llmockto@copilotkit/aimock - Add MCPMock — Model Context Protocol mock with tools, resources, prompts, session management
- Add A2AMock — Agent-to-Agent protocol mock with SSE streaming
- Add VectorMock — Pinecone, Qdrant, ChromaDB compatible vector DB mock
- Add search (Tavily), rerank (Cohere), and moderation (OpenAI) service mocks
- Add
/__aimock/*control API for external fixture management - Add
aimockCLI with JSON config file support - Add mount composition for running multiple protocol handlers on one server
- Add JSON-RPC 2.0 transport with batch and notifications
- Add
aimock-pytestpip package for native Python testing - Add converter scripts:
convert-vidaimock(Tera → JSON) andconvert-mockllm(YAML → JSON) - Add drift automation skill updates —
fix-drift.tsnow updatesskills/write-fixtures/SKILL.mdalongside source fixes - Rename Prometheus metrics to
aimock_*with new MCP/A2A/Vector counters - Rebrand logger
[aimock], chaos headersx-aimock-chaos-*, CLI startup message - Docker: dual-push
ghcr.io/copilotkit/aimock+ghcr.io/copilotkit/llmock(compat) - Helm chart renamed to
charts/aimock/ - 6 migration guides: MSW, VidaiMock, mock-llm, piyook, Python mocks, Mokksy
- Homepage redesigned (Treatment 3: Progressive Disclosure)
- Docs: sidebar.js, cli-tabs.js, section bar, competitive matrix with 25 rows
- Fix record proxy to preserve upstream URL path prefixes — base URLs like
https://gateway.company.com/llmnow correctly resolve togateway.company.com/llm/v1/chat/completionsinstead of losing the/llmprefix (PR #57) - Fix record proxy to forward all request headers to upstream, not just
Content-Typeand auth headers. Hop-by-hop headers (connection,keep-alive,transfer-encoding, etc.) and client-set headers (host,content-length,cookie,accept-encoding) are still stripped (PR #58) - Fix recorder to decode base64-encoded embeddings when
encoding_format: "base64"is set in the request. Python's openai SDK uses this by default. Previously these were saved asproxy_errorfixtures (PR #64) - Guard base64 embedding decode against corrupted data (non-float32-aligned buffers fall through gracefully instead of crashing)
- Add
--summaryflag to competitive matrix update script for markdown-formatted change summaries
- Provider-specific endpoints: dedicated routes for Bedrock (
/model/{modelId}/invoke), Ollama (/api/chat,/api/generate), Cohere (/v2/chat), and Azure OpenAI deployment-based routing (/openai/deployments/{id}/chat/completions) - Chaos injection:
ChaosConfigtype withdrop,malformed, anddisconnectactions; supports per-fixture chaos viachaosconfig on each fixture and server-wide chaos via--chaos-drop,--chaos-malformed, and--chaos-disconnectCLI flags - Metrics:
GET /metricsendpoint exposing Prometheus text format with request counters and latency histograms per provider and route - Record-and-replay:
--recordflag andproxyAndRecordhelper that proxies requests to real LLM APIs, collapses streaming responses, and writes fixture JSON to disk for future playback
- Fix documentation URLs to use correct domain (llmock.copilotkit.dev)
- Embeddings API:
POST /v1/embeddingsendpoint,onEmbedding()convenience method,inputTextmatch field,EmbeddingResponsetype, deterministic fallback embeddings from input hash, Azure embedding routing - Structured output / JSON mode:
responseFormatmatch field,onJsonOutput()convenience method - Sequential responses:
sequenceIndexmatch field for stateful multi-turn fixtures, per-fixture-group match counting,resetMatchCounts()method - Streaming physics:
StreamingProfiletype withttft,tps,jitterfields for realistic timing simulation - AWS Bedrock:
POST /model/{modelId}/invokeendpoint, Anthropic Messages format translation - Azure OpenAI: provider routing for
/openai/deployments/{id}/chat/completionsand/openai/deployments/{id}/embeddings - Health & models endpoints:
GET /health,GET /ready,GET /v1/models(auto-populated from fixtures) - Docker & Helm: Dockerfile, Helm chart for Kubernetes deployment
- Documentation website: full docs site at llmock.copilotkit.dev with feature pages and competitive comparison matrix
- Automated drift remediation:
scripts/drift-report-collector.tsandscripts/fix-drift.tsfor CI-driven drift fixes - CI automation: competitive matrix update workflow, drift fix workflow
FixtureOptsandEmbeddingFixtureOptstype aliases exported for external consumers
- Fix Gemini Live handler crash on malformed
clientContent.turnsandtoolResponse.functionResponses - Add
isClosedguard before WebSocket finalization events (prevents writes to closed connections) - Default to non-streaming for Claude Messages API and Responses API (matching real API defaults)
- Fix
streamingProfilemissing from convenience method opts types (on,onMessage, etc.) - Fix skills/ symlink direction so npm pack includes the write-fixtures skill
- Fix
.clauderemoved from package.json files (was dead weight — symlink doesn't ship) - Add
.worktrees/to eslint ignores - Remove dead
@keyframes sseLineCSS from docs site - Fix watcher cleanup on error (clear debounce timer, null guard)
- Fix empty-reload guard (keep previous fixtures when reload produces 0)
- README rewritten as concise overview with links to docs site
- Write-fixtures skill updated for all v1.5.0 features
- Docs site: Get Started links to docs, comparison above reliability, npm version badge
--watch(-w): File-watching with 500ms debounced reload. Keeps previous fixtures on validation failure.--log-level: Configurable log verbosity (silent,info,debug). Defaultinfofor CLI,silentfor programmatic API.--validate-on-load: Fixture schema validation at startup — checks response types, tool call JSON, numeric ranges, shadowing, and catch-all positioning.validateFixtures()exported for programmatic useLoggerclass exported for programmatic use
- Fix Responses WS handler to accept flat
response.createformat matching the real OpenAI API (previously required a non-standard nestedresponse: { ... }envelope) - WebSocket drift detection tests: TLS client for real provider WS endpoints, 4 verified drift tests (Responses WS + Realtime), Gemini Live canary for text-capable model availability
- Realtime model canary: detects when
gpt-4o-mini-realtime-previewis deprecated and suggests GA replacement - Gemini Live documented as unverified (no text-capable
bidiGenerateContentmodel exists yet) - Fix README Gemini Live response shape example (
modelTurn.parts, notmodelTurnComplete)
- Fix missing
refusalfield on OpenAI Chat Completions responses — both the SDK and real API returnrefusal: nullon non-refusal messages, but llmock was omitting it - Live API drift detection test suite: three-layer triangulation between SDK types, real API responses, and llmock output across OpenAI (Chat + Responses), Anthropic Claude, and Google Gemini
- Weekly CI workflow for automated drift checks
DRIFT.mddocumentation for the drift detection system
- Claude Code fixture authoring skill (
/write-fixtures) — comprehensive guide for match fields, response types, agent loop patterns, gotchas, and debugging - Claude Code plugin structure for downstream consumers (
--plugin-dir,--add-dir, or manual copy) - README and docs site updated with Claude Code integration instructions
- Mid-stream interruption:
truncateAfterChunksanddisconnectAfterMsfixture fields to simulate abrupt server disconnects - AbortSignal-based cancellation primitives (
createInterruptionSignal, signal-awaredelay()) - Backward-compatible
writeSSEStreamoverload withStreamOptionsreturning completion status - Interruption support across all HTTP SSE and WebSocket streaming paths
destroy()method onWebSocketConnectionfor abrupt disconnect simulation- Journal records
interruptedandinterruptReasonon interrupted streams - LLMock convenience API extended with interruption options (
truncateAfterChunks,disconnectAfterMs)
- Zero-dependency RFC 6455 WebSocket framing layer
- OpenAI Responses API over WebSocket (
/v1/responses) - OpenAI Realtime API over WebSocket (
/v1/realtime) — text + tool calls - Gemini Live BidiGenerateContent over WebSocket — text + tool calls
- WebSocket close-frame lifecycle fixes
- Improved error visibility across WebSocket handlers
- Future Direction section in README
- Add function call IDs to Gemini tool call responses
- Remove changesets, simplify release workflow
- 9948a8b: Add
prependFixture()andgetFixtures()public API methods
- Add
getTextContentfor array-format message content handling