Skip to content

Commit 12f2ad4

Browse files
authored
Merge branch 'main' into pr-upstream
2 parents 63e98d7 + 979b174 commit 12f2ad4

17 files changed

Lines changed: 1216 additions & 1128 deletions

src/api/providers/__tests__/base-openai-compatible-provider.spec.ts

Lines changed: 156 additions & 375 deletions
Large diffs are not rendered by default.

src/api/providers/__tests__/openai-codex-native-tool-calls.spec.ts

Lines changed: 83 additions & 108 deletions
Large diffs are not rendered by default.

src/api/providers/__tests__/openai-codex.spec.ts

Lines changed: 40 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,20 @@ import { Anthropic } from "@anthropic-ai/sdk"
1212
import { OPEN_AI_CODEX_SERVICE_TIER_KEY, OpenAiCodexServiceTier, SERVICE_TIER_KEY } from "@roo-code/types"
1313
import { OpenAiCodexHandler, transformLunaResponsesLiteBody } from "../openai-codex"
1414
import { openAiCodexOAuthManager } from "../../../integrations/openai-codex/oauth"
15+
import { asyncStreamFrom, collectStream } from "../../../test-utils/stream"
1516

1617
function createCompletedStream() {
17-
return {
18-
async *[Symbol.asyncIterator]() {
19-
yield {
20-
type: "response.completed",
21-
response: {
22-
id: "response-1",
23-
status: "completed",
24-
output: [],
25-
usage: { input_tokens: 1, output_tokens: 1 },
26-
},
27-
}
18+
return asyncStreamFrom([
19+
{
20+
type: "response.completed",
21+
response: {
22+
id: "response-1",
23+
status: "completed",
24+
output: [],
25+
usage: { input_tokens: 1, output_tokens: 1 },
26+
},
2827
},
29-
}
30-
}
31-
32-
async function drainStream(stream: AsyncIterable<unknown>) {
33-
for await (const _chunk of stream) {
34-
// Drain the response stream.
35-
}
28+
])
3629
}
3730

3831
describe("OpenAiCodexHandler.getModel", () => {
@@ -92,7 +85,7 @@ describe("OpenAiCodexHandler.createMessage", () => {
9285
const mockCreate = vitest.fn().mockResolvedValue(createCompletedStream())
9386
Reflect.set(handler, "client", { responses: { create: mockCreate } })
9487

95-
await drainStream(handler.createMessage("System prompt", []))
88+
await collectStream(handler.createMessage("System prompt", []))
9689

9790
const [body] = mockCreate.mock.calls[0]
9891
expect(body).toMatchObject({
@@ -117,7 +110,7 @@ describe("OpenAiCodexHandler.createMessage", () => {
117110
const mockCreate = vitest.fn().mockResolvedValue(createCompletedStream())
118111
Reflect.set(handler, "client", { responses: { create: mockCreate } })
119112

120-
await drainStream(handler.createMessage("System prompt", []))
113+
await collectStream(handler.createMessage("System prompt", []))
121114

122115
expect(mockCreate.mock.calls[0][0]).not.toHaveProperty(SERVICE_TIER_KEY)
123116
})
@@ -147,7 +140,7 @@ describe("OpenAiCodexHandler.createMessage", () => {
147140
})
148141
vitest.stubGlobal("fetch", mockFetch)
149142

150-
await drainStream(handler.createMessage("System prompt", []))
143+
await collectStream(handler.createMessage("System prompt", []))
151144

152145
expect(JSON.parse(mockFetch.mock.calls[0][1].body)).toMatchObject({
153146
stream: true,
@@ -166,19 +159,17 @@ describe("OpenAiCodexHandler.createMessage", () => {
166159
responses: {
167160
create: vitest.fn().mockImplementation(async (body: any) => {
168161
capturedInput.push(...(body.input ?? []))
169-
return {
170-
async *[Symbol.asyncIterator]() {
171-
yield {
172-
type: "response.completed",
173-
response: {
174-
id: "r1",
175-
status: "completed",
176-
output: [],
177-
usage: { input_tokens: 1, output_tokens: 1 },
178-
},
179-
}
162+
return asyncStreamFrom([
163+
{
164+
type: "response.completed",
165+
response: {
166+
id: "r1",
167+
status: "completed",
168+
output: [],
169+
usage: { input_tokens: 1, output_tokens: 1 },
170+
},
180171
},
181-
}
172+
])
182173
}),
183174
},
184175
}
@@ -193,10 +184,7 @@ describe("OpenAiCodexHandler.createMessage", () => {
193184
},
194185
]
195186

196-
const stream = handler.createMessage("system", messages)
197-
for await (const _ of stream) {
198-
// consume
199-
}
187+
await collectStream(handler.createMessage("system", messages))
200188

201189
// URL image is skipped; only the text input_text block should be present
202190
const userMsg = capturedInput.find((item: any) => item.role === "user")
@@ -215,19 +203,17 @@ describe("OpenAiCodexHandler.createMessage", () => {
215203
responses: {
216204
create: vitest.fn().mockImplementation(async (body: any) => {
217205
capturedInput.push(...(body.input ?? []))
218-
return {
219-
async *[Symbol.asyncIterator]() {
220-
yield {
221-
type: "response.completed",
222-
response: {
223-
id: "r1",
224-
status: "completed",
225-
output: [],
226-
usage: { input_tokens: 1, output_tokens: 1 },
227-
},
228-
}
206+
return asyncStreamFrom([
207+
{
208+
type: "response.completed",
209+
response: {
210+
id: "r1",
211+
status: "completed",
212+
output: [],
213+
usage: { input_tokens: 1, output_tokens: 1 },
214+
},
229215
},
230-
}
216+
])
231217
}),
232218
},
233219
}
@@ -242,10 +228,7 @@ describe("OpenAiCodexHandler.createMessage", () => {
242228
},
243229
]
244230

245-
const stream = handler.createMessage("system", messages)
246-
for await (const _ of stream) {
247-
// consume
248-
}
231+
await collectStream(handler.createMessage("system", messages))
249232

250233
const userMsg = capturedInput.find((item: any) => item.role === "user")
251234
expect(userMsg?.content).toContainEqual({
@@ -423,7 +406,7 @@ describe("OpenAiCodexHandler Luna Responses Lite requests", () => {
423406
const mockCreate = vitest.fn().mockResolvedValue(createCompletedStream())
424407
;(handler as any).client = { responses: { create: mockCreate } }
425408

426-
await drainStream(
409+
await collectStream(
427410
handler.createMessage("Luna instructions", [{ role: "user", content: "Hello" }], {
428411
taskId: "task-luna",
429412
tools: [
@@ -498,7 +481,7 @@ describe("OpenAiCodexHandler Luna Responses Lite requests", () => {
498481
})
499482
vitest.stubGlobal("fetch", mockFetch)
500483

501-
await drainStream(
484+
await collectStream(
502485
handler.createMessage("Instructions", [{ role: "user", content: "Fallback" }], {
503486
taskId: "task-fallback",
504487
tools: [],
@@ -549,7 +532,7 @@ describe("OpenAiCodexHandler Luna Responses Lite requests", () => {
549532
})
550533
vitest.stubGlobal("fetch", mockFetch)
551534

552-
await drainStream(
535+
await collectStream(
553536
handler.createMessage("Instructions", [{ role: "user", content: "Retry" }], {
554537
taskId: "task-retry",
555538
tools: [],
@@ -591,7 +574,7 @@ describe("OpenAiCodexHandler Luna Responses Lite requests", () => {
591574
const mockCreate = vitest.fn().mockResolvedValue(createCompletedStream())
592575
;(handler as any).client = { responses: { create: mockCreate } }
593576

594-
await drainStream(
577+
await collectStream(
595578
handler.createMessage("Normal instructions", [{ role: "user", content: "Hello" }], {
596579
taskId: "task-normal",
597580
tools: [],

0 commit comments

Comments
 (0)