@sweetoburrito/backstage-plugin-ai-assistant-backend-module-callback-provider-langfuse 0.0.0-snapshot-20251113134620 → 0.0.0-snapshot-20251114135736

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.
@@ -5,15 +5,17 @@ var otel = require('@langfuse/otel');
5
5
  var sdkNode = require('@opentelemetry/sdk-node');
6
6
  var langchain = require('@langfuse/langchain');
7
7
  var backstagePluginAiAssistantNode = require('@sweetoburrito/backstage-plugin-ai-assistant-node');
8
+ var client = require('@langfuse/client');
8
9
 
10
+ const MODULE_ID = "callback-provider-langfuse";
9
11
  const aiAssistantModuleCallbackProviderLangfuse = backendPluginApi.createBackendModule({
10
12
  pluginId: "ai-assistant",
11
- moduleId: "callback-provider-langfuse",
13
+ moduleId: MODULE_ID,
12
14
  register(reg) {
13
15
  reg.registerInit({
14
16
  deps: {
15
17
  config: backendPluginApi.coreServices.rootConfig,
16
- callbackProvider: backstagePluginAiAssistantNode.callbackFactoryExtensionPoint
18
+ callbackProvider: backstagePluginAiAssistantNode.callbackProviderExtensionPoint
17
19
  },
18
20
  async init({ config, callbackProvider }) {
19
21
  const secretKey = config.getString(
@@ -34,22 +36,42 @@ const aiAssistantModuleCallbackProviderLangfuse = backendPluginApi.createBackend
34
36
  spanProcessors: [langfuseSpanProcessor]
35
37
  });
36
38
  sdk.start();
37
- callbackProvider.register(async (options) => {
38
- const { conversationId, userId, modelId } = options;
39
- const callback = new langchain.CallbackHandler({
39
+ const langfuseClient = new client.LangfuseClient({
40
+ secretKey,
41
+ publicKey,
42
+ baseUrl
43
+ });
44
+ const chainCallback = (options) => {
45
+ const { modelId, userId, conversationId } = options;
46
+ return new langchain.CallbackHandler({
40
47
  sessionId: conversationId,
41
48
  userId,
42
49
  tags: ["backstage-ai-assistant", "chat", modelId]
43
50
  });
44
- const metadata = {
51
+ };
52
+ const chainMetadataCallback = async (options) => {
53
+ const { modelId, userId, conversationId } = options;
54
+ return {
45
55
  langfuseUserId: userId,
46
56
  langfuseSessionId: conversationId,
47
57
  langfuseTags: ["ai-assistant", "chat", modelId]
48
58
  };
49
- return {
50
- callback,
51
- metadata
52
- };
59
+ };
60
+ const scoreCallback = async ({ name, message }) => {
61
+ if (!message.traceId) {
62
+ return;
63
+ }
64
+ langfuseClient.score.create({
65
+ traceId: message.traceId,
66
+ name,
67
+ value: message.score
68
+ });
69
+ };
70
+ callbackProvider.register({
71
+ id: MODULE_ID,
72
+ chainCallback,
73
+ chainMetadataCallback,
74
+ scoreCallback
53
75
  });
54
76
  }
55
77
  });
@@ -1 +1 @@
1
- {"version":3,"file":"module.cjs.js","sources":["../src/module.ts"],"sourcesContent":["import {\n coreServices,\n createBackendModule,\n} from '@backstage/backend-plugin-api';\nimport { LangfuseSpanProcessor } from '@langfuse/otel';\nimport { NodeSDK } from '@opentelemetry/sdk-node';\nimport { CallbackHandler } from '@langfuse/langchain';\nimport { callbackFactoryExtensionPoint } from '@sweetoburrito/backstage-plugin-ai-assistant-node';\n\nexport const aiAssistantModuleCallbackProviderLangfuse = createBackendModule({\n pluginId: 'ai-assistant',\n moduleId: 'callback-provider-langfuse',\n register(reg) {\n reg.registerInit({\n deps: {\n config: coreServices.rootConfig,\n callbackProvider: callbackFactoryExtensionPoint,\n },\n async init({ config, callbackProvider }) {\n const secretKey = config.getString(\n 'aiAssistant.callbacks.langfuse.secretKey',\n );\n const publicKey = config.getString(\n 'aiAssistant.callbacks.langfuse.publicKey',\n );\n const baseUrl = config.getString(\n 'aiAssistant.callbacks.langfuse.baseUrl',\n );\n\n const langfuseSpanProcessor = new LangfuseSpanProcessor({\n secretKey,\n publicKey,\n baseUrl,\n });\n\n const sdk = new NodeSDK({\n spanProcessors: [langfuseSpanProcessor],\n });\n\n sdk.start();\n\n callbackProvider.register(async options => {\n const { conversationId, userId, modelId } = options;\n const callback = new CallbackHandler({\n sessionId: conversationId,\n userId,\n tags: ['backstage-ai-assistant', 'chat', modelId],\n });\n\n const metadata = {\n langfuseUserId: userId,\n langfuseSessionId: conversationId,\n langfuseTags: ['ai-assistant', 'chat', modelId],\n };\n\n return {\n callback,\n metadata,\n };\n });\n },\n });\n },\n});\n"],"names":["createBackendModule","coreServices","callbackFactoryExtensionPoint","LangfuseSpanProcessor","NodeSDK","CallbackHandler"],"mappings":";;;;;;;;AASO,MAAM,4CAA4CA,oCAAA,CAAoB;AAAA,EAC3E,QAAA,EAAU,cAAA;AAAA,EACV,QAAA,EAAU,4BAAA;AAAA,EACV,SAAS,GAAA,EAAK;AACZ,IAAA,GAAA,CAAI,YAAA,CAAa;AAAA,MACf,IAAA,EAAM;AAAA,QACJ,QAAQC,6BAAA,CAAa,UAAA;AAAA,QACrB,gBAAA,EAAkBC;AAAA,OACpB;AAAA,MACA,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,kBAAiB,EAAG;AACvC,QAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AAAA,UACvB;AAAA,SACF;AACA,QAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AAAA,UACvB;AAAA,SACF;AACA,QAAA,MAAM,UAAU,MAAA,CAAO,SAAA;AAAA,UACrB;AAAA,SACF;AAEA,QAAA,MAAM,qBAAA,GAAwB,IAAIC,0BAAA,CAAsB;AAAA,UACtD,SAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,MAAM,GAAA,GAAM,IAAIC,eAAA,CAAQ;AAAA,UACtB,cAAA,EAAgB,CAAC,qBAAqB;AAAA,SACvC,CAAA;AAED,QAAA,GAAA,CAAI,KAAA,EAAM;AAEV,QAAA,gBAAA,CAAiB,QAAA,CAAS,OAAM,OAAA,KAAW;AACzC,UAAA,MAAM,EAAE,cAAA,EAAgB,MAAA,EAAQ,OAAA,EAAQ,GAAI,OAAA;AAC5C,UAAA,MAAM,QAAA,GAAW,IAAIC,yBAAA,CAAgB;AAAA,YACnC,SAAA,EAAW,cAAA;AAAA,YACX,MAAA;AAAA,YACA,IAAA,EAAM,CAAC,wBAAA,EAA0B,MAAA,EAAQ,OAAO;AAAA,WACjD,CAAA;AAED,UAAA,MAAM,QAAA,GAAW;AAAA,YACf,cAAA,EAAgB,MAAA;AAAA,YAChB,iBAAA,EAAmB,cAAA;AAAA,YACnB,YAAA,EAAc,CAAC,cAAA,EAAgB,MAAA,EAAQ,OAAO;AAAA,WAChD;AAEA,UAAA,OAAO;AAAA,YACL,QAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAC;;;;"}
1
+ {"version":3,"file":"module.cjs.js","sources":["../src/module.ts"],"sourcesContent":["import {\n coreServices,\n createBackendModule,\n} from '@backstage/backend-plugin-api';\nimport { LangfuseSpanProcessor } from '@langfuse/otel';\nimport { NodeSDK } from '@opentelemetry/sdk-node';\nimport { CallbackHandler } from '@langfuse/langchain';\nimport { callbackProviderExtensionPoint } from '@sweetoburrito/backstage-plugin-ai-assistant-node';\nimport type { CallbackProvider } from '@sweetoburrito/backstage-plugin-ai-assistant-node';\nimport { LangfuseClient } from '@langfuse/client';\n\nconst MODULE_ID = 'callback-provider-langfuse';\n\nexport const aiAssistantModuleCallbackProviderLangfuse = createBackendModule({\n pluginId: 'ai-assistant',\n moduleId: MODULE_ID,\n register(reg) {\n reg.registerInit({\n deps: {\n config: coreServices.rootConfig,\n callbackProvider: callbackProviderExtensionPoint,\n },\n async init({ config, callbackProvider }) {\n const secretKey = config.getString(\n 'aiAssistant.callbacks.langfuse.secretKey',\n );\n const publicKey = config.getString(\n 'aiAssistant.callbacks.langfuse.publicKey',\n );\n const baseUrl = config.getString(\n 'aiAssistant.callbacks.langfuse.baseUrl',\n );\n\n const langfuseSpanProcessor = new LangfuseSpanProcessor({\n secretKey,\n publicKey,\n baseUrl,\n });\n\n const sdk = new NodeSDK({\n spanProcessors: [langfuseSpanProcessor],\n });\n\n sdk.start();\n\n const langfuseClient = new LangfuseClient({\n secretKey,\n publicKey,\n baseUrl,\n });\n\n const chainCallback: NonNullable<\n CallbackProvider['chainCallback']\n > = options => {\n const { modelId, userId, conversationId } = options;\n\n return new CallbackHandler({\n sessionId: conversationId,\n userId,\n tags: ['backstage-ai-assistant', 'chat', modelId],\n });\n };\n\n const chainMetadataCallback: NonNullable<\n CallbackProvider['chainMetadataCallback']\n > = async options => {\n const { modelId, userId, conversationId } = options;\n return {\n langfuseUserId: userId,\n langfuseSessionId: conversationId,\n langfuseTags: ['ai-assistant', 'chat', modelId],\n };\n };\n\n const scoreCallback: NonNullable<\n CallbackProvider['scoreCallback']\n > = async ({ name, message }) => {\n if (!message.traceId) {\n return;\n }\n\n langfuseClient.score.create({\n traceId: message.traceId,\n name,\n value: message.score,\n });\n };\n\n callbackProvider.register({\n id: MODULE_ID,\n chainCallback,\n chainMetadataCallback,\n scoreCallback,\n });\n },\n });\n },\n});\n"],"names":["createBackendModule","coreServices","callbackProviderExtensionPoint","LangfuseSpanProcessor","NodeSDK","LangfuseClient","CallbackHandler"],"mappings":";;;;;;;;;AAWA,MAAM,SAAA,GAAY,4BAAA;AAEX,MAAM,4CAA4CA,oCAAA,CAAoB;AAAA,EAC3E,QAAA,EAAU,cAAA;AAAA,EACV,QAAA,EAAU,SAAA;AAAA,EACV,SAAS,GAAA,EAAK;AACZ,IAAA,GAAA,CAAI,YAAA,CAAa;AAAA,MACf,IAAA,EAAM;AAAA,QACJ,QAAQC,6BAAA,CAAa,UAAA;AAAA,QACrB,gBAAA,EAAkBC;AAAA,OACpB;AAAA,MACA,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,kBAAiB,EAAG;AACvC,QAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AAAA,UACvB;AAAA,SACF;AACA,QAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AAAA,UACvB;AAAA,SACF;AACA,QAAA,MAAM,UAAU,MAAA,CAAO,SAAA;AAAA,UACrB;AAAA,SACF;AAEA,QAAA,MAAM,qBAAA,GAAwB,IAAIC,0BAAA,CAAsB;AAAA,UACtD,SAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,MAAM,GAAA,GAAM,IAAIC,eAAA,CAAQ;AAAA,UACtB,cAAA,EAAgB,CAAC,qBAAqB;AAAA,SACvC,CAAA;AAED,QAAA,GAAA,CAAI,KAAA,EAAM;AAEV,QAAA,MAAM,cAAA,GAAiB,IAAIC,qBAAA,CAAe;AAAA,UACxC,SAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,MAAM,gBAEF,CAAA,OAAA,KAAW;AACb,UAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAe,GAAI,OAAA;AAE5C,UAAA,OAAO,IAAIC,yBAAA,CAAgB;AAAA,YACzB,SAAA,EAAW,cAAA;AAAA,YACX,MAAA;AAAA,YACA,IAAA,EAAM,CAAC,wBAAA,EAA0B,MAAA,EAAQ,OAAO;AAAA,WACjD,CAAA;AAAA,QACH,CAAA;AAEA,QAAA,MAAM,qBAAA,GAEF,OAAM,OAAA,KAAW;AACnB,UAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAe,GAAI,OAAA;AAC5C,UAAA,OAAO;AAAA,YACL,cAAA,EAAgB,MAAA;AAAA,YAChB,iBAAA,EAAmB,cAAA;AAAA,YACnB,YAAA,EAAc,CAAC,cAAA,EAAgB,MAAA,EAAQ,OAAO;AAAA,WAChD;AAAA,QACF,CAAA;AAEA,QAAA,MAAM,aAAA,GAEF,OAAO,EAAE,IAAA,EAAM,SAAQ,KAAM;AAC/B,UAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,YAAA;AAAA,UACF;AAEA,UAAA,cAAA,CAAe,MAAM,MAAA,CAAO;AAAA,YAC1B,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,IAAA;AAAA,YACA,OAAO,OAAA,CAAQ;AAAA,WAChB,CAAA;AAAA,QACH,CAAA;AAEA,QAAA,gBAAA,CAAiB,QAAA,CAAS;AAAA,UACxB,EAAA,EAAI,SAAA;AAAA,UACJ,aAAA;AAAA,UACA,qBAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAC;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sweetoburrito/backstage-plugin-ai-assistant-backend-module-callback-provider-langfuse",
3
- "version": "0.0.0-snapshot-20251113134620",
3
+ "version": "0.0.0-snapshot-20251114135736",
4
4
  "license": "Apache-2.0",
5
5
  "description": "The callback-provider-langfuse backend module for the ai-assistant plugin.",
6
6
  "main": "dist/index.cjs.js",
@@ -29,6 +29,7 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "@backstage/backend-plugin-api": "backstage:^",
32
+ "@langfuse/client": "^4.4.2",
32
33
  "@langfuse/langchain": "^4.4.2",
33
34
  "@langfuse/otel": "^4.4.2",
34
35
  "@opentelemetry/sdk-node": "^0.208.0",