Vertical Development Quickstart
Create domain-specific AI assistants for Victor.
What Are Verticals?
Verticals are domain-specialized configurations that define:
- Tools - Which capabilities the assistant can use
- Prompts - Domain expertise and behavioral guidelines
- Workflows - Multi-step processes for complex tasks
Built-in Verticals
| Vertical |
Tools |
Use Case |
| coding |
30+ |
Code analysis, refactoring, testing |
| research |
9 |
Web search, synthesis, citations |
| devops |
13 |
Docker, CI/CD, infrastructure |
| data_analysis |
11 |
Pandas, visualization, statistics |
| rag |
10 |
Document retrieval, vector search |
Quick Start
1. Define an SDK-First Vertical
# my_vertical/assistant.py
from victor_contracts import ToolNames, ToolRequirement, VerticalBase, register_vertical
@register_vertical(
name="my-vertical",
version="0.1.0",
min_framework_version=">=0.6.0",
plugin_namespace="my_vertical",
)
class MyVertical(VerticalBase):
name = "my_vertical"
description = "Domain-specific assistant"
version = "0.1.0"
@classmethod
def get_name(cls) -> str:
return cls.name
@classmethod
def get_description(cls) -> str:
return cls.description
@classmethod
def get_tool_requirements(cls) -> list[ToolRequirement]:
return [
ToolRequirement(ToolNames.READ, purpose="inspect project files"),
ToolRequirement(ToolNames.WRITE, required=False, purpose="apply changes"),
ToolRequirement(ToolNames.SHELL, required=False, purpose="run checks"),
]
@classmethod
def get_tools(cls) -> list[str]:
return [requirement.tool_name for requirement in cls.get_tool_requirements()]
@classmethod
def get_system_prompt(cls) -> str:
return "You are an expert in..."
2. Add a Thin Plugin Wrapper
# my_vertical/__init__.py
from victor_contracts import PluginContext, VictorPlugin
from my_vertical.assistant import MyVertical
class MyVerticalPlugin(VictorPlugin):
@property
def name(self) -> str:
return "my-vertical"
def register(self, context: PluginContext) -> None:
context.register_vertical(MyVertical)
3. Publish the Canonical Entry Point
# pyproject.toml
[project.entry-points."victor.plugins"]
my-vertical = "my_vertical:plugin"
4. Install and Use
pip install -e .
victor chat --vertical my_vertical
Vertical Architecture
flowchart TB
VB["VerticalBase (Abstract)"] --> COD["Coding"]
VB --> RES["Research"]
VB --> DEV["DevOps"]
VB --> DAT["Data Analysis"]
VB --> RAG["RAG"]
VB --> CUSTOM["Your Vertical"]
VB -->|Required| TOOLS["get_tools()"]
VB -->|Required| PROMPT["get_system_prompt()"]
VB -->|Optional| STAGES["get_stages()"]
VB -->|Optional| WORKFLOWS["get_workflow_provider()"]
VB -->|Optional| EXT["get_extensions()"]
style VB fill:#e0e7ff,stroke:#4f46e5
style CUSTOM fill:#d1fae5,stroke:#10b981
Extension Points
| Method |
Protocol |
Purpose |
get_middleware() |
MiddlewareProtocol |
Tool execution hooks |
get_safety_extension() |
SafetyExtensionProtocol |
Dangerous operations |
get_workflow_provider() |
WorkflowProviderProtocol |
YAML workflows |
get_team_specs() |
TeamSpecProviderProtocol |
Multi-agent teams |
get_prompt_contributor() |
PromptContributorProtocol |
Task-type hints |
Common Patterns
Single-Stage Vertical
class SimpleVertical(VerticalBase):
def get_stages(cls):
return {"SIMPLE": StageDefinition(
name="SIMPLE",
description="Simple single-stage workflow",
tools={"read", "write"},
keywords=[],
next_stages=set(),
)}
Multi-Stage Vertical
stateDiagram-v2
[*] --> INITIAL
INITIAL --> RECONNAISSANCE
RECONNAISSANCE --> ANALYSIS
ANALYSIS --> REMEDIATION
REMEDIATION --> VERIFICATION
VERIFICATION --> REPORTING
REPORTING --> [*]
YAML Workflow
# victor/myvertical/workflows/task.yaml
workflows:
task_workflow:
nodes:
- id: analyze
type: agent
role: analyst
goal: "Analyze the request"
next: [execute]
- id: execute
type: compute
handler: my_handler
next: []
| Tool Category |
Tools |
Use Case |
| Filesystem |
read, write, edit, grep |
File operations |
| Search |
code_search, symbol, refs |
Code navigation |
| Git |
git_status, git_log, git_commit |
Version control |
| Shell |
shell, python |
Execution |
| Web |
web_search, web_fetch |
Network requests |
Testing Checklist
External Packages
External packages should publish a VictorPlugin under the canonical
victor.plugins entry-point group:
# pyproject.toml
[project.entry-points."victor.plugins"]
myvertical = "victor_myvertical:plugin"
Reference