Add scoped Agent-mode pipeline as experimental Classic fork.
Wire specialist waves, Brain consolidation, and Classic-compatible reports so Agent mode can run end-to-end via OpenRouter without changing the default Classic path. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
"""Summary-only drawing-set completeness agent."""
|
||||
|
||||
import json
|
||||
from typing import Dict, List
|
||||
|
||||
from backend import config
|
||||
from backend.agents.base import AgentResult, AgentScope, AgentUsage, failure
|
||||
from backend.agents.prompts import COMPLETENESS_SYSTEM_PROMPT, COMPLETENESS_USER_PROMPT
|
||||
from backend.llm import call_json
|
||||
from backend.pipeline._stage import collect_list, validate_issue
|
||||
|
||||
|
||||
def build_sheet_summaries(sheets: List[Dict]) -> List[Dict]:
|
||||
"""Return counts and classifications only; never raw assertions."""
|
||||
return [{
|
||||
"sheet_number": sheet.get("sheet_number"),
|
||||
"sheet_title": sheet.get("sheet_title"),
|
||||
"discipline": sheet.get("discipline"),
|
||||
"drawing_type": sheet.get("drawing_type"),
|
||||
"level": sheet.get("level"),
|
||||
"assertion_count": len(sheet.get("assertions") or []),
|
||||
"unresolved_count": len(sheet.get("unresolved_items") or []),
|
||||
} for sheet in sheets]
|
||||
|
||||
|
||||
class CompletenessAgent:
|
||||
name = "completeness"
|
||||
|
||||
def __init__(self, usage: AgentUsage) -> None:
|
||||
self.usage = usage
|
||||
|
||||
def run(self, scope: AgentScope) -> AgentResult:
|
||||
try:
|
||||
instruction = COMPLETENESS_USER_PROMPT
|
||||
for key in ("sheet_index", "sheet_summaries", "cluster_summary"):
|
||||
instruction = instruction.replace(
|
||||
"{" + key + "}",
|
||||
json.dumps(scope.payload.get(key) or {}, ensure_ascii=True),
|
||||
)
|
||||
parsed = call_json(
|
||||
system_prompt=COMPLETENESS_SYSTEM_PROMPT,
|
||||
user_text=instruction,
|
||||
max_tokens=config.QAQC_MAX_TOKENS,
|
||||
model=config.AGENT_COMPLETENESS_MODEL,
|
||||
usage_tracker=self.usage,
|
||||
usage_stage="agent.completeness",
|
||||
)
|
||||
findings = collect_list(
|
||||
parsed, "issues", lambda item: validate_issue(item, "qaqc")
|
||||
)
|
||||
for finding in findings:
|
||||
finding.update(agent=self.name, scope_id=scope.scope_id)
|
||||
return AgentResult(scope_id=scope.scope_id, artifacts=findings)
|
||||
except Exception as exc:
|
||||
return failure(scope, exc)
|
||||
Reference in New Issue
Block a user