69 lines
2.5 KiB
TypeScript
69 lines
2.5 KiB
TypeScript
import { expect, test } from "bun:test"
|
|
import { CloudflareAIGatewayAuthPlugin } from "@/plugin/cloudflare"
|
|
|
|
const pluginInput = {
|
|
client: {} as never,
|
|
project: {} as never,
|
|
directory: "",
|
|
worktree: "",
|
|
experimental_workspace: {
|
|
register() {},
|
|
},
|
|
serverUrl: new URL("https://example.com"),
|
|
$: {} as never,
|
|
}
|
|
|
|
function makeHookInput(overrides: { providerID?: string; apiId?: string; reasoning?: boolean }) {
|
|
return {
|
|
sessionID: "s",
|
|
agent: "a",
|
|
provider: {} as never,
|
|
message: {} as never,
|
|
model: {
|
|
providerID: overrides.providerID ?? "cloudflare-ai-gateway",
|
|
api: { id: overrides.apiId ?? "openai/gpt-5.2-codex", url: "", npm: "ai-gateway-provider" },
|
|
capabilities: {
|
|
reasoning: overrides.reasoning ?? true,
|
|
temperature: false,
|
|
attachment: true,
|
|
toolcall: true,
|
|
input: { text: true, audio: false, image: false, video: false, pdf: false },
|
|
output: { text: true, audio: false, image: false, video: false, pdf: false },
|
|
interleaved: false,
|
|
},
|
|
} as never,
|
|
}
|
|
}
|
|
|
|
function makeHookOutput() {
|
|
return { temperature: 0, topP: 1, topK: 0, maxOutputTokens: 32_000 as number | undefined, options: {} }
|
|
}
|
|
|
|
test("omits maxOutputTokens for openai reasoning models on cloudflare-ai-gateway", async () => {
|
|
const hooks = await CloudflareAIGatewayAuthPlugin(pluginInput)
|
|
const out = makeHookOutput()
|
|
await hooks["chat.params"]!(makeHookInput({ apiId: "openai/gpt-5.2-codex", reasoning: true }), out)
|
|
expect(out.maxOutputTokens).toBeUndefined()
|
|
})
|
|
|
|
test("keeps maxOutputTokens for openai non-reasoning models", async () => {
|
|
const hooks = await CloudflareAIGatewayAuthPlugin(pluginInput)
|
|
const out = makeHookOutput()
|
|
await hooks["chat.params"]!(makeHookInput({ apiId: "openai/gpt-4-turbo", reasoning: false }), out)
|
|
expect(out.maxOutputTokens).toBe(32_000)
|
|
})
|
|
|
|
test("keeps maxOutputTokens for non-openai reasoning models on cloudflare-ai-gateway", async () => {
|
|
const hooks = await CloudflareAIGatewayAuthPlugin(pluginInput)
|
|
const out = makeHookOutput()
|
|
await hooks["chat.params"]!(makeHookInput({ apiId: "anthropic/claude-sonnet-4-5", reasoning: true }), out)
|
|
expect(out.maxOutputTokens).toBe(32_000)
|
|
})
|
|
|
|
test("ignores non-cloudflare-ai-gateway providers", async () => {
|
|
const hooks = await CloudflareAIGatewayAuthPlugin(pluginInput)
|
|
const out = makeHookOutput()
|
|
await hooks["chat.params"]!(makeHookInput({ providerID: "openai", apiId: "gpt-5.2-codex", reasoning: true }), out)
|
|
expect(out.maxOutputTokens).toBe(32_000)
|
|
})
|