@@ -7,6 +7,11 @@ import { describe, expect, test } from "bun:test";
77import { readFileSync } from "node:fs" ;
88import { join } from "node:path" ;
99import { createCodexResponsesAdapter } from "./codex-responses.js" ;
10+ import { createOpenAIResponsesAdapter } from "./openai-responses.js" ;
11+ import { createGrokResponsesAdapter } from "./grok-responses.js" ;
12+ import { createInferenceDependencies } from "./inference-dependencies.js" ;
13+ import { META_PROVIDER } from "@corbits/meta-provider" ;
14+ import type { ProviderAdapter } from "@intx/inference" ;
1015import type { InferenceEvent , LastCycleSource } from "@intx/types/runtime" ;
1116import { defined } from "../../testkit/defined.js" ;
1217import { ProtocolMismatchError } from "@intx/inference" ;
@@ -29,15 +34,21 @@ function loadFixture(name: string): object[] {
2934}
3035
3136/** Parse a full fixture stream with one adapter instance (shared indexer). */
32- function parseFixture ( name : string ) : InferenceEvent [ ] {
33- const adapter = createCodexResponsesAdapter ( SOURCE ) ;
37+ function parseFixtureWithAdapter (
38+ adapter : ProviderAdapter ,
39+ name : string ,
40+ ) : InferenceEvent [ ] {
3441 const out : InferenceEvent [ ] = [ ] ;
3542 for ( const event of loadFixture ( name ) ) {
3643 out . push ( ...adapter . parseResponse ( JSON . stringify ( event ) ) ) ;
3744 }
3845 return out ;
3946}
4047
48+ function parseFixture ( name : string ) : InferenceEvent [ ] {
49+ return parseFixtureWithAdapter ( createCodexResponsesAdapter ( SOURCE ) , name ) ;
50+ }
51+
4152/** Parse until the first throw; return events emitted before the failure. */
4253function parseUntilError ( name : string ) : {
4354 events : InferenceEvent [ ] ;
@@ -212,24 +223,58 @@ describe("codex-sse fixtures (golden parse)", () => {
212223 expect ( String ( error ) ) . toMatch ( / f i x t u r e s t r e a m e r r o r \( s a n i t i z e d \) / ) ;
213224 } ) ;
214225
215- test ( "parallel calls whose arguments arrive only on done still carry their arguments" , ( ) => {
216- const out = parseFixture ( "parallel-tools-arguments-on-done.json" ) ;
226+ test ( "parallel calls whose arguments arrive only on done still carry their arguments across all Responses adapters" , async ( ) => {
227+ const deps = await createInferenceDependencies ( ) ;
228+ const adapters : [ string , ProviderAdapter ] [ ] = [
229+ [ "codex-responses" , createCodexResponsesAdapter ( SOURCE ) ] ,
230+ [
231+ "openai-responses" ,
232+ createOpenAIResponsesAdapter ( {
233+ sourceId : "go/fixture" ,
234+ provider : "openai-responses" ,
235+ model : "gpt-fixture" ,
236+ } ) ,
237+ ] ,
238+ [
239+ "grok-responses" ,
240+ createGrokResponsesAdapter ( {
241+ sourceId : "xai/fixture" ,
242+ provider : "grok-responses" ,
243+ model : "grok-fixture" ,
244+ } ) ,
245+ ] ,
246+ [
247+ "meta-responses" ,
248+ deps . adapters . resolve ( {
249+ sourceId : "meta/fixture" ,
250+ provider : META_PROVIDER ,
251+ model : "llama-fixture" ,
252+ } ) ,
253+ ] ,
254+ ] ;
217255
218- expect ( eventTypes ( out ) ) . toEqual ( [
219- "inference.tool_call.start" ,
220- "inference.tool_call.delta" ,
221- "inference.tool_call.start" ,
222- "inference.tool_call.delta" ,
223- "inference.usage" ,
224- ] ) ;
225- expect ( out [ 1 ] ) . toMatchObject ( {
226- type : "inference.tool_call.delta" ,
227- data : { callId : "0" , argumentFragment : '{"path":"a.txt"}' , index : 0 } ,
228- } ) ;
229- expect ( out [ 3 ] ) . toMatchObject ( {
230- type : "inference.tool_call.delta" ,
231- data : { callId : "1" , argumentFragment : '{"path":"b.txt"}' , index : 1 } ,
232- } ) ;
256+ for ( const [ label , adapter ] of adapters ) {
257+ const out = parseFixtureWithAdapter (
258+ adapter ,
259+ "parallel-tools-arguments-on-done.json" ,
260+ ) ;
261+
262+ expect ( eventTypes ( out ) , label ) . toEqual ( [
263+ "inference.tool_call.start" ,
264+ "inference.tool_call.delta" ,
265+ "inference.tool_call.start" ,
266+ "inference.tool_call.delta" ,
267+ "inference.usage" ,
268+ ] ) ;
269+ expect ( out [ 1 ] , label ) . toMatchObject ( {
270+ type : "inference.tool_call.delta" ,
271+ data : { callId : "0" , argumentFragment : '{"path":"a.txt"}' , index : 0 } ,
272+ } ) ;
273+ expect ( out [ 3 ] , label ) . toMatchObject ( {
274+ type : "inference.tool_call.delta" ,
275+ data : { callId : "1" , argumentFragment : '{"path":"b.txt"}' , index : 1 } ,
276+ } ) ;
277+ }
233278 } ) ;
234279
235280 test ( "lifecycle envelopes alone produce no InferenceEvents" , ( ) => {
0 commit comments