@push.rocks/smartai 0.9.0 → 0.10.0

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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartai',
6
- version: '0.9.0',
6
+ version: '0.10.0',
7
7
  description: 'SmartAi is a versatile TypeScript library designed to facilitate integration and interaction with various AI models, offering functionalities for chat, audio generation, document processing, and vision tasks.'
8
8
  };
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxxQkFBcUI7SUFDM0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLGtOQUFrTjtDQUNoTyxDQUFBIn0=
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxxQkFBcUI7SUFDM0IsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLGtOQUFrTjtDQUNoTyxDQUFBIn0=
@@ -13,6 +13,7 @@ export declare class Conversation {
13
13
  static createWithExo(smartaiRefArg: SmartAi): Promise<Conversation>;
14
14
  static createWithOllama(smartaiRefArg: SmartAi): Promise<Conversation>;
15
15
  static createWithGroq(smartaiRefArg: SmartAi): Promise<Conversation>;
16
+ static createWithMistral(smartaiRefArg: SmartAi): Promise<Conversation>;
16
17
  static createWithXai(smartaiRefArg: SmartAi): Promise<Conversation>;
17
18
  static createWithElevenlabs(smartaiRefArg: SmartAi): Promise<Conversation>;
18
19
  smartaiRef: SmartAi;
@@ -70,6 +70,17 @@ export class Conversation {
70
70
  });
71
71
  return conversation;
72
72
  }
73
+ static async createWithMistral(smartaiRefArg) {
74
+ if (!smartaiRefArg.mistralProvider) {
75
+ throw new Error('Mistral provider not available');
76
+ }
77
+ const conversation = new Conversation(smartaiRefArg, {
78
+ processFunction: async (input) => {
79
+ return ''; // TODO implement proper streaming
80
+ }
81
+ });
82
+ return conversation;
83
+ }
73
84
  static async createWithXai(smartaiRefArg) {
74
85
  if (!smartaiRefArg.xaiProvider) {
75
86
  throw new Error('XAI provider not available');
@@ -136,4 +147,4 @@ export class Conversation {
136
147
  return this.setupOutputStream();
137
148
  }
138
149
  }
139
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb252ZXJzYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmNvbnZlcnNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFRdEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUN2QixTQUFTO0lBQ0YsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFzQjtRQUN6RCxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsYUFBYSxFQUFFO1lBQ25ELGVBQWUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQy9CLE9BQU8sRUFBRSxDQUFBLENBQUMsa0NBQWtDO1lBQzlDLENBQUM7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxhQUFzQjtRQUM1RCxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUU7WUFDbkQsZUFBZSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDL0IsT0FBTyxFQUFFLENBQUEsQ0FBQyxrQ0FBa0M7WUFDOUMsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLGFBQXNCO1FBQzdELElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUNELE1BQU0sWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLGFBQWEsRUFBRTtZQUNuRCxlQUFlLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUMvQixPQUFPLEVBQUUsQ0FBQSxDQUFDLGtDQUFrQztZQUM5QyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGFBQXNCO1FBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUU7WUFDbkQsZUFBZSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDL0IsT0FBTyxFQUFFLENBQUEsQ0FBQyxrQ0FBa0M7WUFDOUMsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGFBQXNCO1FBQ3pELElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUU7WUFDbkQsZUFBZSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDL0IsT0FBTyxFQUFFLENBQUEsQ0FBQyxrQ0FBa0M7WUFDOUMsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxhQUFzQjtRQUN2RCxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsYUFBYSxFQUFFO1lBQ25ELGVBQWUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQy9CLE9BQU8sRUFBRSxDQUFBLENBQUMsa0NBQWtDO1lBQzlDLENBQUM7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsYUFBc0I7UUFDdEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUNELE1BQU0sWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLGFBQWEsRUFBRTtZQUNuRCxlQUFlLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUMvQixPQUFPLEVBQUUsQ0FBQSxDQUFDLGtDQUFrQztZQUM5QyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsYUFBc0I7UUFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsYUFBYSxFQUFFO1lBQ25ELGVBQWUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQy9CLE9BQU8sRUFBRSxDQUFBLENBQUMsa0NBQWtDO1lBQzlDLENBQUM7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBU0QsWUFBWSxhQUFzQixFQUFFLE9BQTZCO1FBSHpELHNCQUFpQixHQUErQyxJQUFJLENBQUM7UUFDckUsMkJBQXNCLEdBQW1ELElBQUksQ0FBQztRQUdwRixJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7SUFDakQsQ0FBQztJQUVNLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBd0I7UUFDcEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQztJQUN4QyxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLE9BQU8sSUFBSSxjQUFjLENBQVM7WUFDaEMsS0FBSyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxVQUFVLENBQUM7WUFDM0MsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQVM7WUFDaEQsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDckIsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO29CQUNoQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNyRCxDQUFDO1lBQ0gsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ3ZDLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDYixPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLENBQUM7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRU0sb0JBQW9CO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25ELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0lBRU0sZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ2xDLENBQUM7Q0FDRiJ9
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb252ZXJzYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmNvbnZlcnNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFRdEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUN2QixTQUFTO0lBQ0YsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFzQjtRQUN6RCxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsYUFBYSxFQUFFO1lBQ25ELGVBQWUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQy9CLE9BQU8sRUFBRSxDQUFBLENBQUMsa0NBQWtDO1lBQzlDLENBQUM7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxhQUFzQjtRQUM1RCxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUU7WUFDbkQsZUFBZSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDL0IsT0FBTyxFQUFFLENBQUEsQ0FBQyxrQ0FBa0M7WUFDOUMsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLGFBQXNCO1FBQzdELElBQUks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
@@ -1,6 +1,7 @@
1
1
  import { Conversation } from './classes.conversation.js';
2
2
  import { AnthropicProvider } from './provider.anthropic.js';
3
3
  import { ElevenLabsProvider } from './provider.elevenlabs.js';
4
+ import { MistralProvider } from './provider.mistral.js';
4
5
  import { OllamaProvider } from './provider.ollama.js';
5
6
  import { OpenAiProvider } from './provider.openai.js';
6
7
  import { PerplexityProvider } from './provider.perplexity.js';
@@ -12,12 +13,18 @@ export interface ISmartAiOptions {
12
13
  anthropicToken?: string;
13
14
  perplexityToken?: string;
14
15
  groqToken?: string;
16
+ mistralToken?: string;
15
17
  xaiToken?: string;
16
18
  elevenlabsToken?: string;
17
19
  exo?: {
18
20
  baseUrl?: string;
19
21
  apiKey?: string;
20
22
  };
23
+ mistral?: {
24
+ chatModel?: string;
25
+ ocrModel?: string;
26
+ tableFormat?: 'markdown' | 'html';
27
+ };
21
28
  ollama?: {
22
29
  baseUrl?: string;
23
30
  model?: string;
@@ -28,7 +35,7 @@ export interface ISmartAiOptions {
28
35
  defaultModelId?: string;
29
36
  };
30
37
  }
31
- export type TProvider = 'openai' | 'anthropic' | 'perplexity' | 'ollama' | 'exo' | 'groq' | 'xai' | 'elevenlabs';
38
+ export type TProvider = 'openai' | 'anthropic' | 'perplexity' | 'ollama' | 'exo' | 'groq' | 'mistral' | 'xai' | 'elevenlabs';
32
39
  export declare class SmartAi {
33
40
  options: ISmartAiOptions;
34
41
  openaiProvider: OpenAiProvider;
@@ -37,6 +44,7 @@ export declare class SmartAi {
37
44
  ollamaProvider: OllamaProvider;
38
45
  exoProvider: ExoProvider;
39
46
  groqProvider: GroqProvider;
47
+ mistralProvider: MistralProvider;
40
48
  xaiProvider: XAIProvider;
41
49
  elevenlabsProvider: ElevenLabsProvider;
42
50
  constructor(optionsArg: ISmartAiOptions);
@@ -2,6 +2,7 @@ import { Conversation } from './classes.conversation.js';
2
2
  import * as plugins from './plugins.js';
3
3
  import { AnthropicProvider } from './provider.anthropic.js';
4
4
  import { ElevenLabsProvider } from './provider.elevenlabs.js';
5
+ import { MistralProvider } from './provider.mistral.js';
5
6
  import { OllamaProvider } from './provider.ollama.js';
6
7
  import { OpenAiProvider } from './provider.openai.js';
7
8
  import { PerplexityProvider } from './provider.perplexity.js';
@@ -37,6 +38,15 @@ export class SmartAi {
37
38
  });
38
39
  await this.groqProvider.start();
39
40
  }
41
+ if (this.options.mistralToken) {
42
+ this.mistralProvider = new MistralProvider({
43
+ mistralToken: this.options.mistralToken,
44
+ chatModel: this.options.mistral?.chatModel,
45
+ ocrModel: this.options.mistral?.ocrModel,
46
+ tableFormat: this.options.mistral?.tableFormat,
47
+ });
48
+ await this.mistralProvider.start();
49
+ }
40
50
  if (this.options.xaiToken) {
41
51
  this.xaiProvider = new XAIProvider({
42
52
  xaiToken: this.options.xaiToken,
@@ -80,6 +90,9 @@ export class SmartAi {
80
90
  if (this.groqProvider) {
81
91
  await this.groqProvider.stop();
82
92
  }
93
+ if (this.mistralProvider) {
94
+ await this.mistralProvider.stop();
95
+ }
83
96
  if (this.xaiProvider) {
84
97
  await this.xaiProvider.stop();
85
98
  }
@@ -110,6 +123,8 @@ export class SmartAi {
110
123
  return Conversation.createWithOllama(this);
111
124
  case 'groq':
112
125
  return Conversation.createWithGroq(this);
126
+ case 'mistral':
127
+ return Conversation.createWithMistral(this);
113
128
  case 'xai':
114
129
  return Conversation.createWithXai(this);
115
130
  case 'elevenlabs':
@@ -119,4 +134,4 @@ export class SmartAi {
119
134
  }
120
135
  }
121
136
  }
122
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydGFpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5zbWFydGFpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBMkJoRCxNQUFNLE9BQU8sT0FBTztJQVlsQixZQUFZLFVBQTJCO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO0lBQzVCLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBQztnQkFDdkMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVzthQUN0QyxDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZ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
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydGFpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5zbWFydGFpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQWlDaEQsTUFBTSxPQUFPLE9BQU87SUFhbEIsWUFBWSxVQUEyQjtRQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztJQUM1QixDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUs7UUFDaEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUM7Z0JBQ3ZDLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVc7YUFDdEMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BDLENBQUM7UUFD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
@@ -4,6 +4,7 @@ export * from './provider.openai.js';
4
4
  export * from './provider.anthropic.js';
5
5
  export * from './provider.perplexity.js';
6
6
  export * from './provider.groq.js';
7
+ export * from './provider.mistral.js';
7
8
  export * from './provider.ollama.js';
8
9
  export * from './provider.xai.js';
9
10
  export * from './provider.exo.js';
package/dist_ts/index.js CHANGED
@@ -4,8 +4,9 @@ export * from './provider.openai.js';
4
4
  export * from './provider.anthropic.js';
5
5
  export * from './provider.perplexity.js';
6
6
  export * from './provider.groq.js';
7
+ export * from './provider.mistral.js';
7
8
  export * from './provider.ollama.js';
8
9
  export * from './provider.xai.js';
9
10
  export * from './provider.exo.js';
10
11
  export * from './provider.elevenlabs.js';
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLDBCQUEwQixDQUFDIn0=
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsMEJBQTBCLENBQUMifQ==
@@ -10,5 +10,6 @@ import * as smartrequest from '@push.rocks/smartrequest';
10
10
  import * as webstream from '@push.rocks/webstream';
11
11
  export { smartarray, qenv, smartfile, smartpath, smartpdf, smartpromise, smartrequest, webstream, };
12
12
  import * as anthropic from '@anthropic-ai/sdk';
13
+ import * as mistralai from '@mistralai/mistralai';
13
14
  import * as openai from 'openai';
14
- export { anthropic, openai, };
15
+ export { anthropic, mistralai, openai, };
@@ -13,6 +13,7 @@ import * as webstream from '@push.rocks/webstream';
13
13
  export { smartarray, qenv, smartfile, smartpath, smartpdf, smartpromise, smartrequest, webstream, };
14
14
  // third party
15
15
  import * as anthropic from '@anthropic-ai/sdk';
16
+ import * as mistralai from '@mistralai/mistralai';
16
17
  import * as openai from 'openai';
17
- export { anthropic, openai, };
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFDTCxJQUFJLEdBQ0wsQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssSUFBSSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFFbkQsT0FBTyxFQUNMLFVBQVUsRUFDVixJQUFJLEVBQ0osU0FBUyxFQUNULFNBQVMsRUFDVCxRQUFRLEVBQ1IsWUFBWSxFQUNaLFlBQVksRUFDWixTQUFTLEdBQ1YsQ0FBQTtBQUVELGNBQWM7QUFDZCxPQUFPLEtBQUssU0FBUyxNQUFNLG1CQUFtQixDQUFDO0FBQy9DLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRWpDLE9BQU8sRUFDTCxTQUFTLEVBQ1QsTUFBTSxHQUNQLENBQUEifQ==
18
+ export { anthropic, mistralai, openai, };
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFDTCxJQUFJLEdBQ0wsQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssSUFBSSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFFbkQsT0FBTyxFQUNMLFVBQVUsRUFDVixJQUFJLEVBQ0osU0FBUyxFQUNULFNBQVMsRUFDVCxRQUFRLEVBQ1IsWUFBWSxFQUNaLFlBQVksRUFDWixTQUFTLEdBQ1YsQ0FBQTtBQUVELGNBQWM7QUFDZCxPQUFPLEtBQUssU0FBUyxNQUFNLG1CQUFtQixDQUFDO0FBQy9DLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFakMsT0FBTyxFQUNMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsTUFBTSxHQUNQLENBQUEifQ==
@@ -0,0 +1,61 @@
1
+ import * as plugins from './plugins.js';
2
+ import { MultiModalModel } from './abstract.classes.multimodal.js';
3
+ import type { ChatOptions, ChatResponse, ChatMessage, ResearchOptions, ResearchResponse, ImageGenerateOptions, ImageEditOptions, ImageResponse } from './abstract.classes.multimodal.js';
4
+ export interface IMistralProviderOptions {
5
+ mistralToken: string;
6
+ chatModel?: string;
7
+ ocrModel?: string;
8
+ tableFormat?: 'markdown' | 'html';
9
+ }
10
+ export declare class MistralProvider extends MultiModalModel {
11
+ private options;
12
+ mistralClient: plugins.mistralai.Mistral;
13
+ constructor(optionsArg: IMistralProviderOptions);
14
+ start(): Promise<void>;
15
+ stop(): Promise<void>;
16
+ /**
17
+ * Synchronous chat interaction using Mistral's chat API
18
+ */
19
+ chat(optionsArg: ChatOptions): Promise<ChatResponse>;
20
+ /**
21
+ * Streaming chat using Mistral's streaming API
22
+ */
23
+ chatStream(input: ReadableStream<Uint8Array>): Promise<ReadableStream<string>>;
24
+ /**
25
+ * Audio generation is not supported by Mistral
26
+ */
27
+ audio(optionsArg: {
28
+ message: string;
29
+ }): Promise<NodeJS.ReadableStream>;
30
+ /**
31
+ * Vision using Mistral's OCR API for image analysis
32
+ */
33
+ vision(optionsArg: {
34
+ image: Buffer;
35
+ prompt: string;
36
+ }): Promise<string>;
37
+ /**
38
+ * Document processing using Mistral's OCR API
39
+ * PDFs are uploaded via Files API first, then processed with OCR
40
+ */
41
+ document(optionsArg: {
42
+ systemMessage: string;
43
+ userMessage: string;
44
+ pdfDocuments: Uint8Array[];
45
+ messageHistory: ChatMessage[];
46
+ }): Promise<{
47
+ message: any;
48
+ }>;
49
+ /**
50
+ * Research is not natively supported by Mistral
51
+ */
52
+ research(optionsArg: ResearchOptions): Promise<ResearchResponse>;
53
+ /**
54
+ * Image generation is not supported by Mistral
55
+ */
56
+ imageGenerate(optionsArg: ImageGenerateOptions): Promise<ImageResponse>;
57
+ /**
58
+ * Image editing is not supported by Mistral
59
+ */
60
+ imageEdit(optionsArg: ImageEditOptions): Promise<ImageResponse>;
61
+ }
@@ -0,0 +1,288 @@
1
+ import * as plugins from './plugins.js';
2
+ import { MultiModalModel } from './abstract.classes.multimodal.js';
3
+ export class MistralProvider extends MultiModalModel {
4
+ constructor(optionsArg) {
5
+ super();
6
+ this.options = optionsArg;
7
+ }
8
+ async start() {
9
+ await super.start();
10
+ this.mistralClient = new plugins.mistralai.Mistral({
11
+ apiKey: this.options.mistralToken,
12
+ });
13
+ }
14
+ async stop() {
15
+ await super.stop();
16
+ }
17
+ /**
18
+ * Synchronous chat interaction using Mistral's chat API
19
+ */
20
+ async chat(optionsArg) {
21
+ // Convert message history to Mistral format
22
+ const messages = [];
23
+ // Add system message first
24
+ if (optionsArg.systemMessage) {
25
+ messages.push({
26
+ role: 'system',
27
+ content: optionsArg.systemMessage
28
+ });
29
+ }
30
+ // Add message history
31
+ for (const msg of optionsArg.messageHistory) {
32
+ messages.push({
33
+ role: msg.role === 'system' ? 'system' : msg.role === 'assistant' ? 'assistant' : 'user',
34
+ content: msg.content
35
+ });
36
+ }
37
+ // Add current user message
38
+ messages.push({
39
+ role: 'user',
40
+ content: optionsArg.userMessage
41
+ });
42
+ const result = await this.mistralClient.chat.complete({
43
+ model: this.options.chatModel || 'mistral-large-latest',
44
+ messages: messages,
45
+ });
46
+ // Extract content from response
47
+ const choice = result.choices?.[0];
48
+ let content = '';
49
+ if (choice?.message?.content) {
50
+ if (typeof choice.message.content === 'string') {
51
+ content = choice.message.content;
52
+ }
53
+ else if (Array.isArray(choice.message.content)) {
54
+ // Handle array of content chunks
55
+ content = choice.message.content
56
+ .map((chunk) => {
57
+ if (typeof chunk === 'string')
58
+ return chunk;
59
+ if (chunk && typeof chunk === 'object' && 'text' in chunk)
60
+ return chunk.text;
61
+ return '';
62
+ })
63
+ .join('');
64
+ }
65
+ }
66
+ return {
67
+ role: 'assistant',
68
+ message: content,
69
+ };
70
+ }
71
+ /**
72
+ * Streaming chat using Mistral's streaming API
73
+ */
74
+ async chatStream(input) {
75
+ const decoder = new TextDecoder();
76
+ let buffer = '';
77
+ const mistralClient = this.mistralClient;
78
+ const chatModel = this.options.chatModel || 'mistral-large-latest';
79
+ const transform = new TransformStream({
80
+ async transform(chunk, controller) {
81
+ buffer += decoder.decode(chunk, { stream: true });
82
+ // Try to parse complete JSON messages from the buffer
83
+ while (true) {
84
+ const newlineIndex = buffer.indexOf('\n');
85
+ if (newlineIndex === -1)
86
+ break;
87
+ const line = buffer.slice(0, newlineIndex);
88
+ buffer = buffer.slice(newlineIndex + 1);
89
+ if (line.trim()) {
90
+ try {
91
+ const message = JSON.parse(line);
92
+ // Build messages array
93
+ const messages = [];
94
+ if (message.systemMessage) {
95
+ messages.push({
96
+ role: 'system',
97
+ content: message.systemMessage
98
+ });
99
+ }
100
+ messages.push({
101
+ role: message.role === 'assistant' ? 'assistant' : 'user',
102
+ content: message.content
103
+ });
104
+ // Use Mistral streaming
105
+ const stream = await mistralClient.chat.stream({
106
+ model: chatModel,
107
+ messages: messages,
108
+ });
109
+ // Process streaming events
110
+ for await (const event of stream) {
111
+ const delta = event.data?.choices?.[0]?.delta;
112
+ if (delta?.content) {
113
+ if (typeof delta.content === 'string') {
114
+ controller.enqueue(delta.content);
115
+ }
116
+ else if (Array.isArray(delta.content)) {
117
+ for (const chunk of delta.content) {
118
+ if (typeof chunk === 'string') {
119
+ controller.enqueue(chunk);
120
+ }
121
+ else if (chunk && typeof chunk === 'object' && 'text' in chunk) {
122
+ controller.enqueue(chunk.text);
123
+ }
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+ catch (e) {
130
+ console.error('Failed to parse message:', e);
131
+ }
132
+ }
133
+ }
134
+ },
135
+ flush(controller) {
136
+ if (buffer.trim()) {
137
+ try {
138
+ const message = JSON.parse(buffer);
139
+ controller.enqueue(message.content || '');
140
+ }
141
+ catch (e) {
142
+ console.error('Failed to parse remaining buffer:', e);
143
+ }
144
+ }
145
+ }
146
+ });
147
+ return input.pipeThrough(transform);
148
+ }
149
+ /**
150
+ * Audio generation is not supported by Mistral
151
+ */
152
+ async audio(optionsArg) {
153
+ throw new Error('Audio generation is not supported by Mistral. Please use ElevenLabs or OpenAI provider for audio generation.');
154
+ }
155
+ /**
156
+ * Vision using Mistral's OCR API for image analysis
157
+ */
158
+ async vision(optionsArg) {
159
+ const base64Image = optionsArg.image.toString('base64');
160
+ // Detect image type from buffer header
161
+ let mimeType = 'image/jpeg';
162
+ if (optionsArg.image[0] === 0x89 && optionsArg.image[1] === 0x50) {
163
+ mimeType = 'image/png';
164
+ }
165
+ else if (optionsArg.image[0] === 0x47 && optionsArg.image[1] === 0x49) {
166
+ mimeType = 'image/gif';
167
+ }
168
+ else if (optionsArg.image[0] === 0x52 && optionsArg.image[1] === 0x49) {
169
+ mimeType = 'image/webp';
170
+ }
171
+ // Use OCR API with image data URL
172
+ const ocrResult = await this.mistralClient.ocr.process({
173
+ model: this.options.ocrModel || 'mistral-ocr-latest',
174
+ document: {
175
+ imageUrl: `data:${mimeType};base64,${base64Image}`,
176
+ type: 'image_url',
177
+ },
178
+ });
179
+ // Combine markdown from all pages
180
+ const extractedText = ocrResult.pages.map(page => page.markdown).join('\n\n');
181
+ // If a prompt is provided, use chat to analyze the extracted text
182
+ if (optionsArg.prompt && optionsArg.prompt.trim()) {
183
+ const chatResponse = await this.chat({
184
+ systemMessage: 'You are an assistant analyzing image content. The following is text extracted from an image using OCR.',
185
+ userMessage: `${optionsArg.prompt}\n\nExtracted content:\n${extractedText}`,
186
+ messageHistory: [],
187
+ });
188
+ return chatResponse.message;
189
+ }
190
+ return extractedText;
191
+ }
192
+ /**
193
+ * Document processing using Mistral's OCR API
194
+ * PDFs are uploaded via Files API first, then processed with OCR
195
+ */
196
+ async document(optionsArg) {
197
+ const extractedTexts = [];
198
+ const uploadedFileIds = [];
199
+ try {
200
+ // Process each PDF document using Mistral OCR
201
+ for (let i = 0; i < optionsArg.pdfDocuments.length; i++) {
202
+ const pdfDocument = optionsArg.pdfDocuments[i];
203
+ // Upload the PDF to Mistral's Files API first
204
+ const uploadResult = await this.mistralClient.files.upload({
205
+ file: {
206
+ fileName: `document_${i + 1}.pdf`,
207
+ content: pdfDocument,
208
+ },
209
+ purpose: 'ocr',
210
+ });
211
+ uploadedFileIds.push(uploadResult.id);
212
+ // Now use OCR with the uploaded file
213
+ const ocrResult = await this.mistralClient.ocr.process({
214
+ model: this.options.ocrModel || 'mistral-ocr-latest',
215
+ document: {
216
+ type: 'file',
217
+ fileId: uploadResult.id,
218
+ },
219
+ tableFormat: this.options.tableFormat || 'markdown',
220
+ });
221
+ // Combine all page markdown with page separators
222
+ const pageTexts = ocrResult.pages.map((page, index) => {
223
+ let pageContent = `--- Page ${index + 1} ---\n${page.markdown}`;
224
+ // Include tables if present
225
+ if (page.tables && page.tables.length > 0) {
226
+ pageContent += '\n\n**Tables:**\n' + page.tables.map((t) => t.markdown || t.html || '').join('\n');
227
+ }
228
+ // Include header/footer if present
229
+ if (page.header) {
230
+ pageContent = `Header: ${page.header}\n${pageContent}`;
231
+ }
232
+ if (page.footer) {
233
+ pageContent += `\nFooter: ${page.footer}`;
234
+ }
235
+ return pageContent;
236
+ }).join('\n\n');
237
+ extractedTexts.push(pageTexts);
238
+ }
239
+ // Combine all document texts
240
+ const allDocumentText = extractedTexts.length === 1
241
+ ? extractedTexts[0]
242
+ : extractedTexts.map((text, i) => `=== Document ${i + 1} ===\n${text}`).join('\n\n');
243
+ // Use chat API to process the extracted text with the user's query
244
+ const chatResponse = await this.chat({
245
+ systemMessage: optionsArg.systemMessage || 'You are a helpful assistant analyzing document content.',
246
+ userMessage: `${optionsArg.userMessage}\n\n---\nDocument Content:\n${allDocumentText}`,
247
+ messageHistory: optionsArg.messageHistory,
248
+ });
249
+ return {
250
+ message: {
251
+ role: 'assistant',
252
+ content: chatResponse.message
253
+ }
254
+ };
255
+ }
256
+ finally {
257
+ // Clean up uploaded files
258
+ for (const fileId of uploadedFileIds) {
259
+ try {
260
+ await this.mistralClient.files.delete({ fileId });
261
+ }
262
+ catch (cleanupError) {
263
+ // Ignore cleanup errors - files may have already been auto-deleted
264
+ console.warn(`Failed to delete temporary file ${fileId}:`, cleanupError);
265
+ }
266
+ }
267
+ }
268
+ }
269
+ /**
270
+ * Research is not natively supported by Mistral
271
+ */
272
+ async research(optionsArg) {
273
+ throw new Error('Research/web search is not supported by Mistral. Please use Perplexity or Anthropic provider for research capabilities.');
274
+ }
275
+ /**
276
+ * Image generation is not supported by Mistral
277
+ */
278
+ async imageGenerate(optionsArg) {
279
+ throw new Error('Image generation is not supported by Mistral. Please use OpenAI provider for image generation.');
280
+ }
281
+ /**
282
+ * Image editing is not supported by Mistral
283
+ */
284
+ async imageEdit(optionsArg) {
285
+ throw new Error('Image editing is not supported by Mistral. Please use OpenAI provider for image editing.');
286
+ }
287
+ }
288
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIubWlzdHJhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3Byb3ZpZGVyLm1pc3RyYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBbUJuRSxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxlQUFlO0lBSWxELFlBQVksVUFBbUM7UUFDN0MsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztJQUM1QixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFDakQsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWTtTQUNsQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDUixNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQXVCO1FBQ3ZDLDRDQUE0QztRQUM1QyxNQUFNLFFBQVEsR0FHVCxFQUFFLENBQUM7UUFFUiwyQkFBMkI7UUFDM0IsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0IsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDWixJQUFJLEVBQUUsUUFBUTtnQkFDZCxPQUFPLEVBQUUsVUFBVSxDQUFDLGFBQWE7YUFDbEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixLQUFLLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM1QyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUNaLElB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@push.rocks/smartai",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "private": false,
5
5
  "description": "SmartAi is a versatile TypeScript library designed to facilitate integration and interaction with various AI models, offering functionalities for chat, audio generation, document processing, and vision tasks.",
6
6
  "main": "dist_ts/index.js",
@@ -25,6 +25,7 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "@anthropic-ai/sdk": "^0.71.2",
28
+ "@mistralai/mistralai": "^1.11.0",
28
29
  "@push.rocks/smartarray": "^1.1.0",
29
30
  "@push.rocks/smartfile": "^11.2.7",
30
31
  "@push.rocks/smartpath": "^6.0.0",
package/readme.hints.md CHANGED
@@ -5,6 +5,7 @@
5
5
  - Uses `@git.zone/tstest` v3.x for testing (import from `@git.zone/tstest/tapbundle`)
6
6
  - `@push.rocks/smartfile` is kept at v11 to avoid migration to factory pattern
7
7
  - `@anthropic-ai/sdk` v0.71.x with extended thinking support
8
+ - `@mistralai/mistralai` v1.x for Mistral OCR and chat capabilities
8
9
  - `@push.rocks/smartrequest` v5.x - uses `response.stream()` + `Readable.fromWeb()` for streaming
9
10
 
10
11
  ## Important Notes
@@ -12,6 +13,68 @@
12
13
  - When extended thinking is enabled, temperature parameter must NOT be set (or set to 1)
13
14
  - The `streamNode()` method was removed in smartrequest v5, use `response.stream()` with `Readable.fromWeb()` instead
14
15
 
16
+ ## Mistral Provider Integration
17
+
18
+ ### Overview
19
+
20
+ The Mistral provider supports:
21
+ - **Document AI** via Mistral OCR 3 (December 2025) - native PDF processing without image conversion
22
+ - **Chat capabilities** using Mistral's chat models (`mistral-large-latest`, etc.)
23
+
24
+ ### Key Advantage: Native PDF Support
25
+
26
+ Unlike other providers that require converting PDFs to images (using SmartPdf), Mistral OCR natively accepts PDF documents as base64-encoded data. This makes document processing potentially faster and more accurate for text extraction.
27
+
28
+ ### Configuration
29
+
30
+ ```typescript
31
+ import * as smartai from '@push.rocks/smartai';
32
+
33
+ const provider = new smartai.MistralProvider({
34
+ mistralToken: 'your-token-here',
35
+ chatModel: 'mistral-large-latest', // default
36
+ ocrModel: 'mistral-ocr-latest', // default
37
+ tableFormat: 'markdown', // 'markdown' or 'html'
38
+ });
39
+
40
+ await provider.start();
41
+ ```
42
+
43
+ ### Supported Methods
44
+
45
+ | Method | Support | Notes |
46
+ |--------|---------|-------|
47
+ | `chat()` | ✅ | Standard chat completion |
48
+ | `chatStream()` | ✅ | Streaming chat responses |
49
+ | `document()` | ✅ | Native PDF OCR - no image conversion needed |
50
+ | `vision()` | ✅ | Image OCR with optional chat analysis |
51
+ | `audio()` | ❌ | Not supported - use ElevenLabs |
52
+ | `research()` | ❌ | Not supported - use Perplexity |
53
+ | `imageGenerate()` | ❌ | Not supported - use OpenAI |
54
+ | `imageEdit()` | ❌ | Not supported - use OpenAI |
55
+
56
+ ### Document Processing
57
+
58
+ The `document()` method uses Mistral OCR to extract text from PDFs, then uses Mistral chat to process the user's query with the extracted content.
59
+
60
+ ```typescript
61
+ const result = await provider.document({
62
+ systemMessage: 'You are a document analyst.',
63
+ userMessage: 'Summarize this document.',
64
+ pdfDocuments: [pdfBuffer],
65
+ messageHistory: [],
66
+ });
67
+ ```
68
+
69
+ ### API Key
70
+
71
+ Tests require `MISTRAL_API_KEY` in `.nogit/env.json`.
72
+
73
+ ### Pricing (as of December 2025)
74
+
75
+ - OCR: $2 per 1,000 pages ($1 with Batch API)
76
+ - Chat: Varies by model (see Mistral pricing page)
77
+
15
78
  ## Anthropic Extended Thinking Feature
16
79
 
17
80
  ### Overview
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartai',
6
- version: '0.9.0',
6
+ version: '0.10.0',
7
7
  description: 'SmartAi is a versatile TypeScript library designed to facilitate integration and interaction with various AI models, offering functionalities for chat, audio generation, document processing, and vision tasks.'
8
8
  }
@@ -84,6 +84,18 @@ export class Conversation {
84
84
  return conversation;
85
85
  }
86
86
 
87
+ public static async createWithMistral(smartaiRefArg: SmartAi) {
88
+ if (!smartaiRefArg.mistralProvider) {
89
+ throw new Error('Mistral provider not available');
90
+ }
91
+ const conversation = new Conversation(smartaiRefArg, {
92
+ processFunction: async (input) => {
93
+ return '' // TODO implement proper streaming
94
+ }
95
+ });
96
+ return conversation;
97
+ }
98
+
87
99
  public static async createWithXai(smartaiRefArg: SmartAi) {
88
100
  if (!smartaiRefArg.xaiProvider) {
89
101
  throw new Error('XAI provider not available');
@@ -2,6 +2,7 @@ import { Conversation } from './classes.conversation.js';
2
2
  import * as plugins from './plugins.js';
3
3
  import { AnthropicProvider } from './provider.anthropic.js';
4
4
  import { ElevenLabsProvider } from './provider.elevenlabs.js';
5
+ import { MistralProvider } from './provider.mistral.js';
5
6
  import { OllamaProvider } from './provider.ollama.js';
6
7
  import { OpenAiProvider } from './provider.openai.js';
7
8
  import { PerplexityProvider } from './provider.perplexity.js';
@@ -15,12 +16,18 @@ export interface ISmartAiOptions {
15
16
  anthropicToken?: string;
16
17
  perplexityToken?: string;
17
18
  groqToken?: string;
19
+ mistralToken?: string;
18
20
  xaiToken?: string;
19
21
  elevenlabsToken?: string;
20
22
  exo?: {
21
23
  baseUrl?: string;
22
24
  apiKey?: string;
23
25
  };
26
+ mistral?: {
27
+ chatModel?: string;
28
+ ocrModel?: string;
29
+ tableFormat?: 'markdown' | 'html';
30
+ };
24
31
  ollama?: {
25
32
  baseUrl?: string;
26
33
  model?: string;
@@ -32,7 +39,7 @@ export interface ISmartAiOptions {
32
39
  };
33
40
  }
34
41
 
35
- export type TProvider = 'openai' | 'anthropic' | 'perplexity' | 'ollama' | 'exo' | 'groq' | 'xai' | 'elevenlabs';
42
+ export type TProvider = 'openai' | 'anthropic' | 'perplexity' | 'ollama' | 'exo' | 'groq' | 'mistral' | 'xai' | 'elevenlabs';
36
43
 
37
44
  export class SmartAi {
38
45
  public options: ISmartAiOptions;
@@ -43,6 +50,7 @@ export class SmartAi {
43
50
  public ollamaProvider: OllamaProvider;
44
51
  public exoProvider: ExoProvider;
45
52
  public groqProvider: GroqProvider;
53
+ public mistralProvider: MistralProvider;
46
54
  public xaiProvider: XAIProvider;
47
55
  public elevenlabsProvider: ElevenLabsProvider;
48
56
 
@@ -75,6 +83,15 @@ export class SmartAi {
75
83
  });
76
84
  await this.groqProvider.start();
77
85
  }
86
+ if (this.options.mistralToken) {
87
+ this.mistralProvider = new MistralProvider({
88
+ mistralToken: this.options.mistralToken,
89
+ chatModel: this.options.mistral?.chatModel,
90
+ ocrModel: this.options.mistral?.ocrModel,
91
+ tableFormat: this.options.mistral?.tableFormat,
92
+ });
93
+ await this.mistralProvider.start();
94
+ }
78
95
  if (this.options.xaiToken) {
79
96
  this.xaiProvider = new XAIProvider({
80
97
  xaiToken: this.options.xaiToken,
@@ -119,6 +136,9 @@ export class SmartAi {
119
136
  if (this.groqProvider) {
120
137
  await this.groqProvider.stop();
121
138
  }
139
+ if (this.mistralProvider) {
140
+ await this.mistralProvider.stop();
141
+ }
122
142
  if (this.xaiProvider) {
123
143
  await this.xaiProvider.stop();
124
144
  }
@@ -150,6 +170,8 @@ export class SmartAi {
150
170
  return Conversation.createWithOllama(this);
151
171
  case 'groq':
152
172
  return Conversation.createWithGroq(this);
173
+ case 'mistral':
174
+ return Conversation.createWithMistral(this);
153
175
  case 'xai':
154
176
  return Conversation.createWithXai(this);
155
177
  case 'elevenlabs':
package/ts/index.ts CHANGED
@@ -4,6 +4,7 @@ export * from './provider.openai.js';
4
4
  export * from './provider.anthropic.js';
5
5
  export * from './provider.perplexity.js';
6
6
  export * from './provider.groq.js';
7
+ export * from './provider.mistral.js';
7
8
  export * from './provider.ollama.js';
8
9
  export * from './provider.xai.js';
9
10
  export * from './provider.exo.js';
package/ts/plugins.ts CHANGED
@@ -28,9 +28,11 @@ export {
28
28
 
29
29
  // third party
30
30
  import * as anthropic from '@anthropic-ai/sdk';
31
+ import * as mistralai from '@mistralai/mistralai';
31
32
  import * as openai from 'openai';
32
33
 
33
34
  export {
34
35
  anthropic,
36
+ mistralai,
35
37
  openai,
36
38
  }
@@ -0,0 +1,352 @@
1
+ import * as plugins from './plugins.js';
2
+ import { MultiModalModel } from './abstract.classes.multimodal.js';
3
+ import type {
4
+ ChatOptions,
5
+ ChatResponse,
6
+ ChatMessage,
7
+ ResearchOptions,
8
+ ResearchResponse,
9
+ ImageGenerateOptions,
10
+ ImageEditOptions,
11
+ ImageResponse
12
+ } from './abstract.classes.multimodal.js';
13
+
14
+ export interface IMistralProviderOptions {
15
+ mistralToken: string;
16
+ chatModel?: string; // default: 'mistral-large-latest'
17
+ ocrModel?: string; // default: 'mistral-ocr-latest'
18
+ tableFormat?: 'markdown' | 'html';
19
+ }
20
+
21
+ export class MistralProvider extends MultiModalModel {
22
+ private options: IMistralProviderOptions;
23
+ public mistralClient: plugins.mistralai.Mistral;
24
+
25
+ constructor(optionsArg: IMistralProviderOptions) {
26
+ super();
27
+ this.options = optionsArg;
28
+ }
29
+
30
+ async start() {
31
+ await super.start();
32
+ this.mistralClient = new plugins.mistralai.Mistral({
33
+ apiKey: this.options.mistralToken,
34
+ });
35
+ }
36
+
37
+ async stop() {
38
+ await super.stop();
39
+ }
40
+
41
+ /**
42
+ * Synchronous chat interaction using Mistral's chat API
43
+ */
44
+ public async chat(optionsArg: ChatOptions): Promise<ChatResponse> {
45
+ // Convert message history to Mistral format
46
+ const messages: Array<{
47
+ role: 'system' | 'user' | 'assistant';
48
+ content: string;
49
+ }> = [];
50
+
51
+ // Add system message first
52
+ if (optionsArg.systemMessage) {
53
+ messages.push({
54
+ role: 'system',
55
+ content: optionsArg.systemMessage
56
+ });
57
+ }
58
+
59
+ // Add message history
60
+ for (const msg of optionsArg.messageHistory) {
61
+ messages.push({
62
+ role: msg.role === 'system' ? 'system' : msg.role === 'assistant' ? 'assistant' : 'user',
63
+ content: msg.content
64
+ });
65
+ }
66
+
67
+ // Add current user message
68
+ messages.push({
69
+ role: 'user',
70
+ content: optionsArg.userMessage
71
+ });
72
+
73
+ const result = await this.mistralClient.chat.complete({
74
+ model: this.options.chatModel || 'mistral-large-latest',
75
+ messages: messages,
76
+ });
77
+
78
+ // Extract content from response
79
+ const choice = result.choices?.[0];
80
+ let content = '';
81
+
82
+ if (choice?.message?.content) {
83
+ if (typeof choice.message.content === 'string') {
84
+ content = choice.message.content;
85
+ } else if (Array.isArray(choice.message.content)) {
86
+ // Handle array of content chunks
87
+ content = choice.message.content
88
+ .map((chunk: any) => {
89
+ if (typeof chunk === 'string') return chunk;
90
+ if (chunk && typeof chunk === 'object' && 'text' in chunk) return chunk.text;
91
+ return '';
92
+ })
93
+ .join('');
94
+ }
95
+ }
96
+
97
+ return {
98
+ role: 'assistant',
99
+ message: content,
100
+ };
101
+ }
102
+
103
+ /**
104
+ * Streaming chat using Mistral's streaming API
105
+ */
106
+ public async chatStream(input: ReadableStream<Uint8Array>): Promise<ReadableStream<string>> {
107
+ const decoder = new TextDecoder();
108
+ let buffer = '';
109
+ const mistralClient = this.mistralClient;
110
+ const chatModel = this.options.chatModel || 'mistral-large-latest';
111
+
112
+ const transform = new TransformStream<Uint8Array, string>({
113
+ async transform(chunk, controller) {
114
+ buffer += decoder.decode(chunk, { stream: true });
115
+
116
+ // Try to parse complete JSON messages from the buffer
117
+ while (true) {
118
+ const newlineIndex = buffer.indexOf('\n');
119
+ if (newlineIndex === -1) break;
120
+
121
+ const line = buffer.slice(0, newlineIndex);
122
+ buffer = buffer.slice(newlineIndex + 1);
123
+
124
+ if (line.trim()) {
125
+ try {
126
+ const message = JSON.parse(line);
127
+
128
+ // Build messages array
129
+ const messages: Array<{
130
+ role: 'system' | 'user' | 'assistant';
131
+ content: string;
132
+ }> = [];
133
+
134
+ if (message.systemMessage) {
135
+ messages.push({
136
+ role: 'system',
137
+ content: message.systemMessage
138
+ });
139
+ }
140
+
141
+ messages.push({
142
+ role: message.role === 'assistant' ? 'assistant' : 'user',
143
+ content: message.content
144
+ });
145
+
146
+ // Use Mistral streaming
147
+ const stream = await mistralClient.chat.stream({
148
+ model: chatModel,
149
+ messages: messages,
150
+ });
151
+
152
+ // Process streaming events
153
+ for await (const event of stream) {
154
+ const delta = event.data?.choices?.[0]?.delta;
155
+ if (delta?.content) {
156
+ if (typeof delta.content === 'string') {
157
+ controller.enqueue(delta.content);
158
+ } else if (Array.isArray(delta.content)) {
159
+ for (const chunk of delta.content) {
160
+ if (typeof chunk === 'string') {
161
+ controller.enqueue(chunk);
162
+ } else if (chunk && typeof chunk === 'object' && 'text' in chunk) {
163
+ controller.enqueue((chunk as any).text);
164
+ }
165
+ }
166
+ }
167
+ }
168
+ }
169
+ } catch (e) {
170
+ console.error('Failed to parse message:', e);
171
+ }
172
+ }
173
+ }
174
+ },
175
+
176
+ flush(controller) {
177
+ if (buffer.trim()) {
178
+ try {
179
+ const message = JSON.parse(buffer);
180
+ controller.enqueue(message.content || '');
181
+ } catch (e) {
182
+ console.error('Failed to parse remaining buffer:', e);
183
+ }
184
+ }
185
+ }
186
+ });
187
+
188
+ return input.pipeThrough(transform);
189
+ }
190
+
191
+ /**
192
+ * Audio generation is not supported by Mistral
193
+ */
194
+ public async audio(optionsArg: { message: string }): Promise<NodeJS.ReadableStream> {
195
+ throw new Error('Audio generation is not supported by Mistral. Please use ElevenLabs or OpenAI provider for audio generation.');
196
+ }
197
+
198
+ /**
199
+ * Vision using Mistral's OCR API for image analysis
200
+ */
201
+ public async vision(optionsArg: { image: Buffer; prompt: string }): Promise<string> {
202
+ const base64Image = optionsArg.image.toString('base64');
203
+
204
+ // Detect image type from buffer header
205
+ let mimeType = 'image/jpeg';
206
+ if (optionsArg.image[0] === 0x89 && optionsArg.image[1] === 0x50) {
207
+ mimeType = 'image/png';
208
+ } else if (optionsArg.image[0] === 0x47 && optionsArg.image[1] === 0x49) {
209
+ mimeType = 'image/gif';
210
+ } else if (optionsArg.image[0] === 0x52 && optionsArg.image[1] === 0x49) {
211
+ mimeType = 'image/webp';
212
+ }
213
+
214
+ // Use OCR API with image data URL
215
+ const ocrResult = await this.mistralClient.ocr.process({
216
+ model: this.options.ocrModel || 'mistral-ocr-latest',
217
+ document: {
218
+ imageUrl: `data:${mimeType};base64,${base64Image}`,
219
+ type: 'image_url',
220
+ },
221
+ });
222
+
223
+ // Combine markdown from all pages
224
+ const extractedText = ocrResult.pages.map(page => page.markdown).join('\n\n');
225
+
226
+ // If a prompt is provided, use chat to analyze the extracted text
227
+ if (optionsArg.prompt && optionsArg.prompt.trim()) {
228
+ const chatResponse = await this.chat({
229
+ systemMessage: 'You are an assistant analyzing image content. The following is text extracted from an image using OCR.',
230
+ userMessage: `${optionsArg.prompt}\n\nExtracted content:\n${extractedText}`,
231
+ messageHistory: [],
232
+ });
233
+ return chatResponse.message;
234
+ }
235
+
236
+ return extractedText;
237
+ }
238
+
239
+ /**
240
+ * Document processing using Mistral's OCR API
241
+ * PDFs are uploaded via Files API first, then processed with OCR
242
+ */
243
+ public async document(optionsArg: {
244
+ systemMessage: string;
245
+ userMessage: string;
246
+ pdfDocuments: Uint8Array[];
247
+ messageHistory: ChatMessage[];
248
+ }): Promise<{ message: any }> {
249
+ const extractedTexts: string[] = [];
250
+ const uploadedFileIds: string[] = [];
251
+
252
+ try {
253
+ // Process each PDF document using Mistral OCR
254
+ for (let i = 0; i < optionsArg.pdfDocuments.length; i++) {
255
+ const pdfDocument = optionsArg.pdfDocuments[i];
256
+
257
+ // Upload the PDF to Mistral's Files API first
258
+ const uploadResult = await this.mistralClient.files.upload({
259
+ file: {
260
+ fileName: `document_${i + 1}.pdf`,
261
+ content: pdfDocument,
262
+ },
263
+ purpose: 'ocr',
264
+ });
265
+
266
+ uploadedFileIds.push(uploadResult.id);
267
+
268
+ // Now use OCR with the uploaded file
269
+ const ocrResult = await this.mistralClient.ocr.process({
270
+ model: this.options.ocrModel || 'mistral-ocr-latest',
271
+ document: {
272
+ type: 'file',
273
+ fileId: uploadResult.id,
274
+ },
275
+ tableFormat: this.options.tableFormat || 'markdown',
276
+ });
277
+
278
+ // Combine all page markdown with page separators
279
+ const pageTexts = ocrResult.pages.map((page, index) => {
280
+ let pageContent = `--- Page ${index + 1} ---\n${page.markdown}`;
281
+
282
+ // Include tables if present
283
+ if (page.tables && page.tables.length > 0) {
284
+ pageContent += '\n\n**Tables:**\n' + page.tables.map((t: any) => t.markdown || t.html || '').join('\n');
285
+ }
286
+
287
+ // Include header/footer if present
288
+ if (page.header) {
289
+ pageContent = `Header: ${page.header}\n${pageContent}`;
290
+ }
291
+ if (page.footer) {
292
+ pageContent += `\nFooter: ${page.footer}`;
293
+ }
294
+
295
+ return pageContent;
296
+ }).join('\n\n');
297
+
298
+ extractedTexts.push(pageTexts);
299
+ }
300
+
301
+ // Combine all document texts
302
+ const allDocumentText = extractedTexts.length === 1
303
+ ? extractedTexts[0]
304
+ : extractedTexts.map((text, i) => `=== Document ${i + 1} ===\n${text}`).join('\n\n');
305
+
306
+ // Use chat API to process the extracted text with the user's query
307
+ const chatResponse = await this.chat({
308
+ systemMessage: optionsArg.systemMessage || 'You are a helpful assistant analyzing document content.',
309
+ userMessage: `${optionsArg.userMessage}\n\n---\nDocument Content:\n${allDocumentText}`,
310
+ messageHistory: optionsArg.messageHistory,
311
+ });
312
+
313
+ return {
314
+ message: {
315
+ role: 'assistant',
316
+ content: chatResponse.message
317
+ }
318
+ };
319
+ } finally {
320
+ // Clean up uploaded files
321
+ for (const fileId of uploadedFileIds) {
322
+ try {
323
+ await this.mistralClient.files.delete({ fileId });
324
+ } catch (cleanupError) {
325
+ // Ignore cleanup errors - files may have already been auto-deleted
326
+ console.warn(`Failed to delete temporary file ${fileId}:`, cleanupError);
327
+ }
328
+ }
329
+ }
330
+ }
331
+
332
+ /**
333
+ * Research is not natively supported by Mistral
334
+ */
335
+ public async research(optionsArg: ResearchOptions): Promise<ResearchResponse> {
336
+ throw new Error('Research/web search is not supported by Mistral. Please use Perplexity or Anthropic provider for research capabilities.');
337
+ }
338
+
339
+ /**
340
+ * Image generation is not supported by Mistral
341
+ */
342
+ public async imageGenerate(optionsArg: ImageGenerateOptions): Promise<ImageResponse> {
343
+ throw new Error('Image generation is not supported by Mistral. Please use OpenAI provider for image generation.');
344
+ }
345
+
346
+ /**
347
+ * Image editing is not supported by Mistral
348
+ */
349
+ public async imageEdit(optionsArg: ImageEditOptions): Promise<ImageResponse> {
350
+ throw new Error('Image editing is not supported by Mistral. Please use OpenAI provider for image editing.');
351
+ }
352
+ }