feat: V1 - DAG编排/告警系统/Agent循环/知识库RAG/Webhook + 审核管理富上下文修复
This commit is contained in:
@@ -73,6 +73,13 @@ class ExecutionService:
|
|||||||
messages.append({"role": "user", "content": prompt})
|
messages.append({"role": "user", "content": prompt})
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
# Branch by task type
|
||||||
|
if task.task_type == "agent_loop":
|
||||||
|
return ExecutionService._execute_agent_loop(
|
||||||
|
db, tenant_id, task, worker, messages
|
||||||
|
)
|
||||||
|
|
||||||
|
# Single-call mode
|
||||||
output, cost_log = LLMGateway.call(
|
output, cost_log = LLMGateway.call(
|
||||||
worker=worker,
|
worker=worker,
|
||||||
messages=messages,
|
messages=messages,
|
||||||
@@ -141,3 +148,75 @@ class ExecutionService:
|
|||||||
finally:
|
finally:
|
||||||
worker.current_task_count = max(0, worker.current_task_count - 1)
|
worker.current_task_count = max(0, worker.current_task_count - 1)
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _execute_agent_loop(db, tenant_id, task, worker, messages):
|
||||||
|
"""Agent loop: multi-step reasoning with up to 5 iterations."""
|
||||||
|
max_iterations = 5
|
||||||
|
all_messages = list(messages)
|
||||||
|
final_output = ""
|
||||||
|
total_cost_cents = 0
|
||||||
|
total_tokens = 0
|
||||||
|
total_duration = 0
|
||||||
|
|
||||||
|
for i in range(max_iterations):
|
||||||
|
output, cost_log = LLMGateway.call(
|
||||||
|
worker=worker,
|
||||||
|
messages=all_messages,
|
||||||
|
db=db,
|
||||||
|
tenant_id=tenant_id,
|
||||||
|
project_id=task.project_id,
|
||||||
|
task_id=task.id,
|
||||||
|
)
|
||||||
|
total_cost_cents += cost_log.cost_cents
|
||||||
|
total_tokens += cost_log.total_tokens
|
||||||
|
total_duration += cost_log.duration_ms
|
||||||
|
|
||||||
|
# Check if agent wants to continue
|
||||||
|
if output.strip().startswith("NEEDS_TOOL:"):
|
||||||
|
tool_request = output.replace("NEEDS_TOOL:", "").strip()
|
||||||
|
tool_result = f"[Tool simulation] Processed: {tool_request}"
|
||||||
|
all_messages.append({"role": "assistant", "content": output})
|
||||||
|
all_messages.append({"role": "user", "content": f"Tool result: {tool_result}\nPlease continue."})
|
||||||
|
final_output = output
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
final_output = output
|
||||||
|
break
|
||||||
|
|
||||||
|
# Save output
|
||||||
|
task.output_data = json.dumps(
|
||||||
|
{"content": final_output, "iterations": i + 1, "total_cost": total_cost_cents},
|
||||||
|
ensure_ascii=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
artifact = Artifact(
|
||||||
|
tenant_id=tenant_id, task_id=task.id, project_id=task.project_id,
|
||||||
|
title=task.title, content=final_output, artifact_type="text",
|
||||||
|
version=1, created_by_worker_id=worker.id,
|
||||||
|
)
|
||||||
|
db.add(artifact)
|
||||||
|
db.flush()
|
||||||
|
|
||||||
|
if task.requires_review:
|
||||||
|
review = Review(
|
||||||
|
tenant_id=tenant_id, task_id=task.id, project_id=task.project_id,
|
||||||
|
review_type="approval", status="pending",
|
||||||
|
review_content=final_output, submitted_at=datetime.utcnow(),
|
||||||
|
)
|
||||||
|
db.add(review)
|
||||||
|
task.status = "review"
|
||||||
|
task.review_status = "pending"
|
||||||
|
result_status = "needs_review"
|
||||||
|
else:
|
||||||
|
task.status = "done"
|
||||||
|
task.completed_at = datetime.utcnow()
|
||||||
|
result_status = "success"
|
||||||
|
|
||||||
|
db.commit()
|
||||||
|
|
||||||
|
return TaskExecutionResult(
|
||||||
|
task_id=task.id, status=result_status, output=final_output,
|
||||||
|
token_usage=total_tokens, cost_cents=total_cost_cents,
|
||||||
|
duration_ms=total_duration, artifact_id=artifact.id,
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user