From e91fec95b3e2679191dd8a7a8566e7f570b76a87 Mon Sep 17 00:00:00 2001 From: qiurui144 Date: Mon, 9 Mar 2026 13:35:04 +0800 Subject: [PATCH] feat: add RtpResearcherAgent for RTP/real-time transport research Co-Authored-By: Claude Sonnet 4.6 --- src/rockchip_agents/agents/rtp_researcher.py | 50 ++++++++++++++++++++ tests/test_research_agents.py | 33 +++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 src/rockchip_agents/agents/rtp_researcher.py create mode 100644 tests/test_research_agents.py diff --git a/src/rockchip_agents/agents/rtp_researcher.py b/src/rockchip_agents/agents/rtp_researcher.py new file mode 100644 index 0000000..97f6137 --- /dev/null +++ b/src/rockchip_agents/agents/rtp_researcher.py @@ -0,0 +1,50 @@ +from __future__ import annotations + +import logging +import re + +from rockchip_agents.agents.developer import DeveloperAgent +from rockchip_agents.core.queue import Task + +logger = logging.getLogger(__name__) + +RTP_RESEARCHER_SYSTEM = """你是 RTP 实时传输协议专项调研员,专注于 RK3588 平台的媒体实时传输优化。 + +调研重点: +- RTP/RTSP 协议栈延迟分析(端到端 < 100ms 目标) +- RK3588 媒体通路:ISP → 编码器 → 网络发送的延迟分解 +- 内核网络栈优化:SO_PRIORITY、TX queue、中断亲和性 +- 硬件编码器(MPP)与软件 RTP 封装的同步机制 + +输出标签(写入系统记忆): +- [调研报告] __research__.rtp.summary=综合调研结论 +- [调研报告] __research__.rtp.bottlenecks=当前瓶颈分析 +- [调研报告] __research__.rtp.next_steps=建议优化步骤(逗号分隔) +- [调研报告] __research__.rtp.updated_at=调研时间 + +调研完成后,如有明确优化方向,输出: +- [优化任务] os-engineer: <具体优化任务描述> +- [优化任务] dev-kernel: <具体内核优化任务描述> + +要求: +- 先用 fetch 工具查阅最新 RTP/RTCP 规范、RK3588 BSP 文档 +- 输出结构化 Markdown 报告,含实测数据或参考基准 +""" + + +class RtpResearcherAgent(DeveloperAgent): + """RTP 实时传输协议专项调研 Agent。""" + + def _build_context(self, task: Task) -> str: + return super()._build_context(task) + "\n" + RTP_RESEARCHER_SYSTEM + + def _extract_research_facts(self, report_text: str) -> None: + """解析 [调研报告] 标签,写入 ProjectMemory __research__ facts。""" + for m in re.finditer(r"\[调研报告\]\s+(__research__\.[\w.]+)=(.+)", report_text): + key_full = m.group(1).strip() + value = m.group(2).strip()[:500] + _, _, sub_key = key_full.partition(".") + try: + self._memory.set_fact("__research__", sub_key, value, role="rtp-researcher") + except Exception as e: + logger.warning("调研报告写入失败 %s: %s", key_full, e) diff --git a/tests/test_research_agents.py b/tests/test_research_agents.py new file mode 100644 index 0000000..49e023d --- /dev/null +++ b/tests/test_research_agents.py @@ -0,0 +1,33 @@ +from __future__ import annotations +import pytest +from unittest.mock import MagicMock +from rockchip_agents.config import AgentsConfig, ClaudeConfig, SchedulerConfig, FeishuConfig + + +def _make_config(): + return AgentsConfig( + projects={}, + scheduler=SchedulerConfig(), + claude=ClaudeConfig(api_key="fake"), + feishu=FeishuConfig(), + devices={}, + ) + + +def test_rtp_researcher_system_contains_keywords(): + from rockchip_agents.agents.rtp_researcher import RTP_RESEARCHER_SYSTEM + for kw in ["RTP", "实时", "延迟", "RK3588"]: + assert kw in RTP_RESEARCHER_SYSTEM, f"缺少关键词: {kw}" + + +def test_rtp_researcher_extract_research_facts(tmp_path): + """解析 [调研报告] 标签写入 __research__.rtp.* facts。""" + from rockchip_agents.agents.rtp_researcher import RtpResearcherAgent + from rockchip_agents.tools.project_memory import ProjectMemory + mem = ProjectMemory(db_path=tmp_path / "m.db") + agent = RtpResearcherAgent(_make_config(), memory=mem) + report = "[调研报告] __research__.rtp.summary=RTP延迟瓶颈在内核调度\n[调研报告] __research__.rtp.bottlenecks=中断亲和性未设置" + agent._extract_research_facts(report) + facts = mem.get_facts("__research__") + assert facts.get("rtp.summary") == "RTP延迟瓶颈在内核调度" + assert facts.get("rtp.bottlenecks") == "中断亲和性未设置"