From 37a6ba893e62565d0f4b5de2c1901615017202e9 Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Wed, 26 Aug 2026 09:24:13 -0500 Subject: [PATCH] chore(ai): format package with prettier (#45280) --- packages/ai/src/cache-policy.ts | 7 ++- .../ai/src/protocols/anthropic-messages.ts | 58 ++++++++++------- packages/ai/src/protocols/bedrock-converse.ts | 4 +- .../ai/src/protocols/bedrock-event-stream.ts | 4 +- packages/ai/src/protocols/gemini.ts | 12 +++- packages/ai/src/protocols/openai-chat.ts | 56 +++++++++-------- .../protocols/utils/open-responses-options.ts | 7 +-- .../protocols/utils/responses-hosted-tools.ts | 62 +++++++++---------- packages/ai/src/route/client.ts | 4 +- .../recordings/azure/chat-streams-text.json | 5 +- .../azure/responses-calls-a-tool.json | 5 +- ...sponses-continues-after-a-tool-result.json | 5 +- .../azure/responses-streams-text.json | 5 +- .../bedrock-mantle/streams-text.json | 6 +- ...orkers-ai-gpt-oss-20b-tools-tool-call.json | 10 +-- .../google-vertex/calls-a-tool.json | 6 +- .../continues-after-a-tool-result.json | 6 +- .../google-vertex/streams-text.json | 6 +- ...ached-tokens-on-identical-second-call.json | 7 +-- .../openai-responses-gpt-5-5-tool-loop.json | 9 +-- .../recordings/pdf/openai-tool-result.json | 9 +-- .../recordings/pdf/openai-user-input.json | 8 +-- .../recordings/pdf/xai-tool-result.json | 9 +-- .../recordings/pdf/xai-user-input.json | 8 +-- ...vercel-ai-gateway-reasoning-tool-loop.json | 2 +- .../vercel-ai-gateway-reasoning.json | 9 +-- packages/ai/test/provider-error.test.ts | 4 +- packages/ai/test/provider/gemini.test.ts | 18 +++--- .../provider/google-vertex.recorded.test.ts | 4 +- packages/ai/test/provider/zai-images.test.ts | 4 +- 30 files changed, 154 insertions(+), 205 deletions(-) diff --git a/packages/ai/src/cache-policy.ts b/packages/ai/src/cache-policy.ts index 0149435458e..78b376acb5a 100644 --- a/packages/ai/src/cache-policy.ts +++ b/packages/ai/src/cache-policy.ts @@ -36,7 +36,12 @@ const resolve = (policy: CachePolicy | undefined): CachePolicyObject => { // Protocols whose wire format ignores inline cache markers (OpenAI's implicit // prefix caching, Gemini's implicit + out-of-band CachedContent). Skip the // whole policy pass for these — emitting hints would be harmless but pointless. -const RESPECTS_INLINE_HINTS = new Set(["anthropic-messages", "google-vertex-messages", "bedrock-converse", "openrouter"]) +const RESPECTS_INLINE_HINTS = new Set([ + "anthropic-messages", + "google-vertex-messages", + "bedrock-converse", + "openrouter", +]) const makeHint = (ttlSeconds: number | undefined): CacheHint => ttlSeconds !== undefined ? new CacheHint({ type: "ephemeral", ttlSeconds }) : new CacheHint({ type: "ephemeral" }) diff --git a/packages/ai/src/protocols/anthropic-messages.ts b/packages/ai/src/protocols/anthropic-messages.ts index 21caca0904a..d1422433b34 100644 --- a/packages/ai/src/protocols/anthropic-messages.ts +++ b/packages/ai/src/protocols/anthropic-messages.ts @@ -69,14 +69,22 @@ export interface OptionsInput { // SDK Metadata:2649 {user_id?: string | null} readonly metadata?: { readonly user_id?: string | null } // SDK MessageCreateParamsContainer:2596 ContainerParams|string - readonly container?: string | { readonly id?: string | null; readonly skills?: ReadonlyArray> | null } + readonly container?: + | string + | { readonly id?: string | null; readonly skills?: ReadonlyArray> | null } readonly inference_geo?: string | null readonly inferenceGeo?: string | null readonly cache_control?: { readonly type: "ephemeral"; readonly ttl?: "5m" | "1h" } readonly cacheControl?: { readonly type: "ephemeral"; readonly ttl?: "5m" | "1h" } // SDK OutputConfig:2684 {effort, format: JSONOutputFormat} - readonly output_config?: { readonly effort?: string | null; readonly format?: { readonly type: "json_schema"; readonly schema: Record } | null } - readonly outputConfig?: { readonly effort?: string | null; readonly format?: { readonly type: "json_schema"; readonly schema: Record } | null } + readonly output_config?: { + readonly effort?: string | null + readonly format?: { readonly type: "json_schema"; readonly schema: Record } | null + } + readonly outputConfig?: { + readonly effort?: string | null + readonly format?: { readonly type: "json_schema"; readonly schema: Record } | null + } } export type ProviderOptionsInput = OptionsInput @@ -259,7 +267,11 @@ const AnthropicToolChoice = Schema.Union([ type: Schema.Literals(["auto", "any", "none"]), disable_parallel_tool_use: Schema.optional(Schema.Boolean), }), - Schema.Struct({ type: Schema.tag("tool"), name: Schema.String, disable_parallel_tool_use: Schema.optional(Schema.Boolean) }), + Schema.Struct({ + type: Schema.tag("tool"), + name: Schema.String, + disable_parallel_tool_use: Schema.optional(Schema.Boolean), + }), ]) const AnthropicThinking = Schema.Union([ @@ -506,7 +518,11 @@ const lowerServerToolResult = Effect.fn("AnthropicMessages.lowerServerToolResult // Prefer the provider-owned replay payload; fall back to the result value for // histories constructed directly from provider events. const payload = part.providerMetadata?.anthropic?.["result"] ?? part.result.value - return { type: wireType, tool_use_id: scrubToolCallID(part.id), content: payload } satisfies AnthropicServerToolResultBlock + return { + type: wireType, + tool_use_id: scrubToolCallID(part.id), + content: payload, + } satisfies AnthropicServerToolResultBlock }) const fileIdFromMetadata = (metadata: MediaPart["metadata"]): string | undefined => { @@ -554,9 +570,7 @@ const documentContextFromMetadata = (metadata: MediaPart["metadata"]): string | return undefined } -const citationsFromMetadata = ( - metadata: MediaPart["metadata"], -): AnthropicDocumentBlock["citations"] | undefined => { +const citationsFromMetadata = (metadata: MediaPart["metadata"]): AnthropicDocumentBlock["citations"] | undefined => { if (!ProviderShared.isRecord(metadata)) return undefined const raw = ProviderShared.isRecord(metadata.anthropic) ? (metadata.anthropic.citations ?? metadata.citations) @@ -706,8 +720,7 @@ const lowerToolResultContent = Effect.fnUntraced(function* (part: ToolResultPart }) const requireThinkingSignature = (request: LLMRequest) => { - if (request.model.compatibility?.requireSignature !== undefined) - return request.model.compatibility.requireSignature + if (request.model.compatibility?.requireSignature !== undefined) return request.model.compatibility.requireSignature const provider = request.model.provider.toLowerCase() const model = request.model.id.toLowerCase() const baseURL = (request.model.route.endpoint.baseURL ?? "").toLowerCase() @@ -900,21 +913,24 @@ const lowerMessages = Effect.fn("AnthropicMessages.lowerMessages")(function* ( const resolveOptions = Effect.fn("AnthropicMessages.resolveOptions")(function* (request: LLMRequest) { const input = request.providerOptions as Record | undefined - const rawServiceTier = (input as Record | undefined)?.service_tier ?? (input as Record | undefined)?.serviceTier + const rawServiceTier = + (input as Record | undefined)?.service_tier ?? + (input as Record | undefined)?.serviceTier const service_tier = rawServiceTier === "auto" || rawServiceTier === "standard_only" ? (rawServiceTier as "auto" | "standard_only") : undefined const rawMetadata = (input as Record | undefined)?.metadata const metadata = - ProviderShared.isRecord(rawMetadata) && - (typeof rawMetadata.user_id === "string" || rawMetadata.user_id === null) + ProviderShared.isRecord(rawMetadata) && (typeof rawMetadata.user_id === "string" || rawMetadata.user_id === null) ? { user_id: rawMetadata.user_id as string | null } : undefined const container = typeof (input as Record | undefined)?.container === "string" || ProviderShared.isRecord((input as Record | undefined)?.container) - ? ((input as Record).container as string | { id?: string | null; skills?: ReadonlyArray> | null }) + ? ((input as Record).container as + | string + | { id?: string | null; skills?: ReadonlyArray> | null }) : undefined const rawInferenceGeo = (input as Record | undefined)?.inference_geo ?? @@ -965,8 +981,7 @@ const resolveThinking = Effect.fn("AnthropicMessages.resolveThinking")(function* input.display === "summarized" || input.display === "omitted" ? (input.display as "summarized" | "omitted") : undefined - if (input.type === "adaptive") - return { type: "adaptive" as const, ...(display === undefined ? {} : { display }) } + if (input.type === "adaptive") return { type: "adaptive" as const, ...(display === undefined ? {} : { display }) } if (input.type === "disabled") return { type: "disabled" as const } if (input.type !== "enabled") return undefined const budget = @@ -1418,9 +1433,7 @@ const step = (state: ParserState, event: AnthropicEvent) => { if (event.index === undefined) return Effect.fail(ProviderShared.eventError(ADAPTER, `Anthropic ${block.type} missing index`)) if (!block.id) - return Effect.fail( - ProviderShared.eventError(ADAPTER, `Anthropic tool_use missing id at index ${event.index}`), - ) + return Effect.fail(ProviderShared.eventError(ADAPTER, `Anthropic tool_use missing id at index ${event.index}`)) } return Effect.succeed(onContentBlockStart(state, { ...event, content_block: block })) } @@ -1473,10 +1486,9 @@ export const route = Route.make({ provider: "anthropic", providerMetadataKey: "anthropic", protocol, - endpoint: Endpoint.path( - (input) => (input.request.model.provider === "anthropic" ? `${PATH}?beta=true` : PATH), - { baseURL: DEFAULT_BASE_URL }, - ), + endpoint: Endpoint.path((input) => (input.request.model.provider === "anthropic" ? `${PATH}?beta=true` : PATH), { + baseURL: DEFAULT_BASE_URL, + }), auth: Auth.none, framing, headers: () => ({ "anthropic-version": "2023-06-01" }), diff --git a/packages/ai/src/protocols/bedrock-converse.ts b/packages/ai/src/protocols/bedrock-converse.ts index 6807bd9387e..aac7e1255fa 100644 --- a/packages/ai/src/protocols/bedrock-converse.ts +++ b/packages/ai/src/protocols/bedrock-converse.ts @@ -652,7 +652,9 @@ const step = (state: ParserState, event: BedrockEvent) => method: "stream", reason: classifyProviderFailure({ message: - event.exception.details.message ?? event.exception.details.originalMessage ?? "Bedrock Converse stream error", + event.exception.details.message ?? + event.exception.details.originalMessage ?? + "Bedrock Converse stream error", code: event.exception.type, }), }) diff --git a/packages/ai/src/protocols/bedrock-event-stream.ts b/packages/ai/src/protocols/bedrock-event-stream.ts index 32ef974e32e..d8997e96512 100644 --- a/packages/ai/src/protocols/bedrock-event-stream.ts +++ b/packages/ai/src/protocols/bedrock-event-stream.ts @@ -82,7 +82,9 @@ const consumeFrames = (route: string) => (state: FrameBufferState, chunk: Uint8A "Failed to parse Bedrock Converse event-stream payload", )) as Record delete parsed.p - out.push(messageType === "exception" ? { exception: { type: eventType, details: parsed } } : { [eventType]: parsed }) + out.push( + messageType === "exception" ? { exception: { type: eventType, details: parsed } } : { [eventType]: parsed }, + ) } return [cursor, out] as const }) diff --git a/packages/ai/src/protocols/gemini.ts b/packages/ai/src/protocols/gemini.ts index 7cf59d7eb89..5d35891deca 100644 --- a/packages/ai/src/protocols/gemini.ts +++ b/packages/ai/src/protocols/gemini.ts @@ -570,7 +570,12 @@ const finish = (state: ParserState): ReadonlyArray => { googleMetadata({ thoughtSignature: state.reasoningSignature }), ) if (state.textSignature !== undefined) - lifecycle = Lifecycle.textEnd(lifecycle, events, "text-0", googleMetadata({ thoughtSignature: state.textSignature })) + lifecycle = Lifecycle.textEnd( + lifecycle, + events, + "text-0", + googleMetadata({ thoughtSignature: state.textSignature }), + ) Lifecycle.finish(lifecycle, events, { reason: { normalized: @@ -675,8 +680,9 @@ const step = (state: ParserState, event: GeminiEvent) => { id, name: part.functionCall.name, input, - providerMetadata: - part.thoughtSignature ? googleMetadata({ thoughtSignature: part.thoughtSignature }) : undefined, + providerMetadata: part.thoughtSignature + ? googleMetadata({ thoughtSignature: part.thoughtSignature }) + : undefined, }), ) hasToolCalls = true diff --git a/packages/ai/src/protocols/openai-chat.ts b/packages/ai/src/protocols/openai-chat.ts index 8656d2bac52..2019be9d760 100644 --- a/packages/ai/src/protocols/openai-chat.ts +++ b/packages/ai/src/protocols/openai-chat.ts @@ -496,7 +496,11 @@ const lowerMessages = Effect.fn("OpenAIChat.lowerMessages")(function* (request: const lowering = { ...options, toolCallID: (id: string) => { - if (mistral) return id.replace(/[^a-zA-Z0-9]/g, "").slice(0, 9).padEnd(9, "0") + if (mistral) + return id + .replace(/[^a-zA-Z0-9]/g, "") + .slice(0, 9) + .padEnd(9, "0") if (modelID.includes("claude")) return id.replace(/[^a-zA-Z0-9_-]/g, "_") if (request.model.provider === "openai" || request.model.provider === "azure" || modelID.startsWith("openai/")) return id.slice(0, 40) @@ -505,7 +509,8 @@ const lowerMessages = Effect.fn("OpenAIChat.lowerMessages")(function* (request: } const requireAssistantAfterTool = request.model.compatibility?.requireAssistantAfterTool ?? mistral const bridgeTools = () => { - if (requireAssistantAfterTool && messages.at(-1)?.role === "tool") messages.push({ role: "assistant", content: "Done." }) + if (requireAssistantAfterTool && messages.at(-1)?.role === "tool") + messages.push({ role: "assistant", content: "Done." }) } const pendingImages: Array> = [] const flushImages = () => { @@ -557,7 +562,10 @@ const lowerMessages = Effect.fn("OpenAIChat.lowerMessages")(function* (request: ) continue } - if (message.role === "assistant" && message.content.every((part) => part.type === "text" && part.text.trim() === "")) + if ( + message.role === "assistant" && + message.content.every((part) => part.type === "text" && part.text.trim() === "") + ) continue if (message.role === "tool") { const lowered = yield* lowerToolMessages(message, lowering) @@ -588,7 +596,10 @@ const hasToolHistory = (messages: ReadonlyArray) // models.dev provider naming: DeepSeek, Moonshot AI, Together AI, ZAI // (Zhipu + Coding Plan variants), Nvidia, Cerebras, Chutes, etc. still // require `max_tokens`. -const detectMaxTokensField = (provider: string, baseURL: string | undefined): "max_tokens" | "max_completion_tokens" => { +const detectMaxTokensField = ( + provider: string, + baseURL: string | undefined, +): "max_tokens" | "max_completion_tokens" => { const p = provider.toLowerCase() const url = (baseURL ?? "").toLowerCase() if ( @@ -638,7 +649,8 @@ const detectSupportsStore = (provider: string, baseURL: string | undefined): boo const isChutes = p === "chutes" || url.includes("chutes.ai") const isCloudflareWorkersAI = p === "cloudflare-workers-ai" || url.includes("api.cloudflare.com") const isCloudflareAiGateway = p === "cloudflare-ai-gateway" || url.includes("gateway.ai.cloudflare.com") - const isVercelAiGateway = p === "vercel-ai-gateway" || url.includes("ai-gateway.vercel.sh") || url.includes("vercel.sh") + const isVercelAiGateway = + p === "vercel-ai-gateway" || url.includes("ai-gateway.vercel.sh") || url.includes("vercel.sh") const isAntLing = p === "ant-ling" || url.includes("api.ant-ling.com") const isOpencode = p === "opencode" || url.includes("opencode.ai") const isNonStandard = @@ -670,11 +682,7 @@ const detectSupportsStrictMode = (provider: string, baseURL: string | undefined) return !isMoonshot && !isTogether && !isCloudflareAiGateway && !isNvidia } -const detectZaiToolStream = ( - provider: string, - baseURL: string | undefined, - modelID: string, -): boolean => { +const detectZaiToolStream = (provider: string, baseURL: string | undefined, modelID: string): boolean => { const p = provider.toLowerCase() const url = (baseURL ?? "").toLowerCase() const isZai = @@ -724,10 +732,10 @@ export const fromRequest = Effect.fn("OpenAIChat.fromRequest")(function* ( const supportsStore = request.model.compatibility?.supportsStore ?? detectSupportsStore(provider, baseURL) const supportsUsageInStreaming = request.model.compatibility?.supportsUsageInStreaming ?? detectSupportsUsageInStreaming() - const supportsStrictMode = request.model.compatibility?.supportsStrictMode ?? detectSupportsStrictMode(provider, baseURL) + const supportsStrictMode = + request.model.compatibility?.supportsStrictMode ?? detectSupportsStrictMode(provider, baseURL) const zaiToolStream = - request.model.compatibility?.zaiToolStream ?? - detectZaiToolStream(provider, baseURL, request.model.id) + request.model.compatibility?.zaiToolStream ?? detectZaiToolStream(provider, baseURL, request.model.id) const hasHistory = hasToolHistory(request.messages) const hasActiveTools = request.tools.length > 0 return { @@ -816,11 +824,10 @@ const mapUsage = (usage: OpenAIChatEvent["usage"]): Usage | undefined => { if (!usage) return undefined const input = usage.prompt_tokens ?? undefined const output = usage.completion_tokens ?? undefined - const cached = - (usage.prompt_tokens_details?.cached_tokens ?? - (usage as { prompt_cache_hit_tokens?: number | null }).prompt_cache_hit_tokens ?? - (usage as { cached_tokens?: number | null }).cached_tokens ?? - undefined) as number | undefined + const cached = (usage.prompt_tokens_details?.cached_tokens ?? + (usage as { prompt_cache_hit_tokens?: number | null }).prompt_cache_hit_tokens ?? + (usage as { cached_tokens?: number | null }).cached_tokens ?? + undefined) as number | undefined const cacheWrite = usage.prompt_tokens_details?.cache_write_tokens ?? undefined const reasoning = usage.completion_tokens_details?.reasoning_tokens ?? undefined const nonCached = ProviderShared.subtractTokens(input, ProviderShared.sumTokens(cached, cacheWrite)) @@ -936,13 +943,12 @@ const step = (state: ParserState, event: OpenAIChatEvent) => const choiceUsage = (choice as unknown as { usage?: OpenAIChatEvent["usage"] })?.usage const usage = mapUsage(event.usage) ?? (choiceUsage ? mapUsage(choiceUsage) : undefined) ?? state.usage const rawFinishReason = choice?.finish_reason - const finishReason = - rawFinishReason - ? { - normalized: yield* mapFinishReason(event, rawFinishReason), - raw: choice?.native_finish_reason ?? rawFinishReason, - } - : state.finishReason + const finishReason = rawFinishReason + ? { + normalized: yield* mapFinishReason(event, rawFinishReason), + raw: choice?.native_finish_reason ?? rawFinishReason, + } + : state.finishReason const delta = choice?.delta const toolDeltas = delta?.tool_calls ?? [] let tools = state.tools diff --git a/packages/ai/src/protocols/utils/open-responses-options.ts b/packages/ai/src/protocols/utils/open-responses-options.ts index 5759ea5f5de..3c85adb9121 100644 --- a/packages/ai/src/protocols/utils/open-responses-options.ts +++ b/packages/ai/src/protocols/utils/open-responses-options.ts @@ -29,10 +29,9 @@ export type ResponseIncludable = (typeof ResponseIncludables)[number] | (string export const ServiceTiers = ["auto", "default", "flex", "priority"] as const export type ServiceTier = (typeof ServiceTiers)[number] | (string & {}) -export const ServiceTier = Schema.declare( - (value): value is ServiceTier => typeof value === "string", - { title: "ServiceTier" }, -) +export const ServiceTier = Schema.declare((value): value is ServiceTier => typeof value === "string", { + title: "ServiceTier", +}) export const Truncations = ["auto", "disabled"] as const export type Truncation = (typeof Truncations)[number] diff --git a/packages/ai/src/protocols/utils/responses-hosted-tools.ts b/packages/ai/src/protocols/utils/responses-hosted-tools.ts index 0635a94bb90..283b6e549fe 100644 --- a/packages/ai/src/protocols/utils/responses-hosted-tools.ts +++ b/packages/ai/src/protocols/utils/responses-hosted-tools.ts @@ -34,37 +34,35 @@ export const onDone: ( state: OpenResponses.ParserState, item: Item, tools: Definitions, -) => Effect.Effect = Effect.fn("ResponsesHostedTools.onDone")(function* ( - state, - item, - tools, -) { - const tool = tools[item.type] - if (!tool) return [state, []] satisfies OpenResponses.StepResult - const providerMetadata = OpenResponses.providerMetadata(state, { itemId: item.id }) - const events: LLMEvent[] = [] - const lifecycle = Lifecycle.stepStart(state.lifecycle, events) - events.push( - LLMEvent.toolCall({ - id: item.id, - name: tool.name, - input: tool.input(item), - providerExecuted: true, - providerMetadata, - }), - LLMEvent.toolResult({ - id: item.id, - name: tool.name, - result: tool.result - ? yield* tool.result(item) - : item.error !== undefined && item.error !== null - ? { type: "error", value: item.error } - : { type: "json", value: item }, - providerExecuted: true, - providerMetadata, - }), - ) - return [{ ...state, lifecycle }, events] satisfies OpenResponses.StepResult -}) +) => Effect.Effect = Effect.fn("ResponsesHostedTools.onDone")( + function* (state, item, tools) { + const tool = tools[item.type] + if (!tool) return [state, []] satisfies OpenResponses.StepResult + const providerMetadata = OpenResponses.providerMetadata(state, { itemId: item.id }) + const events: LLMEvent[] = [] + const lifecycle = Lifecycle.stepStart(state.lifecycle, events) + events.push( + LLMEvent.toolCall({ + id: item.id, + name: tool.name, + input: tool.input(item), + providerExecuted: true, + providerMetadata, + }), + LLMEvent.toolResult({ + id: item.id, + name: tool.name, + result: tool.result + ? yield* tool.result(item) + : item.error !== undefined && item.error !== null + ? { type: "error", value: item.error } + : { type: "json", value: item }, + providerExecuted: true, + providerMetadata, + }), + ) + return [{ ...state, lifecycle }, events] satisfies OpenResponses.StepResult + }, +) export * as ResponsesHostedTools from "./responses-hosted-tools.js" diff --git a/packages/ai/src/route/client.ts b/packages/ai/src/route/client.ts index 4c31b0725d4..4fa5fcbf43c 100644 --- a/packages/ai/src/route/client.ts +++ b/packages/ai/src/route/client.ts @@ -339,9 +339,7 @@ function makeFromTransport( return onHalt ? parsed.pipe( Stream.concat( - Stream.suspend(() => - Stream.unwrap(onHalt(state).pipe(Effect.map(Stream.fromIterable))), - ), + Stream.suspend(() => Stream.unwrap(onHalt(state).pipe(Effect.map(Stream.fromIterable)))), ), ) : parsed diff --git a/packages/ai/test/fixtures/recordings/azure/chat-streams-text.json b/packages/ai/test/fixtures/recordings/azure/chat-streams-text.json index 0dc0816b326..42598a8f53f 100644 --- a/packages/ai/test/fixtures/recordings/azure/chat-streams-text.json +++ b/packages/ai/test/fixtures/recordings/azure/chat-streams-text.json @@ -1,10 +1,7 @@ { "version": 1, "metadata": { - "tags": [ - "prefix:azure", - "provider:azure" - ], + "tags": ["prefix:azure", "provider:azure"], "name": "azure/chat-streams-text", "recordedAt": "2026-08-23T17:21:53.198Z" }, diff --git a/packages/ai/test/fixtures/recordings/azure/responses-calls-a-tool.json b/packages/ai/test/fixtures/recordings/azure/responses-calls-a-tool.json index 2c349382505..15d41abf37c 100644 --- a/packages/ai/test/fixtures/recordings/azure/responses-calls-a-tool.json +++ b/packages/ai/test/fixtures/recordings/azure/responses-calls-a-tool.json @@ -1,10 +1,7 @@ { "version": 1, "metadata": { - "tags": [ - "prefix:azure", - "provider:azure" - ], + "tags": ["prefix:azure", "provider:azure"], "name": "azure/responses-calls-a-tool", "recordedAt": "2026-08-23T17:21:55.170Z" }, diff --git a/packages/ai/test/fixtures/recordings/azure/responses-continues-after-a-tool-result.json b/packages/ai/test/fixtures/recordings/azure/responses-continues-after-a-tool-result.json index b6c05e154c2..2088f1b7b32 100644 --- a/packages/ai/test/fixtures/recordings/azure/responses-continues-after-a-tool-result.json +++ b/packages/ai/test/fixtures/recordings/azure/responses-continues-after-a-tool-result.json @@ -1,10 +1,7 @@ { "version": 1, "metadata": { - "tags": [ - "prefix:azure", - "provider:azure" - ], + "tags": ["prefix:azure", "provider:azure"], "name": "azure/responses-continues-after-a-tool-result", "recordedAt": "2026-08-23T17:21:56.397Z" }, diff --git a/packages/ai/test/fixtures/recordings/azure/responses-streams-text.json b/packages/ai/test/fixtures/recordings/azure/responses-streams-text.json index 937227ee4f7..8e58a4b4dd5 100644 --- a/packages/ai/test/fixtures/recordings/azure/responses-streams-text.json +++ b/packages/ai/test/fixtures/recordings/azure/responses-streams-text.json @@ -1,10 +1,7 @@ { "version": 1, "metadata": { - "tags": [ - "prefix:azure", - "provider:azure" - ], + "tags": ["prefix:azure", "provider:azure"], "name": "azure/responses-streams-text", "recordedAt": "2026-08-23T17:21:54.158Z" }, diff --git a/packages/ai/test/fixtures/recordings/bedrock-mantle/streams-text.json b/packages/ai/test/fixtures/recordings/bedrock-mantle/streams-text.json index c3a75f01203..cbf71449b3c 100644 --- a/packages/ai/test/fixtures/recordings/bedrock-mantle/streams-text.json +++ b/packages/ai/test/fixtures/recordings/bedrock-mantle/streams-text.json @@ -2,11 +2,7 @@ "version": 1, "metadata": { "model": "openai.gpt-oss-120b", - "tags": [ - "prefix:bedrock-mantle", - "provider:amazon-bedrock", - "protocol:openai-responses" - ], + "tags": ["prefix:bedrock-mantle", "provider:amazon-bedrock", "protocol:openai-responses"], "name": "bedrock-mantle/streams-text", "recordedAt": "2026-08-25T03:29:02.968Z" }, diff --git a/packages/ai/test/fixtures/recordings/cloudflare-workers-ai/cloudflare-workers-ai-gpt-oss-20b-tools-tool-call.json b/packages/ai/test/fixtures/recordings/cloudflare-workers-ai/cloudflare-workers-ai-gpt-oss-20b-tools-tool-call.json index 4e6d26df531..2c340acb0b7 100644 --- a/packages/ai/test/fixtures/recordings/cloudflare-workers-ai/cloudflare-workers-ai-gpt-oss-20b-tools-tool-call.json +++ b/packages/ai/test/fixtures/recordings/cloudflare-workers-ai/cloudflare-workers-ai-gpt-oss-20b-tools-tool-call.json @@ -7,13 +7,7 @@ "route": "cloudflare-workers-ai", "transport": "http", "model": "@cf/openai/gpt-oss-20b", - "tags": [ - "prefix:cloudflare-workers-ai", - "provider:cloudflare-workers-ai", - "tool", - "tool-call", - "golden" - ] + "tags": ["prefix:cloudflare-workers-ai", "provider:cloudflare-workers-ai", "tool", "tool-call", "golden"] }, "interactions": [ { @@ -35,4 +29,4 @@ } } ] -} \ No newline at end of file +} diff --git a/packages/ai/test/fixtures/recordings/google-vertex/calls-a-tool.json b/packages/ai/test/fixtures/recordings/google-vertex/calls-a-tool.json index cc91c018bd0..ad4020e5fe7 100644 --- a/packages/ai/test/fixtures/recordings/google-vertex/calls-a-tool.json +++ b/packages/ai/test/fixtures/recordings/google-vertex/calls-a-tool.json @@ -1,11 +1,7 @@ { "version": 1, "metadata": { - "tags": [ - "prefix:google-vertex", - "provider:google-vertex", - "protocol:gemini" - ], + "tags": ["prefix:google-vertex", "provider:google-vertex", "protocol:gemini"], "name": "google-vertex/calls-a-tool", "recordedAt": "2026-08-23T17:21:51.036Z" }, diff --git a/packages/ai/test/fixtures/recordings/google-vertex/continues-after-a-tool-result.json b/packages/ai/test/fixtures/recordings/google-vertex/continues-after-a-tool-result.json index f419d6e5c9f..459810e458f 100644 --- a/packages/ai/test/fixtures/recordings/google-vertex/continues-after-a-tool-result.json +++ b/packages/ai/test/fixtures/recordings/google-vertex/continues-after-a-tool-result.json @@ -1,11 +1,7 @@ { "version": 1, "metadata": { - "tags": [ - "prefix:google-vertex", - "provider:google-vertex", - "protocol:gemini" - ], + "tags": ["prefix:google-vertex", "provider:google-vertex", "protocol:gemini"], "name": "google-vertex/continues-after-a-tool-result", "recordedAt": "2026-08-23T17:21:51.853Z" }, diff --git a/packages/ai/test/fixtures/recordings/google-vertex/streams-text.json b/packages/ai/test/fixtures/recordings/google-vertex/streams-text.json index cc95b74191b..5c4f67c4d97 100644 --- a/packages/ai/test/fixtures/recordings/google-vertex/streams-text.json +++ b/packages/ai/test/fixtures/recordings/google-vertex/streams-text.json @@ -1,11 +1,7 @@ { "version": 1, "metadata": { - "tags": [ - "prefix:google-vertex", - "provider:google-vertex", - "protocol:gemini" - ], + "tags": ["prefix:google-vertex", "provider:google-vertex", "protocol:gemini"], "name": "google-vertex/streams-text", "recordedAt": "2026-08-23T17:21:50.112Z" }, diff --git a/packages/ai/test/fixtures/recordings/openai-responses-cache/reports-cached-tokens-on-identical-second-call.json b/packages/ai/test/fixtures/recordings/openai-responses-cache/reports-cached-tokens-on-identical-second-call.json index 372164af6a8..b4e8bbddd7f 100644 --- a/packages/ai/test/fixtures/recordings/openai-responses-cache/reports-cached-tokens-on-identical-second-call.json +++ b/packages/ai/test/fixtures/recordings/openai-responses-cache/reports-cached-tokens-on-identical-second-call.json @@ -1,12 +1,7 @@ { "version": 1, "metadata": { - "tags": [ - "prefix:openai-responses-cache", - "provider:openai", - "protocol:openai-responses", - "cache" - ], + "tags": ["prefix:openai-responses-cache", "provider:openai", "protocol:openai-responses", "cache"], "name": "openai-responses-cache/reports-cached-tokens-on-identical-second-call", "recordedAt": "2026-08-25T03:29:25.124Z" }, diff --git a/packages/ai/test/fixtures/recordings/openai-responses/openai-responses-gpt-5-5-tool-loop.json b/packages/ai/test/fixtures/recordings/openai-responses/openai-responses-gpt-5-5-tool-loop.json index 16bf314014e..d9d39ccd6ee 100644 --- a/packages/ai/test/fixtures/recordings/openai-responses/openai-responses-gpt-5-5-tool-loop.json +++ b/packages/ai/test/fixtures/recordings/openai-responses/openai-responses-gpt-5-5-tool-loop.json @@ -5,14 +5,7 @@ "route": "openai-responses", "transport": "http", "model": "gpt-5.5", - "tags": [ - "prefix:openai-responses", - "provider:openai", - "flagship", - "tool", - "tool-loop", - "golden" - ], + "tags": ["prefix:openai-responses", "provider:openai", "flagship", "tool", "tool-loop", "golden"], "name": "openai-responses/openai-responses-gpt-5-5-tool-loop", "recordedAt": "2026-08-20T06:30:22.262Z" }, diff --git a/packages/ai/test/fixtures/recordings/pdf/openai-tool-result.json b/packages/ai/test/fixtures/recordings/pdf/openai-tool-result.json index 17e418740e6..9a81f2776e2 100644 --- a/packages/ai/test/fixtures/recordings/pdf/openai-tool-result.json +++ b/packages/ai/test/fixtures/recordings/pdf/openai-tool-result.json @@ -1,14 +1,7 @@ { "version": 1, "metadata": { - "tags": [ - "prefix:pdf", - "pdf", - "provider:openai", - "protocol:openai-responses", - "tool", - "tool-result" - ], + "tags": ["prefix:pdf", "pdf", "provider:openai", "protocol:openai-responses", "tool", "tool-result"], "name": "pdf/openai-tool-result", "recordedAt": "2026-08-25T03:29:08.297Z" }, diff --git a/packages/ai/test/fixtures/recordings/pdf/openai-user-input.json b/packages/ai/test/fixtures/recordings/pdf/openai-user-input.json index fb8bd5f98f1..53f9117b80c 100644 --- a/packages/ai/test/fixtures/recordings/pdf/openai-user-input.json +++ b/packages/ai/test/fixtures/recordings/pdf/openai-user-input.json @@ -1,13 +1,7 @@ { "version": 1, "metadata": { - "tags": [ - "prefix:pdf", - "pdf", - "provider:openai", - "protocol:openai-responses", - "user-input" - ], + "tags": ["prefix:pdf", "pdf", "provider:openai", "protocol:openai-responses", "user-input"], "name": "pdf/openai-user-input", "recordedAt": "2026-08-25T03:29:05.645Z" }, diff --git a/packages/ai/test/fixtures/recordings/pdf/xai-tool-result.json b/packages/ai/test/fixtures/recordings/pdf/xai-tool-result.json index c74d41d94dd..4521a50a895 100644 --- a/packages/ai/test/fixtures/recordings/pdf/xai-tool-result.json +++ b/packages/ai/test/fixtures/recordings/pdf/xai-tool-result.json @@ -1,14 +1,7 @@ { "version": 1, "metadata": { - "tags": [ - "prefix:pdf", - "pdf", - "provider:xai", - "protocol:xai-responses", - "tool", - "tool-result" - ], + "tags": ["prefix:pdf", "pdf", "provider:xai", "protocol:xai-responses", "tool", "tool-result"], "name": "pdf/xai-tool-result", "recordedAt": "2026-08-25T03:29:11.774Z" }, diff --git a/packages/ai/test/fixtures/recordings/pdf/xai-user-input.json b/packages/ai/test/fixtures/recordings/pdf/xai-user-input.json index 50b7a9f38e9..6ca3e01ea67 100644 --- a/packages/ai/test/fixtures/recordings/pdf/xai-user-input.json +++ b/packages/ai/test/fixtures/recordings/pdf/xai-user-input.json @@ -1,13 +1,7 @@ { "version": 1, "metadata": { - "tags": [ - "prefix:pdf", - "pdf", - "provider:xai", - "protocol:xai-responses", - "user-input" - ], + "tags": ["prefix:pdf", "pdf", "provider:xai", "protocol:xai-responses", "user-input"], "name": "pdf/xai-user-input", "recordedAt": "2026-08-25T03:29:10.612Z" }, diff --git a/packages/ai/test/fixtures/recordings/vercel-ai-gateway-reasoning-tool-loop.json b/packages/ai/test/fixtures/recordings/vercel-ai-gateway-reasoning-tool-loop.json index 22b698b9eed..35d35a72aa6 100644 --- a/packages/ai/test/fixtures/recordings/vercel-ai-gateway-reasoning-tool-loop.json +++ b/packages/ai/test/fixtures/recordings/vercel-ai-gateway-reasoning-tool-loop.json @@ -52,4 +52,4 @@ } } ] -} \ No newline at end of file +} diff --git a/packages/ai/test/fixtures/recordings/vercel-ai-gateway-reasoning.json b/packages/ai/test/fixtures/recordings/vercel-ai-gateway-reasoning.json index 9228d8feb59..aad16f20430 100644 --- a/packages/ai/test/fixtures/recordings/vercel-ai-gateway-reasoning.json +++ b/packages/ai/test/fixtures/recordings/vercel-ai-gateway-reasoning.json @@ -2,12 +2,7 @@ "version": 1, "metadata": { "model": "anthropic/claude-sonnet-4.6", - "tags": [ - "prefix:openai-compatible-chat", - "provider:vercel-ai-gateway", - "protocol:openai-chat", - "reasoning" - ], + "tags": ["prefix:openai-compatible-chat", "provider:vercel-ai-gateway", "protocol:openai-chat", "reasoning"], "name": "vercel-ai-gateway-reasoning", "recordedAt": "2026-07-18T11:28:42.077Z" }, @@ -31,4 +26,4 @@ } } ] -} \ No newline at end of file +} diff --git a/packages/ai/test/provider-error.test.ts b/packages/ai/test/provider-error.test.ts index 6611bb78eb3..c54e8728efe 100644 --- a/packages/ai/test/provider-error.test.ts +++ b/packages/ai/test/provider-error.test.ts @@ -89,9 +89,7 @@ describe("provider error classification", () => { test("classifies network error text as provider internal", () => { expect( - ["network error", "network-error", "network_error"].map( - (message) => classifyProviderFailure({ message })._tag, - ), + ["network error", "network-error", "network_error"].map((message) => classifyProviderFailure({ message })._tag), ).toEqual(["ProviderInternal", "ProviderInternal", "ProviderInternal"]) }) diff --git a/packages/ai/test/provider/gemini.test.ts b/packages/ai/test/provider/gemini.test.ts index afb8296cc47..f66786f0127 100644 --- a/packages/ai/test/provider/gemini.test.ts +++ b/packages/ai/test/provider/gemini.test.ts @@ -515,7 +515,10 @@ describe("Gemini route", () => { { role: "model", parts: [ - { functionCall: { id: "call_image", name: "read", args: { path: "pixel.png" } }, thoughtSignature: "sig_1" }, + { + functionCall: { id: "call_image", name: "read", args: { path: "pixel.png" } }, + thoughtSignature: "sig_1", + }, ], }, { @@ -606,10 +609,7 @@ describe("Gemini route", () => { expect(prepared.body.contents).toEqual([ { role: "model", - parts: [ - { functionCall: { name: "shot", args: {} } }, - { functionCall: { name: "shot", args: {} } }, - ], + parts: [{ functionCall: { name: "shot", args: {} } }, { functionCall: { name: "shot", args: {} } }], }, { role: "user", @@ -1071,7 +1071,9 @@ describe("Gemini route", () => { const prepared = yield* compileRequest( LLM.request({ model, - messages: [Message.assistant([{ type: "text", text: "All done.", providerMetadata: delta?.providerMetadata }])], + messages: [ + Message.assistant([{ type: "text", text: "All done.", providerMetadata: delta?.providerMetadata }]), + ], }), ) expect(prepared.body.contents).toEqual([ @@ -1572,9 +1574,7 @@ describe("Gemini route", () => { { candidates: [{ content: { role: "model", parts: null } }] }, { candidates: [{ content: null, finishReason: null }] }, { - candidates: [ - { content: { role: "model", parts: [{ text: "Hello" }] }, finishReason: "STOP" as const }, - ], + candidates: [{ content: { role: "model", parts: [{ text: "Hello" }] }, finishReason: "STOP" as const }], }, ), ), diff --git a/packages/ai/test/provider/google-vertex.recorded.test.ts b/packages/ai/test/provider/google-vertex.recorded.test.ts index 3fab9bf12b2..7ec02a18659 100644 --- a/packages/ai/test/provider/google-vertex.recorded.test.ts +++ b/packages/ai/test/provider/google-vertex.recorded.test.ts @@ -26,9 +26,7 @@ const recorded = recordedTests({ describe("Google Vertex Gemini recorded", () => { recorded.effect("streams text", () => Effect.gen(function* () { - const response = yield* LLMClient.generate( - LLM.request({ model, prompt: "Reply with exactly one word: hello" }), - ) + const response = yield* LLMClient.generate(LLM.request({ model, prompt: "Reply with exactly one word: hello" })) expect(response.text.toLowerCase()).toContain("hello") }), diff --git a/packages/ai/test/provider/zai-images.test.ts b/packages/ai/test/provider/zai-images.test.ts index 3b0a28994dc..bf05e000352 100644 --- a/packages/ai/test/provider/zai-images.test.ts +++ b/packages/ai/test/provider/zai-images.test.ts @@ -80,7 +80,9 @@ describe("Z.ai Images", () => { it.effect("sanitizes unpaired surrogates in outbound image requests", () => Image.generate({ - model: ZAI.configure({ apiKey: "test", http: { body: { metadata: { source: "default\uDC00" } } } }).image("model"), + model: ZAI.configure({ apiKey: "test", http: { body: { metadata: { source: "default\uDC00" } } } }).image( + "model", + ), prompt: "A red circle \uD800 on a white background \u{1F600}", }).pipe( Effect.provide(