From 0656356e9a670ca40eb7980699698f8c6ba89299 Mon Sep 17 00:00:00 2001 From: Yimin Jin Date: Mon, 1 Jun 2026 17:50:34 +0800 Subject: [PATCH 1/3] ci(catalog): blacklist invocations_ws sample paths Upstream microsoft-foundry/foundry-samples recently added samples/python/hosted-agents/bring-your-own/invocations_ws/{hello-world,livekit-server}. The catalog generator's loose path scan picked them up, but they shouldn't appear in the picker yet (LiveKit voice prototype, not the standard invocations protocol). Introduce a small BLOCKED_PATH_SEGMENTS deny-list and drop any template whose path contains a blocked segment. Minimal-surface change vs. a whitelist rewrite: existing csharp flat layouts and the voicelive sample stay surfaced; only invocations_ws is filtered out. Next `Sync Sample Catalog` run will produce a follow-up PR that removes the two invocations_ws entries from sample-catalog.json. --- .github/scripts/generate_sample_catalog.mjs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/scripts/generate_sample_catalog.mjs b/.github/scripts/generate_sample_catalog.mjs index 2042068..282c86d 100644 --- a/.github/scripts/generate_sample_catalog.mjs +++ b/.github/scripts/generate_sample_catalog.mjs @@ -76,6 +76,11 @@ const TEMPLATE_SELECTION = { // Path segments must be alphanumeric, hyphens, underscores, or dots const SAFE_PATH_SEGMENT = /^[a-zA-Z0-9._-]+$/; +// Path segments that should never surface as catalog templates, even when +// they contain a valid `agent.yaml`. Use this to drop upstream folders we +// don't want in the picker yet (e.g. `invocations_ws` LiveKit samples). +const BLOCKED_PATH_SEGMENTS = new Set(['invocations_ws']); + /** * Collected anomaly messages surfaced in CI step summary so reviewers do not * silently merge a catalog with missing/derived data. Always populated, even @@ -199,7 +204,14 @@ function findTemplateDirsUnder(tree, prefix) { if (!rel) { return false; } - return rel.split('/').every((seg) => isSafePathSegment(seg)); + const segments = rel.split('/'); + if (!segments.every((seg) => isSafePathSegment(seg))) { + return false; + } + // Drop templates that live under a blocked segment (e.g. + // `invocations_ws`) so upstream additions don't auto-leak into + // the catalog before we explicitly opt them in. + return !segments.some((seg) => BLOCKED_PATH_SEGMENTS.has(seg)); }) // Lexicographic sort serves two purposes: (1) a parent path always // sorts before its descendants, so the `startsWith` check below From e3f3ff1fbd53d611f67815349670e7f8f5d3b9b6 Mon Sep 17 00:00:00 2001 From: Yimin Jin Date: Mon, 1 Jun 2026 18:18:07 +0800 Subject: [PATCH 2/3] ci(catalog): add LangGraph framework Upstream microsoft-foundry/foundry-samples added samples/python/hosted-agents/langgraph/{invocations,responses}/* (7 templates today). The catalog generator hard-codes the framework whitelist, so the langgraph subtree was being silently skipped. - Append 'langgraph' to FRAMEWORKS so the scan picks up the new prefix. - Append 'langgraph': 'LangGraph' (CamelCase per upstream branding) to DIMENSION_DEFAULTS.framework.options as the last option, keeping the existing copilot-sdk / agent-framework / bring-your-own order intact. Next `Sync Sample Catalog` run will produce a follow-up PR that adds the langgraph templates and the new framework option to sample-catalog.json. --- .github/scripts/generate_sample_catalog.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/scripts/generate_sample_catalog.mjs b/.github/scripts/generate_sample_catalog.mjs index 282c86d..ba6eb18 100644 --- a/.github/scripts/generate_sample_catalog.mjs +++ b/.github/scripts/generate_sample_catalog.mjs @@ -35,7 +35,7 @@ const OVERRIDES_PATH = join(REPO_ROOT, 'samples', 'hosted-agent', 'sample-overri const GITHUB_TOKEN = process.env.GITHUB_TOKEN || ''; const LANGUAGES = ['python', 'csharp']; -const FRAMEWORKS = ['agent-framework', 'bring-your-own']; +const FRAMEWORKS = ['agent-framework', 'bring-your-own', 'langgraph']; /** @type {Record}>} */ const DIMENSION_DEFAULTS = { @@ -56,6 +56,7 @@ const DIMENSION_DEFAULTS = { 'copilot-sdk': 'Copilot SDK', 'agent-framework': 'Agent Framework', 'bring-your-own': 'Bring Your Own', + 'langgraph': 'LangGraph', }, }, protocol: { From c70b416900b1b07910e971a998c18f008555623c Mon Sep 17 00:00:00 2001 From: huimiu <107838226+huimiu@users.noreply.github.com> Date: Mon, 1 Jun 2026 10:21:04 +0000 Subject: [PATCH 3/3] ci: sync sample catalog from foundry-samples (template/dev) --- samples/hosted-agent/sample-catalog.json | 125 ++++++++++++++++++++++- 1 file changed, 123 insertions(+), 2 deletions(-) diff --git a/samples/hosted-agent/sample-catalog.json b/samples/hosted-agent/sample-catalog.json index 58ba369..62af205 100644 --- a/samples/hosted-agent/sample-catalog.json +++ b/samples/hosted-agent/sample-catalog.json @@ -1,7 +1,7 @@ { - "commitSha": "19b441d474ec963c61a509692fdd81d5fb707d71", + "commitSha": "ef510c47b3ec768596577ba65ca6b2c2ab015855", "repo": "https://github.com/microsoft-foundry/foundry-samples/", - "generatedAt": "2026-05-27T06:40:47Z", + "generatedAt": "2026-06-01T10:21:01Z", "dimensions": { "language": { "title": "Select a Language", @@ -32,6 +32,10 @@ { "id": "bring-your-own", "displayName": "Bring Your Own" + }, + { + "id": "langgraph", + "displayName": "LangGraph" } ] }, @@ -127,6 +131,15 @@ "path": "samples/python/hosted-agents/agent-framework/responses/07-skills", "requiresModel": true }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Teams Activity", + "description": "Agent that answers questions about Teams and calendar, including handling file attachments.", + "path": "samples/python/hosted-agents/agent-framework/responses/07-teams-activity", + "requiresModel": true + }, { "language": "python", "framework": "agent-framework", @@ -181,6 +194,15 @@ "path": "samples/python/hosted-agents/agent-framework/responses/13-foundry-memory", "requiresModel": true }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Browser Automation Agent", + "description": "Automates web browsing tasks such as navigation, scraping, and form filling in a remote browser.", + "path": "samples/python/hosted-agents/agent-framework/responses/14-browser-automation-agent", + "requiresModel": true + }, { "language": "python", "framework": "bring-your-own", @@ -280,6 +302,15 @@ "path": "samples/python/hosted-agents/bring-your-own/responses/bring-your-own-toolbox", "requiresModel": true }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "Browser Automation", + "description": "Automates web browsers for tasks like form filling and web scraping with session control.", + "path": "samples/python/hosted-agents/bring-your-own/responses/browser-automation", + "requiresModel": true + }, { "language": "python", "framework": "bring-your-own", @@ -343,6 +374,15 @@ "path": "samples/python/hosted-agents/bring-your-own/responses/openai-agents-sdk", "requiresModel": true }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "Handoff Langgraph Responses Voicelive", + "description": "Customer support agent with triage and handoff between refund and order specialists.", + "path": "samples/python/hosted-agents/bring-your-own/voicelive/handoff-langgraph-responses-voicelive", + "requiresModel": true + }, { "language": "python", "framework": "bring-your-own", @@ -352,6 +392,69 @@ "path": "samples/python/hosted-agents/bring-your-own/voicelive/hello-world-invocations-voicelive", "requiresModel": true }, + { + "language": "python", + "framework": "langgraph", + "protocol": "invocations", + "displayName": "Langgraph Chat", + "description": "Multi-turn chat agent with tools for current time and math calculations.", + "path": "samples/python/hosted-agents/langgraph/invocations/01-langgraph-chat", + "requiresModel": true + }, + { + "language": "python", + "framework": "langgraph", + "protocol": "responses", + "displayName": "Langgraph Chat", + "description": "Chat agent with tools for current time and math calculations.", + "path": "samples/python/hosted-agents/langgraph/responses/01-langgraph-chat", + "requiresModel": true + }, + { + "language": "python", + "framework": "langgraph", + "protocol": "responses", + "displayName": "MCP", + "description": "Agent that discovers and invokes tools from a remote server for enhanced capabilities.", + "path": "samples/python/hosted-agents/langgraph/responses/04-mcp", + "requiresModel": true + }, + { + "language": "python", + "framework": "langgraph", + "protocol": "responses", + "displayName": "Workflows", + "description": "Processes a request through slogan writing, legal review, and formatting steps.", + "path": "samples/python/hosted-agents/langgraph/responses/05-workflows", + "requiresModel": true + }, + { + "language": "python", + "framework": "langgraph", + "protocol": "responses", + "displayName": "Files", + "description": "Agent that analyzes and manipulates files using local and sandboxed tools.", + "path": "samples/python/hosted-agents/langgraph/responses/06-files", + "requiresModel": true + }, + { + "language": "python", + "framework": "langgraph", + "protocol": "responses", + "displayName": "Human In The Loop", + "description": "Agent drafts proposals and pauses for human review with approve, revise, or reject options.", + "path": "samples/python/hosted-agents/langgraph/responses/07-human-in-the-loop", + "requiresModel": true + }, + { + "language": "python", + "framework": "langgraph", + "protocol": "responses", + "displayName": "Observability", + "description": "Agent with automatic tracing for observability of all actions and tool invocations.", + "path": "samples/python/hosted-agents/langgraph/responses/08-observability", + "requiresModel": true + }, { "language": "csharp", "framework": "agent-framework", @@ -433,6 +536,15 @@ "path": "samples/csharp/hosted-agents/agent-framework/mcp-tools", "requiresModel": true }, + { + "language": "csharp", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Observability", + "description": "Agent with built-in observability for traces, metrics, and logs via Azure Monitor.", + "path": "samples/csharp/hosted-agents/agent-framework/observability", + "requiresModel": true + }, { "language": "csharp", "framework": "agent-framework", @@ -442,6 +554,15 @@ "path": "samples/csharp/hosted-agents/agent-framework/simple-agent", "requiresModel": true }, + { + "language": "csharp", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Teams Activity", + "description": "Agent that answers questions about Teams and calendar, and handles file attachments.", + "path": "samples/csharp/hosted-agents/agent-framework/teams-activity", + "requiresModel": true + }, { "language": "csharp", "framework": "agent-framework",