one-api icon indicating copy to clipboard operation
one-api copied to clipboard

智谱chatglm_turbo流式无法输出

Open kenneth-bro opened this issue 2 years ago • 7 comments

例行检查

  • [x] 我已确认目前没有类似 issue
  • [x] 我已确认我已升级到最新版本
  • [x] 我已完整查看过项目 README,尤其是常见问题部分
  • [x] 我理解并愿意跟进此 issue,协助测试和提供反馈
  • [x] 我理解并认可上述内容,并理解项目维护者精力有限,不遵循规则的 issue 可能会被无视或直接关闭

问题描述 使用 stream=true 输出时,model_name=chatglm_turbo 无法正常输出, 非stream模式可以。

复现步骤

import time
from openai import OpenAI


class OneAPIDemo:

    @staticmethod
    def completion(mode_name, messages=[]):
        """
            完成一次对话
        :param mode_name:
        :param messages:
        :return:
        """
        completion = client.chat.completions.create(
            model=model_name,
            messages=messages
        )
        return completion

    @staticmethod
    def completion_stream(model_name, message=[]):
        """
            流式对话
        :param model_name:
        :param message:
        :return:
        """
        completion = client.chat.completions.create(
            model=model_name,
            messages=message,
            stream=True
        )
        return completion


if __name__ == '__main__':
    base_url = ""
    api_key = ""

    client = OpenAI(api_key=api_key,
                    base_url=base_url)
    model_name = "chatglm_turbo"
    messages = [
        {"role": "user", "content": "1+1=?"}
    ]
    start_time = time.time()

    # 是否流式输出
    stream = True
    if stream:
        completion_text = ""
        response = OneAPIDemo.completion_stream(model_name, messages)
        for chunk in response:
            if chunk.choices[0].finish_reason == "stop":
                # 完成
                break

            chunk_text = chunk.choices[0].delta.content
            if chunk_text is not None:
                completion_text += chunk_text
                print(f"接收到: {chunk_text}")

        print(f"回复:{completion_text}\n本次耗时: {time.time() - start_time:.2f}s")

    else:
        response = OneAPIDemo.completion(model_name, messages)
        res_text = response.choices[0].message.content
        print(f"回复: {res_text}\n本次耗时: {time.time() - start_time:.2f}s")

预期结果 =2

kenneth-bro avatar Dec 11 '23 12:12 kenneth-bro

我也遇到了,流式调用的时候,只有通义千问是正常的,其他模型会返回json结果,智谱AI会直接报错。

关联issue:https://github.com/songquanpeng/one-api/issues/861

taomas avatar Dec 23 '23 03:12 taomas

image

songquanpeng avatar Dec 24 '23 07:12 songquanpeng

image

@songquanpeng 是不是因为这个返回的model名和传入的不一样的问题,导致用了openai的python sdk没用?

kenneth-bro avatar Dec 25 '23 05:12 kenneth-bro

image @songquanpeng 是不是因为这个返回的model名和传入的不一样的问题,导致用了openai的python sdk没用?

可以用模型名称重定向功能试一下

songquanpeng avatar Jan 01 '24 09:01 songquanpeng

image @songquanpeng 是不是因为这个返回的model名和传入的不一样的问题,导致用了openai的python sdk没用?

可以用模型名称重定向功能试一下

好像不行哎

kenneth-bro avatar Jan 09 '24 08:01 kenneth-bro

code

在我使用Python调用通义千问时,使用流式输出也有类似的问题,提示Accept type just supports "text/event-stream"

bowjacon avatar Jan 12 '24 08:01 bowjacon

我的解决方法是注释掉 ./site-packages/openai/_base_client.py:581 行 其内容为:

"Accept": "application/json",

我用的openai包版本为:1.11.0

xqbumu avatar Feb 04 '24 03:02 xqbumu

我的解决方法是注释掉 ./site-packages/openai/_base_client.py:581 行 其内容为:

"Accept": "application/json",

我用的openai包版本为:1.11.0

@xqbumu 可以采用这个方式, 不需要修改 openai 包

r = OPENAI_CLIENT.chat.completions.create(
    stream=True,
    model='MODEL_NAME',
    messages=messages,
    extra_headers={
        'Accept': 'text/event-stream',
    },
)

在请求内加上 extra_headers 参数可以覆盖 OpenAI 包自带的头部信息

ImYrS avatar Feb 26 '24 05:02 ImYrS

我的解决方法是注释掉 ./site-packages/openai/_base_client.py:581 行 其内容为: "Accept": "application/json", 我用的openai包版本为:1.11.0

@xqbumu 可以采用这个方式, 不需要修改 openai 包

r = OPENAI_CLIENT.chat.completions.create(
    stream=True,
    model='MODEL_NAME',
    messages=messages,
    extra_headers={
        'Accept': 'text/event-stream',
    },
)

在请求内加上 extra_headers 参数可以覆盖 OpenAI 包自带的头部信息

感谢,此方法有效

bowjacon avatar Feb 26 '24 11:02 bowjacon