@push.rocks/smartai 0.13.3 → 2.0.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.
Files changed (98) hide show
  1. package/dist_ts/00_commitinfo_data.js +3 -3
  2. package/dist_ts/index.d.ts +6 -11
  3. package/dist_ts/index.js +6 -12
  4. package/dist_ts/plugins.d.ts +10 -15
  5. package/dist_ts/plugins.js +13 -19
  6. package/dist_ts/smartai.classes.smartai.d.ts +7 -0
  7. package/dist_ts/smartai.classes.smartai.js +51 -0
  8. package/dist_ts/smartai.interfaces.d.ts +41 -0
  9. package/dist_ts/smartai.interfaces.js +2 -0
  10. package/dist_ts/smartai.middleware.anthropic.d.ts +7 -0
  11. package/dist_ts/smartai.middleware.anthropic.js +36 -0
  12. package/dist_ts/smartai.provider.ollama.d.ts +8 -0
  13. package/dist_ts/smartai.provider.ollama.js +378 -0
  14. package/dist_ts_audio/index.d.ts +9 -0
  15. package/dist_ts_audio/index.js +15 -0
  16. package/dist_ts_audio/plugins.d.ts +2 -0
  17. package/dist_ts_audio/plugins.js +3 -0
  18. package/dist_ts_document/index.d.ts +11 -0
  19. package/dist_ts_document/index.js +45 -0
  20. package/dist_ts_document/plugins.d.ts +3 -0
  21. package/dist_ts_document/plugins.js +4 -0
  22. package/dist_ts_image/index.d.ts +46 -0
  23. package/dist_ts_image/index.js +110 -0
  24. package/dist_ts_image/plugins.d.ts +3 -0
  25. package/dist_ts_image/plugins.js +4 -0
  26. package/dist_ts_research/index.d.ts +19 -0
  27. package/dist_ts_research/index.js +98 -0
  28. package/dist_ts_research/plugins.d.ts +2 -0
  29. package/dist_ts_research/plugins.js +3 -0
  30. package/dist_ts_vision/index.d.ts +8 -0
  31. package/dist_ts_vision/index.js +21 -0
  32. package/dist_ts_vision/plugins.d.ts +2 -0
  33. package/dist_ts_vision/plugins.js +3 -0
  34. package/package.json +50 -22
  35. package/readme.hints.md +34 -88
  36. package/readme.md +284 -547
  37. package/ts/00_commitinfo_data.ts +2 -2
  38. package/ts/index.ts +8 -11
  39. package/ts/plugins.ts +19 -35
  40. package/ts/smartai.classes.smartai.ts +51 -0
  41. package/ts/smartai.interfaces.ts +53 -0
  42. package/ts/smartai.middleware.anthropic.ts +38 -0
  43. package/ts/smartai.provider.ollama.ts +426 -0
  44. package/ts_audio/index.ts +24 -0
  45. package/ts_audio/plugins.ts +2 -0
  46. package/ts_document/index.ts +61 -0
  47. package/ts_document/plugins.ts +3 -0
  48. package/ts_image/index.ts +147 -0
  49. package/ts_image/plugins.ts +3 -0
  50. package/ts_research/index.ts +120 -0
  51. package/ts_research/plugins.ts +2 -0
  52. package/ts_vision/index.ts +29 -0
  53. package/ts_vision/plugins.ts +2 -0
  54. package/dist_ts/abstract.classes.multimodal.d.ts +0 -212
  55. package/dist_ts/abstract.classes.multimodal.js +0 -43
  56. package/dist_ts/classes.conversation.d.ts +0 -31
  57. package/dist_ts/classes.conversation.js +0 -150
  58. package/dist_ts/classes.smartai.d.ts +0 -59
  59. package/dist_ts/classes.smartai.js +0 -139
  60. package/dist_ts/classes.tts.d.ts +0 -6
  61. package/dist_ts/classes.tts.js +0 -10
  62. package/dist_ts/interfaces.d.ts +0 -1
  63. package/dist_ts/interfaces.js +0 -2
  64. package/dist_ts/paths.d.ts +0 -2
  65. package/dist_ts/paths.js +0 -4
  66. package/dist_ts/provider.anthropic.d.ts +0 -48
  67. package/dist_ts/provider.anthropic.js +0 -369
  68. package/dist_ts/provider.elevenlabs.d.ts +0 -43
  69. package/dist_ts/provider.elevenlabs.js +0 -64
  70. package/dist_ts/provider.exo.d.ts +0 -40
  71. package/dist_ts/provider.exo.js +0 -116
  72. package/dist_ts/provider.groq.d.ts +0 -39
  73. package/dist_ts/provider.groq.js +0 -178
  74. package/dist_ts/provider.mistral.d.ts +0 -61
  75. package/dist_ts/provider.mistral.js +0 -288
  76. package/dist_ts/provider.ollama.d.ts +0 -141
  77. package/dist_ts/provider.ollama.js +0 -529
  78. package/dist_ts/provider.openai.d.ts +0 -62
  79. package/dist_ts/provider.openai.js +0 -403
  80. package/dist_ts/provider.perplexity.d.ts +0 -37
  81. package/dist_ts/provider.perplexity.js +0 -215
  82. package/dist_ts/provider.xai.d.ts +0 -52
  83. package/dist_ts/provider.xai.js +0 -160
  84. package/ts/abstract.classes.multimodal.ts +0 -240
  85. package/ts/classes.conversation.ts +0 -176
  86. package/ts/classes.smartai.ts +0 -187
  87. package/ts/classes.tts.ts +0 -15
  88. package/ts/interfaces.ts +0 -0
  89. package/ts/paths.ts +0 -4
  90. package/ts/provider.anthropic.ts +0 -446
  91. package/ts/provider.elevenlabs.ts +0 -116
  92. package/ts/provider.exo.ts +0 -155
  93. package/ts/provider.groq.ts +0 -219
  94. package/ts/provider.mistral.ts +0 -352
  95. package/ts/provider.ollama.ts +0 -705
  96. package/ts/provider.openai.ts +0 -462
  97. package/ts/provider.perplexity.ts +0 -259
  98. package/ts/provider.xai.ts +0 -214
@@ -0,0 +1,110 @@
1
+ import * as plugins from './plugins.js';
2
+ export async function generateImage(options) {
3
+ const client = new plugins.OpenAI({ apiKey: options.apiKey });
4
+ const model = options.model || 'gpt-image-1';
5
+ const requestParams = {
6
+ model,
7
+ prompt: options.prompt,
8
+ n: options.n || 1,
9
+ };
10
+ if (model === 'gpt-image-1') {
11
+ if (options.quality)
12
+ requestParams.quality = options.quality;
13
+ if (options.size)
14
+ requestParams.size = options.size;
15
+ if (options.background)
16
+ requestParams.background = options.background;
17
+ if (options.outputFormat)
18
+ requestParams.output_format = options.outputFormat;
19
+ if (options.outputCompression !== undefined)
20
+ requestParams.output_compression = options.outputCompression;
21
+ if (options.moderation)
22
+ requestParams.moderation = options.moderation;
23
+ if (options.stream !== undefined)
24
+ requestParams.stream = options.stream;
25
+ if (options.partialImages !== undefined)
26
+ requestParams.partial_images = options.partialImages;
27
+ }
28
+ else if (model === 'dall-e-3') {
29
+ if (options.quality)
30
+ requestParams.quality = options.quality;
31
+ if (options.size)
32
+ requestParams.size = options.size;
33
+ if (options.style)
34
+ requestParams.style = options.style;
35
+ requestParams.response_format = 'b64_json';
36
+ }
37
+ else if (model === 'dall-e-2') {
38
+ if (options.size)
39
+ requestParams.size = options.size;
40
+ requestParams.response_format = 'b64_json';
41
+ }
42
+ const result = await client.images.generate(requestParams);
43
+ const images = (result.data || []).map((img) => ({
44
+ b64_json: img.b64_json,
45
+ url: img.url,
46
+ revisedPrompt: img.revised_prompt,
47
+ }));
48
+ return {
49
+ images,
50
+ metadata: {
51
+ model,
52
+ quality: result.quality,
53
+ size: result.size,
54
+ outputFormat: result.output_format,
55
+ tokensUsed: result.usage?.total_tokens,
56
+ },
57
+ };
58
+ }
59
+ export async function editImage(options) {
60
+ const client = new plugins.OpenAI({ apiKey: options.apiKey });
61
+ const model = options.model || 'gpt-image-1';
62
+ const imageFile = await plugins.toFile(options.image, 'image.png', { type: 'image/png' });
63
+ const requestParams = {
64
+ model,
65
+ image: imageFile,
66
+ prompt: options.prompt,
67
+ n: options.n || 1,
68
+ };
69
+ if (options.mask) {
70
+ requestParams.mask = await plugins.toFile(options.mask, 'mask.png', { type: 'image/png' });
71
+ }
72
+ if (model === 'gpt-image-1') {
73
+ if (options.quality)
74
+ requestParams.quality = options.quality;
75
+ if (options.size)
76
+ requestParams.size = options.size;
77
+ if (options.background)
78
+ requestParams.background = options.background;
79
+ if (options.outputFormat)
80
+ requestParams.output_format = options.outputFormat;
81
+ if (options.outputCompression !== undefined)
82
+ requestParams.output_compression = options.outputCompression;
83
+ if (options.stream !== undefined)
84
+ requestParams.stream = options.stream;
85
+ if (options.partialImages !== undefined)
86
+ requestParams.partial_images = options.partialImages;
87
+ }
88
+ else if (model === 'dall-e-2') {
89
+ if (options.size)
90
+ requestParams.size = options.size;
91
+ requestParams.response_format = 'b64_json';
92
+ }
93
+ const result = await client.images.edit(requestParams);
94
+ const images = (result.data || []).map((img) => ({
95
+ b64_json: img.b64_json,
96
+ url: img.url,
97
+ revisedPrompt: img.revised_prompt,
98
+ }));
99
+ return {
100
+ images,
101
+ metadata: {
102
+ model,
103
+ quality: result.quality,
104
+ size: result.size,
105
+ outputFormat: result.output_format,
106
+ tokensUsed: result.usage?.total_tokens,
107
+ },
108
+ };
109
+ }
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19pbWFnZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQWlEeEMsTUFBTSxDQUFDLEtBQUssVUFBVSxhQUFhLENBQUMsT0FBOEI7SUFDaEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzlELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksYUFBYSxDQUFDO0lBRTdDLE1BQU0sYUFBYSxHQUE0QjtRQUM3QyxLQUFLO1FBQ0wsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQ3RCLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUM7S0FDbEIsQ0FBQztJQUVGLElBQUksS0FBSyxLQUFLLGFBQWEsRUFBRSxDQUFDO1FBQzVCLElBQUksT0FBTyxDQUFDLE9BQU87WUFBRSxhQUFhLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDN0QsSUFBSSxPQUFPLENBQUMsSUFBSTtZQUFFLGFBQWEsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUNwRCxJQUFJLE9BQU8sQ0FBQyxVQUFVO1lBQUUsYUFBYSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3RFLElBQUksT0FBTyxDQUFDLFlBQVk7WUFBRSxhQUFhLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFDN0UsSUFBSSxPQUFPLENBQUMsaUJBQWlCLEtBQUssU0FBUztZQUFFLGFBQWEsQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7UUFDMUcsSUFBSSxPQUFPLENBQUMsVUFBVTtZQUFFLGFBQWEsQ0FBQyxVQUFVLEdBQUcsT0FB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
@@ -0,0 +1,3 @@
1
+ import OpenAI from 'openai';
2
+ import { toFile } from 'openai';
3
+ export { OpenAI, toFile };
@@ -0,0 +1,4 @@
1
+ import OpenAI from 'openai';
2
+ import { toFile } from 'openai';
3
+ export { OpenAI, toFile };
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2ltYWdlL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyJ9
@@ -0,0 +1,19 @@
1
+ export interface IResearchOptions {
2
+ apiKey: string;
3
+ query: string;
4
+ searchDepth?: 'basic' | 'advanced' | 'deep';
5
+ maxSources?: number;
6
+ allowedDomains?: string[];
7
+ blockedDomains?: string[];
8
+ }
9
+ export interface IResearchResponse {
10
+ answer: string;
11
+ sources: Array<{
12
+ url: string;
13
+ title: string;
14
+ snippet: string;
15
+ }>;
16
+ searchQueries?: string[];
17
+ metadata?: Record<string, unknown>;
18
+ }
19
+ export declare function research(options: IResearchOptions): Promise<IResearchResponse>;
@@ -0,0 +1,98 @@
1
+ import * as plugins from './plugins.js';
2
+ export async function research(options) {
3
+ const client = new plugins.Anthropic({ apiKey: options.apiKey });
4
+ const systemMessage = `You are a research assistant with web search capabilities.
5
+ Provide comprehensive, well-researched answers with citations and sources.
6
+ When searching the web, be thorough and cite your sources accurately.`;
7
+ // Build web search tool config
8
+ const webSearchTool = {
9
+ type: 'web_search_20250305',
10
+ name: 'web_search',
11
+ };
12
+ if (options.maxSources) {
13
+ webSearchTool.max_uses = options.maxSources;
14
+ }
15
+ if (options.allowedDomains?.length) {
16
+ webSearchTool.allowed_domains = options.allowedDomains;
17
+ }
18
+ else if (options.blockedDomains?.length) {
19
+ webSearchTool.blocked_domains = options.blockedDomains;
20
+ }
21
+ const result = await client.messages.create({
22
+ model: 'claude-sonnet-4-5-20250929',
23
+ system: systemMessage,
24
+ messages: [
25
+ { role: 'user', content: options.query },
26
+ ],
27
+ max_tokens: 20000,
28
+ temperature: 0.7,
29
+ tools: [webSearchTool],
30
+ });
31
+ // Extract answer, sources, and search queries
32
+ let answer = '';
33
+ const sources = [];
34
+ const searchQueries = [];
35
+ for (const block of result.content) {
36
+ const b = block;
37
+ if ('text' in b) {
38
+ answer += b.text;
39
+ // Extract citations if present
40
+ if (b.citations && Array.isArray(b.citations)) {
41
+ for (const citation of b.citations) {
42
+ if (citation.type === 'web_search_result_location') {
43
+ sources.push({
44
+ title: citation.title || '',
45
+ url: citation.url || '',
46
+ snippet: citation.cited_text || '',
47
+ });
48
+ }
49
+ }
50
+ }
51
+ }
52
+ else if (b.type === 'server_tool_use') {
53
+ if (b.name === 'web_search' && b.input?.query) {
54
+ searchQueries.push(b.input.query);
55
+ }
56
+ }
57
+ else if (b.type === 'web_search_tool_result') {
58
+ if (Array.isArray(b.content)) {
59
+ for (const item of b.content) {
60
+ if (item.type === 'web_search_result') {
61
+ if (!sources.some(s => s.url === item.url)) {
62
+ sources.push({
63
+ title: item.title || '',
64
+ url: item.url || '',
65
+ snippet: '',
66
+ });
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
72
+ }
73
+ // Fallback: parse markdown links if no citations found
74
+ if (sources.length === 0) {
75
+ const urlRegex = /\[([^\]]+)\]\(([^)]+)\)/g;
76
+ let match;
77
+ while ((match = urlRegex.exec(answer)) !== null) {
78
+ sources.push({
79
+ title: match[1],
80
+ url: match[2],
81
+ snippet: '',
82
+ });
83
+ }
84
+ }
85
+ const usage = result.usage;
86
+ return {
87
+ answer,
88
+ sources,
89
+ searchQueries: searchQueries.length > 0 ? searchQueries : undefined,
90
+ metadata: {
91
+ model: 'claude-sonnet-4-5-20250929',
92
+ searchDepth: options.searchDepth || 'basic',
93
+ tokensUsed: usage?.output_tokens,
94
+ webSearchesPerformed: usage?.server_tool_use?.web_search_requests ?? 0,
95
+ },
96
+ };
97
+ }
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19yZXNlYXJjaC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQWtCeEMsTUFBTSxDQUFDLEtBQUssVUFBVSxRQUFRLENBQUMsT0FBeUI7SUFDdEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRWpFLE1BQU0sYUFBYSxHQUFHOztzRUFFOEMsQ0FBQztJQUVyRSwrQkFBK0I7SUFDL0IsTUFBTSxhQUFhLEdBQVE7UUFDekIsSUFBSSxFQUFFLHFCQUFxQjtRQUMzQixJQUFJLEVBQUUsWUFBWTtLQUNuQixDQUFDO0lBRUYsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkIsYUFBYSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO0lBQzlDLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDbkMsYUFBYSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO0lBQ3pELENBQUM7U0FBTSxJQUFJLE9BQU8sQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDMUMsYUFBYSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO0lBQ3pELENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQzFDLEtBQUssRUFBRSw0QkFBNEI7UUFDbkMsTUFBTSxFQUFFLGFBQWE7UUFDckIsUUFBUSxFQUFFO1lBQ1IsRUFBRSxJQUFJLEVBQUUsTUFBZSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFO1NBQ2xEO1FBQ0QsVUFBVSxFQUFFLEtBQUs7UUFD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
@@ -0,0 +1,2 @@
1
+ import Anthropic from '@anthropic-ai/sdk';
2
+ export { Anthropic };
@@ -0,0 +1,3 @@
1
+ import Anthropic from '@anthropic-ai/sdk';
2
+ export { Anthropic };
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX3Jlc2VhcmNoL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxTQUFTLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDIn0=
@@ -0,0 +1,8 @@
1
+ import type { LanguageModelV3 } from '@ai-sdk/provider';
2
+ export interface IVisionOptions {
3
+ model: LanguageModelV3;
4
+ image: Buffer | Uint8Array;
5
+ prompt: string;
6
+ mediaType?: 'image/jpeg' | 'image/png' | 'image/webp' | 'image/gif';
7
+ }
8
+ export declare function analyzeImage(options: IVisionOptions): Promise<string>;
@@ -0,0 +1,21 @@
1
+ import * as plugins from './plugins.js';
2
+ export async function analyzeImage(options) {
3
+ const result = await plugins.generateText({
4
+ model: options.model,
5
+ messages: [
6
+ {
7
+ role: 'user',
8
+ content: [
9
+ { type: 'text', text: options.prompt },
10
+ {
11
+ type: 'image',
12
+ image: options.image,
13
+ mediaType: options.mediaType ?? 'image/jpeg',
14
+ },
15
+ ],
16
+ },
17
+ ],
18
+ });
19
+ return result.text;
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c192aXNpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFVeEMsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQUMsT0FBdUI7SUFDeEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsWUFBWSxDQUFDO1FBQ3hDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxJQUFJLEVBQUUsTUFBTTtnQkFDWixPQUFPLEVBQUU7b0JBQ1AsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFO29CQUN0Qzt3QkFDRSxJQUFJLEVBQUUsT0FBTzt3QkFDYixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7d0JBQ3BCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxJQUFJLFlBQVk7cUJBQzdDO2lCQUNGO2FBQ0Y7U0FDRjtLQUNGLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztBQUNyQixDQUFDIn0=
@@ -0,0 +1,2 @@
1
+ import { generateText } from 'ai';
2
+ export { generateText };
@@ -0,0 +1,3 @@
1
+ import { generateText } from 'ai';
2
+ export { generateText };
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX3Zpc2lvbi9wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDbEMsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDIn0=
package/package.json CHANGED
@@ -1,39 +1,67 @@
1
1
  {
2
2
  "name": "@push.rocks/smartai",
3
- "version": "0.13.3",
3
+ "version": "2.0.0",
4
4
  "private": false,
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.",
5
+ "description": "Provider registry and capability utilities for ai-sdk (Vercel AI SDK). Core export returns LanguageModel; subpath exports provide vision, audio, image, document and research capabilities.",
6
6
  "main": "dist_ts/index.js",
7
7
  "typings": "dist_ts/index.d.ts",
8
8
  "type": "module",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist_ts/index.js",
12
+ "types": "./dist_ts/index.d.ts"
13
+ },
14
+ "./vision": {
15
+ "import": "./dist_ts_vision/index.js",
16
+ "types": "./dist_ts_vision/index.d.ts"
17
+ },
18
+ "./audio": {
19
+ "import": "./dist_ts_audio/index.js",
20
+ "types": "./dist_ts_audio/index.d.ts"
21
+ },
22
+ "./image": {
23
+ "import": "./dist_ts_image/index.js",
24
+ "types": "./dist_ts_image/index.d.ts"
25
+ },
26
+ "./document": {
27
+ "import": "./dist_ts_document/index.js",
28
+ "types": "./dist_ts_document/index.d.ts"
29
+ },
30
+ "./research": {
31
+ "import": "./dist_ts_research/index.js",
32
+ "types": "./dist_ts_research/index.d.ts"
33
+ }
34
+ },
9
35
  "author": "Task Venture Capital GmbH",
10
36
  "license": "MIT",
11
37
  "scripts": {
12
- "test": "(tstest test/ --web --verbose)",
38
+ "test": "(tstest test/ --verbose --logfile)",
13
39
  "typecheck": "tsbuild check",
14
40
  "build": "(tsbuild tsfolders --allowimplicitany)",
15
41
  "buildDocs": "(tsdoc)"
16
42
  },
17
43
  "devDependencies": {
18
- "@git.zone/tsbuild": "^4.1.2",
19
- "@git.zone/tsbundle": "^2.8.1",
44
+ "@git.zone/tsbuild": "^4.2.6",
45
+ "@git.zone/tsbundle": "^2.9.1",
20
46
  "@git.zone/tsrun": "^2.0.1",
21
- "@git.zone/tstest": "^3.1.6",
47
+ "@git.zone/tstest": "^3.2.0",
22
48
  "@push.rocks/qenv": "^6.1.3",
23
- "@types/node": "^25.0.9",
49
+ "@types/node": "^25.3.3",
24
50
  "typescript": "^5.9.3"
25
51
  },
26
52
  "dependencies": {
27
- "@anthropic-ai/sdk": "^0.71.2",
28
- "@mistralai/mistralai": "^1.12.0",
29
- "@push.rocks/smartarray": "^1.1.0",
30
- "@push.rocks/smartfs": "^1.3.1",
31
- "@push.rocks/smartpath": "^6.0.0",
32
- "@push.rocks/smartpdf": "^4.1.1",
33
- "@push.rocks/smartpromise": "^4.2.3",
34
- "@push.rocks/smartrequest": "^5.0.1",
35
- "@push.rocks/webstream": "^1.0.10",
36
- "openai": "^6.16.0"
53
+ "@ai-sdk/anthropic": "^3.0.58",
54
+ "@ai-sdk/google": "^3.0.43",
55
+ "@ai-sdk/groq": "^3.0.29",
56
+ "@ai-sdk/mistral": "^3.0.24",
57
+ "@ai-sdk/openai": "^3.0.41",
58
+ "@ai-sdk/perplexity": "^3.0.23",
59
+ "@ai-sdk/provider": "^3.0.8",
60
+ "@ai-sdk/xai": "^3.0.67",
61
+ "@anthropic-ai/sdk": "^0.78.0",
62
+ "@push.rocks/smartpdf": "^4.1.3",
63
+ "ai": "^6.0.116",
64
+ "openai": "^6.26.0"
37
65
  },
38
66
  "repository": {
39
67
  "type": "git",
@@ -48,13 +76,13 @@
48
76
  ],
49
77
  "files": [
50
78
  "ts/**/*",
51
- "ts_web/**/*",
52
- "dist/**/*",
79
+ "ts_vision/**/*",
80
+ "ts_audio/**/*",
81
+ "ts_image/**/*",
82
+ "ts_document/**/*",
83
+ "ts_research/**/*",
53
84
  "dist_*/**/*",
54
- "dist_ts/**/*",
55
- "dist_ts_web/**/*",
56
85
  "assets/**/*",
57
- "cli.js",
58
86
  "npmextra.json",
59
87
  "readme.md"
60
88
  ],
package/readme.hints.md CHANGED
@@ -1,104 +1,50 @@
1
1
  # SmartAI Project Hints
2
2
 
3
- ## Dependencies
4
-
5
- - Uses `@git.zone/tstest` v3.x for testing (import from `@git.zone/tstest/tapbundle`)
6
- - `@push.rocks/smartfs` v1.x for file system operations
7
- - `@anthropic-ai/sdk` v0.71.x with extended thinking support
8
- - `@mistralai/mistralai` v1.x for Mistral OCR and chat capabilities
9
- - `openai` v6.x for OpenAI API integration
10
- - `@push.rocks/smartrequest` v5.x - uses `response.stream()` + `Readable.fromWeb()` for streaming
11
-
12
- ## Important Notes
13
-
14
- - When extended thinking is enabled, temperature parameter must NOT be set (or set to 1)
15
- - The `streamNode()` method was removed in smartrequest v5, use `response.stream()` with `Readable.fromWeb()` instead
16
-
17
- ## Provider Capabilities Summary
18
-
19
- | Provider | Chat | Stream | TTS | Vision | Documents | Research | Images |
20
- |--------------|------|--------|-----|--------|-----------|----------|--------|
21
- | OpenAI | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
22
- | Anthropic | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ |
23
- | Mistral | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ |
24
- | ElevenLabs | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
25
- | Ollama | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ |
26
- | XAI | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ |
27
- | Perplexity | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ |
28
- | Groq | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
29
- | Exo | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
3
+ ## Architecture (v1.0.0 - Vercel AI SDK rewrite)
30
4
 
31
- ## Mistral Provider Integration
5
+ The package is a **provider registry** built on the Vercel AI SDK (`ai` v6). The core export returns a `LanguageModelV3` from `@ai-sdk/provider`. Specialized capabilities are in subpath exports.
32
6
 
33
- ### Overview
7
+ ### Core Entry (`ts/`)
8
+ - `getModel(options)` → returns `LanguageModelV3` for any supported provider
9
+ - Providers: anthropic, openai, google, groq, mistral, xai, perplexity, ollama
10
+ - Anthropic prompt caching via `wrapLanguageModel` middleware (enabled by default)
11
+ - Custom Ollama provider implementing `LanguageModelV3` directly (for think, num_ctx support)
34
12
 
35
- The Mistral provider supports:
36
- - **Document AI** via Mistral OCR (December 2025) - native PDF processing without image conversion
37
- - **Chat capabilities** using Mistral's chat models (`mistral-large-latest`, etc.)
38
-
39
- ### Key Advantage: Native PDF Support
40
-
41
- 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.
42
-
43
- ### Configuration
44
-
45
- ```typescript
46
- import * as smartai from '@push.rocks/smartai';
47
-
48
- const provider = new smartai.MistralProvider({
49
- mistralToken: 'your-token-here',
50
- chatModel: 'mistral-large-latest', // default
51
- ocrModel: 'mistral-ocr-latest', // default
52
- tableFormat: 'markdown', // 'markdown' or 'html'
53
- });
54
-
55
- await provider.start();
56
- ```
13
+ ### Subpath Exports
14
+ - `@push.rocks/smartai/vision` `analyzeImage()` using `generateText` with image content
15
+ - `@push.rocks/smartai/audio` `textToSpeech()` using OpenAI SDK directly
16
+ - `@push.rocks/smartai/image` — `generateImage()`, `editImage()` using OpenAI SDK directly
17
+ - `@push.rocks/smartai/document` `analyzeDocuments()` using SmartPdf + `generateText`
18
+ - `@push.rocks/smartai/research` — `research()` using `@anthropic-ai/sdk` web_search tool
57
19
 
58
- ### API Key
59
-
60
- Tests require `MISTRAL_API_KEY` in `.nogit/env.json`.
61
-
62
- ## Anthropic Extended Thinking Feature
63
-
64
- ### Configuration
65
-
66
- Extended thinking is configured at the provider level during instantiation:
67
-
68
- ```typescript
69
- import * as smartai from '@push.rocks/smartai';
20
+ ## Dependencies
70
21
 
71
- const provider = new smartai.AnthropicProvider({
72
- anthropicToken: 'your-token-here',
73
- extendedThinking: 'normal', // Options: 'quick' | 'normal' | 'deep' | 'off'
74
- });
75
- ```
22
+ - `ai` ^6.0.116 Vercel AI SDK core
23
+ - `@ai-sdk/*` — Provider packages (anthropic, openai, google, groq, mistral, xai, perplexity)
24
+ - `@ai-sdk/provider` ^3.0.8 LanguageModelV3 types
25
+ - `@anthropic-ai/sdk` ^0.78.0 — Direct SDK for research (web search tool)
26
+ - `openai` ^6.25.0 — Direct SDK for audio TTS and image generation/editing
27
+ - `@push.rocks/smartpdf` ^4.1.3 — PDF to PNG conversion for document analysis
76
28
 
77
- ### Thinking Modes
29
+ ## Build
78
30
 
79
- | Mode | Budget Tokens | Use Case |
80
- | ---------- | ------------- | ----------------------------------------------- |
81
- | `'quick'` | 2,048 | Lightweight reasoning for simple queries |
82
- | `'normal'` | 8,000 | **Default** - Balanced reasoning for most tasks |
83
- | `'deep'` | 16,000 | Complex reasoning for difficult problems |
84
- | `'off'` | 0 | Disable extended thinking |
31
+ - `pnpm build` `tsbuild tsfolders --allowimplicitany`
32
+ - Compiles: ts/, ts_vision/, ts_audio/, ts_image/, ts_document/, ts_research/
85
33
 
86
- ### Implementation Details
34
+ ## Important Notes
87
35
 
88
- - Extended thinking is implemented via `getThinkingConfig()` private method
89
- - When thinking is enabled, temperature must NOT be set
90
- - Uses `claude-sonnet-4-5-20250929` model
36
+ - LanguageModelV3 uses `unified`/`raw` in FinishReason (not `type`/`rawType`)
37
+ - LanguageModelV3 system messages have `content: string` (not array)
38
+ - LanguageModelV3 file parts use `mediaType` (not `mimeType`)
39
+ - LanguageModelV3FunctionTool uses `inputSchema` (not `parameters`)
40
+ - Ollama `think` param goes at request body top level, not inside `options`
41
+ - Qwen models get default temperature 0.55 in the custom Ollama provider
42
+ - `qenv.getEnvVarOnDemand()` returns a Promise — must be awaited in tests
91
43
 
92
44
  ## Testing
93
45
 
94
- Run tests with:
95
-
96
- ```bash
97
- pnpm test
98
- ```
99
-
100
- Run specific tests:
101
-
102
46
  ```bash
103
- npx tstest test/test.something.ts --verbose
47
+ pnpm test # all tests
48
+ tstest test/test.smartai.ts --verbose # core tests
49
+ tstest test/test.ollama.ts --verbose # ollama provider tests (mocked, no API needed)
104
50
  ```