refactor(ai): remove unused exports and redundant String coercions (#57995)

This commit is contained in:
Aiden Cline
2026-10-22 14:33:28 -05:00
committed by GitHub
Unverified
parent ac68d6a929
commit 76fd05ff45
18 changed files with 25 additions and 62 deletions
@@ -53,7 +53,6 @@ const SSE_EVENTS = new Set([
])
export const framing = Framing.sseEvents(SSE_EVENTS)
export type ThinkingBlockBinding = typeof AnthropicThinkingBlockBinding.Type
export type ThinkingInput = typeof Thinking.Encoded
/** Caller-facing provider options; unknown keys are accepted and ignored. `Options.Type` is the wire-ready form. */
export type OptionsInput = ProviderOptions & typeof Options.Encoded
@@ -818,7 +817,7 @@ const requireThinkingSignature = (request: LLMRequest) => {
// Opus 4.8 and every Claude 5 model accept mid-conversation system messages; later versions inherit support.
const supportsNativeSystemUpdates = (request: LLMRequest) => {
const version = claudeVersion(String(request.model.id))
const version = claudeVersion(request.model.id)
if (version === undefined) return false
if (version.family === "opus" && version.major === 4) return version.minor >= 8
return version.major >= 5
@@ -871,7 +870,7 @@ const appendToUserTurn = (messages: AnthropicMessage[], block: AnthropicUserBloc
const lowerMessages = Effect.fnUntraced(function* (request: LLMRequest, breakpoints: Cache.Breakpoints) {
const messages: AnthropicMessage[] = []
const providerMetadataKey = request.model.route.providerMetadataKey ?? String(request.model.provider)
const providerMetadataKey = request.model.route.providerMetadataKey ?? request.model.provider
// Text updates stay where they are unless a user turn follows them; then they move after the latest
// user turn, the nearest spot where Anthropic accepts a native system message.
const holdUpdates = supportsNativeSystemUpdates(request)
@@ -1602,7 +1601,7 @@ export const protocol = Protocol.make({
initial: (request) => ({
provider: request.model.provider,
compactions: {},
providerMetadataKey: request.model.route.providerMetadataKey ?? String(request.model.provider),
providerMetadataKey: request.model.route.providerMetadataKey ?? request.model.provider,
tools: ToolStream.empty<number>(),
reasoningSignatures: {},
lifecycle: Lifecycle.initial(),
@@ -331,7 +331,7 @@ const lowerMessages = Effect.fnUntraced(function* (
const documentNames = new Set<string>()
// Mistral can reject replay IDs even when they satisfy Converse's broader ID syntax.
const normalizeID = request.model.id.includes("mistral.") ? MistralToolID.normalizer(request) : (id: string) => id
const providerMetadataKey = request.model.route.providerMetadataKey ?? String(request.model.provider)
const providerMetadataKey = request.model.route.providerMetadataKey ?? request.model.provider
const hoistImages = !keepToolImagesInline(request.model.id)
// Bedrock expects parallel tool results before any images hoisted beside them.
const pendingImages: BedrockMedia.ImageBlock[] = []
@@ -862,7 +862,7 @@ export const protocol = Protocol.make({
stream: {
event: BedrockEventStream.Frame.pipe(Schema.decodeTo(BedrockEvent)),
initial: (request) => ({
providerMetadataKey: request.model.route.providerMetadataKey ?? String(request.model.provider),
providerMetadataKey: request.model.route.providerMetadataKey ?? request.model.provider,
tools: ToolStream.empty<number>(),
finishReason: undefined,
usage: undefined,
@@ -891,6 +891,4 @@ export const route = Route.make({
framing,
})
export const sigV4Auth = BedrockAuth.sigV4
export * as BedrockConverse from "./bedrock-converse.js"
+2 -2
View File
@@ -321,7 +321,7 @@ const lowerToolCall = (part: ToolCallPart, omitIds: boolean, metadataKey: string
const lowerMessages = Effect.fnUntraced(function* (request: LLMRequest) {
const contents: GeminiContent[] = []
const metadataKey = request.model.route.providerMetadataKey ?? String(request.model.provider)
const metadataKey = request.model.route.providerMetadataKey ?? request.model.provider
const omitCallIds = omitsFunctionCallIds(request.model.id)
const legacyToolMedia = routesLegacyToolMedia(request.model.id)
let pendingMedia: GeminiInlineDataPart[] | undefined
@@ -960,7 +960,7 @@ export const protocol = Protocol.make({
event: Schema.Union([Schema.instanceOf(NextRequest), GeminiEvent]),
initial: (request): ParserState => ({
route: `${request.model.provider}/${request.model.route.id}`,
providerMetadataKey: request.model.route.providerMetadataKey ?? String(request.model.provider),
providerMetadataKey: request.model.route.providerMetadataKey ?? request.model.provider,
hasToolCalls: false,
lifecycle: Lifecycle.initial(),
nextReasoningId: 0,
@@ -236,7 +236,7 @@ const signature = (metadata: ProviderMetadata | undefined, key: string) => {
const lowerMessages = Effect.fnUntraced(function* (request: LLMRequest) {
const steps: InputStep[] = []
const key = request.model.route.providerMetadataKey ?? String(request.model.provider)
const key = request.model.route.providerMetadataKey ?? request.model.provider
for (const message of request.messages) {
if (message.role === "system") {
const part = yield* ProviderShared.wrappedSystemUpdate("Google Interactions", message)
@@ -562,7 +562,7 @@ export const protocol = Protocol.make({
event: Protocol.jsonEvent(Event),
initial: (request): ParserState => ({
route: `${request.model.provider}/${ADAPTER}`,
metadataKey: request.model.route.providerMetadataKey ?? String(request.model.provider),
metadataKey: request.model.route.providerMetadataKey ?? request.model.provider,
lifecycle: Lifecycle.initial(),
steps: {},
tools: ToolStream.empty<number>(),
+3 -3
View File
@@ -577,7 +577,7 @@ const lowerMessages = Effect.fnUntraced(function* (request: LLMRequest, options:
const mistral = ["mistral", "devstral", "codestral", "pixtral", "mixtral"].some((family) => modelID.includes(family))
const lowering = {
...options,
providerMetadataKey: request.model.route.providerMetadataKey ?? String(request.model.provider),
providerMetadataKey: request.model.route.providerMetadataKey ?? request.model.provider,
toolCallID: (id: string) => {
if (mistral)
return id
@@ -783,7 +783,7 @@ export const fromRequest = Effect.fn("OpenAIChat.fromRequest")(function* (
)
const generation = request.generation
const flattened = ProviderShared.flattenToolRequest(request)
const provider = String(request.model.provider)
const provider = request.model.provider
const baseURL = request.model.route.endpoint.baseURL
const detectedMaxTokensField = detectMaxTokensField(provider, baseURL)
const maxTokensField = request.model.compatibility?.maxTokensField ?? detectedMaxTokensField
@@ -1252,7 +1252,7 @@ export const protocol = Protocol.make({
stream: {
event: OpenAIChatStreamEvent,
initial: (request) => ({
providerMetadataKey: request.model.route.providerMetadataKey ?? String(request.model.provider),
providerMetadataKey: request.model.route.providerMetadataKey ?? request.model.provider,
tools: ToolStream.empty<number>(),
pendingTools: {},
toolCallEvents: [],
@@ -1,11 +1,9 @@
import { Route, type RouteRoutedLanguageModelInput } from "../route/client.js"
import { Route } from "../route/client.js"
import { Endpoint } from "../route/endpoint.js"
import * as OpenAIChat from "./openai-chat.js"
const ADAPTER = "openai-compatible-chat"
export type OpenAICompatibleChatLanguageModelInput = RouteRoutedLanguageModelInput
/**
* Route for non-OpenAI providers that expose an OpenAI Chat-compatible
* `/chat/completions` endpoint. Reuses `OpenAIChat.protocol` end-to-end and
@@ -1,11 +1,9 @@
import { Route, type RouteRoutedLanguageModelInput } from "../route/client.js"
import { Route } from "../route/client.js"
import { Endpoint } from "../route/endpoint.js"
import { OpenResponses } from "./open-responses.js"
const ADAPTER = "openai-compatible-responses"
export type OpenAICompatibleResponsesLanguageModelInput = RouteRoutedLanguageModelInput
/**
* Deployment adapter for providers that expose an Open Responses-compatible
* `/responses` endpoint. Provider helpers configure identity, endpoint, and
@@ -60,5 +60,3 @@ export const ALL = ATOM | COLLECTION
* The default is to allow all types to be partially parsed, which in most cases is the best option.
*/
export const Allow = { STR, NUM, ARR, OBJ, NULL, BOOL, NAN, INFINITY, _INFINITY, INF, SPECIAL, ATOM, COLLECTION, ALL }
export default Allow
@@ -120,8 +120,7 @@ export const configure = (input: LanguageModelOptions) => {
const chat = route.with(rest)
return {
id,
model: (input: string | ModelID) => {
const value = String(input)
model: (value: string | ModelID) => {
if (value.startsWith("openai/"))
return responses.model<OpenAIProviderOptionsInput>({ id: native ? value.slice("openai/".length) : value })
if (value.startsWith("anthropic/"))
+2 -2
View File
@@ -60,7 +60,7 @@ const route = Route.make({
providerMetadataKey: "vertex",
protocol,
endpoint: Endpoint.path(({ request }) => {
const model = String(request.model.id)
const model = request.model.id
return `/${model.startsWith("endpoints/") ? model : `models/${model}`}:streamGenerateContent?alt=sse`
}),
auth: Auth.none,
@@ -84,7 +84,7 @@ const configuredRoute = (input: Config, modelID: string | ModelID) => {
...rest
} = input
const apiKey = GoogleVertexShared.apiKey(input)
const endpointModel = String(modelID).startsWith("endpoints/")
const endpointModel = modelID.startsWith("endpoints/")
if (apiKey !== undefined && endpointModel)
throw new ProviderConfigurationError({
provider: id,
@@ -2,5 +2,3 @@ import type { Options } from "../protocols/utils/open-responses-options.js"
export type OpenResponsesOptionsInput = Options & { readonly [key: string]: unknown }
export type OpenResponsesProviderOptionsInput = OpenResponsesOptionsInput
export * as OpenResponsesProviderOptions from "./open-responses-options.js"
@@ -34,8 +34,7 @@ export const configure = (input: GenericModelOptions) => {
})
return {
id: ProviderID.make(provider),
model: (modelID: string | ModelID) =>
route.model<OpenAIProviderOptionsInput>({ id: modelID, provider: ProviderID.make(provider) }),
model: (modelID: string | ModelID) => route.model<OpenAIProviderOptionsInput>({ id: modelID }),
configure,
}
}
@@ -62,5 +62,3 @@ export const withOpenAIOptions = <Options extends { readonly providerOptions?: P
providerOptions: mergeProviderOptions(openAIDefaultOptions(modelID), options.providerOptions),
}
}
export * as OpenAIProviderOptions from "./openai-options.js"
-12
View File
@@ -22,18 +22,6 @@ export type ProviderAuthOption<Mode extends ApiKeyMode> =
| AuthOverride
| (Mode extends "optional" ? OptionalApiKeyAuth : RequiredApiKeyAuth)
export type LanguageModelOptions<Base, Mode extends ApiKeyMode> = Omit<Base, "apiKey" | "auth"> &
ProviderAuthOption<Mode>
export type LanguageModelArgs<Base, Mode extends ApiKeyMode> = Mode extends "optional"
? readonly [options?: LanguageModelOptions<Base, Mode>]
: readonly [options: LanguageModelOptions<Base, Mode>]
export type LanguageModelFactory<Base, Mode extends ApiKeyMode, LanguageModel> = (
id: string,
...args: LanguageModelArgs<Base, Mode>
) => LanguageModel
/**
* Require at least one of the keys in `T`. Use for option shapes where any
* subset of fields is acceptable but at least one must be present (e.g. Azure
-5
View File
@@ -40,9 +40,6 @@ export interface Definition {
readonly pipe: <A>(f: (self: Definition) => A) => A
}
export const isAuth = (input: unknown): input is Definition =>
typeof input === "object" && input !== null && "apply" in input && typeof input.apply === "function"
const credential = (load: Effect.Effect<Redacted.Redacted, CredentialError>): Credential => {
const self: Credential = {
load,
@@ -124,8 +121,6 @@ export function bearer(source: Secret | Credential) {
return credentialInput(source).bearer()
}
export const apiKey = bearer
export function header(name: string): (source: Secret | Credential) => Definition
export function header(name: string, source: Secret | Credential): Definition
export function header(name: string, source?: Secret | Credential) {
+3 -8
View File
@@ -94,8 +94,6 @@ export type AnyRoute<Compact extends CompactionOperations | undefined = Compacti
Compact
>
export type HttpOptionsInput = HttpOptions.Input
export type RouteLanguageModelInput = Omit<LanguageModel.Input, "provider" | "route">
export type RouteRoutedLanguageModelInput = Omit<LanguageModel.Input, "route">
@@ -150,7 +148,7 @@ const mergeRouteDefaults = (base: RouteDefaults | undefined, patch: RouteDefault
...base,
...patch,
headers,
generation: mergeGenerationOptions(generationOptions(base?.generation), generationOptions(patch.generation)),
generation: mergeGenerationOptions(base?.generation, patch.generation),
providerOptions: mergeProviderOptions(base?.providerOptions, patch.providerOptions),
http: mergeHttpOptions(
base?.http,
@@ -168,9 +166,6 @@ const mergeHeaders = (...items: ReadonlyArray<Record<string, string> | undefined
return Object.fromEntries(entries)
}
export const generationOptions = (input: GenerationOptions.Input | undefined) =>
input === undefined ? undefined : GenerationOptions.make(input)
export interface Interface {
readonly compact: CompactMethod
readonly stream: StreamMethod
@@ -396,8 +391,8 @@ function makeFromTransport<Body, Prepared, Frame, Event, State>(
provider: provider ?? routeInput.provider,
providerMetadataKey:
providerMetadataKey ??
(provider !== undefined && String(provider) !== String(routeInput.provider)
? String(provider)
(provider !== undefined && provider !== routeInput.provider
? provider
: routeInput.providerMetadataKey),
auth: auth ?? routeInput.auth,
endpoint: endpoint ? Endpoint.merge(routeInput.endpoint, endpoint) : routeInput.endpoint,
+1 -1
View File
@@ -26,7 +26,7 @@ export const Service = RequestExecutorService
export type Service = RequestExecutorService
export const headerDetails = (headers: Headers.Headers) =>
Object.fromEntries(Object.entries(headers).map(([name, value]) => [name, String(value)]))
Object.fromEntries(Object.entries(headers).map(([name, value]) => [name, value]))
export const responseHttp = (response: HttpClientResponse.HttpClientResponse) =>
new HttpContext({
+3 -3
View File
@@ -1,6 +1,6 @@
import { Config } from "effect"
import { Auth } from "../src/route.js"
import type { LanguageModelFactory } from "../src/route/auth-options.js"
import type { ProviderAuthOption } from "../src/route/auth-options.js"
import * as OpenAIChat from "../src/protocols/openai-chat.js"
import * as AmazonBedrock from "../src/providers/amazon-bedrock.js"
import * as Anthropic from "../src/providers/anthropic.js"
@@ -27,8 +27,8 @@ type LanguageModel = {
}
declare const auth: Auth.Definition
declare const optionalAuthModel: LanguageModelFactory<BaseOptions, "optional", LanguageModel>
declare const requiredAuthModel: LanguageModelFactory<BaseOptions, "required", LanguageModel>
declare const optionalAuthModel: (id: string, options?: BaseOptions & ProviderAuthOption<"optional">) => LanguageModel
declare const requiredAuthModel: (id: string, options: BaseOptions & ProviderAuthOption<"required">) => LanguageModel
const configApiKey = Config.Redacted("OPENAI_API_KEY")
OpenAIChat.route.model({ id: "gpt-4.1-mini" })