commit e015185a5972ff809920887dfce580760a6215a8 Author: Xin Wang Date: Mon Aug 24 00:50:51 2026 +0800 feat: initialize AG-UI from-scratch project diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..e157a62 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,202 @@ +# AGENTS.md + +# Project: agui-from-scratch + +## Purpose + +This project is a from-scratch implementation of a minimal AG-UI +protocol runtime. + +The goal is learning the protocol design, not building a production +framework. + +Do NOT install or use the official `ag-ui` SDK until the final migration +step. + +The project should help understand: + +- SSE (Server-Sent Events) framing +- AG-UI event lifecycle +- streaming text messages +- tool call streaming +- frontend event reducers +- state synchronization +- adapter design between different agent frameworks + +## Core Learning Goal + +Build this pipeline: + + Agent Runtime + | + v + AG-UI Event Generator + | + v + SSE Encoder + | + v + HTTP Streaming Response + | + v + Browser SSE Parser + | + v + AG-UI Event Reducer + | + v + UI State + +## Repository Structure + + agui-from-scratch/ + + ├── server.py + ├── index.html + ├── README.md + └── AGENTS.md + +Keep the repository minimal. + +## Technology Constraints + +Backend: - Python - FastAPI - asyncio - native JSON handling + +Do not use: - ag-ui SDK - LangChain - LangGraph - agent frameworks + +Frontend: - Vanilla JavaScript - Fetch API - ReadableStream - +TextDecoder + +Avoid frontend frameworks. + +## Development Rules + +Do not hide protocol details. + +Initially implement manually: + +``` python +encode_sse() +``` + +``` javascript +parseSSE() +``` + +``` javascript +applyEvent() +``` + +## Commit Plan + +### Commit 1 + + feat: implement SSE framing + +Implement: - FastAPI endpoint - text/event-stream response - SSE frame +encoding + +Understand: + +HTTP chunk -\> SSE frame -\> JSON payload + +### Commit 2 + + feat: implement AG-UI text events + +Implement: + +- RUN_STARTED +- TEXT_MESSAGE_START +- TEXT_MESSAGE_CONTENT +- TEXT_MESSAGE_END +- RUN_FINISHED + +Frontend maintains streaming messages. + +### Commit 3 + + feat: implement AG-UI tool call events + +Implement: + +- TOOL_CALL_START +- TOOL_CALL_ARGS +- TOOL_CALL_END +- TOOL_CALL_RESULT + +Remember: tool arguments are streamed and may arrive in multiple chunks. + +### Commit 4 + + feat: implement AG-UI state reducer + +Implement: + +- STATE_SNAPSHOT +- STATE_DELTA + +Maintain runtime state: + +``` javascript +{ + running:false, + messages:{}, + toolCalls:{}, + state:{} +} +``` + +## Final Migration + +Only after all milestones: + +Install the official ag-ui SDK. + +Replace: + +- encode_sse() +- parseSSE() +- applyEvent() + +with official implementations. + +Compare: - abstraction choices - protocol decisions - problems solved by +the SDK + +## Debugging Rules + +Inspect in order: + +1. raw HTTP chunks +2. SSE frames +3. parsed JSON events +4. reducer state changes +5. UI rendering + +## Future Extensions + +Add adapters: + + AgentScope Event + | + v + AG-UI Event + + OpenCode Event + | + v + AG-UI Event + +Later replace fake agent streaming with: - OpenAI Realtime API - Qwen +Realtime Agent - local LLM runtime + +## Definition of Done + +- [ ] SSE stream works without SDK +- [ ] Text streaming works +- [ ] Tool calls stream correctly +- [ ] Frontend maintains runtime state +- [ ] Different agent backends can be adapted into AG-UI events +- [ ] Official SDK can replace handwritten components +- [ ] README explains protocol design decisions diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/index.html b/index.html new file mode 100644 index 0000000..e69de29 diff --git a/server.py b/server.py new file mode 100644 index 0000000..e69de29