@langchain/xai 1.4.5 → 1.4.7
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 +14 -0
- package/dist/chat_models/completions.cjs +2 -2
- package/dist/chat_models/completions.cjs.map +1 -1
- package/dist/chat_models/completions.d.cts +0 -1
- package/dist/chat_models/completions.d.cts.map +1 -1
- package/dist/chat_models/completions.d.ts +0 -1
- package/dist/chat_models/completions.d.ts.map +1 -1
- package/dist/chat_models/completions.js +2 -2
- package/dist/chat_models/completions.js.map +1 -1
- package/dist/chat_models/index.cjs +5 -2
- package/dist/chat_models/index.d.cts +2 -1
- package/dist/chat_models/index.d.ts +2 -1
- package/dist/chat_models/index.js +3 -3
- package/dist/chat_models/responses-types.d.cts +12 -6
- package/dist/chat_models/responses-types.d.cts.map +1 -1
- package/dist/chat_models/responses-types.d.ts +12 -6
- package/dist/chat_models/responses-types.d.ts.map +1 -1
- package/dist/chat_models/responses.cjs +1 -1
- package/dist/chat_models/responses.cjs.map +1 -1
- package/dist/chat_models/responses.d.cts +1 -2
- package/dist/chat_models/responses.d.cts.map +1 -1
- package/dist/chat_models/responses.d.ts +1 -2
- package/dist/chat_models/responses.d.ts.map +1 -1
- package/dist/chat_models/responses.js +1 -1
- package/dist/chat_models/responses.js.map +1 -1
- package/dist/converters/responses.cjs +2 -0
- package/dist/converters/responses.cjs.map +1 -1
- package/dist/converters/responses.js +1 -1
- package/dist/converters/responses.js.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/live_search.cjs.map +1 -1
- package/dist/live_search.d.cts +1 -1
- package/dist/live_search.d.cts.map +1 -1
- package/dist/live_search.d.ts +1 -1
- package/dist/live_search.d.ts.map +1 -1
- package/dist/live_search.js.map +1 -1
- package/dist/profiles.cjs.map +1 -1
- package/dist/profiles.js.map +1 -1
- package/dist/tools/code_execution.cjs.map +1 -1
- package/dist/tools/code_execution.d.cts.map +1 -1
- package/dist/tools/code_execution.d.ts.map +1 -1
- package/dist/tools/code_execution.js.map +1 -1
- package/dist/tools/collections_search.cjs.map +1 -1
- package/dist/tools/collections_search.d.cts.map +1 -1
- package/dist/tools/collections_search.d.ts.map +1 -1
- package/dist/tools/collections_search.js.map +1 -1
- package/dist/tools/index.cjs.map +1 -1
- package/dist/tools/index.d.cts +2 -2
- package/dist/tools/index.d.cts.map +1 -1
- package/dist/tools/index.d.ts +2 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/live_search.cjs.map +1 -1
- package/dist/tools/live_search.d.cts +1 -2
- package/dist/tools/live_search.d.cts.map +1 -1
- package/dist/tools/live_search.d.ts +1 -2
- package/dist/tools/live_search.d.ts.map +1 -1
- package/dist/tools/live_search.js.map +1 -1
- package/dist/tools/web_search.cjs.map +1 -1
- package/dist/tools/web_search.d.cts.map +1 -1
- package/dist/tools/web_search.d.ts.map +1 -1
- package/dist/tools/web_search.js.map +1 -1
- package/dist/tools/x_search.cjs.map +1 -1
- package/dist/tools/x_search.d.cts.map +1 -1
- package/dist/tools/x_search.d.ts.map +1 -1
- package/dist/tools/x_search.js.map +1 -1
- package/dist/utils/responses_stream_events.cjs.map +1 -1
- package/dist/utils/responses_stream_events.js.map +1 -1
- package/package.json +6 -6
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { BaseChatModelCallOptions, BaseChatModelParams } from "@langchain/core/language_models/chat_models";
|
|
2
|
-
|
|
3
2
|
//#region src/chat_models/responses-types.d.ts
|
|
4
3
|
/**
|
|
5
4
|
* Text input content item.
|
|
@@ -372,7 +371,8 @@ type XAIResponsesToolChoiceString = "none" | "auto" | "required";
|
|
|
372
371
|
interface XAIResponsesToolChoiceFunction {
|
|
373
372
|
type: "function";
|
|
374
373
|
function: {
|
|
375
|
-
/** The name of the function to call. */
|
|
374
|
+
/** The name of the function to call. */
|
|
375
|
+
name: string;
|
|
376
376
|
};
|
|
377
377
|
}
|
|
378
378
|
/**
|
|
@@ -667,7 +667,9 @@ interface XAIResponsesCodeInterpreterResult {
|
|
|
667
667
|
logs?: string;
|
|
668
668
|
/** The image data (for type "image"). */
|
|
669
669
|
image?: {
|
|
670
|
-
/** The base64-encoded image data. */
|
|
670
|
+
/** The base64-encoded image data. */
|
|
671
|
+
data?: string;
|
|
672
|
+
/** The MIME type of the image. */
|
|
671
673
|
media_type?: string;
|
|
672
674
|
};
|
|
673
675
|
}
|
|
@@ -721,11 +723,13 @@ interface XAIResponsesUsage {
|
|
|
721
723
|
total_tokens: number;
|
|
722
724
|
/** Detailed breakdown of input tokens. */
|
|
723
725
|
input_tokens_details?: {
|
|
724
|
-
/** Cached tokens from previous requests. */
|
|
726
|
+
/** Cached tokens from previous requests. */
|
|
727
|
+
cached_tokens?: number;
|
|
725
728
|
};
|
|
726
729
|
/** Detailed breakdown of output tokens. */
|
|
727
730
|
output_tokens_details?: {
|
|
728
|
-
/** Tokens used for reasoning. */
|
|
731
|
+
/** Tokens used for reasoning. */
|
|
732
|
+
reasoning_tokens?: number;
|
|
729
733
|
};
|
|
730
734
|
}
|
|
731
735
|
/**
|
|
@@ -898,7 +902,9 @@ interface XAIResponsesStreamEventFailed extends XAIResponsesStreamEventBase {
|
|
|
898
902
|
response: XAIResponse;
|
|
899
903
|
/** Error information. */
|
|
900
904
|
error?: {
|
|
901
|
-
/** Error code. */
|
|
905
|
+
/** Error code. */
|
|
906
|
+
code?: string;
|
|
907
|
+
/** Error message. */
|
|
902
908
|
message?: string;
|
|
903
909
|
};
|
|
904
910
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses-types.d.ts","names":[],"sources":["../../src/chat_models/responses-types.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"responses-types.d.ts","names":[],"sources":["../../src/chat_models/responses-types.ts"],"mappings":";;;;;UAOiB;EACf;;EAEA;;;;;;UAOe;EACf;;EAEA;;EAEA;;;;;UAMe;EACf;;EAEA;;;;;KAMU,+BACR,4BACA,6BACA;;;;UASa;EACf;;EAEA;;EAEA;;EAEA;;EAEA;;;;;UAMe;EACf;;EAEA;;EAEA;;;;;UAMe;EACf;;EAEA;;EAEA;;EAEA;;;;;UAMe;EACf;;EAEA;;EAEA;;EAEA;;;;;KAMU,uBACR,+BACA,gCACA,sCACA;;;;UAKa;;EAEf;;EAEA;;EAEA;;;;;UAMe;;EAEf;;EAEA;;EAEA;;EAEA,eAAe;;;;;UAMA;;EAEf,UAAU;;;;;;UAOK;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA,aAAa;;EAEb,WAAW;;;;;UAMI;EACf;;EAEA;;EAEA;;;;;KAMU,yBAAyB;;;;KASzB;;;;UASK;;EAEf,MAAM;;EAEN,kBAAkB;;EAElB;;;;;;KAOU,wBACR,sBACA,+BACA;;;;;KAMQ,6BAA6B;;;;KAS7B;;;;KAKA;;;;UAKK;;EAEf,SAAS;;EAET,UAAU;;;;;UAUK;EACf;;EAEA;;EAEA;;EAEA;;EAEA;;;;;UAMe;EACf;;EAEA;;EAEA;;EAEA;;EAEA;;;;;UAMe;EACf;;EAEA;;;;;KAMU,2BACR,4BACA,8BACA;;;;KAKQ;;;;;UAMK;;EAEf;;EAEA;;EAEA;;EAEA,OAAO;;EAEP;;EAEA,UAAU;;;;;UAUK;EACf;;;;;UAMe;EACf;;;;;UAMe;EACf;;EAEA,QAAQ;;EAER;;;;;KAMU,yBACR,6BACA,mCACA;;;;UAKa;;EAEf,SAAS;;;;;UAUM;;EAEf;;EAEA;;EAEA,YAAY;;;;;UAMG;EACf;;EAEA,UAAU;;;;;;UAOK;EACf;;EAEA;;EAEA;;EAEA;;;;;UAMe;EACf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;;;UAMe;EACf;;EAEA;;;;;UAMe;EACf;;;;;UAMe;EACf;;EAEA;;EAEA;;;;;KAMU,mBACR,2BACA,4BACA,0BACA,6BACA,kCACA;;;;KASQ;;;;UAKK;EACf;EACA;;IAEE;;;;;;KAOQ,yBACR,+BACA;;;;KASQ;;;;UASK;;;;;EAKf,OAAO;;;;EAKP;;;;;;EAOA;;;;;EAMA,UAAU;;;;;EAMV;;;;;EAMA;;;;;EAMA;;;;;EAMA,WAAW;;;;;EAMX;;;;;EAMA;;;;;EAMA,YAAY;;;;;EAMZ,oBAAoB;;;;;EAMpB;;;;;EAMA;;;;;EAMA;;;;;;EAOA;;;;EAKA,OAAO;;;;EAKP,cAAc;;;;;EAMd,QAAQ;;;;;EAMR;;;;;;EAOA;;;;;EAMA;;;;;EAMA;;;;;UAMe,0CAA0C;EACzD;;;;;UAMe,6CAA6C;EAC5D;;;;;KAUU;;;;KAKA;;;;UASK;EACf;;EAEA;;EAEA,SAAS;;EAET;;EAEA,SAAS;;;;;UAMM;EACf;;EAEA;;EAEA,cAAc;;;;;UAMC;EACf;;EAEA;;;;;KAMU,4BACR,gCACA;;;;UAKa;EACf;;EAEA;;EAEA;;EAEA;;EAEA;;;;;UAMe;EACf;;EAEA;;EAEA;;EAEA;;EAEA;;;;;KAMU,yBACR,oCACA;;;;UAKa;EACf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA,SAAS;;;;;UAMM;EACf;;EAEA;;EAEA;;;;;UAMe;EACf;;EAEA;;EAEA;;EAEA;;EAEA,UAAU;;;;;UAMK;;EAEf;;EAEA;;EAEA;;EAEA;;;;;UAMe;EACf;;EAEA;;EAEA;;EAEA;;EAEA,UAAU;;;;;UAMK;EACf;;EAEA;;EAEA;;IAEE;;IAEA;;;;;;UAOa;EACf;;EAEA;;EAEA;;EAEA;;EAEA;;;;;UAMe;EACf;;EAEA;;EAEA,UAAU;;EAEV;;;;;UAMe;EACf;;EAEA;;;;;KAMU,yBACR,6BACA,iCACA,kCACA,mCACA,wCACA,4BACA;;;;UASa;;EAEf;;EAEA;;EAEA;;EAEA;;IAEE;;;EAGF;;IAEE;;;;;;KAWQ;;;;UASK;;EAEf,SAAS;;;;;UAUM;;EAEf,aAAa;;GAEZ;;;;;UAUc;;EAEf,SAAS;;EAET,UAAU;;;;;UAUK;;;;EAIf;;;;EAKA,QAAQ;;;;EAKR;;;;EAKA;;;;EAKA,QAAQ;;;;EAKR,QAAQ;;;;EAKR;;;;;EAMA;;;;EAKA,OAAO;;;;EAKP,cAAc;;;;;EAMd,QAAQ;;;;;;EAOR;;;;EAKA,eAAe;;;;EAKf,qBAAqB;;;;;EAMrB;;;;EAKA,WAAW;;;;EAKX;;;;EAKA,YAAY;;;;;EAMZ;;;;;EAMA;;;;EAKA,QAAQ;;;;;EAMR;;;;;UAUe;;EAEf;;;;;UAMe,uCAAuC;EACtD;;EAEA,UAAU;;;;;UAMK,0CAA0C;EACzD;;EAEA,UAAU;;;;;UAMK,yCAAyC;EACxD;;EAEA,UAAU;;;;;UAMK,sCAAsC;EACrD;;EAEA,UAAU;;EAEV;;IAEE;;IAEA;;;;;;UAOa,0CAA0C;EACzD;;EAEA,UAAU;;;;;UAMK,+CAA+C;EAC9D;;EAEA;;EAEA,MAAM;;;;;UAMS,8CAA8C;EAC7D;;EAEA;;EAEA,MAAM;;;;;UAMS,gDAAgD;EAC/D;;EAEA;;EAEA;;EAEA,MAAM;;;;;UAMS,+CAA+C;EAC9D;;EAEA;;EAEA;;EAEA,MAAM;;;;;UAMS,yCAAyC;EACxD;;EAEA;;EAEA;;EAEA;;;;;UAMe,wCAAwC;EACvD;;EAEA;;EAEA;;EAEA;;;;;UAMe,0DAA0D;EACzE;;EAEA;;EAEA;;EAEA;;;;;UAMe,yDAAyD;EACxE;;EAEA;;EAEA;;EAEA;;;;;UAMe,yDAAyD;EACxE;;EAEA;;EAEA;;EAEA;;;;;UAMe,wDAAwD;EACvE;;EAEA;;EAEA;;EAEA;;;;;UAMe,qCAAqC;EACpD;;EAEA;;EAEA;;EAEA;;;;;KAMU,0BACR,iCACA,oCACA,mCACA,gCACA,oCACA,yCACA,wCACA,0CACA,yCACA,mCACA,kCACA,oDACA,mDACA,mDACA,kDACA;;;;UAca,oCAAoC;;;;EAInD,OAAO;;;;EAKP,UAAU;;;;;EAMV;;;;EAKA,oBAAoB;;;;EAKpB,YAAY;;;;;;;;;;;;;;;EAgBZ,QAAQ;;;;EAKR,cAAc;;;;EAKd;;;;;UAMe,8BAA8B;;;;;EAK7C;;;;;EAMA;;;;;EAMA;;;;;EAMA;;;;;EAMA;;;;EAKA;;;;;EAMA;;;;EAKA;;;;;EAMA;;;;EAKA,mBAAmB;;;;EAKnB,YAAY;;;;;;;;;;;;;;;EAgBZ,QAAQ;;;;;KAME,mCAAmC,KAC7C"}
|
|
@@ -56,7 +56,7 @@ var ChatXAIResponses = class extends _langchain_core_language_models_chat_models
|
|
|
56
56
|
model: modelOrFields
|
|
57
57
|
} : modelOrFields ?? {};
|
|
58
58
|
super(fields);
|
|
59
|
-
this._addVersion("@langchain/xai", "1.4.
|
|
59
|
+
this._addVersion("@langchain/xai", "1.4.7");
|
|
60
60
|
const apiKey = fields?.apiKey ?? (0, _langchain_core_utils_env.getEnvironmentVariable)("XAI_API_KEY");
|
|
61
61
|
if (!apiKey) throw new Error(`xAI API key not found. Please set the XAI_API_KEY environment variable or provide the key in the "apiKey" field.`);
|
|
62
62
|
this.apiKey = apiKey;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.cjs","names":["BaseChatModel","convertMessagesToResponsesInput","convertResponseToAIMessage","extractTextFromOutput","convertXAIResponsesStream","convertStreamEventToChunk"],"sources":["../../src/chat_models/responses.ts"],"sourcesContent":["import { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { AIMessage, BaseMessage } from \"@langchain/core/messages\";\nimport {\n BaseChatModel,\n type LangSmithParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { Serialized } from \"@langchain/core/load/serializable\";\n\nimport type {\n ChatXAIResponsesCallOptions,\n ChatXAIResponsesInput,\n ChatXAIResponsesInvocationParams,\n XAIResponse,\n XAIResponsesCreateParams,\n XAIResponsesCreateParamsNonStreaming,\n XAIResponsesCreateParamsStreaming,\n XAIResponsesReasoning,\n XAIResponsesSearchParameters,\n XAIResponsesStreamEvent,\n XAIResponsesTool,\n} from \"./responses-types.js\";\n\nimport {\n convertMessagesToResponsesInput,\n convertResponseToAIMessage,\n convertStreamEventToChunk,\n extractTextFromOutput,\n} from \"../converters/responses.js\";\nimport { convertXAIResponsesStream } from \"../utils/responses_stream_events.js\";\n\n// Re-export types for convenience\nexport type {\n ChatXAIResponsesCallOptions,\n ChatXAIResponsesInput,\n ChatXAIResponsesInvocationParams,\n};\n\n// ============================================================================\n// Main Class\n// ============================================================================\n\n/**\n * xAI Responses API chat model integration.\n *\n * This class provides access to xAI's Responses API, which offers enhanced\n * capabilities including built-in tools, reasoning, and search.\n *\n * @example\n * ```typescript\n * import { ChatXAIResponses } from \"@langchain/xai\";\n *\n * const llm = new ChatXAIResponses({\n * model: \"grok-3\",\n * temperature: 0.7,\n * });\n *\n * const result = await llm.invoke(\"What is the capital of France?\");\n * console.log(result.content);\n * ```\n */\nexport class ChatXAIResponses<\n CallOptions extends ChatXAIResponsesCallOptions = ChatXAIResponsesCallOptions,\n> extends BaseChatModel<CallOptions> {\n static lc_name() {\n return \"ChatXAIResponses\";\n }\n\n lc_serializable = true;\n\n lc_namespace = [\"langchain\", \"chat_models\", \"xai\"];\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n apiKey: \"XAI_API_KEY\",\n };\n }\n\n get lc_aliases(): { [key: string]: string } | undefined {\n return {\n apiKey: \"xai_api_key\",\n };\n }\n\n // -------------------------------------------------------------------------\n // Instance Properties\n // -------------------------------------------------------------------------\n\n apiKey: string;\n\n model: string;\n\n streaming: boolean;\n\n temperature?: number;\n\n topP?: number;\n\n maxOutputTokens?: number;\n\n store?: boolean;\n\n user?: string;\n\n baseURL: string;\n\n searchParameters?: XAIResponsesSearchParameters;\n\n reasoning?: XAIResponsesReasoning;\n\n tools?: XAIResponsesTool[];\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(model: string, fields?: Omit<ChatXAIResponsesInput, \"model\">);\n constructor(fields?: ChatXAIResponsesInput);\n constructor(\n modelOrFields?: string | ChatXAIResponsesInput,\n fieldsArg?: Omit<ChatXAIResponsesInput, \"model\">\n ) {\n const fields =\n typeof modelOrFields === \"string\"\n ? { ...(fieldsArg ?? {}), model: modelOrFields }\n : (modelOrFields ?? {});\n super(fields);\n\n this._addVersion(\"@langchain/xai\", __PKG_VERSION__);\n\n const apiKey = fields?.apiKey ?? getEnvironmentVariable(\"XAI_API_KEY\");\n if (!apiKey) {\n throw new Error(\n `xAI API key not found. Please set the XAI_API_KEY environment variable or provide the key in the \"apiKey\" field.`\n );\n }\n\n this.apiKey = apiKey;\n this.model = fields?.model ?? \"grok-3\";\n this.streaming = fields?.streaming ?? false;\n this.temperature = fields?.temperature;\n this.topP = fields?.topP;\n this.maxOutputTokens = fields?.maxOutputTokens;\n this.store = fields?.store;\n this.user = fields?.user;\n this.baseURL = fields?.baseURL ?? \"https://api.x.ai/v1\";\n this.searchParameters = fields?.searchParameters;\n this.reasoning = fields?.reasoning;\n this.tools = fields?.tools;\n }\n\n // -------------------------------------------------------------------------\n // Metadata Methods\n // -------------------------------------------------------------------------\n\n _llmType(): string {\n return \"xai-responses\";\n }\n\n override getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = super.getLsParams(options);\n params.ls_provider = \"xai\";\n params.ls_model_name = this.model;\n params.ls_model_type = \"chat\";\n params.ls_temperature = this.temperature;\n params.ls_max_tokens = this.maxOutputTokens;\n return params;\n }\n\n override toJSON(): Serialized {\n const result = super.toJSON();\n\n if (\n \"kwargs\" in result &&\n typeof result.kwargs === \"object\" &&\n result.kwargs != null\n ) {\n delete (result.kwargs as Record<string, unknown>).apiKey;\n }\n\n return result;\n }\n\n // -------------------------------------------------------------------------\n // Invocation Params\n // -------------------------------------------------------------------------\n\n invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): ChatXAIResponsesInvocationParams {\n return {\n model: this.model,\n temperature: this.temperature,\n top_p: this.topP,\n max_output_tokens: this.maxOutputTokens,\n store: this.store,\n user: this.user,\n stream: this.streaming,\n previous_response_id: options?.previous_response_id,\n include: options?.include,\n text: options?.text,\n search_parameters: options?.search_parameters ?? this.searchParameters,\n reasoning: options?.reasoning ?? this.reasoning,\n tools: options?.tools ?? this.tools,\n tool_choice: options?.tool_choice,\n parallel_tool_calls: options?.parallel_tool_calls,\n };\n }\n\n // -------------------------------------------------------------------------\n // API Call Methods\n // -------------------------------------------------------------------------\n\n /**\n * Makes a request to the xAI Responses API.\n */\n protected async _makeRequest(\n request: XAIResponsesCreateParamsNonStreaming\n ): Promise<XAIResponse>;\n\n protected async _makeRequest(\n request: XAIResponsesCreateParamsStreaming\n ): Promise<AsyncIterable<XAIResponsesStreamEvent>>;\n\n protected async _makeRequest(\n request: XAIResponsesCreateParams\n ): Promise<XAIResponse | AsyncIterable<XAIResponsesStreamEvent>> {\n const url = `${this.baseURL}/responses`;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n };\n\n if (request.stream) {\n return this._makeStreamingRequest(url, headers, request);\n }\n\n const response = await this.caller.call(async () => {\n const res = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n throw new Error(\n `xAI API error: ${res.status} ${res.statusText} - ${errorBody}`\n );\n }\n\n return res.json();\n });\n\n return response as XAIResponse;\n }\n\n /**\n * Makes a streaming request to the xAI Responses API.\n */\n protected async *_makeStreamingRequest(\n url: string,\n headers: Record<string, string>,\n request: XAIResponsesCreateParams\n ): AsyncIterable<XAIResponsesStreamEvent> {\n const response = await this.caller.call(async () => {\n const res = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n throw new Error(\n `xAI API error: ${res.status} ${res.statusText} - ${errorBody}`\n );\n }\n\n return res;\n });\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed === \"data: [DONE]\") continue;\n\n if (trimmed.startsWith(\"data: \")) {\n try {\n const data = JSON.parse(trimmed.slice(6));\n yield data as XAIResponsesStreamEvent;\n } catch {\n // Skip invalid JSON\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n // -------------------------------------------------------------------------\n // Generation Methods\n // -------------------------------------------------------------------------\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const invocationParams = this.invocationParams(options);\n const input = convertMessagesToResponsesInput(messages);\n\n if (invocationParams.stream) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | undefined;\n\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n finalChunk = finalChunk?.concat(chunk) ?? chunk;\n }\n\n return {\n generations: finalChunk ? [finalChunk] : [],\n llmOutput: {\n estimatedTokenUsage: (finalChunk?.message as AIMessage | undefined)\n ?.usage_metadata,\n },\n };\n }\n\n const response = await this._makeRequest({\n input,\n ...invocationParams,\n stream: false,\n } as XAIResponsesCreateParamsNonStreaming);\n\n const aiMessage = convertResponseToAIMessage(response);\n const text = extractTextFromOutput(response.output);\n\n return {\n generations: [\n {\n text,\n message: aiMessage,\n },\n ],\n llmOutput: {\n id: response.id,\n estimatedTokenUsage: response.usage\n ? {\n promptTokens: response.usage.input_tokens,\n completionTokens: response.usage.output_tokens,\n totalTokens: response.usage.total_tokens,\n }\n : undefined,\n },\n };\n }\n\n async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n const invocationParams = this.invocationParams(options);\n const input = convertMessagesToResponsesInput(messages);\n\n const streamIterable = await this._makeRequest({\n input,\n ...invocationParams,\n stream: true,\n } as XAIResponsesCreateParamsStreaming);\n\n const shouldStreamUsage = options.streamUsage ?? true;\n\n const abortableStream = async function* (\n source: AsyncIterable<XAIResponsesStreamEvent>,\n signal?: AbortSignal\n ) {\n for await (const event of source) {\n if (signal?.aborted) {\n return;\n }\n yield event;\n }\n };\n\n yield* convertXAIResponsesStream(\n abortableStream(streamIterable, options.signal),\n { streamUsage: shouldStreamUsage }\n );\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const invocationParams = this.invocationParams(options);\n const input = convertMessagesToResponsesInput(messages);\n\n const streamIterable = await this._makeRequest({\n input,\n ...invocationParams,\n stream: true,\n } as XAIResponsesCreateParamsStreaming);\n\n for await (const event of streamIterable) {\n if (options.signal?.aborted) {\n return;\n }\n const chunk = convertStreamEventToChunk(event);\n if (chunk) {\n yield chunk;\n await runManager?.handleLLMNewToken(chunk.text || \"\", {\n prompt: 0,\n completion: 0,\n });\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"responses.cjs","names":["BaseChatModel","convertMessagesToResponsesInput","convertResponseToAIMessage","extractTextFromOutput","convertXAIResponsesStream","convertStreamEventToChunk"],"sources":["../../src/chat_models/responses.ts"],"sourcesContent":["import { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { AIMessage, BaseMessage } from \"@langchain/core/messages\";\nimport {\n BaseChatModel,\n type LangSmithParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { Serialized } from \"@langchain/core/load/serializable\";\n\nimport type {\n ChatXAIResponsesCallOptions,\n ChatXAIResponsesInput,\n ChatXAIResponsesInvocationParams,\n XAIResponse,\n XAIResponsesCreateParams,\n XAIResponsesCreateParamsNonStreaming,\n XAIResponsesCreateParamsStreaming,\n XAIResponsesReasoning,\n XAIResponsesSearchParameters,\n XAIResponsesStreamEvent,\n XAIResponsesTool,\n} from \"./responses-types.js\";\n\nimport {\n convertMessagesToResponsesInput,\n convertResponseToAIMessage,\n convertStreamEventToChunk,\n extractTextFromOutput,\n} from \"../converters/responses.js\";\nimport { convertXAIResponsesStream } from \"../utils/responses_stream_events.js\";\n\n// Re-export types for convenience\nexport type {\n ChatXAIResponsesCallOptions,\n ChatXAIResponsesInput,\n ChatXAIResponsesInvocationParams,\n};\n\n// ============================================================================\n// Main Class\n// ============================================================================\n\n/**\n * xAI Responses API chat model integration.\n *\n * This class provides access to xAI's Responses API, which offers enhanced\n * capabilities including built-in tools, reasoning, and search.\n *\n * @example\n * ```typescript\n * import { ChatXAIResponses } from \"@langchain/xai\";\n *\n * const llm = new ChatXAIResponses({\n * model: \"grok-3\",\n * temperature: 0.7,\n * });\n *\n * const result = await llm.invoke(\"What is the capital of France?\");\n * console.log(result.content);\n * ```\n */\nexport class ChatXAIResponses<\n CallOptions extends ChatXAIResponsesCallOptions = ChatXAIResponsesCallOptions,\n> extends BaseChatModel<CallOptions> {\n static lc_name() {\n return \"ChatXAIResponses\";\n }\n\n lc_serializable = true;\n\n lc_namespace = [\"langchain\", \"chat_models\", \"xai\"];\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n apiKey: \"XAI_API_KEY\",\n };\n }\n\n get lc_aliases(): { [key: string]: string } | undefined {\n return {\n apiKey: \"xai_api_key\",\n };\n }\n\n // -------------------------------------------------------------------------\n // Instance Properties\n // -------------------------------------------------------------------------\n\n apiKey: string;\n\n model: string;\n\n streaming: boolean;\n\n temperature?: number;\n\n topP?: number;\n\n maxOutputTokens?: number;\n\n store?: boolean;\n\n user?: string;\n\n baseURL: string;\n\n searchParameters?: XAIResponsesSearchParameters;\n\n reasoning?: XAIResponsesReasoning;\n\n tools?: XAIResponsesTool[];\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(model: string, fields?: Omit<ChatXAIResponsesInput, \"model\">);\n constructor(fields?: ChatXAIResponsesInput);\n constructor(\n modelOrFields?: string | ChatXAIResponsesInput,\n fieldsArg?: Omit<ChatXAIResponsesInput, \"model\">\n ) {\n const fields =\n typeof modelOrFields === \"string\"\n ? { ...(fieldsArg ?? {}), model: modelOrFields }\n : (modelOrFields ?? {});\n super(fields);\n\n this._addVersion(\"@langchain/xai\", __PKG_VERSION__);\n\n const apiKey = fields?.apiKey ?? getEnvironmentVariable(\"XAI_API_KEY\");\n if (!apiKey) {\n throw new Error(\n `xAI API key not found. Please set the XAI_API_KEY environment variable or provide the key in the \"apiKey\" field.`\n );\n }\n\n this.apiKey = apiKey;\n this.model = fields?.model ?? \"grok-3\";\n this.streaming = fields?.streaming ?? false;\n this.temperature = fields?.temperature;\n this.topP = fields?.topP;\n this.maxOutputTokens = fields?.maxOutputTokens;\n this.store = fields?.store;\n this.user = fields?.user;\n this.baseURL = fields?.baseURL ?? \"https://api.x.ai/v1\";\n this.searchParameters = fields?.searchParameters;\n this.reasoning = fields?.reasoning;\n this.tools = fields?.tools;\n }\n\n // -------------------------------------------------------------------------\n // Metadata Methods\n // -------------------------------------------------------------------------\n\n _llmType(): string {\n return \"xai-responses\";\n }\n\n override getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = super.getLsParams(options);\n params.ls_provider = \"xai\";\n params.ls_model_name = this.model;\n params.ls_model_type = \"chat\";\n params.ls_temperature = this.temperature;\n params.ls_max_tokens = this.maxOutputTokens;\n return params;\n }\n\n override toJSON(): Serialized {\n const result = super.toJSON();\n\n if (\n \"kwargs\" in result &&\n typeof result.kwargs === \"object\" &&\n result.kwargs != null\n ) {\n delete (result.kwargs as Record<string, unknown>).apiKey;\n }\n\n return result;\n }\n\n // -------------------------------------------------------------------------\n // Invocation Params\n // -------------------------------------------------------------------------\n\n invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): ChatXAIResponsesInvocationParams {\n return {\n model: this.model,\n temperature: this.temperature,\n top_p: this.topP,\n max_output_tokens: this.maxOutputTokens,\n store: this.store,\n user: this.user,\n stream: this.streaming,\n previous_response_id: options?.previous_response_id,\n include: options?.include,\n text: options?.text,\n search_parameters: options?.search_parameters ?? this.searchParameters,\n reasoning: options?.reasoning ?? this.reasoning,\n tools: options?.tools ?? this.tools,\n tool_choice: options?.tool_choice,\n parallel_tool_calls: options?.parallel_tool_calls,\n };\n }\n\n // -------------------------------------------------------------------------\n // API Call Methods\n // -------------------------------------------------------------------------\n\n /**\n * Makes a request to the xAI Responses API.\n */\n protected async _makeRequest(\n request: XAIResponsesCreateParamsNonStreaming\n ): Promise<XAIResponse>;\n\n protected async _makeRequest(\n request: XAIResponsesCreateParamsStreaming\n ): Promise<AsyncIterable<XAIResponsesStreamEvent>>;\n\n protected async _makeRequest(\n request: XAIResponsesCreateParams\n ): Promise<XAIResponse | AsyncIterable<XAIResponsesStreamEvent>> {\n const url = `${this.baseURL}/responses`;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n };\n\n if (request.stream) {\n return this._makeStreamingRequest(url, headers, request);\n }\n\n const response = await this.caller.call(async () => {\n const res = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n throw new Error(\n `xAI API error: ${res.status} ${res.statusText} - ${errorBody}`\n );\n }\n\n return res.json();\n });\n\n return response as XAIResponse;\n }\n\n /**\n * Makes a streaming request to the xAI Responses API.\n */\n protected async *_makeStreamingRequest(\n url: string,\n headers: Record<string, string>,\n request: XAIResponsesCreateParams\n ): AsyncIterable<XAIResponsesStreamEvent> {\n const response = await this.caller.call(async () => {\n const res = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n throw new Error(\n `xAI API error: ${res.status} ${res.statusText} - ${errorBody}`\n );\n }\n\n return res;\n });\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed === \"data: [DONE]\") continue;\n\n if (trimmed.startsWith(\"data: \")) {\n try {\n const data = JSON.parse(trimmed.slice(6));\n yield data as XAIResponsesStreamEvent;\n } catch {\n // Skip invalid JSON\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n // -------------------------------------------------------------------------\n // Generation Methods\n // -------------------------------------------------------------------------\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const invocationParams = this.invocationParams(options);\n const input = convertMessagesToResponsesInput(messages);\n\n if (invocationParams.stream) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | undefined;\n\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n finalChunk = finalChunk?.concat(chunk) ?? chunk;\n }\n\n return {\n generations: finalChunk ? [finalChunk] : [],\n llmOutput: {\n estimatedTokenUsage: (finalChunk?.message as AIMessage | undefined)\n ?.usage_metadata,\n },\n };\n }\n\n const response = await this._makeRequest({\n input,\n ...invocationParams,\n stream: false,\n } as XAIResponsesCreateParamsNonStreaming);\n\n const aiMessage = convertResponseToAIMessage(response);\n const text = extractTextFromOutput(response.output);\n\n return {\n generations: [\n {\n text,\n message: aiMessage,\n },\n ],\n llmOutput: {\n id: response.id,\n estimatedTokenUsage: response.usage\n ? {\n promptTokens: response.usage.input_tokens,\n completionTokens: response.usage.output_tokens,\n totalTokens: response.usage.total_tokens,\n }\n : undefined,\n },\n };\n }\n\n async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n const invocationParams = this.invocationParams(options);\n const input = convertMessagesToResponsesInput(messages);\n\n const streamIterable = await this._makeRequest({\n input,\n ...invocationParams,\n stream: true,\n } as XAIResponsesCreateParamsStreaming);\n\n const shouldStreamUsage = options.streamUsage ?? true;\n\n const abortableStream = async function* (\n source: AsyncIterable<XAIResponsesStreamEvent>,\n signal?: AbortSignal\n ) {\n for await (const event of source) {\n if (signal?.aborted) {\n return;\n }\n yield event;\n }\n };\n\n yield* convertXAIResponsesStream(\n abortableStream(streamIterable, options.signal),\n { streamUsage: shouldStreamUsage }\n );\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const invocationParams = this.invocationParams(options);\n const input = convertMessagesToResponsesInput(messages);\n\n const streamIterable = await this._makeRequest({\n input,\n ...invocationParams,\n stream: true,\n } as XAIResponsesCreateParamsStreaming);\n\n for await (const event of streamIterable) {\n if (options.signal?.aborted) {\n return;\n }\n const chunk = convertStreamEventToChunk(event);\n if (chunk) {\n yield chunk;\n await runManager?.handleLLMNewToken(chunk.text || \"\", {\n prompt: 0,\n completion: 0,\n });\n }\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA+DA,IAAa,mBAAb,cAEUA,4CAAAA,cAA2B;CACnC,OAAO,UAAU;EACf,OAAO;CACT;CAEA,kBAAkB;CAElB,eAAe;EAAC;EAAa;EAAe;CAAK;CAEjD,IAAI,aAAoD;EACtD,OAAO,EACL,QAAQ,cACV;CACF;CAEA,IAAI,aAAoD;EACtD,OAAO,EACL,QAAQ,cACV;CACF;CAMA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAQA,YACE,eACA,WACA;EACA,MAAM,SACJ,OAAO,kBAAkB,WACrB;GAAE,GAAI,aAAa,CAAC;GAAI,OAAO;EAAc,IAC5C,iBAAiB,CAAC;EACzB,MAAM,MAAM;EAEZ,KAAK,YAAY,kBAAA,OAAiC;EAElD,MAAM,SAAS,QAAQ,WAAA,GAAA,0BAAA,uBAAA,CAAiC,aAAa;EACrE,IAAI,CAAC,QACH,MAAM,IAAI,MACR,kHACF;EAGF,KAAK,SAAS;EACd,KAAK,QAAQ,QAAQ,SAAS;EAC9B,KAAK,YAAY,QAAQ,aAAa;EACtC,KAAK,cAAc,QAAQ;EAC3B,KAAK,OAAO,QAAQ;EACpB,KAAK,kBAAkB,QAAQ;EAC/B,KAAK,QAAQ,QAAQ;EACrB,KAAK,OAAO,QAAQ;EACpB,KAAK,UAAU,QAAQ,WAAW;EAClC,KAAK,mBAAmB,QAAQ;EAChC,KAAK,YAAY,QAAQ;EACzB,KAAK,QAAQ,QAAQ;CACvB;CAMA,WAAmB;EACjB,OAAO;CACT;CAEA,YAAqB,SAAqD;EACxE,MAAM,SAAS,MAAM,YAAY,OAAO;EACxC,OAAO,cAAc;EACrB,OAAO,gBAAgB,KAAK;EAC5B,OAAO,gBAAgB;EACvB,OAAO,iBAAiB,KAAK;EAC7B,OAAO,gBAAgB,KAAK;EAC5B,OAAO;CACT;CAEA,SAA8B;EAC5B,MAAM,SAAS,MAAM,OAAO;EAE5B,IACE,YAAY,UACZ,OAAO,OAAO,WAAW,YACzB,OAAO,UAAU,MAEjB,OAAQ,OAAO,OAAmC;EAGpD,OAAO;CACT;CAMA,iBACE,SACkC;EAClC,OAAO;GACL,OAAO,KAAK;GACZ,aAAa,KAAK;GAClB,OAAO,KAAK;GACZ,mBAAmB,KAAK;GACxB,OAAO,KAAK;GACZ,MAAM,KAAK;GACX,QAAQ,KAAK;GACb,sBAAsB,SAAS;GAC/B,SAAS,SAAS;GAClB,MAAM,SAAS;GACf,mBAAmB,SAAS,qBAAqB,KAAK;GACtD,WAAW,SAAS,aAAa,KAAK;GACtC,OAAO,SAAS,SAAS,KAAK;GAC9B,aAAa,SAAS;GACtB,qBAAqB,SAAS;EAChC;CACF;CAiBA,MAAgB,aACd,SAC+D;EAC/D,MAAM,MAAM,GAAG,KAAK,QAAQ;EAE5B,MAAM,UAAkC;GACtC,gBAAgB;GAChB,eAAe,UAAU,KAAK;EAChC;EAEA,IAAI,QAAQ,QACV,OAAO,KAAK,sBAAsB,KAAK,SAAS,OAAO;EAoBzD,OAAO,MAjBgB,KAAK,OAAO,KAAK,YAAY;GAClD,MAAM,MAAM,MAAM,MAAM,KAAK;IAC3B,QAAQ;IACR;IACA,MAAM,KAAK,UAAU,OAAO;GAC9B,CAAC;GAED,IAAI,CAAC,IAAI,IAAI;IACX,MAAM,YAAY,MAAM,IAAI,KAAK;IACjC,MAAM,IAAI,MACR,kBAAkB,IAAI,OAAO,GAAG,IAAI,WAAW,KAAK,WACtD;GACF;GAEA,OAAO,IAAI,KAAK;EAClB,CAAC;CAGH;;;;CAKA,OAAiB,sBACf,KACA,SACA,SACwC;EAkBxC,MAAM,UAAS,MAjBQ,KAAK,OAAO,KAAK,YAAY;GAClD,MAAM,MAAM,MAAM,MAAM,KAAK;IAC3B,QAAQ;IACR;IACA,MAAM,KAAK,UAAU,OAAO;GAC9B,CAAC;GAED,IAAI,CAAC,IAAI,IAAI;IACX,MAAM,YAAY,MAAM,IAAI,KAAK;IACjC,MAAM,IAAI,MACR,kBAAkB,IAAI,OAAO,GAAG,IAAI,WAAW,KAAK,WACtD;GACF;GAEA,OAAO;EACT,CAAC,EAAA,CAEuB,MAAM,UAAU;EACxC,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,kBAAkB;EAGpC,MAAM,UAAU,IAAI,YAAY;EAChC,IAAI,SAAS;EAEb,IAAI;GACF,OAAO,MAAM;IACX,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;IAC1C,IAAI,MAAM;IAEV,UAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;IAChD,MAAM,QAAQ,OAAO,MAAM,IAAI;IAC/B,SAAS,MAAM,IAAI,KAAK;IAExB,KAAK,MAAM,QAAQ,OAAO;KACxB,MAAM,UAAU,KAAK,KAAK;KAC1B,IAAI,CAAC,WAAW,YAAY,gBAAgB;KAE5C,IAAI,QAAQ,WAAW,QAAQ,GAC7B,IAAI;MAEF,MADa,KAAK,MAAM,QAAQ,MAAM,CAAC,CAC9B;KACX,QAAQ,CAER;IAEJ;GACF;EACF,UAAU;GACR,OAAO,YAAY;EACrB;CACF;CAMA,MAAM,UACJ,UACA,SACA,YACqB;EACrB,QAAQ,QAAQ,eAAe;EAC/B,MAAM,mBAAmB,KAAK,iBAAiB,OAAO;EACtD,MAAM,QAAQC,kBAAAA,gCAAgC,QAAQ;EAEtD,IAAI,iBAAiB,QAAQ;GAC3B,MAAM,SAAS,KAAK,sBAAsB,UAAU,SAAS,UAAU;GACvE,IAAI;GAEJ,WAAW,MAAM,SAAS,QAAQ;IAChC,MAAM,QAAQ,oBAAoB;KAChC,GAAG,MAAM;KACT,GAAG,MAAM,QAAQ;IACnB;IACA,aAAa,YAAY,OAAO,KAAK,KAAK;GAC5C;GAEA,OAAO;IACL,aAAa,aAAa,CAAC,UAAU,IAAI,CAAC;IAC1C,WAAW,EACT,sBAAsB,YAAY,QAAA,EAC9B,eACN;GACF;EACF;EAEA,MAAM,WAAW,MAAM,KAAK,aAAa;GACvC;GACA,GAAG;GACH,QAAQ;EACV,CAAyC;EAEzC,MAAM,YAAYC,kBAAAA,2BAA2B,QAAQ;EAGrD,OAAO;GACL,aAAa,CACX;IACE,MALOC,kBAAAA,sBAAsB,SAAS,MAKnC;IACH,SAAS;GACX,CACF;GACA,WAAW;IACT,IAAI,SAAS;IACb,qBAAqB,SAAS,QAC1B;KACE,cAAc,SAAS,MAAM;KAC7B,kBAAkB,SAAS,MAAM;KACjC,aAAa,SAAS,MAAM;IAC9B,IACA,KAAA;GACN;EACF;CACF;CAEA,OAAO,uBACL,UACA,SACA,aACsC;EACtC,MAAM,mBAAmB,KAAK,iBAAiB,OAAO;EACtD,MAAM,QAAQF,kBAAAA,gCAAgC,QAAQ;EAEtD,MAAM,iBAAiB,MAAM,KAAK,aAAa;GAC7C;GACA,GAAG;GACH,QAAQ;EACV,CAAsC;EAEtC,MAAM,oBAAoB,QAAQ,eAAe;EAEjD,MAAM,kBAAkB,iBACtB,QACA,QACA;GACA,WAAW,MAAM,SAAS,QAAQ;IAChC,IAAI,QAAQ,SACV;IAEF,MAAM;GACR;EACF;EAEA,OAAOG,gCAAAA,0BACL,gBAAgB,gBAAgB,QAAQ,MAAM,GAC9C,EAAE,aAAa,kBAAkB,CACnC;CACF;CAEA,OAAO,sBACL,UACA,SACA,YACqC;EACrC,MAAM,mBAAmB,KAAK,iBAAiB,OAAO;EACtD,MAAM,QAAQH,kBAAAA,gCAAgC,QAAQ;EAEtD,MAAM,iBAAiB,MAAM,KAAK,aAAa;GAC7C;GACA,GAAG;GACH,QAAQ;EACV,CAAsC;EAEtC,WAAW,MAAM,SAAS,gBAAgB;GACxC,IAAI,QAAQ,QAAQ,SAClB;GAEF,MAAM,QAAQI,kBAAAA,0BAA0B,KAAK;GAC7C,IAAI,OAAO;IACT,MAAM;IACN,MAAM,YAAY,kBAAkB,MAAM,QAAQ,IAAI;KACpD,QAAQ;KACR,YAAY;IACd,CAAC;GACH;EACF;CACF;AACF"}
|
|
@@ -5,7 +5,6 @@ import { BaseMessage } from "@langchain/core/messages";
|
|
|
5
5
|
import { CallbackManagerForLLMRun } from "@langchain/core/callbacks/manager";
|
|
6
6
|
import { ChatModelStreamEvent } from "@langchain/core/language_models/event";
|
|
7
7
|
import { ChatGenerationChunk, ChatResult } from "@langchain/core/outputs";
|
|
8
|
-
|
|
9
8
|
//#region src/chat_models/responses.d.ts
|
|
10
9
|
/**
|
|
11
10
|
* xAI Responses API chat model integration.
|
|
@@ -68,5 +67,5 @@ declare class ChatXAIResponses<CallOptions extends ChatXAIResponsesCallOptions =
|
|
|
68
67
|
_streamResponseChunks(messages: BaseMessage[], options: this["ParsedCallOptions"], runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatGenerationChunk>;
|
|
69
68
|
}
|
|
70
69
|
//#endregion
|
|
71
|
-
export { ChatXAIResponses };
|
|
70
|
+
export { ChatXAIResponses, type ChatXAIResponsesCallOptions, type ChatXAIResponsesInput, type ChatXAIResponsesInvocationParams };
|
|
72
71
|
//# sourceMappingURL=responses.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.d.cts","names":[],"sources":["../../src/chat_models/responses.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"responses.d.cts","names":[],"sources":["../../src/chat_models/responses.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;cA+Da,iBACX,oBAAoB,8BAA8B,qCAC1C,cAAc;SACf;EAIP;EAEA;MAEI;KAAiB;;MAMjB;KAAiB;;EAUrB;EAEA;EAEA;EAEA;EAEA;EAEA;EAEA;EAEA;EAEA;EAEA,mBAAmB;EAEnB,YAAY;EAEZ,QAAQ;EAMR,YAAY,eAAe,SAAS,KAAK;EACzC,YAAY,SAAS;EAsCrB;EAIS,YAAY,qCAAqC;EAUjD,UAAU;EAkBnB,iBACE,sCACC;;;;YA2Ba,aACd,SAAS,uCACR,QAAQ;YAEK,aACd,SAAS,oCACR,QAAQ,cAAc;;;;YAuCR,sBACf,aACA,SAAS,wBACT,SAAS,2BACR,cAAc;EA0DX,UACJ,UAAU,eACV,oCACA,aAAa,2BACZ,QAAQ;EAuDJ,uBACL,UAAU,eACV,oCACA,cAAc,2BACb,eAAe;EA8BX,sBACL,UAAU,eACV,oCACA,aAAa,2BACZ,eAAe"}
|
|
@@ -5,7 +5,6 @@ import { ChatGenerationChunk, ChatResult } from "@langchain/core/outputs";
|
|
|
5
5
|
import { Serialized } from "@langchain/core/load/serializable";
|
|
6
6
|
import { CallbackManagerForLLMRun } from "@langchain/core/callbacks/manager";
|
|
7
7
|
import { ChatModelStreamEvent } from "@langchain/core/language_models/event";
|
|
8
|
-
|
|
9
8
|
//#region src/chat_models/responses.d.ts
|
|
10
9
|
/**
|
|
11
10
|
* xAI Responses API chat model integration.
|
|
@@ -68,5 +67,5 @@ declare class ChatXAIResponses<CallOptions extends ChatXAIResponsesCallOptions =
|
|
|
68
67
|
_streamResponseChunks(messages: BaseMessage[], options: this["ParsedCallOptions"], runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatGenerationChunk>;
|
|
69
68
|
}
|
|
70
69
|
//#endregion
|
|
71
|
-
export { ChatXAIResponses };
|
|
70
|
+
export { ChatXAIResponses, type ChatXAIResponsesCallOptions, type ChatXAIResponsesInput, type ChatXAIResponsesInvocationParams };
|
|
72
71
|
//# sourceMappingURL=responses.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.d.ts","names":[],"sources":["../../src/chat_models/responses.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"responses.d.ts","names":[],"sources":["../../src/chat_models/responses.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;cA+Da,iBACX,oBAAoB,8BAA8B,qCAC1C,cAAc;SACf;EAIP;EAEA;MAEI;KAAiB;;MAMjB;KAAiB;;EAUrB;EAEA;EAEA;EAEA;EAEA;EAEA;EAEA;EAEA;EAEA;EAEA,mBAAmB;EAEnB,YAAY;EAEZ,QAAQ;EAMR,YAAY,eAAe,SAAS,KAAK;EACzC,YAAY,SAAS;EAsCrB;EAIS,YAAY,qCAAqC;EAUjD,UAAU;EAkBnB,iBACE,sCACC;;;;YA2Ba,aACd,SAAS,uCACR,QAAQ;YAEK,aACd,SAAS,oCACR,QAAQ,cAAc;;;;YAuCR,sBACf,aACA,SAAS,wBACT,SAAS,2BACR,cAAc;EA0DX,UACJ,UAAU,eACV,oCACA,aAAa,2BACZ,QAAQ;EAuDJ,uBACL,UAAU,eACV,oCACA,cAAc,2BACb,eAAe;EA8BX,sBACL,UAAU,eACV,oCACA,aAAa,2BACZ,eAAe"}
|
|
@@ -56,7 +56,7 @@ var ChatXAIResponses = class extends BaseChatModel {
|
|
|
56
56
|
model: modelOrFields
|
|
57
57
|
} : modelOrFields ?? {};
|
|
58
58
|
super(fields);
|
|
59
|
-
this._addVersion("@langchain/xai", "1.4.
|
|
59
|
+
this._addVersion("@langchain/xai", "1.4.7");
|
|
60
60
|
const apiKey = fields?.apiKey ?? getEnvironmentVariable("XAI_API_KEY");
|
|
61
61
|
if (!apiKey) throw new Error(`xAI API key not found. Please set the XAI_API_KEY environment variable or provide the key in the "apiKey" field.`);
|
|
62
62
|
this.apiKey = apiKey;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.js","names":[],"sources":["../../src/chat_models/responses.ts"],"sourcesContent":["import { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { AIMessage, BaseMessage } from \"@langchain/core/messages\";\nimport {\n BaseChatModel,\n type LangSmithParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { Serialized } from \"@langchain/core/load/serializable\";\n\nimport type {\n ChatXAIResponsesCallOptions,\n ChatXAIResponsesInput,\n ChatXAIResponsesInvocationParams,\n XAIResponse,\n XAIResponsesCreateParams,\n XAIResponsesCreateParamsNonStreaming,\n XAIResponsesCreateParamsStreaming,\n XAIResponsesReasoning,\n XAIResponsesSearchParameters,\n XAIResponsesStreamEvent,\n XAIResponsesTool,\n} from \"./responses-types.js\";\n\nimport {\n convertMessagesToResponsesInput,\n convertResponseToAIMessage,\n convertStreamEventToChunk,\n extractTextFromOutput,\n} from \"../converters/responses.js\";\nimport { convertXAIResponsesStream } from \"../utils/responses_stream_events.js\";\n\n// Re-export types for convenience\nexport type {\n ChatXAIResponsesCallOptions,\n ChatXAIResponsesInput,\n ChatXAIResponsesInvocationParams,\n};\n\n// ============================================================================\n// Main Class\n// ============================================================================\n\n/**\n * xAI Responses API chat model integration.\n *\n * This class provides access to xAI's Responses API, which offers enhanced\n * capabilities including built-in tools, reasoning, and search.\n *\n * @example\n * ```typescript\n * import { ChatXAIResponses } from \"@langchain/xai\";\n *\n * const llm = new ChatXAIResponses({\n * model: \"grok-3\",\n * temperature: 0.7,\n * });\n *\n * const result = await llm.invoke(\"What is the capital of France?\");\n * console.log(result.content);\n * ```\n */\nexport class ChatXAIResponses<\n CallOptions extends ChatXAIResponsesCallOptions = ChatXAIResponsesCallOptions,\n> extends BaseChatModel<CallOptions> {\n static lc_name() {\n return \"ChatXAIResponses\";\n }\n\n lc_serializable = true;\n\n lc_namespace = [\"langchain\", \"chat_models\", \"xai\"];\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n apiKey: \"XAI_API_KEY\",\n };\n }\n\n get lc_aliases(): { [key: string]: string } | undefined {\n return {\n apiKey: \"xai_api_key\",\n };\n }\n\n // -------------------------------------------------------------------------\n // Instance Properties\n // -------------------------------------------------------------------------\n\n apiKey: string;\n\n model: string;\n\n streaming: boolean;\n\n temperature?: number;\n\n topP?: number;\n\n maxOutputTokens?: number;\n\n store?: boolean;\n\n user?: string;\n\n baseURL: string;\n\n searchParameters?: XAIResponsesSearchParameters;\n\n reasoning?: XAIResponsesReasoning;\n\n tools?: XAIResponsesTool[];\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(model: string, fields?: Omit<ChatXAIResponsesInput, \"model\">);\n constructor(fields?: ChatXAIResponsesInput);\n constructor(\n modelOrFields?: string | ChatXAIResponsesInput,\n fieldsArg?: Omit<ChatXAIResponsesInput, \"model\">\n ) {\n const fields =\n typeof modelOrFields === \"string\"\n ? { ...(fieldsArg ?? {}), model: modelOrFields }\n : (modelOrFields ?? {});\n super(fields);\n\n this._addVersion(\"@langchain/xai\", __PKG_VERSION__);\n\n const apiKey = fields?.apiKey ?? getEnvironmentVariable(\"XAI_API_KEY\");\n if (!apiKey) {\n throw new Error(\n `xAI API key not found. Please set the XAI_API_KEY environment variable or provide the key in the \"apiKey\" field.`\n );\n }\n\n this.apiKey = apiKey;\n this.model = fields?.model ?? \"grok-3\";\n this.streaming = fields?.streaming ?? false;\n this.temperature = fields?.temperature;\n this.topP = fields?.topP;\n this.maxOutputTokens = fields?.maxOutputTokens;\n this.store = fields?.store;\n this.user = fields?.user;\n this.baseURL = fields?.baseURL ?? \"https://api.x.ai/v1\";\n this.searchParameters = fields?.searchParameters;\n this.reasoning = fields?.reasoning;\n this.tools = fields?.tools;\n }\n\n // -------------------------------------------------------------------------\n // Metadata Methods\n // -------------------------------------------------------------------------\n\n _llmType(): string {\n return \"xai-responses\";\n }\n\n override getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = super.getLsParams(options);\n params.ls_provider = \"xai\";\n params.ls_model_name = this.model;\n params.ls_model_type = \"chat\";\n params.ls_temperature = this.temperature;\n params.ls_max_tokens = this.maxOutputTokens;\n return params;\n }\n\n override toJSON(): Serialized {\n const result = super.toJSON();\n\n if (\n \"kwargs\" in result &&\n typeof result.kwargs === \"object\" &&\n result.kwargs != null\n ) {\n delete (result.kwargs as Record<string, unknown>).apiKey;\n }\n\n return result;\n }\n\n // -------------------------------------------------------------------------\n // Invocation Params\n // -------------------------------------------------------------------------\n\n invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): ChatXAIResponsesInvocationParams {\n return {\n model: this.model,\n temperature: this.temperature,\n top_p: this.topP,\n max_output_tokens: this.maxOutputTokens,\n store: this.store,\n user: this.user,\n stream: this.streaming,\n previous_response_id: options?.previous_response_id,\n include: options?.include,\n text: options?.text,\n search_parameters: options?.search_parameters ?? this.searchParameters,\n reasoning: options?.reasoning ?? this.reasoning,\n tools: options?.tools ?? this.tools,\n tool_choice: options?.tool_choice,\n parallel_tool_calls: options?.parallel_tool_calls,\n };\n }\n\n // -------------------------------------------------------------------------\n // API Call Methods\n // -------------------------------------------------------------------------\n\n /**\n * Makes a request to the xAI Responses API.\n */\n protected async _makeRequest(\n request: XAIResponsesCreateParamsNonStreaming\n ): Promise<XAIResponse>;\n\n protected async _makeRequest(\n request: XAIResponsesCreateParamsStreaming\n ): Promise<AsyncIterable<XAIResponsesStreamEvent>>;\n\n protected async _makeRequest(\n request: XAIResponsesCreateParams\n ): Promise<XAIResponse | AsyncIterable<XAIResponsesStreamEvent>> {\n const url = `${this.baseURL}/responses`;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n };\n\n if (request.stream) {\n return this._makeStreamingRequest(url, headers, request);\n }\n\n const response = await this.caller.call(async () => {\n const res = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n throw new Error(\n `xAI API error: ${res.status} ${res.statusText} - ${errorBody}`\n );\n }\n\n return res.json();\n });\n\n return response as XAIResponse;\n }\n\n /**\n * Makes a streaming request to the xAI Responses API.\n */\n protected async *_makeStreamingRequest(\n url: string,\n headers: Record<string, string>,\n request: XAIResponsesCreateParams\n ): AsyncIterable<XAIResponsesStreamEvent> {\n const response = await this.caller.call(async () => {\n const res = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n throw new Error(\n `xAI API error: ${res.status} ${res.statusText} - ${errorBody}`\n );\n }\n\n return res;\n });\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed === \"data: [DONE]\") continue;\n\n if (trimmed.startsWith(\"data: \")) {\n try {\n const data = JSON.parse(trimmed.slice(6));\n yield data as XAIResponsesStreamEvent;\n } catch {\n // Skip invalid JSON\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n // -------------------------------------------------------------------------\n // Generation Methods\n // -------------------------------------------------------------------------\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const invocationParams = this.invocationParams(options);\n const input = convertMessagesToResponsesInput(messages);\n\n if (invocationParams.stream) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | undefined;\n\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n finalChunk = finalChunk?.concat(chunk) ?? chunk;\n }\n\n return {\n generations: finalChunk ? [finalChunk] : [],\n llmOutput: {\n estimatedTokenUsage: (finalChunk?.message as AIMessage | undefined)\n ?.usage_metadata,\n },\n };\n }\n\n const response = await this._makeRequest({\n input,\n ...invocationParams,\n stream: false,\n } as XAIResponsesCreateParamsNonStreaming);\n\n const aiMessage = convertResponseToAIMessage(response);\n const text = extractTextFromOutput(response.output);\n\n return {\n generations: [\n {\n text,\n message: aiMessage,\n },\n ],\n llmOutput: {\n id: response.id,\n estimatedTokenUsage: response.usage\n ? {\n promptTokens: response.usage.input_tokens,\n completionTokens: response.usage.output_tokens,\n totalTokens: response.usage.total_tokens,\n }\n : undefined,\n },\n };\n }\n\n async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n const invocationParams = this.invocationParams(options);\n const input = convertMessagesToResponsesInput(messages);\n\n const streamIterable = await this._makeRequest({\n input,\n ...invocationParams,\n stream: true,\n } as XAIResponsesCreateParamsStreaming);\n\n const shouldStreamUsage = options.streamUsage ?? true;\n\n const abortableStream = async function* (\n source: AsyncIterable<XAIResponsesStreamEvent>,\n signal?: AbortSignal\n ) {\n for await (const event of source) {\n if (signal?.aborted) {\n return;\n }\n yield event;\n }\n };\n\n yield* convertXAIResponsesStream(\n abortableStream(streamIterable, options.signal),\n { streamUsage: shouldStreamUsage }\n );\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const invocationParams = this.invocationParams(options);\n const input = convertMessagesToResponsesInput(messages);\n\n const streamIterable = await this._makeRequest({\n input,\n ...invocationParams,\n stream: true,\n } as XAIResponsesCreateParamsStreaming);\n\n for await (const event of streamIterable) {\n if (options.signal?.aborted) {\n return;\n }\n const chunk = convertStreamEventToChunk(event);\n if (chunk) {\n yield chunk;\n await runManager?.handleLLMNewToken(chunk.text || \"\", {\n prompt: 0,\n completion: 0,\n });\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"responses.js","names":[],"sources":["../../src/chat_models/responses.ts"],"sourcesContent":["import { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { AIMessage, BaseMessage } from \"@langchain/core/messages\";\nimport {\n BaseChatModel,\n type LangSmithParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { Serialized } from \"@langchain/core/load/serializable\";\n\nimport type {\n ChatXAIResponsesCallOptions,\n ChatXAIResponsesInput,\n ChatXAIResponsesInvocationParams,\n XAIResponse,\n XAIResponsesCreateParams,\n XAIResponsesCreateParamsNonStreaming,\n XAIResponsesCreateParamsStreaming,\n XAIResponsesReasoning,\n XAIResponsesSearchParameters,\n XAIResponsesStreamEvent,\n XAIResponsesTool,\n} from \"./responses-types.js\";\n\nimport {\n convertMessagesToResponsesInput,\n convertResponseToAIMessage,\n convertStreamEventToChunk,\n extractTextFromOutput,\n} from \"../converters/responses.js\";\nimport { convertXAIResponsesStream } from \"../utils/responses_stream_events.js\";\n\n// Re-export types for convenience\nexport type {\n ChatXAIResponsesCallOptions,\n ChatXAIResponsesInput,\n ChatXAIResponsesInvocationParams,\n};\n\n// ============================================================================\n// Main Class\n// ============================================================================\n\n/**\n * xAI Responses API chat model integration.\n *\n * This class provides access to xAI's Responses API, which offers enhanced\n * capabilities including built-in tools, reasoning, and search.\n *\n * @example\n * ```typescript\n * import { ChatXAIResponses } from \"@langchain/xai\";\n *\n * const llm = new ChatXAIResponses({\n * model: \"grok-3\",\n * temperature: 0.7,\n * });\n *\n * const result = await llm.invoke(\"What is the capital of France?\");\n * console.log(result.content);\n * ```\n */\nexport class ChatXAIResponses<\n CallOptions extends ChatXAIResponsesCallOptions = ChatXAIResponsesCallOptions,\n> extends BaseChatModel<CallOptions> {\n static lc_name() {\n return \"ChatXAIResponses\";\n }\n\n lc_serializable = true;\n\n lc_namespace = [\"langchain\", \"chat_models\", \"xai\"];\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n apiKey: \"XAI_API_KEY\",\n };\n }\n\n get lc_aliases(): { [key: string]: string } | undefined {\n return {\n apiKey: \"xai_api_key\",\n };\n }\n\n // -------------------------------------------------------------------------\n // Instance Properties\n // -------------------------------------------------------------------------\n\n apiKey: string;\n\n model: string;\n\n streaming: boolean;\n\n temperature?: number;\n\n topP?: number;\n\n maxOutputTokens?: number;\n\n store?: boolean;\n\n user?: string;\n\n baseURL: string;\n\n searchParameters?: XAIResponsesSearchParameters;\n\n reasoning?: XAIResponsesReasoning;\n\n tools?: XAIResponsesTool[];\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(model: string, fields?: Omit<ChatXAIResponsesInput, \"model\">);\n constructor(fields?: ChatXAIResponsesInput);\n constructor(\n modelOrFields?: string | ChatXAIResponsesInput,\n fieldsArg?: Omit<ChatXAIResponsesInput, \"model\">\n ) {\n const fields =\n typeof modelOrFields === \"string\"\n ? { ...(fieldsArg ?? {}), model: modelOrFields }\n : (modelOrFields ?? {});\n super(fields);\n\n this._addVersion(\"@langchain/xai\", __PKG_VERSION__);\n\n const apiKey = fields?.apiKey ?? getEnvironmentVariable(\"XAI_API_KEY\");\n if (!apiKey) {\n throw new Error(\n `xAI API key not found. Please set the XAI_API_KEY environment variable or provide the key in the \"apiKey\" field.`\n );\n }\n\n this.apiKey = apiKey;\n this.model = fields?.model ?? \"grok-3\";\n this.streaming = fields?.streaming ?? false;\n this.temperature = fields?.temperature;\n this.topP = fields?.topP;\n this.maxOutputTokens = fields?.maxOutputTokens;\n this.store = fields?.store;\n this.user = fields?.user;\n this.baseURL = fields?.baseURL ?? \"https://api.x.ai/v1\";\n this.searchParameters = fields?.searchParameters;\n this.reasoning = fields?.reasoning;\n this.tools = fields?.tools;\n }\n\n // -------------------------------------------------------------------------\n // Metadata Methods\n // -------------------------------------------------------------------------\n\n _llmType(): string {\n return \"xai-responses\";\n }\n\n override getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = super.getLsParams(options);\n params.ls_provider = \"xai\";\n params.ls_model_name = this.model;\n params.ls_model_type = \"chat\";\n params.ls_temperature = this.temperature;\n params.ls_max_tokens = this.maxOutputTokens;\n return params;\n }\n\n override toJSON(): Serialized {\n const result = super.toJSON();\n\n if (\n \"kwargs\" in result &&\n typeof result.kwargs === \"object\" &&\n result.kwargs != null\n ) {\n delete (result.kwargs as Record<string, unknown>).apiKey;\n }\n\n return result;\n }\n\n // -------------------------------------------------------------------------\n // Invocation Params\n // -------------------------------------------------------------------------\n\n invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): ChatXAIResponsesInvocationParams {\n return {\n model: this.model,\n temperature: this.temperature,\n top_p: this.topP,\n max_output_tokens: this.maxOutputTokens,\n store: this.store,\n user: this.user,\n stream: this.streaming,\n previous_response_id: options?.previous_response_id,\n include: options?.include,\n text: options?.text,\n search_parameters: options?.search_parameters ?? this.searchParameters,\n reasoning: options?.reasoning ?? this.reasoning,\n tools: options?.tools ?? this.tools,\n tool_choice: options?.tool_choice,\n parallel_tool_calls: options?.parallel_tool_calls,\n };\n }\n\n // -------------------------------------------------------------------------\n // API Call Methods\n // -------------------------------------------------------------------------\n\n /**\n * Makes a request to the xAI Responses API.\n */\n protected async _makeRequest(\n request: XAIResponsesCreateParamsNonStreaming\n ): Promise<XAIResponse>;\n\n protected async _makeRequest(\n request: XAIResponsesCreateParamsStreaming\n ): Promise<AsyncIterable<XAIResponsesStreamEvent>>;\n\n protected async _makeRequest(\n request: XAIResponsesCreateParams\n ): Promise<XAIResponse | AsyncIterable<XAIResponsesStreamEvent>> {\n const url = `${this.baseURL}/responses`;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n };\n\n if (request.stream) {\n return this._makeStreamingRequest(url, headers, request);\n }\n\n const response = await this.caller.call(async () => {\n const res = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n throw new Error(\n `xAI API error: ${res.status} ${res.statusText} - ${errorBody}`\n );\n }\n\n return res.json();\n });\n\n return response as XAIResponse;\n }\n\n /**\n * Makes a streaming request to the xAI Responses API.\n */\n protected async *_makeStreamingRequest(\n url: string,\n headers: Record<string, string>,\n request: XAIResponsesCreateParams\n ): AsyncIterable<XAIResponsesStreamEvent> {\n const response = await this.caller.call(async () => {\n const res = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n throw new Error(\n `xAI API error: ${res.status} ${res.statusText} - ${errorBody}`\n );\n }\n\n return res;\n });\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed === \"data: [DONE]\") continue;\n\n if (trimmed.startsWith(\"data: \")) {\n try {\n const data = JSON.parse(trimmed.slice(6));\n yield data as XAIResponsesStreamEvent;\n } catch {\n // Skip invalid JSON\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n // -------------------------------------------------------------------------\n // Generation Methods\n // -------------------------------------------------------------------------\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const invocationParams = this.invocationParams(options);\n const input = convertMessagesToResponsesInput(messages);\n\n if (invocationParams.stream) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | undefined;\n\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n finalChunk = finalChunk?.concat(chunk) ?? chunk;\n }\n\n return {\n generations: finalChunk ? [finalChunk] : [],\n llmOutput: {\n estimatedTokenUsage: (finalChunk?.message as AIMessage | undefined)\n ?.usage_metadata,\n },\n };\n }\n\n const response = await this._makeRequest({\n input,\n ...invocationParams,\n stream: false,\n } as XAIResponsesCreateParamsNonStreaming);\n\n const aiMessage = convertResponseToAIMessage(response);\n const text = extractTextFromOutput(response.output);\n\n return {\n generations: [\n {\n text,\n message: aiMessage,\n },\n ],\n llmOutput: {\n id: response.id,\n estimatedTokenUsage: response.usage\n ? {\n promptTokens: response.usage.input_tokens,\n completionTokens: response.usage.output_tokens,\n totalTokens: response.usage.total_tokens,\n }\n : undefined,\n },\n };\n }\n\n async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n const invocationParams = this.invocationParams(options);\n const input = convertMessagesToResponsesInput(messages);\n\n const streamIterable = await this._makeRequest({\n input,\n ...invocationParams,\n stream: true,\n } as XAIResponsesCreateParamsStreaming);\n\n const shouldStreamUsage = options.streamUsage ?? true;\n\n const abortableStream = async function* (\n source: AsyncIterable<XAIResponsesStreamEvent>,\n signal?: AbortSignal\n ) {\n for await (const event of source) {\n if (signal?.aborted) {\n return;\n }\n yield event;\n }\n };\n\n yield* convertXAIResponsesStream(\n abortableStream(streamIterable, options.signal),\n { streamUsage: shouldStreamUsage }\n );\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const invocationParams = this.invocationParams(options);\n const input = convertMessagesToResponsesInput(messages);\n\n const streamIterable = await this._makeRequest({\n input,\n ...invocationParams,\n stream: true,\n } as XAIResponsesCreateParamsStreaming);\n\n for await (const event of streamIterable) {\n if (options.signal?.aborted) {\n return;\n }\n const chunk = convertStreamEventToChunk(event);\n if (chunk) {\n yield chunk;\n await runManager?.handleLLMNewToken(chunk.text || \"\", {\n prompt: 0,\n completion: 0,\n });\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -154,9 +154,11 @@ function convertStreamEventToChunk(event) {
|
|
|
154
154
|
return null;
|
|
155
155
|
}
|
|
156
156
|
//#endregion
|
|
157
|
+
exports.convertMessageToResponsesInput = convertMessageToResponsesInput;
|
|
157
158
|
exports.convertMessagesToResponsesInput = convertMessagesToResponsesInput;
|
|
158
159
|
exports.convertResponseToAIMessage = convertResponseToAIMessage;
|
|
159
160
|
exports.convertStreamEventToChunk = convertStreamEventToChunk;
|
|
161
|
+
exports.convertUsageToUsageMetadata = convertUsageToUsageMetadata;
|
|
160
162
|
exports.extractTextFromOutput = extractTextFromOutput;
|
|
161
163
|
|
|
162
164
|
//# sourceMappingURL=responses.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.cjs","names":["AIMessage","ChatGenerationChunk","AIMessageChunk"],"sources":["../../src/converters/responses.ts"],"sourcesContent":["import {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n type UsageMetadata,\n} from \"@langchain/core/messages\";\nimport { ChatGenerationChunk } from \"@langchain/core/outputs\";\n\nimport type {\n XAIResponse,\n XAIResponsesInputItem,\n XAIResponsesMessage,\n XAIResponsesOutputContent,\n XAIResponsesOutputItem,\n XAIResponsesStreamEvent,\n XAIResponsesUsage,\n} from \"../chat_models/responses-types.js\";\n\n// ============================================================================\n// Message Converters\n// ============================================================================\n\n/**\n * Converts a single LangChain BaseMessage to xAI Responses API input format.\n *\n * @param message - The LangChain message to convert\n * @returns The xAI Responses API input item\n */\nexport function convertMessageToResponsesInput(\n message: BaseMessage\n): XAIResponsesInputItem {\n if (message.type === \"human\") {\n const content =\n typeof message.content === \"string\"\n ? message.content\n : message.content.map((part) => {\n if (typeof part === \"string\") {\n return { type: \"input_text\" as const, text: part };\n }\n if (part.type === \"text\") {\n return { type: \"input_text\" as const, text: part.text };\n }\n if (part.type === \"image_url\") {\n const imageUrlPart = part as {\n type: \"image_url\";\n image_url: string | { url: string };\n };\n const imageUrl =\n typeof imageUrlPart.image_url === \"string\"\n ? imageUrlPart.image_url\n : imageUrlPart.image_url.url;\n return {\n type: \"input_image\" as const,\n image_url: imageUrl,\n detail: \"auto\" as const,\n };\n }\n return { type: \"input_text\" as const, text: \"\" };\n });\n\n return {\n role: \"user\",\n content,\n } as XAIResponsesMessage;\n }\n\n if (message.type === \"system\") {\n return {\n role: \"system\",\n content:\n typeof message.content === \"string\"\n ? message.content\n : message.content\n .map((part) =>\n typeof part === \"string\" ? part : part.text || \"\"\n )\n .join(\"\"),\n } as XAIResponsesMessage;\n }\n\n if (message.type === \"ai\") {\n const aiMessage = message as AIMessage;\n return {\n type: \"message\",\n role: \"assistant\",\n text: typeof aiMessage.content === \"string\" ? aiMessage.content : \"\",\n } as unknown as XAIResponsesInputItem;\n }\n\n // Default fallback\n return {\n role: \"user\",\n content:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n } as XAIResponsesMessage;\n}\n\n/**\n * Converts an array of LangChain BaseMessages to xAI Responses API input format.\n *\n * @param messages - Array of LangChain messages to convert\n * @returns Array of xAI Responses API input items\n */\nexport function convertMessagesToResponsesInput(\n messages: BaseMessage[]\n): XAIResponsesInputItem[] {\n return messages.map(convertMessageToResponsesInput);\n}\n\n// ============================================================================\n// Usage Converters\n// ============================================================================\n\n/**\n * Converts xAI usage statistics to LangChain UsageMetadata format.\n *\n * @param usage - The xAI usage statistics\n * @returns LangChain UsageMetadata object\n */\nexport function convertUsageToUsageMetadata(\n usage: XAIResponsesUsage | null | undefined\n): UsageMetadata {\n return {\n input_tokens: usage?.input_tokens ?? 0,\n output_tokens: usage?.output_tokens ?? 0,\n total_tokens: usage?.total_tokens ?? 0,\n input_token_details: {\n ...(usage?.input_tokens_details?.cached_tokens != null && {\n cache_read: usage.input_tokens_details.cached_tokens,\n }),\n },\n output_token_details: {\n ...(usage?.output_tokens_details?.reasoning_tokens != null && {\n reasoning: usage.output_tokens_details.reasoning_tokens,\n }),\n },\n };\n}\n\n// ============================================================================\n// Output Converters\n// ============================================================================\n\n/**\n * Extracts text content from xAI response output items.\n *\n * @param output - Array of xAI response output items\n * @returns Concatenated text content\n */\nexport function extractTextFromOutput(\n output: XAIResponsesOutputItem[]\n): string {\n const textParts: string[] = [];\n\n for (const item of output) {\n if (item.type === \"message\" && \"content\" in item) {\n for (const contentItem of item.content as XAIResponsesOutputContent[]) {\n if (contentItem.type === \"output_text\") {\n textParts.push(contentItem.text);\n }\n }\n }\n }\n\n return textParts.join(\"\");\n}\n\n/**\n * Converts an xAI Response to a LangChain AIMessage.\n *\n * @param response - The xAI API response\n * @returns LangChain AIMessage\n */\nexport function convertResponseToAIMessage(response: XAIResponse): AIMessage {\n const text = extractTextFromOutput(response.output);\n\n const responseMetadata: Record<string, unknown> = {\n model_provider: \"xai\",\n model: response.model,\n created_at: response.created_at,\n id: response.id,\n status: response.status,\n object: response.object,\n };\n\n if (response.incomplete_details) {\n responseMetadata.incomplete_details = response.incomplete_details;\n }\n\n return new AIMessage({\n content: text,\n usage_metadata: convertUsageToUsageMetadata(response.usage),\n response_metadata: responseMetadata,\n additional_kwargs: {\n ...(response.reasoning && { reasoning: response.reasoning }),\n },\n });\n}\n\n// ============================================================================\n// Streaming Converters\n// ============================================================================\n\n/**\n * Converts an xAI streaming event to a LangChain ChatGenerationChunk.\n *\n * @param event - The xAI streaming event\n * @returns ChatGenerationChunk or null if the event doesn't produce a chunk\n */\nexport function convertStreamEventToChunk(\n event: XAIResponsesStreamEvent\n): ChatGenerationChunk | null {\n const responseMetadata: Record<string, unknown> = {\n model_provider: \"xai\",\n };\n\n if (event.type === \"response.output_text.delta\") {\n return new ChatGenerationChunk({\n text: event.delta,\n message: new AIMessageChunk({\n content: event.delta,\n response_metadata: responseMetadata,\n }),\n });\n }\n\n if (event.type === \"response.created\") {\n responseMetadata.id = event.response.id;\n responseMetadata.model = event.response.model;\n return new ChatGenerationChunk({\n text: \"\",\n message: new AIMessageChunk({\n content: \"\",\n response_metadata: responseMetadata,\n }),\n });\n }\n\n if (event.type === \"response.completed\") {\n const aiMessage = convertResponseToAIMessage(event.response);\n return new ChatGenerationChunk({\n text: \"\",\n message: new AIMessageChunk({\n content: \"\",\n usage_metadata: aiMessage.usage_metadata,\n response_metadata: {\n ...responseMetadata,\n ...aiMessage.response_metadata,\n },\n }),\n });\n }\n\n return null;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"responses.cjs","names":["AIMessage","ChatGenerationChunk","AIMessageChunk"],"sources":["../../src/converters/responses.ts"],"sourcesContent":["import {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n type UsageMetadata,\n} from \"@langchain/core/messages\";\nimport { ChatGenerationChunk } from \"@langchain/core/outputs\";\n\nimport type {\n XAIResponse,\n XAIResponsesInputItem,\n XAIResponsesMessage,\n XAIResponsesOutputContent,\n XAIResponsesOutputItem,\n XAIResponsesStreamEvent,\n XAIResponsesUsage,\n} from \"../chat_models/responses-types.js\";\n\n// ============================================================================\n// Message Converters\n// ============================================================================\n\n/**\n * Converts a single LangChain BaseMessage to xAI Responses API input format.\n *\n * @param message - The LangChain message to convert\n * @returns The xAI Responses API input item\n */\nexport function convertMessageToResponsesInput(\n message: BaseMessage\n): XAIResponsesInputItem {\n if (message.type === \"human\") {\n const content =\n typeof message.content === \"string\"\n ? message.content\n : message.content.map((part) => {\n if (typeof part === \"string\") {\n return { type: \"input_text\" as const, text: part };\n }\n if (part.type === \"text\") {\n return { type: \"input_text\" as const, text: part.text };\n }\n if (part.type === \"image_url\") {\n const imageUrlPart = part as {\n type: \"image_url\";\n image_url: string | { url: string };\n };\n const imageUrl =\n typeof imageUrlPart.image_url === \"string\"\n ? imageUrlPart.image_url\n : imageUrlPart.image_url.url;\n return {\n type: \"input_image\" as const,\n image_url: imageUrl,\n detail: \"auto\" as const,\n };\n }\n return { type: \"input_text\" as const, text: \"\" };\n });\n\n return {\n role: \"user\",\n content,\n } as XAIResponsesMessage;\n }\n\n if (message.type === \"system\") {\n return {\n role: \"system\",\n content:\n typeof message.content === \"string\"\n ? message.content\n : message.content\n .map((part) =>\n typeof part === \"string\" ? part : part.text || \"\"\n )\n .join(\"\"),\n } as XAIResponsesMessage;\n }\n\n if (message.type === \"ai\") {\n const aiMessage = message as AIMessage;\n return {\n type: \"message\",\n role: \"assistant\",\n text: typeof aiMessage.content === \"string\" ? aiMessage.content : \"\",\n } as unknown as XAIResponsesInputItem;\n }\n\n // Default fallback\n return {\n role: \"user\",\n content:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n } as XAIResponsesMessage;\n}\n\n/**\n * Converts an array of LangChain BaseMessages to xAI Responses API input format.\n *\n * @param messages - Array of LangChain messages to convert\n * @returns Array of xAI Responses API input items\n */\nexport function convertMessagesToResponsesInput(\n messages: BaseMessage[]\n): XAIResponsesInputItem[] {\n return messages.map(convertMessageToResponsesInput);\n}\n\n// ============================================================================\n// Usage Converters\n// ============================================================================\n\n/**\n * Converts xAI usage statistics to LangChain UsageMetadata format.\n *\n * @param usage - The xAI usage statistics\n * @returns LangChain UsageMetadata object\n */\nexport function convertUsageToUsageMetadata(\n usage: XAIResponsesUsage | null | undefined\n): UsageMetadata {\n return {\n input_tokens: usage?.input_tokens ?? 0,\n output_tokens: usage?.output_tokens ?? 0,\n total_tokens: usage?.total_tokens ?? 0,\n input_token_details: {\n ...(usage?.input_tokens_details?.cached_tokens != null && {\n cache_read: usage.input_tokens_details.cached_tokens,\n }),\n },\n output_token_details: {\n ...(usage?.output_tokens_details?.reasoning_tokens != null && {\n reasoning: usage.output_tokens_details.reasoning_tokens,\n }),\n },\n };\n}\n\n// ============================================================================\n// Output Converters\n// ============================================================================\n\n/**\n * Extracts text content from xAI response output items.\n *\n * @param output - Array of xAI response output items\n * @returns Concatenated text content\n */\nexport function extractTextFromOutput(\n output: XAIResponsesOutputItem[]\n): string {\n const textParts: string[] = [];\n\n for (const item of output) {\n if (item.type === \"message\" && \"content\" in item) {\n for (const contentItem of item.content as XAIResponsesOutputContent[]) {\n if (contentItem.type === \"output_text\") {\n textParts.push(contentItem.text);\n }\n }\n }\n }\n\n return textParts.join(\"\");\n}\n\n/**\n * Converts an xAI Response to a LangChain AIMessage.\n *\n * @param response - The xAI API response\n * @returns LangChain AIMessage\n */\nexport function convertResponseToAIMessage(response: XAIResponse): AIMessage {\n const text = extractTextFromOutput(response.output);\n\n const responseMetadata: Record<string, unknown> = {\n model_provider: \"xai\",\n model: response.model,\n created_at: response.created_at,\n id: response.id,\n status: response.status,\n object: response.object,\n };\n\n if (response.incomplete_details) {\n responseMetadata.incomplete_details = response.incomplete_details;\n }\n\n return new AIMessage({\n content: text,\n usage_metadata: convertUsageToUsageMetadata(response.usage),\n response_metadata: responseMetadata,\n additional_kwargs: {\n ...(response.reasoning && { reasoning: response.reasoning }),\n },\n });\n}\n\n// ============================================================================\n// Streaming Converters\n// ============================================================================\n\n/**\n * Converts an xAI streaming event to a LangChain ChatGenerationChunk.\n *\n * @param event - The xAI streaming event\n * @returns ChatGenerationChunk or null if the event doesn't produce a chunk\n */\nexport function convertStreamEventToChunk(\n event: XAIResponsesStreamEvent\n): ChatGenerationChunk | null {\n const responseMetadata: Record<string, unknown> = {\n model_provider: \"xai\",\n };\n\n if (event.type === \"response.output_text.delta\") {\n return new ChatGenerationChunk({\n text: event.delta,\n message: new AIMessageChunk({\n content: event.delta,\n response_metadata: responseMetadata,\n }),\n });\n }\n\n if (event.type === \"response.created\") {\n responseMetadata.id = event.response.id;\n responseMetadata.model = event.response.model;\n return new ChatGenerationChunk({\n text: \"\",\n message: new AIMessageChunk({\n content: \"\",\n response_metadata: responseMetadata,\n }),\n });\n }\n\n if (event.type === \"response.completed\") {\n const aiMessage = convertResponseToAIMessage(event.response);\n return new ChatGenerationChunk({\n text: \"\",\n message: new AIMessageChunk({\n content: \"\",\n usage_metadata: aiMessage.usage_metadata,\n response_metadata: {\n ...responseMetadata,\n ...aiMessage.response_metadata,\n },\n }),\n });\n }\n\n return null;\n}\n"],"mappings":"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"}
|
|
@@ -154,6 +154,6 @@ function convertStreamEventToChunk(event) {
|
|
|
154
154
|
return null;
|
|
155
155
|
}
|
|
156
156
|
//#endregion
|
|
157
|
-
export { convertMessagesToResponsesInput, convertResponseToAIMessage, convertStreamEventToChunk, extractTextFromOutput };
|
|
157
|
+
export { convertMessageToResponsesInput, convertMessagesToResponsesInput, convertResponseToAIMessage, convertStreamEventToChunk, convertUsageToUsageMetadata, extractTextFromOutput };
|
|
158
158
|
|
|
159
159
|
//# sourceMappingURL=responses.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.js","names":[],"sources":["../../src/converters/responses.ts"],"sourcesContent":["import {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n type UsageMetadata,\n} from \"@langchain/core/messages\";\nimport { ChatGenerationChunk } from \"@langchain/core/outputs\";\n\nimport type {\n XAIResponse,\n XAIResponsesInputItem,\n XAIResponsesMessage,\n XAIResponsesOutputContent,\n XAIResponsesOutputItem,\n XAIResponsesStreamEvent,\n XAIResponsesUsage,\n} from \"../chat_models/responses-types.js\";\n\n// ============================================================================\n// Message Converters\n// ============================================================================\n\n/**\n * Converts a single LangChain BaseMessage to xAI Responses API input format.\n *\n * @param message - The LangChain message to convert\n * @returns The xAI Responses API input item\n */\nexport function convertMessageToResponsesInput(\n message: BaseMessage\n): XAIResponsesInputItem {\n if (message.type === \"human\") {\n const content =\n typeof message.content === \"string\"\n ? message.content\n : message.content.map((part) => {\n if (typeof part === \"string\") {\n return { type: \"input_text\" as const, text: part };\n }\n if (part.type === \"text\") {\n return { type: \"input_text\" as const, text: part.text };\n }\n if (part.type === \"image_url\") {\n const imageUrlPart = part as {\n type: \"image_url\";\n image_url: string | { url: string };\n };\n const imageUrl =\n typeof imageUrlPart.image_url === \"string\"\n ? imageUrlPart.image_url\n : imageUrlPart.image_url.url;\n return {\n type: \"input_image\" as const,\n image_url: imageUrl,\n detail: \"auto\" as const,\n };\n }\n return { type: \"input_text\" as const, text: \"\" };\n });\n\n return {\n role: \"user\",\n content,\n } as XAIResponsesMessage;\n }\n\n if (message.type === \"system\") {\n return {\n role: \"system\",\n content:\n typeof message.content === \"string\"\n ? message.content\n : message.content\n .map((part) =>\n typeof part === \"string\" ? part : part.text || \"\"\n )\n .join(\"\"),\n } as XAIResponsesMessage;\n }\n\n if (message.type === \"ai\") {\n const aiMessage = message as AIMessage;\n return {\n type: \"message\",\n role: \"assistant\",\n text: typeof aiMessage.content === \"string\" ? aiMessage.content : \"\",\n } as unknown as XAIResponsesInputItem;\n }\n\n // Default fallback\n return {\n role: \"user\",\n content:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n } as XAIResponsesMessage;\n}\n\n/**\n * Converts an array of LangChain BaseMessages to xAI Responses API input format.\n *\n * @param messages - Array of LangChain messages to convert\n * @returns Array of xAI Responses API input items\n */\nexport function convertMessagesToResponsesInput(\n messages: BaseMessage[]\n): XAIResponsesInputItem[] {\n return messages.map(convertMessageToResponsesInput);\n}\n\n// ============================================================================\n// Usage Converters\n// ============================================================================\n\n/**\n * Converts xAI usage statistics to LangChain UsageMetadata format.\n *\n * @param usage - The xAI usage statistics\n * @returns LangChain UsageMetadata object\n */\nexport function convertUsageToUsageMetadata(\n usage: XAIResponsesUsage | null | undefined\n): UsageMetadata {\n return {\n input_tokens: usage?.input_tokens ?? 0,\n output_tokens: usage?.output_tokens ?? 0,\n total_tokens: usage?.total_tokens ?? 0,\n input_token_details: {\n ...(usage?.input_tokens_details?.cached_tokens != null && {\n cache_read: usage.input_tokens_details.cached_tokens,\n }),\n },\n output_token_details: {\n ...(usage?.output_tokens_details?.reasoning_tokens != null && {\n reasoning: usage.output_tokens_details.reasoning_tokens,\n }),\n },\n };\n}\n\n// ============================================================================\n// Output Converters\n// ============================================================================\n\n/**\n * Extracts text content from xAI response output items.\n *\n * @param output - Array of xAI response output items\n * @returns Concatenated text content\n */\nexport function extractTextFromOutput(\n output: XAIResponsesOutputItem[]\n): string {\n const textParts: string[] = [];\n\n for (const item of output) {\n if (item.type === \"message\" && \"content\" in item) {\n for (const contentItem of item.content as XAIResponsesOutputContent[]) {\n if (contentItem.type === \"output_text\") {\n textParts.push(contentItem.text);\n }\n }\n }\n }\n\n return textParts.join(\"\");\n}\n\n/**\n * Converts an xAI Response to a LangChain AIMessage.\n *\n * @param response - The xAI API response\n * @returns LangChain AIMessage\n */\nexport function convertResponseToAIMessage(response: XAIResponse): AIMessage {\n const text = extractTextFromOutput(response.output);\n\n const responseMetadata: Record<string, unknown> = {\n model_provider: \"xai\",\n model: response.model,\n created_at: response.created_at,\n id: response.id,\n status: response.status,\n object: response.object,\n };\n\n if (response.incomplete_details) {\n responseMetadata.incomplete_details = response.incomplete_details;\n }\n\n return new AIMessage({\n content: text,\n usage_metadata: convertUsageToUsageMetadata(response.usage),\n response_metadata: responseMetadata,\n additional_kwargs: {\n ...(response.reasoning && { reasoning: response.reasoning }),\n },\n });\n}\n\n// ============================================================================\n// Streaming Converters\n// ============================================================================\n\n/**\n * Converts an xAI streaming event to a LangChain ChatGenerationChunk.\n *\n * @param event - The xAI streaming event\n * @returns ChatGenerationChunk or null if the event doesn't produce a chunk\n */\nexport function convertStreamEventToChunk(\n event: XAIResponsesStreamEvent\n): ChatGenerationChunk | null {\n const responseMetadata: Record<string, unknown> = {\n model_provider: \"xai\",\n };\n\n if (event.type === \"response.output_text.delta\") {\n return new ChatGenerationChunk({\n text: event.delta,\n message: new AIMessageChunk({\n content: event.delta,\n response_metadata: responseMetadata,\n }),\n });\n }\n\n if (event.type === \"response.created\") {\n responseMetadata.id = event.response.id;\n responseMetadata.model = event.response.model;\n return new ChatGenerationChunk({\n text: \"\",\n message: new AIMessageChunk({\n content: \"\",\n response_metadata: responseMetadata,\n }),\n });\n }\n\n if (event.type === \"response.completed\") {\n const aiMessage = convertResponseToAIMessage(event.response);\n return new ChatGenerationChunk({\n text: \"\",\n message: new AIMessageChunk({\n content: \"\",\n usage_metadata: aiMessage.usage_metadata,\n response_metadata: {\n ...responseMetadata,\n ...aiMessage.response_metadata,\n },\n }),\n });\n }\n\n return null;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"responses.js","names":[],"sources":["../../src/converters/responses.ts"],"sourcesContent":["import {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n type UsageMetadata,\n} from \"@langchain/core/messages\";\nimport { ChatGenerationChunk } from \"@langchain/core/outputs\";\n\nimport type {\n XAIResponse,\n XAIResponsesInputItem,\n XAIResponsesMessage,\n XAIResponsesOutputContent,\n XAIResponsesOutputItem,\n XAIResponsesStreamEvent,\n XAIResponsesUsage,\n} from \"../chat_models/responses-types.js\";\n\n// ============================================================================\n// Message Converters\n// ============================================================================\n\n/**\n * Converts a single LangChain BaseMessage to xAI Responses API input format.\n *\n * @param message - The LangChain message to convert\n * @returns The xAI Responses API input item\n */\nexport function convertMessageToResponsesInput(\n message: BaseMessage\n): XAIResponsesInputItem {\n if (message.type === \"human\") {\n const content =\n typeof message.content === \"string\"\n ? message.content\n : message.content.map((part) => {\n if (typeof part === \"string\") {\n return { type: \"input_text\" as const, text: part };\n }\n if (part.type === \"text\") {\n return { type: \"input_text\" as const, text: part.text };\n }\n if (part.type === \"image_url\") {\n const imageUrlPart = part as {\n type: \"image_url\";\n image_url: string | { url: string };\n };\n const imageUrl =\n typeof imageUrlPart.image_url === \"string\"\n ? imageUrlPart.image_url\n : imageUrlPart.image_url.url;\n return {\n type: \"input_image\" as const,\n image_url: imageUrl,\n detail: \"auto\" as const,\n };\n }\n return { type: \"input_text\" as const, text: \"\" };\n });\n\n return {\n role: \"user\",\n content,\n } as XAIResponsesMessage;\n }\n\n if (message.type === \"system\") {\n return {\n role: \"system\",\n content:\n typeof message.content === \"string\"\n ? message.content\n : message.content\n .map((part) =>\n typeof part === \"string\" ? part : part.text || \"\"\n )\n .join(\"\"),\n } as XAIResponsesMessage;\n }\n\n if (message.type === \"ai\") {\n const aiMessage = message as AIMessage;\n return {\n type: \"message\",\n role: \"assistant\",\n text: typeof aiMessage.content === \"string\" ? aiMessage.content : \"\",\n } as unknown as XAIResponsesInputItem;\n }\n\n // Default fallback\n return {\n role: \"user\",\n content:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n } as XAIResponsesMessage;\n}\n\n/**\n * Converts an array of LangChain BaseMessages to xAI Responses API input format.\n *\n * @param messages - Array of LangChain messages to convert\n * @returns Array of xAI Responses API input items\n */\nexport function convertMessagesToResponsesInput(\n messages: BaseMessage[]\n): XAIResponsesInputItem[] {\n return messages.map(convertMessageToResponsesInput);\n}\n\n// ============================================================================\n// Usage Converters\n// ============================================================================\n\n/**\n * Converts xAI usage statistics to LangChain UsageMetadata format.\n *\n * @param usage - The xAI usage statistics\n * @returns LangChain UsageMetadata object\n */\nexport function convertUsageToUsageMetadata(\n usage: XAIResponsesUsage | null | undefined\n): UsageMetadata {\n return {\n input_tokens: usage?.input_tokens ?? 0,\n output_tokens: usage?.output_tokens ?? 0,\n total_tokens: usage?.total_tokens ?? 0,\n input_token_details: {\n ...(usage?.input_tokens_details?.cached_tokens != null && {\n cache_read: usage.input_tokens_details.cached_tokens,\n }),\n },\n output_token_details: {\n ...(usage?.output_tokens_details?.reasoning_tokens != null && {\n reasoning: usage.output_tokens_details.reasoning_tokens,\n }),\n },\n };\n}\n\n// ============================================================================\n// Output Converters\n// ============================================================================\n\n/**\n * Extracts text content from xAI response output items.\n *\n * @param output - Array of xAI response output items\n * @returns Concatenated text content\n */\nexport function extractTextFromOutput(\n output: XAIResponsesOutputItem[]\n): string {\n const textParts: string[] = [];\n\n for (const item of output) {\n if (item.type === \"message\" && \"content\" in item) {\n for (const contentItem of item.content as XAIResponsesOutputContent[]) {\n if (contentItem.type === \"output_text\") {\n textParts.push(contentItem.text);\n }\n }\n }\n }\n\n return textParts.join(\"\");\n}\n\n/**\n * Converts an xAI Response to a LangChain AIMessage.\n *\n * @param response - The xAI API response\n * @returns LangChain AIMessage\n */\nexport function convertResponseToAIMessage(response: XAIResponse): AIMessage {\n const text = extractTextFromOutput(response.output);\n\n const responseMetadata: Record<string, unknown> = {\n model_provider: \"xai\",\n model: response.model,\n created_at: response.created_at,\n id: response.id,\n status: response.status,\n object: response.object,\n };\n\n if (response.incomplete_details) {\n responseMetadata.incomplete_details = response.incomplete_details;\n }\n\n return new AIMessage({\n content: text,\n usage_metadata: convertUsageToUsageMetadata(response.usage),\n response_metadata: responseMetadata,\n additional_kwargs: {\n ...(response.reasoning && { reasoning: response.reasoning }),\n },\n });\n}\n\n// ============================================================================\n// Streaming Converters\n// ============================================================================\n\n/**\n * Converts an xAI streaming event to a LangChain ChatGenerationChunk.\n *\n * @param event - The xAI streaming event\n * @returns ChatGenerationChunk or null if the event doesn't produce a chunk\n */\nexport function convertStreamEventToChunk(\n event: XAIResponsesStreamEvent\n): ChatGenerationChunk | null {\n const responseMetadata: Record<string, unknown> = {\n model_provider: \"xai\",\n };\n\n if (event.type === \"response.output_text.delta\") {\n return new ChatGenerationChunk({\n text: event.delta,\n message: new AIMessageChunk({\n content: event.delta,\n response_metadata: responseMetadata,\n }),\n });\n }\n\n if (event.type === \"response.created\") {\n responseMetadata.id = event.response.id;\n responseMetadata.model = event.response.model;\n return new ChatGenerationChunk({\n text: \"\",\n message: new AIMessageChunk({\n content: \"\",\n response_metadata: responseMetadata,\n }),\n });\n }\n\n if (event.type === \"response.completed\") {\n const aiMessage = convertResponseToAIMessage(event.response);\n return new ChatGenerationChunk({\n text: \"\",\n message: new AIMessageChunk({\n content: \"\",\n usage_metadata: aiMessage.usage_metadata,\n response_metadata: {\n ...responseMetadata,\n ...aiMessage.response_metadata,\n },\n }),\n });\n }\n\n return null;\n}\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ChatXAI, ChatXAICallOptions, ChatXAICompletionsInvocationParams, ChatXAIInput, OpenAIToolChoice, XAIAdditionalKwargs, XAIBuiltInTool, XAIResponseMetadata, isXAIBuiltInTool } from "./chat_models/completions.cjs";
|
|
2
2
|
import { ChatXAIResponsesCallOptions, ChatXAIResponsesInput, ChatXAIResponsesInvocationParams, XAIResponse, XAIResponsesAnnotation, XAIResponsesCodeInterpreterResult, XAIResponsesCodeInterpreterTool, XAIResponsesCodeInterpreterToolCall, XAIResponsesCreateParams, XAIResponsesCreateParamsNonStreaming, XAIResponsesCreateParamsStreaming, XAIResponsesDebugOutput, XAIResponsesFileCitationAnnotation, XAIResponsesFileSearchResult, XAIResponsesFileSearchTool, XAIResponsesFunctionTool, XAIResponsesFunctionToolCall, XAIResponsesFunctionToolFunction, XAIResponsesFunctionToolOutput, XAIResponsesInclude, XAIResponsesIncompleteDetails, XAIResponsesIncompleteReason, XAIResponsesInput, XAIResponsesInputContentItem, XAIResponsesInputFileItem, XAIResponsesInputImageItem, XAIResponsesInputItem, XAIResponsesInputTextItem, XAIResponsesLogprobContent, XAIResponsesLogprobToken, XAIResponsesLogprobs, XAIResponsesMcpTool, XAIResponsesMcpToolCall, XAIResponsesMessage, XAIResponsesMessageRole, XAIResponsesObjectType, XAIResponsesOutputCodeInterpreterCall, XAIResponsesOutputContent, XAIResponsesOutputFileSearchCall, XAIResponsesOutputFunctionCall, XAIResponsesOutputItem, XAIResponsesOutputMcpCall, XAIResponsesOutputReasoning, XAIResponsesOutputRefusalContent, XAIResponsesOutputTextContent, XAIResponsesOutputTextItem, XAIResponsesOutputWebSearchCall, XAIResponsesPreviousResponse, XAIResponsesReasoning, XAIResponsesReasoningEffort, XAIResponsesReasoningResponse, XAIResponsesReasoningSummary, XAIResponsesReasoningSummaryItem, XAIResponsesSearchMode, XAIResponsesSearchParameters, XAIResponsesSearchSource, XAIResponsesSearchSourceRss, XAIResponsesSearchSourceWeb, XAIResponsesSearchSourceX, XAIResponsesStatus, XAIResponsesStreamEvent, XAIResponsesStreamEventBase, XAIResponsesStreamEventCompleted, XAIResponsesStreamEventContentPartAdded, XAIResponsesStreamEventContentPartDone, XAIResponsesStreamEventCreated, XAIResponsesStreamEventError, XAIResponsesStreamEventFailed, XAIResponsesStreamEventFunctionCallArgumentsDelta, XAIResponsesStreamEventFunctionCallArgumentsDone, XAIResponsesStreamEventInProgress, XAIResponsesStreamEventIncomplete, XAIResponsesStreamEventOutputItemAdded, XAIResponsesStreamEventOutputItemDone, XAIResponsesStreamEventReasoningSummaryTextDelta, XAIResponsesStreamEventReasoningSummaryTextDone, XAIResponsesStreamEventTextDelta, XAIResponsesStreamEventTextDone, XAIResponsesText, XAIResponsesTextFormat, XAIResponsesTextFormatJsonObject, XAIResponsesTextFormatJsonSchema, XAIResponsesTextFormatText, XAIResponsesTool, XAIResponsesToolCall, XAIResponsesToolChoice, XAIResponsesToolChoiceFunction, XAIResponsesToolChoiceString, XAIResponsesToolOutput, XAIResponsesUrlCitationAnnotation, XAIResponsesUsage, XAIResponsesWebSearchTool, XAIResponsesWebSearchToolCall, XAIResponsesXSearchTool } from "./chat_models/responses-types.cjs";
|
|
3
3
|
import { ChatXAIResponses } from "./chat_models/responses.cjs";
|
|
4
|
+
import "./chat_models/index.cjs";
|
|
4
5
|
import { tools } from "./tools/index.cjs";
|
|
5
6
|
export { ChatXAI, ChatXAICallOptions, ChatXAICompletionsInvocationParams, ChatXAIInput, ChatXAIResponses, ChatXAIResponsesCallOptions, ChatXAIResponsesInput, ChatXAIResponsesInvocationParams, OpenAIToolChoice, XAIAdditionalKwargs, XAIBuiltInTool, XAIResponse, XAIResponseMetadata, XAIResponsesAnnotation, XAIResponsesCodeInterpreterResult, XAIResponsesCodeInterpreterTool, XAIResponsesCodeInterpreterToolCall, XAIResponsesCreateParams, XAIResponsesCreateParamsNonStreaming, XAIResponsesCreateParamsStreaming, XAIResponsesDebugOutput, XAIResponsesFileCitationAnnotation, XAIResponsesFileSearchResult, XAIResponsesFileSearchTool, XAIResponsesFunctionTool, XAIResponsesFunctionToolCall, XAIResponsesFunctionToolFunction, XAIResponsesFunctionToolOutput, XAIResponsesInclude, XAIResponsesIncompleteDetails, XAIResponsesIncompleteReason, XAIResponsesInput, XAIResponsesInputContentItem, XAIResponsesInputFileItem, XAIResponsesInputImageItem, XAIResponsesInputItem, XAIResponsesInputTextItem, XAIResponsesLogprobContent, XAIResponsesLogprobToken, XAIResponsesLogprobs, XAIResponsesMcpTool, XAIResponsesMcpToolCall, XAIResponsesMessage, XAIResponsesMessageRole, XAIResponsesObjectType, XAIResponsesOutputCodeInterpreterCall, XAIResponsesOutputContent, XAIResponsesOutputFileSearchCall, XAIResponsesOutputFunctionCall, XAIResponsesOutputItem, XAIResponsesOutputMcpCall, XAIResponsesOutputReasoning, XAIResponsesOutputRefusalContent, XAIResponsesOutputTextContent, XAIResponsesOutputTextItem, XAIResponsesOutputWebSearchCall, XAIResponsesPreviousResponse, XAIResponsesReasoning, XAIResponsesReasoningEffort, XAIResponsesReasoningResponse, XAIResponsesReasoningSummary, XAIResponsesReasoningSummaryItem, XAIResponsesSearchMode, XAIResponsesSearchParameters, XAIResponsesSearchSource, XAIResponsesSearchSourceRss, XAIResponsesSearchSourceWeb, XAIResponsesSearchSourceX, XAIResponsesStatus, XAIResponsesStreamEvent, XAIResponsesStreamEventBase, XAIResponsesStreamEventCompleted, XAIResponsesStreamEventContentPartAdded, XAIResponsesStreamEventContentPartDone, XAIResponsesStreamEventCreated, XAIResponsesStreamEventError, XAIResponsesStreamEventFailed, XAIResponsesStreamEventFunctionCallArgumentsDelta, XAIResponsesStreamEventFunctionCallArgumentsDone, XAIResponsesStreamEventInProgress, XAIResponsesStreamEventIncomplete, XAIResponsesStreamEventOutputItemAdded, XAIResponsesStreamEventOutputItemDone, XAIResponsesStreamEventReasoningSummaryTextDelta, XAIResponsesStreamEventReasoningSummaryTextDone, XAIResponsesStreamEventTextDelta, XAIResponsesStreamEventTextDone, XAIResponsesText, XAIResponsesTextFormat, XAIResponsesTextFormatJsonObject, XAIResponsesTextFormatJsonSchema, XAIResponsesTextFormatText, XAIResponsesTool, XAIResponsesToolCall, XAIResponsesToolChoice, XAIResponsesToolChoiceFunction, XAIResponsesToolChoiceString, XAIResponsesToolOutput, XAIResponsesUrlCitationAnnotation, XAIResponsesUsage, XAIResponsesWebSearchTool, XAIResponsesWebSearchToolCall, XAIResponsesXSearchTool, isXAIBuiltInTool, tools };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ChatXAI, ChatXAICallOptions, ChatXAICompletionsInvocationParams, ChatXAIInput, OpenAIToolChoice, XAIAdditionalKwargs, XAIBuiltInTool, XAIResponseMetadata, isXAIBuiltInTool } from "./chat_models/completions.js";
|
|
2
2
|
import { ChatXAIResponsesCallOptions, ChatXAIResponsesInput, ChatXAIResponsesInvocationParams, XAIResponse, XAIResponsesAnnotation, XAIResponsesCodeInterpreterResult, XAIResponsesCodeInterpreterTool, XAIResponsesCodeInterpreterToolCall, XAIResponsesCreateParams, XAIResponsesCreateParamsNonStreaming, XAIResponsesCreateParamsStreaming, XAIResponsesDebugOutput, XAIResponsesFileCitationAnnotation, XAIResponsesFileSearchResult, XAIResponsesFileSearchTool, XAIResponsesFunctionTool, XAIResponsesFunctionToolCall, XAIResponsesFunctionToolFunction, XAIResponsesFunctionToolOutput, XAIResponsesInclude, XAIResponsesIncompleteDetails, XAIResponsesIncompleteReason, XAIResponsesInput, XAIResponsesInputContentItem, XAIResponsesInputFileItem, XAIResponsesInputImageItem, XAIResponsesInputItem, XAIResponsesInputTextItem, XAIResponsesLogprobContent, XAIResponsesLogprobToken, XAIResponsesLogprobs, XAIResponsesMcpTool, XAIResponsesMcpToolCall, XAIResponsesMessage, XAIResponsesMessageRole, XAIResponsesObjectType, XAIResponsesOutputCodeInterpreterCall, XAIResponsesOutputContent, XAIResponsesOutputFileSearchCall, XAIResponsesOutputFunctionCall, XAIResponsesOutputItem, XAIResponsesOutputMcpCall, XAIResponsesOutputReasoning, XAIResponsesOutputRefusalContent, XAIResponsesOutputTextContent, XAIResponsesOutputTextItem, XAIResponsesOutputWebSearchCall, XAIResponsesPreviousResponse, XAIResponsesReasoning, XAIResponsesReasoningEffort, XAIResponsesReasoningResponse, XAIResponsesReasoningSummary, XAIResponsesReasoningSummaryItem, XAIResponsesSearchMode, XAIResponsesSearchParameters, XAIResponsesSearchSource, XAIResponsesSearchSourceRss, XAIResponsesSearchSourceWeb, XAIResponsesSearchSourceX, XAIResponsesStatus, XAIResponsesStreamEvent, XAIResponsesStreamEventBase, XAIResponsesStreamEventCompleted, XAIResponsesStreamEventContentPartAdded, XAIResponsesStreamEventContentPartDone, XAIResponsesStreamEventCreated, XAIResponsesStreamEventError, XAIResponsesStreamEventFailed, XAIResponsesStreamEventFunctionCallArgumentsDelta, XAIResponsesStreamEventFunctionCallArgumentsDone, XAIResponsesStreamEventInProgress, XAIResponsesStreamEventIncomplete, XAIResponsesStreamEventOutputItemAdded, XAIResponsesStreamEventOutputItemDone, XAIResponsesStreamEventReasoningSummaryTextDelta, XAIResponsesStreamEventReasoningSummaryTextDone, XAIResponsesStreamEventTextDelta, XAIResponsesStreamEventTextDone, XAIResponsesText, XAIResponsesTextFormat, XAIResponsesTextFormatJsonObject, XAIResponsesTextFormatJsonSchema, XAIResponsesTextFormatText, XAIResponsesTool, XAIResponsesToolCall, XAIResponsesToolChoice, XAIResponsesToolChoiceFunction, XAIResponsesToolChoiceString, XAIResponsesToolOutput, XAIResponsesUrlCitationAnnotation, XAIResponsesUsage, XAIResponsesWebSearchTool, XAIResponsesWebSearchToolCall, XAIResponsesXSearchTool } from "./chat_models/responses-types.js";
|
|
3
3
|
import { ChatXAIResponses } from "./chat_models/responses.js";
|
|
4
|
+
import "./chat_models/index.js";
|
|
4
5
|
import { tools } from "./tools/index.js";
|
|
5
6
|
export { ChatXAI, ChatXAICallOptions, ChatXAICompletionsInvocationParams, ChatXAIInput, ChatXAIResponses, ChatXAIResponsesCallOptions, ChatXAIResponsesInput, ChatXAIResponsesInvocationParams, OpenAIToolChoice, XAIAdditionalKwargs, XAIBuiltInTool, XAIResponse, XAIResponseMetadata, XAIResponsesAnnotation, XAIResponsesCodeInterpreterResult, XAIResponsesCodeInterpreterTool, XAIResponsesCodeInterpreterToolCall, XAIResponsesCreateParams, XAIResponsesCreateParamsNonStreaming, XAIResponsesCreateParamsStreaming, XAIResponsesDebugOutput, XAIResponsesFileCitationAnnotation, XAIResponsesFileSearchResult, XAIResponsesFileSearchTool, XAIResponsesFunctionTool, XAIResponsesFunctionToolCall, XAIResponsesFunctionToolFunction, XAIResponsesFunctionToolOutput, XAIResponsesInclude, XAIResponsesIncompleteDetails, XAIResponsesIncompleteReason, XAIResponsesInput, XAIResponsesInputContentItem, XAIResponsesInputFileItem, XAIResponsesInputImageItem, XAIResponsesInputItem, XAIResponsesInputTextItem, XAIResponsesLogprobContent, XAIResponsesLogprobToken, XAIResponsesLogprobs, XAIResponsesMcpTool, XAIResponsesMcpToolCall, XAIResponsesMessage, XAIResponsesMessageRole, XAIResponsesObjectType, XAIResponsesOutputCodeInterpreterCall, XAIResponsesOutputContent, XAIResponsesOutputFileSearchCall, XAIResponsesOutputFunctionCall, XAIResponsesOutputItem, XAIResponsesOutputMcpCall, XAIResponsesOutputReasoning, XAIResponsesOutputRefusalContent, XAIResponsesOutputTextContent, XAIResponsesOutputTextItem, XAIResponsesOutputWebSearchCall, XAIResponsesPreviousResponse, XAIResponsesReasoning, XAIResponsesReasoningEffort, XAIResponsesReasoningResponse, XAIResponsesReasoningSummary, XAIResponsesReasoningSummaryItem, XAIResponsesSearchMode, XAIResponsesSearchParameters, XAIResponsesSearchSource, XAIResponsesSearchSourceRss, XAIResponsesSearchSourceWeb, XAIResponsesSearchSourceX, XAIResponsesStatus, XAIResponsesStreamEvent, XAIResponsesStreamEventBase, XAIResponsesStreamEventCompleted, XAIResponsesStreamEventContentPartAdded, XAIResponsesStreamEventContentPartDone, XAIResponsesStreamEventCreated, XAIResponsesStreamEventError, XAIResponsesStreamEventFailed, XAIResponsesStreamEventFunctionCallArgumentsDelta, XAIResponsesStreamEventFunctionCallArgumentsDone, XAIResponsesStreamEventInProgress, XAIResponsesStreamEventIncomplete, XAIResponsesStreamEventOutputItemAdded, XAIResponsesStreamEventOutputItemDone, XAIResponsesStreamEventReasoningSummaryTextDelta, XAIResponsesStreamEventReasoningSummaryTextDone, XAIResponsesStreamEventTextDelta, XAIResponsesStreamEventTextDone, XAIResponsesText, XAIResponsesTextFormat, XAIResponsesTextFormatJsonObject, XAIResponsesTextFormatJsonSchema, XAIResponsesTextFormatText, XAIResponsesTool, XAIResponsesToolCall, XAIResponsesToolChoice, XAIResponsesToolChoiceFunction, XAIResponsesToolChoiceString, XAIResponsesToolOutput, XAIResponsesUrlCitationAnnotation, XAIResponsesUsage, XAIResponsesWebSearchTool, XAIResponsesWebSearchToolCall, XAIResponsesXSearchTool, isXAIBuiltInTool, tools };
|
package/dist/live_search.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live_search.cjs","names":[],"sources":["../src/live_search.ts"],"sourcesContent":["/**\n * Web search source configuration for xAI Live Search.\n * Corresponds to a `{\"type\": \"web\", ...}` entry in `search_parameters.sources`.\n */\nexport interface XAIWebSource {\n type: \"web\";\n /**\n * Optional ISO alpha-2 country code used to bias results\n * towards a specific country/region.\n */\n country?: string;\n /**\n * Websites that should be excluded from the search results.\n * Maximum of 5 entries.\n */\n excluded_websites?: string[];\n /**\n * Websites that should be exclusively included in the search results.\n * Maximum of 5 entries.\n */\n allowed_websites?: string[];\n /**\n * Whether to enable safe search filtering for this source.\n */\n safe_search?: boolean;\n}\n\n/**\n * News search source configuration for xAI Live Search.\n * Corresponds to a `{\"type\": \"news\", ...}` entry in `search_parameters.sources`.\n */\nexport interface XAINewsSource {\n type: \"news\";\n /**\n * Optional ISO alpha-2 country code used to bias results\n * towards a specific country/region.\n */\n country?: string;\n /**\n * Websites that should be excluded from the search results.\n * Maximum of 5 entries.\n */\n excluded_websites?: string[];\n /**\n * Whether to enable safe search filtering for this source.\n */\n safe_search?: boolean;\n}\n\n/**\n * X (formerly Twitter) search source configuration for xAI Live Search.\n * Corresponds to a `{\"type\": \"x\", ...}` entry in `search_parameters.sources`.\n */\nexport interface XAIXSource {\n type: \"x\";\n /**\n * X handles that should be explicitly included in the search.\n * Maximum of 10 entries.\n */\n included_x_handles?: string[];\n /**\n * X handles that should be excluded from the search.\n * Maximum of 10 entries.\n */\n excluded_x_handles?: string[];\n /**\n * Minimum number of favorites a post must have to be included.\n */\n post_favorite_count?: number;\n /**\n * Minimum number of views a post must have to be included.\n */\n post_view_count?: number;\n}\n\n/**\n * RSS feed search source configuration for xAI Live Search.\n * Corresponds to a `{\"type\": \"rss\", ...}` entry in `search_parameters.sources`.\n */\nexport interface XAIRssSource {\n type: \"rss\";\n /**\n * Links to RSS feeds to be used as a data source.\n * The API currently expects a single URL.\n */\n links: string[];\n}\n\nexport type XAISearchSource =\n | XAIWebSource\n | XAINewsSource\n | XAIXSource\n | XAIRssSource;\n\n/**\n * Search parameters for xAI's Live Search API.\n * Controls how the model searches for and retrieves real-time information.\n *\n * @note The Live Search API is being deprecated by xAI in favor of\n * the agentic tool calling approach. Consider using `tools: [{ type: \"live_search\" }]`\n * for future compatibility.\n */\nexport interface XAISearchParameters {\n /**\n * Controls when the model should perform a search.\n * - \"auto\": Let the model decide when to search (default)\n * - \"on\": Always search for every request\n * - \"off\": Never search\n */\n mode?: \"auto\" | \"on\" | \"off\";\n /**\n * Maximum number of search results to return.\n * @default 20\n */\n max_search_results?: number;\n /**\n * Filter search results to only include content from after this date.\n * Format: ISO 8601 date string (e.g., \"2024-01-01\")\n */\n from_date?: string;\n /**\n * Filter search results to only include content from before this date.\n * Format: ISO 8601 date string (e.g., \"2024-12-31\")\n */\n to_date?: string;\n /**\n * Whether to return citations/sources for the search results.\n * @default true\n */\n return_citations?: boolean;\n /**\n * Specific web/news/X/RSS sources that can be used for the search.\n * Each entry corresponds to a `{\"type\": \"...\", ...}` object in\n * `search_parameters.sources` as documented in the xAI Live Search docs.\n *\n * If omitted, xAI will default to enabling `web`, `news` and `x` sources.\n */\n sources?: XAISearchSource[];\n}\n\n/**\n * Concrete payload shape sent as `search_parameters` to the xAI API.\n */\nexport interface XAISearchParametersPayload {\n mode: \"auto\" | \"on\" | \"off\";\n max_search_results?: number;\n from_date?: string;\n to_date?: string;\n return_citations?: boolean;\n sources?: XAISearchSource[];\n}\n\n/**\n * Merge search parameters from instance defaults, tool definition\n * and per-call overrides.\n *\n * Precedence (lowest → highest):\n * 1. tool-level configuration (e.g. from xaiLiveSearch)\n * 2. instance-level defaults\n * 3. per-call overrides passed via `searchParameters`\n */\nexport function mergeSearchParams(\n instanceParams?: XAISearchParameters,\n callParams?: XAISearchParameters,\n toolParams?: XAISearchParameters\n): XAISearchParameters | undefined {\n if (!instanceParams && !callParams && !toolParams) {\n return undefined;\n }\n\n return {\n ...(toolParams ?? {}),\n ...(instanceParams ?? {}),\n ...(callParams ?? {}),\n };\n}\n\n/**\n * Build the `search_parameters` payload to send to the xAI API\n * from high-level `XAISearchParameters`.\n */\nexport function buildSearchParametersPayload(\n params?: XAISearchParameters\n): XAISearchParametersPayload | undefined {\n if (!params) {\n return undefined;\n }\n\n const payload: XAISearchParametersPayload = {\n mode: params.mode ?? \"auto\",\n };\n\n if (params.max_search_results !== undefined) {\n payload.max_search_results = params.max_search_results;\n }\n if (params.from_date !== undefined) {\n payload.from_date = params.from_date;\n }\n if (params.to_date !== undefined) {\n payload.to_date = params.to_date;\n }\n if (params.return_citations !== undefined) {\n payload.return_citations = params.return_citations;\n }\n if (params.sources && params.sources.length > 0) {\n payload.sources = params.sources;\n }\n\n return payload;\n}\n\n/**\n * Filter out xAI built-in tools (like `live_search`) from a tools array.\n * Used before sending the request to the xAI API, since built-in tools\n * are controlled via `search_parameters` instead.\n */\nexport function filterXAIBuiltInTools<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n T extends { [key: string]: any },\n>(payload?: { tools?: T[]; excludedTypes?: string[] }): T[] | undefined {\n if (!payload?.tools) {\n return undefined;\n }\n\n const filtered = payload.tools.filter((tool) => {\n if (tool == null || typeof tool !== \"object\") {\n return true;\n }\n\n if (!(\"type\" in tool)) {\n return true;\n }\n\n if (!payload?.excludedTypes?.length) {\n return true;\n }\n\n return !payload.excludedTypes.includes(tool.type);\n });\n\n return filtered.length > 0 ? filtered : undefined;\n}\n"],"mappings":";;;;;;;;;;AAiKA,SAAgB,kBACd,gBACA,YACA,YACiC;
|
|
1
|
+
{"version":3,"file":"live_search.cjs","names":[],"sources":["../src/live_search.ts"],"sourcesContent":["/**\n * Web search source configuration for xAI Live Search.\n * Corresponds to a `{\"type\": \"web\", ...}` entry in `search_parameters.sources`.\n */\nexport interface XAIWebSource {\n type: \"web\";\n /**\n * Optional ISO alpha-2 country code used to bias results\n * towards a specific country/region.\n */\n country?: string;\n /**\n * Websites that should be excluded from the search results.\n * Maximum of 5 entries.\n */\n excluded_websites?: string[];\n /**\n * Websites that should be exclusively included in the search results.\n * Maximum of 5 entries.\n */\n allowed_websites?: string[];\n /**\n * Whether to enable safe search filtering for this source.\n */\n safe_search?: boolean;\n}\n\n/**\n * News search source configuration for xAI Live Search.\n * Corresponds to a `{\"type\": \"news\", ...}` entry in `search_parameters.sources`.\n */\nexport interface XAINewsSource {\n type: \"news\";\n /**\n * Optional ISO alpha-2 country code used to bias results\n * towards a specific country/region.\n */\n country?: string;\n /**\n * Websites that should be excluded from the search results.\n * Maximum of 5 entries.\n */\n excluded_websites?: string[];\n /**\n * Whether to enable safe search filtering for this source.\n */\n safe_search?: boolean;\n}\n\n/**\n * X (formerly Twitter) search source configuration for xAI Live Search.\n * Corresponds to a `{\"type\": \"x\", ...}` entry in `search_parameters.sources`.\n */\nexport interface XAIXSource {\n type: \"x\";\n /**\n * X handles that should be explicitly included in the search.\n * Maximum of 10 entries.\n */\n included_x_handles?: string[];\n /**\n * X handles that should be excluded from the search.\n * Maximum of 10 entries.\n */\n excluded_x_handles?: string[];\n /**\n * Minimum number of favorites a post must have to be included.\n */\n post_favorite_count?: number;\n /**\n * Minimum number of views a post must have to be included.\n */\n post_view_count?: number;\n}\n\n/**\n * RSS feed search source configuration for xAI Live Search.\n * Corresponds to a `{\"type\": \"rss\", ...}` entry in `search_parameters.sources`.\n */\nexport interface XAIRssSource {\n type: \"rss\";\n /**\n * Links to RSS feeds to be used as a data source.\n * The API currently expects a single URL.\n */\n links: string[];\n}\n\nexport type XAISearchSource =\n | XAIWebSource\n | XAINewsSource\n | XAIXSource\n | XAIRssSource;\n\n/**\n * Search parameters for xAI's Live Search API.\n * Controls how the model searches for and retrieves real-time information.\n *\n * @note The Live Search API is being deprecated by xAI in favor of\n * the agentic tool calling approach. Consider using `tools: [{ type: \"live_search\" }]`\n * for future compatibility.\n */\nexport interface XAISearchParameters {\n /**\n * Controls when the model should perform a search.\n * - \"auto\": Let the model decide when to search (default)\n * - \"on\": Always search for every request\n * - \"off\": Never search\n */\n mode?: \"auto\" | \"on\" | \"off\";\n /**\n * Maximum number of search results to return.\n * @default 20\n */\n max_search_results?: number;\n /**\n * Filter search results to only include content from after this date.\n * Format: ISO 8601 date string (e.g., \"2024-01-01\")\n */\n from_date?: string;\n /**\n * Filter search results to only include content from before this date.\n * Format: ISO 8601 date string (e.g., \"2024-12-31\")\n */\n to_date?: string;\n /**\n * Whether to return citations/sources for the search results.\n * @default true\n */\n return_citations?: boolean;\n /**\n * Specific web/news/X/RSS sources that can be used for the search.\n * Each entry corresponds to a `{\"type\": \"...\", ...}` object in\n * `search_parameters.sources` as documented in the xAI Live Search docs.\n *\n * If omitted, xAI will default to enabling `web`, `news` and `x` sources.\n */\n sources?: XAISearchSource[];\n}\n\n/**\n * Concrete payload shape sent as `search_parameters` to the xAI API.\n */\nexport interface XAISearchParametersPayload {\n mode: \"auto\" | \"on\" | \"off\";\n max_search_results?: number;\n from_date?: string;\n to_date?: string;\n return_citations?: boolean;\n sources?: XAISearchSource[];\n}\n\n/**\n * Merge search parameters from instance defaults, tool definition\n * and per-call overrides.\n *\n * Precedence (lowest → highest):\n * 1. tool-level configuration (e.g. from xaiLiveSearch)\n * 2. instance-level defaults\n * 3. per-call overrides passed via `searchParameters`\n */\nexport function mergeSearchParams(\n instanceParams?: XAISearchParameters,\n callParams?: XAISearchParameters,\n toolParams?: XAISearchParameters\n): XAISearchParameters | undefined {\n if (!instanceParams && !callParams && !toolParams) {\n return undefined;\n }\n\n return {\n ...(toolParams ?? {}),\n ...(instanceParams ?? {}),\n ...(callParams ?? {}),\n };\n}\n\n/**\n * Build the `search_parameters` payload to send to the xAI API\n * from high-level `XAISearchParameters`.\n */\nexport function buildSearchParametersPayload(\n params?: XAISearchParameters\n): XAISearchParametersPayload | undefined {\n if (!params) {\n return undefined;\n }\n\n const payload: XAISearchParametersPayload = {\n mode: params.mode ?? \"auto\",\n };\n\n if (params.max_search_results !== undefined) {\n payload.max_search_results = params.max_search_results;\n }\n if (params.from_date !== undefined) {\n payload.from_date = params.from_date;\n }\n if (params.to_date !== undefined) {\n payload.to_date = params.to_date;\n }\n if (params.return_citations !== undefined) {\n payload.return_citations = params.return_citations;\n }\n if (params.sources && params.sources.length > 0) {\n payload.sources = params.sources;\n }\n\n return payload;\n}\n\n/**\n * Filter out xAI built-in tools (like `live_search`) from a tools array.\n * Used before sending the request to the xAI API, since built-in tools\n * are controlled via `search_parameters` instead.\n */\nexport function filterXAIBuiltInTools<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n T extends { [key: string]: any },\n>(payload?: { tools?: T[]; excludedTypes?: string[] }): T[] | undefined {\n if (!payload?.tools) {\n return undefined;\n }\n\n const filtered = payload.tools.filter((tool) => {\n if (tool == null || typeof tool !== \"object\") {\n return true;\n }\n\n if (!(\"type\" in tool)) {\n return true;\n }\n\n if (!payload?.excludedTypes?.length) {\n return true;\n }\n\n return !payload.excludedTypes.includes(tool.type);\n });\n\n return filtered.length > 0 ? filtered : undefined;\n}\n"],"mappings":";;;;;;;;;;AAiKA,SAAgB,kBACd,gBACA,YACA,YACiC;CACjC,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,YACrC;CAGF,OAAO;EACL,GAAI,cAAc,CAAC;EACnB,GAAI,kBAAkB,CAAC;EACvB,GAAI,cAAc,CAAC;CACrB;AACF;;;;;AAMA,SAAgB,6BACd,QACwC;CACxC,IAAI,CAAC,QACH;CAGF,MAAM,UAAsC,EAC1C,MAAM,OAAO,QAAQ,OACvB;CAEA,IAAI,OAAO,uBAAuB,KAAA,GAChC,QAAQ,qBAAqB,OAAO;CAEtC,IAAI,OAAO,cAAc,KAAA,GACvB,QAAQ,YAAY,OAAO;CAE7B,IAAI,OAAO,YAAY,KAAA,GACrB,QAAQ,UAAU,OAAO;CAE3B,IAAI,OAAO,qBAAqB,KAAA,GAC9B,QAAQ,mBAAmB,OAAO;CAEpC,IAAI,OAAO,WAAW,OAAO,QAAQ,SAAS,GAC5C,QAAQ,UAAU,OAAO;CAG3B,OAAO;AACT;;;;;;AAOA,SAAgB,sBAGd,SAAsE;CACtE,IAAI,CAAC,SAAS,OACZ;CAGF,MAAM,WAAW,QAAQ,MAAM,QAAQ,SAAS;EAC9C,IAAI,QAAQ,QAAQ,OAAO,SAAS,UAClC,OAAO;EAGT,IAAI,EAAE,UAAU,OACd,OAAO;EAGT,IAAI,CAAC,SAAS,eAAe,QAC3B,OAAO;EAGT,OAAO,CAAC,QAAQ,cAAc,SAAS,KAAK,IAAI;CAClD,CAAC;CAED,OAAO,SAAS,SAAS,IAAI,WAAW,KAAA;AAC1C"}
|
package/dist/live_search.d.cts
CHANGED
|
@@ -141,5 +141,5 @@ interface XAISearchParametersPayload {
|
|
|
141
141
|
sources?: XAISearchSource[];
|
|
142
142
|
}
|
|
143
143
|
//#endregion
|
|
144
|
-
export { XAISearchParameters, XAISearchParametersPayload };
|
|
144
|
+
export { XAINewsSource, XAIRssSource, XAISearchParameters, XAISearchParametersPayload, XAISearchSource, XAIWebSource, XAIXSource };
|
|
145
145
|
//# sourceMappingURL=live_search.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live_search.d.cts","names":[],"sources":["../src/live_search.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"live_search.d.cts","names":[],"sources":["../src/live_search.ts"],"mappings":";;;;;UAIiB;EACf;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;EAIA;;;;;;UAOe;EACf;;;;;EAKA;;;;;EAKA;;;;EAIA;;;;;;UAOe;EACf;;;;;EAKA;;;;;EAKA;;;;EAIA;;;;EAIA;;;;;;UAOe;EACf;;;;;EAKA;;KAGU,kBACR,eACA,gBACA,aACA;;;;;;;;;UAUa;;;;;;;EAOf;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;;;;EAQA,UAAU;;;;;UAMK;EACf;EACA;EACA;EACA;EACA;EACA,UAAU"}
|
package/dist/live_search.d.ts
CHANGED
|
@@ -141,5 +141,5 @@ interface XAISearchParametersPayload {
|
|
|
141
141
|
sources?: XAISearchSource[];
|
|
142
142
|
}
|
|
143
143
|
//#endregion
|
|
144
|
-
export { XAISearchParameters, XAISearchParametersPayload };
|
|
144
|
+
export { XAINewsSource, XAIRssSource, XAISearchParameters, XAISearchParametersPayload, XAISearchSource, XAIWebSource, XAIXSource };
|
|
145
145
|
//# sourceMappingURL=live_search.d.ts.map
|