Victor — Master Blueprint¶
The starting point for understanding Victor. A single-page, top-down and
bottom-up orientation map of the entire codebase — grounded in real modules
and integration points. All diagrams are Mermaid and render inline.
Version: 0.9.0 | Status: Canonical orientation document
Table of Contents¶
- What Victor Is
- Top-Down View — Layer Architecture
- Request Flow — A Single Chat Turn
- Bottom-Up View — Package & Module Map
- The Six Canonical Services
- Extension Surfaces
- Data & State Model
- Reading Order — Suggested Path
- Glossary
What Victor Is¶
Victor (victor-ai) is a contract-first, service-first agentic AI framework
in Python 3.11+ for building autonomous agents that reason, call tools, execute
DAG workflows, and coordinate multi-agent teams across 24 LLM providers.
Three packages compose the ecosystem:
| Package | Role | Direction |
|---|---|---|
victor (this repo) |
Core runtime + framework | Depends on contracts |
victor-contracts |
Stable SDK protocols/types | Imported by everyone |
victor-coding … victor-invest |
External domain verticals | Import contracts only |
In one line:
User → Client → Agent API → AgentOrchestrator (facade) → 6 Services → Providers + Tools → Storage.
Authoritative depth lives in the System Architecture.
This blueprint is the map; that document is the territory.
Top-Down View — Layer Architecture¶
Victor is a strict four-layer stack. Each layer only depends on the layer below.
flowchart TB
subgraph L1["L1 — Client Surface"]
C1["CLI / TUI<br/>victor/ui/"]
C2["HTTP API<br/>victor/integrations/api/server.py"]
C3["MCP Server<br/>victor/integrations/mcp/"]
C4["VS Code<br/>vscode-victor/"]
end
subgraph L2["L2 — Framework API"]
F1["Agent<br/>victor/framework/agent.py"]
F2["StateGraph<br/>victor/framework/graph.py"]
F3["WorkflowEngine<br/>victor/framework/workflows/"]
F4["Tool Registry<br/>victor/framework/tools.py"]
end
subgraph L3["L3 — Runtime"]
R1["AgentOrchestrator Facade<br/>victor/agent/orchestrator.py"]
R2["6 Canonical Services<br/>victor/agent/services/"]
R3["AgenticLoop<br/>victor/framework/agentic_loop.py"]
R4["ExecutionContext<br/>victor/runtime/context.py"]
end
subgraph L4["L4 — Infrastructure"]
I1["Providers x 24<br/>victor/providers/"]
I2["Tools x 34 modules<br/>victor/tools/"]
I3["Teams / State<br/>victor/teams/ · victor/state/"]
I4["Database<br/>victor/core/database.py"]
I5["Config<br/>victor/config/settings.py"]
end
subgraph CT["victor-contracts (SDK)"]
CT1["Protocols & Types<br/>victor_contracts/"]
end
L1 -->|"VictorClient + SessionConfig"| L2
L2 -->|"AgentFactory.create()"| L3
L3 -->|"ExecutionContext.services"| L4
CT -.->|"imported by"| L2
CT -.->|"imported by"| L4
style L1 fill:#e0e7ff,stroke:#4f46e5,color:#1e1b4b
style L2 fill:#dbeafe,stroke:#3b82f6,color:#1e3a5f
style L3 fill:#d1fae5,stroke:#10b981,color:#064e3b
style L4 fill:#fef3c7,stroke:#f59e0b,color:#78350f
style CT fill:#f3e8ff,stroke:#a855f7,color:#3b0764
Layer rules (enforced by CI):
| Rule | Guard test |
|---|---|
L1 uses L2 only — never imports victor.agent.* |
tests/unit/framework/test_architectural_boundaries.py |
L2 delegates creation to AgentFactory |
victor/framework/agent_factory.py |
| L3 orchestrator is a facade — services own logic | tests/unit/runtime/test_service_layer_validation.py |
External verticals import victor_contracts only |
tests/unit/sdk/test_core_vertical_import_boundary.py |
Request Flow — A Single Chat Turn¶
How one prompt travels through the system — the most important diagram to
internalize first.
sequenceDiagram
autonumber
actor U as User
participant C as Client (CLI/API/MCP)
participant A as Agent (Framework)
participant F as AgentFactory
participant O as AgentOrchestrator
participant CS as ChatService
participant AL as AgenticLoop
participant PS as ProviderService to LLM
participant TS as ToolService to ToolPipeline
U->>C: prompt
C->>A: VictorClient.chat(prompt)
A->>F: Agent.create(session_config)
F->>O: bootstrap DI container + services
O-->>A: orchestrator ready
A->>CS: ChatService.process(messages)
CS->>AL: AgenticLoop.run()
loop PERCEIVE then PLAN then ACT then EVALUATE then DECIDE
AL->>PS: provider.chat(messages, tools)
PS-->>AL: response + tool_calls
AL->>TS: ToolPipeline.execute(tool_calls)
TS-->>AL: tool results
AL->>AL: FulfillmentDetector.decide()
end
AL-->>CS: final result
CS-->>A: Agent response
A-->>C: stream events
C-->>U: rendered output
The AgenticLoop is the canonical execution authority for chat — it runs
unconditionally. Each cycle:
flowchart LR
P([PERCEIVE]) --> PL([PLAN])
PL --> AC([ACT<br/>AgenticLoop + TurnExecutor])
AC --> EV([EVALUATE<br/>EvaluationNode])
EV --> D{DECIDE<br/>FulfillmentDetector}
D -->|complete| R([Return Result])
D -->|continue| P
D -->|retry| AC
style P fill:#dbeafe,stroke:#3b82f6
style PL fill:#e0e7ff,stroke:#6366f1
style AC fill:#d1fae5,stroke:#10b981
style EV fill:#fef3c7,stroke:#f59e0b
style D fill:#fce7f3,stroke:#ec4899
style R fill:#e0e7ff,stroke:#4f46e5
| Phase | Owner module |
|---|---|
| PERCEIVE | victor/framework/perception_integration.py |
| PLAN | victor/agent/task_analyzer.py |
| ACT | victor/framework/agentic_loop.py |
| EVALUATE | victor/framework/evaluation_nodes.py |
| DECIDE | victor/framework/fulfillment.py |
| Entry point | TurnExecutor.execute_agentic_loop() — victor/agent/services/turn_execution_runtime.py |
Bottom-Up View — Package & Module Map¶
Read this to find where any concern lives in the source tree.
flowchart TB
subgraph FW["victor/framework/ — Public API"]
agent["agent.py — run/stream/chat/run_workflow/run_team"]
graphf["graph.py — StateGraph (DAG engine)"]
agloop["agentic_loop.py — AgenticLoop"]
af["agent_factory.py — AgentFactory (single authority)"]
rl["rl/ — prompt optimization (GEPA, MiPROv2, CoT)"]
extf["extensions.py — extension surfaces"]
end
subgraph AG["victor/agent/ — Runtime"]
orc["orchestrator.py — Facade"]
svcs["services/ — 6 canonical + runtime helpers"]
conv["conversation/ — store, scoring, assembler"]
coord["coordinators/ — extracted coordinators"]
rt["runtime/ — ExecutionContext, boundary modules"]
end
subgraph INF["victor/ — Infrastructure"]
prov["providers/ — 24 BaseProvider subclasses"]
tools["tools/ — 34 modules · BaseTool"]
teams["teams/ — UnifiedTeamCoordinator, formations"]
statef["state/ — GlobalStateManager (4 scopes)"]
config["config/settings.py — 26+ config groups"]
core["core/ — DI container, database, CQRS, events"]
end
subgraph CT2["victor-contracts/ — SDK"]
ct["verticals/protocols/base.py — VerticalBase"]
plugins["core/plugins.py — VictorPlugin"]
skills["SkillDefinition · SkillProvider"]
end
subgraph EXT["External Verticals (separate repos)"]
ext1["victor-coding"]
ext2["victor-devops"]
ext3["victor-rag"]
ext4["victor-dataanalysis"]
ext5["victor-research"]
ext6["victor-invest"]
end
FW --> AG
AG --> INF
CT2 -.->|"imported by"| FW
CT2 -.->|"imported by"| AG
EXT -->|"imports only"| CT2
style FW fill:#dbeafe,stroke:#3b82f6,color:#1e3a5f
style AG fill:#d1fae5,stroke:#10b981,color:#064e3b
style INF fill:#fef3c7,stroke:#f59e0b,color:#78350f
style CT2 fill:#f3e8ff,stroke:#a855f7,color:#3b0764
style EXT fill:#fce7f3,stroke:#ec4899,color:#831843
Key entry points¶
| Component | Path | Role |
|---|---|---|
Agent |
victor/framework/agent.py |
Public API — run(), stream(), chat() |
StateGraph |
victor/framework/graph.py |
DAG workflow engine |
AgentFactory |
victor/framework/agent_factory.py |
Single authority for agent creation |
VictorClient |
victor/framework/client.py |
UI layer entry point |
AgentOrchestrator |
victor/agent/orchestrator.py |
Central facade (delegates, no logic) |
ChatService |
victor/agent/services/chat_service.py |
Primary chat entry |
ToolService |
victor/agent/services/tool_service.py |
Tool registration/execution |
BaseProvider |
victor/providers/base.py |
Abstract base for all 24 providers |
BaseTool |
victor/tools/base.py |
Foundation for all 55+ tools |
VerticalBase |
victor_contracts/verticals/protocols/base.py |
Core abstraction for 101+ plugins |
VictorAPIServer |
victor/integrations/api/server.py |
FastAPI REST endpoint |
The Six Canonical Services¶
The orchestrator is a facade — all effectful behavior is owned by exactly
six mandatory services (no feature flags, no fallbacks).
flowchart TB
O["AgentOrchestrator<br/>(facade — no logic)"]
O --> CS["ChatService<br/>Primary chat authority"]
O --> TS["ToolService<br/>Register · select · execute"]
O --> SS["SessionService<br/>Sessions · persistence"]
O --> CX["ContextService<br/>Context assembly · scoring"]
O --> PS["ProviderService<br/>Provider lifecycle · routing"]
O --> RS["RecoveryService<br/>Error recovery · retry"]
CS --> SvcLayer["ExecutionContext.services<br/>(lazy accessor)"]
TS --> SvcLayer
SS --> SvcLayer
CX --> SvcLayer
PS --> SvcLayer
RS --> SvcLayer
style O fill:#fef3c7,stroke:#f59e0b,color:#78350f
style CS fill:#d1fae5,stroke:#10b981,color:#064e3b
style TS fill:#d1fae5,stroke:#10b981,color:#064e3b
style SS fill:#d1fae5,stroke:#10b981,color:#064e3b
style CX fill:#d1fae5,stroke:#10b981,color:#064e3b
style PS fill:#d1fae5,stroke:#10b981,color:#064e3b
style RS fill:#d1fae5,stroke:#10b981,color:#064e3b
style SvcLayer fill:#e0e7ff,stroke:#4f46e5,color:#1e1b4b
| Service | Module | Owns |
|---|---|---|
ChatService |
victor/agent/services/chat_service.py |
Turn execution, AgenticLoop wiring |
ToolService |
victor/agent/services/tool_service.py |
Registration, semantic selection, budgets |
SessionService |
victor/agent/services/session_service.py |
Session lifecycle, persistence (canonical) |
ContextService |
victor/agent/services/context_service.py |
Context assembly, scoring, pruning |
ProviderService |
victor/agent/services/provider_service.py |
Provider lifecycle, caching, switching |
RecoveryService |
victor/agent/services/recovery_service.py |
Error recovery, loop-prevention |
Access pattern:
from victor.runtime.context import ExecutionContext
ctx = ExecutionContext(settings=settings)
ctx.services.chat # ChatService
ctx.services.tool # ToolService
ctx.services.provider # ProviderService
UI layer rule: must go through
VictorClient+SessionConfig— never
importAgentOrchestratororAgentFactorydirectly.
Extension Surfaces¶
Three orthogonal, complementary mechanisms — not duplicates.
flowchart LR
EP["victor.plugins entry point"] -->|"register(context)"| VP["VictorPlugin<br/>Bootstrap registrar"]
VP -->|"context.register_vertical()"| VB["VerticalBase<br/>Config template (classmethods)"]
VB -->|"get_extensions()"| VE["VerticalExtensions<br/>Runtime service (lazy)"]
subgraph Also["Independent extension points"]
BP["BaseProvider subclass"]
BT["BaseTool subclass"]
WF["YAML DSL / StateGraph"]
MW["Pre/post middleware hooks"]
end
VP -.->|"can also register"| Also
style VP fill:#6366f1,color:#fff
style VB fill:#10b981,color:#fff
style VE fill:#f59e0b,color:#fff
style Also fill:#e0e7ff,stroke:#4f46e5,color:#1e1b4b
| Mechanism | Role | Location |
|---|---|---|
Plugin (VictorPlugin) |
Bootstrap registrar — discovered via victor.plugins entry point |
victor_contracts/core/plugins.py |
Vertical (VerticalBase) |
Configuration template — tools, prompts, stages | victor_contracts/verticals/protocols/base.py |
Extension (VerticalExtensions) |
Runtime service — middleware, safety, prompts | victor_contracts/verticals/extensions.py |
Provider (BaseProvider) |
LLM adapter | victor/providers/ |
Tool (BaseTool) |
Tool implementation | victor/tools/ |
Rule: External verticals import victor_contracts or
victor.framework.extensions only — never victor.agent.*.
Data & State Model¶
Victor uses a two-database architecture plus a four-scope state model.
erDiagram
USER ||--o{ PROJECT_DB : "owns many"
USER ||--|| GLOBAL_DB : "has one"
GLOBAL_DB {
string settings
string api_keys
string rl_outcomes
string rl_q_values
string team_stats
string tui_sessions
string failed_signatures
}
PROJECT_DB {
string graph_nodes
string graph_edges
string conversations
string messages
string sessions
string entity_memory
string change_tracking
}
| Database | Path | Contents |
|---|---|---|
| Global | ~/.victor/victor.db |
Settings, API keys, RL data, team stats, TUI sessions |
| Project | ./.victor/project.db |
Graph, conversations, sessions, cache, change tracking |
flowchart TB
GSM["GlobalStateManager<br/>victor/state/"]
GSM --> WF["WORKFLOW<br/>per-execution"]
GSM --> CONV["CONVERSATION<br/>per-conversation"]
GSM --> TM["TEAM<br/>multi-agent shared"]
GSM --> GLB["GLOBAL<br/>cross-session persistent"]
style GSM fill:#6366f1,color:#fff
style WF fill:#dbeafe,stroke:#3b82f6
style CONV fill:#d1fae5,stroke:#10b981
style TM fill:#fef3c7,stroke:#f59e0b
style GLB fill:#fce7f3,stroke:#ec4899
Reading Order — Suggested Path¶
New to the codebase? Read in this order:
flowchart LR
A["1. This Blueprint"] --> B["2. System Architecture"]
B --> C["3. Features Catalog"]
C --> D["4. Tech Stack"]
D --> E["5. Roadmap"]
E --> F["6. Deep-dives"]
style A fill:#e0e7ff,stroke:#4f46e5,color:#1e1b4b
style B fill:#dbeafe,stroke:#3b82f6,color:#1e3a5f
style C fill:#d1fae5,stroke:#10b981,color:#064e3b
style D fill:#fef3c7,stroke:#f59e0b,color:#78350f
style E fill:#fce7f3,stroke:#ec4899,color:#831843
style F fill:#f3e8ff,stroke:#a855f7,color:#3b0764
| Step | Document | Purpose |
|---|---|---|
| 1 | Master Blueprint (this page) | 10-minute mental model |
| 2 | System Architecture | Canonical, full-depth reference |
| 3 | Features Catalog | What's implemented, grounded in modules |
| 4 | Tech Stack | Dependencies + technical debt register |
| 5 | Roadmap | Priorities, horizons, feature status |
| 6 | Deep-dives | Orchestrator decomposition, SDK boundary, State-passed architecture, Streaming pipeline |
Glossary¶
| Term | Meaning |
|---|---|
| Facade | AgentOrchestrator — delegates all requests; contains no business logic |
| Canonical service | One of the 6 mandatory effectful owners (Chat, Tool, Session, Context, Provider, Recovery) |
| AgenticLoop | The PERCEIVE→PLAN→ACT→EVALUATE→DECIDE cycle; canonical chat execution authority |
| Vertical | A domain configuration template (VerticalBase) — tools, prompts, stages |
| Contract | A stable type/protocol in victor-contracts (independent semver) |
| StateGraph | The DAG execution engine — also the foundation for multi-agent teams |
| SessionConfig | Immutable runtime-override object — the only sanctioned settings mutation point |
| Global DB | ~/.victor/victor.db — user-wide data (settings, RL, team stats) |
| Project DB | ./.victor/project.db — repo-scoped data (graph, conversations, sessions) |
| KV caching | Local-provider optimization: frozen system prompt + deterministic tool ordering |
Next: Read the System Architecture for full depth,
or the Features Catalog for what's implemented.