Add Rich token streaming: server SSE + CLI live display + CLI container

Server (agent.py):
- _stream_queues: per-session asyncio.Queue for token chunks
- _push_stream_chunk() / _end_stream() helpers
- Medium tier: astream() with <think> block filtering — real token streaming
- Light tier: full reply pushed as single chunk then [DONE]
- Complex tier: full reply pushed after agent completes then [DONE]
- GET /stream/{session_id} SSE endpoint (data: <chunk>\n\n, data: [DONE]\n\n)
- medium_model promoted to module-level global for astream() access

CLI (cli.py):
- stream_reply(): reads /stream/ SSE, renders tokens live with Rich Live (transient)
- Final reply rendered as Markdown after stream completes
- os.getlogin() replaced with os.getenv("USER") for container compatibility

Dockerfile.cli + docker-compose cli service (profiles: tools):
- Run: docker compose --profile tools run --rm -it cli

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Alvis
2026-03-12 17:26:52 +00:00
parent edc9a96f7a
commit b04e8a0925
6 changed files with 151 additions and 38 deletions

View File

@@ -1,13 +1,13 @@
# Use Case: CLI Startup
Verify the Adolf CLI starts cleanly and exits without error when the user closes input.
Verify the Adolf CLI container starts cleanly, shows the welcome banner,
and exits without error when the user closes input.
## Steps
Run the CLI with empty stdin (simulates user pressing Ctrl+D immediately):
```bash
echo "" | python3 /home/alvis/adolf/cli.py --session use-case-cli-startup
echo "" | docker compose --profile tools run --rm -T cli \
python3 cli.py --url http://deepagents:8000 --session use-case-cli-startup
echo "exit code: $?"
```