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,42 @@
|
||||
"""One-finding-per-call RFI writers."""
|
||||
|
||||
from backend import config
|
||||
from backend.agents.base import AgentResult, AgentScope, AgentUsage, failure
|
||||
from backend.llm import call_json
|
||||
from backend.pipeline._serialize import dumps
|
||||
from backend.pipeline.rfi import _valid_rfi
|
||||
from backend.prompts import RFI_SYSTEM_PROMPT, RFI_USER_INSTRUCTION
|
||||
|
||||
|
||||
class RFIWriterAgent:
|
||||
name = "rfi_writer"
|
||||
|
||||
def __init__(self, usage: AgentUsage) -> None:
|
||||
self.usage = usage
|
||||
|
||||
def run(self, scope: AgentScope) -> AgentResult:
|
||||
try:
|
||||
finding = scope.payload["finding"]
|
||||
instruction = RFI_USER_INSTRUCTION.replace(
|
||||
"{prioritized_issues}", dumps([finding])
|
||||
)
|
||||
parsed = call_json(
|
||||
system_prompt=RFI_SYSTEM_PROMPT,
|
||||
user_text=instruction,
|
||||
max_tokens=config.RFI_MAX_TOKENS,
|
||||
model=config.AGENT_RFI_MODEL,
|
||||
usage_tracker=self.usage,
|
||||
usage_stage="agent.rfi",
|
||||
)
|
||||
candidates = parsed if isinstance(parsed, list) else (
|
||||
parsed.get("rfi_comments") if isinstance(parsed, dict) else []
|
||||
)
|
||||
rfis = []
|
||||
for candidate in candidates or []:
|
||||
rfi = _valid_rfi(candidate)
|
||||
if rfi:
|
||||
rfi["issue_id"] = rfi.get("issue_id") or finding.get("issue_id")
|
||||
rfis.append(rfi)
|
||||
return AgentResult(scope_id=scope.scope_id, artifacts=rfis[:1])
|
||||
except Exception as exc:
|
||||
return failure(scope, exc)
|
||||
Reference in New Issue
Block a user