python 逆向kimi 转oai 流式输出

看这里。

看。[quote=“zhc, post:1, topic:54056, username:zhhc88”]

    async def create_completion_stream(self, model: str, messages: list, refresh_token: str, use_search: bool = True, retry_count: int = 0):
        try:
            logger.info(messages)

            ref_file_urls = self.extract_ref_file_urls(messages)
            refs = await asyncio.gather(*(self.upload_file(url, refresh_token) for url in ref_file_urls))

            await self.fake_request(refresh_token)

            conv_id = await self.create_conversation(refresh_token)

            token = self.acquire_token(refresh_token)

            payload = {
                "messages": self.messages_prepare(messages),
                "refs": refs,
                "use_search": use_search
            }

            # 异步POST请求
            async with ClientSession() as session:
                async with session.post(f"{self.BASE_URL}/api/chat/{conv_id}/completion/stream", json=payload, headers={'Authorization': f'Bearer {token}', **self.FAKE_HEADERS}, timeout=120) as response:
                    response.raise_for_status()  # Ensure response status is 200
                    stream_start_time = datetime.now()
                    created = datetime.now().timestamp()
                    search_flag = False
                    silent_search = 'silent_search' in model
                    # 初始化数据发送
                    yield (f"data: {json.dumps({'id': conv_id, 'model': model, 'object': 'chat.completion.chunk', 'choices': [{'index': 0, 'delta': {'role': 'assistant', 'content': ''}, 'finish_reason': None}], 'created': created})}\n\n".encode('utf-8'))
                    async for data, end_of_http_chunk in response.content.iter_chunks():
                        if not data or data == "":
                            continue

                        text = data.decode('utf-8')  # 解码接收到的数据块
                        logger.info("====")
                        logger.info(f"text is {text}")
                        try:
                            if text.startswith("data:"):
                                event_data = text.lstrip("data:").strip()
                                event_data = event_data.split("data:")[0]
                                logger.info("----")
                                logger.info(f"event_data is {event_data}")
                                event = json.loads(event_data)
                                content = ''
                                if event.get('event') == 'cmpl':
                                    except_char_index = event['text'].find("�")
                                    chunk = event['text'][:except_char_index if except_char_index != -
                                                          1 else len(event['text'])]
                                    content = (
                                        '\n' if search_flag else '') + chunk
                                    if search_flag:
                                        search_flag = False
                                elif event.get('event') in ['all_done', 'error']:
                                    content = '\n[内容由于不合规被停止生成,我们换个话题吧]' if event.get(
                                        'event') == 'error' else ''
                                elif not silent_search and event.get('event') == 'search_plus' and event.get('msg') and event['msg'].get('type') == 'get_res':
                                    if not search_flag:
                                        search_flag = True
                                    content = f"检索 {event['msg']['title']}({event['msg']['url']}) ...\n"
                                if content:
                                    yield (f"data: {json.dumps({'id': conv_id, 'model': model, 'object': 'chat.completion.chunk', 'choices': [{'index': 0, 'delta': {'content': content}, 'finish_reason': None}], 'created': created})}\n\n")
                        except Exception as e:
                            logger.error(
                                f"Error processing SSE data: {e}", exc_info=True)
                            yield (f"data: {{'error': 'Internal server error'}}\n\n".encode('utf-8'))
                            return
                    # async for item in self.create_trans_stream(model, conv_id, response):
                    #     # 对 item 进行处理
                    #     print(item)

                    # return await self.create_trans_stream(model, conv_id, response)

From #dev to 开发调优

1 个赞