解决Open WebU无法显示基于OpenAI API接口的推理内容的问题

解决方案

把reasoning content的东西移到content中来 并在reasoning时,手动加上标签。具体做法是截获第三方api返回的stream,并修改其中的内容,再移交给open webUI处理。

在backend\open_webui\routers\openai.py中 找到 generate_chat_completion 这个函数

r = None

session = None

streaming = False

response = None

下方 增加截获函数 这个方案适用于 火山 百炼 vLLM我没试过,但是思路是一样的,根据vLLM返回的chunk内容,把reasoning的部分贴到content中去就能正常显示了。

async def modify_stream_content(original_stream):
    start_reasoning = True
    end_reasoning = True
    # 逐块处理流式内容
    async for chunk in original_stream:
        # 示例:修改 chunk 内容(假设 chunk 是 JSON 字符串)
        try:
            # 1. 解码字节流为字符串
            decoded_chunk = chunk.decode('utf-8').lstrip('data: ').strip()
            
            # 2. 解析 JSON(根据实际格式调整)
            chunk_data = json.loads(decoded_chunk)
            
            # 3. 修改内容
            if "choices" in chunk_data and len(chunk_data["choices"]) > 0:
                delta = chunk_data["choices"][0].get("delta", {})
                # print(delta)
                if delta["content"] == None:
                    delta["content"] = ""
                if "reasoning_content" in delta and delta["reasoning_content"] == None:
                    delta["reasoning_content"] = ""

                if delta["content"] == "":
                    if start_reasoning:
                        delta["content"] = "<think>" + delta["content"] + delta["reasoning_content"]
                        start_reasoning = False
                    else:
                        delta["content"] = delta["content"] + delta["reasoning_content"]
                else:
                    if end_reasoning:
                        delta["content"] = "</think>" + delta["content"]
                        end_reasoning = False
                # print(delta)
            # 4. 重新编码为字节流
            modified_chunk = f"data: {json.dumps(chunk_data)}\n\n".encode('utf-8')
            
        except (json.JSONDecodeError, KeyError) as e:
            # 处理错误(可选:记录日志或跳过)
            modified_chunk = chunk  # 保留原始数据
            
        # 5. 返回修改后的 chunk
        yield modified_chunk

在下方,if "text/event-stream" in r.headers.get("Content-Type", ""): 分支里。调用截获函数并返回

 # Check if response is SSE
        if "text/event-stream" in r.headers.get("Content-Type", ""):
            streaming = True
            # 调用截获函数
            modified_stream = modify_stream_content(r.content)

            return StreamingResponse(
                # r.content,
                modified_stream,
                status_code=r.status,
                headers=dict(r.headers),
                background=BackgroundTask(
                    cleanup_response, response=r, session=session
                ),
            )
### 解决方案概述 当 Stable Diffusion WebUI 在运行过程中遇到内存不足的问题时,通常是因为 GPU 显存不足以处理高分辨率图像生成任务。以下是几种常见的解决方案: #### 调整图像尺寸 降低生成图像的分辨率可以显著减少显存占用。例如,将图像大小调整为 512×512 或者 512×768 对于仅有 4GB 显存的情况通常是可行的选择[^4]。 #### 使用显存释放扩展 可以通过安装 `sd-webui-memory-release` 扩展来实现每次生成后的显存自动清理功能。该扩展专为解决显存泄漏问题设计,能够有效提升系统的稳定性[^3]。 #### 启用 CPU 计算模式 如果 GPU 性能有限或无法满足需求,则可以选择启用 CPU 模式进行推理计算。具体操作方法包括配置环境变量以及修改启动参数以禁用 CUDA 并强制使用 OpenVINO 加速框架支持下的 CPU/GPU 推理能力[^1]。 ```bash export COMFYUI_DEVICE="cpu" ``` 以上命令可设置设备为CPU运算方式;另外还可以尝试利用Intel提供的OpenVINO工具套件优化模型性能表现。 #### 减少批量数量 (Batch Size) 默认情况下可能设置了较高的批处理量(batch size),这会增加每轮迭代所需的资源消耗。适当减小batch size有助于缓解这一压力。 --- ### 技术细节说明 对于那些希望深入了解如何通过编程手段控制这些参数的人而言,下面提供了一些具体的代码实例供参考学习之用: #### 修改 Batch Size 参数 在实际执行脚本前加入如下定义即可更改批次规模: ```python opt.batch_size = 1 # 设置更小的批量数以节省内存空间 ``` #### 自定义解析器选项 为了进一步定制化体验, 可考虑重写部分核心函数逻辑从而允许动态指定更多高级属性值. 比如针对特定场景下新增加了一个名为lowvram的新开关标志位用来指示是否开启低VRAM模式. ```python parser.add_argument('--lowvram', action='store_true', help='Enable low VRAM mode') if opt.lowvram: model.half() # 半精度浮点数转换也能一定程度节约存储开销 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值