斗鱼日报切换Dify工作流并补齐迁移文档
1. douyu插件新增Dify专用日报调用封装,按provider分流,Dify走run(inputs)并传task_type与结构化payload。\n2. 修正斗鱼日报与弹幕总结生成路径,统一改为新封装,保证Dify workflow可接收完整提示词与元信息。\n3. 新增llm后端dify_workflow_douyu_daily_report模板配置,约定workflow_output_key=text与更高超时。\n4. 斗鱼插件report_api后端切换为dify_workflow_douyu_daily_report。\n5. 新增Dify工作流设计文档,包含输入字段、节点编排、代码节点示例与上线检查步骤。
This commit is contained in:
@@ -27,6 +27,5 @@ daily_report_send_image = true
|
||||
audience_stats_sample_interval_seconds = 0
|
||||
|
||||
[Douyu.report_api]
|
||||
backend = "openai_compatible_ai_auto_response"
|
||||
temperature = 0.3
|
||||
max_tokens = 900
|
||||
# 切换到 Dify 斗鱼日报专用工作流;对应配置位于根目录 config.yaml 的 llm.backends。
|
||||
backend = "dify_workflow_douyu_daily_report"
|
||||
|
||||
@@ -1828,14 +1828,94 @@ class DouyuPlugin(MessagePluginInterface):
|
||||
def _build_operator_summary_lines(self, payload: Dict[str, Any]) -> List[str]:
|
||||
return [line.strip()[2:].strip() for line in self._build_operator_summary_text(payload).splitlines() if line.strip().startswith("- ")]
|
||||
|
||||
def _build_dify_daily_report_inputs(
|
||||
self,
|
||||
*,
|
||||
task_type: str,
|
||||
system_prompt: str,
|
||||
user_prompt: str,
|
||||
payload: Dict[str, Any],
|
||||
) -> Dict[str, Any]:
|
||||
"""
|
||||
组装斗鱼日报在 Dify Workflow 下的输入参数。
|
||||
设计目标:
|
||||
1. 让工作流既能拿到“最终自然语言提示词”,也能拿到“结构化原始载荷”;
|
||||
2. 让一个工作流通过 task_type 同时处理「日报正文」和「弹幕摘要」两类任务;
|
||||
3. 保留关键元信息,便于在工作流内做分支、日志与降级兜底。
|
||||
"""
|
||||
meta = payload.get("report_meta", {}) or {}
|
||||
room_id = str(meta.get("room_id") or "").strip()
|
||||
anchor_day = str(meta.get("anchor_day") or "").strip()
|
||||
nickname = str(meta.get("nickname") or meta.get("room_name") or "").strip()
|
||||
payload_json = json.dumps(payload, ensure_ascii=False)
|
||||
return {
|
||||
# 任务路由字段:在 Dify 条件分支里用于区分日报正文/弹幕摘要。
|
||||
"task_type": task_type,
|
||||
# 兼容 Workflow 中直接读取 query 的场景。
|
||||
"query": user_prompt,
|
||||
# 保留原有两段提示词,便于工作流内部二次拼装或调试。
|
||||
"system_prompt": system_prompt,
|
||||
"user_prompt": user_prompt,
|
||||
# 结构化报告载荷:既提供对象,也提供 JSON 文本,适配不同节点处理能力。
|
||||
"report_payload": payload,
|
||||
"report_payload_json": payload_json,
|
||||
# 关键元信息:用于日志、标题拼接、数据看板或异常追踪。
|
||||
"room_id": room_id,
|
||||
"anchor_day": anchor_day,
|
||||
"nickname": nickname,
|
||||
# 控制输出长度:避免 Dify 侧生成超长内容后再被本地硬截断。
|
||||
"max_length": int(self._daily_report_max_length or 1800),
|
||||
}
|
||||
|
||||
def _call_daily_report_llm(
|
||||
self,
|
||||
*,
|
||||
task_type: str,
|
||||
system_prompt: str,
|
||||
user_prompt: str,
|
||||
payload: Dict[str, Any],
|
||||
tag: str,
|
||||
) -> str:
|
||||
"""
|
||||
统一封装斗鱼日报 LLM 调用。
|
||||
- Dify provider:走 run(inputs) 进入 Workflow,确保输入结构稳定可编排;
|
||||
- 其他 provider:保持原 chat(system,user) 行为,兼容现有 OpenAI-compatible 配置。
|
||||
"""
|
||||
if not self._daily_report_llm_client:
|
||||
return ""
|
||||
meta = payload.get("report_meta", {}) or {}
|
||||
room_id = str(meta.get("room_id") or "").strip()
|
||||
user_id = f"douyu_daily_report_{room_id or 'unknown'}"
|
||||
if self._daily_report_llm_client.provider == "dify":
|
||||
inputs = self._build_dify_daily_report_inputs(
|
||||
task_type=task_type,
|
||||
system_prompt=system_prompt,
|
||||
user_prompt=user_prompt,
|
||||
payload=payload,
|
||||
)
|
||||
result = self._daily_report_llm_client.run(
|
||||
prompt=user_prompt,
|
||||
user=user_id,
|
||||
inputs=inputs,
|
||||
tag=tag,
|
||||
)
|
||||
return str((result or {}).get("text", "") or "").strip()
|
||||
return self._daily_report_llm_client.chat(
|
||||
system_prompt,
|
||||
user_prompt,
|
||||
user_id=user_id,
|
||||
).strip()
|
||||
|
||||
async def _generate_danmu_summary_text(self, payload: Dict[str, Any]) -> str:
|
||||
if self._daily_report_use_llm and self._daily_report_llm_client:
|
||||
system_prompt, user_prompt = self._build_danmu_summary_prompt(payload)
|
||||
result = await asyncio.to_thread(
|
||||
self._daily_report_llm_client.chat,
|
||||
system_prompt,
|
||||
user_prompt,
|
||||
f"douyu_danmu_summary_{(payload.get('report_meta', {}) or {}).get('room_id', '')}",
|
||||
self._call_daily_report_llm,
|
||||
task_type="danmu_summary",
|
||||
system_prompt=system_prompt,
|
||||
user_prompt=user_prompt,
|
||||
payload=payload,
|
||||
tag=f"douyu_danmu_summary_{(payload.get('report_meta', {}) or {}).get('room_id', '')}",
|
||||
)
|
||||
if result:
|
||||
return result.strip()
|
||||
@@ -1919,10 +1999,12 @@ class DouyuPlugin(MessagePluginInterface):
|
||||
if self._daily_report_use_llm and self._daily_report_llm_client:
|
||||
system_prompt, user_prompt = self._build_daily_report_prompt(payload)
|
||||
result = await asyncio.to_thread(
|
||||
self._daily_report_llm_client.chat,
|
||||
system_prompt,
|
||||
user_prompt,
|
||||
f"douyu_daily_report_{(payload.get('report_meta', {}) or {}).get('room_id', '')}",
|
||||
self._call_daily_report_llm,
|
||||
task_type="daily_report",
|
||||
system_prompt=system_prompt,
|
||||
user_prompt=user_prompt,
|
||||
payload=payload,
|
||||
tag=f"douyu_daily_report_{(payload.get('report_meta', {}) or {}).get('room_id', '')}",
|
||||
)
|
||||
if result:
|
||||
text = result.strip()
|
||||
|
||||
Reference in New Issue
Block a user