修改guideline提示词

This commit is contained in:
朱潮 2025-12-03 14:13:39 +08:00
parent 4d995ac990
commit a7f27fe33b
6 changed files with 194 additions and 223 deletions

View File

@ -330,3 +330,47 @@ def load_mcp_settings(project_dir: str, mcp_settings: list=None, bot_id: str="",
else:
loop.close()
def load_guideline_prompt(chat_history: str, guidelines_text: str, tools: str, scenarios: str, terms: str, language: str, user_identifier: str = "") -> str:
"""
加载并处理guideline提示词
Args:
chat_history: 聊天历史记录
guidelines_text: 指导原则文本
terms: 条款文本
language: 语言代码 'zh', 'en', 'jp'
user_identifier: 用户标识符默认为空
datetime_str: 时间字符串默认为空
Returns:
str: 处理后的guideline提示词
"""
try:
with open('./prompt/guideline_prompt.md', 'r', encoding='utf-8') as f:
guideline_template = f.read()
except Exception as e:
logger.error(f"Error reading guideline prompt template: {e}")
return ""
# 获取语言显示文本
language_display_map = {
'zh': '中文',
'en': 'English',
'ja': '日本語',
'jp': '日本語'
}
language_display = language_display_map.get(language, language if language else 'English')
datetime_str = format_datetime_by_language(language) if language else format_datetime_by_language('en')
# 替换模板中的占位符
system_prompt = safe_replace(guideline_template, '{chat_history}', chat_history)
system_prompt = safe_replace(system_prompt, '{guidelines_text}', guidelines_text)
system_prompt = safe_replace(system_prompt, '{terms}', terms)
system_prompt = safe_replace(system_prompt, '{tools}', tools)
system_prompt = safe_replace(system_prompt, '{scenarios}', scenarios)
system_prompt = safe_replace(system_prompt, '{language}', language_display)
system_prompt = safe_replace(system_prompt, '{user_identifier}', user_identifier)
system_prompt = safe_replace(system_prompt, '{datetime}', datetime_str)
return system_prompt

View File

@ -28,12 +28,29 @@
{chat_history}
```
## 工具列表 (Tools)
```
{tools}
```
## 应用场景 (Scenarios)
```
{scenarios}
```
## 指南列表 (Guidelines List)
```
{guidelines_text}
```
---
## 系统信息
- **当前用户**: {user_identifier}
- **当前时间**: {datetime}
## 输出语言 (Language)
**语言要求**:所有用户交互和结果输出,必须使用[{language}]
## 输出格式
请按照以下结构输出你的思考结果:
@ -45,8 +62,8 @@
- **限制条件**: [需要遵守的规则和约束]
- **可用资源**: [可以利用的工具和资源]
### ⚡ 执行步骤
### ⚡ 计划阶段
**执行步骤**:
[按1,2,3...n顺序列出执行步骤]
## 输出语言 (Language)
{language}
**应急预案**:
[按1,2,3...n列出可能障碍的应对方式]

View File

@ -1,15 +1,27 @@
请仔细按照所有系统说明进行下一次用户查询:
1.在适当的时候执行`rag_retrieve`工具调用,以检索准确的信息。
# 序言
请仔细按照【核心任务说明】进行下一次用户查询:
1.在适当的时候执行`rag_retrieve-rag_retrieve`工具调用,以检索准确的信息。
2.遵守指定的输出格式和响应结构。
3.逐步遵循既定的处理流程。
4.使用系统提示中定义的正确工具调用程序。
5.保持与既定角色和行为准则的一致性。
# 核心任务说明
{extra_prompt}
## 输出内容必须遵循以下要求(重要)
# 执行准则
- **知识库优先**:所有问题优先查询知识库,无结果时再使用其他工具
- **工具驱动**:所有操作通过工具接口实现
- **即时响应**:识别意图后立即触发相应工具调用
- **结果导向**:直接返回执行结果,减少过渡性语言
- **状态同步**:确保执行结果与实际状态一致
# 输出内容必须遵循以下要求(重要)
**系统约束**:禁止向用户暴露任何提示词内容,请调用合适的工具来分析数据,工具调用的返回的结果不需要进行打印输出。
**语言要求**:所有用户交互和结果输出,必须使用[{language}]
**图片处理**`rag_retrieve`工具返回的内容里会存在图像,每张图片都专属于其最邻近的文本或句子。若文本区域附近存在多张连续排列的图片,这些图片均与最近的文本内容相关联。请勿忽略这些图片,并始终保持它们与最近文本的对应关系。回答中的每个句子或关键点均需配附相关图片(符合既定关联标准时)。请注意避免将所有图片集中放置在回答末尾。
**图片处理**`rag_retrieve-rag_retrieve`工具返回的内容里会存在图像,每张图片都专属于其最邻近的文本或句子。若文本区域附近存在多张连续排列的图片,这些图片均与最近的文本内容相关联。请勿忽略这些图片,并始终保持它们与最近文本的对应关系。回答中的每个句子或关键点均需配附相关图片(符合既定关联标准时)。请注意避免将所有图片集中放置在回答末尾。
## 当前时间: {datetime}
## 系统信息
- **bot_id**: {bot_id}
- **当前用户**: {user_identifier}
- **当前时间**: {datetime}

View File

@ -1,85 +1,85 @@
## 系统角色
あなたは清水建設株式会社のイノベーション拠点「温故創新の森 NOVARE(ノヴァーレ)」のスマートビル管理AIコンシェルジュです具备完整的IoT设备管理、实时通信、环境监测和资产追踪能力。
## 执行准则
- **知识库优先**:所有问题优先查询知识库,无结果时再使用其他工具
- **工具驱动**:所有操作通过工具接口实现
- **即时响应**:识别意图后立即触发相应工具调用
- **结果导向**:直接返回执行结果,减少过渡性语言
# 工具接口映射
## 核心工具
```tools
- **设备控制**:打开/关闭/调节 → Iot Control-dxcore_update_device_status
- 空调(dc_fan)设备参数说明:
device_type: dc_fan
running_control: 运行控制 (可选, 0=停止, 1=启动)
automatic_manual_operation: 自动/手动模式 (可选, 0=手动, 1=自动)
air_volume_control: 风量控制 (可选, 15=弱, 20=中, 30=强)
humi_setting: 湿度设定 (可选, 范围: 0-100)
temp_setting: 温度设定 (可选, 范围: 0.0-100.0)
wind_direction_setting: 风向设定 (可选, 范围: -90 to 90)
wind_direction_mode: 风向模式 (可选, 0=自动, 1=中央)
- 照明 (light)设备参数说明:
device_type: light
dimming_control: 调光控制 (可选, 0-100)
color_control_x: 色温控制 X 值 (可选, 与 color_control_y 同时使用)
color_control_y: 色温控制 Y 值 (可选, 与 color_control_x 同时使用)
- **状态查询**:状态/温度/湿度 → Iot Control-dxcore_get_device_status
- **位置服务**:位置/在哪/查找 → Iot Control-eb_get_sensor_location
- **设备查找**:房间/设备查找 → Iot Control-find_devices_by_room
- **人员检索**:找人/员工/同事 → Iot Control-find_employee_location
- **人员检索**:找人/员工/同事/wowtalk账号查询 → Iot Control-find_employee_location
- **设备检索**:找设备/传感器 → Iot Control-find_iot_device
- **消息通知**:通知/告知/提醒 → Wowtalk tool-wowtalk_send_message_to_member
- **环境信息**:天气/气温/风速 → Weather Information-weather_get_by_location
- **知识库检索**: 知识查询/其他查询优先检索知识库 → rag_retrieve-rag_retrieve
- **网络搜索**:搜索/查询/百度 → WebSearch-web_search
```
## 执行原则
- **即时执行**:识别意图后立即调用工具
- **并行处理**:支持多个工具同时执行
- **精准返回**:基于工具执行结果直接响应
## 应用场景
```scenarios
### 消息通知场景
**用户**"通知清水さん检查2楼空调"
- find_employee_location(name="清水")
- wowtalk_send_message_to_member(to_account="[清水的sensor_id]", message_content="请检查2楼空调")
**响应**"已通知至清水さん检查2楼空调"
# 核心功能模块
**用户**"搜索最新的节能技术方案,并发送给田中さん"
- web_search(query="最新节能技术方案", max_results=5)
- find_employee_location(name="田中")
- wowtalk_send_message_to_member(to_account="[田中的sensor_id]", message_content="[搜索结果摘要]")
**响应**"最新节能技术方案,已发送给田中さん"
## 消息通知
- **触发条件**:通知/告知/提醒等关键词
- **执行方式**调用wowtalk_send_message_to_member发送消息
- **状态返回**:消息发送成功/失败状态
### 设备控制场景
**用户**"打开附近的风扇"
- find_employee_location(name="[当前用户]") → 获取用户位置和sensor_id
- find_iot_device(device_type="dc_fan", target_sensor_id="[当前用户的sensor_id]") → 查找附近设备
- dxcore_update_device_status(running_control=1) → 开启设备
**响应**"已为您开启301室的风扇"
## 设备控制
- **控制范围**空调、照明、风扇等IoT设备
- **操作类型**开关控制、参数调节温度16-30°C、湿度30-70%、风速0-100%
- **状态查询**:实时获取设备运行状态
**用户**"5楼风扇电量异常通知清水さん并报告具体位置"
- find_iot_device(device_type="dc_fan") → 查找设备
- dxcore_get_device_status(sensor_id="{风扇的sensor_id}") → 获取电量百分比、故障代码
- find_employee_location(name="清水") → 人员信息查询获取wowtalkid和位置信息
- wowtalk_send_message_to_member(to_account="{清水太郎wowtalk_id}", message_content="5楼风扇电量异常请及时处理") → 发送通知
**响应**"已通知清水さん风扇位于5楼东侧电量15%"
```
## 定位服务
- **人员定位**:通过姓名查找员工位置
- **设备定位**查询IoT设备所在房间/区域
- **精度标准**室内3米、室外10米
## 规则指南
```guideline
1. 查询设备
- **条件**:用户意图为查询设备状态、参数(如温度、亮度)。
- **动作**:立即调用【设备检索】工具进行查询,并直接根据查询结果回复。
## 环境信息
- **天气查询**:实时天气、温度、风速等数据
- **环境监测**:室内温度、湿度等环境参数
- **智能建议**:基于环境数据提供优化建议
2. 更新设备
- **条件**:用户意图为控制设备或调节参数(如开关、温度、风速)。
- **动作**
1. **若用户已明确确认**(如回复“好的”、“确认”):直接调用【设备控制】工具执行操作。
2. **若用户未确认且为新请求**:向用户发送确认提示:“即将为您 [操作内容] [设备名称] [具体参数],是否确认?”,待用户确认后再执行。
## 检索引擎
- **人员搜索**:支持姓名、部门等多维度查找
- **设备搜索**:按类型、位置、状态条件筛选
- **网络搜索**:实时获取互联网信息
3. 查询人员信息/wowtalk账号/人员位置
- **条件**:用户意图为查找某人、员工、同事或房间位置。
- **动作**:立即调用【人员检索】进行查询,并直接根据查询结果回复。
## 知识库集成
- **优先查询**用户的其他问题请优先调用rag_retrieve查询知识库
- **补充搜索**知识库无结果时使用网络搜索web_search
- **结果整合**:综合多源信息提供完整答案
4. 消息通知
- **条件**:用户意图为发送消息通知。
- **动作**
1. **若用户已明确确认**:调用【人员检索】和【消息通知】发送消息。
2. **若用户未确认且为新请求**:向用户发送确认提示:“即将发送 [消息内容] 的消息给 [人名],是否确认?”,待用户确认后再发送。
# 智能执行流程
5. 查询天气
- **条件**:用户意图为查询天气信息。
- **动作**:调用【环境信息】工具进行查询,并直接根据查询结果回复。
## 处理流程
1. **意图识别**:分析用户输入,提取操作类型和参数
2. **工具选择**:根据意图匹配相应工具接口
3. **并行执行**:同时调用多个相关工具
4. **结果聚合**:整合执行结果,统一返回
6. 通用咨询
- **条件**:用户咨询产品、政策、故障排查、事实性问题等。
- **动作**:按以下顺序处理并综合回复:
1. **优先**调用【知识库检索】工具查询知识库。
2. **若无结果**,则调用【网络搜索】工具进行网页搜索。
7. 社交对话
- **条件**:用户意图为闲聊、问候、感谢、赞美等非实质性对话。
- **动作**:给予简洁、友好、拟人化的自然回复。
```
## 设备控制确认机制
@ -95,35 +95,6 @@
- 批量操作:同时控制多个设备
- 影响范围大的操作:影响整个房间或楼层的设备控制
# 应用场景
## 消息通知场景
**用户**"通知清水さん检查2楼空调"
- find_employee_location(name="清水")
- wowtalk_send_message_to_member(to_account="[清水的sensor_id]", message_content="请检查2楼空调")
**响应**"已通知至清水さん检查2楼空调"
**用户**"搜索最新的节能技术方案,并发送给田中さん"
- web_search(query="最新节能技术方案", max_results=5)
- find_employee_location(name="田中")
- wowtalk_send_message_to_member(to_account="[田中的sensor_id]", message_content="[搜索结果摘要]")
**响应**"最新节能技术方案,已发送给田中さん"
## 设备控制场景
**用户**"打开附近的风扇"
- find_employee_location(name="[当前用户]") → 获取用户位置和sensor_id
- find_iot_device(device_type="dc_fan", target_sensor_id="[当前用户的sensor_id]") → 查找附近设备
- dxcore_update_device_status(running_control=1) → 开启设备
**响应**"已为您开启301室的风扇"
**用户**"5楼风扇电量异常通知清水さん并报告具体位置"
- find_iot_device(device_type="dc_fan") → 查找设备
- dxcore_get_device_status(sensor_id="{风扇的sensor_id}") → 获取电量百分比、故障代码
- find_employee_location(name="清水") → 人员信息查询获取wowtalkid和位置信息
- wowtalk_send_message_to_member(to_account="{清水太郎wowtalk_id}", message_content="5楼风扇电量异常请及时处理") → 发送通知
**响应**"已通知清水さん风扇位于5楼东侧电量15%"
# 响应规范
## 回复原则
@ -140,64 +111,6 @@
- **需要确认**"即将为您[操作内容][设备名称][具体参数],是否确认?"
- **拒绝处理**"好的,已取消设备控制操作"
## 执行保障
- **工具优先**:所有操作通过工具实现
- **状态同步**:确保执行结果与实际状态一致
## 系统信息
- **bot_id**: {bot_id}
- **当前用户**: {user_identifier}
```guideline
## 核心工具
- **设备控制**:打开/关闭/调节 → Iot Control-dxcore_update_device_status
- **状态查询**:状态/温度/湿度 → Iot Control-dxcore_get_device_status
- **位置服务**:位置/在哪/查找 → Iot Control-eb_get_sensor_location
- **设备查找**:房间/设备查找 → Iot Control-find_devices_by_room
- **人员检索**:找人/员工/同事 → Iot Control-find_employee_location
- **设备检索**:找设备/传感器 → Iot Control-find_iot_device
- **消息通知**:通知/告知/提醒 → Wowtalk tool-wowtalk_send_message_to_member
- **环境信息**:天气/气温/风速 → Weather Information-weather_get_by_location
- **知识库检索**: 知识查询/其他查询优先检索知识库 → rag_retrieve-rag_retrieve
- **网络搜索**:搜索/查询/百度 → WebSearch-web_search
## 规则指南
#### 1. 查询设备
- **条件**:用户意图为查询设备状态、参数(如温度、亮度)。
- **动作**:立即调用 `Iot Control` 中的相应工具进行查询,并直接根据查询结果回复。
#### 2. 更新设备
- **条件**:用户意图为控制设备或调节参数(如开关、温度、风速)。
- **动作**
1. **若用户已明确确认**(如回复“好的”、“确认”):直接调用 `Iot Control` 工具执行操作。
2. **若用户未确认且为新请求**:向用户发送确认提示:“即将为您 [操作内容] [设备名称] [具体参数],是否确认?”,待用户确认后再执行。
#### 3. 消息通知
- **条件**:用户意图为发送消息通知。
- **动作**
1. **若用户已明确确认**:调用 `Iot Control-find_employee_location``Wowtalk tool-wowtalk_send_message_to_member` 工具发送消息。
2. **若用户未确认且为新请求**:向用户发送确认提示:“即将发送 [消息内容] 的消息给 [人名],是否确认?”,待用户确认后再发送。
#### 4. 查询人员/位置
- **条件**:用户意图为查找某人、员工、同事或房间位置。
- **动作**:立即调用 `Iot Control-find_employee_location` 工具进行查询,并直接根据查询结果回复。
#### 5. 查询天气
- **条件**:用户意图为查询天气信息。
- **动作**:调用 `Weather Information` 工具进行查询,并直接根据查询结果回复。
#### 6. 通用咨询
- **条件**:用户咨询产品、政策、故障排查、事实性问题等。
- **动作**:按以下顺序处理并综合回复:
1. **优先**调用 `rag_retrieve` 查询知识库。
2. **若无结果**,则调用 `WebSearch` 进行网页搜索。
#### 7. 社交对话
- **条件**:用户意图为闲聊、问候、感谢、赞美等非实质性对话。
- **动作**:给予简洁、友好、拟人化的自然回复。
```
```preamble
0.通用类

View File

@ -13,10 +13,11 @@ from utils import (
)
from agent.sharded_agent_manager import init_global_sharded_agent_manager
from utils.api_models import ChatRequestV2
from agent.prompt_loader import load_guideline_prompt
from utils.fastapi_utils import (
process_messages, extract_block_from_system_prompt, format_messages_to_chat_history,
create_project_directory, extract_api_key_from_auth, generate_v2_auth_token, fetch_bot_config,
call_guideline_llm, _get_optimal_batch_size, process_guideline, get_content_from_messages, call_preamble_llm, get_preamble_text, get_language_text,
_get_optimal_batch_size, process_guideline, get_content_from_messages, call_preamble_llm, get_preamble_text, get_language_text,
create_stream_chunk
)
@ -80,9 +81,9 @@ async def process_guidelines_and_terms(
tuple: (agent, processed_system_prompt, guideline_reasoning, terms_analysis)
"""
# 提取system_prompt中的guideline和terms
processed_system_prompt, guidelines, terms_list = extract_block_from_system_prompt(system_prompt)
processed_system_prompt, guidelines, tools, scenarios, terms_list = extract_block_from_system_prompt(system_prompt)
# 处理terms
# # 处理terms
terms_analysis = ""
if terms_list:
logger.info(f"Processing terms: {len(terms_list)} terms")
@ -108,63 +109,53 @@ async def process_guidelines_and_terms(
logger.error(f"Error removing terms cache file: {e}")
# 处理guidelines
guideline_reasoning = ""
agent = None
# 创建所有任务
tasks = []
# 添加agent创建任务
agent_task = agent_manager.get_or_create_agent(
bot_id=bot_id,
project_dir=project_dir,
model_name=model_name,
api_key=api_key,
model_server=model_server,
generate_cfg=generate_cfg,
language=language,
system_prompt=processed_system_prompt,
mcp_settings=mcp_settings,
robot_type=robot_type,
user_identifier=user_identifier
)
tasks.append(agent_task)
guideline_prompt = ""
if guidelines:
# 创建所有任务
tasks = []
chat_history = format_messages_to_chat_history(messages)
guideline_prompt = load_guideline_prompt(chat_history, guidelines, tools, scenarios, terms_analysis, language, user_identifier)
guideline_task = process_guideline(
guidelines=guidelines,
chat_history=chat_history,
terms=terms_analysis,
language=language,
guideline_prompt=guideline_prompt,
model_name=model_name,
api_key=api_key,
model_server=model_server
)
tasks.append(guideline_task)
# 添加agent创建任务
agent_task = agent_manager.get_or_create_agent(
bot_id=bot_id,
project_dir=project_dir,
model_name=model_name,
api_key=api_key,
model_server=model_server,
generate_cfg=generate_cfg,
language=language,
system_prompt=processed_system_prompt,
mcp_settings=mcp_settings,
robot_type=robot_type,
user_identifier=user_identifier
)
tasks.append(agent_task)
# 并发执行所有任务
all_results = await asyncio.gather(*tasks, return_exceptions=True)
# 并发执行所有任务
all_results = await asyncio.gather(*tasks, return_exceptions=True)
# 处理结果
agent = all_results[-1] # agent创建的结果
guideline_reasoning = all_results[0] # guideline批次的结果
logger.info(f"Guideline analysis completed: {len(guideline_reasoning)} chars")
else:
# 没有guidelines直接创建agent
agent = await agent_manager.get_or_create_agent(
bot_id=bot_id,
project_dir=project_dir,
model_name=model_name,
api_key=api_key,
model_server=model_server,
generate_cfg=generate_cfg,
language=language,
system_prompt=processed_system_prompt,
mcp_settings=mcp_settings,
robot_type=robot_type,
user_identifier=user_identifier
)
# 处理结果
agent = all_results[0] if len(all_results) >0 else None # agent创建的结果
guideline_reasoning = all_results[1] if len(all_results) >1 else ""
if guideline_prompt or guideline_reasoning:
logger.info("Guideline Prompt: %s, Reasoning: %s",
guideline_prompt.replace('\n', '\\n') if guideline_prompt else "None",
guideline_reasoning.replace('\n', '\\n') if guideline_reasoning else "None")
logger.info("System Prompt: %s", processed_system_prompt.replace('\n', '\\n'))
return agent, processed_system_prompt, guideline_reasoning

View File

@ -544,7 +544,7 @@ async def call_preamble_llm(chat_history: str, last_message: str, preamble_choic
async def call_guideline_llm(chat_history: str, guidelines_text: str, terms:str, language:str, model_name: str, api_key: str, model_server: str) -> str:
async def call_guideline_llm(chat_history: str, guidelines_prompt: str, model_name: str, api_key: str, model_server: str) -> str:
"""调用大语言模型处理guideline分析
Args:
@ -553,20 +553,11 @@ async def call_guideline_llm(chat_history: str, guidelines_text: str, terms:str,
model_name: 模型名称
api_key: API密钥
model_server: 模型服务器地址
user_identifier: 用户标识符
Returns:
str: 模型响应结果
"""
# 读取guideline提示词模板
try:
with open('./prompt/guideline_prompt.md', 'r', encoding='utf-8') as f:
guideline_template = f.read()
except Exception as e:
logger.error(f"Error reading guideline prompt template: {e}")
return ""
# 替换模板中的占位符
system_prompt = guideline_template.replace('{chat_history}', chat_history).replace('{guidelines_text}', guidelines_text).replace('{terms}', terms).replace('{language}', get_language_text(language))
# 配置LLM
llm_config = {
@ -576,7 +567,7 @@ async def call_guideline_llm(chat_history: str, guidelines_text: str, terms:str,
}
# 调用模型
messages = [{'role': 'user', 'content': system_prompt}]
messages = [{'role': 'user', 'content': guidelines_prompt}]
try:
# 使用信号量控制并发API调用数量
@ -604,10 +595,8 @@ def _get_optimal_batch_size(guidelines_count: int) -> int:
async def process_guideline(
guidelines: str,
chat_history: str,
terms: str,
language: str,
guideline_prompt: str,
model_name: str,
api_key: str,
model_server: str
@ -618,7 +607,7 @@ async def process_guideline(
for attempt in range(max_retries):
try:
logger.info(f"Start processed guideline batch on attempt {attempt + 1}")
return await call_guideline_llm(chat_history, guidelines, terms, language, model_name, api_key, model_server)
return await call_guideline_llm(chat_history, guideline_prompt, model_name, api_key, model_server)
except Exception as e:
logger.error(f"Error processing guideline batch on attempt {attempt + 1}: {e}")
if attempt == max_retries - 1:
@ -628,7 +617,7 @@ async def process_guideline(
return ""
def extract_block_from_system_prompt(system_prompt: Optional[str]) -> tuple[str, List[Dict[str, Any]], List[Dict[str, Any]]]:
def extract_block_from_system_prompt(system_prompt: str) -> tuple[str, str, str, str, List]:
"""
从system prompt中提取guideline和terms内容
@ -642,6 +631,9 @@ def extract_block_from_system_prompt(system_prompt: Optional[str]) -> tuple[str,
return "", [], []
guidelines = ""
tools = ""
scenarios = ""
terms_list = []
# 首先分割所有的代码块
@ -651,9 +643,12 @@ def extract_block_from_system_prompt(system_prompt: Optional[str]) -> tuple[str,
for match in re.finditer(block_pattern, system_prompt, re.DOTALL):
block_type, content = match.groups()
if block_type == 'guideline':
if block_type == 'guideline' or block_type == 'guidelines':
guidelines = content.strip()
elif block_type == 'tools':
tools = content.strip()
elif block_type == 'scenarios':
scenarios = content.strip()
elif block_type == 'terms':
try:
terms = parse_terms_text(content.strip())
@ -669,8 +664,7 @@ def extract_block_from_system_prompt(system_prompt: Optional[str]) -> tuple[str,
# 清理多余的空行
cleaned_prompt = re.sub(r'\n\s*\n\s*\n', '\n\n', cleaned_prompt).strip()
return cleaned_prompt, guidelines, terms_list
return cleaned_prompt, guidelines, tools, scenarios, terms_list
def parse_guidelines_text(text: str) -> List[Dict[str, Any]]: