n8n-nodes-openrouter-selector 0.4.0 → 0.5.0

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.
@@ -0,0 +1,32 @@
1
+ /**
2
+ * OpenRouter Chat Model Class
3
+ *
4
+ * Langchain-compatible BaseChatModel implementation for n8n AI Agent.
5
+ */
6
+ import { BaseChatModel, type BaseChatModelCallOptions } from '@langchain/core/language_models/chat_models';
7
+ import { BaseMessage } from '@langchain/core/messages';
8
+ import type { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';
9
+ import { ChatResult } from '@langchain/core/outputs';
10
+ export interface OpenRouterChatModelConfig {
11
+ apiKey: string;
12
+ model: string;
13
+ temperature?: number;
14
+ maxTokens?: number;
15
+ topP?: number;
16
+ frequencyPenalty?: number;
17
+ presencePenalty?: number;
18
+ }
19
+ export declare class OpenRouterChatModel extends BaseChatModel {
20
+ private apiKey;
21
+ private model;
22
+ private temperature;
23
+ private maxTokens;
24
+ private topP;
25
+ private frequencyPenalty;
26
+ private presencePenalty;
27
+ constructor(config: OpenRouterChatModelConfig);
28
+ _llmType(): string;
29
+ _generate(messages: BaseMessage[], options?: BaseChatModelCallOptions, _runManager?: CallbackManagerForLLMRun): Promise<ChatResult>;
30
+ private convertMessages;
31
+ }
32
+ //# sourceMappingURL=OpenRouterChatModel.class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenRouterChatModel.class.d.ts","sourceRoot":"","sources":["../../../nodes/OpenRouterChatModel/OpenRouterChatModel.class.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,KAAK,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AAC3G,OAAO,EAAa,WAAW,EAA+B,MAAM,0BAA0B,CAAC;AAC/F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAE,UAAU,EAAkB,MAAM,yBAAyB,CAAC;AAErE,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAuBD,qBAAa,mBAAoB,SAAQ,aAAa;IACpD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,eAAe,CAAS;gBAEpB,MAAM,EAAE,yBAAyB;IAW7C,QAAQ,IAAI,MAAM;IAIZ,SAAS,CACb,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,wBAAwB,EAClC,WAAW,CAAC,EAAE,wBAAwB,GACrC,OAAO,CAAC,UAAU,CAAC;IA+DtB,OAAO,CAAC,eAAe;CAaxB"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ /**
3
+ * OpenRouter Chat Model Class
4
+ *
5
+ * Langchain-compatible BaseChatModel implementation for n8n AI Agent.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.OpenRouterChatModel = void 0;
9
+ const chat_models_1 = require("@langchain/core/language_models/chat_models");
10
+ const messages_1 = require("@langchain/core/messages");
11
+ class OpenRouterChatModel extends chat_models_1.BaseChatModel {
12
+ apiKey;
13
+ model;
14
+ temperature;
15
+ maxTokens;
16
+ topP;
17
+ frequencyPenalty;
18
+ presencePenalty;
19
+ constructor(config) {
20
+ super({});
21
+ this.apiKey = config.apiKey;
22
+ this.model = config.model;
23
+ this.temperature = config.temperature ?? 0.7;
24
+ this.maxTokens = config.maxTokens ?? 1000;
25
+ this.topP = config.topP ?? 1;
26
+ this.frequencyPenalty = config.frequencyPenalty ?? 0;
27
+ this.presencePenalty = config.presencePenalty ?? 0;
28
+ }
29
+ _llmType() {
30
+ return 'openrouter-chat';
31
+ }
32
+ async _generate(messages, options, _runManager) {
33
+ const openRouterMessages = this.convertMessages(messages);
34
+ const body = {
35
+ model: this.model,
36
+ messages: openRouterMessages,
37
+ temperature: this.temperature,
38
+ max_tokens: this.maxTokens,
39
+ top_p: this.topP,
40
+ frequency_penalty: this.frequencyPenalty,
41
+ presence_penalty: this.presencePenalty,
42
+ };
43
+ if (options?.stop) {
44
+ body.stop = options.stop;
45
+ }
46
+ let response;
47
+ try {
48
+ response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
49
+ method: 'POST',
50
+ headers: {
51
+ 'Authorization': `Bearer ${this.apiKey}`,
52
+ 'Content-Type': 'application/json',
53
+ 'HTTP-Referer': 'https://n8n.io',
54
+ 'X-Title': 'n8n OpenRouter Chat Model',
55
+ },
56
+ body: JSON.stringify(body),
57
+ signal: options?.signal,
58
+ });
59
+ }
60
+ catch (networkError) {
61
+ throw new Error(`Network error calling OpenRouter: ${networkError.message}`);
62
+ }
63
+ if (!response.ok) {
64
+ const error = await response.json().catch(() => ({}));
65
+ const errorMessage = error.error?.message || response.statusText;
66
+ throw new Error(`OpenRouter API Error: ${response.status} - ${errorMessage}`);
67
+ }
68
+ const data = await response.json();
69
+ const content = data.choices[0]?.message?.content ?? '';
70
+ const generation = {
71
+ text: content,
72
+ message: new messages_1.AIMessage(content),
73
+ generationInfo: {
74
+ finish_reason: data.choices[0]?.finish_reason,
75
+ },
76
+ };
77
+ return {
78
+ generations: [generation],
79
+ llmOutput: {
80
+ tokenUsage: data.usage ? {
81
+ promptTokens: data.usage.prompt_tokens,
82
+ completionTokens: data.usage.completion_tokens,
83
+ totalTokens: data.usage.total_tokens,
84
+ } : undefined,
85
+ },
86
+ };
87
+ }
88
+ convertMessages(messages) {
89
+ return messages.map((msg) => {
90
+ if (msg instanceof messages_1.SystemMessage) {
91
+ return { role: 'system', content: msg.content };
92
+ }
93
+ else if (msg instanceof messages_1.HumanMessage) {
94
+ return { role: 'user', content: msg.content };
95
+ }
96
+ else if (msg instanceof messages_1.AIMessage) {
97
+ return { role: 'assistant', content: msg.content };
98
+ }
99
+ // Default to user for unknown message types
100
+ return { role: 'user', content: msg.content };
101
+ });
102
+ }
103
+ }
104
+ exports.OpenRouterChatModel = OpenRouterChatModel;
105
+ //# sourceMappingURL=OpenRouterChatModel.class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenRouterChatModel.class.js","sourceRoot":"","sources":["../../../nodes/OpenRouterChatModel/OpenRouterChatModel.class.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,6EAA2G;AAC3G,uDAA+F;AAmC/F,MAAa,mBAAoB,SAAQ,2BAAa;IAC5C,MAAM,CAAS;IACf,KAAK,CAAS;IACd,WAAW,CAAS;IACpB,SAAS,CAAS;IAClB,IAAI,CAAS;IACb,gBAAgB,CAAS;IACzB,eAAe,CAAS;IAEhC,YAAY,MAAiC;QAC3C,KAAK,CAAC,EAAE,CAAC,CAAC;QACV,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC;QAC7C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,QAAQ;QACN,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,SAAS,CACb,QAAuB,EACvB,OAAkC,EAClC,WAAsC;QAEtC,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAE1D,MAAM,IAAI,GAA4B;YACpC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,kBAAkB;YAC5B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,SAAS;YAC1B,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,iBAAiB,EAAE,IAAI,CAAC,gBAAgB;YACxC,gBAAgB,EAAE,IAAI,CAAC,eAAe;SACvC,CAAC;QAEF,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC3B,CAAC;QAED,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,+CAA+C,EAAE;gBACtE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;oBACxC,cAAc,EAAE,kBAAkB;oBAClC,cAAc,EAAE,gBAAgB;oBAChC,SAAS,EAAE,2BAA2B;iBACvC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,MAAM,EAAE,OAAO,EAAE,MAAM;aACxB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,YAAY,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,qCAAsC,YAAsB,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1F,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAA4B,CAAC;YACjF,MAAM,YAAY,GAAI,KAAK,CAAC,KAAiC,EAAE,OAAO,IAAI,QAAQ,CAAC,UAAU,CAAC;YAC9F,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,MAAM,YAAY,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAwB,CAAC;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;QAExD,MAAM,UAAU,GAAmB;YACjC,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,IAAI,oBAAS,CAAC,OAAO,CAAC;YAC/B,cAAc,EAAE;gBACd,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,aAAa;aAC9C;SACF,CAAC;QAEF,OAAO;YACL,WAAW,EAAE,CAAC,UAAU,CAAC;YACzB,SAAS,EAAE;gBACT,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;oBACvB,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;oBACtC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB;oBAC9C,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;iBACrC,CAAC,CAAC,CAAC,SAAS;aACd;SACF,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,QAAuB;QAC7C,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC1B,IAAI,GAAG,YAAY,wBAAa,EAAE,CAAC;gBACjC,OAAO,EAAE,IAAI,EAAE,QAAiB,EAAE,OAAO,EAAE,GAAG,CAAC,OAAiB,EAAE,CAAC;YACrE,CAAC;iBAAM,IAAI,GAAG,YAAY,uBAAY,EAAE,CAAC;gBACvC,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,OAAO,EAAE,GAAG,CAAC,OAAiB,EAAE,CAAC;YACnE,CAAC;iBAAM,IAAI,GAAG,YAAY,oBAAS,EAAE,CAAC;gBACpC,OAAO,EAAE,IAAI,EAAE,WAAoB,EAAE,OAAO,EAAE,GAAG,CAAC,OAAiB,EAAE,CAAC;YACxE,CAAC;YACD,4CAA4C;YAC5C,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,OAAO,EAAE,GAAG,CAAC,OAAiB,EAAE,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAxGD,kDAwGC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * OpenRouter Chat Model Node
3
+ *
4
+ * Langchain-compatible chat model node for n8n AI Agent system.
5
+ */
6
+ import type { INodeType, INodeTypeDescription, ISupplyDataFunctions, SupplyData, ILoadOptionsFunctions, INodePropertyOptions } from 'n8n-workflow';
7
+ export declare class OpenRouterChatModel implements INodeType {
8
+ description: INodeTypeDescription;
9
+ methods: {
10
+ loadOptions: {
11
+ getModels(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
12
+ };
13
+ };
14
+ supplyData(this: ISupplyDataFunctions, itemIndex: number): Promise<SupplyData>;
15
+ }
16
+ //# sourceMappingURL=OpenRouterChatModel.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenRouterChatModel.node.d.ts","sourceRoot":"","sources":["../../../nodes/OpenRouterChatModel/OpenRouterChatModel.node.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,oBAAoB,EACpB,oBAAoB,EACpB,UAAU,EACV,qBAAqB,EACrB,oBAAoB,EAErB,MAAM,cAAc,CAAC;AAKtB,qBAAa,mBAAoB,YAAW,SAAS;IACnD,WAAW,EAAE,oBAAoB,CAmF/B;IAEF,OAAO;;4BAEmB,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;;MAgC/E;IAEI,UAAU,CAAC,IAAI,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;CAiBrF"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ /**
3
+ * OpenRouter Chat Model Node
4
+ *
5
+ * Langchain-compatible chat model node for n8n AI Agent system.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.OpenRouterChatModel = void 0;
9
+ const n8n_workflow_1 = require("n8n-workflow");
10
+ const OpenRouterChatModel_class_1 = require("./OpenRouterChatModel.class");
11
+ class OpenRouterChatModel {
12
+ description = {
13
+ displayName: 'OpenRouter Chat Model',
14
+ name: 'openRouterChatModel',
15
+ icon: 'file:openrouter-chat.svg',
16
+ group: ['transform'],
17
+ version: 1,
18
+ description: 'Use any OpenRouter model as chat model for AI Agents',
19
+ defaults: { name: 'OpenRouter Chat Model' },
20
+ codex: {
21
+ categories: ['AI'],
22
+ subcategories: { AI: ['Language Models', 'Root Nodes'] },
23
+ resources: {
24
+ primaryDocumentation: [{ url: 'https://github.com/ecolights/n8n-nodes-openrouter-selector' }],
25
+ },
26
+ },
27
+ inputs: [],
28
+ outputs: [n8n_workflow_1.NodeConnectionTypes.AiLanguageModel],
29
+ outputNames: ['Model'],
30
+ credentials: [
31
+ { name: 'openRouterApi', required: true },
32
+ ],
33
+ properties: [
34
+ {
35
+ displayName: 'Model',
36
+ name: 'model',
37
+ type: 'options',
38
+ default: 'anthropic/claude-3.5-sonnet',
39
+ typeOptions: { loadOptionsMethod: 'getModels' },
40
+ description: 'The model to use for chat completions',
41
+ },
42
+ {
43
+ displayName: 'Options',
44
+ name: 'options',
45
+ type: 'collection',
46
+ placeholder: 'Add Option',
47
+ default: {},
48
+ options: [
49
+ {
50
+ displayName: 'Temperature',
51
+ name: 'temperature',
52
+ type: 'number',
53
+ default: 0.7,
54
+ typeOptions: { minValue: 0, maxValue: 2, numberPrecision: 1 },
55
+ description: 'Controls randomness. Lower = more focused, higher = more creative.',
56
+ },
57
+ {
58
+ displayName: 'Max Tokens',
59
+ name: 'maxTokens',
60
+ type: 'number',
61
+ default: 1000,
62
+ description: 'Maximum number of tokens to generate',
63
+ },
64
+ {
65
+ displayName: 'Top P',
66
+ name: 'topP',
67
+ type: 'number',
68
+ default: 1,
69
+ typeOptions: { minValue: 0, maxValue: 1, numberPrecision: 2 },
70
+ description: 'Nucleus sampling parameter',
71
+ },
72
+ {
73
+ displayName: 'Frequency Penalty',
74
+ name: 'frequencyPenalty',
75
+ type: 'number',
76
+ default: 0,
77
+ typeOptions: { minValue: -2, maxValue: 2, numberPrecision: 1 },
78
+ description: 'Reduces repetition of token sequences',
79
+ },
80
+ {
81
+ displayName: 'Presence Penalty',
82
+ name: 'presencePenalty',
83
+ type: 'number',
84
+ default: 0,
85
+ typeOptions: { minValue: -2, maxValue: 2, numberPrecision: 1 },
86
+ description: 'Increases likelihood of new topics',
87
+ },
88
+ ],
89
+ },
90
+ ],
91
+ };
92
+ methods = {
93
+ loadOptions: {
94
+ async getModels() {
95
+ const defaultModels = [
96
+ { name: 'Claude 3.5 Sonnet', value: 'anthropic/claude-3.5-sonnet' },
97
+ { name: 'Claude 3 Opus', value: 'anthropic/claude-3-opus' },
98
+ { name: 'GPT-4o', value: 'openai/gpt-4o' },
99
+ { name: 'GPT-4o Mini', value: 'openai/gpt-4o-mini' },
100
+ { name: 'Gemini 1.5 Pro', value: 'google/gemini-pro-1.5' },
101
+ { name: 'Llama 3.1 70B', value: 'meta-llama/llama-3.1-70b-instruct' },
102
+ ];
103
+ const credentials = await this.getCredentials('openRouterApi');
104
+ try {
105
+ const response = await this.helpers.httpRequest({
106
+ method: 'GET',
107
+ url: 'https://openrouter.ai/api/v1/models',
108
+ headers: { Authorization: `Bearer ${credentials.apiKey}` },
109
+ });
110
+ if (response?.data && Array.isArray(response.data)) {
111
+ return response.data
112
+ .filter((m) => !m.id.includes(':free'))
113
+ .map((m) => ({
114
+ name: m.name || m.id,
115
+ value: m.id,
116
+ }));
117
+ }
118
+ return defaultModels;
119
+ }
120
+ catch {
121
+ return defaultModels;
122
+ }
123
+ },
124
+ },
125
+ };
126
+ async supplyData(itemIndex) {
127
+ const credentials = await this.getCredentials('openRouterApi');
128
+ const model = this.getNodeParameter('model', itemIndex);
129
+ const options = this.getNodeParameter('options', itemIndex, {});
130
+ const chatModel = new OpenRouterChatModel_class_1.OpenRouterChatModel({
131
+ apiKey: credentials.apiKey,
132
+ model,
133
+ temperature: options.temperature,
134
+ maxTokens: options.maxTokens,
135
+ topP: options.topP,
136
+ frequencyPenalty: options.frequencyPenalty,
137
+ presencePenalty: options.presencePenalty,
138
+ });
139
+ return { response: chatModel };
140
+ }
141
+ }
142
+ exports.OpenRouterChatModel = OpenRouterChatModel;
143
+ //# sourceMappingURL=OpenRouterChatModel.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenRouterChatModel.node.js","sourceRoot":"","sources":["../../../nodes/OpenRouterChatModel/OpenRouterChatModel.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60">
2
+ <rect width="60" height="60" rx="12" fill="#6366f1"/>
3
+ <path d="M12 16h24c1.5 0 2.5 1 2.5 2.5v12c0 1.5-1 2.5-2.5 2.5H20l-5 4v-4h-3c-1.5 0-2.5-1-2.5-2.5v-12c0-1.5 1-2.5 2.5-2.5z" fill="white"/>
4
+ <circle cx="18" cy="24" r="2" fill="#6366f1"/>
5
+ <circle cx="24" cy="24" r="2" fill="#8b5cf6"/>
6
+ <circle cx="30" cy="24" r="2" fill="#ec4899"/>
7
+ <circle cx="46" cy="38" r="10" fill="white"/>
8
+ <path d="M42 35l4 3-4 3" stroke="#6366f1" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
9
+ <path d="M50 35l-4 3 4 3" stroke="#ec4899" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
10
+ </svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-nodes-openrouter-selector",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "n8n community node for intelligent OpenRouter model selection based on task, budget, and benchmarks",
5
5
  "keywords": [
6
6
  "n8n-community-node-package",
@@ -44,7 +44,7 @@
44
44
  "dist/nodes/OpenRouterChatCompletion/OpenRouterChatCompletion.node.js",
45
45
  "dist/nodes/OpenRouterSmartChat/OpenRouterSmartChat.node.js",
46
46
  "dist/nodes/OpenRouterSmartEmbedding/OpenRouterSmartEmbedding.node.js",
47
- "dist/nodes/OpenRouterChatTool/OpenRouterChatTool.node.js"
47
+ "dist/nodes/OpenRouterChatModel/OpenRouterChatModel.node.js"
48
48
  ]
49
49
  },
50
50
  "dependencies": {