删除一些环境变量
This commit is contained in:
parent
6bad1743b3
commit
a92bea5b58
12
CLAUDE.md
12
CLAUDE.md
@ -1,16 +1,18 @@
|
|||||||
# python环境
|
## python环境
|
||||||
本项目的python环境是基于 poetry创建的,如果需要运行 py文件,需要执行poetry run python xxx.py 来执行。
|
本项目的python环境是基于 poetry创建的,如果需要运行 py文件,需要执行poetry run python xxx.py 来执行。
|
||||||
启动脚本:
|
启动脚本:
|
||||||
```
|
```
|
||||||
poetry run uvicorn fastapi_app:app --host 0.0.0.0 --port 8001
|
poetry run uvicorn fastapi_app:app --host 0.0.0.0 --port 8001
|
||||||
```
|
```
|
||||||
测试脚本:
|
|
||||||
|
|
||||||
|
## 测试脚本:
|
||||||
```
|
```
|
||||||
curl --request POST \
|
curl --request POST \
|
||||||
--url http://localhost:8001/api/v2/chat/completions \
|
--url http://localhost:8001/api/v2/chat/completions \
|
||||||
--header 'authorization: Bearer a21c99620a8ef61d69563afe05ccce89' \
|
--header 'authorization: Bearer a21c99620a8ef61d69563afe05ccce89' \
|
||||||
--header 'content-type: application/json' \
|
--header 'content-type: application/json' \
|
||||||
--header 'x-trace-id: 123123123' \
|
--header 'X-Request-ID: 123123123' \
|
||||||
--data '{
|
--data '{
|
||||||
"messages": [
|
"messages": [
|
||||||
{
|
{
|
||||||
@ -23,6 +25,10 @@ curl --request POST \
|
|||||||
"language": "ja",
|
"language": "ja",
|
||||||
"bot_id": "63069654-7750-409d-9a58-a0960d899a20",
|
"bot_id": "63069654-7750-409d-9a58-a0960d899a20",
|
||||||
"tool_response": true,
|
"tool_response": true,
|
||||||
|
"session_id":"xxxxx",
|
||||||
"user_identifier": "及川"
|
"user_identifier": "及川"
|
||||||
}'
|
}'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 环境变量
|
||||||
|
环境变量的代码都需要放到 utils/settings.py里管理
|
||||||
|
|||||||
@ -496,7 +496,7 @@ MODEL_SERVER=https://openrouter.ai/api/v1
|
|||||||
API_KEY=your-api-key
|
API_KEY=your-api-key
|
||||||
|
|
||||||
# 队列配置
|
# 队列配置
|
||||||
MAX_CACHED_AGENTS=20
|
AGENT_CACHE_MAX_SIZE=20
|
||||||
|
|
||||||
# 其他配置
|
# 其他配置
|
||||||
TOKENIZERS_PARALLELISM=false
|
TOKENIZERS_PARALLELISM=false
|
||||||
|
|||||||
@ -2,7 +2,6 @@
|
|||||||
基于内存的 Agent 缓存管理模块
|
基于内存的 Agent 缓存管理模块
|
||||||
使用 cachetools 库实现 TTLCache 和 LRUCache
|
使用 cachetools 库实现 TTLCache 和 LRUCache
|
||||||
"""
|
"""
|
||||||
import os
|
|
||||||
import logging
|
import logging
|
||||||
import time
|
import time
|
||||||
import threading
|
import threading
|
||||||
@ -11,6 +10,7 @@ from collections import OrderedDict
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
import cachetools
|
import cachetools
|
||||||
|
from utils.settings import AGENT_CACHE_MAX_SIZE, AGENT_CACHE_TTL, AGENT_CACHE_AUTO_RENEW
|
||||||
|
|
||||||
logger = logging.getLogger('app')
|
logger = logging.getLogger('app')
|
||||||
|
|
||||||
@ -325,15 +325,11 @@ def get_memory_cache_manager() -> AgentMemoryCacheManager:
|
|||||||
global _global_cache_manager
|
global _global_cache_manager
|
||||||
|
|
||||||
if _global_cache_manager is None:
|
if _global_cache_manager is None:
|
||||||
# 从环境变量或使用默认值
|
# 从 settings 导入配置
|
||||||
max_size = int(os.getenv("AGENT_CACHE_MAX_SIZE", "20"))
|
|
||||||
default_ttl = int(os.getenv("AGENT_CACHE_TTL", "180"))
|
|
||||||
auto_renew = os.getenv("AGENT_CACHE_AUTO_RENEW", "true").lower() == "true"
|
|
||||||
|
|
||||||
_global_cache_manager = AgentMemoryCacheManager(
|
_global_cache_manager = AgentMemoryCacheManager(
|
||||||
max_size=max_size,
|
max_size=AGENT_CACHE_MAX_SIZE,
|
||||||
default_ttl=default_ttl,
|
default_ttl=AGENT_CACHE_TTL,
|
||||||
auto_renew=auto_renew
|
auto_renew=AGENT_CACHE_AUTO_RENEW
|
||||||
)
|
)
|
||||||
|
|
||||||
return _global_cache_manager
|
return _global_cache_manager
|
||||||
@ -65,19 +65,7 @@
|
|||||||
### 环境变量配置
|
### 环境变量配置
|
||||||
```bash
|
```bash
|
||||||
# Agent缓存配置
|
# Agent缓存配置
|
||||||
export MAX_CACHED_AGENTS=50
|
export AGENT_CACHE_MAX_SIZE=50
|
||||||
export SHARD_COUNT=16
|
|
||||||
|
|
||||||
# 连接池配置
|
|
||||||
export MAX_CONNECTIONS_PER_HOST=100
|
|
||||||
export MAX_CONNECTIONS_TOTAL=500
|
|
||||||
export KEEPALIVE_TIMEOUT=30
|
|
||||||
export CONNECT_TIMEOUT=10
|
|
||||||
export TOTAL_TIMEOUT=60
|
|
||||||
|
|
||||||
# 文件缓存配置
|
|
||||||
export FILE_CACHE_SIZE=1000
|
|
||||||
export FILE_CACHE_TTL=300
|
|
||||||
|
|
||||||
# Tokenizer优化
|
# Tokenizer优化
|
||||||
export TOKENIZERS_PARALLELISM=true
|
export TOKENIZERS_PARALLELISM=true
|
||||||
@ -177,4 +165,4 @@ wrk -t12 -c400 -d30s -s request.lua http://localhost:8001/api/v1/chat/completion
|
|||||||
|
|
||||||
- 2024-01-16: 完成所有5项优化措施
|
- 2024-01-16: 完成所有5项优化措施
|
||||||
- 2024-01-16: 添加性能监控端点
|
- 2024-01-16: 添加性能监控端点
|
||||||
- 2024-01-16: 创建优化启动脚本
|
- 2024-01-16: 创建优化启动脚本
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
|
|
||||||
## 核心工具
|
## 核心工具
|
||||||
```tools
|
```tools
|
||||||
- **空调/照明设备控制**:打开/关闭/调节 → Iot Control-dxcore_update_device_status
|
- **风扇/照明/空调设备控制**:打开/关闭/调节 → dxcore_update_device_status
|
||||||
- 空调(dc_fan)设备参数说明:
|
- 风扇(dc_fan)设备参数说明:
|
||||||
device_type: dc_fan
|
device_type: dc_fan
|
||||||
running_control: 运行控制 (可选, 0=停止, 1=启动)
|
running_control: 运行控制 (可选, 0=停止, 1=启动)
|
||||||
automatic_manual_operation: 自动/手动模式 (可选, 0=手动, 1=自动)
|
automatic_manual_operation: 自动/手动模式 (可选, 0=手动, 1=自动)
|
||||||
@ -15,17 +15,22 @@
|
|||||||
wind_direction_mode: 风向模式 (可选, 0=自动, 1=中央)
|
wind_direction_mode: 风向模式 (可选, 0=自动, 1=中央)
|
||||||
- 照明 (light)设备参数说明:
|
- 照明 (light)设备参数说明:
|
||||||
device_type: light
|
device_type: light
|
||||||
dimming_control: 调光控制 (可选, 0-100)
|
dimming_control: 调光控制 (可选, 0-100)
|
||||||
color_control_x: 色温控制 X 值 (可选, 与 color_control_y 同时使用)
|
color_control_x: 色温控制 X 值 (可选, 与 color_control_y 同时使用)
|
||||||
color_control_y: 色温控制 Y 值 (可选, 与 color_control_x 同时使用)
|
color_control_y: 色温控制 Y 值 (可选, 与 color_control_x 同时使用)
|
||||||
- **空调/照明设备状态查询**:通过设备id查状态/温度/湿度 → Iot Control-dxcore_get_device_status
|
- 空调 (dcu)设备参数说明:
|
||||||
- **查找某个房间的设备**:语义模糊检索,通过房间名查找房间内的设备 → Iot Control-find_devices_by_room → 可能会查出其他房间的设备,需要根据confidence置信度和房间名进行合理决策。
|
device_type: dcu
|
||||||
- **人员检索**:找人/员工/同事/人员sensor_id查询/wowtalk账号查询 → Iot Control-find_employee_location
|
running_control: 运行控制 (可选, 0=停止, 1=启动)
|
||||||
- **人员附近的空调/照明检索**:通过人员的sensor_id查找附近的空调/照明 → Iot Control-find_iot_device
|
temp_setting: 温度设定 (可选, 范围: 0.0-100.0)
|
||||||
- **消息通知**:通知/告知/提醒 → Wowtalk tool-wowtalk_send_message_to_member
|
- **空调/照明/风扇设备状态查询**:通过设备id查状态/温度/湿度 → dxcore_get_device_status
|
||||||
- **环境信息**:天气/气温/风速 → Weather Information-weather_get_by_location
|
其中OnlineStatus为在线状态,0代表离线,1代表在线,DimmingControl 调光率0-100%(255为离线情况)
|
||||||
- **知识库检索**: 知识查询/其他查询优先检索知识库 → rag_retrieve-rag_retrieve
|
- **查找房间内设备**:语义模糊检索,通过房间名查找房间内的设备 → find_device_by_area → 可能会查出其他房间的设备, 如果有多个类似房间需要向用户确认具体是哪个房间。
|
||||||
- **网络搜索**:搜索/查询/百度 → WebSearch-web_search
|
- **人员检索**:找人/员工/同事/人员sensor_id查询/wowtalk账号查询 → find_employee_location
|
||||||
|
- **人员附近的空调/照明检索**:通过人员的sensor_id查找附近的空调/照明 → find_iot_device
|
||||||
|
- **消息通知**:通知/告知/提醒 → wowtalk_send_message_to_member
|
||||||
|
- **环境信息**:天气/气温/风速 → weather_get_by_location
|
||||||
|
- **知识库检索**: 知识查询/其他查询优先检索知识库 → rag_retrieve
|
||||||
|
- **网络搜索**:搜索/查询/百度 → web_search
|
||||||
```
|
```
|
||||||
|
|
||||||
## 应用场景
|
## 应用场景
|
||||||
@ -60,7 +65,7 @@
|
|||||||
**响应**:"已通知清水さん,风扇位于5楼东侧,电量15%"
|
**响应**:"已通知清水さん,风扇位于5楼东侧,电量15%"
|
||||||
|
|
||||||
**用户**:"关闭Define Room4的灯光"
|
**用户**:"关闭Define Room4的灯光"
|
||||||
- find_devices_by_room(room_description="Define Room4",device_type="light") → 通过Define Room4名称模糊查找
|
- find_device_by_area(description="Define Room4",device_type="light") → 通过Define Room4名称模糊查找
|
||||||
- 根据find_devices_by_room返回的设备列表找到 Define Room4 的设备,并向用户确认是否关闭
|
- 根据find_devices_by_room返回的设备列表找到 Define Room4 的设备,并向用户确认是否关闭
|
||||||
- dxcore_update_device_status(device_id="[A设备id]",running_control=0) → 灯光亮度调整为0
|
- dxcore_update_device_status(device_id="[A设备id]",running_control=0) → 灯光亮度调整为0
|
||||||
- dxcore_update_device_status(device_id="[B设备id]",running_control=0) → 灯光亮度调整为0
|
- dxcore_update_device_status(device_id="[B设备id]",running_control=0) → 灯光亮度调整为0
|
||||||
@ -75,80 +80,95 @@
|
|||||||
- **条件**:用户意图为查询设备状态、参数(如温度、亮度)。
|
- **条件**:用户意图为查询设备状态、参数(如温度、亮度)。
|
||||||
- **动作**:立即调用【设备检索】工具进行查询,可能会查询出多个设备,需要根据查询结果分析后回复。
|
- **动作**:立即调用【设备检索】工具进行查询,可能会查询出多个设备,需要根据查询结果分析后回复。
|
||||||
|
|
||||||
2. 更新设备(此操作需要确认)
|
2. 查询房间或房间内的设备(此操作可能需要确认)
|
||||||
- **条件**:用户意图为控制设备或调节参数(如开关、温度、风速), 需要进行确认。
|
- **条件**:当用户意图为查询特定房间或房间内的设备时触发。
|
||||||
- **动作**:
|
- **动作**:立即调用【查找房间内设备】工具进行查询。
|
||||||
1. **若用户已明确确认**(如回复“好的”、“确认”):直接调用【设备控制】工具执行操作。
|
- **关键判断与确认逻辑**::
|
||||||
2. **若用户未确认且为新请求**:向用户发送确认提示:“即将为您 [操作内容] [设备名称] [具体参数],是否确认?”,待用户确认后再执行。
|
1. 工具级精确匹配:如果工具返回唯一且精确匹配的目标房间信息,则直接向用户清晰汇报查询结果(例如,房间列表或设备状态)。
|
||||||
|
2. 业务级精确匹配:虽然工具返回了多个候选房间,但根据业务规则(如房间类型、预设优先级)或用户历史行为,可以推断出其中一个房间极大概率是用户目标,则直接向用户清晰汇报查询结果。
|
||||||
|
3. 处理模糊或歧义结果:如果工具返回多个候选房间(即存在歧义),您需要:
|
||||||
|
▪ 主动向用户确认:向用户列出所有候选房间,并提示用户选择或明确具体是哪一个。确认提示语可参考:“请问您想查询的是以下哪个房间?[列出候选房间列表]”。
|
||||||
|
▪ 理解用户二次确认:等待用户回复后,根据其选择再次调用查询工具获取最终信息。用户对候选房间的指明(如回复“第一个”或重复房间名)应视为对该房间的确认。
|
||||||
|
4. 处理无匹配结果:如果工具返回未找到任何相关房间,应明确告知用户这一情况,并建议用户检查房间名称是否正确或提供更多线索。
|
||||||
|
|
||||||
3. 查询人员信息/wowtalk账号/人员位置
|
3. 更新设备(此操作需要确认)
|
||||||
|
- **条件**:用户意图为控制设备或调节参数(如开关、温度、风速), 需要进行确认。
|
||||||
|
- **关键判断与确认逻辑**:
|
||||||
|
1. **上下文设备识别**:
|
||||||
|
- 如果用户未指定具体设备或房间,但使用了"这个设备"、"那个房间"、"它"等指代词,需要从最近的聊天记录中推断对应的设备或房间
|
||||||
|
- 优先考虑最近一次查询的设备信息(如最近查询的房间设备、设备ID等)
|
||||||
|
- 如果上下文中有多台设备,需要向用户确认具体操作哪台设备
|
||||||
|
2. **若用户已明确确认**:直接调用【设备控制】工具执行操作。
|
||||||
|
3. **若用户未确认且为新请求**:向用户发送确认提示:"即将为您 [操作内容] [设备名称] [具体参数],是否确认?",待用户确认后再执行。
|
||||||
|
|
||||||
|
4. 查询人员信息/wowtalk账号/人员位置
|
||||||
- **条件**:用户意图为查找某人、员工、同事或房间位置。
|
- **条件**:用户意图为查找某人、员工、同事或房间位置。
|
||||||
- **动作**:立即调用【人员检索】进行查询,并直接根据查询结果回复。
|
- **动作**:立即调用【人员检索】进行查询,并直接根据查询结果回复。
|
||||||
|
|
||||||
4. 消息通知(此操作需要确认)
|
5. 消息通知(此操作需要确认)
|
||||||
- **条件**:用户意图为发送消息通知, 需要进行确认。
|
- **条件**:用户意图为发送消息通知, 需要进行确认。
|
||||||
- **动作**:
|
- **关键判断与确认逻辑**:
|
||||||
1. **若用户已明确确认**:调用【人员检索】获取wowtalk_id,使用【消息通知】发送消息。
|
1. **若用户已明确确认**:调用【人员检索】获取wowtalk_id,使用【消息通知】发送消息。
|
||||||
2. **若用户未确认且为新请求**:向用户发送确认提示:“即将发送 [消息内容] 的消息给 [人名],是否确认?”,待用户确认后再发送。
|
2. **若用户未确认且为新请求**:向用户发送确认提示:“即将发送 [消息内容] 的消息给 [人名],是否确认?”,待用户确认后再发送。
|
||||||
|
|
||||||
5. 查询天气
|
6. 查询天气
|
||||||
- **条件**:用户意图为查询天气信息。
|
- **条件**:用户意图为查询天气信息。
|
||||||
- **动作**:调用【环境信息】工具进行查询,并直接根据查询结果回复。
|
- **动作**:调用【环境信息】工具进行查询,并直接根据查询结果回复。
|
||||||
|
|
||||||
6. 知识库查询
|
7. 知识库查询
|
||||||
- **条件**:用户咨询产品、政策、故障排查、 求助、物品遗失、 指路、事实性问题等。
|
- **条件**:用户咨询产品、政策、故障排查、 求助、物品遗失、 指路、事实性问题等。
|
||||||
- **动作**:按以下顺序处理并综合回复:
|
- **动作**:按以下顺序处理并综合回复:
|
||||||
1. **优先**调用【知识库检索】工具查询知识库。
|
1. **优先**调用【知识库检索】工具查询知识库。
|
||||||
2. **若无结果**,则调用【网络搜索】工具进行网页搜索。
|
2. **若无结果**,则调用【网络搜索】工具进行网页搜索。
|
||||||
- **禁止**:空调/灯光设备不要调用此工具查询,知识库里没有相关信息。
|
- **禁止**:空调/灯光设备不要调用此工具查询,知识库里没有相关信息。
|
||||||
|
|
||||||
7. 社交对话
|
8. 社交对话
|
||||||
- **条件**:用户意图为闲聊、问候、感谢、赞美等非实质性对话。
|
- **条件**:用户意图为闲聊、问候、感谢、赞美等非实质性对话。
|
||||||
- **动作**:给予简洁、友好、拟人化的自然回复。
|
- **动作**:给予简洁、友好、拟人化的自然回复。
|
||||||
|
|
||||||
|
|
||||||
## 设备控制确认机制
|
## 设备控制确认机制
|
||||||
|
|
||||||
### 操作类型判断
|
### 无需确认的操作:
|
||||||
**无需确认的操作**:
|
|
||||||
- 状态查询:查询设备当前状态、温度、湿度、电量等
|
- 状态查询:查询设备当前状态、温度、湿度、电量等
|
||||||
- 信息检索:查找设备位置、人员位置、设备列表等
|
- 信息检索:查找设备位置、人员位置、设备列表等
|
||||||
- 紧急处理:安全隐患、设备故障等紧急情况
|
- 紧急处理:安全隐患、设备故障等紧急情况
|
||||||
|
|
||||||
**需要确认的操作**:
|
### 需要确认的操作:
|
||||||
- 消息通知:发送通知、提醒等通信操作
|
- 消息通知:发送通知、提醒等通信操作
|
||||||
- 状态改变:开启/关闭设备、调节参数(温度、亮度、风速等)
|
- 状态改变:开启/关闭设备、调节参数(温度、亮度、风速等)
|
||||||
- 批量操作:同时控制多个设备
|
- 批量操作:同时控制多个设备
|
||||||
- 影响范围大的操作:影响整个房间或楼层的设备控制
|
- 影响范围大的操作:影响整个房间或楼层的设备控制
|
||||||
- 关注当前问题的确认:只需要考虑当前的问题是否已被确认,前序消息获得的确认不适用于当前的问题
|
|
||||||
|
|
||||||
## 房间名称参考
|
### 用户确认意图推理
|
||||||
Communication Step窓側
|
- 用户明确确认:如回复“确认”、“好的”、“是的”、“拜托了”、“よろしく”、“请”、“please”等肯定性语气的内容。
|
||||||
Communication Step付近
|
- 用户意图重申:用户完整或核心重复当前待执行的操作指令。(例如,提示“room302の照明1台を明るさ50%に調整してもよろしいですか?”,用户回复“room302の照明を明るさ50%に変更”)
|
||||||
Define Area
|
- 只关注当前问题的确认:只需要考虑当前的问题是否已被确认,前序消息获得的确认不适用于当前的问题
|
||||||
Define Area中央
|
|
||||||
Define Area中央窓側
|
## 上下文推理示例
|
||||||
Define Room1
|
|
||||||
Define Room1前
|
### 设备控制场景
|
||||||
Define Room2
|
**场景1**:
|
||||||
Define Room2前
|
- 用户:"你好,301房间的空调状态。"
|
||||||
Define Room3
|
- 系统:"(查询后告知空调状态)"
|
||||||
Define Room3前
|
- 用户:"把温度调到25度"
|
||||||
Forum側 窓側
|
- 推理:用户指的是301房间的空调,应直接对301房间的空调进行温度调节
|
||||||
Forum側通路側
|
|
||||||
Forum側のゲート外側
|
**场景2**:
|
||||||
Lab側 窓側
|
- 用户:"900541的设备状态。"
|
||||||
Lab側通路側
|
- 系统:"(查询后告知这是照明设备及其状态)"
|
||||||
Lab側のゲート外側
|
- 用户:"把亮度调到50%"
|
||||||
NOVARE Forum
|
- 推理:用户指的是设备ID为900541的照明设备,应直接调节该设备的亮度
|
||||||
NOVARE Table 窓側
|
|
||||||
NOVARE Table付近
|
**场景3**:
|
||||||
Refine Room1
|
- 用户:"会议室A的空调和灯光状态。"
|
||||||
Refine Room2
|
- 系统:"(查询后告知会议室A有空调和灯光两台设备)"
|
||||||
Refine Room3
|
- 用户:"关闭它"
|
||||||
Refine Area
|
- 推理:存在歧义,需要向用户确认是要关闭空调还是灯光,或是全部关闭
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
# 响应规范
|
# 响应规范
|
||||||
|
|
||||||
## 回复原则
|
## 回复原则
|
||||||
@ -158,6 +178,13 @@ Refine Area
|
|||||||
- **即时响应**:工具调用完成后立即回复
|
- **即时响应**:工具调用完成后立即回复
|
||||||
- **不要展示id数据**:涉及的wowtalk_id或者sensor_id等id,不要在回复里展示。
|
- **不要展示id数据**:涉及的wowtalk_id或者sensor_id等id,不要在回复里展示。
|
||||||
|
|
||||||
|
## 房间内设备数量相关表述调整
|
||||||
|
当find_device_by_area查询结果显示某房间的 devices列表仅包含 1 个设备,但描述中明确提到该设备可控制“多组灯光”时,应理解为:
|
||||||
|
- 该房间实际存在多个灯光设备;
|
||||||
|
- 这些灯光在系统中被设定为统一控制,因此在设备列表中仅显示为一个控制单元;
|
||||||
|
- 在表述时,不应将其称为“1 个设备”,而应把他们视为一个整体,并对用户描述为“该房间的灯光”。
|
||||||
|
- 也不能对用户说 这个控制单元可以控制哪几个灯光,对用户来说就是“这个房间的灯光”
|
||||||
|
|
||||||
## 标准回复格式
|
## 标准回复格式
|
||||||
- **设备操作**:"空调已调至24度,运行正常"
|
- **设备操作**:"空调已调至24度,运行正常"
|
||||||
- **消息发送**:"消息已发送至田中さん"
|
- **消息发送**:"消息已发送至田中さん"
|
||||||
@ -167,7 +194,7 @@ Refine Area
|
|||||||
- **拒绝处理**:"好的,已取消设备控制操作"
|
- **拒绝处理**:"好的,已取消设备控制操作"
|
||||||
|
|
||||||
# 执行流程
|
# 执行流程
|
||||||
1.基于用户给的Guidelines里的执行步骤按顺序依次一步一步地调用工具。
|
1.基于思考后的执行步骤按顺序依次一步一步地调用工具。
|
||||||
2.确保执行步骤完整执行后,组织合适的语言回复。
|
2.确保执行步骤完整执行后,组织合适的语言回复。
|
||||||
|
|
||||||
```preamble
|
```preamble
|
||||||
@ -202,4 +229,4 @@ Refine Area
|
|||||||
"今、全力で対応してますので、もう少しだけお時間くださいね。"
|
"今、全力で対応してますので、もう少しだけお時間くださいね。"
|
||||||
"そのあたり、私が引き受けますね。"
|
"そのあたり、私が引き受けますね。"
|
||||||
"はい、すぐに手配しますね。"
|
"はい、すぐに手配しますね。"
|
||||||
```
|
```
|
||||||
@ -25,71 +25,6 @@ from agent.deep_assistant import init_agent
|
|||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def append_user_last_message(messages: list, content: str) -> bool:
|
|
||||||
"""向最后一条用户消息追加内容
|
|
||||||
|
|
||||||
Args:
|
|
||||||
messages: 消息列表
|
|
||||||
content: 要追加的内容
|
|
||||||
condition: 可选条件,如果提供则检查消息角色是否匹配此条件
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
bool: 是否成功追加内容
|
|
||||||
"""
|
|
||||||
if not messages or len(messages) == 0:
|
|
||||||
return messages
|
|
||||||
last_message = messages[-1]
|
|
||||||
if last_message and last_message.get('role') == 'user':
|
|
||||||
messages[-1]['content'] += content
|
|
||||||
return messages
|
|
||||||
|
|
||||||
def append_assistant_last_message(messages: list, content: str) -> bool:
|
|
||||||
"""向最后一条用户消息追加内容
|
|
||||||
|
|
||||||
Args:
|
|
||||||
messages: 消息列表
|
|
||||||
content: 要追加的内容
|
|
||||||
condition: 可选条件,如果提供则检查消息角色是否匹配此条件
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
bool: 是否成功追加内容
|
|
||||||
"""
|
|
||||||
if not messages or len(messages) == 0:
|
|
||||||
return messages
|
|
||||||
last_message = messages[-1]
|
|
||||||
if last_message and last_message.get('role') == 'assistant':
|
|
||||||
messages[-1]['content'] += content
|
|
||||||
else:
|
|
||||||
messages.append({"role":"assistant","content":content})
|
|
||||||
return messages
|
|
||||||
|
|
||||||
|
|
||||||
def get_user_last_message_content(messages: list) -> str:
|
|
||||||
"""获取最后一条用户消息的内容"""
|
|
||||||
if not messages:
|
|
||||||
return ""
|
|
||||||
|
|
||||||
for msg in reversed(messages):
|
|
||||||
if msg.get('role') == 'user':
|
|
||||||
return msg.get('content', '')
|
|
||||||
|
|
||||||
return ""
|
|
||||||
|
|
||||||
|
|
||||||
def format_messages_to_chat_history(messages: list) -> str:
|
|
||||||
"""将消息格式化为聊天历史字符串"""
|
|
||||||
chat_history = ""
|
|
||||||
for msg in messages:
|
|
||||||
role = msg.get('role', '')
|
|
||||||
content = msg.get('content', '')
|
|
||||||
if role == 'user':
|
|
||||||
chat_history += f"用户: {content}\n"
|
|
||||||
elif role == 'assistant':
|
|
||||||
chat_history += f"助手: {content}\n"
|
|
||||||
return chat_history
|
|
||||||
|
|
||||||
|
|
||||||
async def enhanced_generate_stream_response(
|
async def enhanced_generate_stream_response(
|
||||||
config: AgentConfig
|
config: AgentConfig
|
||||||
):
|
):
|
||||||
@ -597,4 +532,4 @@ async def chat_completions_v2(request: ChatRequestV2, authorization: Optional[st
|
|||||||
error_details = traceback.format_exc()
|
error_details = traceback.format_exc()
|
||||||
logger.error(f"Error in chat_completions_v2: {str(e)}")
|
logger.error(f"Error in chat_completions_v2: {str(e)}")
|
||||||
logger.error(f"Full traceback: {error_details}")
|
logger.error(f"Full traceback: {error_details}")
|
||||||
raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
|
raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
|
||||||
|
|||||||
@ -62,32 +62,23 @@ setup_environment() {
|
|||||||
case $PROFILE in
|
case $PROFILE in
|
||||||
"low_memory")
|
"low_memory")
|
||||||
export TOKENIZERS_PARALLELISM=false
|
export TOKENIZERS_PARALLELISM=false
|
||||||
export MAX_CACHED_AGENTS=20
|
export AGENT_CACHE_MAX_SIZE=20
|
||||||
export SHARD_COUNT=8
|
|
||||||
export FILE_CACHE_SIZE=500
|
|
||||||
;;
|
;;
|
||||||
"balanced")
|
"balanced")
|
||||||
export TOKENIZERS_PARALLELISM=true
|
export TOKENIZERS_PARALLELISM=true
|
||||||
export TOKENIZERS_FAST=1
|
export TOKENIZERS_FAST=1
|
||||||
export MAX_CACHED_AGENTS=50
|
export AGENT_CACHE_MAX_SIZE=50
|
||||||
export SHARD_COUNT=16
|
|
||||||
export FILE_CACHE_SIZE=1000
|
|
||||||
;;
|
;;
|
||||||
"high_performance")
|
"high_performance")
|
||||||
export TOKENIZERS_PARALLELISM=true
|
export TOKENIZERS_PARALLELISM=true
|
||||||
export TOKENIZERS_FAST=1
|
export TOKENIZERS_FAST=1
|
||||||
export MAX_CACHED_AGENTS=100
|
export AGENT_CACHE_MAX_SIZE=100
|
||||||
export SHARD_COUNT=32
|
|
||||||
export FILE_CACHE_SIZE=2000
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# 通用优化
|
# 通用优化
|
||||||
export PYTHONUNBUFFERED=1
|
export PYTHONUNBUFFERED=1
|
||||||
export PYTHONDONTWRITEBYTECODE=1
|
export PYTHONDONTWRITEBYTECODE=1
|
||||||
export MAX_CONNECTIONS_PER_HOST=100
|
|
||||||
export MAX_CONNECTIONS_TOTAL=500
|
|
||||||
export FILE_CACHE_TTL=300
|
|
||||||
|
|
||||||
print_color $GREEN "环境变量设置完成"
|
print_color $GREEN "环境变量设置完成"
|
||||||
}
|
}
|
||||||
@ -323,4 +314,4 @@ main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# 运行主函数
|
# 运行主函数
|
||||||
main "$@"
|
main "$@"
|
||||||
|
|||||||
@ -226,34 +226,25 @@ class ProcessManager:
|
|||||||
if args.profile == "low_memory":
|
if args.profile == "low_memory":
|
||||||
env_vars = {
|
env_vars = {
|
||||||
'TOKENIZERS_PARALLELISM': 'false',
|
'TOKENIZERS_PARALLELISM': 'false',
|
||||||
'MAX_CACHED_AGENTS': '20',
|
'AGENT_CACHE_MAX_SIZE': '20',
|
||||||
'SHARD_COUNT': '8',
|
|
||||||
'FILE_CACHE_SIZE': '500',
|
|
||||||
}
|
}
|
||||||
elif args.profile == "balanced":
|
elif args.profile == "balanced":
|
||||||
env_vars = {
|
env_vars = {
|
||||||
'TOKENIZERS_PARALLELISM': 'true',
|
'TOKENIZERS_PARALLELISM': 'true',
|
||||||
'TOKENIZERS_FAST': '1',
|
'TOKENIZERS_FAST': '1',
|
||||||
'MAX_CACHED_AGENTS': '50',
|
'AGENT_CACHE_MAX_SIZE': '50',
|
||||||
'SHARD_COUNT': '16',
|
|
||||||
'FILE_CACHE_SIZE': '1000',
|
|
||||||
}
|
}
|
||||||
elif args.profile == "high_performance":
|
elif args.profile == "high_performance":
|
||||||
env_vars = {
|
env_vars = {
|
||||||
'TOKENIZERS_PARALLELISM': 'true',
|
'TOKENIZERS_PARALLELISM': 'true',
|
||||||
'TOKENIZERS_FAST': '1',
|
'TOKENIZERS_FAST': '1',
|
||||||
'MAX_CACHED_AGENTS': '100',
|
'AGENT_CACHE_MAX_SIZE': '100',
|
||||||
'SHARD_COUNT': '32',
|
|
||||||
'FILE_CACHE_SIZE': '2000',
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# 通用优化
|
# 通用优化
|
||||||
env_vars.update({
|
env_vars.update({
|
||||||
'PYTHONUNBUFFERED': '1',
|
'PYTHONUNBUFFERED': '1',
|
||||||
'PYTHONDONTWRITEBYTECODE': '1',
|
'PYTHONDONTWRITEBYTECODE': '1',
|
||||||
'MAX_CONNECTIONS_PER_HOST': '100',
|
|
||||||
'MAX_CONNECTIONS_TOTAL': '500',
|
|
||||||
'FILE_CACHE_TTL': '300',
|
|
||||||
})
|
})
|
||||||
|
|
||||||
for key, value in env_vars.items():
|
for key, value in env_vars.items():
|
||||||
|
|||||||
@ -5,20 +5,12 @@ MAX_CONTEXT_TOKENS = int(os.getenv("MAX_CONTEXT_TOKENS", 262144))
|
|||||||
MAX_OUTPUT_TOKENS = int(os.getenv("MAX_OUTPUT_TOKENS", 8000))
|
MAX_OUTPUT_TOKENS = int(os.getenv("MAX_OUTPUT_TOKENS", 8000))
|
||||||
SUMMARIZATION_MAX_TOKENS = MAX_CONTEXT_TOKENS - MAX_OUTPUT_TOKENS - 1000
|
SUMMARIZATION_MAX_TOKENS = MAX_CONTEXT_TOKENS - MAX_OUTPUT_TOKENS - 1000
|
||||||
|
|
||||||
# Agent and Shard Settings
|
# Agent Cache Settings
|
||||||
MAX_CACHED_AGENTS = int(os.getenv("MAX_CACHED_AGENTS", 50))
|
AGENT_CACHE_MAX_SIZE = int(os.getenv("AGENT_CACHE_MAX_SIZE", 20))
|
||||||
SHARD_COUNT = int(os.getenv("SHARD_COUNT", 16))
|
AGENT_CACHE_TTL = int(os.getenv("AGENT_CACHE_TTL", 180))
|
||||||
|
AGENT_CACHE_AUTO_RENEW = os.getenv("AGENT_CACHE_AUTO_RENEW", "true") == "true"
|
||||||
|
|
||||||
# Connection Settings
|
|
||||||
MAX_CONNECTIONS_PER_HOST = int(os.getenv("MAX_CONNECTIONS_PER_HOST", 100))
|
|
||||||
MAX_CONNECTIONS_TOTAL = int(os.getenv("MAX_CONNECTIONS_TOTAL", 500))
|
|
||||||
KEEPALIVE_TIMEOUT = int(os.getenv("KEEPALIVE_TIMEOUT", 30))
|
|
||||||
CONNECT_TIMEOUT = int(os.getenv("CONNECT_TIMEOUT", 10))
|
|
||||||
TOTAL_TIMEOUT = int(os.getenv("TOTAL_TIMEOUT", 60))
|
|
||||||
|
|
||||||
# File Cache Settings
|
|
||||||
FILE_CACHE_SIZE = int(os.getenv("FILE_CACHE_SIZE", 1000))
|
|
||||||
FILE_CACHE_TTL = int(os.getenv("FILE_CACHE_TTL", 300))
|
|
||||||
|
|
||||||
# API Settings
|
# API Settings
|
||||||
BACKEND_HOST = os.getenv("BACKEND_HOST", "https://api-dev.gptbase.ai")
|
BACKEND_HOST = os.getenv("BACKEND_HOST", "https://api-dev.gptbase.ai")
|
||||||
@ -40,3 +32,5 @@ TOOL_OUTPUT_TRUNCATION_STRATEGY = os.getenv("TOOL_OUTPUT_TRUNCATION_STRATEGY", "
|
|||||||
|
|
||||||
# THINKING ENABLE
|
# THINKING ENABLE
|
||||||
DEFAULT_THINKING_ENABLE = os.getenv("DEFAULT_THINKING_ENABLE", "true") == "true"
|
DEFAULT_THINKING_ENABLE = os.getenv("DEFAULT_THINKING_ENABLE", "true") == "true"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user