@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 CHANGED
@@ -1,5 +1,5 @@
1
- import type { ImageModelValues, LanguageModelValues, TextEmbeddingModelValues } from '@chainfuse/types';
2
- import { wrapLanguageModel, type embed, type embedMany, type experimental_generateImage as generateImage } from 'ai';
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
- // @ts-expect-error override for types
70
- imageModels: await server.imageModelAvailability.reduce(async (accPromise, model) => {
71
- const acc = await accPromise;
72
- // @ts-expect-error override for types
73
- acc[model] = (await raw.azOpenai(args, server)).imageModel(model);
74
- return acc;
75
- }, Promise.resolve({})),
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
- wrapStream: async ({ doStream }) => {
108
- const { stream, ...rest } = await doStream();
109
- const transformStream = new TransformStream({
110
- transform(chunk, controller) {
111
- if (chunk.type === 'error') {
112
- if (TypeValidationError.isInstance(chunk.error) && chunk.error.cause instanceof ZodError) {
113
- if (chunk.error.cause.issues.filter((issues) => issues.code === 'invalid_union')) {
114
- // Verify the specific error instead of assuming all errors
115
- const missingIndexPropertyError = chunk.error.cause.issues
116
- .filter((issues) => issues.code === 'invalid_union')
117
- .flatMap((issue) => issue.unionErrors)
118
- .flatMap((issue) => issue.issues)
119
- .filter((issue) => issue.code === 'invalid_type' && Helpers.areArraysEqual(issue.path, ['choices', 0, 'index']));
120
- if (missingIndexPropertyError.length > 0) {
121
- const newChunk = chunk.error.value;
122
- newChunk.choices
123
- .filter((choice) => choice.delta.content)
124
- .forEach((choice) => {
125
- controller.enqueue({
126
- type: 'text-delta',
127
- textDelta: choice.delta.content,
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
- else {
135
- // Passthrough untouched
136
- controller.enqueue(chunk);
137
- }
138
- },
139
- });
140
- return {
141
- stream: stream.pipeThrough(transformStream),
142
- ...rest,
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, ImageModelV1, LanguageModelV1 } from '@ai-sdk/provider';
4
- import type { AzureChatModels, AzureEmbeddingModels, AzureImageModels } from '@chainfuse/types';
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
@@ -13,8 +13,6 @@ export class AiRegistry extends AiBase {
13
13
  });
14
14
  }
15
15
  async registry(args) {
16
- return createProviderRegistry(
17
- // @ts-expect-error override for types
18
- await this.providers(args));
16
+ return createProviderRegistry(await this.providers(args));
19
17
  }
20
18
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chainfuse/ai-tools",
3
- "version": "0.3.0",
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": "5c8d059af28f814e48549d079a7b7f01dc3ad1db"
67
+ "gitHead": "2ec2a5ba79ac9ecb2008ecd993d786fd753a1e1d"
68
68
  }