- 新增小红书前端模块(启动服务、内容分析、爆款创作、发布记录、技能卡片、拟人设置、AI 助手) - 新增 xhs-agent-desktop 独立桌面 Agent,对接 OMS 任务调度 - 登录页重构,整合微信登录与 OMS JWT 认证 - 订单、渠道、用户中心等页面与 API 增强 Co-authored-by: Cursor <cursoragent@cursor.com>
93 lines
2.8 KiB
Python
93 lines
2.8 KiB
Python
"""后台 Agent 主循环(QThread)。"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import logging
|
||
import threading
|
||
|
||
from PyQt6.QtCore import QThread, pyqtSignal
|
||
|
||
from app.config_store import AgentSettings
|
||
from app.engine_path import ensure_runtime_importable
|
||
from app.oms_agent_runner import run_agent_loop
|
||
from app.oms_client import OmsAgentClient
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
class AgentWorker(QThread):
|
||
log_line = pyqtSignal(str)
|
||
status_changed = pyqtSignal(dict)
|
||
started_ok = pyqtSignal(dict)
|
||
stopped = pyqtSignal()
|
||
failed = pyqtSignal(str)
|
||
|
||
def __init__(self, settings: AgentSettings, parent=None) -> None:
|
||
super().__init__(parent)
|
||
self._settings = settings
|
||
self._stop_event = threading.Event()
|
||
|
||
def request_stop(self) -> None:
|
||
self._stop_event.set()
|
||
|
||
def run(self) -> None:
|
||
try:
|
||
ensure_runtime_importable()
|
||
|
||
from xhs_bridge.service import XhsBridgeService
|
||
|
||
svc = XhsBridgeService()
|
||
device_id = svc.license.device_id
|
||
client = OmsAgentClient(
|
||
self._settings.oms_url.strip(),
|
||
self._settings.token.strip(),
|
||
device_id,
|
||
)
|
||
|
||
self.started_ok.emit(
|
||
{
|
||
"device_id": device_id,
|
||
"agent_id": client.agent_id,
|
||
"bridge_port": self._settings.bridge_port,
|
||
}
|
||
)
|
||
self.log_line.emit(f"已连接 OMS:{self._settings.oms_url}")
|
||
self.log_line.emit(f"设备 ID:{device_id}")
|
||
|
||
def stop_flag() -> bool:
|
||
return self._stop_event.is_set()
|
||
|
||
import app.oms_agent_runner as runner
|
||
|
||
orig_heartbeat = runner._heartbeat
|
||
|
||
def wrapped_heartbeat(c, s):
|
||
orig_heartbeat(c, s)
|
||
try:
|
||
st = s.status()
|
||
self.status_changed.emit(
|
||
{
|
||
"engine_running": bool(st.get("bridge_running")),
|
||
"extension_connected": bool(st.get("extension_connected")),
|
||
"xhs_logged_in": bool(st.get("login_ok")),
|
||
}
|
||
)
|
||
except Exception:
|
||
pass
|
||
self.log_line.emit("心跳 OK")
|
||
|
||
runner._heartbeat = wrapped_heartbeat
|
||
|
||
run_agent_loop(
|
||
client,
|
||
svc,
|
||
device_name=self._settings.device_name or None,
|
||
bridge_port=self._settings.bridge_port,
|
||
stop_flag=stop_flag,
|
||
)
|
||
except Exception as exc:
|
||
logger.exception("Agent 线程异常")
|
||
self.failed.emit(str(exc))
|
||
finally:
|
||
self.stopped.emit()
|