From 52d8161b0ef0a1c087081c76f728884d6c466fe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E6=BD=AE?= Date: Wed, 4 Mar 2026 14:08:26 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=A1=AE=E4=BF=9D=20max?= =?UTF-8?q?=5Flength=20=E6=B0=B8=E8=BF=9C=E4=B8=8D=E4=BC=9A=E6=98=AF=20Non?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agent/deep_assistant.py | 2 +- agent/tool_output_length_middleware.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/agent/deep_assistant.py b/agent/deep_assistant.py index 7933792..f8183aa 100644 --- a/agent/deep_assistant.py +++ b/agent/deep_assistant.py @@ -220,7 +220,7 @@ async def init_agent(config: AgentConfig): middleware.append(ToolUseCleanupMiddleware()) # 添加工具输出长度控制中间件 tool_output_middleware = ToolOutputLengthMiddleware( - max_length=getattr(config.generate_cfg, 'tool_output_max_length', None) if config.generate_cfg else None or TOOL_OUTPUT_MAX_LENGTH, + max_length=(getattr(config.generate_cfg, 'tool_output_max_length', None) if config.generate_cfg else None) or TOOL_OUTPUT_MAX_LENGTH, truncation_strategy=getattr(config.generate_cfg, 'tool_output_truncation_strategy', 'smart') if config.generate_cfg else 'smart', tool_filters=getattr(config.generate_cfg, 'tool_output_filters', None) if config.generate_cfg else None, exclude_tools=getattr(config.generate_cfg, 'tool_output_exclude', []) if config.generate_cfg else [], diff --git a/agent/tool_output_length_middleware.py b/agent/tool_output_length_middleware.py index 96b6c1e..18fc3b6 100644 --- a/agent/tool_output_length_middleware.py +++ b/agent/tool_output_length_middleware.py @@ -53,7 +53,7 @@ class ToolOutputLengthMiddleware(AgentMiddleware): preserve_json: Whether to preserve JSON structure in smart mode ellipsis: Text to append when truncating """ - self.max_length = max_length + self.max_length = max_length if max_length is not None else 2000 # 确保 max_length 不为 None self.truncation_strategy = truncation_strategy self.tool_filters = tool_filters self.exclude_tools = exclude_tools or [] From b6b821c9bb887b36531f5248dbebed371adff233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E6=BD=AE?= Date: Wed, 4 Mar 2026 14:30:44 +0800 Subject: [PATCH 2/4] bug fix --- agent/mem0_middleware.py | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/agent/mem0_middleware.py b/agent/mem0_middleware.py index 4cf8d10..f84da01 100644 --- a/agent/mem0_middleware.py +++ b/agent/mem0_middleware.py @@ -356,7 +356,18 @@ class Mem0Middleware(AgentMiddleware): # 获取当前系统提示词 current_system_prompt = "" if request.system_message: - current_system_prompt = request.system_message.content if hasattr(request.system_message, "content") else str(request.system_message) + content = request.system_message.content if hasattr(request.system_message, "content") else str(request.system_message) + # content 可能是 list 或 str,确保转换为 str + if isinstance(content, list): + current_system_prompt = "\n".join(str(item) for item in content) + else: + current_system_prompt = str(content) if content else "" + + # 确保 memory_prompt 也是字符串 + if isinstance(memory_prompt, list): + memory_prompt = "\n".join(str(item) for item in memory_prompt) + else: + memory_prompt = str(memory_prompt) if memory_prompt else "" # 修改系统提示词 new_system_prompt = current_system_prompt + memory_prompt @@ -384,7 +395,18 @@ class Mem0Middleware(AgentMiddleware): # 获取当前系统提示词 current_system_prompt = "" if request.system_message: - current_system_prompt = request.system_message.content if hasattr(request.system_message, "content") else str(request.system_message) + content = request.system_message.content if hasattr(request.system_message, "content") else str(request.system_message) + # content 可能是 list 或 str,确保转换为 str + if isinstance(content, list): + current_system_prompt = "\n".join(str(item) for item in content) + else: + current_system_prompt = str(content) if content else "" + + # 确保 memory_prompt 也是字符串 + if isinstance(memory_prompt, list): + memory_prompt = "\n".join(str(item) for item in memory_prompt) + else: + memory_prompt = str(memory_prompt) if memory_prompt else "" # 修改系统提示词 new_system_prompt = current_system_prompt + memory_prompt From 6309a5386028bc05b2617819c8ac6a35a97f8434 Mon Sep 17 00:00:00 2001 From: autobee-sparticle Date: Wed, 4 Mar 2026 17:21:16 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat(novare):=20=E6=B7=BB=E5=8A=A0=E4=BA=BA?= =?UTF-8?q?=E5=91=98=E5=9C=A8=E9=9B=A2=E5=88=A4=E5=AE=9A=E8=A7=84=E5=88=99?= =?UTF-8?q?=EF=BC=8C=E5=88=A9=E7=94=A8=20last=5Fcommunication=5Ftime=20?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=88=A4=E6=96=AD=E4=BA=BA=E5=91=98=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E5=9C=A8=20NOVARE=20=E6=A5=BC=E5=86=85=20(#13)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit EB API 始终返回人员最后已知坐标,不区分在馆/离馆。通过检查 last_communication_time 与当前时刻的差值(阈值5分钟/24小时),实现三级在離判定并提供对应的日语回答模板。 Closes sparticleinc/mygpt-frontend#1963 Co-authored-by: zhuchao Co-authored-by: Claude Opus 4.6 --- prompt/novare.md | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/prompt/novare.md b/prompt/novare.md index b336a66..c69e843 100644 --- a/prompt/novare.md +++ b/prompt/novare.md @@ -71,6 +71,19 @@ - dxcore_update_device_status(device_id="[B设备id]",running_control=0) → 灯光亮度调整为0 **响应**:"已为您关闭Define Room4的灯光" +### 人员位置查询(在離判定)场景 +**用户**:"浜田さんはどこ?" +- find_employee_location(name="浜田") +- 检查返回结果中的 `last_communication_time` 字段 +- **场景A**:last_communication_time 在5分钟以内 → 在館 +**响应**:「浜田さんはNOVAREハブ1階のDefine Room 3にいらっしゃいます。メッセージを送りますか?」 + +- **场景B**:last_communication_time 超过5分钟(例如2小时前)→ 不在 +**响应**:「浜田さんは現在NOVAREにいらっしゃらないようです。最後に確認されたのは本日14時30分頃です。WowTalkでメッセージを送りますか?」 + +- **场景C**:last_communication_time 超过24小时 → 長時間不在 +**响应**:「浜田さんの位置情報が長時間更新されていないため、現在の所在を確認できません。」 + @@ -144,11 +157,26 @@ 4. 查询人员信息/wowtalk账号/人员位置 - **条件**:用户意图为查找某人、员工、同事或房间位置。 -- **动作**:立即调用【人员检索】进行查询,并直接根据查询结果回复。 +- **动作**:立即调用【人员检索】进行查询,并根据查询结果中的 `last_communication_time` 字段进行**在離判定**后回复。 +- **在離判定规则(重要)**: + `find_employee_location` 返回的 `last_communication_time` 表示定位标签最后一次通信时间。利用此字段判断人员是否仍在 NOVARE 楼内: + 1. **在館判定(5分钟以内)**:如果 `当前时刻 - last_communication_time ≤ 5分钟`,判定为「在館」,正常回答位置。 + - 回复格式:「○○さんはNOVAREハブ[階数]の[部屋名]にいらっしゃいます。」 + 2. **不在判定(5分钟~24小时)**:如果 `当前时刻 - last_communication_time > 5分钟` 且 `≤ 24小时`,判定为「不在」,提示不在馆内并告知最后确认时刻。 + - 回复格式:「○○さんは現在NOVAREにいらっしゃらないようです。最後に確認されたのは[本日/昨日]○○時○○分頃です。」 + - 时间格式化:使用日语自然表达(如「本日14時30分頃」「昨日18時頃」) + 3. **長時間不在判定(24小时以上)**:如果 `当前时刻 - last_communication_time > 24小时`,判定为「位置情報が長時間更新されていない」。 + - 回复格式:「○○さんの位置情報が長時間更新されていないため、現在の所在を確認できません。」 + 4. **注意事項**: + - `last_communication_time` 与 `last_measurement.time` 不同:前者在标签静止时也会持续更新(只要在检测范围内),后者仅在坐标变化时更新。在離判定必须使用 `last_communication_time` + - 不要向用户展示 `last_communication_time` 的原始值,需转换为用户友好的日语时间表达 + - 如果 `last_communication_time` 字段不存在或为空,按照「在館」处理,正常回答位置 - **主动追问逻辑**: - 1. **成功定位后主动询问**:如果成功找到目标人物且获取到位置信息,在告知位置后主动询问用户是否需要向对方发送消息。 + 1. **在館时成功定位后主动询问**:如果在離判定为「在館」且成功获取到位置信息,在告知位置后主动询问用户是否需要向对方发送消息。 - 回复格式:"○○さんは[位置]にいらっしゃいます。メッセージを送りますか?" - 2. **无法获取用户位置时**:如果操作需要基于用户当前位置(如"我附近的设备"、"離れたところ"),但无法获取用户位置信息,主动询问用户当前所在位置。 + 2. **不在時の追加案内**:如果在離判定为「不在」,在告知不在后,主动询问用户是否需要通过 WowTalk 发送消息联系对方。 + - 回复格式:「○○さんは現在NOVAREにいらっしゃらないようです。最後に確認されたのは○○時○○分頃です。WowTalkでメッセージを送りますか?」 + 3. **无法获取用户位置时**:如果操作需要基于用户当前位置(如"我附近的设备"、"離れたところ"),但无法获取用户位置信息,主动询问用户当前所在位置。 - 回复格式:"お客様の現在地が確認できませんでした。今どちらにいらっしゃいますか?" 5. 消息通知(此操作需要确认) From 4c74acaf18a6f4625c8844b0873b9a6615c3074d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E6=BD=AE?= Date: Thu, 5 Mar 2026 15:08:09 +0800 Subject: [PATCH 4/4] =?UTF-8?q?chat.py:730=20=E7=9A=84=20v2=20=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=20exclude=5Ffields=20=E7=8E=B0=E5=9C=A8=E4=B8=8E=20v1?= =?UTF-8?q?=20=E6=8E=A5=E5=8F=A3=E4=BF=9D=E6=8C=81=E4=B8=80=E8=87=B4?= =?UTF-8?q?=EF=BC=8C=E8=A1=A5=E4=B8=8A=E4=BA=86=20'model',=20'model=5Fserv?= =?UTF-8?q?er',=20'dataset=5Fids',=20'system=5Fprompt',=20'mcp=5Fsettings'?= =?UTF-8?q?,=20=20=20'robot=5Ftype',=20'enable=5Fthinking',=20'skills',=20?= =?UTF-8?q?'enable=5Fmemory'=20=E8=BF=99=E4=BA=9B=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/chat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/chat.py b/routes/chat.py index aa5a114..ef1a8ed 100644 --- a/routes/chat.py +++ b/routes/chat.py @@ -727,7 +727,7 @@ async def chat_completions_v2(request: ChatRequestV2, authorization: Optional[st # 处理消息 messages = process_messages(request.messages, request.language) # 收集额外参数作为 generate_cfg - exclude_fields = {'messages', 'stream', 'tool_response', 'bot_id', 'language', 'user_identifier', 'session_id', 'n'} + exclude_fields = {'messages', 'model', 'model_server', 'dataset_ids', 'language', 'tool_response', 'system_prompt', 'mcp_settings', 'stream', 'robot_type', 'bot_id', 'user_identifier', 'session_id', 'enable_thinking', 'skills', 'enable_memory', 'n'} generate_cfg = {k: v for k, v in request.model_dump().items() if k not in exclude_fields} # 创建 AgentConfig 对象 config = await AgentConfig.from_v2_request(request, bot_config, project_dir, messages, generate_cfg)