ModelScopeAgent / config_utils.py
谦言
add files
98e07ff
raw
history blame
6.8 kB
import os
import shutil
import traceback
import json
from modelscope_agent.tools.openapi_plugin import openapi_schema_convert
from modelscope_agent.utils.logger import agent_logger as logger
from modelscope.utils.config import Config
DEFAULT_AGENT_DIR = '/tmp/agentfabric'
DEFAULT_BUILDER_CONFIG_DIR = os.path.join(DEFAULT_AGENT_DIR, 'config')
DEFAULT_BUILDER_CONFIG_FILE = os.path.join(DEFAULT_BUILDER_CONFIG_DIR,
'builder_config.json')
DEFAULT_OPENAPI_PLUGIN_CONFIG_FILE = os.path.join(
DEFAULT_BUILDER_CONFIG_DIR, 'openapi_plugin_config.json')
DEFAULT_MODEL_CONFIG_FILE = './config/model_config.json'
DEFAULT_TOOL_CONFIG_FILE = './config/tool_config.json'
DEFAULT_CODE_INTERPRETER_DIR = os.getenv('CODE_INTERPRETER_WORK_DIR',
'/tmp/ci_workspace')
def get_user_dir(uuid_str=''):
return os.path.join(DEFAULT_BUILDER_CONFIG_DIR, uuid_str)
def get_ci_dir():
return DEFAULT_CODE_INTERPRETER_DIR
def get_user_cfg_file(uuid_str=''):
builder_cfg_file = os.getenv('BUILDER_CONFIG_FILE',
DEFAULT_BUILDER_CONFIG_FILE)
# convert from ./config/builder_config.json to ./config/user/builder_config.json
builder_cfg_file = builder_cfg_file.replace('config/', 'config/user/')
# convert from ./config/user/builder_config.json to ./config/uuid/builder_config.json
if uuid_str != '':
builder_cfg_file = builder_cfg_file.replace('user', uuid_str)
return builder_cfg_file
def get_user_openapi_plugin_cfg_file(uuid_str=''):
openapi_plugin_cfg_file = os.getenv('OPENAPI_PLUGIN_CONFIG_FILE',
DEFAULT_OPENAPI_PLUGIN_CONFIG_FILE)
openapi_plugin_cfg_file = openapi_plugin_cfg_file.replace(
'config/', 'config/user/')
if uuid_str != '':
openapi_plugin_cfg_file = openapi_plugin_cfg_file.replace(
'user', uuid_str)
return openapi_plugin_cfg_file
def save_builder_configuration(builder_cfg, uuid_str=''):
builder_cfg_file = get_user_cfg_file(uuid_str)
if uuid_str != '' and not os.path.exists(
os.path.dirname(builder_cfg_file)):
os.makedirs(os.path.dirname(builder_cfg_file))
with open(builder_cfg_file, 'w', encoding='utf-8') as f:
f.write(json.dumps(builder_cfg, indent=2, ensure_ascii=False))
def is_valid_plugin_configuration(openapi_plugin_cfg):
if 'schema' in openapi_plugin_cfg:
schema = openapi_plugin_cfg['schema']
if isinstance(schema, dict):
return True
else:
return False
def save_plugin_configuration(openapi_plugin_cfg, uuid_str):
openapi_plugin_cfg_file = get_user_openapi_plugin_cfg_file(uuid_str)
if uuid_str != '' and not os.path.exists(
os.path.dirname(openapi_plugin_cfg_file)):
os.makedirs(os.path.dirname(openapi_plugin_cfg_file))
with open(openapi_plugin_cfg_file, 'w', encoding='utf-8') as f:
f.write(json.dumps(openapi_plugin_cfg, indent=2, ensure_ascii=False))
def get_avatar_image(bot_avatar, uuid_str=''):
user_avatar_path = os.path.join(
os.path.dirname(__file__), 'assets/user.jpg')
bot_avatar_path = os.path.join(os.path.dirname(__file__), 'assets/bot.jpg')
if len(bot_avatar) > 0:
bot_avatar_path = os.path.join(DEFAULT_BUILDER_CONFIG_DIR, uuid_str,
bot_avatar)
if uuid_str != '':
# use default if not exists
if not os.path.exists(bot_avatar_path):
# create parents directory
os.makedirs(os.path.dirname(bot_avatar_path), exist_ok=True)
# copy the template to the address
temp_bot_avatar_path = os.path.join(DEFAULT_BUILDER_CONFIG_DIR,
bot_avatar)
if not os.path.exists(temp_bot_avatar_path):
# fall back to default local avatar image
temp_bot_avatar_path = os.path.join('./config', bot_avatar)
if not os.path.exists(temp_bot_avatar_path):
temp_bot_avatar_path = os.path.join(
'./config', 'custom_bot_avatar.png')
shutil.copy(temp_bot_avatar_path, bot_avatar_path)
return [user_avatar_path, bot_avatar_path]
def save_avatar_image(image_path, uuid_str=''):
bot_avatar = os.path.basename(image_path)
bot_avatar_path = os.path.join(DEFAULT_BUILDER_CONFIG_DIR, uuid_str,
bot_avatar)
shutil.copy(image_path, bot_avatar_path)
return bot_avatar, bot_avatar_path
def parse_configuration(uuid_str=''):
"""parse configuration
Args:
Returns:
dict: parsed configuration
"""
model_cfg_file = os.getenv('MODEL_CONFIG_FILE', DEFAULT_MODEL_CONFIG_FILE)
builder_cfg_file = get_user_cfg_file(uuid_str)
# use default if not exists
if not os.path.exists(builder_cfg_file):
# create parents directory
os.makedirs(os.path.dirname(builder_cfg_file), exist_ok=True)
# copy the template to the address
builder_cfg_file_temp = './config/builder_config.json'
if builder_cfg_file_temp != builder_cfg_file:
shutil.copy(builder_cfg_file_temp, builder_cfg_file)
tool_cfg_file = os.getenv('TOOL_CONFIG_FILE', DEFAULT_TOOL_CONFIG_FILE)
builder_cfg = Config.from_file(builder_cfg_file)
model_cfg = Config.from_file(model_cfg_file)
tool_cfg = Config.from_file(tool_cfg_file)
tools_info = builder_cfg.tools
available_tool_list = []
for key, value in tools_info.items():
if value['use']:
available_tool_list.append(key)
tool_cfg[key]['use'] = value['use']
openapi_plugin_file = get_user_openapi_plugin_cfg_file(uuid_str)
plugin_cfg = {}
available_plugin_list = []
if os.path.exists(openapi_plugin_file):
openapi_plugin_cfg = Config.from_file(openapi_plugin_file)
try:
config_dict = openapi_schema_convert(
schema=openapi_plugin_cfg.schema,
auth=openapi_plugin_cfg.auth.to_dict())
plugin_cfg = Config(config_dict)
for name, config in config_dict.items():
available_plugin_list.append(name)
except Exception as e:
logger.error(
uuid=uuid_str,
error=str(e),
content={
'error_traceback':
traceback.format_exc(),
'error_details':
'The format of the plugin config file is incorrect.'
})
return builder_cfg, model_cfg, tool_cfg, available_tool_list, plugin_cfg, available_plugin_list