@sweetoburrito/backstage-plugin-ai-assistant-backend 0.13.0 → 0.15.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/constants/prompts.cjs.js +1 -0
- package/dist/constants/prompts.cjs.js.map +1 -1
- package/dist/database/pg-vector-store.cjs.js +100 -38
- package/dist/database/pg-vector-store.cjs.js.map +1 -1
- 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 +88 -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/ingestor.cjs.js +5 -11
- package/dist/services/ingestor.cjs.js.map +1 -1
- 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/dist/tools/searchKnowledge.cjs.js +1 -6
- package/dist/tools/searchKnowledge.cjs.js.map +1 -1
- package/migrations/20260108_data_ingestion_refactor.js +27 -0
- package/package.json +6 -4
|
@@ -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;;;;"}
|
|
@@ -1,295 +1,130 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var pluginCatalogNode = require('@backstage/plugin-catalog-node');
|
|
4
|
+
var pluginSignalsNode = require('@backstage/plugin-signals-node');
|
|
5
5
|
var backstagePluginAiAssistantNode = require('@sweetoburrito/backstage-plugin-ai-assistant-node');
|
|
6
|
-
var tools = require('@langchain/core/tools');
|
|
7
|
-
var prebuilt = require('@langchain/langgraph/prebuilt');
|
|
8
|
-
var prompts$1 = require('@langchain/core/prompts');
|
|
9
6
|
var uuid = require('uuid');
|
|
7
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
8
|
+
var conversation = require('./conversation.cjs.js');
|
|
9
|
+
var index = require('./agent/index.cjs.js');
|
|
10
|
+
var prompts = require('@langchain/core/prompts');
|
|
10
11
|
|
|
11
12
|
const createChatService = async ({
|
|
12
|
-
models,
|
|
13
|
-
tools: tools$1,
|
|
14
|
-
logger,
|
|
15
|
-
database,
|
|
16
13
|
signals,
|
|
17
|
-
config,
|
|
18
14
|
catalog,
|
|
19
15
|
cache,
|
|
20
16
|
auth,
|
|
21
|
-
mcp,
|
|
22
17
|
userInfo,
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
conversation,
|
|
19
|
+
agent
|
|
25
20
|
}) => {
|
|
26
|
-
|
|
27
|
-
logger.info(`Available tools: ${tools$1.map((t) => t.name).join(", ")}`);
|
|
28
|
-
const identityPrompt = config.getOptionalString("aiAssistant.prompt.identity") || prompts.DEFAULT_IDENTITY_PROMPT;
|
|
29
|
-
const formattingPrompt = config.getOptionalString("aiAssistant.prompt.formatting") || prompts.DEFAULT_FORMATTING_PROMPT;
|
|
30
|
-
const contentPrompt = config.getOptionalString("aiAssistant.prompt.content") || prompts.DEFAULT_SYSTEM_PROMPT;
|
|
31
|
-
const combinedBasePrompt = `${identityPrompt}
|
|
32
|
-
|
|
33
|
-
${formattingPrompt}
|
|
34
|
-
|
|
35
|
-
${contentPrompt}`;
|
|
36
|
-
const toolGuideline = config.getOptionalString("aiAssistant.prompt.toolGuideline") || prompts.DEFAULT_TOOL_GUIDELINE;
|
|
37
|
-
const chatStore$1 = await chatStore.ChatStore.fromConfig({ database });
|
|
38
|
-
const systemPromptTemplate = prompts$1.SystemMessagePromptTemplate.fromTemplate(`
|
|
39
|
-
PURPOSE:
|
|
40
|
-
{basePrompt}
|
|
41
|
-
|
|
42
|
-
TOOL USAGE GUIDELINES:
|
|
43
|
-
{toolGuideline}
|
|
44
|
-
|
|
45
|
-
Available tools:
|
|
46
|
-
{toolList}
|
|
47
|
-
|
|
21
|
+
const contextPromptTemplate = prompts.SystemMessagePromptTemplate.fromTemplate(`
|
|
48
22
|
Calling User:
|
|
49
|
-
{user}
|
|
50
|
-
|
|
51
|
-
Context:
|
|
52
|
-
{context}`);
|
|
53
|
-
const addMessages = async (messages, userRef, conversationId, recentConversationMessages) => {
|
|
54
|
-
const recentMessages = recentConversationMessages || await chatStore$1.getChatMessages(conversationId, userRef, 5, ["tool"]);
|
|
55
|
-
const conversationSize = (recentMessages?.length ?? 0) + messages.length;
|
|
56
|
-
if (recentMessages.length === 0) {
|
|
57
|
-
const conversation2 = {
|
|
58
|
-
id: conversationId,
|
|
59
|
-
title: "New Conversation",
|
|
60
|
-
userRef
|
|
61
|
-
};
|
|
62
|
-
chatStore$1.createConversation(conversation2);
|
|
63
|
-
chatStore$1.addChatMessage(messages, userRef, conversationId);
|
|
64
|
-
signals.publish({
|
|
65
|
-
channel: `ai-assistant.chat.conversation-details-update`,
|
|
66
|
-
message: { conversation: conversation2 },
|
|
67
|
-
recipients: {
|
|
68
|
-
type: "user",
|
|
69
|
-
entityRef: userRef
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
if (conversationSize < 5) {
|
|
75
|
-
chatStore$1.addChatMessage(messages, userRef, conversationId);
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
const conversation = await chatStore$1.getConversation(
|
|
79
|
-
conversationId,
|
|
80
|
-
userRef
|
|
81
|
-
);
|
|
82
|
-
if (conversation.title !== "New Conversation") {
|
|
83
|
-
chatStore$1.addChatMessage(messages, userRef, conversationId);
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
const summary = await summarizer.summarizeConversation({
|
|
87
|
-
messages: recentMessages,
|
|
88
|
-
length: "25 characters"
|
|
89
|
-
});
|
|
90
|
-
conversation.title = summary;
|
|
91
|
-
chatStore$1.updateConversation(conversation);
|
|
92
|
-
chatStore$1.addChatMessage(messages, userRef, conversationId);
|
|
93
|
-
signals.publish({
|
|
94
|
-
channel: `ai-assistant.chat.conversation-details-update`,
|
|
95
|
-
message: { conversation },
|
|
96
|
-
recipients: {
|
|
97
|
-
type: "user",
|
|
98
|
-
entityRef: userRef
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
};
|
|
23
|
+
{user}`);
|
|
102
24
|
const prompt = async ({
|
|
103
25
|
conversationId,
|
|
104
26
|
messages,
|
|
105
|
-
modelId,
|
|
106
27
|
stream = true,
|
|
107
|
-
|
|
108
|
-
tools: enabledTools
|
|
28
|
+
credentials,
|
|
29
|
+
tools: enabledTools,
|
|
30
|
+
modelId
|
|
109
31
|
}) => {
|
|
110
|
-
const model = models.find((m) => m.id === modelId)?.chatModel;
|
|
111
|
-
if (!model) {
|
|
112
|
-
throw new Error(`Model with id ${modelId} not found`);
|
|
113
|
-
}
|
|
114
|
-
const { userEntityRef } = await userInfo.getUserInfo(userCredentials);
|
|
115
32
|
const streamFn = async () => {
|
|
116
|
-
const
|
|
33
|
+
const { userEntityRef } = await userInfo.getUserInfo(credentials);
|
|
34
|
+
const recentConversationMessages = await conversation.getRecentConversationMessages({
|
|
117
35
|
conversationId,
|
|
118
36
|
userEntityRef,
|
|
119
|
-
10,
|
|
120
|
-
["tool"]
|
|
121
|
-
);
|
|
122
|
-
const
|
|
123
|
-
const user = await backstagePluginAiAssistantNode.getUser(cache, userEntityRef, credentials, catalog);
|
|
124
|
-
const mcpTools = await mcp.getTools(userCredentials);
|
|
125
|
-
const agentTools = [...tools$1, ...mcpTools].filter((tool) => {
|
|
126
|
-
if (enabledTools === void 0) return true;
|
|
127
|
-
if (enabledTools.length === 0) return false;
|
|
128
|
-
const enabled = enabledTools.find(
|
|
129
|
-
(enabledTool) => enabledTool.name === tool.name && enabledTool.provider === tool.provider
|
|
130
|
-
);
|
|
131
|
-
return !!enabled;
|
|
132
|
-
}).map((tool) => new tools.DynamicStructuredTool(tool));
|
|
37
|
+
limit: 10,
|
|
38
|
+
excludeRoles: ["tool"]
|
|
39
|
+
});
|
|
40
|
+
const user = await backstagePluginAiAssistantNode.getUser(cache, userEntityRef, catalog, auth);
|
|
133
41
|
const messagesWithoutSystem = messages.filter((m) => m.role !== "system");
|
|
134
|
-
addMessages(
|
|
42
|
+
conversation.addMessages(
|
|
135
43
|
messagesWithoutSystem,
|
|
136
44
|
userEntityRef,
|
|
137
45
|
conversationId,
|
|
138
46
|
recentConversationMessages
|
|
139
47
|
);
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
toolGuideline,
|
|
143
|
-
toolList: agentTools.map((tool) => `- ${tool.name}: ${tool.description}`).join("\n"),
|
|
144
|
-
context: `none`,
|
|
48
|
+
const traceId = uuid.v4();
|
|
49
|
+
const context = await contextPromptTemplate.formatMessages({
|
|
145
50
|
user
|
|
146
51
|
});
|
|
147
|
-
const agent = prebuilt.createReactAgent({
|
|
148
|
-
llm: model,
|
|
149
|
-
tools: agentTools,
|
|
150
|
-
prompt: systemPrompt[0].text
|
|
151
|
-
});
|
|
152
|
-
const { callbacks } = await callback.getChainCallbacks({
|
|
153
|
-
conversationId,
|
|
154
|
-
userId: userEntityRef,
|
|
155
|
-
modelId
|
|
156
|
-
});
|
|
157
|
-
const { metadata: promptMetadata } = await callback.getChainMetadata({
|
|
158
|
-
conversationId,
|
|
159
|
-
userId: userEntityRef,
|
|
160
|
-
modelId
|
|
161
|
-
});
|
|
162
|
-
const traceId = uuid.v4();
|
|
163
|
-
const promptStream = await agent.stream(
|
|
164
|
-
{
|
|
165
|
-
messages: [...recentConversationMessages, ...messages]
|
|
166
|
-
},
|
|
167
|
-
{
|
|
168
|
-
streamMode: ["values"],
|
|
169
|
-
runName: "ai-assistant-chat",
|
|
170
|
-
runId: traceId,
|
|
171
|
-
metadata: promptMetadata,
|
|
172
|
-
callbacks
|
|
173
|
-
}
|
|
174
|
-
);
|
|
175
52
|
const responseMessages = [];
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
signals.publish({
|
|
220
|
-
channel: `ai-assistant.chat.conversation-stream:${conversationId}`,
|
|
221
|
-
message: { messages: [m] },
|
|
222
|
-
recipients: {
|
|
223
|
-
type: "user",
|
|
224
|
-
entityRef: userEntityRef
|
|
53
|
+
const conversationMessages = [...recentConversationMessages, ...messages];
|
|
54
|
+
agent.stream({
|
|
55
|
+
credentials,
|
|
56
|
+
messages: conversationMessages,
|
|
57
|
+
tools: enabledTools,
|
|
58
|
+
modelId,
|
|
59
|
+
metadata: {
|
|
60
|
+
conversationId,
|
|
61
|
+
userId: userEntityRef,
|
|
62
|
+
runName: "ai-assistant-chat",
|
|
63
|
+
runId: traceId
|
|
64
|
+
},
|
|
65
|
+
context: context[0].text,
|
|
66
|
+
onStreamChunk: async (chunkMessages) => {
|
|
67
|
+
const newMessages = chunkMessages.filter(
|
|
68
|
+
(m) => conversationMessages.findIndex((cm) => cm.id === m.id) === -1
|
|
69
|
+
);
|
|
70
|
+
if (newMessages.length !== 0) {
|
|
71
|
+
conversation.addMessages(
|
|
72
|
+
newMessages,
|
|
73
|
+
userEntityRef,
|
|
74
|
+
conversationId,
|
|
75
|
+
conversationMessages
|
|
76
|
+
);
|
|
77
|
+
conversationMessages.push(...newMessages);
|
|
78
|
+
responseMessages.push(...newMessages);
|
|
79
|
+
for await (const m of newMessages) {
|
|
80
|
+
const words = m.content.split(" ");
|
|
81
|
+
const chunkSize = 5;
|
|
82
|
+
let messageBuilder = "";
|
|
83
|
+
for (let i = 0; i < words.length; i += chunkSize) {
|
|
84
|
+
const wordChunk = words.slice(i, i + chunkSize).join(" ");
|
|
85
|
+
messageBuilder = messageBuilder.concat(wordChunk).concat(" ");
|
|
86
|
+
m.content = messageBuilder;
|
|
87
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
88
|
+
signals.publish({
|
|
89
|
+
channel: `ai-assistant.chat.conversation-stream:${conversationId}`,
|
|
90
|
+
message: { messages: [m] },
|
|
91
|
+
recipients: {
|
|
92
|
+
type: "user",
|
|
93
|
+
entityRef: userEntityRef
|
|
94
|
+
}
|
|
95
|
+
});
|
|
225
96
|
}
|
|
226
|
-
}
|
|
97
|
+
}
|
|
227
98
|
}
|
|
228
99
|
}
|
|
229
|
-
|
|
230
|
-
}
|
|
231
|
-
addMessages(responseMessages, userEntityRef, conversationId, [
|
|
232
|
-
...recentConversationMessages,
|
|
233
|
-
...messages
|
|
234
|
-
]);
|
|
100
|
+
});
|
|
235
101
|
return responseMessages;
|
|
236
102
|
};
|
|
237
|
-
|
|
238
|
-
return stream ? [] : result;
|
|
239
|
-
};
|
|
240
|
-
const getAvailableModels = async () => {
|
|
241
|
-
return models.map((x) => x.id);
|
|
242
|
-
};
|
|
243
|
-
const getConversation = async (options) => {
|
|
244
|
-
const { conversationId, userEntityRef } = options;
|
|
245
|
-
const conversation = await chatStore$1.getChatMessages(
|
|
246
|
-
conversationId,
|
|
247
|
-
userEntityRef
|
|
248
|
-
);
|
|
249
|
-
return conversation;
|
|
250
|
-
};
|
|
251
|
-
const getConversations = async ({
|
|
252
|
-
userEntityRef
|
|
253
|
-
}) => {
|
|
254
|
-
const conversations = await chatStore$1.getConversations(userEntityRef);
|
|
255
|
-
return conversations;
|
|
256
|
-
};
|
|
257
|
-
const scoreMessage = async (messageId, score) => {
|
|
258
|
-
const message = await chatStore$1.getMessageById(messageId);
|
|
259
|
-
if (!message) {
|
|
260
|
-
throw new Error(`Message with id ${messageId} not found`);
|
|
261
|
-
}
|
|
262
|
-
const updatedMessage = {
|
|
263
|
-
...message,
|
|
264
|
-
score
|
|
265
|
-
};
|
|
266
|
-
chatStore$1.updateMessage(updatedMessage);
|
|
267
|
-
callback.handleScoreCallbacks({
|
|
268
|
-
name: "helpfulness",
|
|
269
|
-
message: updatedMessage
|
|
270
|
-
});
|
|
271
|
-
};
|
|
272
|
-
const getAvailableTools = async ({
|
|
273
|
-
credentials
|
|
274
|
-
}) => {
|
|
275
|
-
const mcpTools = await mcp.getTools(credentials);
|
|
276
|
-
const availableTools = tools$1.concat(mcpTools).map((tool) => ({
|
|
277
|
-
name: tool.name,
|
|
278
|
-
provider: tool.provider,
|
|
279
|
-
description: tool.description
|
|
280
|
-
}));
|
|
281
|
-
return availableTools;
|
|
103
|
+
return stream ? await streamFn() : [];
|
|
282
104
|
};
|
|
283
105
|
return {
|
|
284
|
-
prompt
|
|
285
|
-
getAvailableModels,
|
|
286
|
-
getConversation,
|
|
287
|
-
getConversations,
|
|
288
|
-
addMessages,
|
|
289
|
-
scoreMessage,
|
|
290
|
-
getAvailableTools
|
|
106
|
+
prompt
|
|
291
107
|
};
|
|
292
108
|
};
|
|
109
|
+
const chatServiceRef = backendPluginApi.createServiceRef({
|
|
110
|
+
id: "ai-assistant.chat-service",
|
|
111
|
+
defaultFactory: async (service) => backendPluginApi.createServiceFactory({
|
|
112
|
+
service,
|
|
113
|
+
deps: {
|
|
114
|
+
cache: backendPluginApi.coreServices.cache,
|
|
115
|
+
auth: backendPluginApi.coreServices.auth,
|
|
116
|
+
userInfo: backendPluginApi.coreServices.userInfo,
|
|
117
|
+
signals: pluginSignalsNode.signalsServiceRef,
|
|
118
|
+
catalog: pluginCatalogNode.catalogServiceRef,
|
|
119
|
+
conversation: conversation.conversationServiceRef,
|
|
120
|
+
agent: index.agentServiceRef
|
|
121
|
+
},
|
|
122
|
+
factory: async (options) => {
|
|
123
|
+
return createChatService(options);
|
|
124
|
+
}
|
|
125
|
+
})
|
|
126
|
+
});
|
|
293
127
|
|
|
128
|
+
exports.chatServiceRef = chatServiceRef;
|
|
294
129
|
exports.createChatService = createChatService;
|
|
295
130
|
//# sourceMappingURL=chat.cjs.js.map
|