Browse Source

适配外部机器人[聊天接口切换为方案1]

liangxunge 1 month ago
parent
commit
4e242a9cc9

+ 25 - 6
api/controllers/console/explore/completion.py

@@ -30,12 +30,13 @@ from core.errors.error import (
 )
 from core.model_runtime.errors.invoke import InvokeError
 from extensions.ext_database import db
+from extensions.ext_redis import redis_client
 from libs import helper
-from libs.helper import uuid_value
+from libs.helper import uuid_value, extract_remote_ip
 from models.model import AppMode
 from services.app_generate_service import AppGenerateService
 from services.errors.llm import InvokeRateLimitError
-from services.robot_account_service import RobotAccountService
+from services.robot_account_service import RobotAccountService, ACCESS_TOKEN_EXPIRY
 
 
 # define completion api for user
@@ -180,10 +181,26 @@ class ChatApiForRobot(Resource):
         }
 
         # 3) 获取用户token,封装请求头
-        # access_token = RobotAccountService.login("suhh@mail.com.cn", "tj123456")
-        access_token = RobotAccountService.get_account_access_token("suhh@mail.com.cn")
-        if access_token is None:
-            access_token = RobotAccountService.login("suhh@mail.com.cn", "tj123456")
+        login_json = {
+            "email": "suhh@mail.com.cn",
+            "password": "tj123456",
+        }
+
+        # 3.1) 方案1:每次login
+        access_token = RobotAccountService.login(login_json["email"], login_json["password"])
+
+        # # 3.2) 方案2:login后将access_token写入redis,根据是否能够从redis取得内容判断
+        # access_token = RobotAccountService.get_account_access_token(login_json["email"])
+        # # access_token = None
+        # if access_token is None:
+        #     # 3.2.1) 方案2-1:调用登录接口,使用返回的access_token
+        #     login_response = requests.post(f"{request.host_url}console/api/login", json=login_json)
+        #     access_token = login_response.json()["data"]["access_token"]
+        #     access_token_key = RobotAccountService._get_access_token_key(login_json["email"])
+        #     redis_client.setex(access_token_key, ACCESS_TOKEN_EXPIRY, access_token)
+        #
+        #     # 3.2.2) 方案2-2:调用service层封装的login方法,使用返回的access_token
+        #     access_token = RobotAccountService.login(login_json["email"], login_json["password"])
 
         headers = {
             "Content-Type": "application/json",
@@ -193,6 +210,8 @@ class ChatApiForRobot(Resource):
             "Connection": "keep-alive",
         }
 
+        logging.info(f"Robot request: {extract_remote_ip(request)}")
+
         # 4) 封装请求url并发送请求
         chat_message_url = f'{request.host_url}console/api/installed-apps/{installed_app_id}/chat-messages'
         logging.info("Sending request to %s", chat_message_url)

+ 2 - 7
api/services/robot_account_service.py

@@ -17,14 +17,9 @@ class RobotAccountService:
     def login(email: str, password: str, *, ip_address: Optional[str] = None) -> str:
         account = AccountService.authenticate(email, password)
 
-        if ip_address:
-            AccountService.update_login_info(account=account, ip_address=ip_address)
+        token_pair = AccountService.login(account=account, ip_address=ip_address)
 
-        if account.status == AccountStatus.PENDING.value:
-            account.status = AccountStatus.ACTIVE.value
-            db.session.commit()
-
-        access_token = RobotAccountService.get_account_jwt_token(account=account)
+        access_token = token_pair.access_token
         access_token_key = RobotAccountService._get_access_token_key(email)
         redis_client.setex(access_token_key, ACCESS_TOKEN_EXPIRY, access_token)