@jterrazz/intelligence 1.6.1 → 2.0.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.
- package/README.md +199 -83
- package/dist/adapters/agents/{basic-agent.adapter.d.ts → chat-agent.adapter.d.ts} +6 -6
- package/dist/adapters/agents/{basic-agent.adapter.js → chat-agent.adapter.js} +37 -20
- package/dist/adapters/agents/chat-agent.adapter.js.map +1 -0
- package/dist/adapters/agents/{retryable-agent.adapter.d.ts → resilient-agent.adapter.d.ts} +4 -4
- package/dist/adapters/agents/{retryable-agent.adapter.js → resilient-agent.adapter.js} +8 -8
- package/dist/adapters/agents/resilient-agent.adapter.js.map +1 -0
- package/dist/adapters/agents/{autonomous-agent.adapter.d.ts → tool-agent.adapter.d.ts} +6 -6
- package/dist/adapters/agents/{autonomous-agent.adapter.js → tool-agent.adapter.js} +10 -10
- package/dist/adapters/agents/tool-agent.adapter.js.map +1 -0
- package/dist/adapters/models/openrouter-model.adapter.d.ts +17 -32
- package/dist/adapters/models/openrouter-model.adapter.js +84 -25
- package/dist/adapters/models/openrouter-model.adapter.js.map +1 -1
- package/dist/adapters/prompts/__tests__/presets.test.js +4 -4
- package/dist/adapters/prompts/__tests__/presets.test.js.map +1 -1
- package/dist/adapters/prompts/system-prompt.adapter.d.ts +2 -2
- package/dist/adapters/prompts/system-prompt.adapter.js +6 -6
- package/dist/adapters/prompts/system-prompt.adapter.js.map +1 -1
- package/dist/adapters/prompts/user-prompt.adapter.d.ts +2 -2
- package/dist/adapters/prompts/user-prompt.adapter.js +6 -6
- package/dist/adapters/prompts/user-prompt.adapter.js.map +1 -1
- package/dist/adapters/providers/openrouter-provider.adapter.d.ts +34 -0
- package/dist/adapters/providers/openrouter-provider.adapter.js +57 -0
- package/dist/adapters/providers/openrouter-provider.adapter.js.map +1 -0
- package/dist/adapters/tools/safe-tool.adapter.d.ts +2 -2
- package/dist/adapters/tools/safe-tool.adapter.js +6 -6
- package/dist/adapters/tools/safe-tool.adapter.js.map +1 -1
- package/dist/adapters/utils/__tests__/{ai-response-parser.test.js → structured-response-parser.test.js} +30 -30
- package/dist/adapters/utils/__tests__/structured-response-parser.test.js.map +1 -0
- package/dist/adapters/utils/{ai-response-parser-error.d.ts → structured-response-parser-error.d.ts} +2 -2
- package/dist/adapters/utils/{ai-response-parser-error.js → structured-response-parser-error.js} +9 -9
- package/dist/adapters/utils/structured-response-parser-error.js.map +1 -0
- package/dist/adapters/utils/{ai-response-parser.d.ts → structured-response-parser.d.ts} +1 -1
- package/dist/adapters/utils/{ai-response-parser.js → structured-response-parser.js} +13 -13
- package/dist/adapters/utils/structured-response-parser.js.map +1 -0
- package/dist/index.cjs +727 -342
- package/dist/index.d.ts +11 -8
- package/dist/index.js +29 -8
- package/dist/index.js.map +1 -1
- package/dist/ports/model.port.d.ts +30 -3
- package/dist/ports/model.port.js +1 -1
- package/dist/ports/model.port.js.map +1 -1
- package/dist/ports/provider.port.d.ts +13 -0
- package/dist/ports/provider.port.js +5 -0
- package/dist/ports/provider.port.js.map +1 -0
- package/package.json +11 -9
- package/dist/adapters/agents/autonomous-agent.adapter.js.map +0 -1
- package/dist/adapters/agents/basic-agent.adapter.js.map +0 -1
- package/dist/adapters/agents/retryable-agent.adapter.js.map +0 -1
- package/dist/adapters/utils/__tests__/ai-response-parser.test.js.map +0 -1
- package/dist/adapters/utils/ai-response-parser-error.js.map +0 -1
- package/dist/adapters/utils/ai-response-parser.js.map +0 -1
- /package/dist/adapters/utils/__tests__/{ai-response-parser.test.d.ts → structured-response-parser.test.d.ts} +0 -0
|
@@ -4,24 +4,24 @@ import { type AgentPort } from '../../ports/agent.port.js';
|
|
|
4
4
|
import type { ModelPort } from '../../ports/model.port.js';
|
|
5
5
|
import type { PromptPort } from '../../ports/prompt.port.js';
|
|
6
6
|
import type { ToolPort } from '../../ports/tool.port.js';
|
|
7
|
-
import type {
|
|
8
|
-
export interface
|
|
7
|
+
import type { SystemPrompt } from '../prompts/system-prompt.adapter.js';
|
|
8
|
+
export interface ToolAgentOptions<TOutput = string> {
|
|
9
9
|
logger?: LoggerPort;
|
|
10
10
|
model: ModelPort;
|
|
11
11
|
schema?: z.ZodSchema<TOutput>;
|
|
12
|
-
systemPrompt:
|
|
12
|
+
systemPrompt: SystemPrompt;
|
|
13
13
|
tools: ToolPort[];
|
|
14
14
|
verbose?: boolean;
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
17
|
+
* A tool-enabled agent that uses tools and a structured prompt to accomplish tasks.
|
|
18
18
|
* It can decide whether to respond or remain silent and supports schema-validated responses.
|
|
19
19
|
* @template TOutput - The TypeScript type of the output
|
|
20
20
|
*/
|
|
21
|
-
export declare class
|
|
21
|
+
export declare class ToolAgent<TOutput = string> implements AgentPort<PromptPort, TOutput> {
|
|
22
22
|
readonly name: string;
|
|
23
23
|
private readonly options;
|
|
24
|
-
constructor(name: string, options:
|
|
24
|
+
constructor(name: string, options: ToolAgentOptions<TOutput>);
|
|
25
25
|
run(input?: PromptPort): Promise<null | TOutput>;
|
|
26
26
|
private createExecutor;
|
|
27
27
|
private parseAgentOutput;
|
|
@@ -160,22 +160,22 @@ function _ts_generator(thisArg, body) {
|
|
|
160
160
|
import { ChatPromptTemplate } from '@langchain/core/prompts';
|
|
161
161
|
import { AgentExecutor, createStructuredChatAgent } from 'langchain/agents';
|
|
162
162
|
import { z } from 'zod/v4';
|
|
163
|
-
import {
|
|
163
|
+
import { StructuredResponseParser } from '../utils/structured-response-parser.js';
|
|
164
164
|
var SYSTEM_PROMPT_TEMPLATE = '\n<OBJECTIVE>\n{mission_prompt}\n</OBJECTIVE>\n\n<GLOBAL_WRAPPER_OUTPUT_FORMAT>\nCRITICAL: The format instructions in this section are the ONLY valid way to structure your response. Your entire response MUST be a single JSON markdown code block. Any formatting guidelines within the <OBJECTIVE> section apply ONLY to the content inside the "RESPOND:" part of your final "action_input".\n\nREQUIRED: You have two ways to respond:\n\n1. **Call a tool** to gather information. For this, you MUST output a JSON blob with the tool\'s name and its input.\n *Valid tool names are: {tool_names}*\n ```json\n {{\n "action": "tool_name_to_use",\n "action_input": "the input for the tool, or an empty object {{}} if no input is needed"\n }}\n ```\n\n2. **Provide the Final Answer** once you have enough information. For this, you MUST output a JSON blob with the "Final Answer" action.\n The "action_input" for a "Final Answer" MUST be a string that begins with either "RESPOND: " for a message or "SILENT: " for no message. This prefix is a literal part of the output string and MUST NOT be omitted.\n - To send a message:\n ```json\n {{\n "action": "Final Answer",\n "action_input": "RESPOND: <your response message>"\n }}\n ```\n - To stay silent:\n ```json\n {{\n "action": "Final Answer",\n "action_input": "SILENT: <your reason for staying silent>"\n }}\n ```\n\n YOU MUST ALWAYS INCLUDE "RESPOND:" OR "SILENT:" IN YOUR FINAL ANSWER\'S "action_input". FAILURE TO DO SO WILL CAUSE AN ERROR.\n\n{schema_format}\n</OUTPUT_FORMAT>\n\n<EXECUTION_CONTEXT>\nThis is internal data for your reference.\n\n<TOOLS>\n{tools}\n</TOOLS>\n\n<WORKING_MEMORY>\nThis is your internal thought process and previous tool usage.\n{agent_scratchpad}\n</WORKING_MEMORY>\n</EXECUTION_CONTEXT>\n';
|
|
165
165
|
/**
|
|
166
|
-
*
|
|
166
|
+
* A tool-enabled agent that uses tools and a structured prompt to accomplish tasks.
|
|
167
167
|
* It can decide whether to respond or remain silent and supports schema-validated responses.
|
|
168
168
|
* @template TOutput - The TypeScript type of the output
|
|
169
|
-
*/ export var
|
|
169
|
+
*/ export var ToolAgent = /*#__PURE__*/ function() {
|
|
170
170
|
"use strict";
|
|
171
|
-
function
|
|
172
|
-
_class_call_check(this,
|
|
171
|
+
function ToolAgent(name, options) {
|
|
172
|
+
_class_call_check(this, ToolAgent);
|
|
173
173
|
_define_property(this, "name", void 0);
|
|
174
174
|
_define_property(this, "options", void 0);
|
|
175
175
|
this.name = name;
|
|
176
176
|
this.options = options;
|
|
177
177
|
}
|
|
178
|
-
_create_class(
|
|
178
|
+
_create_class(ToolAgent, [
|
|
179
179
|
{
|
|
180
180
|
key: "run",
|
|
181
181
|
value: function run(input) {
|
|
@@ -288,7 +288,7 @@ var SYSTEM_PROMPT_TEMPLATE = '\n<OBJECTIVE>\n{mission_prompt}\n</OBJECTIVE>\n\n<
|
|
|
288
288
|
return _ts_generator(this, function(_state) {
|
|
289
289
|
switch(_state.label){
|
|
290
290
|
case 0:
|
|
291
|
-
model = this.options.model.
|
|
291
|
+
model = this.options.model.getLangchainModel();
|
|
292
292
|
tools = this.options.tools.map(function(tool) {
|
|
293
293
|
return tool.getDynamicTool();
|
|
294
294
|
});
|
|
@@ -381,7 +381,7 @@ var SYSTEM_PROMPT_TEMPLATE = '\n<OBJECTIVE>\n{mission_prompt}\n</OBJECTIVE>\n\n<
|
|
|
381
381
|
key: "validateResponseContent",
|
|
382
382
|
value: function validateResponseContent(content, schema) {
|
|
383
383
|
try {
|
|
384
|
-
return new
|
|
384
|
+
return new StructuredResponseParser(schema).parse(content);
|
|
385
385
|
} catch (error) {
|
|
386
386
|
var _this_options_logger;
|
|
387
387
|
(_this_options_logger = this.options.logger) === null || _this_options_logger === void 0 ? void 0 : _this_options_logger.error('Failed to validate response content against schema.', {
|
|
@@ -394,7 +394,7 @@ var SYSTEM_PROMPT_TEMPLATE = '\n<OBJECTIVE>\n{mission_prompt}\n</OBJECTIVE>\n\n<
|
|
|
394
394
|
}
|
|
395
395
|
}
|
|
396
396
|
]);
|
|
397
|
-
return
|
|
397
|
+
return ToolAgent;
|
|
398
398
|
}();
|
|
399
399
|
|
|
400
|
-
//# sourceMappingURL=
|
|
400
|
+
//# sourceMappingURL=tool-agent.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/adapters/agents/tool-agent.adapter.ts"],"sourcesContent":["import { type LoggerPort } from '@jterrazz/logger';\nimport { ChatPromptTemplate } from '@langchain/core/prompts';\nimport { AgentExecutor, createStructuredChatAgent } from 'langchain/agents';\nimport { z } from 'zod/v4';\n\nimport { type AgentPort } from '../../ports/agent.port.js';\nimport type { ModelPort } from '../../ports/model.port.js';\nimport type { PromptPort } from '../../ports/prompt.port.js';\nimport type { ToolPort } from '../../ports/tool.port.js';\n\nimport { StructuredResponseParser } from '../utils/structured-response-parser.js';\n\nimport type { SystemPrompt } from '../prompts/system-prompt.adapter.js';\n\nexport interface ToolAgentOptions<TOutput = string> {\n logger?: LoggerPort;\n model: ModelPort;\n schema?: z.ZodSchema<TOutput>;\n systemPrompt: SystemPrompt;\n tools: ToolPort[];\n verbose?: boolean;\n}\n\nconst SYSTEM_PROMPT_TEMPLATE = `\n<OBJECTIVE>\n{mission_prompt}\n</OBJECTIVE>\n\n<GLOBAL_WRAPPER_OUTPUT_FORMAT>\nCRITICAL: The format instructions in this section are the ONLY valid way to structure your response. Your entire response MUST be a single JSON markdown code block. Any formatting guidelines within the <OBJECTIVE> section apply ONLY to the content inside the \"RESPOND:\" part of your final \"action_input\".\n\nREQUIRED: You have two ways to respond:\n\n1. **Call a tool** to gather information. For this, you MUST output a JSON blob with the tool's name and its input.\n *Valid tool names are: {tool_names}*\n \\`\\`\\`json\n {{\n \"action\": \"tool_name_to_use\",\n \"action_input\": \"the input for the tool, or an empty object {{}} if no input is needed\"\n }}\n \\`\\`\\`\n\n2. **Provide the Final Answer** once you have enough information. For this, you MUST output a JSON blob with the \"Final Answer\" action.\n The \"action_input\" for a \"Final Answer\" MUST be a string that begins with either \"RESPOND: \" for a message or \"SILENT: \" for no message. This prefix is a literal part of the output string and MUST NOT be omitted.\n - To send a message:\n \\`\\`\\`json\n {{\n \"action\": \"Final Answer\",\n \"action_input\": \"RESPOND: <your response message>\"\n }}\n \\`\\`\\`\n - To stay silent:\n \\`\\`\\`json\n {{\n \"action\": \"Final Answer\",\n \"action_input\": \"SILENT: <your reason for staying silent>\"\n }}\n \\`\\`\\`\n\n YOU MUST ALWAYS INCLUDE \"RESPOND:\" OR \"SILENT:\" IN YOUR FINAL ANSWER'S \"action_input\". FAILURE TO DO SO WILL CAUSE AN ERROR.\n\n{schema_format}\n</OUTPUT_FORMAT>\n\n<EXECUTION_CONTEXT>\nThis is internal data for your reference.\n\n<TOOLS>\n{tools}\n</TOOLS>\n\n<WORKING_MEMORY>\nThis is your internal thought process and previous tool usage.\n{agent_scratchpad}\n</WORKING_MEMORY>\n</EXECUTION_CONTEXT>\n`;\n\n/**\n * A tool-enabled agent that uses tools and a structured prompt to accomplish tasks.\n * It can decide whether to respond or remain silent and supports schema-validated responses.\n * @template TOutput - The TypeScript type of the output\n */\nexport class ToolAgent<TOutput = string> implements AgentPort<PromptPort, TOutput> {\n constructor(\n public readonly name: string,\n private readonly options: ToolAgentOptions<TOutput>,\n ) {}\n\n async run(input?: PromptPort): Promise<null | TOutput> {\n this.options.logger?.debug('Starting chat execution', { agent: this.name });\n\n try {\n const executor = await this.createExecutor();\n const userInput = this.resolveUserInput(input);\n\n const result = await executor.invoke({ input: userInput });\n\n this.options.logger?.debug('Agent execution completed', {\n agent: this.name,\n hasOutput: 'output' in result,\n });\n\n if (!result || typeof result.output !== 'string') {\n throw new Error('Agent returned an invalid result structure.');\n }\n\n const agentResponse = this.parseAgentOutput(result.output);\n\n if (!agentResponse) {\n return null;\n }\n\n if (!agentResponse.shouldRespond) {\n this.options.logger?.debug('Agent chose to remain silent', {\n agent: this.name,\n reason: agentResponse.reason,\n });\n return null;\n }\n\n const message = agentResponse.message ?? '';\n\n if (this.options.schema) {\n const validatedResponse = this.validateResponseContent(\n message,\n this.options.schema,\n );\n\n this.options.logger?.debug('Execution finished; response content validated.', {\n agent: this.name,\n });\n return validatedResponse;\n } else {\n this.options.logger?.debug('Execution finished', { agent: this.name });\n // When no schema is provided, we assume TOutput is string (default), so message is the result\n return message as TOutput;\n }\n } catch (error) {\n this.options.logger?.error('Chat execution failed', {\n agent: this.name,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n return null;\n }\n }\n\n private async createExecutor(): Promise<AgentExecutor> {\n const model = this.options.model.getLangchainModel();\n const tools = this.options.tools.map((tool) => tool.getDynamicTool());\n\n // Add schema format instructions if schema is provided\n let schemaFormatInstructions = '';\n if (this.options.schema) {\n const jsonSchema = z.toJSONSchema(this.options.schema);\n const isPrimitiveType = ['boolean', 'integer', 'number', 'string'].includes(\n jsonSchema.type as string,\n );\n const jsonSchemaString = JSON.stringify(jsonSchema, null, 2)\n .replace(/{/g, '{{')\n .replace(/}/g, '}}');\n\n if (isPrimitiveType) {\n schemaFormatInstructions = `\n\nSCHEMA VALIDATION: When providing a \"RESPOND:\" answer, the content after \"RESPOND: \" must be a ${jsonSchema.type} value that matches this schema description:\n\n\\`\\`\\`json\n${jsonSchemaString}\n\\`\\`\\`\n\nExample format:\n\\`\\`\\`json\n{{\n \"action\": \"Final Answer\",\n \"action_input\": \"RESPOND: your ${jsonSchema.type} value here\"\n}}\n\\`\\`\\`\n\nDo not wrap the ${jsonSchema.type} value in JSON - just provide the raw value after \"RESPOND: \".`;\n } else {\n schemaFormatInstructions = `\n\nSCHEMA VALIDATION: When providing a \"RESPOND:\" answer, the content after \"RESPOND: \" must be valid JSON that matches this JSON schema description:\n\n\\`\\`\\`json\n${jsonSchemaString}\n\\`\\`\\`\n\nExample format:\n\\`\\`\\`json\n{{\n \"action\": \"Final Answer\",\n \"action_input\": \"RESPOND: {{\\\\\"field1\\\\\": \\\\\"value1\\\\\", \\\\\"field2\\\\\": \\\\\"value2\\\\\"}}\"\n}}\n\\`\\`\\`\n`;\n }\n }\n\n const prompt = ChatPromptTemplate.fromMessages([\n [\n 'system',\n SYSTEM_PROMPT_TEMPLATE.replace(\n '{mission_prompt}',\n this.options.systemPrompt.generate(),\n ).replace('{schema_format}', schemaFormatInstructions),\n ],\n ['human', '{input}'],\n ]);\n\n const agent = await createStructuredChatAgent({\n llm: model,\n prompt,\n tools,\n });\n\n return AgentExecutor.fromAgentAndTools({\n agent,\n tools,\n verbose: this.options.verbose,\n });\n }\n\n private parseAgentOutput(output: string): null | {\n message?: string;\n reason?: string;\n shouldRespond: boolean;\n } {\n const text = output.trim();\n\n const respondMatch = text.match(/^RESPOND:\\s*([\\s\\S]+)$/i);\n if (respondMatch) {\n return { message: respondMatch[1].trim(), shouldRespond: true };\n }\n\n const silentMatch = text.match(/^SILENT:\\s*([\\s\\S]+)$/i);\n if (silentMatch) {\n return { reason: silentMatch[1].trim(), shouldRespond: false };\n }\n\n this.options.logger?.error(\"Agent output was missing 'RESPOND:' or 'SILENT:' prefix.\", {\n agent: this.name,\n rawOutput: output,\n });\n\n return null;\n }\n\n private resolveUserInput(input?: PromptPort): string {\n if (input) {\n return input.generate();\n }\n return 'Proceed with your instructions.';\n }\n\n private validateResponseContent<TResponse>(\n content: string,\n schema: z.ZodSchema<TResponse>,\n ): TResponse {\n try {\n return new StructuredResponseParser(schema).parse(content);\n } catch (error) {\n this.options.logger?.error('Failed to validate response content against schema.', {\n agent: this.name,\n error: error instanceof Error ? error.message : 'Unknown error',\n rawContent: content,\n });\n throw new Error('Invalid response content from model.');\n }\n }\n}\n"],"names":["ChatPromptTemplate","AgentExecutor","createStructuredChatAgent","z","StructuredResponseParser","SYSTEM_PROMPT_TEMPLATE","ToolAgent","name","options","run","input","executor","userInput","result","agentResponse","message","validatedResponse","error","logger","debug","agent","createExecutor","resolveUserInput","invoke","hasOutput","output","Error","parseAgentOutput","shouldRespond","reason","schema","validateResponseContent","model","tools","schemaFormatInstructions","jsonSchema","isPrimitiveType","jsonSchemaString","prompt","getLangchainModel","map","tool","getDynamicTool","toJSONSchema","includes","type","JSON","stringify","replace","fromMessages","systemPrompt","generate","llm","fromAgentAndTools","verbose","text","trim","respondMatch","match","silentMatch","rawOutput","content","parse","rawContent"],"mappings":"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"}
|
|
@@ -1,38 +1,23 @@
|
|
|
1
1
|
import type { BaseLanguageModel } from '@langchain/core/language_models/base';
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
metadata?: OpenRouterMetadata;
|
|
16
|
-
/**
|
|
17
|
-
* The model to use (e.g., 'google/gemini-2.5-flash-preview-05-20:thinking')
|
|
18
|
-
*/
|
|
19
|
-
modelName: string;
|
|
20
|
-
}
|
|
21
|
-
export interface OpenRouterMetadata {
|
|
2
|
+
import type { LanguageModelV1 } from 'ai';
|
|
3
|
+
import type { ModelConfig, ModelPort } from '../../ports/model.port.js';
|
|
4
|
+
import type { OpenRouterConfig } from '../providers/openrouter-provider.adapter.js';
|
|
5
|
+
/**
|
|
6
|
+
* OpenRouter model wrapper supporting both LangChain and Vercel AI SDK
|
|
7
|
+
*/
|
|
8
|
+
export declare class OpenRouterModel implements ModelPort {
|
|
9
|
+
private readonly providerConfig;
|
|
10
|
+
private readonly modelName;
|
|
11
|
+
private readonly langchainModel;
|
|
12
|
+
private readonly modelConfig;
|
|
13
|
+
private readonly vercelModel;
|
|
14
|
+
constructor(providerConfig: OpenRouterConfig, modelName: string, modelConfig?: ModelConfig);
|
|
22
15
|
/**
|
|
23
|
-
*
|
|
16
|
+
* Get the configured LangChain language model instance
|
|
24
17
|
*/
|
|
25
|
-
|
|
18
|
+
getLangchainModel(): BaseLanguageModel;
|
|
26
19
|
/**
|
|
27
|
-
*
|
|
20
|
+
* Get the configured Vercel AI SDK language model instance
|
|
28
21
|
*/
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* OpenRouter adapter that provides access to various models through OpenRouter's API
|
|
33
|
-
*/
|
|
34
|
-
export declare class OpenRouterModelAdapter implements ModelPort {
|
|
35
|
-
private readonly model;
|
|
36
|
-
constructor(config: OpenRouterConfig);
|
|
37
|
-
getModel(): BaseLanguageModel;
|
|
22
|
+
getVercelModel(): LanguageModelV1;
|
|
38
23
|
}
|
|
@@ -45,45 +45,104 @@ function _object_spread(target) {
|
|
|
45
45
|
}
|
|
46
46
|
return target;
|
|
47
47
|
}
|
|
48
|
+
function ownKeys(object, enumerableOnly) {
|
|
49
|
+
var keys = Object.keys(object);
|
|
50
|
+
if (Object.getOwnPropertySymbols) {
|
|
51
|
+
var symbols = Object.getOwnPropertySymbols(object);
|
|
52
|
+
if (enumerableOnly) {
|
|
53
|
+
symbols = symbols.filter(function(sym) {
|
|
54
|
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
keys.push.apply(keys, symbols);
|
|
58
|
+
}
|
|
59
|
+
return keys;
|
|
60
|
+
}
|
|
61
|
+
function _object_spread_props(target, source) {
|
|
62
|
+
source = source != null ? source : {};
|
|
63
|
+
if (Object.getOwnPropertyDescriptors) {
|
|
64
|
+
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
65
|
+
} else {
|
|
66
|
+
ownKeys(Object(source)).forEach(function(key) {
|
|
67
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
return target;
|
|
71
|
+
}
|
|
48
72
|
import { ChatOpenAI } from '@langchain/openai';
|
|
73
|
+
import { createOpenRouter } from '@openrouter/ai-sdk-provider';
|
|
49
74
|
/**
|
|
50
|
-
* OpenRouter
|
|
51
|
-
*/ export var
|
|
75
|
+
* OpenRouter model wrapper supporting both LangChain and Vercel AI SDK
|
|
76
|
+
*/ export var OpenRouterModel = /*#__PURE__*/ function() {
|
|
52
77
|
"use strict";
|
|
53
|
-
function
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
this
|
|
78
|
+
function OpenRouterModel(providerConfig, modelName) {
|
|
79
|
+
var modelConfig = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
|
|
80
|
+
_class_call_check(this, OpenRouterModel);
|
|
81
|
+
var _this_providerConfig_metadata, _this_providerConfig_metadata1;
|
|
82
|
+
_define_property(this, "providerConfig", void 0);
|
|
83
|
+
_define_property(this, "modelName", void 0);
|
|
84
|
+
_define_property(this, "langchainModel", void 0);
|
|
85
|
+
_define_property(this, "modelConfig", void 0);
|
|
86
|
+
_define_property(this, "vercelModel", void 0);
|
|
87
|
+
this.providerConfig = providerConfig;
|
|
88
|
+
this.modelName = modelName;
|
|
89
|
+
this.modelConfig = _object_spread({
|
|
90
|
+
maxTokens: 256000,
|
|
91
|
+
reasoning: {
|
|
92
|
+
effort: 'high',
|
|
93
|
+
exclude: true
|
|
94
|
+
}
|
|
95
|
+
}, modelConfig);
|
|
96
|
+
// LangChain model setup
|
|
97
|
+
this.langchainModel = new ChatOpenAI(_object_spread_props(_object_spread({
|
|
59
98
|
configuration: {
|
|
60
99
|
baseURL: 'https://openrouter.ai/api/v1',
|
|
61
|
-
defaultHeaders: _object_spread({}, ((
|
|
62
|
-
'HTTP-Referer':
|
|
63
|
-
}, ((
|
|
64
|
-
'X-Title':
|
|
100
|
+
defaultHeaders: _object_spread({}, ((_this_providerConfig_metadata = this.providerConfig.metadata) === null || _this_providerConfig_metadata === void 0 ? void 0 : _this_providerConfig_metadata.website) && {
|
|
101
|
+
'HTTP-Referer': this.providerConfig.metadata.website
|
|
102
|
+
}, ((_this_providerConfig_metadata1 = this.providerConfig.metadata) === null || _this_providerConfig_metadata1 === void 0 ? void 0 : _this_providerConfig_metadata1.application) && {
|
|
103
|
+
'X-Title': this.providerConfig.metadata.application
|
|
65
104
|
})
|
|
66
105
|
},
|
|
67
|
-
maxTokens:
|
|
106
|
+
maxTokens: this.modelConfig.maxTokens
|
|
107
|
+
}, this.modelConfig.reasoning && {
|
|
68
108
|
modelKwargs: {
|
|
69
|
-
reasoning:
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
109
|
+
reasoning: this.modelConfig.reasoning
|
|
110
|
+
}
|
|
111
|
+
}), {
|
|
112
|
+
modelName: this.modelName,
|
|
113
|
+
openAIApiKey: this.providerConfig.apiKey
|
|
114
|
+
}));
|
|
115
|
+
// Vercel AI SDK model setup
|
|
116
|
+
var openrouter = createOpenRouter({
|
|
117
|
+
apiKey: this.providerConfig.apiKey
|
|
76
118
|
});
|
|
119
|
+
this.vercelModel = openrouter(this.modelName, _object_spread({}, this.modelConfig.maxTokens && {
|
|
120
|
+
maxTokens: this.modelConfig.maxTokens
|
|
121
|
+
}, this.modelConfig.reasoning && {
|
|
122
|
+
extraBody: {
|
|
123
|
+
reasoning: this.modelConfig.reasoning
|
|
124
|
+
}
|
|
125
|
+
}));
|
|
77
126
|
}
|
|
78
|
-
_create_class(
|
|
127
|
+
_create_class(OpenRouterModel, [
|
|
128
|
+
{
|
|
129
|
+
/**
|
|
130
|
+
* Get the configured LangChain language model instance
|
|
131
|
+
*/ key: "getLangchainModel",
|
|
132
|
+
value: function getLangchainModel() {
|
|
133
|
+
return this.langchainModel;
|
|
134
|
+
}
|
|
135
|
+
},
|
|
79
136
|
{
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
137
|
+
/**
|
|
138
|
+
* Get the configured Vercel AI SDK language model instance
|
|
139
|
+
*/ key: "getVercelModel",
|
|
140
|
+
value: function getVercelModel() {
|
|
141
|
+
return this.vercelModel;
|
|
83
142
|
}
|
|
84
143
|
}
|
|
85
144
|
]);
|
|
86
|
-
return
|
|
145
|
+
return OpenRouterModel;
|
|
87
146
|
}();
|
|
88
147
|
|
|
89
148
|
//# sourceMappingURL=openrouter-model.adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/adapters/models/openrouter-model.adapter.ts"],"sourcesContent":["import type { BaseLanguageModel } from '@langchain/core/language_models/base';\nimport { ChatOpenAI } from '@langchain/openai';\n\nimport type { ModelPort } from '../../ports/model.port.js';\n\
|
|
1
|
+
{"version":3,"sources":["../../../src/adapters/models/openrouter-model.adapter.ts"],"sourcesContent":["import type { BaseLanguageModel } from '@langchain/core/language_models/base';\nimport { ChatOpenAI } from '@langchain/openai';\nimport { createOpenRouter } from '@openrouter/ai-sdk-provider';\nimport type { LanguageModelV1 } from 'ai';\n\nimport type { ModelConfig, ModelPort } from '../../ports/model.port.js';\n\nimport type { OpenRouterConfig } from '../providers/openrouter-provider.adapter.js';\n\n/**\n * OpenRouter model wrapper supporting both LangChain and Vercel AI SDK\n */\nexport class OpenRouterModel implements ModelPort {\n private readonly langchainModel: BaseLanguageModel;\n private readonly modelConfig: ModelConfig;\n private readonly vercelModel: LanguageModelV1;\n\n constructor(\n private readonly providerConfig: OpenRouterConfig,\n private readonly modelName: string,\n modelConfig: ModelConfig = {},\n ) {\n this.modelConfig = {\n maxTokens: 256_000,\n reasoning: {\n effort: 'high',\n exclude: true,\n },\n ...modelConfig,\n };\n\n // LangChain model setup\n this.langchainModel = new ChatOpenAI({\n configuration: {\n baseURL: 'https://openrouter.ai/api/v1',\n defaultHeaders: {\n ...(this.providerConfig.metadata?.website && {\n 'HTTP-Referer': this.providerConfig.metadata.website,\n }),\n ...(this.providerConfig.metadata?.application && {\n 'X-Title': this.providerConfig.metadata.application,\n }),\n },\n },\n maxTokens: this.modelConfig.maxTokens,\n ...(this.modelConfig.reasoning && {\n modelKwargs: {\n reasoning: this.modelConfig.reasoning,\n },\n }),\n modelName: this.modelName,\n openAIApiKey: this.providerConfig.apiKey,\n });\n\n // Vercel AI SDK model setup\n const openrouter = createOpenRouter({\n apiKey: this.providerConfig.apiKey,\n });\n\n this.vercelModel = openrouter(this.modelName, {\n ...(this.modelConfig.maxTokens && { maxTokens: this.modelConfig.maxTokens }),\n ...(this.modelConfig.reasoning && {\n extraBody: {\n reasoning: this.modelConfig.reasoning,\n },\n }),\n });\n }\n\n /**\n * Get the configured LangChain language model instance\n */\n getLangchainModel(): BaseLanguageModel {\n return this.langchainModel;\n }\n\n /**\n * Get the configured Vercel AI SDK language model instance\n */\n getVercelModel(): LanguageModelV1 {\n return this.vercelModel;\n }\n}\n"],"names":["ChatOpenAI","createOpenRouter","OpenRouterModel","providerConfig","modelName","modelConfig","langchainModel","vercelModel","maxTokens","reasoning","effort","exclude","configuration","baseURL","defaultHeaders","metadata","website","application","modelKwargs","openAIApiKey","apiKey","openrouter","extraBody","getLangchainModel","getVercelModel"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAASA,UAAU,QAAQ,oBAAoB;AAC/C,SAASC,gBAAgB,QAAQ,8BAA8B;AAO/D;;CAEC,GACD,OAAO,IAAA,AAAMC,gCAAN;;aAAMA,gBAML,AAAiBC,cAAgC,EACjD,AAAiBC,SAAiB;YAClCC,cAAAA,iEAA2B,CAAC;gCARvBH;YAwBW,+BAGA;;;QA1BpB,uBAAiBI,kBAAjB,KAAA;QACA,uBAAiBD,eAAjB,KAAA;QACA,uBAAiBE,eAAjB,KAAA;aAGqBJ,iBAAAA;aACAC,YAAAA;QAGjB,IAAI,CAACC,WAAW,GAAG;YACfG,WAAW;YACXC,WAAW;gBACPC,QAAQ;gBACRC,SAAS;YACb;WACGN;QAGP,wBAAwB;QACxB,IAAI,CAACC,cAAc,GAAG,IAAIN,WAAW;YACjCY,eAAe;gBACXC,SAAS;gBACTC,gBAAgB,mBACR,EAAA,gCAAA,IAAI,CAACX,cAAc,CAACY,QAAQ,cAA5B,oDAAA,8BAA8BC,OAAO,KAAI;oBACzC,gBAAgB,IAAI,CAACb,cAAc,CAACY,QAAQ,CAACC,OAAO;gBACxD,GACI,EAAA,iCAAA,IAAI,CAACb,cAAc,CAACY,QAAQ,cAA5B,qDAAA,+BAA8BE,WAAW,KAAI;oBAC7C,WAAW,IAAI,CAACd,cAAc,CAACY,QAAQ,CAACE,WAAW;gBACvD;YAER;YACAT,WAAW,IAAI,CAACH,WAAW,CAACG,SAAS;WACjC,IAAI,CAACH,WAAW,CAACI,SAAS,IAAI;YAC9BS,aAAa;gBACTT,WAAW,IAAI,CAACJ,WAAW,CAACI,SAAS;YACzC;QACJ;YACAL,WAAW,IAAI,CAACA,SAAS;YACzBe,cAAc,IAAI,CAAChB,cAAc,CAACiB,MAAM;;QAG5C,4BAA4B;QAC5B,IAAMC,aAAapB,iBAAiB;YAChCmB,QAAQ,IAAI,CAACjB,cAAc,CAACiB,MAAM;QACtC;QAEA,IAAI,CAACb,WAAW,GAAGc,WAAW,IAAI,CAACjB,SAAS,EAAE,mBACtC,IAAI,CAACC,WAAW,CAACG,SAAS,IAAI;YAAEA,WAAW,IAAI,CAACH,WAAW,CAACG,SAAS;QAAC,GACtE,IAAI,CAACH,WAAW,CAACI,SAAS,IAAI;YAC9Ba,WAAW;gBACPb,WAAW,IAAI,CAACJ,WAAW,CAACI,SAAS;YACzC;QACJ;;kBArDCP;;YAyDT;;KAEC,GACDqB,KAAAA;mBAAAA,SAAAA;gBACI,OAAO,IAAI,CAACjB,cAAc;YAC9B;;;YAEA;;KAEC,GACDkB,KAAAA;mBAAAA,SAAAA;gBACI,OAAO,IAAI,CAACjB,WAAW;YAC3B;;;WArESL;IAsEZ"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { describe, expect, it } from '@jterrazz/test';
|
|
2
2
|
import { PROMPT_LIBRARY } from '../library/index.js';
|
|
3
|
-
import {
|
|
3
|
+
import { SystemPrompt } from '../system-prompt.adapter.js';
|
|
4
4
|
describe('Prompt Library Presets', function() {
|
|
5
5
|
it('should generate the correct prompt for DISCORD_COMMUNITY_ANIMATOR', function() {
|
|
6
6
|
// Given - a Discord community animator preset
|
|
7
|
-
var prompt = new
|
|
7
|
+
var prompt = new SystemPrompt(PROMPT_LIBRARY.PRESETS.COMMUNITY_ANIMATOR);
|
|
8
8
|
// When - generating the prompt
|
|
9
9
|
var result = prompt.generate();
|
|
10
10
|
// Then - it should match the expected snapshot
|
|
@@ -12,7 +12,7 @@ describe('Prompt Library Presets', function() {
|
|
|
12
12
|
});
|
|
13
13
|
it('should generate the correct prompt for EMPATHETIC_SUPPORT_AGENT', function() {
|
|
14
14
|
// Given - an empathetic support agent preset
|
|
15
|
-
var prompt = new
|
|
15
|
+
var prompt = new SystemPrompt(PROMPT_LIBRARY.PRESETS.EMPATHETIC_SUPPORT_AGENT);
|
|
16
16
|
// When - generating the prompt
|
|
17
17
|
var result = prompt.generate();
|
|
18
18
|
// Then - it should match the expected snapshot
|
|
@@ -20,7 +20,7 @@ describe('Prompt Library Presets', function() {
|
|
|
20
20
|
});
|
|
21
21
|
it('should generate the correct prompt for CREATIVE_BRAINSTORMER', function() {
|
|
22
22
|
// Given - a creative brainstormer preset
|
|
23
|
-
var prompt = new
|
|
23
|
+
var prompt = new SystemPrompt(PROMPT_LIBRARY.PRESETS.CREATIVE_BRAINSTORMER);
|
|
24
24
|
// When - generating the prompt
|
|
25
25
|
var result = prompt.generate();
|
|
26
26
|
// Then - it should match the expected snapshot
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/adapters/prompts/__tests__/presets.test.ts"],"sourcesContent":["import { describe, expect, it } from '@jterrazz/test';\n\nimport { PROMPT_LIBRARY } from '../library/index.js';\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../src/adapters/prompts/__tests__/presets.test.ts"],"sourcesContent":["import { describe, expect, it } from '@jterrazz/test';\n\nimport { PROMPT_LIBRARY } from '../library/index.js';\nimport { SystemPrompt } from '../system-prompt.adapter.js';\n\ndescribe('Prompt Library Presets', () => {\n it('should generate the correct prompt for DISCORD_COMMUNITY_ANIMATOR', () => {\n // Given - a Discord community animator preset\n const prompt = new SystemPrompt(PROMPT_LIBRARY.PRESETS.COMMUNITY_ANIMATOR);\n\n // When - generating the prompt\n const result = prompt.generate();\n\n // Then - it should match the expected snapshot\n expect(result).toMatchSnapshot();\n });\n\n it('should generate the correct prompt for EMPATHETIC_SUPPORT_AGENT', () => {\n // Given - an empathetic support agent preset\n const prompt = new SystemPrompt(PROMPT_LIBRARY.PRESETS.EMPATHETIC_SUPPORT_AGENT);\n\n // When - generating the prompt\n const result = prompt.generate();\n\n // Then - it should match the expected snapshot\n expect(result).toMatchSnapshot();\n });\n\n it('should generate the correct prompt for CREATIVE_BRAINSTORMER', () => {\n // Given - a creative brainstormer preset\n const prompt = new SystemPrompt(PROMPT_LIBRARY.PRESETS.CREATIVE_BRAINSTORMER);\n\n // When - generating the prompt\n const result = prompt.generate();\n\n // Then - it should match the expected snapshot\n expect(result).toMatchSnapshot();\n });\n});\n"],"names":["describe","expect","it","PROMPT_LIBRARY","SystemPrompt","prompt","PRESETS","COMMUNITY_ANIMATOR","result","generate","toMatchSnapshot","EMPATHETIC_SUPPORT_AGENT","CREATIVE_BRAINSTORMER"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,iBAAiB;AAEtD,SAASC,cAAc,QAAQ,sBAAsB;AACrD,SAASC,YAAY,QAAQ,8BAA8B;AAE3DJ,SAAS,0BAA0B;IAC/BE,GAAG,qEAAqE;QACpE,8CAA8C;QAC9C,IAAMG,SAAS,IAAID,aAAaD,eAAeG,OAAO,CAACC,kBAAkB;QAEzE,+BAA+B;QAC/B,IAAMC,SAASH,OAAOI,QAAQ;QAE9B,+CAA+C;QAC/CR,OAAOO,QAAQE,eAAe;IAClC;IAEAR,GAAG,mEAAmE;QAClE,6CAA6C;QAC7C,IAAMG,SAAS,IAAID,aAAaD,eAAeG,OAAO,CAACK,wBAAwB;QAE/E,+BAA+B;QAC/B,IAAMH,SAASH,OAAOI,QAAQ;QAE9B,+CAA+C;QAC/CR,OAAOO,QAAQE,eAAe;IAClC;IAEAR,GAAG,gEAAgE;QAC/D,yCAAyC;QACzC,IAAMG,SAAS,IAAID,aAAaD,eAAeG,OAAO,CAACM,qBAAqB;QAE5E,+BAA+B;QAC/B,IAAMJ,SAASH,OAAOI,QAAQ;QAE9B,+CAA+C;QAC/CR,OAAOO,QAAQE,eAAe;IAClC;AACJ"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { PromptPort } from '../../ports/prompt.port.js';
|
|
2
2
|
/**
|
|
3
|
-
* System prompt
|
|
3
|
+
* System prompt that generates a system prompt from a list of strings
|
|
4
4
|
*/
|
|
5
|
-
export declare class
|
|
5
|
+
export declare class SystemPrompt implements PromptPort {
|
|
6
6
|
private readonly finalPrompt;
|
|
7
7
|
constructor(...prompts: readonly (readonly string[] | string)[]);
|
|
8
8
|
generate(): string;
|
|
@@ -31,19 +31,19 @@ function _define_property(obj, key, value) {
|
|
|
31
31
|
return obj;
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
|
-
* System prompt
|
|
35
|
-
*/ export var
|
|
34
|
+
* System prompt that generates a system prompt from a list of strings
|
|
35
|
+
*/ export var SystemPrompt = /*#__PURE__*/ function() {
|
|
36
36
|
"use strict";
|
|
37
|
-
function
|
|
37
|
+
function SystemPrompt() {
|
|
38
38
|
for(var _len = arguments.length, prompts = new Array(_len), _key = 0; _key < _len; _key++){
|
|
39
39
|
prompts[_key] = arguments[_key];
|
|
40
40
|
}
|
|
41
|
-
_class_call_check(this,
|
|
41
|
+
_class_call_check(this, SystemPrompt);
|
|
42
42
|
_define_property(this, "finalPrompt", void 0);
|
|
43
43
|
var flattenedPrompts = prompts.flat();
|
|
44
44
|
this.finalPrompt = flattenedPrompts.join('\n\n');
|
|
45
45
|
}
|
|
46
|
-
_create_class(
|
|
46
|
+
_create_class(SystemPrompt, [
|
|
47
47
|
{
|
|
48
48
|
key: "generate",
|
|
49
49
|
value: function generate() {
|
|
@@ -51,7 +51,7 @@ function _define_property(obj, key, value) {
|
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
]);
|
|
54
|
-
return
|
|
54
|
+
return SystemPrompt;
|
|
55
55
|
}();
|
|
56
56
|
|
|
57
57
|
//# sourceMappingURL=system-prompt.adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/adapters/prompts/system-prompt.adapter.ts"],"sourcesContent":["import type { PromptPort } from '../../ports/prompt.port.js';\n\n/**\n * System prompt
|
|
1
|
+
{"version":3,"sources":["../../../src/adapters/prompts/system-prompt.adapter.ts"],"sourcesContent":["import type { PromptPort } from '../../ports/prompt.port.js';\n\n/**\n * System prompt that generates a system prompt from a list of strings\n */\nexport class SystemPrompt implements PromptPort {\n private readonly finalPrompt: string;\n\n constructor(...prompts: readonly (readonly string[] | string)[]) {\n const flattenedPrompts = prompts.flat();\n this.finalPrompt = flattenedPrompts.join('\\n\\n');\n }\n\n generate(): string {\n return this.finalPrompt;\n }\n}\n"],"names":["SystemPrompt","prompts","finalPrompt","flattenedPrompts","flat","join","generate"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA;;CAEC,GACD,OAAO,IAAA,AAAMA,6BAAN;;aAAMA;QAGG,IAAA,IAAA,OAAA,UAAA,QAAA,AAAGC,UAAH,UAAA,OAAA,OAAA,GAAA,OAAA,MAAA;YAAGA,QAAH,QAAA,SAAA,CAAA,KAAmD;;gCAHtDD;QACT,uBAAiBE,eAAjB,KAAA;QAGI,IAAMC,mBAAmBF,QAAQG,IAAI;QACrC,IAAI,CAACF,WAAW,GAAGC,iBAAiBE,IAAI,CAAC;;kBALpCL;;YAQTM,KAAAA;mBAAAA,SAAAA;gBACI,OAAO,IAAI,CAACJ,WAAW;YAC3B;;;WAVSF;IAWZ"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { PromptPort } from '../../ports/prompt.port.js';
|
|
2
2
|
/**
|
|
3
|
-
* User prompt
|
|
3
|
+
* User prompt that generates a user prompt from a list of strings
|
|
4
4
|
*/
|
|
5
|
-
export declare class
|
|
5
|
+
export declare class UserPrompt implements PromptPort {
|
|
6
6
|
private readonly finalPrompt;
|
|
7
7
|
constructor(...prompts: readonly (readonly string[] | string)[]);
|
|
8
8
|
generate(): string;
|
|
@@ -31,19 +31,19 @@ function _define_property(obj, key, value) {
|
|
|
31
31
|
return obj;
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
|
-
* User prompt
|
|
35
|
-
*/ export var
|
|
34
|
+
* User prompt that generates a user prompt from a list of strings
|
|
35
|
+
*/ export var UserPrompt = /*#__PURE__*/ function() {
|
|
36
36
|
"use strict";
|
|
37
|
-
function
|
|
37
|
+
function UserPrompt() {
|
|
38
38
|
for(var _len = arguments.length, prompts = new Array(_len), _key = 0; _key < _len; _key++){
|
|
39
39
|
prompts[_key] = arguments[_key];
|
|
40
40
|
}
|
|
41
|
-
_class_call_check(this,
|
|
41
|
+
_class_call_check(this, UserPrompt);
|
|
42
42
|
_define_property(this, "finalPrompt", void 0);
|
|
43
43
|
var flattenedPrompts = prompts.flat();
|
|
44
44
|
this.finalPrompt = flattenedPrompts.join('\n\n');
|
|
45
45
|
}
|
|
46
|
-
_create_class(
|
|
46
|
+
_create_class(UserPrompt, [
|
|
47
47
|
{
|
|
48
48
|
key: "generate",
|
|
49
49
|
value: function generate() {
|
|
@@ -51,7 +51,7 @@ function _define_property(obj, key, value) {
|
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
]);
|
|
54
|
-
return
|
|
54
|
+
return UserPrompt;
|
|
55
55
|
}();
|
|
56
56
|
|
|
57
57
|
//# sourceMappingURL=user-prompt.adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/adapters/prompts/user-prompt.adapter.ts"],"sourcesContent":["import type { PromptPort } from '../../ports/prompt.port.js';\n\n/**\n * User prompt
|
|
1
|
+
{"version":3,"sources":["../../../src/adapters/prompts/user-prompt.adapter.ts"],"sourcesContent":["import type { PromptPort } from '../../ports/prompt.port.js';\n\n/**\n * User prompt that generates a user prompt from a list of strings\n */\nexport class UserPrompt implements PromptPort {\n private readonly finalPrompt: string;\n\n constructor(...prompts: readonly (readonly string[] | string)[]) {\n const flattenedPrompts = prompts.flat();\n this.finalPrompt = flattenedPrompts.join('\\n\\n');\n }\n\n generate(): string {\n return this.finalPrompt;\n }\n}\n"],"names":["UserPrompt","prompts","finalPrompt","flattenedPrompts","flat","join","generate"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA;;CAEC,GACD,OAAO,IAAA,AAAMA,2BAAN;;aAAMA;QAGG,IAAA,IAAA,OAAA,UAAA,QAAA,AAAGC,UAAH,UAAA,OAAA,OAAA,GAAA,OAAA,MAAA;YAAGA,QAAH,QAAA,SAAA,CAAA,KAAmD;;gCAHtDD;QACT,uBAAiBE,eAAjB,KAAA;QAGI,IAAMC,mBAAmBF,QAAQG,IAAI;QACrC,IAAI,CAACF,WAAW,GAAGC,iBAAiBE,IAAI,CAAC;;kBALpCL;;YAQTM,KAAAA;mBAAAA,SAAAA;gBACI,OAAO,IAAI,CAACJ,WAAW;YAC3B;;;WAVSF;IAWZ"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ModelConfig } from '../../ports/model.port.js';
|
|
2
|
+
import type { ProviderPort } from '../../ports/provider.port.js';
|
|
3
|
+
import { OpenRouterModel } from '../models/openrouter-model.adapter.js';
|
|
4
|
+
export interface OpenRouterConfig {
|
|
5
|
+
/**
|
|
6
|
+
* OpenRouter API key
|
|
7
|
+
*/
|
|
8
|
+
apiKey: string;
|
|
9
|
+
/**
|
|
10
|
+
* Optional metadata for request headers
|
|
11
|
+
*/
|
|
12
|
+
metadata?: OpenRouterMetadata;
|
|
13
|
+
}
|
|
14
|
+
export interface OpenRouterMetadata {
|
|
15
|
+
/**
|
|
16
|
+
* Application title for X-Title header
|
|
17
|
+
*/
|
|
18
|
+
application?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Website URL for HTTP-Referer header
|
|
21
|
+
*/
|
|
22
|
+
website?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* OpenRouter provider that manages connection configuration
|
|
26
|
+
*/
|
|
27
|
+
export declare class OpenRouterProvider implements ProviderPort {
|
|
28
|
+
private readonly config;
|
|
29
|
+
constructor(config: OpenRouterConfig);
|
|
30
|
+
/**
|
|
31
|
+
* Get a model instance for the specified model name
|
|
32
|
+
*/
|
|
33
|
+
getModel(modelName: string, modelConfig?: ModelConfig): OpenRouterModel;
|
|
34
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
function _class_call_check(instance, Constructor) {
|
|
2
|
+
if (!(instance instanceof Constructor)) {
|
|
3
|
+
throw new TypeError("Cannot call a class as a function");
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
function _defineProperties(target, props) {
|
|
7
|
+
for(var i = 0; i < props.length; i++){
|
|
8
|
+
var descriptor = props[i];
|
|
9
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
10
|
+
descriptor.configurable = true;
|
|
11
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
12
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function _create_class(Constructor, protoProps, staticProps) {
|
|
16
|
+
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
17
|
+
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
18
|
+
return Constructor;
|
|
19
|
+
}
|
|
20
|
+
function _define_property(obj, key, value) {
|
|
21
|
+
if (key in obj) {
|
|
22
|
+
Object.defineProperty(obj, key, {
|
|
23
|
+
value: value,
|
|
24
|
+
enumerable: true,
|
|
25
|
+
configurable: true,
|
|
26
|
+
writable: true
|
|
27
|
+
});
|
|
28
|
+
} else {
|
|
29
|
+
obj[key] = value;
|
|
30
|
+
}
|
|
31
|
+
return obj;
|
|
32
|
+
}
|
|
33
|
+
import { OpenRouterModel } from '../models/openrouter-model.adapter.js';
|
|
34
|
+
/**
|
|
35
|
+
* OpenRouter provider that manages connection configuration
|
|
36
|
+
*/ export var OpenRouterProvider = /*#__PURE__*/ function() {
|
|
37
|
+
"use strict";
|
|
38
|
+
function OpenRouterProvider(config) {
|
|
39
|
+
_class_call_check(this, OpenRouterProvider);
|
|
40
|
+
_define_property(this, "config", void 0);
|
|
41
|
+
this.config = config;
|
|
42
|
+
}
|
|
43
|
+
_create_class(OpenRouterProvider, [
|
|
44
|
+
{
|
|
45
|
+
/**
|
|
46
|
+
* Get a model instance for the specified model name
|
|
47
|
+
*/ key: "getModel",
|
|
48
|
+
value: function getModel(modelName) {
|
|
49
|
+
var modelConfig = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
50
|
+
return new OpenRouterModel(this.config, modelName, modelConfig);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
]);
|
|
54
|
+
return OpenRouterProvider;
|
|
55
|
+
}();
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=openrouter-provider.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/adapters/providers/openrouter-provider.adapter.ts"],"sourcesContent":["import type { ModelConfig } from '../../ports/model.port.js';\nimport type { ProviderPort } from '../../ports/provider.port.js';\n\nimport { OpenRouterModel } from '../models/openrouter-model.adapter.js';\n\nexport interface OpenRouterConfig {\n /**\n * OpenRouter API key\n */\n apiKey: string;\n /**\n * Optional metadata for request headers\n */\n metadata?: OpenRouterMetadata;\n}\n\nexport interface OpenRouterMetadata {\n /**\n * Application title for X-Title header\n */\n application?: string;\n /**\n * Website URL for HTTP-Referer header\n */\n website?: string;\n}\n\n/**\n * OpenRouter provider that manages connection configuration\n */\nexport class OpenRouterProvider implements ProviderPort {\n constructor(private readonly config: OpenRouterConfig) {}\n\n /**\n * Get a model instance for the specified model name\n */\n getModel(modelName: string, modelConfig: ModelConfig = {}) {\n return new OpenRouterModel(this.config, modelName, modelConfig);\n }\n}\n"],"names":["OpenRouterModel","OpenRouterProvider","config","getModel","modelName","modelConfig"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,SAASA,eAAe,QAAQ,wCAAwC;AAwBxE;;CAEC,GACD,OAAO,IAAA,AAAMC,mCAAN;;aAAMA,mBACG,AAAiBC,MAAwB;gCAD5CD;;aACoBC,SAAAA;;kBADpBD;;YAGT;;KAEC,GACDE,KAAAA;mBAAAA,SAAAA,SAASC,SAAiB;oBAAEC,cAAAA,iEAA2B,CAAC;gBACpD,OAAO,IAAIL,gBAAgB,IAAI,CAACE,MAAM,EAAEE,WAAWC;YACvD;;;WARSJ;IASZ"}
|
|
@@ -13,9 +13,9 @@ export type ToolConfig<T = void> = {
|
|
|
13
13
|
};
|
|
14
14
|
export type ToolFunction<T = void> = T extends void ? () => Promise<string> : (args: T) => Promise<string>;
|
|
15
15
|
/**
|
|
16
|
-
* Safe tool
|
|
16
|
+
* Safe tool that provides error handling and logging for LangChain tools
|
|
17
17
|
*/
|
|
18
|
-
export declare class
|
|
18
|
+
export declare class SafeTool<T = void> implements ToolPort {
|
|
19
19
|
private readonly config;
|
|
20
20
|
private readonly options;
|
|
21
21
|
private readonly dynamicTool;
|