n8n-nodes-openrouter-selector 0.3.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":"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"}
@@ -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>
@@ -0,0 +1,17 @@
1
+ /**
2
+ * OpenRouter Chat Tool Class
3
+ *
4
+ * DynamicStructuredTool wrapper for AI Agent integration.
5
+ */
6
+ import { DynamicStructuredTool } from '@langchain/core/tools';
7
+ export interface OpenRouterChatToolConfig {
8
+ apiKey: string;
9
+ model: string;
10
+ toolName: string;
11
+ toolDescription: string;
12
+ systemPrompt?: string;
13
+ temperature?: number;
14
+ maxTokens?: number;
15
+ }
16
+ export declare function createOpenRouterChatTool(config: OpenRouterChatToolConfig): DynamicStructuredTool;
17
+ //# sourceMappingURL=OpenRouterChatTool.class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenRouterChatTool.class.d.ts","sourceRoot":"","sources":["../../../nodes/OpenRouterChatTool/OpenRouterChatTool.class.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkBD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,wBAAwB,GAAG,qBAAqB,CAwDhG"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ /**
3
+ * OpenRouter Chat Tool Class
4
+ *
5
+ * DynamicStructuredTool wrapper for AI Agent integration.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.createOpenRouterChatTool = createOpenRouterChatTool;
9
+ const tools_1 = require("@langchain/core/tools");
10
+ const zod_1 = require("zod");
11
+ function createOpenRouterChatTool(config) {
12
+ return new tools_1.DynamicStructuredTool({
13
+ name: config.toolName,
14
+ description: config.toolDescription,
15
+ schema: zod_1.z.object({
16
+ prompt: zod_1.z.string().describe('The question or prompt to send to the LLM'),
17
+ context: zod_1.z.string().optional().describe('Optional context for the query'),
18
+ }),
19
+ func: async ({ prompt, context }) => {
20
+ const messages = [];
21
+ if (config.systemPrompt) {
22
+ messages.push({ role: 'system', content: config.systemPrompt });
23
+ }
24
+ if (context) {
25
+ messages.push({ role: 'user', content: `Context: ${context}` });
26
+ }
27
+ messages.push({ role: 'user', content: prompt });
28
+ let response;
29
+ try {
30
+ response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
31
+ method: 'POST',
32
+ headers: {
33
+ 'Authorization': `Bearer ${config.apiKey}`,
34
+ 'Content-Type': 'application/json',
35
+ 'HTTP-Referer': 'https://n8n.io',
36
+ 'X-Title': 'n8n OpenRouter Chat Tool',
37
+ },
38
+ body: JSON.stringify({
39
+ model: config.model,
40
+ messages,
41
+ temperature: config.temperature ?? 0.7,
42
+ max_tokens: config.maxTokens ?? 1000,
43
+ }),
44
+ });
45
+ }
46
+ catch (networkError) {
47
+ throw new Error(`Network error calling OpenRouter: ${networkError.message}`);
48
+ }
49
+ if (!response.ok) {
50
+ const error = await response.json().catch(() => ({}));
51
+ throw new Error(`OpenRouter API Error: ${response.status} - ${error.error?.message || response.statusText}`);
52
+ }
53
+ const data = await response.json();
54
+ if (data.error) {
55
+ throw new Error(`OpenRouter Error: ${data.error.message}`);
56
+ }
57
+ return data.choices[0]?.message?.content ?? '';
58
+ },
59
+ });
60
+ }
61
+ //# sourceMappingURL=OpenRouterChatTool.class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenRouterChatTool.class.js","sourceRoot":"","sources":["../../../nodes/OpenRouterChatTool/OpenRouterChatTool.class.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AA+BH,4DAwDC;AArFD,iDAA8D;AAC9D,6BAAwB;AA4BxB,SAAgB,wBAAwB,CAAC,MAAgC;IACvE,OAAO,IAAI,6BAAqB,CAAC;QAC/B,IAAI,EAAE,MAAM,CAAC,QAAQ;QACrB,WAAW,EAAE,MAAM,CAAC,eAAe;QACnC,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC;YACf,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;YACxE,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;SAC1E,CAAC;QACF,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;YAClC,MAAM,QAAQ,GAA6C,EAAE,CAAC;YAE9D,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;gBACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YAClE,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACZ,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,OAAO,EAAE,EAAE,CAAC,CAAC;YAClE,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAEjD,IAAI,QAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,KAAK,CAAC,+CAA+C,EAAE;oBACtE,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,eAAe,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;wBAC1C,cAAc,EAAE,kBAAkB;wBAClC,cAAc,EAAE,gBAAgB;wBAChC,SAAS,EAAE,0BAA0B;qBACtC;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,QAAQ;wBACR,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,GAAG;wBACtC,UAAU,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;qBACrC,CAAC;iBACH,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,YAAY,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,qCAAsC,YAAsB,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1F,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAqC,CAAC;gBAC1F,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,MAAM,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAC/G,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA4B,CAAC;YAE7D,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D,CAAC;YAED,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;QACjD,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * OpenRouter Chat Tool Node
3
+ *
4
+ * AI Tool node for n8n AI Agent integration.
5
+ */
6
+ import type { INodeType, INodeTypeDescription, ISupplyDataFunctions, SupplyData, ILoadOptionsFunctions, INodePropertyOptions } from 'n8n-workflow';
7
+ export declare class OpenRouterChatTool 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=OpenRouterChatTool.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenRouterChatTool.node.d.ts","sourceRoot":"","sources":["../../../nodes/OpenRouterChatTool/OpenRouterChatTool.node.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,oBAAoB,EACpB,oBAAoB,EACpB,UAAU,EACV,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,cAAc,CAAC;AAKtB,qBAAa,kBAAmB,YAAW,SAAS;IAClD,WAAW,EAAE,oBAAoB,CAmF/B;IAEF,OAAO;;4BAEmB,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;;MAqC/E;IAEI,UAAU,CAAC,IAAI,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;CAwBrF"}
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ /**
3
+ * OpenRouter Chat Tool Node
4
+ *
5
+ * AI Tool node for n8n AI Agent integration.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.OpenRouterChatTool = void 0;
9
+ const n8n_workflow_1 = require("n8n-workflow");
10
+ const OpenRouterChatTool_class_1 = require("./OpenRouterChatTool.class");
11
+ class OpenRouterChatTool {
12
+ description = {
13
+ displayName: 'OpenRouter Chat Tool',
14
+ name: 'openRouterChatTool',
15
+ icon: 'file:openrouter-tool.svg',
16
+ group: ['transform'],
17
+ version: 1,
18
+ description: 'Chat tool for AI Agents using OpenRouter models',
19
+ defaults: { name: 'OpenRouter Chat Tool' },
20
+ codex: {
21
+ categories: ['AI'],
22
+ subcategories: { AI: ['Tools'] },
23
+ resources: {
24
+ primaryDocumentation: [{ url: 'https://github.com/ecolights/n8n-nodes-openrouter-selector' }],
25
+ },
26
+ },
27
+ inputs: [],
28
+ outputs: [n8n_workflow_1.NodeConnectionTypes.AiTool],
29
+ outputNames: ['Tool'],
30
+ credentials: [
31
+ { name: 'openRouterApi', required: true },
32
+ ],
33
+ properties: [
34
+ {
35
+ displayName: 'Tool Name',
36
+ name: 'toolName',
37
+ type: 'string',
38
+ default: 'openrouter_chat',
39
+ description: 'Name of the tool (used by agent to call it)',
40
+ },
41
+ {
42
+ displayName: 'Tool Description',
43
+ name: 'toolDescription',
44
+ type: 'string',
45
+ typeOptions: { rows: 3 },
46
+ default: 'Use this tool to ask questions to a powerful AI model. Provide a clear prompt and optionally context.',
47
+ description: 'Description shown to the agent - helps it decide when to use this tool',
48
+ },
49
+ {
50
+ displayName: 'Model',
51
+ name: 'model',
52
+ type: 'options',
53
+ default: 'anthropic/claude-3.5-sonnet',
54
+ typeOptions: { loadOptionsMethod: 'getModels' },
55
+ description: 'The OpenRouter model to use for chat completions',
56
+ },
57
+ {
58
+ displayName: 'System Prompt',
59
+ name: 'systemPrompt',
60
+ type: 'string',
61
+ typeOptions: { rows: 4 },
62
+ default: '',
63
+ description: 'Optional system prompt to set the behavior of the model',
64
+ },
65
+ {
66
+ displayName: 'Options',
67
+ name: 'options',
68
+ type: 'collection',
69
+ placeholder: 'Add Option',
70
+ default: {},
71
+ options: [
72
+ {
73
+ displayName: 'Temperature',
74
+ name: 'temperature',
75
+ type: 'number',
76
+ typeOptions: { minValue: 0, maxValue: 2, numberPrecision: 1 },
77
+ default: 0.7,
78
+ description: 'Controls randomness. Lower = more focused, higher = more creative.',
79
+ },
80
+ {
81
+ displayName: 'Max Tokens',
82
+ name: 'maxTokens',
83
+ type: 'number',
84
+ typeOptions: { minValue: 1, maxValue: 128000 },
85
+ default: 1000,
86
+ description: 'Maximum number of tokens in the response',
87
+ },
88
+ ],
89
+ },
90
+ ],
91
+ };
92
+ methods = {
93
+ loadOptions: {
94
+ async getModels() {
95
+ const credentials = await this.getCredentials('openRouterApi');
96
+ try {
97
+ const response = await this.helpers.httpRequest({
98
+ method: 'GET',
99
+ url: 'https://openrouter.ai/api/v1/models',
100
+ headers: { Authorization: `Bearer ${credentials.apiKey}` },
101
+ });
102
+ const models = response.data;
103
+ return models
104
+ .filter((m) => m.id && !m.id.includes(':free'))
105
+ .map((m) => ({
106
+ name: m.name || m.id,
107
+ value: m.id,
108
+ description: m.context_length ? `Context: ${m.context_length.toLocaleString()}` : undefined,
109
+ }))
110
+ .sort((a, b) => a.name.localeCompare(b.name));
111
+ }
112
+ catch {
113
+ return [
114
+ { name: 'Claude 3.5 Sonnet', value: 'anthropic/claude-3.5-sonnet' },
115
+ { name: 'Claude 3 Opus', value: 'anthropic/claude-3-opus' },
116
+ { name: 'GPT-4o', value: 'openai/gpt-4o' },
117
+ { name: 'GPT-4 Turbo', value: 'openai/gpt-4-turbo' },
118
+ { name: 'Llama 3.1 70B', value: 'meta-llama/llama-3.1-70b-instruct' },
119
+ { name: 'Gemini Pro 1.5', value: 'google/gemini-pro-1.5' },
120
+ ];
121
+ }
122
+ },
123
+ },
124
+ };
125
+ async supplyData(itemIndex) {
126
+ const credentials = await this.getCredentials('openRouterApi');
127
+ const toolName = this.getNodeParameter('toolName', itemIndex);
128
+ const toolDescription = this.getNodeParameter('toolDescription', itemIndex);
129
+ const model = this.getNodeParameter('model', itemIndex);
130
+ const systemPrompt = this.getNodeParameter('systemPrompt', itemIndex);
131
+ const options = this.getNodeParameter('options', itemIndex, {});
132
+ const tool = (0, OpenRouterChatTool_class_1.createOpenRouterChatTool)({
133
+ apiKey: credentials.apiKey,
134
+ model,
135
+ toolName,
136
+ toolDescription,
137
+ systemPrompt: systemPrompt || undefined,
138
+ temperature: options.temperature,
139
+ maxTokens: options.maxTokens,
140
+ });
141
+ return { response: tool };
142
+ }
143
+ }
144
+ exports.OpenRouterChatTool = OpenRouterChatTool;
145
+ //# sourceMappingURL=OpenRouterChatTool.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenRouterChatTool.node.js","sourceRoot":"","sources":["../../../nodes/OpenRouterChatTool/OpenRouterChatTool.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60">
2
+ <rect width="60" height="60" rx="12" fill="#8b5cf6"/>
3
+ <!-- Chat bubble -->
4
+ <path d="M10 14h22c1.5 0 2.5 1 2.5 2.5v10c0 1.5-1 2.5-2.5 2.5H18l-4 3.5v-3.5h-4c-1.5 0-2.5-1-2.5-2.5v-10c0-1.5 1-2.5 2.5-2.5z" fill="white"/>
5
+ <!-- Dots in bubble -->
6
+ <circle cx="16" cy="22" r="1.5" fill="#8b5cf6"/>
7
+ <circle cx="21" cy="22" r="1.5" fill="#6366f1"/>
8
+ <circle cx="26" cy="22" r="1.5" fill="#ec4899"/>
9
+ <!-- Wrench tool -->
10
+ <g transform="translate(32, 28) rotate(-45)">
11
+ <rect x="0" y="4" width="20" height="6" rx="1" fill="white"/>
12
+ <path d="M-2 4l4-3v3h-4z" fill="white"/>
13
+ <path d="M-2 10l4 3v-3h-4z" fill="white"/>
14
+ <circle cx="16" cy="7" r="5" fill="white" stroke="#8b5cf6" stroke-width="2"/>
15
+ <circle cx="16" cy="7" r="2" fill="#8b5cf6"/>
16
+ </g>
17
+ </svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-nodes-openrouter-selector",
3
- "version": "0.3.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",
@@ -9,7 +9,8 @@
9
9
  "model-selection",
10
10
  "ai",
11
11
  "benchmark",
12
- "embeddings"
12
+ "embeddings",
13
+ "ai-tools"
13
14
  ],
14
15
  "license": "MIT",
15
16
  "homepage": "https://github.com/ecolights/n8n-nodes-openrouter-selector",
@@ -42,11 +43,13 @@
42
43
  "dist/nodes/OpenRouterModelSelector/OpenRouterModelSelector.node.js",
43
44
  "dist/nodes/OpenRouterChatCompletion/OpenRouterChatCompletion.node.js",
44
45
  "dist/nodes/OpenRouterSmartChat/OpenRouterSmartChat.node.js",
45
- "dist/nodes/OpenRouterSmartEmbedding/OpenRouterSmartEmbedding.node.js"
46
+ "dist/nodes/OpenRouterSmartEmbedding/OpenRouterSmartEmbedding.node.js",
47
+ "dist/nodes/OpenRouterChatModel/OpenRouterChatModel.node.js"
46
48
  ]
47
49
  },
48
50
  "dependencies": {
49
- "@langchain/core": "^0.3.0"
51
+ "@langchain/core": "^0.3.0",
52
+ "zod": "^3.23.0"
50
53
  },
51
54
  "devDependencies": {
52
55
  "@types/node": "^20.10.0",