Initial commit: Air Agent Framework v2:全双工对话智能体(打断、插话、主动开口)

This commit is contained in:
WpyQwq
2026-09-19 12:09:51 +08:00
commit fa0cb5824d
26 changed files with 2362 additions and 0 deletions
+59
View File
@@ -0,0 +1,59 @@
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)