Build lightweight AI agent admin
This commit is contained in:
@@ -0,0 +1,151 @@
|
||||
"""
|
||||
变量赋值节点
|
||||
"""
|
||||
import logging
|
||||
from typing import Any, Dict
|
||||
|
||||
from ..base import BaseNode, NodeContext, NodeResult
|
||||
from ..registry import NodeRegistry
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@NodeRegistry.register
|
||||
class VariableNode(BaseNode):
|
||||
"""
|
||||
变量赋值节点
|
||||
|
||||
设置或修改变量的值
|
||||
"""
|
||||
|
||||
node_type = 'variable'
|
||||
node_name = '变量'
|
||||
node_category = 'data'
|
||||
node_icon = 'variable'
|
||||
node_description = '设置或修改变量的值'
|
||||
|
||||
inputs = [
|
||||
{
|
||||
'name': 'value',
|
||||
'type': 'any',
|
||||
'description': '要设置的值',
|
||||
},
|
||||
]
|
||||
|
||||
outputs = [
|
||||
{
|
||||
'name': 'value',
|
||||
'type': 'any',
|
||||
'description': '设置后的值',
|
||||
},
|
||||
]
|
||||
|
||||
def execute(self, context: NodeContext) -> NodeResult:
|
||||
"""执行变量赋值"""
|
||||
try:
|
||||
assignments = self.config.get('assignments', [])
|
||||
output_variables = {}
|
||||
|
||||
for assignment in assignments:
|
||||
var_name = assignment.get('name', '')
|
||||
value_type = assignment.get('type', 'static')
|
||||
value = assignment.get('value', '')
|
||||
|
||||
if not var_name:
|
||||
continue
|
||||
|
||||
# 根据类型处理值
|
||||
if value_type == 'static':
|
||||
# 静态值
|
||||
final_value = value
|
||||
elif value_type == 'variable':
|
||||
# 从其他变量获取
|
||||
final_value = context.get_variable(value, '')
|
||||
elif value_type == 'template':
|
||||
# 模板渲染
|
||||
final_value = context.resolve_template(value)
|
||||
elif value_type == 'json':
|
||||
# JSON 解析
|
||||
import json
|
||||
final_value = json.loads(value)
|
||||
elif value_type == 'expression':
|
||||
# 简单表达式(仅支持基本运算)
|
||||
final_value = self._evaluate_expression(value, context)
|
||||
else:
|
||||
final_value = value
|
||||
|
||||
# 设置变量
|
||||
context.set_variable(var_name, final_value)
|
||||
output_variables[var_name] = final_value
|
||||
|
||||
return NodeResult(
|
||||
success=True,
|
||||
output=output_variables,
|
||||
output_variables=output_variables,
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
logger.exception(f'变量节点执行失败: {e}')
|
||||
return NodeResult(
|
||||
success=False,
|
||||
error=str(e),
|
||||
)
|
||||
|
||||
def _evaluate_expression(self, expression: str, context: NodeContext) -> Any:
|
||||
"""
|
||||
评估简单表达式
|
||||
|
||||
仅支持基本的数学运算和字符串操作
|
||||
"""
|
||||
# 替换变量引用
|
||||
resolved = context.resolve_template(expression)
|
||||
|
||||
# 安全的评估环境
|
||||
safe_dict = {
|
||||
'abs': abs,
|
||||
'int': int,
|
||||
'float': float,
|
||||
'str': str,
|
||||
'len': len,
|
||||
'min': min,
|
||||
'max': max,
|
||||
'sum': sum,
|
||||
'round': round,
|
||||
}
|
||||
|
||||
try:
|
||||
return eval(resolved, {"__builtins__": {}}, safe_dict)
|
||||
except Exception:
|
||||
return resolved
|
||||
|
||||
@classmethod
|
||||
def get_config_schema(cls) -> Dict[str, Any]:
|
||||
"""获取配置 Schema"""
|
||||
return {
|
||||
'type': 'object',
|
||||
'properties': {
|
||||
'assignments': {
|
||||
'type': 'array',
|
||||
'title': '变量赋值',
|
||||
'items': {
|
||||
'type': 'object',
|
||||
'properties': {
|
||||
'name': {
|
||||
'type': 'string',
|
||||
'title': '变量名',
|
||||
},
|
||||
'type': {
|
||||
'type': 'string',
|
||||
'title': '值类型',
|
||||
'enum': ['static', 'variable', 'template', 'json', 'expression'],
|
||||
'default': 'static',
|
||||
},
|
||||
'value': {
|
||||
'type': 'string',
|
||||
'title': '值',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user