60 lines
1.9 KiB
Python
60 lines
1.9 KiB
Python
from __future__ import annotations
|
|
from enum import Enum
|
|
|
|
from .kernel import EventBus, Event, EventType, AgentRuntime
|
|
from .llm import LLMClient
|
|
from .personality import Personality
|
|
from .conversation import ConversationManager
|
|
from .interruption import InterruptionEngine
|
|
from .thinker import Thinker
|
|
|
|
|
|
class AgentState(Enum):
|
|
IDLE = "idle"
|
|
THINKING = "thinking"
|
|
RESPONDING = "responding"
|
|
QUESTIONING = "questioning"
|
|
WAITING_INPUT = "waiting_input"
|
|
|
|
|
|
class Orchestrator:
|
|
def __init__(
|
|
self,
|
|
runtime: AgentRuntime,
|
|
llm: LLMClient,
|
|
personality: Personality,
|
|
conversation: ConversationManager,
|
|
interruption: InterruptionEngine,
|
|
thinker: Thinker,
|
|
):
|
|
self.runtime = runtime
|
|
self.bus = runtime.bus
|
|
self.llm = llm
|
|
self.personality = personality
|
|
self.conversation = conversation
|
|
self.interruption = interruption
|
|
self.thinker = thinker
|
|
self.state = AgentState.IDLE
|
|
self._response_task = None
|
|
|
|
async def generate_response(self, messages: list[dict]) -> str:
|
|
system_prompt = self.personality.build_system_prompt()
|
|
full = [{"role": "system", "content": system_prompt}] + messages
|
|
resp = await self.llm.chat(full, stream=False)
|
|
return resp.content
|
|
|
|
async def stream_response(self, messages: list[dict]) -> str:
|
|
system_prompt = self.personality.build_system_prompt()
|
|
full = [{"role": "system", "content": system_prompt}] + messages
|
|
full_text = ""
|
|
async for chunk in self.llm.chat_stream_iter(full):
|
|
full_text += chunk
|
|
await self.bus.emit(Event(
|
|
EventType.AGENT_STREAM_CHUNK,
|
|
{"chunk": chunk, "full": full_text},
|
|
))
|
|
return full_text
|
|
|
|
async def generate_single_response(self, messages: list[dict]) -> str:
|
|
return await self.generate_response(messages)
|