Spaces:
Paused
Paused
| 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): | |
| def post(self, app_model): | |
| """Modify app model config""" | |
| # validate 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: | |
| # get original app model config | |
| 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 | |
| # decrypt agent tool parameters if it's secret-input | |
| 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) | |
| # get 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 | |
| # get decrypted parameters | |
| 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 | |
| # encrypt agent tool parameters if it's secret-input | |
| agent_mode = new_app_model_config.agent_mode_dict | |
| for tool in agent_mode.get("tools") or []: | |
| agent_tool_entity = AgentToolEntity(**tool) | |
| # get 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() | |
| # override parameters if it equals to masked parameters | |
| 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) | |
| # encrypt parameters | |
| if agent_tool_entity.tool_parameters: | |
| tool["tool_parameters"] = manager.encrypt_tool_parameters(agent_tool_entity.tool_parameters or {}) | |
| # update app model config | |
| 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") | |