chore(deps): update dependency @copilotkit/aimock to v1.35.0#820
Open
renovate[bot] wants to merge 1 commit into
Open
chore(deps): update dependency @copilotkit/aimock to v1.35.0#820renovate[bot] wants to merge 1 commit into
renovate[bot] wants to merge 1 commit into
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
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.
This PR contains the following updates:
1.15.1→1.35.0Release Notes
CopilotKit/aimock (@copilotkit/aimock)
v1.35.0Compare Source
Added
POST /v1beta/models/{model}:predictLongRunningsubmit,GET /v1beta/operations/{name}poll throughdone:false → done:true, poll-count progression viaveoVideo; the Files-APIuriis served as-is (aimock never proxies or downloads video bytes) (#278)record.providers.veo) — submit and poll forwarded 1:1, eager fixture capture of the Files-API uri ondone:true; captured operations replay later (#278)POST /v1/videos/generationssubmit (JSON-only; multipart rejected with 400),GET /v1/videos/{request_id}poll throughpending → done | failed | expiredwith synthesizedprogress,grokVideoprogression,cost_in_usd_ticksunits, and a Sora-safe/v1/videos/{id}dispatch that leaves the OpenAI video surface unchanged (#278)record.providers.grok) — submit and poll forwarded 1:1, eager fixture capture of url/duration/cost ondone,failedpersisted,expiredpassed through; captured jobs replay later (#278)blocksarray on the combinedcontent+toolCallsfixture shape lets a fixture express ordered text/tool-call blocks ({type:"text",text}|{type:"toolCall",name,arguments,id?}); when present it takes precedence over{content, toolCalls}for stream order, enabling tool-first and interleaved ordering. Legacy{content, toolCalls}fixtures are unchanged (#274)delta.content/delta.tool_callsare separate channels the client merges) (#274)blocksonly when the recorded upstream stream was genuinely tool-first or interleaved; text-first streams keep the legacy{content, toolCalls}shape so golden recordings round-trip byte-identically (#274)blocksarray is a complete response shape on its own, with nocontent/toolCallsrequired — builders derive the aggregate from the blocks andvalidateFixtures()accepts the shape (#274)blocksarray (#274)validateBlocksrejects a malformedblocksarray at load time — non-array, non-object entries, atypeother thantext/toolCall, a non-string or empty-string text block, or atoolCallblock missing a name or carrying non-JSON arguments — and warns when a fixture carries bothblocksand divergentcontent/toolCalls, so a bad array never reaches a builder mid-dispatch (#274)v1.34.0Compare Source
Changed
turnIndexdisambiguates, no longer a hard reject gate (#276)turnIndexRelaxedmatch diagnostic + one-shot logger warn on a divergent relaxed serve (#276)AIMOCK_STRICT_TURN_INDEX=1restores the legacy strict turnIndex gate for replay (#276)Fixed
step.*,interaction.created/completed, tool args viaarguments_delta) and non-streaming responses (steps/output_text); legacy 1.x recorded fixtures still parse (#279)v1.33.0Compare Source
Added
--max-proxy-buffer-bytes/--max-proxy-buffer-framesflags to cap proxy buffering (#275)Fixed
Invalid string length(#275)X-AIMock-Contextto prevent fixture path traversal (#272)matchesPatternlastIndex (#272)v1.32.0Compare Source
Added
status/resultresponses now emitx-fal-request-id, and abillableUnitsfixture field (e.g.onFalQueue(model, json, { billableUnits })) emitsx-fal-billable-unitson the completed result so adapters like@tanstack/ai-falcan surfaceusage.unitsBilledon replay. Record mode captures the upstreamx-fal-billable-unitsheader automatically, so recorded fixtures round-trip billing with no hand-editing (#269)v1.31.0Compare Source
Added
Changed
Fixed
v1.30.0Compare Source
Added
thinkingblock (or itssignature, or aredacted_thinkingblock'sdata) is rejected with the real Anthropic400, instead of producing a false-green replay — under strict mode; otherwise the violation warns and replay proceeds. Emitted thinking blocks now carry a non-empty placeholder signature so record→replay round-trips stay green across text, content+tool, and tool-only response shapes.signature_deltawire event on the streaming paths; each thinking block'ssignaturefield non-streaming) andredacted_thinkingblockdataare captured across all three Anthropic capture paths — the SSE stream collapser, the Anthropic-native binary frames on Bedrock invoke-with-response-stream (thinking_delta/signature_delta/redacted_thinking), and the non-streaming JSON recording path. Bedrock ConversereasoningContentdeltas and Coherethinkingcontent-deltas are captured into reasoning, and a recorded AnthropicreasoningSignatureplus anyredactedThinkingpayloads are written into the saved fixture (TextResponse/ToolCallResponse/ContentWithToolCallsResponse). On replay, Anthropic emits the recorded signature when one was captured and otherwise falls back to the round-trip-safe placeholder, and recordedredactedThinkingpayloads are replayed as faithful leadingredacted_thinkingcontent blocks (streamingcontent_block_start/content_block_stopwith the opaquedata, non-streaming content-array blocks), across both streaming and non-streaming text, content+tool, and tool-only response shapes. The encrypted reasoning artifacts (reasoningSignatureandredactedThinking) are gated on the same model-capability resolution as the plaintext reasoning channel, so replaying a reasoning-model fixture against a non-reasoning model under strict mode suppresses thethinking,signature, andredacted_thinkingchannels together rather than leaving the encrypted blocks half-gated. Fidelity caveat: the interleaving ofthinkingandredacted_thinkingblocks and per-block signatures are not preserved — all recordedredacted_thinkingblocks replay as a leading group, and the merged thinking block carries thesignatureof the last thinking block that actually emitted one (a signature-less block does not clobber an earlier signature).Changed
reasoning_content/ Responsesreasoning_summary_text/ Anthropic thinking / etc.) for models that would not emit reasoning against the real provider. A newisReasoningModelclassifier andresolveReasoningForModelgate are applied across OpenAI chat + Responses, Anthropic, Ollama, Gemini, Cohere, Bedrock (invoke + Converse), and WebSocket Responses: a non-reasoning model paired with a reasoning fixture has its reasoning suppressed under strict mode, or warns-and-emits otherwise. TheAIMOCK_REASONING_MODELSandAIMOCK_NONREASONING_MODELSenv vars override the classifier.sequenceIndex/turnIndexcount state, the 503 message and error log readN candidate fixture(s) skipped by sequence/turn stateinstead of the genericno fixture matched. HTTP status (503) and error envelope shape are unchanged. Applied across all strict-mode emission sites via a shared helper. Design notes: the skip diagnostic is captured from the same single matcher pass that performs the match — statefulmatch.predicatefunctions fire exactly once per request — and thehasToolResultshape predicate is evaluated before thesequenceIndex/turnIndexstate gates, so the skip count only includes fixtures whose request shape actually matched.Fixed
data) now record as normal empty-content fixtures instead of "Could not detect response format" error fixtures, with streaming/non-streaming parity.redacted_thinkingblocks with emptydataare filtered at every capture site via one shared predicate, matching the strict replay validator — a recorded fixture can no longer 400 on replay for data the validator rejects (record-green ⇒ replay-green).v1.29.0Compare Source
Added
POST /__aimock/reset/fixtures— full reset (clears fixtures, generation state, and journal).POST /__aimock/reset/journal— clears only the request journal, leaving fixtures intact.aimock-pytest:reset_fixtures()andreset_journal()client methods.Changed
engines.nodelowered to>=20.15.0. The runtime supports Node 20 (the published CLI runs on Node 20/22/24); the previous>=24.0.0floor reflected an OIDC publish-time requirement, which is a CI concern handled by the publish workflow, not a runtime constraint for consumers.Deprecated
POST /__aimock/reset— now a deprecated alias for/__aimock/reset/fixtures; it still performs a full reset but emits aDeprecationresponse header and adeprecatedfield in the body. Use the explicit/reset/fixturesor/reset/journalroutes instead.Fixed
POST /v1/videos(videos.create) now parsesmultipart/form-databodies. The OpenAI SDK (>=6.28.0) sends video-create requests as multipart instead of JSON (even for File-less bodies), which previously returned a400 invalid_json. The handler reuses the existing transcription multipart field parser and preserves the JSON path for older SDKs.aimock-pytest: per-fixture options passed viaadd_fixture/on_message/etc. (latency,chunkSize,sequenceIndex,chaos, …) are now forwarded in the correct wire shape. They were previously nested under anoptskey the server ignored, so they were silently dropped.aimock-pytest:_wait_for_readynow honors its startup timeout (a background reader thread drains the child's stdout, so a no-output child can no longer hang past the deadline or deadlock on a full pipe buffer), tears down the subprocess on a startup failure, and surfaces the child's captured output (the health-check failure path also reports accurate elapsed time).DELETE /v1/_requestsnow clears only the request-journal entries, preserving fixture match-counts (so sequenced fixtures are not rewound) — consistent withPOST /__aimock/reset/journal.v1.28.0Compare Source
Added
<|channel|>… <|message|>… <|call|>) emitted by local gpt-oss models (Ollama / vLLM / OpenRouter) so their tool calls, reasoning, and content are captured when recording (hosted OpenAI pre-parses harmony, so only local runtimes pass it through raw). Implemented as a lexer + state-machine parser with a uniform all-or-nothing verbatim fail-safe, wired as fallback-only so it never produces phantom tool calls.Fixed
webSearchesand audio-companion fields (tool calls / content / reasoning) into recorded fixtures; logfirstDroppedSamplealongside dropped-chunk warnings.v1.27.3Compare Source
Fixed
/v1/images/editto/v1/images/edits(closes #221)/api/embedroute as alias for/api/embeddings;/api/embedis the current documented endpoint (ollama/ollama docs/api.md) used by modern Ollama SDKs, while/api/embeddingsis retained for backwards-compatibility. Both routes dispatch to the same handler.v1.27.2Compare Source
Fixed
d6/<integration>/<feature>.json.Changed
gitbinary to production stage for sparse-checkout fixture fetching at boot.v1.27.1Compare Source
Fixed
elevenlabs-ttsandtranslationto endpoint compatibility filter.??→||), derivedEndpointTypefromFixtureMatchinstead of duplicate union, negative guards on Gemini Interactions outputs detection, scopedturnIndex/hasToolResultto chat endpoints only.realtimeItemsToMessages. Added try-catch with debug logging aroundsendEventfor WebSocket close race safety.call_gemini_${name}_${i}tool call IDs with randomgenerateToolCallId()to prevent cross-turn collisions. Pre-computedresolvedToolCallsfor wire/history ID consistency. Added unrecognized-role warning and ws.send try-catch with debug logging.interactionsUsagehonors Gemini-native field names (promptTokenCount/candidatesTokenCount/totalTokenCount).truncateAfterChunksonly countscontent.deltaevents. AddedwebSearcheswarning on tool-call branch.flattenHeaders(req.headers)instead of{}.handleSyncRunacceptsRawJSONResponsefixtures from queue-walk recordings.resolveUsagewith Gemini-native token fields. Preserved error cause inresolveResponsefactory rethrow.buildEmbeddingResponseaccepts optional usage.extractFormFieldescapes regex metacharacters.redactUrlto coverapi_key/apikey/token/access_tokenpatterns, URL threaded into error messages with redaction,parseDataOnlySSE[DONE] filter fix,parseTypedSSEmulti-line data handling with null guards./.*/catch-all regex fallback whenmatch.messageis absent; fixtures without a message pattern no longer shadow other fixtures.input.messagesis an array after JSON parse; returns 400 instead of confusing downstream 404.writeAGUIEventStreamuses logger abstraction instead ofconsole.warn; handles non-Error throws.parseDataOnlySSEhandles multi-line data blocks, aligned withproviders.tsimplementation.v1.27.0Compare Source
Added
toolCallIdmatching for continuation fixtures. NewtoolCallIdfield onAGUIFixtureMatchandAGUIConfigFixture.getLastMessageIfToolResulthelper andonToolResultfluent API. Recorder uses tool-result-first priority for continuation fixtures. (#233, closes #232)Fixed
extractLastUserMessage— handle multimodal user content (AGUIMessageContentPart[]) by joining text parts and skipping non-text. ExportNO_USER_MESSAGE_SENTINELconstant andAGUIMessageContentParttype. (#231)settledflag to prevent error+end race, skip disk write for predicate fixtures (sentinel was semantically broken on reload), include parse error reason in SSE warning logv1.26.1Compare Source
Added
X-AIMock-Contextheader scopes fixtures per integration. Fixtures withmatch.contextonly match requests carrying that context; fixtures withoutcontextremain shared. Recorder auto-captures context and routes recorded fixtures into context subdirectories.v1.26.0Compare Source
Added
arrival timestamps as
recordedTimingson fixtures. Replay uses recordedtimings for approximate timing reproduction based on recorded TTFT and
inter-frame cadence instead of the synthetic model. Replay chunk count may
differ from recording chunk count — TTFT and average pace are preserved,
not per-token fidelity.
--replay-speed Nmultiplier applies to all delaysources (recorded timings, streaming profiles, global latency). Per-fixture
replaySpeedoverride. Covers SSE, NDJSON, Bedrock EventStream, andWebSocket protocols.
v1.25.0Compare Source
Added
embedContentendpoint —POST /v1beta/models/{model}:embedContentwith deterministic fallback embeddings and fixture matching
/v1/images/editand/v1/images/variationsendpoints — multipartform-data, same response format as generations. Closes #221
/v1/audio/translationsendpoint — reuses transcription handler withendpoint: "translation"andtask: "translate"in verbose mode/api/embeddingsendpoint — single-embedding response, supportsboth
promptandinput(string or array) fields/v2/embedendpoint — multi-text embedding with configurableembedding_types(float, int8, etc.)/v1/text-to-speech/{voice_id}endpoint — binary audioresponse with voice routing and
onElevenLabsTTShelperstream_options.include_usageis set,emits a final SSE chunk with token usage before
[DONE]usageoverrides now return estimated token counts (~4 chars/token)instead of zeros
Retry-After,x-ratelimit-limit-*,x-ratelimit-remaining-*,x-ratelimit-reset-*headers on all error fixtures with status 429.Custom
retryAfteroverride via fixture fieldonTranslationconvenience method — register translation fixtureswith endpoint discrimination
onElevenLabsTTSconvenience method — register ElevenLabs TTSfixtures
RecordConfignow acceptsupstreamTimeoutMs(default 30s) andbodyTimeoutMs(default 30s). The body-idle timeout is the Node socket inactivity timer that firesreq.destroy()mid-stream; under concurrent load against reasoning models (e.g. Grok 4.3 + structured output), token-emission gaps can routinely exceed 30s during the thinking phase, causing record-mode runs to truncate SSE responses mid-stream with no[DONE]and nofinish_reason. Lift to e.g.bodyTimeoutMs: 180_000to record cleanly under that workload.v1.24.1Compare Source
Fixed
tool_call.id—parseToolCallPartemitted{ functionCall: { name, args } }and omitted the id even when the fixture pinned one. Pairs with v1.23.1's INGEST-direction fix (#196) which preservesfunctionCall.idwhen aimock parses an incoming Gemini request — that fix only helps when the id is already in the response body. Without this EGRESS-direction fix, aimock never emits one for clients to preserve in the first place, so the round-trip silently breaks for any client that depends onfunctionCall.idto correlate follow-upfunctionResponseparts back to the originating callv1.24.0Compare Source
Added
onFalImage(pattern, ImageResponse)— typed helper that wraps ImageResponse into fal's image envelopeonFalVideo(pattern, VideoResponse)— typed helper that wraps VideoResponse into fal's video envelopeMockServerOptions.falQueue— opt into realisticIN_QUEUE → IN_PROGRESS → COMPLETEDpolling progression with configurable thresholdslogs[](state-transition entries) andmetrics.inference_time(once COMPLETED)200 { status: "CANCELLED" }; cancel-after returns400 { status: "ALREADY_COMPLETED" }202with current status bodyRecordConfig.fal.pollIntervalMs/fal.timeoutMsfor tuning upstream queue-walk recording cadence400 invalid_json(consistent with all other handlers)Fixed
pollsBeforeCompletedauto-defaults topollsBeforeInProgress + 1when only the in-progress threshold is setChanged
persistFixtureandbuildFixtureMatchextracted from recorder internals and exported for reusev1.23.1Compare Source
Fixed
call_gemini_*) instead of preserving the original IDs fromfunctionCall.id. This broketoolCallId-based fixture matching on follow-up turns: the follow-up fixture couldn't match because the ID was overwritten, so the request fell through touserMessagefixtures which returned another tool call — creating an infinite loop for all Gemini/ADK showcase integrations. LangGraph-python (OpenAI format) was unaffected because it preserves IDs natively. (#196)v1.23.0Compare Source
Added
claude-opus-4-20250514→claude-opus-4) so fixtures survive version bumps. Disable withrecordFullModelVersion: true. (#185)systemHashandtoolsHashin ametadatablock for detecting system prompt or tool definition changes since recording.startsWithfor string model matching, somodel: "claude-opus-4"matches anyclaude-opus-4-*version.sendEvent()wrapper translates back for Beta clients detected viaOpenAI-Betaheader. Default model changed togpt-realtime-2.gpt-realtime,gpt-realtime-2,gpt-realtime-1.5,gpt-realtime-mini(and dated snapshots). Transcription/translation sessions usegpt-4o-transcribe,gpt-4o-mini-transcribe, orwhisper-1.conversation.item.doneandresponse.cancelevents — new GA Realtime event types for item completion tracking and response cancellation.Tests
v1.22.1Compare Source
Fixed
--proxy-onlymode, theX-AIMock-Strictheader had no effect becauseproxyAndRecord()returned before the strict check. Now all 17 handlers check strict mode first: when strict + no fixture → 503 immediately, no proxy attemptTests
--helpoutput coveragev1.22.0Compare Source
Added
X-AIMock-Strictheader — overrides the server-wide--strictflag per request (true/1= strict,false/0= lenient). When strict: fixture miss returns 503; when lenient: fixture miss proxies to real provider. Follows theX-AIMock-Chaos-*precedence pattern. Journal entries recordstrictOverridewhen the header overrides the server default. Enables the same aimock instance to serve both deterministic test probes and live demo traffic simultaneously.Fixed
compareSSESequencesnow compares ALL events per type, not just the first, catching previously invisible divergenceswritableFinishedbefore destroying upstream requestonHookBypassedandbeforeWriteResponsecallbacks not wrapped in try/catchtoolCallname/arguments silently dropped during fixture save{id, status}shapereadBodyconsumption)Added
Changed
v1.21.0Compare Source
Added
match.systemMessageacceptsstring[]— array form requires ALL substrings to be present in the joined system-message text (AND semantics). Use this when the gate must combine multiple non-adjacent tokens that may appear in any order — e.g., a host that serialises agent-context entries into a system message whose entry order is not stable, but where a fixture should only match when every default value is present (["\"value\": \"Atai\"", "[\"Viewed the pricing page\",\"Watched the product demo video\"]"]). Single-string andRegExpforms continue to work unchanged. JSON form acceptsstring | string[]; programmatic form acceptsstring | string[] | RegExp.v1.20.0Compare Source
Fixed
shouldFailguard silently skipped allexpectcalls when no critical diffs were found, so broken extraction logic or warning-level drift went completely undetected. Replaced every guarded assertion across all 21 drift test files (89 instances) with unconditionalexpect(diffs.filter(...)).toEqual([])recorder.tsandagui-recorder.tsforwarded raw upstream codes (429, 503, 401, 201, etc.) to aimock clients, exposing provider implementation details. Normalized to 200 for success and 502 for errors; fixture recording preserves the original status for fidelityAdded
match.systemMessagefixture matcher — gate a fixture on a substring (or regexp) found inside the concatenated text of everysystemrole message in the request. Hosts that plumb dynamic context (persona, agent-context entries, dynamic config) through system messages can now narrow a fixture to a specific context state; when the caller changes that state the fixture stops matching and the request falls through to the next fixture or upstream proxy instead of silently returning a stale baked response. JSON form:"match": { "userMessage": "Who am I?", "systemMessage": "name=Atai" }. Programmatic form acceptsstring | RegExp.v1.19.5Compare Source
Fixed
max_output_tokensandresponse_formatfrom Responses requests to the underlying Chat Completions callmaxOutputTokens,topP,topKfromgenerationConfig; remove syntheticfunctionCall.idthat real Gemini does not producetemperature,max_tokens, andstop_sequencesnow forwardedtool_callson assistant messages, base64imageson user messages,systemparameter on/api/generateparamfield per OpenAI error speccategoriesandcategory_scoresto match the real OpenAI moderation object (boolean flags + float scores)task,duration,segments,wordsfields forverbose_jsonformatstatusfield to search results{ results: [...] }withrelevance_scoreper resultprevious_item_idto conversation items, correct event ID prefixes, add missing fields on session and response eventsgenerationConfigalias forgeneration_config,turnCompleteserver event, correct gRPC status codes in error events, completehttpToGrpcmappersignaturefield tothinkingcontent blocks andsignature_deltaevent type for extended thinking with signaturesAdded
reasoning_effort, OpenAI Responsesreasoning, Anthropicthinkingcontent blocks, Geminithinking_configv1.19.4Compare Source
Fixed
typefield in contentBlockDelta and contentBlockStart —deltaobjects contained a Claude Messages APItypefield (text_delta,thinking_delta) that is not a member of the Converse API's tagged union. botocore's single-member union parser rejected the extra field withResponseParserError. Also fixed reasoning deltas to usereasoningContent(Converse format) instead ofthinking(Claude format). (Issue #165, reported by @KMiya84377)inferenceConfig.maxTokenssilently dropped —converseToCompletionRequestnow forwardsmaxTokenstomax_tokensmetrics— Addedmetrics: { latencyMs: 0 }to all 3 non-streaming converse response builders, matching the streaming path and AWS ConverseResponse specAdded
toolUsestart/delta) and reasoning (reasoningContentstart/delta) variants. Three-way triangulate comparisons for all variants.v1.19.3Compare Source
Fixed
--recordmode wrote onlyuserMessageto the saved fixture'smatchblock, so two LLM calls in the same agent run that share the user message (the canonical tool-call → tool-result → follow-up shape) collided in the in-memory fixture cache: as soon as turn 0 was recorded, turn 1 matched it on the sameuserMessagesubstring, the recorder was skipped, and the follow-up text turn was silently lost. Replaying the resulting single fixture against the same run looped on the tool call until the framework's recursion limit fired. Recorder now also writesturnIndex(count ofassistantmessages) andhasToolResult(anyrole:"tool"present) — the matcher in 1.16.0 already accepts both — so each call in a run produces a distinct, deterministic match key. Existing single-userMessagefixtures continue to match unchanged. Surfaced as: CopilotKit's beautiful-chat showcase having to hot-patchdist/recorder.jsinside its running aimock container to make--recordproduce usable multi-turn recordings.v1.19.2Compare Source
Fixed
buildBedrockStreamTextEvents,buildBedrockStreamToolCallEvents, andbuildBedrockStreamContentWithToolCallsEventsemitted payloads wrapped with the event type name (e.g.{ messageStart: { role: "assistant" } }). The:event-typeheader already carries the event name, so AWS SDK (botocore) expected flat payloads (e.g.{ role: "assistant" }). The redundant wrapping caused botocore'sBaseEventStreamParserto silently return empty dicts, producingKeyError: 'role'in downstream frameworks like Strands Agents. (Issue #162, reported by @KMiya84377)item_idtoresponse.output_text.done,response.content_part.added, andresponse.content_part.doneevents, matching the real OpenAI Responses API shape. SDK drift shapes updated.logprobs: nullto all streaming chunks and non-streaming choices. Removedlogprobsfrom drift allowlist so future omissions are caught.created_atto all 6/api/chatbuilder functions (text, tool call, content+tools, and their streaming variants). The/api/generatepath already had it.RESOURCE_EXHAUSTED,INTERNAL) instead ofrate_limit_error/ERROR.v1.19.1Compare Source
Fixed
loadFixturesFromDirnow recurses one level into subdirectories to load<testId>/<provider>.jsonfiles written by the snapshot recorder. Previously the loader skipped all subdirectories with a warning, so recorded fixtures could never be replayed. (Issue #161, reported by @jantimon)aimockbin name (not justaimock-cli.js), fixing silent exit when invoked vianpx aimockorbunx aimock. (Issue #160)v1.19.0Compare Source
Added
on(),onMessage(),onTurn(),onToolCall(),onToolResult()). (Feature request by @5ebastianMeier, issue #154)X-Test-Idis present, recorded fixtures are saved to<fixturePath>/<slugified-testId>/<provider>.jsoninstead of timestamp-based filenames. Multiple fixtures for the same test+provider merge into one file. Stable paths enable meaningful PR diffs and easy test-to-fixture mapping. (Feature request by @jantimon, issue #155)Fixed
Allow-Headers— ChangedAccess-Control-Allow-HeadersfromContent-Type, Authorizationto wildcard*, fixing Firefox's strict CORS enforcement when the OpenAI SDK sendsUser-Agentin the preflight. (Issue #158)action.ymlfixtures branch referenced the legacyllmockbinary (still functional); updated toaimockfor consistencysteps.<id>.outputs.urlinstead of hardcodedhttp://127.0.0.1:4010v1.18.0Compare Source
Added
aimock_chaos_bypassed_totalmetric. Explicitsourcelabel (fixture/proxy/internal) on all chaos Prometheus counters and journal entries.src/fal.ts) supporting arbitrary JSON request/response payloads (image, video, motion, music, etc.) alongside the existing audio-onlyfal-audio.ts. Routes byx-fal-target-hostheader. Queue lifecycle (submit→status→result→cancel), sync run, storage upload stub.RawJSONResponsetype for verbatim JSON fixture preservation. Convenience methodsonFalQueue()andonFalRun(). Record and replay support. (PR #153, tombeckenham)Fixed
validateFixtures()now recognizesRawJSONResponse, fixing the record→restart→replay cycle for fal.ai fixtures loaded from diskv1.17.0Compare Source
Added
/v1beta/models/{model}:streamGenerateContent), including multi-turn conversations, function calling, streaming text, and safety metadata. Drift tests, integration tests, and documentation included. (PR #139)AGUIInterrupt,AGUIResumeEntry, andAGUIRunFinishedOutcome(discriminated union: success | interrupt) from ag-ui PR #1569.outcomefield onAGUIRunFinishedEvent,resumefield onAGUIRunAgentInput.buildActivityDelta,buildToolCallChunk,buildRawEvent,buildCustomEvent,buildReasoningChunk,buildReasoningEncryptedValue../aguisubpath export —agui-stub.tswired intotsdown.config.tsandpackage.jsonexports, matching./a2a,./mcp,./vectorpattern.AGUIBuildOpts,matchesAGUIFixture,AGUIReasoningEncryptedValueSubtype,AGUIMessageRolenow exported from package root."warn"log level — New log level between"silent"and"info"with proper hierarchy.AGUIMockOptions.logLeveloption added; AG-UI mock defaults to"warn"instead of"silent"./v1/sound-generation) and music (/v1/music/*), fal.ai queue-based audio (/fal/queue/submit/*,/fal/queue/requests/*,/fal/run/*), Gemini HTTP audio viagenerateContent/streamGenerateContentwithinlineDataaudio parts, and Gemini Live WebSocket audio. Convenience methods:onAudio(),onSoundEffect(),onMusic(),onFalAudio(). (PR #140, closes #118)audiofield now supports bothstring(base64) and{ b64Json, contentType }object formaudio-genandfal-audioendpoint typesFixed
AGUIMessage.idandAGUIRunAgentInput.threadId/runIdnow required (was optional).AGUIToolDefinition.descriptionnow required,metadatafield added.encryptedValueanderrorfields added toAGUIMessage.AGUIMessageRoleunion covers all 7 protocol roles.writeAGUIEventStreamlogs all caught errors (was silently swallowing non-TypeError/RangeError), preserves user-supplied timestamps (was always overwriting withDate.now()).buildCompositeResponseomitsRUN_FINISHEDwhen inner events containRUN_ERROR(protocol compliance).matchesFixtureresetslastIndexon regex beforetest().data:lines without space after colon per SSE spec. Serialize predicate-match fixtures as__NO_USER_MESSAGE__sentinel on disk instead of producing catch-all{}. Return actual HTTP status from proxy (was always boolean/200). Forward upstream content-type on non-2xx responses instead of SSE headers.readBodywrapped in try/catch (was unguarded await producing opaque 500s). JSON parse errors now include detail in 400 response. Proxy status correctly journaleConfiguration
📅 Schedule: (in timezone America/Los_Angeles)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.