HorizonOps AI is a local decision-support prototype built with Python, FastAPI, Streamlit, Docker, and Azure AI Foundry. Independent specialist services analyze one objective in parallel; an orchestrator validates their structured outputs and produces a single decision dossier.
It takes a business or product objective, runs it through specialist agents, and returns a decision dossier, an execution board, and traceable outputs.
In one line: give HorizonOps AI a strategic goal and it turns it into risks, options, priorities, next actions, and a clear go / pivot / stop decision.
The project is intentionally scoped as a portfolio-ready local system. It demonstrates A2A 1.0 service orchestration, structured LLM outputs, deterministic validation checks, document ingestion, trace persistence, and an Azure-backed inference path. It is not presented as a production decision system.
Given an objective such as:
Launch an AI micro-agency for automating workflows in independent Italian restaurants.
Objective: secure 3 paying pilot clients in 30 days.
HorizonOps AI returns:
- a strategic decision dossier
- opportunity and risk analysis
- financial and viability review
- board-style critique
- 5 concrete next actions
- a Kanban-style execution board
- quality gates
- structured JSON traces
- Markdown and JSON exports
See a captured sample output in docs/demo-output.md.
HorizonOps AI is built as a small network of local services instead of a single chat call:
- each specialist agent has a clear role
- outputs are parsed into structured JSON
- weak outputs can be retried or recovered
- the orchestrator synthesizes compact agent data
- every dossier is stored with trace metadata
- workspaces keep project history and execution tasks
flowchart TD
UI["Streamlit UI :8510"] -->|REST /dossier| ORCH["Orchestrator :11010"]
EXT["External A2A client"] -->|A2A JSON-RPC| ORCH
ORCH -->|A2A JSON-RPC| SIGNAL["Signal :11011"]
ORCH -->|A2A JSON-RPC| RISK["Risk :11012"]
ORCH -->|A2A JSON-RPC| STRATEGY["Strategy :11013"]
ORCH -->|A2A JSON-RPC| EXEC["Execution :11014"]
ORCH -->|A2A JSON-RPC| CRITIC["Critic :11015"]
ORCH -->|A2A JSON-RPC| FINANCE["Finance :11016"]
SIGNAL --> FOUNDRY["Azure AI Foundry"]
RISK --> FOUNDRY
STRATEGY --> FOUNDRY
EXEC --> FOUNDRY
CRITIC --> FOUNDRY
FINANCE --> FOUNDRY
ORCH --> DATA[("Local traces and workspaces")]
| Agent | Role |
|---|---|
| Orchestrator Agent | Coordinates all agents and creates the final dossier |
| Signal Intelligence Agent | Finds market, customer, timing, and opportunity signals |
| Risk and Red-Team Agent | Stress-tests assumptions, risks, and kill criteria |
| Strategy Architect Agent | Builds positioning, options, tradeoffs, and milestones |
| Execution Planner Agent | Converts the strategy into concrete tasks and metrics |
| Board Critic Agent | Reviews weak logic, vague actions, and contradictions |
| Finance and Viability Agent | Checks pricing, costs, margins, and economic feasibility |
Every service is exposed through the official a2a-sdk using the A2A 1.0
JSON-RPC binding. The orchestrator discovers each remote agent from its public
Agent Card before delegating work.
- discovery:
GET /.well-known/agent-card.json - protocol endpoint:
POST /a2a - message transport: A2A
SendMessage - lifecycle: submitted task,
working, thencompleted,failed, orcanceled - result transport: JSON artifact attached to the completed task
- task storage: SDK
InMemoryTaskStorefor the local single-instance demo
The SDK request handler also provides the standard task lookup, listing, and
cancellation operations. Streaming and push notifications are explicitly
advertised as unsupported instead of being simulated. The previous /message
route remains available as a deprecated local compatibility endpoint.
- A2A 1.0 orchestration with discoverable FastAPI agent services
- Official A2A Python SDK, JSON-RPC transport, tasks, states, and artifacts
- Streamlit command center
- Azure AI Foundry Responses API integration
- Structured Pydantic output schema
- JSON repair and fallback for imperfect model output
- Deterministic checks for completeness, schema integrity, sources, and service health
- Workspace-isolated memory and dossier history
- Kanban-style execution board
- Decision lenses: Founder, Consultant, Investor, Product Manager, Cloud Architect, Red Team
- Upload context files:
.txt,.md,.csv,.json,.log,.pdf - PDF text extraction with
pypdf - Markdown and JSON export
- Dockerfile included
- Unit tests included
.
|-- agents/ # FastAPI specialist agent services
|-- core/ # A2A, orchestration, contracts, prompts, memory, parsing
|-- ui/ # Streamlit app
|-- config/ # environment example and settings
|-- docs/ # demo output and documentation assets
|-- tests/ # unit tests
|-- main.py # starts all services and UI
|-- requirements.txt
|-- Dockerfile
`-- README.md
Use Python 3.10+.
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
Copy-Item config\.env.example .envUpdate .env with your Azure AI Foundry values:
PROJECT_ENDPOINT=https://your-resource.services.ai.azure.com/api/projects/your-project
MODEL_DEPLOYMENT_NAME=gpt-4.1
SERVER_URL=localhostYou also need to be authenticated with Azure:
az loginpython main.pyOpen:
http://localhost:8510
Default ports:
Launch an AI micro-agency for automating workflows in independent Italian restaurants.
Objective: secure 3 paying pilot clients in 30 days.
Constraints: 300 EUR budget, solo founder, Python/Azure/FastAPI/Streamlit skills,
0 current clients, local outreach in Italy, simple MVP, low delivery cost, and
clear stop/pivot criteria.
Recommended settings:
- Mode:
deep - Decision lens:
Founder - Horizon:
30 days - Live research: off for a local demo without web search, on for source-backed analysis
python -m unittest discover -s testsThe same test suite runs on Python 3.10, 3.11, and 3.12 through GitHub Actions.
docker build -t horizonops-ai .
docker run --env-file .env -p 8510:8510 -p 11010-11016:11010-11016 horizonops-aiFor deterministic local output without Azure calls:
HORIZONOPS_OFFLINE_MODE=true- PDF ingestion extracts selectable text only. Scanned PDFs require OCR first.
- Local memory uses JSON files, not a production database.
- File persistence is designed for a single local instance, not concurrent replicas.
- A2A task state is kept in memory and is lost when an individual service restarts.
- A2A streaming and push notifications are not enabled in this local version.
- Quality checks validate structure and minimum content depth; they do not prove that an AI recommendation is correct.
- API authentication, rate limiting, and multi-user isolation are outside the current local-demo scope.
- The local runner starts several processes on fixed ports.
- Azure deployment files are intentionally minimal; the Dockerfile is ready, but production IaC can be added later.
This project demonstrates:
- cloud-oriented Python service design
- standards-based A2A agent orchestration
- structured LLM output validation
- practical reliability patterns for model output
- Azure AI Foundry integration
- local developer experience and Docker readiness
MIT

