harnessed_reasoning/wwwroot/api/config_save.dspy

81 lines
4.3 KiB
Python

#!/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)