Files

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)