@modelence/ai 0.1.6-dev.1 → 0.1.6

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/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import {getConfig}from'modelence/server';import {startTransaction,captureError}from'modelence/telemetry';import {generateText}from'ai';import {createOpenAI}from'@ai-sdk/openai';import {createAnthropic}from'@ai-sdk/anthropic';import {createGoogleGenerativeAI}from'@ai-sdk/google';function l(e,r){switch(e){case "openai":return createOpenAI({apiKey:String(getConfig("_system.openai.apiKey"))})(r);case "anthropic":return createAnthropic({apiKey:String(getConfig("_system.anthropic.apiKey"))})(r);case "google":return createGoogleGenerativeAI({apiKey:String(getConfig("_system.gemini.apiKey"))})(r);default:throw new Error(`Unsupported provider: ${e}`)}}async function v(e){let{provider:r,model:a,...i}=e,s=l(r,a),n=startTransaction("ai","ai:generateText",{provider:r,model:a,messageCount:Array.isArray(e.messages)?e.messages.length:0,temperature:e.temperature});try{let t=await generateText({...i,model:s});return "setContext"in n?n.end("success",{context:{usage:{promptTokens:t.usage.inputTokens,completionTokens:t.usage.outputTokens,totalTokens:t.usage.totalTokens}}}):n.end("success"),t}catch(t){throw captureError(t),n.end("error"),t}}export{v as generateText};//# sourceMappingURL=index.js.map
1
+ import {getConfig}from'modelence/server';import {startTransaction,captureError}from'modelence/telemetry';import {generateText}from'ai';import {createOpenAI}from'@ai-sdk/openai';import {createAnthropic}from'@ai-sdk/anthropic';import {createGoogleGenerativeAI}from'@ai-sdk/google';function d(e,t){switch(e){case "openai":return createOpenAI({apiKey:String(getConfig("_system.openai.apiKey"))})(t);case "anthropic":return createAnthropic({apiKey:String(getConfig("_system.anthropic.apiKey"))})(t);case "google":return createGoogleGenerativeAI({apiKey:String(getConfig("_system.gemini.apiKey"))})(t);default:throw new Error(`Unsupported provider: ${e}`)}}async function v(e){let{provider:t,model:s,...p}=e,n=startTransaction("ai","ai:generateText",{provider:t,model:s,messageCount:Array.isArray(e.messages)?e.messages.length:0,temperature:e.temperature});try{let o=d(t,s),i=await generateText({...p,model:o}),r=i.usage;return "setContext"in n?n.end("success",{context:{usage:{promptTokens:r.inputTokens??r.promptTokens,completionTokens:r.outputTokens??r.completionTokens,totalTokens:r.totalTokens}}}):n.end("success"),i}catch(o){throw captureError(o),n.end("error"),o}}export{v as generateText};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["getProviderModel","provider","model","createOpenAI","getConfig","createAnthropic","createGoogleGenerativeAI","generateText","options","restOptions","providerModel","transaction","startTransaction","result","originalGenerateText","error","captureError"],"mappings":"uRA6BA,SAASA,CAAAA,CAAiBC,CAAAA,CAAoBC,EAAe,CAC3D,OAAQD,GACN,KAAK,SACH,OAAOE,YAAAA,CAAa,CAClB,MAAA,CAAQ,MAAA,CAAOC,UAAU,uBAAuB,CAAC,CACnD,CAAC,CAAA,CAAEF,CAAK,CAAA,CAEV,KAAK,YACH,OAAOG,eAAAA,CAAgB,CACrB,MAAA,CAAQ,MAAA,CAAOD,UAAU,0BAA0B,CAAC,CACtD,CAAC,CAAA,CAAEF,CAAK,CAAA,CAEV,KAAK,SACH,OAAOI,wBAAAA,CAAyB,CAC9B,MAAA,CAAQ,MAAA,CAAOF,UAAU,uBAAuB,CAAC,CACnD,CAAC,CAAA,CAAEF,CAAK,CAAA,CAEV,QACE,MAAM,IAAI,KAAA,CAAM,yBAAyBD,CAAQ,CAAA,CAAE,CACvD,CACF,CA2BA,eAAsBM,CAAAA,CACpBC,CAAAA,CAC2D,CAC3D,GAAM,CAAE,SAAAP,CAAAA,CAAU,KAAA,CAAAC,EAAO,GAAGO,CAAY,EAAID,CAAAA,CACtCE,CAAAA,CAAgBV,EAAiBC,CAAAA,CAAUC,CAAK,EAEhDS,CAAAA,CAAcC,gBAAAA,CAAiB,KAAM,iBAAA,CAAmB,CAC5D,SAAAX,CAAAA,CACA,KAAA,CAAAC,EACA,YAAA,CAAc,KAAA,CAAM,QAAQM,CAAAA,CAAQ,QAAQ,EAAIA,CAAAA,CAAQ,QAAA,CAAS,OAAS,CAAA,CAC1E,WAAA,CAAaA,EAAQ,WACvB,CAAC,EAED,GAAI,CACF,IAAMK,CAAAA,CAAS,MAAMC,aAAqB,CACxC,GAAGL,EACH,KAAA,CAAOC,CACT,CAAC,CAAA,CAED,OAAI,eAAgBC,CAAAA,CAClBA,CAAAA,CAAY,IAAI,SAAA,CAAW,CACzB,QAAS,CACP,KAAA,CAAO,CACL,YAAA,CAAcE,CAAAA,CAAO,MAAM,WAAA,CAC3B,gBAAA,CAAkBA,EAAO,KAAA,CAAM,YAAA,CAC/B,YAAaA,CAAAA,CAAO,KAAA,CAAM,WAC5B,CACF,CACF,CAAC,CAAA,CAIDF,CAAAA,CAAY,IAAI,SAAS,CAAA,CAEpBE,CACT,CAAA,MAASE,CAAAA,CAAO,CACd,MAAAC,YAAAA,CAAaD,CAAc,CAAA,CAC3BJ,CAAAA,CAAY,IAAI,OAAO,CAAA,CACjBI,CACR,CACF","file":"index.js","sourcesContent":["import { getConfig } from 'modelence/server';\nimport { startTransaction, captureError } from 'modelence/telemetry';\nimport { generateText as originalGenerateText } from 'ai';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport { createAnthropic } from '@ai-sdk/anthropic';\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\n\n/**\n * Supported AI providers for text generation.\n */\ntype Provider = 'openai' | 'anthropic' | 'google';\n\n// Extract the original generateText parameters and override the model property\ntype OriginalGenerateTextParams = Parameters<typeof originalGenerateText>[0];\ntype ModelenceGenerateTextOptions<T> = T extends unknown\n ? Omit<T, 'model'> & {\n provider: Provider;\n model: string;\n }\n : never;\n\n/**\n * Options for the Modelence generateText function.\n * \n * This type extends all the standard AI SDK generateText options,\n * but replaces the model parameter with separate provider and model parameters.\n */\nexport type GenerateTextOptions = ModelenceGenerateTextOptions<OriginalGenerateTextParams>;\n\nfunction getProviderModel(provider: Provider, model: string) {\n switch (provider) {\n case 'openai':\n return createOpenAI({\n apiKey: String(getConfig('_system.openai.apiKey')),\n })(model);\n \n case 'anthropic':\n return createAnthropic({\n apiKey: String(getConfig('_system.anthropic.apiKey')),\n })(model);\n \n case 'google':\n return createGoogleGenerativeAI({\n apiKey: String(getConfig('_system.gemini.apiKey')),\n })(model);\n \n default:\n throw new Error(`Unsupported provider: ${provider}`);\n }\n}\n\n/**\n * Generates text using AI models with built-in Modelence configuration and telemetry.\n * \n * This is a wrapper around the AI SDK's generateText function that automatically\n * configures providers using Modelence's server-side configuration system.\n * \n * @param options - Configuration options for text generation\n * @returns A promise that resolves to the generated text result\n * \n * @example\n * ```typescript\n * import { generateText } from '@modelence/ai';\n * \n * const response = await generateText({\n * provider: 'anthropic',\n * model: 'claude-sonnet-4-6',\n * messages: [\n * { role: 'user', content: 'Write a haiku about programming' }\n * ],\n * temperature: 0.7\n * });\n * \n * console.log(response.text);\n * ```\n */\nexport async function generateText(\n options: GenerateTextOptions\n): Promise<Awaited<ReturnType<typeof originalGenerateText>>> {\n const { provider, model, ...restOptions } = options;\n const providerModel = getProviderModel(provider, model);\n \n const transaction = startTransaction('ai', 'ai:generateText', {\n provider, \n model,\n messageCount: Array.isArray(options.messages) ? options.messages.length : 0,\n temperature: options.temperature\n });\n\n try {\n const result = await originalGenerateText({\n ...restOptions,\n model: providerModel,\n });\n \n if ('setContext' in transaction) {\n transaction.end('success', {\n context: {\n usage: {\n promptTokens: result.usage.inputTokens,\n completionTokens: result.usage.outputTokens,\n totalTokens: result.usage.totalTokens,\n }\n }\n });\n } else {\n // Backwards compatibility for older versions of Modelence\n // @ts-ignore\n transaction.end('success');\n }\n return result;\n } catch (error) {\n captureError(error as Error);\n transaction.end('error');\n throw error;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["getProviderModel","provider","model","createOpenAI","getConfig","createAnthropic","createGoogleGenerativeAI","generateText","options","restOptions","transaction","startTransaction","providerModel","result","originalGenerateText","usage","error","captureError"],"mappings":"uRA6BA,SAASA,CAAAA,CAAiBC,CAAAA,CAAoBC,EAAe,CAC3D,OAAQD,GACN,KAAK,SACH,OAAOE,YAAAA,CAAa,CAClB,MAAA,CAAQ,MAAA,CAAOC,UAAU,uBAAuB,CAAC,CACnD,CAAC,CAAA,CAAEF,CAAK,EAEV,KAAK,WAAA,CACH,OAAOG,eAAAA,CAAgB,CACrB,OAAQ,MAAA,CAAOD,SAAAA,CAAU,0BAA0B,CAAC,CACtD,CAAC,CAAA,CAAEF,CAAK,EAEV,KAAK,QAAA,CACH,OAAOI,wBAAAA,CAAyB,CAC9B,OAAQ,MAAA,CAAOF,SAAAA,CAAU,uBAAuB,CAAC,CACnD,CAAC,CAAA,CAAEF,CAAK,EAEV,QACE,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyBD,CAAQ,CAAA,CAAE,CACvD,CACF,CA2BA,eAAsBM,EACpBC,CAAAA,CAC2D,CAC3D,GAAM,CAAE,QAAA,CAAAP,CAAAA,CAAU,MAAAC,CAAAA,CAAO,GAAGO,CAAY,CAAA,CAAID,CAAAA,CAEtCE,EAAcC,gBAAAA,CAAiB,IAAA,CAAM,kBAAmB,CAC5D,QAAA,CAAAV,EACA,KAAA,CAAAC,CAAAA,CACA,aAAc,KAAA,CAAM,OAAA,CAAQM,EAAQ,QAAQ,CAAA,CAAIA,EAAQ,QAAA,CAAS,MAAA,CAAS,EAC1E,WAAA,CAAaA,CAAAA,CAAQ,WACvB,CAAC,CAAA,CAED,GAAI,CACF,IAAMI,EAAgBZ,CAAAA,CAAiBC,CAAAA,CAAUC,CAAK,CAAA,CAChDW,CAAAA,CAAS,MAAMC,YAAAA,CAAqB,CACxC,GAAGL,CAAAA,CACH,KAAA,CAAOG,CACT,CAAC,CAAA,CACKG,CAAAA,CAAQF,EAAO,KAAA,CAQrB,OAAI,eAAgBH,CAAAA,CAClBA,CAAAA,CAAY,IAAI,SAAA,CAAW,CACzB,QAAS,CACP,KAAA,CAAO,CACL,YAAA,CAAcK,CAAAA,CAAM,aAAeA,CAAAA,CAAM,YAAA,CACzC,iBAAkBA,CAAAA,CAAM,YAAA,EAAgBA,EAAM,gBAAA,CAC9C,WAAA,CAAaA,EAAM,WACrB,CACF,CACF,CAAC,CAAA,CAIDL,EAAY,GAAA,CAAI,SAAS,EAEpBG,CACT,CAAA,MAASG,EAAO,CACd,MAAAC,aAAaD,CAAc,CAAA,CAC3BN,EAAY,GAAA,CAAI,OAAO,CAAA,CACjBM,CACR,CACF","file":"index.js","sourcesContent":["import { getConfig } from 'modelence/server';\nimport { startTransaction, captureError } from 'modelence/telemetry';\nimport { generateText as originalGenerateText } from 'ai';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport { createAnthropic } from '@ai-sdk/anthropic';\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\n\n/**\n * Supported AI providers for text generation.\n */\ntype Provider = 'openai' | 'anthropic' | 'google';\n\n// Extract the original generateText parameters and override the model property\ntype OriginalGenerateTextParams = Parameters<typeof originalGenerateText>[0];\ntype ModelenceGenerateTextOptions<T> = T extends unknown\n ? Omit<T, 'model'> & {\n provider: Provider;\n model: string;\n }\n : never;\n\n/**\n * Options for the Modelence generateText function.\n * \n * This type extends all the standard AI SDK generateText options,\n * but replaces the model parameter with separate provider and model parameters.\n */\nexport type GenerateTextOptions = ModelenceGenerateTextOptions<OriginalGenerateTextParams>;\n\nfunction getProviderModel(provider: Provider, model: string) {\n switch (provider) {\n case 'openai':\n return createOpenAI({\n apiKey: String(getConfig('_system.openai.apiKey')),\n })(model);\n \n case 'anthropic':\n return createAnthropic({\n apiKey: String(getConfig('_system.anthropic.apiKey')),\n })(model);\n \n case 'google':\n return createGoogleGenerativeAI({\n apiKey: String(getConfig('_system.gemini.apiKey')),\n })(model);\n \n default:\n throw new Error(`Unsupported provider: ${provider}`);\n }\n}\n\n/**\n * Generates text using AI models with built-in Modelence configuration and telemetry.\n * \n * This is a wrapper around the AI SDK's generateText function that automatically\n * configures providers using Modelence's server-side configuration system.\n * \n * @param options - Configuration options for text generation\n * @returns A promise that resolves to the generated text result\n * \n * @example\n * ```typescript\n * import { generateText } from '@modelence/ai';\n * \n * const response = await generateText({\n * provider: 'anthropic',\n * model: 'claude-sonnet-4-6',\n * messages: [\n * { role: 'user', content: 'Write a haiku about programming' }\n * ],\n * temperature: 0.7\n * });\n * \n * console.log(response.text);\n * ```\n */\nexport async function generateText(\n options: GenerateTextOptions\n): Promise<Awaited<ReturnType<typeof originalGenerateText>>> {\n const { provider, model, ...restOptions } = options;\n \n const transaction = startTransaction('ai', 'ai:generateText', {\n provider, \n model,\n messageCount: Array.isArray(options.messages) ? options.messages.length : 0,\n temperature: options.temperature\n });\n\n try {\n const providerModel = getProviderModel(provider, model);\n const result = await originalGenerateText({\n ...restOptions,\n model: providerModel,\n });\n const usage = result.usage as {\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n };\n \n if ('setContext' in transaction) {\n transaction.end('success', {\n context: {\n usage: {\n promptTokens: usage.inputTokens ?? usage.promptTokens,\n completionTokens: usage.outputTokens ?? usage.completionTokens,\n totalTokens: usage.totalTokens,\n }\n }\n });\n } else {\n // Backwards compatibility for older versions of Modelence\n // @ts-ignore\n transaction.end('success');\n }\n return result;\n } catch (error) {\n captureError(error as Error);\n transaction.end('error');\n throw error;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@modelence/ai",
4
- "version": "0.1.6-dev.1",
4
+ "version": "0.1.6",
5
5
  "description": "Modelence AI engine",
6
6
  "exports": {
7
7
  ".": {
package/src/index.test.ts CHANGED
@@ -3,15 +3,21 @@ import { beforeEach, describe, expect, jest, test } from '@jest/globals';
3
3
  const mockGetConfig = jest.fn<(key: string) => unknown>();
4
4
  const mockStartTransaction = jest.fn();
5
5
  const mockCaptureError = jest.fn();
6
- const mockGenerateText = jest.fn();
7
-
8
- const mockOpenAIModelFactory = jest.fn();
9
- const mockAnthropicModelFactory = jest.fn();
10
- const mockGoogleModelFactory = jest.fn();
11
-
12
- const mockCreateOpenAI = jest.fn(() => mockOpenAIModelFactory);
13
- const mockCreateAnthropic = jest.fn(() => mockAnthropicModelFactory);
14
- const mockCreateGoogleGenerativeAI = jest.fn(() => mockGoogleModelFactory);
6
+ const mockGenerateText = jest.fn<(options: unknown) => Promise<unknown>>();
7
+
8
+ const mockOpenAIModelFactory = jest.fn<(model: string) => unknown>();
9
+ const mockAnthropicModelFactory = jest.fn<(model: string) => unknown>();
10
+ const mockGoogleModelFactory = jest.fn<(model: string) => unknown>();
11
+
12
+ const mockCreateOpenAI = jest.fn<
13
+ (options: { apiKey: string }) => typeof mockOpenAIModelFactory
14
+ >(() => mockOpenAIModelFactory);
15
+ const mockCreateAnthropic = jest.fn<
16
+ (options: { apiKey: string }) => typeof mockAnthropicModelFactory
17
+ >(() => mockAnthropicModelFactory);
18
+ const mockCreateGoogleGenerativeAI = jest.fn<
19
+ (options: { apiKey: string }) => typeof mockGoogleModelFactory
20
+ >(() => mockGoogleModelFactory);
15
21
 
16
22
  jest.unstable_mockModule('modelence/server', () => ({
17
23
  getConfig: mockGetConfig,
package/src/index.ts CHANGED
@@ -78,7 +78,6 @@ export async function generateText(
78
78
  options: GenerateTextOptions
79
79
  ): Promise<Awaited<ReturnType<typeof originalGenerateText>>> {
80
80
  const { provider, model, ...restOptions } = options;
81
- const providerModel = getProviderModel(provider, model);
82
81
 
83
82
  const transaction = startTransaction('ai', 'ai:generateText', {
84
83
  provider,
@@ -88,18 +87,26 @@ export async function generateText(
88
87
  });
89
88
 
90
89
  try {
90
+ const providerModel = getProviderModel(provider, model);
91
91
  const result = await originalGenerateText({
92
92
  ...restOptions,
93
93
  model: providerModel,
94
94
  });
95
+ const usage = result.usage as {
96
+ inputTokens?: number;
97
+ outputTokens?: number;
98
+ promptTokens?: number;
99
+ completionTokens?: number;
100
+ totalTokens?: number;
101
+ };
95
102
 
96
103
  if ('setContext' in transaction) {
97
104
  transaction.end('success', {
98
105
  context: {
99
106
  usage: {
100
- promptTokens: result.usage.inputTokens,
101
- completionTokens: result.usage.outputTokens,
102
- totalTokens: result.usage.totalTokens,
107
+ promptTokens: usage.inputTokens ?? usage.promptTokens,
108
+ completionTokens: usage.outputTokens ?? usage.completionTokens,
109
+ totalTokens: usage.totalTokens,
103
110
  }
104
111
  }
105
112
  });