UNPKG

@genkit-ai/anthropic

Version:

Genkit AI framework plugin for Anthropic APIs.

1 lines 11.2 kB
{"version":3,"sources":["../src/models.ts"],"sourcesContent":["/**\n * Copyright 2024 Bloom Labs Inc\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { APIError } from '@anthropic-ai/sdk';\nimport type {\n GenerateRequest,\n GenerateResponseData,\n ModelReference,\n StreamingCallback,\n} from 'genkit';\nimport {\n GenkitError,\n z,\n type ErrorResponseMetadata,\n type StatusName,\n} from 'genkit';\nimport type { GenerateResponseChunkData, ModelAction } from 'genkit/model';\nimport { modelRef } from 'genkit/model';\nimport { model } from 'genkit/plugin';\n\nimport type { ModelInfo } from 'genkit/model';\nimport { BetaRunner, Runner } from './runner/index.mjs';\nimport {\n AnthropicConfigSchema,\n resolveBetaEnabled,\n type AnthropicConfigSchemaType,\n type ClaudeModelParams,\n type ClaudeRunnerParams,\n} from './types.mjs';\nimport { checkModelName, isKnownKey } from './utils.mjs';\n\n/**\n * Parses a `Retry-After` header value into milliseconds.\n * Supports delay-seconds and HTTP-date formats (RFC 7231 §7.1.3).\n */\nfunction parseRetryAfterMs(value: string): number | undefined {\n if (!value || !value.trim()) return undefined;\n const seconds = Number(value);\n if (!isNaN(seconds) && seconds >= 0) return seconds * 1000;\n const date = new Date(value);\n if (!isNaN(date.getTime())) return Math.max(0, date.getTime() - Date.now());\n return undefined;\n}\n\n// This contains all the Anthropic config schema types\ntype ConfigSchemaType = AnthropicConfigSchemaType;\n\n/**\n * Generic Claude model info for unknown/unsupported models.\n * Used when a model name is not in KNOWN_CLAUDE_MODELS.\n */\nexport const GENERIC_MODEL_INFO: ModelInfo = {\n supports: {\n multiturn: true,\n tools: true,\n media: true,\n systemRole: true,\n output: ['text'],\n },\n};\n\n/**\n * Advanced Claude model info for models that support JSON output.\n */\nexport const ADVANCED_MODEL_INFO: ModelInfo = {\n supports: {\n multiturn: true,\n tools: true,\n media: true,\n systemRole: true,\n output: ['text', 'json'],\n constrained: 'all',\n },\n};\n\n/**\n * Creates a model reference for a Claude model.\n */\nfunction commonRef(\n name: string,\n info?: ModelInfo,\n configSchema: ConfigSchemaType = AnthropicConfigSchema\n): ModelReference<ConfigSchemaType> {\n return modelRef({\n name: `anthropic/${name}`,\n configSchema,\n info: info ?? GENERIC_MODEL_INFO,\n });\n}\n\nconst KNOWN_MODELS = {\n 'claude-opus-4-7': commonRef('claude-opus-4-7', ADVANCED_MODEL_INFO),\n 'claude-opus-4-6': commonRef('claude-opus-4-6', ADVANCED_MODEL_INFO),\n 'claude-opus-4-5': commonRef('claude-opus-4-5', ADVANCED_MODEL_INFO),\n 'claude-haiku-4-5': commonRef('claude-haiku-4-5', ADVANCED_MODEL_INFO),\n 'claude-sonnet-4-6': commonRef('claude-sonnet-4-6', ADVANCED_MODEL_INFO),\n 'claude-sonnet-4-5': commonRef('claude-sonnet-4-5', ADVANCED_MODEL_INFO),\n 'claude-opus-4-1': commonRef('claude-opus-4-1', ADVANCED_MODEL_INFO),\n 'claude-sonnet-4': commonRef('claude-sonnet-4'),\n 'claude-opus-4': commonRef('claude-opus-4'),\n} as const;\nexport type KnownClaudeModels = keyof typeof KNOWN_MODELS;\nexport type ClaudeModelName = `claude-${string}`;\n\nexport function listKnownModels(\n client: any,\n defaultApiVersion?: 'stable' | 'beta'\n): ModelAction<ConfigSchemaType>[] {\n return Object.keys(KNOWN_MODELS).map((name: string) =>\n claudeModel({ name, client, defaultApiVersion })\n );\n}\n\n/**\n * Creates the runner used by Genkit to interact with the Claude model.\n * @param params Configuration for the Claude runner.\n * @param configSchema The config schema for this model (used for type inference).\n * @returns The runner that Genkit will call when the model is invoked.\n */\nexport function claudeRunner<TConfigSchema extends z.ZodTypeAny>(\n params: ClaudeRunnerParams,\n configSchema: TConfigSchema\n) {\n const { defaultApiVersion, ...runnerParams } = params;\n\n if (!runnerParams.client) {\n throw new Error('Anthropic client is required to create a runner');\n }\n\n let stableRunner: Runner | null = null;\n let betaRunner: BetaRunner | null = null;\n\n return async (\n request: GenerateRequest<TConfigSchema>,\n {\n streamingRequested,\n sendChunk,\n abortSignal,\n }: {\n streamingRequested: boolean;\n sendChunk: StreamingCallback<GenerateResponseChunkData>;\n abortSignal: AbortSignal;\n }\n ): Promise<GenerateResponseData> => {\n // Cast to AnthropicConfigSchema for internal runner which expects the full schema\n const normalizedRequest = request as unknown as GenerateRequest<\n typeof AnthropicConfigSchema\n >;\n const isBeta = resolveBetaEnabled(\n normalizedRequest.config,\n defaultApiVersion\n );\n const runner = isBeta\n ? (betaRunner ??= new BetaRunner(runnerParams))\n : (stableRunner ??= new Runner(runnerParams));\n try {\n return await runner.run(normalizedRequest, {\n streamingRequested,\n sendChunk,\n abortSignal,\n });\n } catch (e) {\n if (e instanceof APIError) {\n let status: StatusName = 'UNKNOWN';\n switch (e.status) {\n case 429:\n status = 'RESOURCE_EXHAUSTED';\n break;\n case 401:\n status = 'UNAUTHENTICATED';\n break;\n case 403:\n status = 'PERMISSION_DENIED';\n break;\n case 400:\n status = 'INVALID_ARGUMENT';\n break;\n case 500:\n status = 'INTERNAL';\n break;\n case 503:\n case 529:\n status = 'UNAVAILABLE';\n break;\n }\n const retryAfterHeader = e.headers?.get?.('retry-after');\n const retryAfterMs = retryAfterHeader\n ? parseRetryAfterMs(retryAfterHeader)\n : undefined;\n const responseMetadata: ErrorResponseMetadata | undefined =\n retryAfterMs !== undefined ? { retryAfterMs } : undefined;\n throw new GenkitError({\n status,\n message: e.message,\n responseMetadata,\n });\n }\n throw e;\n }\n };\n}\n\n/**\n * Creates a model reference for a Claude model.\n * This allows referencing models without initializing the plugin.\n */\nexport function claudeModelReference(\n name: string,\n config: z.infer<typeof AnthropicConfigSchema> = {}\n): ModelReference<ConfigSchemaType> {\n const modelName = checkModelName(name);\n\n if (isKnownKey(modelName, KNOWN_MODELS)) {\n return KNOWN_MODELS[modelName].withConfig(config);\n }\n\n return modelRef({\n name: `anthropic/${modelName}`,\n config: config,\n configSchema: AnthropicConfigSchema,\n info: {\n ...GENERIC_MODEL_INFO,\n },\n });\n}\n\n/**\n * Defines a Claude model with the given name and Anthropic client.\n * Accepts any model name and lets the API validate it. If the model is in KNOWN_CLAUDE_MODELS, uses that modelRef\n * for better defaults; otherwise creates a generic model reference.\n */\nexport function claudeModel(\n params: ClaudeModelParams\n): ModelAction<ConfigSchemaType> {\n const { name, client: runnerClient, defaultApiVersion: apiVersion } = params;\n\n const ref = claudeModelReference(name);\n\n return model<ConfigSchemaType>(\n {\n name: ref.name,\n ...ref.info,\n configSchema: ref.configSchema!,\n },\n claudeRunner(\n {\n name,\n client: runnerClient,\n defaultApiVersion: apiVersion,\n },\n ref.configSchema!\n )\n );\n}\n\nexport const TEST_ONLY = { KNOWN_MODELS };\n"],"mappings":"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","names":[]}