fischer-agentkit/src/agentkit/orchestrator/pipeline_schema.py

125 lines
3.9 KiB
Python

"""Pipeline 数据模型"""
from enum import Enum
from typing import Literal
from pydantic import BaseModel, Field
from agentkit.orchestrator.retry import StepRetryPolicy
class StageStatus(str, Enum):
PENDING = "pending"
RUNNING = "running"
COMPLETED = "completed"
FAILED = "failed"
SKIPPED = "skipped"
class ReviewIssue(BaseModel):
"""单条审查问题"""
severity: Literal["critical", "major", "minor"] = Field(description="问题严重程度")
category: Literal["logic_error", "security", "style", "test_failure", "architecture"] = Field(
description="问题类别"
)
description: str = Field(min_length=1, description="问题描述")
location: str | None = Field(default=None, description="文件路径/行号")
suggestion: str | None = Field(default=None, description="修复建议")
class ReviewFeedback(BaseModel):
"""Verifier 返回的结构化审查反馈"""
passed: bool = Field(description="是否通过审查")
issues: list[ReviewIssue] = Field(default_factory=list, description="问题列表")
summary: str = Field(min_length=1, description="自然语言审查报告")
score: float = Field(ge=0.0, le=1.0, description="质量评分 (0-1)")
class AdversarialState(BaseModel):
"""对抗轮次状态追踪"""
current_round: int = Field(default=0, description="当前对抗轮次")
max_rounds: int = Field(default=3, description="最大对抗轮次")
feedback_history: list[ReviewFeedback] = Field(default_factory=list, description="反馈历史")
last_feedback: ReviewFeedback | None = Field(default=None, description="最后一次反馈")
class PipelineStage(BaseModel):
name: str
agent: str
action: str
depends_on: list[str] = []
inputs: dict[str, object] = {}
outputs: list[str] = []
timeout_seconds: int = 300
retry_count: int = 0
continue_on_failure: bool = False
condition: str | None = None
retry_policy: StepRetryPolicy | None = None
compensate: str | None = None
# 对抗闭环相关字段
verifier: str | None = Field(
default=None, description="Verifier Agent 名称,配置后启用对抗模式"
)
max_adversarial_rounds: int = Field(default=3, description="最大对抗轮次")
verifier_timeout_seconds: int = Field(
default=120,
description="Verifier Agent 独立超时时间(秒),避免与 Worker 共享 timeout_seconds",
)
feedback_mode: Literal["structured+natural", "structured", "natural"] = Field(
default="structured+natural", description="反馈模式"
)
escalate_on_exhaust: str | None = Field(default=None, description="对抗轮次耗尽后的升级目标")
model_config = {"arbitrary_types_allowed": True}
class Pipeline(BaseModel):
name: str
version: str
description: str
stages: list[PipelineStage]
variables: dict[str, object] = {}
class StageResult(BaseModel):
stage_name: str
status: StageStatus = StageStatus.PENDING
output_data: dict[str, object] | None = None
error_message: str | None = None
started_at: str | None = None
completed_at: str | None = None
class PipelineResult(BaseModel):
pipeline_name: str
status: StageStatus = StageStatus.PENDING
stage_results: dict[str, StageResult] = {}
variables: dict[str, object] = {}
error_message: str | None = None
metadata: dict[str, object] = {}
class AdaptiveConfig(BaseModel):
"""Configuration for adaptive pipeline execution with reflection-replanning."""
enabled: bool = False
max_reflections: int = 3
reflection_model: str = "default"
skip_stages: list[str] = []
model_config = {"arbitrary_types_allowed": True}
class ReflectionReport(BaseModel):
"""Structured report from pipeline reflection analysis."""
failure_type: str # input_error, resource_error, logic_error, timeout
root_cause: str
suggested_fix: str
failed_stage: str
reflection_number: int = 1