From 7e02c64f838c33b4c1ed86ab2883cd4aea99953e Mon Sep 17 00:00:00 2001 From: aubreyquinn Date: Wed, 25 Mar 2026 17:18:52 +0000 Subject: [PATCH 1/6] ci: scope CI jobs by changed language directory using path filters Add dorny/paths-filter to ci-orchestrator.yml so dotnet/nodejs/python jobs only run when files in their respective directories change. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/ci-orchestrator.yml | 230 +++++++++++++++----------- 1 file changed, 138 insertions(+), 92 deletions(-) diff --git a/.github/workflows/ci-orchestrator.yml b/.github/workflows/ci-orchestrator.yml index 77950af1..5233a4ca 100644 --- a/.github/workflows/ci-orchestrator.yml +++ b/.github/workflows/ci-orchestrator.yml @@ -1,92 +1,138 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -name: CI Orchestrator - -on: - push: - branches: [main, master] - pull_request: - branches: [main, master] - -permissions: - contents: read - -jobs: - # .NET Jobs - Call existing workflows - dotnet-agentframework: - name: .NET Agent Framework - uses: ./.github/workflows/ci-dotnet-agentframework-sampleagent.yml - - dotnet-semantickernel: - name: .NET Semantic Kernel - uses: ./.github/workflows/ci-dotnet-semantickernel-sampleagent.yml - - # Node.js Jobs - Call existing workflows - nodejs-claude: - name: Node.js Claude - uses: ./.github/workflows/ci-nodejs-claude-sampleagent.yml - - nodejs-langchain: - name: Node.js LangChain - uses: ./.github/workflows/ci-nodejs-langchain-sampleagent.yml - - nodejs-openai: - name: Node.js OpenAI - uses: ./.github/workflows/ci-nodejs-openai-sampleagent.yml - - nodejs-vercelsdk: - name: Node.js Vercel SDK - uses: ./.github/workflows/ci-nodejs-vercelsdk-sampleagent.yml - - # Python Jobs - Call existing workflows - python-agentframework: - name: Python Agent Framework - uses: ./.github/workflows/ci-python-agentframework-sampleagent.yml - - python-googleadk: - name: Python Google ADK - uses: ./.github/workflows/ci-python-googleadk-sampleagent.yml - - python-openai: - name: Python OpenAI - uses: ./.github/workflows/ci-python-openai-sampleagent.yml - - python-claude: - name: Python Claude - uses: ./.github/workflows/python-claude-sample.yml - - # Final status check - ALWAYS runs and reports success - # This is the ONLY check you need to mark as "Required" in branch protection - ci-status: - name: CI Status - runs-on: ubuntu-latest - needs: - - dotnet-agentframework - - dotnet-semantickernel - - nodejs-claude - - nodejs-langchain - - nodejs-openai - - nodejs-vercelsdk - - python-agentframework - - python-googleadk - - python-openai - - python-claude - if: always() - steps: - - name: Check CI Status - run: | - echo "Checking CI job results..." - - # Get all job results (skipped jobs are fine, failed jobs are not) - results="${{ needs.dotnet-agentframework.result }} ${{ needs.dotnet-semantickernel.result }} ${{ needs.nodejs-claude.result }} ${{ needs.nodejs-langchain.result }} ${{ needs.nodejs-openai.result }} ${{ needs.nodejs-vercelsdk.result }} ${{ needs.python-agentframework.result }} ${{ needs.python-googleadk.result }} ${{ needs.python-openai.result }} ${{ needs.python-claude.result }}" - - echo "Job results: $results" - - # Check if any job failed or was cancelled - if echo "$results" | grep -qE "failure|cancelled"; then - echo "❌ One or more CI jobs failed or were cancelled" - exit 1 - fi - - echo "✅ All CI jobs passed" +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +name: CI Orchestrator + +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + +permissions: + contents: read + pull-requests: read + +jobs: + # Detect which language directories changed + changes: + name: Detect Changes + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: read + outputs: + dotnet: ${{ steps.filter.outputs.dotnet }} + nodejs: ${{ steps.filter.outputs.nodejs }} + python: ${{ steps.filter.outputs.python }} + steps: + - uses: actions/checkout@v4 + - uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + dotnet: + - 'dotnet/**' + nodejs: + - 'nodejs/**' + python: + - 'python/**' + + # .NET Jobs - Call existing workflows + dotnet-agentframework: + name: .NET Agent Framework + needs: changes + if: needs.changes.outputs.dotnet == 'true' + uses: ./.github/workflows/ci-dotnet-agentframework-sampleagent.yml + + dotnet-semantickernel: + name: .NET Semantic Kernel + needs: changes + if: needs.changes.outputs.dotnet == 'true' + uses: ./.github/workflows/ci-dotnet-semantickernel-sampleagent.yml + + # Node.js Jobs - Call existing workflows + nodejs-claude: + name: Node.js Claude + needs: changes + if: needs.changes.outputs.nodejs == 'true' + uses: ./.github/workflows/ci-nodejs-claude-sampleagent.yml + + nodejs-langchain: + name: Node.js LangChain + needs: changes + if: needs.changes.outputs.nodejs == 'true' + uses: ./.github/workflows/ci-nodejs-langchain-sampleagent.yml + + nodejs-openai: + name: Node.js OpenAI + needs: changes + if: needs.changes.outputs.nodejs == 'true' + uses: ./.github/workflows/ci-nodejs-openai-sampleagent.yml + + nodejs-vercelsdk: + name: Node.js Vercel SDK + needs: changes + if: needs.changes.outputs.nodejs == 'true' + uses: ./.github/workflows/ci-nodejs-vercelsdk-sampleagent.yml + + # Python Jobs - Call existing workflows + python-agentframework: + name: Python Agent Framework + needs: changes + if: needs.changes.outputs.python == 'true' + uses: ./.github/workflows/ci-python-agentframework-sampleagent.yml + + python-googleadk: + name: Python Google ADK + needs: changes + if: needs.changes.outputs.python == 'true' + uses: ./.github/workflows/ci-python-googleadk-sampleagent.yml + + python-openai: + name: Python OpenAI + needs: changes + if: needs.changes.outputs.python == 'true' + uses: ./.github/workflows/ci-python-openai-sampleagent.yml + + python-claude: + name: Python Claude + needs: changes + if: needs.changes.outputs.python == 'true' + uses: ./.github/workflows/python-claude-sample.yml + + # Final status check - ALWAYS runs and reports success + # This is the ONLY check you need to mark as "Required" in branch protection + ci-status: + name: CI Status + runs-on: ubuntu-latest + needs: + - changes + - dotnet-agentframework + - dotnet-semantickernel + - nodejs-claude + - nodejs-langchain + - nodejs-openai + - nodejs-vercelsdk + - python-agentframework + - python-googleadk + - python-openai + - python-claude + if: always() + steps: + - name: Check CI Status + run: | + echo "Checking CI job results..." + + # Get all job results (skipped jobs are fine, failed jobs are not) + results="${{ needs.dotnet-agentframework.result }} ${{ needs.dotnet-semantickernel.result }} ${{ needs.nodejs-claude.result }} ${{ needs.nodejs-langchain.result }} ${{ needs.nodejs-openai.result }} ${{ needs.nodejs-vercelsdk.result }} ${{ needs.python-agentframework.result }} ${{ needs.python-googleadk.result }} ${{ needs.python-openai.result }} ${{ needs.python-claude.result }}" + + echo "Job results: $results" + + # Check if any job failed or was cancelled + if echo "$results" | grep -qE "failure|cancelled"; then + echo "❌ One or more CI jobs failed or were cancelled" + exit 1 + fi + + echo "✅ All CI jobs passed" From 70d87dc35c3869139095c7fd1ffaf703dae131a8 Mon Sep 17 00:00:00 2001 From: aubreyquinn Date: Wed, 25 Mar 2026 17:25:14 +0000 Subject: [PATCH 2/6] fix: remove correlationId calls not present on BaggageBuilder correlationId does not exist on the BaggageBuilder type. Remove the calls from all affected nodejs sample agents. Co-Authored-By: Claude Sonnet 4.6 --- nodejs/claude/sample-agent/src/agent.ts | 1 - nodejs/copilot-studio/sample-agent/src/agent.ts | 1 - nodejs/devin/sample-agent/src/agent.ts | 2 -- nodejs/langchain/sample-agent/src/agent.ts | 1 - nodejs/openai/sample-agent/src/agent.ts | 1 - nodejs/perplexity/sample-agent/src/agent.ts | 1 - 6 files changed, 7 deletions(-) diff --git a/nodejs/claude/sample-agent/src/agent.ts b/nodejs/claude/sample-agent/src/agent.ts index f5d3ef80..f4b47c17 100644 --- a/nodejs/claude/sample-agent/src/agent.ts +++ b/nodejs/claude/sample-agent/src/agent.ts @@ -85,7 +85,6 @@ export class MyAgent extends AgentApplication { new BaggageBuilder(), turnContext ).sessionDescription('Initial onboarding session') - .correlationId("7ff6dca0-917c-4bb0-b31a-794e533d8aad") .build(); // Preload/refresh exporter token diff --git a/nodejs/copilot-studio/sample-agent/src/agent.ts b/nodejs/copilot-studio/sample-agent/src/agent.ts index 3c7c046f..aed00bde 100644 --- a/nodejs/copilot-studio/sample-agent/src/agent.ts +++ b/nodejs/copilot-studio/sample-agent/src/agent.ts @@ -88,7 +88,6 @@ export class MyAgent extends AgentApplication { new BaggageBuilder(), turnContext ).sessionDescription('Copilot Studio integration session') - .correlationId(`corr-${Date.now()}`) .build(); // Preload/refresh exporter token diff --git a/nodejs/devin/sample-agent/src/agent.ts b/nodejs/devin/sample-agent/src/agent.ts index 346db544..6c1db646 100644 --- a/nodejs/devin/sample-agent/src/agent.ts +++ b/nodejs/devin/sample-agent/src/agent.ts @@ -27,7 +27,6 @@ import { createEmailResponseActivity, } from "@microsoft/agents-a365-notifications"; import { Stream } from "stream"; -import { v4 as uuidv4 } from "uuid"; import { devinClient } from "./devin-client"; import tokenCache from "./token-cache"; import { ApplicationTurnState } from "./types/agent.types"; @@ -93,7 +92,6 @@ export class A365Agent extends AgentApplication { const baggageScope = new BaggageBuilder() .tenantId(tenantDetails.tenantId) .agentId(invokeAgentDetails.agentId) - .correlationId(uuidv4()) .agentName(invokeAgentDetails.agentName) .conversationId(context.activity.conversation?.id) .build(); diff --git a/nodejs/langchain/sample-agent/src/agent.ts b/nodejs/langchain/sample-agent/src/agent.ts index a00b9cb1..58defd08 100644 --- a/nodejs/langchain/sample-agent/src/agent.ts +++ b/nodejs/langchain/sample-agent/src/agent.ts @@ -80,7 +80,6 @@ export class A365Agent extends AgentApplication { new BaggageBuilder(), turnContext ).sessionDescription('Initial onboarding session') - .correlationId(`corr-${Date.now()}`) .build(); // Preload/refresh exporter token diff --git a/nodejs/openai/sample-agent/src/agent.ts b/nodejs/openai/sample-agent/src/agent.ts index ab66409a..38a66892 100644 --- a/nodejs/openai/sample-agent/src/agent.ts +++ b/nodejs/openai/sample-agent/src/agent.ts @@ -90,7 +90,6 @@ export class MyAgent extends AgentApplication { new BaggageBuilder(), turnContext ).sessionDescription('Initial onboarding session') - .correlationId("7ff6dca0-917c-4bb0-b31a-794e533d8aad") .build(); // Preloads or refreshes the Observability token used by the Agent 365 Observability exporter. diff --git a/nodejs/perplexity/sample-agent/src/agent.ts b/nodejs/perplexity/sample-agent/src/agent.ts index 05ac3498..69f44ef8 100644 --- a/nodejs/perplexity/sample-agent/src/agent.ts +++ b/nodejs/perplexity/sample-agent/src/agent.ts @@ -232,7 +232,6 @@ app.onActivity(ActivityTypes.Message, async (context) => { const baggageScope = new BaggageBuilder() .tenantId(tenantId) .agentId(agentId) - .correlationId(activityId || `corr-${Date.now()}`) .agentName(agentName) .agentDescription( "AI answer engine for research, writing, and task assistance using live web search and citations", From 8d76376fa7b5dfe884de461b585a40fcfc397287 Mon Sep 17 00:00:00 2001 From: aubreyquinn Date: Wed, 25 Mar 2026 17:27:36 +0000 Subject: [PATCH 3/6] fix: replace correlationId with sessionId using activity ID correlationId does not exist on BaggageBuilder. Replace with sessionId using the Bot Framework activity ID, which is the unique per-turn identifier and serves as the natural correlation ID for tracing. Co-Authored-By: Claude Sonnet 4.6 --- nodejs/claude/sample-agent/src/agent.ts | 1 + nodejs/copilot-studio/sample-agent/src/agent.ts | 1 + nodejs/devin/sample-agent/src/agent.ts | 1 + nodejs/langchain/sample-agent/src/agent.ts | 1 + nodejs/openai/sample-agent/src/agent.ts | 1 + nodejs/perplexity/sample-agent/src/agent.ts | 1 + 6 files changed, 6 insertions(+) diff --git a/nodejs/claude/sample-agent/src/agent.ts b/nodejs/claude/sample-agent/src/agent.ts index f4b47c17..02607aad 100644 --- a/nodejs/claude/sample-agent/src/agent.ts +++ b/nodejs/claude/sample-agent/src/agent.ts @@ -85,6 +85,7 @@ export class MyAgent extends AgentApplication { new BaggageBuilder(), turnContext ).sessionDescription('Initial onboarding session') + .sessionId(turnContext.activity.id) .build(); // Preload/refresh exporter token diff --git a/nodejs/copilot-studio/sample-agent/src/agent.ts b/nodejs/copilot-studio/sample-agent/src/agent.ts index aed00bde..c457d1ca 100644 --- a/nodejs/copilot-studio/sample-agent/src/agent.ts +++ b/nodejs/copilot-studio/sample-agent/src/agent.ts @@ -88,6 +88,7 @@ export class MyAgent extends AgentApplication { new BaggageBuilder(), turnContext ).sessionDescription('Copilot Studio integration session') + .sessionId(turnContext.activity.id) .build(); // Preload/refresh exporter token diff --git a/nodejs/devin/sample-agent/src/agent.ts b/nodejs/devin/sample-agent/src/agent.ts index 6c1db646..78c79471 100644 --- a/nodejs/devin/sample-agent/src/agent.ts +++ b/nodejs/devin/sample-agent/src/agent.ts @@ -92,6 +92,7 @@ export class A365Agent extends AgentApplication { const baggageScope = new BaggageBuilder() .tenantId(tenantDetails.tenantId) .agentId(invokeAgentDetails.agentId) + .sessionId(context.activity.id) .agentName(invokeAgentDetails.agentName) .conversationId(context.activity.conversation?.id) .build(); diff --git a/nodejs/langchain/sample-agent/src/agent.ts b/nodejs/langchain/sample-agent/src/agent.ts index 58defd08..5208ab1f 100644 --- a/nodejs/langchain/sample-agent/src/agent.ts +++ b/nodejs/langchain/sample-agent/src/agent.ts @@ -80,6 +80,7 @@ export class A365Agent extends AgentApplication { new BaggageBuilder(), turnContext ).sessionDescription('Initial onboarding session') + .sessionId(turnContext.activity.id) .build(); // Preload/refresh exporter token diff --git a/nodejs/openai/sample-agent/src/agent.ts b/nodejs/openai/sample-agent/src/agent.ts index 38a66892..10e135b8 100644 --- a/nodejs/openai/sample-agent/src/agent.ts +++ b/nodejs/openai/sample-agent/src/agent.ts @@ -90,6 +90,7 @@ export class MyAgent extends AgentApplication { new BaggageBuilder(), turnContext ).sessionDescription('Initial onboarding session') + .sessionId(turnContext.activity.id) .build(); // Preloads or refreshes the Observability token used by the Agent 365 Observability exporter. diff --git a/nodejs/perplexity/sample-agent/src/agent.ts b/nodejs/perplexity/sample-agent/src/agent.ts index 69f44ef8..dfe6d640 100644 --- a/nodejs/perplexity/sample-agent/src/agent.ts +++ b/nodejs/perplexity/sample-agent/src/agent.ts @@ -232,6 +232,7 @@ app.onActivity(ActivityTypes.Message, async (context) => { const baggageScope = new BaggageBuilder() .tenantId(tenantId) .agentId(agentId) + .sessionId(activityId) .agentName(agentName) .agentDescription( "AI answer engine for research, writing, and task assistance using live web search and citations", From 8f29ba533271e0c77fb51c17d0b3389b53464f14 Mon Sep 17 00:00:00 2001 From: aubreyquinn Date: Wed, 25 Mar 2026 17:29:03 +0000 Subject: [PATCH 4/6] fix: use setPairs to set correlationId baggage from activity ID Co-Authored-By: Claude Sonnet 4.6 --- nodejs/claude/sample-agent/src/agent.ts | 2 +- nodejs/copilot-studio/sample-agent/src/agent.ts | 2 +- nodejs/devin/sample-agent/src/agent.ts | 2 +- nodejs/langchain/sample-agent/src/agent.ts | 2 +- nodejs/openai/sample-agent/src/agent.ts | 2 +- nodejs/perplexity/sample-agent/src/agent.ts | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/nodejs/claude/sample-agent/src/agent.ts b/nodejs/claude/sample-agent/src/agent.ts index 02607aad..6d3355c0 100644 --- a/nodejs/claude/sample-agent/src/agent.ts +++ b/nodejs/claude/sample-agent/src/agent.ts @@ -85,7 +85,7 @@ export class MyAgent extends AgentApplication { new BaggageBuilder(), turnContext ).sessionDescription('Initial onboarding session') - .sessionId(turnContext.activity.id) + .setPairs({ correlationId: turnContext.activity.id }) .build(); // Preload/refresh exporter token diff --git a/nodejs/copilot-studio/sample-agent/src/agent.ts b/nodejs/copilot-studio/sample-agent/src/agent.ts index c457d1ca..a05bdd95 100644 --- a/nodejs/copilot-studio/sample-agent/src/agent.ts +++ b/nodejs/copilot-studio/sample-agent/src/agent.ts @@ -88,7 +88,7 @@ export class MyAgent extends AgentApplication { new BaggageBuilder(), turnContext ).sessionDescription('Copilot Studio integration session') - .sessionId(turnContext.activity.id) + .setPairs({ correlationId: turnContext.activity.id }) .build(); // Preload/refresh exporter token diff --git a/nodejs/devin/sample-agent/src/agent.ts b/nodejs/devin/sample-agent/src/agent.ts index 78c79471..fa62ad40 100644 --- a/nodejs/devin/sample-agent/src/agent.ts +++ b/nodejs/devin/sample-agent/src/agent.ts @@ -92,7 +92,7 @@ export class A365Agent extends AgentApplication { const baggageScope = new BaggageBuilder() .tenantId(tenantDetails.tenantId) .agentId(invokeAgentDetails.agentId) - .sessionId(context.activity.id) + .setPairs({ correlationId: context.activity.id }) .agentName(invokeAgentDetails.agentName) .conversationId(context.activity.conversation?.id) .build(); diff --git a/nodejs/langchain/sample-agent/src/agent.ts b/nodejs/langchain/sample-agent/src/agent.ts index 5208ab1f..5440841c 100644 --- a/nodejs/langchain/sample-agent/src/agent.ts +++ b/nodejs/langchain/sample-agent/src/agent.ts @@ -80,7 +80,7 @@ export class A365Agent extends AgentApplication { new BaggageBuilder(), turnContext ).sessionDescription('Initial onboarding session') - .sessionId(turnContext.activity.id) + .setPairs({ correlationId: turnContext.activity.id }) .build(); // Preload/refresh exporter token diff --git a/nodejs/openai/sample-agent/src/agent.ts b/nodejs/openai/sample-agent/src/agent.ts index 10e135b8..aed92420 100644 --- a/nodejs/openai/sample-agent/src/agent.ts +++ b/nodejs/openai/sample-agent/src/agent.ts @@ -90,7 +90,7 @@ export class MyAgent extends AgentApplication { new BaggageBuilder(), turnContext ).sessionDescription('Initial onboarding session') - .sessionId(turnContext.activity.id) + .setPairs({ correlationId: turnContext.activity.id }) .build(); // Preloads or refreshes the Observability token used by the Agent 365 Observability exporter. diff --git a/nodejs/perplexity/sample-agent/src/agent.ts b/nodejs/perplexity/sample-agent/src/agent.ts index dfe6d640..db9823b5 100644 --- a/nodejs/perplexity/sample-agent/src/agent.ts +++ b/nodejs/perplexity/sample-agent/src/agent.ts @@ -232,7 +232,7 @@ app.onActivity(ActivityTypes.Message, async (context) => { const baggageScope = new BaggageBuilder() .tenantId(tenantId) .agentId(agentId) - .sessionId(activityId) + .setPairs({ correlationId: activityId }) .agentName(agentName) .agentDescription( "AI answer engine for research, writing, and task assistance using live web search and citations", From 01deea04722783fac9c3ed0f78b1b7f4a6b1f49e Mon Sep 17 00:00:00 2001 From: aubreyquinn Date: Wed, 25 Mar 2026 17:32:02 +0000 Subject: [PATCH 5/6] fix: replace callerId/callerName with userId/userName on BaggageBuilder callerId and callerName do not exist on BaggageBuilder. Replace with userId and userName which map to activity.from.id and activity.from.name. Co-Authored-By: Claude Sonnet 4.6 --- nodejs/perplexity/sample-agent/src/agent.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodejs/perplexity/sample-agent/src/agent.ts b/nodejs/perplexity/sample-agent/src/agent.ts index db9823b5..09727a1f 100644 --- a/nodejs/perplexity/sample-agent/src/agent.ts +++ b/nodejs/perplexity/sample-agent/src/agent.ts @@ -237,8 +237,8 @@ app.onActivity(ActivityTypes.Message, async (context) => { .agentDescription( "AI answer engine for research, writing, and task assistance using live web search and citations", ) - .callerId(userId) - .callerName(userName) + .userId(userId) + .userName(userName) .conversationId(conversationId) .operationSource("sdk") .build(); From 62843847d562181511f60cbac598c8c7e165aa78 Mon Sep 17 00:00:00 2001 From: aubreyquinn Date: Wed, 25 Mar 2026 17:37:17 +0000 Subject: [PATCH 6/6] fix: replace recordResponseId with recordAttributes on InferenceScope recordResponseId does not exist on InferenceScope. Replace with recordAttributes using the gen_ai.response.id semantic convention key. Co-Authored-By: Claude Sonnet 4.6 --- nodejs/claude/sample-agent/src/client.ts | 2 +- nodejs/copilot-studio/sample-agent/src/client.ts | 2 +- nodejs/langchain/sample-agent/src/client.ts | 2 +- nodejs/openai/sample-agent/src/client.ts | 2 +- nodejs/vercel-sdk/sample-agent/src/client.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/nodejs/claude/sample-agent/src/client.ts b/nodejs/claude/sample-agent/src/client.ts index 88b6c341..681eaa76 100644 --- a/nodejs/claude/sample-agent/src/client.ts +++ b/nodejs/claude/sample-agent/src/client.ts @@ -158,7 +158,7 @@ class ClaudeClient implements Client { // Record the inference response with token usage scope?.recordOutputMessages([response]); scope?.recordInputMessages([prompt]); - scope?.recordResponseId(`resp-${Date.now()}`); + scope?.recordAttributes({ 'gen_ai.response.id': `resp-${Date.now()}` }); scope?.recordInputTokens(45); scope?.recordOutputTokens(78); scope?.recordFinishReasons(['stop']); diff --git a/nodejs/copilot-studio/sample-agent/src/client.ts b/nodejs/copilot-studio/sample-agent/src/client.ts index 3b1942a7..dd308734 100644 --- a/nodejs/copilot-studio/sample-agent/src/client.ts +++ b/nodejs/copilot-studio/sample-agent/src/client.ts @@ -149,7 +149,7 @@ class McsClient implements Client { // Record the inference telemetry scope.recordInputMessages([prompt]); scope.recordOutputMessages([response]); - scope.recordResponseId(`resp-${Date.now()}`); + scope.recordAttributes({ 'gen_ai.response.id': `resp-${Date.now()}` }); scope.recordFinishReasons(['stop']); }); } catch (error) { diff --git a/nodejs/langchain/sample-agent/src/client.ts b/nodejs/langchain/sample-agent/src/client.ts index fab36352..e0bbbf61 100644 --- a/nodejs/langchain/sample-agent/src/client.ts +++ b/nodejs/langchain/sample-agent/src/client.ts @@ -227,7 +227,7 @@ class LangChainClient implements Client { // Record the inference response with token usage scope.recordOutputMessages([response]); scope.recordInputMessages([prompt]); - scope.recordResponseId(`resp-${Date.now()}`); + scope.recordAttributes({ 'gen_ai.response.id': `resp-${Date.now()}` }); scope.recordInputTokens(45); scope.recordOutputTokens(78); scope.recordFinishReasons(['stop']); diff --git a/nodejs/openai/sample-agent/src/client.ts b/nodejs/openai/sample-agent/src/client.ts index 37b7b2b1..67d4e45a 100644 --- a/nodejs/openai/sample-agent/src/client.ts +++ b/nodejs/openai/sample-agent/src/client.ts @@ -166,7 +166,7 @@ class OpenAIClient implements Client { // Record the inference response with token usage scope.recordOutputMessages([response]); scope.recordInputMessages([prompt]); - scope.recordResponseId(`resp-${Date.now()}`); + scope.recordAttributes({ 'gen_ai.response.id': `resp-${Date.now()}` }); scope.recordInputTokens(45); scope.recordOutputTokens(78); scope.recordFinishReasons(['stop']); diff --git a/nodejs/vercel-sdk/sample-agent/src/client.ts b/nodejs/vercel-sdk/sample-agent/src/client.ts index a0a42c15..2e4f8ab1 100644 --- a/nodejs/vercel-sdk/sample-agent/src/client.ts +++ b/nodejs/vercel-sdk/sample-agent/src/client.ts @@ -122,7 +122,7 @@ class VercelAiClient implements Client { response = await this.invokeAgent(prompt); scope.recordOutputMessages([response]); scope.recordInputMessages([prompt]); - scope.recordResponseId(`resp-${Date.now()}`); + scope.recordAttributes({ 'gen_ai.response.id': `resp-${Date.now()}` }); scope.recordInputTokens(45); scope.recordOutputTokens(78); scope.recordFinishReasons(['stop']);