initialize_data.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. import json
  2. import time
  3. import os
  4. import yaml
  5. from passlib.context import CryptContext
  6. from Log import logger
  7. from app.config.agent_base_url import RG_APP_TOKEN_LIST, RG_APP_NEW_TOKEN, DF_CHAT_API_KEY
  8. # from app.api import pwd_context
  9. from app.config.const import DIFY, ENV_CONF_PATH, RAGFLOW, smart_server, chat_server, workflow_server, TMP_DICT, \
  10. rg_api_token, Dialog_STATSU_ON, SYSTEM_ID
  11. from app.models import MenuCapacityModel, WebMenuModel, GroupModel, RoleModel, DialogModel, UserModel, UserAppModel, \
  12. cipher_suite, UserTokenModel, ApiTokenModel, ComplexChatModel, SystemDataModel
  13. from app.service.auth import UserAppDao
  14. from app.service.bisheng import BishengService
  15. from app.service.difyService import DifyService
  16. from app.service.ragflow import RagflowService
  17. from app.service.service_token import get_new_token
  18. from app.service.v2.app_driver.chat_data import ChatBaseApply
  19. from app.service.v2.app_register import AppRegisterDao
  20. from app.config.config import settings
  21. from app.service.v2.chat import get_app_token
  22. from app.utils.common import get_machine_id
  23. from app.utils.password_handle import generate_password, password_encrypted, password_decrypted
  24. pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
  25. async def dialog_menu_sync(db):
  26. menu_list = []
  27. with open(os.path.join(ENV_CONF_PATH, "menu_conf.json") , 'r', encoding='utf-8') as file:
  28. # 加载JSON数据
  29. data = json.load(file)
  30. menu_list = data.get("data", [])
  31. db.query(WebMenuModel).delete()
  32. db.query(MenuCapacityModel).delete()
  33. db.commit()
  34. for menu in menu_list:
  35. # print(menu)
  36. dialog = menu.pop("dialog", [])
  37. for i in dialog:
  38. capacity = MenuCapacityModel(menu_id=menu["id"], capacity_id=i["id"], capacity_type=i["agentType"],
  39. chat_id=i["id"] if not i["chat_id"] else i["chat_id"],
  40. chat_type=i["chat_type"])
  41. db.add(capacity)
  42. menu_obj = WebMenuModel(**menu)
  43. db.add(menu_obj)
  44. db.commit()
  45. async def create_menu_sync(db):
  46. # json_file_path = "env_conf/menu_conf.json.template"
  47. json_file_path = os.path.join(ENV_CONF_PATH, "menu_conf.json.template")
  48. with open(json_file_path, 'r', encoding='utf-8') as file:
  49. json_data = json.load(file).get("data", [])
  50. # for menu in json_data:
  51. # menu['dialog'].clear()
  52. dialogs = db.query(DialogModel).all()
  53. dialog_dict = {}
  54. for dialog in dialogs:
  55. if dialog.name not in dialog_dict:
  56. dialog_dict[dialog.name] = []
  57. dialog_dict[dialog.name].append({
  58. 'id': dialog.id,
  59. 'chat_id': dialog.id,
  60. 'chat_type': '',
  61. 'agentType': dialog.dialog_type
  62. })
  63. for menu in json_data:
  64. # if menu['title'] in dialog_dict:
  65. # for dialog in dialog_dict[menu['title']]:
  66. # new_dialog_item = {
  67. # 'id': dialog.id,
  68. # 'chat_id': dialog.id,
  69. # 'chat_type': '',
  70. # 'agentType': dialog.dialog_type
  71. # }
  72. menu['dialog']= dialog_dict.get(menu['title'], [])
  73. json_data = {"data": json_data}
  74. new_file_name = f"menu_conf.json.template"
  75. new_file_path = os.path.join(os.path.dirname(json_file_path), new_file_name)
  76. with open(new_file_path, 'w', encoding='utf-8') as new_file:
  77. json.dump(json_data, new_file, ensure_ascii=False, indent=4)
  78. return {
  79. "file_name": new_file_name,
  80. "json_data": json_data
  81. }
  82. async def default_group_sync(db):
  83. group = db.query(GroupModel).filter_by(group_type=2).first()
  84. if not group:
  85. logger.error("未初始默认组, 开始初始化!")
  86. try:
  87. group = GroupModel(group_name="默认用户组", group_description="默认组", group_type=2)
  88. db.add(group)
  89. db.commit()
  90. except Exception as e:
  91. logger.error(e)
  92. async def default_role_sync(db):
  93. role = db.query(RoleModel).filter_by(role_type=2).first()
  94. if not role:
  95. logger.error("未初始默认角色, 开始初始化!")
  96. try:
  97. group = RoleModel(id="morenjuese1234567890", name="默认角色", description="默认角色", role_type=2)
  98. db.add(group)
  99. db.commit()
  100. except Exception as e:
  101. logger.error(e)
  102. # async def app_register_sync(db):
  103. # app_dict = {}
  104. # with open(os.path.join(ENV_CONF_PATH, "app_register_conf.json"), 'r', encoding='utf-8') as file:
  105. # # 加载JSON数据
  106. # app_dict = json.load(file)
  107. # try:
  108. # for app_id, status in app_dict.items():
  109. # AppRegisterDao(db).update_and_insert_app(app_id, status)
  110. # except Exception as e:
  111. # logger.error(e)
  112. async def basic_agent_sync(db):
  113. agent_list = []
  114. complex_list = []
  115. with open(os.path.join(ENV_CONF_PATH, "default_agent_conf.json"), 'r', encoding='utf-8') as file:
  116. # 加载JSON数据
  117. agent_dict = json.load(file)
  118. agent_list = agent_dict.get("basic", [])
  119. complex_list = agent_dict.get("complex", [])
  120. user = db.query(UserModel).filter_by(permission="admin").first()
  121. for agent in agent_list:
  122. dialog = db.query(DialogModel).filter(DialogModel.id == agent["id"]).first()
  123. if dialog:
  124. try:
  125. dialog.name = agent["name"]
  126. dialog.description = agent["description"]
  127. dialog.icon = agent["icon"]
  128. dialog.mode = agent["mode"]
  129. dialog.parameters = json.dumps(agent["parameters"])
  130. db.commit()
  131. except Exception as e:
  132. logger.error(e)
  133. else:
  134. try:
  135. dialog = DialogModel(id=agent["id"], name=agent["name"], description=agent["description"],
  136. icon=agent["icon"], tenant_id=user.id if user else "", dialog_type=agent["dialogType"], mode=agent["mode"],parameters = json.dumps(agent["parameters"]))
  137. db.add(dialog)
  138. db.commit()
  139. db.refresh(dialog)
  140. except Exception as e:
  141. print(e)
  142. db.rollback()
  143. now_complex_list = []
  144. for agent in complex_list:
  145. now_complex_list.append(agent["id"])
  146. dialog = db.query(ComplexChatModel).filter(ComplexChatModel.id == agent["id"]).first()
  147. if dialog:
  148. try:
  149. dialog.name = agent["name"]
  150. dialog.description = agent["description"]
  151. dialog.icon = agent["icon"]
  152. dialog.mode = agent["mode"]
  153. dialog.chat_mode = agent["chat_mode"]
  154. dialog.status = Dialog_STATSU_ON
  155. # dialog.parameters = json.dumps(agent["parameters"])
  156. db.commit()
  157. except Exception as e:
  158. logger.error(e)
  159. else:
  160. try:
  161. dialog = ComplexChatModel(id=agent["id"], name=agent["name"], description=agent["description"],
  162. icon=agent["icon"], tenant_id=user.id if user else "", dialog_type=agent["dialogType"], mode=agent["mode"],chat_mode = agent["chat_mode"])
  163. db.add(dialog)
  164. db.commit()
  165. db.refresh(dialog)
  166. except Exception as e:
  167. print(e)
  168. db.rollback()
  169. for i in db.query(ComplexChatModel).filter(ComplexChatModel.status == "1").all():
  170. if i.id not in now_complex_list:
  171. try:
  172. db.query(ComplexChatModel).filter(ComplexChatModel.id==i.id).update(({"status": "0"}))
  173. db.commit()
  174. except:
  175. ...
  176. async def user_update_app(userid, db):
  177. user = db.query(UserModel).filter(UserModel.id == userid).first()
  178. if not user:
  179. raise Exception("User id not found")
  180. app_register = AppRegisterDao(db).get_apps()
  181. register_dict = {}
  182. token = ""
  183. app_password = await generate_password(10)
  184. crypt_password = UserAppModel.encrypted_password(app_password)
  185. for app in app_register:
  186. if app["id"] == 'ragflow_app':
  187. user_rag_app = db.query(UserAppModel).filter(UserAppModel.user_id == userid,
  188. UserAppModel.app_type == 'ragflow_app').all()
  189. if not user_rag_app:
  190. service = RagflowService(settings.fwr_base_url)
  191. register_info = await register_app(service, app["id"], app_password, token)
  192. if register_info:
  193. register_dict[app["id"]] = register_info
  194. app_name = register_info.get("name")
  195. app_id = register_info.get("id")
  196. app_email = register_info.get("email")
  197. await save_db(db, app_name, crypt_password, app_email, user.id, app_id, "ragflow_app")
  198. elif app["id"] == 'bisheng_app':
  199. user_bs_app = db.query(UserAppModel).filter(UserAppModel.user_id == userid,
  200. UserAppModel.app_type == 'bisheng_app').all()
  201. if not user_bs_app:
  202. service = BishengService(settings.sgb_base_url)
  203. register_info = await register_app(service, app["id"], app_password, token)
  204. if register_info:
  205. register_dict[app["id"]] = register_info
  206. app_name = register_info.get("name")
  207. app_id = register_info.get("id")
  208. app_email = register_info.get("email")
  209. await save_db(db, app_name, crypt_password, app_email, user.id, app_id, "bisheng_app")
  210. elif app["id"] == 'dify_app':
  211. user_df_app = db.query(UserAppModel).filter(UserAppModel.user_id == userid,
  212. UserAppModel.app_type == 'dify_app').all()
  213. if not user_df_app:
  214. admin_user = db.query(UserModel).filter(UserModel.permission == "admin").first()
  215. token = await get_new_token(db, admin_user.id, DIFY)
  216. if not token:
  217. print("用户注册获取dftoken失败!")
  218. service = DifyService(settings.dify_base_url)
  219. register_info = await register_app(service, app["id"], app_password, token)
  220. if register_info:
  221. register_dict[app["id"]] = register_info
  222. app_name = register_info.get("name")
  223. app_id = register_info.get("id")
  224. app_email = register_info.get("email")
  225. await save_db(db, app_name, crypt_password, app_email, user.id, app_id, "dify_app")
  226. else:
  227. raise Exception("未知注册应用---")
  228. async def register_app(service, app_id, app_password, token):
  229. name = app_id + str(int(time.time()))
  230. try:
  231. register_info = await service.register(name, app_password, token)
  232. return {"id": register_info.get("id"), "name": name, "email": register_info.get("email")}
  233. except Exception as e:
  234. print(f"Failed to register with {app_id}: {str(e)}")
  235. return None
  236. async def save_db(db, username, password, email, user_id, app_id, app_type):
  237. user_app_dao = UserAppDao(db)
  238. user_id = await user_app_dao.insert_user_app_data(username, password, email, user_id, app_id, app_type)
  239. if not user_id:
  240. raise Exception("Failed to register with app")
  241. print({"msg": "User registered successfully", "userFlag": user_id})
  242. async def admin_account_sync(db):
  243. try:
  244. config = {}
  245. app_dict = {}
  246. # tmp_dict = {chat_server:RAGFLOW, workflow_server:DIFY}
  247. now_account =[]
  248. with open(os.path.join(ENV_CONF_PATH, "admin.yaml"), 'r', encoding='utf-8') as file:
  249. # 加载JSON数据
  250. config = yaml.safe_load(file)
  251. account_list = db.query(UserTokenModel).all()
  252. for account in account_list:
  253. if account.id in config:
  254. if account.account != config[account.id]["account"] or account.password != config[account.id]["password"]:
  255. db.query(UserTokenModel).filter_by(id=account.id).update({"account": config[account.id]["account"],
  256. "password": config[account.id]["password"],
  257. "access_token": ""
  258. })
  259. now_account.append(account.id)
  260. else:
  261. db.query(UserTokenModel).filter_by(id=account.id).delete()
  262. for k, v in config.items():
  263. if k in TMP_DICT:
  264. app_dict[TMP_DICT[k]] = v.get("id")
  265. if k == smart_server:
  266. db_user = db.query(UserModel).filter(UserModel.username == config["smart_server"]["account"]).first()
  267. if db_user:
  268. print("admin_user_sync: 用户已经存在!")
  269. continue
  270. hashed_password = pwd_context.hash(await password_decrypted(config["smart_server"]["password"])) # config["smart_server"]["password"]
  271. user_model = UserModel(username=config["smart_server"]["account"], hashed_password=hashed_password,
  272. email="",
  273. phone="", login_name="", sync_flag="", creator=0, permission="admin")
  274. db.add(user_model)
  275. # db.commit()
  276. # db.refresh(user_model)
  277. else:
  278. if k not in now_account:
  279. new_account = UserTokenModel(id=k, account=v["account"], password=v["password"])
  280. db.add(new_account)
  281. db.commit()
  282. # with open(os.path.join(ENV_CONF_PATH, "app_register_conf.json"), 'r', encoding='utf-8') as file:
  283. # # 加载JSON数据
  284. # app_dict = json.load(file)
  285. try:
  286. for app_id, name in app_dict.items():
  287. AppRegisterDao(db).update_and_insert_app(app_id, 1, name)
  288. except Exception as e:
  289. logger.error(e)
  290. except Exception as e:
  291. print(e)
  292. db.rollback()
  293. async def admin_user_sync(db):
  294. try:
  295. config = {}
  296. with open(os.path.join(ENV_CONF_PATH, "admin.yaml"), 'r', encoding='utf-8') as file:
  297. # 加载JSON数据
  298. config = yaml.safe_load(file)
  299. # print(config)
  300. db_user = db.query(UserModel).filter(UserModel.username == config["smart_server"]["account"]).first()
  301. if db_user:
  302. print("admin_user_sync: 用户已经存在!")
  303. return
  304. # register_dict = {}
  305. #
  306. # for app in [RAGFLOW, DIFY]:
  307. # register_dict[app] = {"id": config[app].get("id", "123"), "name": config[app]["account"],
  308. # "pwd":config[app]["password"],
  309. # "email": config[app]["account"]}
  310. # 存储用户信息
  311. hashed_password = pwd_context.hash(config["smart_server"]["password"])
  312. user_model = UserModel(username=config["smart_server"]["account"], hashed_password=hashed_password, email="",
  313. phone="", login_name="", sync_flag="", creator=0, permission="admin")
  314. db.add(user_model)
  315. db.commit()
  316. db.refresh(user_model)
  317. # u_id = user_model.id
  318. # user_app_dao = UserAppDao(db)
  319. # for k, v in register_dict.items():
  320. # await user_app_dao.update_and_insert_data(v.get("name"), user_model.encrypted_password(v.get("pwd")), v.get("email"), u_id, str(v.get("id")), k)
  321. except Exception as e:
  322. print(e)
  323. db.rollback()
  324. async def sync_rg_api_token(db):
  325. token = ""
  326. try:
  327. app_token = db.query(ApiTokenModel).filter_by(app_id=rg_api_token).first()
  328. if app_token:
  329. print("rg_api_token: 已经存在!")
  330. return
  331. user_token = db.query(UserTokenModel).filter(UserTokenModel.id == chat_server).first()
  332. chat = ChatBaseApply()
  333. token_list_url = f"{settings.fwr_base_url}{RG_APP_TOKEN_LIST}"
  334. token_list = await chat.chat_get(token_list_url, {}, await chat.get_chat_headers(user_token.access_token))
  335. if token_list and token_list.get("code") == 0:
  336. if len(token_list.get("data", [])) == 0:
  337. print("rg_api_token: 创建成功!")
  338. new_token_url = f"{settings.fwr_base_url}{RG_APP_NEW_TOKEN}"
  339. new_token = await chat.chat_post(new_token_url, {}, await chat.get_chat_headers(user_token.access_token))
  340. if new_token and new_token.get("code") == 0:
  341. token = new_token.get("data", {}).get("token")
  342. else:
  343. token = token_list.get("data")[0].get("token")
  344. print("rg_api_token: 已有token!")
  345. if token:
  346. db.add(ApiTokenModel(id=rg_api_token, app_id=rg_api_token, type="platform", token=token))
  347. db.commit()
  348. print("rg_api_token: 更新成功!")
  349. except Exception as e:
  350. print(e)
  351. db.rollback()
  352. async def sync_complex_api_token(db):
  353. token = ""
  354. try:
  355. complex_list = db.query(ComplexChatModel).all()
  356. for i in complex_list:
  357. user_token = db.query(ApiTokenModel).filter(ApiTokenModel.app_id == i.id).first()
  358. if not user_token:
  359. try:
  360. chat = ChatBaseApply()
  361. url = settings.dify_base_url + DF_CHAT_API_KEY.format(i.id)
  362. access_token = await get_app_token(db, workflow_server)
  363. param = await chat.chat_get(url, {}, await chat.get_headers(access_token))
  364. if param and param.get("data"):
  365. token = param.get("data", [{}])[0].get("token")
  366. token_id = param.get("data", [{}])[0].get("id")
  367. # dialog.parameters = json.dumps(param)
  368. else:
  369. param = await chat.chat_post(url, {}, await chat.get_headers(access_token))
  370. if param:
  371. token = param.get("token")
  372. token_id = param.get("id")
  373. if token:
  374. db.add(ApiTokenModel(id=token_id, app_id=i.id, type="app", token=token))
  375. db.commit()
  376. print("df_api_token: 更新成功!")
  377. except Exception as e:
  378. print(e)
  379. except Exception as e:
  380. print(e)
  381. db.rollback()
  382. async def system_license_sync(db):
  383. with open(os.path.join(ENV_CONF_PATH, "system.yaml") , 'r', encoding='utf-8') as file:
  384. # 加载JSON数据
  385. config = yaml.safe_load(file)
  386. try:
  387. system = db.query(SystemDataModel).filter_by(id=SYSTEM_ID).first()
  388. if system:
  389. system.version = config["smart_system"].get("version")
  390. else:
  391. system = SystemDataModel(id=SYSTEM_ID, version=config["smart_system"].get("version"), title=config["smart_system"].get("title"), desc=config["smart_system"].get("desc"), machine_id=get_machine_id())
  392. db.add(system)
  393. db.commit()
  394. except Exception as e:
  395. print(e)
  396. db.rollback()