From 7a9f9cb3c34ebc0836720d0f5738bbe70070bbb3 Mon Sep 17 00:00:00 2001 From: zhaoqingang <zhaoqg0118@163.com> Date: 星期四, 05 十二月 2024 14:22:24 +0800 Subject: [PATCH] 增加菜单和路由控制 --- app/service/difyService.py | 115 +++++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 79 insertions(+), 36 deletions(-) diff --git a/app/service/difyService.py b/app/service/difyService.py index 6b6a59a..93bc62b 100644 --- a/app/service/difyService.py +++ b/app/service/difyService.py @@ -5,9 +5,7 @@ from typing import Union, Dict, List from fastapi import HTTPException from starlette import status -from watchdog.observers.fsevents2 import message -# from Log import logger from app.config.config import settings from app.utils.rsa_crypto import RagflowCrypto @@ -18,6 +16,8 @@ def _handle_response(self, response: httpx.Response) -> Union[Dict, List]: if response.status_code != 200: + if response.status_code == 201: + return response.json() return {} data = response.json() @@ -27,8 +27,8 @@ status_code=status.HTTP_401_UNAUTHORIZED, detail="鐧诲綍杩囨湡", ) - if ret_code != 0: - return {} + # if ret_code != 0: + # return {} # 妫�鏌ヨ繑鍥炵殑鏁版嵁绫诲瀷 if isinstance(data.get("data"), dict): @@ -36,7 +36,7 @@ elif isinstance(data.get("data"), list): return data.get("data", []) else: - return {} + return data async def register(self, username: str, password: str): password = RagflowCrypto(settings.PUBLIC_KEY, settings.PRIVATE_KEY).encrypt(password) @@ -65,26 +65,25 @@ raise Exception("Authorization header not found in response") return authorization - async def chat(self, token: str, chat_id: str, message: str, upload_file_id: str, conversation_id: str): + async def chat(self, token: str, user_id: int, message: str, upload_file_id: str, conversation_id: str): target_url = f"{self.base_url}/v1/chat-messages" - files = [ + files = [] + if upload_file_id: + files = [ { "type": "image", - "transfer_method": "remote_url", - "url": "https://cloud.dify.ai/logo/logo-site.png", - "upload_file_id":"" + "transfer_method": "local_file", + "url": "", + "upload_file_id": upload_file_id } ] - if upload_file_id: - files[0]["transfer_method"] = "local_file" - files[0]["upload_file_id"] = upload_file_id data = { "inputs": {}, "query": message, "response_mode": "streaming", "conversation_id": conversation_id, - "user": chat_id, + "user": str(user_id), "files": files } @@ -97,7 +96,7 @@ if response.status_code == 200: try: async for answer in response.aiter_text(): - print(f"response of ragflow chat: {answer}") + # print(f"response of ragflow chat: {answer}") yield answer except GeneratorExit as e: print(e) @@ -107,44 +106,88 @@ - async def get_session_history(self, token: str, chat_id: str, is_all: int=0): - url = f"{self.base_url}/v1/conversation/get?conversation_id={chat_id}" - headers = {"Authorization": token} + async def get_session_history(self, token: str, conversation_id: str, user: str): + url = f"{self.base_url}/v1/messages" + params = { + 'user': user, + 'conversation_id': conversation_id + } + headers = {"Authorization": f'Bearer {token}'} async with httpx.AsyncClient() as client: - response = await client.get(url, headers=headers) + response = await client.get(url, params=params, headers=headers) + # print(response.text) + # print(response.status_code) + # print(response.res) data = self._handle_response(response) # print("----------------data----------------------:", data) - if is_all: - return data - return data.get("message", []) - async def upload(self, token: str, filename: str, file: bytes) -> dict: - url = f"{self.base_url}/console/api/files/upload" + return data + + async def upload(self, token: str, filename: str, file: bytes, user_id) -> dict: + url = f"{self.base_url}/v1/files/upload" headers = { - 'Content-Type': 'application/json', + # 'Content-Type': 'application/json', 'Authorization': f'Bearer {token}' } - + data = { + 'user': str(user_id) + } # 鍒涘缓琛ㄥ崟鏁版嵁锛屽寘鍚枃浠� files = {"file": (filename, file)} async with httpx.AsyncClient() as client: - response = await client.post(url, headers=headers, files=files) + response = await client.post(url, headers=headers, files=files, data=data) data = self._handle_response(response) - # file_path = data.get("file_path", "") - result = { - "file_path": data + + return data + + async def save_images(self, url: str, filename: str): + url = f"{self.base_url}{url}" + + async with httpx.AsyncClient() as client: + response = await client.get(url) + + response.raise_for_status() + + # 鎵撳紑涓�涓枃浠剁敤浜庡啓鍏� + with open(f"app/images/{filename}", 'wb') as f: + # 鍐欏叆璇锋眰鐨勫唴瀹� + f.write(response.content) + + + async def workflow(self, token: str, user_id: int, inputs: dict): + + target_url = f"{self.base_url}/v1/workflows/run" + data = { + "inputs": inputs, + "response_mode": "streaming", + "user": str(user_id), + "files":[] + } + + async with httpx.AsyncClient(timeout=1800) as client: + headers = { + 'Content-Type': 'application/json', + 'Authorization': f'Bearer {token}' } - - return result - + async with client.stream("POST", target_url, data=json.dumps(data), headers=headers) as response: + if response.status_code == 200: + try: + async for answer in response.aiter_text(): + # print(f"response of ragflow chat: {answer}") + yield answer + except GeneratorExit as e: + print(e) + return + else: + yield f"Error: {response.status_code}" if __name__ == "__main__": async def a(): - a = DifyService("http://192.168.20.119:11080") - b = await a.get_knowledge_list("ImY3ZTZlZWQwYTY2NTExZWY5ZmFiMDI0MmFjMTMwMDA2Ig.Zzxwmw.uI_HAWzOkipQuga1aeQtoeIc3IM", 1, - 10) + a = DifyService("http://192.168.20.116") + b = await a.get_session_history("app-YmOAMDsPpDDlqryMHnc9TzTO", "f94c6328-8ff0-4713-af3f-e823d547682d", + "63") print(b) import asyncio -- Gitblit v1.8.0