From 213e541697a5d735726ae75a4c46258892bb0da1 Mon Sep 17 00:00:00 2001 From: autobee-sparticle Date: Wed, 1 Apr 2026 22:04:31 +0900 Subject: [PATCH] fix: resolve PrePrompt Hook env var crash and increase Mem0 pool size (#24) 1. Fix "all environment values must be bytes or str" error in hook execution by ensuring all env values are converted to str (getattr may return None when attribute exists but is None). Also sanitize shell_env values. 2. Increase MEM0_POOL_SIZE default from 20 to 50 to address "connection pool exhausted" errors under high concurrency. Fixes: sparticleinc/felo-mygpt#2519 Co-authored-by: zhuchao Co-authored-by: Claude Opus 4.6 (1M context) --- agent/plugin_hook_loader.py | 21 ++++++++++++--------- utils/settings.py | 2 +- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/agent/plugin_hook_loader.py b/agent/plugin_hook_loader.py index 7be815c..9ad8a10 100644 --- a/agent/plugin_hook_loader.py +++ b/agent/plugin_hook_loader.py @@ -165,27 +165,30 @@ async def _execute_command(skill_path: str, command: str, hook_type: str, config """ try: # 设置环境变量,传递给子进程 + # 注意:subprocess 要求所有 env 值必须是 str 类型, + # getattr 可能返回 None(属性存在但值为 None),需要确保转换为 str env = os.environ.copy() - env['ASSISTANT_ID'] = getattr(config, 'bot_id', '') - env['USER_IDENTIFIER'] = getattr(config, 'user_identifier', '') - env['TRACE_ID'] = getattr(config, 'trace_id', '') - env['SESSION_ID'] = getattr(config, 'session_id', '') - env['LANGUAGE'] = getattr(config, 'language', '') + env['ASSISTANT_ID'] = str(getattr(config, 'bot_id', '') or '') + env['USER_IDENTIFIER'] = str(getattr(config, 'user_identifier', '') or '') + env['TRACE_ID'] = str(getattr(config, 'trace_id', '') or '') + env['SESSION_ID'] = str(getattr(config, 'session_id', '') or '') + env['LANGUAGE'] = str(getattr(config, 'language', '') or '') env['HOOK_TYPE'] = hook_type # 合并 config 中的自定义 shell 环境变量 shell_env = getattr(config, 'shell_env', None) if shell_env: - env.update(shell_env) + # 确保所有自定义环境变量值也是字符串 + env.update({k: str(v) if v is not None else '' for k, v in shell_env.items()}) # 对于 PreSave,传递 content if hook_type == 'PreSave': - env['CONTENT'] = kwargs.get('content', '') - env['ROLE'] = kwargs.get('role', '') + env['CONTENT'] = str(kwargs.get('content', '') or '') + env['ROLE'] = str(kwargs.get('role', '') or '') # 对于 PostAgent,传递 response if hook_type == 'PostAgent': - env['RESPONSE'] = kwargs.get('response', '') + env['RESPONSE'] = str(kwargs.get('response', '') or '') metadata = kwargs.get('metadata', {}) env['METADATA'] = json.dumps(metadata) if metadata else '' diff --git a/utils/settings.py b/utils/settings.py index 915cc5a..16af267 100644 --- a/utils/settings.py +++ b/utils/settings.py @@ -57,7 +57,7 @@ CHECKPOINT_DB_URL = os.getenv("CHECKPOINT_DB_URL", "postgresql://moshui:@localho # 连接池大小 # 同时可以持有的最大连接数 CHECKPOINT_POOL_SIZE = int(os.getenv("CHECKPOINT_POOL_SIZE", "20")) -MEM0_POOL_SIZE = int(os.getenv("MEM0_POOL_SIZE", "20")) +MEM0_POOL_SIZE = int(os.getenv("MEM0_POOL_SIZE", "50")) # Checkpoint 自动清理配置 # 是否启用自动清理旧 session