From 338309cf74d59324b3c426b1d89ccec515059dfd Mon Sep 17 00:00:00 2001 From: Yimin-Jin <139844715+Yimin-Jin@users.noreply.github.com> Date: Tue, 7 Jul 2026 14:22:14 +0800 Subject: [PATCH 1/6] Delete samples/hosted-agent/sample-catalog.json --- samples/hosted-agent/sample-catalog.json | 886 ----------------------- 1 file changed, 886 deletions(-) delete mode 100644 samples/hosted-agent/sample-catalog.json diff --git a/samples/hosted-agent/sample-catalog.json b/samples/hosted-agent/sample-catalog.json deleted file mode 100644 index 78e3662..0000000 --- a/samples/hosted-agent/sample-catalog.json +++ /dev/null @@ -1,886 +0,0 @@ -{ - "commitSha": "9c4e42a1eedcec32c1582bebeb83a381a23efbe1", - "repo": "https://github.com/microsoft-foundry/foundry-samples/", - "generatedAt": "2026-07-07T03:18:38Z", - "dimensions": { - "language": { - "title": "Select a Language", - "placeholder": "Choose the language for your agent", - "options": [ - { - "id": "python", - "displayName": "Python" - }, - { - "id": "csharp", - "displayName": "C# (.NET)" - } - ] - }, - "framework": { - "title": "Select a Framework", - "placeholder": "Choose the framework for your agent", - "options": [ - { - "id": "copilot-sdk", - "displayName": "Copilot SDK" - }, - { - "id": "agent-framework", - "displayName": "Agent Framework" - }, - { - "id": "bring-your-own", - "displayName": "Bring Your Own" - }, - { - "id": "langgraph", - "displayName": "LangGraph" - } - ] - }, - "protocol": { - "title": "Select a Protocol", - "placeholder": "Choose the protocol for your agent", - "options": [ - { - "id": "responses", - "displayName": "Responses API" - }, - { - "id": "invocations", - "displayName": "Invocations API" - }, - { - "id": "invocations_ws", - "displayName": "Invocations (WebSocket)" - } - ] - } - }, - "templateSelection": { - "title": "Select a Template", - "placeholder": "Choose a template for your agent" - }, - "templates": [ - { - "language": "csharp", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Caller", - "description": "Concierge agent that delegates questions to a remote specialist and summarizes answers.", - "path": "samples/csharp/hosted-agents/agent-framework/a2a/01-delegation/caller", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Executor", - "description": "Answers arithmetic and math questions as an expert agent.", - "path": "samples/csharp/hosted-agents/agent-framework/a2a/01-delegation/executor", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Agent Skills", - "description": "Agent that loads behavioral guidelines from Foundry Skills at startup for dynamic updates.", - "path": "samples/csharp/hosted-agents/agent-framework/agent-skills", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Azure Search RAG", - "description": "Support agent answers questions using a keyword-indexed knowledge base for grounding.", - "path": "samples/csharp/hosted-agents/agent-framework/azure-search-rag", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Browser Automation", - "description": "Automates web browsing, scraping, and form filling in a remote Chromium browser.", - "path": "samples/csharp/hosted-agents/agent-framework/browser-automation", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "File Tools", - "description": "Agent answers questions using bundled and user-uploaded files as knowledge sources.", - "path": "samples/csharp/hosted-agents/agent-framework/file-tools", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Foundry Memory RAG", - "description": "Personal coach agent that remembers user preferences and goals across sessions.", - "path": "samples/csharp/hosted-agents/agent-framework/foundry-memory-rag", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Foundry Toolbox MCP Skills", - "description": "Agent that dynamically discovers and uses skills from a remote toolbox endpoint.", - "path": "samples/csharp/hosted-agents/agent-framework/foundry-toolbox-mcp-skills", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Foundry Toolbox Server Side", - "description": "Agent that uses tools from a Foundry Toolbox, invoked server-side by the platform.", - "path": "samples/csharp/hosted-agents/agent-framework/foundry-toolbox-server-side", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Hello World", - "description": "Minimal hosted agent that responds to user questions and supports multi-turn conversation.", - "path": "samples/csharp/hosted-agents/agent-framework/hello-world", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "agent-framework", - "protocol": "invocations", - "displayName": "Invocations Echo Agent", - "description": "Echoes back input messages with a simple prefix for testing agent hosting.", - "path": "samples/csharp/hosted-agents/agent-framework/invocations-echo-agent", - "requiresModel": false - }, - { - "language": "csharp", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Local Tools", - "description": "Hotel search assistant that uses local function tools for queries.", - "path": "samples/csharp/hosted-agents/agent-framework/local-tools", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "MCP Tools", - "description": "Agent answers questions by searching documentation using integrated tool providers.", - "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", - "protocol": "responses", - "displayName": "Simple Agent", - "description": "General-purpose AI assistant that replies to user input with model-generated responses.", - "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", - "protocol": "responses", - "displayName": "Text Search RAG", - "description": "Agent answers support questions using retrieved passages from external documents.", - "path": "samples/csharp/hosted-agents/agent-framework/text-search-rag", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Toolbox Auth Paths", - "description": "Agent toolbox demonstrates different authentication methods for accessing upstream tools.", - "path": "samples/csharp/hosted-agents/agent-framework/toolbox-auth-paths", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Workflows", - "description": "Workflow chains three translation agents to show intermediate language outputs.", - "path": "samples/csharp/hosted-agents/agent-framework/workflows", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "bring-your-own", - "protocol": "invocations", - "displayName": "HelloWorld", - "description": "Hosted agent that returns a streaming hello world response from a Foundry model.", - "path": "samples/csharp/hosted-agents/bring-your-own/invocations/HelloWorld", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "bring-your-own", - "protocol": "invocations", - "displayName": "Human In The Loop", - "description": "Agent that generates proposals and waits for human approval before proceeding.", - "path": "samples/csharp/hosted-agents/bring-your-own/invocations/human-in-the-loop", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "bring-your-own", - "protocol": "invocations", - "displayName": "Notetaking Agent", - "description": "Agent that saves and retrieves session-persistent notes with real-time streaming responses.", - "path": "samples/csharp/hosted-agents/bring-your-own/invocations/notetaking-agent", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "bring-your-own", - "protocol": "invocations_ws", - "displayName": "HelloWorld", - "description": "Routes real-time audio between a browser and a managed voice service session.", - "path": "samples/csharp/hosted-agents/bring-your-own/invocations_ws/HelloWorld", - "requiresModel": false - }, - { - "language": "csharp", - "framework": "bring-your-own", - "protocol": "responses", - "displayName": "HelloWorld", - "description": "Minimal hosted agent that returns a greeting from a Foundry model using the Responses API.", - "path": "samples/csharp/hosted-agents/bring-your-own/responses/HelloWorld", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "bring-your-own", - "protocol": "responses", - "displayName": "Background Agent", - "description": "Handles research analysis requests asynchronously with background processing and streaming updates.", - "path": "samples/csharp/hosted-agents/bring-your-own/responses/background-agent", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "bring-your-own", - "protocol": "responses", - "displayName": "Browser Automation", - "description": "", - "path": "samples/csharp/hosted-agents/bring-your-own/responses/browser-automation", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "bring-your-own", - "protocol": "responses", - "displayName": "Env Vars Agent", - "description": "Agent retrieves environment variable values with safety policies based on their type.", - "path": "samples/csharp/hosted-agents/bring-your-own/responses/env-vars-agent", - "requiresModel": true - }, - { - "language": "csharp", - "framework": "bring-your-own", - "protocol": "responses", - "displayName": "Notetaking Agent", - "description": "Agent that saves and retrieves session-persistent notes for each user.", - "path": "samples/csharp/hosted-agents/bring-your-own/responses/notetaking-agent", - "requiresModel": true - }, - { - "language": "python", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Caller", - "description": "Concierge agent that delegates questions to a remote specialist and summarizes the answers.", - "path": "samples/python/hosted-agents/agent-framework/a2a/01-delegation/caller", - "requiresModel": true - }, - { - "language": "python", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Executor", - "description": "Answers arithmetic and math questions as an expert agent.", - "path": "samples/python/hosted-agents/agent-framework/a2a/01-delegation/executor", - "requiresModel": true - }, - { - "language": "python", - "framework": "agent-framework", - "protocol": "invocations", - "displayName": "Basic", - "description": "Agent with in-memory session management for multi-turn conversations.", - "path": "samples/python/hosted-agents/agent-framework/invocations/01-basic", - "requiresModel": true - }, - { - "language": "python", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Basic", - "description": "Agent that supports multi-turn conversations with response tracking.", - "path": "samples/python/hosted-agents/agent-framework/responses/01-basic", - "requiresModel": true - }, - { - "language": "python", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Tools", - "description": "Agent with custom tools like weather lookup callable during conversation.", - "path": "samples/python/hosted-agents/agent-framework/responses/02-tools", - "requiresModel": true - }, - { - "language": "python", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "MCP", - "description": "Agent that dynamically discovers and invokes tools from a remote GitHub Copilot MCP server.", - "path": "samples/python/hosted-agents/agent-framework/responses/03-mcp", - "requiresModel": true - }, - { - "language": "python", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Foundry Toolbox", - "description": "Agent that discovers and invokes centrally managed tools from a Foundry Toolbox.", - "path": "samples/python/hosted-agents/agent-framework/responses/04-foundry-toolbox", - "requiresModel": true - }, - { - "language": "python", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Workflows", - "description": "Processes requests through slogan writing, legal review, and formatting agents in sequence.", - "path": "samples/python/hosted-agents/agent-framework/responses/05-workflows", - "requiresModel": true - }, - { - "language": "python", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Files", - "description": "Agent that lists, reads, and interprets files using shell and code tools.", - "path": "samples/python/hosted-agents/agent-framework/responses/06-files", - "requiresModel": true - }, - { - "language": "python", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Skills", - "description": "Agent that discovers and runs local file-based skills like generating PDF travel guides.", - "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", - "protocol": "responses", - "displayName": "Observability", - "description": "Agent with built-in observability and telemetry for diagnostics and monitoring.", - "path": "samples/python/hosted-agents/agent-framework/responses/08-observability", - "requiresModel": true - }, - { - "language": "python", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Declarative Customer Support", - "description": "Customer support triage agent that routes requests to specialized agents based on conversation history.", - "path": "samples/python/hosted-agents/agent-framework/responses/09-declarative-customer-support", - "requiresModel": true - }, - { - "language": "python", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Downstream Azure", - "description": "Agent performs data operations on Blob Storage and Service Bus using its own identity.", - "path": "samples/python/hosted-agents/agent-framework/responses/10-downstream-azure", - "requiresModel": true - }, - { - "language": "python", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Azure Search RAG", - "description": "Answers questions using product documentation and cites sources from a search index.", - "path": "samples/python/hosted-agents/agent-framework/responses/11-azure-search-rag", - "requiresModel": true - }, - { - "language": "python", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Foundry Skills", - "description": "Agent that loads behavioral guidelines from Foundry Skills at startup for dynamic updates.", - "path": "samples/python/hosted-agents/agent-framework/responses/12-foundry-skills", - "requiresModel": true - }, - { - "language": "python", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Foundry Memory", - "description": "Agent that remembers user facts across sessions using persistent semantic memory.", - "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": "agent-framework", - "protocol": "responses", - "displayName": "Optimization Travel Approver", - "description": "Agent that reviews and approves travel requests for employees.", - "path": "samples/python/hosted-agents/agent-framework/responses/15-optimization-travel-approver", - "requiresModel": true - }, - { - "language": "python", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Content Safety Guardrail", - "description": "Agent screens prompts and responses for harmful content based on a safety policy.", - "path": "samples/python/hosted-agents/agent-framework/responses/16-content-safety-guardrail", - "requiresModel": true - }, - { - "language": "python", - "framework": "agent-framework", - "protocol": "responses", - "displayName": "Foundry Iq Toolbox", - "description": "Answers user questions using a knowledge base accessed through a remote toolbox connection.", - "path": "samples/python/hosted-agents/agent-framework/responses/17-foundry-iq-toolbox", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "invocations", - "displayName": "AG UI", - "description": "Agent that streams AG-UI lifecycle events in response to user input.", - "path": "samples/python/hosted-agents/bring-your-own/invocations/ag-ui", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "invocations", - "displayName": "Claude Agent SDK", - "description": "Agent that streams responses from a Claude model for plain text input.", - "path": "samples/python/hosted-agents/bring-your-own/invocations/claude-agent-sdk", - "requiresModel": false - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "invocations", - "displayName": "Diagnostic Agent", - "description": "Runs network probes on hostnames and returns a JSON report of connectivity results.", - "path": "samples/python/hosted-agents/bring-your-own/invocations/diagnostic-agent", - "requiresModel": false - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "invocations", - "displayName": "Event Grid Trigger", - "description": "Processes new blobs in Azure Storage by summarizing content and saving results to a summary container.", - "path": "samples/python/hosted-agents/bring-your-own/invocations/event-grid-trigger", - "requiresModel": true - }, - { - "language": "python", - "framework": "copilot-sdk", - "protocol": "invocations", - "displayName": "GitHub Copilot", - "description": "Agent streams Copilot session events with support for multi-turn conversations.", - "path": "samples/python/hosted-agents/bring-your-own/invocations/github-copilot", - "requiresModel": false - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "invocations", - "displayName": "Hello World", - "description": "Hosted agent that streams a model's reply as a server-sent event.", - "path": "samples/python/hosted-agents/bring-your-own/invocations/hello-world", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "invocations", - "displayName": "Human In The Loop", - "description": "Agent that generates proposals and waits for human approval before proceeding.", - "path": "samples/python/hosted-agents/bring-your-own/invocations/human-in-the-loop", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "invocations", - "displayName": "Langgraph Chat", - "description": "Conversational agent with session history and built-in time and calculator tools.", - "path": "samples/python/hosted-agents/bring-your-own/invocations/langgraph-chat", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "invocations", - "displayName": "Notetaking Agent", - "description": "Agent that saves and retrieves notes with per-session isolation and streaming responses.", - "path": "samples/python/hosted-agents/bring-your-own/invocations/notetaking-agent", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "invocations", - "displayName": "Toolbox", - "description": "Agent connects to a toolbox server and enables tool discovery and invocation during chat.", - "path": "samples/python/hosted-agents/bring-your-own/invocations/toolbox", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "invocations_ws", - "displayName": "Duplex Live Agent", - "description": "Real-time voice agent that handles conversation and background tasks in parallel.", - "path": "samples/python/hosted-agents/bring-your-own/invocations_ws/duplex-live-agent", - "requiresModel": false - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "invocations_ws", - "displayName": "Hello World", - "description": "Real-time voice agent that relays audio and events between browser and a managed service.", - "path": "samples/python/hosted-agents/bring-your-own/invocations_ws/hello-world", - "requiresModel": false - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "invocations_ws", - "displayName": "Livekit Server", - "description": "Voice agent connects to a LiveKit server for real-time audio conversations.", - "path": "samples/python/hosted-agents/bring-your-own/invocations_ws/livekit-server", - "requiresModel": false - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "invocations_ws", - "displayName": "Pipecat Webrtc", - "description": "Real-time voice agent with multi-agent pipeline and WebRTC audio media support.", - "path": "samples/python/hosted-agents/bring-your-own/invocations_ws/pipecat-webrtc", - "requiresModel": false - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "invocations_ws", - "displayName": "Pipecat Ws Server", - "description": "Real-time voice agent with greeting and order-checking capabilities.", - "path": "samples/python/hosted-agents/bring-your-own/invocations_ws/pipecat-ws-server", - "requiresModel": false - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "responses", - "displayName": "Background Agent", - "description": "Handles long-running research analysis requests with background processing and streaming updates.", - "path": "samples/python/hosted-agents/bring-your-own/responses/background-agent", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "responses", - "displayName": "Bring Your Own Toolbox", - "description": "Agent connects to a remote toolbox and enables tool invocation during conversations.", - "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", - "protocol": "responses", - "displayName": "Env Vars Agent", - "description": "Agent that reveals environment variable values with safety policies based on their type.", - "path": "samples/python/hosted-agents/bring-your-own/responses/env-vars-agent", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "responses", - "displayName": "Hello World", - "description": "Hosted agent that returns a hello world message from a Foundry model using a custom backend.", - "path": "samples/python/hosted-agents/bring-your-own/responses/hello-world", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "responses", - "displayName": "Langgraph Chat", - "description": "Conversational agent with built-in calculator and time tools, streaming responses.", - "path": "samples/python/hosted-agents/bring-your-own/responses/langgraph-chat", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "responses", - "displayName": "Langgraph Toolbox", - "description": "Agent that dynamically loads tools from a remote toolbox and handles incoming requests.", - "path": "samples/python/hosted-agents/bring-your-own/responses/langgraph-toolbox", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "responses", - "displayName": "Langgraph Toolbox User Identity", - "description": "Agent that accesses mail, calendar, and GitHub tools for user-identity scenarios.", - "path": "samples/python/hosted-agents/bring-your-own/responses/langgraph-toolbox-user-identity", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "responses", - "displayName": "Notetaking Agent", - "description": "Agent that saves and retrieves notes with per-session isolation and streaming responses.", - "path": "samples/python/hosted-agents/bring-your-own/responses/notetaking-agent", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "responses", - "displayName": "OpenAI Agents SDK", - "description": "Minimal agent that streams text responses from a Foundry model.", - "path": "samples/python/hosted-agents/bring-your-own/responses/openai-agents-sdk", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "responses", - "displayName": "Optimization Customer Support", - "description": "Customer support agent for troubleshooting and product assistance.", - "path": "samples/python/hosted-agents/bring-your-own/responses/optimization-customer-support", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "responses", - "displayName": "Optimization Hello World", - "description": "Minimal hosted agent that returns a static greeting message.", - "path": "samples/python/hosted-agents/bring-your-own/responses/optimization-hello-world", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "responses", - "displayName": "Session Multiplexing", - "description": "Supports multiple users sharing a session while keeping response chains user-specific.", - "path": "samples/python/hosted-agents/bring-your-own/responses/session-multiplexing", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "responses", - "displayName": "Foreground Background Agents Responses Voicelive", - "description": "Voice agent that routes quick replies to users and delegates long tasks to a background worker.", - "path": "samples/python/hosted-agents/bring-your-own/voicelive/foreground-background-agents-responses-voicelive", - "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", - "protocol": "invocations", - "displayName": "Hello World Invocations Voicelive", - "description": "Minimal hosted agent for real-time voice interactions with audio transcription streaming.", - "path": "samples/python/hosted-agents/bring-your-own/voicelive/hello-world-invocations-voicelive", - "requiresModel": true - }, - { - "language": "python", - "framework": "bring-your-own", - "protocol": "invocations", - "displayName": "Hotel Booking Invocations Voicelive", - "description": "Hotel booking agent that handles speech and UI actions with session state and streaming.", - "path": "samples/python/hosted-agents/bring-your-own/voicelive/hotel-booking-invocations-voicelive", - "requiresModel": true - }, - { - "language": "python", - "framework": "langgraph", - "protocol": "responses", - "displayName": "A2a Caller", - "description": "Concierge agent that delegates specialist questions to a remote expert agent.", - "path": "samples/python/hosted-agents/langgraph/a2a/a2a-caller", - "requiresModel": true - }, - { - "language": "python", - "framework": "langgraph", - "protocol": "responses", - "displayName": "A2a Executor", - "description": "Math expert agent that answers questions and explains steps, callable by other agents.", - "path": "samples/python/hosted-agents/langgraph/a2a/a2a-executor", - "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": "Langgraph Toolbox", - "description": "Agent that uses a toolbox for web search and GitHub Copilot MCP tools with managed credentials.", - "path": "samples/python/hosted-agents/langgraph/responses/02-langgraph-toolbox", - "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 - } - ] -} From afacf9acbe0e0eaa1776901a13ffc3cefe69cd5d Mon Sep 17 00:00:00 2001 From: Yimin-Jin <139844715+Yimin-Jin@users.noreply.github.com> Date: Tue, 7 Jul 2026 14:23:08 +0800 Subject: [PATCH 2/6] Change protocol display name --- .github/scripts/generate_sample_catalog.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/scripts/generate_sample_catalog.mjs b/.github/scripts/generate_sample_catalog.mjs index 75e63c4..98970b1 100644 --- a/.github/scripts/generate_sample_catalog.mjs +++ b/.github/scripts/generate_sample_catalog.mjs @@ -72,8 +72,8 @@ const DIMENSION_DEFAULTS = { title: 'Select a Protocol', placeholder: 'Choose the protocol for your agent', options: { - responses: 'Responses API', - invocations: 'Invocations API', + responses: 'Responses', + invocations: 'Invocations', invocations_ws: 'Invocations (WebSocket)', }, }, From 1685221766919b98b6402ea74ca291fec512aa1f Mon Sep 17 00:00:00 2001 From: Yimin Jin Date: Tue, 7 Jul 2026 14:33:20 +0800 Subject: [PATCH 3/6] fix(sample-catalog): make LLM description request compatible with newer models MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Run 28846102061 hit 'LLM API returned 400' for 90/91 templates. Auth and routing succeeded (not 401/404), so the request body was rejected — the classic newer-model (gpt-5.x / reasoning) incompatibility with the legacy chat-completions params. - Use max_completion_tokens instead of the legacy max_tokens (newer models 400 on max_tokens) - Omit temperature (several newer models only accept the default and 400 otherwise) - Bump the default api-version to 2024-10-21 (>= 2024-09-01-preview, required for max_completion_tokens) and make it overridable via AZURE_OPENAI_API_VERSION - Log a truncated response body on failure so the exact 400 reason is visible in CI instead of a bare status code --- .github/scripts/generate_sample_catalog.mjs | 26 +++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/.github/scripts/generate_sample_catalog.mjs b/.github/scripts/generate_sample_catalog.mjs index 75e63c4..9239da3 100644 --- a/.github/scripts/generate_sample_catalog.mjs +++ b/.github/scripts/generate_sample_catalog.mjs @@ -399,6 +399,11 @@ async function fetchAzureYaml(samplePath, ref) { const AZURE_OPENAI_ENDPOINT = process.env.AZURE_OPENAI_ENDPOINT || ''; const AZURE_OPENAI_API_KEY = process.env.AZURE_OPENAI_API_KEY || ''; const AZURE_OPENAI_DEPLOYMENT = process.env.AZURE_OPENAI_DEPLOYMENT || 'gpt-4o-mini'; +// Must be >= 2024-09-01-preview so `max_completion_tokens` is accepted. Newer +// models (gpt-5.x / reasoning) reject the legacy `max_tokens` param and any +// non-default `temperature`; override via env if your deployment needs a +// newer api-version. +const AZURE_OPENAI_API_VERSION = process.env.AZURE_OPENAI_API_VERSION || '2024-10-21'; /** * Fetch README.md content for a sample directory. @@ -431,7 +436,7 @@ async function generateWithLLM(readmeContent, samplePath) { return null; } - const apiUrl = `${AZURE_OPENAI_ENDPOINT}/openai/deployments/${AZURE_OPENAI_DEPLOYMENT}/chat/completions?api-version=2024-08-01-preview`; + const apiUrl = `${AZURE_OPENAI_ENDPOINT}/openai/deployments/${AZURE_OPENAI_DEPLOYMENT}/chat/completions?api-version=${AZURE_OPENAI_API_VERSION}`; const systemPrompt = `You generate one-sentence descriptions for a VS Code template picker. The user has already selected language, framework, and protocol before seeing these items, so the description must NOT repeat those choices. @@ -461,8 +466,12 @@ ${readmeContent.substring(0, 2000)}`; { role: 'system', content: systemPrompt }, { role: 'user', content: userPrompt }, ], - temperature: 0, - max_tokens: 120, + // `max_completion_tokens` (not the legacy `max_tokens`) so newer models + // accept the request. Kept generous because reasoning models spend part + // of the budget on hidden reasoning tokens before emitting the sentence. + // `temperature` is intentionally omitted: several newer models only + // support the default value and 400 on anything else. + max_completion_tokens: 800, }; try { @@ -476,7 +485,16 @@ ${readmeContent.substring(0, 2000)}`; }); if (!response.ok) { - warn(`LLM API returned ${response.status} for ${samplePath}; description will be left empty.`); + // Include a truncated response body so the exact reason (e.g. an + // unsupported param, a missing deployment, or a wrong endpoint) is + // visible in the CI log instead of a bare status code. + let detail = ''; + try { + detail = (await response.text()).replace(/\s+/g, ' ').trim().slice(0, 400); + } catch { + // ignore body read failures + } + warn(`LLM API returned ${response.status} for ${samplePath}; description will be left empty.${detail ? ` Response: ${detail}` : ''}`); return null; } From 72803d2bf34880afaa3e50e62c8a3f170f8c63fd Mon Sep 17 00:00:00 2001 From: Yimin Jin Date: Tue, 7 Jul 2026 15:00:46 +0800 Subject: [PATCH 4/6] fix(sample-catalog): stop silently dropping LLM descriptions on reasoning models After #522 fixed the 400s, run 28846883377 still left 26/91 descriptions empty with no error in the log. The deployment is a reasoning model (gpt-5.x / o-series): LLM phase took ~8s/template, and such models spend the completion budget on hidden reasoning tokens BEFORE emitting content. With max_completion_tokens=800, ~1/4 of templates exhausted the budget on reasoning alone and returned EMPTY content (finish_reason=length). The empty-content branch (and the no-description branch) returned null WITHOUT warning, so the failures were invisible. - Raise the default budget to 2000 tokens (output is one sentence; headroom is cheap), overridable via AZURE_OPENAI_MAX_COMPLETION_TOKENS - Add optional AZURE_OPENAI_REASONING_EFFORT (only sent when set, since non-reasoning models 400 on it) to cap hidden reasoning for this trivial task - Emit a diagnostic warning (with finish_reason and reasoning_tokens) instead of silently returning null, for both the empty-content and missing-description paths --- .github/scripts/generate_sample_catalog.mjs | 30 +++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/.github/scripts/generate_sample_catalog.mjs b/.github/scripts/generate_sample_catalog.mjs index 5d625fa..b76d887 100644 --- a/.github/scripts/generate_sample_catalog.mjs +++ b/.github/scripts/generate_sample_catalog.mjs @@ -404,6 +404,18 @@ const AZURE_OPENAI_DEPLOYMENT = process.env.AZURE_OPENAI_DEPLOYMENT || 'gpt-4o-m // non-default `temperature`; override via env if your deployment needs a // newer api-version. const AZURE_OPENAI_API_VERSION = process.env.AZURE_OPENAI_API_VERSION || '2024-10-21'; +// Reasoning models (gpt-5.x / o-series) spend part of the completion budget on +// hidden reasoning tokens BEFORE emitting any visible content. If the budget +// is too small the reasoning alone exhausts it and `message.content` comes +// back EMPTY (finish_reason: "length"), which is why a too-low value silently +// dropped ~1/4 of descriptions. The visible output is a single short sentence, +// so a generous budget costs little but leaves ample headroom for reasoning. +const AZURE_OPENAI_MAX_COMPLETION_TOKENS = Number(process.env.AZURE_OPENAI_MAX_COMPLETION_TOKENS) || 2000; +// Optional: cap the hidden reasoning for a trivial summarization task. Only +// sent when set, because non-reasoning deployments (and older api-versions) +// 400 on an unknown `reasoning_effort` param. For gpt-5.x use `minimal`; for +// o-series use `low`. +const AZURE_OPENAI_REASONING_EFFORT = process.env.AZURE_OPENAI_REASONING_EFFORT || ''; /** * Fetch README.md content for a sample directory. @@ -461,6 +473,7 @@ Respond ONLY with a JSON object: {"description": "..."}`; README.md: ${readmeContent.substring(0, 2000)}`; + /** @type {{ messages: Array<{role: string, content: string}>, max_completion_tokens: number, reasoning_effort?: string }} */ const body = { messages: [ { role: 'system', content: systemPrompt }, @@ -471,8 +484,11 @@ ${readmeContent.substring(0, 2000)}`; // of the budget on hidden reasoning tokens before emitting the sentence. // `temperature` is intentionally omitted: several newer models only // support the default value and 400 on anything else. - max_completion_tokens: 800, + max_completion_tokens: AZURE_OPENAI_MAX_COMPLETION_TOKENS, }; + if (AZURE_OPENAI_REASONING_EFFORT) { + body.reasoning_effort = AZURE_OPENAI_REASONING_EFFORT; + } try { const response = await fetch(apiUrl, { @@ -499,8 +515,17 @@ ${readmeContent.substring(0, 2000)}`; } const data = await response.json(); - const content = data.choices?.[0]?.message?.content?.trim(); + const choice = data.choices?.[0]; + const content = choice?.message?.content?.trim(); if (!content) { + // A successful (200) call with empty content is almost always a + // reasoning model exhausting `max_completion_tokens` on hidden + // reasoning (finish_reason: "length"). Surface it instead of + // silently leaving the description empty, and hint at the knobs. + const finishReason = choice?.finish_reason ?? 'unknown'; + const reasoningTokens = data.usage?.completion_tokens_details?.reasoning_tokens; + const usageHint = reasoningTokens !== undefined ? ` (reasoning_tokens=${reasoningTokens})` : ''; + warn(`LLM returned empty content for ${samplePath} (finish_reason=${finishReason}${usageHint}); description left empty. If finish_reason is "length", raise AZURE_OPENAI_MAX_COMPLETION_TOKENS or set AZURE_OPENAI_REASONING_EFFORT.`); return null; } @@ -510,6 +535,7 @@ ${readmeContent.substring(0, 2000)}`; const description = typeof parsed.description === 'string' ? parsed.description.trim() : ''; if (!description) { + warn(`LLM response for ${samplePath} had no usable "description" field; description left empty.`); return null; } From 09ae0a73ff51fd16f1e10c4f9cbbbf45745981a7 Mon Sep 17 00:00:00 2001 From: Yimin Jin Date: Tue, 7 Jul 2026 15:48:02 +0800 Subject: [PATCH 5/6] Revert "Delete samples/hosted-agent/sample-catalog.json" This reverts commit 338309cf74d59324b3c426b1d89ccec515059dfd. --- samples/hosted-agent/sample-catalog.json | 886 +++++++++++++++++++++++ 1 file changed, 886 insertions(+) create mode 100644 samples/hosted-agent/sample-catalog.json diff --git a/samples/hosted-agent/sample-catalog.json b/samples/hosted-agent/sample-catalog.json new file mode 100644 index 0000000..78e3662 --- /dev/null +++ b/samples/hosted-agent/sample-catalog.json @@ -0,0 +1,886 @@ +{ + "commitSha": "9c4e42a1eedcec32c1582bebeb83a381a23efbe1", + "repo": "https://github.com/microsoft-foundry/foundry-samples/", + "generatedAt": "2026-07-07T03:18:38Z", + "dimensions": { + "language": { + "title": "Select a Language", + "placeholder": "Choose the language for your agent", + "options": [ + { + "id": "python", + "displayName": "Python" + }, + { + "id": "csharp", + "displayName": "C# (.NET)" + } + ] + }, + "framework": { + "title": "Select a Framework", + "placeholder": "Choose the framework for your agent", + "options": [ + { + "id": "copilot-sdk", + "displayName": "Copilot SDK" + }, + { + "id": "agent-framework", + "displayName": "Agent Framework" + }, + { + "id": "bring-your-own", + "displayName": "Bring Your Own" + }, + { + "id": "langgraph", + "displayName": "LangGraph" + } + ] + }, + "protocol": { + "title": "Select a Protocol", + "placeholder": "Choose the protocol for your agent", + "options": [ + { + "id": "responses", + "displayName": "Responses API" + }, + { + "id": "invocations", + "displayName": "Invocations API" + }, + { + "id": "invocations_ws", + "displayName": "Invocations (WebSocket)" + } + ] + } + }, + "templateSelection": { + "title": "Select a Template", + "placeholder": "Choose a template for your agent" + }, + "templates": [ + { + "language": "csharp", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Caller", + "description": "Concierge agent that delegates questions to a remote specialist and summarizes answers.", + "path": "samples/csharp/hosted-agents/agent-framework/a2a/01-delegation/caller", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Executor", + "description": "Answers arithmetic and math questions as an expert agent.", + "path": "samples/csharp/hosted-agents/agent-framework/a2a/01-delegation/executor", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Agent Skills", + "description": "Agent that loads behavioral guidelines from Foundry Skills at startup for dynamic updates.", + "path": "samples/csharp/hosted-agents/agent-framework/agent-skills", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Azure Search RAG", + "description": "Support agent answers questions using a keyword-indexed knowledge base for grounding.", + "path": "samples/csharp/hosted-agents/agent-framework/azure-search-rag", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Browser Automation", + "description": "Automates web browsing, scraping, and form filling in a remote Chromium browser.", + "path": "samples/csharp/hosted-agents/agent-framework/browser-automation", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "File Tools", + "description": "Agent answers questions using bundled and user-uploaded files as knowledge sources.", + "path": "samples/csharp/hosted-agents/agent-framework/file-tools", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Foundry Memory RAG", + "description": "Personal coach agent that remembers user preferences and goals across sessions.", + "path": "samples/csharp/hosted-agents/agent-framework/foundry-memory-rag", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Foundry Toolbox MCP Skills", + "description": "Agent that dynamically discovers and uses skills from a remote toolbox endpoint.", + "path": "samples/csharp/hosted-agents/agent-framework/foundry-toolbox-mcp-skills", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Foundry Toolbox Server Side", + "description": "Agent that uses tools from a Foundry Toolbox, invoked server-side by the platform.", + "path": "samples/csharp/hosted-agents/agent-framework/foundry-toolbox-server-side", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Hello World", + "description": "Minimal hosted agent that responds to user questions and supports multi-turn conversation.", + "path": "samples/csharp/hosted-agents/agent-framework/hello-world", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "agent-framework", + "protocol": "invocations", + "displayName": "Invocations Echo Agent", + "description": "Echoes back input messages with a simple prefix for testing agent hosting.", + "path": "samples/csharp/hosted-agents/agent-framework/invocations-echo-agent", + "requiresModel": false + }, + { + "language": "csharp", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Local Tools", + "description": "Hotel search assistant that uses local function tools for queries.", + "path": "samples/csharp/hosted-agents/agent-framework/local-tools", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "MCP Tools", + "description": "Agent answers questions by searching documentation using integrated tool providers.", + "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", + "protocol": "responses", + "displayName": "Simple Agent", + "description": "General-purpose AI assistant that replies to user input with model-generated responses.", + "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", + "protocol": "responses", + "displayName": "Text Search RAG", + "description": "Agent answers support questions using retrieved passages from external documents.", + "path": "samples/csharp/hosted-agents/agent-framework/text-search-rag", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Toolbox Auth Paths", + "description": "Agent toolbox demonstrates different authentication methods for accessing upstream tools.", + "path": "samples/csharp/hosted-agents/agent-framework/toolbox-auth-paths", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Workflows", + "description": "Workflow chains three translation agents to show intermediate language outputs.", + "path": "samples/csharp/hosted-agents/agent-framework/workflows", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "bring-your-own", + "protocol": "invocations", + "displayName": "HelloWorld", + "description": "Hosted agent that returns a streaming hello world response from a Foundry model.", + "path": "samples/csharp/hosted-agents/bring-your-own/invocations/HelloWorld", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "bring-your-own", + "protocol": "invocations", + "displayName": "Human In The Loop", + "description": "Agent that generates proposals and waits for human approval before proceeding.", + "path": "samples/csharp/hosted-agents/bring-your-own/invocations/human-in-the-loop", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "bring-your-own", + "protocol": "invocations", + "displayName": "Notetaking Agent", + "description": "Agent that saves and retrieves session-persistent notes with real-time streaming responses.", + "path": "samples/csharp/hosted-agents/bring-your-own/invocations/notetaking-agent", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "bring-your-own", + "protocol": "invocations_ws", + "displayName": "HelloWorld", + "description": "Routes real-time audio between a browser and a managed voice service session.", + "path": "samples/csharp/hosted-agents/bring-your-own/invocations_ws/HelloWorld", + "requiresModel": false + }, + { + "language": "csharp", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "HelloWorld", + "description": "Minimal hosted agent that returns a greeting from a Foundry model using the Responses API.", + "path": "samples/csharp/hosted-agents/bring-your-own/responses/HelloWorld", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "Background Agent", + "description": "Handles research analysis requests asynchronously with background processing and streaming updates.", + "path": "samples/csharp/hosted-agents/bring-your-own/responses/background-agent", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "Browser Automation", + "description": "", + "path": "samples/csharp/hosted-agents/bring-your-own/responses/browser-automation", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "Env Vars Agent", + "description": "Agent retrieves environment variable values with safety policies based on their type.", + "path": "samples/csharp/hosted-agents/bring-your-own/responses/env-vars-agent", + "requiresModel": true + }, + { + "language": "csharp", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "Notetaking Agent", + "description": "Agent that saves and retrieves session-persistent notes for each user.", + "path": "samples/csharp/hosted-agents/bring-your-own/responses/notetaking-agent", + "requiresModel": true + }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Caller", + "description": "Concierge agent that delegates questions to a remote specialist and summarizes the answers.", + "path": "samples/python/hosted-agents/agent-framework/a2a/01-delegation/caller", + "requiresModel": true + }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Executor", + "description": "Answers arithmetic and math questions as an expert agent.", + "path": "samples/python/hosted-agents/agent-framework/a2a/01-delegation/executor", + "requiresModel": true + }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "invocations", + "displayName": "Basic", + "description": "Agent with in-memory session management for multi-turn conversations.", + "path": "samples/python/hosted-agents/agent-framework/invocations/01-basic", + "requiresModel": true + }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Basic", + "description": "Agent that supports multi-turn conversations with response tracking.", + "path": "samples/python/hosted-agents/agent-framework/responses/01-basic", + "requiresModel": true + }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Tools", + "description": "Agent with custom tools like weather lookup callable during conversation.", + "path": "samples/python/hosted-agents/agent-framework/responses/02-tools", + "requiresModel": true + }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "MCP", + "description": "Agent that dynamically discovers and invokes tools from a remote GitHub Copilot MCP server.", + "path": "samples/python/hosted-agents/agent-framework/responses/03-mcp", + "requiresModel": true + }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Foundry Toolbox", + "description": "Agent that discovers and invokes centrally managed tools from a Foundry Toolbox.", + "path": "samples/python/hosted-agents/agent-framework/responses/04-foundry-toolbox", + "requiresModel": true + }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Workflows", + "description": "Processes requests through slogan writing, legal review, and formatting agents in sequence.", + "path": "samples/python/hosted-agents/agent-framework/responses/05-workflows", + "requiresModel": true + }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Files", + "description": "Agent that lists, reads, and interprets files using shell and code tools.", + "path": "samples/python/hosted-agents/agent-framework/responses/06-files", + "requiresModel": true + }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Skills", + "description": "Agent that discovers and runs local file-based skills like generating PDF travel guides.", + "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", + "protocol": "responses", + "displayName": "Observability", + "description": "Agent with built-in observability and telemetry for diagnostics and monitoring.", + "path": "samples/python/hosted-agents/agent-framework/responses/08-observability", + "requiresModel": true + }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Declarative Customer Support", + "description": "Customer support triage agent that routes requests to specialized agents based on conversation history.", + "path": "samples/python/hosted-agents/agent-framework/responses/09-declarative-customer-support", + "requiresModel": true + }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Downstream Azure", + "description": "Agent performs data operations on Blob Storage and Service Bus using its own identity.", + "path": "samples/python/hosted-agents/agent-framework/responses/10-downstream-azure", + "requiresModel": true + }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Azure Search RAG", + "description": "Answers questions using product documentation and cites sources from a search index.", + "path": "samples/python/hosted-agents/agent-framework/responses/11-azure-search-rag", + "requiresModel": true + }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Foundry Skills", + "description": "Agent that loads behavioral guidelines from Foundry Skills at startup for dynamic updates.", + "path": "samples/python/hosted-agents/agent-framework/responses/12-foundry-skills", + "requiresModel": true + }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Foundry Memory", + "description": "Agent that remembers user facts across sessions using persistent semantic memory.", + "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": "agent-framework", + "protocol": "responses", + "displayName": "Optimization Travel Approver", + "description": "Agent that reviews and approves travel requests for employees.", + "path": "samples/python/hosted-agents/agent-framework/responses/15-optimization-travel-approver", + "requiresModel": true + }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Content Safety Guardrail", + "description": "Agent screens prompts and responses for harmful content based on a safety policy.", + "path": "samples/python/hosted-agents/agent-framework/responses/16-content-safety-guardrail", + "requiresModel": true + }, + { + "language": "python", + "framework": "agent-framework", + "protocol": "responses", + "displayName": "Foundry Iq Toolbox", + "description": "Answers user questions using a knowledge base accessed through a remote toolbox connection.", + "path": "samples/python/hosted-agents/agent-framework/responses/17-foundry-iq-toolbox", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "invocations", + "displayName": "AG UI", + "description": "Agent that streams AG-UI lifecycle events in response to user input.", + "path": "samples/python/hosted-agents/bring-your-own/invocations/ag-ui", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "invocations", + "displayName": "Claude Agent SDK", + "description": "Agent that streams responses from a Claude model for plain text input.", + "path": "samples/python/hosted-agents/bring-your-own/invocations/claude-agent-sdk", + "requiresModel": false + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "invocations", + "displayName": "Diagnostic Agent", + "description": "Runs network probes on hostnames and returns a JSON report of connectivity results.", + "path": "samples/python/hosted-agents/bring-your-own/invocations/diagnostic-agent", + "requiresModel": false + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "invocations", + "displayName": "Event Grid Trigger", + "description": "Processes new blobs in Azure Storage by summarizing content and saving results to a summary container.", + "path": "samples/python/hosted-agents/bring-your-own/invocations/event-grid-trigger", + "requiresModel": true + }, + { + "language": "python", + "framework": "copilot-sdk", + "protocol": "invocations", + "displayName": "GitHub Copilot", + "description": "Agent streams Copilot session events with support for multi-turn conversations.", + "path": "samples/python/hosted-agents/bring-your-own/invocations/github-copilot", + "requiresModel": false + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "invocations", + "displayName": "Hello World", + "description": "Hosted agent that streams a model's reply as a server-sent event.", + "path": "samples/python/hosted-agents/bring-your-own/invocations/hello-world", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "invocations", + "displayName": "Human In The Loop", + "description": "Agent that generates proposals and waits for human approval before proceeding.", + "path": "samples/python/hosted-agents/bring-your-own/invocations/human-in-the-loop", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "invocations", + "displayName": "Langgraph Chat", + "description": "Conversational agent with session history and built-in time and calculator tools.", + "path": "samples/python/hosted-agents/bring-your-own/invocations/langgraph-chat", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "invocations", + "displayName": "Notetaking Agent", + "description": "Agent that saves and retrieves notes with per-session isolation and streaming responses.", + "path": "samples/python/hosted-agents/bring-your-own/invocations/notetaking-agent", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "invocations", + "displayName": "Toolbox", + "description": "Agent connects to a toolbox server and enables tool discovery and invocation during chat.", + "path": "samples/python/hosted-agents/bring-your-own/invocations/toolbox", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "invocations_ws", + "displayName": "Duplex Live Agent", + "description": "Real-time voice agent that handles conversation and background tasks in parallel.", + "path": "samples/python/hosted-agents/bring-your-own/invocations_ws/duplex-live-agent", + "requiresModel": false + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "invocations_ws", + "displayName": "Hello World", + "description": "Real-time voice agent that relays audio and events between browser and a managed service.", + "path": "samples/python/hosted-agents/bring-your-own/invocations_ws/hello-world", + "requiresModel": false + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "invocations_ws", + "displayName": "Livekit Server", + "description": "Voice agent connects to a LiveKit server for real-time audio conversations.", + "path": "samples/python/hosted-agents/bring-your-own/invocations_ws/livekit-server", + "requiresModel": false + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "invocations_ws", + "displayName": "Pipecat Webrtc", + "description": "Real-time voice agent with multi-agent pipeline and WebRTC audio media support.", + "path": "samples/python/hosted-agents/bring-your-own/invocations_ws/pipecat-webrtc", + "requiresModel": false + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "invocations_ws", + "displayName": "Pipecat Ws Server", + "description": "Real-time voice agent with greeting and order-checking capabilities.", + "path": "samples/python/hosted-agents/bring-your-own/invocations_ws/pipecat-ws-server", + "requiresModel": false + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "Background Agent", + "description": "Handles long-running research analysis requests with background processing and streaming updates.", + "path": "samples/python/hosted-agents/bring-your-own/responses/background-agent", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "Bring Your Own Toolbox", + "description": "Agent connects to a remote toolbox and enables tool invocation during conversations.", + "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", + "protocol": "responses", + "displayName": "Env Vars Agent", + "description": "Agent that reveals environment variable values with safety policies based on their type.", + "path": "samples/python/hosted-agents/bring-your-own/responses/env-vars-agent", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "Hello World", + "description": "Hosted agent that returns a hello world message from a Foundry model using a custom backend.", + "path": "samples/python/hosted-agents/bring-your-own/responses/hello-world", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "Langgraph Chat", + "description": "Conversational agent with built-in calculator and time tools, streaming responses.", + "path": "samples/python/hosted-agents/bring-your-own/responses/langgraph-chat", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "Langgraph Toolbox", + "description": "Agent that dynamically loads tools from a remote toolbox and handles incoming requests.", + "path": "samples/python/hosted-agents/bring-your-own/responses/langgraph-toolbox", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "Langgraph Toolbox User Identity", + "description": "Agent that accesses mail, calendar, and GitHub tools for user-identity scenarios.", + "path": "samples/python/hosted-agents/bring-your-own/responses/langgraph-toolbox-user-identity", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "Notetaking Agent", + "description": "Agent that saves and retrieves notes with per-session isolation and streaming responses.", + "path": "samples/python/hosted-agents/bring-your-own/responses/notetaking-agent", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "OpenAI Agents SDK", + "description": "Minimal agent that streams text responses from a Foundry model.", + "path": "samples/python/hosted-agents/bring-your-own/responses/openai-agents-sdk", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "Optimization Customer Support", + "description": "Customer support agent for troubleshooting and product assistance.", + "path": "samples/python/hosted-agents/bring-your-own/responses/optimization-customer-support", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "Optimization Hello World", + "description": "Minimal hosted agent that returns a static greeting message.", + "path": "samples/python/hosted-agents/bring-your-own/responses/optimization-hello-world", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "Session Multiplexing", + "description": "Supports multiple users sharing a session while keeping response chains user-specific.", + "path": "samples/python/hosted-agents/bring-your-own/responses/session-multiplexing", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "responses", + "displayName": "Foreground Background Agents Responses Voicelive", + "description": "Voice agent that routes quick replies to users and delegates long tasks to a background worker.", + "path": "samples/python/hosted-agents/bring-your-own/voicelive/foreground-background-agents-responses-voicelive", + "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", + "protocol": "invocations", + "displayName": "Hello World Invocations Voicelive", + "description": "Minimal hosted agent for real-time voice interactions with audio transcription streaming.", + "path": "samples/python/hosted-agents/bring-your-own/voicelive/hello-world-invocations-voicelive", + "requiresModel": true + }, + { + "language": "python", + "framework": "bring-your-own", + "protocol": "invocations", + "displayName": "Hotel Booking Invocations Voicelive", + "description": "Hotel booking agent that handles speech and UI actions with session state and streaming.", + "path": "samples/python/hosted-agents/bring-your-own/voicelive/hotel-booking-invocations-voicelive", + "requiresModel": true + }, + { + "language": "python", + "framework": "langgraph", + "protocol": "responses", + "displayName": "A2a Caller", + "description": "Concierge agent that delegates specialist questions to a remote expert agent.", + "path": "samples/python/hosted-agents/langgraph/a2a/a2a-caller", + "requiresModel": true + }, + { + "language": "python", + "framework": "langgraph", + "protocol": "responses", + "displayName": "A2a Executor", + "description": "Math expert agent that answers questions and explains steps, callable by other agents.", + "path": "samples/python/hosted-agents/langgraph/a2a/a2a-executor", + "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": "Langgraph Toolbox", + "description": "Agent that uses a toolbox for web search and GitHub Copilot MCP tools with managed credentials.", + "path": "samples/python/hosted-agents/langgraph/responses/02-langgraph-toolbox", + "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 + } + ] +} From 7b58ff2b63c057869c10a67e718243a7a6c80a0b Mon Sep 17 00:00:00 2001 From: Yimin Jin Date: Thu, 23 Jul 2026 13:43:23 +0800 Subject: [PATCH 6/6] ci: pin curated hosted-agent samples to top of catalog Adds PINNED_TEMPLATE_PATHS and reorderPinnedFirst so the generated sample-catalog.json lists the framework hello-world and most-requested samples first. Gallery order is now controlled entirely by the catalog JSON. --- .github/scripts/generate_sample_catalog.mjs | 56 ++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/.github/scripts/generate_sample_catalog.mjs b/.github/scripts/generate_sample_catalog.mjs index b76d887..4a888be 100644 --- a/.github/scripts/generate_sample_catalog.mjs +++ b/.github/scripts/generate_sample_catalog.mjs @@ -84,6 +84,28 @@ const TEMPLATE_SELECTION = { placeholder: 'Choose a template for your agent', }; +// Sample paths pinned to the top of the gallery, in display order. Curated by +// PM — the framework-level "hello world" and most-requested samples. These are +// moved to the front of the generated `templates` array by reorderPinnedFirst +// (a pin with no matching scanned template is skipped with a warning). The +// generated `templates` order IS the gallery order — the VS Code webview renders +// it as-is, with no client-side pinning. +/** @type {string[]} */ +const PINNED_TEMPLATE_PATHS = [ + // Framework-level hello world samples + 'samples/python/hosted-agents/agent-framework/responses/01-basic', // MAF Hello World (Python, Responses) + 'samples/python/hosted-agents/bring-your-own/invocations/github-copilot', // Copilot SDK + 'samples/python/hosted-agents/langgraph/responses/01-langgraph-chat', // LangGraph Chat (Responses) + // Most requested: Toolbox, MCP, Workflow, BYO samples + 'samples/python/hosted-agents/langgraph/responses/02-langgraph-toolbox', // LG Foundry Toolbox (Responses) + 'samples/python/hosted-agents/agent-framework/responses/04-foundry-toolbox', // MAF Foundry Toolbox + 'samples/python/hosted-agents/agent-framework/responses/05-workflows', // MAF Workflows + 'samples/python/hosted-agents/langgraph/responses/05-workflows', // LG Workflows + 'samples/python/hosted-agents/agent-framework/responses/11-azure-search-rag', // MAF Azure Search RAG + 'samples/python/hosted-agents/bring-your-own/invocations/claude-agent-sdk', // BYO Claude Agent SDK + 'samples/python/hosted-agents/bring-your-own/responses/openai-agents-sdk', // BYO OpenAI Agent SDK +]; + // Path segments must be alphanumeric, hyphens, underscores, or dots const SAFE_PATH_SEGMENT = /^[a-zA-Z0-9._-]+$/; @@ -846,6 +868,37 @@ async function autoFillDisplayFields(templates, commitSha) { } } +/** + * Reorder templates so the curated pins come first, in the declared + * PINNED_TEMPLATE_PATHS order, followed by every other template in its existing + * scan order. A pinned path with no matching template is skipped and surfaced + * as a warning. This makes the generated `templates` array itself the single + * source of truth for gallery order — the VS Code webview renders it as-is, + * with no client-side pinning. + * + * @template {{ path: string }} T + * @param {T[]} templates + * @returns {T[]} + */ +function reorderPinnedFirst(templates) { + const byPath = new Map(templates.map((t) => [t.path, t])); + /** @type {T[]} */ + const pinned = []; + /** @type {Set} */ + const pinnedPaths = new Set(); + for (const path of PINNED_TEMPLATE_PATHS) { + const template = byPath.get(path); + if (template) { + pinned.push(template); + pinnedPaths.add(path); + } else { + warn(`Pinned path "${path}" matches no scanned template; it will not be pinned (check PINNED_TEMPLATE_PATHS — upstream may have renamed or removed the sample).`); + } + } + const rest = templates.filter((t) => !pinnedPaths.has(t.path)); + return [...pinned, ...rest]; +} + async function main() { const commitSha = parseCommitShaArg(); console.log(`Using commit: ${commitSha}`); @@ -866,6 +919,7 @@ async function main() { await autoFillDisplayFields(templates, commitSha); const dimensions = buildDimensions(templates); + const orderedTemplates = reorderPinnedFirst(templates); const catalog = { commitSha, @@ -873,7 +927,7 @@ async function main() { generatedAt: new Date().toISOString().replace(/\.\d{3}Z$/, 'Z'), dimensions, templateSelection: TEMPLATE_SELECTION, - templates, + templates: orderedTemplates, }; const outputDir = dirname(OUTPUT_PATH);