Files
workphone-sdk/sdk/app/agent/skill_bus.py
卡若 9118df9eee
Some checks failed
SDK CI / python-compile (push) Has been cancelled
feat: sdk agent、Android 与文档同步至 Gitea
- 新增 sdk/app/agent(Hook/Skills/Anti-ban 等)及 NAS/ADB 脚本
- 更新 Android 端、unified、PHP SDK、Docker Compose
- Soul 文档迁移至 Soul调研/;移除资料目录内 APK
- .gitignore 排除 sdk/tmp、sdk/logs、sdk/tmp_rom

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-06 18:20:14 +08:00

69 lines
2.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Skill 聊天总线 - 各 Skill 一起执行时的共享聊天与交互
"""
import time
import logging
from typing import Dict, Any, List, Optional
logger = logging.getLogger(__name__)
class SkillChatBus:
"""Skill 间共享消息总线,同一轮执行内可读写"""
def __init__(self):
self._messages: List[Dict[str, Any]] = []
self._session_id: Optional[str] = None
def clear(self, session_id: str = None):
"""清空当前会话,开始新一轮(如新一条自然语言命令)"""
self._messages.clear()
self._session_id = session_id or str(int(time.time() * 1000))
def append(
self,
from_skill: str,
message: str,
to_skill: Optional[str] = None,
data: Optional[Dict[str, Any]] = None,
):
"""Skill 或执行器发一条消息,其它 Skill 可读"""
self._messages.append({
"from_skill": from_skill,
"to_skill": to_skill,
"message": message,
"data": data or {},
"ts": time.time(),
"index": len(self._messages),
})
logger.debug(f"[SkillBus] {from_skill} -> {to_skill or 'all'}: {message[:50]}")
def get_messages(
self,
since_index: int = 0,
from_skill: Optional[str] = None,
to_skill: Optional[str] = None,
) -> List[Dict[str, Any]]:
"""取消息列表,可按发送方/接收方过滤"""
out = []
for m in self._messages:
if m["index"] < since_index:
continue
if from_skill and m.get("from_skill") != from_skill:
continue
if to_skill and m.get("to_skill") and m.get("to_skill") != to_skill:
continue
out.append(m)
return out
def get_last(self, from_skill: Optional[str] = None) -> Optional[Dict[str, Any]]:
"""取最后一条(可选指定来自哪个 Skill"""
for m in reversed(self._messages):
if from_skill is None or m.get("from_skill") == from_skill:
return m
return None
def session_id(self) -> Optional[str]:
return self._session_id