删除一些环境变量

This commit is contained in:
朱潮 2025-12-18 09:41:43 +08:00
parent 6bad1743b3
commit a92bea5b58
9 changed files with 114 additions and 186 deletions

View File

@ -1,16 +1,18 @@
# python环境
## python环境
本项目的python环境是基于 poetry创建的如果需要运行 py文件需要执行poetry run python xxx.py 来执行。
启动脚本:
```
poetry run uvicorn fastapi_app:app --host 0.0.0.0 --port 8001
```
测试脚本:
## 测试脚本:
```
curl --request POST \
--url http://localhost:8001/api/v2/chat/completions \
--header 'authorization: Bearer a21c99620a8ef61d69563afe05ccce89' \
--header 'content-type: application/json' \
--header 'x-trace-id: 123123123' \
--header 'X-Request-ID: 123123123' \
--data '{
"messages": [
{
@ -23,6 +25,10 @@ curl --request POST \
"language": "ja",
"bot_id": "63069654-7750-409d-9a58-a0960d899a20",
"tool_response": true,
"session_id":"xxxxx",
"user_identifier": "及川"
}'
```
## 环境变量
环境变量的代码都需要放到 utils/settings.py里管理

View File

@ -496,7 +496,7 @@ MODEL_SERVER=https://openrouter.ai/api/v1
API_KEY=your-api-key
# 队列配置
MAX_CACHED_AGENTS=20
AGENT_CACHE_MAX_SIZE=20
# 其他配置
TOKENIZERS_PARALLELISM=false

View File

@ -2,7 +2,6 @@
基于内存的 Agent 缓存管理模块
使用 cachetools 库实现 TTLCache LRUCache
"""
import os
import logging
import time
import threading
@ -11,6 +10,7 @@ from collections import OrderedDict
from datetime import datetime, timedelta
import cachetools
from utils.settings import AGENT_CACHE_MAX_SIZE, AGENT_CACHE_TTL, AGENT_CACHE_AUTO_RENEW
logger = logging.getLogger('app')
@ -325,15 +325,11 @@ def get_memory_cache_manager() -> AgentMemoryCacheManager:
global _global_cache_manager
if _global_cache_manager is None:
# 从环境变量或使用默认值
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"
# 从 settings 导入配置
_global_cache_manager = AgentMemoryCacheManager(
max_size=max_size,
default_ttl=default_ttl,
auto_renew=auto_renew
max_size=AGENT_CACHE_MAX_SIZE,
default_ttl=AGENT_CACHE_TTL,
auto_renew=AGENT_CACHE_AUTO_RENEW
)
return _global_cache_manager

View File

@ -65,19 +65,7 @@
### 环境变量配置
```bash
# Agent缓存配置
export MAX_CACHED_AGENTS=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
export AGENT_CACHE_MAX_SIZE=50
# Tokenizer优化
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: 添加性能监控端点
- 2024-01-16: 创建优化启动脚本
- 2024-01-16: 创建优化启动脚本

View File

@ -3,8 +3,8 @@
## 核心工具
```tools
- **空调/照明设备控制**:打开/关闭/调节 → Iot Control-dxcore_update_device_status
- 空调(dc_fan)设备参数说明:
- **风扇/照明/空调设备控制**:打开/关闭/调节 → dxcore_update_device_status
- 风扇(dc_fan)设备参数说明:
device_type: dc_fan
running_control: 运行控制 (可选, 0=停止, 1=启动)
automatic_manual_operation: 自动/手动模式 (可选, 0=手动, 1=自动)
@ -15,17 +15,22 @@
wind_direction_mode: 风向模式 (可选, 0=自动, 1=中央)
- 照明 (light)设备参数说明:
device_type: light
dimming_control: 调光控制 (可选, 0-100)
dimming_control: 调光控制 (可选, 0-100)
color_control_x: 色温控制 X 值 (可选, 与 color_control_y 同时使用)
color_control_y: 色温控制 Y 值 (可选, 与 color_control_x 同时使用)
- **空调/照明设备状态查询**通过设备id查状态/温度/湿度 → Iot Control-dxcore_get_device_status
- **查找某个房间的设备**:语义模糊检索,通过房间名查找房间内的设备 → Iot Control-find_devices_by_room → 可能会查出其他房间的设备需要根据confidence置信度和房间名进行合理决策。
- **人员检索**:找人/员工/同事/人员sensor_id查询/wowtalk账号查询 → Iot Control-find_employee_location
- **人员附近的空调/照明检索**通过人员的sensor_id查找附近的空调/照明 → 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
- 空调 (dcu)设备参数说明:
device_type: dcu
running_control: 运行控制 (可选, 0=停止, 1=启动)
temp_setting: 温度设定 (可选, 范围: 0.0-100.0)
- **空调/照明/风扇设备状态查询**通过设备id查状态/温度/湿度 → dxcore_get_device_status
其中OnlineStatus为在线状态0代表离线1代表在线DimmingControl 调光率0-100%255为离线情况
- **查找房间内设备**:语义模糊检索,通过房间名查找房间内的设备 → find_device_by_area → 可能会查出其他房间的设备, 如果有多个类似房间需要向用户确认具体是哪个房间。
- **人员检索**:找人/员工/同事/人员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%"
**用户**"关闭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 的设备,并向用户确认是否关闭
- dxcore_update_device_status(device_id="[A设备id]",running_control=0) → 灯光亮度调整为0
- dxcore_update_device_status(device_id="[B设备id]",running_control=0) → 灯光亮度调整为0
@ -75,80 +80,95 @@
- **条件**:用户意图为查询设备状态、参数(如温度、亮度)。
- **动作**:立即调用【设备检索】工具进行查询,可能会查询出多个设备,需要根据查询结果分析后回复。
2. 更新设备(此操作需要确认)
- **条件**:用户意图为控制设备或调节参数(如开关、温度、风速), 需要进行确认。
- **动作**
1. **若用户已明确确认**(如回复“好的”、“确认”):直接调用【设备控制】工具执行操作。
2. **若用户未确认且为新请求**:向用户发送确认提示:“即将为您 [操作内容] [设备名称] [具体参数],是否确认?”,待用户确认后再执行。
2. 查询房间或房间内的设备(此操作可能需要确认)
- **条件**:当用户意图为查询特定房间或房间内的设备时触发。
- **动作**:立即调用【查找房间内设备】工具进行查询。
- **关键判断与确认逻辑**
1. 工具级精确匹配:如果工具返回唯一且精确匹配的目标房间信息,则直接向用户清晰汇报查询结果(例如,房间列表或设备状态)。
2. 业务级精确匹配:虽然工具返回了多个候选房间,但根据业务规则(如房间类型、预设优先级)或用户历史行为,可以推断出其中一个房间极大概率是用户目标,则直接向用户清晰汇报查询结果。
3. 处理模糊或歧义结果:如果工具返回多个候选房间(即存在歧义),您需要:
▪ 主动向用户确认:向用户列出所有候选房间,并提示用户选择或明确具体是哪一个。确认提示语可参考:“请问您想查询的是以下哪个房间?[列出候选房间列表]”。
▪ 理解用户二次确认:等待用户回复后,根据其选择再次调用查询工具获取最终信息。用户对候选房间的指明(如回复“第一个”或重复房间名)应视为对该房间的确认。
4. 处理无匹配结果:如果工具返回未找到任何相关房间,应明确告知用户这一情况,并建议用户检查房间名称是否正确或提供更多线索。
3. 查询人员信息/wowtalk账号/人员位置
3. 更新设备(此操作需要确认)
- **条件**:用户意图为控制设备或调节参数(如开关、温度、风速), 需要进行确认。
- **关键判断与确认逻辑**
1. **上下文设备识别**
- 如果用户未指定具体设备或房间,但使用了"这个设备"、"那个房间"、"它"等指代词,需要从最近的聊天记录中推断对应的设备或房间
- 优先考虑最近一次查询的设备信息如最近查询的房间设备、设备ID等
- 如果上下文中有多台设备,需要向用户确认具体操作哪台设备
2. **若用户已明确确认**:直接调用【设备控制】工具执行操作。
3. **若用户未确认且为新请求**:向用户发送确认提示:"即将为您 [操作内容] [设备名称] [具体参数],是否确认?",待用户确认后再执行。
4. 查询人员信息/wowtalk账号/人员位置
- **条件**:用户意图为查找某人、员工、同事或房间位置。
- **动作**:立即调用【人员检索】进行查询,并直接根据查询结果回复。
4. 消息通知(此操作需要确认)
5. 消息通知(此操作需要确认)
- **条件**:用户意图为发送消息通知, 需要进行确认。
- **动作**
- **关键判断与确认逻辑**
1. **若用户已明确确认**调用【人员检索】获取wowtalk_id使用【消息通知】发送消息。
2. **若用户未确认且为新请求**:向用户发送确认提示:“即将发送 [消息内容] 的消息给 [人名],是否确认?”,待用户确认后再发送。
5. 查询天气
6. 查询天气
- **条件**:用户意图为查询天气信息。
- **动作**:调用【环境信息】工具进行查询,并直接根据查询结果回复。
6. 知识库查询
7. 知识库查询
- **条件**:用户咨询产品、政策、故障排查、 求助、物品遗失、 指路、事实性问题等。
- **动作**:按以下顺序处理并综合回复:
1. **优先**调用【知识库检索】工具查询知识库。
2. **若无结果**,则调用【网络搜索】工具进行网页搜索。
- **禁止**:空调/灯光设备不要调用此工具查询,知识库里没有相关信息。
7. 社交对话
8. 社交对话
- **条件**:用户意图为闲聊、问候、感谢、赞美等非实质性对话。
- **动作**:给予简洁、友好、拟人化的自然回复。
## 设备控制确认机制
### 操作类型判断
**无需确认的操作**
### 无需确认的操作:
- 状态查询:查询设备当前状态、温度、湿度、电量等
- 信息检索:查找设备位置、人员位置、设备列表等
- 紧急处理:安全隐患、设备故障等紧急情况
**需要确认的操作**
### 需要确认的操作
- 消息通知:发送通知、提醒等通信操作
- 状态改变:开启/关闭设备、调节参数(温度、亮度、风速等)
- 批量操作:同时控制多个设备
- 影响范围大的操作:影响整个房间或楼层的设备控制
- 关注当前问题的确认:只需要考虑当前的问题是否已被确认,前序消息获得的确认不适用于当前的问题
## 房间名称参考
Communication Step窓側
Communication Step付近
Define Area
Define Area中央
Define Area中央窓側
Define Room1
Define Room1前
Define Room2
Define Room2前
Define Room3
Define Room3前
Forum側 窓側
Forum側通路側
Forum側のゲート外側
Lab側 窓側
Lab側通路側
Lab側のゲート外側
NOVARE Forum
NOVARE Table 窓側
NOVARE Table付近
Refine Room1
Refine Room2
Refine Room3
Refine Area
### 用户确认意图推理
- 用户明确确认如回复“确认”、“好的”、“是的”、“拜托了”、“よろしく”、“请”、“please”等肯定性语气的内容。
- 用户意图重申用户完整或核心重复当前待执行的操作指令。例如提示“room302の照明1台を明るさ50%に調整してもよろしいですか?”用户回复“room302の照明を明るさ50%に変更”)
- 只关注当前问题的确认:只需要考虑当前的问题是否已被确认,前序消息获得的确认不适用于当前的问题
## 上下文推理示例
### 设备控制场景
**场景1**
- 用户:"你好301房间的空调状态。"
- 系统:"(查询后告知空调状态)"
- 用户:"把温度调到25度"
- 推理用户指的是301房间的空调应直接对301房间的空调进行温度调节
**场景2**
- 用户:"900541的设备状态。"
- 系统:"(查询后告知这是照明设备及其状态)"
- 用户:"把亮度调到50%"
- 推理用户指的是设备ID为900541的照明设备应直接调节该设备的亮度
**场景3**
- 用户:"会议室A的空调和灯光状态。"
- 系统:"查询后告知会议室A有空调和灯光两台设备"
- 用户:"关闭它"
- 推理:存在歧义,需要向用户确认是要关闭空调还是灯光,或是全部关闭
```
# 响应规范
## 回复原则
@ -158,6 +178,13 @@ Refine Area
- **即时响应**:工具调用完成后立即回复
- **不要展示id数据**涉及的wowtalk_id或者sensor_id等id,不要在回复里展示。
## 房间内设备数量相关表述​调整
当find_device_by_area查询结果显示某房间的 devices列表仅包含 1 个设备,但描述中明确提到该设备可控制“多组灯光”时,应理解为:
- 该房间实际存在多个灯光设备;
- 这些灯光在系统中被设定为统一控制,因此在设备列表中仅显示为一个控制单元;
- 在表述时不应将其称为“1 个设备”,而应把他们视为一个整体,并对用户描述为“该房间的灯光”。
- 也不能对用户说 这个控制单元可以控制哪几个灯光,对用户来说就是“这个房间的灯光”
## 标准回复格式
- **设备操作**"空调已调至24度运行正常"
- **消息发送**"消息已发送至田中さん"
@ -167,7 +194,7 @@ Refine Area
- **拒绝处理**"好的,已取消设备控制操作"
# 执行流程
1.基于用户给的Guidelines里的执行步骤按顺序依次一步一步地调用工具。
1.基于思考后的执行步骤按顺序依次一步一步地调用工具。
2.确保执行步骤完整执行后,组织合适的语言回复。
```preamble
@ -202,4 +229,4 @@ Refine Area
"今、全力で対応してますので、もう少しだけお時間くださいね。"
"そのあたり、私が引き受けますね。"
"はい、すぐに手配しますね。"
```
```

View File

@ -25,71 +25,6 @@ from agent.deep_assistant import init_agent
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(
config: AgentConfig
):
@ -597,4 +532,4 @@ async def chat_completions_v2(request: ChatRequestV2, authorization: Optional[st
error_details = traceback.format_exc()
logger.error(f"Error in chat_completions_v2: {str(e)}")
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)}")

View File

@ -62,32 +62,23 @@ setup_environment() {
case $PROFILE in
"low_memory")
export TOKENIZERS_PARALLELISM=false
export MAX_CACHED_AGENTS=20
export SHARD_COUNT=8
export FILE_CACHE_SIZE=500
export AGENT_CACHE_MAX_SIZE=20
;;
"balanced")
export TOKENIZERS_PARALLELISM=true
export TOKENIZERS_FAST=1
export MAX_CACHED_AGENTS=50
export SHARD_COUNT=16
export FILE_CACHE_SIZE=1000
export AGENT_CACHE_MAX_SIZE=50
;;
"high_performance")
export TOKENIZERS_PARALLELISM=true
export TOKENIZERS_FAST=1
export MAX_CACHED_AGENTS=100
export SHARD_COUNT=32
export FILE_CACHE_SIZE=2000
export AGENT_CACHE_MAX_SIZE=100
;;
esac
# 通用优化
export PYTHONUNBUFFERED=1
export PYTHONDONTWRITEBYTECODE=1
export MAX_CONNECTIONS_PER_HOST=100
export MAX_CONNECTIONS_TOTAL=500
export FILE_CACHE_TTL=300
print_color $GREEN "环境变量设置完成"
}
@ -323,4 +314,4 @@ main() {
}
# 运行主函数
main "$@"
main "$@"

View File

@ -226,34 +226,25 @@ class ProcessManager:
if args.profile == "low_memory":
env_vars = {
'TOKENIZERS_PARALLELISM': 'false',
'MAX_CACHED_AGENTS': '20',
'SHARD_COUNT': '8',
'FILE_CACHE_SIZE': '500',
'AGENT_CACHE_MAX_SIZE': '20',
}
elif args.profile == "balanced":
env_vars = {
'TOKENIZERS_PARALLELISM': 'true',
'TOKENIZERS_FAST': '1',
'MAX_CACHED_AGENTS': '50',
'SHARD_COUNT': '16',
'FILE_CACHE_SIZE': '1000',
'AGENT_CACHE_MAX_SIZE': '50',
}
elif args.profile == "high_performance":
env_vars = {
'TOKENIZERS_PARALLELISM': 'true',
'TOKENIZERS_FAST': '1',
'MAX_CACHED_AGENTS': '100',
'SHARD_COUNT': '32',
'FILE_CACHE_SIZE': '2000',
'AGENT_CACHE_MAX_SIZE': '100',
}
# 通用优化
env_vars.update({
'PYTHONUNBUFFERED': '1',
'PYTHONDONTWRITEBYTECODE': '1',
'MAX_CONNECTIONS_PER_HOST': '100',
'MAX_CONNECTIONS_TOTAL': '500',
'FILE_CACHE_TTL': '300',
})
for key, value in env_vars.items():

View File

@ -5,20 +5,12 @@ MAX_CONTEXT_TOKENS = int(os.getenv("MAX_CONTEXT_TOKENS", 262144))
MAX_OUTPUT_TOKENS = int(os.getenv("MAX_OUTPUT_TOKENS", 8000))
SUMMARIZATION_MAX_TOKENS = MAX_CONTEXT_TOKENS - MAX_OUTPUT_TOKENS - 1000
# Agent and Shard Settings
MAX_CACHED_AGENTS = int(os.getenv("MAX_CACHED_AGENTS", 50))
SHARD_COUNT = int(os.getenv("SHARD_COUNT", 16))
# Agent Cache Settings
AGENT_CACHE_MAX_SIZE = int(os.getenv("AGENT_CACHE_MAX_SIZE", 20))
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
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
DEFAULT_THINKING_ENABLE = os.getenv("DEFAULT_THINKING_ENABLE", "true") == "true"