From 617de4f43ebb99220a6b96702ecfd19a9f4633d9 Mon Sep 17 00:00:00 2001 From: Walter Luna Date: Mon, 17 Nov 2025 17:50:37 +0000 Subject: [PATCH 1/4] move agent types to its own file --- nodejs/devin/sample-agent/src/agent.ts | 12 +++--------- nodejs/devin/sample-agent/src/types/agent.types.ts | 7 +++++++ 2 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 nodejs/devin/sample-agent/src/types/agent.types.ts diff --git a/nodejs/devin/sample-agent/src/agent.ts b/nodejs/devin/sample-agent/src/agent.ts index 1874f2e2..7e9ee982 100644 --- a/nodejs/devin/sample-agent/src/agent.ts +++ b/nodejs/devin/sample-agent/src/agent.ts @@ -16,7 +16,6 @@ import { Activity, ActivityTypes } from "@microsoft/agents-activity"; import { AgentApplication, AgentApplicationOptions, - DefaultConversationState, MemoryStorage, TurnContext, TurnState, @@ -25,13 +24,9 @@ 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"; import { getAgentDetails, getTenantDetails } from "./utils"; -interface ConversationState extends DefaultConversationState { - count: number; -} -type ApplicationTurnState = TurnState; - export class A365Agent extends AgentApplication { isApplicationInstalled: boolean = false; agentName = "Devin Agent"; @@ -46,7 +41,7 @@ export class A365Agent extends AgentApplication { // Initialize Observability SDK const observabilitySDK = ObservabilityManager.configure((builder) => builder - .withService("claude-travel-agent", "1.0.0") + .withService("devin-sample-agent", "1.0.0") .withTokenResolver(async (agentId, tenantId) => { // Token resolver for authentication with Agent 365 observability console.log( @@ -174,6 +169,7 @@ export class A365Agent extends AgentApplication { agentDetails, tenantDetails ); + inferenceScope.recordInputMessages([userMessage]); let totalResponseLength = 0; const responseStream = new Stream() @@ -193,8 +189,6 @@ export class A365Agent extends AgentApplication { inferenceScope.recordFinishReasons(["stop"]); }); - inferenceScope.recordInputMessages([userMessage]); - await devinClient.invokeAgent(userMessage, responseStream); } catch (error) { invokeAgentScope.recordOutputMessages([`LLM error: ${error}`]); diff --git a/nodejs/devin/sample-agent/src/types/agent.types.ts b/nodejs/devin/sample-agent/src/types/agent.types.ts new file mode 100644 index 00000000..67f89658 --- /dev/null +++ b/nodejs/devin/sample-agent/src/types/agent.types.ts @@ -0,0 +1,7 @@ +import { DefaultConversationState, TurnState } from "@microsoft/agents-hosting"; + +interface ConversationState extends DefaultConversationState { + count: number; +} + +export type ApplicationTurnState = TurnState; From bd09601c9b0a36f38b00274ba71a6f163906dced Mon Sep 17 00:00:00 2001 From: Walter Luna Date: Mon, 17 Nov 2025 17:54:32 +0000 Subject: [PATCH 2/4] add new section on "deploying the agent" to devin agent's readme --- nodejs/devin/sample-agent/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/nodejs/devin/sample-agent/README.md b/nodejs/devin/sample-agent/README.md index 3e49431f..9481caf3 100644 --- a/nodejs/devin/sample-agent/README.md +++ b/nodejs/devin/sample-agent/README.md @@ -13,7 +13,7 @@ For comprehensive documentation and guidance on building agents with the Microso ## Prerequisites -- Node.js 18.x or higher +- Node.js 24.x or higher - Microsoft Agent 365 SDK - Devin API credentials @@ -21,6 +21,10 @@ For comprehensive documentation and guidance on building agents with the Microso To set up and test this agent, refer to the [Configure Agent Testing](https://learn.microsoft.com/en-us/microsoft-agent-365/developer/testing?tabs=nodejs) guide for complete instructions. +## Deploying the Agent + +Refer to the [Deploy and publish agents](https://learn.microsoft.com/en-us/microsoft-agent-365/developer/publish-deploy-agent?tabs=nodejs) guide for complete instructions. + ## Support For issues, questions, or feedback: From aa9055cf7997779773d56fe397b66b6bc8174a18 Mon Sep 17 00:00:00 2001 From: Walter Luna Date: Mon, 17 Nov 2025 18:06:46 +0000 Subject: [PATCH 3/4] add manifest sample to devin agent --- .../manifest/agenticUserTemplateManifest.json | 6 ++++ nodejs/devin/sample-agent/manifest/color.png | Bin 0 -> 6265 bytes .../devin/sample-agent/manifest/manifest.json | 32 ++++++++++++++++++ .../devin/sample-agent/manifest/outline.png | Bin 0 -> 742 bytes 4 files changed, 38 insertions(+) create mode 100644 nodejs/devin/sample-agent/manifest/agenticUserTemplateManifest.json create mode 100644 nodejs/devin/sample-agent/manifest/color.png create mode 100644 nodejs/devin/sample-agent/manifest/manifest.json create mode 100644 nodejs/devin/sample-agent/manifest/outline.png diff --git a/nodejs/devin/sample-agent/manifest/agenticUserTemplateManifest.json b/nodejs/devin/sample-agent/manifest/agenticUserTemplateManifest.json new file mode 100644 index 00000000..3c32f09d --- /dev/null +++ b/nodejs/devin/sample-agent/manifest/agenticUserTemplateManifest.json @@ -0,0 +1,6 @@ +{ + "id": "66f7a59f-d970-47a7-b178-4994374441c3", + "schemaVersion": "0.1.0-preview", + "agentIdentityBlueprintId": "95587a14-6731-46c4-ab67-3daf4eafd0f8", + "communicationProtocol": "activityProtocol" +} \ No newline at end of file diff --git a/nodejs/devin/sample-agent/manifest/color.png b/nodejs/devin/sample-agent/manifest/color.png new file mode 100644 index 0000000000000000000000000000000000000000..760f6d540ee3946c8c4322cec52333294e2f6415 GIT binary patch literal 6265 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 literal 0 HcmV?d00001 diff --git a/nodejs/devin/sample-agent/manifest/manifest.json b/nodejs/devin/sample-agent/manifest/manifest.json new file mode 100644 index 00000000..250ba85e --- /dev/null +++ b/nodejs/devin/sample-agent/manifest/manifest.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/vDevPreview/MicrosoftTeams.schema.json", + "id": "80939348-93ed-4478-9e24-a585b859c9a0", + "name": { + "short": "Devin Sample Agent", + "full": "Devin Sample Agent" + }, + "description": { + "short": "Devin is the AI software engineer.", + "full": "Devin is an AI coding agent and software engineer that helps developers build better software faster." + }, + "icons": { + "outline": "outline.png", + "color": "color.png" + }, + "accentColor": "#07687d", + "version": "1.0.0", + "manifestVersion": "devPreview", + "developer": { + "name": "Agent Developer", + "mpnId": "", + "websiteUrl": "https://go.microsoft.com/fwlink/?LinkId=518021", + "privacyUrl": "https://go.microsoft.com/fwlink/?LinkId=518021", + "termsOfUseUrl": "https://shares.datatransfer.microsoft.com/assets/Microsoft_Terms_of_Use.html" + }, + "agenticUserTemplates": [ + { + "id": "66f7a59f-d970-47a7-b178-4994374441c3", + "file": "agenticUserTemplateManifest.json" + } + ] +} \ No newline at end of file diff --git a/nodejs/devin/sample-agent/manifest/outline.png b/nodejs/devin/sample-agent/manifest/outline.png new file mode 100644 index 0000000000000000000000000000000000000000..8962a030b040cfa93e9e7041fa6cebaf3f02b321 GIT binary patch literal 742 zcmVz>(h)G02R9Hv7m(5NTK@^3D5Fr^%5Y&|` z7QTa$_yp{T3ryVe1{xkg0|^U_3BhMz;e#0CiUlMrgcv}@0BVF8zf+v*^vv|%j6Hpl zld8J+*15NSx_hSeKj?P5x8S6Q&7#xkEW-o12cO#93|MuWq(`&?^p9!Uc8?!QM$)e# zJD`6^(_8@pNuR;L@CvTj+#Fc(6p7E_1)R3IIgoV5$;BC)>xG0_>0B1^Ex=22AuGll z{%$Zy+q(|Gz_`kOUJ@6eexEN*X>7vk$D|3?mUxz^sPq4B#=9^;%SdO#^2H!lkJt&k zhD(gIwzV>)VXaeGepd*Zhrgk!pR##mNJCoIoVPh21SPjyE3kQFco*W4X~~?gKqcRYx>Uk9O}0Dwk45!uPLSu9hP0p{?ftCzG4Px= zfPSq7&<4;~j=`gq(ar!*s_O_U6;OBtqe2?ex{)kCg0f3EiR~p^v}pkH!550PDHc$E z2_p!~d<+?{GS(LUg0J9Xc-K__HT>h4RZmM7Q2ZE1q$j9vvkG_sx0N7*u~wCQ69mTZ z73*oadbuc@fL+`C27ZS62KMKXgLU;)&!XK zgCtx!wJ`k1pnVsz0LP>$jdfhZe_5H-hW%R_-xFG`o{Syrv7qPaSP@&jzZWHl@DC^4 zrLW|N@QFjl3$N-_i3R!};X}K}4|1x2GbjH*Giz5fAmKeH-=fKXr;iIHz7K2qE7ofL Y1H|^F|Lz8 Date: Tue, 18 Nov 2025 13:35:19 +0000 Subject: [PATCH 4/4] add copyright header --- nodejs/devin/sample-agent/src/types/agent.types.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nodejs/devin/sample-agent/src/types/agent.types.ts b/nodejs/devin/sample-agent/src/types/agent.types.ts index 67f89658..2d1bfc0d 100644 --- a/nodejs/devin/sample-agent/src/types/agent.types.ts +++ b/nodejs/devin/sample-agent/src/types/agent.types.ts @@ -1,3 +1,6 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + import { DefaultConversationState, TurnState } from "@microsoft/agents-hosting"; interface ConversationState extends DefaultConversationState {