|
|
@@ -0,0 +1,68 @@
|
|
|
+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)
|
|
|
+})
|