diff --git a/.github/upstream-watch-state.json b/.github/upstream-watch-state.json index bb03bc3..20d45ea 100644 --- a/.github/upstream-watch-state.json +++ b/.github/upstream-watch-state.json @@ -1,913 +1,913 @@ { "watches": { "agent-framework-docs-integrations-ag-ui": { - "etag": "\"S22skJzrEtrSaA5f+hSL8dc848E=\"", - "human": "AG-UI Integration with Agent Framework | Microsoft Learn | ETag \"S22skJzrEtrSaA5f+hSL8dc848E=\"", + "etag": "\"Xt8IuvVvUvQUrdshcbBF10zCuqs=\"", + "human": "AG-UI Integration with Agent Framework | Microsoft Learn | ETag \"Xt8IuvVvUvQUrdshcbBF10zCuqs=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/integrations/ag-ui/", "title": "AG-UI Integration with Agent Framework | Microsoft Learn", - "value": "\"S22skJzrEtrSaA5f+hSL8dc848E=\"" + "value": "\"Xt8IuvVvUvQUrdshcbBF10zCuqs=\"" }, "agent-framework-docs-integrations-ag-ui-backend-tool-rendering": { - "etag": "\"jdSe+Wwi8ETWwCsrAwtFdwnzqaE=\"", - "human": "Backend Tool Rendering with AG-UI | Microsoft Learn | ETag \"jdSe+Wwi8ETWwCsrAwtFdwnzqaE=\"", + "etag": "\"OC+DFzPt0Ta2uCIQW67Ze14aOvY=\"", + "human": "Backend Tool Rendering with AG-UI | Microsoft Learn | ETag \"OC+DFzPt0Ta2uCIQW67Ze14aOvY=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/integrations/ag-ui/backend-tool-rendering", "title": "Backend Tool Rendering with AG-UI | Microsoft Learn", - "value": "\"jdSe+Wwi8ETWwCsrAwtFdwnzqaE=\"" + "value": "\"OC+DFzPt0Ta2uCIQW67Ze14aOvY=\"" }, "agent-framework-docs-integrations-ag-ui-frontend-tools": { - "etag": "\"kjltpoScX+R2tcHx15Mqmh2Pop0=\"", - "human": "Frontend Tool Rendering with AG-UI | Microsoft Learn | ETag \"kjltpoScX+R2tcHx15Mqmh2Pop0=\"", + "etag": "\"w5S/BBnaJ9HS7IrylqGX4Hti3bU=\"", + "human": "Frontend Tool Rendering with AG-UI | Microsoft Learn | ETag \"w5S/BBnaJ9HS7IrylqGX4Hti3bU=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/integrations/ag-ui/frontend-tools", "title": "Frontend Tool Rendering with AG-UI | Microsoft Learn", - "value": "\"kjltpoScX+R2tcHx15Mqmh2Pop0=\"" + "value": "\"w5S/BBnaJ9HS7IrylqGX4Hti3bU=\"" }, "agent-framework-docs-integrations-ag-ui-getting-started": { - "etag": "\"jUenNfX1/xIZOk3CGYoKmX1e1Kg=\"", - "human": "Getting Started with AG-UI | Microsoft Learn | ETag \"jUenNfX1/xIZOk3CGYoKmX1e1Kg=\"", + "etag": "\"M+oy8J/BaoleWOPGg9dv75jProI=\"", + "human": "Getting Started with AG-UI | Microsoft Learn | ETag \"M+oy8J/BaoleWOPGg9dv75jProI=\"", "kind": "http_document", "last_modified": "Mon, 23 Feb 2026 23:55:43 GMT", "source_url": "https://learn.microsoft.com/agent-framework/integrations/ag-ui/getting-started", "title": "Getting Started with AG-UI | Microsoft Learn", - "value": "\"jUenNfX1/xIZOk3CGYoKmX1e1Kg=\"" + "value": "\"M+oy8J/BaoleWOPGg9dv75jProI=\"" }, "agent-framework-docs-integrations-ag-ui-human-in-the-loop": { - "etag": "\"rMrzi+njn86JVtaCXCrgfZTICYU=\"", - "human": "Human-in-the-Loop with AG-UI | Microsoft Learn | ETag \"rMrzi+njn86JVtaCXCrgfZTICYU=\"", + "etag": "\"rOERnMl8F4zK4LsYTzRx4Nc3rTQ=\"", + "human": "Human-in-the-Loop with AG-UI | Microsoft Learn | ETag \"rOERnMl8F4zK4LsYTzRx4Nc3rTQ=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/integrations/ag-ui/human-in-the-loop", "title": "Human-in-the-Loop with AG-UI | Microsoft Learn", - "value": "\"rMrzi+njn86JVtaCXCrgfZTICYU=\"" + "value": "\"rOERnMl8F4zK4LsYTzRx4Nc3rTQ=\"" }, "agent-framework-docs-integrations-ag-ui-security-considerations": { - "etag": "\"kFojK+whX3VUccCpz1kycaFGItg=\"", - "human": "Security Considerations for AG-UI | Microsoft Learn | ETag \"kFojK+whX3VUccCpz1kycaFGItg=\"", + "etag": "\"Ero0Jtz3JWr/pnHBJIG4guXnZUc=\"", + "human": "Security Considerations for AG-UI | Microsoft Learn | ETag \"Ero0Jtz3JWr/pnHBJIG4guXnZUc=\"", "kind": "http_document", "last_modified": "Wed, 28 Jan 2026 16:46:04 GMT", "source_url": "https://learn.microsoft.com/agent-framework/integrations/ag-ui/security-considerations", "title": "Security Considerations for AG-UI | Microsoft Learn", - "value": "\"kFojK+whX3VUccCpz1kycaFGItg=\"" + "value": "\"Ero0Jtz3JWr/pnHBJIG4guXnZUc=\"" }, "agent-framework-docs-integrations-ag-ui-state-management": { - "etag": "\"3/0J5nsbaVxFxtWaSrvUfRJRU6M=\"", - "human": "State Management with AG-UI | Microsoft Learn | ETag \"3/0J5nsbaVxFxtWaSrvUfRJRU6M=\"", + "etag": "\"Tztr1KNsqy3ZIcnEX5H+qO3/QKM=\"", + "human": "State Management with AG-UI | Microsoft Learn | ETag \"Tztr1KNsqy3ZIcnEX5H+qO3/QKM=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/integrations/ag-ui/state-management", "title": "State Management with AG-UI | Microsoft Learn", - "value": "\"3/0J5nsbaVxFxtWaSrvUfRJRU6M=\"" + "value": "\"Tztr1KNsqy3ZIcnEX5H+qO3/QKM=\"" }, "agent-framework-docs-integrations-ag-ui-testing-with-dojo": { - "etag": "\"ebZ9eMvZpWAvcEh+8ESj00ZvhLI=\"", - "human": "Testing with AG-UI Dojo | Microsoft Learn | ETag \"ebZ9eMvZpWAvcEh+8ESj00ZvhLI=\"", + "etag": "\"rdZEoCcoogOiOOPdTaV+tZLmegw=\"", + "human": "Testing with AG-UI Dojo | Microsoft Learn | ETag \"rdZEoCcoogOiOOPdTaV+tZLmegw=\"", "kind": "http_document", "last_modified": "Wed, 11 Feb 2026 00:40:58 GMT", "source_url": "https://learn.microsoft.com/agent-framework/integrations/ag-ui/testing-with-dojo", "title": "Testing with AG-UI Dojo | Microsoft Learn", - "value": "\"ebZ9eMvZpWAvcEh+8ESj00ZvhLI=\"" + "value": "\"rdZEoCcoogOiOOPdTaV+tZLmegw=\"" }, "agent-framework-docs-migration-guide-from-autogen": { - "etag": "\"1crIjmBoGCBnz3iBSQA9mpI1jW4=\"", - "human": "AutoGen to Microsoft Agent Framework Migration Guide | Microsoft Learn | ETag \"1crIjmBoGCBnz3iBSQA9mpI1jW4=\"", + "etag": "\"XohH/tZ6iBekelsiV1hvEGWPNqE=\"", + "human": "AutoGen to Microsoft Agent Framework Migration Guide | Microsoft Learn | ETag \"XohH/tZ6iBekelsiV1hvEGWPNqE=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/migration-guide/from-autogen/", "title": "AutoGen to Microsoft Agent Framework Migration Guide | Microsoft Learn", - "value": "\"1crIjmBoGCBnz3iBSQA9mpI1jW4=\"" + "value": "\"XohH/tZ6iBekelsiV1hvEGWPNqE=\"" }, "agent-framework-docs-migration-guide-from-semantic-kernel": { - "etag": "\"jdU8sUDAyqU+WG8xI0aYWiRgPI4=\"", - "human": "Semantic Kernel to Microsoft Agent Framework Migration Guide | Microsoft Learn | ETag \"jdU8sUDAyqU+WG8xI0aYWiRgPI4=\"", + "etag": "\"XryLnHDS1ntKiBt0trcK3tZuFkc=\"", + "human": "Semantic Kernel to Microsoft Agent Framework Migration Guide | Microsoft Learn | ETag \"XryLnHDS1ntKiBt0trcK3tZuFkc=\"", "kind": "http_document", "last_modified": "Mon, 23 Feb 2026 23:55:43 GMT", "source_url": "https://learn.microsoft.com/agent-framework/migration-guide/from-semantic-kernel/", "title": "Semantic Kernel to Microsoft Agent Framework Migration Guide | Microsoft Learn", - "value": "\"jdU8sUDAyqU+WG8xI0aYWiRgPI4=\"" + "value": "\"XryLnHDS1ntKiBt0trcK3tZuFkc=\"" }, "agent-framework-docs-migration-guide-from-semantic-kernel-samples": { - "etag": "\"nGbqvuvcsR/iBpep6ZuCk4RLVEk=\"", - "human": "Semantic Kernel to Microsoft Agent Framework Migration Samples | Microsoft Learn | ETag \"nGbqvuvcsR/iBpep6ZuCk4RLVEk=\"", + "etag": "\"ty/fNNp9C/78YBpadDiIS+EIII4=\"", + "human": "Semantic Kernel to Microsoft Agent Framework Migration Samples | Microsoft Learn | ETag \"ty/fNNp9C/78YBpadDiIS+EIII4=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/migration-guide/from-semantic-kernel/samples", "title": "Semantic Kernel to Microsoft Agent Framework Migration Samples | Microsoft Learn", - "value": "\"nGbqvuvcsR/iBpep6ZuCk4RLVEk=\"" + "value": "\"ty/fNNp9C/78YBpadDiIS+EIII4=\"" }, "agent-framework-docs-overview": { - "etag": "\"XfqjOfR3HmCUkt/QXwONoGzs5/Y=\"", - "human": "Microsoft Agent Framework Overview | Microsoft Learn | ETag \"XfqjOfR3HmCUkt/QXwONoGzs5/Y=\"", + "etag": "\"RLVvV+jIPjUcyyZ/B16J2Q9Dwvw=\"", + "human": "Microsoft Agent Framework Overview | Microsoft Learn | ETag \"RLVvV+jIPjUcyyZ/B16J2Q9Dwvw=\"", "kind": "http_document", "last_modified": "Fri, 20 Feb 2026 16:00:19 GMT", "source_url": "https://learn.microsoft.com/agent-framework/overview/", "title": "Microsoft Agent Framework Overview | Microsoft Learn", - "value": "\"XfqjOfR3HmCUkt/QXwONoGzs5/Y=\"" + "value": "\"RLVvV+jIPjUcyyZ/B16J2Q9Dwvw=\"" }, "agent-framework-docs-support": { - "etag": "\"F0aIuz4DrAH68ETfYS74I/ZqVgs=\"", - "human": "Support for Agent Framework | Microsoft Learn | ETag \"F0aIuz4DrAH68ETfYS74I/ZqVgs=\"", + "etag": "\"Gtf2KhienlfYs/uJYg8A78fT0TE=\"", + "human": "Support for Agent Framework | Microsoft Learn | ETag \"Gtf2KhienlfYs/uJYg8A78fT0TE=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/support/", "title": "Support for Agent Framework | Microsoft Learn", - "value": "\"F0aIuz4DrAH68ETfYS74I/ZqVgs=\"" + "value": "\"Gtf2KhienlfYs/uJYg8A78fT0TE=\"" }, "agent-framework-docs-support-faq": { - "etag": "\"Ck3hNQx7+n2ZGuBNKIsRw6wxE5Y=\"", - "human": "Frequently Asked Questions | Microsoft Learn | ETag \"Ck3hNQx7+n2ZGuBNKIsRw6wxE5Y=\"", + "etag": "\"oi7tXQd460XCcHh0KktR3HtcykE=\"", + "human": "Frequently Asked Questions | Microsoft Learn | ETag \"oi7tXQd460XCcHh0KktR3HtcykE=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/support/faq", "title": "Frequently Asked Questions | Microsoft Learn", - "value": "\"Ck3hNQx7+n2ZGuBNKIsRw6wxE5Y=\"" + "value": "\"oi7tXQd460XCcHh0KktR3HtcykE=\"" }, "agent-framework-docs-support-troubleshooting": { - "etag": "\"xFrJgKypVc9aJfMTkGs6peL2szI=\"", - "human": "Troubleshooting | Microsoft Learn | ETag \"xFrJgKypVc9aJfMTkGs6peL2szI=\"", + "etag": "\"RSY8y7W4yfaRuIuXRzgETVgGoeQ=\"", + "human": "Troubleshooting | Microsoft Learn | ETag \"RSY8y7W4yfaRuIuXRzgETVgGoeQ=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/support/troubleshooting", "title": "Troubleshooting | Microsoft Learn", - "value": "\"xFrJgKypVc9aJfMTkGs6peL2szI=\"" + "value": "\"RSY8y7W4yfaRuIuXRzgETVgGoeQ=\"" }, "agent-framework-docs-support-upgrade": { - "etag": "\"EPpUxLx54rGCU1+86xy0pw70WwU=\"", - "human": "Upgrade guides for Agent Framework | Microsoft Learn | ETag \"EPpUxLx54rGCU1+86xy0pw70WwU=\"", + "etag": "\"n80cUKf0lzuY3WCZxm4ItyTZh3Q=\"", + "human": "Upgrade guides for Agent Framework | Microsoft Learn | ETag \"n80cUKf0lzuY3WCZxm4ItyTZh3Q=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/support/upgrade/", "title": "Upgrade guides for Agent Framework | Microsoft Learn", - "value": "\"EPpUxLx54rGCU1+86xy0pw70WwU=\"" + "value": "\"n80cUKf0lzuY3WCZxm4ItyTZh3Q=\"" }, "agent-framework-docs-tutorials-agents-agent-as-mcp-tool": { - "etag": "\"uv3y0HbtWn73UdiCkCZlA0ZxKM4=\"", - "human": "MCP and Foundry Agents | Microsoft Learn | ETag \"uv3y0HbtWn73UdiCkCZlA0ZxKM4=\"", + "etag": "\"UMlIRN23iskgL8L+fqk4tT7go5E=\"", + "human": "MCP and Foundry Agents | Microsoft Learn | ETag \"UMlIRN23iskgL8L+fqk4tT7go5E=\"", "kind": "http_document", - "last_modified": "Mon, 23 Feb 2026 23:55:43 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/agents/agent-as-mcp-tool", "title": "MCP and Foundry Agents | Microsoft Learn", - "value": "\"uv3y0HbtWn73UdiCkCZlA0ZxKM4=\"" + "value": "\"UMlIRN23iskgL8L+fqk4tT7go5E=\"" }, "agent-framework-docs-tutorials-agents-create-and-run-durable-agent": { - "etag": "\"djHVgVcPuuq9mNIFhVzxbRM3qus=\"", - "human": "Azure Functions (Durable) | Microsoft Learn | ETag \"djHVgVcPuuq9mNIFhVzxbRM3qus=\"", + "etag": "\"E5HDwT+FlSxjvuZJAIy6tykoRX4=\"", + "human": "Azure Functions (Durable) | Microsoft Learn | ETag \"E5HDwT+FlSxjvuZJAIy6tykoRX4=\"", "kind": "http_document", "last_modified": "Mon, 23 Feb 2026 23:55:43 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/agents/create-and-run-durable-agent", "title": "Azure Functions (Durable) | Microsoft Learn", - "value": "\"djHVgVcPuuq9mNIFhVzxbRM3qus=\"" + "value": "\"E5HDwT+FlSxjvuZJAIy6tykoRX4=\"" }, "agent-framework-docs-tutorials-agents-enable-observability": { - "etag": "\"MGG1hvkCyUQwFY6wkk5fV9Ek0js=\"", - "human": "Observability | Microsoft Learn | ETag \"MGG1hvkCyUQwFY6wkk5fV9Ek0js=\"", + "etag": "\"O/6SL6fDshir+qKRrVGU/3UyUWE=\"", + "human": "Observability | Microsoft Learn | ETag \"O/6SL6fDshir+qKRrVGU/3UyUWE=\"", "kind": "http_document", - "last_modified": "Thu, 26 Feb 2026 01:47:35 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/agents/enable-observability", "title": "Observability | Microsoft Learn", - "value": "\"MGG1hvkCyUQwFY6wkk5fV9Ek0js=\"" + "value": "\"O/6SL6fDshir+qKRrVGU/3UyUWE=\"" }, "agent-framework-docs-tutorials-agents-function-tools": { - "etag": "\"S4NID0A/C2KmT7G2D22GuhUPF4A=\"", - "human": "Using function tools with an agent | Microsoft Learn | ETag \"S4NID0A/C2KmT7G2D22GuhUPF4A=\"", + "etag": "\"DT1lOWIq55dmzO/+AvJ+3T6cIcQ=\"", + "human": "Using function tools with an agent | Microsoft Learn | ETag \"DT1lOWIq55dmzO/+AvJ+3T6cIcQ=\"", "kind": "http_document", - "last_modified": "Tue, 17 Mar 2026 11:09:50 GMT", + "last_modified": "Thu, 26 Mar 2026 02:08:20 GMT", "source_url": "https://learn.microsoft.com/agent-framework/agents/tools/function-tools", "title": "Using function tools with an agent | Microsoft Learn", - "value": "\"S4NID0A/C2KmT7G2D22GuhUPF4A=\"" + "value": "\"DT1lOWIq55dmzO/+AvJ+3T6cIcQ=\"" }, "agent-framework-docs-tutorials-agents-function-tools-approvals": { - "etag": "\"zHWPX76vOuLCGmVSZFt4RDHJJLc=\"", - "human": "Using function tools with human in the loop approvals | Microsoft Learn | ETag \"zHWPX76vOuLCGmVSZFt4RDHJJLc=\"", + "etag": "\"Ex+lY2fL6BoEl8+AYWE/01rRSIQ=\"", + "human": "Using function tools with human in the loop approvals | Microsoft Learn | ETag \"Ex+lY2fL6BoEl8+AYWE/01rRSIQ=\"", "kind": "http_document", - "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/agents/function-tools-approvals", "title": "Using function tools with human in the loop approvals | Microsoft Learn", - "value": "\"zHWPX76vOuLCGmVSZFt4RDHJJLc=\"" + "value": "\"Ex+lY2fL6BoEl8+AYWE/01rRSIQ=\"" }, "agent-framework-docs-tutorials-agents-images": { - "etag": "\"BWG437EvicrTHYzd7Dis0zuvOgg=\"", - "human": "Using images with an agent | Microsoft Learn | ETag \"BWG437EvicrTHYzd7Dis0zuvOgg=\"", + "etag": "\"VUHW0LvXnXFNlufhlimgWxpBf1E=\"", + "human": "Using images with an agent | Microsoft Learn | ETag \"VUHW0LvXnXFNlufhlimgWxpBf1E=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/agents/images", "title": "Using images with an agent | Microsoft Learn", - "value": "\"BWG437EvicrTHYzd7Dis0zuvOgg=\"" + "value": "\"VUHW0LvXnXFNlufhlimgWxpBf1E=\"" }, "agent-framework-docs-tutorials-agents-memory": { - "etag": "\"8S1Od+zuh2f6IXzgQANYYjlmtwI=\"", - "human": "Step 4: Memory & Persistence | Microsoft Learn | ETag \"8S1Od+zuh2f6IXzgQANYYjlmtwI=\"", + "etag": "\"bZVoYhfSpDMXFpPpV43cKzDsIyY=\"", + "human": "Step 4: Memory & Persistence | Microsoft Learn | ETag \"bZVoYhfSpDMXFpPpV43cKzDsIyY=\"", "kind": "http_document", - "last_modified": "Thu, 26 Feb 2026 01:47:35 GMT", + "last_modified": "Thu, 26 Mar 2026 02:08:20 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/agents/memory", "title": "Step 4: Memory & Persistence | Microsoft Learn", - "value": "\"8S1Od+zuh2f6IXzgQANYYjlmtwI=\"" + "value": "\"bZVoYhfSpDMXFpPpV43cKzDsIyY=\"" }, "agent-framework-docs-tutorials-agents-multi-turn-conversation": { - "etag": "\"wZvcrKeZcZeXiRGgfxoyqQGSu/w=\"", - "human": "Session | Microsoft Learn | ETag \"wZvcrKeZcZeXiRGgfxoyqQGSu/w=\"", + "etag": "\"6dakrP70trNUS/K542xd8MS14f0=\"", + "human": "Session | Microsoft Learn | ETag \"6dakrP70trNUS/K542xd8MS14f0=\"", "kind": "http_document", "last_modified": "Fri, 20 Feb 2026 15:37:58 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/agents/multi-turn-conversation", "title": "Session | Microsoft Learn", - "value": "\"wZvcrKeZcZeXiRGgfxoyqQGSu/w=\"" + "value": "\"6dakrP70trNUS/K542xd8MS14f0=\"" }, "agent-framework-docs-tutorials-agents-orchestrate-durable-agents": { - "etag": "\"djHVgVcPuuq9mNIFhVzxbRM3qus=\"", - "human": "Azure Functions (Durable) | Microsoft Learn | ETag \"djHVgVcPuuq9mNIFhVzxbRM3qus=\"", + "etag": "\"E5HDwT+FlSxjvuZJAIy6tykoRX4=\"", + "human": "Azure Functions (Durable) | Microsoft Learn | ETag \"E5HDwT+FlSxjvuZJAIy6tykoRX4=\"", "kind": "http_document", "last_modified": "Mon, 23 Feb 2026 23:55:43 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/agents/orchestrate-durable-agents", "title": "Azure Functions (Durable) | Microsoft Learn", - "value": "\"djHVgVcPuuq9mNIFhVzxbRM3qus=\"" + "value": "\"E5HDwT+FlSxjvuZJAIy6tykoRX4=\"" }, "agent-framework-docs-tutorials-agents-persisted-conversation": { - "etag": "\"nBMq6XiJ5Ssj1SVxnqMHUF/nskE=\"", - "human": "Storage | Microsoft Learn | ETag \"nBMq6XiJ5Ssj1SVxnqMHUF/nskE=\"", + "etag": "\"tBDOzCGqNwdrQ7BFF1NouRavjy0=\"", + "human": "Storage | Microsoft Learn | ETag \"tBDOzCGqNwdrQ7BFF1NouRavjy0=\"", "kind": "http_document", - "last_modified": "Fri, 20 Feb 2026 15:37:58 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/agents/persisted-conversation", "title": "Storage | Microsoft Learn", - "value": "\"nBMq6XiJ5Ssj1SVxnqMHUF/nskE=\"" + "value": "\"tBDOzCGqNwdrQ7BFF1NouRavjy0=\"" }, "agent-framework-docs-tutorials-agents-run-agent": { - "etag": "\"TTxmeISAxGsR+s6ajFafHNdgwk8=\"", - "human": "Running Agents | Microsoft Learn | ETag \"TTxmeISAxGsR+s6ajFafHNdgwk8=\"", + "etag": "\"Ux7ReWtjEja80SOxWOwAiskKPoo=\"", + "human": "Running Agents | Microsoft Learn | ETag \"Ux7ReWtjEja80SOxWOwAiskKPoo=\"", "kind": "http_document", "last_modified": "Fri, 13 Mar 2026 11:30:28 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/agents/run-agent", "title": "Running Agents | Microsoft Learn", - "value": "\"TTxmeISAxGsR+s6ajFafHNdgwk8=\"" + "value": "\"Ux7ReWtjEja80SOxWOwAiskKPoo=\"" }, "agent-framework-docs-tutorials-agents-structured-output": { - "etag": "\"OwfmmFqGOWuaa6KYjjSE7e+WMzk=\"", - "human": "Producing Structured Output with agents | Microsoft Learn | ETag \"OwfmmFqGOWuaa6KYjjSE7e+WMzk=\"", + "etag": "\"Bih2JiIVzwIAQwoiHQqyo3oonZw=\"", + "human": "Producing Structured Output with agents | Microsoft Learn | ETag \"Bih2JiIVzwIAQwoiHQqyo3oonZw=\"", "kind": "http_document", "last_modified": "Thu, 26 Feb 2026 01:47:35 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/agents/structured-output", "title": "Producing Structured Output with agents | Microsoft Learn", - "value": "\"OwfmmFqGOWuaa6KYjjSE7e+WMzk=\"" + "value": "\"Bih2JiIVzwIAQwoiHQqyo3oonZw=\"" }, "agent-framework-docs-tutorials-agents-third-party-chat-history-storage": { - "etag": "\"nBMq6XiJ5Ssj1SVxnqMHUF/nskE=\"", - "human": "Storage | Microsoft Learn | ETag \"nBMq6XiJ5Ssj1SVxnqMHUF/nskE=\"", + "etag": "\"tBDOzCGqNwdrQ7BFF1NouRavjy0=\"", + "human": "Storage | Microsoft Learn | ETag \"tBDOzCGqNwdrQ7BFF1NouRavjy0=\"", "kind": "http_document", - "last_modified": "Fri, 20 Feb 2026 15:37:58 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/agents/third-party-chat-history-storage", "title": "Storage | Microsoft Learn", - "value": "\"nBMq6XiJ5Ssj1SVxnqMHUF/nskE=\"" + "value": "\"tBDOzCGqNwdrQ7BFF1NouRavjy0=\"" }, "agent-framework-docs-tutorials-overview": { - "etag": "\"eYZl4mws1Impk12ZgKoHXerPAuQ=\"", - "human": "Step 1: Your First Agent | Microsoft Learn | ETag \"eYZl4mws1Impk12ZgKoHXerPAuQ=\"", + "etag": "\"LW0NKRYxutB0xXyUxwj+SIhG5y8=\"", + "human": "Step 1: Your First Agent | Microsoft Learn | ETag \"LW0NKRYxutB0xXyUxwj+SIhG5y8=\"", "kind": "http_document", - "last_modified": "Thu, 26 Feb 2026 01:47:35 GMT", + "last_modified": "Thu, 26 Mar 2026 02:08:20 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/overview", "title": "Step 1: Your First Agent | Microsoft Learn", - "value": "\"eYZl4mws1Impk12ZgKoHXerPAuQ=\"" + "value": "\"LW0NKRYxutB0xXyUxwj+SIhG5y8=\"" }, "agent-framework-docs-tutorials-plugins-use-purview-with-agent-framework-sdk": { - "etag": "\"NqXn6asCfToNmJpAdOHho/ECr4s=\"", - "human": "Use Microsoft Purview SDK with Agent Framework | Microsoft Learn | ETag \"NqXn6asCfToNmJpAdOHho/ECr4s=\"", + "etag": "\"rhTAq/GFP6xOB+WGaiJox4EY1TI=\"", + "human": "Use Microsoft Purview SDK with Agent Framework | Microsoft Learn | ETag \"rhTAq/GFP6xOB+WGaiJox4EY1TI=\"", "kind": "http_document", "last_modified": "Thu, 26 Feb 2026 01:47:35 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/plugins/use-purview-with-agent-framework-sdk", "title": "Use Microsoft Purview SDK with Agent Framework | Microsoft Learn", - "value": "\"NqXn6asCfToNmJpAdOHho/ECr4s=\"" + "value": "\"rhTAq/GFP6xOB+WGaiJox4EY1TI=\"" }, "agent-framework-docs-tutorials-quick-start": { - "etag": "\"eYZl4mws1Impk12ZgKoHXerPAuQ=\"", - "human": "Step 1: Your First Agent | Microsoft Learn | ETag \"eYZl4mws1Impk12ZgKoHXerPAuQ=\"", + "etag": "\"LW0NKRYxutB0xXyUxwj+SIhG5y8=\"", + "human": "Step 1: Your First Agent | Microsoft Learn | ETag \"LW0NKRYxutB0xXyUxwj+SIhG5y8=\"", "kind": "http_document", - "last_modified": "Thu, 26 Feb 2026 01:47:35 GMT", + "last_modified": "Thu, 26 Mar 2026 02:08:20 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/quick-start", "title": "Step 1: Your First Agent | Microsoft Learn", - "value": "\"eYZl4mws1Impk12ZgKoHXerPAuQ=\"" + "value": "\"LW0NKRYxutB0xXyUxwj+SIhG5y8=\"" }, "agent-framework-docs-tutorials-workflows-agents-in-workflows": { - "etag": "\"qW1OlRC/BYE3xHbAvX3CObf7MHY=\"", - "human": "Agents in Workflows | Microsoft Learn | ETag \"qW1OlRC/BYE3xHbAvX3CObf7MHY=\"", + "etag": "\"l4szHqG7YVSA7UY0IRO+hXM3gro=\"", + "human": "Agents in Workflows | Microsoft Learn | ETag \"l4szHqG7YVSA7UY0IRO+hXM3gro=\"", "kind": "http_document", "last_modified": "Wed, 11 Mar 2026 19:17:18 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/workflows/agents-in-workflows", "title": "Agents in Workflows | Microsoft Learn", - "value": "\"qW1OlRC/BYE3xHbAvX3CObf7MHY=\"" + "value": "\"l4szHqG7YVSA7UY0IRO+hXM3gro=\"" }, "agent-framework-docs-tutorials-workflows-checkpointing-and-resuming": { - "etag": "\"VIkhT38tYbnE3h9Q/v4PGmYyzvA=\"", - "human": "Microsoft Agent Framework Workflows - Checkpoints | Microsoft Learn | ETag \"VIkhT38tYbnE3h9Q/v4PGmYyzvA=\"", + "etag": "\"V5w+F2OfLkCcaPLAeffpwLifVpg=\"", + "human": "Microsoft Agent Framework Workflows - Checkpoints | Microsoft Learn | ETag \"V5w+F2OfLkCcaPLAeffpwLifVpg=\"", "kind": "http_document", - "last_modified": "Thu, 12 Mar 2026 00:48:46 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/workflows/checkpointing-and-resuming", "title": "Microsoft Agent Framework Workflows - Checkpoints | Microsoft Learn", - "value": "\"VIkhT38tYbnE3h9Q/v4PGmYyzvA=\"" + "value": "\"V5w+F2OfLkCcaPLAeffpwLifVpg=\"" }, "agent-framework-docs-tutorials-workflows-requests-and-responses": { - "etag": "\"I8T+t6EzLY2ztApDALCu2SazChI=\"", - "human": "Microsoft Agent Framework Workflows - State | Microsoft Learn | ETag \"I8T+t6EzLY2ztApDALCu2SazChI=\"", + "etag": "\"VG/yPSJNgnyOeNTSrUO8WPn7kH4=\"", + "human": "Microsoft Agent Framework Workflows - State | Microsoft Learn | ETag \"VG/yPSJNgnyOeNTSrUO8WPn7kH4=\"", "kind": "http_document", - "last_modified": "Wed, 11 Mar 2026 19:17:18 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/workflows/requests-and-responses", "title": "Microsoft Agent Framework Workflows - State | Microsoft Learn", - "value": "\"I8T+t6EzLY2ztApDALCu2SazChI=\"" + "value": "\"VG/yPSJNgnyOeNTSrUO8WPn7kH4=\"" }, "agent-framework-docs-tutorials-workflows-simple-concurrent-workflow": { - "etag": "\"+np6LtzaYaJ8fui/6uezvK7QRHI=\"", - "human": "Microsoft Agent Framework Workflows Orchestrations - Concurrent | Microsoft Learn | ETag \"+np6LtzaYaJ8fui/6uezvK7QRHI=\"", + "etag": "\"pWimzSVD0/34WYboKMzWqeRMbVA=\"", + "human": "Microsoft Agent Framework Workflows Orchestrations - Concurrent | Microsoft Learn | ETag \"pWimzSVD0/34WYboKMzWqeRMbVA=\"", "kind": "http_document", "last_modified": "Tue, 17 Mar 2026 00:28:33 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/workflows/simple-concurrent-workflow", "title": "Microsoft Agent Framework Workflows Orchestrations - Concurrent | Microsoft Learn", - "value": "\"+np6LtzaYaJ8fui/6uezvK7QRHI=\"" + "value": "\"pWimzSVD0/34WYboKMzWqeRMbVA=\"" }, "agent-framework-docs-tutorials-workflows-simple-sequential-workflow": { - "etag": "\"OPGrHzPXfMCiVPpmrc2LoHRby18=\"", - "human": "Microsoft Agent Framework Workflows Orchestrations - Sequential | Microsoft Learn | ETag \"OPGrHzPXfMCiVPpmrc2LoHRby18=\"", + "etag": "\"Vmfr40id0i63OXAbOUeecl83iwA=\"", + "human": "Microsoft Agent Framework Workflows Orchestrations - Sequential | Microsoft Learn | ETag \"Vmfr40id0i63OXAbOUeecl83iwA=\"", "kind": "http_document", "last_modified": "Tue, 17 Mar 2026 00:28:33 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/workflows/simple-sequential-workflow", "title": "Microsoft Agent Framework Workflows Orchestrations - Sequential | Microsoft Learn", - "value": "\"OPGrHzPXfMCiVPpmrc2LoHRby18=\"" + "value": "\"Vmfr40id0i63OXAbOUeecl83iwA=\"" }, "agent-framework-docs-tutorials-workflows-workflow-builder-with-factories": { - "etag": "\"5202f1b110d1a2101e14e39f9555e6dda8ed8f225df2b8dfc0caaa8d5f58cde1\"", - "human": "ETag \"5202f1b110d1a2101e14e39f9555e6dda8ed8f225df2b8dfc0caaa8d5f58cde1\"", + "etag": "\"HIA9zkvMqoHuc/Mq2fKXFc1R6B8=\"", + "human": "Microsoft Agent Framework Workflows - Workflow Builder & Execution | Microsoft Learn | ETag \"HIA9zkvMqoHuc/Mq2fKXFc1R6B8=\"", "kind": "http_document", - "last_modified": null, - "source_url": "https://raw.githubusercontent.com/MicrosoftDocs/semantic-kernel-docs/main/agent-framework/tutorials/workflows/workflow-builder-with-factories.md", - "title": null, - "value": "\"5202f1b110d1a2101e14e39f9555e6dda8ed8f225df2b8dfc0caaa8d5f58cde1\"" + "last_modified": "Wed, 11 Mar 2026 19:17:18 GMT", + "source_url": "https://learn.microsoft.com/agent-framework/workflows/workflows", + "title": "Microsoft Agent Framework Workflows - Workflow Builder & Execution | Microsoft Learn", + "value": "\"HIA9zkvMqoHuc/Mq2fKXFc1R6B8=\"" }, "agent-framework-docs-tutorials-workflows-workflow-with-branching-logic": { - "etag": "\"bNjvMEA4Rz79Ykz99RajGGcKSCo=\"", - "human": "Microsoft Agent Framework Workflows - Edges | Microsoft Learn | ETag \"bNjvMEA4Rz79Ykz99RajGGcKSCo=\"", + "etag": "\"7vsUYKJiWMl+yTtGQL9ttPr6U0A=\"", + "human": "Microsoft Agent Framework Workflows - Edges | Microsoft Learn | ETag \"7vsUYKJiWMl+yTtGQL9ttPr6U0A=\"", "kind": "http_document", "last_modified": "Wed, 11 Mar 2026 19:17:18 GMT", "source_url": "https://learn.microsoft.com/agent-framework/tutorials/workflows/workflow-with-branching-logic", "title": "Microsoft Agent Framework Workflows - Edges | Microsoft Learn", - "value": "\"bNjvMEA4Rz79Ykz99RajGGcKSCo=\"" + "value": "\"7vsUYKJiWMl+yTtGQL9ttPr6U0A=\"" }, "agent-framework-docs-user-guide-agents-agent-background-responses": { - "etag": "\"x7KF1/GJodquQbLzobxewY/5hVU=\"", - "human": "Agent Background Responses | Microsoft Learn | ETag \"x7KF1/GJodquQbLzobxewY/5hVU=\"", + "etag": "\"o8fqcP2pidEhvlLDMdUXBY1ZdsQ=\"", + "human": "Agent Background Responses | Microsoft Learn | ETag \"o8fqcP2pidEhvlLDMdUXBY1ZdsQ=\"", "kind": "http_document", "last_modified": "Tue, 17 Mar 2026 00:28:33 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-background-responses", "title": "Agent Background Responses | Microsoft Learn", - "value": "\"x7KF1/GJodquQbLzobxewY/5hVU=\"" + "value": "\"o8fqcP2pidEhvlLDMdUXBY1ZdsQ=\"" }, "agent-framework-docs-user-guide-agents-agent-memory": { - "etag": "\"q+bfkzbF4BAc5QhDSq5nl9ux/Sc=\"", - "human": "RAG | Microsoft Learn | ETag \"q+bfkzbF4BAc5QhDSq5nl9ux/Sc=\"", + "etag": "\"bd5LZyP0gbUyIWg5KRGg+Iwkxgk=\"", + "human": "RAG | Microsoft Learn | ETag \"bd5LZyP0gbUyIWg5KRGg+Iwkxgk=\"", "kind": "http_document", "last_modified": "Fri, 20 Feb 2026 15:37:58 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-memory", "title": "RAG | Microsoft Learn", - "value": "\"q+bfkzbF4BAc5QhDSq5nl9ux/Sc=\"" + "value": "\"bd5LZyP0gbUyIWg5KRGg+Iwkxgk=\"" }, "agent-framework-docs-user-guide-agents-agent-middleware": { - "etag": "\"EEVH150+FH0KSUYfrKEbB477f2Y=\"", - "human": "Agent Middleware | Microsoft Learn | ETag \"EEVH150+FH0KSUYfrKEbB477f2Y=\"", + "etag": "\"xcpvOlWoJuBh37U/nroYwiQqtGo=\"", + "human": "Agent Middleware | Microsoft Learn | ETag \"xcpvOlWoJuBh37U/nroYwiQqtGo=\"", "kind": "http_document", - "last_modified": "Fri, 20 Mar 2026 09:07:47 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/agents/middleware/", "title": "Agent Middleware | Microsoft Learn", - "value": "\"EEVH150+FH0KSUYfrKEbB477f2Y=\"" + "value": "\"xcpvOlWoJuBh37U/nroYwiQqtGo=\"" }, "agent-framework-docs-user-guide-agents-agent-rag": { - "etag": "\"q+bfkzbF4BAc5QhDSq5nl9ux/Sc=\"", - "human": "RAG | Microsoft Learn | ETag \"q+bfkzbF4BAc5QhDSq5nl9ux/Sc=\"", + "etag": "\"bd5LZyP0gbUyIWg5KRGg+Iwkxgk=\"", + "human": "RAG | Microsoft Learn | ETag \"bd5LZyP0gbUyIWg5KRGg+Iwkxgk=\"", "kind": "http_document", "last_modified": "Fri, 20 Feb 2026 15:37:58 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-rag", "title": "RAG | Microsoft Learn", - "value": "\"q+bfkzbF4BAc5QhDSq5nl9ux/Sc=\"" + "value": "\"bd5LZyP0gbUyIWg5KRGg+Iwkxgk=\"" }, "agent-framework-docs-user-guide-agents-agent-tools": { - "etag": "\"DsxpEolAaZK6qkmAM1QmhrJjqXw=\"", - "human": "Tools Overview | Microsoft Learn | ETag \"DsxpEolAaZK6qkmAM1QmhrJjqXw=\"", + "etag": "\"25l5EOM4vy8njNfe5gN2prMqnAI=\"", + "human": "Tools Overview | Microsoft Learn | ETag \"25l5EOM4vy8njNfe5gN2prMqnAI=\"", "kind": "http_document", "last_modified": "Tue, 17 Mar 2026 00:28:33 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-tools", "title": "Tools Overview | Microsoft Learn", - "value": "\"DsxpEolAaZK6qkmAM1QmhrJjqXw=\"" + "value": "\"25l5EOM4vy8njNfe5gN2prMqnAI=\"" }, "agent-framework-docs-user-guide-agents-agent-types": { - "etag": "\"J92MUQOV1ORmwzYzzPWrlzNwRJ8=\"", - "human": "Providers Overview | Microsoft Learn | ETag \"J92MUQOV1ORmwzYzzPWrlzNwRJ8=\"", + "etag": "\"9qm0lKUcR2nL3h1nHGJbggZ3Llg=\"", + "human": "Providers Overview | Microsoft Learn | ETag \"9qm0lKUcR2nL3h1nHGJbggZ3Llg=\"", "kind": "http_document", "last_modified": "Tue, 17 Mar 2026 00:28:33 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-types/", "title": "Providers Overview | Microsoft Learn", - "value": "\"J92MUQOV1ORmwzYzzPWrlzNwRJ8=\"" + "value": "\"9qm0lKUcR2nL3h1nHGJbggZ3Llg=\"" }, "agent-framework-docs-user-guide-agents-agent-types-a2a-agent": { - "etag": "\"JxOdwanNLm2NMBeGsy0pzkyt7EQ=\"", - "human": "A2A Integration | Microsoft Learn | ETag \"JxOdwanNLm2NMBeGsy0pzkyt7EQ=\"", + "etag": "\"YF5c9lJAh/RZyKkXJYMZNyBeoUw=\"", + "human": "A2A Integration | Microsoft Learn | ETag \"YF5c9lJAh/RZyKkXJYMZNyBeoUw=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-types/a2a-agent", "title": "A2A Integration | Microsoft Learn", - "value": "\"JxOdwanNLm2NMBeGsy0pzkyt7EQ=\"" + "value": "\"YF5c9lJAh/RZyKkXJYMZNyBeoUw=\"" }, "agent-framework-docs-user-guide-agents-agent-types-anthropic-agent": { - "etag": "\"aXSPhI+LUPdfhiTuv8i29VAzoRA=\"", - "human": "Anthropic Agents | Microsoft Learn | ETag \"aXSPhI+LUPdfhiTuv8i29VAzoRA=\"", + "etag": "\"x4UQc5THWweMv1Hr2eUjeRE6d08=\"", + "human": "Anthropic Agents | Microsoft Learn | ETag \"x4UQc5THWweMv1Hr2eUjeRE6d08=\"", "kind": "http_document", - "last_modified": "Tue, 17 Mar 2026 00:28:33 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-types/anthropic-agent", "title": "Anthropic Agents | Microsoft Learn", - "value": "\"aXSPhI+LUPdfhiTuv8i29VAzoRA=\"" + "value": "\"x4UQc5THWweMv1Hr2eUjeRE6d08=\"" }, "agent-framework-docs-user-guide-agents-agent-types-azure-ai-foundry-agent": { - "etag": "\"WR3JlRg1yo0MosX48eygOl40saM=\"", - "human": "Microsoft Foundry Agents | Microsoft Learn | ETag \"WR3JlRg1yo0MosX48eygOl40saM=\"", + "etag": "\"nHpGKHsr8ovtf9URdKK791Yz4uQ=\"", + "human": "Microsoft Foundry Agents | Microsoft Learn | ETag \"nHpGKHsr8ovtf9URdKK791Yz4uQ=\"", "kind": "http_document", - "last_modified": "Fri, 20 Mar 2026 09:07:47 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-types/azure-ai-foundry-agent", "title": "Microsoft Foundry Agents | Microsoft Learn", - "value": "\"WR3JlRg1yo0MosX48eygOl40saM=\"" + "value": "\"nHpGKHsr8ovtf9URdKK791Yz4uQ=\"" }, "agent-framework-docs-user-guide-agents-agent-types-azure-ai-foundry-models-chat-completion-agent": { - "etag": "\"WR3JlRg1yo0MosX48eygOl40saM=\"", - "human": "Microsoft Foundry Agents | Microsoft Learn | ETag \"WR3JlRg1yo0MosX48eygOl40saM=\"", + "etag": "\"nHpGKHsr8ovtf9URdKK791Yz4uQ=\"", + "human": "Microsoft Foundry Agents | Microsoft Learn | ETag \"nHpGKHsr8ovtf9URdKK791Yz4uQ=\"", "kind": "http_document", - "last_modified": "Fri, 20 Mar 2026 09:07:47 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-types/azure-ai-foundry-models-chat-completion-agent", "title": "Microsoft Foundry Agents | Microsoft Learn", - "value": "\"WR3JlRg1yo0MosX48eygOl40saM=\"" + "value": "\"nHpGKHsr8ovtf9URdKK791Yz4uQ=\"" }, "agent-framework-docs-user-guide-agents-agent-types-azure-ai-foundry-models-responses-agent": { - "etag": "\"WR3JlRg1yo0MosX48eygOl40saM=\"", - "human": "Microsoft Foundry Agents | Microsoft Learn | ETag \"WR3JlRg1yo0MosX48eygOl40saM=\"", + "etag": "\"nHpGKHsr8ovtf9URdKK791Yz4uQ=\"", + "human": "Microsoft Foundry Agents | Microsoft Learn | ETag \"nHpGKHsr8ovtf9URdKK791Yz4uQ=\"", "kind": "http_document", - "last_modified": "Fri, 20 Mar 2026 09:07:47 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-types/azure-ai-foundry-models-responses-agent", "title": "Microsoft Foundry Agents | Microsoft Learn", - "value": "\"WR3JlRg1yo0MosX48eygOl40saM=\"" + "value": "\"nHpGKHsr8ovtf9URdKK791Yz4uQ=\"" }, "agent-framework-docs-user-guide-agents-agent-types-azure-openai-chat-completion-agent": { - "etag": "\"15qQNper3HovxLHtK0rqW+2Agb0=\"", - "human": "Azure OpenAI Agents | Microsoft Learn | ETag \"15qQNper3HovxLHtK0rqW+2Agb0=\"", + "etag": "\"JtwU1cBLxWntL+Ww2SbLMQ+SZkw=\"", + "human": "Azure OpenAI Agents | Microsoft Learn | ETag \"JtwU1cBLxWntL+Ww2SbLMQ+SZkw=\"", "kind": "http_document", "last_modified": "Fri, 20 Mar 2026 09:07:47 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-types/azure-openai-chat-completion-agent", "title": "Azure OpenAI Agents | Microsoft Learn", - "value": "\"15qQNper3HovxLHtK0rqW+2Agb0=\"" + "value": "\"JtwU1cBLxWntL+Ww2SbLMQ+SZkw=\"" }, "agent-framework-docs-user-guide-agents-agent-types-azure-openai-responses-agent": { - "etag": "\"15qQNper3HovxLHtK0rqW+2Agb0=\"", - "human": "Azure OpenAI Agents | Microsoft Learn | ETag \"15qQNper3HovxLHtK0rqW+2Agb0=\"", + "etag": "\"JtwU1cBLxWntL+Ww2SbLMQ+SZkw=\"", + "human": "Azure OpenAI Agents | Microsoft Learn | ETag \"JtwU1cBLxWntL+Ww2SbLMQ+SZkw=\"", "kind": "http_document", "last_modified": "Fri, 20 Mar 2026 09:07:47 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-types/azure-openai-responses-agent", "title": "Azure OpenAI Agents | Microsoft Learn", - "value": "\"15qQNper3HovxLHtK0rqW+2Agb0=\"" + "value": "\"JtwU1cBLxWntL+Ww2SbLMQ+SZkw=\"" }, "agent-framework-docs-user-guide-agents-agent-types-chat-client-agent": { - "etag": "\"ESVjVlagsD/mdTbIUxxeWneD8yA=\"", - "human": "Custom Agents | Microsoft Learn | ETag \"ESVjVlagsD/mdTbIUxxeWneD8yA=\"", + "etag": "\"2k0PHWe97J4mMA/JO1a3QcP3rhA=\"", + "human": "Custom Agents | Microsoft Learn | ETag \"2k0PHWe97J4mMA/JO1a3QcP3rhA=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-types/chat-client-agent", "title": "Custom Agents | Microsoft Learn", - "value": "\"ESVjVlagsD/mdTbIUxxeWneD8yA=\"" + "value": "\"2k0PHWe97J4mMA/JO1a3QcP3rhA=\"" }, "agent-framework-docs-user-guide-agents-agent-types-custom-agent": { - "etag": "\"ESVjVlagsD/mdTbIUxxeWneD8yA=\"", - "human": "Custom Agents | Microsoft Learn | ETag \"ESVjVlagsD/mdTbIUxxeWneD8yA=\"", + "etag": "\"2k0PHWe97J4mMA/JO1a3QcP3rhA=\"", + "human": "Custom Agents | Microsoft Learn | ETag \"2k0PHWe97J4mMA/JO1a3QcP3rhA=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-types/custom-agent", "title": "Custom Agents | Microsoft Learn", - "value": "\"ESVjVlagsD/mdTbIUxxeWneD8yA=\"" + "value": "\"2k0PHWe97J4mMA/JO1a3QcP3rhA=\"" }, "agent-framework-docs-user-guide-agents-agent-types-durable-agent-create-durable-agent": { - "etag": "\"djHVgVcPuuq9mNIFhVzxbRM3qus=\"", - "human": "Azure Functions (Durable) | Microsoft Learn | ETag \"djHVgVcPuuq9mNIFhVzxbRM3qus=\"", + "etag": "\"E5HDwT+FlSxjvuZJAIy6tykoRX4=\"", + "human": "Azure Functions (Durable) | Microsoft Learn | ETag \"E5HDwT+FlSxjvuZJAIy6tykoRX4=\"", "kind": "http_document", "last_modified": "Mon, 23 Feb 2026 23:55:43 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-types/durable-agent/create-durable-agent", "title": "Azure Functions (Durable) | Microsoft Learn", - "value": "\"djHVgVcPuuq9mNIFhVzxbRM3qus=\"" + "value": "\"E5HDwT+FlSxjvuZJAIy6tykoRX4=\"" }, "agent-framework-docs-user-guide-agents-agent-types-durable-agent-features": { - "etag": "\"djHVgVcPuuq9mNIFhVzxbRM3qus=\"", - "human": "Azure Functions (Durable) | Microsoft Learn | ETag \"djHVgVcPuuq9mNIFhVzxbRM3qus=\"", + "etag": "\"E5HDwT+FlSxjvuZJAIy6tykoRX4=\"", + "human": "Azure Functions (Durable) | Microsoft Learn | ETag \"E5HDwT+FlSxjvuZJAIy6tykoRX4=\"", "kind": "http_document", "last_modified": "Mon, 23 Feb 2026 23:55:43 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-types/durable-agent/features", "title": "Azure Functions (Durable) | Microsoft Learn", - "value": "\"djHVgVcPuuq9mNIFhVzxbRM3qus=\"" + "value": "\"E5HDwT+FlSxjvuZJAIy6tykoRX4=\"" }, "agent-framework-docs-user-guide-agents-agent-types-openai-assistants-agent": { - "etag": "\"5pVYHRsoifJV1p5CsnDKC2nSlvU=\"", - "human": "OpenAI Agents | Microsoft Learn | ETag \"5pVYHRsoifJV1p5CsnDKC2nSlvU=\"", + "etag": "\"IMrllfZ6S6LccMPEyf1ldW4rC6I=\"", + "human": "OpenAI Agents | Microsoft Learn | ETag \"IMrllfZ6S6LccMPEyf1ldW4rC6I=\"", "kind": "http_document", - "last_modified": "Tue, 17 Mar 2026 00:28:33 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-types/openai-assistants-agent", "title": "OpenAI Agents | Microsoft Learn", - "value": "\"5pVYHRsoifJV1p5CsnDKC2nSlvU=\"" + "value": "\"IMrllfZ6S6LccMPEyf1ldW4rC6I=\"" }, "agent-framework-docs-user-guide-agents-agent-types-openai-chat-completion-agent": { - "etag": "\"5pVYHRsoifJV1p5CsnDKC2nSlvU=\"", - "human": "OpenAI Agents | Microsoft Learn | ETag \"5pVYHRsoifJV1p5CsnDKC2nSlvU=\"", + "etag": "\"IMrllfZ6S6LccMPEyf1ldW4rC6I=\"", + "human": "OpenAI Agents | Microsoft Learn | ETag \"IMrllfZ6S6LccMPEyf1ldW4rC6I=\"", "kind": "http_document", - "last_modified": "Tue, 17 Mar 2026 00:28:33 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-types/openai-chat-completion-agent", "title": "OpenAI Agents | Microsoft Learn", - "value": "\"5pVYHRsoifJV1p5CsnDKC2nSlvU=\"" + "value": "\"IMrllfZ6S6LccMPEyf1ldW4rC6I=\"" }, "agent-framework-docs-user-guide-agents-agent-types-openai-responses-agent": { - "etag": "\"5pVYHRsoifJV1p5CsnDKC2nSlvU=\"", - "human": "OpenAI Agents | Microsoft Learn | ETag \"5pVYHRsoifJV1p5CsnDKC2nSlvU=\"", + "etag": "\"IMrllfZ6S6LccMPEyf1ldW4rC6I=\"", + "human": "OpenAI Agents | Microsoft Learn | ETag \"IMrllfZ6S6LccMPEyf1ldW4rC6I=\"", "kind": "http_document", - "last_modified": "Tue, 17 Mar 2026 00:28:33 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/agent-types/openai-responses-agent", "title": "OpenAI Agents | Microsoft Learn", - "value": "\"5pVYHRsoifJV1p5CsnDKC2nSlvU=\"" + "value": "\"IMrllfZ6S6LccMPEyf1ldW4rC6I=\"" }, "agent-framework-docs-user-guide-agents-multi-turn-conversation": { - "etag": "\"wZvcrKeZcZeXiRGgfxoyqQGSu/w=\"", - "human": "Session | Microsoft Learn | ETag \"wZvcrKeZcZeXiRGgfxoyqQGSu/w=\"", + "etag": "\"6dakrP70trNUS/K542xd8MS14f0=\"", + "human": "Session | Microsoft Learn | ETag \"6dakrP70trNUS/K542xd8MS14f0=\"", "kind": "http_document", "last_modified": "Fri, 20 Feb 2026 15:37:58 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/multi-turn-conversation", "title": "Session | Microsoft Learn", - "value": "\"wZvcrKeZcZeXiRGgfxoyqQGSu/w=\"" + "value": "\"6dakrP70trNUS/K542xd8MS14f0=\"" }, "agent-framework-docs-user-guide-agents-running-agents": { - "etag": "\"TTxmeISAxGsR+s6ajFafHNdgwk8=\"", - "human": "Running Agents | Microsoft Learn | ETag \"TTxmeISAxGsR+s6ajFafHNdgwk8=\"", + "etag": "\"Ux7ReWtjEja80SOxWOwAiskKPoo=\"", + "human": "Running Agents | Microsoft Learn | ETag \"Ux7ReWtjEja80SOxWOwAiskKPoo=\"", "kind": "http_document", "last_modified": "Fri, 13 Mar 2026 11:30:28 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/agents/running-agents", "title": "Running Agents | Microsoft Learn", - "value": "\"TTxmeISAxGsR+s6ajFafHNdgwk8=\"" + "value": "\"Ux7ReWtjEja80SOxWOwAiskKPoo=\"" }, "agent-framework-docs-user-guide-devui": { - "etag": "\"aaufyh4OUo81sbbHrtSHu51jRzI=\"", - "human": "DevUI Overview | Microsoft Learn | ETag \"aaufyh4OUo81sbbHrtSHu51jRzI=\"", + "etag": "\"jK5GzB4udJ/ha2NPm9JMVD9sOM0=\"", + "human": "DevUI Overview | Microsoft Learn | ETag \"jK5GzB4udJ/ha2NPm9JMVD9sOM0=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/devui/", "title": "DevUI Overview | Microsoft Learn", - "value": "\"aaufyh4OUo81sbbHrtSHu51jRzI=\"" + "value": "\"jK5GzB4udJ/ha2NPm9JMVD9sOM0=\"" }, "agent-framework-docs-user-guide-devui-api-reference": { - "etag": "\"LtpZ0RxLTlpyyINeSQlR4AsBsrU=\"", - "human": "DevUI API Reference | Microsoft Learn | ETag \"LtpZ0RxLTlpyyINeSQlR4AsBsrU=\"", + "etag": "\"B9b7Elo/k8edzI3Yl5V8eTvTQQw=\"", + "human": "DevUI API Reference | Microsoft Learn | ETag \"B9b7Elo/k8edzI3Yl5V8eTvTQQw=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/devui/api-reference", "title": "DevUI API Reference | Microsoft Learn", - "value": "\"LtpZ0RxLTlpyyINeSQlR4AsBsrU=\"" + "value": "\"B9b7Elo/k8edzI3Yl5V8eTvTQQw=\"" }, "agent-framework-docs-user-guide-devui-directory-discovery": { - "etag": "\"wwXhzUbI1/i2MRyYgjetmvnjx1o=\"", - "human": "DevUI Directory Discovery | Microsoft Learn | ETag \"wwXhzUbI1/i2MRyYgjetmvnjx1o=\"", + "etag": "\"YaNZ9t/lNgcfFhky6SmPDfJdxoI=\"", + "human": "DevUI Directory Discovery | Microsoft Learn | ETag \"YaNZ9t/lNgcfFhky6SmPDfJdxoI=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/devui/directory-discovery", "title": "DevUI Directory Discovery | Microsoft Learn", - "value": "\"wwXhzUbI1/i2MRyYgjetmvnjx1o=\"" + "value": "\"YaNZ9t/lNgcfFhky6SmPDfJdxoI=\"" }, "agent-framework-docs-user-guide-devui-samples": { - "etag": "\"Dht0RRlGSz6IM7igMb4D43fpeFs=\"", - "human": "DevUI Samples | Microsoft Learn | ETag \"Dht0RRlGSz6IM7igMb4D43fpeFs=\"", + "etag": "\"+S+SBIEDf8BVtITnIAk4yFNoDsk=\"", + "human": "DevUI Samples | Microsoft Learn | ETag \"+S+SBIEDf8BVtITnIAk4yFNoDsk=\"", "kind": "http_document", "last_modified": "Mon, 23 Feb 2026 23:55:43 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/devui/samples", "title": "DevUI Samples | Microsoft Learn", - "value": "\"Dht0RRlGSz6IM7igMb4D43fpeFs=\"" + "value": "\"+S+SBIEDf8BVtITnIAk4yFNoDsk=\"" }, "agent-framework-docs-user-guide-devui-security": { - "etag": "\"ngR1ViREFVcGYkRshMCszPNYgv8=\"", - "human": "DevUI Security & Deployment | Microsoft Learn | ETag \"ngR1ViREFVcGYkRshMCszPNYgv8=\"", + "etag": "\"/xKrdzIIWgNjVAN2aEXhZjS7gvg=\"", + "human": "DevUI Security & Deployment | Microsoft Learn | ETag \"/xKrdzIIWgNjVAN2aEXhZjS7gvg=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/devui/security", "title": "DevUI Security & Deployment | Microsoft Learn", - "value": "\"ngR1ViREFVcGYkRshMCszPNYgv8=\"" + "value": "\"/xKrdzIIWgNjVAN2aEXhZjS7gvg=\"" }, "agent-framework-docs-user-guide-devui-tracing": { - "etag": "\"vkTe1IgF4vkt+PEwf9BYfJTGWz4=\"", - "human": "DevUI Tracing & Observability | Microsoft Learn | ETag \"vkTe1IgF4vkt+PEwf9BYfJTGWz4=\"", + "etag": "\"i56daORbR0rqMlNcg/AR3ODKzRE=\"", + "human": "DevUI Tracing & Observability | Microsoft Learn | ETag \"i56daORbR0rqMlNcg/AR3ODKzRE=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/devui/tracing", "title": "DevUI Tracing & Observability | Microsoft Learn", - "value": "\"vkTe1IgF4vkt+PEwf9BYfJTGWz4=\"" + "value": "\"i56daORbR0rqMlNcg/AR3ODKzRE=\"" }, "agent-framework-docs-user-guide-hosting": { - "etag": "\"rO54DgxNfTKNjbAFjc2NK7FvJB0=\"", - "human": "Agent Framework Integrations | Microsoft Learn | ETag \"rO54DgxNfTKNjbAFjc2NK7FvJB0=\"", + "etag": "\"AdEGtHins0vGMOT1C2lhhc/lBeE=\"", + "human": "Agent Framework Integrations | Microsoft Learn | ETag \"AdEGtHins0vGMOT1C2lhhc/lBeE=\"", "kind": "http_document", "last_modified": "Mon, 23 Feb 2026 23:55:43 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/hosting/", "title": "Agent Framework Integrations | Microsoft Learn", - "value": "\"rO54DgxNfTKNjbAFjc2NK7FvJB0=\"" + "value": "\"AdEGtHins0vGMOT1C2lhhc/lBeE=\"" }, "agent-framework-docs-user-guide-hosting-agent-to-agent-integration": { - "etag": "\"JxOdwanNLm2NMBeGsy0pzkyt7EQ=\"", - "human": "A2A Integration | Microsoft Learn | ETag \"JxOdwanNLm2NMBeGsy0pzkyt7EQ=\"", + "etag": "\"YF5c9lJAh/RZyKkXJYMZNyBeoUw=\"", + "human": "A2A Integration | Microsoft Learn | ETag \"YF5c9lJAh/RZyKkXJYMZNyBeoUw=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/hosting/agent-to-agent-integration", "title": "A2A Integration | Microsoft Learn", - "value": "\"JxOdwanNLm2NMBeGsy0pzkyt7EQ=\"" + "value": "\"YF5c9lJAh/RZyKkXJYMZNyBeoUw=\"" }, "agent-framework-docs-user-guide-hosting-openai-integration": { - "etag": "\"P+5xc0h1ZN+dYa9C9mSuFtMs0QM=\"", - "human": "OpenAI Integration | Microsoft Learn | ETag \"P+5xc0h1ZN+dYa9C9mSuFtMs0QM=\"", + "etag": "\"F0uAmjaaiHupoFfzoE5oZUV+gNM=\"", + "human": "OpenAI Integration | Microsoft Learn | ETag \"F0uAmjaaiHupoFfzoE5oZUV+gNM=\"", "kind": "http_document", "last_modified": "Mon, 23 Feb 2026 23:55:43 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/hosting/openai-integration", "title": "OpenAI Integration | Microsoft Learn", - "value": "\"P+5xc0h1ZN+dYa9C9mSuFtMs0QM=\"" + "value": "\"F0uAmjaaiHupoFfzoE5oZUV+gNM=\"" }, "agent-framework-docs-user-guide-model-context-protocol": { - "etag": "\"uv3y0HbtWn73UdiCkCZlA0ZxKM4=\"", - "human": "MCP and Foundry Agents | Microsoft Learn | ETag \"uv3y0HbtWn73UdiCkCZlA0ZxKM4=\"", + "etag": "\"UMlIRN23iskgL8L+fqk4tT7go5E=\"", + "human": "MCP and Foundry Agents | Microsoft Learn | ETag \"UMlIRN23iskgL8L+fqk4tT7go5E=\"", "kind": "http_document", - "last_modified": "Mon, 23 Feb 2026 23:55:43 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/model-context-protocol/", "title": "MCP and Foundry Agents | Microsoft Learn", - "value": "\"uv3y0HbtWn73UdiCkCZlA0ZxKM4=\"" + "value": "\"UMlIRN23iskgL8L+fqk4tT7go5E=\"" }, "agent-framework-docs-user-guide-model-context-protocol-using-mcp-tools": { - "etag": "\"cko9hKlLLw1SYoht6O1CgduPSfk=\"", - "human": "Using MCP Tools | Microsoft Learn | ETag \"cko9hKlLLw1SYoht6O1CgduPSfk=\"", + "etag": "\"5M58tZZQ30NB7qKxrHJXicMdK98=\"", + "human": "Using MCP Tools | Microsoft Learn | ETag \"5M58tZZQ30NB7qKxrHJXicMdK98=\"", "kind": "http_document", - "last_modified": "Thu, 26 Feb 2026 01:47:35 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/model-context-protocol/using-mcp-tools", "title": "Using MCP Tools | Microsoft Learn", - "value": "\"cko9hKlLLw1SYoht6O1CgduPSfk=\"" + "value": "\"5M58tZZQ30NB7qKxrHJXicMdK98=\"" }, "agent-framework-docs-user-guide-model-context-protocol-using-mcp-with-foundry-agents": { - "etag": "\"uv3y0HbtWn73UdiCkCZlA0ZxKM4=\"", - "human": "MCP and Foundry Agents | Microsoft Learn | ETag \"uv3y0HbtWn73UdiCkCZlA0ZxKM4=\"", + "etag": "\"UMlIRN23iskgL8L+fqk4tT7go5E=\"", + "human": "MCP and Foundry Agents | Microsoft Learn | ETag \"UMlIRN23iskgL8L+fqk4tT7go5E=\"", "kind": "http_document", - "last_modified": "Mon, 23 Feb 2026 23:55:43 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/model-context-protocol/using-mcp-with-foundry-agents", "title": "MCP and Foundry Agents | Microsoft Learn", - "value": "\"uv3y0HbtWn73UdiCkCZlA0ZxKM4=\"" + "value": "\"UMlIRN23iskgL8L+fqk4tT7go5E=\"" }, "agent-framework-docs-user-guide-observability": { - "etag": "\"MGG1hvkCyUQwFY6wkk5fV9Ek0js=\"", - "human": "Observability | Microsoft Learn | ETag \"MGG1hvkCyUQwFY6wkk5fV9Ek0js=\"", + "etag": "\"O/6SL6fDshir+qKRrVGU/3UyUWE=\"", + "human": "Observability | Microsoft Learn | ETag \"O/6SL6fDshir+qKRrVGU/3UyUWE=\"", "kind": "http_document", - "last_modified": "Thu, 26 Feb 2026 01:47:35 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/observability", "title": "Observability | Microsoft Learn", - "value": "\"MGG1hvkCyUQwFY6wkk5fV9Ek0js=\"" + "value": "\"O/6SL6fDshir+qKRrVGU/3UyUWE=\"" }, "agent-framework-docs-user-guide-overview": { - "etag": "\"XfqjOfR3HmCUkt/QXwONoGzs5/Y=\"", - "human": "Microsoft Agent Framework Overview | Microsoft Learn | ETag \"XfqjOfR3HmCUkt/QXwONoGzs5/Y=\"", + "etag": "\"RLVvV+jIPjUcyyZ/B16J2Q9Dwvw=\"", + "human": "Microsoft Agent Framework Overview | Microsoft Learn | ETag \"RLVvV+jIPjUcyyZ/B16J2Q9Dwvw=\"", "kind": "http_document", "last_modified": "Fri, 20 Feb 2026 16:00:19 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/overview", "title": "Microsoft Agent Framework Overview | Microsoft Learn", - "value": "\"XfqjOfR3HmCUkt/QXwONoGzs5/Y=\"" + "value": "\"RLVvV+jIPjUcyyZ/B16J2Q9Dwvw=\"" }, "agent-framework-docs-user-guide-workflows-as-agents": { - "etag": "\"0hEvqErxIiVf16PblrF9WZJnyu0=\"", - "human": "Microsoft Agent Framework Workflows - Using Workflows as Agents | Microsoft Learn | ETag \"0hEvqErxIiVf16PblrF9WZJnyu0=\"", + "etag": "\"MGYVr+dabgiutdNKY2Z/evTswd0=\"", + "human": "Microsoft Agent Framework Workflows - Using Workflows as Agents | Microsoft Learn | ETag \"MGYVr+dabgiutdNKY2Z/evTswd0=\"", "kind": "http_document", "last_modified": "Thu, 12 Mar 2026 00:48:46 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/as-agents", "title": "Microsoft Agent Framework Workflows - Using Workflows as Agents | Microsoft Learn", - "value": "\"0hEvqErxIiVf16PblrF9WZJnyu0=\"" + "value": "\"MGYVr+dabgiutdNKY2Z/evTswd0=\"" }, "agent-framework-docs-user-guide-workflows-checkpoints": { - "etag": "\"VIkhT38tYbnE3h9Q/v4PGmYyzvA=\"", - "human": "Microsoft Agent Framework Workflows - Checkpoints | Microsoft Learn | ETag \"VIkhT38tYbnE3h9Q/v4PGmYyzvA=\"", + "etag": "\"V5w+F2OfLkCcaPLAeffpwLifVpg=\"", + "human": "Microsoft Agent Framework Workflows - Checkpoints | Microsoft Learn | ETag \"V5w+F2OfLkCcaPLAeffpwLifVpg=\"", "kind": "http_document", - "last_modified": "Thu, 12 Mar 2026 00:48:46 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/checkpoints", "title": "Microsoft Agent Framework Workflows - Checkpoints | Microsoft Learn", - "value": "\"VIkhT38tYbnE3h9Q/v4PGmYyzvA=\"" + "value": "\"V5w+F2OfLkCcaPLAeffpwLifVpg=\"" }, "agent-framework-docs-user-guide-workflows-core-concepts-edges": { - "etag": "\"bNjvMEA4Rz79Ykz99RajGGcKSCo=\"", - "human": "Microsoft Agent Framework Workflows - Edges | Microsoft Learn | ETag \"bNjvMEA4Rz79Ykz99RajGGcKSCo=\"", + "etag": "\"7vsUYKJiWMl+yTtGQL9ttPr6U0A=\"", + "human": "Microsoft Agent Framework Workflows - Edges | Microsoft Learn | ETag \"7vsUYKJiWMl+yTtGQL9ttPr6U0A=\"", "kind": "http_document", "last_modified": "Wed, 11 Mar 2026 19:17:18 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/core-concepts/edges", "title": "Microsoft Agent Framework Workflows - Edges | Microsoft Learn", - "value": "\"bNjvMEA4Rz79Ykz99RajGGcKSCo=\"" + "value": "\"7vsUYKJiWMl+yTtGQL9ttPr6U0A=\"" }, "agent-framework-docs-user-guide-workflows-core-concepts-events": { - "etag": "\"RCPxpg4YIiahOCYkTjKRCEHs6o4=\"", - "human": "Microsoft Agent Framework Workflows - Events | Microsoft Learn | ETag \"RCPxpg4YIiahOCYkTjKRCEHs6o4=\"", + "etag": "\"uQ2FgGpMZ9rvoHCAfaFta2MF+sc=\"", + "human": "Microsoft Agent Framework Workflows - Events | Microsoft Learn | ETag \"uQ2FgGpMZ9rvoHCAfaFta2MF+sc=\"", "kind": "http_document", "last_modified": "Wed, 11 Mar 2026 19:17:18 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/core-concepts/events", "title": "Microsoft Agent Framework Workflows - Events | Microsoft Learn", - "value": "\"RCPxpg4YIiahOCYkTjKRCEHs6o4=\"" + "value": "\"uQ2FgGpMZ9rvoHCAfaFta2MF+sc=\"" }, "agent-framework-docs-user-guide-workflows-core-concepts-executors": { - "etag": "\"JKZeeOdvxJYXs+xcw3HtFTVVbFM=\"", - "human": "Microsoft Agent Framework Workflows - Executors | Microsoft Learn | ETag \"JKZeeOdvxJYXs+xcw3HtFTVVbFM=\"", + "etag": "\"WKst4A8nvuPaMYZyabvA/aCN1aM=\"", + "human": "Microsoft Agent Framework Workflows - Executors | Microsoft Learn | ETag \"WKst4A8nvuPaMYZyabvA/aCN1aM=\"", "kind": "http_document", - "last_modified": "Wed, 11 Mar 2026 19:17:18 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/core-concepts/executors", "title": "Microsoft Agent Framework Workflows - Executors | Microsoft Learn", - "value": "\"JKZeeOdvxJYXs+xcw3HtFTVVbFM=\"" + "value": "\"WKst4A8nvuPaMYZyabvA/aCN1aM=\"" }, "agent-framework-docs-user-guide-workflows-core-concepts-overview": { - "etag": "\"DxrsGQhxN9CvqIYChSTaqSBO63E=\"", - "human": "Microsoft Agent Framework Workflows | Microsoft Learn | ETag \"DxrsGQhxN9CvqIYChSTaqSBO63E=\"", + "etag": "\"xC5bnI/CyUF6M/LudvWj1YrUG1w=\"", + "human": "Microsoft Agent Framework Workflows | Microsoft Learn | ETag \"xC5bnI/CyUF6M/LudvWj1YrUG1w=\"", "kind": "http_document", "last_modified": "Wed, 11 Mar 2026 19:17:18 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/core-concepts/overview", "title": "Microsoft Agent Framework Workflows | Microsoft Learn", - "value": "\"DxrsGQhxN9CvqIYChSTaqSBO63E=\"" + "value": "\"xC5bnI/CyUF6M/LudvWj1YrUG1w=\"" }, "agent-framework-docs-user-guide-workflows-core-concepts-workflows": { - "etag": "\"boH51M1zq0skIcfStVxfAHJOpuM=\"", - "human": "Microsoft Agent Framework Workflows - Workflow Builder & Execution | Microsoft Learn | ETag \"boH51M1zq0skIcfStVxfAHJOpuM=\"", + "etag": "\"HIA9zkvMqoHuc/Mq2fKXFc1R6B8=\"", + "human": "Microsoft Agent Framework Workflows - Workflow Builder & Execution | Microsoft Learn | ETag \"HIA9zkvMqoHuc/Mq2fKXFc1R6B8=\"", "kind": "http_document", "last_modified": "Wed, 11 Mar 2026 19:17:18 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/core-concepts/workflows", "title": "Microsoft Agent Framework Workflows - Workflow Builder & Execution | Microsoft Learn", - "value": "\"boH51M1zq0skIcfStVxfAHJOpuM=\"" + "value": "\"HIA9zkvMqoHuc/Mq2fKXFc1R6B8=\"" }, "agent-framework-docs-user-guide-workflows-declarative-workflows": { - "etag": "\"h1/hl9lXlvNrzlmrNY88IOrUPsw=\"", - "human": "Declarative Workflows - Overview | Microsoft Learn | ETag \"h1/hl9lXlvNrzlmrNY88IOrUPsw=\"", + "etag": "\"CIVprEVCln+zsx2M76sqGwadlI4=\"", + "human": "Declarative Workflows - Overview | Microsoft Learn | ETag \"CIVprEVCln+zsx2M76sqGwadlI4=\"", "kind": "http_document", "last_modified": "Thu, 12 Mar 2026 00:48:46 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/declarative-workflows", "title": "Declarative Workflows - Overview | Microsoft Learn", - "value": "\"h1/hl9lXlvNrzlmrNY88IOrUPsw=\"" + "value": "\"CIVprEVCln+zsx2M76sqGwadlI4=\"" }, "agent-framework-docs-user-guide-workflows-declarative-workflows-actions-reference": { - "etag": "\"h1/hl9lXlvNrzlmrNY88IOrUPsw=\"", - "human": "Declarative Workflows - Overview | Microsoft Learn | ETag \"h1/hl9lXlvNrzlmrNY88IOrUPsw=\"", + "etag": "\"CIVprEVCln+zsx2M76sqGwadlI4=\"", + "human": "Declarative Workflows - Overview | Microsoft Learn | ETag \"CIVprEVCln+zsx2M76sqGwadlI4=\"", "kind": "http_document", "last_modified": "Thu, 12 Mar 2026 00:48:46 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/declarative-workflows/actions-reference", "title": "Declarative Workflows - Overview | Microsoft Learn", - "value": "\"h1/hl9lXlvNrzlmrNY88IOrUPsw=\"" + "value": "\"CIVprEVCln+zsx2M76sqGwadlI4=\"" }, "agent-framework-docs-user-guide-workflows-declarative-workflows-advanced-patterns": { - "etag": "\"h1/hl9lXlvNrzlmrNY88IOrUPsw=\"", - "human": "Declarative Workflows - Overview | Microsoft Learn | ETag \"h1/hl9lXlvNrzlmrNY88IOrUPsw=\"", + "etag": "\"CIVprEVCln+zsx2M76sqGwadlI4=\"", + "human": "Declarative Workflows - Overview | Microsoft Learn | ETag \"CIVprEVCln+zsx2M76sqGwadlI4=\"", "kind": "http_document", "last_modified": "Thu, 12 Mar 2026 00:48:46 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/declarative-workflows/advanced-patterns", "title": "Declarative Workflows - Overview | Microsoft Learn", - "value": "\"h1/hl9lXlvNrzlmrNY88IOrUPsw=\"" + "value": "\"CIVprEVCln+zsx2M76sqGwadlI4=\"" }, "agent-framework-docs-user-guide-workflows-declarative-workflows-expressions": { - "etag": "\"h1/hl9lXlvNrzlmrNY88IOrUPsw=\"", - "human": "Declarative Workflows - Overview | Microsoft Learn | ETag \"h1/hl9lXlvNrzlmrNY88IOrUPsw=\"", + "etag": "\"CIVprEVCln+zsx2M76sqGwadlI4=\"", + "human": "Declarative Workflows - Overview | Microsoft Learn | ETag \"CIVprEVCln+zsx2M76sqGwadlI4=\"", "kind": "http_document", "last_modified": "Thu, 12 Mar 2026 00:48:46 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/declarative-workflows/expressions", "title": "Declarative Workflows - Overview | Microsoft Learn", - "value": "\"h1/hl9lXlvNrzlmrNY88IOrUPsw=\"" + "value": "\"CIVprEVCln+zsx2M76sqGwadlI4=\"" }, "agent-framework-docs-user-guide-workflows-observability": { - "etag": "\"Eo7MjLkO+oYQcNthZjxStnZq2pA=\"", - "human": "Microsoft Agent Framework Workflows - Observability | Microsoft Learn | ETag \"Eo7MjLkO+oYQcNthZjxStnZq2pA=\"", + "etag": "\"2GQK7iyBVQs3E3E9eWqcVGCv+Hs=\"", + "human": "Microsoft Agent Framework Workflows - Observability | Microsoft Learn | ETag \"2GQK7iyBVQs3E3E9eWqcVGCv+Hs=\"", "kind": "http_document", "last_modified": "Thu, 12 Mar 2026 00:48:46 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/observability", "title": "Microsoft Agent Framework Workflows - Observability | Microsoft Learn", - "value": "\"Eo7MjLkO+oYQcNthZjxStnZq2pA=\"" + "value": "\"2GQK7iyBVQs3E3E9eWqcVGCv+Hs=\"" }, "agent-framework-docs-user-guide-workflows-orchestrations-concurrent": { - "etag": "\"+np6LtzaYaJ8fui/6uezvK7QRHI=\"", - "human": "Microsoft Agent Framework Workflows Orchestrations - Concurrent | Microsoft Learn | ETag \"+np6LtzaYaJ8fui/6uezvK7QRHI=\"", + "etag": "\"pWimzSVD0/34WYboKMzWqeRMbVA=\"", + "human": "Microsoft Agent Framework Workflows Orchestrations - Concurrent | Microsoft Learn | ETag \"pWimzSVD0/34WYboKMzWqeRMbVA=\"", "kind": "http_document", "last_modified": "Tue, 17 Mar 2026 00:28:33 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/orchestrations/concurrent", "title": "Microsoft Agent Framework Workflows Orchestrations - Concurrent | Microsoft Learn", - "value": "\"+np6LtzaYaJ8fui/6uezvK7QRHI=\"" + "value": "\"pWimzSVD0/34WYboKMzWqeRMbVA=\"" }, "agent-framework-docs-user-guide-workflows-orchestrations-group-chat": { - "etag": "\"VQWa9FvLSN1CbVdSP4/+Wpkt4KU=\"", - "human": "Microsoft Agent Framework Workflows Orchestrations - Group Chat | Microsoft Learn | ETag \"VQWa9FvLSN1CbVdSP4/+Wpkt4KU=\"", + "etag": "\"8Vgte8ywCaKRkKebJUOjsmdccrA=\"", + "human": "Microsoft Agent Framework Workflows Orchestrations - Group Chat | Microsoft Learn | ETag \"8Vgte8ywCaKRkKebJUOjsmdccrA=\"", "kind": "http_document", "last_modified": "Tue, 17 Mar 2026 00:28:33 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/orchestrations/group-chat", "title": "Microsoft Agent Framework Workflows Orchestrations - Group Chat | Microsoft Learn", - "value": "\"VQWa9FvLSN1CbVdSP4/+Wpkt4KU=\"" + "value": "\"8Vgte8ywCaKRkKebJUOjsmdccrA=\"" }, "agent-framework-docs-user-guide-workflows-orchestrations-handoff": { - "etag": "\"NTtjtHciVwiHmppgNhbCZa3CW2U=\"", - "human": "Microsoft Agent Framework Workflows Orchestrations - Handoff | Microsoft Learn | ETag \"NTtjtHciVwiHmppgNhbCZa3CW2U=\"", + "etag": "\"NangPxOAEx/xmLPSL9gCh6lE6Rg=\"", + "human": "Microsoft Agent Framework Workflows Orchestrations - Handoff | Microsoft Learn | ETag \"NangPxOAEx/xmLPSL9gCh6lE6Rg=\"", "kind": "http_document", - "last_modified": "Tue, 17 Mar 2026 00:28:33 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/orchestrations/handoff", "title": "Microsoft Agent Framework Workflows Orchestrations - Handoff | Microsoft Learn", - "value": "\"NTtjtHciVwiHmppgNhbCZa3CW2U=\"" + "value": "\"NangPxOAEx/xmLPSL9gCh6lE6Rg=\"" }, "agent-framework-docs-user-guide-workflows-orchestrations-human-in-the-loop": { - "etag": "\"JNJVtPqacGmxhKIFShLrZjkHN04=\"", - "human": "Microsoft Agent Framework Workflows - Human-in-the-loop (HITL) | Microsoft Learn | ETag \"JNJVtPqacGmxhKIFShLrZjkHN04=\"", + "etag": "\"1kJsfEIm80OArNlkmmwb2/BdRAQ=\"", + "human": "Microsoft Agent Framework Workflows - Human-in-the-loop (HITL) | Microsoft Learn | ETag \"1kJsfEIm80OArNlkmmwb2/BdRAQ=\"", "kind": "http_document", "last_modified": "Wed, 11 Mar 2026 19:17:18 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/orchestrations/human-in-the-loop", "title": "Microsoft Agent Framework Workflows - Human-in-the-loop (HITL) | Microsoft Learn", - "value": "\"JNJVtPqacGmxhKIFShLrZjkHN04=\"" + "value": "\"1kJsfEIm80OArNlkmmwb2/BdRAQ=\"" }, "agent-framework-docs-user-guide-workflows-orchestrations-magentic": { - "etag": "\"dX0QRFb/KROiEhfXlVBrIrUHf7M=\"", - "human": "Microsoft Agent Framework Workflows Orchestrations - Magentic | Microsoft Learn | ETag \"dX0QRFb/KROiEhfXlVBrIrUHf7M=\"", + "etag": "\"HGYPemT52Av563W3oT2IIDlF0E4=\"", + "human": "Microsoft Agent Framework Workflows Orchestrations - Magentic | Microsoft Learn | ETag \"HGYPemT52Av563W3oT2IIDlF0E4=\"", "kind": "http_document", "last_modified": "Tue, 17 Mar 2026 00:28:33 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/orchestrations/magentic", "title": "Microsoft Agent Framework Workflows Orchestrations - Magentic | Microsoft Learn", - "value": "\"dX0QRFb/KROiEhfXlVBrIrUHf7M=\"" + "value": "\"HGYPemT52Av563W3oT2IIDlF0E4=\"" }, "agent-framework-docs-user-guide-workflows-orchestrations-overview": { - "etag": "\"Z68xaolij4lbA1WzAIA9UC0z5P4=\"", - "human": "Workflow orchestrations in Agent Framework | Microsoft Learn | ETag \"Z68xaolij4lbA1WzAIA9UC0z5P4=\"", + "etag": "\"cty/p/EWUeXgZkSDZ9Mq4/0YoTI=\"", + "human": "Workflow orchestrations in Agent Framework | Microsoft Learn | ETag \"cty/p/EWUeXgZkSDZ9Mq4/0YoTI=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 18:42:25 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/orchestrations/overview", "title": "Workflow orchestrations in Agent Framework | Microsoft Learn", - "value": "\"Z68xaolij4lbA1WzAIA9UC0z5P4=\"" + "value": "\"cty/p/EWUeXgZkSDZ9Mq4/0YoTI=\"" }, "agent-framework-docs-user-guide-workflows-orchestrations-sequential": { - "etag": "\"OPGrHzPXfMCiVPpmrc2LoHRby18=\"", - "human": "Microsoft Agent Framework Workflows Orchestrations - Sequential | Microsoft Learn | ETag \"OPGrHzPXfMCiVPpmrc2LoHRby18=\"", + "etag": "\"Vmfr40id0i63OXAbOUeecl83iwA=\"", + "human": "Microsoft Agent Framework Workflows Orchestrations - Sequential | Microsoft Learn | ETag \"Vmfr40id0i63OXAbOUeecl83iwA=\"", "kind": "http_document", "last_modified": "Tue, 17 Mar 2026 00:28:33 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/orchestrations/sequential", "title": "Microsoft Agent Framework Workflows Orchestrations - Sequential | Microsoft Learn", - "value": "\"OPGrHzPXfMCiVPpmrc2LoHRby18=\"" + "value": "\"Vmfr40id0i63OXAbOUeecl83iwA=\"" }, "agent-framework-docs-user-guide-workflows-overview": { - "etag": "\"DxrsGQhxN9CvqIYChSTaqSBO63E=\"", - "human": "Microsoft Agent Framework Workflows | Microsoft Learn | ETag \"DxrsGQhxN9CvqIYChSTaqSBO63E=\"", + "etag": "\"xC5bnI/CyUF6M/LudvWj1YrUG1w=\"", + "human": "Microsoft Agent Framework Workflows | Microsoft Learn | ETag \"xC5bnI/CyUF6M/LudvWj1YrUG1w=\"", "kind": "http_document", "last_modified": "Wed, 11 Mar 2026 19:17:18 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/overview", "title": "Microsoft Agent Framework Workflows | Microsoft Learn", - "value": "\"DxrsGQhxN9CvqIYChSTaqSBO63E=\"" + "value": "\"xC5bnI/CyUF6M/LudvWj1YrUG1w=\"" }, "agent-framework-docs-user-guide-workflows-requests-and-responses": { - "etag": "\"I8T+t6EzLY2ztApDALCu2SazChI=\"", - "human": "Microsoft Agent Framework Workflows - State | Microsoft Learn | ETag \"I8T+t6EzLY2ztApDALCu2SazChI=\"", + "etag": "\"VG/yPSJNgnyOeNTSrUO8WPn7kH4=\"", + "human": "Microsoft Agent Framework Workflows - State | Microsoft Learn | ETag \"VG/yPSJNgnyOeNTSrUO8WPn7kH4=\"", "kind": "http_document", - "last_modified": "Wed, 11 Mar 2026 19:17:18 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/requests-and-responses", "title": "Microsoft Agent Framework Workflows - State | Microsoft Learn", - "value": "\"I8T+t6EzLY2ztApDALCu2SazChI=\"" + "value": "\"VG/yPSJNgnyOeNTSrUO8WPn7kH4=\"" }, "agent-framework-docs-user-guide-workflows-shared-states": { - "etag": "\"ad785bcff79b49b0f2194c39cdd13c679a54c5de3de6f05ae446ca54eaef2113\"", - "human": "ETag \"ad785bcff79b49b0f2194c39cdd13c679a54c5de3de6f05ae446ca54eaef2113\"", + "etag": "\"VG/yPSJNgnyOeNTSrUO8WPn7kH4=\"", + "human": "Microsoft Agent Framework Workflows - State | Microsoft Learn | ETag \"VG/yPSJNgnyOeNTSrUO8WPn7kH4=\"", "kind": "http_document", - "last_modified": null, - "source_url": "https://raw.githubusercontent.com/MicrosoftDocs/semantic-kernel-docs/main/agent-framework/user-guide/workflows/shared-states.md", - "title": null, - "value": "\"ad785bcff79b49b0f2194c39cdd13c679a54c5de3de6f05ae446ca54eaef2113\"" + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", + "source_url": "https://learn.microsoft.com/agent-framework/workflows/state", + "title": "Microsoft Agent Framework Workflows - State | Microsoft Learn", + "value": "\"VG/yPSJNgnyOeNTSrUO8WPn7kH4=\"" }, "agent-framework-docs-user-guide-workflows-state-isolation": { - "etag": "\"I8T+t6EzLY2ztApDALCu2SazChI=\"", - "human": "Microsoft Agent Framework Workflows - State | Microsoft Learn | ETag \"I8T+t6EzLY2ztApDALCu2SazChI=\"", + "etag": "\"VG/yPSJNgnyOeNTSrUO8WPn7kH4=\"", + "human": "Microsoft Agent Framework Workflows - State | Microsoft Learn | ETag \"VG/yPSJNgnyOeNTSrUO8WPn7kH4=\"", "kind": "http_document", - "last_modified": "Wed, 11 Mar 2026 19:17:18 GMT", + "last_modified": "Thu, 26 Mar 2026 02:09:02 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/state-isolation", "title": "Microsoft Agent Framework Workflows - State | Microsoft Learn", - "value": "\"I8T+t6EzLY2ztApDALCu2SazChI=\"" + "value": "\"VG/yPSJNgnyOeNTSrUO8WPn7kH4=\"" }, "agent-framework-docs-user-guide-workflows-using-agents": { - "etag": "\"qW1OlRC/BYE3xHbAvX3CObf7MHY=\"", - "human": "Agents in Workflows | Microsoft Learn | ETag \"qW1OlRC/BYE3xHbAvX3CObf7MHY=\"", + "etag": "\"l4szHqG7YVSA7UY0IRO+hXM3gro=\"", + "human": "Agents in Workflows | Microsoft Learn | ETag \"l4szHqG7YVSA7UY0IRO+hXM3gro=\"", "kind": "http_document", "last_modified": "Wed, 11 Mar 2026 19:17:18 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/using-agents", "title": "Agents in Workflows | Microsoft Learn", - "value": "\"qW1OlRC/BYE3xHbAvX3CObf7MHY=\"" + "value": "\"l4szHqG7YVSA7UY0IRO+hXM3gro=\"" }, "agent-framework-docs-user-guide-workflows-visualization": { - "etag": "\"1r+Owda+Pv0gDeY8DzUm2+2QDsA=\"", - "human": "Microsoft Agent Framework Workflows - Visualization | Microsoft Learn | ETag \"1r+Owda+Pv0gDeY8DzUm2+2QDsA=\"", + "etag": "\"ZZXS+8K7sQKYiO1wStdvRaCEQyQ=\"", + "human": "Microsoft Agent Framework Workflows - Visualization | Microsoft Learn | ETag \"ZZXS+8K7sQKYiO1wStdvRaCEQyQ=\"", "kind": "http_document", "last_modified": "Thu, 12 Mar 2026 00:48:46 GMT", "source_url": "https://learn.microsoft.com/agent-framework/user-guide/workflows/visualization", "title": "Microsoft Agent Framework Workflows - Visualization | Microsoft Learn", - "value": "\"1r+Owda+Pv0gDeY8DzUm2+2QDsA=\"" + "value": "\"ZZXS+8K7sQKYiO1wStdvRaCEQyQ=\"" }, "agent-framework-dotnet-api-reference": { - "etag": "\"gIYmhSQy34x60G3rtt6bY+CqAII=\"", - "human": "Microsoft.Agents.AI Namespace | Microsoft Learn | ETag \"gIYmhSQy34x60G3rtt6bY+CqAII=\"", + "etag": "\"mOPbrDpNTvtW6PXkCEBj6gfBlDA=\"", + "human": "Microsoft.Agents.AI Namespace | Microsoft Learn | ETag \"mOPbrDpNTvtW6PXkCEBj6gfBlDA=\"", "kind": "http_document", "last_modified": "Thu, 26 Feb 2026 21:18:51 GMT", "source_url": "https://learn.microsoft.com/dotnet/api/microsoft.agents.ai", "title": "Microsoft.Agents.AI Namespace | Microsoft Learn", - "value": "\"gIYmhSQy34x60G3rtt6bY+CqAII=\"" + "value": "\"mOPbrDpNTvtW6PXkCEBj6gfBlDA=\"" }, "agent-framework-release": { "human": "dotnet-1.0.0-rc4 (2026-03-11T22:58:44Z)", @@ -926,13 +926,13 @@ "value": "\"e11c27083a1c77ee29c24fc54a2f957ef1a4680fd199d6ac6004971196dd3d3f\"" }, "aspire-docs": { - "etag": "\"ZJs6BvVxvCdmhy7+5xFEjE7rNto0awpcVW9/AxDqLj4=\"", - "human": "Aspire \u2014 Your stack, streamlined | ETag \"ZJs6BvVxvCdmhy7+5xFEjE7rNto0awpcVW9/AxDqLj4=\"", + "etag": "\"NImqlziy4Dzs9nqs9N1uYFQaIvi4xed6bQT+NsA1ALo=\"", + "human": "Aspire \u2014 Your stack, streamlined | ETag \"NImqlziy4Dzs9nqs9N1uYFQaIvi4xed6bQT+NsA1ALo=\"", "kind": "http_document", - "last_modified": "Mon, 23 Mar 2026 18:53:17 GMT", + "last_modified": "Fri, 27 Mar 2026 21:04:12 GMT", "source_url": "https://aspire.dev/", "title": "Aspire \u2014 Your stack, streamlined", - "value": "\"ZJs6BvVxvCdmhy7+5xFEjE7rNto0awpcVW9/AxDqLj4=\"" + "value": "\"NImqlziy4Dzs9nqs9N1uYFQaIvi4xed6bQT+NsA1ALo=\"" }, "aspire-release": { "human": "v13.2.0 (2026-03-23T15:12:31Z)", @@ -942,13 +942,13 @@ "value": "v13.2.0" }, "aspnetcore-overview-docs": { - "etag": "\"TiSSNbr25htgDK0nahP1YS80EQU=\"", - "human": "Overview of ASP.NET Core | Microsoft Learn | ETag \"TiSSNbr25htgDK0nahP1YS80EQU=\"", + "etag": "\"goDKkFLj2zmq1cmpvUkhQHGHIdk=\"", + "human": "Overview of ASP.NET Core | Microsoft Learn | ETag \"goDKkFLj2zmq1cmpvUkhQHGHIdk=\"", "kind": "http_document", "last_modified": "Thu, 22 Jan 2026 23:58:06 GMT", "source_url": "https://learn.microsoft.com/aspnet/core/overview?view=aspnetcore-10.0", "title": "Overview of ASP.NET Core | Microsoft Learn", - "value": "\"TiSSNbr25htgDK0nahP1YS80EQU=\"" + "value": "\"goDKkFLj2zmq1cmpvUkhQHGHIdk=\"" }, "aspnetcore-release": { "human": "v9.0.14 (2026-03-10T20:18:56Z)", @@ -972,11 +972,11 @@ "value": "2.51.0" }, "biome-release": { - "human": "@biomejs/biome@2.4.8 (2026-03-18T13:53:14Z)", + "human": "@biomejs/biome@2.4.9 (2026-03-25T12:38:52Z)", "kind": "github_release", - "published_at": "2026-03-18T13:53:14Z", - "source_url": "https://github.com/biomejs/biome/releases/tag/%40biomejs/biome%402.4.8", - "value": "@biomejs/biome@2.4.8" + "published_at": "2026-03-25T12:38:52Z", + "source_url": "https://github.com/biomejs/biome/releases/tag/%40biomejs/biome%402.4.9", + "value": "@biomejs/biome@2.4.9" }, "chous-release": { "human": "v0.1.4 (2026-01-05T18:05:24Z)", @@ -993,443 +993,443 @@ "value": "v13.1.1" }, "dotnet-ai-docs-azure-ai-services-authentication": { - "etag": "\"Gn7HWmqrKMbhKW6vTCGt/mQZoKc=\"", - "human": "Authenticate to Azure OpenAI using .NET - .NET | Microsoft Learn | ETag \"Gn7HWmqrKMbhKW6vTCGt/mQZoKc=\"", + "etag": "\"PhGXgR5vUEt3FWYQNgay+3uDBhg=\"", + "human": "Authenticate to Azure OpenAI using .NET - .NET | Microsoft Learn | ETag \"PhGXgR5vUEt3FWYQNgay+3uDBhg=\"", "kind": "http_document", "last_modified": "Fri, 13 Mar 2026 17:50:04 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/azure-ai-services-authentication", "title": "Authenticate to Azure OpenAI using .NET - .NET | Microsoft Learn", - "value": "\"Gn7HWmqrKMbhKW6vTCGt/mQZoKc=\"" + "value": "\"PhGXgR5vUEt3FWYQNgay+3uDBhg=\"" }, "dotnet-ai-docs-conceptual-agents": { - "etag": "\"raRFqSi+QRuk/AM0Oy8O2ehdDUs=\"", - "human": "Agents - .NET | Microsoft Learn | ETag \"raRFqSi+QRuk/AM0Oy8O2ehdDUs=\"", + "etag": "\"oxABd/GL4+8q+KReq5FU2OKr0yk=\"", + "human": "Agents - .NET | Microsoft Learn | ETag \"oxABd/GL4+8q+KReq5FU2OKr0yk=\"", "kind": "http_document", "last_modified": "Fri, 12 Dec 2025 08:22:44 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/conceptual/agents", "title": "Agents - .NET | Microsoft Learn", - "value": "\"raRFqSi+QRuk/AM0Oy8O2ehdDUs=\"" + "value": "\"oxABd/GL4+8q+KReq5FU2OKr0yk=\"" }, "dotnet-ai-docs-conceptual-ai-tools": { - "etag": "\"0GnFh68JmJ+YiFFTGNhiqWbZjdU=\"", - "human": "AI tool calling - .NET | Microsoft Learn | ETag \"0GnFh68JmJ+YiFFTGNhiqWbZjdU=\"", + "etag": "\"X+BWnhdZ1PkKe3aBlFhaWaKWi+M=\"", + "human": "AI tool calling - .NET | Microsoft Learn | ETag \"X+BWnhdZ1PkKe3aBlFhaWaKWi+M=\"", "kind": "http_document", "last_modified": "Wed, 11 Mar 2026 00:29:58 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/conceptual/ai-tools", "title": "AI tool calling - .NET | Microsoft Learn", - "value": "\"0GnFh68JmJ+YiFFTGNhiqWbZjdU=\"" + "value": "\"X+BWnhdZ1PkKe3aBlFhaWaKWi+M=\"" }, "dotnet-ai-docs-conceptual-chain-of-thought-prompting": { - "etag": "\"++kFTNcbuCSElL5OdOs8yFgBYyc=\"", - "human": "Chain of thought prompting - .NET | Microsoft Learn | ETag \"++kFTNcbuCSElL5OdOs8yFgBYyc=\"", + "etag": "\"kR+a2W6SFbilo9QzTxVuBmBweog=\"", + "human": "Chain of thought prompting - .NET | Microsoft Learn | ETag \"kR+a2W6SFbilo9QzTxVuBmBweog=\"", "kind": "http_document", "last_modified": "Fri, 13 Mar 2026 17:50:04 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/conceptual/chain-of-thought-prompting", "title": "Chain of thought prompting - .NET | Microsoft Learn", - "value": "\"++kFTNcbuCSElL5OdOs8yFgBYyc=\"" + "value": "\"kR+a2W6SFbilo9QzTxVuBmBweog=\"" }, "dotnet-ai-docs-conceptual-data-ingestion": { - "etag": "\"lHqdb4f05wxn/nRWvYGnyJe7Dn8=\"", - "human": "Data ingestion - .NET | Microsoft Learn | ETag \"lHqdb4f05wxn/nRWvYGnyJe7Dn8=\"", + "etag": "\"EX9J3RVDRlpHJKDOK3+sJYekP7Q=\"", + "human": "Data ingestion - .NET | Microsoft Learn | ETag \"EX9J3RVDRlpHJKDOK3+sJYekP7Q=\"", "kind": "http_document", - "last_modified": "Wed, 11 Mar 2026 19:26:04 GMT", + "last_modified": "Thu, 26 Mar 2026 18:29:18 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/conceptual/data-ingestion", "title": "Data ingestion - .NET | Microsoft Learn", - "value": "\"lHqdb4f05wxn/nRWvYGnyJe7Dn8=\"" + "value": "\"EX9J3RVDRlpHJKDOK3+sJYekP7Q=\"" }, "dotnet-ai-docs-conceptual-embeddings": { - "etag": "\"4sDLc+SnddOtSlEUMd7WcEZeEdw=\"", - "human": "How Embeddings Extend Your AI Model's Reach - .NET | Microsoft Learn | ETag \"4sDLc+SnddOtSlEUMd7WcEZeEdw=\"", + "etag": "\"pjGBbkU2uOUyiPa3OjOGX6sFE3A=\"", + "human": "How Embeddings Extend Your AI Model's Reach - .NET | Microsoft Learn | ETag \"pjGBbkU2uOUyiPa3OjOGX6sFE3A=\"", "kind": "http_document", - "last_modified": "Fri, 13 Mar 2026 17:50:04 GMT", + "last_modified": "Thu, 26 Mar 2026 18:29:18 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/conceptual/embeddings", "title": "How Embeddings Extend Your AI Model's Reach - .NET | Microsoft Learn", - "value": "\"4sDLc+SnddOtSlEUMd7WcEZeEdw=\"" + "value": "\"pjGBbkU2uOUyiPa3OjOGX6sFE3A=\"" }, "dotnet-ai-docs-conceptual-how-genai-and-llms-work": { - "etag": "\"/FoL6vQ6kNowzgg8I/v4JRNrS3A=\"", - "human": "How Generative AI and LLMs work - .NET | Microsoft Learn | ETag \"/FoL6vQ6kNowzgg8I/v4JRNrS3A=\"", + "etag": "\"0CNRKR7yKvNcSbH/Ay6teOzUrQE=\"", + "human": "How Generative AI and LLMs work - .NET | Microsoft Learn | ETag \"0CNRKR7yKvNcSbH/Ay6teOzUrQE=\"", "kind": "http_document", "last_modified": "Fri, 13 Mar 2026 17:50:04 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/conceptual/how-genai-and-llms-work", "title": "How Generative AI and LLMs work - .NET | Microsoft Learn", - "value": "\"/FoL6vQ6kNowzgg8I/v4JRNrS3A=\"" + "value": "\"0CNRKR7yKvNcSbH/Ay6teOzUrQE=\"" }, "dotnet-ai-docs-conceptual-prompt-engineering-dotnet": { - "etag": "\"EYXIsX6nzkxjcSYRv+6Yy8TW+5w=\"", - "human": "Prompt engineering concepts - .NET | Microsoft Learn | ETag \"EYXIsX6nzkxjcSYRv+6Yy8TW+5w=\"", + "etag": "\"xXNZ2WooRmAZpS03FKnWKvRWQAc=\"", + "human": "Prompt engineering concepts - .NET | Microsoft Learn | ETag \"xXNZ2WooRmAZpS03FKnWKvRWQAc=\"", "kind": "http_document", - "last_modified": "Fri, 13 Mar 2026 17:50:04 GMT", + "last_modified": "Wed, 25 Mar 2026 12:30:33 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/conceptual/prompt-engineering-dotnet", "title": "Prompt engineering concepts - .NET | Microsoft Learn", - "value": "\"EYXIsX6nzkxjcSYRv+6Yy8TW+5w=\"" + "value": "\"xXNZ2WooRmAZpS03FKnWKvRWQAc=\"" }, "dotnet-ai-docs-conceptual-rag": { - "etag": "\"HPgKjJdiiA9n4Pllk+w+Pl9A4rI=\"", - "human": "Integrate Your Data into AI Apps with Retrieval-Augmented Generation - .NET | Microsoft Learn | ETag \"HPgKjJdiiA9n4Pllk+w+Pl9A4rI=\"", + "etag": "\"+SGw/qz3CDJ1zOqrijkGuSd6F98=\"", + "human": "Integrate Your Data into AI Apps with Retrieval-Augmented Generation - .NET | Microsoft Learn | ETag \"+SGw/qz3CDJ1zOqrijkGuSd6F98=\"", "kind": "http_document", "last_modified": "Fri, 12 Dec 2025 08:22:44 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/conceptual/rag", "title": "Integrate Your Data into AI Apps with Retrieval-Augmented Generation - .NET | Microsoft Learn", - "value": "\"HPgKjJdiiA9n4Pllk+w+Pl9A4rI=\"" + "value": "\"+SGw/qz3CDJ1zOqrijkGuSd6F98=\"" }, "dotnet-ai-docs-conceptual-understanding-tokens": { - "etag": "\"mpMUNJDkFsbfF8Mkv5vvRaiTVaI=\"", - "human": "Understanding tokens - .NET | Microsoft Learn | ETag \"mpMUNJDkFsbfF8Mkv5vvRaiTVaI=\"", + "etag": "\"6nrhlO8kF9kAohVvkSEFurM4mz4=\"", + "human": "Understanding tokens - .NET | Microsoft Learn | ETag \"6nrhlO8kF9kAohVvkSEFurM4mz4=\"", "kind": "http_document", - "last_modified": "Fri, 13 Mar 2026 17:50:04 GMT", + "last_modified": "Thu, 26 Mar 2026 18:29:18 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/conceptual/understanding-tokens", "title": "Understanding tokens - .NET | Microsoft Learn", - "value": "\"mpMUNJDkFsbfF8Mkv5vvRaiTVaI=\"" + "value": "\"6nrhlO8kF9kAohVvkSEFurM4mz4=\"" }, "dotnet-ai-docs-conceptual-vector-databases": { - "etag": "\"mIuzmSJXeDWRdduUU++uHtU7qLA=\"", - "human": "Using Vector Databases to Extend LLM Capabilities - .NET | Microsoft Learn | ETag \"mIuzmSJXeDWRdduUU++uHtU7qLA=\"", + "etag": "\"Fqybc/G0cIKZMiDOgDjddveB4OM=\"", + "human": "Vector databases for .NET AI apps - .NET | Microsoft Learn | ETag \"Fqybc/G0cIKZMiDOgDjddveB4OM=\"", "kind": "http_document", - "last_modified": "Fri, 13 Mar 2026 17:50:04 GMT", + "last_modified": "Thu, 26 Mar 2026 18:29:18 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/conceptual/vector-databases", - "title": "Using Vector Databases to Extend LLM Capabilities - .NET | Microsoft Learn", - "value": "\"mIuzmSJXeDWRdduUU++uHtU7qLA=\"" + "title": "Vector databases for .NET AI apps - .NET | Microsoft Learn", + "value": "\"Fqybc/G0cIKZMiDOgDjddveB4OM=\"" }, "dotnet-ai-docs-conceptual-zero-shot-learning": { - "etag": "\"WHKWffnylR00xdmb5XJ6cfZNyqc=\"", - "human": "Zero-shot and few-shot learning - .NET | Microsoft Learn | ETag \"WHKWffnylR00xdmb5XJ6cfZNyqc=\"", + "etag": "\"J8zV56/MemMc37XPrMQkMcHE1as=\"", + "human": "Zero-shot and few-shot learning - .NET | Microsoft Learn | ETag \"J8zV56/MemMc37XPrMQkMcHE1as=\"", "kind": "http_document", "last_modified": "Fri, 13 Mar 2026 17:50:04 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/conceptual/zero-shot-learning", "title": "Zero-shot and few-shot learning - .NET | Microsoft Learn", - "value": "\"WHKWffnylR00xdmb5XJ6cfZNyqc=\"" + "value": "\"J8zV56/MemMc37XPrMQkMcHE1as=\"" }, "dotnet-ai-docs-dotnet-ai-ecosystem": { - "etag": "\"sgsWATR4EBA7yAQ/pdECzaZL2hk=\"", - "human": ".NET + AI ecosystem tools and SDKs - .NET | Microsoft Learn | ETag \"sgsWATR4EBA7yAQ/pdECzaZL2hk=\"", + "etag": "\"t/W8OXSrfxUdg0ROiH9wFhcrhOc=\"", + "human": ".NET + AI ecosystem tools and SDKs - .NET | Microsoft Learn | ETag \"t/W8OXSrfxUdg0ROiH9wFhcrhOc=\"", "kind": "http_document", - "last_modified": "Wed, 11 Mar 2026 00:29:58 GMT", + "last_modified": "Thu, 26 Mar 2026 18:29:18 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/dotnet-ai-ecosystem", "title": ".NET + AI ecosystem tools and SDKs - .NET | Microsoft Learn", - "value": "\"sgsWATR4EBA7yAQ/pdECzaZL2hk=\"" + "value": "\"t/W8OXSrfxUdg0ROiH9wFhcrhOc=\"" }, "dotnet-ai-docs-evaluation-evaluate-ai-response": { - "etag": "\"ITXRH+rRqLzV/GHqNWFnnNud72c=\"", - "human": "Quickstart - Evaluate the quality of a model's response - .NET | Microsoft Learn | ETag \"ITXRH+rRqLzV/GHqNWFnnNud72c=\"", + "etag": "\"nOggLekZYnh7Cfr2sXVs/rYtZwU=\"", + "human": "Quickstart - Evaluate the quality of a model's response - .NET | Microsoft Learn | ETag \"nOggLekZYnh7Cfr2sXVs/rYtZwU=\"", "kind": "http_document", "last_modified": "Fri, 13 Mar 2026 17:50:04 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/evaluation/evaluate-ai-response", "title": "Quickstart - Evaluate the quality of a model's response - .NET | Microsoft Learn", - "value": "\"ITXRH+rRqLzV/GHqNWFnnNud72c=\"" + "value": "\"nOggLekZYnh7Cfr2sXVs/rYtZwU=\"" }, "dotnet-ai-docs-evaluation-evaluate-safety": { - "etag": "\"c9isR/EQf1xFDwrBnm7CVKwg+RU=\"", - "human": "Tutorial - Evaluate response safety with caching and reporting - .NET | Microsoft Learn | ETag \"c9isR/EQf1xFDwrBnm7CVKwg+RU=\"", + "etag": "\"vhpT73ZBoMV6mklqkZXVMQ2l41I=\"", + "human": "Tutorial - Evaluate response safety with caching and reporting - .NET | Microsoft Learn | ETag \"vhpT73ZBoMV6mklqkZXVMQ2l41I=\"", "kind": "http_document", "last_modified": "Fri, 13 Mar 2026 17:50:04 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/evaluation/evaluate-safety", "title": "Tutorial - Evaluate response safety with caching and reporting - .NET | Microsoft Learn", - "value": "\"c9isR/EQf1xFDwrBnm7CVKwg+RU=\"" + "value": "\"vhpT73ZBoMV6mklqkZXVMQ2l41I=\"" }, "dotnet-ai-docs-evaluation-evaluate-with-reporting": { - "etag": "\"iMmXR/lRSbAs7i4ipfBYdgOXuLQ=\"", - "human": "Tutorial - Evaluate response quality with caching and reporting - .NET | Microsoft Learn | ETag \"iMmXR/lRSbAs7i4ipfBYdgOXuLQ=\"", + "etag": "\"R9WSC/j98ynp/iBH5LVahK0Xoe4=\"", + "human": "Tutorial - Evaluate response quality with caching and reporting - .NET | Microsoft Learn | ETag \"R9WSC/j98ynp/iBH5LVahK0Xoe4=\"", "kind": "http_document", "last_modified": "Fri, 13 Mar 2026 17:50:04 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/evaluation/evaluate-with-reporting", "title": "Tutorial - Evaluate response quality with caching and reporting - .NET | Microsoft Learn", - "value": "\"iMmXR/lRSbAs7i4ipfBYdgOXuLQ=\"" + "value": "\"R9WSC/j98ynp/iBH5LVahK0Xoe4=\"" }, "dotnet-ai-docs-evaluation-libraries": { - "etag": "\"iOUFwCj9SjwVJouyGjl1RIvmvd4=\"", - "human": "The Microsoft.Extensions.AI.Evaluation libraries - .NET | Microsoft Learn | ETag \"iOUFwCj9SjwVJouyGjl1RIvmvd4=\"", + "etag": "\"dTfWqDQ+tZodCcpDOJdnGc5y7UU=\"", + "human": "The Microsoft.Extensions.AI.Evaluation libraries - .NET | Microsoft Learn | ETag \"dTfWqDQ+tZodCcpDOJdnGc5y7UU=\"", "kind": "http_document", "last_modified": "Wed, 25 Feb 2026 19:00:18 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/evaluation/libraries", "title": "The Microsoft.Extensions.AI.Evaluation libraries - .NET | Microsoft Learn", - "value": "\"iOUFwCj9SjwVJouyGjl1RIvmvd4=\"" + "value": "\"dTfWqDQ+tZodCcpDOJdnGc5y7UU=\"" }, "dotnet-ai-docs-evaluation-responsible-ai": { - "etag": "\"UxFklpSHcGleGzDfsKXByhRAbDI=\"", - "human": "Responsible AI with .NET - .NET | Microsoft Learn | ETag \"UxFklpSHcGleGzDfsKXByhRAbDI=\"", + "etag": "\"n4abkYFvkfdrw5fGLIzA40tdI+E=\"", + "human": "Responsible AI with .NET - .NET | Microsoft Learn | ETag \"n4abkYFvkfdrw5fGLIzA40tdI+E=\"", "kind": "http_document", "last_modified": "Wed, 25 Feb 2026 19:00:18 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/evaluation/responsible-ai", "title": "Responsible AI with .NET - .NET | Microsoft Learn", - "value": "\"UxFklpSHcGleGzDfsKXByhRAbDI=\"" + "value": "\"n4abkYFvkfdrw5fGLIzA40tdI+E=\"" }, "dotnet-ai-docs-get-started-app-chat-scaling-with-azure-container-apps": { - "etag": "\"EwgEL9GvXfUIIskMH1Sb7SyJCLE=\"", - "human": "Scale Azure OpenAI for .NET chat sample using RAG - .NET | Microsoft Learn | ETag \"EwgEL9GvXfUIIskMH1Sb7SyJCLE=\"", + "etag": "\"ySNnP48b+NUmPtEToQJbmce+wI4=\"", + "human": "Scale Azure OpenAI for .NET chat sample using RAG - .NET | Microsoft Learn | ETag \"ySNnP48b+NUmPtEToQJbmce+wI4=\"", "kind": "http_document", "last_modified": "Fri, 20 Mar 2026 17:29:45 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/get-started-app-chat-scaling-with-azure-container-apps", "title": "Scale Azure OpenAI for .NET chat sample using RAG - .NET | Microsoft Learn", - "value": "\"EwgEL9GvXfUIIskMH1Sb7SyJCLE=\"" + "value": "\"ySNnP48b+NUmPtEToQJbmce+wI4=\"" }, "dotnet-ai-docs-get-started-app-chat-template": { - "etag": "\"gEEq0Mm7/YTgjR2tcDWHUPxAww8=\"", - "human": "Get started with the 'chat using your own data sample' for .NET - .NET | Microsoft Learn | ETag \"gEEq0Mm7/YTgjR2tcDWHUPxAww8=\"", + "etag": "\"2DvRsn/BUdIemGw9HkT5i+EU2pg=\"", + "human": "Get started with the 'chat using your own data sample' for .NET - .NET | Microsoft Learn | ETag \"2DvRsn/BUdIemGw9HkT5i+EU2pg=\"", "kind": "http_document", "last_modified": "Fri, 13 Mar 2026 17:50:04 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/get-started-app-chat-template", "title": "Get started with the 'chat using your own data sample' for .NET - .NET | Microsoft Learn", - "value": "\"gEEq0Mm7/YTgjR2tcDWHUPxAww8=\"" + "value": "\"2DvRsn/BUdIemGw9HkT5i+EU2pg=\"" }, "dotnet-ai-docs-get-started-mcp": { - "etag": "\"2bwN60Qc9f+YiQaoO8JVbZXvxnI=\"", - "human": "Get started with .NET AI and MCP - .NET | Microsoft Learn | ETag \"2bwN60Qc9f+YiQaoO8JVbZXvxnI=\"", + "etag": "\"SOh6NsNnj++dSdHKbH7cqG+Sh0o=\"", + "human": "Get started with .NET AI and MCP - .NET | Microsoft Learn | ETag \"SOh6NsNnj++dSdHKbH7cqG+Sh0o=\"", "kind": "http_document", "last_modified": "Fri, 13 Feb 2026 08:25:16 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/get-started-mcp", "title": "Get started with .NET AI and MCP - .NET | Microsoft Learn", - "value": "\"2bwN60Qc9f+YiQaoO8JVbZXvxnI=\"" + "value": "\"SOh6NsNnj++dSdHKbH7cqG+Sh0o=\"" }, "dotnet-ai-docs-how-to-access-data-in-functions": { - "etag": "\"E0yRYh6orSI/q1XKGv99QZavbz8=\"", - "human": "Access data in AI functions - .NET | Microsoft Learn | ETag \"E0yRYh6orSI/q1XKGv99QZavbz8=\"", + "etag": "\"AgBOdFftBWhwGhJYbJxRMLoukNo=\"", + "human": "Access data in AI functions - .NET | Microsoft Learn | ETag \"AgBOdFftBWhwGhJYbJxRMLoukNo=\"", "kind": "http_document", "last_modified": "Mon, 23 Feb 2026 19:55:59 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/how-to/access-data-in-functions", "title": "Access data in AI functions - .NET | Microsoft Learn", - "value": "\"E0yRYh6orSI/q1XKGv99QZavbz8=\"" + "value": "\"AgBOdFftBWhwGhJYbJxRMLoukNo=\"" }, "dotnet-ai-docs-how-to-app-service-aoai-auth": { - "etag": "\"Glh968p4+Kvq8oYIJIo9kCbWJB8=\"", - "human": "Authenticate an Azure hosted .NET app to Azure OpenAI using Microsoft Entra ID - .NET | Microsoft Learn | ETag \"Glh968p4+Kvq8oYIJIo9kCbWJB8=\"", + "etag": "\"keqNzNvvlSjPvAIu1dcLA4JNJr4=\"", + "human": "Authenticate an Azure hosted .NET app to Azure OpenAI using Microsoft Entra ID - .NET | Microsoft Learn | ETag \"keqNzNvvlSjPvAIu1dcLA4JNJr4=\"", "kind": "http_document", "last_modified": "Fri, 13 Mar 2026 17:50:04 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/how-to/app-service-aoai-auth", "title": "Authenticate an Azure hosted .NET app to Azure OpenAI using Microsoft Entra ID - .NET | Microsoft Learn", - "value": "\"Glh968p4+Kvq8oYIJIo9kCbWJB8=\"" + "value": "\"keqNzNvvlSjPvAIu1dcLA4JNJr4=\"" }, "dotnet-ai-docs-how-to-content-filtering": { - "etag": "\"KI9AWsT2KCbumDKMiVosk75ZDNQ=\"", - "human": "Manage Azure OpenAI content filtering in a .NET app - .NET | Microsoft Learn | ETag \"KI9AWsT2KCbumDKMiVosk75ZDNQ=\"", + "etag": "\"wJyN8/pyAsGgU/+OWRshJDuhDNU=\"", + "human": "Manage Azure OpenAI content filtering in a .NET app - .NET | Microsoft Learn | ETag \"wJyN8/pyAsGgU/+OWRshJDuhDNU=\"", "kind": "http_document", "last_modified": "Fri, 13 Mar 2026 17:50:04 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/how-to/content-filtering", "title": "Manage Azure OpenAI content filtering in a .NET app - .NET | Microsoft Learn", - "value": "\"KI9AWsT2KCbumDKMiVosk75ZDNQ=\"" + "value": "\"wJyN8/pyAsGgU/+OWRshJDuhDNU=\"" }, "dotnet-ai-docs-how-to-handle-invalid-tool-input": { - "etag": "\"b2HFg2GzIouzWUiAw0H0w0qXsRs=\"", - "human": "Handle invalid function input from AI models - .NET | Microsoft Learn | ETag \"b2HFg2GzIouzWUiAw0H0w0qXsRs=\"", + "etag": "\"G2yLiWdHMy4uo8nY28QiEN3de+o=\"", + "human": "Handle invalid function input from AI models - .NET | Microsoft Learn | ETag \"G2yLiWdHMy4uo8nY28QiEN3de+o=\"", "kind": "http_document", "last_modified": "Wed, 11 Mar 2026 19:08:52 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/how-to/handle-invalid-tool-input", "title": "Handle invalid function input from AI models - .NET | Microsoft Learn", - "value": "\"b2HFg2GzIouzWUiAw0H0w0qXsRs=\"" + "value": "\"G2yLiWdHMy4uo8nY28QiEN3de+o=\"" }, "dotnet-ai-docs-how-to-use-tokenizers": { - "etag": "\"JjwnyOwaDCJBOsxrJgzcvwcf4d4=\"", - "human": "Use Microsoft.ML.Tokenizers for text tokenization - .NET | Microsoft Learn | ETag \"JjwnyOwaDCJBOsxrJgzcvwcf4d4=\"", + "etag": "\"EgIabvEcfVxwK/iqw/q8Ott/5as=\"", + "human": "Use Microsoft.ML.Tokenizers for text tokenization - .NET | Microsoft Learn | ETag \"EgIabvEcfVxwK/iqw/q8Ott/5as=\"", "kind": "http_document", "last_modified": "Wed, 11 Mar 2026 19:08:52 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/how-to/use-tokenizers", "title": "Use Microsoft.ML.Tokenizers for text tokenization - .NET | Microsoft Learn", - "value": "\"JjwnyOwaDCJBOsxrJgzcvwcf4d4=\"" + "value": "\"EgIabvEcfVxwK/iqw/q8Ott/5as=\"" }, "dotnet-ai-docs-ichatclient": { - "etag": "\"O2gn3ngo5wo1/EeG4Wl0Jn0C1AY=\"", - "human": "Use the IChatClient interface - .NET | Microsoft Learn | ETag \"O2gn3ngo5wo1/EeG4Wl0Jn0C1AY=\"", + "etag": "\"g+/VhAIGUWAbXlF6c5hca0gOzOw=\"", + "human": "Use the IChatClient interface - .NET | Microsoft Learn | ETag \"g+/VhAIGUWAbXlF6c5hca0gOzOw=\"", "kind": "http_document", "last_modified": "Fri, 13 Mar 2026 17:50:04 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/ichatclient", "title": "Use the IChatClient interface - .NET | Microsoft Learn", - "value": "\"O2gn3ngo5wo1/EeG4Wl0Jn0C1AY=\"" + "value": "\"g+/VhAIGUWAbXlF6c5hca0gOzOw=\"" }, "dotnet-ai-docs-iembeddinggenerator": { - "etag": "\"XSt/9iblVIkGsxSvxEl3ou/UjGo=\"", - "human": "Use the IEmbeddingGenerator interface - .NET | Microsoft Learn | ETag \"XSt/9iblVIkGsxSvxEl3ou/UjGo=\"", + "etag": "\"IS5PkrsCNpxD0Kmlo4sDq0s7Acg=\"", + "human": "Use the IEmbeddingGenerator interface - .NET | Microsoft Learn | ETag \"IS5PkrsCNpxD0Kmlo4sDq0s7Acg=\"", "kind": "http_document", "last_modified": "Mon, 23 Feb 2026 19:56:03 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/iembeddinggenerator", "title": "Use the IEmbeddingGenerator interface - .NET | Microsoft Learn", - "value": "\"XSt/9iblVIkGsxSvxEl3ou/UjGo=\"" + "value": "\"IS5PkrsCNpxD0Kmlo4sDq0s7Acg=\"" }, "dotnet-ai-docs-overview": { - "etag": "\"87kS2vG/Dj8pTg2OOnFslIy9wdQ=\"", - "human": "Develop .NET apps with AI features - .NET | Microsoft Learn | ETag \"87kS2vG/Dj8pTg2OOnFslIy9wdQ=\"", + "etag": "\"7Vvba6ed7YNz3Py/AyaUsOdIrCE=\"", + "human": "Develop .NET apps with AI features - .NET | Microsoft Learn | ETag \"7Vvba6ed7YNz3Py/AyaUsOdIrCE=\"", "kind": "http_document", - "last_modified": "Fri, 13 Feb 2026 08:25:16 GMT", + "last_modified": "Thu, 26 Mar 2026 18:29:18 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/overview", "title": "Develop .NET apps with AI features - .NET | Microsoft Learn", - "value": "\"87kS2vG/Dj8pTg2OOnFslIy9wdQ=\"" + "value": "\"7Vvba6ed7YNz3Py/AyaUsOdIrCE=\"" }, "dotnet-ai-docs-quickstarts-ai-templates": { - "etag": "\"jAYDQZcbpqjvi4eiQWkR7q+i+4M=\"", - "human": "Quickstart - Create a .NET AI app using the AI app template - .NET | Microsoft Learn | ETag \"jAYDQZcbpqjvi4eiQWkR7q+i+4M=\"", + "etag": "\"cny4B7T3LlSCO+GLPW74r7skxQg=\"", + "human": "Quickstart - Create a .NET AI app using the AI app template - .NET | Microsoft Learn | ETag \"cny4B7T3LlSCO+GLPW74r7skxQg=\"", "kind": "http_document", "last_modified": "Fri, 06 Mar 2026 22:03:39 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/quickstarts/ai-templates", "title": "Quickstart - Create a .NET AI app using the AI app template - .NET | Microsoft Learn", - "value": "\"jAYDQZcbpqjvi4eiQWkR7q+i+4M=\"" + "value": "\"cny4B7T3LlSCO+GLPW74r7skxQg=\"" }, "dotnet-ai-docs-quickstarts-build-chat-app": { - "etag": "\"6E9+69kuc1epTRk4fdoNJ7mvuvk=\"", - "human": "Quickstart - Build an AI chat app with .NET - .NET | Microsoft Learn | ETag \"6E9+69kuc1epTRk4fdoNJ7mvuvk=\"", + "etag": "\"7rtHA3ol6FANqj+gdxVoZ9h/7Y0=\"", + "human": "Quickstart - Build an AI chat app with .NET - .NET | Microsoft Learn | ETag \"7rtHA3ol6FANqj+gdxVoZ9h/7Y0=\"", "kind": "http_document", "last_modified": "Wed, 11 Mar 2026 00:29:58 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/quickstarts/build-chat-app", "title": "Quickstart - Build an AI chat app with .NET - .NET | Microsoft Learn", - "value": "\"6E9+69kuc1epTRk4fdoNJ7mvuvk=\"" + "value": "\"7rtHA3ol6FANqj+gdxVoZ9h/7Y0=\"" }, "dotnet-ai-docs-quickstarts-build-mcp-client": { - "etag": "\"q4SAtmseBQRfgyLZY3QiQtIXbGU=\"", - "human": "Quickstart - Create a minimal MCP client using .NET - .NET | Microsoft Learn | ETag \"q4SAtmseBQRfgyLZY3QiQtIXbGU=\"", + "etag": "\"49cR5xdzeKP79yoAbqwZeaM/lLo=\"", + "human": "Quickstart - Create a minimal MCP client using .NET - .NET | Microsoft Learn | ETag \"49cR5xdzeKP79yoAbqwZeaM/lLo=\"", "kind": "http_document", "last_modified": "Fri, 13 Mar 2026 17:15:23 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/quickstarts/build-mcp-client", "title": "Quickstart - Create a minimal MCP client using .NET - .NET | Microsoft Learn", - "value": "\"q4SAtmseBQRfgyLZY3QiQtIXbGU=\"" + "value": "\"49cR5xdzeKP79yoAbqwZeaM/lLo=\"" }, "dotnet-ai-docs-quickstarts-build-mcp-server": { - "etag": "\"dA98D7CEk+brM3v6yOYt2Uyzvog=\"", - "human": "Quickstart - Create a minimal MCP server and publish to NuGet - .NET | Microsoft Learn | ETag \"dA98D7CEk+brM3v6yOYt2Uyzvog=\"", + "etag": "\"t/Losp56JnMFsy+ZssIi4luXRBE=\"", + "human": "Quickstart - Create a minimal MCP server and publish to NuGet - .NET | Microsoft Learn | ETag \"t/Losp56JnMFsy+ZssIi4luXRBE=\"", "kind": "http_document", "last_modified": "Fri, 06 Mar 2026 22:03:39 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/quickstarts/build-mcp-server", "title": "Quickstart - Create a minimal MCP server and publish to NuGet - .NET | Microsoft Learn", - "value": "\"dA98D7CEk+brM3v6yOYt2Uyzvog=\"" + "value": "\"t/Losp56JnMFsy+ZssIi4luXRBE=\"" }, "dotnet-ai-docs-quickstarts-build-vector-search-app": { - "etag": "\"HQkmOQS3VWVSf0AmYv/fhQNvvRE=\"", - "human": "Quickstart - Build a minimal .NET AI RAG app - .NET | Microsoft Learn | ETag \"HQkmOQS3VWVSf0AmYv/fhQNvvRE=\"", + "etag": "\"GtUd2/emsPlS2jwdxrxLl0KS1j8=\"", + "human": "Quickstart - Build a minimal .NET AI RAG app - .NET | Microsoft Learn | ETag \"GtUd2/emsPlS2jwdxrxLl0KS1j8=\"", "kind": "http_document", - "last_modified": "Wed, 11 Mar 2026 00:29:58 GMT", + "last_modified": "Thu, 26 Mar 2026 18:29:18 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/quickstarts/build-vector-search-app", "title": "Quickstart - Build a minimal .NET AI RAG app - .NET | Microsoft Learn", - "value": "\"HQkmOQS3VWVSf0AmYv/fhQNvvRE=\"" + "value": "\"GtUd2/emsPlS2jwdxrxLl0KS1j8=\"" }, "dotnet-ai-docs-quickstarts-chat-local-model": { - "etag": "\"AnBR4rP8nywPcmig95tGsur54YE=\"", - "human": "Quickstart - Connect to and chat with a local AI using .NET - .NET | Microsoft Learn | ETag \"AnBR4rP8nywPcmig95tGsur54YE=\"", + "etag": "\"cef0XRWMTmSn+RvRJTuO30zjasg=\"", + "human": "Quickstart - Connect to and chat with a local AI using .NET - .NET | Microsoft Learn | ETag \"cef0XRWMTmSn+RvRJTuO30zjasg=\"", "kind": "http_document", "last_modified": "Fri, 06 Mar 2026 22:03:39 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/quickstarts/chat-local-model", "title": "Quickstart - Connect to and chat with a local AI using .NET - .NET | Microsoft Learn", - "value": "\"AnBR4rP8nywPcmig95tGsur54YE=\"" + "value": "\"cef0XRWMTmSn+RvRJTuO30zjasg=\"" }, "dotnet-ai-docs-quickstarts-create-assistant": { - "etag": "\"iyJJRUaVfGwGHz9QjNRQ33iFpI8=\"", - "human": "Quickstart - Create a minimal AI assistant using .NET - .NET | Microsoft Learn | ETag \"iyJJRUaVfGwGHz9QjNRQ33iFpI8=\"", + "etag": "\"zShpSVtXVP21hQ2O2mPeWa3Kcig=\"", + "human": "Quickstart - Create a minimal AI assistant using .NET - .NET | Microsoft Learn | ETag \"zShpSVtXVP21hQ2O2mPeWa3Kcig=\"", "kind": "http_document", "last_modified": "Fri, 06 Mar 2026 22:03:38 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/quickstarts/create-assistant", "title": "Quickstart - Create a minimal AI assistant using .NET - .NET | Microsoft Learn", - "value": "\"iyJJRUaVfGwGHz9QjNRQ33iFpI8=\"" + "value": "\"zShpSVtXVP21hQ2O2mPeWa3Kcig=\"" }, "dotnet-ai-docs-quickstarts-generate-images": { - "etag": "\"EZYjwc1Pm1z6xE9ng56aO6ci4yE=\"", - "human": "Quickstart - Generate images using OpenAI.Images.ImageClient - .NET | Microsoft Learn | ETag \"EZYjwc1Pm1z6xE9ng56aO6ci4yE=\"", + "etag": "\"9DpVALzIu8nMQIlWOoAgYK/at0o=\"", + "human": "Quickstart - Generate images using OpenAI.Images.ImageClient - .NET | Microsoft Learn | ETag \"9DpVALzIu8nMQIlWOoAgYK/at0o=\"", "kind": "http_document", "last_modified": "Wed, 11 Mar 2026 00:29:58 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/quickstarts/generate-images", "title": "Quickstart - Generate images using OpenAI.Images.ImageClient - .NET | Microsoft Learn", - "value": "\"EZYjwc1Pm1z6xE9ng56aO6ci4yE=\"" + "value": "\"9DpVALzIu8nMQIlWOoAgYK/at0o=\"" }, "dotnet-ai-docs-quickstarts-process-data": { - "etag": "\"J9nhHpKds2BuPMRjszIpZOBP98w=\"", - "human": "Quickstart - Process custom data for AI - .NET | Microsoft Learn | ETag \"J9nhHpKds2BuPMRjszIpZOBP98w=\"", + "etag": "\"/9w2fR8dQTTMT42Ihevd4bW9Qb4=\"", + "human": "Quickstart - Process custom data for AI - .NET | Microsoft Learn | ETag \"/9w2fR8dQTTMT42Ihevd4bW9Qb4=\"", "kind": "http_document", - "last_modified": "Wed, 11 Mar 2026 00:29:58 GMT", + "last_modified": "Thu, 26 Mar 2026 18:29:18 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/quickstarts/process-data", "title": "Quickstart - Process custom data for AI - .NET | Microsoft Learn", - "value": "\"J9nhHpKds2BuPMRjszIpZOBP98w=\"" + "value": "\"/9w2fR8dQTTMT42Ihevd4bW9Qb4=\"" }, "dotnet-ai-docs-quickstarts-prompt-model": { - "etag": "\"7/2BvwoTN6fj5rdGmPrzQEwXVR0=\"", - "human": "Quickstart - Connect to and prompt an AI model with .NET - .NET | Microsoft Learn | ETag \"7/2BvwoTN6fj5rdGmPrzQEwXVR0=\"", + "etag": "\"fUUn/gplMbDawEWZo1FkIKiDtjM=\"", + "human": "Quickstart - Connect to and prompt an AI model with .NET - .NET | Microsoft Learn | ETag \"fUUn/gplMbDawEWZo1FkIKiDtjM=\"", "kind": "http_document", "last_modified": "Wed, 11 Mar 2026 00:29:58 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/quickstarts/prompt-model", "title": "Quickstart - Connect to and prompt an AI model with .NET - .NET | Microsoft Learn", - "value": "\"7/2BvwoTN6fj5rdGmPrzQEwXVR0=\"" + "value": "\"fUUn/gplMbDawEWZo1FkIKiDtjM=\"" }, "dotnet-ai-docs-quickstarts-publish-mcp-registry": { - "etag": "\"ek+ptrvBe2Eqv6tteIcIcdvGAME=\"", - "human": "Quickstart - Publish a .NET MCP server to the MCP Registry - .NET | Microsoft Learn | ETag \"ek+ptrvBe2Eqv6tteIcIcdvGAME=\"", + "etag": "\"0184r+sfKT0Uda8Bz8ucQvzBGlE=\"", + "human": "Quickstart - Publish a .NET MCP server to the MCP Registry - .NET | Microsoft Learn | ETag \"0184r+sfKT0Uda8Bz8ucQvzBGlE=\"", "kind": "http_document", "last_modified": "Fri, 06 Mar 2026 22:03:39 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/quickstarts/publish-mcp-registry", "title": "Quickstart - Publish a .NET MCP server to the MCP Registry - .NET | Microsoft Learn", - "value": "\"ek+ptrvBe2Eqv6tteIcIcdvGAME=\"" + "value": "\"0184r+sfKT0Uda8Bz8ucQvzBGlE=\"" }, "dotnet-ai-docs-quickstarts-structured-output": { - "etag": "\"sGmgp7mbptnEvlXqt8m+6D02fv0=\"", - "human": "Quickstart - Request a response with structured output - .NET | Microsoft Learn | ETag \"sGmgp7mbptnEvlXqt8m+6D02fv0=\"", + "etag": "\"ejU0s6IcTM0PaBq0wgOCEQpQscc=\"", + "human": "Quickstart - Request a response with structured output - .NET | Microsoft Learn | ETag \"ejU0s6IcTM0PaBq0wgOCEQpQscc=\"", "kind": "http_document", "last_modified": "Fri, 13 Mar 2026 17:50:04 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/quickstarts/structured-output", "title": "Quickstart - Request a response with structured output - .NET | Microsoft Learn", - "value": "\"sGmgp7mbptnEvlXqt8m+6D02fv0=\"" + "value": "\"ejU0s6IcTM0PaBq0wgOCEQpQscc=\"" }, "dotnet-ai-docs-quickstarts-text-to-image": { - "etag": "\"LyiFu7lxKQebTKyIL1oA2ZyGX1E=\"", - "human": "Quickstart - Generate images from text using AI - .NET | Microsoft Learn | ETag \"LyiFu7lxKQebTKyIL1oA2ZyGX1E=\"", + "etag": "\"kCCHc4k/8ogxJOIDpKtxqCfl690=\"", + "human": "Quickstart - Generate images from text using AI - .NET | Microsoft Learn | ETag \"kCCHc4k/8ogxJOIDpKtxqCfl690=\"", "kind": "http_document", "last_modified": "Fri, 13 Mar 2026 17:50:04 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/quickstarts/text-to-image", "title": "Quickstart - Generate images from text using AI - .NET | Microsoft Learn", - "value": "\"LyiFu7lxKQebTKyIL1oA2ZyGX1E=\"" + "value": "\"kCCHc4k/8ogxJOIDpKtxqCfl690=\"" }, "dotnet-ai-docs-quickstarts-use-function-calling": { - "etag": "\"1xuyKwPjwC5AT6fPVmDuthgq4kk=\"", - "human": "Quickstart - Extend OpenAI using functions and execute a local function with .NET - .NET | Microsoft Learn | ETag \"1xuyKwPjwC5AT6fPVmDuthgq4kk=\"", + "etag": "\"GvH7FhZ7rtGX88sxC3tnri/Lv8g=\"", + "human": "Quickstart - Extend OpenAI using functions and execute a local function with .NET - .NET | Microsoft Learn | ETag \"GvH7FhZ7rtGX88sxC3tnri/Lv8g=\"", "kind": "http_document", "last_modified": "Wed, 11 Mar 2026 19:08:52 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/quickstarts/use-function-calling", "title": "Quickstart - Extend OpenAI using functions and execute a local function with .NET - .NET | Microsoft Learn", - "value": "\"1xuyKwPjwC5AT6fPVmDuthgq4kk=\"" + "value": "\"GvH7FhZ7rtGX88sxC3tnri/Lv8g=\"" }, "dotnet-ai-docs-resources-azure-ai": { - "etag": "\"3PX6y0rutITrxpClh4veLb3pQ6o=\"", - "human": "Azure AI learning resources - .NET | Microsoft Learn | ETag \"3PX6y0rutITrxpClh4veLb3pQ6o=\"", + "etag": "\"Tw5GRXNBc9/r94vKW0D2sLHUzdw=\"", + "human": "Azure AI learning resources - .NET | Microsoft Learn | ETag \"Tw5GRXNBc9/r94vKW0D2sLHUzdw=\"", "kind": "http_document", "last_modified": "Fri, 20 Mar 2026 17:29:45 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/resources/azure-ai", "title": "Azure AI learning resources - .NET | Microsoft Learn", - "value": "\"3PX6y0rutITrxpClh4veLb3pQ6o=\"" + "value": "\"Tw5GRXNBc9/r94vKW0D2sLHUzdw=\"" }, "dotnet-ai-docs-resources-get-started": { - "etag": "\"E60KdgU9yNCYQS+dqAipHx7Kkr8=\"", - "human": "Learning resources to get started with AI in .NET - .NET | Microsoft Learn | ETag \"E60KdgU9yNCYQS+dqAipHx7Kkr8=\"", + "etag": "\"nzFDc2tBroZkkW+tpOjAMFMrwQ8=\"", + "human": "Learning resources to get started with AI in .NET - .NET | Microsoft Learn | ETag \"nzFDc2tBroZkkW+tpOjAMFMrwQ8=\"", "kind": "http_document", "last_modified": "Wed, 17 Sep 2025 10:25:55 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/resources/get-started", "title": "Learning resources to get started with AI in .NET - .NET | Microsoft Learn", - "value": "\"E60KdgU9yNCYQS+dqAipHx7Kkr8=\"" + "value": "\"nzFDc2tBroZkkW+tpOjAMFMrwQ8=\"" }, "dotnet-ai-docs-resources-mcp-servers": { - "etag": "\"VVsXc+WN/M4Z8kmoEi3LQiiO8Q8=\"", - "human": "MCP server learning resources - .NET | Microsoft Learn | ETag \"VVsXc+WN/M4Z8kmoEi3LQiiO8Q8=\"", + "etag": "\"Qi8HaPqaNpMbxAn4Darsn6YMJj4=\"", + "human": "MCP server learning resources - .NET | Microsoft Learn | ETag \"Qi8HaPqaNpMbxAn4Darsn6YMJj4=\"", "kind": "http_document", "last_modified": "Wed, 25 Feb 2026 19:00:18 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/resources/mcp-servers", "title": "MCP server learning resources - .NET | Microsoft Learn", - "value": "\"VVsXc+WN/M4Z8kmoEi3LQiiO8Q8=\"" + "value": "\"Qi8HaPqaNpMbxAn4Darsn6YMJj4=\"" }, "dotnet-ai-docs-tutorials-tutorial-ai-vector-search": { - "etag": "\"SkUCKRC5m9GXiLIlaCYCtgI67RU=\"", - "human": "Tutorial - Integrate OpenAI with the RAG pattern and vector search using Azure Cosmos DB for MongoDB - .NET | Microsoft Learn | ETag \"SkUCKRC5m9GXiLIlaCYCtgI67RU=\"", + "etag": "\"lphI1nE+1QP+Qv9Ni/UoovfP2nU=\"", + "human": "Tutorial - Integrate OpenAI with the RAG pattern and vector search using Azure Cosmos DB for MongoDB - .NET | Microsoft Learn | ETag \"lphI1nE+1QP+Qv9Ni/UoovfP2nU=\"", "kind": "http_document", - "last_modified": "Fri, 13 Mar 2026 17:50:04 GMT", + "last_modified": "Thu, 26 Mar 2026 18:29:18 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/tutorials/tutorial-ai-vector-search", "title": "Tutorial - Integrate OpenAI with the RAG pattern and vector search using Azure Cosmos DB for MongoDB - .NET | Microsoft Learn", - "value": "\"SkUCKRC5m9GXiLIlaCYCtgI67RU=\"" + "value": "\"lphI1nE+1QP+Qv9Ni/UoovfP2nU=\"" }, "dotnet-core-apps-docs": { - "etag": "\"eFmOq9oGYEGfHSMrMs9m0tL8q5g=\"", - "human": "Build apps with .NET - .NET | Microsoft Learn | ETag \"eFmOq9oGYEGfHSMrMs9m0tL8q5g=\"", + "etag": "\"I57qEgFd1nje85zPGMWsM0tlNY8=\"", + "human": "Build apps with .NET - .NET | Microsoft Learn | ETag \"I57qEgFd1nje85zPGMWsM0tlNY8=\"", "kind": "http_document", "last_modified": "Wed, 04 Mar 2026 23:12:14 GMT", "source_url": "https://learn.microsoft.com/dotnet/core/apps", "title": "Build apps with .NET - .NET | Microsoft Learn", - "value": "\"eFmOq9oGYEGfHSMrMs9m0tL8q5g=\"" + "value": "\"I57qEgFd1nje85zPGMWsM0tlNY8=\"" }, "dotnet-maui-release": { - "human": "10.0.50 (2026-03-10T21:53:16Z)", + "human": "10.0.51 (2026-03-25T20:52:57Z)", "kind": "github_release", - "published_at": "2026-03-10T21:53:16Z", - "source_url": "https://github.com/dotnet/maui/releases/tag/10.0.50", - "value": "10.0.50" + "published_at": "2026-03-25T20:52:57Z", + "source_url": "https://github.com/dotnet/maui/releases/tag/10.0.51", + "value": "10.0.51" }, "dotnet-runtime-release": { "human": "v9.0.14 (2026-03-10T20:19:23Z)", @@ -1446,13 +1446,13 @@ "value": "v10.0.200" }, "ef-compare-docs": { - "etag": "\"2NnNUUjNs+Ng+GjRaN0IBd6Ots8=\"", - "human": "Compare EF6 and EF Core | Microsoft Learn | ETag \"2NnNUUjNs+Ng+GjRaN0IBd6Ots8=\"", + "etag": "\"0GflaBNkzzsLtIs72BR1hcNZORE=\"", + "human": "Compare EF6 and EF Core | Microsoft Learn | ETag \"0GflaBNkzzsLtIs72BR1hcNZORE=\"", "kind": "http_document", - "last_modified": "Fri, 20 Mar 2026 11:02:10 GMT", + "last_modified": "Fri, 27 Mar 2026 11:01:25 GMT", "source_url": "https://learn.microsoft.com/ef/efcore-and-ef6/", "title": "Compare EF6 and EF Core | Microsoft Learn", - "value": "\"2NnNUUjNs+Ng+GjRaN0IBd6Ots8=\"" + "value": "\"0GflaBNkzzsLtIs72BR1hcNZORE=\"" }, "efcore-release": { "human": "v9.0.14 (2026-03-10T20:19:18Z)", @@ -1469,31 +1469,31 @@ "value": "v10.1.0" }, "extensions-ai-api-reference": { - "etag": "\"hQnS2ZrV3L9WPmOadS51MmC72uw=\"", - "human": "Microsoft.Extensions.AI Namespace | Microsoft Learn | ETag \"hQnS2ZrV3L9WPmOadS51MmC72uw=\"", + "etag": "\"60X+jqvwl5e9IaXvNfjOyWSMmyk=\"", + "human": "Microsoft.Extensions.AI Namespace | Microsoft Learn | ETag \"60X+jqvwl5e9IaXvNfjOyWSMmyk=\"", "kind": "http_document", "last_modified": "Fri, 13 Mar 2026 16:00:41 GMT", "source_url": "https://learn.microsoft.com/dotnet/api/microsoft.extensions.ai", "title": "Microsoft.Extensions.AI Namespace | Microsoft Learn", - "value": "\"hQnS2ZrV3L9WPmOadS51MmC72uw=\"" + "value": "\"60X+jqvwl5e9IaXvNfjOyWSMmyk=\"" }, "extensions-ai-docs": { - "etag": "\"1i9C3INBXaHhsxTwmkH73/EcoFk=\"", - "human": "Microsoft.Extensions.AI libraries - .NET | Microsoft Learn | ETag \"1i9C3INBXaHhsxTwmkH73/EcoFk=\"", + "etag": "\"jSzJNRKabV3N5CLE+8+sDtzH9Go=\"", + "human": "Microsoft.Extensions.AI libraries - .NET | Microsoft Learn | ETag \"jSzJNRKabV3N5CLE+8+sDtzH9Go=\"", "kind": "http_document", "last_modified": "Mon, 23 Feb 2026 19:56:05 GMT", "source_url": "https://learn.microsoft.com/dotnet/ai/microsoft-extensions-ai", "title": "Microsoft.Extensions.AI libraries - .NET | Microsoft Learn", - "value": "\"1i9C3INBXaHhsxTwmkH73/EcoFk=\"" + "value": "\"jSzJNRKabV3N5CLE+8+sDtzH9Go=\"" }, "extensions-data-ingestion-api-reference": { - "etag": "\"bpYceuU1xeRxO6OIq0XSrFnzDnA=\"", - "human": "Microsoft.Extensions.DataIngestion Namespace | Microsoft Learn | ETag \"bpYceuU1xeRxO6OIq0XSrFnzDnA=\"", + "etag": "\"ANl79ELOoIq6KXEy402XviurhhM=\"", + "human": "Microsoft.Extensions.DataIngestion Namespace | Microsoft Learn | ETag \"ANl79ELOoIq6KXEy402XviurhhM=\"", "kind": "http_document", "last_modified": "Wed, 11 Feb 2026 22:37:12 GMT", "source_url": "https://learn.microsoft.com/dotnet/api/microsoft.extensions.dataingestion", "title": "Microsoft.Extensions.DataIngestion Namespace | Microsoft Learn", - "value": "\"bpYceuU1xeRxO6OIq0XSrFnzDnA=\"" + "value": "\"ANl79ELOoIq6KXEy402XviurhhM=\"" }, "extensions-release": { "human": "v10.4.1 (2026-03-18T21:03:33Z)", @@ -1503,13 +1503,13 @@ "value": "v10.4.1" }, "extensions-vector-data-api-reference": { - "etag": "\"cqcVZ+kHMU1OD8ZWMz3xHMwYVXI=\"", - "human": "Microsoft.Extensions.VectorData Namespace | Microsoft Learn | ETag \"cqcVZ+kHMU1OD8ZWMz3xHMwYVXI=\"", + "etag": "\"Z0lgM5CSYshAjZak1t3W+8KQoMg=\"", + "human": "Microsoft.Extensions.VectorData Namespace | Microsoft Learn | ETag \"Z0lgM5CSYshAjZak1t3W+8KQoMg=\"", "kind": "http_document", "last_modified": "Wed, 11 Feb 2026 22:32:21 GMT", "source_url": "https://learn.microsoft.com/dotnet/api/microsoft.extensions.vectordata", "title": "Microsoft.Extensions.VectorData Namespace | Microsoft Learn", - "value": "\"cqcVZ+kHMU1OD8ZWMz3xHMwYVXI=\"" + "value": "\"Z0lgM5CSYshAjZak1t3W+8KQoMg=\"" }, "htmlhint-release": { "human": "v1.9.2 (2026-03-05T09:18:23Z)", @@ -1568,13 +1568,13 @@ "value": "v10.0.3" }, "maui-overview-docs": { - "etag": "\"2VgoU4A+YkULXCx7z6ZRCczrhFI=\"", - "human": "What is .NET MAUI? - .NET MAUI | Microsoft Learn | ETag \"2VgoU4A+YkULXCx7z6ZRCczrhFI=\"", + "etag": "\"Zp/JMhZcVJA8c21zoKjcmul0N9o=\"", + "human": "What is .NET MAUI? - .NET MAUI | Microsoft Learn | ETag \"Zp/JMhZcVJA8c21zoKjcmul0N9o=\"", "kind": "http_document", "last_modified": "Tue, 06 Jan 2026 08:14:09 GMT", "source_url": "https://learn.microsoft.com/dotnet/maui/what-is-maui?view=net-maui-10.0", "title": "What is .NET MAUI? - .NET MAUI | Microsoft Learn", - "value": "\"2VgoU4A+YkULXCx7z6ZRCczrhFI=\"" + "value": "\"Zp/JMhZcVJA8c21zoKjcmul0N9o=\"" }, "mcaf-managed-code-com-root-docs": { "etag": "\"69b7d818-94f0\"", @@ -1586,20 +1586,20 @@ "value": "\"69b7d818-94f0\"" }, "mcp-csharp-sdk-docs": { - "etag": "\"69ab51ce-16ca\"", - "human": "Overview | MCP C# SDK | ETag \"69ab51ce-16ca\"", + "etag": "\"69c71834-16ca\"", + "human": "Overview | MCP C# SDK | ETag \"69c71834-16ca\"", "kind": "http_document", - "last_modified": "Fri, 06 Mar 2026 22:14:38 GMT", + "last_modified": "Fri, 27 Mar 2026 23:52:20 GMT", "source_url": "https://csharp.sdk.modelcontextprotocol.io/", "title": "Overview | MCP C# SDK", - "value": "\"69ab51ce-16ca\"" + "value": "\"69c71834-16ca\"" }, "mcp-csharp-sdk-release": { - "human": "v1.1.0 (2026-03-06T22:12:29Z)", + "human": "v1.2.0 (2026-03-27T23:50:12Z)", "kind": "github_release", - "published_at": "2026-03-06T22:12:29Z", - "source_url": "https://github.com/modelcontextprotocol/csharp-sdk/releases/tag/v1.1.0", - "value": "v1.1.0" + "published_at": "2026-03-27T23:50:12Z", + "source_url": "https://github.com/modelcontextprotocol/csharp-sdk/releases/tag/v1.2.0", + "value": "v1.2.0" }, "metalint-release": { "human": "v0.21.2 (2026-01-01T15:21:34Z)", @@ -1616,13 +1616,13 @@ "value": "v5.0.0" }, "orleans-docs": { - "etag": "\"jl4mMIGU2mEL5kZ93Fkc714wajU=\"", - "human": "Microsoft Orleans documentation - .NET | Microsoft Learn | ETag \"jl4mMIGU2mEL5kZ93Fkc714wajU=\"", + "etag": "\"UISw2gup3E2WNNc/rjHFHNQ1TDs=\"", + "human": "Microsoft Orleans documentation - .NET | Microsoft Learn | ETag \"UISw2gup3E2WNNc/rjHFHNQ1TDs=\"", "kind": "http_document", "last_modified": "Fri, 23 Jan 2026 02:05:22 GMT", "source_url": "https://learn.microsoft.com/dotnet/orleans/", "title": "Microsoft Orleans documentation - .NET | Microsoft Learn", - "value": "\"jl4mMIGU2mEL5kZ93Fkc714wajU=\"" + "value": "\"UISw2gup3E2WNNc/rjHFHNQ1TDs=\"" }, "orleans-release": { "human": "v10.0.1 (2026-02-07T00:45:00Z)", @@ -1639,18 +1639,18 @@ "value": "dotnet-1.74.0" }, "sonarjs-release": { - "human": "12.1.0.39434 (2026-03-16T14:45:26Z)", + "human": "12.2.0.39785 (2026-03-26T08:53:38Z)", "kind": "github_release", - "published_at": "2026-03-16T14:45:26Z", - "source_url": "https://github.com/SonarSource/SonarJS/releases/tag/12.1.0.39434", - "value": "12.1.0.39434" + "published_at": "2026-03-26T08:53:38Z", + "source_url": "https://github.com/SonarSource/SonarJS/releases/tag/12.2.0.39785", + "value": "12.2.0.39785" }, "stylelint-release": { - "human": "17.5.0 (2026-03-19T16:32:30Z)", + "human": "17.6.0 (2026-03-26T09:39:45Z)", "kind": "github_release", - "published_at": "2026-03-19T16:32:30Z", - "source_url": "https://github.com/stylelint/stylelint/releases/tag/17.5.0", - "value": "17.5.0" + "published_at": "2026-03-26T09:39:45Z", + "source_url": "https://github.com/stylelint/stylelint/releases/tag/17.6.0", + "value": "17.6.0" }, "webhint-release": { "human": "hint-v4.5.0 (2019-03-07T22:20:20Z)", @@ -1667,22 +1667,22 @@ "value": "v1.8.6" }, "winforms-overview-docs": { - "etag": "\"02QgEdagY99hKy7oo0GaA3WW9TA=\"", - "human": "What is Windows Forms - Windows Forms | Microsoft Learn | ETag \"02QgEdagY99hKy7oo0GaA3WW9TA=\"", + "etag": "\"2C/YLa0YDurWrG4ViWOvO2QFabU=\"", + "human": "What is Windows Forms - Windows Forms | Microsoft Learn | ETag \"2C/YLa0YDurWrG4ViWOvO2QFabU=\"", "kind": "http_document", "last_modified": "Wed, 27 Aug 2025 09:10:11 GMT", "source_url": "https://learn.microsoft.com/dotnet/desktop/winforms/overview/", "title": "What is Windows Forms - Windows Forms | Microsoft Learn", - "value": "\"02QgEdagY99hKy7oo0GaA3WW9TA=\"" + "value": "\"2C/YLa0YDurWrG4ViWOvO2QFabU=\"" }, "wpf-overview-docs": { - "etag": "\"VgmjFjKXH1J0wGwu8kad9Q9YZJc=\"", - "human": "What is Windows Presentation Foundation - WPF | Microsoft Learn | ETag \"VgmjFjKXH1J0wGwu8kad9Q9YZJc=\"", + "etag": "\"s9VDfiHZ5RToqkuDwqfjDW8KxCU=\"", + "human": "What is Windows Presentation Foundation - WPF | Microsoft Learn | ETag \"s9VDfiHZ5RToqkuDwqfjDW8KxCU=\"", "kind": "http_document", "last_modified": "Wed, 27 Aug 2025 09:10:10 GMT", "source_url": "https://learn.microsoft.com/dotnet/desktop/wpf/overview/", "title": "What is Windows Presentation Foundation - WPF | Microsoft Learn", - "value": "\"VgmjFjKXH1J0wGwu8kad9Q9YZJc=\"" + "value": "\"s9VDfiHZ5RToqkuDwqfjDW8KxCU=\"" } } } diff --git a/.github/upstream-watch.ai.json b/.github/upstream-watch.ai.json index 92e7611..e259c13 100644 --- a/.github/upstream-watch.ai.json +++ b/.github/upstream-watch.ai.json @@ -665,7 +665,7 @@ }, { "id": "agent-framework-docs-tutorials-workflows-workflow-builder-with-factories", - "source": "https://raw.githubusercontent.com/MicrosoftDocs/semantic-kernel-docs/main/agent-framework/tutorials/workflows/workflow-builder-with-factories.md", + "source": "https://learn.microsoft.com/agent-framework/workflows/workflows", "skills": [ "dotnet-microsoft-agent-framework" ] @@ -1078,7 +1078,7 @@ }, { "id": "agent-framework-docs-user-guide-workflows-shared-states", - "source": "https://raw.githubusercontent.com/MicrosoftDocs/semantic-kernel-docs/main/agent-framework/user-guide/workflows/shared-states.md", + "source": "https://learn.microsoft.com/agent-framework/workflows/state", "skills": [ "dotnet-microsoft-agent-framework" ] diff --git a/AGENTS.md b/AGENTS.md index 100fe73..2cba33d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -462,6 +462,9 @@ When adding a documentation watch: - Watch stable, meaningful overview pages, not random transient pages. - Prefer official Microsoft Learn URLs that define platform or framework guidance. +- Keep issue fan-out reviewable. Upstream-watch automation must track one open maintenance issue per library or skill group, not one permanently open issue per individual documentation page when those pages roll up to the same library refresh. +- When another upstream change arrives for a library or skill group that already has an open upstream-watch issue, update that existing issue and append the new watch detail instead of creating another open issue. +- Upstream-watch issue discovery must paginate across the full matching issue set before deciding whether an issue already exists. Do not assume the first page of GitHub issues is sufficient for deduplication or repair. ## State File Rules diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 66118c5..bf8794c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -402,6 +402,7 @@ For normal config entries, every watch entry must define: The watcher derives `kind`, `id`, `name`, source coordinates, and default `notes`. You can still override those fields explicitly, but do it only when the default output would be unclear. +Issues are deduplicated at the library or skill-group level, so related documentation pages should normally roll up into one open upstream issue instead of one issue per page. For project-specific libraries, the `skills` list must point to the dedicated project skill. Do not use umbrella skills such as `dotnet`, `dotnet-architecture`, or `dotnet-orleans` as placeholders for a concrete library watch. diff --git a/README.md b/README.md index 24ddaa3..4bf4b48 100644 --- a/README.md +++ b/README.md @@ -336,6 +336,7 @@ Those files are the human-maintained source of truth for: - GitHub release streams that should trigger skill review - documentation pages that should trigger skill review - which `dotnet-*` skills are affected by each upstream change +- how multiple page-level watches roll up into one open upstream issue per library or skill group Each named shard file has exactly two lists: @@ -350,7 +351,7 @@ flowchart LR B --> C["Run dry-run and sync-state-only once"] C --> D["Scheduled upstream-watch.yml runs upstream_watch.py daily"] D --> E["GitHub release or documentation change is detected"] - E --> F["Automation opens or updates an upstream issue"] + E --> F["Automation opens or updates one grouped upstream issue per library or skill set"] F --> G["A human or agent updates skills/ and docs"] G --> H["Changes merge to main"] H --> I["04:00 UTC release pipeline publishes catalog, site, and tool"] diff --git a/scripts/upstream_watch.py b/scripts/upstream_watch.py index 3379b1a..9f52e44 100644 --- a/scripts/upstream_watch.py +++ b/scripts/upstream_watch.py @@ -2,6 +2,7 @@ from __future__ import annotations import argparse +import base64 import glob import hashlib import html @@ -18,6 +19,9 @@ USER_AGENT = "dotnet-skills-upstream-watch" MARKER_RE = re.compile(r"") +VALUE_MARKER_RE = re.compile(r"") +ISSUE_KEY_MARKER_RE = re.compile(r"") +PAYLOAD_MARKER_RE = re.compile(r"") def load_json(path: Path, default: Any) -> Any: @@ -206,11 +210,38 @@ def validate_skills(watch: dict[str, Any]) -> None: raise ValueError(f"Watch {watch.get('id', '')} must define a non-empty skills list") +def default_issue_key(skills: list[str]) -> str: + return "+".join(sorted({slugify(skill) for skill in skills})) + + +def default_issue_name(skills: list[str]) -> str: + ordered = sorted(dict.fromkeys(skills)) + if not ordered: + return "upstream-watch" + if len(ordered) == 1: + return ordered[0] + return " + ".join(ordered) + + +def validate_issue_group_fields(normalized: dict[str, Any], raw_watch: dict[str, Any]) -> None: + issue_key = raw_watch.get("issue_key") or default_issue_key(normalized["skills"]) + issue_name = raw_watch.get("issue_name") or default_issue_name(normalized["skills"]) + + if not isinstance(issue_key, str) or not issue_key.strip(): + raise ValueError(f"Watch {normalized.get('id', '')} must define a non-empty issue_key") + if not isinstance(issue_name, str) or not issue_name.strip(): + raise ValueError(f"Watch {normalized.get('id', '')} must define a non-empty issue_name") + + normalized["issue_key"] = issue_key.strip() + normalized["issue_name"] = issue_name.strip() + + def normalize_human_watch(watch: dict[str, Any], kind: str) -> dict[str, Any]: if not isinstance(watch, dict): raise ValueError(f"{kind} entries must be JSON objects") normalized = normalize_github_release_watch(watch) if kind == "github_release" else normalize_http_document_watch(watch) validate_skills(normalized) + validate_issue_group_fields(normalized, watch) return normalized @@ -440,43 +471,174 @@ def fetch_snapshot(watch: dict[str, Any], token: str | None) -> dict[str, Any]: raise RuntimeError(f"Unsupported watch kind: {kind}") -def issue_title(watch: dict[str, Any], snapshot: dict[str, Any]) -> str: +def watch_source_url(watch: dict[str, Any]) -> str: if watch["kind"] == "github_release": - return f"Upstream update: {watch['name']} -> {snapshot['value']}" - return f"Upstream update: {watch['name']} documentation changed" + return f"https://github.com/{watch['owner']}/{watch['repo']}/releases" + return watch["url"] -def issue_body(watch: dict[str, Any], old_snapshot: dict[str, Any] | None, new_snapshot: dict[str, Any]) -> str: - lines = [ - f"Automation detected an upstream change for **{watch['name']}**.", - "", - f"- Watch id: `{watch['id']}`", - f"- Kind: `{watch['kind']}`", - f"- Source: {new_snapshot['source_url']}", - f"- Current value: `{new_snapshot['value']}`", - ] +def minimal_snapshot(snapshot: dict[str, Any]) -> dict[str, Any]: + return { + key: snapshot[key] + for key in ("kind", "value", "human", "source_url", "published_at", "title", "etag", "last_modified") + if snapshot.get(key) is not None + } - if old_snapshot: - lines.append(f"- Previous value: `{old_snapshot['value']}`") - if new_snapshot.get("published_at"): - lines.append(f"- Published at: `{new_snapshot['published_at']}`") +def encode_issue_payload(issue_key: str, skills: list[str], pending_watches: dict[str, dict[str, Any]]) -> str: + payload = { + "issue_key": issue_key, + "skills": sorted(dict.fromkeys(skills)), + "watches": pending_watches, + } + raw = json.dumps(payload, separators=(",", ":"), sort_keys=True).encode("utf-8") + return base64.urlsafe_b64encode(raw).decode("ascii") - lines.extend( - [ - "", - "Observed detail:", - f"- {new_snapshot['human']}", - ] - ) - if watch.get("notes"): - lines.extend(["", "Why this matters:", f"- {watch['notes']}"]) +def decode_issue_payload(body: str) -> dict[str, Any] | None: + match = PAYLOAD_MARKER_RE.search(body) + if not match: + return None + + try: + decoded = base64.urlsafe_b64decode(match.group("payload").encode("ascii")) + payload = json.loads(decoded.decode("utf-8")) + except Exception: # noqa: BLE001 + return None + + if not isinstance(payload, dict): + return None + return payload - if watch.get("skills"): - lines.extend(["", "Likely skills to review:"]) - lines.extend(f"- `{skill}`" for skill in watch["skills"]) +def collect_group_skills( + pending_watches: dict[str, dict[str, Any]], + watch_index: dict[str, dict[str, Any]], + *, + fallback_skills: list[str] | None = None, +) -> list[str]: + skills = list(fallback_skills or []) + seen = set(skills) + for watch_id in pending_watches: + watch = watch_index.get(watch_id) + if not watch: + continue + for skill in watch.get("skills", []): + if skill not in seen: + skills.append(skill) + seen.add(skill) + return sorted(skills) + + +def parse_legacy_issue( + *, + body: str, + watch_index: dict[str, dict[str, Any]], + state_watches: dict[str, dict[str, Any]], +) -> tuple[str, list[str], dict[str, dict[str, Any]]] | None: + match = MARKER_RE.search(body) + if not match: + return None + + watch_id = match.group("watch_id") + watch = watch_index.get(watch_id) + issue_key = watch["issue_key"] if watch else watch_id + skills = list(watch.get("skills", [])) if watch else [] + + snapshot = minimal_snapshot(state_watches.get(watch_id, {})) + if not snapshot: + snapshot = {"value": VALUE_MARKER_RE.search(body).group("value")} if VALUE_MARKER_RE.search(body) else {} + if watch: + snapshot.setdefault("kind", watch["kind"]) + snapshot.setdefault("source_url", watch_source_url(watch)) + + if watch: + snapshot.setdefault("kind", watch["kind"]) + snapshot.setdefault("source_url", watch_source_url(watch)) + + return issue_key, skills, {watch_id: snapshot} + + +def parse_open_issue( + issue: dict[str, Any], + *, + watch_index: dict[str, dict[str, Any]], + state_watches: dict[str, dict[str, Any]], +) -> tuple[str, list[str], dict[str, dict[str, Any]]] | None: + body = issue.get("body") or "" + issue_key_match = ISSUE_KEY_MARKER_RE.search(body) + payload = decode_issue_payload(body) + + if issue_key_match and payload and isinstance(payload.get("watches"), dict): + issue_key = issue_key_match.group("issue_key") + raw_skills = payload.get("skills", []) + skills = [skill for skill in raw_skills if isinstance(skill, str) and skill] + pending_watches = { + watch_id: minimal_snapshot(snapshot) + for watch_id, snapshot in payload["watches"].items() + if isinstance(watch_id, str) and isinstance(snapshot, dict) + } + return issue_key, skills, pending_watches + + return parse_legacy_issue(body=body, watch_index=watch_index, state_watches=state_watches) + + +def issue_title(issue_name: str) -> str: + return f"Upstream update: {issue_name}" + + +def issue_body( + *, + issue_key: str, + issue_name: str, + skills: list[str], + pending_watches: dict[str, dict[str, Any]], + watch_index: dict[str, dict[str, Any]], +) -> str: + lines = [ + f"Automation detected pending upstream changes for **{issue_name}**.", + "", + f"- Issue key: `{issue_key}`", + f"- Affected skills: {', '.join(f'`{skill}`' for skill in skills)}", + f"- Pending upstream watches: `{len(pending_watches)}`", + "", + "Pending upstream sources:", + ] + + sorted_pending = sorted( + pending_watches.items(), + key=lambda item: ((watch_index.get(item[0], {}).get("name") or item[0]).lower(), item[0]), + ) + for watch_id, snapshot in sorted_pending: + watch = watch_index.get(watch_id) + watch_name = watch["name"] if watch else watch_id + watch_kind = watch["kind"] if watch else snapshot.get("kind", "unknown") + lines.append(f"- `{watch_id}` | `{watch_kind}` | **{watch_name}**") + + source_url = snapshot.get("source_url") or (watch_source_url(watch) if watch else None) + if source_url: + lines.append(f" - Source: {source_url}") + + current_value = snapshot.get("value", "unknown") + lines.append(f" - Current value: `{current_value}`") + + if snapshot.get("published_at"): + lines.append(f" - Published at: `{snapshot['published_at']}`") + if snapshot.get("human"): + lines.append(f" - Detail: {snapshot['human']}") + + notes: list[str] = [] + for watch_id in pending_watches: + watch = watch_index.get(watch_id) + note = watch.get("notes") if watch else None + if note and note not in notes: + notes.append(note) + + if notes: + lines.extend(["", "Why this matters:"]) + lines.extend(f"- {note}" for note in notes) + + payload = encode_issue_payload(issue_key, skills, pending_watches) lines.extend( [ "", @@ -486,24 +648,44 @@ def issue_body(watch: dict[str, Any], old_snapshot: dict[str, Any] | None, new_s "- [ ] Update `README.md` if framework coverage or guidance changed", "- [ ] Close this issue after the catalog has been refreshed", "", - f"", - f"", + f"", + f"", ] ) return "\n".join(lines) -def refresh_comment(watch: dict[str, Any], old_snapshot: dict[str, Any], new_snapshot: dict[str, Any]) -> str: - return "\n".join( +def refresh_comment( + *, + issue_key: str, + watch: dict[str, Any], + existing_watch_snapshot: dict[str, Any] | None, + old_snapshot: dict[str, Any] | None, + new_snapshot: dict[str, Any], +) -> str: + previous_value = None + if existing_watch_snapshot: + previous_value = existing_watch_snapshot.get("value") + elif old_snapshot: + previous_value = old_snapshot.get("value") + + lines = [ + "Automation detected another upstream change for this skill group.", + "", + f"- Issue key: `{issue_key}`", + f"- Watch id: `{watch['id']}`", + f"- Watch: **{watch['name']}**", + f"- Change type: `{'updated-watch' if existing_watch_snapshot else 'new-watch'}`", + ] + if previous_value: + lines.append(f"- Previous value: `{previous_value}`") + lines.extend( [ - "Automation detected another upstream change for this watch.", - "", - f"- Watch id: `{watch['id']}`", - f"- Previous value: `{old_snapshot['value']}`", f"- Current value: `{new_snapshot['value']}`", f"- Source: {new_snapshot['source_url']}", ] ) + return "\n".join(lines) def ensure_labels(repo: str, token: str, labels: list[dict[str, str]], dry_run: bool) -> None: @@ -524,19 +706,158 @@ def ensure_labels(repo: str, token: str, labels: list[dict[str, str]], dry_run: ) -def find_open_issues(repo: str, token: str, watch_label: str) -> dict[str, dict[str, Any]]: - issues = gh_api( - f"/repos/{repo}/issues?state=open&labels={watch_label}&per_page=100", +def list_open_issues(repo: str, token: str, watch_label: str) -> list[dict[str, Any]]: + issues: list[dict[str, Any]] = [] + page = 1 + while True: + batch = gh_api( + f"/repos/{repo}/issues?state=open&labels={watch_label}&per_page=100&page={page}", + token=token, + ) + if not isinstance(batch, list): + raise RuntimeError(f"Unexpected issue payload while listing upstream-watch issues for {repo}") + if not batch: + break + issues.extend(issue for issue in batch if not issue.get("pull_request")) + page += 1 + return issues + + +def choose_canonical_issue(issues: list[dict[str, Any]]) -> dict[str, Any]: + return max( + issues, + key=lambda issue: ( + issue.get("updated_at") or "", + issue.get("created_at") or "", + issue.get("number") or 0, + ), + ) + + +def load_open_issue_groups( + *, + repo: str, + token: str, + watch_label: str, + watch_index: dict[str, dict[str, Any]], + state_watches: dict[str, dict[str, Any]], +) -> dict[str, dict[str, Any]]: + groups: dict[str, dict[str, Any]] = {} + for issue in list_open_issues(repo, token, watch_label): + parsed = parse_open_issue(issue, watch_index=watch_index, state_watches=state_watches) + if not parsed: + continue + + issue_key, skills, pending_watches = parsed + group = groups.setdefault( + issue_key, + { + "issues": [], + "pending_watches": {}, + "skills": [], + }, + ) + group["issues"].append(issue) + + for skill in skills: + if skill not in group["skills"]: + group["skills"].append(skill) + + for watch_id, snapshot in pending_watches.items(): + if watch_id in state_watches: + group["pending_watches"][watch_id] = minimal_snapshot(state_watches[watch_id]) + else: + group["pending_watches"][watch_id] = snapshot + + return groups + + +def close_duplicate_issue(repo: str, token: str, issue_number: int, canonical_number: int) -> None: + gh_api( + f"/repos/{repo}/issues/{issue_number}/comments", token=token, + method="POST", + data={ + "body": ( + f"Automation consolidated this legacy upstream-watch issue into #{canonical_number} " + "so the library or skill group keeps a single open maintenance thread." + ) + }, ) - indexed: dict[str, dict[str, Any]] = {} - for issue in issues: - if issue.get("pull_request"): + gh_api( + f"/repos/{repo}/issues/{issue_number}", + token=token, + method="PATCH", + data={"state": "closed"}, + ) + + +def reconcile_open_issues( + *, + repo: str, + token: str, + open_issue_groups: dict[str, dict[str, Any]], + watch_index: dict[str, dict[str, Any]], + dry_run: bool, +) -> tuple[dict[str, dict[str, Any]], dict[str, int]]: + normalized: dict[str, dict[str, Any]] = {} + stats = { + "groups": 0, + "issues_rewritten": 0, + "duplicates_closed": 0, + } + + for issue_key, group in open_issue_groups.items(): + canonical_issue = choose_canonical_issue(group["issues"]) + pending_watches = group["pending_watches"] + skills = collect_group_skills(pending_watches, watch_index, fallback_skills=group.get("skills")) + issue_name = default_issue_name(skills) if skills else issue_key + title = issue_title(issue_name) + body = issue_body( + issue_key=issue_key, + issue_name=issue_name, + skills=skills, + pending_watches=pending_watches, + watch_index=watch_index, + ) + + if dry_run: + if canonical_issue.get("title") != title or canonical_issue.get("body") != body: + stats["issues_rewritten"] += 1 + stats["duplicates_closed"] += max(0, len(group["issues"]) - 1) + normalized[issue_key] = { + "issue": canonical_issue, + "pending_watches": pending_watches, + "skills": skills, + "issue_name": issue_name, + } + stats["groups"] += 1 continue - match = MARKER_RE.search(issue.get("body") or "") - if match: - indexed[match.group("watch_id")] = issue - return indexed + + if canonical_issue.get("title") != title or canonical_issue.get("body") != body: + canonical_issue = gh_api( + f"/repos/{repo}/issues/{canonical_issue['number']}", + token=token, + method="PATCH", + data={"title": title, "body": body}, + ) + stats["issues_rewritten"] += 1 + + for issue in group["issues"]: + if issue["number"] == canonical_issue["number"]: + continue + close_duplicate_issue(repo, token, issue["number"], canonical_issue["number"]) + stats["duplicates_closed"] += 1 + + normalized[issue_key] = { + "issue": canonical_issue, + "pending_watches": pending_watches, + "skills": skills, + "issue_name": issue_name, + } + stats["groups"] += 1 + + return normalized, stats def upsert_issue( @@ -547,32 +868,59 @@ def upsert_issue( watch: dict[str, Any], old_snapshot: dict[str, Any] | None, new_snapshot: dict[str, Any], - open_issues: dict[str, dict[str, Any]], + watch_index: dict[str, dict[str, Any]], + open_issue_groups: dict[str, dict[str, Any]], dry_run: bool, ) -> str: - title = issue_title(watch, new_snapshot) - body = issue_body(watch, old_snapshot, new_snapshot) - existing = open_issues.get(watch["id"]) + issue_key = watch["issue_key"] + existing_group = open_issue_groups.get(issue_key) + pending_watches = dict(existing_group.get("pending_watches", {})) if existing_group else {} + existing_watch_snapshot = pending_watches.get(watch["id"]) + pending_watches[watch["id"]] = minimal_snapshot(new_snapshot) + skills = collect_group_skills(pending_watches, watch_index, fallback_skills=watch.get("skills")) + issue_name = default_issue_name(skills) if skills else watch.get("issue_name", issue_key) + title = issue_title(issue_name) + body = issue_body( + issue_key=issue_key, + issue_name=issue_name, + skills=skills, + pending_watches=pending_watches, + watch_index=watch_index, + ) if dry_run: - action = "update" if existing else "create" - print(f"[dry-run] Would {action} issue for {watch['id']}: {title}") + action = "update" if existing_group else "create" + print(f"[dry-run] Would {action} issue for {watch['id']} via {issue_key}: {title}") return action - if existing: + if existing_group: + existing_issue = existing_group["issue"] gh_api( - f"/repos/{repo}/issues/{existing['number']}/comments", + f"/repos/{repo}/issues/{existing_issue['number']}/comments", token=token, method="POST", - data={"body": refresh_comment(watch, old_snapshot or {"value": "unknown"}, new_snapshot)}, + data={ + "body": refresh_comment( + issue_key=issue_key, + watch=watch, + existing_watch_snapshot=existing_watch_snapshot, + old_snapshot=old_snapshot, + new_snapshot=new_snapshot, + ) + }, ) updated = gh_api( - f"/repos/{repo}/issues/{existing['number']}", + f"/repos/{repo}/issues/{existing_issue['number']}", token=token, method="PATCH", data={"title": title, "body": body}, ) - open_issues[watch["id"]] = updated + open_issue_groups[issue_key] = { + "issue": updated, + "pending_watches": pending_watches, + "skills": skills, + "issue_name": issue_name, + } return "update" created = gh_api( @@ -581,7 +929,12 @@ def upsert_issue( method="POST", data={"title": title, "body": body, "labels": labels}, ) - open_issues[watch["id"]] = created + open_issue_groups[issue_key] = { + "issue": created, + "pending_watches": pending_watches, + "skills": skills, + "issue_name": issue_name, + } return "create" @@ -625,6 +978,7 @@ def main() -> int: state = load_json(state_path, default={"watches": {}}) prior_watches = state.get("watches", {}) + watch_index = {watch["id"]: watch for watch in config.get("watches", [])} token = os.environ.get("GH_TOKEN") or os.environ.get("GITHUB_TOKEN") repo = os.environ.get("GITHUB_REPOSITORY") @@ -640,11 +994,33 @@ def main() -> int: f"- Sync state only: `{args.sync_state_only}`", ] - if (token and repo) and not args.dry_run: - ensure_labels(repo, token, config.get("labels", []), dry_run=False) - open_issues = find_open_issues(repo, token, watch_label) + reconciliation_stats = { + "groups": 0, + "issues_rewritten": 0, + "duplicates_closed": 0, + } + if token and repo: + if not args.dry_run and not args.sync_state_only: + ensure_labels(repo, token, config.get("labels", []), dry_run=False) + + open_issue_groups = load_open_issue_groups( + repo=repo, + token=token, + watch_label=watch_label, + watch_index=watch_index, + state_watches=prior_watches, + ) + + reconcile_dry_run = args.dry_run or args.sync_state_only + open_issue_groups, reconciliation_stats = reconcile_open_issues( + repo=repo, + token=token, + open_issue_groups=open_issue_groups, + watch_index=watch_index, + dry_run=reconcile_dry_run, + ) else: - open_issues = {} + open_issue_groups = {} next_state: dict[str, Any] = {"watches": {}} bootstrapped = 0 @@ -687,7 +1063,8 @@ def main() -> int: watch=watch, old_snapshot=previous, new_snapshot=snapshot, - open_issues=open_issues, + watch_index=watch_index, + open_issue_groups=open_issue_groups, dry_run=args.dry_run, ) if action == "create": @@ -711,6 +1088,9 @@ def main() -> int: f"- Changed watches: `{changed}`", f"- Issues created: `{created}`", f"- Issues updated: `{updated}`", + f"- Issue groups scanned: `{reconciliation_stats['groups']}`", + f"- Issue bodies normalized: `{reconciliation_stats['issues_rewritten']}`", + f"- Duplicate issues closed: `{reconciliation_stats['duplicates_closed']}`", f"- Errors: `{len(errors)}`", ] ) diff --git a/skills/dotnet-mcp/SKILL.md b/skills/dotnet-mcp/SKILL.md index 369d752..f99c3b9 100644 --- a/skills/dotnet-mcp/SKILL.md +++ b/skills/dotnet-mcp/SKILL.md @@ -1,6 +1,6 @@ --- name: dotnet-mcp -version: "1.1.0" +version: "1.1.1" category: "AI" description: "Build or consume Model Context Protocol (MCP) servers and clients in .NET using the official MCP C# SDK, including stdio, Streamable HTTP, tools, prompts, resources, and capability negotiation." compatibility: "Requires the official MCP C# SDK packages (`ModelContextProtocol.Core`, `ModelContextProtocol`, or `ModelContextProtocol.AspNetCore`) on .NET 8+; current guidance targets the v1.1.x SDK." @@ -14,6 +14,7 @@ compatibility: "Requires the official MCP C# SDK packages (`ModelContextProtocol - choosing between stdio and HTTP transport for MCP - exposing tools, resources, prompts, completions, or logging to an MCP host - connecting a .NET app to an existing MCP server and passing discovered tools into `IChatClient` +- bootstrapping a minimal MCP client/server from the `.NET AI` quickstarts or publishing a server to the MCP Registry - implementing capability-aware flows such as roots, sampling, elicitation, subscriptions, or session resumption ## Use This Skill Instead Of @@ -21,6 +22,7 @@ compatibility: "Requires the official MCP C# SDK packages (`ModelContextProtocol - Use `dotnet-mcp` when **protocol interoperability** is the requirement. - Use `dotnet-microsoft-extensions-ai` when you only need model/provider abstraction or local tool orchestration without the MCP wire protocol. - Use `dotnet-microsoft-agent-framework` when the main problem is agent orchestration; combine it with `dotnet-mcp` only when those agents must consume or expose MCP endpoints. +- Use the `.NET AI` quickstarts for the very first vertical slice, then come back here to harden transport, capability negotiation, publishing, and host interoperability. ## Documentation @@ -77,6 +79,7 @@ flowchart LR - Local child-process server: `ModelContextProtocol` + `WithStdioServerTransport()`. - Remote server: `ModelContextProtocol.AspNetCore` + `WithHttpTransport()` + `MapMcp()`. - Client-only app: start with `ModelContextProtocol` or `ModelContextProtocol.Core`. + - Registry distribution: pair a minimal server with the MCP Registry publishing flow only after the server contract is stable. 2. Model the MCP surface explicitly. - Tools: `[McpServerToolType]` + `[McpServerTool]` @@ -174,7 +177,11 @@ if (client.ServerCapabilities.Prompts is not null) - HTTP clients can use `AutoDetect` by default, or force `StreamableHttp` / `Sse`. - Session resumption is available for Streamable HTTP through `McpClient.ResumeSessionAsync(...)`. -8. Respect current error and serialization rules. +8. Treat the `.NET AI` MCP quickstarts as bootstrap examples. + - `build-mcp-client` and `build-mcp-server` are good starting points when the surrounding app is still MEAI-centric. + - `publish-mcp-registry` is the distribution step, not the design step. Stabilize the protocol surface before publishing. + +9. Respect current error and serialization rules. - Tool exceptions normally come back as `CallToolResult.IsError == true`. - Throw `McpProtocolException` only for protocol-level JSON-RPC failures. - `McpClientTool` inherits from `AIFunction`, so discovered tools can be passed directly into `IChatClient`. diff --git a/skills/dotnet-microsoft-agent-framework/SKILL.md b/skills/dotnet-microsoft-agent-framework/SKILL.md index f960321..21c7e80 100644 --- a/skills/dotnet-microsoft-agent-framework/SKILL.md +++ b/skills/dotnet-microsoft-agent-framework/SKILL.md @@ -1,6 +1,6 @@ --- name: dotnet-microsoft-agent-framework -version: "1.7.0" +version: "1.8.0" category: "AI" description: "Build .NET AI agents and multi-agent workflows with Microsoft Agent Framework using the right agent type, threads, tools, workflows, hosting protocols, and enterprise guardrails." compatibility: "Requires preview-era Microsoft Agent Framework packages and a .NET application that truly needs agentic or workflow orchestration." @@ -12,6 +12,7 @@ compatibility: "Requires preview-era Microsoft Agent Framework packages and a .N - building or reviewing `.NET` code that uses `Microsoft.Agents.*`, `Microsoft.Extensions.AI`, `AIAgent`, `AgentThread`, `AgentSession`, or Agent Framework hosting packages - choosing between `ChatClientAgent`, Responses agents, hosted agents, custom agents, Anthropic agents, workflows, or durable agents +- authoring preview-era `Microsoft.Agents.AI.Workflows.Declarative*` packages or wrapping a workflow with `workflow.AsAIAgent()` - adding tools, MCP, A2A, OpenAI-compatible hosting, AG-UI, DevUI, background responses, or OpenTelemetry - migrating from Semantic Kernel agent APIs or aligning AutoGen-style multi-agent patterns to Agent Framework - using Anthropic Claude models (haiku, sonnet, opus) via `AnthropicClient` or through Azure Foundry with `AnthropicFoundryClient` @@ -19,7 +20,7 @@ compatibility: "Requires preview-era Microsoft Agent Framework packages and a .N ## Workflow 1. Decide whether the problem should stay deterministic. If plain code or a typed workflow without LLM autonomy is enough, do that instead of adding an agent. -2. Choose the execution shape first: single `AIAgent`, explicit `Workflow`, Azure Functions durable agent, ASP.NET Core hosted agent, AG-UI remote UI, or DevUI local debugging. +2. Choose the execution shape first: single `AIAgent`, explicit programmatic `Workflow`, workflow-as-agent wrapper, declarative workflow when YAML portability is explicitly required, Azure Functions durable agent, ASP.NET Core hosted agent, AG-UI remote UI, or DevUI local debugging. 3. Choose the agent type and provider intentionally. Prefer the simplest agent that satisfies the threading, tooling, and hosting requirements. 4. Keep agents stateless and keep conversation or long-lived state in provider-owned session objects. Most persistence guidance still centers on `AgentThread`, while newer middleware and background-response examples may surface `AgentSession`. Treat both as opaque provider-specific state. 5. Add only the tools and middleware that the scenario needs. Narrow the tool surface, require approval for side effects, and treat MCP, A2A, and third-party services as trust boundaries. @@ -57,7 +58,9 @@ flowchart LR - Current Learn docs now treat Microsoft Foundry Agents as the canonical Azure-hosted persistent-agent page. The old Azure AI Foundry Agent and Foundry Models Chat/Responses URLs now collapse into that broader provider surface, so do not model them as separate top-level product families in design discussions. - Current Learn docs also position Azure OpenAI Responses as the richest Azure OpenAI client: it is the path that exposes tool approval, code interpreter, file search, web search, hosted MCP, and local MCP tools. - `Workflow` is an explicit graph of executors and edges. Use it when the control flow must stay inspectable, typed, resumable, or human-steerable. +- `workflow.AsAIAgent()` is the escape hatch when a complex workflow needs to present a normal agent surface. It keeps sessions, streaming, and agent response APIs, but the workflow start executor still needs chat-message-compatible input. - `AgentWorkflowBuilder` provides high-level factory methods such as `BuildConcurrent` for common agent orchestration patterns. Use it when you need concurrent or sequential agent pipelines without writing custom executor classes. +- Declarative workflows are now a documented surface, but the .NET package/runtime story is still preview-heavy and narrower than programmatic workflows. Use YAML when portability and operator-editable orchestration matter; keep deeply custom .NET control flow programmatic. - Hosting layers such as OpenAI-compatible HTTP, A2A, and AG-UI are adapters over your in-process agent or workflow. They do not replace the core architecture choice. - Durable agents are a hosting and persistence decision for Azure Functions. They are not the default answer for ordinary app-level orchestration. - Current Learn docs now consolidate middleware under `agents/middleware` and tools under `agents/tools/*`; older tutorial URLs can redirect to the same canonical page, so prefer the canonical path when exact signatures or headings matter. @@ -73,6 +76,7 @@ flowchart LR | Azure-hosted OpenAI-compatible models with the richest hosted-tool surface but app-owned composition | Azure OpenAI Responses agent | Best Azure OpenAI default when you need code interpreter, file search, web search, hosted MCP, or tool approval without moving to a persistent service-managed agent | | Anthropic Claude models (haiku, sonnet, opus) directly or via Azure Foundry | `AnthropicClient.AsAIAgent(...)` or `AnthropicFoundryClient.AsAIAgent(...)` | Use `Microsoft.Agents.AI.Anthropic`; add `Anthropic.Foundry` for Azure-hosted Claude | | Typed multi-step orchestration | `Workflow` or `AgentWorkflowBuilder` helpers | Control flow stays explicit and testable; use `BuildConcurrent` for agent fan-out/fan-in | +| YAML-defined orchestration that non-developers or operators need to edit | Declarative workflow packages | Good for portable trigger/action graphs; do not pretend the .NET preview is as flexible as programmatic workflows | | Week-long or failure-resilient Azure execution | Durable agent on Azure Functions | Durable Task gives replay and persisted state | | Agent-to-agent interoperability | A2A hosting or A2A proxy agent | This is protocol-level delegation, not local inference | | Browser or web UI protocol integration | AG-UI | Designed for remote UI sync and approval flows | diff --git a/skills/dotnet-microsoft-extensions-ai/SKILL.md b/skills/dotnet-microsoft-extensions-ai/SKILL.md index b3aef82..f52069b 100644 --- a/skills/dotnet-microsoft-extensions-ai/SKILL.md +++ b/skills/dotnet-microsoft-extensions-ai/SKILL.md @@ -1,6 +1,6 @@ --- name: dotnet-microsoft-extensions-ai -version: "1.2.2" +version: "1.3.0" category: "AI" description: "Build provider-agnostic .NET AI integrations with `Microsoft.Extensions.AI`, `IChatClient`, embeddings, middleware, structured output, vector search, and evaluation." compatibility: "Requires `Microsoft.Extensions.AI` or a .NET AI application that needs model, embedding, tool-calling, or evaluation composition without full agent orchestration." @@ -11,20 +11,22 @@ compatibility: "Requires `Microsoft.Extensions.AI` or a .NET AI application that ## Trigger On - building or reviewing `.NET` code that uses `Microsoft.Extensions.AI`, `Microsoft.Extensions.AI.Abstractions`, `IChatClient`, `IEmbeddingGenerator`, `ChatOptions`, or `AIFunction` +- adding `IImageGenerator`, local-model chat via Ollama, AI app templates, or the `.NET AI` quickstarts for assistants and MCP - choosing between low-level AI abstractions, provider SDKs, vector-search composition, evaluation libraries, and a fuller agent framework - adding streaming chat, structured output, embeddings, tool calling, telemetry, caching, or DI-based AI middleware - wiring `Microsoft.Extensions.VectorData`, `Microsoft.Extensions.DataIngestion`, MCP tooling, or evaluation packages around a provider-agnostic AI app ## Workflow -1. Classify the request first: plain model access, tool calling, embeddings/vector search, evaluation, or true agent orchestration. +1. Classify the request first: plain model access, tool calling, embeddings/vector search, evaluation, image generation, local-model prototyping, MCP bootstrap, or true agent orchestration. 2. Default to `Microsoft.Extensions.AI` for application and service code that needs provider-agnostic chat, embeddings, middleware, structured output, and testability. 3. Reference `Microsoft.Extensions.AI.Abstractions` directly only when authoring provider libraries or lower-level reusable integration packages. 4. Model `IChatClient` and `IEmbeddingGenerator` composition explicitly in DI. Keep options, caching, telemetry, logging, and tool invocation inspectable in the pipeline. 5. Treat chat state deliberately. For stateless providers, resend history. For stateful providers, propagate `ConversationId` rather than assuming all providers behave the same way. 6. Use `Microsoft.Extensions.VectorData` and `Microsoft.Extensions.DataIngestion` as adjacent building blocks for RAG instead of hand-rolling store abstractions prematurely. Model ingestion as an explicit reader -> processor -> chunker -> writer pipeline when the document-preparation path matters. -7. Escalate to `dotnet-microsoft-agent-framework` when the requirement becomes agent threads, multi-agent orchestration, higher-order workflows, durable execution, or remote agent hosting. -8. Validate with real providers, realistic prompts, and evaluation gates so the abstraction layer actually buys portability and reliability. +7. Treat the `.NET AI` quickstarts as bootstrap paths, not finished architecture. They now cover minimal assistants, MCP client/server flows, local models, app templates, and image generation. Start there for a vertical slice, then harden the DI, telemetry, and evaluation story here. +8. Escalate to `dotnet-microsoft-agent-framework` when the requirement becomes agent threads, multi-agent orchestration, higher-order workflows, durable execution, or remote agent hosting. +9. Validate with real providers, realistic prompts, and evaluation gates so the abstraction layer actually buys portability and reliability. ## Architecture @@ -45,15 +47,18 @@ flowchart LR - `Microsoft.Extensions.AI` adds the higher-level application surface: middleware builders, automatic function invocation, caching, logging, and OpenTelemetry integration. - Most apps and services should reference `Microsoft.Extensions.AI`; provider and connector libraries usually reference only the abstractions package. - `IChatClient` centers on `GetResponseAsync` and `GetStreamingResponseAsync`. The returned `ChatResponse` or `ChatResponseUpdate` objects carry messages, tool-related content, metadata, and optional conversation identifiers. +- Local-model quickstarts still route through the same `IChatClient` abstraction. Ollama-backed clients are useful for low-cost prototyping, offline dev loops, and portability testing, but you still own chat history replay, latency, and model-quality tradeoffs. - `ChatOptions` is the normal control plane for model ID, temperature, tools, `AdditionalProperties`, and provider-specific raw options. - Tool calling is modeled with `AIFunction`, `AIFunctionFactory`, and `FunctionInvokingChatClient`. Ambient data can flow through closures, `AdditionalProperties`, `AIFunctionArguments.Context`, or DI. - Tool calling can target local .NET methods, external APIs, or MCP-backed tools. The model requests calls; your app still owns execution, validation, and side-effect boundaries. - Tool definitions consume request tokens. Keep tool descriptions short and register only the tools relevant for the current conversation or workflow. - `FunctionInvokingChatClient` can handle the tool-invocation loop and parallel tool-call responses automatically when the provider/model supports that shape. - `IEmbeddingGenerator` is the standard abstraction for semantic search, vector indexing, similarity, and cache-key generation. Pair it with `Microsoft.Extensions.VectorData.Abstractions` for vector store operations. +- `IImageGenerator` is the experimental MEAI image surface. Treat `MEAI001` as an intentional opt-in, keep image generation separate from chat concerns, and compose logging/caching/hosting middleware around it the same way you would for `IChatClient`. - `Microsoft.Extensions.DataIngestion` gives you the document-side RAG pipeline: `IngestionDocument`, document readers like MarkItDown/Markdig, document processors such as `ImageAlternativeTextEnricher`, chunkers, chunk processors, `VectorStoreWriter`, and `IngestionPipeline` for end-to-end composition. - `IngestionPipeline.ProcessAsync` is partial-success oriented. Handle `IAsyncEnumerable` deliberately instead of assuming one failed document should automatically crash the whole ingestion run. - `Microsoft.Extensions.AI.Evaluation.*` gives you quality, NLP, safety, caching, and reporting layers for regression checks and CI gates. +- The official `.NET AI` docs now make MCP, assistants, local models, templates, and text-to-image part of the same app-level story. Use `dotnet-mcp` when the protocol itself becomes the design problem; stay here when you still mostly need app composition around `IChatClient` and friends. - `Microsoft Agent Framework` builds on these abstractions. Use it when you need autonomous orchestration, threads, workflows, hosting, or multi-agent collaboration instead of just model composition. ## Decision Cheatsheet @@ -66,6 +71,8 @@ flowchart LR | Tool calling from .NET methods | `AIFunction` + `FunctionInvokingChatClient` | Native function metadata and invocation pipeline | | Typed structured output | `IChatClient.GetResponseAsync` extensions | Keeps schema intent in code instead of prompt parsing | | Vector search or RAG | `IEmbeddingGenerator` + `Microsoft.Extensions.VectorData.Abstractions` | Standardizes embeddings and store access | +| Local model prototyping | `IChatClient` with an Ollama-backed implementation | Keeps the app on the MEAI abstractions while you validate prompts or UX locally | +| Text-to-image or image-generation middleware | `IImageGenerator` | Use the dedicated image abstraction instead of overloading chat APIs | | Evaluation and regression gates | `Microsoft.Extensions.AI.Evaluation.*` | Relevance, safety, task adherence, caching, reports | | Agent threads or multi-step autonomous orchestration | `dotnet-microsoft-agent-framework` | This is beyond plain provider abstraction |