@sweetoburrito/backstage-plugin-ai-assistant-backend 0.13.0 → 0.14.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/dist/plugin.cjs.js +25 -41
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/services/agent/helpers/message-parser.cjs.js +31 -0
- package/dist/services/agent/helpers/message-parser.cjs.js.map +1 -0
- package/dist/services/agent/helpers/tool-filter.cjs.js +13 -0
- package/dist/services/agent/helpers/tool-filter.cjs.js.map +1 -0
- package/dist/services/agent/index.cjs.js +140 -0
- package/dist/services/agent/index.cjs.js.map +1 -0
- package/dist/services/callbacks.cjs.js +23 -9
- package/dist/services/callbacks.cjs.js.map +1 -1
- package/dist/services/chat.cjs.js +90 -253
- package/dist/services/chat.cjs.js.map +1 -1
- package/dist/services/conversation.cjs.js +133 -0
- package/dist/services/conversation.cjs.js.map +1 -0
- package/dist/services/mcp/index.cjs.js +37 -24
- package/dist/services/mcp/index.cjs.js.map +1 -1
- package/dist/services/model.cjs.js +45 -0
- package/dist/services/model.cjs.js.map +1 -0
- package/dist/services/router/agent.cjs.js +68 -0
- package/dist/services/router/agent.cjs.js.map +1 -0
- package/dist/services/router/chat.cjs.js +8 -13
- package/dist/services/router/chat.cjs.js.map +1 -1
- package/dist/services/router/index.cjs.js +4 -0
- package/dist/services/router/index.cjs.js.map +1 -1
- package/dist/services/router/models.cjs.js +2 -2
- package/dist/services/router/models.cjs.js.map +1 -1
- package/dist/services/router/settings/index.cjs.js +0 -3
- package/dist/services/router/settings/index.cjs.js.map +1 -1
- package/dist/services/router/summary.cjs.js +5 -3
- package/dist/services/router/summary.cjs.js.map +1 -1
- package/dist/services/router/tools.cjs.js +21 -0
- package/dist/services/router/tools.cjs.js.map +1 -0
- package/dist/services/summarizer.cjs.js +47 -28
- package/dist/services/summarizer.cjs.js.map +1 -1
- package/dist/services/tools.cjs.js +65 -0
- package/dist/services/tools.cjs.js.map +1 -0
- package/dist/services/user-settings.cjs.js +15 -0
- package/dist/services/user-settings.cjs.js.map +1 -1
- package/package.json +5 -3
package/dist/plugin.cjs.js
CHANGED
|
@@ -1,26 +1,28 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
4
|
-
var index$
|
|
4
|
+
var index$2 = require('./services/router/index.cjs.js');
|
|
5
5
|
var backstagePluginAiAssistantNode = require('@sweetoburrito/backstage-plugin-ai-assistant-node');
|
|
6
6
|
var ingestor = require('./services/ingestor.cjs.js');
|
|
7
|
-
var chat = require('./services/chat.cjs.js');
|
|
8
7
|
var migrations = require('./database/migrations.cjs.js');
|
|
9
8
|
var pgVectorStore = require('./database/pg-vector-store.cjs.js');
|
|
10
|
-
var pluginSignalsNode = require('@backstage/plugin-signals-node');
|
|
11
9
|
var searchKnowledge = require('./tools/searchKnowledge.cjs.js');
|
|
12
|
-
var
|
|
13
|
-
var
|
|
10
|
+
var index$1 = require('./services/mcp/index.cjs.js');
|
|
11
|
+
var chat = require('./services/chat.cjs.js');
|
|
14
12
|
var callbacks = require('./services/callbacks.cjs.js');
|
|
15
13
|
var summarizer = require('./services/summarizer.cjs.js');
|
|
16
14
|
var userSettings = require('./services/user-settings.cjs.js');
|
|
15
|
+
var model = require('./services/model.cjs.js');
|
|
16
|
+
var tools = require('./services/tools.cjs.js');
|
|
17
|
+
var conversation = require('./services/conversation.cjs.js');
|
|
18
|
+
var index = require('./services/agent/index.cjs.js');
|
|
17
19
|
|
|
18
20
|
const aiAssistantPlugin = backendPluginApi.createBackendPlugin({
|
|
19
21
|
pluginId: "ai-assistant",
|
|
20
22
|
register(env) {
|
|
21
23
|
const ingestors = [];
|
|
22
24
|
const models = [];
|
|
23
|
-
const tools = [];
|
|
25
|
+
const tools$1 = [];
|
|
24
26
|
const callbacks$1 = [];
|
|
25
27
|
let embeddingsProvider;
|
|
26
28
|
env.registerExtensionPoint(backstagePluginAiAssistantNode.dataIngestorExtensionPoint, {
|
|
@@ -50,11 +52,11 @@ const aiAssistantPlugin = backendPluginApi.createBackendPlugin({
|
|
|
50
52
|
});
|
|
51
53
|
env.registerExtensionPoint(backstagePluginAiAssistantNode.toolExtensionPoint, {
|
|
52
54
|
register: (tool) => {
|
|
53
|
-
const existingTool = tools.find((t) => t.name === tool.name);
|
|
55
|
+
const existingTool = tools$1.find((t) => t.name === tool.name);
|
|
54
56
|
if (existingTool) {
|
|
55
57
|
throw new Error(`Tool with name ${tool.name} is already registered.`);
|
|
56
58
|
}
|
|
57
|
-
tools.push(tool);
|
|
59
|
+
tools$1.push(tool);
|
|
58
60
|
}
|
|
59
61
|
});
|
|
60
62
|
env.registerExtensionPoint(backstagePluginAiAssistantNode.callbackProviderExtensionPoint, {
|
|
@@ -71,13 +73,18 @@ const aiAssistantPlugin = backendPluginApi.createBackendPlugin({
|
|
|
71
73
|
scheduler: backendPluginApi.coreServices.scheduler,
|
|
72
74
|
httpAuth: backendPluginApi.coreServices.httpAuth,
|
|
73
75
|
userInfo: backendPluginApi.coreServices.userInfo,
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
76
|
+
callback: callbacks.callbackServiceRef,
|
|
77
|
+
summarizer: summarizer.summarizerServiceRef,
|
|
78
|
+
model: model.modelServiceRef,
|
|
79
|
+
mcp: index$1.mcpServiceRef,
|
|
80
|
+
tool: tools.toolsServiceRef,
|
|
81
|
+
chat: chat.chatServiceRef,
|
|
82
|
+
userSettings: userSettings.userSettingsServiceRef,
|
|
83
|
+
conversation: conversation.conversationServiceRef,
|
|
84
|
+
agent: index.agentServiceRef
|
|
78
85
|
},
|
|
79
86
|
async init(options) {
|
|
80
|
-
const { httpRouter, database,
|
|
87
|
+
const { httpRouter, database, callback, model, tool } = options;
|
|
81
88
|
const client = await database.getClient();
|
|
82
89
|
await migrations.applyDatabaseMigrations(client);
|
|
83
90
|
const vectorStore = await pgVectorStore.PgVectorStore.fromConfig(options);
|
|
@@ -90,35 +97,12 @@ const aiAssistantPlugin = backendPluginApi.createBackendPlugin({
|
|
|
90
97
|
vectorStore,
|
|
91
98
|
ingestors
|
|
92
99
|
});
|
|
93
|
-
const mcp = await index.createMcpService(options);
|
|
94
100
|
const searchKnowledgeTool = searchKnowledge.createSearchKnowledgeTool({ vectorStore });
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
config,
|
|
101
|
-
models,
|
|
102
|
-
callback
|
|
103
|
-
});
|
|
104
|
-
const chat$1 = await chat.createChatService({
|
|
105
|
-
...options,
|
|
106
|
-
models,
|
|
107
|
-
tools,
|
|
108
|
-
mcp,
|
|
109
|
-
callback,
|
|
110
|
-
summarizer: summarizer$1
|
|
111
|
-
});
|
|
112
|
-
const userSettings$1 = await userSettings.createUserSettingsService(options);
|
|
113
|
-
httpRouter.use(
|
|
114
|
-
await index$1.createRouter({
|
|
115
|
-
...options,
|
|
116
|
-
chat: chat$1,
|
|
117
|
-
mcp,
|
|
118
|
-
summarizer: summarizer$1,
|
|
119
|
-
userSettings: userSettings$1
|
|
120
|
-
})
|
|
121
|
-
);
|
|
101
|
+
tool.registerTools(tools$1);
|
|
102
|
+
tool.registerCoreTools([searchKnowledgeTool]);
|
|
103
|
+
callback.registerCallbacks(callbacks$1);
|
|
104
|
+
model.registerModels(models);
|
|
105
|
+
httpRouter.use(await index$2.createRouter(options));
|
|
122
106
|
dataIngestionPipeline.start();
|
|
123
107
|
}
|
|
124
108
|
});
|
package/dist/plugin.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.ts"],"sourcesContent":["import {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './services/router';\nimport {\n dataIngestorExtensionPoint,\n EmbeddingsProvider,\n embeddingsProviderExtensionPoint,\n Ingestor,\n Model,\n modelProviderExtensionPoint,\n toolExtensionPoint,\n callbackProviderExtensionPoint,\n CallbackProvider,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-node';\nimport { Tool } from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport { createDataIngestionPipeline } from './services/ingestor';\nimport {
|
|
1
|
+
{"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.ts"],"sourcesContent":["import {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './services/router';\nimport {\n dataIngestorExtensionPoint,\n EmbeddingsProvider,\n embeddingsProviderExtensionPoint,\n Ingestor,\n Model,\n modelProviderExtensionPoint,\n toolExtensionPoint,\n callbackProviderExtensionPoint,\n CallbackProvider,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-node';\nimport { Tool } from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport { createDataIngestionPipeline } from './services/ingestor';\nimport { applyDatabaseMigrations } from './database/migrations';\nimport { PgVectorStore } from './database';\nimport { createSearchKnowledgeTool } from './tools/searchKnowledge';\nimport {\n callbackServiceRef,\n summarizerServiceRef,\n modelServiceRef,\n mcpServiceRef,\n toolsServiceRef,\n chatServiceRef,\n userSettingsServiceRef,\n conversationServiceRef,\n agentServiceRef,\n} from './services';\n\n/**\n * aiAssistantPlugin backend plugin\n *\n * @public\n */\n\nexport const aiAssistantPlugin = createBackendPlugin({\n pluginId: 'ai-assistant',\n register(env) {\n const ingestors: Ingestor[] = [];\n const models: Model[] = [];\n const tools: Tool[] = [];\n const callbacks: CallbackProvider[] = [];\n\n let embeddingsProvider: EmbeddingsProvider;\n\n env.registerExtensionPoint(dataIngestorExtensionPoint, {\n registerIngestor: ingestor => {\n const existingIngestor = ingestors.find(i => i.id === ingestor.id);\n if (existingIngestor) {\n throw new Error(\n `Ingestor with id ${ingestor.id} is already registered.`,\n );\n }\n ingestors.push(ingestor);\n },\n });\n\n env.registerExtensionPoint(embeddingsProviderExtensionPoint, {\n register: provider => {\n embeddingsProvider = provider;\n },\n });\n\n env.registerExtensionPoint(modelProviderExtensionPoint, {\n register: model => {\n const existingModel = models.find(m => m.id === model.id);\n if (existingModel) {\n throw new Error(`Model with id ${model.id} is already registered.`);\n }\n models.push(model);\n },\n });\n\n env.registerExtensionPoint(toolExtensionPoint, {\n register: tool => {\n const existingTool = tools.find(t => t.name === tool.name);\n if (existingTool) {\n throw new Error(`Tool with name ${tool.name} is already registered.`);\n }\n tools.push(tool);\n },\n });\n\n env.registerExtensionPoint(callbackProviderExtensionPoint, {\n register: callbackProvider => {\n callbacks.push(callbackProvider);\n },\n });\n\n env.registerInit({\n deps: {\n httpRouter: coreServices.httpRouter,\n database: coreServices.database,\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n scheduler: coreServices.scheduler,\n httpAuth: coreServices.httpAuth,\n userInfo: coreServices.userInfo,\n callback: callbackServiceRef,\n summarizer: summarizerServiceRef,\n model: modelServiceRef,\n mcp: mcpServiceRef,\n tool: toolsServiceRef,\n chat: chatServiceRef,\n userSettings: userSettingsServiceRef,\n conversation: conversationServiceRef,\n agent: agentServiceRef,\n },\n\n async init(options) {\n const { httpRouter, database, callback, model, tool } = options;\n\n const client = await database.getClient();\n\n await applyDatabaseMigrations(client);\n\n const vectorStore = await PgVectorStore.fromConfig(options);\n\n if (!embeddingsProvider) {\n throw new Error('No Embeddings Provider was registered.');\n }\n\n vectorStore.connectEmbeddings(await embeddingsProvider.getEmbeddings());\n\n const dataIngestionPipeline = createDataIngestionPipeline({\n ...options,\n vectorStore,\n ingestors,\n });\n\n const searchKnowledgeTool = createSearchKnowledgeTool({ vectorStore });\n\n tool.registerTools(tools);\n tool.registerCoreTools([searchKnowledgeTool]);\n callback.registerCallbacks(callbacks);\n model.registerModels(models);\n\n httpRouter.use(await createRouter(options));\n dataIngestionPipeline.start();\n },\n });\n },\n});\n"],"names":["createBackendPlugin","tools","callbacks","dataIngestorExtensionPoint","embeddingsProviderExtensionPoint","modelProviderExtensionPoint","toolExtensionPoint","callbackProviderExtensionPoint","coreServices","callbackServiceRef","summarizerServiceRef","modelServiceRef","mcpServiceRef","toolsServiceRef","chatServiceRef","userSettingsServiceRef","conversationServiceRef","agentServiceRef","applyDatabaseMigrations","PgVectorStore","createDataIngestionPipeline","createSearchKnowledgeTool","createRouter"],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var uuid = require('uuid');
|
|
4
|
+
|
|
5
|
+
const parseLangchainMessage = (message, traceId) => {
|
|
6
|
+
const id = uuid.validate(message.id) ? message.id : uuid.v4();
|
|
7
|
+
const role = message.getType();
|
|
8
|
+
const content = typeof message.content === "string" ? message.content : JSON.stringify(message.content);
|
|
9
|
+
const metadata = {};
|
|
10
|
+
if (role === "ai") {
|
|
11
|
+
const aiMessage = message;
|
|
12
|
+
metadata.toolCalls = aiMessage.tool_calls || [];
|
|
13
|
+
metadata.finishReason = aiMessage.response_metadata.finish_reason || void 0;
|
|
14
|
+
metadata.modelName = aiMessage.response_metadata.model_name || void 0;
|
|
15
|
+
}
|
|
16
|
+
if (role === "tool") {
|
|
17
|
+
const toolMessage = message;
|
|
18
|
+
metadata.name = toolMessage.name || "";
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
id,
|
|
22
|
+
role,
|
|
23
|
+
content,
|
|
24
|
+
metadata,
|
|
25
|
+
score: 0,
|
|
26
|
+
traceId
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
exports.parseLangchainMessage = parseLangchainMessage;
|
|
31
|
+
//# sourceMappingURL=message-parser.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-parser.cjs.js","sources":["../../../../src/services/agent/helpers/message-parser.ts"],"sourcesContent":["import { AIMessage, ToolMessage, BaseMessage } from '@langchain/core/messages';\n\nimport {\n JsonObject,\n Message,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport { v4 as uuid, validate } from 'uuid';\n\nexport const parseLangchainMessage = (\n message: BaseMessage,\n traceId: string,\n): Message => {\n const id = validate(message.id) ? message.id : uuid();\n const role = message.getType();\n const content =\n typeof message.content === 'string'\n ? message.content\n : JSON.stringify(message.content);\n\n const metadata: JsonObject = {};\n\n if (role === 'ai') {\n const aiMessage = message as AIMessage;\n\n metadata.toolCalls = aiMessage.tool_calls || [];\n metadata.finishReason =\n aiMessage.response_metadata.finish_reason || undefined;\n metadata.modelName = aiMessage.response_metadata.model_name || undefined;\n }\n\n if (role === 'tool') {\n const toolMessage = message as ToolMessage;\n metadata.name = toolMessage.name || '';\n }\n\n return {\n id,\n role,\n content,\n metadata,\n score: 0,\n traceId,\n };\n};\n"],"names":["validate","uuid"],"mappings":";;;;AAQO,MAAM,qBAAA,GAAwB,CACnC,OAAA,EACA,OAAA,KACY;AACZ,EAAA,MAAM,KAAKA,aAAA,CAAS,OAAA,CAAQ,EAAE,CAAA,GAAI,OAAA,CAAQ,KAAKC,OAAA,EAAK;AACpD,EAAA,MAAM,IAAA,GAAO,QAAQ,OAAA,EAAQ;AAC7B,EAAA,MAAM,OAAA,GACJ,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,GACvB,QAAQ,OAAA,GACR,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,OAAO,CAAA;AAEpC,EAAA,MAAM,WAAuB,EAAC;AAE9B,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,MAAM,SAAA,GAAY,OAAA;AAElB,IAAA,QAAA,CAAS,SAAA,GAAY,SAAA,CAAU,UAAA,IAAc,EAAC;AAC9C,IAAA,QAAA,CAAS,YAAA,GACP,SAAA,CAAU,iBAAA,CAAkB,aAAA,IAAiB,MAAA;AAC/C,IAAA,QAAA,CAAS,SAAA,GAAY,SAAA,CAAU,iBAAA,CAAkB,UAAA,IAAc,MAAA;AAAA,EACjE;AAEA,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,MAAM,WAAA,GAAc,OAAA;AACpB,IAAA,QAAA,CAAS,IAAA,GAAO,YAAY,IAAA,IAAQ,EAAA;AAAA,EACtC;AAEA,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA,EAAO,CAAA;AAAA,IACP;AAAA,GACF;AACF;;;;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const toolFilter = (t, enabledTools) => {
|
|
4
|
+
if (enabledTools === void 0) return true;
|
|
5
|
+
if (enabledTools.length === 0) return false;
|
|
6
|
+
const enabled = enabledTools.find(
|
|
7
|
+
(enabledTool) => enabledTool.name === t.name && enabledTool.provider === t.provider
|
|
8
|
+
);
|
|
9
|
+
return !!enabled;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
exports.toolFilter = toolFilter;
|
|
13
|
+
//# sourceMappingURL=tool-filter.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-filter.cjs.js","sources":["../../../../src/services/agent/helpers/tool-filter.ts"],"sourcesContent":["import {\n EnabledTool,\n Tool,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-common';\n\nexport const toolFilter = (\n t: Tool,\n enabledTools: EnabledTool[] | undefined,\n): boolean => {\n if (enabledTools === undefined) return true;\n\n // If empty array, no tools should be enabled\n if (enabledTools.length === 0) return false;\n // Otherwise, only allow tools that are in the enabled list\n const enabled = enabledTools.find(\n enabledTool =>\n enabledTool.name === t.name && enabledTool.provider === t.provider,\n );\n return !!enabled;\n};\n"],"names":[],"mappings":";;AAKO,MAAM,UAAA,GAAa,CACxB,CAAA,EACA,YAAA,KACY;AACZ,EAAA,IAAI,YAAA,KAAiB,QAAW,OAAO,IAAA;AAGvC,EAAA,IAAI,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAEtC,EAAA,MAAM,UAAU,YAAA,CAAa,IAAA;AAAA,IAC3B,iBACE,WAAA,CAAY,IAAA,KAAS,EAAE,IAAA,IAAQ,WAAA,CAAY,aAAa,CAAA,CAAE;AAAA,GAC9D;AACA,EAAA,OAAO,CAAC,CAAC,OAAA;AACX;;;;"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
4
|
+
var prebuilt = require('@langchain/langgraph/prebuilt');
|
|
5
|
+
var toolFilter = require('./helpers/tool-filter.cjs.js');
|
|
6
|
+
var prompts = require('../../constants/prompts.cjs.js');
|
|
7
|
+
var prompts$1 = require('@langchain/core/prompts');
|
|
8
|
+
var callbacks = require('../callbacks.cjs.js');
|
|
9
|
+
var model = require('../model.cjs.js');
|
|
10
|
+
var tools = require('../tools.cjs.js');
|
|
11
|
+
var messageParser = require('./helpers/message-parser.cjs.js');
|
|
12
|
+
|
|
13
|
+
const createAgentService = ({
|
|
14
|
+
model,
|
|
15
|
+
tool,
|
|
16
|
+
config,
|
|
17
|
+
callback
|
|
18
|
+
}) => {
|
|
19
|
+
const identityPrompt = config.getOptionalString("aiAssistant.prompt.identity") || prompts.DEFAULT_IDENTITY_PROMPT;
|
|
20
|
+
const formattingPrompt = config.getOptionalString("aiAssistant.prompt.formatting") || prompts.DEFAULT_FORMATTING_PROMPT;
|
|
21
|
+
const contentPrompt = config.getOptionalString("aiAssistant.prompt.content") || prompts.DEFAULT_SYSTEM_PROMPT;
|
|
22
|
+
const defaultBasePrompt = `${identityPrompt}
|
|
23
|
+
|
|
24
|
+
${formattingPrompt}
|
|
25
|
+
|
|
26
|
+
${contentPrompt}`;
|
|
27
|
+
const toolGuideline = config.getOptionalString("aiAssistant.prompt.toolGuideline") || prompts.DEFAULT_TOOL_GUIDELINE;
|
|
28
|
+
const systemPromptTemplate = prompts$1.SystemMessagePromptTemplate.fromTemplate(`
|
|
29
|
+
PURPOSE:
|
|
30
|
+
{systemPrompt}
|
|
31
|
+
|
|
32
|
+
TOOL USAGE GUIDELINES:
|
|
33
|
+
{toolGuideline}
|
|
34
|
+
|
|
35
|
+
Available tools:
|
|
36
|
+
{toolList}
|
|
37
|
+
|
|
38
|
+
Context:
|
|
39
|
+
{context}`);
|
|
40
|
+
const createAgent = async (options) => {
|
|
41
|
+
const {
|
|
42
|
+
modelId,
|
|
43
|
+
credentials,
|
|
44
|
+
tools: enabledTools,
|
|
45
|
+
systemPrompt = defaultBasePrompt,
|
|
46
|
+
context = "none",
|
|
47
|
+
metadata: { conversationId, userId, runId, runName }
|
|
48
|
+
} = options;
|
|
49
|
+
const { chatModel: llm, id: resolvedModelId } = model.getModel(
|
|
50
|
+
modelId ?? "default"
|
|
51
|
+
);
|
|
52
|
+
const tools = await tool.getPrincipalTools({
|
|
53
|
+
credentials,
|
|
54
|
+
filter: (t) => {
|
|
55
|
+
return toolFilter.toolFilter(t, enabledTools);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
const toolList = tools.map((t) => `- ${t.name}: ${t.description}`).join("\n");
|
|
59
|
+
const agentPrompt = await systemPromptTemplate.formatMessages({
|
|
60
|
+
toolGuideline,
|
|
61
|
+
toolList,
|
|
62
|
+
context,
|
|
63
|
+
systemPrompt
|
|
64
|
+
});
|
|
65
|
+
const agent = prebuilt.createReactAgent({
|
|
66
|
+
llm,
|
|
67
|
+
tools,
|
|
68
|
+
prompt: agentPrompt[0].text
|
|
69
|
+
});
|
|
70
|
+
const { callbacks } = await callback.getChainCallbacks({
|
|
71
|
+
userId,
|
|
72
|
+
conversationId,
|
|
73
|
+
modelId: resolvedModelId
|
|
74
|
+
});
|
|
75
|
+
const { metadata } = await callback.getChainMetadata({
|
|
76
|
+
userId,
|
|
77
|
+
conversationId,
|
|
78
|
+
modelId: resolvedModelId
|
|
79
|
+
});
|
|
80
|
+
agent.config = {
|
|
81
|
+
...agent.config,
|
|
82
|
+
callbacks,
|
|
83
|
+
metadata,
|
|
84
|
+
runId,
|
|
85
|
+
runName
|
|
86
|
+
};
|
|
87
|
+
return agent;
|
|
88
|
+
};
|
|
89
|
+
const stream = async (options) => {
|
|
90
|
+
const { messages, onStreamChunk } = options;
|
|
91
|
+
const agent = await createAgent(options);
|
|
92
|
+
const promptStream = await agent.stream(
|
|
93
|
+
{
|
|
94
|
+
messages
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
streamMode: ["values"]
|
|
98
|
+
}
|
|
99
|
+
);
|
|
100
|
+
for await (const [, chunk] of promptStream) {
|
|
101
|
+
const { messages: promptMessages } = chunk;
|
|
102
|
+
const parsedMessages = promptMessages.map(
|
|
103
|
+
(m) => messageParser.parseLangchainMessage(m, options.metadata.runId)
|
|
104
|
+
);
|
|
105
|
+
onStreamChunk(parsedMessages);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
const prompt = async (options) => {
|
|
109
|
+
const {
|
|
110
|
+
messages,
|
|
111
|
+
metadata: { runId }
|
|
112
|
+
} = options;
|
|
113
|
+
const agent = await createAgent(options);
|
|
114
|
+
const result = await agent.invoke({
|
|
115
|
+
messages
|
|
116
|
+
});
|
|
117
|
+
return result.messages.map(
|
|
118
|
+
(m) => messageParser.parseLangchainMessage(m, runId)
|
|
119
|
+
);
|
|
120
|
+
};
|
|
121
|
+
return { prompt, stream };
|
|
122
|
+
};
|
|
123
|
+
const agentServiceRef = backendPluginApi.createServiceRef({
|
|
124
|
+
id: "ai-assistant.conversation-service",
|
|
125
|
+
defaultFactory: async (service) => backendPluginApi.createServiceFactory({
|
|
126
|
+
service,
|
|
127
|
+
deps: {
|
|
128
|
+
config: backendPluginApi.coreServices.rootConfig,
|
|
129
|
+
model: model.modelServiceRef,
|
|
130
|
+
tool: tools.toolsServiceRef,
|
|
131
|
+
callback: callbacks.callbackServiceRef
|
|
132
|
+
},
|
|
133
|
+
factory: async (options) => {
|
|
134
|
+
return createAgentService(options);
|
|
135
|
+
}
|
|
136
|
+
})
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
exports.agentServiceRef = agentServiceRef;
|
|
140
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../src/services/agent/index.ts"],"sourcesContent":["import {\n BackstageCredentials,\n coreServices,\n createServiceFactory,\n createServiceRef,\n RootConfigService,\n ServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { createReactAgent } from '@langchain/langgraph/prebuilt';\nimport {\n EnabledTool,\n Message,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport { toolFilter } from './helpers/tool-filter';\nimport {\n DEFAULT_FORMATTING_PROMPT,\n DEFAULT_IDENTITY_PROMPT,\n DEFAULT_SYSTEM_PROMPT,\n DEFAULT_TOOL_GUIDELINE,\n} from '../../constants/prompts';\nimport { SystemMessagePromptTemplate } from '@langchain/core/prompts';\n\nimport { CallbackService, callbackServiceRef } from '../callbacks';\nimport { modelServiceRef, ModelService } from '../model';\nimport { toolsServiceRef, ToolsService } from '../tools';\n\nimport { BaseMessage } from '@langchain/core/messages';\nimport { parseLangchainMessage } from './helpers/message-parser';\n\ntype PromptOptions = {\n credentials: BackstageCredentials;\n metadata: {\n conversationId: string;\n userId: string;\n runName: string;\n runId: string;\n };\n messages: Message[];\n modelId?: string;\n tools?: EnabledTool[];\n systemPrompt?: string;\n context?: string;\n};\n\ntype StreamOptions = PromptOptions & {\n onStreamChunk: (messages: Message[]) => void;\n};\n\nexport type AgentService = {\n prompt: (options: PromptOptions) => Promise<Message[]>;\n stream: (options: StreamOptions) => Promise<void>;\n};\n\ntype AgentServiceOptions = {\n model: ModelService;\n config: RootConfigService;\n tool: ToolsService;\n callback: CallbackService;\n};\n\nconst createAgentService = ({\n model,\n tool,\n config,\n callback,\n}: AgentServiceOptions): AgentService => {\n const identityPrompt =\n config.getOptionalString('aiAssistant.prompt.identity') ||\n DEFAULT_IDENTITY_PROMPT;\n\n const formattingPrompt =\n config.getOptionalString('aiAssistant.prompt.formatting') ||\n DEFAULT_FORMATTING_PROMPT;\n\n const contentPrompt =\n config.getOptionalString('aiAssistant.prompt.content') ||\n DEFAULT_SYSTEM_PROMPT;\n\n const defaultBasePrompt = `${identityPrompt}\\n\\n${formattingPrompt}\\n\\n${contentPrompt}`;\n\n const toolGuideline =\n config.getOptionalString('aiAssistant.prompt.toolGuideline') ||\n DEFAULT_TOOL_GUIDELINE;\n\n const systemPromptTemplate = SystemMessagePromptTemplate.fromTemplate(`\n PURPOSE:\n {systemPrompt}\n\n TOOL USAGE GUIDELINES:\n {toolGuideline}\n\n Available tools:\n {toolList}\n\n Context:\n {context}`);\n\n const createAgent = async (\n options: PromptOptions,\n ): Promise<ReturnType<typeof createReactAgent>> => {\n const {\n modelId,\n credentials,\n tools: enabledTools,\n systemPrompt = defaultBasePrompt,\n context = 'none',\n metadata: { conversationId, userId, runId, runName },\n } = options;\n\n const { chatModel: llm, id: resolvedModelId } = model.getModel(\n modelId ?? 'default',\n );\n\n const tools = await tool.getPrincipalTools({\n credentials,\n filter: t => {\n return toolFilter(t, enabledTools);\n },\n });\n\n const toolList = tools.map(t => `- ${t.name}: ${t.description}`).join('\\n');\n\n const agentPrompt = await systemPromptTemplate.formatMessages({\n toolGuideline,\n toolList,\n context,\n systemPrompt,\n });\n\n const agent = createReactAgent({\n llm,\n tools,\n prompt: agentPrompt[0].text,\n });\n\n const { callbacks } = await callback.getChainCallbacks({\n userId,\n conversationId,\n modelId: resolvedModelId,\n });\n\n const { metadata } = await callback.getChainMetadata({\n userId,\n conversationId,\n modelId: resolvedModelId,\n });\n\n agent.config = {\n ...agent.config,\n callbacks,\n metadata,\n runId,\n runName,\n };\n\n return agent;\n };\n\n const stream: AgentService['stream'] = async options => {\n const { messages, onStreamChunk } = options;\n\n const agent = await createAgent(options);\n\n const promptStream = await agent.stream(\n {\n messages,\n },\n {\n streamMode: ['values'],\n },\n );\n\n for await (const [, chunk] of promptStream) {\n const { messages: promptMessages } = chunk;\n\n const parsedMessages: Message[] = (promptMessages as BaseMessage[]).map(\n m => parseLangchainMessage(m, options.metadata.runId),\n );\n\n onStreamChunk(parsedMessages);\n }\n };\n\n const prompt: AgentService['prompt'] = async options => {\n const {\n messages,\n metadata: { runId },\n } = options;\n const agent = await createAgent(options);\n\n const result = await agent.invoke({\n messages,\n });\n\n return (result.messages as BaseMessage[]).map(m =>\n parseLangchainMessage(m, runId),\n );\n };\n\n return { prompt, stream };\n};\n\nexport const agentServiceRef: ServiceRef<AgentService, 'plugin', 'singleton'> =\n createServiceRef<AgentService>({\n id: 'ai-assistant.conversation-service',\n defaultFactory: async service =>\n createServiceFactory({\n service,\n deps: {\n config: coreServices.rootConfig,\n model: modelServiceRef,\n tool: toolsServiceRef,\n callback: callbackServiceRef,\n },\n factory: async options => {\n return createAgentService(options);\n },\n }),\n });\n"],"names":["DEFAULT_IDENTITY_PROMPT","DEFAULT_FORMATTING_PROMPT","DEFAULT_SYSTEM_PROMPT","DEFAULT_TOOL_GUIDELINE","SystemMessagePromptTemplate","toolFilter","createReactAgent","parseLangchainMessage","createServiceRef","createServiceFactory","coreServices","modelServiceRef","toolsServiceRef","callbackServiceRef"],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}) => {
|
|
3
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
4
|
+
|
|
5
|
+
const createCallbackService = async ({}) => {
|
|
6
|
+
const callbacks = [];
|
|
6
7
|
const getChainCallbacks = async (options) => {
|
|
7
8
|
const callbackHandlers = [];
|
|
8
9
|
for (const { chainCallback } of callbacks) {
|
|
@@ -27,10 +28,7 @@ const createCallbackService = async ({
|
|
|
27
28
|
}
|
|
28
29
|
return { metadata };
|
|
29
30
|
};
|
|
30
|
-
const handleScoreCallbacks = async ({
|
|
31
|
-
name,
|
|
32
|
-
message
|
|
33
|
-
}) => {
|
|
31
|
+
const handleScoreCallbacks = async ({ name, message }) => {
|
|
34
32
|
callbacks.forEach(async ({ scoreCallback }) => {
|
|
35
33
|
if (!scoreCallback) {
|
|
36
34
|
return;
|
|
@@ -38,12 +36,28 @@ const createCallbackService = async ({
|
|
|
38
36
|
scoreCallback({ name, message });
|
|
39
37
|
});
|
|
40
38
|
};
|
|
39
|
+
const registerCallbacks = (newCallbacks) => {
|
|
40
|
+
newCallbacks.forEach((callback) => {
|
|
41
|
+
callbacks.push(callback);
|
|
42
|
+
});
|
|
43
|
+
};
|
|
41
44
|
return {
|
|
42
45
|
getChainCallbacks,
|
|
43
46
|
getChainMetadata,
|
|
44
|
-
handleScoreCallbacks
|
|
47
|
+
handleScoreCallbacks,
|
|
48
|
+
registerCallbacks
|
|
45
49
|
};
|
|
46
50
|
};
|
|
51
|
+
const callbackServiceRef = backendPluginApi.createServiceRef({
|
|
52
|
+
id: "ai-assistant.callback-service",
|
|
53
|
+
defaultFactory: async (service) => backendPluginApi.createServiceFactory({
|
|
54
|
+
service,
|
|
55
|
+
deps: {},
|
|
56
|
+
factory: async (options) => {
|
|
57
|
+
return createCallbackService(options);
|
|
58
|
+
}
|
|
59
|
+
})
|
|
60
|
+
});
|
|
47
61
|
|
|
48
|
-
exports.
|
|
62
|
+
exports.callbackServiceRef = callbackServiceRef;
|
|
49
63
|
//# sourceMappingURL=callbacks.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callbacks.cjs.js","sources":["../../src/services/callbacks.ts"],"sourcesContent":["import {\n CallbackProvider,\n ChainMetadata,\n ChainCallbackOptions,\n ChainCallback,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-node';\n\nexport type CallbackService = {\n getChainCallbacks: (options: ChainCallbackOptions) => Promise<{\n callbacks: ReturnType<ChainCallback>[];\n }>;\n\n getChainMetadata: (\n options: ChainCallbackOptions,\n ) => Promise<{ metadata: ChainMetadata }>;\n\n handleScoreCallbacks: NonNullable<CallbackProvider['scoreCallback']>;\n
|
|
1
|
+
{"version":3,"file":"callbacks.cjs.js","sources":["../../src/services/callbacks.ts"],"sourcesContent":["import {\n CallbackProvider,\n ChainMetadata,\n ChainCallbackOptions,\n ChainCallback,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-node';\n\nimport {\n createServiceFactory,\n createServiceRef,\n ServiceRef,\n} from '@backstage/backend-plugin-api';\n\nexport type CallbackService = {\n getChainCallbacks: (options: ChainCallbackOptions) => Promise<{\n callbacks: ReturnType<ChainCallback>[];\n }>;\n\n getChainMetadata: (\n options: ChainCallbackOptions,\n ) => Promise<{ metadata: ChainMetadata }>;\n\n handleScoreCallbacks: NonNullable<CallbackProvider['scoreCallback']>;\n\n registerCallbacks: (callbacks: CallbackProvider[]) => void;\n};\n\nexport type CreateCallbackServiceOptions = {};\n\nconst createCallbackService =\n async ({}: CreateCallbackServiceOptions): Promise<CallbackService> => {\n const callbacks: CallbackProvider[] = [];\n\n const getChainCallbacks: CallbackService['getChainCallbacks'] =\n async options => {\n const callbackHandlers: ReturnType<ChainCallback>[] = [];\n\n for (const { chainCallback } of callbacks) {\n if (!chainCallback) {\n continue;\n }\n\n const callbackHandler = await chainCallback(options);\n\n callbackHandlers.push(callbackHandler);\n }\n\n return {\n callbacks: callbackHandlers,\n };\n };\n\n const getChainMetadata: CallbackService['getChainMetadata'] =\n async options => {\n const metadata: ChainMetadata = {};\n\n for (const { chainMetadataCallback } of callbacks) {\n if (!chainMetadataCallback) {\n continue;\n }\n\n const callbackData = await chainMetadataCallback(options);\n\n Object.assign(metadata, callbackData.metadata);\n }\n\n return { metadata };\n };\n\n const handleScoreCallbacks: CallbackService['handleScoreCallbacks'] =\n async ({ name, message }) => {\n callbacks.forEach(async ({ scoreCallback }) => {\n if (!scoreCallback) {\n return;\n }\n\n scoreCallback({ name, message });\n });\n };\n\n const registerCallbacks: CallbackService['registerCallbacks'] =\n newCallbacks => {\n newCallbacks.forEach(callback => {\n callbacks.push(callback);\n });\n };\n\n return {\n getChainCallbacks,\n getChainMetadata,\n handleScoreCallbacks,\n registerCallbacks,\n };\n };\n\nexport const callbackServiceRef: ServiceRef<\n CallbackService,\n 'plugin',\n 'singleton'\n> = createServiceRef<CallbackService>({\n id: 'ai-assistant.callback-service',\n defaultFactory: async service =>\n createServiceFactory({\n service,\n deps: {},\n factory: async options => {\n return createCallbackService(options);\n },\n }),\n});\n"],"names":["createServiceRef","createServiceFactory"],"mappings":";;;;AA6BA,MAAM,qBAAA,GACJ,OAAO,EAAC,KAA8D;AACpE,EAAA,MAAM,YAAgC,EAAC;AAEvC,EAAA,MAAM,iBAAA,GACJ,OAAM,OAAA,KAAW;AACf,IAAA,MAAM,mBAAgD,EAAC;AAEvD,IAAA,KAAA,MAAW,EAAE,aAAA,EAAc,IAAK,SAAA,EAAW;AACzC,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,eAAA,GAAkB,MAAM,aAAA,CAAc,OAAO,CAAA;AAEnD,MAAA,gBAAA,CAAiB,KAAK,eAAe,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO;AAAA,MACL,SAAA,EAAW;AAAA,KACb;AAAA,EACF,CAAA;AAEF,EAAA,MAAM,gBAAA,GACJ,OAAM,OAAA,KAAW;AACf,IAAA,MAAM,WAA0B,EAAC;AAEjC,IAAA,KAAA,MAAW,EAAE,qBAAA,EAAsB,IAAK,SAAA,EAAW;AACjD,MAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,GAAe,MAAM,qBAAA,CAAsB,OAAO,CAAA;AAExD,MAAA,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,YAAA,CAAa,QAAQ,CAAA;AAAA,IAC/C;AAEA,IAAA,OAAO,EAAE,QAAA,EAAS;AAAA,EACpB,CAAA;AAEF,EAAA,MAAM,oBAAA,GACJ,OAAO,EAAE,IAAA,EAAM,SAAQ,KAAM;AAC3B,IAAA,SAAA,CAAU,OAAA,CAAQ,OAAO,EAAE,aAAA,EAAc,KAAM;AAC7C,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA;AAAA,MACF;AAEA,MAAA,aAAA,CAAc,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,IACjC,CAAC,CAAA;AAAA,EACH,CAAA;AAEF,EAAA,MAAM,oBACJ,CAAA,YAAA,KAAgB;AACd,IAAA,YAAA,CAAa,QAAQ,CAAA,QAAA,KAAY;AAC/B,MAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EACH,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;AAEK,MAAM,qBAITA,iCAAA,CAAkC;AAAA,EACpC,EAAA,EAAI,+BAAA;AAAA,EACJ,cAAA,EAAgB,OAAM,OAAA,KACpBC,qCAAA,CAAqB;AAAA,IACnB,OAAA;AAAA,IACA,MAAM,EAAC;AAAA,IACP,OAAA,EAAS,OAAM,OAAA,KAAW;AACxB,MAAA,OAAO,sBAAsB,OAAO,CAAA;AAAA,IACtC;AAAA,GACD;AACL,CAAC;;;;"}
|