|
import json |
|
|
|
from flask import request |
|
from flask_login import current_user |
|
from flask_restful import Resource |
|
|
|
from controllers.console import api |
|
from controllers.console.app.wraps import get_app_model |
|
from controllers.console.wraps import account_initialization_required, setup_required |
|
from core.agent.entities import AgentToolEntity |
|
from core.tools.tool_manager import ToolManager |
|
from core.tools.utils.configuration import ToolParameterConfigurationManager |
|
from events.app_event import app_model_config_was_updated |
|
from extensions.ext_database import db |
|
from libs.login import login_required |
|
from models.model import AppMode, AppModelConfig |
|
from services.app_model_config_service import AppModelConfigService |
|
|
|
|
|
class ModelConfigResource(Resource): |
|
@setup_required |
|
@login_required |
|
@account_initialization_required |
|
@get_app_model(mode=[AppMode.AGENT_CHAT, AppMode.CHAT, AppMode.COMPLETION]) |
|
def post(self, app_model): |
|
"""Modify app model config""" |
|
|
|
model_configuration = AppModelConfigService.validate_configuration( |
|
tenant_id=current_user.current_tenant_id, config=request.json, app_mode=AppMode.value_of(app_model.mode) |
|
) |
|
|
|
new_app_model_config = AppModelConfig( |
|
app_id=app_model.id, |
|
created_by=current_user.id, |
|
updated_by=current_user.id, |
|
) |
|
new_app_model_config = new_app_model_config.from_model_config_dict(model_configuration) |
|
|
|
if app_model.mode == AppMode.AGENT_CHAT.value or app_model.is_agent: |
|
|
|
original_app_model_config: AppModelConfig = ( |
|
db.session.query(AppModelConfig).filter(AppModelConfig.id == app_model.app_model_config_id).first() |
|
) |
|
agent_mode = original_app_model_config.agent_mode_dict |
|
|
|
parameter_map = {} |
|
masked_parameter_map = {} |
|
tool_map = {} |
|
for tool in agent_mode.get("tools") or []: |
|
if not isinstance(tool, dict) or len(tool.keys()) <= 3: |
|
continue |
|
|
|
agent_tool_entity = AgentToolEntity(**tool) |
|
|
|
try: |
|
tool_runtime = ToolManager.get_agent_tool_runtime( |
|
tenant_id=current_user.current_tenant_id, |
|
app_id=app_model.id, |
|
agent_tool=agent_tool_entity, |
|
) |
|
manager = ToolParameterConfigurationManager( |
|
tenant_id=current_user.current_tenant_id, |
|
tool_runtime=tool_runtime, |
|
provider_name=agent_tool_entity.provider_id, |
|
provider_type=agent_tool_entity.provider_type, |
|
identity_id=f"AGENT.{app_model.id}", |
|
) |
|
except Exception as e: |
|
continue |
|
|
|
|
|
if agent_tool_entity.tool_parameters: |
|
parameters = manager.decrypt_tool_parameters(agent_tool_entity.tool_parameters or {}) |
|
masked_parameter = manager.mask_tool_parameters(parameters or {}) |
|
else: |
|
parameters = {} |
|
masked_parameter = {} |
|
|
|
key = f"{agent_tool_entity.provider_id}.{agent_tool_entity.provider_type}.{agent_tool_entity.tool_name}" |
|
masked_parameter_map[key] = masked_parameter |
|
parameter_map[key] = parameters |
|
tool_map[key] = tool_runtime |
|
|
|
|
|
agent_mode = new_app_model_config.agent_mode_dict |
|
for tool in agent_mode.get("tools") or []: |
|
agent_tool_entity = AgentToolEntity(**tool) |
|
|
|
|
|
key = f"{agent_tool_entity.provider_id}.{agent_tool_entity.provider_type}.{agent_tool_entity.tool_name}" |
|
if key in tool_map: |
|
tool_runtime = tool_map[key] |
|
else: |
|
try: |
|
tool_runtime = ToolManager.get_agent_tool_runtime( |
|
tenant_id=current_user.current_tenant_id, |
|
app_id=app_model.id, |
|
agent_tool=agent_tool_entity, |
|
) |
|
except Exception as e: |
|
continue |
|
|
|
manager = ToolParameterConfigurationManager( |
|
tenant_id=current_user.current_tenant_id, |
|
tool_runtime=tool_runtime, |
|
provider_name=agent_tool_entity.provider_id, |
|
provider_type=agent_tool_entity.provider_type, |
|
identity_id=f"AGENT.{app_model.id}", |
|
) |
|
manager.delete_tool_parameters_cache() |
|
|
|
|
|
if agent_tool_entity.tool_parameters: |
|
if key not in masked_parameter_map: |
|
continue |
|
|
|
for masked_key, masked_value in masked_parameter_map[key].items(): |
|
if ( |
|
masked_key in agent_tool_entity.tool_parameters |
|
and agent_tool_entity.tool_parameters[masked_key] == masked_value |
|
): |
|
agent_tool_entity.tool_parameters[masked_key] = parameter_map[key].get(masked_key) |
|
|
|
|
|
if agent_tool_entity.tool_parameters: |
|
tool["tool_parameters"] = manager.encrypt_tool_parameters(agent_tool_entity.tool_parameters or {}) |
|
|
|
|
|
new_app_model_config.agent_mode = json.dumps(agent_mode) |
|
|
|
db.session.add(new_app_model_config) |
|
db.session.flush() |
|
|
|
app_model.app_model_config_id = new_app_model_config.id |
|
db.session.commit() |
|
|
|
app_model_config_was_updated.send(app_model, app_model_config=new_app_model_config) |
|
|
|
return {"result": "success"} |
|
|
|
|
|
api.add_resource(ModelConfigResource, "/apps/<uuid:app_id>/model-config") |
|
|