@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
|
@@ -11,12 +11,12 @@ var Router__default = /*#__PURE__*/_interopDefaultCompat(Router);
|
|
|
11
11
|
var z__default = /*#__PURE__*/_interopDefaultCompat(z);
|
|
12
12
|
|
|
13
13
|
async function createChatRouter(options) {
|
|
14
|
-
const { chat, httpAuth, userInfo } = options;
|
|
14
|
+
const { chat, httpAuth, userInfo, conversation } = options;
|
|
15
15
|
const router = Router__default.default();
|
|
16
16
|
const messageSchema = z__default.default.object({
|
|
17
17
|
messages: z__default.default.array(
|
|
18
18
|
z__default.default.object({
|
|
19
|
-
id: z__default.default.
|
|
19
|
+
id: z__default.default.uuid().optional().default(uuid.v4),
|
|
20
20
|
role: z__default.default.string(),
|
|
21
21
|
content: z__default.default.string()
|
|
22
22
|
})
|
|
@@ -36,13 +36,13 @@ async function createChatRouter(options) {
|
|
|
36
36
|
validation.validation(messageSchema, "body"),
|
|
37
37
|
async (req, res) => {
|
|
38
38
|
const { messages, conversationId, modelId, stream, tools } = req.body;
|
|
39
|
-
const
|
|
39
|
+
const credentials = await httpAuth.credentials(req);
|
|
40
40
|
const responseMessages = await chat.prompt({
|
|
41
41
|
modelId,
|
|
42
42
|
messages,
|
|
43
43
|
conversationId,
|
|
44
44
|
stream,
|
|
45
|
-
|
|
45
|
+
credentials,
|
|
46
46
|
tools
|
|
47
47
|
});
|
|
48
48
|
res.json({
|
|
@@ -57,25 +57,20 @@ async function createChatRouter(options) {
|
|
|
57
57
|
router.get("/conversations", async (req, res) => {
|
|
58
58
|
const credentials = await httpAuth.credentials(req);
|
|
59
59
|
const { userEntityRef } = await userInfo.getUserInfo(credentials);
|
|
60
|
-
const conversations = await
|
|
60
|
+
const conversations = await conversation.getConversations({
|
|
61
61
|
userEntityRef
|
|
62
62
|
});
|
|
63
63
|
res.json({ conversations });
|
|
64
64
|
});
|
|
65
|
-
router.get("/tools", async (req, res) => {
|
|
66
|
-
const credentials = await httpAuth.credentials(req);
|
|
67
|
-
const tools = await chat.getAvailableTools({ credentials });
|
|
68
|
-
res.json({ tools });
|
|
69
|
-
});
|
|
70
65
|
router.get("/:id", validation.validation(chatSchema, "params"), async (req, res) => {
|
|
71
66
|
const { id } = req.params;
|
|
72
67
|
const credentials = await httpAuth.credentials(req);
|
|
73
68
|
const { userEntityRef } = await userInfo.getUserInfo(credentials);
|
|
74
|
-
const
|
|
69
|
+
const conversationMessages = await conversation.getConversation({
|
|
75
70
|
conversationId: id,
|
|
76
71
|
userEntityRef
|
|
77
72
|
});
|
|
78
|
-
res.json({ conversation });
|
|
73
|
+
res.json({ conversation: conversationMessages });
|
|
79
74
|
});
|
|
80
75
|
router.post(
|
|
81
76
|
"/message/:messageId/score",
|
|
@@ -94,7 +89,7 @@ async function createChatRouter(options) {
|
|
|
94
89
|
async (req, res) => {
|
|
95
90
|
const { messageId } = req.params;
|
|
96
91
|
const { score } = req.body;
|
|
97
|
-
await
|
|
92
|
+
await conversation.scoreMessage(messageId, score);
|
|
98
93
|
res.status(204).end();
|
|
99
94
|
}
|
|
100
95
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.cjs.js","sources":["../../../src/services/router/chat.ts"],"sourcesContent":["import express from 'express';\nimport Router from 'express-promise-router';\nimport { ChatService } from '../chat';\nimport z from 'zod';\nimport { validation } from './middleware/validation';\nimport { v4 as uuid } from 'uuid';\nimport {\n
|
|
1
|
+
{"version":3,"file":"chat.cjs.js","sources":["../../../src/services/router/chat.ts"],"sourcesContent":["import express from 'express';\nimport Router from 'express-promise-router';\nimport { ChatService } from '../chat';\nimport z from 'zod';\nimport { validation } from './middleware/validation';\nimport { v4 as uuid } from 'uuid';\nimport {\n HttpAuthService,\n UserInfoService,\n} from '@backstage/backend-plugin-api';\nimport { ConversationService } from '../conversation';\n\nexport type ChatRouterOptions = {\n chat: ChatService;\n httpAuth: HttpAuthService;\n userInfo: UserInfoService;\n conversation: ConversationService;\n};\n\nexport async function createChatRouter(\n options: ChatRouterOptions,\n): Promise<express.Router> {\n const { chat, httpAuth, userInfo, conversation } = options;\n\n const router = Router();\n\n const messageSchema = z.object({\n messages: z.array(\n z.object({\n id: z.uuid().optional().default(uuid),\n role: z.string(),\n content: z.string(),\n }),\n ),\n modelId: z.string(),\n conversationId: z.uuid().optional().default(uuid),\n stream: z.boolean().optional(),\n tools: z\n .array(\n z.object({\n name: z.string(),\n provider: z.string(),\n }),\n )\n .optional(),\n });\n\n router.post(\n '/message',\n validation(messageSchema, 'body'),\n async (req, res) => {\n const { messages, conversationId, modelId, stream, tools } = req.body;\n\n const credentials = await httpAuth.credentials(req);\n\n const responseMessages = await chat.prompt({\n modelId,\n messages,\n conversationId,\n stream,\n credentials,\n tools,\n });\n\n res.json({\n messages: responseMessages,\n conversationId,\n });\n },\n );\n\n const chatSchema = z.object({\n id: z.uuid(),\n });\n\n router.get('/conversations', async (req, res) => {\n const credentials = await httpAuth.credentials(req);\n const { userEntityRef } = await userInfo.getUserInfo(credentials);\n\n const conversations = await conversation.getConversations({\n userEntityRef,\n });\n\n res.json({ conversations });\n });\n\n router.get('/:id', validation(chatSchema, 'params'), async (req, res) => {\n const { id } = req.params;\n\n const credentials = await httpAuth.credentials(req);\n const { userEntityRef } = await userInfo.getUserInfo(credentials);\n\n const conversationMessages = await conversation.getConversation({\n conversationId: id,\n userEntityRef,\n });\n\n res.json({ conversation: conversationMessages });\n });\n\n router.post(\n '/message/:messageId/score',\n validation(\n z.object({\n messageId: z.string().uuid(),\n }),\n 'params',\n ),\n validation(\n z.object({\n score: z.number(),\n }),\n 'body',\n ),\n async (req, res) => {\n const { messageId } = req.params;\n const { score } = req.body;\n\n await conversation.scoreMessage(messageId, score);\n\n res.status(204).end();\n },\n );\n\n return router;\n}\n"],"names":["Router","z","uuid","validation"],"mappings":";;;;;;;;;;;;AAmBA,eAAsB,iBACpB,OAAA,EACyB;AACzB,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,cAAa,GAAI,OAAA;AAEnD,EAAA,MAAM,SAASA,uBAAA,EAAO;AAEtB,EAAA,MAAM,aAAA,GAAgBC,mBAAE,MAAA,CAAO;AAAA,IAC7B,UAAUA,kBAAA,CAAE,KAAA;AAAA,MACVA,mBAAE,MAAA,CAAO;AAAA,QACP,IAAIA,kBAAA,CAAE,IAAA,GAAO,QAAA,EAAS,CAAE,QAAQC,OAAI,CAAA;AAAA,QACpC,IAAA,EAAMD,mBAAE,MAAA,EAAO;AAAA,QACf,OAAA,EAASA,mBAAE,MAAA;AAAO,OACnB;AAAA,KACH;AAAA,IACA,OAAA,EAASA,mBAAE,MAAA,EAAO;AAAA,IAClB,gBAAgBA,kBAAA,CAAE,IAAA,GAAO,QAAA,EAAS,CAAE,QAAQC,OAAI,CAAA;AAAA,IAChD,MAAA,EAAQD,kBAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,IAC7B,OAAOA,kBAAA,CACJ,KAAA;AAAA,MACCA,mBAAE,MAAA,CAAO;AAAA,QACP,IAAA,EAAMA,mBAAE,MAAA,EAAO;AAAA,QACf,QAAA,EAAUA,mBAAE,MAAA;AAAO,OACpB;AAAA,MAEF,QAAA;AAAS,GACb,CAAA;AAED,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,UAAA;AAAA,IACAE,qBAAA,CAAW,eAAe,MAAM,CAAA;AAAA,IAChC,OAAO,KAAK,GAAA,KAAQ;AAClB,MAAA,MAAM,EAAE,QAAA,EAAU,cAAA,EAAgB,SAAS,MAAA,EAAQ,KAAA,KAAU,GAAA,CAAI,IAAA;AAEjE,MAAA,MAAM,WAAA,GAAc,MAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AAElD,MAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,MAAA,CAAO;AAAA,QACzC,OAAA;AAAA,QACA,QAAA;AAAA,QACA,cAAA;AAAA,QACA,MAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,QAAA,EAAU,gBAAA;AAAA,QACV;AAAA,OACD,CAAA;AAAA,IACH;AAAA,GACF;AAEA,EAAA,MAAM,UAAA,GAAaF,mBAAE,MAAA,CAAO;AAAA,IAC1B,EAAA,EAAIA,mBAAE,IAAA;AAAK,GACZ,CAAA;AAED,EAAA,MAAA,CAAO,GAAA,CAAI,gBAAA,EAAkB,OAAO,GAAA,EAAK,GAAA,KAAQ;AAC/C,IAAA,MAAM,WAAA,GAAc,MAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AAClD,IAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,QAAA,CAAS,YAAY,WAAW,CAAA;AAEhE,IAAA,MAAM,aAAA,GAAgB,MAAM,YAAA,CAAa,gBAAA,CAAiB;AAAA,MACxD;AAAA,KACD,CAAA;AAED,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,aAAA,EAAe,CAAA;AAAA,EAC5B,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,GAAA,CAAI,QAAQE,qBAAA,CAAW,UAAA,EAAY,QAAQ,CAAA,EAAG,OAAO,KAAK,GAAA,KAAQ;AACvE,IAAA,MAAM,EAAE,EAAA,EAAG,GAAI,GAAA,CAAI,MAAA;AAEnB,IAAA,MAAM,WAAA,GAAc,MAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AAClD,IAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,QAAA,CAAS,YAAY,WAAW,CAAA;AAEhE,IAAA,MAAM,oBAAA,GAAuB,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,MAC9D,cAAA,EAAgB,EAAA;AAAA,MAChB;AAAA,KACD,CAAA;AAED,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,YAAA,EAAc,oBAAA,EAAsB,CAAA;AAAA,EACjD,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,2BAAA;AAAA,IACAA,qBAAA;AAAA,MACEF,mBAAE,MAAA,CAAO;AAAA,QACP,SAAA,EAAWA,kBAAA,CAAE,MAAA,EAAO,CAAE,IAAA;AAAK,OAC5B,CAAA;AAAA,MACD;AAAA,KACF;AAAA,IACAE,qBAAA;AAAA,MACEF,mBAAE,MAAA,CAAO;AAAA,QACP,KAAA,EAAOA,mBAAE,MAAA;AAAO,OACjB,CAAA;AAAA,MACD;AAAA,KACF;AAAA,IACA,OAAO,KAAK,GAAA,KAAQ;AAClB,MAAA,MAAM,EAAE,SAAA,EAAU,GAAI,GAAA,CAAI,MAAA;AAC1B,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,GAAA,CAAI,IAAA;AAEtB,MAAA,MAAM,YAAA,CAAa,YAAA,CAAa,SAAA,EAAW,KAAK,CAAA;AAEhD,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,GAAA,EAAI;AAAA,IACtB;AAAA,GACF;AAEA,EAAA,OAAO,MAAA;AACT;;;;"}
|
|
@@ -7,6 +7,8 @@ var models = require('./models.cjs.js');
|
|
|
7
7
|
var rootHttpRouter = require('@backstage/backend-defaults/rootHttpRouter');
|
|
8
8
|
var summary = require('./summary.cjs.js');
|
|
9
9
|
var index = require('./settings/index.cjs.js');
|
|
10
|
+
var agent = require('./agent.cjs.js');
|
|
11
|
+
var tools = require('./tools.cjs.js');
|
|
10
12
|
|
|
11
13
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
12
14
|
|
|
@@ -20,6 +22,8 @@ async function createRouter(options) {
|
|
|
20
22
|
router.use("/models", await models.createModelRouter(options));
|
|
21
23
|
router.use("/summary", await summary.createSummaryRouter(options));
|
|
22
24
|
router.use("/settings", await index.createSettingsRouter(options));
|
|
25
|
+
router.use("/agent", await agent.createAgentRouter(options));
|
|
26
|
+
router.use("/tools", await tools.createToolRouter(options));
|
|
23
27
|
const middleware = rootHttpRouter.MiddlewareFactory.create(options);
|
|
24
28
|
router.use(middleware.error());
|
|
25
29
|
return router;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../../../src/services/router/index.ts"],"sourcesContent":["import express from 'express';\nimport Router from 'express-promise-router';\nimport { createChatRouter, ChatRouterOptions } from './chat';\nimport { createModelRouter, ModelRouterOptions } from './models';\nimport {\n LoggerService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\nimport { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport { SummaryRouterOptions, createSummaryRouter } from './summary';\nimport { createSettingsRouter, SettingsRouterOptions } from './settings';\n\nexport type RouterOptions = ChatRouterOptions &\n SummaryRouterOptions &\n ModelRouterOptions &\n SettingsRouterOptions & {\n config: RootConfigService;\n logger: LoggerService;\n };\n\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const router = Router();\n router.use(express.json());\n\n router.use('/chat', await createChatRouter(options));\n router.use('/models', await createModelRouter(options));\n router.use('/summary', await createSummaryRouter(options));\n router.use('/settings', await createSettingsRouter(options));\n\n const middleware = MiddlewareFactory.create(options);\n\n router.use(middleware.error());\n\n return router;\n}\n"],"names":["Router","express","createChatRouter","createModelRouter","createSummaryRouter","createSettingsRouter","MiddlewareFactory"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../src/services/router/index.ts"],"sourcesContent":["import express from 'express';\nimport Router from 'express-promise-router';\nimport { createChatRouter, ChatRouterOptions } from './chat';\nimport { createModelRouter, ModelRouterOptions } from './models';\nimport {\n LoggerService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\nimport { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport { SummaryRouterOptions, createSummaryRouter } from './summary';\nimport { createSettingsRouter, SettingsRouterOptions } from './settings';\nimport { createAgentRouter, AgentRouterOptions } from './agent';\nimport { createToolRouter, ToolRouterOptions } from './tools';\n\nexport type RouterOptions = ChatRouterOptions &\n SummaryRouterOptions &\n ModelRouterOptions &\n SettingsRouterOptions &\n AgentRouterOptions &\n ToolRouterOptions & {\n config: RootConfigService;\n logger: LoggerService;\n };\n\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const router = Router();\n router.use(express.json());\n\n router.use('/chat', await createChatRouter(options));\n router.use('/models', await createModelRouter(options));\n router.use('/summary', await createSummaryRouter(options));\n router.use('/settings', await createSettingsRouter(options));\n router.use('/agent', await createAgentRouter(options));\n router.use('/tools', await createToolRouter(options));\n\n const middleware = MiddlewareFactory.create(options);\n\n router.use(middleware.error());\n\n return router;\n}\n"],"names":["Router","express","createChatRouter","createModelRouter","createSummaryRouter","createSettingsRouter","createAgentRouter","createToolRouter","MiddlewareFactory"],"mappings":";;;;;;;;;;;;;;;;;AAwBA,eAAsB,aACpB,OAAA,EACyB;AACzB,EAAA,MAAM,SAASA,uBAAA,EAAO;AACtB,EAAA,MAAA,CAAO,GAAA,CAAIC,wBAAA,CAAQ,IAAA,EAAM,CAAA;AAEzB,EAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,MAAMC,qBAAA,CAAiB,OAAO,CAAC,CAAA;AACnD,EAAA,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,MAAMC,wBAAA,CAAkB,OAAO,CAAC,CAAA;AACtD,EAAA,MAAA,CAAO,GAAA,CAAI,UAAA,EAAY,MAAMC,2BAAA,CAAoB,OAAO,CAAC,CAAA;AACzD,EAAA,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,MAAMC,0BAAA,CAAqB,OAAO,CAAC,CAAA;AAC3D,EAAA,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,MAAMC,uBAAA,CAAkB,OAAO,CAAC,CAAA;AACrD,EAAA,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,MAAMC,sBAAA,CAAiB,OAAO,CAAC,CAAA;AAEpD,EAAA,MAAM,UAAA,GAAaC,gCAAA,CAAkB,MAAA,CAAO,OAAO,CAAA;AAEnD,EAAA,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,KAAA,EAAO,CAAA;AAE7B,EAAA,OAAO,MAAA;AACT;;;;"}
|
|
@@ -7,10 +7,10 @@ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'defau
|
|
|
7
7
|
var Router__default = /*#__PURE__*/_interopDefaultCompat(Router);
|
|
8
8
|
|
|
9
9
|
async function createModelRouter(options) {
|
|
10
|
-
const {
|
|
10
|
+
const { model } = options;
|
|
11
11
|
const router = Router__default.default();
|
|
12
12
|
router.get("/", async (_req, res) => {
|
|
13
|
-
const models = await
|
|
13
|
+
const models = await model.getAvailableModels();
|
|
14
14
|
res.json({ models });
|
|
15
15
|
});
|
|
16
16
|
return router;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.cjs.js","sources":["../../../src/services/router/models.ts"],"sourcesContent":["import express from 'express';\nimport Router from 'express-promise-router';\nimport {
|
|
1
|
+
{"version":3,"file":"models.cjs.js","sources":["../../../src/services/router/models.ts"],"sourcesContent":["import express from 'express';\nimport Router from 'express-promise-router';\nimport { ModelService } from '../model';\n\nexport type ModelRouterOptions = {\n model: ModelService;\n};\n\nexport async function createModelRouter(\n options: ModelRouterOptions,\n): Promise<express.Router> {\n const { model } = options;\n const router = Router();\n\n router.get('/', async (_req, res) => {\n const models = await model.getAvailableModels();\n res.json({ models });\n });\n\n return router;\n}\n"],"names":["Router"],"mappings":";;;;;;;;AAQA,eAAsB,kBACpB,OAAA,EACyB;AACzB,EAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAClB,EAAA,MAAM,SAASA,uBAAA,EAAO;AAEtB,EAAA,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,OAAO,IAAA,EAAM,GAAA,KAAQ;AACnC,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,kBAAA,EAAmB;AAC9C,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA;AAAA,EACrB,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;;;;"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var express = require('express');
|
|
4
4
|
var Router = require('express-promise-router');
|
|
5
|
-
var rootHttpRouter = require('@backstage/backend-defaults/rootHttpRouter');
|
|
6
5
|
var mcp = require('./mcp.cjs.js');
|
|
7
6
|
var z = require('zod');
|
|
8
7
|
var validation = require('../middleware/validation.cjs.js');
|
|
@@ -42,8 +41,6 @@ async function createSettingsRouter(options) {
|
|
|
42
41
|
await userSettings.setSettingsForType(credentials, type, settings);
|
|
43
42
|
res.status(204).send();
|
|
44
43
|
});
|
|
45
|
-
const middleware = rootHttpRouter.MiddlewareFactory.create(options);
|
|
46
|
-
router.use(middleware.error());
|
|
47
44
|
return router;
|
|
48
45
|
}
|
|
49
46
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../../../../src/services/router/settings/index.ts"],"sourcesContent":["import express from 'express';\nimport Router from 'express-promise-router';\
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../../src/services/router/settings/index.ts"],"sourcesContent":["import express from 'express';\nimport Router from 'express-promise-router';\n\nimport { createMcpRouter, McpRouterOptions } from './mcp';\nimport { UserSettingsService } from '../../user-settings';\nimport z from 'zod';\nimport { validation } from '../middleware/validation';\n\nexport type SettingsRouterOptions = McpRouterOptions & {\n userSettings: UserSettingsService;\n};\n\nexport async function createSettingsRouter(\n options: SettingsRouterOptions,\n): Promise<express.Router> {\n const { userSettings, httpAuth } = options;\n const router = Router();\n router.use(express.json());\n\n router.use('/mcp', await createMcpRouter(options));\n\n const settingsSchema = z.object({\n type: z.string(),\n });\n\n router.get('/', validation(settingsSchema, 'query'), async (req, res) => {\n const credentials = await httpAuth.credentials(req);\n\n const { type } = req.query;\n\n const settings = await userSettings.getSettingsForType(\n credentials,\n type as string,\n );\n\n res.json({\n settings,\n });\n });\n\n const setSettingsSchema = z.object({\n type: z.string(),\n settings: z.any(),\n });\n\n router.patch('/', validation(setSettingsSchema, 'body'), async (req, res) => {\n const credentials = await httpAuth.credentials(req);\n const { type, settings } = req.body;\n\n await userSettings.setSettingsForType(credentials, type, settings);\n res.status(204).send();\n });\n\n return router;\n}\n"],"names":["Router","express","createMcpRouter","z","validation"],"mappings":";;;;;;;;;;;;;;AAYA,eAAsB,qBACpB,OAAA,EACyB;AACzB,EAAA,MAAM,EAAE,YAAA,EAAc,QAAA,EAAS,GAAI,OAAA;AACnC,EAAA,MAAM,SAASA,uBAAA,EAAO;AACtB,EAAA,MAAA,CAAO,GAAA,CAAIC,wBAAA,CAAQ,IAAA,EAAM,CAAA;AAEzB,EAAA,MAAA,CAAO,GAAA,CAAI,MAAA,EAAQ,MAAMC,mBAAA,CAAgB,OAAO,CAAC,CAAA;AAEjD,EAAA,MAAM,cAAA,GAAiBC,mBAAE,MAAA,CAAO;AAAA,IAC9B,IAAA,EAAMA,mBAAE,MAAA;AAAO,GAChB,CAAA;AAED,EAAA,MAAA,CAAO,GAAA,CAAI,KAAKC,qBAAA,CAAW,cAAA,EAAgB,OAAO,CAAA,EAAG,OAAO,KAAK,GAAA,KAAQ;AACvE,IAAA,MAAM,WAAA,GAAc,MAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AAElD,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,GAAA,CAAI,KAAA;AAErB,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,kBAAA;AAAA,MAClC,WAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACP;AAAA,KACD,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,MAAM,iBAAA,GAAoBD,mBAAE,MAAA,CAAO;AAAA,IACjC,IAAA,EAAMA,mBAAE,MAAA,EAAO;AAAA,IACf,QAAA,EAAUA,mBAAE,GAAA;AAAI,GACjB,CAAA;AAED,EAAA,MAAA,CAAO,KAAA,CAAM,KAAKC,qBAAA,CAAW,iBAAA,EAAmB,MAAM,CAAA,EAAG,OAAO,KAAK,GAAA,KAAQ;AAC3E,IAAA,MAAM,WAAA,GAAc,MAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AAClD,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAS,GAAI,GAAA,CAAI,IAAA;AAE/B,IAAA,MAAM,YAAA,CAAa,kBAAA,CAAmB,WAAA,EAAa,IAAA,EAAM,QAAQ,CAAA;AACjE,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,EAAK;AAAA,EACvB,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;;;;"}
|
|
@@ -14,16 +14,18 @@ async function createSummaryRouter(options) {
|
|
|
14
14
|
const router = Router__default.default();
|
|
15
15
|
const contentSchema = z__default.default.object({
|
|
16
16
|
content: z__default.default.string(),
|
|
17
|
-
length: z__default.default.string().optional()
|
|
17
|
+
length: z__default.default.string().optional(),
|
|
18
|
+
prompt: z__default.default.string().optional()
|
|
18
19
|
});
|
|
19
20
|
router.post(
|
|
20
21
|
"/content",
|
|
21
22
|
validation.validation(contentSchema, "body"),
|
|
22
23
|
async (req, res) => {
|
|
23
|
-
const { content, length } = req.body;
|
|
24
|
+
const { content, length, prompt } = req.body;
|
|
24
25
|
const summary = await summarizer.summarize({
|
|
25
26
|
content,
|
|
26
|
-
length
|
|
27
|
+
length,
|
|
28
|
+
prompt
|
|
27
29
|
});
|
|
28
30
|
res.json({ summary });
|
|
29
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary.cjs.js","sources":["../../../src/services/router/summary.ts"],"sourcesContent":["import express from 'express';\nimport Router from 'express-promise-router';\nimport { SummarizerService } from '../summarizer';\nimport { validation } from './middleware/validation';\nimport z from 'zod';\n\nexport type SummaryRouterOptions = {\n summarizer: SummarizerService;\n};\n\nexport async function createSummaryRouter(\n options: SummaryRouterOptions,\n): Promise<express.Router> {\n const { summarizer } = options;\n\n const router = Router();\n\n const contentSchema = z.object({\n content: z.string(),\n length: z.string().optional(),\n });\n\n router.post(\n '/content',\n validation(contentSchema, 'body'),\n async (req, res) => {\n const { content, length } = req.body;\n\n const summary = await summarizer.summarize({\n content,\n length,\n });\n res.json({ summary });\n },\n );\n\n const conversationSchema = z.object({\n messages: z.array(\n z.object({\n role: z.string(),\n content: z.string(),\n }),\n ),\n length: z.string().optional(),\n });\n\n router.post(\n '/conversation',\n validation(conversationSchema, 'body'),\n async (req, res) => {\n const { messages, length } = req.body;\n const summary = await summarizer.summarizeConversation({\n messages,\n length,\n });\n res.json({ summary });\n },\n );\n\n return router;\n}\n"],"names":["Router","z","validation"],"mappings":";;;;;;;;;;;AAUA,eAAsB,oBACpB,OAAA,EACyB;AACzB,EAAA,MAAM,EAAE,YAAW,GAAI,OAAA;AAEvB,EAAA,MAAM,SAASA,uBAAA,EAAO;AAEtB,EAAA,MAAM,aAAA,GAAgBC,mBAAE,MAAA,CAAO;AAAA,IAC7B,OAAA,EAASA,mBAAE,MAAA,EAAO;AAAA,IAClB,MAAA,EAAQA,kBAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC7B,CAAA;AAED,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,UAAA;AAAA,IACAC,qBAAA,CAAW,eAAe,MAAM,CAAA;AAAA,IAChC,OAAO,KAAK,GAAA,KAAQ;AAClB,MAAA,MAAM,EAAE,OAAA,EAAS,MAAA,
|
|
1
|
+
{"version":3,"file":"summary.cjs.js","sources":["../../../src/services/router/summary.ts"],"sourcesContent":["import express from 'express';\nimport Router from 'express-promise-router';\nimport { SummarizerService } from '../summarizer';\nimport { validation } from './middleware/validation';\nimport z from 'zod';\n\nexport type SummaryRouterOptions = {\n summarizer: SummarizerService;\n};\n\nexport async function createSummaryRouter(\n options: SummaryRouterOptions,\n): Promise<express.Router> {\n const { summarizer } = options;\n\n const router = Router();\n\n const contentSchema = z.object({\n content: z.string(),\n length: z.string().optional(),\n prompt: z.string().optional(),\n });\n\n router.post(\n '/content',\n validation(contentSchema, 'body'),\n async (req, res) => {\n const { content, length, prompt } = req.body;\n\n const summary = await summarizer.summarize({\n content,\n length,\n prompt,\n });\n res.json({ summary });\n },\n );\n\n const conversationSchema = z.object({\n messages: z.array(\n z.object({\n role: z.string(),\n content: z.string(),\n }),\n ),\n length: z.string().optional(),\n });\n\n router.post(\n '/conversation',\n validation(conversationSchema, 'body'),\n async (req, res) => {\n const { messages, length } = req.body;\n const summary = await summarizer.summarizeConversation({\n messages,\n length,\n });\n res.json({ summary });\n },\n );\n\n return router;\n}\n"],"names":["Router","z","validation"],"mappings":";;;;;;;;;;;AAUA,eAAsB,oBACpB,OAAA,EACyB;AACzB,EAAA,MAAM,EAAE,YAAW,GAAI,OAAA;AAEvB,EAAA,MAAM,SAASA,uBAAA,EAAO;AAEtB,EAAA,MAAM,aAAA,GAAgBC,mBAAE,MAAA,CAAO;AAAA,IAC7B,OAAA,EAASA,mBAAE,MAAA,EAAO;AAAA,IAClB,MAAA,EAAQA,kBAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC5B,MAAA,EAAQA,kBAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC7B,CAAA;AAED,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,UAAA;AAAA,IACAC,qBAAA,CAAW,eAAe,MAAM,CAAA;AAAA,IAChC,OAAO,KAAK,GAAA,KAAQ;AAClB,MAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,MAAA,KAAW,GAAA,CAAI,IAAA;AAExC,MAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,SAAA,CAAU;AAAA,QACzC,OAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,OAAA,EAAS,CAAA;AAAA,IACtB;AAAA,GACF;AAEA,EAAA,MAAM,kBAAA,GAAqBD,mBAAE,MAAA,CAAO;AAAA,IAClC,UAAUA,kBAAA,CAAE,KAAA;AAAA,MACVA,mBAAE,MAAA,CAAO;AAAA,QACP,IAAA,EAAMA,mBAAE,MAAA,EAAO;AAAA,QACf,OAAA,EAASA,mBAAE,MAAA;AAAO,OACnB;AAAA,KACH;AAAA,IACA,MAAA,EAAQA,kBAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC7B,CAAA;AAED,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,eAAA;AAAA,IACAC,qBAAA,CAAW,oBAAoB,MAAM,CAAA;AAAA,IACrC,OAAO,KAAK,GAAA,KAAQ;AAClB,MAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,GAAA,CAAI,IAAA;AACjC,MAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,qBAAA,CAAsB;AAAA,QACrD,QAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,OAAA,EAAS,CAAA;AAAA,IACtB;AAAA,GACF;AAEA,EAAA,OAAO,MAAA;AACT;;;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Router = require('express-promise-router');
|
|
4
|
+
|
|
5
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var Router__default = /*#__PURE__*/_interopDefaultCompat(Router);
|
|
8
|
+
|
|
9
|
+
async function createToolRouter(options) {
|
|
10
|
+
const { httpAuth, tool } = options;
|
|
11
|
+
const router = Router__default.default();
|
|
12
|
+
router.get("/", async (req, res) => {
|
|
13
|
+
const credentials = await httpAuth.credentials(req);
|
|
14
|
+
const tools = await tool.getAvailableUserTools({ credentials });
|
|
15
|
+
res.json({ tools });
|
|
16
|
+
});
|
|
17
|
+
return router;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
exports.createToolRouter = createToolRouter;
|
|
21
|
+
//# sourceMappingURL=tools.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.cjs.js","sources":["../../../src/services/router/tools.ts"],"sourcesContent":["import express from 'express';\nimport Router from 'express-promise-router';\nimport { HttpAuthService } from '@backstage/backend-plugin-api';\nimport { ToolsService } from '../tools';\n\nexport type ToolRouterOptions = {\n httpAuth: HttpAuthService;\n tool: ToolsService;\n};\n\nexport async function createToolRouter(\n options: ToolRouterOptions,\n): Promise<express.Router> {\n const { httpAuth, tool } = options;\n const router = Router();\n\n router.get('/', async (req, res) => {\n const credentials = await httpAuth.credentials(req);\n\n const tools = await tool.getAvailableUserTools({ credentials });\n\n res.json({ tools });\n });\n\n return router;\n}\n"],"names":["Router"],"mappings":";;;;;;;;AAUA,eAAsB,iBACpB,OAAA,EACyB;AACzB,EAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,OAAA;AAC3B,EAAA,MAAM,SAASA,uBAAA,EAAO;AAEtB,EAAA,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,OAAO,GAAA,EAAK,GAAA,KAAQ;AAClC,IAAA,MAAM,WAAA,GAAc,MAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AAElD,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,qBAAA,CAAsB,EAAE,aAAa,CAAA;AAE9D,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA;AAAA,EACpB,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;;;;"}
|
|
@@ -1,51 +1,56 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
4
|
+
var index = require('./agent/index.cjs.js');
|
|
3
5
|
var prompts = require('../constants/prompts.cjs.js');
|
|
4
6
|
var prompts$1 = require('@langchain/core/prompts');
|
|
7
|
+
var uuid = require('uuid');
|
|
5
8
|
|
|
6
9
|
const createSummarizerService = async ({
|
|
7
10
|
config,
|
|
8
|
-
|
|
9
|
-
|
|
11
|
+
agent,
|
|
12
|
+
auth
|
|
10
13
|
}) => {
|
|
11
|
-
const summaryModelId = config.getOptionalString(
|
|
14
|
+
const summaryModelId = config.getOptionalString(
|
|
15
|
+
"aiAssistant.conversation.summaryModel"
|
|
16
|
+
);
|
|
12
17
|
const conversationSummaryPrompt = config.getOptionalString("aiAssistant.conversation.summaryPrompt") ?? prompts.DEFAULT_CONVERSATION_SUMMARY_PROMPT;
|
|
13
|
-
const model = models.find((m) => m.id === summaryModelId);
|
|
14
|
-
if (!model) {
|
|
15
|
-
throw new Error(`Summary model with id ${summaryModelId} not found`);
|
|
16
|
-
}
|
|
17
|
-
const llm = model.chatModel;
|
|
18
18
|
const summaryPromptTemplate = prompts$1.PromptTemplate.fromTemplate(`
|
|
19
19
|
PURPOSE:
|
|
20
20
|
{summaryPrompt}
|
|
21
21
|
|
|
22
22
|
Summarize the following content in {length}.
|
|
23
|
-
|
|
24
|
-
Content:
|
|
25
|
-
{content}
|
|
26
23
|
`);
|
|
27
|
-
const summarize = async (
|
|
24
|
+
const summarize = async ({
|
|
25
|
+
content,
|
|
26
|
+
length = "as few words as possible",
|
|
27
|
+
prompt: summaryPrompt = prompts.DEFAULT_SUMMARY_PROMPT
|
|
28
|
+
}) => {
|
|
28
29
|
const prompt = await summaryPromptTemplate.format({
|
|
29
30
|
summaryPrompt,
|
|
30
31
|
content,
|
|
31
32
|
length
|
|
32
33
|
});
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
metadata
|
|
34
|
+
const credentials = await auth.getOwnServiceCredentials();
|
|
35
|
+
const messages = await agent.prompt({
|
|
36
|
+
messages: [{ role: "system", content, score: 0, metadata: {} }],
|
|
37
|
+
metadata: {
|
|
38
|
+
conversationId: "summarizer",
|
|
39
|
+
userId: "system:summarizer",
|
|
40
|
+
runId: uuid.v4(),
|
|
41
|
+
runName: "summarizer"
|
|
42
|
+
},
|
|
43
|
+
systemPrompt: prompt,
|
|
44
|
+
modelId: summaryModelId,
|
|
45
|
+
credentials,
|
|
46
|
+
tools: []
|
|
47
47
|
});
|
|
48
|
-
|
|
48
|
+
const aiMessages = messages.filter((m) => m.role === "ai");
|
|
49
|
+
if (aiMessages.length === 0) {
|
|
50
|
+
throw new Error("Failed to summarize content");
|
|
51
|
+
}
|
|
52
|
+
const response = messages.pop();
|
|
53
|
+
return response.content.trim();
|
|
49
54
|
};
|
|
50
55
|
const summarizeConversation = async ({ messages, length = "as few words as possible" }) => {
|
|
51
56
|
const conversationMessages = messages.filter(
|
|
@@ -60,6 +65,20 @@ const createSummarizerService = async ({
|
|
|
60
65
|
};
|
|
61
66
|
return { summarizeConversation, summarize };
|
|
62
67
|
};
|
|
68
|
+
const summarizerServiceRef = backendPluginApi.createServiceRef({
|
|
69
|
+
id: "ai-assistant.summarizer-service",
|
|
70
|
+
defaultFactory: async (service) => backendPluginApi.createServiceFactory({
|
|
71
|
+
service,
|
|
72
|
+
deps: {
|
|
73
|
+
config: backendPluginApi.coreServices.rootConfig,
|
|
74
|
+
agent: index.agentServiceRef,
|
|
75
|
+
auth: backendPluginApi.coreServices.auth
|
|
76
|
+
},
|
|
77
|
+
factory: async (options) => {
|
|
78
|
+
return createSummarizerService(options);
|
|
79
|
+
}
|
|
80
|
+
})
|
|
81
|
+
});
|
|
63
82
|
|
|
64
|
-
exports.
|
|
83
|
+
exports.summarizerServiceRef = summarizerServiceRef;
|
|
65
84
|
//# sourceMappingURL=summarizer.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarizer.cjs.js","sources":["../../src/services/summarizer.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"summarizer.cjs.js","sources":["../../src/services/summarizer.ts"],"sourcesContent":["import {\n coreServices,\n RootConfigService,\n AuthService,\n} from '@backstage/backend-plugin-api';\nimport { AgentService, agentServiceRef } from './agent';\n\nimport {\n DEFAULT_CONVERSATION_SUMMARY_PROMPT,\n DEFAULT_SUMMARY_PROMPT,\n} from '../constants/prompts';\nimport { PromptTemplate } from '@langchain/core/prompts';\nimport { Message } from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport {\n createServiceFactory,\n createServiceRef,\n ServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { v4 as uuid } from 'uuid';\n\nexport type SummarizerService = {\n summarizeConversation: (options: {\n messages: Message[];\n length?: string;\n }) => Promise<string>;\n\n summarize: (options: {\n content: string;\n prompt?: string;\n length?: string;\n }) => Promise<string>;\n};\n\nexport type SummarizerServiceOptions = {\n config: RootConfigService;\n agent: AgentService;\n auth: AuthService;\n};\n\nconst createSummarizerService = async ({\n config,\n agent,\n auth,\n}: SummarizerServiceOptions): Promise<SummarizerService> => {\n const summaryModelId = config.getOptionalString(\n 'aiAssistant.conversation.summaryModel',\n );\n\n const conversationSummaryPrompt =\n config.getOptionalString('aiAssistant.conversation.summaryPrompt') ??\n DEFAULT_CONVERSATION_SUMMARY_PROMPT;\n\n const summaryPromptTemplate = PromptTemplate.fromTemplate(`\n PURPOSE:\n {summaryPrompt}\n\n Summarize the following content in {length}.\n `);\n\n const summarize: SummarizerService['summarize'] = async ({\n content,\n length = 'as few words as possible',\n prompt: summaryPrompt = DEFAULT_SUMMARY_PROMPT,\n }) => {\n const prompt = await summaryPromptTemplate.format({\n summaryPrompt,\n content,\n length,\n });\n\n const credentials = await auth.getOwnServiceCredentials();\n\n const messages = await agent.prompt({\n messages: [{ role: 'system', content, score: 0, metadata: {} }],\n metadata: {\n conversationId: 'summarizer',\n userId: 'system:summarizer',\n runId: uuid(),\n runName: 'summarizer',\n },\n systemPrompt: prompt,\n modelId: summaryModelId,\n credentials,\n tools: [],\n });\n\n const aiMessages = messages.filter(m => m.role === 'ai');\n\n if (aiMessages.length === 0) {\n throw new Error('Failed to summarize content');\n }\n\n const response = messages.pop()!;\n\n return response.content.trim();\n };\n\n const summarizeConversation: SummarizerService['summarizeConversation'] =\n async ({ messages, length = 'as few words as possible' }) => {\n const conversationMessages = messages.filter(\n msg => msg.role === 'ai' || msg.role === 'human',\n );\n\n const conversation = conversationMessages\n .map(msg => `${msg.role}: ${msg.content}`)\n .join('\\n');\n\n return summarize({\n content: conversation,\n prompt: conversationSummaryPrompt,\n length,\n });\n };\n\n return { summarizeConversation, summarize };\n};\n\nexport const summarizerServiceRef: ServiceRef<\n SummarizerService,\n 'plugin',\n 'singleton'\n> = createServiceRef<SummarizerService>({\n id: 'ai-assistant.summarizer-service',\n defaultFactory: async service =>\n createServiceFactory({\n service,\n deps: {\n config: coreServices.rootConfig,\n agent: agentServiceRef,\n auth: coreServices.auth,\n },\n factory: async options => {\n return createSummarizerService(options);\n },\n }),\n});\n"],"names":["DEFAULT_CONVERSATION_SUMMARY_PROMPT","PromptTemplate","DEFAULT_SUMMARY_PROMPT","uuid","createServiceRef","createServiceFactory","coreServices","agentServiceRef"],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
4
|
+
var index = require('./mcp/index.cjs.js');
|
|
5
|
+
var tools = require('@langchain/core/tools');
|
|
6
|
+
|
|
7
|
+
const createToolsService = async ({
|
|
8
|
+
mcp,
|
|
9
|
+
auth
|
|
10
|
+
}) => {
|
|
11
|
+
const tools$1 = [];
|
|
12
|
+
const coreTools = [];
|
|
13
|
+
const registerTools = async (providers) => {
|
|
14
|
+
tools$1.push(...providers);
|
|
15
|
+
};
|
|
16
|
+
const registerCoreTools = async (providers) => {
|
|
17
|
+
coreTools.push(...providers.map((tool) => ({ ...tool, provider: "core" })));
|
|
18
|
+
};
|
|
19
|
+
const getAvailableUserTools = async ({
|
|
20
|
+
credentials
|
|
21
|
+
}) => {
|
|
22
|
+
const mcpTools = await mcp.getTools(credentials);
|
|
23
|
+
const availableTools = tools$1.concat(mcpTools).concat(coreTools).map((tool) => ({
|
|
24
|
+
name: tool.name,
|
|
25
|
+
provider: tool.provider,
|
|
26
|
+
description: tool.description
|
|
27
|
+
}));
|
|
28
|
+
return availableTools;
|
|
29
|
+
};
|
|
30
|
+
const getPrincipalTools = async ({
|
|
31
|
+
credentials,
|
|
32
|
+
filter = () => true
|
|
33
|
+
}) => {
|
|
34
|
+
const isUser = auth.isPrincipal(credentials, "user");
|
|
35
|
+
if (!isUser) {
|
|
36
|
+
return tools$1.filter(filter).map((t) => new tools.DynamicStructuredTool(t));
|
|
37
|
+
}
|
|
38
|
+
const mcpTools = await mcp.getTools(credentials);
|
|
39
|
+
const userTools = tools$1.concat(mcpTools);
|
|
40
|
+
const allTools = userTools.filter(filter).concat(coreTools.filter(filter));
|
|
41
|
+
return allTools.map((t) => new tools.DynamicStructuredTool(t));
|
|
42
|
+
};
|
|
43
|
+
return {
|
|
44
|
+
registerTools,
|
|
45
|
+
registerCoreTools,
|
|
46
|
+
getAvailableUserTools,
|
|
47
|
+
getPrincipalTools
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
const toolsServiceRef = backendPluginApi.createServiceRef({
|
|
51
|
+
id: "ai-assistant.tools-service",
|
|
52
|
+
defaultFactory: async (service) => backendPluginApi.createServiceFactory({
|
|
53
|
+
service,
|
|
54
|
+
deps: {
|
|
55
|
+
mcp: index.mcpServiceRef,
|
|
56
|
+
auth: backendPluginApi.coreServices.auth
|
|
57
|
+
},
|
|
58
|
+
factory: async (options) => {
|
|
59
|
+
return createToolsService(options);
|
|
60
|
+
}
|
|
61
|
+
})
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
exports.toolsServiceRef = toolsServiceRef;
|
|
65
|
+
//# sourceMappingURL=tools.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.cjs.js","sources":["../../src/services/tools.ts"],"sourcesContent":["import {\n BackstageCredentials,\n coreServices,\n createServiceFactory,\n createServiceRef,\n ServiceRef,\n AuthService,\n} from '@backstage/backend-plugin-api';\nimport {\n Tool,\n EnabledTool,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport { McpService, mcpServiceRef } from './mcp';\nimport { DynamicStructuredTool } from '@langchain/core/tools';\n\nexport type ToolsService = {\n registerTools: (tools: Tool[]) => void;\n registerCoreTools: (tools: Tool[]) => void;\n getAvailableUserTools: (options: {\n credentials: BackstageCredentials;\n }) => Promise<EnabledTool[]>;\n getPrincipalTools: (options: {\n credentials: BackstageCredentials;\n filter?: (tool: Tool) => boolean;\n }) => Promise<DynamicStructuredTool[]>;\n};\n\nexport type CreateToolsServiceOptions = {\n mcp: McpService;\n auth: AuthService;\n};\n\nconst createToolsService = async ({\n mcp,\n auth,\n}: CreateToolsServiceOptions): Promise<ToolsService> => {\n const tools: Tool[] = [];\n const coreTools: Tool[] = [];\n\n const registerTools: ToolsService['registerTools'] = async providers => {\n tools.push(...providers);\n };\n\n const registerCoreTools: ToolsService['registerCoreTools'] =\n async providers => {\n coreTools.push(...providers.map(tool => ({ ...tool, provider: 'core' })));\n };\n\n const getAvailableUserTools: ToolsService['getAvailableUserTools'] = async ({\n credentials,\n }) => {\n const mcpTools = await mcp.getTools(credentials);\n\n const availableTools: EnabledTool[] = tools\n .concat(mcpTools)\n .concat(coreTools)\n .map(tool => ({\n name: tool.name,\n provider: tool.provider,\n description: tool.description,\n }));\n\n return availableTools;\n };\n\n const getPrincipalTools: ToolsService['getPrincipalTools'] = async ({\n credentials,\n filter = () => true,\n }) => {\n const isUser = auth.isPrincipal(credentials, 'user');\n\n if (!isUser) {\n return tools.filter(filter).map(t => new DynamicStructuredTool(t));\n }\n\n const mcpTools = await mcp.getTools(credentials);\n\n const userTools = tools.concat(mcpTools);\n\n const allTools: Tool[] = userTools\n .filter(filter)\n .concat(coreTools.filter(filter));\n return allTools.map(t => new DynamicStructuredTool(t));\n };\n\n return {\n registerTools,\n registerCoreTools,\n getAvailableUserTools,\n getPrincipalTools,\n };\n};\n\nexport const toolsServiceRef: ServiceRef<ToolsService, 'plugin', 'singleton'> =\n createServiceRef<ToolsService>({\n id: 'ai-assistant.tools-service',\n defaultFactory: async service =>\n createServiceFactory({\n service,\n deps: {\n mcp: mcpServiceRef,\n auth: coreServices.auth,\n },\n factory: async options => {\n return createToolsService(options);\n },\n }),\n });\n"],"names":["tools","DynamicStructuredTool","createServiceRef","createServiceFactory","mcpServiceRef","coreServices"],"mappings":";;;;;;AAgCA,MAAM,qBAAqB,OAAO;AAAA,EAChC,GAAA;AAAA,EACA;AACF,CAAA,KAAwD;AACtD,EAAA,MAAMA,UAAgB,EAAC;AACvB,EAAA,MAAM,YAAoB,EAAC;AAE3B,EAAA,MAAM,aAAA,GAA+C,OAAM,SAAA,KAAa;AACtE,IAAAA,OAAA,CAAM,IAAA,CAAK,GAAG,SAAS,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,MAAM,iBAAA,GACJ,OAAM,SAAA,KAAa;AACjB,IAAA,SAAA,CAAU,IAAA,CAAK,GAAG,SAAA,CAAU,GAAA,CAAI,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,MAAA,EAAO,CAAE,CAAC,CAAA;AAAA,EAC1E,CAAA;AAEF,EAAA,MAAM,wBAA+D,OAAO;AAAA,IAC1E;AAAA,GACF,KAAM;AACJ,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA;AAE/C,IAAA,MAAM,cAAA,GAAgCA,QACnC,MAAA,CAAO,QAAQ,EACf,MAAA,CAAO,SAAS,CAAA,CAChB,GAAA,CAAI,CAAA,IAAA,MAAS;AAAA,MACZ,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,aAAa,IAAA,CAAK;AAAA,KACpB,CAAE,CAAA;AAEJ,IAAA,OAAO,cAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,oBAAuD,OAAO;AAAA,IAClE,WAAA;AAAA,IACA,SAAS,MAAM;AAAA,GACjB,KAAM;AACJ,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,WAAA,EAAa,MAAM,CAAA;AAEnD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAOA,OAAA,CAAM,OAAO,MAAM,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK,IAAIC,2BAAA,CAAsB,CAAC,CAAC,CAAA;AAAA,IACnE;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA;AAE/C,IAAA,MAAM,SAAA,GAAYD,OAAA,CAAM,MAAA,CAAO,QAAQ,CAAA;AAEvC,IAAA,MAAM,QAAA,GAAmB,UACtB,MAAA,CAAO,MAAM,EACb,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,MAAM,CAAC,CAAA;AAClC,IAAA,OAAO,SAAS,GAAA,CAAI,CAAA,CAAA,KAAK,IAAIC,2BAAA,CAAsB,CAAC,CAAC,CAAA;AAAA,EACvD,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,aAAA;AAAA,IACA,iBAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;AAEO,MAAM,kBACXC,iCAAA,CAA+B;AAAA,EAC7B,EAAA,EAAI,4BAAA;AAAA,EACJ,cAAA,EAAgB,OAAM,OAAA,KACpBC,qCAAA,CAAqB;AAAA,IACnB,OAAA;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,GAAA,EAAKC,mBAAA;AAAA,MACL,MAAMC,6BAAA,CAAa;AAAA,KACrB;AAAA,IACA,OAAA,EAAS,OAAM,OAAA,KAAW;AACxB,MAAA,OAAO,mBAAmB,OAAO,CAAA;AAAA,IACnC;AAAA,GACD;AACL,CAAC;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
3
4
|
var userSettingsStore = require('../database/user-settings-store.cjs.js');
|
|
4
5
|
|
|
5
6
|
const createUserSettingsService = async ({
|
|
@@ -29,6 +30,20 @@ const createUserSettingsService = async ({
|
|
|
29
30
|
deleteSettingsForType
|
|
30
31
|
};
|
|
31
32
|
};
|
|
33
|
+
const userSettingsServiceRef = backendPluginApi.createServiceRef({
|
|
34
|
+
id: "ai-assistant.user-settings-service",
|
|
35
|
+
defaultFactory: async (service) => backendPluginApi.createServiceFactory({
|
|
36
|
+
service,
|
|
37
|
+
deps: {
|
|
38
|
+
userInfo: backendPluginApi.coreServices.userInfo,
|
|
39
|
+
database: backendPluginApi.coreServices.database
|
|
40
|
+
},
|
|
41
|
+
factory: async (options) => {
|
|
42
|
+
return createUserSettingsService(options);
|
|
43
|
+
}
|
|
44
|
+
})
|
|
45
|
+
});
|
|
32
46
|
|
|
33
47
|
exports.createUserSettingsService = createUserSettingsService;
|
|
48
|
+
exports.userSettingsServiceRef = userSettingsServiceRef;
|
|
34
49
|
//# sourceMappingURL=user-settings.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-settings.cjs.js","sources":["../../src/services/user-settings.ts"],"sourcesContent":["import {\n BackstageCredentials,\n DatabaseService,\n UserInfoService,\n} from '@backstage/backend-plugin-api';\nimport { UserSettingsStore } from '../database/user-settings-store';\n\ntype CreateUserSettingsServiceOptions = {\n userInfo: UserInfoService;\n database: DatabaseService;\n};\n\nexport type UserSettingsService = {\n getSettingsForType: (\n credentials: BackstageCredentials,\n type: string,\n ) => Promise<Record<string, unknown>>;\n setSettingsForType: (\n credentials: BackstageCredentials,\n type: string,\n settings: Record<string, unknown>,\n ) => Promise<void>;\n deleteSettingsForType: (\n credentials: BackstageCredentials,\n type: string,\n ) => Promise<void>;\n};\n\nexport const createUserSettingsService = async ({\n userInfo,\n database,\n}: CreateUserSettingsServiceOptions): Promise<UserSettingsService> => {\n const userSettingsStore = await UserSettingsStore.fromConfig({ database });\n\n const getSettingsForType: UserSettingsService['getSettingsForType'] = async (\n credentials,\n type,\n ) => {\n const { userEntityRef } = await userInfo.getUserInfo(credentials);\n const settings = await userSettingsStore.getUserSettingsByType(\n userEntityRef,\n type,\n );\n\n return settings ?? {};\n };\n\n const setSettingsForType: UserSettingsService['setSettingsForType'] = async (\n credentials,\n type,\n settings,\n ) => {\n const { userEntityRef } = await userInfo.getUserInfo(credentials);\n await userSettingsStore.setUserSettings(userEntityRef, type, settings);\n };\n\n const deleteSettingsForType: UserSettingsService['deleteSettingsForType'] =\n async (credentials, type) => {\n const { userEntityRef } = await userInfo.getUserInfo(credentials);\n await userSettingsStore.deleteUserSettings(userEntityRef, type);\n };\n\n return {\n getSettingsForType,\n setSettingsForType,\n deleteSettingsForType,\n };\n};\n"],"names":["userSettingsStore","UserSettingsStore"],"mappings":"
|
|
1
|
+
{"version":3,"file":"user-settings.cjs.js","sources":["../../src/services/user-settings.ts"],"sourcesContent":["import {\n createServiceFactory,\n createServiceRef,\n coreServices,\n} from '@backstage/backend-plugin-api';\n\nimport type {\n ServiceRef,\n BackstageCredentials,\n DatabaseService,\n UserInfoService,\n} from '@backstage/backend-plugin-api';\n\nimport { UserSettingsStore } from '../database/user-settings-store';\n\ntype CreateUserSettingsServiceOptions = {\n userInfo: UserInfoService;\n database: DatabaseService;\n};\n\nexport type UserSettingsService = {\n getSettingsForType: (\n credentials: BackstageCredentials,\n type: string,\n ) => Promise<Record<string, unknown>>;\n setSettingsForType: (\n credentials: BackstageCredentials,\n type: string,\n settings: Record<string, unknown>,\n ) => Promise<void>;\n deleteSettingsForType: (\n credentials: BackstageCredentials,\n type: string,\n ) => Promise<void>;\n};\n\nexport const createUserSettingsService = async ({\n userInfo,\n database,\n}: CreateUserSettingsServiceOptions): Promise<UserSettingsService> => {\n const userSettingsStore = await UserSettingsStore.fromConfig({ database });\n\n const getSettingsForType: UserSettingsService['getSettingsForType'] = async (\n credentials,\n type,\n ) => {\n const { userEntityRef } = await userInfo.getUserInfo(credentials);\n const settings = await userSettingsStore.getUserSettingsByType(\n userEntityRef,\n type,\n );\n\n return settings ?? {};\n };\n\n const setSettingsForType: UserSettingsService['setSettingsForType'] = async (\n credentials,\n type,\n settings,\n ) => {\n const { userEntityRef } = await userInfo.getUserInfo(credentials);\n await userSettingsStore.setUserSettings(userEntityRef, type, settings);\n };\n\n const deleteSettingsForType: UserSettingsService['deleteSettingsForType'] =\n async (credentials, type) => {\n const { userEntityRef } = await userInfo.getUserInfo(credentials);\n await userSettingsStore.deleteUserSettings(userEntityRef, type);\n };\n\n return {\n getSettingsForType,\n setSettingsForType,\n deleteSettingsForType,\n };\n};\n\nexport const userSettingsServiceRef: ServiceRef<\n UserSettingsService,\n 'plugin',\n 'singleton'\n> = createServiceRef<UserSettingsService>({\n id: 'ai-assistant.user-settings-service',\n defaultFactory: async service =>\n createServiceFactory({\n service,\n deps: {\n userInfo: coreServices.userInfo,\n database: coreServices.database,\n },\n factory: async options => {\n return createUserSettingsService(options);\n },\n }),\n});\n"],"names":["userSettingsStore","UserSettingsStore","createServiceRef","createServiceFactory","coreServices"],"mappings":";;;;;AAoCO,MAAM,4BAA4B,OAAO;AAAA,EAC9C,QAAA;AAAA,EACA;AACF,CAAA,KAAsE;AACpE,EAAA,MAAMA,sBAAoB,MAAMC,mCAAA,CAAkB,UAAA,CAAW,EAAE,UAAU,CAAA;AAEzE,EAAA,MAAM,kBAAA,GAAgE,OACpE,WAAA,EACA,IAAA,KACG;AACH,IAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,QAAA,CAAS,YAAY,WAAW,CAAA;AAChE,IAAA,MAAM,QAAA,GAAW,MAAMD,mBAAA,CAAkB,qBAAA;AAAA,MACvC,aAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,YAAY,EAAC;AAAA,EACtB,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAgE,OACpE,WAAA,EACA,IAAA,EACA,QAAA,KACG;AACH,IAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,QAAA,CAAS,YAAY,WAAW,CAAA;AAChE,IAAA,MAAMA,mBAAA,CAAkB,eAAA,CAAgB,aAAA,EAAe,IAAA,EAAM,QAAQ,CAAA;AAAA,EACvE,CAAA;AAEA,EAAA,MAAM,qBAAA,GACJ,OAAO,WAAA,EAAa,IAAA,KAAS;AAC3B,IAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,QAAA,CAAS,YAAY,WAAW,CAAA;AAChE,IAAA,MAAMA,mBAAA,CAAkB,kBAAA,CAAmB,aAAA,EAAe,IAAI,CAAA;AAAA,EAChE,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,kBAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,MAAM,yBAITE,iCAAA,CAAsC;AAAA,EACxC,EAAA,EAAI,oCAAA;AAAA,EACJ,cAAA,EAAgB,OAAM,OAAA,KACpBC,qCAAA,CAAqB;AAAA,IACnB,OAAA;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,UAAUC,6BAAA,CAAa,QAAA;AAAA,MACvB,UAAUA,6BAAA,CAAa;AAAA,KACzB;AAAA,IACA,OAAA,EAAS,OAAM,OAAA,KAAW;AACxB,MAAA,OAAO,0BAA0B,OAAO,CAAA;AAAA,IAC1C;AAAA,GACD;AACL,CAAC;;;;;"}
|
|
@@ -39,13 +39,8 @@ Do NOT use for general knowledge that doesn't require company-specific informati
|
|
|
39
39
|
content: "No relevant information found in the knowledge base."
|
|
40
40
|
};
|
|
41
41
|
}
|
|
42
|
-
const content = results.map((r) => r.content).join("\n---\n");
|
|
43
|
-
const urls = results.map((r) => r.metadata.url);
|
|
44
42
|
return {
|
|
45
|
-
content
|
|
46
|
-
metadata: {
|
|
47
|
-
urls
|
|
48
|
-
}
|
|
43
|
+
content: JSON.stringify(results)
|
|
49
44
|
};
|
|
50
45
|
}
|
|
51
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchKnowledge.cjs.js","sources":["../../src/tools/searchKnowledge.ts"],"sourcesContent":["import {\n createAssistantTool,\n VectorStore,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-node';\nimport { Tool } from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport z from 'zod';\n\ntype CreateSearchKnowledgeToolOptions = {\n vectorStore: VectorStore;\n};\n\nexport const createSearchKnowledgeTool = ({\n vectorStore,\n}: CreateSearchKnowledgeToolOptions): Tool => {\n const knowledgeTool = createAssistantTool({\n tool: {\n name: 'search-knowledge-base',\n description: `Search the internal knowledge base containing company specific information.\n\nUse this tool when users ask about:\n- General questions about the company or internal information\n\nDo NOT use for general knowledge that doesn't require company-specific information.`,\n provider: 'core',\n schema: z.object({\n query: z.string().describe('The query to search for.'),\n filter: z\n .object({\n source: z.string().optional().describe('Source to filter by.'),\n id: z.string().optional().describe('ID to filter by.'),\n })\n .optional()\n .describe('Filters to apply to the search.'),\n amount: z\n .number()\n .min(1)\n .optional()\n .describe('The number of results to return.'),\n }),\n func: async ({ query, filter, amount }) => {\n const results = await vectorStore.similaritySearch(\n query,\n filter,\n amount,\n );\n\n if (results.length === 0) {\n return {\n content: 'No relevant information found in the knowledge base.',\n };\n }\n\n
|
|
1
|
+
{"version":3,"file":"searchKnowledge.cjs.js","sources":["../../src/tools/searchKnowledge.ts"],"sourcesContent":["import {\n createAssistantTool,\n VectorStore,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-node';\nimport { Tool } from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport z from 'zod';\n\ntype CreateSearchKnowledgeToolOptions = {\n vectorStore: VectorStore;\n};\n\nexport const createSearchKnowledgeTool = ({\n vectorStore,\n}: CreateSearchKnowledgeToolOptions): Tool => {\n const knowledgeTool = createAssistantTool({\n tool: {\n name: 'search-knowledge-base',\n description: `Search the internal knowledge base containing company specific information.\n\nUse this tool when users ask about:\n- General questions about the company or internal information\n\nDo NOT use for general knowledge that doesn't require company-specific information.`,\n provider: 'core',\n schema: z.object({\n query: z.string().describe('The query to search for.'),\n filter: z\n .object({\n source: z.string().optional().describe('Source to filter by.'),\n id: z.string().optional().describe('ID to filter by.'),\n })\n .optional()\n .describe('Filters to apply to the search.'),\n amount: z\n .number()\n .min(1)\n .optional()\n .describe('The number of results to return.'),\n }),\n func: async ({ query, filter, amount }) => {\n const results = await vectorStore.similaritySearch(\n query,\n filter,\n amount,\n );\n\n if (results.length === 0) {\n return {\n content: 'No relevant information found in the knowledge base.',\n };\n }\n\n return {\n content: JSON.stringify(results),\n };\n },\n },\n });\n\n return knowledgeTool;\n};\n"],"names":["createAssistantTool","z"],"mappings":";;;;;;;;;AAWO,MAAM,4BAA4B,CAAC;AAAA,EACxC;AACF,CAAA,KAA8C;AAC5C,EAAA,MAAM,gBAAgBA,kDAAA,CAAoB;AAAA,IACxC,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,uBAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA;AAAA;;AAAA,mFAAA,CAAA;AAAA,MAMb,QAAA,EAAU,MAAA;AAAA,MACV,MAAA,EAAQC,mBAAE,MAAA,CAAO;AAAA,QACf,KAAA,EAAOA,kBAAA,CAAE,MAAA,EAAO,CAAE,SAAS,0BAA0B,CAAA;AAAA,QACrD,MAAA,EAAQA,mBACL,MAAA,CAAO;AAAA,UACN,QAAQA,kBAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,sBAAsB,CAAA;AAAA,UAC7D,IAAIA,kBAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,kBAAkB;AAAA,SACtD,CAAA,CACA,QAAA,EAAS,CACT,SAAS,iCAAiC,CAAA;AAAA,QAC7C,MAAA,EAAQA,kBAAA,CACL,MAAA,EAAO,CACP,GAAA,CAAI,CAAC,CAAA,CACL,QAAA,EAAS,CACT,QAAA,CAAS,kCAAkC;AAAA,OAC/C,CAAA;AAAA,MACD,MAAM,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAO,KAAM;AACzC,QAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,gBAAA;AAAA,UAChC,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,UAAA,OAAO;AAAA,YACL,OAAA,EAAS;AAAA,WACX;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,SACjC;AAAA,MACF;AAAA;AACF,GACD,CAAA;AAED,EAAA,OAAO,aAAA;AACT;;;;"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const EMBEDDINGS_TABLE = 'embeddings';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
* @param {import('knex').knex} knex
|
|
6
|
+
*/
|
|
7
|
+
exports.down = async knex => {
|
|
8
|
+
await knex.schema.alterTable(EMBEDDINGS_TABLE, table => {
|
|
9
|
+
table.dropColumn('hash');
|
|
10
|
+
table.dropColumn('lastUpdated');
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
*
|
|
16
|
+
* @param {import('knex').knex} knex
|
|
17
|
+
*/
|
|
18
|
+
exports.up = async knex => {
|
|
19
|
+
await knex.schema.alterTable(EMBEDDINGS_TABLE, table => {
|
|
20
|
+
table.string('hash').comment('The content hash of the embedding document');
|
|
21
|
+
|
|
22
|
+
table
|
|
23
|
+
.timestamp('lastUpdated')
|
|
24
|
+
.defaultTo(knex.fn.now())
|
|
25
|
+
.comment('Timestamp of the last update to the embedding document');
|
|
26
|
+
});
|
|
27
|
+
};
|