@push.rocks/smartai 4.0.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/smartai.classes.smartai.js +9 -2
- package/dist_ts/smartai.middleware.openai.d.ts +6 -0
- package/dist_ts/smartai.middleware.openai.js +40 -0
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/smartai.classes.smartai.ts +8 -1
- package/ts/smartai.middleware.openai.ts +46 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartai',
|
|
6
|
-
version: '4.0.
|
|
6
|
+
version: '4.0.1',
|
|
7
7
|
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.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxxQkFBcUI7SUFDM0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDZMQUE2TDtDQUMzTSxDQUFBIn0=
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import { createOllamaModel } from './smartai.provider.ollama.js';
|
|
3
3
|
import { createAnthropicCachingMiddleware } from './smartai.middleware.anthropic.js';
|
|
4
|
+
import { createOpenAiChatGptInstructionsMiddleware } from './smartai.middleware.openai.js';
|
|
4
5
|
import { createOpenAiChatGptProviderSettings } from './smartai.auth.openai.js';
|
|
5
6
|
/**
|
|
6
7
|
* Returns a LanguageModelV3 for the given provider and model.
|
|
@@ -23,7 +24,13 @@ export function getModel(options) {
|
|
|
23
24
|
const p = plugins.createOpenAI(options.openAiChatGptAuth
|
|
24
25
|
? createOpenAiChatGptProviderSettings(options.openAiChatGptAuth)
|
|
25
26
|
: { apiKey: options.apiKey });
|
|
26
|
-
|
|
27
|
+
const base = p(options.model);
|
|
28
|
+
return options.openAiChatGptAuth
|
|
29
|
+
? plugins.wrapLanguageModel({
|
|
30
|
+
model: base,
|
|
31
|
+
middleware: createOpenAiChatGptInstructionsMiddleware(),
|
|
32
|
+
})
|
|
33
|
+
: base;
|
|
27
34
|
}
|
|
28
35
|
case 'google': {
|
|
29
36
|
const p = plugins.createGoogleGenerativeAI({ apiKey: options.apiKey });
|
|
@@ -58,4 +65,4 @@ export function getModelSetup(options) {
|
|
|
58
65
|
const model = getModel(options);
|
|
59
66
|
return options.providerOptions ? { model, providerOptions: options.providerOptions } : { model };
|
|
60
67
|
}
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhaS5jbGFzc2VzLnNtYXJ0YWkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFpLmNsYXNzZXMuc21hcnRhaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNyRixPQUFPLEVBQUUseUNBQXlDLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRixPQUFPLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUvRTs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxPQUF3QjtJQUMvQyxRQUFRLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDakIsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUM5RCxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBb0IsQ0FBQztZQUNqRCxJQUFJLE9BQU8sQ0FBQyxhQUFhLEtBQUssS0FBSztnQkFBRSxPQUFPLElBQUksQ0FBQztZQUNqRCxPQUFPLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztnQkFDL0IsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsVUFBVSxFQUFFLGdDQUFnQyxDQUMxQyxPQUFPLE9BQU8sQ0FBQyxhQUFhLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQzlFO2FBQ0YsQ0FBK0IsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ2QsTUFBTSxD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
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { LanguageModelV3Middleware } from '@ai-sdk/provider';
|
|
2
|
+
/**
|
|
3
|
+
* ChatGPT's Codex backend requires top-level Responses API instructions.
|
|
4
|
+
* The standard OpenAI provider otherwise serializes system prompts as input items.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createOpenAiChatGptInstructionsMiddleware(): LanguageModelV3Middleware;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const isNonEmptyString = (value) => typeof value === 'string' && value.trim().length > 0;
|
|
2
|
+
const getSystemInstructions = (prompt) => {
|
|
3
|
+
const instructions = prompt
|
|
4
|
+
.filter((message) => message.role === 'system')
|
|
5
|
+
.map((message) => message.content)
|
|
6
|
+
.filter(isNonEmptyString);
|
|
7
|
+
return instructions.length > 0 ? instructions.join('\n') : undefined;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* ChatGPT's Codex backend requires top-level Responses API instructions.
|
|
11
|
+
* The standard OpenAI provider otherwise serializes system prompts as input items.
|
|
12
|
+
*/
|
|
13
|
+
export function createOpenAiChatGptInstructionsMiddleware() {
|
|
14
|
+
return {
|
|
15
|
+
specificationVersion: 'v3',
|
|
16
|
+
transformParams: async ({ params }) => {
|
|
17
|
+
const instructions = getSystemInstructions(params.prompt);
|
|
18
|
+
if (!instructions) {
|
|
19
|
+
return params;
|
|
20
|
+
}
|
|
21
|
+
const providerOptions = params.providerOptions ?? {};
|
|
22
|
+
const openAiProviderOptions = providerOptions.openai ?? {};
|
|
23
|
+
if (isNonEmptyString(openAiProviderOptions.instructions)) {
|
|
24
|
+
return params;
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
...params,
|
|
28
|
+
prompt: params.prompt.filter((message) => message.role !== 'system'),
|
|
29
|
+
providerOptions: {
|
|
30
|
+
...providerOptions,
|
|
31
|
+
openai: {
|
|
32
|
+
...openAiProviderOptions,
|
|
33
|
+
instructions,
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhaS5taWRkbGV3YXJlLm9wZW5haS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0YWkubWlkZGxld2FyZS5vcGVuYWkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEtBQWMsRUFBbUIsRUFBRSxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUVuSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsTUFBNEMsRUFBc0IsRUFBRTtJQUNqRyxNQUFNLFlBQVksR0FBRyxNQUFNO1NBQ3hCLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7U0FDOUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1NBQ2pDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTVCLE9BQU8sWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN2RSxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLFVBQVUseUNBQXlDO0lBQ3ZELE9BQU87UUFDTCxvQkFBb0IsRUFBRSxJQUFJO1FBQzFCLGVBQWUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1lBQ3BDLE1BQU0sWUFBWSxHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7WUFFRCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQztZQUNyRCxNQUFNLHFCQUFxQixHQUFHLGVBQWUsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO1lBQzNELElBQUksZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDekQsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztZQUVELE9BQU87Z0JBQ0wsR0FBRyxNQUFNO2dCQUNULE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7Z0JBQ3BFLGVBQWUsRUFBRTtvQkFDZixHQUFHLGVBQWU7b0JBQ2xCLE1BQU0sRUFBRTt3QkFDTixHQUFHLHFCQUFxQjt3QkFDeEIsWUFBWTtxQkFDQztpQkFDaEI7YUFDbUMsQ0FBQztRQUN6QyxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartai",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.1",
|
|
4
4
|
"private": false,
|
|
5
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",
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartai',
|
|
6
|
-
version: '4.0.
|
|
6
|
+
version: '4.0.1',
|
|
7
7
|
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.'
|
|
8
8
|
}
|
|
@@ -2,6 +2,7 @@ import * as plugins from './plugins.js';
|
|
|
2
2
|
import type { ISmartAiModelSetup, ISmartAiOptions, LanguageModelV3 } from './smartai.interfaces.js';
|
|
3
3
|
import { createOllamaModel } from './smartai.provider.ollama.js';
|
|
4
4
|
import { createAnthropicCachingMiddleware } from './smartai.middleware.anthropic.js';
|
|
5
|
+
import { createOpenAiChatGptInstructionsMiddleware } from './smartai.middleware.openai.js';
|
|
5
6
|
import { createOpenAiChatGptProviderSettings } from './smartai.auth.openai.js';
|
|
6
7
|
|
|
7
8
|
/**
|
|
@@ -28,7 +29,13 @@ export function getModel(options: ISmartAiOptions): LanguageModelV3 {
|
|
|
28
29
|
? createOpenAiChatGptProviderSettings(options.openAiChatGptAuth)
|
|
29
30
|
: { apiKey: options.apiKey },
|
|
30
31
|
);
|
|
31
|
-
|
|
32
|
+
const base = p(options.model) as LanguageModelV3;
|
|
33
|
+
return options.openAiChatGptAuth
|
|
34
|
+
? plugins.wrapLanguageModel({
|
|
35
|
+
model: base,
|
|
36
|
+
middleware: createOpenAiChatGptInstructionsMiddleware(),
|
|
37
|
+
}) as unknown as LanguageModelV3
|
|
38
|
+
: base;
|
|
32
39
|
}
|
|
33
40
|
case 'google': {
|
|
34
41
|
const p = plugins.createGoogleGenerativeAI({ apiKey: options.apiKey });
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { JSONObject, LanguageModelV3CallOptions, LanguageModelV3Middleware } from '@ai-sdk/provider';
|
|
2
|
+
|
|
3
|
+
const isNonEmptyString = (value: unknown): value is string => typeof value === 'string' && value.trim().length > 0;
|
|
4
|
+
|
|
5
|
+
const getSystemInstructions = (prompt: LanguageModelV3CallOptions['prompt']): string | undefined => {
|
|
6
|
+
const instructions = prompt
|
|
7
|
+
.filter((message) => message.role === 'system')
|
|
8
|
+
.map((message) => message.content)
|
|
9
|
+
.filter(isNonEmptyString);
|
|
10
|
+
|
|
11
|
+
return instructions.length > 0 ? instructions.join('\n') : undefined;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* ChatGPT's Codex backend requires top-level Responses API instructions.
|
|
16
|
+
* The standard OpenAI provider otherwise serializes system prompts as input items.
|
|
17
|
+
*/
|
|
18
|
+
export function createOpenAiChatGptInstructionsMiddleware(): LanguageModelV3Middleware {
|
|
19
|
+
return {
|
|
20
|
+
specificationVersion: 'v3',
|
|
21
|
+
transformParams: async ({ params }) => {
|
|
22
|
+
const instructions = getSystemInstructions(params.prompt);
|
|
23
|
+
if (!instructions) {
|
|
24
|
+
return params;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const providerOptions = params.providerOptions ?? {};
|
|
28
|
+
const openAiProviderOptions = providerOptions.openai ?? {};
|
|
29
|
+
if (isNonEmptyString(openAiProviderOptions.instructions)) {
|
|
30
|
+
return params;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
...params,
|
|
35
|
+
prompt: params.prompt.filter((message) => message.role !== 'system'),
|
|
36
|
+
providerOptions: {
|
|
37
|
+
...providerOptions,
|
|
38
|
+
openai: {
|
|
39
|
+
...openAiProviderOptions,
|
|
40
|
+
instructions,
|
|
41
|
+
} as JSONObject,
|
|
42
|
+
},
|
|
43
|
+
} satisfies LanguageModelV3CallOptions;
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|