Stealth Pydantic AI
A Python FastAPI backend with Vue3 frontend that runs a few LLM workflows. Pydantic AI defines agents and structured I/O for each step and workflow. Pydantic-graph orchestrates multi-step processing as a node DAG (Directed Acyclic Graph, basically a flowchart). There are deterministic steps and a model consensus process to minimize LLM hallucinations. There's also a Typer CLI and a Textual TUI.
Fig. 1: Primary Interface
⤢ ZOOMTech Detail
Fig. 2: Functional Overview
⤢ ZOOM
| Language | Python |
| AI Framework | Pydantic AI (Anthropic + OpenRouter providers) |
| Orchestration | pydantic-graph (typed node DAG) |
| Backend | FastAPI, Pydantic |
| Data | SQLite, Alembic |
| Year | 2026 |
| Status | In development |
| Visibility | Proprietary / stealth |
Notes
This is a learning project for building mixed deterministic and agentic systems.
Pydantic
I'm using a lot of Pydantic tools for agent I/O, API request and response schemas, and pydantic-settings for configuration. Pydantic AI makes each LLM step return a validated model rather than free-form text. Retry functionality handles repeating failed steps or flows.
Agent Graph
Multi-step processing is modeled with pydantic-graph as a DAG. This is basically a flowchart to map out each agentic workflow with a corresponding visual indicator in the UI. Each node is a small, testable unit.
Python
FastAPI serves an async REST API plus WebSocket channel that streams live progress to the web client. The same underlying service layer is reused by a Typer CLI and a Textual TUI. The CLI tools make it easier to get fast feedback during testing.
Data
Persistence is SQLAlchemy to SQLite with Alembic managing migrations. AI Model calls can target Anthropic or OpenRouter, and I track per-run token and cost. I use fast/cheap models, find out if there's consensus, and then use more expensive models if there isn't agreement. So far this seems to work pretty well for my use cases.
Summary
The whole thing is a dashboard for monitoring a few multi-step agentic processes, and I try to keep as many deterministic tool calls in the loop as possible to reduce LLM hallucination.