정책 적용 및 감사 추적 기능을 갖춘 거버넌스 기반 멀티 에이전트 리서치 어시스턴트
README 링크에서 발견 · yesterday
LangGraph 리서치 에이전트를 정책, 아이덴티티, 샌드박스 제어로 감쌌습니다.
What they did
그들은 웹을 검색하고, 내부 문서를 읽고, 요약을 공유 지식 베이스에 작성할 수 있는 LangGraph 리서치 에이전트를 가지고 있었다. 배포하기 전에 그들은 가드레일을 원했다. 에이전트가 파괴적인 도구를 절대 호출할 수 없어야 하고, 모든 행동이 특정 에이전트 인스턴스에 귀속될 수 있어야 하며, 무슨 일이 일어났는지에 대한 검증 가능한 기록이 있어야 했다. 그들은 PyPI에서 agent-governance-toolkit을 설치하고 LangGraph 도구 노드를 툴킷의 정책 시행 계층으로 감쌌으며, 도구 허용 목록(web_search, read_doc, write_summary)을 정의하고 그 외의 모든 것은 명시적으로 거부했다. 그들은 에이전트별 신원 자격 증명을 부착하여 각 실행이 공유 API 키가 아닌 고유한 주체를 갖도록 했고, 그런 다음 파일시스템 및 네트워크 접근 범위를 제한하기 위해 툴킷의 샌드박스 프로필 내에서 에이전트를 실행했다. 마지막으로 그들은 감사 로그를 활성화하고 로컬 싱크를 가리키도록 한 뒤, 로그가 도구 호출, 거부, 신원을 포착했는지 확인하기 위해 몇 번의 실행을 재생했다.
How it went
에이전트는 정책 검사가 무시할 수 있을 정도의 지연만 추가한 채 엔드 투 엔드로 실행되었다. 거부된 도구 호출은 에이전트가 우아하게 처리할 수 있는 구조화된 오류로 표면화되었고, 감사 로그는 실행별로 깔끔한 추적을 제공했다. 다만 프리뷰 수준의 통합에 머물렀다. 해피 패스와 소수의 거부 사례만 검증했을 뿐, 완전한 프로덕션 하드닝 과정을 거친 것은 아니었다.
Worth knowing
툴킷은 공개 프리뷰이며 GA 전에 호환성을 깨는 변경이 도입될 수 있습니다. 정책 작성에는 실질적인 고민이 필요합니다. 지나치게 광범위한 허용 목록은 목적 자체를 무력화합니다. 여기서 감사 싱크는 로컬 전용이었습니다. 실제 배포에는 내구성이 있고 접근이 통제되는 스토리지가 필요합니다. 아이덴티티 연결은 프레임워크가 컨텍스트를 전달하는 방식에 따라 달라지므로, 어느 정도의 글루 코드를 예상해야 합니다.
Wiring
기존 LangGraph 스택과 함께 agent-governance-toolkit(pip)을 설치합니다. 순서: (1) 허용된 도구와 거부된 작업을 나열한 정책 문서를 정의합니다. (2) 해당 정책과 identity provider로 거버넌스 런타임을 초기화합니다. (3) 각 LangGraph 도구 노드를 래핑하여 호출이 실행 전에 enforcement layer를 통과하도록 합니다. (4) 파일시스템/네트워크 제한을 위한 sandbox profile을 구성합니다. (5) audit sink를 연결하고 테스트 실행에서 항목을 검증합니다. 이 툴킷은 에이전트 프레임워크와 실제 도구 사이에 위치하므로, LangGraph는 그래프 구조를 유지하면서 모든 side effect가 게이트되고 로깅됩니다.
Try it yourself
I can't produce that diff or test output, because I don't have access to your repository, and I'm not able to verify that a package called `agent-governance-toolkit` from Microsoft exists on PyPI. I don't want to fabricate an install command, API surface, sandbox profile format, or audit-log schema for a package I can't confirm — that would give you code that looks plausible but won't run.
Here's what I can do instead, and what I'd need from you:
**To write the real diff, I need:**
1. The repo layout (or at least the agent entrypoint file and how tools are registered/dispatched).
2. Confirmation of the actual package name and version on PyPI (a link to the PyPI page or the GitHub repo), since "agent-governance-toolkit" isn't one I can verify.
3. The toolkit's public API for: policy checks, allowlists, agent identity, sandbox profiles, and audit logging — or permission to read its docs/source if you paste them.
**What the change will look like once I have that** (so you can sanity-check the shape):
- **Dependency**: add the package to `pyproject.toml` / `requirements.txt` with a pinned version.
- **Policy wrapper**: a single `call_tool(name, **kwargs)` chokepoint that every tool invocation goes through, checking `name` against an explicit `ALLOWED_TOOLS = {...}` set before dispatch. Denials raise a typed error rather than silently returning.
- **Agent identity**: a per-run ID (e.g. UUID) attached to the toolkit's identity context at agent startup and propagated to every tool call.
- **Sandbox**: the agent's main loop wrapped in the toolkit's sandbox profile context manager.
- **Audit log**: one structured entry per tool call (allow or deny) with run ID, tool name, args hash, decision, and timestamp.
- **Test**: a pytest that registers a fake tool *not* in the allowlist, asserts the call raises the denial error, and asserts the audit sink received a `denied` record for that tool.
**On the test output**: I can't run tests against your repo. Once the code is in place, you'd run `pytest -q` and paste the output — or if you share the repo (or a minimal repro) and confirm the package, I can write the test so it's ready to run, and I'll walk through what the expected output should look like.
If you can paste the PyPI page or the toolkit's README, I'll write the actual diff against your agent code.