Technical Schema: GoalDefinition, NodeDef, and GraphTopology
April 26, 2026 ยท View on GitHub
Arachne uses a structured schema for defining and executing tasks, implemented using Pydantic.
GoalDefinition
The input schema for the system.
class GoalDefinition(BaseModel):
objective: str
success_criteria: list[str] = []
constraints: list[Constraint] = []
Constraint
class ConstraintType(StrEnum):
COST = "cost"
TIME = "time"
SAFETY = "safety"
QUALITY = "quality"
class Constraint(BaseModel):
type: ConstraintType
value: float | None = None
description: str
is_hard_boundary: bool = False
NodeDef
Defines an individual task within the execution graph.
class NodeRole(StrEnum):
CHAIN_OF_THOUGHT = "chain_of_thought"
REACT = "react"
PREDICT = "predict"
HUMAN_IN_LOOP = "human_in_loop"
RECURSIVE = "recursive"
class QuestionType(StrEnum):
TEXT = "text"
SELECT = "select"
CONFIRM = "confirm"
class Question(BaseModel):
query: str
type: QuestionType = QuestionType.TEXT
default: str = ""
choices: list[str] = []
class ToolParameter(BaseModel):
name: str
type: str = "str"
description: str = ""
required: bool = True
class ToolDef(BaseModel):
name: str
description: str
parameters: list[ToolParameter] = []
class NodeDef(BaseModel):
id: str
role: NodeRole
name: str
description: str
inputs: list[str] = []
output: str
depends_on: list[str] = []
max_tokens: int = 4096
timeout: int | None = None
tools: list[ToolDef] = []
mcp_servers: list[str] = []
skills: list[str] = []
question: Question | None = None
EdgeDef
class EdgeDef(BaseModel):
source: str
target: str
label: str = ""
GraphTopology
The complete execution graph generated by the Weaver.
class CustomToolRequest(BaseModel):
name: str
description: str
code: str
class CustomSkillRequest(BaseModel):
name: str
description: str
content: str
class GraphTopology(BaseModel):
name: str
objective: str
nodes: list[NodeDef] = []
edges: list[EdgeDef] = []
runtime_inputs: list[str] = []
custom_tools: list[CustomToolRequest] = []
custom_skills: list[CustomSkillRequest] = []
ResultStatus
class ResultStatus(StrEnum):
COMPLETED = "completed"
FAILED = "failed"
PAUSED = "paused"
SKIPPED = "skipped"
NodeResult
class NodeResult(BaseModel):
node_id: str
status: ResultStatus = ResultStatus.COMPLETED
output: dict = {}
error: str | None = None
cost_usd: float = 0.0
tokens_used: int = 0
duration_seconds: float = 0.0
RunResult
class RunResult(BaseModel):
graph_name: str
goal: str
node_results: list[NodeResult] = []
total_cost_usd: float = 0.0
total_tokens: int = 0
duration_seconds: float = 0.0
attempts: int = 1
success: bool = True
evaluation_source: str = "none"
confidence_score: float = 1.0
FailureReport
class FailureReport(BaseModel):
goal: str
attempt: int
failed_nodes: list[str] = []
error_details: dict[str, str] = {}
partial_results: dict[str, dict] = {}
diagnosis: str = ""
topology_fix: str = ""
confidence_score: float = 1.0
evaluation_source: str = "none"
requires_human: bool = False
evaluation_details: dict[str, object] = {}