79 lines
2.6 KiB
Python
Executable File
79 lines
2.6 KiB
Python
Executable File
from datetime import datetime
|
|
from pathlib import Path
|
|
|
|
from gfa_core.mas.agents.conversation_tools import (
|
|
ConversationToolRegistry,
|
|
build_plantai_conversation_tools,
|
|
)
|
|
from gfa_core.mas.agents.router_runtime import RouterRuntime
|
|
from gfa_core.mas.llm import LLMManager
|
|
from gfa_core.project_paths import PROJECT_ROOT
|
|
|
|
from .base import AgentMessage, AgentState, BaseAgent, QueryMode
|
|
|
|
|
|
class RouterAgent(BaseAgent):
|
|
name = "router"
|
|
role = "Intent Router"
|
|
|
|
_LEGACY_MODES = {
|
|
"reply": QueryMode.FAQ,
|
|
"clarify": QueryMode.CONSULTATION,
|
|
"show_result": QueryMode.INTERPRETATION,
|
|
"propose_analysis": QueryMode.ANALYSIS,
|
|
"propose_utility": QueryMode.CONSULTATION,
|
|
}
|
|
|
|
def __init__(
|
|
self,
|
|
llm_manager: LLMManager,
|
|
tools: ConversationToolRegistry | None = None,
|
|
project_root: Path = PROJECT_ROOT,
|
|
) -> None:
|
|
super().__init__(llm_manager)
|
|
self.tools = tools
|
|
if self.tools is None:
|
|
self.tools = build_plantai_conversation_tools(
|
|
llm_manager=llm_manager,
|
|
project_root=Path(project_root),
|
|
)
|
|
self.runtime = RouterRuntime(llm_manager, self.tools)
|
|
|
|
async def execute(self, state: AgentState, message: AgentMessage) -> AgentState:
|
|
payload = message.payload
|
|
if "history" in payload:
|
|
history = list(payload.get("history") or [])
|
|
else:
|
|
history = [
|
|
{"role": item.get("role"), "content": item.get("content", "")}
|
|
for item in state.messages
|
|
if isinstance(item, dict) and item.get("role") in {"user", "assistant"}
|
|
][-10:]
|
|
runtime_context = {
|
|
"query": str(payload.get("query") or ""),
|
|
"history": history,
|
|
"session_id": str(payload.get("session_id") or state.session_id),
|
|
"job_id": str(payload.get("job_id") or state.job_id),
|
|
"language": str(payload.get("language") or "zh"),
|
|
}
|
|
if "goal_ledger" in payload:
|
|
runtime_context["goal_ledger"] = payload.get("goal_ledger")
|
|
outcome = await self.runtime.run(
|
|
**runtime_context,
|
|
)
|
|
|
|
state.results["router_outcome"] = outcome.model_dump()
|
|
state.mode = (
|
|
self._LEGACY_MODES.get(outcome.action, QueryMode.FAQ)
|
|
if outcome.status == "ok"
|
|
else QueryMode.FAQ
|
|
)
|
|
state.updated_at = datetime.now()
|
|
state.messages.append(
|
|
{
|
|
"role": "router",
|
|
"content": f"status={outcome.status}; action={outcome.action or 'none'}",
|
|
}
|
|
)
|
|
return state
|