@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.
Files changed (48) hide show
  1. package/dist/constants/prompts.cjs.js +1 -0
  2. package/dist/constants/prompts.cjs.js.map +1 -1
  3. package/dist/database/pg-vector-store.cjs.js +100 -38
  4. package/dist/database/pg-vector-store.cjs.js.map +1 -1
  5. package/dist/plugin.cjs.js +25 -41
  6. package/dist/plugin.cjs.js.map +1 -1
  7. package/dist/services/agent/helpers/message-parser.cjs.js +31 -0
  8. package/dist/services/agent/helpers/message-parser.cjs.js.map +1 -0
  9. package/dist/services/agent/helpers/tool-filter.cjs.js +13 -0
  10. package/dist/services/agent/helpers/tool-filter.cjs.js.map +1 -0
  11. package/dist/services/agent/index.cjs.js +140 -0
  12. package/dist/services/agent/index.cjs.js.map +1 -0
  13. package/dist/services/callbacks.cjs.js +23 -9
  14. package/dist/services/callbacks.cjs.js.map +1 -1
  15. package/dist/services/chat.cjs.js +88 -253
  16. package/dist/services/chat.cjs.js.map +1 -1
  17. package/dist/services/conversation.cjs.js +133 -0
  18. package/dist/services/conversation.cjs.js.map +1 -0
  19. package/dist/services/ingestor.cjs.js +5 -11
  20. package/dist/services/ingestor.cjs.js.map +1 -1
  21. package/dist/services/mcp/index.cjs.js +37 -24
  22. package/dist/services/mcp/index.cjs.js.map +1 -1
  23. package/dist/services/model.cjs.js +45 -0
  24. package/dist/services/model.cjs.js.map +1 -0
  25. package/dist/services/router/agent.cjs.js +68 -0
  26. package/dist/services/router/agent.cjs.js.map +1 -0
  27. package/dist/services/router/chat.cjs.js +8 -13
  28. package/dist/services/router/chat.cjs.js.map +1 -1
  29. package/dist/services/router/index.cjs.js +4 -0
  30. package/dist/services/router/index.cjs.js.map +1 -1
  31. package/dist/services/router/models.cjs.js +2 -2
  32. package/dist/services/router/models.cjs.js.map +1 -1
  33. package/dist/services/router/settings/index.cjs.js +0 -3
  34. package/dist/services/router/settings/index.cjs.js.map +1 -1
  35. package/dist/services/router/summary.cjs.js +5 -3
  36. package/dist/services/router/summary.cjs.js.map +1 -1
  37. package/dist/services/router/tools.cjs.js +21 -0
  38. package/dist/services/router/tools.cjs.js.map +1 -0
  39. package/dist/services/summarizer.cjs.js +47 -28
  40. package/dist/services/summarizer.cjs.js.map +1 -1
  41. package/dist/services/tools.cjs.js +65 -0
  42. package/dist/services/tools.cjs.js.map +1 -0
  43. package/dist/services/user-settings.cjs.js +15 -0
  44. package/dist/services/user-settings.cjs.js.map +1 -1
  45. package/dist/tools/searchKnowledge.cjs.js +1 -6
  46. package/dist/tools/searchKnowledge.cjs.js.map +1 -1
  47. package/migrations/20260108_data_ingestion_refactor.js +27 -0
  48. 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
- const createCallbackService = async ({
4
- callbacks
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.createCallbackService = createCallbackService;
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};\n\nexport type CreateCallbackServiceOptions = {\n callbacks: CallbackProvider[];\n};\n\nexport const createCallbackService = async ({\n callbacks,\n}: CreateCallbackServiceOptions): Promise<CallbackService> => {\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'] = async ({\n name,\n message,\n }) => {\n callbacks.forEach(async ({ scoreCallback }) => {\n if (!scoreCallback) {\n return;\n }\n\n scoreCallback({ name, message });\n });\n };\n\n return {\n getChainCallbacks,\n getChainMetadata,\n handleScoreCallbacks,\n };\n};\n"],"names":[],"mappings":";;AAuBO,MAAM,wBAAwB,OAAO;AAAA,EAC1C;AACF,CAAA,KAA8D;AAC5D,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,uBAAgE,OAAO;AAAA,IAC3E,IAAA;AAAA,IACA;AAAA,GACF,KAAM;AACJ,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;AAEA,EAAA,OAAO;AAAA,IACL,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
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 chatStore = require('../database/chat-store.cjs.js');
4
- var prompts = require('../constants/prompts.cjs.js');
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
- callback,
24
- summarizer
18
+ conversation,
19
+ agent
25
20
  }) => {
26
- logger.info(`Available models: ${models.map((m) => m.id).join(", ")}`);
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
- userCredentials,
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 recentConversationMessages = await chatStore$1.getChatMessages(
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 credentials = await auth.getOwnServiceCredentials();
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 systemPrompt = await systemPromptTemplate.formatMessages({
141
- basePrompt: combinedBasePrompt,
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
- for await (const [, chunk] of promptStream) {
177
- const { messages: promptMessages } = chunk;
178
- const newMessages = promptMessages.filter(
179
- (m) => responseMessages.findIndex(
180
- (rm) => m.id === rm.metadata.langGraphId
181
- ) === -1
182
- ).filter(
183
- (m) => recentConversationMessages.findIndex((rm) => rm.id === m.id) === -1
184
- ).filter((m) => m.getType() !== "human").map((m) => {
185
- const id = uuid.v4();
186
- const role = m.getType();
187
- const content = typeof m.content === "string" ? m.content : JSON.stringify(m.content);
188
- const metadata = {
189
- langGraphId: m.id ?? ""
190
- };
191
- if (role === "ai") {
192
- const aiMessage = m;
193
- metadata.toolCalls = aiMessage.tool_calls || [];
194
- metadata.finishReason = aiMessage.response_metadata.finish_reason || void 0;
195
- metadata.modelName = aiMessage.response_metadata.model_name || void 0;
196
- }
197
- if (role === "tool") {
198
- const toolMessage = m;
199
- metadata.name = toolMessage.name || "";
200
- }
201
- return {
202
- id,
203
- role,
204
- content,
205
- metadata,
206
- score: 0,
207
- traceId
208
- };
209
- });
210
- for await (const m of newMessages) {
211
- const words = m.content.split(" ");
212
- const chunkSize = 5;
213
- let messageBuilder = "";
214
- for (let i = 0; i < words.length; i += chunkSize) {
215
- const wordChunk = words.slice(i, i + chunkSize).join(" ");
216
- messageBuilder = messageBuilder.concat(wordChunk).concat(" ");
217
- m.content = messageBuilder;
218
- await new Promise((resolve) => setTimeout(resolve, 50));
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
- responseMessages.push(...newMessages);
230
- }
231
- addMessages(responseMessages, userEntityRef, conversationId, [
232
- ...recentConversationMessages,
233
- ...messages
234
- ]);
100
+ });
235
101
  return responseMessages;
236
102
  };
237
- const result = streamFn();
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