@@ -123,6 +123,13 @@ <h2>Match Fields</h2>
123123 < td > number</ td >
124124 < td > Match on the Nth occurrence of this pattern</ td >
125125 </ tr >
126+ < tr >
127+ < td > endpoint</ td >
128+ < td > string</ td >
129+ < td >
130+ Restrict to endpoint type: chat, image, speech, transcription, video, embedding
131+ </ td >
132+ </ tr >
126133 < tr >
127134 < td > predicate</ td >
128135 < td > function</ td >
@@ -152,6 +159,11 @@ <h2>Response Types</h2>
152159 < td > toolCalls[], finishReason?</ td >
153160 < td > Function call(s) with name + arguments</ td >
154161 </ tr >
162+ < tr >
163+ < td > Content + Tool Calls</ td >
164+ < td > content, toolCalls[], reasoning?, finishReason?</ td >
165+ < td > Text and tool calls in a single response</ td >
166+ </ tr >
155167 < tr >
156168 < td > Error</ td >
157169 < td > error.message, error.type?, status?</ td >
@@ -179,12 +191,99 @@ <h2>Response Types</h2>
179191 </ tr >
180192 < tr >
181193 < td > Video</ td >
182- < td > video.url , video.duration ?</ td >
194+ < td > video.id , video.status, video.url ?</ td >
183195 < td > Generated video URL with async polling</ td >
184196 </ tr >
185197 </ tbody >
186198 </ table >
187199
200+ < div class ="info-box ">
201+ < p >
202+ < strong > Override fields:</ strong > Text, Tool Call, and Content + Tool Calls responses
203+ also accept the override fields listed below (< code > id</ code > , < code > model</ code > ,
204+ < code > usage</ code > , < code > finishReason</ code > , < code > role</ code > ,
205+ < code > systemFingerprint</ code > , < code > created</ code > ).
206+ </ p >
207+ </ div >
208+
209+ < div class ="info-box ">
210+ < p >
211+ < strong > JSON auto-stringify:</ strong > In fixture files and programmatic API,
212+ < code > arguments</ code > and < code > content</ code > fields accept both objects and strings.
213+ Objects are automatically stringified via < code > JSON.stringify()</ code > . Use the object
214+ form for readability — no more escaped JSON strings.
215+ </ p >
216+ </ div >
217+
218+ < h2 > Response Override Fields</ h2 >
219+ < p >
220+ Fixture responses can include optional fields to override auto-generated envelope values.
221+ These map correctly across all provider formats (OpenAI, Claude, Gemini, Responses API).
222+ </ p >
223+ < table class ="endpoint-table ">
224+ < thead >
225+ < tr >
226+ < th > Field</ th >
227+ < th > Type</ th >
228+ < th > Description</ th >
229+ </ tr >
230+ </ thead >
231+ < tbody >
232+ < tr >
233+ < td > id</ td >
234+ < td > string</ td >
235+ < td > Override auto-generated response ID</ td >
236+ </ tr >
237+ < tr >
238+ < td > created</ td >
239+ < td > number</ td >
240+ < td > Override Unix timestamp</ td >
241+ </ tr >
242+ < tr >
243+ < td > model</ td >
244+ < td > string</ td >
245+ < td > Override model name in response</ td >
246+ </ tr >
247+ < tr >
248+ < td > usage</ td >
249+ < td > object</ td >
250+ < td >
251+ Override token counts:
252+ < code > { prompt_tokens, completion_tokens, total_tokens }</ code > . Also accepts
253+ Anthropic field names (< code > input_tokens</ code > , < code > output_tokens</ code > ) and
254+ Gemini field names (< code > promptTokenCount</ code > ,
255+ < code > candidatesTokenCount</ code > , < code > totalTokenCount</ code > ). OpenAI Chat
256+ Completions includes usage in the response body; the Responses API uses a separate
257+ < code > response.usage</ code > object. When omitted, token counts are auto-computed
258+ from content length
259+ </ td >
260+ </ tr >
261+ < tr >
262+ < td > finishReason</ td >
263+ < td > string</ td >
264+ < td >
265+ Override finish reason (default: "stop" or "tool_calls"). Provider mappings:
266+ < code > stop</ code > → < code > end_turn</ code > (Claude), < code > STOP</ code > (Gemini);
267+ < code > tool_calls</ code > → < code > tool_use</ code > (Claude),
268+ < code > FUNCTION_CALL</ code > (Gemini); < code > length</ code > →
269+ < code > max_tokens</ code > (Claude), < code > MAX_TOKENS</ code > (Gemini);
270+ < code > content_filter</ code > → < code > SAFETY</ code > (Gemini),
271+ < code > failed</ code > (Responses API)
272+ </ td >
273+ </ tr >
274+ < tr >
275+ < td > role</ td >
276+ < td > string</ td >
277+ < td > Override message role (default: "assistant")</ td >
278+ </ tr >
279+ < tr >
280+ < td > systemFingerprint</ td >
281+ < td > string</ td >
282+ < td > Add system_fingerprint to response</ td >
283+ </ tr >
284+ </ tbody >
285+ </ table >
286+
188287 < h2 > Fixture Options</ h2 >
189288
190289 < table class ="endpoint-table ">
@@ -199,7 +298,7 @@ <h2>Fixture Options</h2>
199298 < tr >
200299 < td > latency</ td >
201300 < td > number</ td >
202- < td > Milliseconds delay before first chunk </ td >
301+ < td > Milliseconds delay between SSE chunks (streaming) </ td >
203302 </ tr >
204303 < tr >
205304 < td > chunkSize</ td >
@@ -220,15 +319,16 @@ <h2>Fixture Options</h2>
220319 < td > streamingProfile</ td >
221320 < td > object</ td >
222321 < td >
223- Streaming physics profile: < code > { ttftMs , tps, jitter }</ code > . See
322+ Streaming physics profile: < code > { ttft , tps, jitter }</ code > . See
224323 < a href ="/streaming-physics "> Streaming Physics</ a >
225324 </ td >
226325 </ tr >
227326 < tr >
228327 < td > chaos</ td >
229328 < td > object</ td >
230329 < td >
231- Per-fixture chaos config: < code > { errorRate, latencyMs, ... }</ code > . See
330+ Per-fixture chaos config: < code > { dropRate, malformedRate, disconnectRate }</ code > .
331+ See
232332 < a href ="/chaos-testing "> Chaos Testing</ a >
233333 </ td >
234334 </ tr >
@@ -261,8 +361,8 @@ <h3>Programmatically</h3>
261361< span class ="op "> mock</ span > .< span class ="fn "> onEmbedding</ span > (< span class ="str "> "my text"</ span > , { < span class ="prop "> embedding</ span > : [< span class ="num "> 0.1</ span > , < span class ="num "> 0.2</ span > ] });
262362< span class ="op "> mock</ span > .< span class ="fn "> onImage</ span > (< span class ="str "> "sunset"</ span > , { < span class ="prop "> image</ span > : { < span class ="prop "> url</ span > : < span class ="str "> "https://example.com/sunset.png"</ span > } });
263363< span class ="op "> mock</ span > .< span class ="fn "> onSpeech</ span > (< span class ="str "> "hello"</ span > , { < span class ="prop "> audio</ span > : < span class ="str "> "SGVsbG8="</ span > });
264- < span class ="op "> mock</ span > .< span class ="fn "> onTranscription</ span > (< span class =" str " > "audio.mp3" </ span > , { < span class ="prop "> transcription</ span > : { < span class ="prop "> text</ span > : < span class ="str "> "Hello"</ span > } });
265- < span class ="op "> mock</ span > .< span class ="fn "> onVideo</ span > (< span class ="str "> "cats"</ span > , { < span class ="prop "> video</ span > : { < span class ="prop "> url</ span > : < span class ="str "> "https://example.com/cats.mp4"</ span > } });
364+ < span class ="op "> mock</ span > .< span class ="fn "> onTranscription</ span > ({ < span class ="prop "> transcription</ span > : { < span class ="prop "> text</ span > : < span class ="str "> "Hello"</ span > } });
365+ < span class ="op "> mock</ span > .< span class ="fn "> onVideo</ span > (< span class ="str "> "cats"</ span > , { < span class ="prop "> video</ span > : { < span class ="prop "> id </ span > : < span class =" str " > "vid-1" </ span > , < span class =" prop " > status </ span > : < span class =" str " > "completed" </ span > , < span class =" prop " > url</ span > : < span class ="str "> "https://example.com/cats.mp4"</ span > } });
266366< span class ="op "> mock</ span > .< span class ="fn "> onJsonOutput</ span > (< span class ="str "> "data"</ span > , { < span class ="prop "> key</ span > : < span class ="str "> "value"</ span > });
267367< span class ="op "> mock</ span > .< span class ="fn "> onToolResult</ span > (< span class ="str "> "call_123"</ span > , { < span class ="prop "> content</ span > : < span class ="str "> "Done"</ span > });
268368
@@ -305,6 +405,102 @@ <h2>Routing Rules</h2>
305405 programmatic registration for predicate-based routing.
306406 </ p >
307407 </ div >
408+
409+ < h2 > Provider Support Matrix</ h2 >
410+ < table class ="endpoint-table ">
411+ < thead >
412+ < tr >
413+ < th > Feature</ th >
414+ < th > OpenAI Chat</ th >
415+ < th > OpenAI Responses</ th >
416+ < th > Claude</ th >
417+ < th > Gemini</ th >
418+ < th > Bedrock</ th >
419+ < th > Azure</ th >
420+ < th > Ollama</ th >
421+ < th > Cohere</ th >
422+ </ tr >
423+ </ thead >
424+ < tbody >
425+ < tr >
426+ < td > Text</ td >
427+ < td > Yes</ td >
428+ < td > Yes</ td >
429+ < td > Yes</ td >
430+ < td > Yes</ td >
431+ < td > Yes</ td >
432+ < td > Yes</ td >
433+ < td > Yes</ td >
434+ < td > Yes</ td >
435+ </ tr >
436+ < tr >
437+ < td > Tool Calls</ td >
438+ < td > Yes</ td >
439+ < td > Yes</ td >
440+ < td > Yes</ td >
441+ < td > Yes</ td >
442+ < td > Yes</ td >
443+ < td > Yes</ td >
444+ < td > Yes</ td >
445+ < td > Yes</ td >
446+ </ tr >
447+ < tr >
448+ < td > Content + Tool Calls</ td >
449+ < td > Yes</ td >
450+ < td > Yes</ td >
451+ < td > Yes</ td >
452+ < td > Yes</ td >
453+ < td > Yes</ td >
454+ < td > Yes</ td >
455+ < td > Yes</ td >
456+ < td > Yes</ td >
457+ </ tr >
458+ < tr >
459+ < td > Streaming</ td >
460+ < td > SSE</ td >
461+ < td > SSE</ td >
462+ < td > SSE</ td >
463+ < td > SSE</ td >
464+ < td > Binary EventStream</ td >
465+ < td > SSE</ td >
466+ < td > NDJSON</ td >
467+ < td > SSE</ td >
468+ </ tr >
469+ < tr >
470+ < td > Reasoning</ td >
471+ < td > Yes</ td >
472+ < td > Yes</ td >
473+ < td > Yes</ td >
474+ < td > Yes</ td >
475+ < td > Yes</ td >
476+ < td > Yes</ td >
477+ < td > —</ td >
478+ < td > —</ td >
479+ </ tr >
480+ < tr >
481+ < td > Web Searches</ td >
482+ < td > —</ td >
483+ < td > Yes</ td >
484+ < td > —</ td >
485+ < td > —</ td >
486+ < td > —</ td >
487+ < td > —</ td >
488+ < td > —</ td >
489+ < td > —</ td >
490+ </ tr >
491+ < tr >
492+ < td > Response Overrides</ td >
493+ < td > Yes</ td >
494+ < td > Yes</ td >
495+ < td > Yes</ td >
496+ < td > Yes</ td >
497+ < td > —</ td >
498+ < td > Yes</ td >
499+ < td > —</ td >
500+ < td > —</ td >
501+ </ tr >
502+ </ tbody >
503+ </ table >
308504 </ main >
309505 < aside class ="page-toc " id ="page-toc "> </ aside >
310506 </ div >
0 commit comments