40 lines
1.5 KiB
Python
40 lines
1.5 KiB
Python
import time
|
|
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.models import Agent, AgentTeam, CollaborationRun
|
|
from app.services.llm import LLMService
|
|
|
|
|
|
class CollaborationService:
|
|
def __init__(self, db: AsyncSession):
|
|
self.db = db
|
|
self.llm = LLMService(db)
|
|
|
|
async def run(self, team: AgentTeam, task: str) -> CollaborationRun:
|
|
started = time.time()
|
|
run = CollaborationRun(team_id=team.id, task=task, status="running", messages=[], final_answer="")
|
|
self.db.add(run)
|
|
await self.db.flush()
|
|
|
|
messages = []
|
|
context = task
|
|
for member in team.members or []:
|
|
agent_id = member.get("agent_id")
|
|
role = member.get("role", "member")
|
|
agent = await self.db.get(Agent, agent_id) if agent_id else None
|
|
if not agent:
|
|
content = f"{role}: 未配置有效智能体,跳过。"
|
|
else:
|
|
content = await self.llm.complete(agent, f"你的协作角色是 {role}。请基于上下文完成任务:{context}")
|
|
messages.append({"role": role, "agent_id": agent_id, "agent_name": agent.name if agent else "", "content": content})
|
|
context = f"{context}\n\n[{role}] {content}"
|
|
|
|
run.messages = messages
|
|
run.final_answer = messages[-1]["content"] if messages else "团队暂无成员,无法执行协作任务。"
|
|
run.status = "completed"
|
|
run.elapsed_time = int((time.time() - started) * 1000)
|
|
await self.db.commit()
|
|
await self.db.refresh(run)
|
|
return run
|