@inkeep/agents-run-api 0.1.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 +117 -0
- package/dist/AgentExecutionServer.d.ts +23 -0
- package/dist/AgentExecutionServer.d.ts.map +1 -0
- package/dist/AgentExecutionServer.js +32 -0
- package/dist/__tests__/setup.d.ts +4 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +50 -0
- package/dist/__tests__/utils/testProject.d.ts +18 -0
- package/dist/__tests__/utils/testProject.d.ts.map +1 -0
- package/dist/__tests__/utils/testProject.js +26 -0
- package/dist/__tests__/utils/testRequest.d.ts +8 -0
- package/dist/__tests__/utils/testRequest.d.ts.map +1 -0
- package/dist/__tests__/utils/testRequest.js +32 -0
- package/dist/__tests__/utils/testTenant.d.ts +64 -0
- package/dist/__tests__/utils/testTenant.d.ts.map +1 -0
- package/dist/__tests__/utils/testTenant.js +71 -0
- package/dist/a2a/client.d.ts +182 -0
- package/dist/a2a/client.d.ts.map +1 -0
- package/dist/a2a/client.js +645 -0
- package/dist/a2a/handlers.d.ts +4 -0
- package/dist/a2a/handlers.d.ts.map +1 -0
- package/dist/a2a/handlers.js +657 -0
- package/dist/a2a/transfer.d.ts +18 -0
- package/dist/a2a/transfer.d.ts.map +1 -0
- package/dist/a2a/transfer.js +22 -0
- package/dist/a2a/types.d.ts +63 -0
- package/dist/a2a/types.d.ts.map +1 -0
- package/dist/a2a/types.js +1 -0
- package/dist/agents/Agent.d.ts +154 -0
- package/dist/agents/Agent.d.ts.map +1 -0
- package/dist/agents/Agent.js +1105 -0
- package/dist/agents/ModelFactory.d.ts +62 -0
- package/dist/agents/ModelFactory.d.ts.map +1 -0
- package/dist/agents/ModelFactory.js +208 -0
- package/dist/agents/SystemPromptBuilder.d.ts +14 -0
- package/dist/agents/SystemPromptBuilder.d.ts.map +1 -0
- package/dist/agents/SystemPromptBuilder.js +62 -0
- package/dist/agents/ToolSessionManager.d.ts +61 -0
- package/dist/agents/ToolSessionManager.d.ts.map +1 -0
- package/dist/agents/ToolSessionManager.js +143 -0
- package/dist/agents/artifactTools.d.ts +30 -0
- package/dist/agents/artifactTools.d.ts.map +1 -0
- package/dist/agents/artifactTools.js +463 -0
- package/dist/agents/generateTaskHandler.d.ts +41 -0
- package/dist/agents/generateTaskHandler.d.ts.map +1 -0
- package/dist/agents/generateTaskHandler.js +350 -0
- package/dist/agents/relationTools.d.ts +33 -0
- package/dist/agents/relationTools.d.ts.map +1 -0
- package/dist/agents/relationTools.js +245 -0
- package/dist/agents/types.d.ts +23 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +1 -0
- package/dist/agents/versions/V1Config.d.ts +21 -0
- package/dist/agents/versions/V1Config.d.ts.map +1 -0
- package/dist/agents/versions/V1Config.js +285 -0
- package/dist/app.d.ts +4 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +194 -0
- package/dist/data/agentGraph.d.ts +4 -0
- package/dist/data/agentGraph.d.ts.map +1 -0
- package/dist/data/agentGraph.js +73 -0
- package/dist/data/agents.d.ts +4 -0
- package/dist/data/agents.d.ts.map +1 -0
- package/dist/data/agents.js +73 -0
- package/dist/data/conversations.d.ts +59 -0
- package/dist/data/conversations.d.ts.map +1 -0
- package/dist/data/conversations.js +216 -0
- package/dist/data/db/clean.d.ts +6 -0
- package/dist/data/db/clean.d.ts.map +1 -0
- package/dist/data/db/clean.js +77 -0
- package/dist/data/db/dbClient.d.ts +3 -0
- package/dist/data/db/dbClient.d.ts.map +1 -0
- package/dist/data/db/dbClient.js +13 -0
- package/dist/env.d.ts +43 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +63 -0
- package/dist/handlers/executionHandler.d.ts +36 -0
- package/dist/handlers/executionHandler.d.ts.map +1 -0
- package/dist/handlers/executionHandler.js +402 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/instrumentation.d.ts +13 -0
- package/dist/instrumentation.d.ts.map +1 -0
- package/dist/instrumentation.js +66 -0
- package/dist/logger.d.ts +4 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +32 -0
- package/dist/middleware/api-key-auth.d.ts +22 -0
- package/dist/middleware/api-key-auth.d.ts.map +1 -0
- package/dist/middleware/api-key-auth.js +139 -0
- package/dist/middleware/index.d.ts +2 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +1 -0
- package/dist/openapi.d.ts +2 -0
- package/dist/openapi.d.ts.map +1 -0
- package/dist/openapi.js +36 -0
- package/dist/routes/agents.d.ts +4 -0
- package/dist/routes/agents.d.ts.map +1 -0
- package/dist/routes/agents.js +155 -0
- package/dist/routes/chat.d.ts +4 -0
- package/dist/routes/chat.d.ts.map +1 -0
- package/dist/routes/chat.js +308 -0
- package/dist/routes/chatDataStream.d.ts +4 -0
- package/dist/routes/chatDataStream.d.ts.map +1 -0
- package/dist/routes/chatDataStream.js +179 -0
- package/dist/routes/mcp.d.ts +4 -0
- package/dist/routes/mcp.d.ts.map +1 -0
- package/dist/routes/mcp.js +500 -0
- package/dist/tracer.d.ts +24 -0
- package/dist/tracer.d.ts.map +1 -0
- package/dist/tracer.js +97 -0
- package/dist/types/chat.d.ts +25 -0
- package/dist/types/chat.d.ts.map +1 -0
- package/dist/types/chat.js +1 -0
- package/dist/types/execution-context.d.ts +14 -0
- package/dist/types/execution-context.d.ts.map +1 -0
- package/dist/types/execution-context.js +14 -0
- package/dist/utils/agent-operations.d.ts +79 -0
- package/dist/utils/agent-operations.d.ts.map +1 -0
- package/dist/utils/agent-operations.js +67 -0
- package/dist/utils/artifact-component-schema.d.ts +29 -0
- package/dist/utils/artifact-component-schema.d.ts.map +1 -0
- package/dist/utils/artifact-component-schema.js +119 -0
- package/dist/utils/artifact-parser.d.ts +71 -0
- package/dist/utils/artifact-parser.d.ts.map +1 -0
- package/dist/utils/artifact-parser.js +251 -0
- package/dist/utils/cleanup.d.ts +19 -0
- package/dist/utils/cleanup.d.ts.map +1 -0
- package/dist/utils/cleanup.js +66 -0
- package/dist/utils/data-component-schema.d.ts +6 -0
- package/dist/utils/data-component-schema.d.ts.map +1 -0
- package/dist/utils/data-component-schema.js +43 -0
- package/dist/utils/graph-session.d.ts +200 -0
- package/dist/utils/graph-session.d.ts.map +1 -0
- package/dist/utils/graph-session.js +1009 -0
- package/dist/utils/incremental-stream-parser.d.ts +57 -0
- package/dist/utils/incremental-stream-parser.d.ts.map +1 -0
- package/dist/utils/incremental-stream-parser.js +287 -0
- package/dist/utils/response-formatter.d.ts +27 -0
- package/dist/utils/response-formatter.d.ts.map +1 -0
- package/dist/utils/response-formatter.js +160 -0
- package/dist/utils/stream-helpers.d.ts +162 -0
- package/dist/utils/stream-helpers.d.ts.map +1 -0
- package/dist/utils/stream-helpers.js +385 -0
- package/dist/utils/stream-registry.d.ts +18 -0
- package/dist/utils/stream-registry.d.ts.map +1 -0
- package/dist/utils/stream-registry.js +33 -0
- package/package.json +88 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { LanguageModel } from 'ai';
|
|
2
|
+
export interface ModelSettings {
|
|
3
|
+
model?: string;
|
|
4
|
+
providerOptions?: Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Factory for creating AI SDK language models from configuration
|
|
8
|
+
* Supports multiple providers and AI Gateway integration
|
|
9
|
+
*/
|
|
10
|
+
export declare class ModelFactory {
|
|
11
|
+
/**
|
|
12
|
+
* Default model settingsuration to use when no model settings is provided
|
|
13
|
+
* Uses provider defaults for all parameters
|
|
14
|
+
*/
|
|
15
|
+
private static readonly DEFAULT_MODEL_CONFIG;
|
|
16
|
+
/**
|
|
17
|
+
* Create a language model instance from configuration
|
|
18
|
+
* Falls back to default Anthropic model if no config provided
|
|
19
|
+
*/
|
|
20
|
+
static createModel(config?: ModelSettings | null): LanguageModel;
|
|
21
|
+
/**
|
|
22
|
+
* Supported providers for security validation
|
|
23
|
+
*/
|
|
24
|
+
private static readonly SUPPORTED_PROVIDERS;
|
|
25
|
+
/**
|
|
26
|
+
* Parse model string to extract provider and model name
|
|
27
|
+
* Examples: "anthropic/claude-4-sonnet" -> { provider: "anthropic", modelName: "claude-4-sonnet" }
|
|
28
|
+
* "claude-4-sonnet" -> { provider: "anthropic", modelName: "claude-4-sonnet" } (default to anthropic)
|
|
29
|
+
*/
|
|
30
|
+
static parseModelString(modelString: string): {
|
|
31
|
+
provider: string;
|
|
32
|
+
modelName: string;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Create an Anthropic model instance
|
|
36
|
+
*/
|
|
37
|
+
private static createAnthropicModel;
|
|
38
|
+
/**
|
|
39
|
+
* Create an OpenAI model instance
|
|
40
|
+
*/
|
|
41
|
+
private static createOpenAIModel;
|
|
42
|
+
/**
|
|
43
|
+
* Get generation parameters from provider options
|
|
44
|
+
* These are parameters that get passed to generateText/streamText calls
|
|
45
|
+
*/
|
|
46
|
+
static getGenerationParams(providerOptions?: Record<string, unknown>): Record<string, unknown>;
|
|
47
|
+
/**
|
|
48
|
+
* Prepare complete generation configuration from model settings
|
|
49
|
+
* Returns model instance and generation parameters ready to spread into generateText/streamText
|
|
50
|
+
* Includes maxDuration if specified in provider options (in seconds, following Vercel standard)
|
|
51
|
+
*/
|
|
52
|
+
static prepareGenerationConfig(modelSettings?: ModelSettings): {
|
|
53
|
+
model: LanguageModel;
|
|
54
|
+
maxDuration?: number;
|
|
55
|
+
} & Record<string, unknown>;
|
|
56
|
+
/**
|
|
57
|
+
* Validate model settingsuration
|
|
58
|
+
* Basic validation only - let AI SDK handle parameter-specific validation
|
|
59
|
+
*/
|
|
60
|
+
static validateConfig(config: ModelSettings): string[];
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=ModelFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelFactory.d.ts","sourceRoot":"","sources":["../../src/agents/ModelFactory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAKxC,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED;;;GAGG;AACH,qBAAa,YAAY;IACvB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAE1C;IAEF;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI,GAAG,aAAa;IAiDhE;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAoC;IAE/E;;;;OAIG;IACH,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IA+BrF;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAkCnC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAgChC;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CACxB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACxC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAoB1B;;;;OAIG;IACH,MAAM,CAAC,uBAAuB,CAAC,aAAa,CAAC,EAAE,aAAa,GAAG;QAAE,KAAK,EAAE,aAAa,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAwBvI;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE;CA4BvD"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { anthropic, createAnthropic } from '@ai-sdk/anthropic';
|
|
2
|
+
import { createOpenAI, openai } from '@ai-sdk/openai';
|
|
3
|
+
import { getLogger } from '../logger.js';
|
|
4
|
+
const logger = getLogger('ModelFactory');
|
|
5
|
+
/**
|
|
6
|
+
* Factory for creating AI SDK language models from configuration
|
|
7
|
+
* Supports multiple providers and AI Gateway integration
|
|
8
|
+
*/
|
|
9
|
+
export class ModelFactory {
|
|
10
|
+
/**
|
|
11
|
+
* Default model settingsuration to use when no model settings is provided
|
|
12
|
+
* Uses provider defaults for all parameters
|
|
13
|
+
*/
|
|
14
|
+
static DEFAULT_MODEL_CONFIG = {
|
|
15
|
+
model: 'anthropic/claude-4-sonnet-20250514',
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Create a language model instance from configuration
|
|
19
|
+
* Falls back to default Anthropic model if no config provided
|
|
20
|
+
*/
|
|
21
|
+
static createModel(config) {
|
|
22
|
+
// Use default config if none provided
|
|
23
|
+
const modelSettings = config || ModelFactory.DEFAULT_MODEL_CONFIG;
|
|
24
|
+
// Extract provider from model string (e.g., "anthropic/claude-4-sonnet" -> "anthropic")
|
|
25
|
+
// Handle empty strings by falling back to default
|
|
26
|
+
const modelString = (modelSettings.model?.trim()) || ModelFactory.DEFAULT_MODEL_CONFIG.model;
|
|
27
|
+
const { provider, modelName } = ModelFactory.parseModelString(modelString);
|
|
28
|
+
logger.debug({
|
|
29
|
+
provider,
|
|
30
|
+
model: modelName,
|
|
31
|
+
fullModelString: modelSettings.model,
|
|
32
|
+
hasProviderOptions: !!modelSettings.providerOptions,
|
|
33
|
+
}, 'Creating language model from config');
|
|
34
|
+
try {
|
|
35
|
+
switch (provider) {
|
|
36
|
+
case 'anthropic':
|
|
37
|
+
return ModelFactory.createAnthropicModel(modelName, modelSettings.providerOptions);
|
|
38
|
+
case 'openai':
|
|
39
|
+
return ModelFactory.createOpenAIModel(modelName, modelSettings.providerOptions);
|
|
40
|
+
default:
|
|
41
|
+
logger.warn({ provider, modelName }, 'Unknown or unsupported provider, falling back to default Anthropic model');
|
|
42
|
+
return ModelFactory.createAnthropicModel('claude-4-sonnet-20250514');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
logger.error({
|
|
47
|
+
provider,
|
|
48
|
+
model: modelName,
|
|
49
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
50
|
+
}, 'Failed to create model, falling back to default');
|
|
51
|
+
// Fall back to default model if creation fails
|
|
52
|
+
return ModelFactory.createAnthropicModel('claude-4-sonnet-20250514');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Supported providers for security validation
|
|
57
|
+
*/
|
|
58
|
+
static SUPPORTED_PROVIDERS = ['anthropic', 'openai'];
|
|
59
|
+
/**
|
|
60
|
+
* Parse model string to extract provider and model name
|
|
61
|
+
* Examples: "anthropic/claude-4-sonnet" -> { provider: "anthropic", modelName: "claude-4-sonnet" }
|
|
62
|
+
* "claude-4-sonnet" -> { provider: "anthropic", modelName: "claude-4-sonnet" } (default to anthropic)
|
|
63
|
+
*/
|
|
64
|
+
static parseModelString(modelString) {
|
|
65
|
+
// Handle format like "provider/model-name"
|
|
66
|
+
if (modelString.includes('/')) {
|
|
67
|
+
const [provider, ...modelParts] = modelString.split('/');
|
|
68
|
+
const normalizedProvider = provider.toLowerCase();
|
|
69
|
+
// Validate provider is supported
|
|
70
|
+
if (!ModelFactory.SUPPORTED_PROVIDERS.includes(normalizedProvider)) {
|
|
71
|
+
logger.warn({ provider: normalizedProvider, modelName: modelParts.join('/') }, 'Unsupported provider detected, falling back to anthropic');
|
|
72
|
+
return {
|
|
73
|
+
provider: 'anthropic',
|
|
74
|
+
modelName: modelParts.join('/'),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
provider: normalizedProvider,
|
|
79
|
+
modelName: modelParts.join('/'), // In case model name has slashes
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// Default to anthropic if no provider specified
|
|
83
|
+
return {
|
|
84
|
+
provider: 'anthropic',
|
|
85
|
+
modelName: modelString,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Create an Anthropic model instance
|
|
90
|
+
*/
|
|
91
|
+
static createAnthropicModel(modelName, providerOptions) {
|
|
92
|
+
const anthropicConfig = {};
|
|
93
|
+
// Extract provider configuration (baseURL, etc.)
|
|
94
|
+
// Note: API keys should be provided via environment variables, not in configuration
|
|
95
|
+
if (providerOptions?.baseUrl || providerOptions?.baseURL) {
|
|
96
|
+
anthropicConfig.baseURL = providerOptions.baseUrl || providerOptions.baseURL;
|
|
97
|
+
}
|
|
98
|
+
// Handle AI Gateway configuration if present
|
|
99
|
+
if (providerOptions?.gateway) {
|
|
100
|
+
logger.info({ gateway: providerOptions.gateway }, 'Setting up AI Gateway for Anthropic model');
|
|
101
|
+
// AI Gateway configuration would go here
|
|
102
|
+
// This depends on the specific gateway implementation
|
|
103
|
+
Object.assign(anthropicConfig, providerOptions.gateway);
|
|
104
|
+
}
|
|
105
|
+
// For AI SDK v5, model parameters like temperature are passed to generateText/streamText,
|
|
106
|
+
// not to the model constructor. Only provider config (apiKey, baseURL) goes to the provider.
|
|
107
|
+
if (Object.keys(anthropicConfig).length > 0) {
|
|
108
|
+
logger.info({ config: anthropicConfig }, 'Applying custom Anthropic provider configuration');
|
|
109
|
+
// In AI SDK v5, use createAnthropic for custom config
|
|
110
|
+
const provider = createAnthropic(anthropicConfig);
|
|
111
|
+
return provider(modelName);
|
|
112
|
+
}
|
|
113
|
+
return anthropic(modelName);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Create an OpenAI model instance
|
|
117
|
+
*/
|
|
118
|
+
static createOpenAIModel(modelName, providerOptions) {
|
|
119
|
+
const openaiConfig = {};
|
|
120
|
+
// Extract provider configuration (baseURL, etc.)
|
|
121
|
+
// Note: API keys should be provided via environment variables, not in configuration
|
|
122
|
+
if (providerOptions?.baseUrl || providerOptions?.baseURL) {
|
|
123
|
+
openaiConfig.baseURL = providerOptions.baseUrl || providerOptions.baseURL;
|
|
124
|
+
}
|
|
125
|
+
// Handle AI Gateway configuration if present
|
|
126
|
+
if (providerOptions?.gateway) {
|
|
127
|
+
logger.info({ gateway: providerOptions.gateway }, 'Setting up AI Gateway for OpenAI model');
|
|
128
|
+
Object.assign(openaiConfig, providerOptions.gateway);
|
|
129
|
+
}
|
|
130
|
+
// For AI SDK v5, model parameters like temperature are passed to generateText/streamText,
|
|
131
|
+
// not to the model constructor. Only provider config (apiKey, baseURL) goes to the provider.
|
|
132
|
+
if (Object.keys(openaiConfig).length > 0) {
|
|
133
|
+
logger.info({ config: openaiConfig }, 'Applying custom OpenAI provider configuration');
|
|
134
|
+
// In AI SDK v5, use createOpenAI for custom config
|
|
135
|
+
const provider = createOpenAI(openaiConfig);
|
|
136
|
+
return provider(modelName);
|
|
137
|
+
}
|
|
138
|
+
return openai(modelName);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get generation parameters from provider options
|
|
142
|
+
* These are parameters that get passed to generateText/streamText calls
|
|
143
|
+
*/
|
|
144
|
+
static getGenerationParams(providerOptions) {
|
|
145
|
+
if (!providerOptions) {
|
|
146
|
+
return {};
|
|
147
|
+
}
|
|
148
|
+
// Exclude provider config items (these go to createProvider, not generateText/streamText)
|
|
149
|
+
// Also exclude maxDuration as it's handled separately for timeouts
|
|
150
|
+
const excludedKeys = ['apiKey', 'baseURL', 'baseUrl', 'maxDuration'];
|
|
151
|
+
// Return all config except excluded items
|
|
152
|
+
const params = {};
|
|
153
|
+
for (const [key, value] of Object.entries(providerOptions)) {
|
|
154
|
+
if (!excludedKeys.includes(key) && value !== undefined) {
|
|
155
|
+
params[key] = value;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return params;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Prepare complete generation configuration from model settings
|
|
162
|
+
* Returns model instance and generation parameters ready to spread into generateText/streamText
|
|
163
|
+
* Includes maxDuration if specified in provider options (in seconds, following Vercel standard)
|
|
164
|
+
*/
|
|
165
|
+
static prepareGenerationConfig(modelSettings) {
|
|
166
|
+
const modelString = (modelSettings?.model?.trim()) || 'anthropic/claude-4-sonnet-20250514';
|
|
167
|
+
// Create the model instance
|
|
168
|
+
const model = ModelFactory.createModel({
|
|
169
|
+
model: modelString,
|
|
170
|
+
providerOptions: modelSettings?.providerOptions,
|
|
171
|
+
});
|
|
172
|
+
// Get generation parameters (excludes maxDuration)
|
|
173
|
+
const generationParams = ModelFactory.getGenerationParams(modelSettings?.providerOptions);
|
|
174
|
+
// Extract maxDuration if present (Vercel standard, in seconds)
|
|
175
|
+
const maxDuration = modelSettings?.providerOptions?.maxDuration;
|
|
176
|
+
return {
|
|
177
|
+
model,
|
|
178
|
+
...generationParams,
|
|
179
|
+
...(maxDuration !== undefined && { maxDuration }),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Validate model settingsuration
|
|
184
|
+
* Basic validation only - let AI SDK handle parameter-specific validation
|
|
185
|
+
*/
|
|
186
|
+
static validateConfig(config) {
|
|
187
|
+
const errors = [];
|
|
188
|
+
if (!config.model) {
|
|
189
|
+
errors.push('Model name is required');
|
|
190
|
+
}
|
|
191
|
+
// Validate provider options structure if present
|
|
192
|
+
if (config.providerOptions) {
|
|
193
|
+
// Security validation: Check for API keys in configuration
|
|
194
|
+
if (config.providerOptions.apiKey) {
|
|
195
|
+
errors.push('API keys should not be stored in provider options. ' +
|
|
196
|
+
'Use environment variables (ANTHROPIC_API_KEY, OPENAI_API_KEY) or credential store instead.');
|
|
197
|
+
}
|
|
198
|
+
// Validate maxDuration if present
|
|
199
|
+
if (config.providerOptions.maxDuration !== undefined) {
|
|
200
|
+
const maxDuration = config.providerOptions.maxDuration;
|
|
201
|
+
if (typeof maxDuration !== 'number' || maxDuration <= 0) {
|
|
202
|
+
errors.push('maxDuration must be a positive number (in seconds)');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return errors;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { VersionConfig } from './types.js';
|
|
2
|
+
export declare class SystemPromptBuilder<TConfig> {
|
|
3
|
+
private version;
|
|
4
|
+
private versionConfig;
|
|
5
|
+
private templates;
|
|
6
|
+
private loaded;
|
|
7
|
+
constructor(version: string, versionConfig: VersionConfig<TConfig>);
|
|
8
|
+
private loadTemplates;
|
|
9
|
+
buildSystemPrompt(config: TConfig): Promise<string>;
|
|
10
|
+
private validateTemplateVariables;
|
|
11
|
+
getLoadedTemplates(): string[];
|
|
12
|
+
isLoaded(): boolean;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=SystemPromptBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SystemPromptBuilder.d.ts","sourceRoot":"","sources":["../../src/agents/SystemPromptBuilder.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,qBAAa,mBAAmB,CAAC,OAAO;IAKpC,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,aAAa;IALvB,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,MAAM,CAAS;gBAGb,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC;YAGjC,aAAa;IA6Bd,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAUhE,OAAO,CAAC,yBAAyB;IAW1B,kBAAkB,IAAI,MAAM,EAAE;IAI9B,QAAQ,IAAI,OAAO;CAG3B"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { getLogger } from '../logger.js';
|
|
5
|
+
const logger = getLogger('SystemPromptBuilder');
|
|
6
|
+
export class SystemPromptBuilder {
|
|
7
|
+
version;
|
|
8
|
+
versionConfig;
|
|
9
|
+
templates = new Map();
|
|
10
|
+
loaded = false;
|
|
11
|
+
constructor(version, versionConfig) {
|
|
12
|
+
this.version = version;
|
|
13
|
+
this.versionConfig = versionConfig;
|
|
14
|
+
}
|
|
15
|
+
async loadTemplates() {
|
|
16
|
+
if (this.loaded)
|
|
17
|
+
return;
|
|
18
|
+
try {
|
|
19
|
+
const currentDir = dirname(fileURLToPath(import.meta.url));
|
|
20
|
+
const templatesDir = join(currentDir, '..', 'templates', this.version);
|
|
21
|
+
// Load all required template files for this version
|
|
22
|
+
const templatePromises = this.versionConfig.templateFiles.map(async (filename) => {
|
|
23
|
+
const filePath = join(templatesDir, filename);
|
|
24
|
+
const content = await readFile(filePath, 'utf-8');
|
|
25
|
+
const templateName = filename.replace('.xml', ''); // Remove extension for key
|
|
26
|
+
return [templateName, content];
|
|
27
|
+
});
|
|
28
|
+
const templateEntries = await Promise.all(templatePromises);
|
|
29
|
+
for (const [name, content] of templateEntries) {
|
|
30
|
+
this.templates.set(name, content);
|
|
31
|
+
}
|
|
32
|
+
this.loaded = true;
|
|
33
|
+
logger.debug(`Loaded ${this.templates.size} templates for version ${this.version}`);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
logger.error({ error }, `Failed to load templates for version ${this.version}`);
|
|
37
|
+
throw new Error(`Template loading failed: ${error}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async buildSystemPrompt(config) {
|
|
41
|
+
await this.loadTemplates();
|
|
42
|
+
// Validate that all required template variables are present
|
|
43
|
+
this.validateTemplateVariables(config);
|
|
44
|
+
// Let the version config handle assembly
|
|
45
|
+
return this.versionConfig.assemble(this.templates, config);
|
|
46
|
+
}
|
|
47
|
+
validateTemplateVariables(config) {
|
|
48
|
+
if (!config) {
|
|
49
|
+
throw new Error('Configuration object is required');
|
|
50
|
+
}
|
|
51
|
+
// Basic validation - version configs can add their own validation
|
|
52
|
+
if (typeof config !== 'object') {
|
|
53
|
+
throw new Error('Configuration must be an object');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
getLoadedTemplates() {
|
|
57
|
+
return Array.from(this.templates.keys());
|
|
58
|
+
}
|
|
59
|
+
isLoaded() {
|
|
60
|
+
return this.loaded;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export interface ToolResultRecord {
|
|
2
|
+
toolCallId: string;
|
|
3
|
+
toolName: string;
|
|
4
|
+
args?: any;
|
|
5
|
+
result: any;
|
|
6
|
+
timestamp: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ToolSession {
|
|
9
|
+
sessionId: string;
|
|
10
|
+
tenantId: string;
|
|
11
|
+
projectId: string;
|
|
12
|
+
contextId: string;
|
|
13
|
+
taskId: string;
|
|
14
|
+
toolResults: Map<string, ToolResultRecord>;
|
|
15
|
+
createdAt: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Manages tool execution state during agent generation sessions.
|
|
19
|
+
* Allows tools to access previous tool call results within the same execution.
|
|
20
|
+
*/
|
|
21
|
+
export declare class ToolSessionManager {
|
|
22
|
+
private static instance;
|
|
23
|
+
private sessions;
|
|
24
|
+
private readonly SESSION_TIMEOUT;
|
|
25
|
+
private constructor();
|
|
26
|
+
static getInstance(): ToolSessionManager;
|
|
27
|
+
/**
|
|
28
|
+
* Create a new tool session for an agent execution
|
|
29
|
+
*/
|
|
30
|
+
createSession(tenantId: string, projectId: string, contextId: string, taskId: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Record a tool result in the session
|
|
33
|
+
*/
|
|
34
|
+
recordToolResult(sessionId: string, toolResult: ToolResultRecord): void;
|
|
35
|
+
/**
|
|
36
|
+
* Get a tool result by toolCallId within a session
|
|
37
|
+
*/
|
|
38
|
+
getToolResult(sessionId: string, toolCallId: string): ToolResultRecord | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* Get session info
|
|
41
|
+
*/
|
|
42
|
+
getSession(sessionId: string): ToolSession | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* Clean up a session after agent execution completes
|
|
45
|
+
*/
|
|
46
|
+
endSession(sessionId: string): void;
|
|
47
|
+
/**
|
|
48
|
+
* Remove expired sessions to prevent memory leaks
|
|
49
|
+
*/
|
|
50
|
+
private cleanupExpiredSessions;
|
|
51
|
+
/**
|
|
52
|
+
* Get detailed session information for logging
|
|
53
|
+
*/
|
|
54
|
+
private getSessionDetails;
|
|
55
|
+
/**
|
|
56
|
+
* Get summary of all sessions for logging
|
|
57
|
+
*/
|
|
58
|
+
private getSessionSummary;
|
|
59
|
+
}
|
|
60
|
+
export declare const toolSessionManager: ToolSessionManager;
|
|
61
|
+
//# sourceMappingURL=ToolSessionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolSessionManager.d.ts","sourceRoot":"","sources":["../../src/agents/ToolSessionManager.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,MAAM,EAAE,GAAG,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC3C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IAEjD,OAAO;IAKP,MAAM,CAAC,WAAW,IAAI,kBAAkB;IAOxC;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAiB7F;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG,IAAI;IAavE;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAsBlF;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAItD;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOnC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoB9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAa1B;AAGD,eAAO,MAAM,kBAAkB,oBAAmC,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { nanoid } from 'nanoid';
|
|
2
|
+
import { getLogger } from '../logger.js';
|
|
3
|
+
const logger = getLogger('ToolSessionManager');
|
|
4
|
+
/**
|
|
5
|
+
* Manages tool execution state during agent generation sessions.
|
|
6
|
+
* Allows tools to access previous tool call results within the same execution.
|
|
7
|
+
*/
|
|
8
|
+
export class ToolSessionManager {
|
|
9
|
+
static instance;
|
|
10
|
+
sessions = new Map();
|
|
11
|
+
SESSION_TIMEOUT = 5 * 60 * 1000; // 5 minutes
|
|
12
|
+
constructor() {
|
|
13
|
+
// Cleanup expired sessions every minute
|
|
14
|
+
setInterval(() => this.cleanupExpiredSessions(), 60_000);
|
|
15
|
+
}
|
|
16
|
+
static getInstance() {
|
|
17
|
+
if (!ToolSessionManager.instance) {
|
|
18
|
+
ToolSessionManager.instance = new ToolSessionManager();
|
|
19
|
+
}
|
|
20
|
+
return ToolSessionManager.instance;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create a new tool session for an agent execution
|
|
24
|
+
*/
|
|
25
|
+
createSession(tenantId, projectId, contextId, taskId) {
|
|
26
|
+
const sessionId = nanoid();
|
|
27
|
+
const session = {
|
|
28
|
+
sessionId,
|
|
29
|
+
tenantId,
|
|
30
|
+
projectId,
|
|
31
|
+
contextId,
|
|
32
|
+
taskId,
|
|
33
|
+
toolResults: new Map(),
|
|
34
|
+
createdAt: Date.now(),
|
|
35
|
+
};
|
|
36
|
+
this.sessions.set(sessionId, session);
|
|
37
|
+
logger.debug({ sessionId, tenantId, contextId, taskId }, 'Created tool session');
|
|
38
|
+
return sessionId;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Record a tool result in the session
|
|
42
|
+
*/
|
|
43
|
+
recordToolResult(sessionId, toolResult) {
|
|
44
|
+
const session = this.sessions.get(sessionId);
|
|
45
|
+
if (!session) {
|
|
46
|
+
logger.warn({ sessionId, toolCallId: toolResult.toolCallId }, 'Tool result recorded for unknown session');
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
session.toolResults.set(toolResult.toolCallId, toolResult);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get a tool result by toolCallId within a session
|
|
53
|
+
*/
|
|
54
|
+
getToolResult(sessionId, toolCallId) {
|
|
55
|
+
const session = this.sessions.get(sessionId);
|
|
56
|
+
if (!session) {
|
|
57
|
+
logger.warn({ sessionId, toolCallId }, 'Requested tool result for unknown session');
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
const result = session.toolResults.get(toolCallId);
|
|
61
|
+
if (!result) {
|
|
62
|
+
logger.warn({
|
|
63
|
+
sessionId,
|
|
64
|
+
toolCallId,
|
|
65
|
+
availableToolResultIds: Array.from(session.toolResults.keys()),
|
|
66
|
+
}, 'Tool result not found');
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get session info
|
|
72
|
+
*/
|
|
73
|
+
getSession(sessionId) {
|
|
74
|
+
return this.sessions.get(sessionId);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Clean up a session after agent execution completes
|
|
78
|
+
*/
|
|
79
|
+
endSession(sessionId) {
|
|
80
|
+
const session = this.sessions.get(sessionId);
|
|
81
|
+
if (session) {
|
|
82
|
+
this.sessions.delete(sessionId);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Remove expired sessions to prevent memory leaks
|
|
87
|
+
*/
|
|
88
|
+
cleanupExpiredSessions() {
|
|
89
|
+
const now = Date.now();
|
|
90
|
+
const expiredSessions = [];
|
|
91
|
+
for (const [sessionId, session] of this.sessions.entries()) {
|
|
92
|
+
if (now - session.createdAt > this.SESSION_TIMEOUT) {
|
|
93
|
+
expiredSessions.push(sessionId);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
for (const sessionId of expiredSessions) {
|
|
97
|
+
this.sessions.delete(sessionId);
|
|
98
|
+
logger.debug({ sessionId }, 'Cleaned up expired tool session');
|
|
99
|
+
}
|
|
100
|
+
if (expiredSessions.length > 0) {
|
|
101
|
+
logger.info({ expiredCount: expiredSessions.length }, 'Cleaned up expired tool sessions');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get detailed session information for logging
|
|
106
|
+
*/
|
|
107
|
+
getSessionDetails(sessionId) {
|
|
108
|
+
const session = this.sessions.get(sessionId);
|
|
109
|
+
if (!session)
|
|
110
|
+
return null;
|
|
111
|
+
return {
|
|
112
|
+
tenantId: session.tenantId,
|
|
113
|
+
contextId: session.contextId,
|
|
114
|
+
taskId: session.taskId,
|
|
115
|
+
createdAt: new Date(session.createdAt).toISOString(),
|
|
116
|
+
ageMs: Date.now() - session.createdAt,
|
|
117
|
+
toolResults: Array.from(session.toolResults.entries()).map(([id, result]) => ({
|
|
118
|
+
id,
|
|
119
|
+
toolName: result.toolName,
|
|
120
|
+
timestamp: new Date(result.timestamp).toISOString(),
|
|
121
|
+
hasResult: !!result.result,
|
|
122
|
+
})),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get summary of all sessions for logging
|
|
127
|
+
*/
|
|
128
|
+
getSessionSummary() {
|
|
129
|
+
return {
|
|
130
|
+
totalSessions: this.sessions.size,
|
|
131
|
+
sessions: Array.from(this.sessions.entries()).map(([id, session]) => ({
|
|
132
|
+
sessionId: id,
|
|
133
|
+
tenantId: session.tenantId,
|
|
134
|
+
contextId: session.contextId,
|
|
135
|
+
taskId: session.taskId,
|
|
136
|
+
toolResultCount: session.toolResults.size,
|
|
137
|
+
ageMs: Date.now() - session.createdAt,
|
|
138
|
+
})),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Export singleton instance
|
|
143
|
+
export const toolSessionManager = ToolSessionManager.getInstance();
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ArtifactComponentApiInsert } from '@inkeep/agents-core';
|
|
2
|
+
export declare function createSaveToolResultTool(sessionId?: string, streamRequestId?: string, // For GraphSession recording
|
|
3
|
+
agentId?: string, artifactComponents?: ArtifactComponentApiInsert[]): import("ai").Tool<{
|
|
4
|
+
toolCallId: string;
|
|
5
|
+
baseSelector: string;
|
|
6
|
+
propSelectors: any;
|
|
7
|
+
}, {
|
|
8
|
+
saved: boolean;
|
|
9
|
+
error: string;
|
|
10
|
+
artifactIds: never[];
|
|
11
|
+
warnings: never[];
|
|
12
|
+
artifacts?: undefined;
|
|
13
|
+
} | {
|
|
14
|
+
saved: boolean;
|
|
15
|
+
artifacts: {
|
|
16
|
+
artifactId: any;
|
|
17
|
+
taskId: any;
|
|
18
|
+
summaryData: any;
|
|
19
|
+
}[];
|
|
20
|
+
warnings: string[];
|
|
21
|
+
error?: undefined;
|
|
22
|
+
artifactIds?: undefined;
|
|
23
|
+
} | {
|
|
24
|
+
saved: boolean;
|
|
25
|
+
error: string;
|
|
26
|
+
warnings: never[];
|
|
27
|
+
artifactIds?: undefined;
|
|
28
|
+
artifacts?: undefined;
|
|
29
|
+
}>;
|
|
30
|
+
//# sourceMappingURL=artifactTools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifactTools.d.ts","sourceRoot":"","sources":["../../src/agents/artifactTools.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AA+NtE,wBAAgB,wBAAwB,CACtC,SAAS,CAAC,EAAE,MAAM,EAClB,eAAe,CAAC,EAAE,MAAM,EAAE,6BAA6B;AACvD,OAAO,CAAC,EAAE,MAAM,EAChB,kBAAkB,CAAC,EAAE,0BAA0B,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;GAkUlD"}
|