ai 4.1.7 → 4.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # ai
2
2
 
3
+ ## 4.1.8
4
+
5
+ ### Patch Changes
6
+
7
+ - 92f5f36: feat (core): add extractReasoningMiddleware
8
+
3
9
  ## 4.1.7
4
10
 
5
11
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -2387,6 +2387,18 @@ declare const experimental_wrapLanguageModel: ({ model, middleware: { transformP
2387
2387
  providerId?: string;
2388
2388
  }) => LanguageModelV1;
2389
2389
 
2390
+ /**
2391
+ * Extract an XML-tagged reasoning section from the generated text and exposes it
2392
+ * as a `reasoning` property on the result.
2393
+ *
2394
+ * @param tagName - The name of the XML tag to extract reasoning from.
2395
+ * @param separator - The separator to use between reasoning and text sections.
2396
+ */
2397
+ declare function extractReasoningMiddleware({ tagName, separator, }: {
2398
+ tagName: string;
2399
+ separator?: string;
2400
+ }): Experimental_LanguageModelV1Middleware;
2401
+
2390
2402
  /**
2391
2403
  * Creates a custom provider with specified language models, text embedding models, and an optional fallback provider.
2392
2404
  *
@@ -2768,4 +2780,4 @@ declare namespace llamaindexAdapter {
2768
2780
  };
2769
2781
  }
2770
2782
 
2771
- export { AssistantContent, AssistantResponse, CallWarning, CoreAssistantMessage, CoreMessage, CoreSystemMessage, CoreTool, ToolCallUnion as CoreToolCallUnion, CoreToolChoice, CoreToolMessage, ToolResultUnion as CoreToolResultUnion, CoreUserMessage, DataContent, DataStreamWriter, DownloadError, EmbedManyResult, EmbedResult, Embedding, EmbeddingModel, EmbeddingModelUsage, GenerateImageResult as Experimental_GenerateImageResult, GeneratedImage as Experimental_GeneratedImage, Experimental_LanguageModelV1Middleware, FilePart, FinishReason, GenerateObjectResult, GenerateTextResult, ImageModel, ImageGenerationWarning as ImageModelCallWarning, ImageModelResponseMetadata, ImagePart, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, InvalidToolArgumentsError, langchainAdapter as LangChainAdapter, LanguageModel, LanguageModelRequestMetadata, LanguageModelResponseMetadata, LanguageModelUsage, llamaindexAdapter as LlamaIndexAdapter, LogProbs, MessageConversionError, NoImageGeneratedError, NoObjectGeneratedError, NoOutputSpecifiedError, NoSuchProviderError, NoSuchToolError, ObjectStreamPart, output as Output, Provider, ProviderMetadata, RetryError, StepResult, StreamData, StreamObjectResult, StreamTextResult, StreamTextTransform, TelemetrySettings, TextPart, TextStreamPart, ToolCallPart, ToolCallRepairError, ToolCallRepairFunction, ToolContent, ToolExecutionError, ToolExecutionOptions, ToolResultPart, UserContent, appendClientMessage, appendResponseMessages, convertToCoreMessages, coreAssistantMessageSchema, coreMessageSchema, coreSystemMessageSchema, coreToolMessageSchema, coreUserMessageSchema, cosineSimilarity, createDataStream, createDataStreamResponse, embed, embedMany, experimental_createProviderRegistry, experimental_customProvider, generateImage as experimental_generateImage, experimental_wrapLanguageModel, generateObject, generateText, pipeDataStreamToResponse, simulateReadableStream, smoothStream, streamObject, streamText, tool };
2783
+ export { AssistantContent, AssistantResponse, CallWarning, CoreAssistantMessage, CoreMessage, CoreSystemMessage, CoreTool, ToolCallUnion as CoreToolCallUnion, CoreToolChoice, CoreToolMessage, ToolResultUnion as CoreToolResultUnion, CoreUserMessage, DataContent, DataStreamWriter, DownloadError, EmbedManyResult, EmbedResult, Embedding, EmbeddingModel, EmbeddingModelUsage, GenerateImageResult as Experimental_GenerateImageResult, GeneratedImage as Experimental_GeneratedImage, Experimental_LanguageModelV1Middleware, FilePart, FinishReason, GenerateObjectResult, GenerateTextResult, ImageModel, ImageGenerationWarning as ImageModelCallWarning, ImageModelResponseMetadata, ImagePart, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, InvalidToolArgumentsError, langchainAdapter as LangChainAdapter, LanguageModel, LanguageModelRequestMetadata, LanguageModelResponseMetadata, LanguageModelUsage, llamaindexAdapter as LlamaIndexAdapter, LogProbs, MessageConversionError, NoImageGeneratedError, NoObjectGeneratedError, NoOutputSpecifiedError, NoSuchProviderError, NoSuchToolError, ObjectStreamPart, output as Output, Provider, ProviderMetadata, RetryError, StepResult, StreamData, StreamObjectResult, StreamTextResult, StreamTextTransform, TelemetrySettings, TextPart, TextStreamPart, ToolCallPart, ToolCallRepairError, ToolCallRepairFunction, ToolContent, ToolExecutionError, ToolExecutionOptions, ToolResultPart, UserContent, appendClientMessage, appendResponseMessages, convertToCoreMessages, coreAssistantMessageSchema, coreMessageSchema, coreSystemMessageSchema, coreToolMessageSchema, coreUserMessageSchema, cosineSimilarity, createDataStream, createDataStreamResponse, embed, embedMany, experimental_createProviderRegistry, experimental_customProvider, generateImage as experimental_generateImage, experimental_wrapLanguageModel, extractReasoningMiddleware, generateObject, generateText, pipeDataStreamToResponse, simulateReadableStream, smoothStream, streamObject, streamText, tool };
package/dist/index.d.ts CHANGED
@@ -2387,6 +2387,18 @@ declare const experimental_wrapLanguageModel: ({ model, middleware: { transformP
2387
2387
  providerId?: string;
2388
2388
  }) => LanguageModelV1;
2389
2389
 
2390
+ /**
2391
+ * Extract an XML-tagged reasoning section from the generated text and exposes it
2392
+ * as a `reasoning` property on the result.
2393
+ *
2394
+ * @param tagName - The name of the XML tag to extract reasoning from.
2395
+ * @param separator - The separator to use between reasoning and text sections.
2396
+ */
2397
+ declare function extractReasoningMiddleware({ tagName, separator, }: {
2398
+ tagName: string;
2399
+ separator?: string;
2400
+ }): Experimental_LanguageModelV1Middleware;
2401
+
2390
2402
  /**
2391
2403
  * Creates a custom provider with specified language models, text embedding models, and an optional fallback provider.
2392
2404
  *
@@ -2768,4 +2780,4 @@ declare namespace llamaindexAdapter {
2768
2780
  };
2769
2781
  }
2770
2782
 
2771
- export { AssistantContent, AssistantResponse, CallWarning, CoreAssistantMessage, CoreMessage, CoreSystemMessage, CoreTool, ToolCallUnion as CoreToolCallUnion, CoreToolChoice, CoreToolMessage, ToolResultUnion as CoreToolResultUnion, CoreUserMessage, DataContent, DataStreamWriter, DownloadError, EmbedManyResult, EmbedResult, Embedding, EmbeddingModel, EmbeddingModelUsage, GenerateImageResult as Experimental_GenerateImageResult, GeneratedImage as Experimental_GeneratedImage, Experimental_LanguageModelV1Middleware, FilePart, FinishReason, GenerateObjectResult, GenerateTextResult, ImageModel, ImageGenerationWarning as ImageModelCallWarning, ImageModelResponseMetadata, ImagePart, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, InvalidToolArgumentsError, langchainAdapter as LangChainAdapter, LanguageModel, LanguageModelRequestMetadata, LanguageModelResponseMetadata, LanguageModelUsage, llamaindexAdapter as LlamaIndexAdapter, LogProbs, MessageConversionError, NoImageGeneratedError, NoObjectGeneratedError, NoOutputSpecifiedError, NoSuchProviderError, NoSuchToolError, ObjectStreamPart, output as Output, Provider, ProviderMetadata, RetryError, StepResult, StreamData, StreamObjectResult, StreamTextResult, StreamTextTransform, TelemetrySettings, TextPart, TextStreamPart, ToolCallPart, ToolCallRepairError, ToolCallRepairFunction, ToolContent, ToolExecutionError, ToolExecutionOptions, ToolResultPart, UserContent, appendClientMessage, appendResponseMessages, convertToCoreMessages, coreAssistantMessageSchema, coreMessageSchema, coreSystemMessageSchema, coreToolMessageSchema, coreUserMessageSchema, cosineSimilarity, createDataStream, createDataStreamResponse, embed, embedMany, experimental_createProviderRegistry, experimental_customProvider, generateImage as experimental_generateImage, experimental_wrapLanguageModel, generateObject, generateText, pipeDataStreamToResponse, simulateReadableStream, smoothStream, streamObject, streamText, tool };
2783
+ export { AssistantContent, AssistantResponse, CallWarning, CoreAssistantMessage, CoreMessage, CoreSystemMessage, CoreTool, ToolCallUnion as CoreToolCallUnion, CoreToolChoice, CoreToolMessage, ToolResultUnion as CoreToolResultUnion, CoreUserMessage, DataContent, DataStreamWriter, DownloadError, EmbedManyResult, EmbedResult, Embedding, EmbeddingModel, EmbeddingModelUsage, GenerateImageResult as Experimental_GenerateImageResult, GeneratedImage as Experimental_GeneratedImage, Experimental_LanguageModelV1Middleware, FilePart, FinishReason, GenerateObjectResult, GenerateTextResult, ImageModel, ImageGenerationWarning as ImageModelCallWarning, ImageModelResponseMetadata, ImagePart, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, InvalidToolArgumentsError, langchainAdapter as LangChainAdapter, LanguageModel, LanguageModelRequestMetadata, LanguageModelResponseMetadata, LanguageModelUsage, llamaindexAdapter as LlamaIndexAdapter, LogProbs, MessageConversionError, NoImageGeneratedError, NoObjectGeneratedError, NoOutputSpecifiedError, NoSuchProviderError, NoSuchToolError, ObjectStreamPart, output as Output, Provider, ProviderMetadata, RetryError, StepResult, StreamData, StreamObjectResult, StreamTextResult, StreamTextTransform, TelemetrySettings, TextPart, TextStreamPart, ToolCallPart, ToolCallRepairError, ToolCallRepairFunction, ToolContent, ToolExecutionError, ToolExecutionOptions, ToolResultPart, UserContent, appendClientMessage, appendResponseMessages, convertToCoreMessages, coreAssistantMessageSchema, coreMessageSchema, coreSystemMessageSchema, coreToolMessageSchema, coreUserMessageSchema, cosineSimilarity, createDataStream, createDataStreamResponse, embed, embedMany, experimental_createProviderRegistry, experimental_customProvider, generateImage as experimental_generateImage, experimental_wrapLanguageModel, extractReasoningMiddleware, generateObject, generateText, pipeDataStreamToResponse, simulateReadableStream, smoothStream, streamObject, streamText, tool };
package/dist/index.js CHANGED
@@ -68,6 +68,7 @@ __export(streams_exports, {
68
68
  experimental_customProvider: () => experimental_customProvider,
69
69
  experimental_generateImage: () => generateImage,
70
70
  experimental_wrapLanguageModel: () => experimental_wrapLanguageModel,
71
+ extractReasoningMiddleware: () => extractReasoningMiddleware,
71
72
  formatAssistantStreamPart: () => import_ui_utils9.formatAssistantStreamPart,
72
73
  formatDataStreamPart: () => import_ui_utils9.formatDataStreamPart,
73
74
  generateId: () => import_provider_utils14.generateId,
@@ -5630,6 +5631,113 @@ var experimental_wrapLanguageModel = ({
5630
5631
  };
5631
5632
  };
5632
5633
 
5634
+ // core/util/get-potential-start-index.ts
5635
+ function getPotentialStartIndex(text2, searchedText) {
5636
+ if (searchedText.length === 0) {
5637
+ return null;
5638
+ }
5639
+ const directIndex = text2.indexOf(searchedText);
5640
+ if (directIndex !== -1) {
5641
+ return directIndex;
5642
+ }
5643
+ for (let i = text2.length - 1; i >= 0; i--) {
5644
+ const suffix = text2.substring(i);
5645
+ if (searchedText.startsWith(suffix)) {
5646
+ return i;
5647
+ }
5648
+ }
5649
+ return null;
5650
+ }
5651
+
5652
+ // core/middleware/extract-reasoning-middleware.ts
5653
+ function extractReasoningMiddleware({
5654
+ tagName,
5655
+ separator = "\n"
5656
+ }) {
5657
+ const openingTag = `<${tagName}>`;
5658
+ const closingTag = `</${tagName}>`;
5659
+ return {
5660
+ wrapGenerate: async ({ doGenerate }) => {
5661
+ const { text: text2, ...rest } = await doGenerate();
5662
+ if (text2 == null) {
5663
+ return { text: text2, ...rest };
5664
+ }
5665
+ const regexp = new RegExp(`${openingTag}(.*?)${closingTag}`, "gs");
5666
+ const matches = Array.from(text2.matchAll(regexp));
5667
+ if (!matches.length) {
5668
+ return { text: text2, ...rest };
5669
+ }
5670
+ const reasoning = matches.map((match) => match[1]).join(separator);
5671
+ let textWithoutReasoning = text2;
5672
+ for (let i = matches.length - 1; i >= 0; i--) {
5673
+ const match = matches[i];
5674
+ const beforeMatch = textWithoutReasoning.slice(0, match.index);
5675
+ const afterMatch = textWithoutReasoning.slice(
5676
+ match.index + match[0].length
5677
+ );
5678
+ textWithoutReasoning = beforeMatch + (beforeMatch.length > 0 && afterMatch.length > 0 ? separator : "") + afterMatch;
5679
+ }
5680
+ return { text: textWithoutReasoning, reasoning, ...rest };
5681
+ },
5682
+ wrapStream: async ({ doStream }) => {
5683
+ const { stream, ...rest } = await doStream();
5684
+ let isFirstReasoning = true;
5685
+ let isFirstText = true;
5686
+ let afterSwitch = false;
5687
+ let isReasoning = false;
5688
+ let buffer = "";
5689
+ return {
5690
+ stream: stream.pipeThrough(
5691
+ new TransformStream({
5692
+ transform: (chunk, controller) => {
5693
+ if (chunk.type !== "text-delta") {
5694
+ controller.enqueue(chunk);
5695
+ return;
5696
+ }
5697
+ buffer += chunk.textDelta;
5698
+ function publish(text2) {
5699
+ if (text2.length > 0) {
5700
+ const prefix = afterSwitch && (isReasoning ? !isFirstReasoning : !isFirstText) ? separator : "";
5701
+ controller.enqueue({
5702
+ type: isReasoning ? "reasoning" : "text-delta",
5703
+ textDelta: prefix + text2
5704
+ });
5705
+ afterSwitch = false;
5706
+ if (isReasoning) {
5707
+ isFirstReasoning = false;
5708
+ } else {
5709
+ isFirstText = false;
5710
+ }
5711
+ }
5712
+ }
5713
+ do {
5714
+ const nextTag = isReasoning ? closingTag : openingTag;
5715
+ const startIndex = getPotentialStartIndex(buffer, nextTag);
5716
+ if (startIndex == null) {
5717
+ publish(buffer);
5718
+ buffer = "";
5719
+ break;
5720
+ }
5721
+ publish(buffer.slice(0, startIndex));
5722
+ const foundFullMatch = startIndex + nextTag.length <= buffer.length;
5723
+ if (foundFullMatch) {
5724
+ buffer = buffer.slice(startIndex + nextTag.length);
5725
+ isReasoning = !isReasoning;
5726
+ afterSwitch = true;
5727
+ } else {
5728
+ buffer = buffer.slice(startIndex);
5729
+ break;
5730
+ }
5731
+ } while (true);
5732
+ }
5733
+ })
5734
+ ),
5735
+ ...rest
5736
+ };
5737
+ }
5738
+ };
5739
+ }
5740
+
5633
5741
  // core/prompt/append-client-message.ts
5634
5742
  function appendClientMessage({
5635
5743
  messages,
@@ -6264,6 +6372,7 @@ var StreamData = class {
6264
6372
  experimental_customProvider,
6265
6373
  experimental_generateImage,
6266
6374
  experimental_wrapLanguageModel,
6375
+ extractReasoningMiddleware,
6267
6376
  formatAssistantStreamPart,
6268
6377
  formatDataStreamPart,
6269
6378
  generateId,