From bcc63761bdc4c1604c9275a3c5cdf8a483ad5611 Mon Sep 17 00:00:00 2001
From: zhaoqingang <zhaoqg0118@163.com>
Date: 星期四, 06 二月 2025 16:37:09 +0800
Subject: [PATCH] TOKEN同步功能

---
 app/config/env_conf/default_agent_conf.json |    9 +++
 app/models/postgresql_base_model.py         |    6 +
 app/service/v2/chat.py                      |    4 
 app/config/env_conf/config.yaml             |    8 +-
 app/task/fetch_agent.py                     |    8 ++
 app/task/sync_account_token.py              |   73 +++++++++++++++++++++++-
 main.py                                     |    4 
 app/config/env_conf/account.yaml            |    8 +-
 app/api/v2/chat.py                          |    8 +-
 app/service/v2/initialize_data.py           |    1 
 app/api/auth.py                             |   17 +++--
 app/config/agent_base_url.py                |    6 +
 12 files changed, 120 insertions(+), 32 deletions(-)

diff --git a/app/api/auth.py b/app/api/auth.py
index 3637cda..da59d89 100644
--- a/app/api/auth.py
+++ b/app/api/auth.py
@@ -9,13 +9,13 @@
 from app.api import Response, pwd_context, get_current_user
 from app.api.user import reset_user_pwd
 from app.config.config import settings
-from app.config.const import RAGFLOW, BISHENG, DIFY
+from app.config.const import RAGFLOW, BISHENG, DIFY, chat_server, workflow_server
 from app.models.app_token_model import AppToken
 from app.models.base_model import get_db
 from app.models.postgresql_base_model import get_pdb
 from app.models.token_model import upsert_token, update_token
 from app.models.user import UserCreate, LoginData
-from app.models.user_model import UserModel, UserAppModel
+from app.models.user_model import UserModel, UserAppModel, UserTokenModel
 from app.service.auth import authenticate_user, create_access_token, is_valid_password, save_register_user, \
     update_user_token, UserAppDao, update_user_info, password_rsa
 from app.service.bisheng import BishengService
@@ -143,15 +143,18 @@
 
     # await update_token(db, user.id, access_token, token_dict)
     # await update_user_token(db, user.id, token_dict)
-    '''
+    token_dict = {}
+    for app in  [{"app": RAGFLOW, "token_id": chat_server},
+                {"app": DIFY,"token_id": workflow_server}]:
+        user_token = db.query(UserTokenModel).filter(UserTokenModel.id == app["token_id"]).first()
+        if user_token and user_token.access_token:
+            token_dict[app["app"]] = user_token.access_token
     result = await pdb.execute(select(AppToken).where(AppToken.id == user.id))
     db_app_token = result.scalars().first()
     if isinstance(access_token, bytes):
         access_token = access_token.decode()
     if not db_app_token:
-        app_token_str = json.dumps(token_dict)
-        # print(app_token_str)
-        app_token = AppToken(id=user.id, token=access_token, app_token=app_token_str)
+        app_token = AppToken(id=user.id, token=access_token, app_token=json.dumps(token_dict))
         pdb.add(app_token)
         await pdb.commit()
         await pdb.refresh(app_token)
@@ -160,7 +163,7 @@
         db_app_token.app_token = json.dumps(token_dict)
         await pdb.commit()
         await pdb.refresh(db_app_token)
-    '''
+
     return Response(code=200, msg="Login successful", data={
         "access_token": access_token,
         "token_type": "bearer",
diff --git a/app/api/v2/chat.py b/app/api/v2/chat.py
index 0d6b9a5..bf1b10c 100644
--- a/app/api/v2/chat.py
+++ b/app/api/v2/chat.py
@@ -19,21 +19,21 @@
 
     chat_info = await get_chat_info(db, chatId)
     if not chat_info:
-        error_msg = json.dumps({"message": smart_message_error, "error": "**ERROR**: parameter exception", "status": http_400})
+        error_msg = json.dumps({"message": smart_message_error, "error": "\n**ERROR**: parameter exception", "status": http_400})
         return StreamingResponse(f"data: {error_msg}\n\n",
                                  media_type="text/event-stream")
     session_id = dialog.sessionId
     if chat_info.mode == dialog_chat:
         if not dialog.query:
             error_msg = json.dumps(
-                {"message": smart_message_error, "error": "**ERROR**: question cannot be empty.", "status": http_400})
+                {"message": smart_message_error, "error": "\n**ERROR**: question cannot be empty.", "status": http_400})
             return StreamingResponse(f"data: {error_msg}\n\n",
                                      media_type="text/event-stream")
         if not session_id:
             session = await service_chat_sessions(db, chatId, dialog.query)
             if not session or session.get("code") != 0:
                 error_msg = json.dumps(
-                    {"message": smart_message_error, "error": "**ERROR**: chat agent error", "status": http_500})
+                    {"message": smart_message_error, "error": "\n**ERROR**: chat agent error", "status": http_500})
                 return StreamingResponse(f"data: {error_msg}\n\n",
                                          media_type="text/event-stream")
             session_id = session.get("data", {}).get("id")
@@ -47,7 +47,7 @@
         return StreamingResponse(service_chat_basic(db, chatId, dialog.question, dialog_chat.sessionId, 1),
                                  media_type="text/event-stream")
     else:
-        error_msg = json.dumps({"message": smart_message_error, "error": "**ERROR**: chat agent error", "status": http_500})
+        error_msg = json.dumps({"message": smart_message_error, "error": "\n**ERROR**: chat agent error", "status": http_500})
         return StreamingResponse(f"data: {error_msg}\n\n",
                                  media_type="text/event-stream")
 
diff --git a/app/config/agent_base_url.py b/app/config/agent_base_url.py
index 6002e8d..bf293a8 100644
--- a/app/config/agent_base_url.py
+++ b/app/config/agent_base_url.py
@@ -3,10 +3,12 @@
 RG_CHAT_DIALOG= "/api/v1/chats/{}/completions"
 RG_CHAT_SESSIONS= "/api/v1/chats/{}/sessions"
 RG_APP_NEW_TOKEN= "/v1/system/new_token"
-RG_APP_token_LIST= "/v1/system/token_list"
+RG_APP_TOKEN_LIST= "/v1/system/token_list"
+RG_USER_LOGIN= "/v1/user/login"
 
 ### ----------
 DF_CHAT_AGENT= "/v1/chat-messages"
 DF_CHAT_WORKFLOW= "/v1/workflows/run"
 DF_CHAT_PARAMETERS= "/v1/parameters"
-DF_CHAT_API_KEY= "/console/api/apps/{}/api-keys"
\ No newline at end of file
+DF_CHAT_API_KEY= "/console/api/apps/{}/api-keys"
+DF_USER_LOGIN= "/console/api/login"
\ No newline at end of file
diff --git a/app/config/env_conf/account.yaml b/app/config/env_conf/account.yaml
index b2a6095..6af5c4a 100644
--- a/app/config/env_conf/account.yaml
+++ b/app/config/env_conf/account.yaml
@@ -1,7 +1,7 @@
 chat_server:
-  account: user@example.com
-  password: secret
+  account: zhao1@example.com
+  password: gAAAAABnpFLtotY2OIRH12BJh4MzMgn5Zil7-DVpIeuqlFwvr0g6g_n4ULogn-LNhCbtk6cCDkzZlqAHvBSX2e_zf7AsoyzbiQ==
 
 workflow_server:
-  account: basic@mail.com
-  password: Basic2024
\ No newline at end of file
+  account: zqg@mail.com
+  password: gAAAAABnpCfh1IAlSg1wBn7xPjbiucm-YAyzrKygw4rQiRg267ZMrhIolE38n94E8GgOmWpFfQx3s79zdD6yUrIqOLa2YeW7eA==
\ No newline at end of file
diff --git a/app/config/env_conf/config.yaml b/app/config/env_conf/config.yaml
index b3a8273..30d2988 100644
--- a/app/config/env_conf/config.yaml
+++ b/app/config/env_conf/config.yaml
@@ -1,10 +1,10 @@
 secret_key: your-secret-key
 sgb_base_url: http://192.168.20.119:13001
 sgb_websocket_url: ws://192.168.20.119:13001
-fwr_base_url: http://192.168.20.119:11080
+fwr_base_url: http://192.168.20.116:11080
 database_url: mysql+pymysql://root:infini_rag_flow@192.168.20.119:5455/rag_basic
 sgb_db_url: mysql+pymysql://root:1234@192.168.20.119:13306/bisheng
-fwr_db_url: mysql+pymysql://root:infini_rag_flow@192.168.20.119:15455/rag_flow
+fwr_db_url: mysql+pymysql://root:infini_rag_flow@192.168.20.116:15455/rag_flow
 PUBLIC_KEY: |
   -----BEGIN PUBLIC KEY-----
   MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArq9XTUSeYr2+N1h3Afl/z8Dse/2yD0ZGrKwx+EEEcdsBLca9Ynmx3nIB5obmLlSfmskLpBo0UACBmB5rEjBp2Q2f3AG3Hjd4B+gNCG6BDaawuDlgANIhGnaTLrIqWrrcm4EMzJOnAOI1fgzJRsOOUEfaS318Eq9OVO3apEyCCt0lOQK6PuksduOjVxtltDav+guVAA068NrPYmRNabVKRNLJpL8w4D44sfth5RvZ3q9t+6RTArpEtc5sh5ChzvqPOzKGMXW83C95TxmXqpbK6olN4RevSfVjEAgCydH6HN6OhtOQEcnrU97r9H0iZOWwbw3pVrZiUkuRD1R56Wzs2wIDAQAB
@@ -15,11 +15,11 @@
 PASSWORD_KEY: VKinqB-8XMrwCLLrcf_PyHyo12_4PVKvWzaHjNFions=
 basic_base_url: http://192.168.20.231:8000
 basic_paper_url: http://192.168.20.231:8000
-dify_base_url: http://192.168.20.116
+dify_base_url: http://192.168.20.119:13002
 dify_api_token: app-YmOAMDsPpDDlqryMHnc9TzTO
 postgresql_database_url: postgresql+asyncpg://kong:kongpass@192.168.20.119:5432/kong
 dify_workflow_clean: app-OpF0drPu0XcgqcekQpT4FA8a
 dify_workflow_report: app-0MAkdFWqh9zxwmU69O0BFU1s
-dify_database_url: postgresql+psycopg2://postgres:difyai123456@192.168.20.116:15432/dify
+dify_database_url: postgresql+psycopg2://postgres:difyai123456@192.168.20.119:15432/dify
 
 
diff --git a/app/config/env_conf/default_agent_conf.json b/app/config/env_conf/default_agent_conf.json
index 86d538b..afe500b 100644
--- a/app/config/env_conf/default_agent_conf.json
+++ b/app/config/env_conf/default_agent_conf.json
@@ -108,6 +108,15 @@
       "description": "鏂囨。鍑哄嵎",
       "icon": "intellFrame4",
       "agentType": "paperTalk",
+      "parameters": {
+        "retriever_resource": {
+          "enabled": true
+        },
+        "user_input_form": [],
+        "file_upload":{
+          "enabled": false
+        }
+      },
       "dialogType": "3",
       "mode": "agent-basic"
     }
diff --git a/app/models/postgresql_base_model.py b/app/models/postgresql_base_model.py
index b4b244e..f6caf45 100644
--- a/app/models/postgresql_base_model.py
+++ b/app/models/postgresql_base_model.py
@@ -14,4 +14,8 @@
 
 async def get_pdb() -> AsyncSession:
     async with PostgresqlSessionLocal() as session:
-        yield session
\ No newline at end of file
+        # yield session
+        try:
+            yield session
+        finally:
+            session.close()
\ No newline at end of file
diff --git a/app/service/v2/chat.py b/app/service/v2/chat.py
index 5846409..7af7071 100644
--- a/app/service/v2/chat.py
+++ b/app/service/v2/chat.py
@@ -119,7 +119,7 @@
         logger.error(e)
         try:
             yield "data: " + json.dumps({"message": smart_message_error,
-                                         "error": "**ERROR**: " + str(e), "status": http_500},
+                                         "error": "\n**ERROR**: " + str(e), "status": http_500},
                                         ensure_ascii=False) + "\n\n"
         except:
             ...
@@ -199,7 +199,7 @@
         logger.error(e)
         try:
             yield "data: " + json.dumps({"message": smart_message_error,
-                                         "error": "**ERROR**: " + str(e), "status": http_500},
+                                         "error": "\n**ERROR**: " + str(e), "status": http_500},
                                         ensure_ascii=False) + "\n\n"
         except:
             ...
diff --git a/app/service/v2/initialize_data.py b/app/service/v2/initialize_data.py
index 3b92694..c3e295f 100644
--- a/app/service/v2/initialize_data.py
+++ b/app/service/v2/initialize_data.py
@@ -135,6 +135,7 @@
                 dialog.name = agent["name"]
                 dialog.description = agent["description"]
                 dialog.icon = agent["icon"]
+                dialog.mode = agent["mode"]
                 dialog.parameters = json.dumps(agent["parameters"])
                 db.commit()
             except Exception as e:
diff --git a/app/task/fetch_agent.py b/app/task/fetch_agent.py
index f394dc2..bee4790 100644
--- a/app/task/fetch_agent.py
+++ b/app/task/fetch_agent.py
@@ -8,7 +8,7 @@
 from sqlalchemy.orm import sessionmaker, Session
 
 from app.config.config import settings
-from app.config.const import RAGFLOW, BISHENG, DIFY, ENV_CONF_PATH
+from app.config.const import RAGFLOW, BISHENG, DIFY, ENV_CONF_PATH, Dialog_STATSU_DELETE, Dialog_STATSU_ON
 from app.models import KnowledgeModel
 from app.models.dialog_model import DialogModel
 from app.models.user_model import UserAppModel
@@ -296,6 +296,10 @@
                 existing_agent.name = row["name"]
                 existing_agent.description = row["description"]
                 existing_agent.mode = row["mode"]
+                if existing_agent.status == Dialog_STATSU_DELETE:
+                    existing_agent.status = Dialog_STATSU_ON
+                if row["parameters"]:
+                    existing_agent.parameters = json.dumps(row["parameters"])
             else:
                 existing = DialogModel(id=row["id"], status=row["status"], name=row["name"],
                                        description=row["description"],
@@ -306,7 +310,7 @@
         for dialog in db.query(DialogModel).filter_by(dialog_type=dialog_type).all():
             if dialog.id not in agent_id_list:
                 # print(dialog.id)
-                db.query(DialogModel).filter_by(id=dialog.id).update({"status": "2"})
+                db.query(DialogModel).filter_by(id=dialog.id).update({"status": Dialog_STATSU_DELETE})
                 db.commit()
     except IntegrityError:
         db.rollback()
diff --git a/app/task/sync_account_token.py b/app/task/sync_account_token.py
index 1e7747c..b7c2e5f 100644
--- a/app/task/sync_account_token.py
+++ b/app/task/sync_account_token.py
@@ -1,14 +1,79 @@
+import asyncio
+import json
+import time
+from datetime import datetime, timedelta
+
+from sqlalchemy.future import select
+
+from app.config.agent_base_url import RG_USER_LOGIN, DF_USER_LOGIN
+from app.config.config import settings
+from app.config.const import chat_server, workflow_server
+from app.models import UserTokenModel
+from app.models.app_token_model import AppToken
+from app.models.base_model import SessionLocal
+from app.models.postgresql_base_model import get_pdb, PostgresqlSessionLocal
+from app.service.ragflow import RagflowService
+from app.service.v2.app_driver.chat_data import ChatBaseApply
+from app.utils.password_handle import password_decrypted
 
 
-
-def sync_token():
+async def sync_token():
     """
     1.鑾峰彇鍒皍ser_token琛ㄤ腑鐨勮处鍙�
-    2.鍒ゆ柇鏄惁瓒呰繃12灏忔椂锛屽惁鍒欒幏鍙栨柊鐨則oken
+    2.鍒ゆ柇鏄惁瓒呰繃12灏忔椂锛岃秴杩囧垯鑾峰彇鏂扮殑token
     3.鏈秴杩�12灏忔椂锛屽垯娴嬭瘯token鏈夋晥鎬э紝chat_ping鎺ュ彛锛岃繑鍥�401锛屽垯閲嶆柊鑾峰彇token
     4.token鑾峰彇锛歭ogin
     df:/console/api/workspaces
     rg:/v1/system/version
     5.璺熸柊鏈湴token鍜宬ong缃戝叧token
     :return:
-    """
\ No newline at end of file
+    """
+    app_data = [{"token_id": chat_server, "url": f"{settings.fwr_base_url}{RG_USER_LOGIN}",
+                 "data": {"email": "", "password": ""}, "is_crypt": True},
+                {"token_id": workflow_server, "url": f"{settings.dify_base_url}{DF_USER_LOGIN}",
+                 "data": {"email": "", "password": "", "remember_me": True, "language": "zh-Hans"}, "is_crypt": False}]
+
+    async def sync_token_chat(token_id, url, data, is_crypt):
+        db = SessionLocal()
+        # pdb = PostgresqlSessionLocal()
+        current_time = datetime.now() - timedelta(hours=12)
+        try:
+            user_token = db.query(UserTokenModel).filter(UserTokenModel.id == token_id).first()
+
+            if user_token and (user_token.updated_at < current_time or not user_token.access_token):
+                chat = ChatBaseApply()
+                data["email"] = user_token.account
+                if is_crypt:
+                    data["password"] = await chat.password_encrypt(await password_decrypted(user_token.password))
+                else:
+                    data["password"] = await password_decrypted(user_token.password)
+                res = await chat.chat_login(url, data, {'Content-Type': 'application/json'})
+                if res:
+                    access_token = res["data"]["access_token"]
+                    user_token.access_token = access_token
+                    user_token.updated_at = datetime.now()
+                    db.commit()
+        except Exception as e:
+            print(e)
+        finally:
+            db.close()
+            # await pdb.close()
+
+    tasks = []
+    for app in app_data:
+        tasks.append(asyncio.create_task(sync_token_chat(app["token_id"], app["url"], app["data"], app["is_crypt"])))
+    done, pending = await asyncio.wait(tasks, return_when=asyncio.ALL_COMPLETED)
+
+
+
+def start_sync_token_task():
+    asyncio.run(sync_token())
+
+
+if __name__ == "__main__":
+
+
+
+    start_sync_token_task()
+
+
diff --git a/main.py b/main.py
index 898348d..bf04686 100644
--- a/main.py
+++ b/main.py
@@ -29,7 +29,7 @@
 from app.task.fetch_agent import sync_agents, initialize_agents, sync_agents_v2, sync_knowledge, \
     sync_resources_from_json
 from app.init_config.init_run_data import sync_default_data
-from app.task.sync_account_token import sync_token
+from app.task.sync_account_token import sync_token, start_sync_token_task
 
 init_db()
 
@@ -70,7 +70,7 @@
 # 鍒涘缓璋冨害鍣�
 scheduler = BackgroundScheduler()
 scheduler.add_job(sync_agents_v2, 'interval', minutes=60, id="sync_resource_data")
-scheduler.add_job(sync_token, 'interval', minutes=5, id="sync_token_1")
+scheduler.add_job(start_sync_token_task, 'interval', minutes=5, id="sync_token_1")
 # scheduler.add_job(delete_file_after_delay, 'interval', minutes=10, id="delete_file_after_delay")
 scheduler.start()
 

--
Gitblit v1.8.0