#!/usr/bin/env python3 # -*- coding: utf-8 -*- """Save reasoning configuration for current user""" import json, uuid, time result = {'widgettype': 'Message', 'options': {'title': 'Error', 'message': 'Invalid request', 'type': 'error'}} try: dbname = get_module_dbname('harnessed_reasoning') user_id = await get_user() now = time.strftime('%Y-%m-%d %H:%M:%S') max_reasoning_steps = int(params_kw.get('max_reasoning_steps', 10)) max_tool_calls_per_step = int(params_kw.get('max_tool_calls_per_step', 5)) enable_cross_session_search = '1' if params_kw.get('enable_cross_session_search') == '1' else '0' enable_skill_auto_loading = '1' if params_kw.get('enable_skill_auto_loading') == '1' else '0' safety_mode = params_kw.get('safety_mode', 'strict').strip() max_context_tokens = int(params_kw.get('max_context_tokens', 4000)) enable_error_recovery = '1' if params_kw.get('enable_error_recovery') == '1' else '0' max_recovery_attempts = int(params_kw.get('max_recovery_attempts', 3)) async with DBPools().sqlorContext(dbname) as sor: # Check if config exists rows = await sor.sqlExe("SELECT id FROM harnessed_reasoning_config WHERE user_id = ${user_id}$", {'user_id': user_id}) if rows and len(rows) > 0: config_id = rows[0]['id'] await sor.sqlExe("""UPDATE harnessed_reasoning_config SET max_reasoning_steps = ${max_reasoning_steps}$, max_tool_calls_per_step = ${max_tool_calls_per_step}$, enable_cross_session_search = ${enable_cross_session_search}$, enable_skill_auto_loading = ${enable_skill_auto_loading}$, safety_mode = ${safety_mode}$, max_context_tokens = ${max_context_tokens}$, enable_error_recovery = ${enable_error_recovery}$, max_recovery_attempts = ${max_recovery_attempts}$, updated_at = ${updated_at}$ WHERE id = ${id}$""", { 'id': config_id, 'max_reasoning_steps': max_reasoning_steps, 'max_tool_calls_per_step': max_tool_calls_per_step, 'enable_cross_session_search': enable_cross_session_search, 'enable_skill_auto_loading': enable_skill_auto_loading, 'safety_mode': safety_mode, 'max_context_tokens': max_context_tokens, 'enable_error_recovery': enable_error_recovery, 'max_recovery_attempts': max_recovery_attempts, 'updated_at': now }) else: config_id = str(uuid.uuid4()).replace('-', '')[:32] await sor.sqlExe("""INSERT INTO harnessed_reasoning_config (id, user_id, max_reasoning_steps, max_tool_calls_per_step, enable_cross_session_search, enable_skill_auto_loading, safety_mode, max_context_tokens, enable_error_recovery, max_recovery_attempts, created_at, updated_at) VALUES (${id}$, ${user_id}$, ${max_reasoning_steps}$, ${max_tool_calls_per_step}$, ${enable_cross_session_search}$, ${enable_skill_auto_loading}$, ${safety_mode}$, ${max_context_tokens}$, ${enable_error_recovery}$, ${max_recovery_attempts}$, ${created_at}$, ${updated_at}$)""", { 'id': config_id, 'user_id': user_id, 'max_reasoning_steps': max_reasoning_steps, 'max_tool_calls_per_step': max_tool_calls_per_step, 'enable_cross_session_search': enable_cross_session_search, 'enable_skill_auto_loading': enable_skill_auto_loading, 'safety_mode': safety_mode, 'max_context_tokens': max_context_tokens, 'enable_error_recovery': enable_error_recovery, 'max_recovery_attempts': max_recovery_attempts, 'created_at': now, 'updated_at': now }) result = {'widgettype': 'Message', 'options': {'title': 'Success', 'message': '配置保存成功', 'type': 'success'}} except Exception as e: result['options'] = {'title': 'Error', 'message': '保存失败: ' + str(e), 'type': 'error'} return json.dumps(result, ensure_ascii=False)