@inkeep/agents-api 0.42.0 → 0.44.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.
Files changed (138) hide show
  1. package/dist/.well-known/workflow/v1/manifest.debug.json +6 -6
  2. package/dist/.well-known/workflow/v1/step.cjs +220467 -203416
  3. package/dist/_virtual/rolldown_runtime.js +7 -0
  4. package/dist/createApp.js +47 -17
  5. package/dist/domains/evals/api/.well-known/workflow/v1/flow.d.ts +4 -0
  6. package/dist/domains/evals/api/.well-known/workflow/v1/flow.js +12 -0
  7. package/dist/domains/evals/api/.well-known/workflow/v1/step.d.ts +4 -0
  8. package/dist/domains/evals/api/.well-known/workflow/v1/step.js +12 -0
  9. package/dist/domains/evals/routes/datasetTriggers.d.ts +2 -2
  10. package/dist/domains/evals/routes/index.d.ts +2 -2
  11. package/dist/domains/evals/scripts/build-workflow.js +2 -2
  12. package/dist/domains/evals/workflow/world.js +3 -2
  13. package/dist/domains/manage/index.js +6 -2
  14. package/dist/domains/manage/routes/agent.js +7 -4
  15. package/dist/domains/manage/routes/agentFull.js +9 -6
  16. package/dist/domains/manage/routes/apiKeys.js +1 -2
  17. package/dist/domains/manage/routes/artifactComponents.js +5 -5
  18. package/dist/domains/manage/routes/cliAuth.js +3 -3
  19. package/dist/domains/manage/routes/contextConfigs.js +5 -5
  20. package/dist/domains/manage/routes/conversations.d.ts +2 -2
  21. package/dist/domains/manage/routes/credentialStores.js +2 -2
  22. package/dist/domains/manage/routes/credentials.js +6 -7
  23. package/dist/domains/manage/routes/dataComponents.js +6 -7
  24. package/dist/domains/manage/routes/externalAgents.js +1 -2
  25. package/dist/domains/manage/routes/github.d.ts +16 -0
  26. package/dist/domains/manage/routes/github.js +511 -0
  27. package/dist/domains/manage/routes/index.d.ts +2 -2
  28. package/dist/domains/manage/routes/index.js +4 -0
  29. package/dist/domains/manage/routes/invitations.js +1 -1
  30. package/dist/domains/manage/routes/mcp.d.ts +2 -2
  31. package/dist/domains/manage/routes/{agentToolRelations.d.ts → mcpToolGithubAccess.d.ts} +1 -1
  32. package/dist/domains/manage/routes/mcpToolGithubAccess.js +205 -0
  33. package/dist/domains/manage/routes/playgroundToken.js +1 -2
  34. package/dist/domains/manage/routes/projectFull.js +33 -11
  35. package/dist/domains/manage/routes/projectGithubAccess.d.ts +9 -0
  36. package/dist/domains/manage/routes/projectGithubAccess.js +167 -0
  37. package/dist/domains/manage/routes/projectMembers.js +12 -44
  38. package/dist/domains/manage/routes/projectPermissions.js +11 -11
  39. package/dist/domains/manage/routes/projects.js +15 -18
  40. package/dist/domains/manage/routes/signoz.d.ts +2 -2
  41. package/dist/domains/manage/routes/signoz.js +7 -4
  42. package/dist/domains/manage/routes/subAgentArtifactComponents.js +5 -5
  43. package/dist/domains/manage/routes/subAgentDataComponents.js +5 -5
  44. package/dist/domains/manage/routes/subAgentExternalAgentRelations.js +5 -5
  45. package/dist/domains/manage/routes/subAgentFunctionTools.js +5 -5
  46. package/dist/domains/manage/routes/subAgentRelations.js +6 -6
  47. package/dist/domains/manage/routes/subAgentTeamAgentRelations.js +6 -6
  48. package/dist/domains/manage/routes/subAgentToolRelations.js +6 -6
  49. package/dist/domains/manage/routes/subAgents.js +5 -5
  50. package/dist/domains/manage/routes/tools.js +28 -5
  51. package/dist/domains/manage/routes/triggers.js +49 -24
  52. package/dist/domains/manage/routes/userOrganizations.js +4 -4
  53. package/dist/domains/manage/routes/userProjectMemberships.d.ts +9 -0
  54. package/dist/domains/manage/routes/userProjectMemberships.js +44 -0
  55. package/dist/domains/mcp/routes/mcp.d.ts +7 -0
  56. package/dist/domains/mcp/routes/mcp.js +45 -0
  57. package/dist/domains/run/agents/Agent.d.ts +1 -0
  58. package/dist/domains/run/agents/Agent.js +235 -45
  59. package/dist/domains/run/agents/relationTools.d.ts +2 -2
  60. package/dist/domains/run/constants/execution-limits/defaults.d.ts +1 -1
  61. package/dist/domains/run/constants/execution-limits/defaults.js +1 -1
  62. package/dist/domains/run/constants/execution-limits/index.d.ts +1 -1
  63. package/dist/domains/run/context/ContextFetcher.js +8 -7
  64. package/dist/domains/run/context/validation.d.ts +1 -1
  65. package/dist/domains/run/handlers/executionHandler.js +143 -79
  66. package/dist/domains/run/routes/agents.js +1 -1
  67. package/dist/domains/run/routes/chat.js +47 -1
  68. package/dist/domains/run/routes/chatDataStream.js +107 -14
  69. package/dist/domains/run/routes/webhooks.js +40 -348
  70. package/dist/domains/run/services/AgentSession.d.ts +3 -0
  71. package/dist/domains/run/services/AgentSession.js +14 -1
  72. package/dist/domains/run/services/ToolApprovalUiBus.d.ts +28 -0
  73. package/dist/domains/run/services/ToolApprovalUiBus.js +44 -0
  74. package/dist/domains/run/services/TriggerService.d.ts +31 -0
  75. package/dist/domains/run/services/TriggerService.js +545 -0
  76. package/dist/domains/run/tools/NativeSandboxExecutor.d.ts +3 -2
  77. package/dist/domains/run/tools/NativeSandboxExecutor.js +76 -48
  78. package/dist/domains/run/tools/SandboxExecutorFactory.d.ts +11 -1
  79. package/dist/domains/run/tools/SandboxExecutorFactory.js +27 -3
  80. package/dist/domains/run/tools/VercelSandboxExecutor.d.ts +3 -11
  81. package/dist/domains/run/tools/VercelSandboxExecutor.js +137 -127
  82. package/dist/domains/run/tools/sandbox-utils.js +1 -1
  83. package/dist/domains/run/types/executionContext.js +3 -1
  84. package/dist/domains/run/utils/stream-helpers.d.ts +134 -0
  85. package/dist/domains/run/utils/stream-helpers.js +182 -0
  86. package/dist/domains/run/utils/token-estimator.d.ts +2 -2
  87. package/dist/env.d.ts +12 -2
  88. package/dist/env.js +37 -32
  89. package/dist/factory.d.ts +31 -31
  90. package/dist/factory.js +4 -10
  91. package/dist/index.d.ts +30 -29
  92. package/dist/index.js +3 -5
  93. package/dist/middleware/branchScopedDb.d.ts +1 -1
  94. package/dist/middleware/cors.js +1 -1
  95. package/dist/middleware/evalsAuth.d.ts +2 -2
  96. package/dist/middleware/manageAuth.d.ts +2 -2
  97. package/dist/middleware/projectAccess.d.ts +4 -20
  98. package/dist/middleware/projectAccess.js +7 -49
  99. package/dist/middleware/projectConfig.d.ts +3 -3
  100. package/dist/middleware/ref.d.ts +1 -1
  101. package/dist/middleware/requirePermission.d.ts +2 -2
  102. package/dist/middleware/requirePermission.js +1 -2
  103. package/dist/middleware/runAuth.d.ts +4 -4
  104. package/dist/middleware/sessionAuth.d.ts +3 -3
  105. package/dist/middleware/sessionAuth.js +1 -2
  106. package/dist/middleware/tenantAccess.d.ts +2 -2
  107. package/dist/middleware/tenantAccess.js +4 -4
  108. package/dist/middleware/tracing.d.ts +3 -3
  109. package/dist/openapi.d.ts +36 -1
  110. package/dist/openapi.js +40 -95
  111. package/dist/routes/healthChecks.d.ts +10 -0
  112. package/dist/routes/healthChecks.js +75 -0
  113. package/dist/types/app.d.ts +2 -0
  114. package/dist/types/runExecutionContext.js +3 -1
  115. package/dist/utils/healthChecks.d.ts +8 -0
  116. package/dist/utils/healthChecks.js +38 -0
  117. package/dist/utils/signozHelpers.d.ts +2 -2
  118. package/dist/utils/signozHelpers.js +15 -3
  119. package/package.json +8 -9
  120. package/dist/domains/evals/services/startEvaluation.d.ts +0 -19
  121. package/dist/domains/evals/services/startEvaluation.js +0 -18
  122. package/dist/domains/index.d.ts +0 -4
  123. package/dist/domains/index.js +0 -5
  124. package/dist/domains/manage/routes/agentToolRelations.js +0 -289
  125. package/dist/domains/run/agents/ModelFactory.d.ts +0 -63
  126. package/dist/domains/run/agents/ModelFactory.js +0 -194
  127. package/dist/domains/run/data/agent.d.ts +0 -7
  128. package/dist/domains/run/data/agent.js +0 -67
  129. package/dist/domains/run/services/evaluationRunConfigMatcher.d.ts +0 -4
  130. package/dist/domains/run/services/evaluationRunConfigMatcher.js +0 -7
  131. package/dist/domains/run/utils/cleanup.d.ts +0 -21
  132. package/dist/domains/run/utils/cleanup.js +0 -59
  133. package/dist/initialization.d.ts +0 -6
  134. package/dist/initialization.js +0 -65
  135. package/dist/utils/tempApiKeys.d.ts +0 -17
  136. package/dist/utils/tempApiKeys.js +0 -26
  137. package/dist/utils/workflowApiHelpers.d.ts +0 -1
  138. package/dist/utils/workflowApiHelpers.js +0 -1
@@ -1,289 +0,0 @@
1
- import { requireProjectPermission } from "../../../middleware/projectAccess.js";
2
- import { speakeasyOffsetLimitPagination } from "../../../utils/speakeasy.js";
3
- import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
4
- import { ErrorResponseSchema, PaginationQueryParamsSchema, SubAgentToolRelationApiInsertSchema, SubAgentToolRelationApiUpdateSchema, SubAgentToolRelationListResponse, SubAgentToolRelationResponse, TenantProjectAgentIdParamsSchema, TenantProjectAgentParamsSchema, commonGetErrorResponses, createAgentToolRelation, createApiError, deleteAgentToolRelation, getAgentToolRelationByAgent, getAgentToolRelationById, getAgentToolRelationByTool, getAgentsForTool, listAgentToolRelations, updateAgentToolRelation } from "@inkeep/agents-core";
5
-
6
- //#region src/domains/manage/routes/agentToolRelations.ts
7
- const app = new OpenAPIHono();
8
- app.use("/", async (c, next) => {
9
- if (c.req.method === "POST") return requireProjectPermission("edit")(c, next);
10
- return next();
11
- });
12
- app.use("/:id", async (c, next) => {
13
- if (c.req.method === "PUT") return requireProjectPermission("edit")(c, next);
14
- if (c.req.method === "DELETE") return requireProjectPermission("edit")(c, next);
15
- return next();
16
- });
17
- app.openapi(createRoute({
18
- method: "get",
19
- path: "/",
20
- summary: "List Agent Tool Relations",
21
- operationId: "list-agent-tool-relations",
22
- tags: ["Agent Tool Relations"],
23
- request: {
24
- params: TenantProjectAgentParamsSchema,
25
- query: PaginationQueryParamsSchema.extend({
26
- subAgentId: z.string().optional(),
27
- toolId: z.string().optional()
28
- })
29
- },
30
- responses: {
31
- 200: {
32
- description: "List of agent tool relations retrieved successfully",
33
- content: { "application/json": { schema: SubAgentToolRelationListResponse } }
34
- },
35
- ...commonGetErrorResponses
36
- },
37
- ...speakeasyOffsetLimitPagination
38
- }), async (c) => {
39
- const db = c.get("db");
40
- const { tenantId, projectId, agentId } = c.req.valid("param");
41
- const { page, limit, subAgentId, toolId } = c.req.valid("query");
42
- let result;
43
- if (subAgentId) {
44
- const dbResult = await getAgentToolRelationByAgent(db)({
45
- scopes: {
46
- tenantId,
47
- projectId,
48
- agentId,
49
- subAgentId
50
- },
51
- pagination: {
52
- page,
53
- limit
54
- }
55
- });
56
- result = {
57
- data: dbResult.data,
58
- pagination: dbResult.pagination
59
- };
60
- } else if (toolId) {
61
- const dbResult = await getAgentToolRelationByTool(db)({
62
- scopes: {
63
- tenantId,
64
- projectId,
65
- agentId
66
- },
67
- toolId,
68
- pagination: {
69
- page,
70
- limit
71
- }
72
- });
73
- result = {
74
- data: dbResult.data,
75
- pagination: dbResult.pagination
76
- };
77
- } else {
78
- const dbResult = await listAgentToolRelations(db)({
79
- scopes: {
80
- tenantId,
81
- projectId,
82
- agentId
83
- },
84
- pagination: {
85
- page,
86
- limit
87
- }
88
- });
89
- result = {
90
- data: dbResult.data,
91
- pagination: dbResult.pagination
92
- };
93
- }
94
- return c.json(result);
95
- });
96
- app.openapi(createRoute({
97
- method: "get",
98
- path: "/{id}",
99
- summary: "Get Agent Tool Relation",
100
- operationId: "get-agent-tool-relation",
101
- tags: ["Agent Tool Relations"],
102
- request: { params: TenantProjectAgentIdParamsSchema },
103
- responses: {
104
- 200: {
105
- description: "Agent tool relation found",
106
- content: { "application/json": { schema: SubAgentToolRelationResponse } }
107
- },
108
- ...commonGetErrorResponses
109
- }
110
- }), async (c) => {
111
- const db = c.get("db");
112
- const { tenantId, projectId, agentId, id } = c.req.valid("param");
113
- const agentToolRelation = await getAgentToolRelationById(db)({
114
- scopes: {
115
- tenantId,
116
- projectId,
117
- agentId,
118
- subAgentId: id
119
- },
120
- relationId: id
121
- });
122
- if (!agentToolRelation) throw createApiError({
123
- code: "not_found",
124
- message: "Agent tool relation not found"
125
- });
126
- return c.json({ data: agentToolRelation });
127
- });
128
- app.openapi(createRoute({
129
- method: "get",
130
- path: "/tool/{toolId}/agents",
131
- summary: "Get Agents for Tool",
132
- operationId: "get-agents-for-tool",
133
- tags: ["Agent Tool Relations"],
134
- request: {
135
- params: TenantProjectAgentParamsSchema.extend({ toolId: z.string() }),
136
- query: PaginationQueryParamsSchema
137
- },
138
- responses: {
139
- 200: {
140
- description: "Agents for tool retrieved successfully",
141
- content: { "application/json": { schema: SubAgentToolRelationListResponse } }
142
- },
143
- ...commonGetErrorResponses
144
- }
145
- }), async (c) => {
146
- const db = c.get("db");
147
- const { tenantId, projectId, agentId, toolId } = c.req.valid("param");
148
- const { page, limit } = c.req.valid("query");
149
- const dbResult = await getAgentsForTool(db)({
150
- scopes: {
151
- tenantId,
152
- projectId,
153
- agentId
154
- },
155
- toolId,
156
- pagination: {
157
- page,
158
- limit
159
- }
160
- });
161
- return c.json(dbResult);
162
- });
163
- app.openapi(createRoute({
164
- method: "post",
165
- path: "/",
166
- summary: "Create Agent Tool Relation",
167
- operationId: "create-agent-tool-relation",
168
- tags: ["Agent Tool Relations"],
169
- request: {
170
- params: TenantProjectAgentParamsSchema,
171
- body: { content: { "application/json": { schema: SubAgentToolRelationApiInsertSchema } } }
172
- },
173
- responses: {
174
- 201: {
175
- description: "Agent tool relation created successfully",
176
- content: { "application/json": { schema: SubAgentToolRelationResponse } }
177
- },
178
- ...commonGetErrorResponses
179
- }
180
- }), async (c) => {
181
- const db = c.get("db");
182
- const { tenantId, projectId, agentId } = c.req.valid("param");
183
- const body = c.req.valid("json");
184
- if ((await listAgentToolRelations(db)({
185
- scopes: {
186
- tenantId,
187
- projectId,
188
- agentId
189
- },
190
- pagination: { limit: 1e3 }
191
- })).data.some((relation) => {
192
- const typedRelation = relation;
193
- return typedRelation.subAgentId === body.subAgentId && typedRelation.toolId === body.toolId;
194
- })) throw createApiError({
195
- code: "unprocessable_entity",
196
- message: "Agent tool relation already exists"
197
- });
198
- try {
199
- const agentToolRelation = await createAgentToolRelation(db)({
200
- scopes: {
201
- tenantId,
202
- projectId,
203
- agentId
204
- },
205
- data: body
206
- });
207
- return c.json({ data: agentToolRelation }, 201);
208
- } catch (error) {
209
- if (error?.cause?.code === "23503") throw createApiError({
210
- code: "bad_request",
211
- message: "Invalid agent ID or tool ID - referenced entity does not exist"
212
- });
213
- throw error;
214
- }
215
- });
216
- app.openapi(createRoute({
217
- method: "put",
218
- path: "/{id}",
219
- summary: "Update Agent Tool Relation",
220
- operationId: "update-agent-tool-relation",
221
- tags: ["Agent Tool Relations"],
222
- request: {
223
- params: TenantProjectAgentIdParamsSchema,
224
- body: { content: { "application/json": { schema: SubAgentToolRelationApiUpdateSchema } } }
225
- },
226
- responses: {
227
- 200: {
228
- description: "Agent tool relation updated successfully",
229
- content: { "application/json": { schema: SubAgentToolRelationResponse } }
230
- },
231
- ...commonGetErrorResponses
232
- }
233
- }), async (c) => {
234
- const db = c.get("db");
235
- const { tenantId, projectId, agentId, id } = c.req.valid("param");
236
- const body = await c.req.valid("json");
237
- if (Object.keys(body).length === 0) throw createApiError({
238
- code: "bad_request",
239
- message: "No fields to update"
240
- });
241
- const updatedSubAgentToolRelation = await updateAgentToolRelation(db)({
242
- scopes: {
243
- tenantId,
244
- projectId,
245
- agentId
246
- },
247
- relationId: id,
248
- data: body
249
- });
250
- if (!updatedSubAgentToolRelation) throw createApiError({
251
- code: "not_found",
252
- message: "Agent tool relation not found"
253
- });
254
- return c.json({ data: updatedSubAgentToolRelation });
255
- });
256
- app.openapi(createRoute({
257
- method: "delete",
258
- path: "/{id}",
259
- summary: "Delete Agent Tool Relation",
260
- operationId: "delete-agent-tool-relation",
261
- tags: ["Agent Tool Relations"],
262
- request: { params: TenantProjectAgentIdParamsSchema },
263
- responses: {
264
- 204: { description: "Agent tool relation deleted successfully" },
265
- 404: {
266
- description: "Agent tool relation not found",
267
- content: { "application/json": { schema: ErrorResponseSchema } }
268
- }
269
- }
270
- }), async (c) => {
271
- const db = c.get("db");
272
- const { tenantId, projectId, agentId, id } = c.req.valid("param");
273
- if (!await deleteAgentToolRelation(db)({
274
- scopes: {
275
- tenantId,
276
- projectId,
277
- agentId
278
- },
279
- relationId: id
280
- })) throw createApiError({
281
- code: "not_found",
282
- message: "Agent tool relation not found"
283
- });
284
- return c.body(null, 204);
285
- });
286
- var agentToolRelations_default = app;
287
-
288
- //#endregion
289
- export { agentToolRelations_default as default };
@@ -1,63 +0,0 @@
1
- import { LanguageModel } from "ai";
2
-
3
- //#region src/domains/run/agents/ModelFactory.d.ts
4
- interface ModelSettings {
5
- model?: string;
6
- providerOptions?: Record<string, unknown>;
7
- }
8
- /**
9
- * Factory for creating AI SDK language models from configuration
10
- * Supports multiple providers and AI Gateway integration
11
- */
12
- declare class ModelFactory {
13
- /**
14
- * Create a provider instance with custom configuration
15
- * Returns a provider with at least languageModel method
16
- */
17
- private static createProvider;
18
- /**
19
- * Extract provider configuration from providerOptions
20
- * Only includes settings that go to the provider constructor (baseURL, apiKey, etc.)
21
- */
22
- private static extractProviderConfig;
23
- /**
24
- * Create a language model instance from configuration
25
- * Throws error if no config provided - models must be configured at project level
26
- */
27
- static createModel(config: ModelSettings): LanguageModel;
28
- /**
29
- * Built-in providers that have special handling
30
- */
31
- private static readonly BUILT_IN_PROVIDERS;
32
- /**
33
- * Parse model string to extract provider and model name
34
- * Examples: "anthropic/claude-sonnet-4" -> { provider: "anthropic", modelName: "claude-sonnet-4" }
35
- * "openrouter/anthropic/claude-sonnet-4" -> { provider: "openrouter", modelName: "anthropic/claude-sonnet-4" }
36
- * "claude-sonnet-4" -> { provider: "anthropic", modelName: "claude-sonnet-4" } (default to anthropic)
37
- */
38
- static parseModelString(modelString: string): {
39
- provider: string;
40
- modelName: string;
41
- };
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
- //#endregion
63
- export { ModelFactory, ModelSettings };
@@ -1,194 +0,0 @@
1
- import { getLogger } from "../../../logger.js";
2
- import { anthropic, createAnthropic } from "@ai-sdk/anthropic";
3
- import { createGateway, gateway } from "@ai-sdk/gateway";
4
- import { createGoogleGenerativeAI, google } from "@ai-sdk/google";
5
- import { createOpenAI, openai } from "@ai-sdk/openai";
6
- import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
7
- import { createOpenRouter, openrouter } from "@openrouter/ai-sdk-provider";
8
-
9
- //#region src/domains/run/agents/ModelFactory.ts
10
- const logger = getLogger("ModelFactory");
11
- const nimDefault = createOpenAICompatible({
12
- name: "nim",
13
- baseURL: "https://integrate.api.nvidia.com/v1",
14
- headers: { Authorization: `Bearer ${process.env.NIM_API_KEY}` }
15
- });
16
- /**
17
- * Factory for creating AI SDK language models from configuration
18
- * Supports multiple providers and AI Gateway integration
19
- */
20
- var ModelFactory = class ModelFactory {
21
- /**
22
- * Create a provider instance with custom configuration
23
- * Returns a provider with at least languageModel method
24
- */
25
- static createProvider(provider, config) {
26
- switch (provider) {
27
- case "anthropic": return createAnthropic(config);
28
- case "openai": return createOpenAI(config);
29
- case "google": return createGoogleGenerativeAI(config);
30
- case "openrouter": return createOpenRouter(config);
31
- case "gateway": return createGateway(config);
32
- case "nim": return createOpenAICompatible({
33
- name: "nim",
34
- baseURL: "https://integrate.api.nvidia.com/v1",
35
- headers: { Authorization: `Bearer ${process.env.NIM_API_KEY}` },
36
- ...config
37
- });
38
- case "custom": {
39
- if (!config.baseURL && !config.baseUrl) throw new Error("Custom provider requires baseURL. Please provide it in providerOptions.baseURL or providerOptions.baseUrl");
40
- const customConfig = {
41
- name: "custom",
42
- baseURL: config.baseURL || config.baseUrl,
43
- headers: {
44
- ...process.env.CUSTOM_LLM_API_KEY && { Authorization: `Bearer ${process.env.CUSTOM_LLM_API_KEY}` },
45
- ...config.headers || {}
46
- },
47
- ...config
48
- };
49
- logger.info({ config: {
50
- baseURL: customConfig.baseURL,
51
- hasApiKey: !!process.env.CUSTOM_LLM_API_KEY,
52
- apiKeyPrefix: `${process.env.CUSTOM_LLM_API_KEY?.substring(0, 10) || ""}...`,
53
- headers: Object.keys(customConfig.headers || {})
54
- } }, "Creating custom OpenAI-compatible provider");
55
- return createOpenAICompatible(customConfig);
56
- }
57
- default: throw new Error(`Unsupported provider: ${provider}`);
58
- }
59
- }
60
- /**
61
- * Extract provider configuration from providerOptions
62
- * Only includes settings that go to the provider constructor (baseURL, apiKey, etc.)
63
- */
64
- static extractProviderConfig(providerOptions) {
65
- if (!providerOptions) return {};
66
- const providerConfig = {};
67
- if (providerOptions.baseUrl || providerOptions.baseURL) providerConfig.baseURL = providerOptions.baseUrl || providerOptions.baseURL;
68
- if (providerOptions.headers) providerConfig.headers = providerOptions.headers;
69
- if (providerOptions.gateway) Object.assign(providerConfig, providerOptions.gateway);
70
- if (providerOptions.nim) Object.assign(providerConfig, providerOptions.nim);
71
- if (providerOptions.custom) Object.assign(providerConfig, providerOptions.custom);
72
- return providerConfig;
73
- }
74
- /**
75
- * Create a language model instance from configuration
76
- * Throws error if no config provided - models must be configured at project level
77
- */
78
- static createModel(config) {
79
- if (!config?.model?.trim()) throw new Error("Model configuration is required. Please configure models at the project level.");
80
- const modelSettings = config;
81
- if (!modelSettings.model) throw new Error("Model configuration is required");
82
- const modelString = modelSettings.model.trim();
83
- const { provider, modelName } = ModelFactory.parseModelString(modelString);
84
- logger.debug({
85
- provider,
86
- model: modelName,
87
- fullModelString: modelSettings.model,
88
- hasProviderOptions: !!modelSettings.providerOptions
89
- }, "Creating language model from config");
90
- const providerConfig = ModelFactory.extractProviderConfig(modelSettings.providerOptions);
91
- if (Object.keys(providerConfig).length > 0) {
92
- logger.info({ config: providerConfig }, `Applying custom ${provider} provider configuration`);
93
- return ModelFactory.createProvider(provider, providerConfig).languageModel(modelName);
94
- }
95
- switch (provider) {
96
- case "anthropic": return anthropic(modelName);
97
- case "openai": return openai(modelName);
98
- case "google": return google(modelName);
99
- case "openrouter": return openrouter(modelName);
100
- case "gateway": return gateway(modelName);
101
- case "nim": return nimDefault(modelName);
102
- case "custom": throw new Error("Custom provider requires configuration. Please provide baseURL in providerOptions.custom.baseURL or providerOptions.baseURL");
103
- default: throw new Error(`Unsupported provider: ${provider}. Supported providers are: ${ModelFactory.BUILT_IN_PROVIDERS.join(", ")}. To access other models, use OpenRouter (openrouter/model-id), Vercel AI Gateway (gateway/model-id), NVIDIA NIM (nim/model-id), or Custom OpenAI-compatible (custom/model-id).`);
104
- }
105
- }
106
- /**
107
- * Built-in providers that have special handling
108
- */
109
- static BUILT_IN_PROVIDERS = [
110
- "anthropic",
111
- "openai",
112
- "google",
113
- "openrouter",
114
- "gateway",
115
- "nim",
116
- "custom"
117
- ];
118
- /**
119
- * Parse model string to extract provider and model name
120
- * Examples: "anthropic/claude-sonnet-4" -> { provider: "anthropic", modelName: "claude-sonnet-4" }
121
- * "openrouter/anthropic/claude-sonnet-4" -> { provider: "openrouter", modelName: "anthropic/claude-sonnet-4" }
122
- * "claude-sonnet-4" -> { provider: "anthropic", modelName: "claude-sonnet-4" } (default to anthropic)
123
- */
124
- static parseModelString(modelString) {
125
- if (modelString.includes("/")) {
126
- const [provider, ...modelParts] = modelString.split("/");
127
- const normalizedProvider = provider.toLowerCase();
128
- if (!ModelFactory.BUILT_IN_PROVIDERS.includes(normalizedProvider)) throw new Error(`Unsupported provider: ${normalizedProvider}. Supported providers are: ${ModelFactory.BUILT_IN_PROVIDERS.join(", ")}. To access other models, use OpenRouter (openrouter/model-id), Vercel AI Gateway (gateway/model-id), NVIDIA NIM (nim/model-id), or Custom OpenAI-compatible (custom/model-id).`);
129
- return {
130
- provider: normalizedProvider,
131
- modelName: modelParts.join("/")
132
- };
133
- }
134
- throw new Error(`No provider specified in model string: ${modelString}`);
135
- }
136
- /**
137
- * Get generation parameters from provider options
138
- * These are parameters that get passed to generateText/streamText calls
139
- */
140
- static getGenerationParams(providerOptions) {
141
- if (!providerOptions) return {};
142
- const excludedKeys = [
143
- "apiKey",
144
- "baseURL",
145
- "baseUrl",
146
- "maxDuration",
147
- "headers",
148
- "gateway",
149
- "nim",
150
- "custom"
151
- ];
152
- const params = {};
153
- for (const [key, value] of Object.entries(providerOptions)) if (!excludedKeys.includes(key) && value !== void 0) params[key] = value;
154
- return params;
155
- }
156
- /**
157
- * Prepare complete generation configuration from model settings
158
- * Returns model instance and generation parameters ready to spread into generateText/streamText
159
- * Includes maxDuration if specified in provider options (in seconds, following Vercel standard)
160
- */
161
- static prepareGenerationConfig(modelSettings) {
162
- const modelString = modelSettings?.model?.trim();
163
- const model = ModelFactory.createModel({
164
- model: modelString,
165
- providerOptions: modelSettings?.providerOptions
166
- });
167
- const generationParams = ModelFactory.getGenerationParams(modelSettings?.providerOptions);
168
- const maxDuration = modelSettings?.providerOptions?.maxDuration;
169
- return {
170
- model,
171
- ...generationParams,
172
- ...maxDuration !== void 0 && { maxDuration }
173
- };
174
- }
175
- /**
176
- * Validate model settingsuration
177
- * Basic validation only - let AI SDK handle parameter-specific validation
178
- */
179
- static validateConfig(config) {
180
- const errors = [];
181
- if (!config.model) errors.push("Model name is required");
182
- if (config.providerOptions) {
183
- if (config.providerOptions.apiKey) errors.push("API keys should not be stored in provider options. Use environment variables (ANTHROPIC_API_KEY, OPENAI_API_KEY) or credential store instead.");
184
- if (config.providerOptions.maxDuration !== void 0) {
185
- const maxDuration = config.providerOptions.maxDuration;
186
- if (typeof maxDuration !== "number" || maxDuration <= 0) errors.push("maxDuration must be a positive number (in seconds)");
187
- }
188
- }
189
- return errors;
190
- }
191
- };
192
-
193
- //#endregion
194
- export { ModelFactory };
@@ -1,7 +0,0 @@
1
- import { RegisteredAgent } from "../a2a/types.js";
2
- import { FullExecutionContext } from "@inkeep/agents-core";
3
-
4
- //#region src/domains/run/data/agent.d.ts
5
- declare function getRegisteredAgent(executionContext: FullExecutionContext): Promise<RegisteredAgent | null>;
6
- //#endregion
7
- export { getRegisteredAgent };
@@ -1,67 +0,0 @@
1
- import { getAgentFromProject, getSubAgentFromProject } from "../utils/project.js";
2
- import { createTaskHandler, createTaskHandlerConfig } from "../agents/generateTaskHandler.js";
3
-
4
- //#region src/domains/run/data/agent.ts
5
- async function hydrateAgent({ dbAgent, executionContext, baseUrl }) {
6
- const { tenantId, projectId, agentId, project, apiKey } = executionContext;
7
- try {
8
- if (!dbAgent.defaultSubAgentId) throw new Error(`Agent ${dbAgent.id} does not have a default agent configured`);
9
- const subAgentId = dbAgent.defaultSubAgentId;
10
- if (!getSubAgentFromProject({
11
- project,
12
- agentId,
13
- subAgentId
14
- })) throw new Error(`Default agent ${dbAgent.defaultSubAgentId} not found for agent ${dbAgent.id}`);
15
- const taskHandler = createTaskHandler(await createTaskHandlerConfig({
16
- executionContext,
17
- subAgentId: dbAgent.defaultSubAgentId,
18
- baseUrl,
19
- apiKey
20
- }));
21
- const agentCard = {
22
- name: dbAgent.name,
23
- description: dbAgent.description || `Agent: ${dbAgent.name}`,
24
- url: baseUrl ? `${baseUrl}/a2a` : "",
25
- version: "1.0.0",
26
- capabilities: {
27
- streaming: true,
28
- pushNotifications: false,
29
- stateTransitionHistory: false
30
- },
31
- defaultInputModes: ["text", "text/plain"],
32
- defaultOutputModes: ["text", "text/plain"],
33
- skills: [],
34
- ...baseUrl && { provider: {
35
- organization: "Inkeep",
36
- url: baseUrl
37
- } }
38
- };
39
- return {
40
- subAgentId: dbAgent.id,
41
- tenantId,
42
- projectId,
43
- agentId: dbAgent.id,
44
- agentCard,
45
- taskHandler
46
- };
47
- } catch (error) {
48
- console.error(`❌ Failed to hydrate agent ${dbAgent.id}:`, error);
49
- throw error;
50
- }
51
- }
52
- async function getRegisteredAgent(executionContext) {
53
- const { project, agentId, baseUrl } = executionContext;
54
- const dbAgent = getAgentFromProject({
55
- project,
56
- agentId
57
- });
58
- if (!dbAgent) return null;
59
- return hydrateAgent({
60
- dbAgent,
61
- executionContext,
62
- baseUrl: `${baseUrl}/run/agents`
63
- });
64
- }
65
-
66
- //#endregion
67
- export { getRegisteredAgent };
@@ -1,4 +0,0 @@
1
- //#region src/domains/run/services/evaluationRunConfigMatcher.d.ts
2
- declare function evaluationRunConfigMatchesConversation(): Promise<boolean>;
3
- //#endregion
4
- export { evaluationRunConfigMatchesConversation };
@@ -1,7 +0,0 @@
1
- //#region src/domains/run/services/evaluationRunConfigMatcher.ts
2
- async function evaluationRunConfigMatchesConversation() {
3
- return true;
4
- }
5
-
6
- //#endregion
7
- export { evaluationRunConfigMatchesConversation };
@@ -1,21 +0,0 @@
1
- //#region src/domains/run/utils/cleanup.d.ts
2
- /**
3
- * Cleanup utilities for gracefully shutting down resources
4
- * Helps prevent Node.js processes from hanging
5
- */
6
- /**
7
- * Gracefully exit the process after cleaning up resources
8
- */
9
- declare function gracefulExit(code?: number, delayMs?: number, message?: string): void;
10
- /**
11
- * Setup signal handlers for graceful shutdown
12
- */
13
- declare function setupGracefulShutdown(cleanupFn?: () => Promise<void> | void, exitDelayMs?: number): void;
14
- /**
15
- * Stop all tools associated with agents
16
- */
17
- declare function stopAllAgentTools(agents: Array<{
18
- getTools: () => Record<string, any>;
19
- }>): Promise<void>;
20
- //#endregion
21
- export { gracefulExit, setupGracefulShutdown, stopAllAgentTools };