# PR #41088 完整报告

- 仓库：`vllm-project/vllm`
- 标题：[Bugfix] Fix broken example opeanai client
- 合并时间：2026-04-28 12:43
- 原文链接：http://prhub.com.cn/vllm-project/vllm/pull/41088

---

# 执行摘要

- 一句话：修复三个 example 脚本因缺失 utils 导入而崩溃
- 推荐动作：该 PR 是一个简单的示例修复，不值得投入精力精读。不过，开发者可以关注其修复模式：在 example 中避免依赖本地模块，保持自包含性。此外，对于 Gemini 建议的健壮性问题，可以稍后自行添加空列表检查。

# 功能与动机

PR body 明确指出 `openai_chat_completion_client_for_multimodal.py` 等脚本因 `ModuleNotFoundError: No module named 'utils'` 崩溃，无法使用。作者通过直接运行复现了该问题。

# 实现拆解

1. **移除错误的导入语句**：在三个文件中删除 `from utils import get_first_model` 这一行。
2. **替换模型获取方式**：将原来调用 `get_first_model(client)` 的地方改为 `client.models.list().data[0].id`，通过 OpenAI API 标准接口获取服务器上部署的第一个模型 ID。
3. **保持脚本独立性**：消除对同目录下 `utils.py` 的依赖，使示例脚本可在任意位置作为独立入口运行。

关键文件：
- `examples/tool_calling/openai_responses_client_with_mcp_tools.py`（模块 示例脚本；类别 source；类型 dependency-wiring）: 修复了 MCP 工具示例中 utils 导入缺失导致的崩溃，移除 import 并替换模型获取方式。
- `examples/tool_calling/openai_responses_client_with_tools.py`（模块 示例脚本；类别 source；类型 dependency-wiring）: 修复了函数调用示例中 utils 导入缺失导致的崩溃。
- `examples/generate/multimodal/openai_chat_completion_client_for_multimodal.py`（模块 示例脚本；类别 source；类型 dependency-wiring）: 修复了多模态客户端示例中 utils 导入缺失导致的崩溃。

关键符号：未识别

## 关键源码片段

### `examples/tool_calling/openai_responses_client_with_mcp_tools.py`

修复了 MCP 工具示例中 utils 导入缺失导致的崩溃，移除 import 并替换模型获取方式。

```python
# 变更前：依赖本地 utils 模块
from openai import OpenAI
from utils import get_first_model

# 变更后：完全自包含，通过 API 获取模型
def example_no_filter():
    base_url = "http://0.0.0.0:8000/v1"
    client = OpenAI(base_url=base_url, api_key="empty")
    # 直接调用 OpenAI 的模型列表接口，获取第一个可用模型 ID
    model = client.models.list().data[0].id
    # ... 后续逻辑不变

```

# 评论区精华

Gemini Code Assist Bot 在三个文件中都提出了相同建议：直接访问 `data[0]` 在模型列表为空时可能引发 `IndexError`，建议添加空列表检查并给出更友好的错误信息。作者未在讨论中回复，该建议未被采纳，PR 已合并。

- 直接访问 data[0] 缺少空列表检查 (correctness): 作者未回应，建议未被采纳。当前实现若服务器无模型时仍会 throw IndexError。

# 风险与影响

- 风险：**低风险**。变更仅限于三个示例脚本，不涉及核心库代码。主要风险是：当 vLLM 服务器运行但未加载任何模型时，`client.models.list().data[0].id` 会抛出 `IndexError`，而不是像原来可能由 `get_first_model` 提供更友好的错误提示。但这是示例脚本的边缘场景，影响有限。
- 影响：**影响范围小**。仅影响三个 example 脚本，对核心推理、API 服务等无影响。这些脚本开发者 / 用户可以直接运行，不再需要 `utils.py` 辅助文件。
- 风险标记：缺少健壮性检查

# 关联脉络

- PR #36464 [Examples] Resettle generate examples.: 该 PR 重组了 examples 目录结构，可能是此次 `utils` 模块路径变更的根源。此次 PR 进一步清理了重组后遗留的导入问题。