import os
from http import HTTPStatus
from dashscope import Application

class StreamingMultiTurnChat:
“”“流式多轮对话封装类,自动管理 session_id,保持对话上下文,支持流式输出”“”

def __init__(self, api_key=None, app_id=None):
    """
    初始化对话实例
    :param api_key: 百炼 API Key
    :param app_id: 百炼应用 ID
    """
    self.api_key = api_key or os.getenv("DASHSCOPE_API_KEY", "sk-xxxxxxxxxxxx")
    self.app_id = app_id or "xxooooxxxxooooxxxxooooxx"
    self.session_id = None  # 会话ID,首次调用为 None,之后自动更新

def ask(self, prompt):
    """
    发送用户问题,返回一个生成器,每次 yield 一个文本块(流式输出)
    :param prompt: 用户输入的问题
    :return: 生成器,迭代得到模型回答的文本片段;若请求失败则 yield 错误信息
    """
    responses = Application.call(
        api_key=self.api_key,
        app_id=self.app_id,
        prompt=prompt,
        session_id=self.session_id,
        stream=True,               # 开启流式输出
        incremental_output=True    # 增量输出,每次只返回新增的文本
    )

    # 遍历流式响应
    for response in responses:
        if response.status_code != HTTPStatus.OK:
            # 发生错误,yield 错误信息并停止迭代
            error_msg = (f"请求失败,request_id={response.request_id},"
                         f"错误码={response.status_code},信息={response.message}")
            yield error_msg
            break

        # 更新会话ID(流式响应中每个包都包含相同的 session_id,取第一次即可)
        if self.session_id is None and hasattr(response.output, 'session_id'):
            self.session_id = response.output.session_id

        # 提取当前文本块并返回
        text_chunk = response.output.text
        yield text_chunk

def reset(self):
    """重置会话,开始全新的对话"""
    self.session_id = None

---------- 使用示例:控制台交互(流式输出) ----------

if name == “main”:
chat = StreamingMultiTurnChat() #第一个接口,初始化

# 第一轮:流式打印回答
for chunk in chat.ask("你是谁?"):               #第二个接口,输入问题,解析回答
    print(chunk, end="", flush=True)
print("\n**************************************\n")

# 第二轮:基于上下文继续对话
for chunk in chat.ask("你擅长最什么?"):
    print(chunk, end="", flush=True)
print("\n**************************************\n")

# 第三轮:基于上下文继续对话
for chunk in chat.ask("刚才问了什么问题?"):
    print(chunk, end="", flush=True)
print("\n**************************************\n")

# 重置会话,清除历史记忆
chat.reset()                                                  #第三个接口,重置会话
for chunk in chat.ask("刚才问了什么问题?"):
    print(chunk, end="", flush=True)
print("\n**************************************\n")

更多推荐