@chainfuse/ai-tools 0.3.0 → 0.3.2
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/models.d.mts +2 -12
- package/dist/models.mjs +0 -3
- package/dist/providers/customProviders.mjs +70 -42
- package/dist/providers/types.d.mts +2 -7
- package/dist/registry.mjs +1 -3
- package/package.json +2 -2
package/dist/models.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import { wrapLanguageModel, type embed, type embedMany
|
|
1
|
+
import type { LanguageModelValues, TextEmbeddingModelValues } from '@chainfuse/types';
|
|
2
|
+
import { wrapLanguageModel, type embed, type embedMany } from 'ai';
|
|
3
3
|
import { AiBase } from './base.mjs';
|
|
4
4
|
import { AiRegistry } from './registry.mjs';
|
|
5
5
|
import type { AiRequestConfig } from './types.mjs';
|
|
@@ -8,22 +8,12 @@ type ValidProviders = keyof ProvidersReturnType;
|
|
|
8
8
|
type ProviderLanguageModels = {
|
|
9
9
|
[P in ValidProviders]: Parameters<ProvidersReturnType[P]['languageModel']>[0];
|
|
10
10
|
};
|
|
11
|
-
type ValidImageProviders = {
|
|
12
|
-
[P in ValidProviders]: ProvidersReturnType[P] extends {
|
|
13
|
-
imageModel: (...args: any[]) => any;
|
|
14
|
-
} ? P : never;
|
|
15
|
-
}[ValidProviders];
|
|
16
|
-
type ProviderImageModels = {
|
|
17
|
-
[P in Extract<ValidImageProviders, ValidProviders>]: Parameters<ProvidersReturnType[P]['imageModel']>[0];
|
|
18
|
-
};
|
|
19
11
|
type ProviderTextEmbeddingModels = {
|
|
20
12
|
[P in ValidProviders]: Parameters<ProvidersReturnType[P]['textEmbeddingModel']>[0];
|
|
21
13
|
};
|
|
22
14
|
export declare class AiModel extends AiBase {
|
|
23
15
|
wrappedLanguageModel<P extends ValidProviders>(args: AiRequestConfig, provider: P, model: ProviderLanguageModels[P]): Promise<ReturnType<typeof wrapLanguageModel>>;
|
|
24
16
|
wrappedLanguageModel(args: AiRequestConfig, model: LanguageModelValues): Promise<ReturnType<typeof wrapLanguageModel>>;
|
|
25
|
-
wrappedImageModel<P extends ValidImageProviders>(args: AiRequestConfig, provider: P, model: ProviderImageModels[P]): Promise<Parameters<typeof generateImage>[0]['model']>;
|
|
26
|
-
wrappedImageModel(args: AiRequestConfig, model: ImageModelValues): Promise<Parameters<typeof generateImage>[0]['model']>;
|
|
27
17
|
wrappedTextEmbeddingModel<P extends ValidProviders>(args: AiRequestConfig, provider: P, model: ProviderTextEmbeddingModels[P]): Promise<Parameters<typeof embed | typeof embedMany>[0]['model']>;
|
|
28
18
|
wrappedTextEmbeddingModel(args: AiRequestConfig, model: TextEmbeddingModelValues): Promise<Parameters<typeof embed | typeof embedMany>[0]['model']>;
|
|
29
19
|
private get middleware();
|
package/dist/models.mjs
CHANGED
|
@@ -8,9 +8,6 @@ export class AiModel extends AiBase {
|
|
|
8
8
|
middleware: this.middleware,
|
|
9
9
|
}));
|
|
10
10
|
}
|
|
11
|
-
wrappedImageModel(args, modelOrProvider, model) {
|
|
12
|
-
return new AiRegistry(this.config).registry(args).then((registry) => registry.imageModel(model ? `${modelOrProvider}:${model}` : modelOrProvider));
|
|
13
|
-
}
|
|
14
11
|
wrappedTextEmbeddingModel(args, modelOrProvider, model) {
|
|
15
12
|
return new AiRegistry(this.config).registry(args).then((registry) => registry.textEmbeddingModel(model ? `${modelOrProvider}:${model}` : modelOrProvider));
|
|
16
13
|
}
|
|
@@ -66,13 +66,15 @@ export class AiCustomProviders extends AiBase {
|
|
|
66
66
|
});
|
|
67
67
|
return acc;
|
|
68
68
|
}, Promise.resolve({})),
|
|
69
|
-
//
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
},
|
|
69
|
+
// imageModels: await server!.imageModelAvailability.reduce(
|
|
70
|
+
// async (accPromise, model) => {
|
|
71
|
+
// const acc = await accPromise;
|
|
72
|
+
// // @ts-expect-error override for types
|
|
73
|
+
// acc[model as AzureImageModels] = (await raw.azOpenai(args, server!)).imageModel(model);
|
|
74
|
+
// return acc;
|
|
75
|
+
// },
|
|
76
|
+
// Promise.resolve({} as Record<AzureImageModels, Awaited<ReturnType<AiRawProviders['azOpenai']>>>),
|
|
77
|
+
// ),
|
|
76
78
|
// @ts-expect-error override for types
|
|
77
79
|
textEmbeddingModels: await server.textEmbeddingModelAvailability.reduce(async (accPromise, model) => {
|
|
78
80
|
const acc = await accPromise;
|
|
@@ -103,46 +105,72 @@ export class AiCustomProviders extends AiBase {
|
|
|
103
105
|
// @ts-expect-error override for types
|
|
104
106
|
acc[model] = wrapLanguageModel({
|
|
105
107
|
model: (await raw.restWorkersAi(args))(model),
|
|
106
|
-
middleware:
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
if (
|
|
113
|
-
if (chunk.error
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
.
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
108
|
+
middleware: [
|
|
109
|
+
{
|
|
110
|
+
wrapStream: async ({ doStream }) => {
|
|
111
|
+
const { stream, ...rest } = await doStream();
|
|
112
|
+
const transformStream = new TransformStream({
|
|
113
|
+
transform(chunk, controller) {
|
|
114
|
+
if (chunk.type === 'error') {
|
|
115
|
+
if (TypeValidationError.isInstance(chunk.error) && chunk.error.cause instanceof ZodError) {
|
|
116
|
+
if (chunk.error.cause.issues.filter((issues) => issues.code === 'invalid_union')) {
|
|
117
|
+
// Verify the specific error instead of assuming all errors
|
|
118
|
+
const missingIndexPropertyError = chunk.error.cause.issues
|
|
119
|
+
.filter((issues) => issues.code === 'invalid_union')
|
|
120
|
+
.flatMap((issue) => issue.unionErrors)
|
|
121
|
+
.flatMap((issue) => issue.issues)
|
|
122
|
+
.filter((issue) => issue.code === 'invalid_type' && Helpers.areArraysEqual(issue.path, ['choices', 0, 'index']));
|
|
123
|
+
if (missingIndexPropertyError.length > 0) {
|
|
124
|
+
const newChunk = chunk.error.value;
|
|
125
|
+
newChunk.choices
|
|
126
|
+
.filter((choice) => choice.delta.content)
|
|
127
|
+
.forEach((choice) => {
|
|
128
|
+
controller.enqueue({
|
|
129
|
+
type: 'text-delta',
|
|
130
|
+
textDelta: choice.delta.content,
|
|
131
|
+
});
|
|
128
132
|
});
|
|
129
|
-
}
|
|
133
|
+
}
|
|
130
134
|
}
|
|
131
135
|
}
|
|
132
136
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
137
|
+
else {
|
|
138
|
+
// Passthrough untouched
|
|
139
|
+
controller.enqueue(chunk);
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
return {
|
|
144
|
+
stream: stream.pipeThrough(transformStream),
|
|
145
|
+
...rest,
|
|
146
|
+
};
|
|
147
|
+
},
|
|
144
148
|
},
|
|
145
|
-
|
|
149
|
+
// Fix output generation where it's correct, but encapsulated in a code fence
|
|
150
|
+
{
|
|
151
|
+
wrapGenerate: async ({ doGenerate, model }) => {
|
|
152
|
+
const result = await doGenerate();
|
|
153
|
+
/**
|
|
154
|
+
* `chunkSchema` is undocumented but always present in `model` regardless of model
|
|
155
|
+
* Can't use `responseFormat` (in `params`) because it isn't always present because some models don't support that part of openai api spec.
|
|
156
|
+
*/
|
|
157
|
+
if ('chunkSchema' in model) {
|
|
158
|
+
const codeFenceStart = new RegExp(/^`{1,3}\w*\s*(?=[\[{])/i);
|
|
159
|
+
const codefenceEnd = new RegExp(/(?![\]}])\s*`{1,3}$/i);
|
|
160
|
+
return {
|
|
161
|
+
...result,
|
|
162
|
+
/**
|
|
163
|
+
* 1. trim initially to remove any leading/trailing whitespace
|
|
164
|
+
* 2. Remove start and end
|
|
165
|
+
* 3. Trim again to remove any leading/trailing whitespace
|
|
166
|
+
*/
|
|
167
|
+
text: result.text?.trim().replace(codeFenceStart, '').replace(codefenceEnd, '').trim(),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
return result;
|
|
171
|
+
},
|
|
172
|
+
},
|
|
173
|
+
],
|
|
146
174
|
});
|
|
147
175
|
return acc;
|
|
148
176
|
}, Promise.resolve({})),
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import type { OpenAIProvider } from '@ai-sdk/openai';
|
|
2
1
|
import type { OpenAIChatSettings, OpenAIEmbeddingSettings } from '@ai-sdk/openai/internal';
|
|
3
|
-
import type { EmbeddingModelV1,
|
|
4
|
-
import type { AzureChatModels, AzureEmbeddingModels
|
|
2
|
+
import type { EmbeddingModelV1, LanguageModelV1 } from '@ai-sdk/provider';
|
|
3
|
+
import type { AzureChatModels, AzureEmbeddingModels } from '@chainfuse/types';
|
|
5
4
|
import type { Provider } from 'ai';
|
|
6
5
|
export interface AzureOpenAIProvider extends Provider {
|
|
7
6
|
(deploymentId: AzureChatModels, settings?: OpenAIChatSettings): LanguageModelV1;
|
|
@@ -13,8 +12,4 @@ export interface AzureOpenAIProvider extends Provider {
|
|
|
13
12
|
* Creates an Azure OpenAI model for text embeddings.
|
|
14
13
|
*/
|
|
15
14
|
textEmbeddingModel(deploymentId: AzureEmbeddingModels, settings?: OpenAIEmbeddingSettings): EmbeddingModelV1<string>;
|
|
16
|
-
/**
|
|
17
|
-
* Creates a model for image generation.
|
|
18
|
-
*/
|
|
19
|
-
imageModel(modelId: AzureImageModels, settings?: Parameters<OpenAIProvider['imageModel']>[1]): ImageModelV1;
|
|
20
15
|
}
|
package/dist/registry.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chainfuse/ai-tools",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"author": "ChainFuse",
|
|
6
6
|
"homepage": "https://github.com/ChainFuse/packages/tree/main/packages/ai-tools#readme",
|
|
@@ -64,5 +64,5 @@
|
|
|
64
64
|
"@cloudflare/workers-types": "^4.20250129.0",
|
|
65
65
|
"openai": "^4.82.0"
|
|
66
66
|
},
|
|
67
|
-
"gitHead": "
|
|
67
|
+
"gitHead": "2ec2a5ba79ac9ecb2008ecd993d786fd753a1e1d"
|
|
68
68
|
}
|