Legora can’t read a single trace of what its agent does for a lawyer. The data belongs to the law firm’s clients. How do you build and test an agent when you can’t see its work? Jacob Lauritzen is the CTO of Legora, one of the fastest-growing companies...
GitHub Models đã ngừng hoạt động hoàn toàn kể từ ngày 30 tháng 7 năm 2026, bao gồm playground, danh mục model, API inference và tính năng BYOK. Nhà phát triển có thể chuyển sang Microsoft Foundry để truy cập danh mục model rộng hơn hoặc GitHub Copilot cho các workflow AI trực tiếp trên GitHub.
Lập trình viên nên đọc bài này để cập nhật cách chuyển đổi sang các công cụ AI hiện đại như Microsoft Foundry hoặc GitHub Copilot để tiếp tục phát triển dự án hiệu quả mà không bị mất khả năng sử dụng các công nghệ mới nhất.
Microsoft ra mắt khóa học miễn phí, mã nguồn mở ".NET Modernization for Beginners" giúp nhà phát triển nâng cấp ứng dụng ASP.NET cũ lên .NET 10 bằng GitHub Copilot modernization agent. Khóa học gồm 4 chương: đánh giá, lập kế hoạch, thực thi nâng cấp và triển khai lên Azure App Service, với các artifacts minh bạch (assessment.md, plan.md, tasks.md) cho phép chỉnh sửa trước khi thay đổi code. Yêu cầu: tài khoản GitHub Copilot và Visual Studio 2022 (17.10 trở lên).
Nếu bạn đang làm việc với các ứng dụng ASP.NET cũ và muốn nâng cấp hiệu quả mà không mất nhiều thời gian học mới, bài viết này sẽ hướng dẫn bạn cách sử dụng công cụ tự động hóa minh bạch từ GitHub Copilot để chuyển đổi dễ dàng, từ đánh giá đến triển khai trên cloud.
Microsoft đang thúc đẩy chiến lược "Frontier Transformation" trên nền tảng Copilot, Microsoft IQ và Agent 365, giúp các doanh nghiệp đạt hiệu quả vượt trội. Volkswagen đã triển khai Copilot cho hơn 330,000 nhân viên, trong khi Fujitsu sử dụng agent tự động hóa tới 75% phản hồi ban đầu cho hệ thống xử lý gần 300,000 yêu cầu mỗi năm. Công ty KOHLER cải thiện tốc độ phát hành code 25% và giảm lỗi 75% bằng GitHub Copilot, với hơn 3,000 agent được tạo ra. Docusign xử lý hơn một triệu tài liệu mỗi ngày với hiệu suất gấp 8 lần và chi phí AI thấp hơn 90%, trong khi Truist quản lý hơn 13,000 AI agent qua Agent 365.
Bài viết này giúp lập trình viên hiểu cách các doanh nghiệp lớn triển khai thành công AI và automation để nâng cao hiệu suất làm việc.
Trong bối cảnh triển khai AI như Foundry, nhiều tổ chức mắc lỗi bảo mật cơ bản khi cung cấp quyền truy cập không kiểm soát. Nguyên nhân kỹ thuật nằm ở việc sử dụng shared anonymous login và master key cho toàn hệ thống mà không có cơ chế giám sát. Hệ quả là dữ liệu nhạy cảm có thể bị sao chép qua USB hoặc truy cập trái phép như trường hợp contractor được cấp quyền truy cập tất cả server room. Điều đáng học là việc triển khai Identity Management, Private Networks và Guardrails là bắt buộc để kiểm soát truy cập AI, tương tự như cách bảo vệ tòa nhà vật lý.
Bài viết này cung cấp hướng dẫn thiết yếu về bảo mật AI trong Foundry, giúp ngăn chặn rủi ro khi triển khai các hệ thống trí tuệ nhân tạo không được kiểm soát đúng cách.
Sự gia tăng các thao tác write đang đặt áp lực lên các hệ thống mà mọi repository đều phụ thuộc. Vấn đề kỹ thuật chính là cách xử lý lượng requests Git ngày càng tăng, đặc biệt với sự phát triển của agent-scale development. Hệ quả bao gồm tình trạng latency cao và risk of system failure khi quy mô mở rộng. Giải pháp của họ bao gồm implementing sharding strategy và sử dụng Git LFS để giảm tải cho servers. Điều đáng học là việc tối ưu hóa Git infrastructure cần kết hợp cả cải tiến kỹ thuật lẫn thiết kế hệ thống phân tán.
Bài viết này giúp lập trình viên hiểu cách xây dựng hạ tầng Git có khả năng mở rộng để phát triển trên quy mô lớn của các tác nhân.
Microsoft Foundry sử dụng Model Catalog để quản lý đa dạng model AI và Model Router để tự động chọn model tiết kiệm chi phí nhất dựa trên yêu cầu thực tế. Hệ thống này tận dụng các kỹ thuật như dynamic routing để tối ưu hóa việc sử dụng cloud resources, giảm tới 40% chi phí tính toán. Structured outputs trong Foundry cho phép áp dụng JSON schema để đảm bảo định dạng dữ liệu đầu ra nhất quán, rất hữu ích với các ứng dụng cần dữ liệu có cấu trúc. Foundry Local cho phép triển khai model offline mà không cần kết nối internet, đáp ứng yêu cầu bảo mật và độ trễ thấp. Các kỹ sư AI nên tìm hiểu Foundry vì nó cung cấp giải pháp toàn diện từ quản lý model đến triển khai thực tế với tối ưu hóa chi phí.
Bài viết này giúp bạn hiểu cách Microsoft Foundry Model Router chọn mô hình AI hiệu quả chi phí, cách thực hiện đầu ra có cấu trúc tuân thủ JSON schema, và cách chạy mô hình offline với Foundry Local.
Tôi tích hợp các công cụ hiện có trong ngữ cảnh AI để biến dữ liệu telemetry Application Insights thành báo cáo sức khỏe hàng ngày có thể hành động, giúp xác định vấn đề cần quan tâm và duy trì cuộc trò chuyện tiếp theo.
Bài viết này giúp lập trình viên tự động hóa việc giám sát hệ thống bằng AI để chuyển dữ liệu telemetry thành báo cáo sức khỏe hành động mỗi ngày.
Bài viết hướng dẫn triển khai cơ chế phê duyệt công cụ bởi con người (human-in-the-loop) trong Microsoft Agent Framework với .NET, mở rộng demo weekend-concierge agent để công cụ đặt nhà hàng dừng lại chờ xác thực trước khi thực thi. Tác giả trình bày ApprovalRequiredAIFunction wrapper, triển khai console thu approve/deny qua ToolApprovalRequestContent và CreateResponse, cùng quy trình tương tự trên Microsoft Foundry sử dụng OpenAI Responses protocol với mcp_approval_request/mcp_approval_response. Đáng chú ý là lỗi đã phát hiện: phản hồi host có thể đánh dấu là hoàn thành (trả về HTTP 200 status failed) trong khi công cụ thực thi và trả về booking reference, khiến client chỉ kiểm tra status bị hiểu nhầm (ghi nhận trong agent-framework issue 8577).
Lập trình viên nên đọc bài này để biết cách triển khai cơ chế phê duyệt công cụ bởi con người trong Microsoft Agent Framework .NET, giúp tăng tính kiểm soát và bảo mật cho ứng dụng.
Azure MCP Server 3.0 stable release giới thiệu bộ công cụ AI agent mới cho Terraform, backup, recovery và troubleshooting. Phiên bản này được phát triển để tăng cường khả năng tự động hóa các tác vụ quản lý cloud infrastructure. Hệ quả là người dùng có thể xử lý sự cố nhanh hơn và giảm thiểu rủi ro vận hành. Đáng học hỏi ở đây là cách Microsoft tích hợp các công cụ AI chuyên biệt vào MCP Server, đồng thời cải thiện các mặc định bảo mật để tăng cường độ tin cậy cho hệ thống cloud.
Bài viết này cung cấp cái nhìn tổng quan về Azure MCP Server 3.0 stable release với các công cụ AI agent mạnh mẽ và các mặc định bảo mật được cải thiện, giúp lập trình viên tối ưu hóa công việc quản lý và phát triển trên nền tảng Azure.
Khi xây dựng Microsoft Foundry hosted agent cho Teams, các lập trình viên phát hiện việc triển khai agent cơ bản khá đơn giản nhưng nhanh chóng gặp các trường hợp sử dụng không được hỗ trợ. Họ cần agent chủ động liên hệ người dùng thay vì chỉ phản hồi tin nhắn trực tiếp, đồng thời xử lý message reactions và các dạng giao tiếp phức tạp hơn văn bản đơn thuần. Những yêu cầu này đòi hỏi Microsoft Foundry phải tích hợp tính năng proactive messaging và xử lý các reaction types trong Teams API. Điều này cho thấy dù nền tảng có hỗ trợ cơ bản, việc xây dựng agent enterprise thực sự cần hiểu sâu các API và use cases đặc thù.
Bài viết giúp lập trình viên triển khai agent Teams với tính năng nhắn tin chủ động, phản ứng và quản lý tài nguyên hiệu quả.
Managed DevOps Pools giúp tối ưu chi phí bằng cách tự động scale agents dựa trên nhu cầu thực tế. Công nghệ này sử dụng stateless hoặc stateless kết hợp với standby schedules để giảm lãng phí tài nguyên. Các tính năng như automatic prediction và image buffers giúp giảm thời gian khởi động agent xuống còn 5-10 giây so với 3-5 phút trước đây. Bạn có thể triển khai giải pháp này bằng Terraform, ARM template hoặc CLI, tiết kiệm đến 70% chi phí so với cách triển khai truyền thống.
Bài này giúp lập trình viên tối ưu hóa chi phí khi mở rộng quy mô agent trong DevOps bằng cách tận dụng các tính năng tự động hóa của Managed DevOps Pools.
Data API builder phiên bản 2.1.5 vừa bổ sung hỗ trợ cho các kiểu dữ liệu JSON và vector trong REST và GraphQL API. Bản cập nhật này tích hợp thêm thư viện NuGet để dễ dàng tích hợp vào hệ thống .NET hiện có, đồng thời tăng cường bảo mật cho endpoint MCP. Phiên bản mới này cũng hỗ trợ .NET 10, mang lại hiệu năng tốt hơn và tương thích với công nghệ mới nhất. Với việc hỗ trợ vector data type, Data API builder giờ đây phù hợp hơn cho các ứng dụng AI và machine learning đòi hỏi xử lý dữ liệu đa chiều.
Lập trình viên nên đọc bài này để cập nhật về hỗ trợ JSON và vector mới trong Data API builder 2.1.5.
Aspire 13.6 giới tính tính năng telemetry dashboard giữ lại giữa các phiên chạy, giúp theo dõi trạng thái ứng dụng liên tục. Phi bản này cho phép mở shell exec container trực tiếp trong dashboard mà không cần rời giao diện, đồng thời bổ hosting Java và Rust chính thức. Aspire còn hỗ trợ portable volume paths để quản lý volume dễ dàng hơn và preview Azure Container Apps Sandboxes cho môi trường sandboxing an toàn. Đây là bản nâng cấp quan trọng cho các developer .NET đang xây dựng ứng dụng container hóa.
Aspire 13.6 mang lại trải nghiệm dashboard mạnh mẽ hơn với lưu giữ telemetry, công cụ container tiện lợi và hỗ trợ thêm Java, Rust.
Các agent hiện đại đã phát triển vượt xa chatbot thông thường, chuyển từ chờ tin nhắn người dùng sang tự động thực hiện công việc. Microsoft Foundry hiện đưa Routine vào trạng thái Generally Available, cho phép agent tự động hóa quy trình phức tạp qua nhiều bước. Công nghệ này sử dụng LLM và embedding models để hiểu ngữ cảnh và thực hiện tác vụ mà không cần can thiệp thủ công. Việc triển khai Routines giúp giảm thiểu 70% thời gian xử lý các tác vụ lặp đi lặp lại, tăng hiệu suất cho doanh nghiệp. Lập trình viên nên nghiên cứu kỹ để tận dụng sức mạnh của autonomous agents trong các hệ thống enterprise hiện tại.
Bài này giúp lập trình viên nắm bắt xu hướng phát triển từ chatbot đến trợ lý tự động với Routines trong Microsoft Foundry đã chính thức có sẵn để ứng dụng vào dự án thực tế.
Video workloads do not all start with the same input or aim for the same result. A creative team might explore several interpretations of a written brief. A...
Microsoft caught attackers using ARTEX, an agentic AI framework, to find exposed secrets on GitHub and breach Azure in minutes. Check your exposure now.
Set up, test, evaluate, and deploy hosted agents with the generally available Microsoft Foundry extension for Azure Developer CLI, keeping agent and deployment configuration alongside your code.
he Microsoft Foundry extension for Azure Developer CLI is generally available. Set up, test, evaluate, and deploy hosted agents with configuration alongside your code.
Someone on your research or engineering team wants to try a quantum computer. Not buy one, just run a small program on real quantum hardware and see what com...
Plan your Microsoft Ignite November 17-20 viewing, then explore October's Copilot harness preview, GA browser automation and hosted-agent resilience, Decisions API, and SDK updates with chapter-linked Handoff demos.
Learn how to migrate MongoDB to Azure DocumentDB with Azure Migrate and VS Code. Assess compatibility, plan cutover, and download the modernization eBook.
LangSmith BYOC now runs on AWS (GA), Azure and Google Cloud (Beta). Your traces, evals, and agent deployments stay in your cloud account while LangChain runs it.
LocalStack has opened its Azure emulator to a free public preview, running Azure services locally and accepting existing ARM, Bicep, and Terraform without rewrites. Its own documentation reports parti
If your business runs its applications on Azure, there is a good chance a monthly bill has made you ask an uncomfortable question: why are we paying for all ...
The October recap for the Azure Developer CLI (azd). Preview service deployments before making changes, deploy to Container Apps express, remove stored environment values, and use extension-defined infrastructure providers in generated pipelines. Extension APIs gain stable contracts, and provisioning validation, cancellation, and upgrade recovery improve.
In my last post, I broke down the Socrates paper, the research that became Azure SQL Database Hyperscale. Writing it made me want to tackle a question I
In my previous blog posts, Azure’s Weakest Link? and Azure’s Weakest Link - Full Cross-Tenant Compromise, I gave an overview of the severely insecure architecture behind API Connections in Azure, a part of Azure Logic Apps, and an instance of a full cross-tenant compromise using these inherent flaws. Now I am back with some more vulnerabilities in this system, each giving the same primitives to the attacker. In total, the vulnerabilities here netted me a cool $200,000. I also held a talk detailing this at Blue Hat Asia 2026, and when the recordings are out, I will add a link here. TL;DR API Connections allow anyone to fully compromise any other connection worldwide, giving full access to the connected backend. This includes cross-tenant compromise of Key Vaults and Azure SQL databases, as well as any other externally connected service, such as Jira or Salesforce. The only thing stopping exploitation is really the layers of input validation bolted onto the various systems, but as you will see, it is really difficult to catch all the edge cases here. Architecture If you haven’t read the first parts of this series, I would recommend checking those out first, Azure’s Weakest Link? - Part 1 and Azure’s Weakest Link - Full Cross-Tenant Compromise, but if you don’t care, I will go through the most important parts of the architecture first. From Microsoft’s documentation, we see a quite intriguing diagram of how the API Connection architecture is built. This basically spells out all that is needed to understand how the system operates, kudos to whoever made it! It works like this A logic app, the symbol on the bottom left, queries a shared Azure API Management instance The API Management instance first checks the swagger (OpenAPI) definition of the connector type and checks that it is a valid action A sort of key exchange happens where the input token, or key, is exchanged for the configured token for the backend service The API Management instance finishes the call with this new token to the backend instance. From this, we can surmise that if we are able to trick the API Management instance to operate on a different connection than the ones we own, we would be able to effectively use the configured token for a victim’s connection on their backend service. This service can, in effect, be anything. As you can see here, the list of backend services is effectively unbounded and includes a number of Azure services. However great the diagram is, there is one crucial omission, which we have already used to great effect in part 2 of this series. By using the ARM REST API DynamicInvoke or /extensions/proxy/ endpoints, we can directly query the APIM service through ARM. I have taken the liberty of updating the diagram to match this. Considering this, and the fact that, as a resource manager, ARM basically has full access to everything, our exploitation pathway becomes clear. We must trick the calling service into querying a different connection than ours, and thus get full control of the backend service. Caveat: It is, of course, possible for the people who set up these connections to scope their access tokens or keys so that the API Connection has minimal privileges in the backend. I would guess, however, that this is rarely done. In the case of OAuth connections, it will surely always be the token of the person who initially made the connection. And for the API key case, well, who cares enough to scope such things minimally? Microsoft doesn’t, at least. Initial Exploitation The first cross-tenant exploitation I achieved in API Connections, and in fact in Azure as a whole, has already been described in part 2. As a recap, here is an example payload using the DynamicInvoke endpoint of my own connection to read the Key Vault of a different tenant. POST /subscriptions/8e3ce52f-d45b-4347-8705-65892507465e/resourceGroups/token-storer/providers/Microsoft.Web/connections/custom2/DynamicInvoke?api-version=2018-07-01-preview HTTP/2 Host: management.azure.com Authorization: Bearer <token> Content-Type: application/json Content-Length: 147 { "request":{ "method":"get", "path":"path/%2e%2e/%2e%2e/%2e%2e/%2e%2e/apim/keyvault/fd8d0f4f4069495991ccb4974f96a1ed/secrets/victimsecret/value" }, } HTTP/2 200 OK Cache-Control: no-cache Pragma: no-cache Content-Length: 1329 { "response": { "statusCode": "OK", "body": { "value": "dontreadme", "name": "victimsecret", "version": "7914d45aa60342809fb8cc12dc68b10e", "contentType": null, "isEnabled": true, "createdTime": "2025-04-04T05:38:26Z", "lastUpdatedTime": "2025-04-04T05:38:26Z", "validityStartTime": null, "validityEndTime": null }, "headers": { <Headers> } } } As you can see, it’s a pretty clear path traversal vulnerability. This implies what we already assumed: When the request fires from ARM to the APIM instance, it has rights to all connections, regardless of what it operates on. Further exploitation A couple of weeks after I reported this vulnerability, it got marked as fixed, and when I tried it again, the following error message greeted me: Now, I considered whether or not this was a sufficient fix. It seemed to restrict the paths allowed, rather than the underlying token issue, so I guessed there would be ways around it. An interesting little fact about the ARM API is that, in some cases, it might not be as much of a black box as you assume. The relevant code can sometimes be found within the resource types themselves. I do not know whether this code actually executes on these machines or is merely included as an artifact, but it is a gold mine of interesting information. So, I created a Standard Logic App, which provides a fully dedicated host, SSHed into it, and extracted the code. Lo and behold, look what I found: Can you see the fix they implemented? What was even more interesting here actually was something I found, and was not really even looking for. When searching for the actual DynamicInvoke code, what greeted me was not actually just this one public function, but four: These functions are completely undocumented, and I could find no reference to them anywhere. However, they were reachable and located along the same path. So, for instance, to hit DynamicList here, simply change dynamicInvoke in your URI to DynamicList. Knowing that the slap-dash blacklisting fix that they implemented only applied to DynamicInvoke, I assumed that these would all be vulnerable in the same way if they had the same functionality. Without boring you too much with the required arguments and return values here, the exploitation method is really quite the same, although the payload is a bit more involved. For DynamicList, you need to specify each path parameter on its own and do a bit of work to get a result, but the same logic applies. To achieve, for instance, a cross-tenant write on a victim’s SQL server through their connection, a payload like this works: POST /subscriptions/162fc6db-03cd-4fe8-ab44-dc0a947e74af/resourceGroups/api-connection/providers/Microsoft.Web/connections/custom_validator/DynamicList?api-version=2018-07-01-preview&_=1765372176638 HTTP/2 Host: management.azure.com Authorization: Bearer <token> Content-Length: 524 Content-Type: application/json { "dynamicInvocationDefinition": { "operationID": "nine", "parameters": { "one": { "value": ".." }, "two": { "value": ".." }, "three": { "value": "sql" }, "four": { "value": "88d28f5ff7b642cfb91df184938d074c" }, "five": { "value": "v2" }, "six": { "value": "datasets" }, "seven": { "value": "victimservice.database.windows.net,VictimDatabase" }, "eigth": { "value": "query" }, "nine": { "value": "sql" }, "query": { "value": { "query": "Insert INTO MySecrets VALUES ('NewEvilSecrets', 3)" } } }, "ItemsPath": "ResultSets/Table1", "ItemValuePath": "secrets", "ItemTitlePath": "value" } } You can quite easily see that the first parameters here execute the path traversal and then perform an arbitrary SQL query on the database. I reported only the DynamicList case first, in the hope that they would perform a similar fix to DynamicInvoke and I would get to report on the other two as well. Sadly, their fix involved simply blocking all these endpoints. No other mitigations seem to be in place, however, so if these endpoints ever become accessible again, I would assume they would be vulnerable. Further exploitation Messing around with paths in these dynamic calls seemed to have reached its conclusion: I couldn’t get past the path limitations on DynamicInvoke, and all the other endpoints were blocked. What I needed was a different way in. As I was trying to sleep one day, it occurred to me that I had overlooked using the Logic Apps themselves. I realized that there was, in fact, a significant difference between the Consumption and Standard Logic Apps connection-creation flows. The most glaring difference is that Consumption Logic Apps, where your workflow is co-located with a bunch of others, create a Version 1 connection, while the dedicated-host Standard Logic Apps create a Version 2 connection. The following diagrams make a more subtle difference between the flows clear: Do you see the difference? Obviously, when it’s spelled out like that, it’s pretty clear what the point is. Using a Standard Logic App, after we have created the resource and added whatever authentication to the backend server we need, we authorize that specific logic app to access it using its managed identity. However, when we have a Consumption Logic App, we don’t have any such identity to authorize because we don’t control it. This perhaps makes some sense: we can’t authorize it, so we don’t. I realized that this must imply that every Consumption Logic App has implicit access to every Version 1 API Connection; the only thing stopping us from exploiting this must be some sort of input validation. The classic view of a Logic App workflow is quite restrictive in its input, but there are both the API endpoints, and the Code view in the GUI that allow us to play around a bit more with the inputs. This allows us to see the inputs in more detail, edit them, and even add more. The obvious trick of changing the referenced connector to a victim’s connection fails, as the runtime performs extensive validation that you own the connection. We have the codebase, though, so we can try to find all the valid parameters. It did not take much searching for me to discover the host.api.RuntimeUrl parameter. I can’t quite get my head around why this parameter is included, nor why it’s still accepted to this day, but it works in the way you would expect. After performing a series of validations on the connection referenced in host.connection, you can specify that it should use something completely different instead of the runtimeUrl baked into that connection. As long as the host ends with azure-apihub.net, it will also include the required Authorization header. What happens when this workflow is run then? The keen-eyed reader might notice that the runtimeUrl used in the exploit is not just the connectionId. This is because some extra elements get added to the URI, but it is of no consequence to us; the exploit works fine. Manna from the heavens I, of course, reported this to Microsoft again, and they spent some time working up a fix. When it finally came through, the exploit returned an error message: The host API runtime URL is not valid for the API connection '/subscriptions/8e3ce52f-d45b-4347-8705-65892507465e/resourceGroups/token-storer/providers/Microsoft.Web/connections/keyvault-1'. The runtime URL path must match the expected API endpoint 'https://logic-apis-norwayeast.azure-apihub.net/apim/keyvault/cbfb0f4313144117a7440368902bb871?' for the referenced connection. Either omit the 'host.api' input property, or correct the runtime URL to match the API associated with the connection. Except for the excessive length of this message, it seems like quite a suitable fix. The runtime URL must exactly match what is expected; otherwise, no dice. Apart from just removing the parameter altogether, it’s quite sane. Unless, of course, it checks that value at the wrong time: This works again, with the same result. What’s going on here is that the validation happens before the path is normalized, so the runtime thinks the URI is pointing to my referenced connection, but the APIM instance sees it differently. And just like that, I got another critical vulnerability. The fun does not stop there. When Microsoft managed to scrape together a fix for this path traversal, a surprising thing happened. The original RuntimeUrl path was no longer validated, and as a result, you could perform that attack again. I would include some pictures, but they would be the same pictures as above, so you can just imagine them. Reporting and rewards Altogether, API Connections have netted me five critical elevation-of-privilege vulnerabilities in Azure, which is perhaps more than expected. All vulnerabilities reported here were fixed within a reasonable time after I submitted the reports, and while there were some disagreements with MSRC along the way, overall, I am quite happy with the results.
Azure Deployment Environments retires on February 22, 2027 and Microsoft names no successor, telling teams to use Bicep or ARM templates directly. Microsoft Dev Box follows on September 18, 2028, poin
Are you thinking about earning a Microsoft certification to help advance your career, build on your existing skills, or meet new requirements at work? If