@langchain/google-common 2.1.26 → 2.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/dist/auth.cjs.map +1 -1
- package/dist/auth.d.cts.map +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/chat_models.cjs +1 -1
- package/dist/chat_models.cjs.map +1 -1
- package/dist/chat_models.js +1 -1
- package/dist/chat_models.js.map +1 -1
- package/dist/connection.cjs.map +1 -1
- package/dist/connection.js.map +1 -1
- package/dist/experimental/media.cjs.map +1 -1
- package/dist/experimental/media.js.map +1 -1
- package/dist/experimental/utils/media_core.cjs.map +1 -1
- package/dist/experimental/utils/media_core.js.map +1 -1
- package/dist/llms.cjs +7 -3
- package/dist/llms.cjs.map +1 -1
- package/dist/llms.d.cts.map +1 -1
- package/dist/llms.d.ts.map +1 -1
- package/dist/llms.js +7 -3
- package/dist/llms.js.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +1 -1
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/anthropic.cjs.map +1 -1
- package/dist/utils/anthropic.js.map +1 -1
- package/dist/utils/common.cjs.map +1 -1
- package/dist/utils/common.js.map +1 -1
- package/dist/utils/failed_handler.cjs.map +1 -1
- package/dist/utils/failed_handler.js.map +1 -1
- package/dist/utils/gemini.cjs +1 -0
- package/dist/utils/gemini.cjs.map +1 -1
- package/dist/utils/gemini.d.cts.map +1 -1
- package/dist/utils/gemini.d.ts.map +1 -1
- package/dist/utils/gemini.js +1 -0
- package/dist/utils/gemini.js.map +1 -1
- package/dist/utils/safety.cjs.map +1 -1
- package/dist/utils/safety.js.map +1 -1
- package/dist/utils/stream.cjs.map +1 -1
- package/dist/utils/stream.js.map +1 -1
- package/dist/utils/zod_to_gemini_parameters.cjs.map +1 -1
- package/dist/utils/zod_to_gemini_parameters.js.map +1 -1
- package/package.json +5 -14
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["import type { BaseLLMParams } from \"@langchain/core/language_models/llms\";\nimport type {\n BaseChatModelCallOptions,\n BindToolsInput,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n BaseMessage,\n BaseMessageChunk,\n MessageContent,\n} from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, ChatResult } from \"@langchain/core/outputs\";\nimport { EmbeddingsParams } from \"@langchain/core/embeddings\";\nimport { AsyncCallerCallOptions } from \"@langchain/core/utils/async_caller\";\nimport type { JsonStream } from \"./utils/stream.js\";\nimport { MediaManager } from \"./experimental/utils/media_core.js\";\nimport {\n AnthropicResponseData,\n AnthropicAPIConfig,\n} from \"./types-anthropic.js\";\n\nexport * from \"./types-anthropic.js\";\n\n/**\n * Parameters needed to setup the client connection.\n * AuthOptions are something like GoogleAuthOptions (from google-auth-library)\n * or WebGoogleAuthOptions.\n */\nexport interface GoogleClientParams<AuthOptions> {\n authOptions?: AuthOptions;\n\n /** Some APIs allow an API key instead */\n apiKey?: string;\n}\n\n/**\n * What platform is this running on?\n * gai - Google AI Studio / MakerSuite / Generative AI platform\n * gcp - Google Cloud Platform\n */\nexport type GooglePlatformType = \"gai\" | \"gcp\";\n\nexport interface GoogleConnectionParams<\n AuthOptions,\n> extends GoogleClientParams<AuthOptions> {\n /** Hostname for the API call (if this is running on GCP) */\n endpoint?: string;\n\n /** Region where the LLM is stored (if this is running on GCP) */\n location?: string;\n\n /** The version of the API functions. Part of the path. */\n apiVersion?: string;\n\n /**\n * What platform to run the service on.\n * If not specified, the class should determine this from other\n * means. Either way, the platform actually used will be in\n * the \"platform\" getter.\n */\n platformType?: GooglePlatformType;\n\n /**\n * For compatibility with Google's libraries, should this use Vertex?\n * The \"platformType\" parmeter takes precedence.\n */\n vertexai?: boolean;\n}\n\nexport const GoogleAISafetyCategory = {\n Harassment: \"HARM_CATEGORY_HARASSMENT\",\n HARASSMENT: \"HARM_CATEGORY_HARASSMENT\",\n HARM_CATEGORY_HARASSMENT: \"HARM_CATEGORY_HARASSMENT\",\n\n HateSpeech: \"HARM_CATEGORY_HATE_SPEECH\",\n HATE_SPEECH: \"HARM_CATEGORY_HATE_SPEECH\",\n HARM_CATEGORY_HATE_SPEECH: \"HARM_CATEGORY_HATE_SPEECH\",\n\n SexuallyExplicit: \"HARM_CATEGORY_SEXUALLY_EXPLICIT\",\n SEXUALLY_EXPLICIT: \"HARM_CATEGORY_SEXUALLY_EXPLICIT\",\n HARM_CATEGORY_SEXUALLY_EXPLICIT: \"HARM_CATEGORY_SEXUALLY_EXPLICIT\",\n\n Dangerous: \"HARM_CATEGORY_DANGEROUS\",\n DANGEROUS: \"HARM_CATEGORY_DANGEROUS\",\n HARM_CATEGORY_DANGEROUS: \"HARM_CATEGORY_DANGEROUS\",\n\n CivicIntegrity: \"HARM_CATEGORY_CIVIC_INTEGRITY\",\n CIVIC_INTEGRITY: \"HARM_CATEGORY_CIVIC_INTEGRITY\",\n HARM_CATEGORY_CIVIC_INTEGRITY: \"HARM_CATEGORY_CIVIC_INTEGRITY\",\n} as const;\n\nexport type GoogleAISafetyCategory =\n (typeof GoogleAISafetyCategory)[keyof typeof GoogleAISafetyCategory];\n\nexport const GoogleAISafetyThreshold = {\n None: \"BLOCK_NONE\",\n NONE: \"BLOCK_NONE\",\n BLOCK_NONE: \"BLOCK_NONE\",\n\n Few: \"BLOCK_ONLY_HIGH\",\n FEW: \"BLOCK_ONLY_HIGH\",\n BLOCK_ONLY_HIGH: \"BLOCK_ONLY_HIGH\",\n\n Some: \"BLOCK_MEDIUM_AND_ABOVE\",\n SOME: \"BLOCK_MEDIUM_AND_ABOVE\",\n BLOCK_MEDIUM_AND_ABOVE: \"BLOCK_MEDIUM_AND_ABOVE\",\n\n Most: \"BLOCK_LOW_AND_ABOVE\",\n MOST: \"BLOCK_LOW_AND_ABOVE\",\n BLOCK_LOW_AND_ABOVE: \"BLOCK_LOW_AND_ABOVE\",\n\n Off: \"OFF\",\n OFF: \"OFF\",\n BLOCK_OFF: \"OFF\",\n} as const;\n\nexport type GoogleAISafetyThreshold =\n (typeof GoogleAISafetyThreshold)[keyof typeof GoogleAISafetyThreshold];\n\nexport const GoogleAISafetyMethod = {\n Severity: \"SEVERITY\",\n Probability: \"PROBABILITY\",\n} as const;\n\nexport type GoogleAISafetyMethod =\n (typeof GoogleAISafetyMethod)[keyof typeof GoogleAISafetyMethod];\n\nexport interface GoogleAISafetySetting {\n category: GoogleAISafetyCategory | string;\n threshold: GoogleAISafetyThreshold | string;\n method?: GoogleAISafetyMethod | string; // Just for Vertex AI?\n}\n\nexport type GoogleAIResponseMimeType = \"text/plain\" | \"application/json\";\n\nexport type GoogleAIModelModality = \"TEXT\" | \"IMAGE\" | \"AUDIO\" | string;\n\nexport type GoogleThinkingLevel =\n | \"THINKING_LEVEL_UNSPECIFIED\"\n | \"LOW\"\n | \"MEDIUM\"\n | \"HIGH\";\n\nexport interface GoogleThinkingConfig {\n thinkingBudget?: number;\n includeThoughts?: boolean;\n thinkingLevel?: GoogleThinkingLevel;\n}\n\nexport type GooglePrebuiltVoiceName = string;\n\nexport interface GooglePrebuiltVoiceConfig {\n voiceName: GooglePrebuiltVoiceName;\n}\n\nexport interface GoogleVoiceConfig {\n prebuiltVoiceConfig: GooglePrebuiltVoiceConfig;\n}\n\nexport interface GoogleSpeakerVoiceConfig {\n speaker: string;\n voiceConfig: GoogleVoiceConfig;\n}\n\nexport interface GoogleMultiSpeakerVoiceConfig {\n speakerVoiceConfigs: GoogleSpeakerVoiceConfig[];\n}\n\nexport interface GoogleSpeechConfigSingle {\n voiceConfig: GoogleVoiceConfig;\n languageCode?: string;\n}\n\nexport interface GoogleSpeechConfigMulti {\n multiSpeakerVoiceConfig: GoogleMultiSpeakerVoiceConfig;\n languageCode?: string;\n}\n\nexport type GoogleSpeechConfig =\n | GoogleSpeechConfigSingle\n | GoogleSpeechConfigMulti;\n\n/**\n * A simplified version of the GoogleSpeakerVoiceConfig\n */\nexport interface GoogleSpeechSpeakerName {\n speaker: string;\n name: GooglePrebuiltVoiceName;\n}\n\nexport type GoogleSpeechVoice =\n | GooglePrebuiltVoiceName\n | GoogleSpeechSpeakerName\n | GoogleSpeechSpeakerName[];\n\nexport interface GoogleSpeechVoiceLanguage {\n voice: GoogleSpeechVoice;\n languageCode: string;\n}\n\nexport interface GoogleSpeechVoicesLanguage {\n voices: GoogleSpeechVoice;\n languageCode: string;\n}\n\n/**\n * A simplified way to represent the voice (or voices) and language code.\n * \"voice\" and \"voices\" are semantically the same, we're not enforcing\n * that one is an array and one isn't.\n */\nexport type GoogleSpeechSimplifiedLanguage =\n | GoogleSpeechVoiceLanguage\n | GoogleSpeechVoicesLanguage;\n\n/**\n * A simplified way to represent the voices.\n * It can either be the voice (or voices), or the voice or voices with language configuration\n */\nexport type GoogleSpeechConfigSimplified =\n | GoogleSpeechVoice\n | GoogleSpeechSimplifiedLanguage;\n\nexport interface GoogleModelParams {\n /** Model to use */\n model?: string;\n\n /**\n * Model to use\n * Alias for `model`\n */\n modelName?: string;\n}\n\nexport interface GoogleAIModelParams extends GoogleModelParams {\n /** Sampling temperature to use */\n temperature?: number;\n\n /**\n * Maximum number of tokens to generate in the completion.\n * This may include reasoning tokens (for backwards compatibility).\n */\n maxOutputTokens?: number;\n\n /**\n * The maximum number of the output tokens that will be used\n * for the \"thinking\" or \"reasoning\" stages.\n */\n maxReasoningTokens?: number;\n\n /**\n * An alias for \"maxReasoningTokens\"\n */\n thinkingBudget?: number;\n\n /**\n * An OpenAI compatible parameter that will map to \"maxReasoningTokens\"\n */\n reasoningEffort?: \"low\" | \"medium\" | \"high\";\n\n /**\n * Optional. The level of thoughts tokens that the model should generate.\n * Can be specified directly or via reasoningLevel for OpenAI compatibility.\n */\n thinkingLevel?: GoogleThinkingLevel;\n\n /**\n * An OpenAI compatible parameter that will map to \"thinkingLevel\"\n */\n reasoningLevel?: \"low\" | \"medium\" | \"high\";\n\n /**\n * Top-p changes how the model selects tokens for output.\n *\n * Tokens are selected from most probable to least until the sum\n * of their probabilities equals the top-p value.\n *\n * For example, if tokens A, B, and C have a probability of\n * .3, .2, and .1 and the top-p value is .5, then the model will\n * select either A or B as the next token (using temperature).\n */\n topP?: number;\n\n /**\n * Top-k changes how the model selects tokens for output.\n *\n * A top-k of 1 means the selected token is the most probable among\n * all tokens in the model’s vocabulary (also called greedy decoding),\n * while a top-k of 3 means that the next token is selected from\n * among the 3 most probable tokens (using temperature).\n */\n topK?: number;\n\n /**\n * Seed used in decoding. If not set, the request uses a randomly generated seed.\n */\n seed?: number;\n\n /**\n * Presence penalty applied to the next token's logprobs\n * if the token has already been seen in the response.\n * This penalty is binary on/off and not dependant on the\n * number of times the token is used (after the first).\n * Use frequencyPenalty for a penalty that increases with each use.\n * A positive penalty will discourage the use of tokens that have\n * already been used in the response, increasing the vocabulary.\n * A negative penalty will encourage the use of tokens that have\n * already been used in the response, decreasing the vocabulary.\n */\n presencePenalty?: number;\n\n /**\n * Frequency penalty applied to the next token's logprobs,\n * multiplied by the number of times each token has been seen\n * in the respponse so far.\n * A positive penalty will discourage the use of tokens that\n * have already been used, proportional to the number of times\n * the token has been used:\n * The more a token is used, the more dificult it is for the model\n * to use that token again increasing the vocabulary of responses.\n * Caution: A _negative_ penalty will encourage the model to reuse\n * tokens proportional to the number of times the token has been used.\n * Small negative values will reduce the vocabulary of a response.\n * Larger negative values will cause the model to start repeating\n * a common token until it hits the maxOutputTokens limit.\n */\n frequencyPenalty?: number;\n\n stopSequences?: string[];\n\n safetySettings?: GoogleAISafetySetting[];\n\n convertSystemMessageToHumanContent?: boolean;\n\n /**\n * Available for `gemini-1.5-pro`.\n * The output format of the generated candidate text.\n * Supported MIME types:\n * - `text/plain`: Text output.\n * - `application/json`: JSON response in the candidates.\n *\n * @default \"text/plain\"\n */\n responseMimeType?: GoogleAIResponseMimeType;\n\n /**\n * The schema that the model's output should conform to.\n * When this is set, the model will output JSON that conforms to the schema.\n */\n responseSchema?: GeminiJsonSchema;\n\n /**\n * Whether or not to stream.\n * @default false\n */\n streaming?: boolean;\n\n /**\n * Whether to return log probabilities of the output tokens or not.\n * If true, returns the log probabilities of each output token\n * returned in the content of message.\n */\n logprobs?: boolean;\n\n /**\n * An integer between 0 and 5 specifying the number of\n * most likely tokens to return at each token position,\n * each with an associated log probability.\n * logprobs must be set to true if this parameter is used.\n */\n topLogprobs?: number;\n\n /**\n * The modalities of the response.\n */\n responseModalities?: GoogleAIModelModality[];\n\n /**\n * Custom metadata labels to associate with the request.\n * Only supported on Vertex AI (Google Cloud Platform).\n * Labels are key-value pairs where both keys and values must be strings.\n *\n * Example:\n * ```typescript\n * {\n * labels: {\n * \"team\": \"research\",\n * \"component\": \"frontend\",\n * \"environment\": \"production\"\n * }\n * }\n * ```\n */\n labels?: Record<string, string>;\n\n /**\n * Speech generation configuration.\n * You can use either Google's definition of the speech configuration,\n * or a simplified version we've defined (which can be as simple\n * as the name of a pre-defined voice).\n */\n speechConfig?: GoogleSpeechConfig | GoogleSpeechConfigSimplified;\n}\n\nexport type GoogleAIToolType = BindToolsInput | GeminiTool;\n\n/**\n * The params which can be passed to the API at request time.\n */\nexport interface GoogleAIModelRequestParams extends GoogleAIModelParams {\n tools?: GoogleAIToolType[];\n /**\n * Force the model to use tools in a specific way.\n *\n * | Mode |\tDescription |\n * |----------|---------------------------------------------------------------------------------------------------------------------------------------------------------|\n * | \"auto\"\t | The default model behavior. The model decides whether to predict a function call or a natural language response. |\n * | \"any\"\t | The model must predict only function calls. To limit the model to a subset of functions, define the allowed function names in `allowed_function_names`. |\n * | \"none\"\t | The model must not predict function calls. This behavior is equivalent to a model request without any associated function declarations. |\n * | string | The string value must be one of the function names. This will force the model to predict the specified function call. |\n *\n * The tool configuration's \"any\" mode (\"forced function calling\") is supported for Gemini 1.5 Pro models only.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tool_choice?: string | \"auto\" | \"any\" | \"none\" | Record<string, any>;\n /**\n * Allowed functions to call when the mode is \"any\".\n * If empty, any one of the provided functions are called.\n */\n allowed_function_names?: string[];\n\n /**\n * Used to specify a previously created context cache to use with generation.\n * For Vertex, this should be of the form:\n * \"projects/PROJECT_NUMBER/locations/LOCATION/cachedContents/CACHE_ID\",\n *\n * See these guides for more information on how to use context caching:\n * https://cloud.google.com/vertex-ai/generative-ai/docs/context-cache/context-cache-create\n * https://cloud.google.com/vertex-ai/generative-ai/docs/context-cache/context-cache-use\n */\n cachedContent?: string;\n\n /**\n * The schema that the model's output should conform to.\n * When this is set, the model will output JSON that conforms to the schema.\n */\n responseSchema?: GeminiJsonSchema;\n}\n\nexport interface GoogleAIBaseLLMInput<AuthOptions>\n extends\n BaseLLMParams,\n GoogleConnectionParams<AuthOptions>,\n GoogleAIModelParams,\n GoogleAISafetyParams,\n GoogleAIAPIParams {}\n\nexport interface GoogleAIBaseLanguageModelCallOptions\n extends\n BaseChatModelCallOptions,\n GoogleAIModelRequestParams,\n GoogleAISafetyParams {\n /**\n * Whether or not to include usage data, like token counts\n * in the streamed response chunks.\n * @default true\n */\n streamUsage?: boolean;\n}\n\n/**\n * Input to LLM class.\n */\nexport interface GoogleBaseLLMInput<\n AuthOptions,\n> extends GoogleAIBaseLLMInput<AuthOptions> {}\n\nexport interface GoogleResponse {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data: any;\n}\n\nexport interface GoogleRawResponse extends GoogleResponse {\n data: Blob;\n}\n\nexport interface GeminiPartBase {\n thought?: boolean; // Output only\n thoughtSignature?: string;\n}\n\nexport interface GeminiVideoMetadata {\n fps?: number; // Double in range (0.0, 24.0]\n startOffset?: string;\n endOffset?: string;\n}\n\nexport interface GeminiPartBaseFile extends GeminiPartBase {\n videoMetadata?: GeminiVideoMetadata;\n}\n\nexport interface GeminiPartText extends GeminiPartBase {\n text: string;\n}\n\nexport interface GeminiPartInlineData extends GeminiPartBaseFile {\n inlineData: {\n mimeType: string;\n data: string;\n };\n}\n\nexport interface GeminiPartFileData extends GeminiPartBaseFile {\n fileData: {\n mimeType: string;\n fileUri: string;\n };\n}\n\n// AI Studio only?\nexport interface GeminiPartFunctionCall extends GeminiPartBase {\n functionCall: {\n name: string;\n args?: object;\n };\n}\n\n// AI Studio Only?\nexport interface GeminiPartFunctionResponse extends GeminiPartBase {\n functionResponse: {\n name: string;\n response: object;\n };\n}\n\nexport type GeminiPart =\n | GeminiPartText\n | GeminiPartInlineData\n | GeminiPartFileData\n | GeminiPartFunctionCall\n | GeminiPartFunctionResponse;\n\nexport interface GeminiSafetySetting {\n category: string;\n threshold: string;\n}\n\nexport type GeminiSafetyRating = {\n category: string;\n probability: string;\n} & Record<string, unknown>;\n\nexport interface GeminiCitationMetadata {\n citations: GeminiCitation[];\n}\n\nexport interface GeminiCitation {\n startIndex: number;\n endIndex: number;\n uri: string;\n title: string;\n license: string;\n publicationDate: GoogleTypeDate;\n}\n\nexport interface GoogleTypeDate {\n year: number; // 1-9999 or 0 to specify a date without a year\n month: number; // 1-12 or 0 to specify a year without a month and day\n day: number; // Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn't significant\n}\n\nexport interface GeminiGroundingMetadata {\n webSearchQueries?: string[];\n searchEntryPoint?: GeminiSearchEntryPoint;\n groundingChunks: GeminiGroundingChunk[];\n groundingSupports?: GeminiGroundingSupport[];\n retrievalMetadata?: GeminiRetrievalMetadata;\n}\n\nexport interface GeminiSearchEntryPoint {\n renderedContent?: string;\n sdkBlob?: string; // Base64 encoded JSON representing array of tuple.\n}\n\nexport interface GeminiGroundingChunk {\n web: GeminiGroundingChunkWeb;\n retrievedContext: GeminiGroundingChunkRetrievedContext;\n}\n\nexport interface GeminiGroundingChunkWeb {\n uri: string;\n title: string;\n}\n\nexport interface GeminiGroundingChunkRetrievedContext {\n uri: string;\n title: string;\n text: string;\n}\n\nexport interface GeminiGroundingSupport {\n segment: GeminiSegment;\n groundingChunkIndices: number[];\n confidenceScores: number[];\n}\n\nexport interface GeminiSegment {\n partIndex: number;\n startIndex: number;\n endIndex: number;\n text: string;\n}\n\nexport interface GeminiRetrievalMetadata {\n googleSearchDynamicRetrievalScore: number;\n}\n\nexport type GeminiUrlRetrievalStatus =\n | \"URL_RETRIEVAL_STATUS_SUCCESS\"\n | \"URL_RETRIEVAL_STATUS_ERROR\";\n\nexport interface GeminiUrlRetrievalContext {\n retrievedUrl: string;\n urlRetrievalStatus: GeminiUrlRetrievalStatus;\n}\n\nexport interface GeminiUrlRetrievalMetadata {\n urlRetrievalContexts: GeminiUrlRetrievalContext[];\n}\n\nexport type GeminiUrlMetadata = GeminiUrlRetrievalContext;\n\nexport interface GeminiUrlContextMetadata {\n urlMetadata: GeminiUrlMetadata[];\n}\n\nexport interface GeminiLogprobsResult {\n topCandidates: GeminiLogprobsTopCandidate[];\n chosenCandidates: GeminiLogprobsResultCandidate[];\n}\n\nexport interface GeminiLogprobsTopCandidate {\n candidates: GeminiLogprobsResultCandidate[];\n}\n\nexport interface GeminiLogprobsResultCandidate {\n token: string;\n tokenId: number;\n logProbability: number;\n}\n\n// The \"system\" content appears to only be valid in the systemInstruction\nexport type GeminiRole = \"system\" | \"user\" | \"model\" | \"function\";\n\nexport interface GeminiContent {\n parts: GeminiPart[];\n role: GeminiRole; // Vertex AI requires the role\n}\n\n/*\n * If additional attributes are added here, they should also be\n * added to the attributes below\n */\nexport interface GeminiTool {\n functionDeclarations?: GeminiFunctionDeclaration[];\n googleSearchRetrieval?: GoogleSearchRetrieval; // Gemini-1.5\n googleSearch?: GoogleSearch; // Gemini-2.0\n urlContext?: UrlContext;\n retrieval?: VertexAIRetrieval;\n}\n\n/*\n * The known strings in this type should match those in GeminiSearchToolAttribuets\n */\nexport type GoogleSearchToolSetting =\n | boolean\n | \"googleSearchRetrieval\"\n | \"googleSearch\"\n | string;\n\nexport const GeminiSearchToolAttributes = [\n \"googleSearchRetrieval\",\n \"googleSearch\",\n];\n\nexport const GeminiToolAttributes = [\n \"functionDeclaration\",\n \"retrieval\",\n \"urlContext\",\n ...GeminiSearchToolAttributes,\n];\n\nexport interface GoogleSearchRetrieval {\n dynamicRetrievalConfig?: {\n mode?: string;\n dynamicThreshold?: number;\n };\n}\n\nexport interface GoogleSearch {}\n\nexport interface UrlContext {}\n\nexport interface VertexAIRetrieval {\n vertexAiSearch: {\n datastore: string;\n };\n disableAttribution?: boolean;\n}\n\nexport interface GeminiFunctionDeclaration {\n name: string;\n description: string;\n parameters?: GeminiFunctionSchema;\n}\n\nexport interface GeminiFunctionSchema {\n type: GeminiFunctionSchemaType;\n format?: string;\n description?: string;\n nullable?: boolean;\n enum?: string[];\n properties?: Record<string, GeminiFunctionSchema>;\n required?: string[];\n items?: GeminiFunctionSchema;\n}\n\nexport type GeminiFunctionSchemaType =\n | \"string\"\n | \"number\"\n | \"integer\"\n | \"boolean\"\n | \"array\"\n | \"object\";\n\nexport interface GeminiGenerationConfig {\n stopSequences?: string[];\n candidateCount?: number;\n maxOutputTokens?: number;\n temperature?: number;\n topP?: number;\n topK?: number;\n seed?: number;\n presencePenalty?: number;\n frequencyPenalty?: number;\n responseMimeType?: GoogleAIResponseMimeType;\n responseLogprobs?: boolean;\n logprobs?: number;\n responseModalities?: GoogleAIModelModality[];\n thinkingConfig?: GoogleThinkingConfig;\n speechConfig?: GoogleSpeechConfig;\n responseSchema?: GeminiJsonSchema;\n}\n\nexport interface GeminiRequest {\n contents?: GeminiContent[];\n systemInstruction?: GeminiContent;\n tools?: GeminiTool[];\n toolConfig?: {\n functionCallingConfig: {\n mode: \"auto\" | \"any\" | \"none\";\n allowedFunctionNames?: string[];\n };\n };\n safetySettings?: GeminiSafetySetting[];\n generationConfig?: GeminiGenerationConfig;\n cachedContent?: string;\n\n /**\n * Custom metadata labels to associate with the API call.\n */\n labels?: Record<string, string>;\n}\n\nexport interface GeminiResponseCandidate {\n content: {\n parts: GeminiPart[];\n role: string;\n };\n finishReason: string;\n index: number;\n tokenCount?: number;\n safetyRatings: GeminiSafetyRating[];\n citationMetadata?: GeminiCitationMetadata;\n groundingMetadata?: GeminiGroundingMetadata;\n urlRetrievalMetadata?: GeminiUrlRetrievalMetadata;\n urlContextMetadata?: GeminiUrlContextMetadata;\n avgLogprobs?: number;\n logprobsResult: GeminiLogprobsResult;\n finishMessage?: string;\n}\n\ninterface GeminiResponsePromptFeedback {\n blockReason?: string;\n safetyRatings: GeminiSafetyRating[];\n}\n\nexport type ModalityEnum =\n | \"TEXT\"\n | \"IMAGE\"\n | \"VIDEO\"\n | \"AUDIO\"\n | \"DOCUMENT\"\n | string;\n\nexport interface ModalityTokenCount {\n modality: ModalityEnum;\n tokenCount: number;\n}\n\nexport interface GenerateContentResponseUsageMetadata {\n promptTokenCount: number;\n toolUsePromptTokenCount: number;\n cachedContentTokenCount: number;\n thoughtsTokenCount: number;\n candidatesTokenCount: number;\n totalTokenCount: number;\n\n promptTokensDetails: ModalityTokenCount[];\n toolUsePromptTokensDetails: ModalityTokenCount[];\n cacheTokensDetails: ModalityTokenCount[];\n candidatesTokensDetails: ModalityTokenCount[];\n\n [key: string]: unknown;\n}\n\nexport interface GenerateContentResponseData {\n candidates: GeminiResponseCandidate[];\n promptFeedback: GeminiResponsePromptFeedback;\n usageMetadata: GenerateContentResponseUsageMetadata;\n}\n\nexport type GoogleLLMModelFamily = null | \"palm\" | \"gemini\" | \"gemma\";\n\nexport type VertexModelFamily = GoogleLLMModelFamily | \"claude\";\n\nexport type GoogleLLMResponseData =\n | JsonStream\n | GenerateContentResponseData\n | GenerateContentResponseData[];\n\nexport interface GoogleLLMResponse extends GoogleResponse {\n data: GoogleLLMResponseData | AnthropicResponseData;\n}\n\nexport interface GoogleAISafetyHandler {\n /**\n * A function that will take a response and return the, possibly modified,\n * response or throw an exception if there are safety issues.\n *\n * @throws GoogleAISafetyError\n */\n handle(response: GoogleLLMResponse): GoogleLLMResponse;\n}\n\nexport interface GoogleAISafetyParams {\n safetyHandler?: GoogleAISafetyHandler;\n}\n\nexport type GeminiJsonSchema = Record<string, unknown> & {\n properties?: Record<string, GeminiJsonSchema>;\n type: GeminiFunctionSchemaType;\n nullable?: boolean;\n};\n\nexport interface GeminiJsonSchemaDirty extends GeminiJsonSchema {\n items?: GeminiJsonSchemaDirty;\n properties?: Record<string, GeminiJsonSchemaDirty>;\n additionalProperties?: boolean;\n}\n\nexport type GoogleAIAPI = {\n messageContentToParts?: (content: MessageContent) => Promise<GeminiPart[]>;\n\n baseMessageToContent?: (\n message: BaseMessage,\n prevMessage: BaseMessage | undefined,\n useSystemInstruction: boolean\n ) => Promise<GeminiContent[]>;\n\n responseToString: (response: GoogleLLMResponse) => string;\n\n responseToChatGeneration: (\n response: GoogleLLMResponse\n ) => ChatGenerationChunk | null;\n\n chunkToString: (chunk: BaseMessageChunk) => string;\n\n responseToBaseMessage: (response: GoogleLLMResponse) => BaseMessage;\n\n responseToChatResult: (response: GoogleLLMResponse) => ChatResult;\n\n formatData: (\n input: unknown,\n parameters: GoogleAIModelRequestParams\n ) => Promise<unknown>;\n};\n\nexport interface GeminiAPIConfig {\n safetyHandler?: GoogleAISafetyHandler;\n mediaManager?: MediaManager;\n useSystemInstruction?: boolean;\n\n /**\n * How to handle the Google Search tool, since the name (and format)\n * of the tool changes between Gemini 1.5 and Gemini 2.0.\n * true - Change based on the model version. (Default)\n * false - Do not change the tool name provided\n * string value - Use this as the attribute name for the search\n * tool, adapting any tool attributes if possible.\n * When the model is created, a \"true\" or default setting\n * will be changed to a string based on the model.\n */\n googleSearchToolAdjustment?: GoogleSearchToolSetting;\n}\n\nexport type GoogleAIAPIConfig = GeminiAPIConfig | AnthropicAPIConfig;\n\nexport interface GoogleAIAPIParams {\n apiName?: string;\n apiConfig?: GoogleAIAPIConfig;\n}\n\n// Embeddings\n\n/**\n * Defines the parameters required to initialize a\n * GoogleEmbeddings instance. It extends EmbeddingsParams and\n * GoogleConnectionParams.\n */\nexport interface BaseGoogleEmbeddingsParams<AuthOptions>\n extends EmbeddingsParams, GoogleConnectionParams<AuthOptions> {\n model: string;\n\n /**\n * Used to specify output embedding size.\n * If set, output embeddings will be truncated to the size specified.\n */\n dimensions?: number;\n\n /**\n * An alias for \"dimensions\"\n */\n outputDimensionality?: number;\n}\n\n/**\n * Defines additional options specific to the\n * GoogleEmbeddingsInstance. It extends AsyncCallerCallOptions.\n */\nexport interface BaseGoogleEmbeddingsOptions extends AsyncCallerCallOptions {}\n\nexport type GoogleEmbeddingsTaskType =\n | \"RETRIEVAL_QUERY\"\n | \"RETRIEVAL_DOCUMENT\"\n | \"SEMANTIC_SIMILARITY\"\n | \"CLASSIFICATION\"\n | \"CLUSTERING\"\n | \"QUESTION_ANSWERING\"\n | \"FACT_VERIFICATION\"\n | \"CODE_RETRIEVAL_QUERY\"\n | string;\n\n/**\n * Represents an instance for generating embeddings using the Google\n * Vertex AI API. It contains the content to be embedded.\n */\nexport interface VertexEmbeddingsInstance {\n content: string;\n taskType?: GoogleEmbeddingsTaskType;\n title?: string;\n}\n\nexport interface VertexEmbeddingsParameters extends GoogleModelParams {\n autoTruncate?: boolean;\n outputDimensionality?: number;\n}\n\nexport interface VertexEmbeddingsRequest {\n instances: VertexEmbeddingsInstance[];\n parameters?: VertexEmbeddingsParameters;\n}\n\nexport interface AIStudioEmbeddingsRequest {\n content: {\n parts: GeminiPartText[];\n };\n model?: string; // Documentation says required, but tests say otherwise\n taskType?: GoogleEmbeddingsTaskType;\n title?: string;\n outputDimensionality?: number;\n}\n\nexport type GoogleEmbeddingsRequest =\n | VertexEmbeddingsRequest\n | AIStudioEmbeddingsRequest;\n\nexport interface VertexEmbeddingsResponsePrediction {\n embeddings: {\n statistics: {\n token_count: number;\n truncated: boolean;\n };\n values: number[];\n };\n}\n\n/**\n * Defines the structure of the embeddings results returned by the Google\n * Vertex AI API. It extends GoogleBasePrediction and contains the\n * embeddings and their statistics.\n */\nexport interface VertexEmbeddingsResponse extends GoogleResponse {\n data: {\n predictions: VertexEmbeddingsResponsePrediction[];\n };\n}\n\nexport interface AIStudioEmbeddingsResponse extends GoogleResponse {\n data: {\n embedding: {\n values: number[];\n };\n };\n}\n\nexport type GoogleEmbeddingsResponse =\n | VertexEmbeddingsResponse\n | AIStudioEmbeddingsResponse;\n"],"mappings":";AAoEA,MAAa,yBAAyB;CACpC,YAAY;CACZ,YAAY;CACZ,0BAA0B;CAE1B,YAAY;CACZ,aAAa;CACb,2BAA2B;CAE3B,kBAAkB;CAClB,mBAAmB;CACnB,iCAAiC;CAEjC,WAAW;CACX,WAAW;CACX,yBAAyB;CAEzB,gBAAgB;CAChB,iBAAiB;CACjB,+BAA+B;CAChC;AAKD,MAAa,0BAA0B;CACrC,MAAM;CACN,MAAM;CACN,YAAY;CAEZ,KAAK;CACL,KAAK;CACL,iBAAiB;CAEjB,MAAM;CACN,MAAM;CACN,wBAAwB;CAExB,MAAM;CACN,MAAM;CACN,qBAAqB;CAErB,KAAK;CACL,KAAK;CACL,WAAW;CACZ;AAKD,MAAa,uBAAuB;CAClC,UAAU;CACV,aAAa;CACd;AA6iBD,MAAa,6BAA6B,CACxC,yBACA,eACD;AAED,MAAa,uBAAuB;CAClC;CACA;CACA;CACA,GAAG;CACJ"}
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["import type { BaseLLMParams } from \"@langchain/core/language_models/llms\";\nimport type {\n BaseChatModelCallOptions,\n BindToolsInput,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n BaseMessage,\n BaseMessageChunk,\n MessageContent,\n} from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, ChatResult } from \"@langchain/core/outputs\";\nimport { EmbeddingsParams } from \"@langchain/core/embeddings\";\nimport { AsyncCallerCallOptions } from \"@langchain/core/utils/async_caller\";\nimport type { JsonStream } from \"./utils/stream.js\";\nimport { MediaManager } from \"./experimental/utils/media_core.js\";\nimport {\n AnthropicResponseData,\n AnthropicAPIConfig,\n} from \"./types-anthropic.js\";\n\nexport * from \"./types-anthropic.js\";\n\n/**\n * Parameters needed to setup the client connection.\n * AuthOptions are something like GoogleAuthOptions (from google-auth-library)\n * or WebGoogleAuthOptions.\n */\nexport interface GoogleClientParams<AuthOptions> {\n authOptions?: AuthOptions;\n\n /** Some APIs allow an API key instead */\n apiKey?: string;\n}\n\n/**\n * What platform is this running on?\n * gai - Google AI Studio / MakerSuite / Generative AI platform\n * gcp - Google Cloud Platform\n */\nexport type GooglePlatformType = \"gai\" | \"gcp\";\n\nexport interface GoogleConnectionParams<\n AuthOptions,\n> extends GoogleClientParams<AuthOptions> {\n /** Hostname for the API call (if this is running on GCP) */\n endpoint?: string;\n\n /** Region where the LLM is stored (if this is running on GCP) */\n location?: string;\n\n /** The version of the API functions. Part of the path. */\n apiVersion?: string;\n\n /**\n * What platform to run the service on.\n * If not specified, the class should determine this from other\n * means. Either way, the platform actually used will be in\n * the \"platform\" getter.\n */\n platformType?: GooglePlatformType;\n\n /**\n * For compatibility with Google's libraries, should this use Vertex?\n * The \"platformType\" parmeter takes precedence.\n */\n vertexai?: boolean;\n}\n\nexport const GoogleAISafetyCategory = {\n Harassment: \"HARM_CATEGORY_HARASSMENT\",\n HARASSMENT: \"HARM_CATEGORY_HARASSMENT\",\n HARM_CATEGORY_HARASSMENT: \"HARM_CATEGORY_HARASSMENT\",\n\n HateSpeech: \"HARM_CATEGORY_HATE_SPEECH\",\n HATE_SPEECH: \"HARM_CATEGORY_HATE_SPEECH\",\n HARM_CATEGORY_HATE_SPEECH: \"HARM_CATEGORY_HATE_SPEECH\",\n\n SexuallyExplicit: \"HARM_CATEGORY_SEXUALLY_EXPLICIT\",\n SEXUALLY_EXPLICIT: \"HARM_CATEGORY_SEXUALLY_EXPLICIT\",\n HARM_CATEGORY_SEXUALLY_EXPLICIT: \"HARM_CATEGORY_SEXUALLY_EXPLICIT\",\n\n Dangerous: \"HARM_CATEGORY_DANGEROUS\",\n DANGEROUS: \"HARM_CATEGORY_DANGEROUS\",\n HARM_CATEGORY_DANGEROUS: \"HARM_CATEGORY_DANGEROUS\",\n\n CivicIntegrity: \"HARM_CATEGORY_CIVIC_INTEGRITY\",\n CIVIC_INTEGRITY: \"HARM_CATEGORY_CIVIC_INTEGRITY\",\n HARM_CATEGORY_CIVIC_INTEGRITY: \"HARM_CATEGORY_CIVIC_INTEGRITY\",\n} as const;\n\nexport type GoogleAISafetyCategory =\n (typeof GoogleAISafetyCategory)[keyof typeof GoogleAISafetyCategory];\n\nexport const GoogleAISafetyThreshold = {\n None: \"BLOCK_NONE\",\n NONE: \"BLOCK_NONE\",\n BLOCK_NONE: \"BLOCK_NONE\",\n\n Few: \"BLOCK_ONLY_HIGH\",\n FEW: \"BLOCK_ONLY_HIGH\",\n BLOCK_ONLY_HIGH: \"BLOCK_ONLY_HIGH\",\n\n Some: \"BLOCK_MEDIUM_AND_ABOVE\",\n SOME: \"BLOCK_MEDIUM_AND_ABOVE\",\n BLOCK_MEDIUM_AND_ABOVE: \"BLOCK_MEDIUM_AND_ABOVE\",\n\n Most: \"BLOCK_LOW_AND_ABOVE\",\n MOST: \"BLOCK_LOW_AND_ABOVE\",\n BLOCK_LOW_AND_ABOVE: \"BLOCK_LOW_AND_ABOVE\",\n\n Off: \"OFF\",\n OFF: \"OFF\",\n BLOCK_OFF: \"OFF\",\n} as const;\n\nexport type GoogleAISafetyThreshold =\n (typeof GoogleAISafetyThreshold)[keyof typeof GoogleAISafetyThreshold];\n\nexport const GoogleAISafetyMethod = {\n Severity: \"SEVERITY\",\n Probability: \"PROBABILITY\",\n} as const;\n\nexport type GoogleAISafetyMethod =\n (typeof GoogleAISafetyMethod)[keyof typeof GoogleAISafetyMethod];\n\nexport interface GoogleAISafetySetting {\n category: GoogleAISafetyCategory | string;\n threshold: GoogleAISafetyThreshold | string;\n method?: GoogleAISafetyMethod | string; // Just for Vertex AI?\n}\n\nexport type GoogleAIResponseMimeType = \"text/plain\" | \"application/json\";\n\nexport type GoogleAIModelModality = \"TEXT\" | \"IMAGE\" | \"AUDIO\" | string;\n\nexport type GoogleThinkingLevel =\n | \"THINKING_LEVEL_UNSPECIFIED\"\n | \"MINIMAL\"\n | \"LOW\"\n | \"MEDIUM\"\n | \"HIGH\";\n\nexport interface GoogleThinkingConfig {\n thinkingBudget?: number;\n includeThoughts?: boolean;\n thinkingLevel?: GoogleThinkingLevel;\n}\n\nexport type GooglePrebuiltVoiceName = string;\n\nexport interface GooglePrebuiltVoiceConfig {\n voiceName: GooglePrebuiltVoiceName;\n}\n\nexport interface GoogleVoiceConfig {\n prebuiltVoiceConfig: GooglePrebuiltVoiceConfig;\n}\n\nexport interface GoogleSpeakerVoiceConfig {\n speaker: string;\n voiceConfig: GoogleVoiceConfig;\n}\n\nexport interface GoogleMultiSpeakerVoiceConfig {\n speakerVoiceConfigs: GoogleSpeakerVoiceConfig[];\n}\n\nexport interface GoogleSpeechConfigSingle {\n voiceConfig: GoogleVoiceConfig;\n languageCode?: string;\n}\n\nexport interface GoogleSpeechConfigMulti {\n multiSpeakerVoiceConfig: GoogleMultiSpeakerVoiceConfig;\n languageCode?: string;\n}\n\nexport type GoogleSpeechConfig =\n | GoogleSpeechConfigSingle\n | GoogleSpeechConfigMulti;\n\n/**\n * A simplified version of the GoogleSpeakerVoiceConfig\n */\nexport interface GoogleSpeechSpeakerName {\n speaker: string;\n name: GooglePrebuiltVoiceName;\n}\n\nexport type GoogleSpeechVoice =\n | GooglePrebuiltVoiceName\n | GoogleSpeechSpeakerName\n | GoogleSpeechSpeakerName[];\n\nexport interface GoogleSpeechVoiceLanguage {\n voice: GoogleSpeechVoice;\n languageCode: string;\n}\n\nexport interface GoogleSpeechVoicesLanguage {\n voices: GoogleSpeechVoice;\n languageCode: string;\n}\n\n/**\n * A simplified way to represent the voice (or voices) and language code.\n * \"voice\" and \"voices\" are semantically the same, we're not enforcing\n * that one is an array and one isn't.\n */\nexport type GoogleSpeechSimplifiedLanguage =\n | GoogleSpeechVoiceLanguage\n | GoogleSpeechVoicesLanguage;\n\n/**\n * A simplified way to represent the voices.\n * It can either be the voice (or voices), or the voice or voices with language configuration\n */\nexport type GoogleSpeechConfigSimplified =\n | GoogleSpeechVoice\n | GoogleSpeechSimplifiedLanguage;\n\nexport interface GoogleModelParams {\n /** Model to use */\n model?: string;\n\n /**\n * Model to use\n * Alias for `model`\n */\n modelName?: string;\n}\n\nexport interface GoogleAIModelParams extends GoogleModelParams {\n /** Sampling temperature to use */\n temperature?: number;\n\n /**\n * Maximum number of tokens to generate in the completion.\n * This may include reasoning tokens (for backwards compatibility).\n */\n maxOutputTokens?: number;\n\n /**\n * The maximum number of the output tokens that will be used\n * for the \"thinking\" or \"reasoning\" stages.\n */\n maxReasoningTokens?: number;\n\n /**\n * An alias for \"maxReasoningTokens\"\n */\n thinkingBudget?: number;\n\n /**\n * An OpenAI compatible parameter that will map to \"maxReasoningTokens\"\n */\n reasoningEffort?: \"low\" | \"medium\" | \"high\";\n\n /**\n * Optional. The level of thoughts tokens that the model should generate.\n * Can be specified directly or via reasoningLevel for OpenAI compatibility.\n */\n thinkingLevel?: GoogleThinkingLevel;\n\n /**\n * An OpenAI compatible parameter that will map to \"thinkingLevel\"\n */\n reasoningLevel?: \"low\" | \"medium\" | \"high\";\n\n /**\n * Top-p changes how the model selects tokens for output.\n *\n * Tokens are selected from most probable to least until the sum\n * of their probabilities equals the top-p value.\n *\n * For example, if tokens A, B, and C have a probability of\n * .3, .2, and .1 and the top-p value is .5, then the model will\n * select either A or B as the next token (using temperature).\n */\n topP?: number;\n\n /**\n * Top-k changes how the model selects tokens for output.\n *\n * A top-k of 1 means the selected token is the most probable among\n * all tokens in the model’s vocabulary (also called greedy decoding),\n * while a top-k of 3 means that the next token is selected from\n * among the 3 most probable tokens (using temperature).\n */\n topK?: number;\n\n /**\n * Seed used in decoding. If not set, the request uses a randomly generated seed.\n */\n seed?: number;\n\n /**\n * Presence penalty applied to the next token's logprobs\n * if the token has already been seen in the response.\n * This penalty is binary on/off and not dependant on the\n * number of times the token is used (after the first).\n * Use frequencyPenalty for a penalty that increases with each use.\n * A positive penalty will discourage the use of tokens that have\n * already been used in the response, increasing the vocabulary.\n * A negative penalty will encourage the use of tokens that have\n * already been used in the response, decreasing the vocabulary.\n */\n presencePenalty?: number;\n\n /**\n * Frequency penalty applied to the next token's logprobs,\n * multiplied by the number of times each token has been seen\n * in the respponse so far.\n * A positive penalty will discourage the use of tokens that\n * have already been used, proportional to the number of times\n * the token has been used:\n * The more a token is used, the more dificult it is for the model\n * to use that token again increasing the vocabulary of responses.\n * Caution: A _negative_ penalty will encourage the model to reuse\n * tokens proportional to the number of times the token has been used.\n * Small negative values will reduce the vocabulary of a response.\n * Larger negative values will cause the model to start repeating\n * a common token until it hits the maxOutputTokens limit.\n */\n frequencyPenalty?: number;\n\n stopSequences?: string[];\n\n safetySettings?: GoogleAISafetySetting[];\n\n convertSystemMessageToHumanContent?: boolean;\n\n /**\n * Available for `gemini-1.5-pro`.\n * The output format of the generated candidate text.\n * Supported MIME types:\n * - `text/plain`: Text output.\n * - `application/json`: JSON response in the candidates.\n *\n * @default \"text/plain\"\n */\n responseMimeType?: GoogleAIResponseMimeType;\n\n /**\n * The schema that the model's output should conform to.\n * When this is set, the model will output JSON that conforms to the schema.\n */\n responseSchema?: GeminiJsonSchema;\n\n /**\n * Whether or not to stream.\n * @default false\n */\n streaming?: boolean;\n\n /**\n * Whether to return log probabilities of the output tokens or not.\n * If true, returns the log probabilities of each output token\n * returned in the content of message.\n */\n logprobs?: boolean;\n\n /**\n * An integer between 0 and 5 specifying the number of\n * most likely tokens to return at each token position,\n * each with an associated log probability.\n * logprobs must be set to true if this parameter is used.\n */\n topLogprobs?: number;\n\n /**\n * The modalities of the response.\n */\n responseModalities?: GoogleAIModelModality[];\n\n /**\n * Custom metadata labels to associate with the request.\n * Only supported on Vertex AI (Google Cloud Platform).\n * Labels are key-value pairs where both keys and values must be strings.\n *\n * Example:\n * ```typescript\n * {\n * labels: {\n * \"team\": \"research\",\n * \"component\": \"frontend\",\n * \"environment\": \"production\"\n * }\n * }\n * ```\n */\n labels?: Record<string, string>;\n\n /**\n * Speech generation configuration.\n * You can use either Google's definition of the speech configuration,\n * or a simplified version we've defined (which can be as simple\n * as the name of a pre-defined voice).\n */\n speechConfig?: GoogleSpeechConfig | GoogleSpeechConfigSimplified;\n}\n\nexport type GoogleAIToolType = BindToolsInput | GeminiTool;\n\n/**\n * The params which can be passed to the API at request time.\n */\nexport interface GoogleAIModelRequestParams extends GoogleAIModelParams {\n tools?: GoogleAIToolType[];\n /**\n * Force the model to use tools in a specific way.\n *\n * | Mode |\tDescription |\n * |----------|---------------------------------------------------------------------------------------------------------------------------------------------------------|\n * | \"auto\"\t | The default model behavior. The model decides whether to predict a function call or a natural language response. |\n * | \"any\"\t | The model must predict only function calls. To limit the model to a subset of functions, define the allowed function names in `allowed_function_names`. |\n * | \"none\"\t | The model must not predict function calls. This behavior is equivalent to a model request without any associated function declarations. |\n * | string | The string value must be one of the function names. This will force the model to predict the specified function call. |\n *\n * The tool configuration's \"any\" mode (\"forced function calling\") is supported for Gemini 1.5 Pro models only.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n tool_choice?: string | \"auto\" | \"any\" | \"none\" | Record<string, any>;\n /**\n * Allowed functions to call when the mode is \"any\".\n * If empty, any one of the provided functions are called.\n */\n allowed_function_names?: string[];\n\n /**\n * Used to specify a previously created context cache to use with generation.\n * For Vertex, this should be of the form:\n * \"projects/PROJECT_NUMBER/locations/LOCATION/cachedContents/CACHE_ID\",\n *\n * See these guides for more information on how to use context caching:\n * https://cloud.google.com/vertex-ai/generative-ai/docs/context-cache/context-cache-create\n * https://cloud.google.com/vertex-ai/generative-ai/docs/context-cache/context-cache-use\n */\n cachedContent?: string;\n\n /**\n * The schema that the model's output should conform to.\n * When this is set, the model will output JSON that conforms to the schema.\n */\n responseSchema?: GeminiJsonSchema;\n}\n\nexport interface GoogleAIBaseLLMInput<AuthOptions>\n extends\n BaseLLMParams,\n GoogleConnectionParams<AuthOptions>,\n GoogleAIModelParams,\n GoogleAISafetyParams,\n GoogleAIAPIParams {}\n\nexport interface GoogleAIBaseLanguageModelCallOptions\n extends\n BaseChatModelCallOptions,\n GoogleAIModelRequestParams,\n GoogleAISafetyParams {\n /**\n * Whether or not to include usage data, like token counts\n * in the streamed response chunks.\n * @default true\n */\n streamUsage?: boolean;\n}\n\n/**\n * Input to LLM class.\n */\nexport interface GoogleBaseLLMInput<\n AuthOptions,\n> extends GoogleAIBaseLLMInput<AuthOptions> {}\n\nexport interface GoogleResponse {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n data: any;\n}\n\nexport interface GoogleRawResponse extends GoogleResponse {\n data: Blob;\n}\n\nexport interface GeminiPartBase {\n thought?: boolean; // Output only\n thoughtSignature?: string;\n}\n\nexport interface GeminiVideoMetadata {\n fps?: number; // Double in range (0.0, 24.0]\n startOffset?: string;\n endOffset?: string;\n}\n\nexport interface GeminiPartBaseFile extends GeminiPartBase {\n videoMetadata?: GeminiVideoMetadata;\n}\n\nexport interface GeminiPartText extends GeminiPartBase {\n text: string;\n}\n\nexport interface GeminiPartInlineData extends GeminiPartBaseFile {\n inlineData: {\n mimeType: string;\n data: string;\n };\n}\n\nexport interface GeminiPartFileData extends GeminiPartBaseFile {\n fileData: {\n mimeType: string;\n fileUri: string;\n };\n}\n\n// AI Studio only?\nexport interface GeminiPartFunctionCall extends GeminiPartBase {\n functionCall: {\n name: string;\n args?: object;\n };\n}\n\n// AI Studio Only?\nexport interface GeminiPartFunctionResponse extends GeminiPartBase {\n functionResponse: {\n name: string;\n response: object;\n };\n}\n\nexport type GeminiPart =\n | GeminiPartText\n | GeminiPartInlineData\n | GeminiPartFileData\n | GeminiPartFunctionCall\n | GeminiPartFunctionResponse;\n\nexport interface GeminiSafetySetting {\n category: string;\n threshold: string;\n}\n\nexport type GeminiSafetyRating = {\n category: string;\n probability: string;\n} & Record<string, unknown>;\n\nexport interface GeminiCitationMetadata {\n citations: GeminiCitation[];\n}\n\nexport interface GeminiCitation {\n startIndex: number;\n endIndex: number;\n uri: string;\n title: string;\n license: string;\n publicationDate: GoogleTypeDate;\n}\n\nexport interface GoogleTypeDate {\n year: number; // 1-9999 or 0 to specify a date without a year\n month: number; // 1-12 or 0 to specify a year without a month and day\n day: number; // Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn't significant\n}\n\nexport interface GeminiGroundingMetadata {\n webSearchQueries?: string[];\n searchEntryPoint?: GeminiSearchEntryPoint;\n groundingChunks: GeminiGroundingChunk[];\n groundingSupports?: GeminiGroundingSupport[];\n retrievalMetadata?: GeminiRetrievalMetadata;\n}\n\nexport interface GeminiSearchEntryPoint {\n renderedContent?: string;\n sdkBlob?: string; // Base64 encoded JSON representing array of tuple.\n}\n\nexport interface GeminiGroundingChunk {\n web: GeminiGroundingChunkWeb;\n retrievedContext: GeminiGroundingChunkRetrievedContext;\n}\n\nexport interface GeminiGroundingChunkWeb {\n uri: string;\n title: string;\n}\n\nexport interface GeminiGroundingChunkRetrievedContext {\n uri: string;\n title: string;\n text: string;\n}\n\nexport interface GeminiGroundingSupport {\n segment: GeminiSegment;\n groundingChunkIndices: number[];\n confidenceScores: number[];\n}\n\nexport interface GeminiSegment {\n partIndex: number;\n startIndex: number;\n endIndex: number;\n text: string;\n}\n\nexport interface GeminiRetrievalMetadata {\n googleSearchDynamicRetrievalScore: number;\n}\n\nexport type GeminiUrlRetrievalStatus =\n | \"URL_RETRIEVAL_STATUS_SUCCESS\"\n | \"URL_RETRIEVAL_STATUS_ERROR\";\n\nexport interface GeminiUrlRetrievalContext {\n retrievedUrl: string;\n urlRetrievalStatus: GeminiUrlRetrievalStatus;\n}\n\nexport interface GeminiUrlRetrievalMetadata {\n urlRetrievalContexts: GeminiUrlRetrievalContext[];\n}\n\nexport type GeminiUrlMetadata = GeminiUrlRetrievalContext;\n\nexport interface GeminiUrlContextMetadata {\n urlMetadata: GeminiUrlMetadata[];\n}\n\nexport interface GeminiLogprobsResult {\n topCandidates: GeminiLogprobsTopCandidate[];\n chosenCandidates: GeminiLogprobsResultCandidate[];\n}\n\nexport interface GeminiLogprobsTopCandidate {\n candidates: GeminiLogprobsResultCandidate[];\n}\n\nexport interface GeminiLogprobsResultCandidate {\n token: string;\n tokenId: number;\n logProbability: number;\n}\n\n// The \"system\" content appears to only be valid in the systemInstruction\nexport type GeminiRole = \"system\" | \"user\" | \"model\" | \"function\";\n\nexport interface GeminiContent {\n parts: GeminiPart[];\n role: GeminiRole; // Vertex AI requires the role\n}\n\n/*\n * If additional attributes are added here, they should also be\n * added to the attributes below\n */\nexport interface GeminiTool {\n functionDeclarations?: GeminiFunctionDeclaration[];\n googleSearchRetrieval?: GoogleSearchRetrieval; // Gemini-1.5\n googleSearch?: GoogleSearch; // Gemini-2.0\n urlContext?: UrlContext;\n retrieval?: VertexAIRetrieval;\n}\n\n/*\n * The known strings in this type should match those in GeminiSearchToolAttribuets\n */\nexport type GoogleSearchToolSetting =\n | boolean\n | \"googleSearchRetrieval\"\n | \"googleSearch\"\n | string;\n\nexport const GeminiSearchToolAttributes = [\n \"googleSearchRetrieval\",\n \"googleSearch\",\n];\n\nexport const GeminiToolAttributes = [\n \"functionDeclaration\",\n \"retrieval\",\n \"urlContext\",\n ...GeminiSearchToolAttributes,\n];\n\nexport interface GoogleSearchRetrieval {\n dynamicRetrievalConfig?: {\n mode?: string;\n dynamicThreshold?: number;\n };\n}\n\nexport interface GoogleSearch {}\n\nexport interface UrlContext {}\n\nexport interface VertexAIRetrieval {\n vertexAiSearch: {\n datastore: string;\n };\n disableAttribution?: boolean;\n}\n\nexport interface GeminiFunctionDeclaration {\n name: string;\n description: string;\n parameters?: GeminiFunctionSchema;\n}\n\nexport interface GeminiFunctionSchema {\n type: GeminiFunctionSchemaType;\n format?: string;\n description?: string;\n nullable?: boolean;\n enum?: string[];\n properties?: Record<string, GeminiFunctionSchema>;\n required?: string[];\n items?: GeminiFunctionSchema;\n}\n\nexport type GeminiFunctionSchemaType =\n | \"string\"\n | \"number\"\n | \"integer\"\n | \"boolean\"\n | \"array\"\n | \"object\";\n\nexport interface GeminiGenerationConfig {\n stopSequences?: string[];\n candidateCount?: number;\n maxOutputTokens?: number;\n temperature?: number;\n topP?: number;\n topK?: number;\n seed?: number;\n presencePenalty?: number;\n frequencyPenalty?: number;\n responseMimeType?: GoogleAIResponseMimeType;\n responseLogprobs?: boolean;\n logprobs?: number;\n responseModalities?: GoogleAIModelModality[];\n thinkingConfig?: GoogleThinkingConfig;\n speechConfig?: GoogleSpeechConfig;\n responseSchema?: GeminiJsonSchema;\n}\n\nexport interface GeminiRequest {\n contents?: GeminiContent[];\n systemInstruction?: GeminiContent;\n tools?: GeminiTool[];\n toolConfig?: {\n functionCallingConfig: {\n mode: \"auto\" | \"any\" | \"none\";\n allowedFunctionNames?: string[];\n };\n };\n safetySettings?: GeminiSafetySetting[];\n generationConfig?: GeminiGenerationConfig;\n cachedContent?: string;\n\n /**\n * Custom metadata labels to associate with the API call.\n */\n labels?: Record<string, string>;\n}\n\nexport interface GeminiResponseCandidate {\n content: {\n parts: GeminiPart[];\n role: string;\n };\n finishReason: string;\n index: number;\n tokenCount?: number;\n safetyRatings: GeminiSafetyRating[];\n citationMetadata?: GeminiCitationMetadata;\n groundingMetadata?: GeminiGroundingMetadata;\n urlRetrievalMetadata?: GeminiUrlRetrievalMetadata;\n urlContextMetadata?: GeminiUrlContextMetadata;\n avgLogprobs?: number;\n logprobsResult: GeminiLogprobsResult;\n finishMessage?: string;\n}\n\ninterface GeminiResponsePromptFeedback {\n blockReason?: string;\n safetyRatings: GeminiSafetyRating[];\n}\n\nexport type ModalityEnum =\n | \"TEXT\"\n | \"IMAGE\"\n | \"VIDEO\"\n | \"AUDIO\"\n | \"DOCUMENT\"\n | string;\n\nexport interface ModalityTokenCount {\n modality: ModalityEnum;\n tokenCount: number;\n}\n\nexport interface GenerateContentResponseUsageMetadata {\n promptTokenCount: number;\n toolUsePromptTokenCount: number;\n cachedContentTokenCount: number;\n thoughtsTokenCount: number;\n candidatesTokenCount: number;\n totalTokenCount: number;\n\n promptTokensDetails: ModalityTokenCount[];\n toolUsePromptTokensDetails: ModalityTokenCount[];\n cacheTokensDetails: ModalityTokenCount[];\n candidatesTokensDetails: ModalityTokenCount[];\n\n [key: string]: unknown;\n}\n\nexport interface GenerateContentResponseData {\n candidates: GeminiResponseCandidate[];\n promptFeedback: GeminiResponsePromptFeedback;\n usageMetadata: GenerateContentResponseUsageMetadata;\n}\n\nexport type GoogleLLMModelFamily = null | \"palm\" | \"gemini\" | \"gemma\";\n\nexport type VertexModelFamily = GoogleLLMModelFamily | \"claude\";\n\nexport type GoogleLLMResponseData =\n | JsonStream\n | GenerateContentResponseData\n | GenerateContentResponseData[];\n\nexport interface GoogleLLMResponse extends GoogleResponse {\n data: GoogleLLMResponseData | AnthropicResponseData;\n}\n\nexport interface GoogleAISafetyHandler {\n /**\n * A function that will take a response and return the, possibly modified,\n * response or throw an exception if there are safety issues.\n *\n * @throws GoogleAISafetyError\n */\n handle(response: GoogleLLMResponse): GoogleLLMResponse;\n}\n\nexport interface GoogleAISafetyParams {\n safetyHandler?: GoogleAISafetyHandler;\n}\n\nexport type GeminiJsonSchema = Record<string, unknown> & {\n properties?: Record<string, GeminiJsonSchema>;\n type: GeminiFunctionSchemaType;\n nullable?: boolean;\n};\n\nexport interface GeminiJsonSchemaDirty extends GeminiJsonSchema {\n items?: GeminiJsonSchemaDirty;\n properties?: Record<string, GeminiJsonSchemaDirty>;\n additionalProperties?: boolean;\n}\n\nexport type GoogleAIAPI = {\n messageContentToParts?: (content: MessageContent) => Promise<GeminiPart[]>;\n\n baseMessageToContent?: (\n message: BaseMessage,\n prevMessage: BaseMessage | undefined,\n useSystemInstruction: boolean\n ) => Promise<GeminiContent[]>;\n\n responseToString: (response: GoogleLLMResponse) => string;\n\n responseToChatGeneration: (\n response: GoogleLLMResponse\n ) => ChatGenerationChunk | null;\n\n chunkToString: (chunk: BaseMessageChunk) => string;\n\n responseToBaseMessage: (response: GoogleLLMResponse) => BaseMessage;\n\n responseToChatResult: (response: GoogleLLMResponse) => ChatResult;\n\n formatData: (\n input: unknown,\n parameters: GoogleAIModelRequestParams\n ) => Promise<unknown>;\n};\n\nexport interface GeminiAPIConfig {\n safetyHandler?: GoogleAISafetyHandler;\n mediaManager?: MediaManager;\n useSystemInstruction?: boolean;\n\n /**\n * How to handle the Google Search tool, since the name (and format)\n * of the tool changes between Gemini 1.5 and Gemini 2.0.\n * true - Change based on the model version. (Default)\n * false - Do not change the tool name provided\n * string value - Use this as the attribute name for the search\n * tool, adapting any tool attributes if possible.\n * When the model is created, a \"true\" or default setting\n * will be changed to a string based on the model.\n */\n googleSearchToolAdjustment?: GoogleSearchToolSetting;\n}\n\nexport type GoogleAIAPIConfig = GeminiAPIConfig | AnthropicAPIConfig;\n\nexport interface GoogleAIAPIParams {\n apiName?: string;\n apiConfig?: GoogleAIAPIConfig;\n}\n\n// Embeddings\n\n/**\n * Defines the parameters required to initialize a\n * GoogleEmbeddings instance. It extends EmbeddingsParams and\n * GoogleConnectionParams.\n */\nexport interface BaseGoogleEmbeddingsParams<AuthOptions>\n extends EmbeddingsParams, GoogleConnectionParams<AuthOptions> {\n model: string;\n\n /**\n * Used to specify output embedding size.\n * If set, output embeddings will be truncated to the size specified.\n */\n dimensions?: number;\n\n /**\n * An alias for \"dimensions\"\n */\n outputDimensionality?: number;\n}\n\n/**\n * Defines additional options specific to the\n * GoogleEmbeddingsInstance. It extends AsyncCallerCallOptions.\n */\nexport interface BaseGoogleEmbeddingsOptions extends AsyncCallerCallOptions {}\n\nexport type GoogleEmbeddingsTaskType =\n | \"RETRIEVAL_QUERY\"\n | \"RETRIEVAL_DOCUMENT\"\n | \"SEMANTIC_SIMILARITY\"\n | \"CLASSIFICATION\"\n | \"CLUSTERING\"\n | \"QUESTION_ANSWERING\"\n | \"FACT_VERIFICATION\"\n | \"CODE_RETRIEVAL_QUERY\"\n | string;\n\n/**\n * Represents an instance for generating embeddings using the Google\n * Vertex AI API. It contains the content to be embedded.\n */\nexport interface VertexEmbeddingsInstance {\n content: string;\n taskType?: GoogleEmbeddingsTaskType;\n title?: string;\n}\n\nexport interface VertexEmbeddingsParameters extends GoogleModelParams {\n autoTruncate?: boolean;\n outputDimensionality?: number;\n}\n\nexport interface VertexEmbeddingsRequest {\n instances: VertexEmbeddingsInstance[];\n parameters?: VertexEmbeddingsParameters;\n}\n\nexport interface AIStudioEmbeddingsRequest {\n content: {\n parts: GeminiPartText[];\n };\n model?: string; // Documentation says required, but tests say otherwise\n taskType?: GoogleEmbeddingsTaskType;\n title?: string;\n outputDimensionality?: number;\n}\n\nexport type GoogleEmbeddingsRequest =\n | VertexEmbeddingsRequest\n | AIStudioEmbeddingsRequest;\n\nexport interface VertexEmbeddingsResponsePrediction {\n embeddings: {\n statistics: {\n token_count: number;\n truncated: boolean;\n };\n values: number[];\n };\n}\n\n/**\n * Defines the structure of the embeddings results returned by the Google\n * Vertex AI API. It extends GoogleBasePrediction and contains the\n * embeddings and their statistics.\n */\nexport interface VertexEmbeddingsResponse extends GoogleResponse {\n data: {\n predictions: VertexEmbeddingsResponsePrediction[];\n };\n}\n\nexport interface AIStudioEmbeddingsResponse extends GoogleResponse {\n data: {\n embedding: {\n values: number[];\n };\n };\n}\n\nexport type GoogleEmbeddingsResponse =\n | VertexEmbeddingsResponse\n | AIStudioEmbeddingsResponse;\n"],"mappings":";AAoEA,MAAa,yBAAyB;CACpC,YAAY;CACZ,YAAY;CACZ,0BAA0B;CAE1B,YAAY;CACZ,aAAa;CACb,2BAA2B;CAE3B,kBAAkB;CAClB,mBAAmB;CACnB,iCAAiC;CAEjC,WAAW;CACX,WAAW;CACX,yBAAyB;CAEzB,gBAAgB;CAChB,iBAAiB;CACjB,+BAA+B;CAChC;AAKD,MAAa,0BAA0B;CACrC,MAAM;CACN,MAAM;CACN,YAAY;CAEZ,KAAK;CACL,KAAK;CACL,iBAAiB;CAEjB,MAAM;CACN,MAAM;CACN,wBAAwB;CAExB,MAAM;CACN,MAAM;CACN,qBAAqB;CAErB,KAAK;CACL,KAAK;CACL,WAAW;CACZ;AAKD,MAAa,uBAAuB;CAClC,UAAU;CACV,aAAa;CACd;AA8iBD,MAAa,6BAA6B,CACxC,yBACA,eACD;AAED,MAAa,uBAAuB;CAClC;CACA;CACA;CACA,GAAG;CACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.cjs","names":["AIMessageChunk","ChatGenerationChunk"],"sources":["../../src/utils/anthropic.ts"],"sourcesContent":["import {\n ChatGeneration,\n ChatGenerationChunk,\n ChatResult,\n} from \"@langchain/core/outputs\";\nimport {\n BaseMessage,\n BaseMessageChunk,\n AIMessageChunk,\n MessageContentComplex,\n MessageContentText,\n MessageContent,\n MessageContentImageUrl,\n AIMessageFields,\n AIMessageChunkFields,\n AIMessage,\n StandardContentBlockConverter,\n StandardImageBlock,\n StandardTextBlock,\n StandardFileBlock,\n DataContentBlock,\n isDataContentBlock,\n convertToProviderContentBlock,\n parseBase64DataUrl,\n UsageMetadata,\n} from \"@langchain/core/messages\";\nimport {\n ToolCall,\n ToolCallChunk,\n ToolMessage,\n} from \"@langchain/core/messages/tool\";\nimport {\n AnthropicAPIConfig,\n AnthropicCacheControl,\n AnthropicContent,\n AnthropicContentRedactedThinking,\n AnthropicContentText,\n AnthropicContentThinking,\n AnthropicContentToolUse,\n AnthropicMessage,\n AnthropicMessageContent,\n AnthropicMessageContentDocument,\n AnthropicMessageContentImage,\n AnthropicMessageContentRedactedThinking,\n AnthropicMessageContentText,\n AnthropicMessageContentThinking,\n AnthropicMessageContentToolResult,\n AnthropicMessageContentToolResultContent,\n AnthropicMessageContentToolUse,\n AnthropicRequest,\n AnthropicRequestSettings,\n AnthropicResponseData,\n AnthropicResponseMessage,\n AnthropicStreamContentBlockDeltaEvent,\n AnthropicStreamContentBlockStartEvent,\n AnthropicStreamInputJsonDelta,\n AnthropicStreamMessageDeltaEvent,\n AnthropicStreamMessageStartEvent,\n AnthropicStreamTextDelta,\n AnthropicTool,\n AnthropicToolChoice,\n GeminiTool,\n GoogleAIAPI,\n GoogleAIModelParams,\n GoogleAIModelRequestParams,\n GoogleAIToolType,\n GoogleLLMResponse,\n} from \"../types.js\";\n\nexport function getAnthropicAPI(config?: AnthropicAPIConfig): GoogleAIAPI {\n function partToString(part: AnthropicContent): string {\n return \"text\" in part ? part.text : \"\";\n }\n\n function messageToString(message: AnthropicResponseMessage): string {\n const content: AnthropicContent[] = message?.content ?? [];\n const ret = content.reduce((acc, part) => {\n const str = partToString(part);\n return acc + str;\n }, \"\");\n return ret;\n }\n\n function responseToString(response: GoogleLLMResponse): string {\n const data = response.data as AnthropicResponseData;\n switch (data?.type) {\n case \"message\":\n return messageToString(data as AnthropicResponseMessage);\n default:\n throw Error(`Unknown type: ${data?.type}`);\n }\n }\n\n /**\n * Normalize the AIMessageChunk.\n * If the fields are just a string - use that as content.\n * If the content is an array of just text fields, turn them into a string.\n * @param fields\n */\n function newAIMessageChunk(fields: string | AIMessageFields): AIMessageChunk {\n if (typeof fields === \"string\") {\n return new AIMessageChunk(fields);\n }\n const ret: AIMessageFields = {\n ...fields,\n };\n\n if (Array.isArray(fields?.content)) {\n let str: string | undefined = \"\";\n fields.content.forEach((val) => {\n if (str !== undefined && val.type === \"text\") {\n str = `${str}${val.text}`;\n } else {\n str = undefined;\n }\n });\n if (str) {\n ret.content = str;\n }\n }\n\n return new AIMessageChunk(ret);\n }\n\n function textContentToMessageFields(\n textContent: AnthropicContentText\n ): AIMessageFields {\n return {\n content: [textContent],\n };\n }\n\n function toolUseContentToMessageFields(\n toolUseContent: AnthropicContentToolUse\n ): AIMessageFields {\n const tool: ToolCall = {\n id: toolUseContent.id,\n name: toolUseContent.name,\n type: \"tool_call\",\n args: toolUseContent.input,\n };\n return {\n content: [],\n tool_calls: [tool],\n };\n }\n\n function thinkingContentToMessageFields(\n thinkingContent: AnthropicContentThinking\n ): AIMessageFields {\n // TODO: Once a reasoning/thinking type is defined in LangChain, use it\n return {\n content: [thinkingContent],\n };\n }\n\n function redactedThinkingContentToMessageFields(\n thinkingContent: AnthropicContentRedactedThinking\n ): AIMessageFields {\n // TODO: Once a reasoning/thinking type is defined in LangChain, use it\n return {\n content: [thinkingContent],\n };\n }\n\n function anthropicContentToMessageFields(\n anthropicContent: AnthropicContent\n ): AIMessageFields | undefined {\n const type = anthropicContent?.type;\n switch (type) {\n case \"text\":\n return textContentToMessageFields(anthropicContent);\n case \"tool_use\":\n return toolUseContentToMessageFields(anthropicContent);\n case \"thinking\":\n return thinkingContentToMessageFields(anthropicContent);\n case \"redacted_thinking\":\n return redactedThinkingContentToMessageFields(anthropicContent);\n default:\n console.error(`Unknown message type: ${type}`, anthropicContent);\n return undefined;\n }\n }\n\n function contentToMessage(\n anthropicContent: AnthropicContent[]\n ): BaseMessageChunk {\n const complexContent: MessageContentComplex[] = [];\n const toolCalls: ToolCall[] = [];\n anthropicContent.forEach((ac) => {\n const messageFields = anthropicContentToMessageFields(ac);\n if (messageFields?.content) {\n complexContent.push(\n ...(messageFields.content as MessageContentComplex[])\n );\n }\n if (messageFields?.tool_calls) {\n toolCalls.push(...messageFields.tool_calls);\n }\n });\n\n const ret: AIMessageFields = {\n content: complexContent,\n tool_calls: toolCalls,\n };\n return newAIMessageChunk(ret);\n }\n\n function messageToUsageMetadata(\n message: AnthropicResponseMessage\n ): UsageMetadata {\n const usage = message?.usage;\n const inputTokens = usage?.input_tokens ?? 0;\n const outputTokens = usage?.output_tokens ?? 0;\n const usageMetadata: UsageMetadata = {\n input_tokens: inputTokens,\n output_tokens: outputTokens,\n total_tokens: inputTokens + outputTokens,\n input_token_details: {\n cache_read: usage?.cache_read_input_tokens ?? 0,\n cache_creation: usage?.cache_creation_input_tokens ?? 0,\n },\n };\n return usageMetadata;\n }\n\n function messageToGenerationInfo(message: AnthropicResponseMessage) {\n const usageMetadata = messageToUsageMetadata(message);\n\n return {\n usage_metadata: usageMetadata,\n finish_reason: message.stop_reason,\n };\n }\n\n function messageToChatGeneration(\n responseMessage: AnthropicResponseMessage\n ): ChatGenerationChunk {\n const content: AnthropicContent[] = responseMessage?.content ?? [];\n const text = messageToString(responseMessage);\n const message = contentToMessage(content);\n const generationInfo = messageToGenerationInfo(responseMessage);\n return new ChatGenerationChunk({\n text,\n message,\n generationInfo,\n });\n }\n\n function messageStartToChatGeneration(\n event: AnthropicStreamMessageStartEvent\n ): ChatGenerationChunk {\n const responseMessage = event.message;\n return messageToChatGeneration(responseMessage);\n }\n\n function messageDeltaToChatGeneration(\n event: AnthropicStreamMessageDeltaEvent\n ): ChatGenerationChunk {\n const responseMessage = event.delta;\n return messageToChatGeneration(responseMessage as AnthropicResponseMessage);\n }\n\n function contentBlockStartTextToChatGeneration(\n event: AnthropicStreamContentBlockStartEvent\n ): ChatGenerationChunk | null {\n const content = event.content_block;\n const text = \"text\" in content ? content.text : \"\";\n const message = new AIMessageChunk({\n content: [{ index: event.index, ...content }],\n });\n return new ChatGenerationChunk({\n message,\n text,\n });\n }\n\n function contentBlockStartToolUseToChatGeneration(\n event: AnthropicStreamContentBlockStartEvent\n ): ChatGenerationChunk | null {\n const contentBlock = event.content_block as AnthropicContentToolUse;\n const text: string = \"\";\n const toolChunk: ToolCallChunk = {\n type: \"tool_call_chunk\",\n index: event.index,\n name: contentBlock.name,\n id: contentBlock.id,\n };\n if (\n typeof contentBlock.input === \"object\" &&\n Object.keys(contentBlock.input).length > 0\n ) {\n toolChunk.args = JSON.stringify(contentBlock.input);\n }\n const toolChunks: ToolCallChunk[] = [toolChunk];\n\n const content: MessageContentComplex[] = [\n {\n index: event.index,\n ...contentBlock,\n },\n ];\n const messageFields: AIMessageChunkFields = {\n content,\n tool_call_chunks: toolChunks,\n };\n const message = newAIMessageChunk(messageFields);\n return new ChatGenerationChunk({\n message,\n text,\n });\n }\n\n function contentBlockStartToChatGeneration(\n event: AnthropicStreamContentBlockStartEvent\n ): ChatGenerationChunk | null {\n switch (event.content_block.type) {\n case \"text\":\n return contentBlockStartTextToChatGeneration(event);\n case \"tool_use\":\n return contentBlockStartToolUseToChatGeneration(event);\n default:\n console.warn(\n `Unexpected start content_block type: ${JSON.stringify(event)}`\n );\n return null;\n }\n }\n\n function contentBlockDeltaTextToChatGeneration(\n event: AnthropicStreamContentBlockDeltaEvent\n ): ChatGenerationChunk {\n const delta = event.delta as AnthropicStreamTextDelta;\n const text = delta?.text;\n const message = new AIMessageChunk({\n content: [{ index: event.index, type: \"text\", text }],\n });\n return new ChatGenerationChunk({\n message,\n text,\n });\n }\n\n function contentBlockDeltaInputJsonDeltaToChatGeneration(\n event: AnthropicStreamContentBlockDeltaEvent\n ): ChatGenerationChunk {\n const delta = event.delta as AnthropicStreamInputJsonDelta;\n const text: string = \"\";\n const toolChunks: ToolCallChunk[] = [\n {\n index: event.index,\n args: delta.partial_json,\n },\n ];\n const content: MessageContentComplex[] = [\n {\n index: event.index,\n ...delta,\n },\n ];\n const messageFields: AIMessageChunkFields = {\n content,\n tool_call_chunks: toolChunks,\n };\n const message = newAIMessageChunk(messageFields);\n return new ChatGenerationChunk({\n message,\n text,\n });\n }\n\n function contentBlockDeltaToChatGeneration(\n event: AnthropicStreamContentBlockDeltaEvent\n ): ChatGenerationChunk | null {\n switch (event.delta.type) {\n case \"text_delta\":\n return contentBlockDeltaTextToChatGeneration(event);\n case \"input_json_delta\":\n return contentBlockDeltaInputJsonDeltaToChatGeneration(event);\n default:\n console.warn(\n `Unexpected delta content_block type: ${JSON.stringify(event)}`\n );\n return null;\n }\n }\n\n function responseToChatGeneration(\n response: GoogleLLMResponse\n ): ChatGenerationChunk | null {\n const data = response.data as AnthropicResponseData;\n switch (data.type) {\n case \"message\":\n return messageToChatGeneration(data as AnthropicResponseMessage);\n case \"message_start\":\n return messageStartToChatGeneration(\n data as AnthropicStreamMessageStartEvent\n );\n case \"message_delta\":\n return messageDeltaToChatGeneration(\n data as AnthropicStreamMessageDeltaEvent\n );\n case \"content_block_start\":\n return contentBlockStartToChatGeneration(\n data as AnthropicStreamContentBlockStartEvent\n );\n case \"content_block_delta\":\n return contentBlockDeltaToChatGeneration(\n data as AnthropicStreamContentBlockDeltaEvent\n );\n\n case \"ping\":\n case \"message_stop\":\n case \"content_block_stop\":\n // These are ignorable\n return null;\n\n case \"error\":\n throw new Error(\n `Error while streaming results: ${JSON.stringify(data)}`\n );\n\n default:\n // We don't know what type this is, but Anthropic may have added\n // new ones without telling us. Don't error, but don't use them.\n console.warn(\"Unknown data for responseToChatGeneration\", data);\n // throw new Error(`Unknown response type: ${data.type}`);\n return null;\n }\n }\n\n function chunkToString(chunk: BaseMessageChunk): string {\n if (chunk === null) {\n return \"\";\n } else if (typeof chunk.content === \"string\") {\n return chunk.content;\n } else if (chunk.content.length === 0) {\n return \"\";\n } else if (chunk.content[0].type === \"text\") {\n return chunk.content[0].text;\n } else {\n throw new Error(`Unexpected chunk: ${chunk}`);\n }\n }\n\n function responseToBaseMessage(response: GoogleLLMResponse): BaseMessage {\n const data = response.data as AnthropicResponseMessage;\n const content: AnthropicContent[] = data?.content ?? [];\n return contentToMessage(content);\n }\n\n function responseToChatResult(response: GoogleLLMResponse): ChatResult {\n const message = response.data as AnthropicResponseMessage;\n const generations: ChatGeneration[] = [];\n const gen = responseToChatGeneration(response);\n if (gen) {\n generations.push(gen);\n }\n const llmOutput = messageToGenerationInfo(message);\n return {\n generations,\n llmOutput,\n };\n }\n\n function formatAnthropicVersion(): string {\n return config?.version ?? \"vertex-2023-10-16\";\n }\n\n function textContentToAnthropicContent(\n content: MessageContentText\n ): AnthropicMessageContentText | undefined {\n if (!content.text) {\n return undefined;\n }\n return { type: \"text\", text: content.text };\n }\n\n function extractMimeType(\n str: string\n ): { media_type: string; data: string } | null {\n if (str.startsWith(\"data:\")) {\n return {\n media_type: str.split(\":\")[1].split(\";\")[0],\n data: str.split(\",\")[1],\n };\n }\n return null;\n }\n\n function imageContentToAnthropicContent(\n content: MessageContentImageUrl\n ): AnthropicMessageContentImage | undefined {\n const dataUrl = content.image_url;\n const url = typeof dataUrl === \"string\" ? dataUrl : dataUrl?.url;\n const urlInfo = extractMimeType(url);\n\n if (!urlInfo) {\n return undefined;\n }\n\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n ...urlInfo,\n },\n };\n }\n\n function toolUseContentToAnthropicContent(\n content: Record<string, unknown>\n ): AnthropicMessageContentToolUse {\n return {\n type: \"tool_use\",\n id: content.id as string,\n name: content.name as string,\n input: content.input as Record<string, unknown>,\n };\n }\n\n function thinkingContentToAnthropicContent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n content: Record<string, any>\n ): AnthropicMessageContentThinking | undefined {\n // TODO: Once a Langchain Thinking type is defined, use it\n return {\n type: \"thinking\",\n thinking: content.thinking,\n signature: content.signature,\n };\n }\n\n function redactedThinkingContentToAnthropicContent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n content: Record<string, any>\n ): AnthropicMessageContentRedactedThinking | undefined {\n // TODO: Once a Langchain Thinking type is defined, use it\n return {\n type: \"redacted_thinking\",\n data: content.data,\n };\n }\n\n function contentComplexToAnthropicContent(\n content: MessageContentComplex\n ): AnthropicMessageContent | undefined {\n const type = content?.type;\n switch (type) {\n case \"text\":\n return textContentToAnthropicContent(content as MessageContentText);\n case \"image_url\":\n return imageContentToAnthropicContent(\n content as MessageContentImageUrl\n );\n case \"tool_use\":\n return toolUseContentToAnthropicContent(content);\n case \"thinking\":\n return thinkingContentToAnthropicContent(\n content as Record<string, unknown>\n );\n case \"redacted_thinking\":\n return redactedThinkingContentToAnthropicContent(\n content as Record<string, unknown>\n );\n default:\n if (type === \"tool_call\") {\n return undefined;\n }\n console.warn(`Unexpected content type: ${type}`, content);\n return undefined;\n }\n }\n\n const anthropicContentConverter: StandardContentBlockConverter<{\n text: AnthropicMessageContentText;\n image: AnthropicMessageContentImage;\n file: AnthropicMessageContentDocument;\n }> = {\n providerName: \"anthropic\",\n\n fromStandardTextBlock(\n block: StandardTextBlock\n ): AnthropicMessageContentText {\n return {\n type: \"text\",\n text: block.text,\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n };\n },\n\n fromStandardImageBlock(\n block: StandardImageBlock\n ): AnthropicMessageContentImage {\n if (block.source_type === \"url\") {\n const data = parseBase64DataUrl({\n dataUrl: block.url,\n asTypedArray: false,\n });\n if (data) {\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n data: data.data,\n media_type: data.mime_type,\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? { cache_control: block.metadata!.cache_control }\n : {}),\n } as AnthropicMessageContentImage;\n } else {\n return {\n type: \"image\",\n source: {\n type: \"url\",\n url: block.url,\n media_type: block.mime_type ?? \"\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? { cache_control: block.metadata!.cache_control }\n : {}),\n } as AnthropicMessageContentImage;\n }\n } else {\n if (block.source_type === \"base64\") {\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n data: block.data,\n media_type: block.mime_type ?? \"\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? { cache_control: block.metadata!.cache_control }\n : {}),\n } as AnthropicMessageContentImage;\n } else {\n throw new Error(\n `Unsupported image source type: ${block.source_type}`\n );\n }\n }\n },\n\n fromStandardFileBlock(\n block: StandardFileBlock\n ): AnthropicMessageContentDocument {\n const mime_type = (block.mime_type ?? \"\").split(\";\")[0];\n\n if (block.source_type === \"url\") {\n if (mime_type === \"application/pdf\" || mime_type === \"\") {\n return {\n type: \"document\",\n source: {\n type: \"url\",\n url: block.url,\n media_type: block.mime_type ?? \"\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n ...(\"citations\" in (block.metadata ?? {})\n ? {\n citations: block.metadata!.citations as { enabled?: boolean },\n }\n : {}),\n ...(\"context\" in (block.metadata ?? {})\n ? { context: block.metadata!.context as string }\n : {}),\n ...(block.metadata?.title ||\n block.metadata?.filename ||\n block.metadata?.name\n ? {\n title: (block.metadata?.title ||\n block.metadata?.filename ||\n block.metadata?.name) as string,\n }\n : {}),\n };\n }\n throw new Error(\n `Unsupported file mime type for file url source: ${block.mime_type}`\n );\n } else if (block.source_type === \"text\") {\n if (mime_type === \"text/plain\" || mime_type === \"\") {\n return {\n type: \"document\",\n source: {\n type: \"text\",\n data: block.text,\n media_type: block.mime_type ?? \"\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n ...(\"citations\" in (block.metadata ?? {})\n ? {\n citations: block.metadata!.citations as { enabled?: boolean },\n }\n : {}),\n ...(\"context\" in (block.metadata ?? {})\n ? { context: block.metadata!.context as string }\n : {}),\n ...(\"title\" in (block.metadata ?? {})\n ? { title: block.metadata!.title as string }\n : {}),\n };\n } else {\n throw new Error(\n `Unsupported file mime type for file text source: ${block.mime_type}`\n );\n }\n } else if (block.source_type === \"base64\") {\n if (mime_type === \"application/pdf\" || mime_type === \"\") {\n return {\n type: \"document\",\n source: {\n type: \"base64\",\n data: block.data,\n media_type: \"application/pdf\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n ...(\"citations\" in (block.metadata ?? {})\n ? {\n citations: block.metadata!.citations as { enabled?: boolean },\n }\n : {}),\n ...(\"context\" in (block.metadata ?? {})\n ? { context: block.metadata!.context as string }\n : {}),\n ...(\"title\" in (block.metadata ?? {})\n ? { title: block.metadata!.title as string }\n : {}),\n };\n } else if (\n [\"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\"].includes(\n mime_type\n )\n ) {\n return {\n type: \"document\",\n source: {\n type: \"content\",\n content: [\n {\n type: \"image\",\n source: {\n type: \"base64\",\n data: block.data,\n media_type: mime_type as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\n },\n },\n ],\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n ...(\"citations\" in (block.metadata ?? {})\n ? {\n citations: block.metadata!.citations as { enabled?: boolean },\n }\n : {}),\n ...(\"context\" in (block.metadata ?? {})\n ? { context: block.metadata!.context as string }\n : {}),\n ...(\"title\" in (block.metadata ?? {})\n ? { title: block.metadata!.title as string }\n : {}),\n };\n } else {\n throw new Error(\n `Unsupported file mime type for file base64 source: ${block.mime_type}`\n );\n }\n } else {\n throw new Error(`Unsupported file source type: ${block.source_type}`);\n }\n },\n };\n\n function contentToAnthropicContent(\n content: MessageContent | DataContentBlock[]\n ): AnthropicMessageContent[] {\n const ca =\n typeof content === \"string\" ? [{ type: \"text\", text: content }] : content;\n return ca\n .map((complex) =>\n isDataContentBlock(complex)\n ? convertToProviderContentBlock(complex, anthropicContentConverter)\n : contentComplexToAnthropicContent(complex)\n )\n .filter(Boolean) as AnthropicMessageContent[];\n }\n\n function toolCallToAnthropicContent(\n toolCall: ToolCall\n ): AnthropicMessageContentToolUse {\n return {\n type: \"tool_use\",\n id: toolCall.id!,\n name: toolCall.name,\n input: toolCall.args,\n };\n }\n\n function toolCallsToAnthropicContent(\n toolCalls: ToolCall[] | undefined\n ): AnthropicMessageContentToolUse[] {\n if (toolCalls === undefined) {\n return [];\n }\n return toolCalls.map(toolCallToAnthropicContent);\n }\n\n function baseRoleToAnthropicMessage(\n base: BaseMessage,\n role: string\n ): AnthropicMessage {\n const content = contentToAnthropicContent(base.content);\n return {\n role,\n content,\n };\n }\n\n function aiMessageToAnthropicMessage(base: AIMessage): AnthropicMessage {\n const ret = baseRoleToAnthropicMessage(base, \"assistant\");\n\n const content = ret.content as AnthropicMessageContent[];\n const existingToolUseIds = new Set(\n content\n .filter(\n (block): block is AnthropicMessageContentToolUse =>\n block.type === \"tool_use\"\n )\n .map((block) => block.id)\n );\n\n const toolContent = toolCallsToAnthropicContent(base.tool_calls).filter(\n (block) => !existingToolUseIds.has(block.id)\n );\n if (toolContent.length > 0) {\n ret.content = [...content, ...toolContent];\n }\n\n return ret;\n }\n\n function toolMessageToAnthropicMessage(base: ToolMessage): AnthropicMessage {\n const role = \"user\";\n const toolUseId = base.tool_call_id;\n const toolContent = contentToAnthropicContent(\n base.content\n ) as AnthropicMessageContentToolResultContent[];\n const content: AnthropicMessageContentToolResult[] = [\n {\n type: \"tool_result\",\n tool_use_id: toolUseId,\n content: toolContent,\n },\n ];\n return {\n role,\n content,\n };\n }\n\n function baseToAnthropicMessage(\n base: BaseMessage\n ): AnthropicMessage | undefined {\n const type = base._getType();\n switch (type) {\n case \"human\":\n return baseRoleToAnthropicMessage(base, \"user\");\n case \"ai\":\n return aiMessageToAnthropicMessage(base as AIMessage);\n case \"tool\":\n return toolMessageToAnthropicMessage(base as ToolMessage);\n case \"system\":\n // System messages are handled in formatSystem()\n return undefined;\n default:\n console.warn(`Unknown BaseMessage type: ${type}`, base);\n return undefined;\n }\n }\n\n function formatMessages(input: BaseMessage[]): AnthropicMessage[] {\n const ret: AnthropicMessage[] = [];\n\n input.forEach((baseMessage) => {\n const anthropicMessage = baseToAnthropicMessage(baseMessage);\n if (anthropicMessage) {\n ret.push(anthropicMessage);\n }\n });\n\n return ret;\n }\n\n function formatSettings(\n parameters: GoogleAIModelRequestParams\n ): AnthropicRequestSettings {\n const ret: AnthropicRequestSettings = {\n stream: parameters?.streaming ?? false,\n max_tokens: parameters?.maxOutputTokens ?? 8192,\n };\n\n if (parameters.topP) {\n ret.top_p = parameters.topP;\n }\n if (parameters.topK) {\n ret.top_k = parameters.topK;\n }\n if (parameters.temperature) {\n ret.temperature = parameters.temperature;\n }\n if (parameters.stopSequences) {\n ret.stop_sequences = parameters.stopSequences;\n }\n\n return ret;\n }\n\n function contentComplexArrayToText(\n contentArray: MessageContentComplex[]\n ): string {\n let ret = \"\";\n\n contentArray.forEach((content) => {\n const contentType = content?.type;\n if (contentType === \"text\") {\n const textContent = content as MessageContentText;\n ret = `${ret}\\n${textContent.text}`;\n }\n });\n\n return ret;\n }\n\n function formatSystem(input: BaseMessage[]): string {\n let ret = \"\";\n\n input.forEach((message) => {\n if (message._getType() === \"system\") {\n const content = message?.content;\n const contentString =\n typeof content === \"string\"\n ? (content as string)\n : contentComplexArrayToText(content as MessageContentComplex[]);\n ret = `${ret}\\n${contentString}`;\n }\n });\n\n return ret;\n }\n\n function formatGeminiTool(tool: GeminiTool): AnthropicTool[] {\n if (Object.hasOwn(tool, \"functionDeclarations\")) {\n const funcs = tool?.functionDeclarations ?? [];\n return funcs.map((func) => {\n const inputSchema = func.parameters!;\n return {\n // type: \"tool\", // This may only be valid for models 20241022+\n name: func.name,\n description: func.description,\n input_schema: inputSchema,\n };\n });\n } else {\n console.warn(\n `Unable to format GeminiTool: ${JSON.stringify(tool, null, 1)}`\n );\n return [];\n }\n }\n\n function formatTool(tool: GoogleAIToolType): AnthropicTool[] {\n if (Object.hasOwn(tool, \"name\")) {\n return [tool as AnthropicTool];\n } else {\n return formatGeminiTool(tool as GeminiTool);\n }\n }\n\n function formatTools(\n parameters: GoogleAIModelRequestParams\n ): AnthropicTool[] {\n const tools: GoogleAIToolType[] = parameters?.tools ?? [];\n const ret: AnthropicTool[] = [];\n tools.forEach((tool) => {\n const anthropicTools = formatTool(tool);\n anthropicTools.forEach((anthropicTool) => {\n if (anthropicTool) {\n ret.push(anthropicTool);\n }\n });\n });\n return ret;\n }\n\n function formatToolChoice(\n parameters: GoogleAIModelRequestParams\n ): AnthropicToolChoice | undefined {\n const choice = parameters?.tool_choice;\n if (!choice) {\n return undefined;\n } else if (typeof choice === \"object\") {\n return choice as AnthropicToolChoice;\n } else {\n switch (choice) {\n case \"any\":\n case \"auto\":\n return {\n type: choice,\n };\n case \"none\":\n return undefined;\n default:\n return {\n type: \"tool\",\n name: choice,\n };\n }\n }\n }\n\n async function formatData(\n input: unknown,\n parameters: GoogleAIModelRequestParams\n ): Promise<AnthropicRequest> {\n const typedInput = input as BaseMessage[];\n const anthropicVersion = formatAnthropicVersion();\n const messages = formatMessages(typedInput);\n const settings = formatSettings(parameters);\n const system = formatSystem(typedInput);\n const tools = formatTools(parameters);\n const toolChoice = formatToolChoice(parameters);\n const ret: AnthropicRequest = {\n anthropic_version: anthropicVersion,\n messages,\n ...settings,\n };\n if (tools && tools.length && parameters?.tool_choice !== \"none\") {\n ret.tools = tools;\n }\n if (toolChoice) {\n ret.tool_choice = toolChoice;\n }\n if (system?.length) {\n ret.system = system;\n }\n if (config?.thinking) {\n ret.thinking = config?.thinking;\n }\n\n return ret;\n }\n\n return {\n responseToString,\n responseToChatGeneration,\n chunkToString,\n responseToBaseMessage,\n responseToChatResult,\n formatData,\n };\n}\n\nexport function validateClaudeParams(_params: GoogleAIModelParams): void {\n // FIXME - validate the parameters\n}\n\nexport function isModelClaude(modelName: string): boolean {\n return modelName.toLowerCase().startsWith(\"claude\");\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"anthropic.cjs","names":["AIMessageChunk","ChatGenerationChunk"],"sources":["../../src/utils/anthropic.ts"],"sourcesContent":["import {\n ChatGeneration,\n ChatGenerationChunk,\n ChatResult,\n} from \"@langchain/core/outputs\";\nimport {\n BaseMessage,\n BaseMessageChunk,\n AIMessageChunk,\n MessageContentComplex,\n MessageContentText,\n MessageContent,\n MessageContentImageUrl,\n AIMessageFields,\n AIMessageChunkFields,\n AIMessage,\n StandardContentBlockConverter,\n StandardImageBlock,\n StandardTextBlock,\n StandardFileBlock,\n DataContentBlock,\n isDataContentBlock,\n convertToProviderContentBlock,\n parseBase64DataUrl,\n UsageMetadata,\n} from \"@langchain/core/messages\";\nimport {\n ToolCall,\n ToolCallChunk,\n ToolMessage,\n} from \"@langchain/core/messages/tool\";\nimport {\n AnthropicAPIConfig,\n AnthropicCacheControl,\n AnthropicContent,\n AnthropicContentRedactedThinking,\n AnthropicContentText,\n AnthropicContentThinking,\n AnthropicContentToolUse,\n AnthropicMessage,\n AnthropicMessageContent,\n AnthropicMessageContentDocument,\n AnthropicMessageContentImage,\n AnthropicMessageContentRedactedThinking,\n AnthropicMessageContentText,\n AnthropicMessageContentThinking,\n AnthropicMessageContentToolResult,\n AnthropicMessageContentToolResultContent,\n AnthropicMessageContentToolUse,\n AnthropicRequest,\n AnthropicRequestSettings,\n AnthropicResponseData,\n AnthropicResponseMessage,\n AnthropicStreamContentBlockDeltaEvent,\n AnthropicStreamContentBlockStartEvent,\n AnthropicStreamInputJsonDelta,\n AnthropicStreamMessageDeltaEvent,\n AnthropicStreamMessageStartEvent,\n AnthropicStreamTextDelta,\n AnthropicTool,\n AnthropicToolChoice,\n GeminiTool,\n GoogleAIAPI,\n GoogleAIModelParams,\n GoogleAIModelRequestParams,\n GoogleAIToolType,\n GoogleLLMResponse,\n} from \"../types.js\";\n\nexport function getAnthropicAPI(config?: AnthropicAPIConfig): GoogleAIAPI {\n function partToString(part: AnthropicContent): string {\n return \"text\" in part ? part.text : \"\";\n }\n\n function messageToString(message: AnthropicResponseMessage): string {\n const content: AnthropicContent[] = message?.content ?? [];\n const ret = content.reduce((acc, part) => {\n const str = partToString(part);\n return acc + str;\n }, \"\");\n return ret;\n }\n\n function responseToString(response: GoogleLLMResponse): string {\n const data = response.data as AnthropicResponseData;\n switch (data?.type) {\n case \"message\":\n return messageToString(data as AnthropicResponseMessage);\n default:\n throw Error(`Unknown type: ${data?.type}`);\n }\n }\n\n /**\n * Normalize the AIMessageChunk.\n * If the fields are just a string - use that as content.\n * If the content is an array of just text fields, turn them into a string.\n * @param fields\n */\n function newAIMessageChunk(fields: string | AIMessageFields): AIMessageChunk {\n if (typeof fields === \"string\") {\n return new AIMessageChunk(fields);\n }\n const ret: AIMessageFields = {\n ...fields,\n };\n\n if (Array.isArray(fields?.content)) {\n let str: string | undefined = \"\";\n fields.content.forEach((val) => {\n if (str !== undefined && val.type === \"text\") {\n str = `${str}${val.text}`;\n } else {\n str = undefined;\n }\n });\n if (str) {\n ret.content = str;\n }\n }\n\n return new AIMessageChunk(ret);\n }\n\n function textContentToMessageFields(\n textContent: AnthropicContentText\n ): AIMessageFields {\n return {\n content: [textContent],\n };\n }\n\n function toolUseContentToMessageFields(\n toolUseContent: AnthropicContentToolUse\n ): AIMessageFields {\n const tool: ToolCall = {\n id: toolUseContent.id,\n name: toolUseContent.name,\n type: \"tool_call\",\n args: toolUseContent.input,\n };\n return {\n content: [],\n tool_calls: [tool],\n };\n }\n\n function thinkingContentToMessageFields(\n thinkingContent: AnthropicContentThinking\n ): AIMessageFields {\n // TODO: Once a reasoning/thinking type is defined in LangChain, use it\n return {\n content: [thinkingContent],\n };\n }\n\n function redactedThinkingContentToMessageFields(\n thinkingContent: AnthropicContentRedactedThinking\n ): AIMessageFields {\n // TODO: Once a reasoning/thinking type is defined in LangChain, use it\n return {\n content: [thinkingContent],\n };\n }\n\n function anthropicContentToMessageFields(\n anthropicContent: AnthropicContent\n ): AIMessageFields | undefined {\n const type = anthropicContent?.type;\n switch (type) {\n case \"text\":\n return textContentToMessageFields(anthropicContent);\n case \"tool_use\":\n return toolUseContentToMessageFields(anthropicContent);\n case \"thinking\":\n return thinkingContentToMessageFields(anthropicContent);\n case \"redacted_thinking\":\n return redactedThinkingContentToMessageFields(anthropicContent);\n default:\n console.error(`Unknown message type: ${type}`, anthropicContent);\n return undefined;\n }\n }\n\n function contentToMessage(\n anthropicContent: AnthropicContent[]\n ): BaseMessageChunk {\n const complexContent: MessageContentComplex[] = [];\n const toolCalls: ToolCall[] = [];\n anthropicContent.forEach((ac) => {\n const messageFields = anthropicContentToMessageFields(ac);\n if (messageFields?.content) {\n complexContent.push(\n ...(messageFields.content as MessageContentComplex[])\n );\n }\n if (messageFields?.tool_calls) {\n toolCalls.push(...messageFields.tool_calls);\n }\n });\n\n const ret: AIMessageFields = {\n content: complexContent,\n tool_calls: toolCalls,\n };\n return newAIMessageChunk(ret);\n }\n\n function messageToUsageMetadata(\n message: AnthropicResponseMessage\n ): UsageMetadata {\n const usage = message?.usage;\n const inputTokens = usage?.input_tokens ?? 0;\n const outputTokens = usage?.output_tokens ?? 0;\n const usageMetadata: UsageMetadata = {\n input_tokens: inputTokens,\n output_tokens: outputTokens,\n total_tokens: inputTokens + outputTokens,\n input_token_details: {\n cache_read: usage?.cache_read_input_tokens ?? 0,\n cache_creation: usage?.cache_creation_input_tokens ?? 0,\n },\n };\n return usageMetadata;\n }\n\n function messageToGenerationInfo(message: AnthropicResponseMessage) {\n const usageMetadata = messageToUsageMetadata(message);\n\n return {\n usage_metadata: usageMetadata,\n finish_reason: message.stop_reason,\n };\n }\n\n function messageToChatGeneration(\n responseMessage: AnthropicResponseMessage\n ): ChatGenerationChunk {\n const content: AnthropicContent[] = responseMessage?.content ?? [];\n const text = messageToString(responseMessage);\n const message = contentToMessage(content);\n const generationInfo = messageToGenerationInfo(responseMessage);\n return new ChatGenerationChunk({\n text,\n message,\n generationInfo,\n });\n }\n\n function messageStartToChatGeneration(\n event: AnthropicStreamMessageStartEvent\n ): ChatGenerationChunk {\n const responseMessage = event.message;\n return messageToChatGeneration(responseMessage);\n }\n\n function messageDeltaToChatGeneration(\n event: AnthropicStreamMessageDeltaEvent\n ): ChatGenerationChunk {\n const responseMessage = event.delta;\n return messageToChatGeneration(responseMessage as AnthropicResponseMessage);\n }\n\n function contentBlockStartTextToChatGeneration(\n event: AnthropicStreamContentBlockStartEvent\n ): ChatGenerationChunk | null {\n const content = event.content_block;\n const text = \"text\" in content ? content.text : \"\";\n const message = new AIMessageChunk({\n content: [{ index: event.index, ...content }],\n });\n return new ChatGenerationChunk({\n message,\n text,\n });\n }\n\n function contentBlockStartToolUseToChatGeneration(\n event: AnthropicStreamContentBlockStartEvent\n ): ChatGenerationChunk | null {\n const contentBlock = event.content_block as AnthropicContentToolUse;\n const text: string = \"\";\n const toolChunk: ToolCallChunk = {\n type: \"tool_call_chunk\",\n index: event.index,\n name: contentBlock.name,\n id: contentBlock.id,\n };\n if (\n typeof contentBlock.input === \"object\" &&\n Object.keys(contentBlock.input).length > 0\n ) {\n toolChunk.args = JSON.stringify(contentBlock.input);\n }\n const toolChunks: ToolCallChunk[] = [toolChunk];\n\n const content: MessageContentComplex[] = [\n {\n index: event.index,\n ...contentBlock,\n },\n ];\n const messageFields: AIMessageChunkFields = {\n content,\n tool_call_chunks: toolChunks,\n };\n const message = newAIMessageChunk(messageFields);\n return new ChatGenerationChunk({\n message,\n text,\n });\n }\n\n function contentBlockStartToChatGeneration(\n event: AnthropicStreamContentBlockStartEvent\n ): ChatGenerationChunk | null {\n switch (event.content_block.type) {\n case \"text\":\n return contentBlockStartTextToChatGeneration(event);\n case \"tool_use\":\n return contentBlockStartToolUseToChatGeneration(event);\n default:\n console.warn(\n `Unexpected start content_block type: ${JSON.stringify(event)}`\n );\n return null;\n }\n }\n\n function contentBlockDeltaTextToChatGeneration(\n event: AnthropicStreamContentBlockDeltaEvent\n ): ChatGenerationChunk {\n const delta = event.delta as AnthropicStreamTextDelta;\n const text = delta?.text;\n const message = new AIMessageChunk({\n content: [{ index: event.index, type: \"text\", text }],\n });\n return new ChatGenerationChunk({\n message,\n text,\n });\n }\n\n function contentBlockDeltaInputJsonDeltaToChatGeneration(\n event: AnthropicStreamContentBlockDeltaEvent\n ): ChatGenerationChunk {\n const delta = event.delta as AnthropicStreamInputJsonDelta;\n const text: string = \"\";\n const toolChunks: ToolCallChunk[] = [\n {\n index: event.index,\n args: delta.partial_json,\n },\n ];\n const content: MessageContentComplex[] = [\n {\n index: event.index,\n ...delta,\n },\n ];\n const messageFields: AIMessageChunkFields = {\n content,\n tool_call_chunks: toolChunks,\n };\n const message = newAIMessageChunk(messageFields);\n return new ChatGenerationChunk({\n message,\n text,\n });\n }\n\n function contentBlockDeltaToChatGeneration(\n event: AnthropicStreamContentBlockDeltaEvent\n ): ChatGenerationChunk | null {\n switch (event.delta.type) {\n case \"text_delta\":\n return contentBlockDeltaTextToChatGeneration(event);\n case \"input_json_delta\":\n return contentBlockDeltaInputJsonDeltaToChatGeneration(event);\n default:\n console.warn(\n `Unexpected delta content_block type: ${JSON.stringify(event)}`\n );\n return null;\n }\n }\n\n function responseToChatGeneration(\n response: GoogleLLMResponse\n ): ChatGenerationChunk | null {\n const data = response.data as AnthropicResponseData;\n switch (data.type) {\n case \"message\":\n return messageToChatGeneration(data as AnthropicResponseMessage);\n case \"message_start\":\n return messageStartToChatGeneration(\n data as AnthropicStreamMessageStartEvent\n );\n case \"message_delta\":\n return messageDeltaToChatGeneration(\n data as AnthropicStreamMessageDeltaEvent\n );\n case \"content_block_start\":\n return contentBlockStartToChatGeneration(\n data as AnthropicStreamContentBlockStartEvent\n );\n case \"content_block_delta\":\n return contentBlockDeltaToChatGeneration(\n data as AnthropicStreamContentBlockDeltaEvent\n );\n\n case \"ping\":\n case \"message_stop\":\n case \"content_block_stop\":\n // These are ignorable\n return null;\n\n case \"error\":\n throw new Error(\n `Error while streaming results: ${JSON.stringify(data)}`\n );\n\n default:\n // We don't know what type this is, but Anthropic may have added\n // new ones without telling us. Don't error, but don't use them.\n console.warn(\"Unknown data for responseToChatGeneration\", data);\n // throw new Error(`Unknown response type: ${data.type}`);\n return null;\n }\n }\n\n function chunkToString(chunk: BaseMessageChunk): string {\n if (chunk === null) {\n return \"\";\n } else if (typeof chunk.content === \"string\") {\n return chunk.content;\n } else if (chunk.content.length === 0) {\n return \"\";\n } else if (chunk.content[0].type === \"text\") {\n return chunk.content[0].text;\n } else {\n throw new Error(`Unexpected chunk: ${chunk}`);\n }\n }\n\n function responseToBaseMessage(response: GoogleLLMResponse): BaseMessage {\n const data = response.data as AnthropicResponseMessage;\n const content: AnthropicContent[] = data?.content ?? [];\n return contentToMessage(content);\n }\n\n function responseToChatResult(response: GoogleLLMResponse): ChatResult {\n const message = response.data as AnthropicResponseMessage;\n const generations: ChatGeneration[] = [];\n const gen = responseToChatGeneration(response);\n if (gen) {\n generations.push(gen);\n }\n const llmOutput = messageToGenerationInfo(message);\n return {\n generations,\n llmOutput,\n };\n }\n\n function formatAnthropicVersion(): string {\n return config?.version ?? \"vertex-2023-10-16\";\n }\n\n function textContentToAnthropicContent(\n content: MessageContentText\n ): AnthropicMessageContentText | undefined {\n if (!content.text) {\n return undefined;\n }\n return { type: \"text\", text: content.text };\n }\n\n function extractMimeType(\n str: string\n ): { media_type: string; data: string } | null {\n if (str.startsWith(\"data:\")) {\n return {\n media_type: str.split(\":\")[1].split(\";\")[0],\n data: str.split(\",\")[1],\n };\n }\n return null;\n }\n\n function imageContentToAnthropicContent(\n content: MessageContentImageUrl\n ): AnthropicMessageContentImage | undefined {\n const dataUrl = content.image_url;\n const url = typeof dataUrl === \"string\" ? dataUrl : dataUrl?.url;\n const urlInfo = extractMimeType(url);\n\n if (!urlInfo) {\n return undefined;\n }\n\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n ...urlInfo,\n },\n };\n }\n\n function toolUseContentToAnthropicContent(\n content: Record<string, unknown>\n ): AnthropicMessageContentToolUse {\n return {\n type: \"tool_use\",\n id: content.id as string,\n name: content.name as string,\n input: content.input as Record<string, unknown>,\n };\n }\n\n function thinkingContentToAnthropicContent(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n content: Record<string, any>\n ): AnthropicMessageContentThinking | undefined {\n // TODO: Once a Langchain Thinking type is defined, use it\n return {\n type: \"thinking\",\n thinking: content.thinking,\n signature: content.signature,\n };\n }\n\n function redactedThinkingContentToAnthropicContent(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n content: Record<string, any>\n ): AnthropicMessageContentRedactedThinking | undefined {\n // TODO: Once a Langchain Thinking type is defined, use it\n return {\n type: \"redacted_thinking\",\n data: content.data,\n };\n }\n\n function contentComplexToAnthropicContent(\n content: MessageContentComplex\n ): AnthropicMessageContent | undefined {\n const type = content?.type;\n switch (type) {\n case \"text\":\n return textContentToAnthropicContent(content as MessageContentText);\n case \"image_url\":\n return imageContentToAnthropicContent(\n content as MessageContentImageUrl\n );\n case \"tool_use\":\n return toolUseContentToAnthropicContent(content);\n case \"thinking\":\n return thinkingContentToAnthropicContent(\n content as Record<string, unknown>\n );\n case \"redacted_thinking\":\n return redactedThinkingContentToAnthropicContent(\n content as Record<string, unknown>\n );\n default:\n if (type === \"tool_call\") {\n return undefined;\n }\n console.warn(`Unexpected content type: ${type}`, content);\n return undefined;\n }\n }\n\n const anthropicContentConverter: StandardContentBlockConverter<{\n text: AnthropicMessageContentText;\n image: AnthropicMessageContentImage;\n file: AnthropicMessageContentDocument;\n }> = {\n providerName: \"anthropic\",\n\n fromStandardTextBlock(\n block: StandardTextBlock\n ): AnthropicMessageContentText {\n return {\n type: \"text\",\n text: block.text,\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n };\n },\n\n fromStandardImageBlock(\n block: StandardImageBlock\n ): AnthropicMessageContentImage {\n if (block.source_type === \"url\") {\n const data = parseBase64DataUrl({\n dataUrl: block.url,\n asTypedArray: false,\n });\n if (data) {\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n data: data.data,\n media_type: data.mime_type,\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? { cache_control: block.metadata!.cache_control }\n : {}),\n } as AnthropicMessageContentImage;\n } else {\n return {\n type: \"image\",\n source: {\n type: \"url\",\n url: block.url,\n media_type: block.mime_type ?? \"\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? { cache_control: block.metadata!.cache_control }\n : {}),\n } as AnthropicMessageContentImage;\n }\n } else {\n if (block.source_type === \"base64\") {\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n data: block.data,\n media_type: block.mime_type ?? \"\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? { cache_control: block.metadata!.cache_control }\n : {}),\n } as AnthropicMessageContentImage;\n } else {\n throw new Error(\n `Unsupported image source type: ${block.source_type}`\n );\n }\n }\n },\n\n fromStandardFileBlock(\n block: StandardFileBlock\n ): AnthropicMessageContentDocument {\n const mime_type = (block.mime_type ?? \"\").split(\";\")[0];\n\n if (block.source_type === \"url\") {\n if (mime_type === \"application/pdf\" || mime_type === \"\") {\n return {\n type: \"document\",\n source: {\n type: \"url\",\n url: block.url,\n media_type: block.mime_type ?? \"\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n ...(\"citations\" in (block.metadata ?? {})\n ? {\n citations: block.metadata!.citations as { enabled?: boolean },\n }\n : {}),\n ...(\"context\" in (block.metadata ?? {})\n ? { context: block.metadata!.context as string }\n : {}),\n ...(block.metadata?.title ||\n block.metadata?.filename ||\n block.metadata?.name\n ? {\n title: (block.metadata?.title ||\n block.metadata?.filename ||\n block.metadata?.name) as string,\n }\n : {}),\n };\n }\n throw new Error(\n `Unsupported file mime type for file url source: ${block.mime_type}`\n );\n } else if (block.source_type === \"text\") {\n if (mime_type === \"text/plain\" || mime_type === \"\") {\n return {\n type: \"document\",\n source: {\n type: \"text\",\n data: block.text,\n media_type: block.mime_type ?? \"\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n ...(\"citations\" in (block.metadata ?? {})\n ? {\n citations: block.metadata!.citations as { enabled?: boolean },\n }\n : {}),\n ...(\"context\" in (block.metadata ?? {})\n ? { context: block.metadata!.context as string }\n : {}),\n ...(\"title\" in (block.metadata ?? {})\n ? { title: block.metadata!.title as string }\n : {}),\n };\n } else {\n throw new Error(\n `Unsupported file mime type for file text source: ${block.mime_type}`\n );\n }\n } else if (block.source_type === \"base64\") {\n if (mime_type === \"application/pdf\" || mime_type === \"\") {\n return {\n type: \"document\",\n source: {\n type: \"base64\",\n data: block.data,\n media_type: \"application/pdf\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n ...(\"citations\" in (block.metadata ?? {})\n ? {\n citations: block.metadata!.citations as { enabled?: boolean },\n }\n : {}),\n ...(\"context\" in (block.metadata ?? {})\n ? { context: block.metadata!.context as string }\n : {}),\n ...(\"title\" in (block.metadata ?? {})\n ? { title: block.metadata!.title as string }\n : {}),\n };\n } else if (\n [\"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\"].includes(\n mime_type\n )\n ) {\n return {\n type: \"document\",\n source: {\n type: \"content\",\n content: [\n {\n type: \"image\",\n source: {\n type: \"base64\",\n data: block.data,\n media_type: mime_type as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\n },\n },\n ],\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n ...(\"citations\" in (block.metadata ?? {})\n ? {\n citations: block.metadata!.citations as { enabled?: boolean },\n }\n : {}),\n ...(\"context\" in (block.metadata ?? {})\n ? { context: block.metadata!.context as string }\n : {}),\n ...(\"title\" in (block.metadata ?? {})\n ? { title: block.metadata!.title as string }\n : {}),\n };\n } else {\n throw new Error(\n `Unsupported file mime type for file base64 source: ${block.mime_type}`\n );\n }\n } else {\n throw new Error(`Unsupported file source type: ${block.source_type}`);\n }\n },\n };\n\n function contentToAnthropicContent(\n content: MessageContent | DataContentBlock[]\n ): AnthropicMessageContent[] {\n const ca =\n typeof content === \"string\" ? [{ type: \"text\", text: content }] : content;\n return ca\n .map((complex) =>\n isDataContentBlock(complex)\n ? convertToProviderContentBlock(complex, anthropicContentConverter)\n : contentComplexToAnthropicContent(complex)\n )\n .filter(Boolean) as AnthropicMessageContent[];\n }\n\n function toolCallToAnthropicContent(\n toolCall: ToolCall\n ): AnthropicMessageContentToolUse {\n return {\n type: \"tool_use\",\n id: toolCall.id!,\n name: toolCall.name,\n input: toolCall.args,\n };\n }\n\n function toolCallsToAnthropicContent(\n toolCalls: ToolCall[] | undefined\n ): AnthropicMessageContentToolUse[] {\n if (toolCalls === undefined) {\n return [];\n }\n return toolCalls.map(toolCallToAnthropicContent);\n }\n\n function baseRoleToAnthropicMessage(\n base: BaseMessage,\n role: string\n ): AnthropicMessage {\n const content = contentToAnthropicContent(base.content);\n return {\n role,\n content,\n };\n }\n\n function aiMessageToAnthropicMessage(base: AIMessage): AnthropicMessage {\n const ret = baseRoleToAnthropicMessage(base, \"assistant\");\n\n const content = ret.content as AnthropicMessageContent[];\n const existingToolUseIds = new Set(\n content\n .filter(\n (block): block is AnthropicMessageContentToolUse =>\n block.type === \"tool_use\"\n )\n .map((block) => block.id)\n );\n\n const toolContent = toolCallsToAnthropicContent(base.tool_calls).filter(\n (block) => !existingToolUseIds.has(block.id)\n );\n if (toolContent.length > 0) {\n ret.content = [...content, ...toolContent];\n }\n\n return ret;\n }\n\n function toolMessageToAnthropicMessage(base: ToolMessage): AnthropicMessage {\n const role = \"user\";\n const toolUseId = base.tool_call_id;\n const toolContent = contentToAnthropicContent(\n base.content\n ) as AnthropicMessageContentToolResultContent[];\n const content: AnthropicMessageContentToolResult[] = [\n {\n type: \"tool_result\",\n tool_use_id: toolUseId,\n content: toolContent,\n },\n ];\n return {\n role,\n content,\n };\n }\n\n function baseToAnthropicMessage(\n base: BaseMessage\n ): AnthropicMessage | undefined {\n const type = base._getType();\n switch (type) {\n case \"human\":\n return baseRoleToAnthropicMessage(base, \"user\");\n case \"ai\":\n return aiMessageToAnthropicMessage(base as AIMessage);\n case \"tool\":\n return toolMessageToAnthropicMessage(base as ToolMessage);\n case \"system\":\n // System messages are handled in formatSystem()\n return undefined;\n default:\n console.warn(`Unknown BaseMessage type: ${type}`, base);\n return undefined;\n }\n }\n\n function formatMessages(input: BaseMessage[]): AnthropicMessage[] {\n const ret: AnthropicMessage[] = [];\n\n input.forEach((baseMessage) => {\n const anthropicMessage = baseToAnthropicMessage(baseMessage);\n if (anthropicMessage) {\n ret.push(anthropicMessage);\n }\n });\n\n return ret;\n }\n\n function formatSettings(\n parameters: GoogleAIModelRequestParams\n ): AnthropicRequestSettings {\n const ret: AnthropicRequestSettings = {\n stream: parameters?.streaming ?? false,\n max_tokens: parameters?.maxOutputTokens ?? 8192,\n };\n\n if (parameters.topP) {\n ret.top_p = parameters.topP;\n }\n if (parameters.topK) {\n ret.top_k = parameters.topK;\n }\n if (parameters.temperature) {\n ret.temperature = parameters.temperature;\n }\n if (parameters.stopSequences) {\n ret.stop_sequences = parameters.stopSequences;\n }\n\n return ret;\n }\n\n function contentComplexArrayToText(\n contentArray: MessageContentComplex[]\n ): string {\n let ret = \"\";\n\n contentArray.forEach((content) => {\n const contentType = content?.type;\n if (contentType === \"text\") {\n const textContent = content as MessageContentText;\n ret = `${ret}\\n${textContent.text}`;\n }\n });\n\n return ret;\n }\n\n function formatSystem(input: BaseMessage[]): string {\n let ret = \"\";\n\n input.forEach((message) => {\n if (message._getType() === \"system\") {\n const content = message?.content;\n const contentString =\n typeof content === \"string\"\n ? (content as string)\n : contentComplexArrayToText(content as MessageContentComplex[]);\n ret = `${ret}\\n${contentString}`;\n }\n });\n\n return ret;\n }\n\n function formatGeminiTool(tool: GeminiTool): AnthropicTool[] {\n if (Object.hasOwn(tool, \"functionDeclarations\")) {\n const funcs = tool?.functionDeclarations ?? [];\n return funcs.map((func) => {\n const inputSchema = func.parameters!;\n return {\n // type: \"tool\", // This may only be valid for models 20241022+\n name: func.name,\n description: func.description,\n input_schema: inputSchema,\n };\n });\n } else {\n console.warn(\n `Unable to format GeminiTool: ${JSON.stringify(tool, null, 1)}`\n );\n return [];\n }\n }\n\n function formatTool(tool: GoogleAIToolType): AnthropicTool[] {\n if (Object.hasOwn(tool, \"name\")) {\n return [tool as AnthropicTool];\n } else {\n return formatGeminiTool(tool as GeminiTool);\n }\n }\n\n function formatTools(\n parameters: GoogleAIModelRequestParams\n ): AnthropicTool[] {\n const tools: GoogleAIToolType[] = parameters?.tools ?? [];\n const ret: AnthropicTool[] = [];\n tools.forEach((tool) => {\n const anthropicTools = formatTool(tool);\n anthropicTools.forEach((anthropicTool) => {\n if (anthropicTool) {\n ret.push(anthropicTool);\n }\n });\n });\n return ret;\n }\n\n function formatToolChoice(\n parameters: GoogleAIModelRequestParams\n ): AnthropicToolChoice | undefined {\n const choice = parameters?.tool_choice;\n if (!choice) {\n return undefined;\n } else if (typeof choice === \"object\") {\n return choice as AnthropicToolChoice;\n } else {\n switch (choice) {\n case \"any\":\n case \"auto\":\n return {\n type: choice,\n };\n case \"none\":\n return undefined;\n default:\n return {\n type: \"tool\",\n name: choice,\n };\n }\n }\n }\n\n async function formatData(\n input: unknown,\n parameters: GoogleAIModelRequestParams\n ): Promise<AnthropicRequest> {\n const typedInput = input as BaseMessage[];\n const anthropicVersion = formatAnthropicVersion();\n const messages = formatMessages(typedInput);\n const settings = formatSettings(parameters);\n const system = formatSystem(typedInput);\n const tools = formatTools(parameters);\n const toolChoice = formatToolChoice(parameters);\n const ret: AnthropicRequest = {\n anthropic_version: anthropicVersion,\n messages,\n ...settings,\n };\n if (tools && tools.length && parameters?.tool_choice !== \"none\") {\n ret.tools = tools;\n }\n if (toolChoice) {\n ret.tool_choice = toolChoice;\n }\n if (system?.length) {\n ret.system = system;\n }\n if (config?.thinking) {\n ret.thinking = config?.thinking;\n }\n\n return ret;\n }\n\n return {\n responseToString,\n responseToChatGeneration,\n chunkToString,\n responseToBaseMessage,\n responseToChatResult,\n formatData,\n };\n}\n\nexport function validateClaudeParams(_params: GoogleAIModelParams): void {\n // FIXME - validate the parameters\n}\n\nexport function isModelClaude(modelName: string): boolean {\n return modelName.toLowerCase().startsWith(\"claude\");\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.js","names":[],"sources":["../../src/utils/anthropic.ts"],"sourcesContent":["import {\n ChatGeneration,\n ChatGenerationChunk,\n ChatResult,\n} from \"@langchain/core/outputs\";\nimport {\n BaseMessage,\n BaseMessageChunk,\n AIMessageChunk,\n MessageContentComplex,\n MessageContentText,\n MessageContent,\n MessageContentImageUrl,\n AIMessageFields,\n AIMessageChunkFields,\n AIMessage,\n StandardContentBlockConverter,\n StandardImageBlock,\n StandardTextBlock,\n StandardFileBlock,\n DataContentBlock,\n isDataContentBlock,\n convertToProviderContentBlock,\n parseBase64DataUrl,\n UsageMetadata,\n} from \"@langchain/core/messages\";\nimport {\n ToolCall,\n ToolCallChunk,\n ToolMessage,\n} from \"@langchain/core/messages/tool\";\nimport {\n AnthropicAPIConfig,\n AnthropicCacheControl,\n AnthropicContent,\n AnthropicContentRedactedThinking,\n AnthropicContentText,\n AnthropicContentThinking,\n AnthropicContentToolUse,\n AnthropicMessage,\n AnthropicMessageContent,\n AnthropicMessageContentDocument,\n AnthropicMessageContentImage,\n AnthropicMessageContentRedactedThinking,\n AnthropicMessageContentText,\n AnthropicMessageContentThinking,\n AnthropicMessageContentToolResult,\n AnthropicMessageContentToolResultContent,\n AnthropicMessageContentToolUse,\n AnthropicRequest,\n AnthropicRequestSettings,\n AnthropicResponseData,\n AnthropicResponseMessage,\n AnthropicStreamContentBlockDeltaEvent,\n AnthropicStreamContentBlockStartEvent,\n AnthropicStreamInputJsonDelta,\n AnthropicStreamMessageDeltaEvent,\n AnthropicStreamMessageStartEvent,\n AnthropicStreamTextDelta,\n AnthropicTool,\n AnthropicToolChoice,\n GeminiTool,\n GoogleAIAPI,\n GoogleAIModelParams,\n GoogleAIModelRequestParams,\n GoogleAIToolType,\n GoogleLLMResponse,\n} from \"../types.js\";\n\nexport function getAnthropicAPI(config?: AnthropicAPIConfig): GoogleAIAPI {\n function partToString(part: AnthropicContent): string {\n return \"text\" in part ? part.text : \"\";\n }\n\n function messageToString(message: AnthropicResponseMessage): string {\n const content: AnthropicContent[] = message?.content ?? [];\n const ret = content.reduce((acc, part) => {\n const str = partToString(part);\n return acc + str;\n }, \"\");\n return ret;\n }\n\n function responseToString(response: GoogleLLMResponse): string {\n const data = response.data as AnthropicResponseData;\n switch (data?.type) {\n case \"message\":\n return messageToString(data as AnthropicResponseMessage);\n default:\n throw Error(`Unknown type: ${data?.type}`);\n }\n }\n\n /**\n * Normalize the AIMessageChunk.\n * If the fields are just a string - use that as content.\n * If the content is an array of just text fields, turn them into a string.\n * @param fields\n */\n function newAIMessageChunk(fields: string | AIMessageFields): AIMessageChunk {\n if (typeof fields === \"string\") {\n return new AIMessageChunk(fields);\n }\n const ret: AIMessageFields = {\n ...fields,\n };\n\n if (Array.isArray(fields?.content)) {\n let str: string | undefined = \"\";\n fields.content.forEach((val) => {\n if (str !== undefined && val.type === \"text\") {\n str = `${str}${val.text}`;\n } else {\n str = undefined;\n }\n });\n if (str) {\n ret.content = str;\n }\n }\n\n return new AIMessageChunk(ret);\n }\n\n function textContentToMessageFields(\n textContent: AnthropicContentText\n ): AIMessageFields {\n return {\n content: [textContent],\n };\n }\n\n function toolUseContentToMessageFields(\n toolUseContent: AnthropicContentToolUse\n ): AIMessageFields {\n const tool: ToolCall = {\n id: toolUseContent.id,\n name: toolUseContent.name,\n type: \"tool_call\",\n args: toolUseContent.input,\n };\n return {\n content: [],\n tool_calls: [tool],\n };\n }\n\n function thinkingContentToMessageFields(\n thinkingContent: AnthropicContentThinking\n ): AIMessageFields {\n // TODO: Once a reasoning/thinking type is defined in LangChain, use it\n return {\n content: [thinkingContent],\n };\n }\n\n function redactedThinkingContentToMessageFields(\n thinkingContent: AnthropicContentRedactedThinking\n ): AIMessageFields {\n // TODO: Once a reasoning/thinking type is defined in LangChain, use it\n return {\n content: [thinkingContent],\n };\n }\n\n function anthropicContentToMessageFields(\n anthropicContent: AnthropicContent\n ): AIMessageFields | undefined {\n const type = anthropicContent?.type;\n switch (type) {\n case \"text\":\n return textContentToMessageFields(anthropicContent);\n case \"tool_use\":\n return toolUseContentToMessageFields(anthropicContent);\n case \"thinking\":\n return thinkingContentToMessageFields(anthropicContent);\n case \"redacted_thinking\":\n return redactedThinkingContentToMessageFields(anthropicContent);\n default:\n console.error(`Unknown message type: ${type}`, anthropicContent);\n return undefined;\n }\n }\n\n function contentToMessage(\n anthropicContent: AnthropicContent[]\n ): BaseMessageChunk {\n const complexContent: MessageContentComplex[] = [];\n const toolCalls: ToolCall[] = [];\n anthropicContent.forEach((ac) => {\n const messageFields = anthropicContentToMessageFields(ac);\n if (messageFields?.content) {\n complexContent.push(\n ...(messageFields.content as MessageContentComplex[])\n );\n }\n if (messageFields?.tool_calls) {\n toolCalls.push(...messageFields.tool_calls);\n }\n });\n\n const ret: AIMessageFields = {\n content: complexContent,\n tool_calls: toolCalls,\n };\n return newAIMessageChunk(ret);\n }\n\n function messageToUsageMetadata(\n message: AnthropicResponseMessage\n ): UsageMetadata {\n const usage = message?.usage;\n const inputTokens = usage?.input_tokens ?? 0;\n const outputTokens = usage?.output_tokens ?? 0;\n const usageMetadata: UsageMetadata = {\n input_tokens: inputTokens,\n output_tokens: outputTokens,\n total_tokens: inputTokens + outputTokens,\n input_token_details: {\n cache_read: usage?.cache_read_input_tokens ?? 0,\n cache_creation: usage?.cache_creation_input_tokens ?? 0,\n },\n };\n return usageMetadata;\n }\n\n function messageToGenerationInfo(message: AnthropicResponseMessage) {\n const usageMetadata = messageToUsageMetadata(message);\n\n return {\n usage_metadata: usageMetadata,\n finish_reason: message.stop_reason,\n };\n }\n\n function messageToChatGeneration(\n responseMessage: AnthropicResponseMessage\n ): ChatGenerationChunk {\n const content: AnthropicContent[] = responseMessage?.content ?? [];\n const text = messageToString(responseMessage);\n const message = contentToMessage(content);\n const generationInfo = messageToGenerationInfo(responseMessage);\n return new ChatGenerationChunk({\n text,\n message,\n generationInfo,\n });\n }\n\n function messageStartToChatGeneration(\n event: AnthropicStreamMessageStartEvent\n ): ChatGenerationChunk {\n const responseMessage = event.message;\n return messageToChatGeneration(responseMessage);\n }\n\n function messageDeltaToChatGeneration(\n event: AnthropicStreamMessageDeltaEvent\n ): ChatGenerationChunk {\n const responseMessage = event.delta;\n return messageToChatGeneration(responseMessage as AnthropicResponseMessage);\n }\n\n function contentBlockStartTextToChatGeneration(\n event: AnthropicStreamContentBlockStartEvent\n ): ChatGenerationChunk | null {\n const content = event.content_block;\n const text = \"text\" in content ? content.text : \"\";\n const message = new AIMessageChunk({\n content: [{ index: event.index, ...content }],\n });\n return new ChatGenerationChunk({\n message,\n text,\n });\n }\n\n function contentBlockStartToolUseToChatGeneration(\n event: AnthropicStreamContentBlockStartEvent\n ): ChatGenerationChunk | null {\n const contentBlock = event.content_block as AnthropicContentToolUse;\n const text: string = \"\";\n const toolChunk: ToolCallChunk = {\n type: \"tool_call_chunk\",\n index: event.index,\n name: contentBlock.name,\n id: contentBlock.id,\n };\n if (\n typeof contentBlock.input === \"object\" &&\n Object.keys(contentBlock.input).length > 0\n ) {\n toolChunk.args = JSON.stringify(contentBlock.input);\n }\n const toolChunks: ToolCallChunk[] = [toolChunk];\n\n const content: MessageContentComplex[] = [\n {\n index: event.index,\n ...contentBlock,\n },\n ];\n const messageFields: AIMessageChunkFields = {\n content,\n tool_call_chunks: toolChunks,\n };\n const message = newAIMessageChunk(messageFields);\n return new ChatGenerationChunk({\n message,\n text,\n });\n }\n\n function contentBlockStartToChatGeneration(\n event: AnthropicStreamContentBlockStartEvent\n ): ChatGenerationChunk | null {\n switch (event.content_block.type) {\n case \"text\":\n return contentBlockStartTextToChatGeneration(event);\n case \"tool_use\":\n return contentBlockStartToolUseToChatGeneration(event);\n default:\n console.warn(\n `Unexpected start content_block type: ${JSON.stringify(event)}`\n );\n return null;\n }\n }\n\n function contentBlockDeltaTextToChatGeneration(\n event: AnthropicStreamContentBlockDeltaEvent\n ): ChatGenerationChunk {\n const delta = event.delta as AnthropicStreamTextDelta;\n const text = delta?.text;\n const message = new AIMessageChunk({\n content: [{ index: event.index, type: \"text\", text }],\n });\n return new ChatGenerationChunk({\n message,\n text,\n });\n }\n\n function contentBlockDeltaInputJsonDeltaToChatGeneration(\n event: AnthropicStreamContentBlockDeltaEvent\n ): ChatGenerationChunk {\n const delta = event.delta as AnthropicStreamInputJsonDelta;\n const text: string = \"\";\n const toolChunks: ToolCallChunk[] = [\n {\n index: event.index,\n args: delta.partial_json,\n },\n ];\n const content: MessageContentComplex[] = [\n {\n index: event.index,\n ...delta,\n },\n ];\n const messageFields: AIMessageChunkFields = {\n content,\n tool_call_chunks: toolChunks,\n };\n const message = newAIMessageChunk(messageFields);\n return new ChatGenerationChunk({\n message,\n text,\n });\n }\n\n function contentBlockDeltaToChatGeneration(\n event: AnthropicStreamContentBlockDeltaEvent\n ): ChatGenerationChunk | null {\n switch (event.delta.type) {\n case \"text_delta\":\n return contentBlockDeltaTextToChatGeneration(event);\n case \"input_json_delta\":\n return contentBlockDeltaInputJsonDeltaToChatGeneration(event);\n default:\n console.warn(\n `Unexpected delta content_block type: ${JSON.stringify(event)}`\n );\n return null;\n }\n }\n\n function responseToChatGeneration(\n response: GoogleLLMResponse\n ): ChatGenerationChunk | null {\n const data = response.data as AnthropicResponseData;\n switch (data.type) {\n case \"message\":\n return messageToChatGeneration(data as AnthropicResponseMessage);\n case \"message_start\":\n return messageStartToChatGeneration(\n data as AnthropicStreamMessageStartEvent\n );\n case \"message_delta\":\n return messageDeltaToChatGeneration(\n data as AnthropicStreamMessageDeltaEvent\n );\n case \"content_block_start\":\n return contentBlockStartToChatGeneration(\n data as AnthropicStreamContentBlockStartEvent\n );\n case \"content_block_delta\":\n return contentBlockDeltaToChatGeneration(\n data as AnthropicStreamContentBlockDeltaEvent\n );\n\n case \"ping\":\n case \"message_stop\":\n case \"content_block_stop\":\n // These are ignorable\n return null;\n\n case \"error\":\n throw new Error(\n `Error while streaming results: ${JSON.stringify(data)}`\n );\n\n default:\n // We don't know what type this is, but Anthropic may have added\n // new ones without telling us. Don't error, but don't use them.\n console.warn(\"Unknown data for responseToChatGeneration\", data);\n // throw new Error(`Unknown response type: ${data.type}`);\n return null;\n }\n }\n\n function chunkToString(chunk: BaseMessageChunk): string {\n if (chunk === null) {\n return \"\";\n } else if (typeof chunk.content === \"string\") {\n return chunk.content;\n } else if (chunk.content.length === 0) {\n return \"\";\n } else if (chunk.content[0].type === \"text\") {\n return chunk.content[0].text;\n } else {\n throw new Error(`Unexpected chunk: ${chunk}`);\n }\n }\n\n function responseToBaseMessage(response: GoogleLLMResponse): BaseMessage {\n const data = response.data as AnthropicResponseMessage;\n const content: AnthropicContent[] = data?.content ?? [];\n return contentToMessage(content);\n }\n\n function responseToChatResult(response: GoogleLLMResponse): ChatResult {\n const message = response.data as AnthropicResponseMessage;\n const generations: ChatGeneration[] = [];\n const gen = responseToChatGeneration(response);\n if (gen) {\n generations.push(gen);\n }\n const llmOutput = messageToGenerationInfo(message);\n return {\n generations,\n llmOutput,\n };\n }\n\n function formatAnthropicVersion(): string {\n return config?.version ?? \"vertex-2023-10-16\";\n }\n\n function textContentToAnthropicContent(\n content: MessageContentText\n ): AnthropicMessageContentText | undefined {\n if (!content.text) {\n return undefined;\n }\n return { type: \"text\", text: content.text };\n }\n\n function extractMimeType(\n str: string\n ): { media_type: string; data: string } | null {\n if (str.startsWith(\"data:\")) {\n return {\n media_type: str.split(\":\")[1].split(\";\")[0],\n data: str.split(\",\")[1],\n };\n }\n return null;\n }\n\n function imageContentToAnthropicContent(\n content: MessageContentImageUrl\n ): AnthropicMessageContentImage | undefined {\n const dataUrl = content.image_url;\n const url = typeof dataUrl === \"string\" ? dataUrl : dataUrl?.url;\n const urlInfo = extractMimeType(url);\n\n if (!urlInfo) {\n return undefined;\n }\n\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n ...urlInfo,\n },\n };\n }\n\n function toolUseContentToAnthropicContent(\n content: Record<string, unknown>\n ): AnthropicMessageContentToolUse {\n return {\n type: \"tool_use\",\n id: content.id as string,\n name: content.name as string,\n input: content.input as Record<string, unknown>,\n };\n }\n\n function thinkingContentToAnthropicContent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n content: Record<string, any>\n ): AnthropicMessageContentThinking | undefined {\n // TODO: Once a Langchain Thinking type is defined, use it\n return {\n type: \"thinking\",\n thinking: content.thinking,\n signature: content.signature,\n };\n }\n\n function redactedThinkingContentToAnthropicContent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n content: Record<string, any>\n ): AnthropicMessageContentRedactedThinking | undefined {\n // TODO: Once a Langchain Thinking type is defined, use it\n return {\n type: \"redacted_thinking\",\n data: content.data,\n };\n }\n\n function contentComplexToAnthropicContent(\n content: MessageContentComplex\n ): AnthropicMessageContent | undefined {\n const type = content?.type;\n switch (type) {\n case \"text\":\n return textContentToAnthropicContent(content as MessageContentText);\n case \"image_url\":\n return imageContentToAnthropicContent(\n content as MessageContentImageUrl\n );\n case \"tool_use\":\n return toolUseContentToAnthropicContent(content);\n case \"thinking\":\n return thinkingContentToAnthropicContent(\n content as Record<string, unknown>\n );\n case \"redacted_thinking\":\n return redactedThinkingContentToAnthropicContent(\n content as Record<string, unknown>\n );\n default:\n if (type === \"tool_call\") {\n return undefined;\n }\n console.warn(`Unexpected content type: ${type}`, content);\n return undefined;\n }\n }\n\n const anthropicContentConverter: StandardContentBlockConverter<{\n text: AnthropicMessageContentText;\n image: AnthropicMessageContentImage;\n file: AnthropicMessageContentDocument;\n }> = {\n providerName: \"anthropic\",\n\n fromStandardTextBlock(\n block: StandardTextBlock\n ): AnthropicMessageContentText {\n return {\n type: \"text\",\n text: block.text,\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n };\n },\n\n fromStandardImageBlock(\n block: StandardImageBlock\n ): AnthropicMessageContentImage {\n if (block.source_type === \"url\") {\n const data = parseBase64DataUrl({\n dataUrl: block.url,\n asTypedArray: false,\n });\n if (data) {\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n data: data.data,\n media_type: data.mime_type,\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? { cache_control: block.metadata!.cache_control }\n : {}),\n } as AnthropicMessageContentImage;\n } else {\n return {\n type: \"image\",\n source: {\n type: \"url\",\n url: block.url,\n media_type: block.mime_type ?? \"\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? { cache_control: block.metadata!.cache_control }\n : {}),\n } as AnthropicMessageContentImage;\n }\n } else {\n if (block.source_type === \"base64\") {\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n data: block.data,\n media_type: block.mime_type ?? \"\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? { cache_control: block.metadata!.cache_control }\n : {}),\n } as AnthropicMessageContentImage;\n } else {\n throw new Error(\n `Unsupported image source type: ${block.source_type}`\n );\n }\n }\n },\n\n fromStandardFileBlock(\n block: StandardFileBlock\n ): AnthropicMessageContentDocument {\n const mime_type = (block.mime_type ?? \"\").split(\";\")[0];\n\n if (block.source_type === \"url\") {\n if (mime_type === \"application/pdf\" || mime_type === \"\") {\n return {\n type: \"document\",\n source: {\n type: \"url\",\n url: block.url,\n media_type: block.mime_type ?? \"\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n ...(\"citations\" in (block.metadata ?? {})\n ? {\n citations: block.metadata!.citations as { enabled?: boolean },\n }\n : {}),\n ...(\"context\" in (block.metadata ?? {})\n ? { context: block.metadata!.context as string }\n : {}),\n ...(block.metadata?.title ||\n block.metadata?.filename ||\n block.metadata?.name\n ? {\n title: (block.metadata?.title ||\n block.metadata?.filename ||\n block.metadata?.name) as string,\n }\n : {}),\n };\n }\n throw new Error(\n `Unsupported file mime type for file url source: ${block.mime_type}`\n );\n } else if (block.source_type === \"text\") {\n if (mime_type === \"text/plain\" || mime_type === \"\") {\n return {\n type: \"document\",\n source: {\n type: \"text\",\n data: block.text,\n media_type: block.mime_type ?? \"\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n ...(\"citations\" in (block.metadata ?? {})\n ? {\n citations: block.metadata!.citations as { enabled?: boolean },\n }\n : {}),\n ...(\"context\" in (block.metadata ?? {})\n ? { context: block.metadata!.context as string }\n : {}),\n ...(\"title\" in (block.metadata ?? {})\n ? { title: block.metadata!.title as string }\n : {}),\n };\n } else {\n throw new Error(\n `Unsupported file mime type for file text source: ${block.mime_type}`\n );\n }\n } else if (block.source_type === \"base64\") {\n if (mime_type === \"application/pdf\" || mime_type === \"\") {\n return {\n type: \"document\",\n source: {\n type: \"base64\",\n data: block.data,\n media_type: \"application/pdf\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n ...(\"citations\" in (block.metadata ?? {})\n ? {\n citations: block.metadata!.citations as { enabled?: boolean },\n }\n : {}),\n ...(\"context\" in (block.metadata ?? {})\n ? { context: block.metadata!.context as string }\n : {}),\n ...(\"title\" in (block.metadata ?? {})\n ? { title: block.metadata!.title as string }\n : {}),\n };\n } else if (\n [\"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\"].includes(\n mime_type\n )\n ) {\n return {\n type: \"document\",\n source: {\n type: \"content\",\n content: [\n {\n type: \"image\",\n source: {\n type: \"base64\",\n data: block.data,\n media_type: mime_type as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\n },\n },\n ],\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n ...(\"citations\" in (block.metadata ?? {})\n ? {\n citations: block.metadata!.citations as { enabled?: boolean },\n }\n : {}),\n ...(\"context\" in (block.metadata ?? {})\n ? { context: block.metadata!.context as string }\n : {}),\n ...(\"title\" in (block.metadata ?? {})\n ? { title: block.metadata!.title as string }\n : {}),\n };\n } else {\n throw new Error(\n `Unsupported file mime type for file base64 source: ${block.mime_type}`\n );\n }\n } else {\n throw new Error(`Unsupported file source type: ${block.source_type}`);\n }\n },\n };\n\n function contentToAnthropicContent(\n content: MessageContent | DataContentBlock[]\n ): AnthropicMessageContent[] {\n const ca =\n typeof content === \"string\" ? [{ type: \"text\", text: content }] : content;\n return ca\n .map((complex) =>\n isDataContentBlock(complex)\n ? convertToProviderContentBlock(complex, anthropicContentConverter)\n : contentComplexToAnthropicContent(complex)\n )\n .filter(Boolean) as AnthropicMessageContent[];\n }\n\n function toolCallToAnthropicContent(\n toolCall: ToolCall\n ): AnthropicMessageContentToolUse {\n return {\n type: \"tool_use\",\n id: toolCall.id!,\n name: toolCall.name,\n input: toolCall.args,\n };\n }\n\n function toolCallsToAnthropicContent(\n toolCalls: ToolCall[] | undefined\n ): AnthropicMessageContentToolUse[] {\n if (toolCalls === undefined) {\n return [];\n }\n return toolCalls.map(toolCallToAnthropicContent);\n }\n\n function baseRoleToAnthropicMessage(\n base: BaseMessage,\n role: string\n ): AnthropicMessage {\n const content = contentToAnthropicContent(base.content);\n return {\n role,\n content,\n };\n }\n\n function aiMessageToAnthropicMessage(base: AIMessage): AnthropicMessage {\n const ret = baseRoleToAnthropicMessage(base, \"assistant\");\n\n const content = ret.content as AnthropicMessageContent[];\n const existingToolUseIds = new Set(\n content\n .filter(\n (block): block is AnthropicMessageContentToolUse =>\n block.type === \"tool_use\"\n )\n .map((block) => block.id)\n );\n\n const toolContent = toolCallsToAnthropicContent(base.tool_calls).filter(\n (block) => !existingToolUseIds.has(block.id)\n );\n if (toolContent.length > 0) {\n ret.content = [...content, ...toolContent];\n }\n\n return ret;\n }\n\n function toolMessageToAnthropicMessage(base: ToolMessage): AnthropicMessage {\n const role = \"user\";\n const toolUseId = base.tool_call_id;\n const toolContent = contentToAnthropicContent(\n base.content\n ) as AnthropicMessageContentToolResultContent[];\n const content: AnthropicMessageContentToolResult[] = [\n {\n type: \"tool_result\",\n tool_use_id: toolUseId,\n content: toolContent,\n },\n ];\n return {\n role,\n content,\n };\n }\n\n function baseToAnthropicMessage(\n base: BaseMessage\n ): AnthropicMessage | undefined {\n const type = base._getType();\n switch (type) {\n case \"human\":\n return baseRoleToAnthropicMessage(base, \"user\");\n case \"ai\":\n return aiMessageToAnthropicMessage(base as AIMessage);\n case \"tool\":\n return toolMessageToAnthropicMessage(base as ToolMessage);\n case \"system\":\n // System messages are handled in formatSystem()\n return undefined;\n default:\n console.warn(`Unknown BaseMessage type: ${type}`, base);\n return undefined;\n }\n }\n\n function formatMessages(input: BaseMessage[]): AnthropicMessage[] {\n const ret: AnthropicMessage[] = [];\n\n input.forEach((baseMessage) => {\n const anthropicMessage = baseToAnthropicMessage(baseMessage);\n if (anthropicMessage) {\n ret.push(anthropicMessage);\n }\n });\n\n return ret;\n }\n\n function formatSettings(\n parameters: GoogleAIModelRequestParams\n ): AnthropicRequestSettings {\n const ret: AnthropicRequestSettings = {\n stream: parameters?.streaming ?? false,\n max_tokens: parameters?.maxOutputTokens ?? 8192,\n };\n\n if (parameters.topP) {\n ret.top_p = parameters.topP;\n }\n if (parameters.topK) {\n ret.top_k = parameters.topK;\n }\n if (parameters.temperature) {\n ret.temperature = parameters.temperature;\n }\n if (parameters.stopSequences) {\n ret.stop_sequences = parameters.stopSequences;\n }\n\n return ret;\n }\n\n function contentComplexArrayToText(\n contentArray: MessageContentComplex[]\n ): string {\n let ret = \"\";\n\n contentArray.forEach((content) => {\n const contentType = content?.type;\n if (contentType === \"text\") {\n const textContent = content as MessageContentText;\n ret = `${ret}\\n${textContent.text}`;\n }\n });\n\n return ret;\n }\n\n function formatSystem(input: BaseMessage[]): string {\n let ret = \"\";\n\n input.forEach((message) => {\n if (message._getType() === \"system\") {\n const content = message?.content;\n const contentString =\n typeof content === \"string\"\n ? (content as string)\n : contentComplexArrayToText(content as MessageContentComplex[]);\n ret = `${ret}\\n${contentString}`;\n }\n });\n\n return ret;\n }\n\n function formatGeminiTool(tool: GeminiTool): AnthropicTool[] {\n if (Object.hasOwn(tool, \"functionDeclarations\")) {\n const funcs = tool?.functionDeclarations ?? [];\n return funcs.map((func) => {\n const inputSchema = func.parameters!;\n return {\n // type: \"tool\", // This may only be valid for models 20241022+\n name: func.name,\n description: func.description,\n input_schema: inputSchema,\n };\n });\n } else {\n console.warn(\n `Unable to format GeminiTool: ${JSON.stringify(tool, null, 1)}`\n );\n return [];\n }\n }\n\n function formatTool(tool: GoogleAIToolType): AnthropicTool[] {\n if (Object.hasOwn(tool, \"name\")) {\n return [tool as AnthropicTool];\n } else {\n return formatGeminiTool(tool as GeminiTool);\n }\n }\n\n function formatTools(\n parameters: GoogleAIModelRequestParams\n ): AnthropicTool[] {\n const tools: GoogleAIToolType[] = parameters?.tools ?? [];\n const ret: AnthropicTool[] = [];\n tools.forEach((tool) => {\n const anthropicTools = formatTool(tool);\n anthropicTools.forEach((anthropicTool) => {\n if (anthropicTool) {\n ret.push(anthropicTool);\n }\n });\n });\n return ret;\n }\n\n function formatToolChoice(\n parameters: GoogleAIModelRequestParams\n ): AnthropicToolChoice | undefined {\n const choice = parameters?.tool_choice;\n if (!choice) {\n return undefined;\n } else if (typeof choice === \"object\") {\n return choice as AnthropicToolChoice;\n } else {\n switch (choice) {\n case \"any\":\n case \"auto\":\n return {\n type: choice,\n };\n case \"none\":\n return undefined;\n default:\n return {\n type: \"tool\",\n name: choice,\n };\n }\n }\n }\n\n async function formatData(\n input: unknown,\n parameters: GoogleAIModelRequestParams\n ): Promise<AnthropicRequest> {\n const typedInput = input as BaseMessage[];\n const anthropicVersion = formatAnthropicVersion();\n const messages = formatMessages(typedInput);\n const settings = formatSettings(parameters);\n const system = formatSystem(typedInput);\n const tools = formatTools(parameters);\n const toolChoice = formatToolChoice(parameters);\n const ret: AnthropicRequest = {\n anthropic_version: anthropicVersion,\n messages,\n ...settings,\n };\n if (tools && tools.length && parameters?.tool_choice !== \"none\") {\n ret.tools = tools;\n }\n if (toolChoice) {\n ret.tool_choice = toolChoice;\n }\n if (system?.length) {\n ret.system = system;\n }\n if (config?.thinking) {\n ret.thinking = config?.thinking;\n }\n\n return ret;\n }\n\n return {\n responseToString,\n responseToChatGeneration,\n chunkToString,\n responseToBaseMessage,\n responseToChatResult,\n formatData,\n };\n}\n\nexport function validateClaudeParams(_params: GoogleAIModelParams): void {\n // FIXME - validate the parameters\n}\n\nexport function isModelClaude(modelName: string): boolean {\n return modelName.toLowerCase().startsWith(\"claude\");\n}\n"],"mappings":";;;AAqEA,SAAgB,gBAAgB,QAA0C;CACxE,SAAS,aAAa,MAAgC;AACpD,SAAO,UAAU,OAAO,KAAK,OAAO;;CAGtC,SAAS,gBAAgB,SAA2C;AAMlE,UALoC,SAAS,WAAW,EAAE,EACtC,QAAQ,KAAK,SAAS;AAExC,UAAO,MADK,aAAa,KAAK;KAE7B,GAAG;;CAIR,SAAS,iBAAiB,UAAqC;EAC7D,MAAM,OAAO,SAAS;AACtB,UAAQ,MAAM,MAAd;GACE,KAAK,UACH,QAAO,gBAAgB,KAAiC;GAC1D,QACE,OAAM,MAAM,iBAAiB,MAAM,OAAO;;;;;;;;;CAUhD,SAAS,kBAAkB,QAAkD;AAC3E,MAAI,OAAO,WAAW,SACpB,QAAO,IAAI,eAAe,OAAO;EAEnC,MAAM,MAAuB,EAC3B,GAAG,QACJ;AAED,MAAI,MAAM,QAAQ,QAAQ,QAAQ,EAAE;GAClC,IAAI,MAA0B;AAC9B,UAAO,QAAQ,SAAS,QAAQ;AAC9B,QAAI,QAAQ,KAAA,KAAa,IAAI,SAAS,OACpC,OAAM,GAAG,MAAM,IAAI;QAEnB,OAAM,KAAA;KAER;AACF,OAAI,IACF,KAAI,UAAU;;AAIlB,SAAO,IAAI,eAAe,IAAI;;CAGhC,SAAS,2BACP,aACiB;AACjB,SAAO,EACL,SAAS,CAAC,YAAY,EACvB;;CAGH,SAAS,8BACP,gBACiB;AAOjB,SAAO;GACL,SAAS,EAAE;GACX,YAAY,CARS;IACrB,IAAI,eAAe;IACnB,MAAM,eAAe;IACrB,MAAM;IACN,MAAM,eAAe;IACtB,CAGmB;GACnB;;CAGH,SAAS,+BACP,iBACiB;AAEjB,SAAO,EACL,SAAS,CAAC,gBAAgB,EAC3B;;CAGH,SAAS,uCACP,iBACiB;AAEjB,SAAO,EACL,SAAS,CAAC,gBAAgB,EAC3B;;CAGH,SAAS,gCACP,kBAC6B;EAC7B,MAAM,OAAO,kBAAkB;AAC/B,UAAQ,MAAR;GACE,KAAK,OACH,QAAO,2BAA2B,iBAAiB;GACrD,KAAK,WACH,QAAO,8BAA8B,iBAAiB;GACxD,KAAK,WACH,QAAO,+BAA+B,iBAAiB;GACzD,KAAK,oBACH,QAAO,uCAAuC,iBAAiB;GACjE;AACE,YAAQ,MAAM,yBAAyB,QAAQ,iBAAiB;AAChE;;;CAIN,SAAS,iBACP,kBACkB;EAClB,MAAM,iBAA0C,EAAE;EAClD,MAAM,YAAwB,EAAE;AAChC,mBAAiB,SAAS,OAAO;GAC/B,MAAM,gBAAgB,gCAAgC,GAAG;AACzD,OAAI,eAAe,QACjB,gBAAe,KACb,GAAI,cAAc,QACnB;AAEH,OAAI,eAAe,WACjB,WAAU,KAAK,GAAG,cAAc,WAAW;IAE7C;AAMF,SAAO,kBAJsB;GAC3B,SAAS;GACT,YAAY;GACb,CAC4B;;CAG/B,SAAS,uBACP,SACe;EACf,MAAM,QAAQ,SAAS;EACvB,MAAM,cAAc,OAAO,gBAAgB;EAC3C,MAAM,eAAe,OAAO,iBAAiB;AAU7C,SATqC;GACnC,cAAc;GACd,eAAe;GACf,cAAc,cAAc;GAC5B,qBAAqB;IACnB,YAAY,OAAO,2BAA2B;IAC9C,gBAAgB,OAAO,+BAA+B;IACvD;GACF;;CAIH,SAAS,wBAAwB,SAAmC;AAGlE,SAAO;GACL,gBAHoB,uBAAuB,QAAQ;GAInD,eAAe,QAAQ;GACxB;;CAGH,SAAS,wBACP,iBACqB;EACrB,MAAM,UAA8B,iBAAiB,WAAW,EAAE;AAIlE,SAAO,IAAI,oBAAoB;GAC7B,MAJW,gBAAgB,gBAAgB;GAK3C,SAJc,iBAAiB,QAAQ;GAKvC,gBAJqB,wBAAwB,gBAAgB;GAK9D,CAAC;;CAGJ,SAAS,6BACP,OACqB;EACrB,MAAM,kBAAkB,MAAM;AAC9B,SAAO,wBAAwB,gBAAgB;;CAGjD,SAAS,6BACP,OACqB;EACrB,MAAM,kBAAkB,MAAM;AAC9B,SAAO,wBAAwB,gBAA4C;;CAG7E,SAAS,sCACP,OAC4B;EAC5B,MAAM,UAAU,MAAM;EACtB,MAAM,OAAO,UAAU,UAAU,QAAQ,OAAO;AAIhD,SAAO,IAAI,oBAAoB;GAC7B,SAJc,IAAI,eAAe,EACjC,SAAS,CAAC;IAAE,OAAO,MAAM;IAAO,GAAG;IAAS,CAAC,EAC9C,CAAC;GAGA;GACD,CAAC;;CAGJ,SAAS,yCACP,OAC4B;EAC5B,MAAM,eAAe,MAAM;EAC3B,MAAM,OAAe;EACrB,MAAM,YAA2B;GAC/B,MAAM;GACN,OAAO,MAAM;GACb,MAAM,aAAa;GACnB,IAAI,aAAa;GAClB;AACD,MACE,OAAO,aAAa,UAAU,YAC9B,OAAO,KAAK,aAAa,MAAM,CAAC,SAAS,EAEzC,WAAU,OAAO,KAAK,UAAU,aAAa,MAAM;EAErD,MAAM,aAA8B,CAAC,UAAU;AAa/C,SAAO,IAAI,oBAAoB;GAC7B,SAFc,kBAJ4B;IAC1C,SAPuC,CACvC;KACE,OAAO,MAAM;KACb,GAAG;KACJ,CACF;IAGC,kBAAkB;IACnB,CAC+C;GAG9C;GACD,CAAC;;CAGJ,SAAS,kCACP,OAC4B;AAC5B,UAAQ,MAAM,cAAc,MAA5B;GACE,KAAK,OACH,QAAO,sCAAsC,MAAM;GACrD,KAAK,WACH,QAAO,yCAAyC,MAAM;GACxD;AACE,YAAQ,KACN,wCAAwC,KAAK,UAAU,MAAM,GAC9D;AACD,WAAO;;;CAIb,SAAS,sCACP,OACqB;EAErB,MAAM,OADQ,MAAM,OACA;AAIpB,SAAO,IAAI,oBAAoB;GAC7B,SAJc,IAAI,eAAe,EACjC,SAAS,CAAC;IAAE,OAAO,MAAM;IAAO,MAAM;IAAQ;IAAM,CAAC,EACtD,CAAC;GAGA;GACD,CAAC;;CAGJ,SAAS,gDACP,OACqB;EACrB,MAAM,QAAQ,MAAM;EACpB,MAAM,OAAe;EACrB,MAAM,aAA8B,CAClC;GACE,OAAO,MAAM;GACb,MAAM,MAAM;GACb,CACF;AAYD,SAAO,IAAI,oBAAoB;GAC7B,SAFc,kBAJ4B;IAC1C,SAPuC,CACvC;KACE,OAAO,MAAM;KACb,GAAG;KACJ,CACF;IAGC,kBAAkB;IACnB,CAC+C;GAG9C;GACD,CAAC;;CAGJ,SAAS,kCACP,OAC4B;AAC5B,UAAQ,MAAM,MAAM,MAApB;GACE,KAAK,aACH,QAAO,sCAAsC,MAAM;GACrD,KAAK,mBACH,QAAO,gDAAgD,MAAM;GAC/D;AACE,YAAQ,KACN,wCAAwC,KAAK,UAAU,MAAM,GAC9D;AACD,WAAO;;;CAIb,SAAS,yBACP,UAC4B;EAC5B,MAAM,OAAO,SAAS;AACtB,UAAQ,KAAK,MAAb;GACE,KAAK,UACH,QAAO,wBAAwB,KAAiC;GAClE,KAAK,gBACH,QAAO,6BACL,KACD;GACH,KAAK,gBACH,QAAO,6BACL,KACD;GACH,KAAK,sBACH,QAAO,kCACL,KACD;GACH,KAAK,sBACH,QAAO,kCACL,KACD;GAEH,KAAK;GACL,KAAK;GACL,KAAK,qBAEH,QAAO;GAET,KAAK,QACH,OAAM,IAAI,MACR,kCAAkC,KAAK,UAAU,KAAK,GACvD;GAEH;AAGE,YAAQ,KAAK,6CAA6C,KAAK;AAE/D,WAAO;;;CAIb,SAAS,cAAc,OAAiC;AACtD,MAAI,UAAU,KACZ,QAAO;WACE,OAAO,MAAM,YAAY,SAClC,QAAO,MAAM;WACJ,MAAM,QAAQ,WAAW,EAClC,QAAO;WACE,MAAM,QAAQ,GAAG,SAAS,OACnC,QAAO,MAAM,QAAQ,GAAG;MAExB,OAAM,IAAI,MAAM,qBAAqB,QAAQ;;CAIjD,SAAS,sBAAsB,UAA0C;AAGvE,SAAO,iBAFM,SAAS,MACoB,WAAW,EAAE,CACvB;;CAGlC,SAAS,qBAAqB,UAAyC;EACrE,MAAM,UAAU,SAAS;EACzB,MAAM,cAAgC,EAAE;EACxC,MAAM,MAAM,yBAAyB,SAAS;AAC9C,MAAI,IACF,aAAY,KAAK,IAAI;AAGvB,SAAO;GACL;GACA,WAHgB,wBAAwB,QAAQ;GAIjD;;CAGH,SAAS,yBAAiC;AACxC,SAAO,QAAQ,WAAW;;CAG5B,SAAS,8BACP,SACyC;AACzC,MAAI,CAAC,QAAQ,KACX;AAEF,SAAO;GAAE,MAAM;GAAQ,MAAM,QAAQ;GAAM;;CAG7C,SAAS,gBACP,KAC6C;AAC7C,MAAI,IAAI,WAAW,QAAQ,CACzB,QAAO;GACL,YAAY,IAAI,MAAM,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC;GACzC,MAAM,IAAI,MAAM,IAAI,CAAC;GACtB;AAEH,SAAO;;CAGT,SAAS,+BACP,SAC0C;EAC1C,MAAM,UAAU,QAAQ;EAExB,MAAM,UAAU,gBADJ,OAAO,YAAY,WAAW,UAAU,SAAS,IACzB;AAEpC,MAAI,CAAC,QACH;AAGF,SAAO;GACL,MAAM;GACN,QAAQ;IACN,MAAM;IACN,GAAG;IACJ;GACF;;CAGH,SAAS,iCACP,SACgC;AAChC,SAAO;GACL,MAAM;GACN,IAAI,QAAQ;GACZ,MAAM,QAAQ;GACd,OAAO,QAAQ;GAChB;;CAGH,SAAS,kCAEP,SAC6C;AAE7C,SAAO;GACL,MAAM;GACN,UAAU,QAAQ;GAClB,WAAW,QAAQ;GACpB;;CAGH,SAAS,0CAEP,SACqD;AAErD,SAAO;GACL,MAAM;GACN,MAAM,QAAQ;GACf;;CAGH,SAAS,iCACP,SACqC;EACrC,MAAM,OAAO,SAAS;AACtB,UAAQ,MAAR;GACE,KAAK,OACH,QAAO,8BAA8B,QAA8B;GACrE,KAAK,YACH,QAAO,+BACL,QACD;GACH,KAAK,WACH,QAAO,iCAAiC,QAAQ;GAClD,KAAK,WACH,QAAO,kCACL,QACD;GACH,KAAK,oBACH,QAAO,0CACL,QACD;GACH;AACE,QAAI,SAAS,YACX;AAEF,YAAQ,KAAK,4BAA4B,QAAQ,QAAQ;AACzD;;;CAIN,MAAM,4BAID;EACH,cAAc;EAEd,sBACE,OAC6B;AAC7B,UAAO;IACL,MAAM;IACN,MAAM,MAAM;IACZ,GAAI,oBAAoB,MAAM,YAAY,EAAE,IACxC,EACE,eAAe,MAAM,SAClB,eACJ,GACD,EAAE;IACP;;EAGH,uBACE,OAC8B;AAC9B,OAAI,MAAM,gBAAgB,OAAO;IAC/B,MAAM,OAAO,mBAAmB;KAC9B,SAAS,MAAM;KACf,cAAc;KACf,CAAC;AACF,QAAI,KACF,QAAO;KACL,MAAM;KACN,QAAQ;MACN,MAAM;MACN,MAAM,KAAK;MACX,YAAY,KAAK;MAClB;KACD,GAAI,oBAAoB,MAAM,YAAY,EAAE,IACxC,EAAE,eAAe,MAAM,SAAU,eAAe,GAChD,EAAE;KACP;QAED,QAAO;KACL,MAAM;KACN,QAAQ;MACN,MAAM;MACN,KAAK,MAAM;MACX,YAAY,MAAM,aAAa;MAChC;KACD,GAAI,oBAAoB,MAAM,YAAY,EAAE,IACxC,EAAE,eAAe,MAAM,SAAU,eAAe,GAChD,EAAE;KACP;cAGC,MAAM,gBAAgB,SACxB,QAAO;IACL,MAAM;IACN,QAAQ;KACN,MAAM;KACN,MAAM,MAAM;KACZ,YAAY,MAAM,aAAa;KAChC;IACD,GAAI,oBAAoB,MAAM,YAAY,EAAE,IACxC,EAAE,eAAe,MAAM,SAAU,eAAe,GAChD,EAAE;IACP;OAED,OAAM,IAAI,MACR,kCAAkC,MAAM,cACzC;;EAKP,sBACE,OACiC;GACjC,MAAM,aAAa,MAAM,aAAa,IAAI,MAAM,IAAI,CAAC;AAErD,OAAI,MAAM,gBAAgB,OAAO;AAC/B,QAAI,cAAc,qBAAqB,cAAc,GACnD,QAAO;KACL,MAAM;KACN,QAAQ;MACN,MAAM;MACN,KAAK,MAAM;MACX,YAAY,MAAM,aAAa;MAChC;KACD,GAAI,oBAAoB,MAAM,YAAY,EAAE,IACxC,EACE,eAAe,MAAM,SAClB,eACJ,GACD,EAAE;KACN,GAAI,gBAAgB,MAAM,YAAY,EAAE,IACpC,EACE,WAAW,MAAM,SAAU,WAC5B,GACD,EAAE;KACN,GAAI,cAAc,MAAM,YAAY,EAAE,IAClC,EAAE,SAAS,MAAM,SAAU,SAAmB,GAC9C,EAAE;KACN,GAAI,MAAM,UAAU,SACpB,MAAM,UAAU,YAChB,MAAM,UAAU,OACZ,EACE,OAAQ,MAAM,UAAU,SACtB,MAAM,UAAU,YAChB,MAAM,UAAU,MACnB,GACD,EAAE;KACP;AAEH,UAAM,IAAI,MACR,mDAAmD,MAAM,YAC1D;cACQ,MAAM,gBAAgB,OAC/B,KAAI,cAAc,gBAAgB,cAAc,GAC9C,QAAO;IACL,MAAM;IACN,QAAQ;KACN,MAAM;KACN,MAAM,MAAM;KACZ,YAAY,MAAM,aAAa;KAChC;IACD,GAAI,oBAAoB,MAAM,YAAY,EAAE,IACxC,EACE,eAAe,MAAM,SAClB,eACJ,GACD,EAAE;IACN,GAAI,gBAAgB,MAAM,YAAY,EAAE,IACpC,EACE,WAAW,MAAM,SAAU,WAC5B,GACD,EAAE;IACN,GAAI,cAAc,MAAM,YAAY,EAAE,IAClC,EAAE,SAAS,MAAM,SAAU,SAAmB,GAC9C,EAAE;IACN,GAAI,YAAY,MAAM,YAAY,EAAE,IAChC,EAAE,OAAO,MAAM,SAAU,OAAiB,GAC1C,EAAE;IACP;OAED,OAAM,IAAI,MACR,oDAAoD,MAAM,YAC3D;YAEM,MAAM,gBAAgB,SAC/B,KAAI,cAAc,qBAAqB,cAAc,GACnD,QAAO;IACL,MAAM;IACN,QAAQ;KACN,MAAM;KACN,MAAM,MAAM;KACZ,YAAY;KACb;IACD,GAAI,oBAAoB,MAAM,YAAY,EAAE,IACxC,EACE,eAAe,MAAM,SAClB,eACJ,GACD,EAAE;IACN,GAAI,gBAAgB,MAAM,YAAY,EAAE,IACpC,EACE,WAAW,MAAM,SAAU,WAC5B,GACD,EAAE;IACN,GAAI,cAAc,MAAM,YAAY,EAAE,IAClC,EAAE,SAAS,MAAM,SAAU,SAAmB,GAC9C,EAAE;IACN,GAAI,YAAY,MAAM,YAAY,EAAE,IAChC,EAAE,OAAO,MAAM,SAAU,OAAiB,GAC1C,EAAE;IACP;YAED;IAAC;IAAc;IAAa;IAAa;IAAa,CAAC,SACrD,UACD,CAED,QAAO;IACL,MAAM;IACN,QAAQ;KACN,MAAM;KACN,SAAS,CACP;MACE,MAAM;MACN,QAAQ;OACN,MAAM;OACN,MAAM,MAAM;OACZ,YAAY;OAKb;MACF,CACF;KACF;IACD,GAAI,oBAAoB,MAAM,YAAY,EAAE,IACxC,EACE,eAAe,MAAM,SAClB,eACJ,GACD,EAAE;IACN,GAAI,gBAAgB,MAAM,YAAY,EAAE,IACpC,EACE,WAAW,MAAM,SAAU,WAC5B,GACD,EAAE;IACN,GAAI,cAAc,MAAM,YAAY,EAAE,IAClC,EAAE,SAAS,MAAM,SAAU,SAAmB,GAC9C,EAAE;IACN,GAAI,YAAY,MAAM,YAAY,EAAE,IAChC,EAAE,OAAO,MAAM,SAAU,OAAiB,GAC1C,EAAE;IACP;OAED,OAAM,IAAI,MACR,sDAAsD,MAAM,YAC7D;OAGH,OAAM,IAAI,MAAM,iCAAiC,MAAM,cAAc;;EAG1E;CAED,SAAS,0BACP,SAC2B;AAG3B,UADE,OAAO,YAAY,WAAW,CAAC;GAAE,MAAM;GAAQ,MAAM;GAAS,CAAC,GAAG,SAEjE,KAAK,YACJ,mBAAmB,QAAQ,GACvB,8BAA8B,SAAS,0BAA0B,GACjE,iCAAiC,QAAQ,CAC9C,CACA,OAAO,QAAQ;;CAGpB,SAAS,2BACP,UACgC;AAChC,SAAO;GACL,MAAM;GACN,IAAI,SAAS;GACb,MAAM,SAAS;GACf,OAAO,SAAS;GACjB;;CAGH,SAAS,4BACP,WACkC;AAClC,MAAI,cAAc,KAAA,EAChB,QAAO,EAAE;AAEX,SAAO,UAAU,IAAI,2BAA2B;;CAGlD,SAAS,2BACP,MACA,MACkB;AAElB,SAAO;GACL;GACA,SAHc,0BAA0B,KAAK,QAAQ;GAItD;;CAGH,SAAS,4BAA4B,MAAmC;EACtE,MAAM,MAAM,2BAA2B,MAAM,YAAY;EAEzD,MAAM,UAAU,IAAI;EACpB,MAAM,qBAAqB,IAAI,IAC7B,QACG,QACE,UACC,MAAM,SAAS,WAClB,CACA,KAAK,UAAU,MAAM,GAAG,CAC5B;EAED,MAAM,cAAc,4BAA4B,KAAK,WAAW,CAAC,QAC9D,UAAU,CAAC,mBAAmB,IAAI,MAAM,GAAG,CAC7C;AACD,MAAI,YAAY,SAAS,EACvB,KAAI,UAAU,CAAC,GAAG,SAAS,GAAG,YAAY;AAG5C,SAAO;;CAGT,SAAS,8BAA8B,MAAqC;AAa1E,SAAO;GACL,MAbW;GAcX,SATmD,CACnD;IACE,MAAM;IACN,aAPc,KAAK;IAQnB,SAPgB,0BAClB,KAAK,QACN;IAME,CACF;GAIA;;CAGH,SAAS,uBACP,MAC8B;EAC9B,MAAM,OAAO,KAAK,UAAU;AAC5B,UAAQ,MAAR;GACE,KAAK,QACH,QAAO,2BAA2B,MAAM,OAAO;GACjD,KAAK,KACH,QAAO,4BAA4B,KAAkB;GACvD,KAAK,OACH,QAAO,8BAA8B,KAAoB;GAC3D,KAAK,SAEH;GACF;AACE,YAAQ,KAAK,6BAA6B,QAAQ,KAAK;AACvD;;;CAIN,SAAS,eAAe,OAA0C;EAChE,MAAM,MAA0B,EAAE;AAElC,QAAM,SAAS,gBAAgB;GAC7B,MAAM,mBAAmB,uBAAuB,YAAY;AAC5D,OAAI,iBACF,KAAI,KAAK,iBAAiB;IAE5B;AAEF,SAAO;;CAGT,SAAS,eACP,YAC0B;EAC1B,MAAM,MAAgC;GACpC,QAAQ,YAAY,aAAa;GACjC,YAAY,YAAY,mBAAmB;GAC5C;AAED,MAAI,WAAW,KACb,KAAI,QAAQ,WAAW;AAEzB,MAAI,WAAW,KACb,KAAI,QAAQ,WAAW;AAEzB,MAAI,WAAW,YACb,KAAI,cAAc,WAAW;AAE/B,MAAI,WAAW,cACb,KAAI,iBAAiB,WAAW;AAGlC,SAAO;;CAGT,SAAS,0BACP,cACQ;EACR,IAAI,MAAM;AAEV,eAAa,SAAS,YAAY;AAEhC,OADoB,SAAS,SACT,OAElB,OAAM,GAAG,IAAI,IADO,QACS;IAE/B;AAEF,SAAO;;CAGT,SAAS,aAAa,OAA8B;EAClD,IAAI,MAAM;AAEV,QAAM,SAAS,YAAY;AACzB,OAAI,QAAQ,UAAU,KAAK,UAAU;IACnC,MAAM,UAAU,SAAS;IACzB,MAAM,gBACJ,OAAO,YAAY,WACd,UACD,0BAA0B,QAAmC;AACnE,UAAM,GAAG,IAAI,IAAI;;IAEnB;AAEF,SAAO;;CAGT,SAAS,iBAAiB,MAAmC;AAC3D,MAAI,OAAO,OAAO,MAAM,uBAAuB,CAE7C,SADc,MAAM,wBAAwB,EAAE,EACjC,KAAK,SAAS;GACzB,MAAM,cAAc,KAAK;AACzB,UAAO;IAEL,MAAM,KAAK;IACX,aAAa,KAAK;IAClB,cAAc;IACf;IACD;OACG;AACL,WAAQ,KACN,gCAAgC,KAAK,UAAU,MAAM,MAAM,EAAE,GAC9D;AACD,UAAO,EAAE;;;CAIb,SAAS,WAAW,MAAyC;AAC3D,MAAI,OAAO,OAAO,MAAM,OAAO,CAC7B,QAAO,CAAC,KAAsB;MAE9B,QAAO,iBAAiB,KAAmB;;CAI/C,SAAS,YACP,YACiB;EACjB,MAAM,QAA4B,YAAY,SAAS,EAAE;EACzD,MAAM,MAAuB,EAAE;AAC/B,QAAM,SAAS,SAAS;AACC,cAAW,KAAK,CACxB,SAAS,kBAAkB;AACxC,QAAI,cACF,KAAI,KAAK,cAAc;KAEzB;IACF;AACF,SAAO;;CAGT,SAAS,iBACP,YACiC;EACjC,MAAM,SAAS,YAAY;AAC3B,MAAI,CAAC,OACH;WACS,OAAO,WAAW,SAC3B,QAAO;MAEP,SAAQ,QAAR;GACE,KAAK;GACL,KAAK,OACH,QAAO,EACL,MAAM,QACP;GACH,KAAK,OACH;GACF,QACE,QAAO;IACL,MAAM;IACN,MAAM;IACP;;;CAKT,eAAe,WACb,OACA,YAC2B;EAC3B,MAAM,aAAa;EACnB,MAAM,mBAAmB,wBAAwB;EACjD,MAAM,WAAW,eAAe,WAAW;EAC3C,MAAM,WAAW,eAAe,WAAW;EAC3C,MAAM,SAAS,aAAa,WAAW;EACvC,MAAM,QAAQ,YAAY,WAAW;EACrC,MAAM,aAAa,iBAAiB,WAAW;EAC/C,MAAM,MAAwB;GAC5B,mBAAmB;GACnB;GACA,GAAG;GACJ;AACD,MAAI,SAAS,MAAM,UAAU,YAAY,gBAAgB,OACvD,KAAI,QAAQ;AAEd,MAAI,WACF,KAAI,cAAc;AAEpB,MAAI,QAAQ,OACV,KAAI,SAAS;AAEf,MAAI,QAAQ,SACV,KAAI,WAAW,QAAQ;AAGzB,SAAO;;AAGT,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACD;;AAGH,SAAgB,qBAAqB,SAAoC;AAIzE,SAAgB,cAAc,WAA4B;AACxD,QAAO,UAAU,aAAa,CAAC,WAAW,SAAS"}
|
|
1
|
+
{"version":3,"file":"anthropic.js","names":[],"sources":["../../src/utils/anthropic.ts"],"sourcesContent":["import {\n ChatGeneration,\n ChatGenerationChunk,\n ChatResult,\n} from \"@langchain/core/outputs\";\nimport {\n BaseMessage,\n BaseMessageChunk,\n AIMessageChunk,\n MessageContentComplex,\n MessageContentText,\n MessageContent,\n MessageContentImageUrl,\n AIMessageFields,\n AIMessageChunkFields,\n AIMessage,\n StandardContentBlockConverter,\n StandardImageBlock,\n StandardTextBlock,\n StandardFileBlock,\n DataContentBlock,\n isDataContentBlock,\n convertToProviderContentBlock,\n parseBase64DataUrl,\n UsageMetadata,\n} from \"@langchain/core/messages\";\nimport {\n ToolCall,\n ToolCallChunk,\n ToolMessage,\n} from \"@langchain/core/messages/tool\";\nimport {\n AnthropicAPIConfig,\n AnthropicCacheControl,\n AnthropicContent,\n AnthropicContentRedactedThinking,\n AnthropicContentText,\n AnthropicContentThinking,\n AnthropicContentToolUse,\n AnthropicMessage,\n AnthropicMessageContent,\n AnthropicMessageContentDocument,\n AnthropicMessageContentImage,\n AnthropicMessageContentRedactedThinking,\n AnthropicMessageContentText,\n AnthropicMessageContentThinking,\n AnthropicMessageContentToolResult,\n AnthropicMessageContentToolResultContent,\n AnthropicMessageContentToolUse,\n AnthropicRequest,\n AnthropicRequestSettings,\n AnthropicResponseData,\n AnthropicResponseMessage,\n AnthropicStreamContentBlockDeltaEvent,\n AnthropicStreamContentBlockStartEvent,\n AnthropicStreamInputJsonDelta,\n AnthropicStreamMessageDeltaEvent,\n AnthropicStreamMessageStartEvent,\n AnthropicStreamTextDelta,\n AnthropicTool,\n AnthropicToolChoice,\n GeminiTool,\n GoogleAIAPI,\n GoogleAIModelParams,\n GoogleAIModelRequestParams,\n GoogleAIToolType,\n GoogleLLMResponse,\n} from \"../types.js\";\n\nexport function getAnthropicAPI(config?: AnthropicAPIConfig): GoogleAIAPI {\n function partToString(part: AnthropicContent): string {\n return \"text\" in part ? part.text : \"\";\n }\n\n function messageToString(message: AnthropicResponseMessage): string {\n const content: AnthropicContent[] = message?.content ?? [];\n const ret = content.reduce((acc, part) => {\n const str = partToString(part);\n return acc + str;\n }, \"\");\n return ret;\n }\n\n function responseToString(response: GoogleLLMResponse): string {\n const data = response.data as AnthropicResponseData;\n switch (data?.type) {\n case \"message\":\n return messageToString(data as AnthropicResponseMessage);\n default:\n throw Error(`Unknown type: ${data?.type}`);\n }\n }\n\n /**\n * Normalize the AIMessageChunk.\n * If the fields are just a string - use that as content.\n * If the content is an array of just text fields, turn them into a string.\n * @param fields\n */\n function newAIMessageChunk(fields: string | AIMessageFields): AIMessageChunk {\n if (typeof fields === \"string\") {\n return new AIMessageChunk(fields);\n }\n const ret: AIMessageFields = {\n ...fields,\n };\n\n if (Array.isArray(fields?.content)) {\n let str: string | undefined = \"\";\n fields.content.forEach((val) => {\n if (str !== undefined && val.type === \"text\") {\n str = `${str}${val.text}`;\n } else {\n str = undefined;\n }\n });\n if (str) {\n ret.content = str;\n }\n }\n\n return new AIMessageChunk(ret);\n }\n\n function textContentToMessageFields(\n textContent: AnthropicContentText\n ): AIMessageFields {\n return {\n content: [textContent],\n };\n }\n\n function toolUseContentToMessageFields(\n toolUseContent: AnthropicContentToolUse\n ): AIMessageFields {\n const tool: ToolCall = {\n id: toolUseContent.id,\n name: toolUseContent.name,\n type: \"tool_call\",\n args: toolUseContent.input,\n };\n return {\n content: [],\n tool_calls: [tool],\n };\n }\n\n function thinkingContentToMessageFields(\n thinkingContent: AnthropicContentThinking\n ): AIMessageFields {\n // TODO: Once a reasoning/thinking type is defined in LangChain, use it\n return {\n content: [thinkingContent],\n };\n }\n\n function redactedThinkingContentToMessageFields(\n thinkingContent: AnthropicContentRedactedThinking\n ): AIMessageFields {\n // TODO: Once a reasoning/thinking type is defined in LangChain, use it\n return {\n content: [thinkingContent],\n };\n }\n\n function anthropicContentToMessageFields(\n anthropicContent: AnthropicContent\n ): AIMessageFields | undefined {\n const type = anthropicContent?.type;\n switch (type) {\n case \"text\":\n return textContentToMessageFields(anthropicContent);\n case \"tool_use\":\n return toolUseContentToMessageFields(anthropicContent);\n case \"thinking\":\n return thinkingContentToMessageFields(anthropicContent);\n case \"redacted_thinking\":\n return redactedThinkingContentToMessageFields(anthropicContent);\n default:\n console.error(`Unknown message type: ${type}`, anthropicContent);\n return undefined;\n }\n }\n\n function contentToMessage(\n anthropicContent: AnthropicContent[]\n ): BaseMessageChunk {\n const complexContent: MessageContentComplex[] = [];\n const toolCalls: ToolCall[] = [];\n anthropicContent.forEach((ac) => {\n const messageFields = anthropicContentToMessageFields(ac);\n if (messageFields?.content) {\n complexContent.push(\n ...(messageFields.content as MessageContentComplex[])\n );\n }\n if (messageFields?.tool_calls) {\n toolCalls.push(...messageFields.tool_calls);\n }\n });\n\n const ret: AIMessageFields = {\n content: complexContent,\n tool_calls: toolCalls,\n };\n return newAIMessageChunk(ret);\n }\n\n function messageToUsageMetadata(\n message: AnthropicResponseMessage\n ): UsageMetadata {\n const usage = message?.usage;\n const inputTokens = usage?.input_tokens ?? 0;\n const outputTokens = usage?.output_tokens ?? 0;\n const usageMetadata: UsageMetadata = {\n input_tokens: inputTokens,\n output_tokens: outputTokens,\n total_tokens: inputTokens + outputTokens,\n input_token_details: {\n cache_read: usage?.cache_read_input_tokens ?? 0,\n cache_creation: usage?.cache_creation_input_tokens ?? 0,\n },\n };\n return usageMetadata;\n }\n\n function messageToGenerationInfo(message: AnthropicResponseMessage) {\n const usageMetadata = messageToUsageMetadata(message);\n\n return {\n usage_metadata: usageMetadata,\n finish_reason: message.stop_reason,\n };\n }\n\n function messageToChatGeneration(\n responseMessage: AnthropicResponseMessage\n ): ChatGenerationChunk {\n const content: AnthropicContent[] = responseMessage?.content ?? [];\n const text = messageToString(responseMessage);\n const message = contentToMessage(content);\n const generationInfo = messageToGenerationInfo(responseMessage);\n return new ChatGenerationChunk({\n text,\n message,\n generationInfo,\n });\n }\n\n function messageStartToChatGeneration(\n event: AnthropicStreamMessageStartEvent\n ): ChatGenerationChunk {\n const responseMessage = event.message;\n return messageToChatGeneration(responseMessage);\n }\n\n function messageDeltaToChatGeneration(\n event: AnthropicStreamMessageDeltaEvent\n ): ChatGenerationChunk {\n const responseMessage = event.delta;\n return messageToChatGeneration(responseMessage as AnthropicResponseMessage);\n }\n\n function contentBlockStartTextToChatGeneration(\n event: AnthropicStreamContentBlockStartEvent\n ): ChatGenerationChunk | null {\n const content = event.content_block;\n const text = \"text\" in content ? content.text : \"\";\n const message = new AIMessageChunk({\n content: [{ index: event.index, ...content }],\n });\n return new ChatGenerationChunk({\n message,\n text,\n });\n }\n\n function contentBlockStartToolUseToChatGeneration(\n event: AnthropicStreamContentBlockStartEvent\n ): ChatGenerationChunk | null {\n const contentBlock = event.content_block as AnthropicContentToolUse;\n const text: string = \"\";\n const toolChunk: ToolCallChunk = {\n type: \"tool_call_chunk\",\n index: event.index,\n name: contentBlock.name,\n id: contentBlock.id,\n };\n if (\n typeof contentBlock.input === \"object\" &&\n Object.keys(contentBlock.input).length > 0\n ) {\n toolChunk.args = JSON.stringify(contentBlock.input);\n }\n const toolChunks: ToolCallChunk[] = [toolChunk];\n\n const content: MessageContentComplex[] = [\n {\n index: event.index,\n ...contentBlock,\n },\n ];\n const messageFields: AIMessageChunkFields = {\n content,\n tool_call_chunks: toolChunks,\n };\n const message = newAIMessageChunk(messageFields);\n return new ChatGenerationChunk({\n message,\n text,\n });\n }\n\n function contentBlockStartToChatGeneration(\n event: AnthropicStreamContentBlockStartEvent\n ): ChatGenerationChunk | null {\n switch (event.content_block.type) {\n case \"text\":\n return contentBlockStartTextToChatGeneration(event);\n case \"tool_use\":\n return contentBlockStartToolUseToChatGeneration(event);\n default:\n console.warn(\n `Unexpected start content_block type: ${JSON.stringify(event)}`\n );\n return null;\n }\n }\n\n function contentBlockDeltaTextToChatGeneration(\n event: AnthropicStreamContentBlockDeltaEvent\n ): ChatGenerationChunk {\n const delta = event.delta as AnthropicStreamTextDelta;\n const text = delta?.text;\n const message = new AIMessageChunk({\n content: [{ index: event.index, type: \"text\", text }],\n });\n return new ChatGenerationChunk({\n message,\n text,\n });\n }\n\n function contentBlockDeltaInputJsonDeltaToChatGeneration(\n event: AnthropicStreamContentBlockDeltaEvent\n ): ChatGenerationChunk {\n const delta = event.delta as AnthropicStreamInputJsonDelta;\n const text: string = \"\";\n const toolChunks: ToolCallChunk[] = [\n {\n index: event.index,\n args: delta.partial_json,\n },\n ];\n const content: MessageContentComplex[] = [\n {\n index: event.index,\n ...delta,\n },\n ];\n const messageFields: AIMessageChunkFields = {\n content,\n tool_call_chunks: toolChunks,\n };\n const message = newAIMessageChunk(messageFields);\n return new ChatGenerationChunk({\n message,\n text,\n });\n }\n\n function contentBlockDeltaToChatGeneration(\n event: AnthropicStreamContentBlockDeltaEvent\n ): ChatGenerationChunk | null {\n switch (event.delta.type) {\n case \"text_delta\":\n return contentBlockDeltaTextToChatGeneration(event);\n case \"input_json_delta\":\n return contentBlockDeltaInputJsonDeltaToChatGeneration(event);\n default:\n console.warn(\n `Unexpected delta content_block type: ${JSON.stringify(event)}`\n );\n return null;\n }\n }\n\n function responseToChatGeneration(\n response: GoogleLLMResponse\n ): ChatGenerationChunk | null {\n const data = response.data as AnthropicResponseData;\n switch (data.type) {\n case \"message\":\n return messageToChatGeneration(data as AnthropicResponseMessage);\n case \"message_start\":\n return messageStartToChatGeneration(\n data as AnthropicStreamMessageStartEvent\n );\n case \"message_delta\":\n return messageDeltaToChatGeneration(\n data as AnthropicStreamMessageDeltaEvent\n );\n case \"content_block_start\":\n return contentBlockStartToChatGeneration(\n data as AnthropicStreamContentBlockStartEvent\n );\n case \"content_block_delta\":\n return contentBlockDeltaToChatGeneration(\n data as AnthropicStreamContentBlockDeltaEvent\n );\n\n case \"ping\":\n case \"message_stop\":\n case \"content_block_stop\":\n // These are ignorable\n return null;\n\n case \"error\":\n throw new Error(\n `Error while streaming results: ${JSON.stringify(data)}`\n );\n\n default:\n // We don't know what type this is, but Anthropic may have added\n // new ones without telling us. Don't error, but don't use them.\n console.warn(\"Unknown data for responseToChatGeneration\", data);\n // throw new Error(`Unknown response type: ${data.type}`);\n return null;\n }\n }\n\n function chunkToString(chunk: BaseMessageChunk): string {\n if (chunk === null) {\n return \"\";\n } else if (typeof chunk.content === \"string\") {\n return chunk.content;\n } else if (chunk.content.length === 0) {\n return \"\";\n } else if (chunk.content[0].type === \"text\") {\n return chunk.content[0].text;\n } else {\n throw new Error(`Unexpected chunk: ${chunk}`);\n }\n }\n\n function responseToBaseMessage(response: GoogleLLMResponse): BaseMessage {\n const data = response.data as AnthropicResponseMessage;\n const content: AnthropicContent[] = data?.content ?? [];\n return contentToMessage(content);\n }\n\n function responseToChatResult(response: GoogleLLMResponse): ChatResult {\n const message = response.data as AnthropicResponseMessage;\n const generations: ChatGeneration[] = [];\n const gen = responseToChatGeneration(response);\n if (gen) {\n generations.push(gen);\n }\n const llmOutput = messageToGenerationInfo(message);\n return {\n generations,\n llmOutput,\n };\n }\n\n function formatAnthropicVersion(): string {\n return config?.version ?? \"vertex-2023-10-16\";\n }\n\n function textContentToAnthropicContent(\n content: MessageContentText\n ): AnthropicMessageContentText | undefined {\n if (!content.text) {\n return undefined;\n }\n return { type: \"text\", text: content.text };\n }\n\n function extractMimeType(\n str: string\n ): { media_type: string; data: string } | null {\n if (str.startsWith(\"data:\")) {\n return {\n media_type: str.split(\":\")[1].split(\";\")[0],\n data: str.split(\",\")[1],\n };\n }\n return null;\n }\n\n function imageContentToAnthropicContent(\n content: MessageContentImageUrl\n ): AnthropicMessageContentImage | undefined {\n const dataUrl = content.image_url;\n const url = typeof dataUrl === \"string\" ? dataUrl : dataUrl?.url;\n const urlInfo = extractMimeType(url);\n\n if (!urlInfo) {\n return undefined;\n }\n\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n ...urlInfo,\n },\n };\n }\n\n function toolUseContentToAnthropicContent(\n content: Record<string, unknown>\n ): AnthropicMessageContentToolUse {\n return {\n type: \"tool_use\",\n id: content.id as string,\n name: content.name as string,\n input: content.input as Record<string, unknown>,\n };\n }\n\n function thinkingContentToAnthropicContent(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n content: Record<string, any>\n ): AnthropicMessageContentThinking | undefined {\n // TODO: Once a Langchain Thinking type is defined, use it\n return {\n type: \"thinking\",\n thinking: content.thinking,\n signature: content.signature,\n };\n }\n\n function redactedThinkingContentToAnthropicContent(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n content: Record<string, any>\n ): AnthropicMessageContentRedactedThinking | undefined {\n // TODO: Once a Langchain Thinking type is defined, use it\n return {\n type: \"redacted_thinking\",\n data: content.data,\n };\n }\n\n function contentComplexToAnthropicContent(\n content: MessageContentComplex\n ): AnthropicMessageContent | undefined {\n const type = content?.type;\n switch (type) {\n case \"text\":\n return textContentToAnthropicContent(content as MessageContentText);\n case \"image_url\":\n return imageContentToAnthropicContent(\n content as MessageContentImageUrl\n );\n case \"tool_use\":\n return toolUseContentToAnthropicContent(content);\n case \"thinking\":\n return thinkingContentToAnthropicContent(\n content as Record<string, unknown>\n );\n case \"redacted_thinking\":\n return redactedThinkingContentToAnthropicContent(\n content as Record<string, unknown>\n );\n default:\n if (type === \"tool_call\") {\n return undefined;\n }\n console.warn(`Unexpected content type: ${type}`, content);\n return undefined;\n }\n }\n\n const anthropicContentConverter: StandardContentBlockConverter<{\n text: AnthropicMessageContentText;\n image: AnthropicMessageContentImage;\n file: AnthropicMessageContentDocument;\n }> = {\n providerName: \"anthropic\",\n\n fromStandardTextBlock(\n block: StandardTextBlock\n ): AnthropicMessageContentText {\n return {\n type: \"text\",\n text: block.text,\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n };\n },\n\n fromStandardImageBlock(\n block: StandardImageBlock\n ): AnthropicMessageContentImage {\n if (block.source_type === \"url\") {\n const data = parseBase64DataUrl({\n dataUrl: block.url,\n asTypedArray: false,\n });\n if (data) {\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n data: data.data,\n media_type: data.mime_type,\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? { cache_control: block.metadata!.cache_control }\n : {}),\n } as AnthropicMessageContentImage;\n } else {\n return {\n type: \"image\",\n source: {\n type: \"url\",\n url: block.url,\n media_type: block.mime_type ?? \"\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? { cache_control: block.metadata!.cache_control }\n : {}),\n } as AnthropicMessageContentImage;\n }\n } else {\n if (block.source_type === \"base64\") {\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n data: block.data,\n media_type: block.mime_type ?? \"\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? { cache_control: block.metadata!.cache_control }\n : {}),\n } as AnthropicMessageContentImage;\n } else {\n throw new Error(\n `Unsupported image source type: ${block.source_type}`\n );\n }\n }\n },\n\n fromStandardFileBlock(\n block: StandardFileBlock\n ): AnthropicMessageContentDocument {\n const mime_type = (block.mime_type ?? \"\").split(\";\")[0];\n\n if (block.source_type === \"url\") {\n if (mime_type === \"application/pdf\" || mime_type === \"\") {\n return {\n type: \"document\",\n source: {\n type: \"url\",\n url: block.url,\n media_type: block.mime_type ?? \"\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n ...(\"citations\" in (block.metadata ?? {})\n ? {\n citations: block.metadata!.citations as { enabled?: boolean },\n }\n : {}),\n ...(\"context\" in (block.metadata ?? {})\n ? { context: block.metadata!.context as string }\n : {}),\n ...(block.metadata?.title ||\n block.metadata?.filename ||\n block.metadata?.name\n ? {\n title: (block.metadata?.title ||\n block.metadata?.filename ||\n block.metadata?.name) as string,\n }\n : {}),\n };\n }\n throw new Error(\n `Unsupported file mime type for file url source: ${block.mime_type}`\n );\n } else if (block.source_type === \"text\") {\n if (mime_type === \"text/plain\" || mime_type === \"\") {\n return {\n type: \"document\",\n source: {\n type: \"text\",\n data: block.text,\n media_type: block.mime_type ?? \"\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n ...(\"citations\" in (block.metadata ?? {})\n ? {\n citations: block.metadata!.citations as { enabled?: boolean },\n }\n : {}),\n ...(\"context\" in (block.metadata ?? {})\n ? { context: block.metadata!.context as string }\n : {}),\n ...(\"title\" in (block.metadata ?? {})\n ? { title: block.metadata!.title as string }\n : {}),\n };\n } else {\n throw new Error(\n `Unsupported file mime type for file text source: ${block.mime_type}`\n );\n }\n } else if (block.source_type === \"base64\") {\n if (mime_type === \"application/pdf\" || mime_type === \"\") {\n return {\n type: \"document\",\n source: {\n type: \"base64\",\n data: block.data,\n media_type: \"application/pdf\",\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n ...(\"citations\" in (block.metadata ?? {})\n ? {\n citations: block.metadata!.citations as { enabled?: boolean },\n }\n : {}),\n ...(\"context\" in (block.metadata ?? {})\n ? { context: block.metadata!.context as string }\n : {}),\n ...(\"title\" in (block.metadata ?? {})\n ? { title: block.metadata!.title as string }\n : {}),\n };\n } else if (\n [\"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\"].includes(\n mime_type\n )\n ) {\n return {\n type: \"document\",\n source: {\n type: \"content\",\n content: [\n {\n type: \"image\",\n source: {\n type: \"base64\",\n data: block.data,\n media_type: mime_type as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\n },\n },\n ],\n },\n ...(\"cache_control\" in (block.metadata ?? {})\n ? {\n cache_control: block.metadata!\n .cache_control as AnthropicCacheControl,\n }\n : {}),\n ...(\"citations\" in (block.metadata ?? {})\n ? {\n citations: block.metadata!.citations as { enabled?: boolean },\n }\n : {}),\n ...(\"context\" in (block.metadata ?? {})\n ? { context: block.metadata!.context as string }\n : {}),\n ...(\"title\" in (block.metadata ?? {})\n ? { title: block.metadata!.title as string }\n : {}),\n };\n } else {\n throw new Error(\n `Unsupported file mime type for file base64 source: ${block.mime_type}`\n );\n }\n } else {\n throw new Error(`Unsupported file source type: ${block.source_type}`);\n }\n },\n };\n\n function contentToAnthropicContent(\n content: MessageContent | DataContentBlock[]\n ): AnthropicMessageContent[] {\n const ca =\n typeof content === \"string\" ? [{ type: \"text\", text: content }] : content;\n return ca\n .map((complex) =>\n isDataContentBlock(complex)\n ? convertToProviderContentBlock(complex, anthropicContentConverter)\n : contentComplexToAnthropicContent(complex)\n )\n .filter(Boolean) as AnthropicMessageContent[];\n }\n\n function toolCallToAnthropicContent(\n toolCall: ToolCall\n ): AnthropicMessageContentToolUse {\n return {\n type: \"tool_use\",\n id: toolCall.id!,\n name: toolCall.name,\n input: toolCall.args,\n };\n }\n\n function toolCallsToAnthropicContent(\n toolCalls: ToolCall[] | undefined\n ): AnthropicMessageContentToolUse[] {\n if (toolCalls === undefined) {\n return [];\n }\n return toolCalls.map(toolCallToAnthropicContent);\n }\n\n function baseRoleToAnthropicMessage(\n base: BaseMessage,\n role: string\n ): AnthropicMessage {\n const content = contentToAnthropicContent(base.content);\n return {\n role,\n content,\n };\n }\n\n function aiMessageToAnthropicMessage(base: AIMessage): AnthropicMessage {\n const ret = baseRoleToAnthropicMessage(base, \"assistant\");\n\n const content = ret.content as AnthropicMessageContent[];\n const existingToolUseIds = new Set(\n content\n .filter(\n (block): block is AnthropicMessageContentToolUse =>\n block.type === \"tool_use\"\n )\n .map((block) => block.id)\n );\n\n const toolContent = toolCallsToAnthropicContent(base.tool_calls).filter(\n (block) => !existingToolUseIds.has(block.id)\n );\n if (toolContent.length > 0) {\n ret.content = [...content, ...toolContent];\n }\n\n return ret;\n }\n\n function toolMessageToAnthropicMessage(base: ToolMessage): AnthropicMessage {\n const role = \"user\";\n const toolUseId = base.tool_call_id;\n const toolContent = contentToAnthropicContent(\n base.content\n ) as AnthropicMessageContentToolResultContent[];\n const content: AnthropicMessageContentToolResult[] = [\n {\n type: \"tool_result\",\n tool_use_id: toolUseId,\n content: toolContent,\n },\n ];\n return {\n role,\n content,\n };\n }\n\n function baseToAnthropicMessage(\n base: BaseMessage\n ): AnthropicMessage | undefined {\n const type = base._getType();\n switch (type) {\n case \"human\":\n return baseRoleToAnthropicMessage(base, \"user\");\n case \"ai\":\n return aiMessageToAnthropicMessage(base as AIMessage);\n case \"tool\":\n return toolMessageToAnthropicMessage(base as ToolMessage);\n case \"system\":\n // System messages are handled in formatSystem()\n return undefined;\n default:\n console.warn(`Unknown BaseMessage type: ${type}`, base);\n return undefined;\n }\n }\n\n function formatMessages(input: BaseMessage[]): AnthropicMessage[] {\n const ret: AnthropicMessage[] = [];\n\n input.forEach((baseMessage) => {\n const anthropicMessage = baseToAnthropicMessage(baseMessage);\n if (anthropicMessage) {\n ret.push(anthropicMessage);\n }\n });\n\n return ret;\n }\n\n function formatSettings(\n parameters: GoogleAIModelRequestParams\n ): AnthropicRequestSettings {\n const ret: AnthropicRequestSettings = {\n stream: parameters?.streaming ?? false,\n max_tokens: parameters?.maxOutputTokens ?? 8192,\n };\n\n if (parameters.topP) {\n ret.top_p = parameters.topP;\n }\n if (parameters.topK) {\n ret.top_k = parameters.topK;\n }\n if (parameters.temperature) {\n ret.temperature = parameters.temperature;\n }\n if (parameters.stopSequences) {\n ret.stop_sequences = parameters.stopSequences;\n }\n\n return ret;\n }\n\n function contentComplexArrayToText(\n contentArray: MessageContentComplex[]\n ): string {\n let ret = \"\";\n\n contentArray.forEach((content) => {\n const contentType = content?.type;\n if (contentType === \"text\") {\n const textContent = content as MessageContentText;\n ret = `${ret}\\n${textContent.text}`;\n }\n });\n\n return ret;\n }\n\n function formatSystem(input: BaseMessage[]): string {\n let ret = \"\";\n\n input.forEach((message) => {\n if (message._getType() === \"system\") {\n const content = message?.content;\n const contentString =\n typeof content === \"string\"\n ? (content as string)\n : contentComplexArrayToText(content as MessageContentComplex[]);\n ret = `${ret}\\n${contentString}`;\n }\n });\n\n return ret;\n }\n\n function formatGeminiTool(tool: GeminiTool): AnthropicTool[] {\n if (Object.hasOwn(tool, \"functionDeclarations\")) {\n const funcs = tool?.functionDeclarations ?? [];\n return funcs.map((func) => {\n const inputSchema = func.parameters!;\n return {\n // type: \"tool\", // This may only be valid for models 20241022+\n name: func.name,\n description: func.description,\n input_schema: inputSchema,\n };\n });\n } else {\n console.warn(\n `Unable to format GeminiTool: ${JSON.stringify(tool, null, 1)}`\n );\n return [];\n }\n }\n\n function formatTool(tool: GoogleAIToolType): AnthropicTool[] {\n if (Object.hasOwn(tool, \"name\")) {\n return [tool as AnthropicTool];\n } else {\n return formatGeminiTool(tool as GeminiTool);\n }\n }\n\n function formatTools(\n parameters: GoogleAIModelRequestParams\n ): AnthropicTool[] {\n const tools: GoogleAIToolType[] = parameters?.tools ?? [];\n const ret: AnthropicTool[] = [];\n tools.forEach((tool) => {\n const anthropicTools = formatTool(tool);\n anthropicTools.forEach((anthropicTool) => {\n if (anthropicTool) {\n ret.push(anthropicTool);\n }\n });\n });\n return ret;\n }\n\n function formatToolChoice(\n parameters: GoogleAIModelRequestParams\n ): AnthropicToolChoice | undefined {\n const choice = parameters?.tool_choice;\n if (!choice) {\n return undefined;\n } else if (typeof choice === \"object\") {\n return choice as AnthropicToolChoice;\n } else {\n switch (choice) {\n case \"any\":\n case \"auto\":\n return {\n type: choice,\n };\n case \"none\":\n return undefined;\n default:\n return {\n type: \"tool\",\n name: choice,\n };\n }\n }\n }\n\n async function formatData(\n input: unknown,\n parameters: GoogleAIModelRequestParams\n ): Promise<AnthropicRequest> {\n const typedInput = input as BaseMessage[];\n const anthropicVersion = formatAnthropicVersion();\n const messages = formatMessages(typedInput);\n const settings = formatSettings(parameters);\n const system = formatSystem(typedInput);\n const tools = formatTools(parameters);\n const toolChoice = formatToolChoice(parameters);\n const ret: AnthropicRequest = {\n anthropic_version: anthropicVersion,\n messages,\n ...settings,\n };\n if (tools && tools.length && parameters?.tool_choice !== \"none\") {\n ret.tools = tools;\n }\n if (toolChoice) {\n ret.tool_choice = toolChoice;\n }\n if (system?.length) {\n ret.system = system;\n }\n if (config?.thinking) {\n ret.thinking = config?.thinking;\n }\n\n return ret;\n }\n\n return {\n responseToString,\n responseToChatGeneration,\n chunkToString,\n responseToBaseMessage,\n responseToChatResult,\n formatData,\n };\n}\n\nexport function validateClaudeParams(_params: GoogleAIModelParams): void {\n // FIXME - validate the parameters\n}\n\nexport function isModelClaude(modelName: string): boolean {\n return modelName.toLowerCase().startsWith(\"claude\");\n}\n"],"mappings":"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"}
|