openAgent
gitlabThe open source UNIVERSAL agent.
clone
https://gitlab.com/bitzzdev/openAgent.gitAIagentautomationopen-sourceuniversal-agent
diff --git a/dist/index.d.mts b/dist/index.d.mtsindex 1bde0b9f8cbe6771a52c1041095c9dddfe8e5b6c..0ca2ffb2a0c9327aed5ddcf0004500dc8b42569f 100644--- a/dist/index.d.mts+++ b/dist/index.d.mts@@ -13,7 +13,5 @@ declare const mistralLanguageModelOptions: z.ZodObject<{- reasoningEffort: z.ZodOptional<z.ZodEnum<{- none: "none";- high: "high";- }>>;+ reasoningEffort: z.ZodOptional<z.ZodString>;+ promptCacheKey: z.ZodOptional<z.ZodString>;}, z.core.$strip>;type MistralLanguageModelOptions = z.infer<typeof mistralLanguageModelOptions>;diff --git a/dist/index.d.ts b/dist/index.d.tsindex 1bde0b9f8cbe6771a52c1041095c9dddfe8e5b6c..0ca2ffb2a0c9327aed5ddcf0004500dc8b42569f 100644--- a/dist/index.d.ts+++ b/dist/index.d.ts@@ -13,7 +13,5 @@ declare const mistralLanguageModelOptions: z.ZodObject<{- reasoningEffort: z.ZodOptional<z.ZodEnum<{- none: "none";- high: "high";- }>>;+ reasoningEffort: z.ZodOptional<z.ZodString>;+ promptCacheKey: z.ZodOptional<z.ZodString>;}, z.core.$strip>;type MistralLanguageModelOptions = z.infer<typeof mistralLanguageModelOptions>;diff --git a/dist/index.js b/dist/index.jsindex d3f904c12a1d582cc7b9e9a2d30273e1a8505b28..267f34e20ea392b7a85ad5259d72d50605a6f971 100644--- a/dist/index.js+++ b/dist/index.js@@ -128,11 +128,14 @@ function convertToMistralChatMessages(prompt) {}case "assistant": {let text = "";+ const structuredContent = [];+ let hasNativeReasoning = false;const toolCalls = [];for (const part of content) {switch (part.type) {case "text": {text += part.text;+ structuredContent.push({ type: "text", text: part.text });break;}case "tool-call": {@@ -148,6 +151,13 @@ function convertToMistralChatMessages(prompt) {}case "reasoning": {text += part.text;+ const native = part.providerOptions?.mistral?.thinking;+ if (native?.type === "thinking") {+ hasNativeReasoning = true;+ structuredContent.push(native);+ break;+ }+ structuredContent.push({ type: "text", text: part.text });break;}default: {@@ -159,7 +169,7 @@ function convertToMistralChatMessages(prompt) {}messages.push({role: "assistant",- content: text,+ content: hasNativeReasoning ? structuredContent : text,prefix: isLastMessage ? true : void 0,tool_calls: toolCalls.length > 0 ? toolCalls : void 0});@@ -268,7 +278,8 @@ var mistralLanguageModelOptions = import_v4.z.object({* - `'high'`: Enable reasoning* - `'none'`: Disable reasoning*/- reasoningEffort: import_v4.z.enum(["high", "none"]).optional()+ reasoningEffort: import_v4.z.string().optional(),+ promptCacheKey: import_v4.z.string().optional()});// src/mistral-error.ts@@ -407,6 +418,7 @@ var MistralChatLanguageModel = class {stop: stopSequences,random_seed: seed,reasoning_effort: options.reasoningEffort,+ prompt_cache_key: options.promptCacheKey,// response format:response_format: (responseFormat == null ? void 0 : responseFormat.type) === "json" ? structuredOutputs && (responseFormat == null ? void 0 : responseFormat.schema) != null ? {type: "json_schema",@@ -465,9 +477,11 @@ var MistralChatLanguageModel = class {for (const part of choice.message.content) {if (part.type === "thinking") {const reasoningText = extractReasoningContent(part.thinking);- if (reasoningText.length > 0) {- content.push({ type: "reasoning", text: reasoningText });- }+ content.push({+ type: "reasoning",+ text: reasoningText,+ providerMetadata: { mistral: { thinking: part } }+ });} else if (part.type === "text") {if (part.text.length > 0) {content.push({ type: "text", text: part.text });@@ -528,6 +542,7 @@ var MistralChatLanguageModel = class {let isFirstChunk = true;let activeText = false;let activeReasoningId = null;+ let activeThinking = null;const generateId2 = this.generateId;return {stream: response.pipeThrough(@@ -561,18 +576,19 @@ var MistralChatLanguageModel = class {for (const part of delta.content) {if (part.type === "thinking") {const reasoningDelta = extractReasoningContent(part.thinking);- if (reasoningDelta.length > 0) {- if (activeReasoningId == null) {- if (activeText) {- controller.enqueue({ type: "text-end", id: "0" });- activeText = false;- }- activeReasoningId = generateId2();- controller.enqueue({- type: "reasoning-start",- id: activeReasoningId- });+ activeThinking = mergeThinking(activeThinking, part);+ if (activeReasoningId == null) {+ if (activeText) {+ controller.enqueue({ type: "text-end", id: "0" });+ activeText = false;}+ activeReasoningId = generateId2();+ controller.enqueue({+ type: "reasoning-start",+ id: activeReasoningId+ });+ }+ if (reasoningDelta.length > 0) {controller.enqueue({type: "reasoning-delta",id: activeReasoningId,@@ -587,9 +603,11 @@ var MistralChatLanguageModel = class {if (activeReasoningId != null) {controller.enqueue({type: "reasoning-end",- id: activeReasoningId+ id: activeReasoningId,+ providerMetadata: { mistral: { thinking: activeThinking } }});activeReasoningId = null;+ activeThinking = null;}controller.enqueue({ type: "text-start", id: "0" });activeText = true;@@ -638,7 +656,8 @@ var MistralChatLanguageModel = class {if (activeReasoningId != null) {controller.enqueue({type: "reasoning-end",- id: activeReasoningId+ id: activeReasoningId,+ providerMetadata: { mistral: { thinking: activeThinking } }});}if (activeText) {@@ -660,6 +679,13 @@ var MistralChatLanguageModel = class {function extractReasoningContent(thinking) {return thinking.filter((chunk) => chunk.type === "text").map((chunk) => chunk.text).join("");}+function mergeThinking(current, next) {+ if (current === null) return { ...next, thinking: [...next.thinking] };+ current.thinking.push(...next.thinking);+ if (next.closed !== void 0) current.closed = next.closed;+ if (next.signature !== void 0) current.signature = next.signature;+ return current;+}function extractTextContent(content) {if (typeof content === "string") {return content;@@ -686,6 +712,30 @@ function extractTextContent(content) {}return textContent.length ? textContent.join("") : void 0;}+var mistralThinkingContentSchema = import_v43.z.discriminatedUnion("type", [+ import_v43.z.object({+ type: import_v43.z.literal("text"),+ text: import_v43.z.string()+ }),+ import_v43.z.object({+ type: import_v43.z.literal("tool_reference"),+ tool: import_v43.z.string(),+ title: import_v43.z.string(),+ url: import_v43.z.string().nullish(),+ favicon: import_v43.z.string().nullish(),+ description: import_v43.z.string().nullish()+ }),+ import_v43.z.object({+ type: import_v43.z.literal("reference"),+ reference_ids: import_v43.z.array(import_v43.z.union([import_v43.z.string(), import_v43.z.number().int()]))+ })+]);+var mistralThinkChunkSchema = import_v43.z.object({+ type: import_v43.z.literal("thinking"),+ thinking: import_v43.z.array(mistralThinkingContentSchema),+ closed: import_v43.z.boolean().optional(),+ signature: import_v43.z.string().nullish()+});var mistralContentSchema = import_v43.z.union([import_v43.z.string(),import_v43.z.array(@@ -708,15 +758,7 @@ var mistralContentSchema = import_v43.z.union([type: import_v43.z.literal("reference"),reference_ids: import_v43.z.array(import_v43.z.union([import_v43.z.string(), import_v43.z.number()]))}),- import_v43.z.object({- type: import_v43.z.literal("thinking"),- thinking: import_v43.z.array(- import_v43.z.object({- type: import_v43.z.literal("text"),- text: import_v43.z.string()- })- )- })+ mistralThinkChunkSchema]))]).nullish();diff --git a/dist/index.mjs b/dist/index.mjsindex d2eff622c1b84a96bdeb4012cb0206a33012a04d..3bff11ddd6136ada45809568828cbc8f2493a42a 100644--- a/dist/index.mjs+++ b/dist/index.mjs@@ -116,11 +116,14 @@ function convertToMistralChatMessages(prompt) {}case "assistant": {let text = "";+ const structuredContent = [];+ let hasNativeReasoning = false;const toolCalls = [];for (const part of content) {switch (part.type) {case "text": {text += part.text;+ structuredContent.push({ type: "text", text: part.text });break;}case "tool-call": {@@ -136,6 +139,13 @@ function convertToMistralChatMessages(prompt) {}case "reasoning": {text += part.text;+ const native = part.providerOptions?.mistral?.thinking;+ if (native?.type === "thinking") {+ hasNativeReasoning = true;+ structuredContent.push(native);+ break;+ }+ structuredContent.push({ type: "text", text: part.text });break;}default: {@@ -147,7 +157,7 @@ function convertToMistralChatMessages(prompt) {}messages.push({role: "assistant",- content: text,+ content: hasNativeReasoning ? structuredContent : text,prefix: isLastMessage ? true : void 0,tool_calls: toolCalls.length > 0 ? toolCalls : void 0});@@ -256,7 +266,8 @@ var mistralLanguageModelOptions = z.object({* - `'high'`: Enable reasoning* - `'none'`: Disable reasoning*/- reasoningEffort: z.enum(["high", "none"]).optional()+ reasoningEffort: z.string().optional(),+ promptCacheKey: z.string().optional()});// src/mistral-error.ts@@ -397,6 +408,7 @@ var MistralChatLanguageModel = class {stop: stopSequences,random_seed: seed,reasoning_effort: options.reasoningEffort,+ prompt_cache_key: options.promptCacheKey,// response format:response_format: (responseFormat == null ? void 0 : responseFormat.type) === "json" ? structuredOutputs && (responseFormat == null ? void 0 : responseFormat.schema) != null ? {type: "json_schema",@@ -455,9 +467,11 @@ var MistralChatLanguageModel = class {for (const part of choice.message.content) {if (part.type === "thinking") {const reasoningText = extractReasoningContent(part.thinking);- if (reasoningText.length > 0) {- content.push({ type: "reasoning", text: reasoningText });- }+ content.push({+ type: "reasoning",+ text: reasoningText,+ providerMetadata: { mistral: { thinking: part } }+ });} else if (part.type === "text") {if (part.text.length > 0) {content.push({ type: "text", text: part.text });@@ -518,6 +532,7 @@ var MistralChatLanguageModel = class {let isFirstChunk = true;let activeText = false;let activeReasoningId = null;+ let activeThinking = null;const generateId2 = this.generateId;return {stream: response.pipeThrough(@@ -551,18 +566,19 @@ var MistralChatLanguageModel = class {for (const part of delta.content) {if (part.type === "thinking") {const reasoningDelta = extractReasoningContent(part.thinking);- if (reasoningDelta.length > 0) {- if (activeReasoningId == null) {- if (activeText) {- controller.enqueue({ type: "text-end", id: "0" });- activeText = false;- }- activeReasoningId = generateId2();- controller.enqueue({- type: "reasoning-start",- id: activeReasoningId- });+ activeThinking = mergeThinking(activeThinking, part);+ if (activeReasoningId == null) {+ if (activeText) {+ controller.enqueue({ type: "text-end", id: "0" });+ activeText = false;}+ activeReasoningId = generateId2();+ controller.enqueue({+ type: "reasoning-start",+ id: activeReasoningId+ });+ }+ if (reasoningDelta.length > 0) {controller.enqueue({type: "reasoning-delta",id: activeReasoningId,@@ -577,9 +593,11 @@ var MistralChatLanguageModel = class {if (activeReasoningId != null) {controller.enqueue({type: "reasoning-end",- id: activeReasoningId+ id: activeReasoningId,+ providerMetadata: { mistral: { thinking: activeThinking } }});activeReasoningId = null;+ activeThinking = null;}controller.enqueue({ type: "text-start", id: "0" });activeText = true;@@ -628,7 +646,8 @@ var MistralChatLanguageModel = class {if (activeReasoningId != null) {controller.enqueue({type: "reasoning-end",- id: activeReasoningId+ id: activeReasoningId,+ providerMetadata: { mistral: { thinking: activeThinking } }});}if (activeText) {@@ -650,6 +669,13 @@ var MistralChatLanguageModel = class {function extractReasoningContent(thinking) {return thinking.filter((chunk) => chunk.type === "text").map((chunk) => chunk.text).join("");}+function mergeThinking(current, next) {+ if (current === null) return { ...next, thinking: [...next.thinking] };+ current.thinking.push(...next.thinking);+ if (next.closed !== void 0) current.closed = next.closed;+ if (next.signature !== void 0) current.signature = next.signature;+ return current;+}function extractTextContent(content) {if (typeof content === "string") {return content;@@ -676,6 +702,30 @@ function extractTextContent(content) {}return textContent.length ? textContent.join("") : void 0;}+var mistralThinkingContentSchema = z3.discriminatedUnion("type", [+ z3.object({+ type: z3.literal("text"),+ text: z3.string()+ }),+ z3.object({+ type: z3.literal("tool_reference"),+ tool: z3.string(),+ title: z3.string(),+ url: z3.string().nullish(),+ favicon: z3.string().nullish(),+ description: z3.string().nullish()+ }),+ z3.object({+ type: z3.literal("reference"),+ reference_ids: z3.array(z3.union([z3.string(), z3.number().int()]))+ })+]);+var mistralThinkChunkSchema = z3.object({+ type: z3.literal("thinking"),+ thinking: z3.array(mistralThinkingContentSchema),+ closed: z3.boolean().optional(),+ signature: z3.string().nullish()+});var mistralContentSchema = z3.union([z3.string(),z3.array(@@ -698,15 +748,7 @@ var mistralContentSchema = z3.union([type: z3.literal("reference"),reference_ids: z3.array(z3.union([z3.string(), z3.number()]))}),- z3.object({- type: z3.literal("thinking"),- thinking: z3.array(- z3.object({- type: z3.literal("text"),- text: z3.string()- })- )- })+ mistralThinkChunkSchema]))]).nullish();diff --git a/src/convert-to-mistral-chat-messages.ts b/src/convert-to-mistral-chat-messages.tsindex 3c6914f8da615d7517bc43dd56198298d0a50247..8cd6f4c7577f746ef41e8a0aee682234c473667a 100644--- a/src/convert-to-mistral-chat-messages.ts+++ b/src/convert-to-mistral-chat-messages.ts@@ -3,7 +3,11 @@ import {type LanguageModelV3DataContent,type LanguageModelV3Prompt,} from '@ai-sdk/provider';-import type { MistralPrompt } from './mistral-chat-prompt';+import type {+ MistralAssistantMessageContent,+ MistralPrompt,+ MistralThinkChunk,+} from './mistral-chat-prompt';import { convertToBase64 } from '@ai-sdk/provider-utils';function formatFileUrl({@@ -76,6 +80,8 @@ export function convertToMistralChatMessages(case 'assistant': {let text = '';+ const structuredContent: Array<MistralAssistantMessageContent> = [];+ let hasNativeReasoning = false;const toolCalls: Array<{id: string;type: 'function';@@ -86,6 +92,7 @@ export function convertToMistralChatMessages(switch (part.type) {case 'text': {text += part.text;+ structuredContent.push({ type: 'text', text: part.text });break;}case 'tool-call': {@@ -101,6 +108,14 @@ export function convertToMistralChatMessages(}case 'reasoning': {text += part.text;+ const native = part.providerOptions?.mistral+ ?.thinking as MistralThinkChunk | undefined;+ if (native?.type === 'thinking') {+ hasNativeReasoning = true;+ structuredContent.push(native);+ break;+ }+ structuredContent.push({ type: 'text', text: part.text });break;}default: {@@ -113,7 +128,7 @@ export function convertToMistralChatMessages(messages.push({role: 'assistant',- content: text,+ content: hasNativeReasoning ? structuredContent : text,prefix: isLastMessage ? true : undefined,tool_calls: toolCalls.length > 0 ? toolCalls : undefined,});diff --git a/src/mistral-chat-language-model.ts b/src/mistral-chat-language-model.tsindex 7e4a7ab552f1b41b7074e1b3cada8a51d791268d..847d26f9dfe03572a969a122f8c96b8bbfda8066 100644--- a/src/mistral-chat-language-model.ts+++ b/src/mistral-chat-language-model.ts@@ -122,6 +122,7 @@ export class MistralChatLanguageModel implements LanguageModelV3 {stop: stopSequences,random_seed: seed,reasoning_effort: options.reasoningEffort,+ prompt_cache_key: options.promptCacheKey,// response format:response_format:@@ -201,9 +202,11 @@ export class MistralChatLanguageModel implements LanguageModelV3 {for (const part of choice.message.content) {if (part.type === 'thinking') {const reasoningText = extractReasoningContent(part.thinking);- if (reasoningText.length > 0) {- content.push({ type: 'reasoning', text: reasoningText });- }+ content.push({+ type: 'reasoning',+ text: reasoningText,+ providerMetadata: { mistral: { thinking: part } },+ });} else if (part.type === 'text') {if (part.text.length > 0) {content.push({ type: 'text', text: part.text });@@ -278,6 +281,7 @@ export class MistralChatLanguageModel implements LanguageModelV3 {let isFirstChunk = true;let activeText = false;let activeReasoningId: string | null = null;+ let activeThinking: z.infer<typeof mistralThinkChunkSchema> | null = null;const generateId = this.generateId;@@ -326,20 +330,21 @@ export class MistralChatLanguageModel implements LanguageModelV3 {for (const part of delta.content) {if (part.type === 'thinking') {const reasoningDelta = extractReasoningContent(part.thinking);- if (reasoningDelta.length > 0) {- if (activeReasoningId == null) {- // end any active text before starting reasoning- if (activeText) {- controller.enqueue({ type: 'text-end', id: '0' });- activeText = false;- }-- activeReasoningId = generateId();- controller.enqueue({- type: 'reasoning-start',- id: activeReasoningId,- });+ activeThinking = mergeThinking(activeThinking, part);+ if (activeReasoningId == null) {+ // end any active text before starting reasoning+ if (activeText) {+ controller.enqueue({ type: 'text-end', id: '0' });+ activeText = false;}++ activeReasoningId = generateId();+ controller.enqueue({+ type: 'reasoning-start',+ id: activeReasoningId,+ });+ }+ if (reasoningDelta.length > 0) {controller.enqueue({type: 'reasoning-delta',id: activeReasoningId,@@ -357,8 +362,12 @@ export class MistralChatLanguageModel implements LanguageModelV3 {controller.enqueue({type: 'reasoning-end',id: activeReasoningId,+ providerMetadata: {+ mistral: { thinking: activeThinking },+ },});activeReasoningId = null;+ activeThinking = null;}controller.enqueue({ type: 'text-start', id: '0' });activeText = true;@@ -416,6 +425,9 @@ export class MistralChatLanguageModel implements LanguageModelV3 {controller.enqueue({type: 'reasoning-end',id: activeReasoningId,+ providerMetadata: {+ mistral: { thinking: activeThinking },+ },});}if (activeText) {@@ -437,7 +449,7 @@ export class MistralChatLanguageModel implements LanguageModelV3 {}function extractReasoningContent(- thinking: Array<{ type: string; text: string }>,+ thinking: Array<z.infer<typeof mistralThinkingContentSchema>>,) {return thinking.filter(chunk => chunk.type === 'text')@@ -445,6 +457,17 @@ function extractReasoningContent(.join('');}+function mergeThinking(+ current: z.infer<typeof mistralThinkChunkSchema> | null,+ next: z.infer<typeof mistralThinkChunkSchema>,+) {+ if (current === null) return { ...next, thinking: [...next.thinking] };+ current.thinking.push(...next.thinking);+ if (next.closed !== undefined) current.closed = next.closed;+ if (next.signature !== undefined) current.signature = next.signature;+ return current;+}+function extractTextContent(content: z.infer<typeof mistralContentSchema>) {if (typeof content === 'string') {return content;@@ -478,6 +501,32 @@ function extractTextContent(content: z.infer<typeof mistralContentSchema>) {return textContent.length ? textContent.join('') : undefined;}+const mistralThinkingContentSchema = z.discriminatedUnion('type', [+ z.object({+ type: z.literal('text'),+ text: z.string(),+ }),+ z.object({+ type: z.literal('tool_reference'),+ tool: z.string(),+ title: z.string(),+ url: z.string().nullish(),+ favicon: z.string().nullish(),+ description: z.string().nullish(),+ }),+ z.object({+ type: z.literal('reference'),+ reference_ids: z.array(z.union([z.string(), z.number().int()])),+ }),+]);++const mistralThinkChunkSchema = z.object({+ type: z.literal('thinking'),+ thinking: z.array(mistralThinkingContentSchema),+ closed: z.boolean().optional(),+ signature: z.string().nullish(),+});+const mistralContentSchema = z.union([z.string(),@@ -501,15 +550,7 @@ const mistralContentSchema = ztype: z.literal('reference'),reference_ids: z.array(z.union([z.string(), z.number()])),}),- z.object({- type: z.literal('thinking'),- thinking: z.array(- z.object({- type: z.literal('text'),- text: z.string(),- }),- ),- }),+ mistralThinkChunkSchema,]),),])diff --git a/src/mistral-chat-options.ts b/src/mistral-chat-options.tsindex 54b29c08517d348995b6ca093b11160e453d5c8b..de30c3e7d924889339e38b1067cb26e9ada05d11 100644--- a/src/mistral-chat-options.ts+++ b/src/mistral-chat-options.ts@@ -64,6 +64,11 @@ export const mistralLanguageModelOptions = z.object({* - `'none'`: Disable reasoning*/- reasoningEffort: z.enum(['high', 'none']).optional(),+ reasoningEffort: z.string().optional(),++ /**+ * A stable identifier used to route requests with shared prompt prefixes.+ */+ promptCacheKey: z.string().optional(),});export type MistralLanguageModelOptions = z.infer<diff --git a/src/mistral-chat-prompt.ts b/src/mistral-chat-prompt.tsindex 13f1dced55ac4be084128127a57fbdd58115bc28..172b11dde3dd326c2f3befd99237474ed8c79285 100644--- a/src/mistral-chat-prompt.ts+++ b/src/mistral-chat-prompt.ts@@ -23,7 +23,7 @@ export type MistralUserMessageContent =export interface MistralAssistantMessage {role: 'assistant';- content: string;+ content: string | Array<MistralAssistantMessageContent>;prefix?: boolean;tool_calls?: Array<{id: string;@@ -32,6 +32,29 @@ export interface MistralAssistantMessage {}>;}+export type MistralAssistantMessageContent =+ | { type: 'text'; text: string }+ | MistralThinkChunk;++export type MistralThinkChunk = {+ type: 'thinking';+ thinking: Array<MistralThinkingContent>;+ closed?: boolean;+ signature?: string | null;+};++export type MistralThinkingContent =+ | { type: 'text'; text: string }+ | {+ type: 'tool_reference';+ tool: string;+ title: string;+ url?: string | null;+ favicon?: string | null;+ description?: string | null;+ }+ | { type: 'reference'; reference_ids: Array<string | number> };+export interface MistralToolMessage {role: 'tool';name: string;