fetch_agent.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. from pickle import PROTO
  2. from typing import Dict, List, Tuple
  3. from sqlalchemy import create_engine, Column, String, Integer, Text
  4. from sqlalchemy.exc import IntegrityError
  5. from sqlalchemy.orm import sessionmaker
  6. from app.config.config import settings
  7. from app.config.const import RAGFLOW, BISHENG, DIFY
  8. from app.models import KnowledgeModel
  9. from app.models.dialog_model import DialogModel
  10. from app.models.user_model import UserAppModel
  11. from app.models.agent_model import AgentModel
  12. from app.models.base_model import SessionLocal, Base
  13. from app.service.v2.app_register import AppRegisterDao
  14. # 创建数据库引擎和会话工厂
  15. engine_bisheng = create_engine(settings.sgb_db_url)
  16. engine_ragflow = create_engine(settings.fwr_db_url)
  17. engine_dify = create_engine(settings.dify_database_url)
  18. SessionBisheng = sessionmaker(autocommit=False, autoflush=False, bind=engine_bisheng)
  19. SessionRagflow = sessionmaker(autocommit=False, autoflush=False, bind=engine_ragflow)
  20. SessionDify = sessionmaker(autocommit=False, autoflush=False, bind=engine_dify)
  21. class Flow(Base):
  22. __tablename__ = 'flow'
  23. id = Column(String(255), primary_key=True)
  24. name = Column(String(255), nullable=False)
  25. status = Column(Integer, nullable=False)
  26. description = Column(String(255), nullable=False)
  27. user_id = Column(Integer, nullable=False)
  28. class Dialog(Base):
  29. __tablename__ = 'dialog'
  30. id = Column(String(255), primary_key=True)
  31. name = Column(String(255), nullable=False)
  32. status = Column(String(1), nullable=False)
  33. description = Column(String(255), nullable=False)
  34. tenant_id = Column(String(36), nullable=False)
  35. class DfApps(Base):
  36. __tablename__ = 'apps'
  37. id = Column(String(36), primary_key=True)
  38. name = Column(String(255), nullable=False)
  39. status = Column(String(16), nullable=False)
  40. description = Column(Text, nullable=False)
  41. tenant_id = Column(String(36), nullable=False)
  42. mode = Column(String(36), nullable=False)
  43. class RgKnowledge(Base):
  44. __tablename__ = 'knowledgebase'
  45. id = Column(String(36), primary_key=True) # id
  46. name = Column(String(128)) # 名称
  47. permission = Column(String(32), default="me")
  48. tenant_id = Column(String(32)) # 创建人id
  49. description = Column(Text) # 说明
  50. status = Column(String(1)) # 状态
  51. doc_num = Column(Integer) # 文档
  52. # 解析名字
  53. def parse_names(names_str: str) -> List[str]:
  54. return [name.strip() for name in names_str.split(',')]
  55. BISHENG_NAMES_TO_SYNC = parse_names(settings.fetch_sgb_agent)
  56. RAGFLOW_NAMES_TO_SYNC = parse_names(settings.fetch_fwr_agent)
  57. def get_data_from_bisheng(names: List[str]) -> List[Tuple]:
  58. db = SessionBisheng()
  59. try:
  60. if names:
  61. query = db.query(Flow.id, Flow.name) \
  62. .filter(Flow.status == 2, Flow.name.in_(names))
  63. else:
  64. query = db.query(Flow.id, Flow.name) \
  65. .filter(Flow.status == 2)
  66. results = query.all()
  67. print(f"Executing query: {query}")
  68. # 格式化id为UUID
  69. formatted_results = [(format_uuid(row[0]), row[1]) for row in results]
  70. return formatted_results
  71. finally:
  72. db.close()
  73. def format_uuid(uuid_str: str) -> str:
  74. # 确保输入字符串长度为32
  75. if len(uuid_str) != 32:
  76. raise ValueError("Input string must be 32 characters long")
  77. # 插入连字符
  78. formatted_uuid = f"{uuid_str[:8]}-{uuid_str[8:12]}-{uuid_str[12:16]}-{uuid_str[16:20]}-{uuid_str[20:]}"
  79. return formatted_uuid
  80. def get_data_from_ragflow(names: List[str]) -> List[Tuple]:
  81. db = SessionRagflow()
  82. try:
  83. if names:
  84. query = db.query(Dialog.id, Dialog.name) \
  85. .filter(Dialog.status == 1, Dialog.name.in_(names))
  86. else:
  87. query = db.query(Dialog.id, Dialog.name) \
  88. .filter(Dialog.status == 1)
  89. results = query.all()
  90. print(f"Executing query: {query}")
  91. return results
  92. finally:
  93. db.close()
  94. def update_ids_in_local(data: List[Tuple]):
  95. db = SessionLocal()
  96. try:
  97. for row in data:
  98. name = row[1]
  99. new_id = row[0]
  100. existing_agent = db.query(AgentModel).filter_by(name=name).first()
  101. if existing_agent:
  102. existing_agent.id = new_id
  103. db.add(existing_agent)
  104. db.commit()
  105. except IntegrityError:
  106. db.rollback()
  107. raise
  108. finally:
  109. db.close()
  110. def initialize_agents():
  111. db = SessionLocal()
  112. try:
  113. count = db.query(AgentModel).count()
  114. if count > 0:
  115. result = db.query(AgentModel).delete()
  116. db.commit() # 提交事务
  117. initial_agents = [
  118. # ('80ee430a-e396-48c4-a12c-7c7cdf5eda51', 1, '报告生成', 'DIFY', 'report'),
  119. ('basic_excel_merge', 2, '报表合并', 'BASIC', 'excelMerge'),
  120. ('7638f00638a24c21a68ec6c49b304a35', 4, '文档智能', 'DIFY', 'documentIa'),
  121. ('da3451da89d911efb9490242ac190006', 3, '知识问答', 'RAGFLOW', 'knowledgeQA'),
  122. ('e96eb7a589db11ef87d20242ac190006', 5, '智能问答', 'RAGFLOW', 'chat'),
  123. ('basic_excel_talk', 6, '智能数据', 'BASIC', 'excelTalk'),
  124. ('basic_question_talk', 7, '出题组卷', 'BASIC', 'questionTalk'),
  125. ('9d75142a-66eb-4e23-b7d4-03efe4584915', 8, '小数绘图', 'DIFY', 'imageTalk'),
  126. ('basic_paper_talk', 9, '文档出卷', 'BASIC', 'paperTalk'),
  127. ('basic_report_clean', 10, '文档报告', 'DIFY', 'reportWorkflow')
  128. ]
  129. for agent in initial_agents:
  130. agent_id = format_uuid(agent[0]) if len(agent[0]) == 32 else agent[0]
  131. db.add(AgentModel(id=agent_id, sort=agent[1], name=agent[2], agent_type=agent[3], type=agent[4]))
  132. db.commit()
  133. print("Initial agents inserted successfully")
  134. except IntegrityError:
  135. db.rollback()
  136. raise
  137. finally:
  138. db.close()
  139. def sync_agents():
  140. try:
  141. # bisheng_data = get_data_from_bisheng(BISHENG_NAMES_TO_SYNC)
  142. ragflow_data = get_data_from_ragflow(RAGFLOW_NAMES_TO_SYNC)
  143. # update_ids_in_local(bisheng_data)
  144. update_ids_in_local(ragflow_data)
  145. print("Agents synchronized successfully")
  146. except Exception as e:
  147. print(f"Failed to sync agents: {str(e)}")
  148. def update_ids_in_local(data: List[Tuple]):
  149. db = SessionLocal()
  150. try:
  151. for row in data:
  152. name = row[1]
  153. new_id = row[0]
  154. existing_agent = db.query(AgentModel).filter_by(name=name).first()
  155. if existing_agent:
  156. existing_agent.id = new_id
  157. db.add(existing_agent)
  158. db.commit()
  159. except IntegrityError:
  160. db.rollback()
  161. raise
  162. finally:
  163. db.close()
  164. def get_rag_user_id(db, tenant_id, app_type):
  165. user = db.query(UserAppModel).filter(UserAppModel.app_type==app_type, UserAppModel.app_id==tenant_id).first()
  166. if user:
  167. return user.user_id
  168. return tenant_id
  169. def get_data_from_bisheng_v2(names: List[str]) -> List[Dict]:
  170. db = SessionBisheng()
  171. try:
  172. if names:
  173. query = db.query(Flow.id, Flow.name, Flow.description, Flow.status, Flow.user_id) \
  174. .filter(Flow.name.in_(names), Flow.status=="1")
  175. else:
  176. query = db.query(Flow.id, Flow.name, Flow.description, Flow.status, Flow.user_id).filter(Flow.status=="1")
  177. results = query.all()
  178. # print(f"Executing query: {query}")
  179. # 格式化id为UUID
  180. formatted_results = [{"id":row[0], "name": row[1], "description": row[2], "status": row[3], "user_id": str(row[4]), "mode": "agent-dialog"} for row in results]
  181. return formatted_results
  182. finally:
  183. db.close()
  184. def get_data_from_ragflow_v2(names: List[str]) -> List[Dict]:
  185. db = SessionRagflow()
  186. try:
  187. if names:
  188. query = db.query(Dialog.id, Dialog.name, Dialog.description, Dialog.status, Dialog.tenant_id) \
  189. .filter( Dialog.name.in_(names), Dialog.status == "1")
  190. else:
  191. query = db.query(Dialog.id, Dialog.name, Dialog.description, Dialog.status, Dialog.tenant_id).filter( Dialog.status == "1")
  192. results = query.all()
  193. formatted_results = [
  194. {"id": row[0], "name": row[1], "description": row[2], "status": "1" if row[3] == "1" else "2",
  195. "user_id": str(row[4]), "mode": "agent-dialog"} for row in results]
  196. return formatted_results
  197. finally:
  198. db.close()
  199. def get_data_from_dify_v2(names: List[str]) -> List[Dict]:
  200. db = SessionDify()
  201. try:
  202. if names:
  203. query = db.query(DfApps.id, DfApps.name, DfApps.description, DfApps.status, DfApps.tenant_id, DfApps.mode) \
  204. .filter( DfApps.name.in_(names))
  205. else:
  206. query = db.query(DfApps.id, DfApps.name, DfApps.description, DfApps.status, DfApps.tenant_id, DfApps.mode)
  207. results = query.all()
  208. formatted_results = [
  209. {"id": str(row[0]), "name": row[1], "description": row[2], "status": "1",
  210. "user_id": str(row[4]), "mode": row[5]} for row in results]
  211. return formatted_results
  212. finally:
  213. db.close()
  214. def update_ids_in_local_v2(data: List[Dict], dialog_type:str):
  215. db = SessionLocal()
  216. agent_id_list = []
  217. type_dict = {"1": RAGFLOW,"2": BISHENG,"4": DIFY}
  218. try:
  219. for row in data:
  220. agent_id_list.append(row["id"])
  221. existing_agent = db.query(DialogModel).filter_by(id=row["id"]).first()
  222. if existing_agent:
  223. existing_agent.name = row["name"]
  224. existing_agent.description = row["description"]
  225. # existing_agent.status = row["status"]
  226. existing_agent.mode = row["mode"]
  227. # existing_agent.tenant_id = get_rag_user_id(db, row["user_id"], type_dict[dialog_type])
  228. else:
  229. existing = DialogModel(id=row["id"], status=row["status"], name=row["name"], description=row["description"], tenant_id=get_rag_user_id(db, row["user_id"], type_dict[dialog_type]), dialog_type=dialog_type, mode=row["mode"])
  230. db.add(existing)
  231. db.commit()
  232. for dialog in db.query(DialogModel).filter_by(dialog_type=dialog_type).all():
  233. if dialog.id not in agent_id_list:
  234. # print(dialog.id)
  235. db.query(DialogModel).filter_by(id=dialog.id).update({"status": "2"})
  236. db.commit()
  237. except IntegrityError:
  238. db.rollback()
  239. raise
  240. finally:
  241. db.close()
  242. def get_data_from_ragflow_knowledge():
  243. db = SessionRagflow()
  244. try:
  245. results = db.query(RgKnowledge.id, RgKnowledge.name, RgKnowledge.description, RgKnowledge.status, RgKnowledge.tenant_id, RgKnowledge.doc_num, RgKnowledge.permission).all()
  246. formatted_results = [
  247. {"id": row[0], "name": row[1], "description": row[2], "status": str(row[3]),
  248. "user_id": str(row[4]), "doc_num": row[5], "permission": row[6]} for row in results]
  249. return formatted_results
  250. finally:
  251. db.close()
  252. def sync_agents_v2():
  253. db = SessionLocal()
  254. try:
  255. app_register = AppRegisterDao(db).get_apps()
  256. for app in app_register:
  257. if app["id"] == RAGFLOW:
  258. ragflow_data = get_data_from_ragflow_v2([])
  259. if ragflow_data:
  260. update_ids_in_local_v2(ragflow_data, "1")
  261. elif app["id"] == BISHENG:
  262. bisheng_data = get_data_from_bisheng_v2([])
  263. if bisheng_data:
  264. update_ids_in_local_v2(bisheng_data, "2")
  265. elif app["id"] == DIFY:
  266. dify_data = get_data_from_dify_v2([])
  267. if dify_data:
  268. update_ids_in_local_v2(dify_data, "4")
  269. print("v2 Agents synchronized successfully")
  270. except Exception as e:
  271. print(f"v2 Failed to sync agents: {str(e)}")
  272. finally:
  273. db.close()
  274. def update_ids_in_local_knowledge(data, klg_type):
  275. type_dict = {"1": RAGFLOW, "2": BISHENG, "4": DIFY}
  276. db = SessionLocal()
  277. agent_id_list = []
  278. try:
  279. for row in data:
  280. agent_id_list.append(row["id"])
  281. existing_agent = db.query(KnowledgeModel).filter_by(id=row["id"]).first()
  282. if existing_agent:
  283. existing_agent.name = row["name"]
  284. existing_agent.description = row["description"]
  285. # existing_agent.tenant_id = get_rag_user_id(db, row["user_id"], type_dict[klg_type])
  286. existing_agent.permission = row["permission"]
  287. existing_agent.documents = row["doc_num"]
  288. existing_agent.status = row["status"]
  289. else:
  290. existing = KnowledgeModel(id=row["id"], name=row["name"], description=row["description"],
  291. tenant_id=get_rag_user_id(db, row["user_id"], type_dict[klg_type]),status=row["status"],
  292. knowledge_type=1, permission=row["permission"], documents=row["doc_num"])
  293. db.add(existing)
  294. db.commit()
  295. for dialog in db.query(KnowledgeModel).filter_by(knowledge_type=klg_type).all():
  296. if dialog.id not in agent_id_list:
  297. db.query(KnowledgeModel).filter_by(id=dialog.id).delete()
  298. db.commit()
  299. except IntegrityError:
  300. db.rollback()
  301. raise
  302. finally:
  303. db.close()
  304. def get_one_from_ragflow_knowledge(klg_id):
  305. db = SessionRagflow()
  306. try:
  307. row = db.query(RgKnowledge.id, RgKnowledge.name, RgKnowledge.description, RgKnowledge.status, RgKnowledge.tenant_id, RgKnowledge.doc_num, RgKnowledge.permission).filter(RgKnowledge.id==klg_id).first()
  308. return {"id": row[0], "name": row[1], "description": row[2], "status": str(row[3]),
  309. "user_id": str(row[4]), "doc_num": row[5], "permission": row[6]} if row else {}
  310. finally:
  311. db.close()
  312. def sync_knowledge():
  313. db = SessionLocal()
  314. try:
  315. app_register = AppRegisterDao(db).get_apps()
  316. for app in app_register:
  317. if app["id"] == RAGFLOW:
  318. ragflow_data = get_data_from_ragflow_knowledge()
  319. if ragflow_data:
  320. update_ids_in_local_knowledge(ragflow_data, "1")
  321. # elif app["id"] == BISHENG:
  322. # bisheng_data = get_data_from_bisheng_v2([])
  323. # update_ids_in_local_v2(bisheng_data, "2")
  324. # elif app["id"] == DIFY:
  325. # dify_data = get_data_from_dify_v2([])
  326. # update_ids_in_local_v2(dify_data, "4")
  327. print("sync knowledge successfully")
  328. except Exception as e:
  329. print(f"Failed to sync knowledge: {str(e)}")
  330. finally:
  331. db.close()
  332. if __name__ == "__main__":
  333. a = get_data_from_dify_v2([])
  334. print(a)