Ctrl K
ComunidadGuías…

packages/ai/test/request-transport.test.ts

Rama dev · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import { describe, expect, test } from "bun:test"
import { Effect, Layer } from "effect"
import { AI } from "../src/index.js"
import { OpenAI } from "../src/providers.js"
import { RequestExecutor } from "../src/route.js"
import { handlerLayer } from "./lib/http.js"
import { sseEvents } from "./lib/sse.js"

const openai = OpenAI.configure({
  apiKey: "test",
  baseURL: "https://openai.test/v1",
  headers: { "x-shared": "provider" },
})

const chatBody = sseEvents(
  { choices: [{ delta: { content: "Hello" } }] },
  { choices: [{ delta: {}, finish_reason: "stop" }] },
)

// The client's own HTTP client must never be reached when a call brings its own `fetch`.
const unreachable = RequestExecutor.layer.pipe(
  Layer.provide(handlerLayer(() => Effect.die(new Error("the client's HTTP client was used")))),
)

const recording = (response: () => Response) => {
  const seen: Array<Request> = []
  const fetch = async (input: RequestInfo | URL, init?: RequestInit) => {
    seen.push(new Request(input, init))
    return response()
  }
  return { seen, fetch: Object.assign(fetch, { preconnect: globalThis.fetch.preconnect }) }
}

describe("request transport fields", () => {
  test("sends a text call through its own fetch with call headers winning", async () => {
    const ai = AI.make({ layer: unreachable })
    const recorder = recording(() => new Response(chatBody, { headers: { "content-type": "text/event-stream" } }))

    const response = await ai.generate({
      model: openai.chat("gpt-4o-mini"),
      prompt: "Say hello.",
      fetch: recorder.fetch,
      headers: { "x-shared": "call" },
      http: { query: { trace: "1" } },
    })

    expect(response.text).toBe("Hello")
    expect(recorder.seen.map((request) => request.url)).toEqual(["https://openai.test/v1/chat/completions?trace=1"])
    expect(recorder.seen[0]?.headers.get("x-shared")).toBe("call")
    await ai.dispose()
  })

  test("sends an image call through its own fetch", async () => {
    const ai = AI.make({ layer: unreachable })
    const recorder = recording(
      () =>
        new Response(JSON.stringify({ data: [{ b64_json: "AQID" }], output_format: "png" }), {
          headers: { "content-type": "application/json" },
        }),
    )

    const response = await ai.image.generate({
      model: openai.image("gpt-image-1"),
      prompt: "A lighthouse",
      fetch: recorder.fetch,
      headers: { "x-call": "yes" },
    })

    expect(response.images).toHaveLength(1)
    expect(recorder.seen[0]?.url).toBe("https://openai.test/v1/images/generations")
    expect(recorder.seen[0]?.headers.get("x-call")).toBe("yes")
    await ai.dispose()
  })
})