| | |
| | | import json |
| | | |
| | | import httpx |
| | | import requests |
| | | |
| | | from Log import logger |
| | | |
| | | |
| | | class BasicService: |
| | |
| | | def _check_response(self, response: httpx.Response): |
| | | """检查响应并处理错误""" |
| | | if response.status_code not in [200, 201]: |
| | | raise Exception(f"Failed to fetch data from API: {response.text}") |
| | | # raise Exception(f"Failed to fetch data from API: {response.status_code}") |
| | | logger.error(f"Failed to fetch data from API:") |
| | | logger.error(response.status_code) |
| | | response_data = response.json() |
| | | status_code = response_data.get("status_code", 0) |
| | | if status_code != 200: |
| | | raise Exception(f"Failed to fetch data from API: {response.text}") |
| | | return response_data.get("data", {}) |
| | | return response_data |
| | | |
| | | async def download_from_url(self, url, params=None): |
| | | async with httpx.AsyncClient() as client: |
| | |
| | | url = f"{self.base_url}/exceltalk/download/excel" |
| | | return await self.download_from_url(url, params={'excel_name': file_id}) |
| | | |
| | | async def excel_talk_upload(self, chat_id: str, filename: str, file_content: bytes): |
| | | async def excel_talk_upload(self, chat_id: str, files): |
| | | url = f"{self.base_url}/exceltalk/upload/files" |
| | | params = {'chat_id': chat_id, 'is_col': '0'} |
| | | |
| | | # 创建 FormData 对象 |
| | | files = [('files', (filename, file_content, 'application/octet-stream'))] |
| | | |
| | | async with httpx.AsyncClient() as client: |
| | | async with httpx.AsyncClient(timeout=300) as client: |
| | | response = await client.post( |
| | | url, |
| | | files=files, |
| | | params=params |
| | | ) |
| | | return await self._check_response(response) |
| | | return self._check_response(response) |
| | | |
| | | async def excel_talk(self, question: str, chat_id: str): |
| | | url = f"{self.base_url}/exceltalk/talk" |
| | | params = {'chat_id': chat_id} |
| | | data = {"query": question} |
| | | headers = {'Content-Type': 'application/json'} |
| | | async with httpx.AsyncClient(timeout=300.0) as client: |
| | | async with client.stream("POST", url, params=params, json=data, headers=headers) as response: |
| | | if response.status_code == 200: |
| | | with requests.post(url, headers=headers, json=data, params=params, timeout=60, |
| | | stream=True) as response: |
| | | for line in response.iter_lines(): |
| | | if line: |
| | | decoded_line = line.decode("utf-8") |
| | | try: |
| | | async for answer in response.aiter_text(): |
| | | print(f"response of ragflow chat: {answer}") |
| | | yield answer |
| | | if decoded_line.startswith("data:"): |
| | | decoded_line = decoded_line[5:] |
| | | answer = json.loads(decoded_line) |
| | | answer["type"] = "message" |
| | | yield answer |
| | | except GeneratorExit as e: |
| | | logger.error("------------except GeneratorExit as e:---------------------") |
| | | logger.error(e) |
| | | print(e) |
| | | return |
| | | yield {"message": "内部错误", "type": "close"} |
| | | # finally: |
| | | # # 在所有数据接收完毕后返回close |
| | | # yield {"message": "", "type": "close"} |
| | | |
| | | else: |
| | | yield f"Error: {response.status_code}" |
| | | continue |
| | | # yield f"Error: {response.status_code}" |
| | | else: |
| | | # 在所有数据接收完毕后返回close |
| | | yield {"message": "", "type": "close"} |
| | | |
| | | async def questions_talk(self, question, chat_id: str): |
| | | logger.error("---------------questions_talk--------------------------") |
| | | url = f"{self.base_url}/questions/talk" |
| | | params = {'chat_id': chat_id} |
| | | headers = {'Content-Type': 'text/plain'} |
| | | async with httpx.AsyncClient(timeout=1800) as client: |
| | | response = await client.post( |
| | | url, |
| | | data=question, |
| | | headers=headers, |
| | | params=params |
| | | ) |
| | | return self._check_response(response) |
| | | |
| | | async def questions_talk_word_download(self, file_id: str): |
| | | url = f"{self.base_url}/questions/download/word" |
| | | return await self.download_from_url(url, params={'word_name': file_id}) |