@sweetoburrito/backstage-plugin-ai-assistant-backend 0.17.0 → 0.19.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/README.md +24 -0
- package/config.d.ts +22 -0
- package/dist/services/agent/index.cjs.js +9 -1
- package/dist/services/agent/index.cjs.js.map +1 -1
- package/dist/services/callbacks.cjs.js +1 -1
- package/dist/services/callbacks.cjs.js.map +1 -1
- package/dist/services/mcp/index.cjs.js +30 -7
- package/dist/services/mcp/index.cjs.js.map +1 -1
- package/dist/services/model.cjs.js +8 -1
- package/dist/services/model.cjs.js.map +1 -1
- package/dist/services/tools.cjs.js +86 -7
- package/dist/services/tools.cjs.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -26,3 +26,27 @@ package with `yarn start`. It is a limited setup that is most convenient when
|
|
|
26
26
|
developing the plugin backend itself.
|
|
27
27
|
|
|
28
28
|
If you want to run the entire project, including the frontend, run `yarn start` from the root directory.
|
|
29
|
+
|
|
30
|
+
## Tool Configuration
|
|
31
|
+
|
|
32
|
+
You can control tool behavior for all users through backend config:
|
|
33
|
+
|
|
34
|
+
- `aiAssistant.tools.core`: tools that are always enabled and not user-toggleable.
|
|
35
|
+
- `aiAssistant.tools.defaultEnabled`: tools enabled by default for users who do not yet have saved `user-tools` settings.
|
|
36
|
+
|
|
37
|
+
Both settings accept entries with `provider` and `name`:
|
|
38
|
+
|
|
39
|
+
```yaml
|
|
40
|
+
aiAssistant:
|
|
41
|
+
tools:
|
|
42
|
+
core:
|
|
43
|
+
- provider: core
|
|
44
|
+
name: search-knowledge-base
|
|
45
|
+
defaultEnabled:
|
|
46
|
+
- provider: core
|
|
47
|
+
name: search-knowledge-base
|
|
48
|
+
- provider: mcp server:foo
|
|
49
|
+
name: foo_someTool
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
For MCP tools, use provider format `mcp server:<server-name>`.
|
package/config.d.ts
CHANGED
|
@@ -45,6 +45,28 @@ export interface Config {
|
|
|
45
45
|
maxChunkProcessingSize?: number;
|
|
46
46
|
};
|
|
47
47
|
};
|
|
48
|
+
tools?: {
|
|
49
|
+
/**
|
|
50
|
+
* List of tools that should always be enabled and not user-toggleable.
|
|
51
|
+
*
|
|
52
|
+
* For MCP tools, provider format is: `mcp server:<server-name>`.
|
|
53
|
+
*/
|
|
54
|
+
core?: Array<{
|
|
55
|
+
provider: string;
|
|
56
|
+
name: string;
|
|
57
|
+
}>;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* List of tools enabled by default for users that don't have existing
|
|
61
|
+
* `user-tools` settings.
|
|
62
|
+
*
|
|
63
|
+
* For MCP tools, provider format is: `mcp server:<server-name>`.
|
|
64
|
+
*/
|
|
65
|
+
defaultEnabled?: Array<{
|
|
66
|
+
provider: string;
|
|
67
|
+
name: string;
|
|
68
|
+
}>;
|
|
69
|
+
};
|
|
48
70
|
mcp: {
|
|
49
71
|
/**
|
|
50
72
|
* @visibility secret
|
|
@@ -26,6 +26,7 @@ ${formattingPrompt}
|
|
|
26
26
|
|
|
27
27
|
${contentPrompt}`;
|
|
28
28
|
const toolGuideline = config.getOptionalString("aiAssistant.prompt.toolGuideline") || prompts.DEFAULT_TOOL_GUIDELINE;
|
|
29
|
+
const fallbackEnabled = config.getOptionalBoolean("models.fallbackEnabled") ?? true;
|
|
29
30
|
const systemPromptTemplate = prompts$1.SystemMessagePromptTemplate.fromTemplate(`
|
|
30
31
|
PURPOSE:
|
|
31
32
|
{systemPrompt}
|
|
@@ -73,10 +74,17 @@ ${contentPrompt}`;
|
|
|
73
74
|
conversationId,
|
|
74
75
|
modelId: resolvedModelId
|
|
75
76
|
});
|
|
77
|
+
const middleware = [];
|
|
78
|
+
if (fallbackEnabled) {
|
|
79
|
+
const models = model.getAllModels();
|
|
80
|
+
const llms = models.map((m) => m.chatModel);
|
|
81
|
+
middleware.push(langchain.modelFallbackMiddleware(...llms));
|
|
82
|
+
}
|
|
76
83
|
const agent = langchain.createAgent({
|
|
77
84
|
model: llm,
|
|
78
85
|
tools,
|
|
79
|
-
systemPrompt: agentPrompt[0].text
|
|
86
|
+
systemPrompt: agentPrompt[0].text,
|
|
87
|
+
middleware
|
|
80
88
|
}).withConfig({
|
|
81
89
|
callbacks,
|
|
82
90
|
metadata,
|
|
@@ -1 +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 { createAgent as createLangchainAgent } from 'langchain';\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, BaseMessageChunk } from '@langchain/core/messages';\nimport { parseLangchainMessage } from './helpers/message-parser';\nimport { createDeterministicUuid } from './helpers/deterministic-uuid';\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 onStreamEnd?: () => 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 createLangchainAgent>> => {\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 { 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 const agent = createLangchainAgent({\n model: llm,\n tools,\n systemPrompt: agentPrompt[0].text,\n }).withConfig({\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, onStreamEnd } = options;\n\n const agent = await createAgent(options);\n\n const promptStream = await agent.stream(\n {\n messages,\n },\n {\n streamMode: ['messages'],\n },\n );\n\n const promptMessages: BaseMessageChunk[] = [];\n\n for await (const [, [chunk]] of promptStream) {\n const messageChunk = chunk as BaseMessageChunk;\n\n messageChunk.id = createDeterministicUuid(messageChunk);\n\n const existingChunksIndex = promptMessages.findIndex(\n m => m.id === messageChunk.id,\n );\n\n if (existingChunksIndex === -1) {\n promptMessages.push(messageChunk);\n } else {\n const existingChunk = promptMessages[existingChunksIndex];\n\n existingChunk.concat(messageChunk);\n\n promptMessages[existingChunksIndex] =\n existingChunk.concat(messageChunk);\n }\n\n const parsedMessages: Message[] = promptMessages.map(m =>\n parseLangchainMessage(m, options.metadata.runId),\n );\n\n onStreamChunk(parsedMessages);\n }\n\n onStreamEnd?.();\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","createLangchainAgent","createDeterministicUuid","parseLangchainMessage","createServiceRef","createServiceFactory","coreServices","modelServiceRef","toolsServiceRef","callbackServiceRef"],"mappings":"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"}
|
|
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 {\n createAgent as createLangchainAgent,\n modelFallbackMiddleware,\n} from 'langchain';\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, BaseMessageChunk } from '@langchain/core/messages';\nimport { parseLangchainMessage } from './helpers/message-parser';\nimport { createDeterministicUuid } from './helpers/deterministic-uuid';\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 onStreamEnd?: () => 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 fallbackEnabled =\n config.getOptionalBoolean('models.fallbackEnabled') ?? true;\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 createLangchainAgent>> => {\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 { 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 const middleware = [];\n\n if (fallbackEnabled) {\n const models = model.getAllModels();\n\n const llms = models.map(m => m.chatModel);\n\n middleware.push(modelFallbackMiddleware(...llms));\n }\n\n const agent = createLangchainAgent({\n model: llm,\n tools,\n systemPrompt: agentPrompt[0].text,\n middleware,\n }).withConfig({\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, onStreamEnd } = options;\n\n const agent = await createAgent(options);\n\n const promptStream = await agent.stream(\n {\n messages,\n },\n {\n streamMode: ['messages'],\n },\n );\n\n const promptMessages: BaseMessageChunk[] = [];\n\n for await (const [, [chunk]] of promptStream) {\n const messageChunk = chunk as BaseMessageChunk;\n\n messageChunk.id = createDeterministicUuid(messageChunk);\n\n const existingChunksIndex = promptMessages.findIndex(\n m => m.id === messageChunk.id,\n );\n\n if (existingChunksIndex === -1) {\n promptMessages.push(messageChunk);\n } else {\n const existingChunk = promptMessages[existingChunksIndex];\n\n existingChunk.concat(messageChunk);\n\n promptMessages[existingChunksIndex] =\n existingChunk.concat(messageChunk);\n }\n\n const parsedMessages: Message[] = promptMessages.map(m =>\n parseLangchainMessage(m, options.metadata.runId),\n );\n\n onStreamChunk(parsedMessages);\n }\n\n onStreamEnd?.();\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","modelFallbackMiddleware","createLangchainAgent","createDeterministicUuid","parseLangchainMessage","createServiceRef","createServiceFactory","coreServices","modelServiceRef","toolsServiceRef","callbackServiceRef"],"mappings":"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"}
|
|
@@ -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\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
|
|
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);\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,UAAU,YAAY,CAAA;AAAA,IACtC;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;;;;"}
|
|
@@ -7,6 +7,20 @@ var helpers = require('./helpers.cjs.js');
|
|
|
7
7
|
var userSettings = require('../user-settings.cjs.js');
|
|
8
8
|
|
|
9
9
|
const MCP_SETTINGS_TYPE = "mcp_server_config";
|
|
10
|
+
const normalizeMcpServerName = (name) => {
|
|
11
|
+
return name.trim().replace(/[\s-]/g, "_");
|
|
12
|
+
};
|
|
13
|
+
const normalizeMcpServerConfigs = (configs) => {
|
|
14
|
+
const normalizedByName = configs.reduce((acc, server) => {
|
|
15
|
+
const normalizedName = normalizeMcpServerName(server.name);
|
|
16
|
+
acc[normalizedName] = {
|
|
17
|
+
...server,
|
|
18
|
+
name: normalizedName
|
|
19
|
+
};
|
|
20
|
+
return acc;
|
|
21
|
+
}, {});
|
|
22
|
+
return Object.values(normalizedByName);
|
|
23
|
+
};
|
|
10
24
|
const createMcpService = async ({
|
|
11
25
|
config,
|
|
12
26
|
userSettings
|
|
@@ -93,15 +107,21 @@ const createMcpService = async ({
|
|
|
93
107
|
}
|
|
94
108
|
};
|
|
95
109
|
const setUserMcpServerConfig = async (credentials, mcpConfig) => {
|
|
96
|
-
const
|
|
97
|
-
const
|
|
110
|
+
const normalizedName = normalizeMcpServerName(mcpConfig.name);
|
|
111
|
+
const normalizedConfig = {
|
|
112
|
+
...mcpConfig,
|
|
113
|
+
name: normalizedName
|
|
114
|
+
};
|
|
115
|
+
const existingConfig = normalizeMcpServerConfigs(
|
|
116
|
+
await getUserMcpServerConfig(credentials)
|
|
117
|
+
);
|
|
98
118
|
const existingServerIndex = existingConfig.findIndex(
|
|
99
|
-
(server) => server.name ===
|
|
119
|
+
(server) => server.name === normalizedName
|
|
100
120
|
);
|
|
101
121
|
if (existingServerIndex === -1) {
|
|
102
|
-
existingConfig.push(
|
|
122
|
+
existingConfig.push(normalizedConfig);
|
|
103
123
|
} else {
|
|
104
|
-
existingConfig[existingServerIndex] =
|
|
124
|
+
existingConfig[existingServerIndex] = normalizedConfig;
|
|
105
125
|
}
|
|
106
126
|
await validateMcpServerConfig(existingConfig);
|
|
107
127
|
const updatedConfig = existingConfig.reduce(
|
|
@@ -121,8 +141,11 @@ const createMcpService = async ({
|
|
|
121
141
|
);
|
|
122
142
|
};
|
|
123
143
|
const deleteUserMcpServerConfig = async (credentials, name) => {
|
|
124
|
-
const
|
|
125
|
-
const
|
|
144
|
+
const normalizedName = normalizeMcpServerName(name);
|
|
145
|
+
const existingConfig = normalizeMcpServerConfigs(
|
|
146
|
+
await getUserMcpServerConfig(credentials)
|
|
147
|
+
);
|
|
148
|
+
const updatedConfig = existingConfig.filter((server) => server.name !== normalizedName).reduce((acc, server) => {
|
|
126
149
|
acc[server.name] = backstagePluginAiAssistantNode.encrypt(
|
|
127
150
|
JSON.stringify(server.options),
|
|
128
151
|
encryptionKey
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../../../src/services/mcp/index.ts"],"sourcesContent":["import {\n BackstageCredentials,\n DatabaseService,\n RootConfigService,\n createServiceFactory,\n createServiceRef,\n ServiceRef,\n coreServices,\n} from '@backstage/backend-plugin-api';\nimport { MultiServerMCPClient } from '@langchain/mcp-adapters';\nimport {\n McpServerConfig,\n McpServerConfigOptions,\n Tool,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport {\n encrypt,\n decrypt,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-node';\nimport { getToolsForServer } from './helpers';\nimport { UserSettingsService, userSettingsServiceRef } from '../user-settings';\n\ntype CreateMcpServiceOptions = {\n config: RootConfigService;\n database: DatabaseService;\n userSettings: UserSettingsService;\n};\n\nconst MCP_SETTINGS_TYPE = 'mcp_server_config';\n\nexport type McpService = {\n getTools: (credentials: BackstageCredentials) => Promise<Tool[]>;\n getUserMcpServerConfigNames: (\n credentials: BackstageCredentials,\n ) => Promise<string[]>;\n deleteUserMcpServerConfig: (\n credentials: BackstageCredentials,\n name: string,\n ) => Promise<void>;\n setUserMcpServerConfig: (\n credentials: BackstageCredentials,\n config: McpServerConfig,\n ) => Promise<void>;\n};\n\nexport const createMcpService = async ({\n config,\n userSettings,\n}: CreateMcpServiceOptions): Promise<McpService> => {\n const serversConfig = config.getOptionalConfigArray(\n 'aiAssistant.mcp.servers',\n );\n const encryptionKey = config.getString('aiAssistant.mcp.encryptionKey');\n\n const preConfiguredMcpServers: Record<string, McpServerConfigOptions> =\n serversConfig\n ? serversConfig.reduce((acc, server) => {\n const serverName = server.getString('name');\n const options = server.get<McpServerConfigOptions>('options');\n\n acc[serverName] = options;\n\n return acc;\n }, {} as Record<string, McpServerConfigOptions>)\n : {};\n\n const getUserMcpServerConfigNames: McpService['getUserMcpServerConfigNames'] =\n async credentials => {\n const mcpConfig = await userSettings.getSettingsForType(\n credentials,\n MCP_SETTINGS_TYPE,\n );\n\n const names = Object.keys(mcpConfig);\n\n if (names.length === 0) {\n return [];\n }\n\n return names;\n };\n\n const getUserMcpServerConfig = async (\n credentials: BackstageCredentials,\n ): Promise<McpServerConfig[]> => {\n const mcpConfigEncrypted = await userSettings.getSettingsForType(\n credentials,\n MCP_SETTINGS_TYPE,\n );\n\n const entries = Object.entries(mcpConfigEncrypted) as [string, string][];\n\n if (entries.length === 0) {\n return [];\n }\n\n const mcpConfig: McpServerConfig[] = entries.map(([name, data]) => ({\n name,\n options: JSON.parse(decrypt(data, encryptionKey)),\n }));\n\n return mcpConfig;\n };\n\n const getTools: McpService['getTools'] = async credentials => {\n const userMcpConfig = await getUserMcpServerConfig(credentials);\n\n const userMcpServers: Record<string, McpServerConfigOptions> =\n userMcpConfig.length\n ? userMcpConfig.reduce((acc, server) => {\n const { name, options } = server;\n\n acc[name] = options;\n\n return acc;\n }, {} as Record<string, McpServerConfigOptions>)\n : {};\n\n const mcpServers: Record<string, McpServerConfigOptions> = {\n ...preConfiguredMcpServers,\n ...userMcpServers,\n };\n\n const serverNames = Object.keys(mcpServers);\n\n if (serverNames.length === 0) {\n return [];\n }\n\n const mcpClient = new MultiServerMCPClient({\n prefixToolNameWithServerName: true,\n useStandardContentBlocks: true,\n mcpServers,\n });\n\n const serverToolPromises = serverNames.map(serverName =>\n getToolsForServer(mcpClient, serverName),\n );\n const toolsByServer = await Promise.all(serverToolPromises);\n\n return toolsByServer.flat();\n };\n\n const validateMcpServerConfig = async (\n mcpConfig: McpServerConfig[],\n ): Promise<void> => {\n try {\n const userMcpServers = mcpConfig.reduce((acc, server) => {\n const { name, options } = server;\n\n acc[name] = options;\n\n return acc;\n }, {} as Record<string, McpServerConfigOptions>);\n\n const userConfigClient = new MultiServerMCPClient({\n prefixToolNameWithServerName: true,\n useStandardContentBlocks: true,\n mcpServers: userMcpServers,\n });\n\n await userConfigClient.getTools();\n } catch (e) {\n const error = new Error('Invalid MCP server configuration');\n error.name = 'McpConfigurationError';\n throw error;\n }\n };\n\n const setUserMcpServerConfig: McpService['setUserMcpServerConfig'] = async (\n credentials,\n mcpConfig,\n ) => {\n const { name } = mcpConfig;\n\n const existingConfig = await getUserMcpServerConfig(credentials);\n\n const existingServerIndex = existingConfig.findIndex(\n server => server.name === name,\n );\n\n if (existingServerIndex === -1) {\n existingConfig.push(mcpConfig);\n } else {\n existingConfig[existingServerIndex] = mcpConfig;\n }\n\n await validateMcpServerConfig(existingConfig);\n\n const updatedConfig: Record<string, string> = existingConfig.reduce(\n (acc, server) => {\n acc[server.name] = encrypt(\n JSON.stringify(server.options),\n encryptionKey,\n );\n return acc;\n },\n {} as Record<string, string>,\n );\n\n await userSettings.setSettingsForType(\n credentials,\n MCP_SETTINGS_TYPE,\n updatedConfig,\n );\n };\n\n const deleteUserMcpServerConfig: McpService['deleteUserMcpServerConfig'] =\n async (credentials, name) => {\n const existingConfig = await getUserMcpServerConfig(credentials);\n\n const updatedConfig: Record<string, string> = existingConfig\n .filter(server => server.name !== name)\n .reduce((acc, server) => {\n acc[server.name] = encrypt(\n JSON.stringify(server.options),\n encryptionKey,\n );\n return acc;\n }, {} as Record<string, string>);\n\n await userSettings.setSettingsForType(\n credentials,\n MCP_SETTINGS_TYPE,\n updatedConfig,\n );\n };\n\n return {\n getTools,\n getUserMcpServerConfigNames,\n deleteUserMcpServerConfig,\n setUserMcpServerConfig,\n };\n};\n\nexport const mcpServiceRef: ServiceRef<McpService, 'plugin', 'singleton'> =\n createServiceRef<McpService>({\n id: 'ai-assistant.mcp-service',\n defaultFactory: async service =>\n createServiceFactory({\n service,\n deps: {\n config: coreServices.rootConfig,\n userInfo: coreServices.userInfo,\n database: coreServices.database,\n userSettings: userSettingsServiceRef,\n },\n factory: async options => {\n return createMcpService(options);\n },\n }),\n });\n"],"names":["decrypt","MultiServerMCPClient","getToolsForServer","encrypt","createServiceRef","createServiceFactory","coreServices","userSettingsServiceRef"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../src/services/mcp/index.ts"],"sourcesContent":["import {\n BackstageCredentials,\n DatabaseService,\n RootConfigService,\n createServiceFactory,\n createServiceRef,\n ServiceRef,\n coreServices,\n} from '@backstage/backend-plugin-api';\nimport { MultiServerMCPClient } from '@langchain/mcp-adapters';\nimport {\n McpServerConfig,\n McpServerConfigOptions,\n Tool,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-common';\nimport {\n encrypt,\n decrypt,\n} from '@sweetoburrito/backstage-plugin-ai-assistant-node';\nimport { getToolsForServer } from './helpers';\nimport { UserSettingsService, userSettingsServiceRef } from '../user-settings';\n\ntype CreateMcpServiceOptions = {\n config: RootConfigService;\n database: DatabaseService;\n userSettings: UserSettingsService;\n};\n\nconst MCP_SETTINGS_TYPE = 'mcp_server_config';\n\nconst normalizeMcpServerName = (name: string): string => {\n return name.trim().replace(/[\\s-]/g, '_');\n};\n\nconst normalizeMcpServerConfigs = (\n configs: McpServerConfig[],\n): McpServerConfig[] => {\n const normalizedByName = configs.reduce((acc, server) => {\n const normalizedName = normalizeMcpServerName(server.name);\n\n acc[normalizedName] = {\n ...server,\n name: normalizedName,\n };\n\n return acc;\n }, {} as Record<string, McpServerConfig>);\n\n return Object.values(normalizedByName);\n};\n\nexport type McpService = {\n getTools: (credentials: BackstageCredentials) => Promise<Tool[]>;\n getUserMcpServerConfigNames: (\n credentials: BackstageCredentials,\n ) => Promise<string[]>;\n deleteUserMcpServerConfig: (\n credentials: BackstageCredentials,\n name: string,\n ) => Promise<void>;\n setUserMcpServerConfig: (\n credentials: BackstageCredentials,\n config: McpServerConfig,\n ) => Promise<void>;\n};\n\nexport const createMcpService = async ({\n config,\n userSettings,\n}: CreateMcpServiceOptions): Promise<McpService> => {\n const serversConfig = config.getOptionalConfigArray(\n 'aiAssistant.mcp.servers',\n );\n const encryptionKey = config.getString('aiAssistant.mcp.encryptionKey');\n\n const preConfiguredMcpServers: Record<string, McpServerConfigOptions> =\n serversConfig\n ? serversConfig.reduce((acc, server) => {\n const serverName = server.getString('name');\n const options = server.get<McpServerConfigOptions>('options');\n\n acc[serverName] = options;\n\n return acc;\n }, {} as Record<string, McpServerConfigOptions>)\n : {};\n\n const getUserMcpServerConfigNames: McpService['getUserMcpServerConfigNames'] =\n async credentials => {\n const mcpConfig = await userSettings.getSettingsForType(\n credentials,\n MCP_SETTINGS_TYPE,\n );\n\n const names = Object.keys(mcpConfig);\n\n if (names.length === 0) {\n return [];\n }\n\n return names;\n };\n\n const getUserMcpServerConfig = async (\n credentials: BackstageCredentials,\n ): Promise<McpServerConfig[]> => {\n const mcpConfigEncrypted = await userSettings.getSettingsForType(\n credentials,\n MCP_SETTINGS_TYPE,\n );\n\n const entries = Object.entries(mcpConfigEncrypted) as [string, string][];\n\n if (entries.length === 0) {\n return [];\n }\n\n const mcpConfig: McpServerConfig[] = entries.map(([name, data]) => ({\n name,\n options: JSON.parse(decrypt(data, encryptionKey)),\n }));\n\n return mcpConfig;\n };\n\n const getTools: McpService['getTools'] = async credentials => {\n const userMcpConfig = await getUserMcpServerConfig(credentials);\n\n const userMcpServers: Record<string, McpServerConfigOptions> =\n userMcpConfig.length\n ? userMcpConfig.reduce((acc, server) => {\n const { name, options } = server;\n\n acc[name] = options;\n\n return acc;\n }, {} as Record<string, McpServerConfigOptions>)\n : {};\n\n const mcpServers: Record<string, McpServerConfigOptions> = {\n ...preConfiguredMcpServers,\n ...userMcpServers,\n };\n\n const serverNames = Object.keys(mcpServers);\n\n if (serverNames.length === 0) {\n return [];\n }\n\n const mcpClient = new MultiServerMCPClient({\n prefixToolNameWithServerName: true,\n useStandardContentBlocks: true,\n mcpServers,\n });\n\n const serverToolPromises = serverNames.map(serverName =>\n getToolsForServer(mcpClient, serverName),\n );\n const toolsByServer = await Promise.all(serverToolPromises);\n\n return toolsByServer.flat();\n };\n\n const validateMcpServerConfig = async (\n mcpConfig: McpServerConfig[],\n ): Promise<void> => {\n try {\n const userMcpServers = mcpConfig.reduce((acc, server) => {\n const { name, options } = server;\n\n acc[name] = options;\n\n return acc;\n }, {} as Record<string, McpServerConfigOptions>);\n\n const userConfigClient = new MultiServerMCPClient({\n prefixToolNameWithServerName: true,\n useStandardContentBlocks: true,\n mcpServers: userMcpServers,\n });\n\n await userConfigClient.getTools();\n } catch (e) {\n const error = new Error('Invalid MCP server configuration');\n error.name = 'McpConfigurationError';\n throw error;\n }\n };\n\n const setUserMcpServerConfig: McpService['setUserMcpServerConfig'] = async (\n credentials,\n mcpConfig,\n ) => {\n const normalizedName = normalizeMcpServerName(mcpConfig.name);\n const normalizedConfig: McpServerConfig = {\n ...mcpConfig,\n name: normalizedName,\n };\n\n const existingConfig = normalizeMcpServerConfigs(\n await getUserMcpServerConfig(credentials),\n );\n\n const existingServerIndex = existingConfig.findIndex(\n server => server.name === normalizedName,\n );\n\n if (existingServerIndex === -1) {\n existingConfig.push(normalizedConfig);\n } else {\n existingConfig[existingServerIndex] = normalizedConfig;\n }\n\n await validateMcpServerConfig(existingConfig);\n\n const updatedConfig: Record<string, string> = existingConfig.reduce(\n (acc, server) => {\n acc[server.name] = encrypt(\n JSON.stringify(server.options),\n encryptionKey,\n );\n return acc;\n },\n {} as Record<string, string>,\n );\n\n await userSettings.setSettingsForType(\n credentials,\n MCP_SETTINGS_TYPE,\n updatedConfig,\n );\n };\n\n const deleteUserMcpServerConfig: McpService['deleteUserMcpServerConfig'] =\n async (credentials, name) => {\n const normalizedName = normalizeMcpServerName(name);\n const existingConfig = normalizeMcpServerConfigs(\n await getUserMcpServerConfig(credentials),\n );\n\n const updatedConfig: Record<string, string> = existingConfig\n .filter(server => server.name !== normalizedName)\n .reduce((acc, server) => {\n acc[server.name] = encrypt(\n JSON.stringify(server.options),\n encryptionKey,\n );\n return acc;\n }, {} as Record<string, string>);\n\n await userSettings.setSettingsForType(\n credentials,\n MCP_SETTINGS_TYPE,\n updatedConfig,\n );\n };\n\n return {\n getTools,\n getUserMcpServerConfigNames,\n deleteUserMcpServerConfig,\n setUserMcpServerConfig,\n };\n};\n\nexport const mcpServiceRef: ServiceRef<McpService, 'plugin', 'singleton'> =\n createServiceRef<McpService>({\n id: 'ai-assistant.mcp-service',\n defaultFactory: async service =>\n createServiceFactory({\n service,\n deps: {\n config: coreServices.rootConfig,\n userInfo: coreServices.userInfo,\n database: coreServices.database,\n userSettings: userSettingsServiceRef,\n },\n factory: async options => {\n return createMcpService(options);\n },\n }),\n });\n"],"names":["decrypt","MultiServerMCPClient","getToolsForServer","encrypt","createServiceRef","createServiceFactory","coreServices","userSettingsServiceRef"],"mappings":"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"}
|
|
@@ -26,7 +26,14 @@ const createModelService = async ({
|
|
|
26
26
|
const getAvailableModels = () => {
|
|
27
27
|
return models.map((x) => x.id);
|
|
28
28
|
};
|
|
29
|
-
|
|
29
|
+
const getAllModels = () => {
|
|
30
|
+
if (models.length === 0) {
|
|
31
|
+
logger.error("No models have been registered.");
|
|
32
|
+
throw new Error("No models have been registered.");
|
|
33
|
+
}
|
|
34
|
+
return models;
|
|
35
|
+
};
|
|
36
|
+
return { registerModels, getModel, getAvailableModels, getAllModels };
|
|
30
37
|
};
|
|
31
38
|
const modelServiceRef = backendPluginApi.createServiceRef({
|
|
32
39
|
id: "ai-assistant.model-service",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.cjs.js","sources":["../../src/services/model.ts"],"sourcesContent":["import {\n coreServices,\n createServiceFactory,\n createServiceRef,\n LoggerService,\n ServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { Model } from '@sweetoburrito/backstage-plugin-ai-assistant-node';\n\nexport type ModelService = {\n registerModels: (modelProviders: Model[]) => void;\n getModel: (id: string) => Model;\n getAvailableModels: () => string[];\n};\n\nexport type CreateModelServiceOptions = {\n logger: LoggerService;\n};\n\nconst createModelService = async ({\n logger,\n}: CreateModelServiceOptions): Promise<ModelService> => {\n const models: Model[] = [];\n\n const registerModels: ModelService['registerModels'] = async providers => {\n models.push(...providers);\n };\n\n const getModel: ModelService['getModel'] = id => {\n if (models.length === 0) {\n logger.error('No models have been registered.');\n throw new Error('No models have been registered.');\n }\n\n const provider = models.find(m => m.id === id);\n\n if (!provider) {\n logger.warn(\n `Model with id ${id} not found, using default ${models[0].id}.`,\n );\n return models[0];\n }\n\n return provider;\n };\n\n const getAvailableModels: ModelService['getAvailableModels'] = () => {\n return models.map(x => x.id);\n };\n\n return { registerModels, getModel, getAvailableModels };\n};\n\nexport const modelServiceRef: ServiceRef<ModelService, 'plugin', 'singleton'> =\n createServiceRef<ModelService>({\n id: 'ai-assistant.model-service',\n defaultFactory: async service =>\n createServiceFactory({\n service,\n deps: {\n logger: coreServices.logger,\n },\n factory: async options => {\n return createModelService(options);\n },\n }),\n });\n"],"names":["createServiceRef","createServiceFactory","coreServices"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"model.cjs.js","sources":["../../src/services/model.ts"],"sourcesContent":["import {\n coreServices,\n createServiceFactory,\n createServiceRef,\n LoggerService,\n ServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { Model } from '@sweetoburrito/backstage-plugin-ai-assistant-node';\n\nexport type ModelService = {\n registerModels: (modelProviders: Model[]) => void;\n getModel: (id: string) => Model;\n getAllModels: () => Model[];\n getAvailableModels: () => string[];\n};\n\nexport type CreateModelServiceOptions = {\n logger: LoggerService;\n};\n\nconst createModelService = async ({\n logger,\n}: CreateModelServiceOptions): Promise<ModelService> => {\n const models: Model[] = [];\n\n const registerModels: ModelService['registerModels'] = async providers => {\n models.push(...providers);\n };\n\n const getModel: ModelService['getModel'] = id => {\n if (models.length === 0) {\n logger.error('No models have been registered.');\n throw new Error('No models have been registered.');\n }\n\n const provider = models.find(m => m.id === id);\n\n if (!provider) {\n logger.warn(\n `Model with id ${id} not found, using default ${models[0].id}.`,\n );\n return models[0];\n }\n\n return provider;\n };\n\n const getAvailableModels: ModelService['getAvailableModels'] = () => {\n return models.map(x => x.id);\n };\n\n const getAllModels = () => {\n if (models.length === 0) {\n logger.error('No models have been registered.');\n throw new Error('No models have been registered.');\n }\n return models;\n };\n\n return { registerModels, getModel, getAvailableModels, getAllModels };\n};\n\nexport const modelServiceRef: ServiceRef<ModelService, 'plugin', 'singleton'> =\n createServiceRef<ModelService>({\n id: 'ai-assistant.model-service',\n defaultFactory: async service =>\n createServiceFactory({\n service,\n deps: {\n logger: coreServices.logger,\n },\n factory: async options => {\n return createModelService(options);\n },\n }),\n });\n"],"names":["createServiceRef","createServiceFactory","coreServices"],"mappings":";;;;AAoBA,MAAM,qBAAqB,OAAO;AAAA,EAChC;AACF,CAAA,KAAwD;AACtD,EAAA,MAAM,SAAkB,EAAC;AAEzB,EAAA,MAAM,cAAA,GAAiD,OAAM,SAAA,KAAa;AACxE,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,SAAS,CAAA;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,WAAqC,CAAA,EAAA,KAAM;AAC/C,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,MAAA,CAAO,MAAM,iCAAiC,CAAA;AAC9C,MAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,WAAW,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,EAAE,CAAA;AAE7C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,iBAAiB,EAAE,CAAA,0BAAA,EAA6B,MAAA,CAAO,CAAC,EAAE,EAAE,CAAA,CAAA;AAAA,OAC9D;AACA,MAAA,OAAO,OAAO,CAAC,CAAA;AAAA,IACjB;AAEA,IAAA,OAAO,QAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,qBAAyD,MAAM;AACnE,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAE,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,MAAA,CAAO,MAAM,iCAAiC,CAAA;AAC9C,MAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO,EAAE,cAAA,EAAgB,QAAA,EAAU,kBAAA,EAAoB,YAAA,EAAa;AACtE,CAAA;AAEO,MAAM,kBACXA,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,QAAQC,6BAAA,CAAa;AAAA,KACvB;AAAA,IACA,OAAA,EAAS,OAAM,OAAA,KAAW;AACxB,MAAA,OAAO,mBAAmB,OAAO,CAAA;AAAA,IACnC;AAAA,GACD;AACL,CAAC;;;;"}
|
|
@@ -6,10 +6,59 @@ var tools = require('@langchain/core/tools');
|
|
|
6
6
|
|
|
7
7
|
const createToolsService = async ({
|
|
8
8
|
mcp,
|
|
9
|
-
auth
|
|
9
|
+
auth,
|
|
10
|
+
config
|
|
10
11
|
}) => {
|
|
11
12
|
const tools$1 = [];
|
|
12
13
|
const coreTools = [];
|
|
14
|
+
const areSameTools = (left, right) => left.name === right.name && left.provider === right.provider;
|
|
15
|
+
const getConfiguredTools = (path) => {
|
|
16
|
+
const configuredTools = config.getOptionalConfigArray(path);
|
|
17
|
+
if (!configuredTools) {
|
|
18
|
+
return void 0;
|
|
19
|
+
}
|
|
20
|
+
return configuredTools.map((tool) => ({
|
|
21
|
+
name: tool.getString("name"),
|
|
22
|
+
provider: tool.getString("provider")
|
|
23
|
+
}));
|
|
24
|
+
};
|
|
25
|
+
const uniqTools = (allTools) => {
|
|
26
|
+
const toolMap = new Map(
|
|
27
|
+
allTools.map((tool) => [`${tool.provider}:${tool.name}`, tool])
|
|
28
|
+
);
|
|
29
|
+
return Array.from(toolMap.values());
|
|
30
|
+
};
|
|
31
|
+
const resolveCoreTools = (allTools) => {
|
|
32
|
+
const configuredCoreTools = getConfiguredTools("aiAssistant.tools.core");
|
|
33
|
+
if (configuredCoreTools === void 0) {
|
|
34
|
+
return coreTools;
|
|
35
|
+
}
|
|
36
|
+
return allTools.filter(
|
|
37
|
+
(tool) => configuredCoreTools.some(
|
|
38
|
+
(configuredTool) => areSameTools(configuredTool, {
|
|
39
|
+
name: tool.name,
|
|
40
|
+
provider: tool.provider
|
|
41
|
+
})
|
|
42
|
+
)
|
|
43
|
+
);
|
|
44
|
+
};
|
|
45
|
+
const resolveDefaultEnabledTools = (allTools, resolvedCore) => {
|
|
46
|
+
const configuredDefaultTools = getConfiguredTools(
|
|
47
|
+
"aiAssistant.tools.defaultEnabled"
|
|
48
|
+
);
|
|
49
|
+
if (configuredDefaultTools === void 0) {
|
|
50
|
+
return resolvedCore;
|
|
51
|
+
}
|
|
52
|
+
const resolvedConfiguredDefaultTools = allTools.filter(
|
|
53
|
+
(tool) => configuredDefaultTools.some(
|
|
54
|
+
(configuredTool) => areSameTools(configuredTool, {
|
|
55
|
+
name: tool.name,
|
|
56
|
+
provider: tool.provider
|
|
57
|
+
})
|
|
58
|
+
)
|
|
59
|
+
);
|
|
60
|
+
return uniqTools(resolvedConfiguredDefaultTools.concat(resolvedCore));
|
|
61
|
+
};
|
|
13
62
|
const registerTools = async (providers) => {
|
|
14
63
|
tools$1.push(...providers);
|
|
15
64
|
};
|
|
@@ -20,12 +69,30 @@ const createToolsService = async ({
|
|
|
20
69
|
credentials
|
|
21
70
|
}) => {
|
|
22
71
|
const mcpTools = await mcp.getTools(credentials);
|
|
23
|
-
const availableTools = tools$1.concat(mcpTools).concat(coreTools)
|
|
72
|
+
const availableTools = uniqTools(tools$1.concat(mcpTools).concat(coreTools));
|
|
73
|
+
const resolvedCoreTools = resolveCoreTools(availableTools);
|
|
74
|
+
const resolvedDefaultEnabledTools = resolveDefaultEnabledTools(
|
|
75
|
+
availableTools,
|
|
76
|
+
resolvedCoreTools
|
|
77
|
+
);
|
|
78
|
+
const availableUserTools = availableTools.map((tool) => ({
|
|
24
79
|
name: tool.name,
|
|
25
80
|
provider: tool.provider,
|
|
26
|
-
description: tool.description
|
|
81
|
+
description: tool.description,
|
|
82
|
+
isCore: resolvedCoreTools.some(
|
|
83
|
+
(coreTool) => areSameTools(coreTool, {
|
|
84
|
+
name: tool.name,
|
|
85
|
+
provider: tool.provider
|
|
86
|
+
})
|
|
87
|
+
),
|
|
88
|
+
enabledByDefault: resolvedDefaultEnabledTools.some(
|
|
89
|
+
(defaultTool) => areSameTools(defaultTool, {
|
|
90
|
+
name: tool.name,
|
|
91
|
+
provider: tool.provider
|
|
92
|
+
})
|
|
93
|
+
)
|
|
27
94
|
}));
|
|
28
|
-
return
|
|
95
|
+
return availableUserTools;
|
|
29
96
|
};
|
|
30
97
|
const getPrincipalTools = async ({
|
|
31
98
|
credentials,
|
|
@@ -36,8 +103,19 @@ const createToolsService = async ({
|
|
|
36
103
|
return tools$1.filter(filter).map((t) => new tools.DynamicStructuredTool(t));
|
|
37
104
|
}
|
|
38
105
|
const mcpTools = await mcp.getTools(credentials);
|
|
39
|
-
const
|
|
40
|
-
const
|
|
106
|
+
const availableTools = uniqTools(tools$1.concat(mcpTools).concat(coreTools));
|
|
107
|
+
const resolvedCoreTools = resolveCoreTools(availableTools);
|
|
108
|
+
const userSelectableTools = availableTools.filter(
|
|
109
|
+
(tool) => !resolvedCoreTools.some(
|
|
110
|
+
(coreTool) => areSameTools(coreTool, {
|
|
111
|
+
name: tool.name,
|
|
112
|
+
provider: tool.provider
|
|
113
|
+
})
|
|
114
|
+
)
|
|
115
|
+
);
|
|
116
|
+
const allTools = uniqTools(
|
|
117
|
+
userSelectableTools.filter(filter).concat(resolvedCoreTools)
|
|
118
|
+
);
|
|
41
119
|
return allTools.map((t) => new tools.DynamicStructuredTool(t));
|
|
42
120
|
};
|
|
43
121
|
return {
|
|
@@ -53,7 +131,8 @@ const toolsServiceRef = backendPluginApi.createServiceRef({
|
|
|
53
131
|
service,
|
|
54
132
|
deps: {
|
|
55
133
|
mcp: index.mcpServiceRef,
|
|
56
|
-
auth: backendPluginApi.coreServices.auth
|
|
134
|
+
auth: backendPluginApi.coreServices.auth,
|
|
135
|
+
config: backendPluginApi.coreServices.rootConfig
|
|
57
136
|
},
|
|
58
137
|
factory: async (options) => {
|
|
59
138
|
return createToolsService(options);
|
|
@@ -1 +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
|
+
{"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 RootConfigService,\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 config: RootConfigService;\n};\n\ntype ToolSelector = Pick<EnabledTool, 'name' | 'provider'>;\n\nconst createToolsService = async ({\n mcp,\n auth,\n config,\n}: CreateToolsServiceOptions): Promise<ToolsService> => {\n const tools: Tool[] = [];\n const coreTools: Tool[] = [];\n\n const areSameTools = (left: ToolSelector, right: ToolSelector) =>\n left.name === right.name && left.provider === right.provider;\n\n const getConfiguredTools = (path: string): ToolSelector[] | undefined => {\n const configuredTools = config.getOptionalConfigArray(path);\n\n if (!configuredTools) {\n return undefined;\n }\n\n return configuredTools.map(tool => ({\n name: tool.getString('name'),\n provider: tool.getString('provider'),\n }));\n };\n\n const uniqTools = (allTools: Tool[]): Tool[] => {\n const toolMap = new Map(\n allTools.map(tool => [`${tool.provider}:${tool.name}`, tool]),\n );\n\n return Array.from(toolMap.values());\n };\n\n const resolveCoreTools = (allTools: Tool[]): Tool[] => {\n const configuredCoreTools = getConfiguredTools('aiAssistant.tools.core');\n\n if (configuredCoreTools === undefined) {\n return coreTools;\n }\n\n return allTools.filter(tool =>\n configuredCoreTools.some(configuredTool =>\n areSameTools(configuredTool, {\n name: tool.name,\n provider: tool.provider,\n }),\n ),\n );\n };\n\n const resolveDefaultEnabledTools = (\n allTools: Tool[],\n resolvedCore: Tool[],\n ) => {\n const configuredDefaultTools = getConfiguredTools(\n 'aiAssistant.tools.defaultEnabled',\n );\n\n if (configuredDefaultTools === undefined) {\n return resolvedCore;\n }\n\n const resolvedConfiguredDefaultTools = allTools.filter(tool =>\n configuredDefaultTools.some(configuredTool =>\n areSameTools(configuredTool, {\n name: tool.name,\n provider: tool.provider,\n }),\n ),\n );\n\n return uniqTools(resolvedConfiguredDefaultTools.concat(resolvedCore));\n };\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 = uniqTools(tools.concat(mcpTools).concat(coreTools));\n\n const resolvedCoreTools = resolveCoreTools(availableTools);\n const resolvedDefaultEnabledTools = resolveDefaultEnabledTools(\n availableTools,\n resolvedCoreTools,\n );\n\n const availableUserTools: EnabledTool[] = availableTools.map(tool => ({\n name: tool.name,\n provider: tool.provider,\n description: tool.description,\n isCore: resolvedCoreTools.some(coreTool =>\n areSameTools(coreTool, {\n name: tool.name,\n provider: tool.provider,\n }),\n ),\n enabledByDefault: resolvedDefaultEnabledTools.some(defaultTool =>\n areSameTools(defaultTool, {\n name: tool.name,\n provider: tool.provider,\n }),\n ),\n }));\n\n return availableUserTools;\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 availableTools = uniqTools(tools.concat(mcpTools).concat(coreTools));\n const resolvedCoreTools = resolveCoreTools(availableTools);\n\n const userSelectableTools = availableTools.filter(\n tool =>\n !resolvedCoreTools.some(coreTool =>\n areSameTools(coreTool, {\n name: tool.name,\n provider: tool.provider,\n }),\n ),\n );\n\n const allTools: Tool[] = uniqTools(\n userSelectableTools.filter(filter).concat(resolvedCoreTools),\n );\n\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 config: coreServices.rootConfig,\n },\n factory: async options => {\n return createToolsService(options);\n },\n }),\n });\n"],"names":["tools","DynamicStructuredTool","createServiceRef","createServiceFactory","mcpServiceRef","coreServices"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sweetoburrito/backstage-plugin-ai-assistant-backend",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"main": "dist/index.cjs.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
"@langchain/core": "^1.1.19",
|
|
43
43
|
"@langchain/mcp-adapters": "^1.1.2",
|
|
44
44
|
"@langchain/textsplitters": "^1.0.1",
|
|
45
|
-
"@sweetoburrito/backstage-plugin-ai-assistant-common": "^0.
|
|
46
|
-
"@sweetoburrito/backstage-plugin-ai-assistant-node": "^0.11.
|
|
45
|
+
"@sweetoburrito/backstage-plugin-ai-assistant-common": "^0.10.0",
|
|
46
|
+
"@sweetoburrito/backstage-plugin-ai-assistant-node": "^0.11.1",
|
|
47
47
|
"express": "^4.17.1",
|
|
48
48
|
"express-promise-router": "^4.1.0",
|
|
49
49
|
"knex": "^3.1.0",
|