@langchain/community
Version:
Third-party integrations for LangChain.js
1 lines • 12.2 kB
Source Map (JSON)
{"version":3,"file":"deepinfra.cjs","names":["convertLangChainToolCallToOpenAI","AIMessage","ChatMessage","BaseChatModel"],"sources":["../../src/chat_models/deepinfra.ts"],"sourcesContent":["import {\n BaseChatModel,\n type BaseChatModelParams,\n BindToolsInput,\n type BaseChatModelCallOptions,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n AIMessage,\n type BaseMessage,\n type ToolMessage,\n isAIMessage,\n type UsageMetadata,\n ChatMessage,\n type AIMessageChunk,\n} from \"@langchain/core/messages\";\nimport {\n convertLangChainToolCallToOpenAI,\n makeInvalidToolCall,\n parseToolCall,\n} from \"@langchain/core/output_parsers/openai_tools\";\nimport { type ChatResult, type ChatGeneration } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { Runnable } from \"@langchain/core/runnables\";\nimport { convertToOpenAITool } from \"@langchain/core/utils/function_calling\";\nimport { BaseLanguageModelInput } from \"@langchain/core/language_models/base\";\n\nexport const DEFAULT_MODEL = \"meta-llama/Meta-Llama-3-70B-Instruct\";\n\nexport type DeepInfraMessageRole = \"system\" | \"assistant\" | \"user\" | \"tool\";\n\nexport const API_BASE_URL =\n \"https://api.deepinfra.com/v1/openai/chat/completions\";\n\nexport const ENV_VARIABLE_API_KEY = \"DEEPINFRA_API_TOKEN\";\n\ntype DeepInfraFinishReason = \"stop\" | \"length\" | \"tool_calls\" | \"null\" | null;\n\ninterface DeepInfraToolCall {\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string;\n };\n}\n\ninterface DeepInfraMessage {\n role: DeepInfraMessageRole;\n content: string;\n tool_calls?: DeepInfraToolCall[];\n}\n\ninterface ChatCompletionRequest {\n model: string;\n messages?: DeepInfraMessage[];\n stream?: boolean;\n max_tokens?: number | null;\n temperature?: number | null;\n tools?: BindToolsInput[];\n stop?: string[];\n}\n\ninterface BaseResponse {\n code?: string;\n message?: string;\n}\n\ninterface ChoiceMessage {\n role: string;\n content: string;\n tool_calls?: DeepInfraToolCall[];\n}\n\ninterface ResponseChoice {\n index: number;\n finish_reason: DeepInfraFinishReason;\n delta: ChoiceMessage;\n message: ChoiceMessage;\n}\n\ninterface ChatCompletionResponse extends BaseResponse {\n choices: ResponseChoice[];\n usage: {\n completion_tokens: number;\n prompt_tokens: number;\n total_tokens: number;\n };\n output: {\n text: string;\n finish_reason: DeepInfraFinishReason;\n };\n}\n\nexport interface DeepInfraCallOptions extends BaseChatModelCallOptions {\n stop?: string[];\n tools?: BindToolsInput[];\n}\n\nexport interface ChatDeepInfraParams {\n model: string;\n apiKey?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nfunction messageToRole(message: BaseMessage): DeepInfraMessageRole {\n const type = message._getType();\n switch (type) {\n case \"ai\":\n return \"assistant\";\n case \"human\":\n return \"user\";\n case \"system\":\n return \"system\";\n case \"tool\":\n return \"tool\";\n default:\n throw new Error(`Unknown message type: ${type}`);\n }\n}\n\nfunction convertMessagesToDeepInfraParams(\n messages: BaseMessage[]\n): DeepInfraMessage[] {\n return messages.map((message): DeepInfraMessage => {\n if (typeof message.content !== \"string\") {\n throw new Error(\"Non string message content not supported\");\n }\n // oxlint-disable-next-line typescript/no-explicit-any\n const completionParam: Record<string, any> = {\n role: messageToRole(message),\n content: message.content,\n };\n if (message.name != null) {\n completionParam.name = message.name;\n }\n if (isAIMessage(message) && !!message.tool_calls?.length) {\n completionParam.tool_calls = message.tool_calls.map(\n convertLangChainToolCallToOpenAI\n );\n completionParam.content = \"\";\n } else {\n if (message.additional_kwargs.tool_calls != null) {\n completionParam.tool_calls = message.additional_kwargs.tool_calls;\n }\n if ((message as ToolMessage).tool_call_id != null) {\n completionParam.tool_call_id = (message as ToolMessage).tool_call_id;\n }\n }\n return completionParam as DeepInfraMessage;\n });\n}\n\nfunction deepInfraResponseToChatMessage(\n message: ChoiceMessage,\n usageMetadata?: UsageMetadata\n): BaseMessage {\n switch (message.role) {\n case \"assistant\": {\n const toolCalls = [];\n const invalidToolCalls = [];\n for (const rawToolCall of message.tool_calls ?? []) {\n try {\n toolCalls.push(parseToolCall(rawToolCall, { returnId: true }));\n // oxlint-disable-next-line typescript/no-explicit-any\n } catch (e: any) {\n invalidToolCalls.push(makeInvalidToolCall(rawToolCall, e.message));\n }\n }\n return new AIMessage({\n content: message.content || \"\",\n additional_kwargs: { tool_calls: message.tool_calls ?? [] },\n tool_calls: toolCalls,\n invalid_tool_calls: invalidToolCalls,\n usage_metadata: usageMetadata,\n });\n }\n default:\n return new ChatMessage(message.content || \"\", message.role ?? \"unknown\");\n }\n}\n\nexport class ChatDeepInfra\n extends BaseChatModel<DeepInfraCallOptions>\n implements ChatDeepInfraParams\n{\n static lc_name() {\n return \"ChatDeepInfra\";\n }\n\n get callKeys() {\n return [\"stop\", \"signal\", \"options\", \"tools\"];\n }\n\n apiKey?: string;\n\n model: string;\n\n apiUrl: string;\n\n maxTokens?: number;\n\n temperature?: number;\n\n constructor(fields: Partial<ChatDeepInfraParams> & BaseChatModelParams = {}) {\n super(fields);\n\n this.apiKey =\n fields?.apiKey ?? getEnvironmentVariable(ENV_VARIABLE_API_KEY);\n if (!this.apiKey) {\n throw new Error(\n \"API key is required, set `DEEPINFRA_API_TOKEN` environment variable or pass it as a parameter\"\n );\n }\n\n this.apiUrl = API_BASE_URL;\n this.model = fields.model ?? DEFAULT_MODEL;\n this.temperature = fields.temperature ?? 0;\n this.maxTokens = fields.maxTokens;\n }\n\n invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): Omit<ChatCompletionRequest, \"messages\"> {\n if (options?.tool_choice) {\n throw new Error(\n \"Tool choice is not supported for ChatDeepInfra currently.\"\n );\n }\n return {\n model: this.model,\n stream: false,\n temperature: this.temperature,\n max_tokens: this.maxTokens,\n tools: options?.tools,\n stop: options?.stop,\n };\n }\n\n identifyingParams(): Omit<ChatCompletionRequest, \"messages\"> {\n return this.invocationParams();\n }\n\n async _generate(\n messages: BaseMessage[],\n options?: this[\"ParsedCallOptions\"]\n ): Promise<ChatResult> {\n const parameters = this.invocationParams(options);\n const messagesMapped = convertMessagesToDeepInfraParams(messages);\n\n const data: ChatCompletionResponse = await this.completionWithRetry(\n { ...parameters, messages: messagesMapped },\n false,\n options?.signal\n );\n\n const {\n prompt_tokens = 0,\n completion_tokens = 0,\n total_tokens = 0,\n } = data.usage ?? {};\n\n const usageMetadata: UsageMetadata = {\n input_tokens: prompt_tokens,\n output_tokens: completion_tokens,\n total_tokens,\n };\n const generations: ChatGeneration[] = [];\n\n for (const part of data?.choices ?? []) {\n const text = part.message?.content ?? \"\";\n const generation: ChatGeneration = {\n text,\n message: deepInfraResponseToChatMessage(part.message, usageMetadata),\n };\n if (part.finish_reason) {\n generation.generationInfo = { finish_reason: part.finish_reason };\n }\n generations.push(generation);\n }\n\n return {\n generations,\n llmOutput: {\n tokenUsage: {\n promptTokens: prompt_tokens,\n completionTokens: completion_tokens,\n totalTokens: total_tokens,\n },\n },\n };\n }\n\n async completionWithRetry(\n request: ChatCompletionRequest,\n stream: boolean,\n signal?: AbortSignal\n ): Promise<ChatCompletionResponse> {\n const body = {\n temperature: this.temperature,\n max_tokens: this.maxTokens,\n ...request,\n model: this.model,\n };\n\n const makeCompletionRequest = async () => {\n const response = await fetch(this.apiUrl, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!stream) {\n return response.json();\n }\n };\n\n return this.caller.call(makeCompletionRequest);\n }\n\n override bindTools(\n tools: BindToolsInput[],\n kwargs?: Partial<DeepInfraCallOptions>\n ): Runnable<BaseLanguageModelInput, AIMessageChunk, DeepInfraCallOptions> {\n return this.withConfig({\n tools: tools.map((tool) => convertToOpenAITool(tool)),\n ...kwargs,\n } as DeepInfraCallOptions);\n }\n\n _llmType(): string {\n return \"DeepInfra\";\n }\n}\n"],"mappings":"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"}