| | |
| | | import json |
| | | |
| | | import httpx |
| | | import requests |
| | | |
| | | from Log import logger |
| | | |
| | |
| | | url = f"{self.base_url}/exceltalk/upload/files" |
| | | params = {'chat_id': chat_id, 'is_col': '0'} |
| | | |
| | | |
| | | |
| | | async with httpx.AsyncClient() as client: |
| | | response = await client.post( |
| | | url, |
| | |
| | | params = {'chat_id': chat_id} |
| | | data = {"query": question} |
| | | headers = {'Content-Type': 'application/json'} |
| | | buffer = bytearray() |
| | | 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 chunk in response.aiter_bytes(): |
| | | json_data = process_buffer(chunk, buffer) |
| | | if json_data: |
| | | yield json_data |
| | | buffer.clear() |
| | | if decoded_line.startswith("data:"): |
| | | decoded_line = decoded_line[5:] |
| | | answer = json.loads(decoded_line) |
| | | yield answer |
| | | except GeneratorExit as e: |
| | | print(e) |
| | | yield {"message": "内部错误", "type": "close"} |
| | | finally: |
| | | # 在所有数据接收完毕后记录日志 |
| | | logger.info("All messages received and processed - over") |
| | | # 在所有数据接收完毕后返回close |
| | | yield {"message": "", "type": "close"} |
| | | |
| | | else: |
| | | yield f"Error: {response.status_code}" |
| | | |
| | | |
| | | |
| | | async def questions_talk(self, question, chat_id: str): |
| | | logger.error("---------------questions_talk--------------------------") |
| | |
| | | |
| | | 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}) |
| | | |
| | | |
| | | def process_buffer(data, buffer): |
| | | def try_parse_json(data1): |
| | | try: |
| | | return True, json.loads(data1) |
| | | except json.JSONDecodeError: |
| | | return False, None |
| | | |
| | | if data.startswith(b'data:'): |
| | | # 删除 'data:' 头 |
| | | data = data[5:].strip() |
| | | else: |
| | | pass |
| | | |
| | | # 直接拼接到缓冲区尝试解析JSON |
| | | buffer.extend(data.strip()) |
| | | success, parsed_data = try_parse_json(buffer) |
| | | if success: |
| | | return parsed_data |
| | | else: |
| | | # 解析失败,继续拼接 |
| | | return None |
| | | return await self.download_from_url(url, params={'word_name': file_id}) |