agent-writer/agent/scheduler.py

149 lines
6.3 KiB
Python
Raw Permalink 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.

"""
调度智能体 负责接收和分析用户的提示词,并调用智能调度其他智能体来处理工作
"""
from langgraph.graph import StateGraph
from langgraph.prebuilt import create_react_agent
from langgraph.graph.state import CompiledStateGraph
from langgraph.prebuilt.chat_agent_executor import AgentState
from utils.logger import get_logger
logger = get_logger(__name__)
# 默认调度器列表
DefaultSchedulerList = []
# 默认代理提示词
DefaultAgentPrompt = """
# 角色定位
您是爆款短剧改编专家,具备极致爽点设计、人物标签化、情绪节奏控制和网感台词能力。沟通风格自信犀利,能清晰解释商业逻辑。
# 核心工作流
1. 等待原始剧本wait_for_input
2. 剧本分析script_analysis
3. 改编思路制定strategic_planning
4. 剧本圣经构建build_bible
5. 剧集循环创作episode_create_loop
6. 完成finish
步骤不可跳过但可回退修改。除finish和wait_for_input外各阶段均由对应智能体处理。episode_create_loop阶段需通过QueryEpisodeCount工具判断进度并指定单次创作集数3-5集
# 智能体职责
- scheduler您自身调度决策、用户沟通、状态管理
- script_analysis生成诊断与资产评估报告
- strategic_planning生成改编思路
- build_bible生成剧本圣经含核心大纲、人物小传、事件时间线、人物表
- episode_create单集内容创作
# 工具使用原则
仅在必要时调用工具避免重复。关键工具包括QueryOriginalScript、QueryDiagnosisAndAssessment、QueryAdaptationIdeas、QueryScriptBible、QueryEpisodeCount等。
- QueryOriginalScript原始剧本是否存在
- QueryDiagnosisAndAssessment诊断与资产评估报告是否存在
- QueryAdaptationIdeas改编思路是否存在
- QueryScriptBible剧本圣经是否存在
- QueryEpisodeCount剧集总数与生成完成集数获取
如果工具读取到存在为true则不需要再调用该工具;
如果工具读取到存在为false则需要需要分析当前任务的阶段来决定调用哪个工具每次分析只能调用一个工具
# 任务列表管理
- 任务列表为空时自动根据工作流步骤生成新列表
- 每项任务包含agent、step、status、reason、retry_count、pause、episode_create_num
- 执行逻辑优先处理第一个未完成任务状态为completed时推进failed时根据reason决定重试≤3次或通知用户waiting时暂停等待用户输入
- 所有任务完成后,用户输入仍可触发新任务列表
# 输入数据解析
每次调用附带:
- workflow_info布尔状态组原始剧本、诊断报告等
- workflow_paramssession_id、task_index、from_typeuser或agent
- task_list当前任务列表数组
根据from_type决策user直接解析用户意图agent基于返回结果更新任务状态
# 输出规范
请严格按照下列JSON结构返回数据不要有其他任何多余的信息和描述
{{
"message": "回复用户的内容(仅需用户沟通时填充)",
"task_list": [更新后的任务列表数组],
"task_index": 当前执行任务索引,
}}
"""
def create_agent_prompt(prompt, SchedulerList):
"""创建代理提示词的辅助函数"""
if not SchedulerList or len(SchedulerList) == 0: return prompt
node_list = [f"{node['name']}:{node['desc']}" for node in SchedulerList]
return f"""
{prompt} \n
下面返回数据中node字段的取值范围列表([{{名称:描述}}]),请根据你的分析结果选择一个节点名称返回:
{node_list} \n
"""
class SchedulerAgentState(AgentState):
"""调度智能体中的上下文对象"""
is_original_script: bool # 是否已提交原始剧本
is_script_analysis: bool # 是否已生成 诊断与资产评估报告
is_strategic_planning: bool # 是否已生成 改编思路
is_build_bible: bool # 是否已生成 剧本圣经
is_episode_create_loop: bool # 是否已生成 剧集生成循环
is_all_episode_created: bool # 是否已生成 全部剧集
def pre_scheduler_hook(state:SchedulerAgentState):
"""模型调用前的钩子函数"""
logger.info(f"!!!!!!!!!调度节点输入!!!!!!!!!!!")
session_id = state.get("session_id", "")
workflow_info = state.get("workflow_info", {})
task_list = state.get("task_list", [])
task_index = int(state.get("task_index", 0))
from_type = state.get("from_type", "")
messages = state.get("messages", [])
logger.info(f"调度节点输入: {state}")
logger.info(f"!!!!!!!!!调度节点输入!!!!!!!!!!!")
# 清除历史状态消息
# messages = clear_messages(messages)
# # 添加参数进提示词
# messages.append(HumanMessage(content=f"""
# ---任务状态消息(开始)---
# # 工作流信息:
# {workflow_info}
# # 工作流参数:
# {{
# 'session_id':'{session_id}',
# 'task_index':'{task_index}',
# 'from_type':'{from_type}',
# }}
# # 任务列表:
# {task_list}
# ---任务状态消息(结束)---
# """))
# return state
class SchedulerAgent(CompiledStateGraph):
"""智能调度智能体类
该类负责接收用户的提示词,并调用其他智能体来处理工作。
"""
def __new__(cls,
llm=None,
tools=[],
SchedulerList=None,
post_model_hook=None,
):
"""创建并返回create_react_agent创建的对象"""
# 处理默认参数
if llm is None:
from tools.llm.huoshan_langchain import HuoshanChatModel
llm = HuoshanChatModel()
if SchedulerList is None:
SchedulerList = DefaultSchedulerList
# 创建并返回代理对象
return create_react_agent(
model=llm,
tools=tools,
prompt=DefaultAgentPrompt,
# pre_model_hook=pre_scheduler_hook,
# post_model_hook=post_model_hook,
# state_schema=SchedulerAgentState,
# prompt=create_agent_prompt(prompt=DefaultAgentPrompt, SchedulerList=SchedulerList),
)