@elizaos/plugin-openrouter 1.0.0-beta.51 → 1.0.0-beta.53
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 +11 -47
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import { createOpenRouter } from "@openrouter/ai-sdk-provider";
|
|
3
|
-
import { getProviderBaseURL } from "@elizaos/core";
|
|
4
3
|
import { EventType, logger, ModelType, safeReplacer } from "@elizaos/core";
|
|
5
4
|
import {
|
|
6
5
|
generateObject,
|
|
@@ -12,26 +11,16 @@ function getSetting(runtime, key, defaultValue) {
|
|
|
12
11
|
return runtime.getSetting(key) ?? process.env[key] ?? defaultValue;
|
|
13
12
|
}
|
|
14
13
|
function getBaseURL(runtime) {
|
|
15
|
-
|
|
16
|
-
runtime,
|
|
17
|
-
"OPENROUTER_BASE_URL",
|
|
18
|
-
"https://openrouter.ai/api/v1"
|
|
19
|
-
);
|
|
20
|
-
const providerBaseURL = getProviderBaseURL(
|
|
21
|
-
runtime,
|
|
22
|
-
"openrouter",
|
|
23
|
-
defaultBaseURL
|
|
24
|
-
);
|
|
25
|
-
return providerBaseURL || defaultBaseURL;
|
|
14
|
+
return getSetting(runtime, "OPENROUTER_BASE_URL", "https://openrouter.ai/api/v1") || "https://openrouter.ai/api/v1";
|
|
26
15
|
}
|
|
27
16
|
function getApiKey(runtime) {
|
|
28
17
|
return getSetting(runtime, "OPENROUTER_API_KEY");
|
|
29
18
|
}
|
|
30
19
|
function getSmallModel(runtime) {
|
|
31
|
-
return getSetting(runtime, "OPENROUTER_SMALL_MODEL") ?? getSetting(runtime, "SMALL_MODEL", "google/gemini-flash") ?? "google/gemini-flash";
|
|
20
|
+
return getSetting(runtime, "OPENROUTER_SMALL_MODEL") ?? getSetting(runtime, "SMALL_MODEL", "google/gemini-2.0-flash-001") ?? "google/gemini-2.0-flash-001";
|
|
32
21
|
}
|
|
33
22
|
function getLargeModel(runtime) {
|
|
34
|
-
return getSetting(runtime, "OPENROUTER_LARGE_MODEL") ?? getSetting(runtime, "LARGE_MODEL", "google/gemini-
|
|
23
|
+
return getSetting(runtime, "OPENROUTER_LARGE_MODEL") ?? getSetting(runtime, "LARGE_MODEL", "google/gemini-2.5-flash-preview-05-20") ?? "google/gemini-2.5-flash-preview-05-20";
|
|
35
24
|
}
|
|
36
25
|
function getImageModel(runtime) {
|
|
37
26
|
return getSetting(runtime, "OPENROUTER_IMAGE_MODEL") ?? getSetting(runtime, "IMAGE_MODEL", "x-ai/grok-2-vision-1212") ?? "x-ai/grok-2-vision-1212";
|
|
@@ -39,9 +28,7 @@ function getImageModel(runtime) {
|
|
|
39
28
|
function createOpenRouterProvider(runtime) {
|
|
40
29
|
const apiKey = getApiKey(runtime);
|
|
41
30
|
if (!apiKey) {
|
|
42
|
-
logger.error(
|
|
43
|
-
"OpenRouter API Key is missing when trying to create provider"
|
|
44
|
-
);
|
|
31
|
+
logger.error("OpenRouter API Key is missing when trying to create provider");
|
|
45
32
|
throw new Error("OpenRouter API Key is missing.");
|
|
46
33
|
}
|
|
47
34
|
return createOpenRouter({
|
|
@@ -69,12 +56,7 @@ async function generateObjectByModelType(runtime, params, modelType, getModelFn)
|
|
|
69
56
|
experimental_repairText: getJsonRepairFunction()
|
|
70
57
|
});
|
|
71
58
|
if (usage) {
|
|
72
|
-
emitModelUsageEvent(
|
|
73
|
-
runtime,
|
|
74
|
-
modelType,
|
|
75
|
-
params.prompt,
|
|
76
|
-
usage
|
|
77
|
-
);
|
|
59
|
+
emitModelUsageEvent(runtime, modelType, params.prompt, usage);
|
|
78
60
|
}
|
|
79
61
|
return object;
|
|
80
62
|
} catch (error) {
|
|
@@ -92,9 +74,7 @@ async function generateObjectByModelType(runtime, params, modelType, getModelFn)
|
|
|
92
74
|
return repairedObject;
|
|
93
75
|
} catch (repairParseError) {
|
|
94
76
|
const message = repairParseError instanceof Error ? repairParseError.message : String(repairParseError);
|
|
95
|
-
logger.error(
|
|
96
|
-
`[generateObject] Failed to parse repaired JSON: ${message}`
|
|
97
|
-
);
|
|
77
|
+
logger.error(`[generateObject] Failed to parse repaired JSON: ${message}`);
|
|
98
78
|
const exception = repairParseError instanceof Error ? repairParseError : new Error(message);
|
|
99
79
|
throw exception;
|
|
100
80
|
}
|
|
@@ -166,21 +146,15 @@ var openrouterPlugin = {
|
|
|
166
146
|
headers: { Authorization: `Bearer ${getApiKey(runtime)}` }
|
|
167
147
|
});
|
|
168
148
|
if (!response.ok) {
|
|
169
|
-
logger.warn(
|
|
170
|
-
|
|
171
|
-
);
|
|
172
|
-
logger.warn(
|
|
173
|
-
"OpenAI functionality will be limited until a valid API key is provided"
|
|
174
|
-
);
|
|
149
|
+
logger.warn(`OpenAI API key validation failed: ${response.statusText}`);
|
|
150
|
+
logger.warn("OpenAI functionality will be limited until a valid API key is provided");
|
|
175
151
|
} else {
|
|
176
152
|
logger.log("OpenAI API key validated successfully");
|
|
177
153
|
}
|
|
178
154
|
} catch (fetchError) {
|
|
179
155
|
const message = fetchError instanceof Error ? fetchError.message : String(fetchError);
|
|
180
156
|
logger.warn(`Error validating OpenAI API key: ${message}`);
|
|
181
|
-
logger.warn(
|
|
182
|
-
"OpenAI functionality will be limited until a valid API key is provided"
|
|
183
|
-
);
|
|
157
|
+
logger.warn("OpenAI functionality will be limited until a valid API key is provided");
|
|
184
158
|
}
|
|
185
159
|
} catch (error) {
|
|
186
160
|
const message = error?.errors?.map((e) => e.message).join(", ") || (error instanceof Error ? error.message : String(error));
|
|
@@ -277,20 +251,10 @@ var openrouterPlugin = {
|
|
|
277
251
|
return responseText;
|
|
278
252
|
},
|
|
279
253
|
[ModelType.OBJECT_SMALL]: async (runtime, params) => {
|
|
280
|
-
return generateObjectByModelType(
|
|
281
|
-
runtime,
|
|
282
|
-
params,
|
|
283
|
-
ModelType.OBJECT_SMALL,
|
|
284
|
-
getSmallModel
|
|
285
|
-
);
|
|
254
|
+
return generateObjectByModelType(runtime, params, ModelType.OBJECT_SMALL, getSmallModel);
|
|
286
255
|
},
|
|
287
256
|
[ModelType.OBJECT_LARGE]: async (runtime, params) => {
|
|
288
|
-
return generateObjectByModelType(
|
|
289
|
-
runtime,
|
|
290
|
-
params,
|
|
291
|
-
ModelType.OBJECT_LARGE,
|
|
292
|
-
getLargeModel
|
|
293
|
-
);
|
|
257
|
+
return generateObjectByModelType(runtime, params, ModelType.OBJECT_LARGE, getLargeModel);
|
|
294
258
|
},
|
|
295
259
|
[ModelType.IMAGE_DESCRIPTION]: async (runtime, params) => {
|
|
296
260
|
let imageUrl;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { createOpenRouter } from \"@openrouter/ai-sdk-provider\";\nimport { getProviderBaseURL } from \"@elizaos/core\";\nimport type {\n IAgentRuntime,\n ModelTypeName,\n ObjectGenerationParams,\n Plugin,\n GenerateTextParams,\n ImageDescriptionParams,\n} from \"@elizaos/core\";\nimport { EventType, logger, ModelType, safeReplacer } from \"@elizaos/core\";\nimport {\n generateObject,\n generateText,\n JSONParseError,\n type JSONValue,\n type LanguageModelUsage,\n} from \"ai\";\nimport { fetch } from \"undici\";\n\n/**\n * Retrieves a configuration setting from the runtime, falling back to environment variables or a default value if not found.\n *\n * @param key - The name of the setting to retrieve.\n * @param defaultValue - The value to return if the setting is not found in the runtime or environment.\n * @returns The resolved setting value, or {@link defaultValue} if not found.\n */\nfunction getSetting(\n runtime: IAgentRuntime,\n key: string,\n defaultValue?: string\n): string | undefined {\n return runtime.getSetting(key) ?? process.env[key] ?? defaultValue;\n}\n\n/**\n * Retrieves the OpenAI API base URL from runtime settings, environment variables, or defaults, using provider-aware resolution.\n *\n * @returns The resolved base URL for OpenAI API requests.\n */\nfunction getBaseURL(runtime: IAgentRuntime): string {\n const defaultBaseURL = getSetting(\n runtime,\n \"OPENROUTER_BASE_URL\",\n \"https://openrouter.ai/api/v1\"\n ) as string;\n const providerBaseURL = getProviderBaseURL(\n runtime,\n \"openrouter\",\n defaultBaseURL\n );\n return providerBaseURL || defaultBaseURL;\n}\n\n/**\n * Helper function to get the API key for OpenAI\n *\n * @param runtime The runtime context\n * @returns The configured API key\n */\nfunction getApiKey(runtime: IAgentRuntime): string | undefined {\n return getSetting(runtime, \"OPENROUTER_API_KEY\");\n}\n\n/**\n * Helper function to get the small model name with fallbacks\n *\n * @param runtime The runtime context\n * @returns The configured small model name\n */\nfunction getSmallModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"OPENROUTER_SMALL_MODEL\") ??\n getSetting(runtime, \"SMALL_MODEL\", \"google/gemini-flash\") ??\n \"google/gemini-flash\"\n );\n}\n\n/**\n * Helper function to get the large model name with fallbacks\n *\n * @param runtime The runtime context\n * @returns The configured large model name\n */\nfunction getLargeModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"OPENROUTER_LARGE_MODEL\") ??\n getSetting(runtime, \"LARGE_MODEL\", \"google/gemini-pro\") ??\n \"google/gemini-pro\"\n );\n}\n\n/**\n * Helper function to get the image model name with fallbacks\n *\n * @param runtime The runtime context\n * @returns The configured image model name\n */\nfunction getImageModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"OPENROUTER_IMAGE_MODEL\") ??\n getSetting(runtime, \"IMAGE_MODEL\", \"x-ai/grok-2-vision-1212\") ??\n \"x-ai/grok-2-vision-1212\"\n );\n}\n\n/**\n * Create an OpenRouter provider instance with proper configuration\n *\n * @param runtime The runtime context\n * @returns Configured OpenRouter provider instance\n */\nfunction createOpenRouterProvider(runtime: IAgentRuntime) {\n const apiKey = getApiKey(runtime);\n if (!apiKey) {\n // This case should ideally be caught in init, but good practice to check\n logger.error(\n \"OpenRouter API Key is missing when trying to create provider\"\n );\n throw new Error(\"OpenRouter API Key is missing.\");\n }\n\n // Note: createOpenRouter doesn't seem to take baseURL directly in the documentation.\n // It might pick it up from OPENROUTER_BASE_URL env var automatically,\n // or it might not be needed/configurable in the same way as createOpenAI.\n // We'll rely on the apiKey for now.\n return createOpenRouter({\n apiKey: apiKey,\n // We might need to handle baseURL differently if required.\n // The @ai-sdk/provider utils might handle OPENROUTER_BASE_URL env var.\n });\n}\n\n/**\n * Helper function to generate objects using specified model type\n */\nasync function generateObjectByModelType(\n runtime: IAgentRuntime,\n params: ObjectGenerationParams,\n modelType: string,\n getModelFn: (runtime: IAgentRuntime) => string\n): Promise<JSONValue> {\n const openrouter = createOpenRouterProvider(runtime);\n const modelName = getModelFn(runtime);\n const temperature = params.temperature ?? 0;\n const schemaPresent = !!params.schema;\n\n if (schemaPresent) {\n logger.info(\n `Using ${modelType} without schema validation (schema provided but output=no-schema)`\n );\n }\n\n try {\n const { object, usage } = await generateObject({\n model: openrouter.chat(modelName),\n output: \"no-schema\",\n prompt: params.prompt,\n temperature: temperature,\n experimental_repairText: getJsonRepairFunction(),\n });\n\n if (usage) {\n emitModelUsageEvent(\n runtime,\n modelType as ModelTypeName,\n params.prompt,\n usage\n );\n }\n return object;\n } catch (error: unknown) {\n if (error instanceof JSONParseError) {\n logger.error(`[generateObject] Failed to parse JSON: ${error.message}`);\n const repairFunction = getJsonRepairFunction();\n const repairedJsonString = await repairFunction({\n text: error.text,\n error,\n });\n\n if (repairedJsonString) {\n try {\n const repairedObject = JSON.parse(repairedJsonString);\n logger.info(\"[generateObject] Successfully repaired JSON.\");\n return repairedObject;\n } catch (repairParseError: unknown) {\n const message =\n repairParseError instanceof Error\n ? repairParseError.message\n : String(repairParseError);\n logger.error(\n `[generateObject] Failed to parse repaired JSON: ${message}`\n );\n const exception =\n repairParseError instanceof Error\n ? repairParseError\n : new Error(message);\n throw exception;\n }\n } else {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error(\"[generateObject] JSON repair failed.\");\n throw error;\n }\n } else {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`[generateObject] Unknown error: ${message}`);\n const exception = error instanceof Error ? error : new Error(message);\n throw exception;\n }\n }\n}\n\n/**\n * Returns a function to repair JSON text\n */\nfunction getJsonRepairFunction(): (params: {\n text: string;\n error: unknown;\n}) => Promise<string | null> {\n return async ({ text, error }: { text: string; error: unknown }) => {\n try {\n if (error instanceof JSONParseError) {\n const cleanedText = text.replace(/```json\\n|\\n```|```/g, \"\");\n JSON.parse(cleanedText);\n return cleanedText;\n }\n return null;\n } catch (jsonError: unknown) {\n const message =\n jsonError instanceof Error ? jsonError.message : String(jsonError);\n logger.warn(`Failed to repair JSON text: ${message}`);\n return null;\n }\n };\n}\n\n/**\n * Emits a model usage event\n * @param runtime The runtime context\n * @param type The model type\n * @param prompt The prompt used\n * @param usage The LLM usage data\n */\nfunction emitModelUsageEvent(\n runtime: IAgentRuntime,\n type: ModelTypeName,\n prompt: string,\n usage: LanguageModelUsage\n) {\n runtime.emitEvent(EventType.MODEL_USED, {\n provider: \"openrouter\",\n type,\n prompt,\n tokens: {\n prompt: usage.promptTokens,\n completion: usage.completionTokens,\n total: usage.totalTokens,\n },\n });\n}\n\n/**\n * Defines the OpenAI plugin with its name, description, and configuration options.\n * @type {Plugin}\n */\nexport const openrouterPlugin: Plugin = {\n name: \"openrouter\",\n description: \"OpenAI plugin\",\n config: {\n OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY,\n OPENROUTER_BASE_URL: process.env.OPENROUTER_BASE_URL,\n OPENROUTER_SMALL_MODEL: process.env.OPENROUTER_SMALL_MODEL,\n OPENROUTER_LARGE_MODEL: process.env.OPENROUTER_LARGE_MODEL,\n OPENROUTER_IMAGE_MODEL: process.env.OPENROUTER_IMAGE_MODEL,\n SMALL_MODEL: process.env.SMALL_MODEL,\n LARGE_MODEL: process.env.LARGE_MODEL,\n IMAGE_MODEL: process.env.IMAGE_MODEL,\n },\n async init(_config, runtime) {\n try {\n if (!getApiKey(runtime)) {\n logger.warn(\n \"OPENROUTER_API_KEY is not set in environment - OpenAI functionality will be limited\"\n );\n return;\n }\n try {\n const baseURL = getBaseURL(runtime);\n const response = await fetch(`${baseURL}/models`, {\n headers: { Authorization: `Bearer ${getApiKey(runtime)}` },\n });\n if (!response.ok) {\n logger.warn(\n `OpenAI API key validation failed: ${response.statusText}`\n );\n logger.warn(\n \"OpenAI functionality will be limited until a valid API key is provided\"\n );\n } else {\n logger.log(\"OpenAI API key validated successfully\");\n }\n } catch (fetchError: unknown) {\n const message =\n fetchError instanceof Error ? fetchError.message : String(fetchError);\n logger.warn(`Error validating OpenAI API key: ${message}`);\n logger.warn(\n \"OpenAI functionality will be limited until a valid API key is provided\"\n );\n }\n } catch (error: unknown) {\n const message =\n (error as { errors?: Array<{ message: string }> })?.errors\n ?.map((e) => e.message)\n .join(\", \") ||\n (error instanceof Error ? error.message : String(error));\n logger.warn(\n `OpenAI plugin configuration issue: ${message} - You need to configure the OPENROUTER_API_KEY in your environment variables`\n );\n }\n },\n models: {\n [ModelType.TEXT_SMALL]: async (\n runtime: IAgentRuntime,\n { prompt, stopSequences = [] }: GenerateTextParams\n ) => {\n const temperature = 0.7;\n const frequency_penalty = 0.7;\n const presence_penalty = 0.7;\n const max_response_length = 8192;\n\n const openrouter = createOpenRouterProvider(runtime);\n const modelName = getSmallModel(runtime);\n\n logger.log(\"generating text\");\n logger.log(prompt);\n\n let responseText = \"\";\n let usage: LanguageModelUsage | undefined;\n const model = openrouter.chat(modelName);\n const system = runtime.character.system ?? undefined;\n const callParams = {\n model: modelName,\n prompt: prompt,\n system: system,\n temperature: temperature,\n maxTokens: max_response_length,\n frequencyPenalty: frequency_penalty,\n presencePenalty: presence_penalty,\n stopSequences: stopSequences,\n };\n logger.debug(\n `[TEXT_SMALL] Calling generateText with params: ${JSON.stringify(callParams, safeReplacer())}`\n );\n try {\n const { text, usage: usageData } = await generateText({\n model: model,\n prompt: prompt,\n system: system,\n temperature: temperature,\n maxTokens: max_response_length,\n frequencyPenalty: frequency_penalty,\n presencePenalty: presence_penalty,\n stopSequences: stopSequences,\n });\n responseText = text;\n usage = usageData;\n } catch (e: unknown) {\n logger.error(\n `[TEXT_SMALL] Error during generateText call: ${JSON.stringify(e, Object.getOwnPropertyNames(e), 2)}`\n );\n }\n\n if (usage) {\n emitModelUsageEvent(runtime, ModelType.TEXT_SMALL, prompt, usage);\n }\n\n return responseText;\n },\n [ModelType.TEXT_LARGE]: async (\n runtime: IAgentRuntime,\n {\n prompt,\n stopSequences = [],\n maxTokens = 8192,\n temperature = 0.7,\n frequencyPenalty = 0.7,\n presencePenalty = 0.7,\n }: GenerateTextParams\n ) => {\n const openrouter = createOpenRouterProvider(runtime);\n const modelName = getLargeModel(runtime);\n\n logger.log(\"generating text\");\n logger.log(prompt);\n\n let responseText = \"\";\n let usage: LanguageModelUsage | undefined;\n try {\n const { text, usage: usageData } = await generateText({\n model: openrouter.chat(modelName),\n prompt: prompt,\n system: runtime.character.system ?? undefined,\n temperature: temperature,\n maxTokens: maxTokens,\n frequencyPenalty: frequencyPenalty,\n presencePenalty: presencePenalty,\n stopSequences: stopSequences,\n });\n responseText = text;\n usage = usageData;\n } catch (e: unknown) {\n logger.error(\n `[TEXT_LARGE] Error during generateText call: ${JSON.stringify(e, Object.getOwnPropertyNames(e), 2)}`\n );\n }\n\n if (usage) {\n emitModelUsageEvent(runtime, ModelType.TEXT_LARGE, prompt, usage);\n }\n\n return responseText;\n },\n [ModelType.OBJECT_SMALL]: async (\n runtime: IAgentRuntime,\n params: ObjectGenerationParams\n ) => {\n return generateObjectByModelType(\n runtime,\n params,\n ModelType.OBJECT_SMALL,\n getSmallModel\n );\n },\n [ModelType.OBJECT_LARGE]: async (\n runtime: IAgentRuntime,\n params: ObjectGenerationParams\n ) => {\n return generateObjectByModelType(\n runtime,\n params,\n ModelType.OBJECT_LARGE,\n getLargeModel\n );\n },\n [ModelType.IMAGE_DESCRIPTION]: async (\n runtime: IAgentRuntime,\n params: ImageDescriptionParams | string\n ) => {\n let imageUrl: string;\n let promptText: string | undefined;\n const modelName = getImageModel(runtime);\n logger.log(`[OpenRouter] Using IMAGE_DESCRIPTION model: ${modelName}`);\n const maxTokens = 300;\n\n if (typeof params === \"string\") {\n imageUrl = params;\n promptText =\n \"Please analyze this image and provide a title and detailed description.\";\n } else {\n imageUrl = params.imageUrl;\n promptText =\n params.prompt ||\n \"Please analyze this image and provide a title and detailed description.\";\n }\n\n const openrouter = createOpenRouterProvider(runtime);\n\n const messages = [\n {\n role: \"user\",\n content: [\n { type: \"text\", text: promptText },\n { type: \"image_url\", image_url: { url: imageUrl } },\n ],\n },\n ];\n\n try {\n logger.log(\"Sending image description request to OpenRouter\");\n const model = openrouter.chat(modelName);\n\n const { text: responseText } = await generateText({\n model: model,\n prompt: JSON.stringify(messages),\n maxTokens: maxTokens,\n });\n\n logger.log(\"Received response for image description\");\n\n // Try to parse the response as JSON first\n try {\n const jsonResponse = JSON.parse(responseText);\n if (jsonResponse.title && jsonResponse.description) {\n return jsonResponse;\n }\n } catch (e) {\n // If not valid JSON, process as text\n logger.debug(`Parsing as JSON failed, processing as text: ${e}`);\n }\n\n // Extract title and description from text format\n const titleMatch = responseText.match(/title[:\\s]+(.+?)(?:\\n|$)/i);\n const title = titleMatch?.[1]?.trim() || \"Image Analysis\";\n const description = responseText\n .replace(/title[:\\s]+(.+?)(?:\\n|$)/i, \"\")\n .trim();\n\n return { title, description };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Error analyzing image: ${message}`);\n return {\n title: \"Failed to analyze image\",\n description: `Error: ${message}`,\n };\n }\n },\n },\n};\nexport default openrouterPlugin;\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { createOpenRouter } from '@openrouter/ai-sdk-provider';\nimport type {\n IAgentRuntime,\n ModelTypeName,\n ObjectGenerationParams,\n Plugin,\n GenerateTextParams,\n ImageDescriptionParams,\n} from '@elizaos/core';\nimport { EventType, logger, ModelType, safeReplacer } from '@elizaos/core';\nimport {\n generateObject,\n generateText,\n JSONParseError,\n type JSONValue,\n type LanguageModelUsage,\n} from 'ai';\nimport { fetch } from 'undici';\n\n/**\n * Retrieves a configuration setting from the runtime, falling back to environment variables or a default value if not found.\n *\n * @param key - The name of the setting to retrieve.\n * @param defaultValue - The value to return if the setting is not found in the runtime or environment.\n * @returns The resolved setting value, or {@link defaultValue} if not found.\n */\nfunction getSetting(\n runtime: IAgentRuntime,\n key: string,\n defaultValue?: string\n): string | undefined {\n return runtime.getSetting(key) ?? process.env[key] ?? defaultValue;\n}\n\n/**\n * Retrieves the OpenRouter API base URL from runtime settings, environment variables, or defaults.\n *\n * @returns The resolved base URL for OpenRouter API requests.\n */\nfunction getBaseURL(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, 'OPENROUTER_BASE_URL', 'https://openrouter.ai/api/v1') ||\n 'https://openrouter.ai/api/v1'\n );\n}\n\n/**\n * Helper function to get the API key for OpenAI\n *\n * @param runtime The runtime context\n * @returns The configured API key\n */\nfunction getApiKey(runtime: IAgentRuntime): string | undefined {\n return getSetting(runtime, 'OPENROUTER_API_KEY');\n}\n\n/**\n * Helper function to get the small model name with fallbacks\n *\n * @param runtime The runtime context\n * @returns The configured small model name\n */\nfunction getSmallModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, 'OPENROUTER_SMALL_MODEL') ??\n getSetting(runtime, 'SMALL_MODEL', 'google/gemini-2.0-flash-001') ??\n 'google/gemini-2.0-flash-001'\n );\n}\n\n/**\n * Helper function to get the large model name with fallbacks\n *\n * @param runtime The runtime context\n * @returns The configured large model name\n */\nfunction getLargeModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, 'OPENROUTER_LARGE_MODEL') ??\n getSetting(runtime, 'LARGE_MODEL', 'google/gemini-2.5-flash-preview-05-20') ??\n 'google/gemini-2.5-flash-preview-05-20'\n );\n}\n\n/**\n * Helper function to get the image model name with fallbacks\n *\n * @param runtime The runtime context\n * @returns The configured image model name\n */\nfunction getImageModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, 'OPENROUTER_IMAGE_MODEL') ??\n getSetting(runtime, 'IMAGE_MODEL', 'x-ai/grok-2-vision-1212') ??\n 'x-ai/grok-2-vision-1212'\n );\n}\n\n/**\n * Create an OpenRouter provider instance with proper configuration\n *\n * @param runtime The runtime context\n * @returns Configured OpenRouter provider instance\n */\nfunction createOpenRouterProvider(runtime: IAgentRuntime) {\n const apiKey = getApiKey(runtime);\n if (!apiKey) {\n // This case should ideally be caught in init, but good practice to check\n logger.error('OpenRouter API Key is missing when trying to create provider');\n throw new Error('OpenRouter API Key is missing.');\n }\n\n // Note: createOpenRouter doesn't seem to take baseURL directly in the documentation.\n // It might pick it up from OPENROUTER_BASE_URL env var automatically,\n // or it might not be needed/configurable in the same way as createOpenAI.\n // We'll rely on the apiKey for now.\n return createOpenRouter({\n apiKey: apiKey,\n // We might need to handle baseURL differently if required.\n // The @ai-sdk/provider utils might handle OPENROUTER_BASE_URL env var.\n });\n}\n\n/**\n * Helper function to generate objects using specified model type\n */\nasync function generateObjectByModelType(\n runtime: IAgentRuntime,\n params: ObjectGenerationParams,\n modelType: string,\n getModelFn: (runtime: IAgentRuntime) => string\n): Promise<JSONValue> {\n const openrouter = createOpenRouterProvider(runtime);\n const modelName = getModelFn(runtime);\n const temperature = params.temperature ?? 0;\n const schemaPresent = !!params.schema;\n\n if (schemaPresent) {\n logger.info(\n `Using ${modelType} without schema validation (schema provided but output=no-schema)`\n );\n }\n\n try {\n const { object, usage } = await generateObject({\n model: openrouter.chat(modelName),\n output: 'no-schema',\n prompt: params.prompt,\n temperature: temperature,\n experimental_repairText: getJsonRepairFunction(),\n });\n\n if (usage) {\n emitModelUsageEvent(runtime, modelType as ModelTypeName, params.prompt, usage);\n }\n return object;\n } catch (error: unknown) {\n if (error instanceof JSONParseError) {\n logger.error(`[generateObject] Failed to parse JSON: ${error.message}`);\n const repairFunction = getJsonRepairFunction();\n const repairedJsonString = await repairFunction({\n text: error.text,\n error,\n });\n\n if (repairedJsonString) {\n try {\n const repairedObject = JSON.parse(repairedJsonString);\n logger.info('[generateObject] Successfully repaired JSON.');\n return repairedObject;\n } catch (repairParseError: unknown) {\n const message =\n repairParseError instanceof Error ? repairParseError.message : String(repairParseError);\n logger.error(`[generateObject] Failed to parse repaired JSON: ${message}`);\n const exception =\n repairParseError instanceof Error ? repairParseError : new Error(message);\n throw exception;\n }\n } else {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error('[generateObject] JSON repair failed.');\n throw error;\n }\n } else {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`[generateObject] Unknown error: ${message}`);\n const exception = error instanceof Error ? error : new Error(message);\n throw exception;\n }\n }\n}\n\n/**\n * Returns a function to repair JSON text\n */\nfunction getJsonRepairFunction(): (params: {\n text: string;\n error: unknown;\n}) => Promise<string | null> {\n return async ({ text, error }: { text: string; error: unknown }) => {\n try {\n if (error instanceof JSONParseError) {\n const cleanedText = text.replace(/```json\\n|\\n```|```/g, '');\n JSON.parse(cleanedText);\n return cleanedText;\n }\n return null;\n } catch (jsonError: unknown) {\n const message = jsonError instanceof Error ? jsonError.message : String(jsonError);\n logger.warn(`Failed to repair JSON text: ${message}`);\n return null;\n }\n };\n}\n\n/**\n * Emits a model usage event\n * @param runtime The runtime context\n * @param type The model type\n * @param prompt The prompt used\n * @param usage The LLM usage data\n */\nfunction emitModelUsageEvent(\n runtime: IAgentRuntime,\n type: ModelTypeName,\n prompt: string,\n usage: LanguageModelUsage\n) {\n runtime.emitEvent(EventType.MODEL_USED, {\n provider: 'openrouter',\n type,\n prompt,\n tokens: {\n prompt: usage.promptTokens,\n completion: usage.completionTokens,\n total: usage.totalTokens,\n },\n });\n}\n\n/**\n * Defines the OpenAI plugin with its name, description, and configuration options.\n * @type {Plugin}\n */\nexport const openrouterPlugin: Plugin = {\n name: 'openrouter',\n description: 'OpenAI plugin',\n config: {\n OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY,\n OPENROUTER_BASE_URL: process.env.OPENROUTER_BASE_URL,\n OPENROUTER_SMALL_MODEL: process.env.OPENROUTER_SMALL_MODEL,\n OPENROUTER_LARGE_MODEL: process.env.OPENROUTER_LARGE_MODEL,\n OPENROUTER_IMAGE_MODEL: process.env.OPENROUTER_IMAGE_MODEL,\n SMALL_MODEL: process.env.SMALL_MODEL,\n LARGE_MODEL: process.env.LARGE_MODEL,\n IMAGE_MODEL: process.env.IMAGE_MODEL,\n },\n async init(_config, runtime) {\n try {\n if (!getApiKey(runtime)) {\n logger.warn(\n 'OPENROUTER_API_KEY is not set in environment - OpenAI functionality will be limited'\n );\n return;\n }\n try {\n const baseURL = getBaseURL(runtime);\n const response = await fetch(`${baseURL}/models`, {\n headers: { Authorization: `Bearer ${getApiKey(runtime)}` },\n });\n if (!response.ok) {\n logger.warn(`OpenAI API key validation failed: ${response.statusText}`);\n logger.warn('OpenAI functionality will be limited until a valid API key is provided');\n } else {\n logger.log('OpenAI API key validated successfully');\n }\n } catch (fetchError: unknown) {\n const message = fetchError instanceof Error ? fetchError.message : String(fetchError);\n logger.warn(`Error validating OpenAI API key: ${message}`);\n logger.warn('OpenAI functionality will be limited until a valid API key is provided');\n }\n } catch (error: unknown) {\n const message =\n (error as { errors?: Array<{ message: string }> })?.errors\n ?.map((e) => e.message)\n .join(', ') || (error instanceof Error ? error.message : String(error));\n logger.warn(\n `OpenAI plugin configuration issue: ${message} - You need to configure the OPENROUTER_API_KEY in your environment variables`\n );\n }\n },\n models: {\n [ModelType.TEXT_SMALL]: async (\n runtime: IAgentRuntime,\n { prompt, stopSequences = [] }: GenerateTextParams\n ) => {\n const temperature = 0.7;\n const frequency_penalty = 0.7;\n const presence_penalty = 0.7;\n const max_response_length = 8192;\n\n const openrouter = createOpenRouterProvider(runtime);\n const modelName = getSmallModel(runtime);\n\n logger.log('generating text');\n logger.log(prompt);\n\n let responseText = '';\n let usage: LanguageModelUsage | undefined;\n const model = openrouter.chat(modelName);\n const system = runtime.character.system ?? undefined;\n const callParams = {\n model: modelName,\n prompt: prompt,\n system: system,\n temperature: temperature,\n maxTokens: max_response_length,\n frequencyPenalty: frequency_penalty,\n presencePenalty: presence_penalty,\n stopSequences: stopSequences,\n };\n logger.debug(\n `[TEXT_SMALL] Calling generateText with params: ${JSON.stringify(callParams, safeReplacer())}`\n );\n try {\n const { text, usage: usageData } = await generateText({\n model: model,\n prompt: prompt,\n system: system,\n temperature: temperature,\n maxTokens: max_response_length,\n frequencyPenalty: frequency_penalty,\n presencePenalty: presence_penalty,\n stopSequences: stopSequences,\n });\n responseText = text;\n usage = usageData;\n } catch (e: unknown) {\n logger.error(\n `[TEXT_SMALL] Error during generateText call: ${JSON.stringify(e, Object.getOwnPropertyNames(e), 2)}`\n );\n }\n\n if (usage) {\n emitModelUsageEvent(runtime, ModelType.TEXT_SMALL, prompt, usage);\n }\n\n return responseText;\n },\n [ModelType.TEXT_LARGE]: async (\n runtime: IAgentRuntime,\n {\n prompt,\n stopSequences = [],\n maxTokens = 8192,\n temperature = 0.7,\n frequencyPenalty = 0.7,\n presencePenalty = 0.7,\n }: GenerateTextParams\n ) => {\n const openrouter = createOpenRouterProvider(runtime);\n const modelName = getLargeModel(runtime);\n\n logger.log('generating text');\n logger.log(prompt);\n\n let responseText = '';\n let usage: LanguageModelUsage | undefined;\n try {\n const { text, usage: usageData } = await generateText({\n model: openrouter.chat(modelName),\n prompt: prompt,\n system: runtime.character.system ?? undefined,\n temperature: temperature,\n maxTokens: maxTokens,\n frequencyPenalty: frequencyPenalty,\n presencePenalty: presencePenalty,\n stopSequences: stopSequences,\n });\n responseText = text;\n usage = usageData;\n } catch (e: unknown) {\n logger.error(\n `[TEXT_LARGE] Error during generateText call: ${JSON.stringify(e, Object.getOwnPropertyNames(e), 2)}`\n );\n }\n\n if (usage) {\n emitModelUsageEvent(runtime, ModelType.TEXT_LARGE, prompt, usage);\n }\n\n return responseText;\n },\n [ModelType.OBJECT_SMALL]: async (runtime: IAgentRuntime, params: ObjectGenerationParams) => {\n return generateObjectByModelType(runtime, params, ModelType.OBJECT_SMALL, getSmallModel);\n },\n [ModelType.OBJECT_LARGE]: async (runtime: IAgentRuntime, params: ObjectGenerationParams) => {\n return generateObjectByModelType(runtime, params, ModelType.OBJECT_LARGE, getLargeModel);\n },\n [ModelType.IMAGE_DESCRIPTION]: async (\n runtime: IAgentRuntime,\n params: ImageDescriptionParams | string\n ) => {\n let imageUrl: string;\n let promptText: string | undefined;\n const modelName = getImageModel(runtime);\n logger.log(`[OpenRouter] Using IMAGE_DESCRIPTION model: ${modelName}`);\n const maxTokens = 300;\n\n if (typeof params === 'string') {\n imageUrl = params;\n promptText = 'Please analyze this image and provide a title and detailed description.';\n } else {\n imageUrl = params.imageUrl;\n promptText =\n params.prompt ||\n 'Please analyze this image and provide a title and detailed description.';\n }\n\n const openrouter = createOpenRouterProvider(runtime);\n\n const messages = [\n {\n role: 'user',\n content: [\n { type: 'text', text: promptText },\n { type: 'image_url', image_url: { url: imageUrl } },\n ],\n },\n ];\n\n try {\n logger.log('Sending image description request to OpenRouter');\n const model = openrouter.chat(modelName);\n\n const { text: responseText } = await generateText({\n model: model,\n prompt: JSON.stringify(messages),\n maxTokens: maxTokens,\n });\n\n logger.log('Received response for image description');\n\n // Try to parse the response as JSON first\n try {\n const jsonResponse = JSON.parse(responseText);\n if (jsonResponse.title && jsonResponse.description) {\n return jsonResponse;\n }\n } catch (e) {\n // If not valid JSON, process as text\n logger.debug(`Parsing as JSON failed, processing as text: ${e}`);\n }\n\n // Extract title and description from text format\n const titleMatch = responseText.match(/title[:\\s]+(.+?)(?:\\n|$)/i);\n const title = titleMatch?.[1]?.trim() || 'Image Analysis';\n const description = responseText.replace(/title[:\\s]+(.+?)(?:\\n|$)/i, '').trim();\n\n return { title, description };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Error analyzing image: ${message}`);\n return {\n title: 'Failed to analyze image',\n description: `Error: ${message}`,\n };\n }\n },\n },\n};\nexport default openrouterPlugin;\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elizaos/plugin-openrouter",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.53",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@ai-sdk/openai": "^1.3.22",
|
|
26
26
|
"@ai-sdk/ui-utils": "1.2.11",
|
|
27
|
-
"@elizaos/core": "^1.0.0-beta
|
|
27
|
+
"@elizaos/core": "^1.0.0-beta",
|
|
28
28
|
"@openrouter/ai-sdk-provider": "^0.4.5",
|
|
29
29
|
"ai": "^4.3.15",
|
|
30
30
|
"undici": "^7.9.0"
|