@langchain/xai 1.3.2 → 1.3.4-dev-1771365493298

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.
Files changed (67) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/chat_models/completions.cjs +9 -11
  3. package/dist/chat_models/completions.cjs.map +1 -1
  4. package/dist/chat_models/completions.d.cts.map +1 -1
  5. package/dist/chat_models/completions.d.ts.map +1 -1
  6. package/dist/chat_models/completions.js +4 -5
  7. package/dist/chat_models/completions.js.map +1 -1
  8. package/dist/chat_models/index.js +2 -0
  9. package/dist/chat_models/responses-types.d.cts +5 -12
  10. package/dist/chat_models/responses-types.d.cts.map +1 -1
  11. package/dist/chat_models/responses-types.d.ts +5 -12
  12. package/dist/chat_models/responses-types.d.ts.map +1 -1
  13. package/dist/chat_models/responses.cjs +9 -14
  14. package/dist/chat_models/responses.cjs.map +1 -1
  15. package/dist/chat_models/responses.d.cts +0 -1
  16. package/dist/chat_models/responses.d.cts.map +1 -1
  17. package/dist/chat_models/responses.d.ts +0 -1
  18. package/dist/chat_models/responses.d.ts.map +1 -1
  19. package/dist/chat_models/responses.js +5 -9
  20. package/dist/chat_models/responses.js.map +1 -1
  21. package/dist/converters/responses.cjs +15 -20
  22. package/dist/converters/responses.cjs.map +1 -1
  23. package/dist/converters/responses.js +6 -10
  24. package/dist/converters/responses.js.map +1 -1
  25. package/dist/index.cjs +1 -0
  26. package/dist/live_search.cjs +3 -3
  27. package/dist/live_search.cjs.map +1 -1
  28. package/dist/live_search.d.cts.map +1 -1
  29. package/dist/live_search.d.ts.map +1 -1
  30. package/dist/live_search.js +3 -3
  31. package/dist/live_search.js.map +1 -1
  32. package/dist/profiles.cjs +1 -2
  33. package/dist/profiles.cjs.map +1 -1
  34. package/dist/profiles.js +1 -2
  35. package/dist/profiles.js.map +1 -1
  36. package/dist/tools/code_execution.cjs.map +1 -1
  37. package/dist/tools/code_execution.d.cts.map +1 -1
  38. package/dist/tools/code_execution.d.ts.map +1 -1
  39. package/dist/tools/code_execution.js.map +1 -1
  40. package/dist/tools/collections_search.cjs.map +1 -1
  41. package/dist/tools/collections_search.d.cts.map +1 -1
  42. package/dist/tools/collections_search.d.ts.map +1 -1
  43. package/dist/tools/collections_search.js.map +1 -1
  44. package/dist/tools/index.cjs.map +1 -1
  45. package/dist/tools/index.d.cts +1 -2
  46. package/dist/tools/index.d.cts.map +1 -1
  47. package/dist/tools/index.d.ts +1 -2
  48. package/dist/tools/index.d.ts.map +1 -1
  49. package/dist/tools/index.js.map +1 -1
  50. package/dist/tools/live_search.cjs +1 -4
  51. package/dist/tools/live_search.cjs.map +1 -1
  52. package/dist/tools/live_search.d.cts +0 -1
  53. package/dist/tools/live_search.d.cts.map +1 -1
  54. package/dist/tools/live_search.d.ts +0 -1
  55. package/dist/tools/live_search.d.ts.map +1 -1
  56. package/dist/tools/live_search.js +1 -4
  57. package/dist/tools/live_search.js.map +1 -1
  58. package/dist/tools/web_search.cjs.map +1 -1
  59. package/dist/tools/web_search.d.cts.map +1 -1
  60. package/dist/tools/web_search.d.ts.map +1 -1
  61. package/dist/tools/web_search.js.map +1 -1
  62. package/dist/tools/x_search.cjs.map +1 -1
  63. package/dist/tools/x_search.d.cts.map +1 -1
  64. package/dist/tools/x_search.d.ts.map +1 -1
  65. package/dist/tools/x_search.js.map +1 -1
  66. package/package.json +5 -5
  67. package/dist/_virtual/rolldown_runtime.cjs +0 -25
@@ -110,7 +110,7 @@ var ChatXAIResponses = class extends BaseChatModel {
110
110
  Authorization: `Bearer ${this.apiKey}`
111
111
  };
112
112
  if (request.stream) return this._makeStreamingRequest(url, headers, request);
113
- const response = await this.caller.call(async () => {
113
+ return await this.caller.call(async () => {
114
114
  const res = await fetch(url, {
115
115
  method: "POST",
116
116
  headers,
@@ -122,13 +122,12 @@ var ChatXAIResponses = class extends BaseChatModel {
122
122
  }
123
123
  return res.json();
124
124
  });
125
- return response;
126
125
  }
127
126
  /**
128
127
  * Makes a streaming request to the xAI Responses API.
129
128
  */
130
129
  async *_makeStreamingRequest(url, headers, request) {
131
- const response = await this.caller.call(async () => {
130
+ const reader = (await this.caller.call(async () => {
132
131
  const res = await fetch(url, {
133
132
  method: "POST",
134
133
  headers,
@@ -139,8 +138,7 @@ var ChatXAIResponses = class extends BaseChatModel {
139
138
  throw new Error(`xAI API error: ${res.status} ${res.statusText} - ${errorBody}`);
140
139
  }
141
140
  return res;
142
- });
143
- const reader = response.body?.getReader();
141
+ })).body?.getReader();
144
142
  if (!reader) throw new Error("No response body");
145
143
  const decoder = new TextDecoder();
146
144
  let buffer = "";
@@ -155,8 +153,7 @@ var ChatXAIResponses = class extends BaseChatModel {
155
153
  const trimmed = line.trim();
156
154
  if (!trimmed || trimmed === "data: [DONE]") continue;
157
155
  if (trimmed.startsWith("data: ")) try {
158
- const data = JSON.parse(trimmed.slice(6));
159
- yield data;
156
+ yield JSON.parse(trimmed.slice(6));
160
157
  } catch {}
161
158
  }
162
159
  }
@@ -189,10 +186,9 @@ var ChatXAIResponses = class extends BaseChatModel {
189
186
  stream: false
190
187
  });
191
188
  const aiMessage = convertResponseToAIMessage(response);
192
- const text = extractTextFromOutput(response.output);
193
189
  return {
194
190
  generations: [{
195
- text,
191
+ text: extractTextFromOutput(response.output),
196
192
  message: aiMessage
197
193
  }],
198
194
  llmOutput: {
@@ -1 +1 @@
1
- {"version":3,"file":"responses.js","names":["fields?: ChatXAIResponsesInput","options: this[\"ParsedCallOptions\"]","options?: this[\"ParsedCallOptions\"]","request: XAIResponsesCreateParams","headers: Record<string, string>","url: string","messages: BaseMessage[]","runManager?: CallbackManagerForLLMRun","finalChunk: ChatGenerationChunk | undefined"],"sources":["../../src/chat_models/responses.ts"],"sourcesContent":["import { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\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\";\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(fields?: ChatXAIResponsesInput) {\n super(fields ?? {});\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 *_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":";;;;;;;;;;;;;;;;;;;;;;;;AA6DA,IAAa,mBAAb,cAEU,cAA2B;CACnC,OAAO,UAAU;AACf,SAAO;CACR;CAED,kBAAkB;CAElB,eAAe;EAAC;EAAa;EAAe;CAAM;CAElD,IAAI,aAAoD;AACtD,SAAO,EACL,QAAQ,cACT;CACF;CAED,IAAI,aAAoD;AACtD,SAAO,EACL,QAAQ,cACT;CACF;CAMD;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAMA,YAAYA,QAAgC;EAC1C,MAAM,UAAU,CAAE,EAAC;EAEnB,MAAM,SAAS,QAAQ,UAAU,uBAAuB,cAAc;AACtE,MAAI,CAAC,OACH,OAAM,IAAI,MACR,CAAC,gHAAgH,CAAC;EAItH,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;CACtB;CAMD,WAAmB;AACjB,SAAO;CACR;CAED,AAAS,YAAYC,SAAqD;EACxE,MAAM,SAAS,MAAM,YAAY,QAAQ;EACzC,OAAO,cAAc;EACrB,OAAO,gBAAgB,KAAK;EAC5B,OAAO,gBAAgB;EACvB,OAAO,iBAAiB,KAAK;EAC7B,OAAO,gBAAgB,KAAK;AAC5B,SAAO;CACR;CAED,AAAS,SAAqB;EAC5B,MAAM,SAAS,MAAM,QAAQ;AAE7B,MACE,YAAY,UACZ,OAAO,OAAO,WAAW,YACzB,OAAO,UAAU,MAEjB,OAAQ,OAAO,OAAmC;AAGpD,SAAO;CACR;CAMD,iBACEC,SACkC;AAClC,SAAO;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;EAC/B;CACF;CAiBD,MAAgB,aACdC,SAC+D;EAC/D,MAAM,MAAM,GAAG,KAAK,QAAQ,UAAU,CAAC;EAEvC,MAAMC,UAAkC;GACtC,gBAAgB;GAChB,eAAe,CAAC,OAAO,EAAE,KAAK,QAAQ;EACvC;AAED,MAAI,QAAQ,OACV,QAAO,KAAK,sBAAsB,KAAK,SAAS,QAAQ;EAG1D,MAAM,WAAW,MAAM,KAAK,OAAO,KAAK,YAAY;GAClD,MAAM,MAAM,MAAM,MAAM,KAAK;IAC3B,QAAQ;IACR;IACA,MAAM,KAAK,UAAU,QAAQ;GAC9B,EAAC;AAEF,OAAI,CAAC,IAAI,IAAI;IACX,MAAM,YAAY,MAAM,IAAI,MAAM;AAClC,UAAM,IAAI,MACR,CAAC,eAAe,EAAE,IAAI,OAAO,CAAC,EAAE,IAAI,WAAW,GAAG,EAAE,WAAW;GAElE;AAED,UAAO,IAAI,MAAM;EAClB,EAAC;AAEF,SAAO;CACR;;;;CAKD,OAAiB,sBACfC,KACAD,SACAD,SACwC;EACxC,MAAM,WAAW,MAAM,KAAK,OAAO,KAAK,YAAY;GAClD,MAAM,MAAM,MAAM,MAAM,KAAK;IAC3B,QAAQ;IACR;IACA,MAAM,KAAK,UAAU,QAAQ;GAC9B,EAAC;AAEF,OAAI,CAAC,IAAI,IAAI;IACX,MAAM,YAAY,MAAM,IAAI,MAAM;AAClC,UAAM,IAAI,MACR,CAAC,eAAe,EAAE,IAAI,OAAO,CAAC,EAAE,IAAI,WAAW,GAAG,EAAE,WAAW;GAElE;AAED,UAAO;EACR,EAAC;EAEF,MAAM,SAAS,SAAS,MAAM,WAAW;AACzC,MAAI,CAAC,OACH,OAAM,IAAI,MAAM;EAGlB,MAAM,UAAU,IAAI;EACpB,IAAI,SAAS;AAEb,MAAI;AACF,UAAO,MAAM;IACX,MAAM,EAAE,MAAM,OAAO,GAAG,MAAM,OAAO,MAAM;AAC3C,QAAI,KAAM;IAEV,UAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAM,EAAC;IACjD,MAAM,QAAQ,OAAO,MAAM,KAAK;IAChC,SAAS,MAAM,KAAK,IAAI;AAExB,SAAK,MAAM,QAAQ,OAAO;KACxB,MAAM,UAAU,KAAK,MAAM;AAC3B,SAAI,CAAC,WAAW,YAAY,eAAgB;AAE5C,SAAI,QAAQ,WAAW,SAAS,CAC9B,KAAI;MACF,MAAM,OAAO,KAAK,MAAM,QAAQ,MAAM,EAAE,CAAC;MACzC,MAAM;KACP,QAAO,CAEP;IAEJ;GACF;EACF,UAAS;GACR,OAAO,aAAa;EACrB;CACF;CAMD,MAAM,UACJG,UACAL,SACAM,YACqB;EACrB,QAAQ,QAAQ,gBAAgB;EAChC,MAAM,mBAAmB,KAAK,iBAAiB,QAAQ;EACvD,MAAM,QAAQ,gCAAgC,SAAS;AAEvD,MAAI,iBAAiB,QAAQ;GAC3B,MAAM,SAAS,KAAK,sBAAsB,UAAU,SAAS,WAAW;GACxE,IAAIC;AAEJ,cAAW,MAAM,SAAS,QAAQ;IAChC,MAAM,QAAQ,oBAAoB;KAChC,GAAG,MAAM;KACT,GAAG,MAAM,QAAQ;IAClB;IACD,aAAa,YAAY,OAAO,MAAM,IAAI;GAC3C;AAED,UAAO;IACL,aAAa,aAAa,CAAC,UAAW,IAAG,CAAE;IAC3C,WAAW,EACT,sBAAsB,YAAY,UAC9B,eACL;GACF;EACF;EAED,MAAM,WAAW,MAAM,KAAK,aAAa;GACvC;GACA,GAAG;GACH,QAAQ;EACT,EAAyC;EAE1C,MAAM,YAAY,2BAA2B,SAAS;EACtD,MAAM,OAAO,sBAAsB,SAAS,OAAO;AAEnD,SAAO;GACL,aAAa,CACX;IACE;IACA,SAAS;GACV,CACF;GACD,WAAW;IACT,IAAI,SAAS;IACb,qBAAqB,SAAS,QAC1B;KACE,cAAc,SAAS,MAAM;KAC7B,kBAAkB,SAAS,MAAM;KACjC,aAAa,SAAS,MAAM;IAC7B,IACD;GACL;EACF;CACF;CAED,OAAO,sBACLF,UACAL,SACAM,YACqC;EACrC,MAAM,mBAAmB,KAAK,iBAAiB,QAAQ;EACvD,MAAM,QAAQ,gCAAgC,SAAS;EAEvD,MAAM,iBAAiB,MAAM,KAAK,aAAa;GAC7C;GACA,GAAG;GACH,QAAQ;EACT,EAAsC;AAEvC,aAAW,MAAM,SAAS,gBAAgB;AACxC,OAAI,QAAQ,QAAQ,QAClB;GAEF,MAAM,QAAQ,0BAA0B,MAAM;AAC9C,OAAI,OAAO;IACT,MAAM;IACN,MAAM,YAAY,kBAAkB,MAAM,QAAQ,IAAI;KACpD,QAAQ;KACR,YAAY;IACb,EAAC;GACH;EACF;CACF;AACF"}
1
+ {"version":3,"file":"responses.js","names":[],"sources":["../../src/chat_models/responses.ts"],"sourcesContent":["import { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\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\";\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(fields?: ChatXAIResponsesInput) {\n super(fields ?? {});\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 *_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,6 +1,5 @@
1
- const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
- const __langchain_core_messages = require_rolldown_runtime.__toESM(require("@langchain/core/messages"));
3
- const __langchain_core_outputs = require_rolldown_runtime.__toESM(require("@langchain/core/outputs"));
1
+ let _langchain_core_messages = require("@langchain/core/messages");
2
+ let _langchain_core_outputs = require("@langchain/core/outputs");
4
3
 
5
4
  //#region src/converters/responses.ts
6
5
  /**
@@ -10,8 +9,9 @@ const __langchain_core_outputs = require_rolldown_runtime.__toESM(require("@lang
10
9
  * @returns The xAI Responses API input item
11
10
  */
12
11
  function convertMessageToResponsesInput(message) {
13
- if (message.type === "human") {
14
- const content = typeof message.content === "string" ? message.content : message.content.map((part) => {
12
+ if (message.type === "human") return {
13
+ role: "user",
14
+ content: typeof message.content === "string" ? message.content : message.content.map((part) => {
15
15
  if (typeof part === "string") return {
16
16
  type: "input_text",
17
17
  text: part
@@ -22,10 +22,9 @@ function convertMessageToResponsesInput(message) {
22
22
  };
23
23
  if (part.type === "image_url") {
24
24
  const imageUrlPart = part;
25
- const imageUrl = typeof imageUrlPart.image_url === "string" ? imageUrlPart.image_url : imageUrlPart.image_url.url;
26
25
  return {
27
26
  type: "input_image",
28
- image_url: imageUrl,
27
+ image_url: typeof imageUrlPart.image_url === "string" ? imageUrlPart.image_url : imageUrlPart.image_url.url,
29
28
  detail: "auto"
30
29
  };
31
30
  }
@@ -33,12 +32,8 @@ function convertMessageToResponsesInput(message) {
33
32
  type: "input_text",
34
33
  text: ""
35
34
  };
36
- });
37
- return {
38
- role: "user",
39
- content
40
- };
41
- }
35
+ })
36
+ };
42
37
  if (message.type === "system") return {
43
38
  role: "system",
44
39
  content: typeof message.content === "string" ? message.content : message.content.map((part) => typeof part === "string" ? part : part.text || "").join("")
@@ -110,7 +105,7 @@ function convertResponseToAIMessage(response) {
110
105
  object: response.object
111
106
  };
112
107
  if (response.incomplete_details) responseMetadata.incomplete_details = response.incomplete_details;
113
- return new __langchain_core_messages.AIMessage({
108
+ return new _langchain_core_messages.AIMessage({
114
109
  content: text,
115
110
  usage_metadata: convertUsageToUsageMetadata(response.usage),
116
111
  response_metadata: responseMetadata,
@@ -125,9 +120,9 @@ function convertResponseToAIMessage(response) {
125
120
  */
126
121
  function convertStreamEventToChunk(event) {
127
122
  const responseMetadata = { model_provider: "xai" };
128
- if (event.type === "response.output_text.delta") return new __langchain_core_outputs.ChatGenerationChunk({
123
+ if (event.type === "response.output_text.delta") return new _langchain_core_outputs.ChatGenerationChunk({
129
124
  text: event.delta,
130
- message: new __langchain_core_messages.AIMessageChunk({
125
+ message: new _langchain_core_messages.AIMessageChunk({
131
126
  content: event.delta,
132
127
  response_metadata: responseMetadata
133
128
  })
@@ -135,9 +130,9 @@ function convertStreamEventToChunk(event) {
135
130
  if (event.type === "response.created") {
136
131
  responseMetadata.id = event.response.id;
137
132
  responseMetadata.model = event.response.model;
138
- return new __langchain_core_outputs.ChatGenerationChunk({
133
+ return new _langchain_core_outputs.ChatGenerationChunk({
139
134
  text: "",
140
- message: new __langchain_core_messages.AIMessageChunk({
135
+ message: new _langchain_core_messages.AIMessageChunk({
141
136
  content: "",
142
137
  response_metadata: responseMetadata
143
138
  })
@@ -145,9 +140,9 @@ function convertStreamEventToChunk(event) {
145
140
  }
146
141
  if (event.type === "response.completed") {
147
142
  const aiMessage = convertResponseToAIMessage(event.response);
148
- return new __langchain_core_outputs.ChatGenerationChunk({
143
+ return new _langchain_core_outputs.ChatGenerationChunk({
149
144
  text: "",
150
- message: new __langchain_core_messages.AIMessageChunk({
145
+ message: new _langchain_core_messages.AIMessageChunk({
151
146
  content: "",
152
147
  usage_metadata: aiMessage.usage_metadata,
153
148
  response_metadata: {
@@ -1 +1 @@
1
- {"version":3,"file":"responses.cjs","names":["message: BaseMessage","messages: BaseMessage[]","usage: XAIResponsesUsage | null | undefined","output: XAIResponsesOutputItem[]","textParts: string[]","response: XAIResponse","responseMetadata: Record<string, unknown>","AIMessage","event: XAIResponsesStreamEvent","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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"}
@@ -9,8 +9,9 @@ import { ChatGenerationChunk } from "@langchain/core/outputs";
9
9
  * @returns The xAI Responses API input item
10
10
  */
11
11
  function convertMessageToResponsesInput(message) {
12
- if (message.type === "human") {
13
- const content = typeof message.content === "string" ? message.content : message.content.map((part) => {
12
+ if (message.type === "human") return {
13
+ role: "user",
14
+ content: typeof message.content === "string" ? message.content : message.content.map((part) => {
14
15
  if (typeof part === "string") return {
15
16
  type: "input_text",
16
17
  text: part
@@ -21,10 +22,9 @@ function convertMessageToResponsesInput(message) {
21
22
  };
22
23
  if (part.type === "image_url") {
23
24
  const imageUrlPart = part;
24
- const imageUrl = typeof imageUrlPart.image_url === "string" ? imageUrlPart.image_url : imageUrlPart.image_url.url;
25
25
  return {
26
26
  type: "input_image",
27
- image_url: imageUrl,
27
+ image_url: typeof imageUrlPart.image_url === "string" ? imageUrlPart.image_url : imageUrlPart.image_url.url,
28
28
  detail: "auto"
29
29
  };
30
30
  }
@@ -32,12 +32,8 @@ function convertMessageToResponsesInput(message) {
32
32
  type: "input_text",
33
33
  text: ""
34
34
  };
35
- });
36
- return {
37
- role: "user",
38
- content
39
- };
40
- }
35
+ })
36
+ };
41
37
  if (message.type === "system") return {
42
38
  role: "system",
43
39
  content: typeof message.content === "string" ? message.content : message.content.map((part) => typeof part === "string" ? part : part.text || "").join("")
@@ -1 +1 @@
1
- {"version":3,"file":"responses.js","names":["message: BaseMessage","messages: BaseMessage[]","usage: XAIResponsesUsage | null | undefined","output: XAIResponsesOutputItem[]","textParts: string[]","response: XAIResponse","responseMetadata: Record<string, unknown>","event: XAIResponsesStreamEvent"],"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.cjs CHANGED
@@ -1,3 +1,4 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
1
2
  const require_completions = require('./chat_models/completions.cjs');
2
3
  const require_responses = require('./chat_models/responses.cjs');
3
4
  require('./chat_models/index.cjs');
@@ -10,7 +10,7 @@
10
10
  * 3. per-call overrides passed via `searchParameters`
11
11
  */
12
12
  function mergeSearchParams(instanceParams, callParams, toolParams) {
13
- if (!instanceParams && !callParams && !toolParams) return void 0;
13
+ if (!instanceParams && !callParams && !toolParams) return;
14
14
  return {
15
15
  ...toolParams ?? {},
16
16
  ...instanceParams ?? {},
@@ -22,7 +22,7 @@ function mergeSearchParams(instanceParams, callParams, toolParams) {
22
22
  * from high-level `XAISearchParameters`.
23
23
  */
24
24
  function buildSearchParametersPayload(params) {
25
- if (!params) return void 0;
25
+ if (!params) return;
26
26
  const payload = { mode: params.mode ?? "auto" };
27
27
  if (params.max_search_results !== void 0) payload.max_search_results = params.max_search_results;
28
28
  if (params.from_date !== void 0) payload.from_date = params.from_date;
@@ -37,7 +37,7 @@ function buildSearchParametersPayload(params) {
37
37
  * are controlled via `search_parameters` instead.
38
38
  */
39
39
  function filterXAIBuiltInTools(payload) {
40
- if (!payload?.tools) return void 0;
40
+ if (!payload?.tools) return;
41
41
  const filtered = payload.tools.filter((tool) => {
42
42
  if (tool == null || typeof tool !== "object") return true;
43
43
  if (!("type" in tool)) return true;
@@ -1 +1 @@
1
- {"version":3,"file":"live_search.cjs","names":["instanceParams?: XAISearchParameters","callParams?: XAISearchParameters","toolParams?: XAISearchParameters","params?: XAISearchParameters","payload: XAISearchParametersPayload","payload?: { tools?: T[]; excludedTypes?: string[] }"],"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 // eslint-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,kBACdA,gBACAC,YACAC,YACiC;AACjC,KAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,WACrC,QAAO;AAGT,QAAO;EACL,GAAI,cAAc,CAAE;EACpB,GAAI,kBAAkB,CAAE;EACxB,GAAI,cAAc,CAAE;CACrB;AACF;;;;;AAMD,SAAgB,6BACdC,QACwC;AACxC,KAAI,CAAC,OACH,QAAO;CAGT,MAAMC,UAAsC,EAC1C,MAAM,OAAO,QAAQ,OACtB;AAED,KAAI,OAAO,uBAAuB,QAChC,QAAQ,qBAAqB,OAAO;AAEtC,KAAI,OAAO,cAAc,QACvB,QAAQ,YAAY,OAAO;AAE7B,KAAI,OAAO,YAAY,QACrB,QAAQ,UAAU,OAAO;AAE3B,KAAI,OAAO,qBAAqB,QAC9B,QAAQ,mBAAmB,OAAO;AAEpC,KAAI,OAAO,WAAW,OAAO,QAAQ,SAAS,GAC5C,QAAQ,UAAU,OAAO;AAG3B,QAAO;AACR;;;;;;AAOD,SAAgB,sBAGdC,SAAsE;AACtE,KAAI,CAAC,SAAS,MACZ,QAAO;CAGT,MAAM,WAAW,QAAQ,MAAM,OAAO,CAAC,SAAS;AAC9C,MAAI,QAAQ,QAAQ,OAAO,SAAS,SAClC,QAAO;AAGT,MAAI,EAAE,UAAU,MACd,QAAO;AAGT,MAAI,CAAC,SAAS,eAAe,OAC3B,QAAO;AAGT,SAAO,CAAC,QAAQ,cAAc,SAAS,KAAK,KAAK;CAClD,EAAC;AAEF,QAAO,SAAS,SAAS,IAAI,WAAW;AACzC"}
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 // eslint-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;AACjC,KAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,WACrC;AAGF,QAAO;EACL,GAAI,cAAc,EAAE;EACpB,GAAI,kBAAkB,EAAE;EACxB,GAAI,cAAc,EAAE;EACrB;;;;;;AAOH,SAAgB,6BACd,QACwC;AACxC,KAAI,CAAC,OACH;CAGF,MAAM,UAAsC,EAC1C,MAAM,OAAO,QAAQ,QACtB;AAED,KAAI,OAAO,uBAAuB,OAChC,SAAQ,qBAAqB,OAAO;AAEtC,KAAI,OAAO,cAAc,OACvB,SAAQ,YAAY,OAAO;AAE7B,KAAI,OAAO,YAAY,OACrB,SAAQ,UAAU,OAAO;AAE3B,KAAI,OAAO,qBAAqB,OAC9B,SAAQ,mBAAmB,OAAO;AAEpC,KAAI,OAAO,WAAW,OAAO,QAAQ,SAAS,EAC5C,SAAQ,UAAU,OAAO;AAG3B,QAAO;;;;;;;AAQT,SAAgB,sBAGd,SAAsE;AACtE,KAAI,CAAC,SAAS,MACZ;CAGF,MAAM,WAAW,QAAQ,MAAM,QAAQ,SAAS;AAC9C,MAAI,QAAQ,QAAQ,OAAO,SAAS,SAClC,QAAO;AAGT,MAAI,EAAE,UAAU,MACd,QAAO;AAGT,MAAI,CAAC,SAAS,eAAe,OAC3B,QAAO;AAGT,SAAO,CAAC,QAAQ,cAAc,SAAS,KAAK,KAAK;GACjD;AAEF,QAAO,SAAS,SAAS,IAAI,WAAW"}
@@ -1 +1 @@
1
- {"version":3,"file":"live_search.d.cts","names":["XAIWebSource","XAINewsSource","XAIXSource","XAIRssSource","XAISearchSource","XAISearchParameters","XAISearchParametersPayload","mergeSearchParams","buildSearchParametersPayload","filterXAIBuiltInTools","T"],"sources":["../src/live_search.d.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 * 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 * 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 * 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}\nexport type XAISearchSource = XAIWebSource | XAINewsSource | XAIXSource | XAIRssSource;\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 * 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 * 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 declare function mergeSearchParams(instanceParams?: XAISearchParameters, callParams?: XAISearchParameters, toolParams?: XAISearchParameters): XAISearchParameters | undefined;\n/**\n * Build the `search_parameters` payload to send to the xAI API\n * from high-level `XAISearchParameters`.\n */\nexport declare function buildSearchParametersPayload(params?: XAISearchParameters): XAISearchParametersPayload | undefined;\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 declare function filterXAIBuiltInTools<T extends {\n [key: string]: any;\n}>(payload?: {\n tools?: T[];\n excludedTypes?: string[];\n}): T[] | undefined;\n//# sourceMappingURL=live_search.d.ts.map"],"mappings":";;AAIA;AA0BA;AAqBA;AAyBiBG,UAxEAH,YAAAA,CAwEY;EAQjBI,IAAAA,EAAAA,KAAAA;EAAkBJ;;;;EAAwD,OAAA,CAAA,EAAA,MAAA;EASrEK;AAwCjB;;;;;;;;;;;;;;;;;;UAvGiBJ,aAAAA;;;;;;;;;;;;;;;;;;;;;UAqBAC,UAAAA;;;;;;;;;;;;;;;;;;;;;;;;;UAyBAC,YAAAA;;;;;;;;KAQLC,eAAAA,GAAkBJ,eAAeC,gBAAgBC,aAAaC;;;;;;;;;UASzDE,mBAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAmCHD;;;;;UAKGE,0BAAAA;;;;;;YAMHF"}
1
+ {"version":3,"file":"live_search.d.cts","names":[],"sources":["../src/live_search.ts"],"mappings":";;AAIA;;;UAAiB,YAAA;EACf,IAAA;EAKA;;;;EAAA,OAAA;EAcW;AAOb;;;EAhBE,iBAAA;EAiBA;;;;EAZA,gBAAA;EA0BW;AAOb;;EA7BE,WAAA;AAAA;;;;;UAOe,aAAA;EACf,IAAA;EAwCe;AAOjB;;;EA1CE,OAAA;EAgDK;AAGP;;;EA9CE,iBAAA;EAgDE;;;EA5CF,WAAA;AAAA;;;;;UAOe,UAAA;EACf,IAAA;EAgDe;;;;EA3Cf,kBAAA;EAuDA;;;;EAlDA,kBAAA;EAyEU;;;EArEV,mBAAA;EA2EyC;;;EAvEzC,eAAA;AAAA;;;;;UAOe,YAAA;EACf,IAAA;EAqEyB;;;;EAhEzB,KAAA;AAAA;AAAA,KAGU,eAAA,GACR,YAAA,GACA,aAAA,GACA,UAAA,GACA,YAAA;;;;;;;;;UAUa,mBAAA;;;;;;;EAOf,IAAA;;;;;EAKA,kBAAA;;;;;EAKA,SAAA;;;;;EAKA,OAAA;;;;;EAKA,gBAAA;;;;;;;;EAQA,OAAA,GAAU,eAAA;AAAA;;;;UAMK,0BAAA;EACf,IAAA;EACA,kBAAA;EACA,SAAA;EACA,OAAA;EACA,gBAAA;EACA,OAAA,GAAU,eAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"live_search.d.ts","names":["XAIWebSource","XAINewsSource","XAIXSource","XAIRssSource","XAISearchSource","XAISearchParameters","XAISearchParametersPayload","mergeSearchParams","buildSearchParametersPayload","filterXAIBuiltInTools","T"],"sources":["../src/live_search.d.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 * 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 * 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 * 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}\nexport type XAISearchSource = XAIWebSource | XAINewsSource | XAIXSource | XAIRssSource;\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 * 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 * 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 declare function mergeSearchParams(instanceParams?: XAISearchParameters, callParams?: XAISearchParameters, toolParams?: XAISearchParameters): XAISearchParameters | undefined;\n/**\n * Build the `search_parameters` payload to send to the xAI API\n * from high-level `XAISearchParameters`.\n */\nexport declare function buildSearchParametersPayload(params?: XAISearchParameters): XAISearchParametersPayload | undefined;\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 declare function filterXAIBuiltInTools<T extends {\n [key: string]: any;\n}>(payload?: {\n tools?: T[];\n excludedTypes?: string[];\n}): T[] | undefined;\n//# sourceMappingURL=live_search.d.ts.map"],"mappings":";;AAIA;AA0BA;AAqBA;AAyBiBG,UAxEAH,YAAAA,CAwEY;EAQjBI,IAAAA,EAAAA,KAAAA;EAAkBJ;;;;EAAwD,OAAA,CAAA,EAAA,MAAA;EASrEK;AAwCjB;;;;;;;;;;;;;;;;;;UAvGiBJ,aAAAA;;;;;;;;;;;;;;;;;;;;;UAqBAC,UAAAA;;;;;;;;;;;;;;;;;;;;;;;;;UAyBAC,YAAAA;;;;;;;;KAQLC,eAAAA,GAAkBJ,eAAeC,gBAAgBC,aAAaC;;;;;;;;;UASzDE,mBAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAmCHD;;;;;UAKGE,0BAAAA;;;;;;YAMHF"}
1
+ {"version":3,"file":"live_search.d.ts","names":[],"sources":["../src/live_search.ts"],"mappings":";;AAIA;;;UAAiB,YAAA;EACf,IAAA;EAKA;;;;EAAA,OAAA;EAcW;AAOb;;;EAhBE,iBAAA;EAiBA;;;;EAZA,gBAAA;EA0BW;AAOb;;EA7BE,WAAA;AAAA;;;;;UAOe,aAAA;EACf,IAAA;EAwCe;AAOjB;;;EA1CE,OAAA;EAgDK;AAGP;;;EA9CE,iBAAA;EAgDE;;;EA5CF,WAAA;AAAA;;;;;UAOe,UAAA;EACf,IAAA;EAgDe;;;;EA3Cf,kBAAA;EAuDA;;;;EAlDA,kBAAA;EAyEU;;;EArEV,mBAAA;EA2EyC;;;EAvEzC,eAAA;AAAA;;;;;UAOe,YAAA;EACf,IAAA;EAqEyB;;;;EAhEzB,KAAA;AAAA;AAAA,KAGU,eAAA,GACR,YAAA,GACA,aAAA,GACA,UAAA,GACA,YAAA;;;;;;;;;UAUa,mBAAA;;;;;;;EAOf,IAAA;;;;;EAKA,kBAAA;;;;;EAKA,SAAA;;;;;EAKA,OAAA;;;;;EAKA,gBAAA;;;;;;;;EAQA,OAAA,GAAU,eAAA;AAAA;;;;UAMK,0BAAA;EACf,IAAA;EACA,kBAAA;EACA,SAAA;EACA,OAAA;EACA,gBAAA;EACA,OAAA,GAAU,eAAA;AAAA"}
@@ -9,7 +9,7 @@
9
9
  * 3. per-call overrides passed via `searchParameters`
10
10
  */
11
11
  function mergeSearchParams(instanceParams, callParams, toolParams) {
12
- if (!instanceParams && !callParams && !toolParams) return void 0;
12
+ if (!instanceParams && !callParams && !toolParams) return;
13
13
  return {
14
14
  ...toolParams ?? {},
15
15
  ...instanceParams ?? {},
@@ -21,7 +21,7 @@ function mergeSearchParams(instanceParams, callParams, toolParams) {
21
21
  * from high-level `XAISearchParameters`.
22
22
  */
23
23
  function buildSearchParametersPayload(params) {
24
- if (!params) return void 0;
24
+ if (!params) return;
25
25
  const payload = { mode: params.mode ?? "auto" };
26
26
  if (params.max_search_results !== void 0) payload.max_search_results = params.max_search_results;
27
27
  if (params.from_date !== void 0) payload.from_date = params.from_date;
@@ -36,7 +36,7 @@ function buildSearchParametersPayload(params) {
36
36
  * are controlled via `search_parameters` instead.
37
37
  */
38
38
  function filterXAIBuiltInTools(payload) {
39
- if (!payload?.tools) return void 0;
39
+ if (!payload?.tools) return;
40
40
  const filtered = payload.tools.filter((tool) => {
41
41
  if (tool == null || typeof tool !== "object") return true;
42
42
  if (!("type" in tool)) return true;
@@ -1 +1 @@
1
- {"version":3,"file":"live_search.js","names":["instanceParams?: XAISearchParameters","callParams?: XAISearchParameters","toolParams?: XAISearchParameters","params?: XAISearchParameters","payload: XAISearchParametersPayload","payload?: { tools?: T[]; excludedTypes?: string[] }"],"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 // eslint-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,kBACdA,gBACAC,YACAC,YACiC;AACjC,KAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,WACrC,QAAO;AAGT,QAAO;EACL,GAAI,cAAc,CAAE;EACpB,GAAI,kBAAkB,CAAE;EACxB,GAAI,cAAc,CAAE;CACrB;AACF;;;;;AAMD,SAAgB,6BACdC,QACwC;AACxC,KAAI,CAAC,OACH,QAAO;CAGT,MAAMC,UAAsC,EAC1C,MAAM,OAAO,QAAQ,OACtB;AAED,KAAI,OAAO,uBAAuB,QAChC,QAAQ,qBAAqB,OAAO;AAEtC,KAAI,OAAO,cAAc,QACvB,QAAQ,YAAY,OAAO;AAE7B,KAAI,OAAO,YAAY,QACrB,QAAQ,UAAU,OAAO;AAE3B,KAAI,OAAO,qBAAqB,QAC9B,QAAQ,mBAAmB,OAAO;AAEpC,KAAI,OAAO,WAAW,OAAO,QAAQ,SAAS,GAC5C,QAAQ,UAAU,OAAO;AAG3B,QAAO;AACR;;;;;;AAOD,SAAgB,sBAGdC,SAAsE;AACtE,KAAI,CAAC,SAAS,MACZ,QAAO;CAGT,MAAM,WAAW,QAAQ,MAAM,OAAO,CAAC,SAAS;AAC9C,MAAI,QAAQ,QAAQ,OAAO,SAAS,SAClC,QAAO;AAGT,MAAI,EAAE,UAAU,MACd,QAAO;AAGT,MAAI,CAAC,SAAS,eAAe,OAC3B,QAAO;AAGT,SAAO,CAAC,QAAQ,cAAc,SAAS,KAAK,KAAK;CAClD,EAAC;AAEF,QAAO,SAAS,SAAS,IAAI,WAAW;AACzC"}
1
+ {"version":3,"file":"live_search.js","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 // eslint-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;AACjC,KAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,WACrC;AAGF,QAAO;EACL,GAAI,cAAc,EAAE;EACpB,GAAI,kBAAkB,EAAE;EACxB,GAAI,cAAc,EAAE;EACrB;;;;;;AAOH,SAAgB,6BACd,QACwC;AACxC,KAAI,CAAC,OACH;CAGF,MAAM,UAAsC,EAC1C,MAAM,OAAO,QAAQ,QACtB;AAED,KAAI,OAAO,uBAAuB,OAChC,SAAQ,qBAAqB,OAAO;AAEtC,KAAI,OAAO,cAAc,OACvB,SAAQ,YAAY,OAAO;AAE7B,KAAI,OAAO,YAAY,OACrB,SAAQ,UAAU,OAAO;AAE3B,KAAI,OAAO,qBAAqB,OAC9B,SAAQ,mBAAmB,OAAO;AAEpC,KAAI,OAAO,WAAW,OAAO,QAAQ,SAAS,EAC5C,SAAQ,UAAU,OAAO;AAG3B,QAAO;;;;;;;AAQT,SAAgB,sBAGd,SAAsE;AACtE,KAAI,CAAC,SAAS,MACZ;CAGF,MAAM,WAAW,QAAQ,MAAM,QAAQ,SAAS;AAC9C,MAAI,QAAQ,QAAQ,OAAO,SAAS,SAClC,QAAO;AAGT,MAAI,EAAE,UAAU,MACd,QAAO;AAGT,MAAI,CAAC,SAAS,eAAe,OAC3B,QAAO;AAGT,SAAO,CAAC,QAAQ,cAAc,SAAS,KAAK,KAAK;GACjD;AAEF,QAAO,SAAS,SAAS,IAAI,WAAW"}
package/dist/profiles.cjs CHANGED
@@ -282,8 +282,7 @@ const PROFILES = {
282
282
  structuredOutput: false
283
283
  }
284
284
  };
285
- var profiles_default = PROFILES;
286
285
 
287
286
  //#endregion
288
- exports.default = profiles_default;
287
+ exports.default = PROFILES;
289
288
  //# sourceMappingURL=profiles.cjs.map