Agents in Production: How OpenGov Built and Scaled OG Assist
AI Engineer World's Fair 2026: Online Track · Video gốc
OpenGov chạy OG Assist trong production: agent loop Effect-native thay LangGraph, A2A, evals, human approval, sandbox, rolling summary và tracing.
1. Mở đầu và agenda
Gabe De Mesa là engineer tại OpenGov. Chủ đề hôm nay là agent chạy trong production, cụ thể là cách OpenGov build và scale OG Assist. Anh hứa trước rằng phần trình bày này sẽ "jam-packed", dồn rất nhiều thứ hay: AI agent, harness của nhóm, evals, observability, trace, tools và skills. Anh sẽ kể OpenGov làm gì và vận hành ở quy mô nào trong production, để người xem thấy một use case và một workload thật với AI agent. Rồi anh vào việc luôn.

Agenda đi rất nhanh ở mức high level. Đầu tiên là giới thiệu OG Assist và OpenGov là gì. Tiếp theo là origin story, mọi chuyện bắt đầu ra sao. Rồi tới "big bet" của OG Assist vào Effect, và đi sâu một chút vào core agent loop. Sau đó là A2A protocol, evals và sandboxing. Rồi cách nhóm quản lý long context. Rồi monitoring, observability, cách thu feedback và cách lặp lại trên feedback đó. Cuối cùng là tools và skills, và cách OpenGov dùng AI không chỉ ở bên ngoài, phục vụ khách hàng, mà cả bên trong để cải thiện development workflow của chính mình.

2. Gabe và OpenGov
Đôi dòng về bản thân trước khi đi tiếp. Gabe là software engineer tại OpenGov, làm trong AI agents team, và là một trong những người đã giúp build OG Assist cùng nhiều hệ thống sẽ xuất hiện trong phần còn lại của talk.

Còn OpenGov là một công ty phần mềm với sứ mệnh giúp chính quyền vận hành hiệu quả hơn và có trách nhiệm giải trình hơn ("more effective and accountable government"). OpenGov bán phần mềm ERP: budgeting (lập ngân sách), procurement (mua sắm công), asset management (quản lý tài sản) và permitting (cấp phép). Công ty được thành lập khoảng mười bốn năm trước.

3. OG Assist: một nút trên mọi sản phẩm
Điều thú vị là OpenGov có OG Assist, một nút nhỏ nằm trên thanh navigation ở đầu mọi sản phẩm của công ty. Và hay hơn nữa: tất cả các product suite và product team đều đã build tools và skills để "cấp năng lượng" cho cái nút này. Mỗi đội đóng góp năng lực của sản phẩm mình vào cùng một trợ lý.
Gabe mở một ví dụ. Anh bấm nút để mở OG Assist và hỏi về rate code, một khái niệm rất riêng của utility billing (tính hoá đơn tiện ích như nước, điện), cũng chính là sản phẩm anh đang đứng trong đó. Trong giao diện chat, anh nói chuyện với một agent, và agent có thể gọi tool để tra thông tin trên dữ liệu bên trong suite đó. Theo anh, việc tự tạo những trải nghiệm first party như vậy thông qua năng lực mà nhóm gọi là OG Assist là một điều rất đáng giá.

4. Origin story: một lời mời, một câu đồng ý
Câu chuyện bắt đầu cách đây không lâu. Nhóm thấy AI đang thật sự cất cánh, và một principal engineer lập ra một đội mới, AI agents team, rồi mời Gabe tham gia. Anh đồng ý ngay lập tức. Từ đó OG Assist bắt đầu lớn dần, và nhóm bắt đầu tích hợp nó vào tất cả sản phẩm, không chỉ qua năng lực back end mà cả năng lực front end.
Một trong những năng lực nhóm trao cho agent là nhìn thấy những gì đang hiện trên màn hình và hành động trên trang đó. Trong ví dụ, Gabe hỏi agent: "Này, trên màn hình đang có gì? Bạn có thể highlight vài bước tiếp theo tôi có thể làm không?". Agent bắt đầu suy nghĩ: "Được, mình đang có những tool nào để dùng?". Rồi nó tự highlight một thứ trên trang mà người dùng có thể bấm vào, và giải thích thêm về thứ đó. Đó là thêm một năng lực của OG Assist, và cũng là toàn bộ câu chuyện ngắn về cách mọi thứ ra đời.

5. Big bet on Effect
Gabe nói anh rất muốn đưa slide này vào, vì trong agents team, nhóm đã đặt cược lớn vào Effect. Và phải nói là cú cược đó đã "paid off in dividends", trả lãi đậm. Nhóm viết code bằng Effect.
Effect là một thư viện cho TypeScript, open source, giúp bạn viết code TypeScript tốt hơn. Nó có rất nhiều thứ được tích hợp sẵn: một schema tương tự Zod nếu bạn từng dùng, các công cụ cho error handling, logging, trace, và còn nhiều nữa. Theo Gabe, nó giúp viết code tốt hơn, cấu trúc code tốt hơn, hỗ trợ kiến trúc, dựng service mới, và với agents team thì giúp rất nhiều trong việc thiết kế và build chính core agent loop.

Suốt phần còn lại của talk, Effect sẽ xuất hiện rải rác để cho thấy nó đã đem lại lợi ích cho nhóm ra sao. Nhóm rất thích Effect ở OpenGov, và khuyến khích mọi người thử.
6. Agent loop viết lại theo kiểu Effect-native
Ban đầu nhóm chạy trên LangGraph, và mọi thứ ổn cho tới khi đội bắt đầu scale và các use case bắt đầu tiến hoá. Vì vậy nhóm quyết định chuyển sang một agent loop riêng, viết theo kiểu Effect-native, để có toàn quyền với agent loop: khi có use case phức tạp hay tính năng cần build, nhóm có thể đi thẳng vào loop mà sửa.
Không chỉ vậy, giờ mọi thứ đều nằm trên Effect. Tất cả những thứ hay của Effect được lan ra toàn bộ agent loop: tracing, structured concurrency, logging. Mọi thứ được kiểm soát chi tiết hơn, và việc có agent loop riêng từ con số không cho phép nhóm khai thác hết tiềm năng.

Đoạn code bên trái slide là phần cơ bản nhất của Effect loop nhóm đang dùng. Nhóm dùng package Effect AI (@effect/ai), trong đó có hai thứ: Chat và LanguageModel. Với Chat, bạn khởi tạo một chat, rồi stream text bằng hàm streamText, truyền vào một prompt. Điểm hay là bên dưới có một language model, và vì nhóm đang làm dependency injection, có thể truyền vào một language model khác nếu muốn hot swap sang model khác. Code trên slide:
import { Chat, LanguageModel } from "@effect/ai"
import { Effect, Stream } from "effect"
// Streaming chat with tool support
const streamingChat = Effect.gen(function* () {
const chat = yield* Chat.empty
yield* chat
.streamText({
prompt: "Generate a creative story"
})
.pipe(Stream.runForEach((part) => Effect.sync(() => console.log(part))))
})Tóm lại, có agent loop riêng cho nhóm nắm mọi đòn bẩy. Nó mở khoá hết năng lực của model, và cho cả đội toàn quyền với vòng lặp này.
7. Agent2Agent protocol làm hợp đồng giữa front end và back end
Điều tiếp theo Gabe muốn nhắc là Agent2Agent protocol (A2A). Agents team đã thành công nhiều với protocol này. Đây là protocol do Google tạo ra, một open protocol để các agent giao tiếp với nhau. Nhưng nhóm thấy nó rất hữu ích cho một việc khác: định nghĩa các agent route ở back end, và cho model cùng schema của nhóm đi theo protocol này.
Ví dụ, A2A có một thứ gọi là agent card, như trên slide, gồm tên của agent, mô tả, và nhiều trường khác. Có một protocol chặt chẽ, một spec chặt chẽ như vậy giúp dẫn dắt việc phát triển và giúp mọi người thống nhất. Tất cả những gì phải làm là bám theo spec, và ai cũng biết đó là hợp đồng mà front end lẫn back end đều sẽ tiêu thụ và tạo ra.

AgentCard trong tài liệu A2A: name, description, url, provider, version, documentationUrl, capabilities (streaming, pushNotifications, stateTransitionHistory), authentication, defaultInputModes, defaultOutputModes và danh sách skills (id, name, description, tags, examples, inputModes, outputModes). Dòng nhỏ bên phải: A2A cho phép OG Assist dựng trên một spec đã được hỗ trợ, thay vì xây từ con số không.Gabe đánh giá cách này cũng rất có ích cho nhóm. Hay hơn nữa, A2A có nhiều extension: bạn có thể mở rộng protocol, thêm metadata chẳng hạn. Còn có cả A2UI. Nhiều thứ thú vị quanh A2A, nhưng đây là phần đã chạy tốt với nhóm, và anh chỉ muốn chia sẻ lại.
8. Feedback và evals: ship mới là bắt đầu
Câu trích dẫn của phần này là: "Shipping is the start, not the finish", ship là điểm khởi đầu chứ không phải vạch đích. Agents team có nhiều cách chạy eval và thu feedback. Dĩ nhiên vẫn có người gọi điện, gửi email, hoặc đơn giản là nói với nhóm. Nhưng kênh chính là cơ chế thumbs up / thumbs down: người dùng có thể báo "câu này chạy rất tốt, đây là một câu trả lời hay", hoặc "câu này không ổn". Nhóm lấy tín hiệu đó, lặp lại trên nó, và mang về để cải thiện câu trả lời trong tương lai.

Nhóm còn có automated evals. Trong CI có các eval chạy trên completion thật, nên có thể test một prompt theo kiểu: "Nó có gọi đúng mấy tool đó không? Nó có làm đúng việc phải làm không?". Điều đó giúp tăng accuracy. Eval tự động kết hợp với feedback thu được giúp nhóm cải thiện tools, skills và harness, và theo Gabe, đó chính là lý do nhóm lặp nhanh như vậy.
9. Humans in the loop
Đây là một tính năng Gabe rất thích: nhóm ngắt agent loop một cách deterministic khi một tool call cần được phê duyệt. Nếu agent định gọi một tool cần sự đồng ý của con người, giao diện sẽ hiện ra, và người dùng bấm accept hoặc reject, tức là chủ động từ chối hoặc chủ động chấp nhận hành động agent đang định làm.

Cơ chế này giúp xây dựng niềm tin và đảm bảo an toàn, nhất là khi agent định làm một mutating operation (thao tác thay đổi dữ liệu). Và nó luôn luôn, luôn luôn đảm bảo rằng con người vẫn ngồi ở ghế lái.
10. Sandboxing: chỗ để agent hành động an toàn
Một việc khác nhóm làm, cùng tinh thần với slide an toàn vừa rồi: mỗi khi agent muốn chạy code hay tạo file, nó làm điều đó trong một sandbox. Nhóm cho agent khả năng tự dựng sandbox theo nhu cầu (on demand), và dùng sandbox để viết code, chạy code, tạo file. Đó là một không gian an toàn, ephemeral và isolated, để agent có thể hành động trong đó mà nhóm không phải lo rủi ro nào cho các hệ thống production. Và hay ở chỗ sandbox được tear down, dỡ bỏ, khi xong việc.

Trong ví dụ, Gabe nhờ agent: "Tạo một file PDF cho mọi người ở AI Engineer Conference 2026, và cho tôi tải về để chia sẻ với họ". Agent đã tạo một PDF rất đẹp ngay bên trong sandbox đó. Anh chỉ muốn điểm qua tính năng này và cho một cái nhìn ngắn gọn về sandboxing.

11. Long context: rolling summarization và memory
Bên trong OG Assist, nhóm đã vấp nhiều trở ngại, nhất là với các model đời cũ (legacy model): chạm token limit, hoặc đơn giản là bị nhồi quá nhiều context, đặc biệt khi cuộc hội thoại dài ra. Nhóm nhận thấy dùng một dạng rolling summarization hiệu quả hơn là lúc nào cũng nhét các message mới nhất, gần nhất vào. Thay vào đó, đưa ra một bản tóm tắt chạy liên tục sau mỗi N message, và có thể chỉ giữ nguyên văn khoảng 5 hay 10 message gần nhất (Gabe nói là "N trừ 5", "N trừ 10").

Có thể lúc này bạn chỉ đang nói về một chủ đề cụ thể, nhưng lại muốn nhắc tới context từ trước đó, ví dụ cách đây 100 message. Đó là chỗ thành phần memory vào cuộc: khi có một rolling summary cho một cuộc hội thoại rất dài, bạn có thể recall trên bản tóm tắt đó. Nếu hỏi agent "Này, nhớ chuyện mình nói lúc trước không?", agent trong thread đó sẽ đáp kiểu "Có, tôi biết bạn đang nói tới gì, tôi có một mẩu tóm tắt ngắn về nó", rồi tiếp tục làm thêm với rolling summary đó trong đầu. Đó là cách nhóm xử lý long context và memory, và nó đã chạy khá tốt.
12. UI on the fly
Trong ví dụ này, Gabe nói với agent: "Viết cho tôi một bài essay dài, nhưng hãy cho vài ví dụ về những chủ đề bài essay có thể viết". Điểm hay là agent đã được đăng ký sẵn một primitive là cái form này, và nó dựng form ngay lúc runtime, đưa ra các lựa chọn để anh chọn.

Trải nghiệm vì thế rất cá nhân, rất "trong khoảnh khắc", khi agent có thể đưa ra các lựa chọn ngay tại runtime. Đây chỉ là một phần nhỏ Gabe muốn đưa vào, về generative UI và cách nhóm render UI on the fly.
13. Tracing và observability: không thấy thì không scale được
"You can't scale what you can't see", không thấy được thì không scale được. Phần này nói về tracing và observability. Điều hay ở Effect là bạn có tracing out of the box. Khi dùng các hàm Effect, chúng tự động được gắn span, và span được thu lại để đổ vào trace, nhờ đó bạn có thể drill down vào từng lời gọi hàm.

Ví dụ trên slide là một trace từ chính đội Effect, có link nguồn tới trang tracing của Effect. Bạn thấy được: khi gọi API này, request đi tới endpoint này, tới handler này, và cứ thế. Hay hơn nữa là có thể profile mọi trace: cả chuỗi mất tổng cộng bấy nhiêu giây, và bottleneck nằm ở đâu. Nếu có lỗi, bạn có thể đối chiếu chéo nó qua nhiều service.
Điều này cực kỳ quan trọng, nhất là trong hệ thống agentic, nơi nhóm phải tích hợp với các đội khác, các API khác và các năng lực platform khác. Với Effect, có sẵn toàn bộ tracing này, và nó biến việc build trải nghiệm agentic, debug và bảo trì nó thành "a breeze", nhẹ nhàng như gió.
14. Tools and skills: một repo, mọi tool
Ngoài cú cược vào Effect, nhóm còn đặt cược lớn vào tools và skills. Nhóm tin rằng tools và skills thật sự là tất cả những gì bạn cần. Bên trái slide là một tool tên GetDadJoke: đó là cách làm kiểu Effect, và cũng là những viên gạch nền cho cách OpenGov làm mọi thứ. Ví dụ này lấy từ website của Effect, cho thấy cách tạo một tool, rồi đưa nó vào một toolkit (một tập hợp tool), rồi đăng ký toolkit đó với language model.

toolkit: DadJokeTools được tô sáng.import { LanguageModel, Tool, Toolkit } from "@effect/ai"
import { Effect, Schema } from "effect"
const GetDadJoke = Tool.make("GetDadJoke", {
description: "Get a hilarious dad joke from the ICanHazDadJoke API",
success: Schema.String,
failure: Schema.Never,
parameters: {
searchTerm: Schema.String.annotations({
description: "The search term to use to find dad jokes"
})
}
})
const DadJokeTools = Toolkit.make(GetDadJoke)
const generateDadJoke = LanguageModel.generateText({
prompt: "Generate a dad joke about pirates",
toolkit: DadJokeTools
})Chẳng hạn có một prompt "Hãy nghĩ vài câu dad joke về cướp biển". Thì đoán xem? Agent có sẵn một tool giúp lấy dad joke (từ icanhazdadjoke). Đó chính là những viên gạch nền nhóm dùng để làm tools, và dần dần là skills, và nó đã đem lại kết quả tuyệt vời cho cả tổ chức. Gabe thật lòng khuyên mọi người thử package Effect AI và tự build tools và skills của riêng mình.
15. Developer velocity và lời kết
Nhóm không chỉ build agent cho khách hàng mà còn dùng agent ngay bên trong OpenGov. Nhóm dùng rất nhiều Claude và Cursor, và chúng thật sự là "game changer" với đội. Điều buồn cười là nhóm đang build tools và skills cho các agent phục vụ khách hàng, chuyện đó rất tốt, nhưng đồng thời cũng build tools và skills cho nội bộ để tăng tốc development workflow. Những thứ như Claude, Cursor, Claude Agents giúp tăng tốc cách nhóm đọc, viết, review code và ship. Gabe gọi nó là một chất xúc tác thật sự, và muốn nhắc tới trước khi kết thúc.

Thế là hết. Gabe cảm ơn mọi người đã xem tới cuối, và chốt bằng một lời kêu gọi: hãy cùng build những agent thật sự ship được lên production.

Nguồn và liên kết
- Trang talk chính thức trên ai.engineer
- OpenGov
- Effect và repo Effect trên GitHub
- Effect AI: tool use
- Effect: tracing
- Agent2Agent (A2A) protocol và khái niệm agent card
- A2UI
- LangGraph
- GitHub của Gabe De Mesa: github.com/gabedemesa; LinkedIn: linkedin.com/in/gabedemesa