Haystack 集成指南:使用 OpenRouterChatGenerator 打通多模型 Chat Completion
2026/9/15 13:06:19 网站建设 项目流程

Haystack 集成指南:使用 OpenRouterChatGenerator 打通多模型 Chat Completion

【免费下载链接】haystackOpen-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.项目地址: https://gitcode.com/GitHub_Trending/ha/haystack

OpenRouter 是一个聚合多家大模型供应商的统一 API 平台,本文基于 Haystack 官方参考文档,完整讲解OpenRouterChatGenerator组件:从安装、初始化参数、generation_kwargs生成参数、流式输出、推理内容(reasoning)提取到工具调用与 Pipeline 集成,并深入源码剖析其底层实现机制。读完本文,你将能够在 Haystack 应用中通过一个组件灵活调用 DeepSeek、Claude、GPT 等来自不同厂商的模型,并自行切换供应商路由与模型回退策略。

组件概览:一个生成器接入全品类模型

OpenRouterChatGenerator是 Haystack 的 OpenRouter 官方集成组件,直接继承自核心库中的OpenAIChatGenerator(基类实现见 haystack/components/generators/chat/openai.py),因此它复用 OpenAI Chat Completion 的请求范式,但将请求端点指向 OpenRouter 网关。通过它,你可以使用openai/gpt-4oanthropic/claude-sonnet-4.5deepseek/deepseek-r1等任意在 OpenRouter 平台托管的模型,而无需为每家厂商编写独立的客户端代码。

该组件与 OpenRouter Chat Completion 端点完全兼容,官方参考文档(version-2.22 参考页)归纳了它的三大特性:

  • 流式输出支持:可从 OpenRouter Chat Completion 端点接收流式响应,逐 token 回调;
  • 参数高度可定制:OpenRouter Chat Completion 端点支持的所有参数都可透传;
  • 推理内容提取:对支持思考过程的模型(如 DeepSeek R1、开启扩展思考的 Claude),将推理/思考内容提取到ChatMessageReasoningContent字段中(注意:推理内容仅在非流式请求下捕获)。

输入输出统一采用 Haystack 的ChatMessage格式,保证与ChatPromptBuilder、Agent 等生态组件无缝衔接。

安装与前置条件

使用该集成需要具备可用的 OpenRouter 订阅(账户内需有足够额度)和 API Key。官方使用指南(OpenRouterChatGenerator 组件文档)给出的安装方式为:

pip install openrouter-haystack

API Key 有两种提供方式:

  • 设置环境变量OPENROUTER_API_KEY(组件默认从该变量读取);
  • 初始化时通过api_key参数显式传入一个Secret

快速上手:独立运行

参考文档给出的最小示例——以 DeepSeek R1 为例,同时演示如何访问推理内容与最终答案:

from haystack_integrations.components.generators.openrouter import ( OpenRouterChatGenerator, ) from haystack.dataclasses import ChatMessage messages = [ChatMessage.from_user("What's Natural Language Processing?")] client = OpenRouterChatGenerator( model="deepseek/deepseek-r1", generation_kwargs={"reasoning": {"effort": "high"}}, ) response = client.run(messages) print(response["replies"][0].reasoning) # Access reasoning content print(response["replies"][0].text) # Access final answer

run()返回dict[str, list[ChatMessage]],唯一的键replies是模型生成回复的ChatMessage列表;reply.text取正文,reply.reasoning取推理内容,reply.meta中则包含模型名、finish reason、token 用量等元信息。

__init__参数逐项解析

参考文档给出了完整的构造函数签名:

__init__( *, api_key: Secret = Secret.from_env_var("OPENROUTER_API_KEY"), model: str = "openai/gpt-5-mini", streaming_callback: StreamingCallbackT | None = None, api_base_url: str | None = "https://openrouter.ai/api/v1", generation_kwargs: dict[str, Any] | None = None, tools: ToolsType | None = None, timeout: float | None = None, extra_headers: dict[str, Any] | None = None, max_retries: int | None = None, http_client_kwargs: dict[str, Any] | None = None ) -> None
参数类型默认值说明
api_keySecret环境变量OPENROUTER_API_KEYOpenRouter API Key
modelstr"openai/gpt-5-mini"使用的 OpenRouter 模型名
streaming_callbackStreamingCallbackT \| NoneNone流式输出时每收到一个新 token 就调用一次的回调函数,回调参数为StreamingChunk
api_base_urlstr \| None"https://openrouter.ai/api/v1"OpenRouter API 基础地址,一般无需修改
generation_kwargsdict \| NoneNone透传给 OpenRouter 端点的生成参数(详见下文)
toolsToolsType \| NoneNone供模型准备调用的工具,可接受Tool对象列表或一个Toolset实例
timeoutfloat \| NoneNoneOpenRouter API 调用超时时间
extra_headersdict \| NoneNone附加 HTTP 请求头;可用于向 OpenRouter 平台提交 site URL / title,以参与 openrouter.ai 的模型排行榜
max_retriesint \| NoneNone内部错误后的最大重试次数;未设置时读取OPENAI_MAX_RETRIES环境变量,仍无则默认为 5
http_client_kwargsdict \| NoneNone用于配置自定义httpx.Client/httpx.AsyncClient的关键字参数

几点需要特别注意:

  • api_base_url直接决定了请求发往何处。从基类 OpenAIChatGenerator 的_client_kwargs可以看到,api_base_url会被透传为 OpenAI SDK 客户端的base_url,这正是"套壳"接入 OpenRouter 网关的关键机制。
  • timeoutmax_retries遵循同样的环境变量回退逻辑:timeout未设置时读取OPENAI_TIMEOUT,再缺省为 30 秒;max_retries未设置时读取OPENAI_MAX_RETRIES,再缺省为 5。
  • extra_headers是 OpenRouter 特有的实用参数,在排行榜参与场景中,官方建议通过它附带站点信息。

generation_kwargs:透传全部 OpenRouter 生成参数

generation_kwargs是组件最灵活的部分,所有键值都会被直接发送到 OpenRouter 端点。参考文档明确列出以下常用参数:

参数说明
max_tokens输出文本的最大 token 数上限
temperature采样温度,值越高模型越"冒险";创意类任务可尝试 0.9,有明确答案的任务用 0(即 argmax 采样)
top_p核采样(nucleus sampling)替代方案:只考虑累计概率质量达到top_p的 token,如 0.1 表示只考虑概率最高的前 10%
stream是否流式返回部分进度;开启后 token 以>run( messages: list[ChatMessage] | str, streaming_callback: StreamingCallbackT | None = None, generation_kwargs: dict[str, Any] | None = None, *, tools: ToolsType | None = None, tools_strict: bool | None = None ) -> dict[str, list[ChatMessage]]

参数语义如下:

  • messages:输入消息。可传ChatMessage列表;若直接传字符串,会自动包装为一条 user 角色的ChatMessage。从基类源码看,空消息列表会直接返回空replies,不会发起请求。
  • streaming_callback:运行期流式回调,优先级高于初始化时设置的回调(基类通过select_streaming_callback完成选择)。
  • generation_kwargs:运行期生成参数,覆盖初始化值(合并规则见上节)。
  • tools:若设置,则覆盖初始化时的tools;可传Tool列表、Toolset或二者混合的列表。
  • tools_strict:是否启用工具调用的严格 Schema 约束。

run_asyncrun参数、返回值完全一致,供asyncio异步场景使用,唯一区别是流式回调必须为协程。基类的 run 实现 展示了完整的调用链:warm_up()(初始化 OpenAI 客户端与预热工具)→_normalize_messages()→ 选择流式回调 →_prepare_api_call()组装请求参数 → 调用client.chat.completions端点 → 对每个 choice 转换为ChatMessage→ 最后经_check_finish_reason()检查 finish reason 并附加到metato_dict()则将组件完整序列化为字典(含api_keymodelgeneration_kwargstools等),配合from_dict()即可实现组件的保存、加载与反序列化,用于 Pipeline 的 YAML/JSON 配置持久化。

推理内容(ReasoningContent)的底层机制

"推理内容提取"是 OpenRouter 集成区别于普通 Chat Generator 的一大卖点。其数据模型位于核心库 haystack/dataclasses/chat_message.py:

  • ReasoningContent数据类表示模型产出的可选推理内容,包含reasoning_text(推理文本)与extra(供应商特有附加信息的字典)两个字段;
  • ChatMessage通过reasonings属性返回消息中全部ReasoningContent,并支持与TextContentToolCallImageContent等共存于同一条消息。

这意味着当你使用 DeepSeek R1 这类"先思考后作答"的模型时,思考链与最终答案被结构化地分开存放,可以分别用于展示、记录或后续处理。需要再次强调的限制:推理内容只在非流式请求中捕获,如果启用了流式回调,reasoning字段将不会被填充。

流式输出

流式输出让 token 边生成边返回,显著降低首 token 延迟,适合对话式 UI。启用方式是在初始化或run()时传入streaming_callback,回调接收StreamingChunk参数。组件文档中的示例:

from haystack.dataclasses import ChatMessage from haystack_integrations.components.generators.openrouter import ( OpenRouterChatGenerator, ) client = OpenRouterChatGenerator( model="openrouter/auto", streaming_callback=lambda chunk: print(chunk.content, end="", flush=True), ) response = client.run([ChatMessage.from_user("What are Agentic Pipelines? Be brief.")]) # 查看实际响应的模型 print("\n\n Model used: ", response["replies"][0].meta["model"])

工具调用:Tool 与 Toolset 灵活组合

OpenRouterChatGenerator支持函数调用(function calling),tools参数接受灵活的配置形态(见 组件文档的工具调用章节):

  • Tool对象列表:逐个传入独立工具;
  • 单个Toolset:整体传入一个工具集;
  • 混合列表:多个Toolset与独立Tool混在一个列表里。
from haystack.tools import Tool, Toolset from haystack_integrations.components.generators.openrouter import ( OpenRouterChatGenerator, ) # 创建独立工具 weather_tool = Tool( name="weather", description="Get weather info", parameters=..., function=... ) news_tool = Tool( name="news", description="Get latest news", parameters=..., function=... ) # 把相关工具归组为 toolset math_toolset = Toolset([add_tool, subtract_tool, multiply_tool]) # 混合传参 generator = OpenRouterChatGenerator( tools=[math_toolset, weather_tool, news_tool] )

基类在初始化时会通过_check_duplicate_tool_names检查工具重名,warm_up()阶段则调用warm_up_tools预热工具元信息;tools_strict=True可让模型严格遵循工具定义中的parametersSchema,代价是可能增加延迟。

在 Pipeline 中编排使用

OpenRouterChatGenerator最典型的位置是接在ChatPromptBuilder之后:前者负责按模板组装消息,后者负责调用模型。组件文档给出的完整示例:

from haystack import Pipeline from haystack.components.builders import ChatPromptBuilder from haystack.dataclasses import ChatMessage from haystack_integrations.components.generators.openrouter import ( OpenRouterChatGenerator, ) prompt_builder = ChatPromptBuilder() llm = OpenRouterChatGenerator(model="openai/gpt-4o-mini") pipe = Pipeline() pipe.add_component("builder", prompt_builder) pipe.add_component("llm", llm) pipe.connect("builder.prompt", "llm.messages") messages = [ ChatMessage.from_system("Give brief answers."), ChatMessage.from_user("Tell me about {{city}}"), ] response = pipe.run( data={"builder": {"template": messages, "template_variables": {"city": "Berlin"}}}, ) print(response)

借助 OpenRouter 的统一网关,你甚至可以在不改动 Pipeline 拓扑的前提下,仅通过更换model参数就在不同厂商的模型间切换,方便做模型对比评测。

高级用法:供应商路由、多模态与平台排行

组件文档中还展示了几个 OpenRouter 特有的高阶用法:

  • 供应商路由 / 模型回退:将model设为"openrouter/auto",由 OpenRouter 根据可用性、价格与延迟自动路由到合适的供应商模型,实现透明回退;相关路由偏好可通过generation_kwargs在初始化或运行时配置。
  • 多模态输入:通过ChatMessage携带ImageContent直接传入图片,即可调用具备视觉能力的模型:
from haystack.dataclasses import ChatMessage, ImageContent from haystack_integrations.components.generators.openrouter import ( OpenRouterChatGenerator, ) llm = OpenRouterChatGenerator(model="anthropic/claude-sonnet-4.5") image = ImageContent.from_file_path("apple.jpg") user_message = ChatMessage.from_user( content_parts=["What does the image show? Max 5 words.", image], ) response = llm.run([user_message])["replies"][0].text print(response)
  • 排行榜站点信息:利用extra_headers附带站点 URL 与标题,参与 openrouter.ai 的平台排行。

版本与兼容性说明

本文内容以仓库内 version-2.22 参考文档 为准,同时参考了当前 OpenRouterChatGenerator 组件指南。该集成以独立分发包openrouter-haystack形式发布,具体组件源码维护在配套的 integrations 仓库中;本仓库侧对应的基类实现为 haystack/components/generators/chat/openai.py,推理内容数据模型见 haystack/dataclasses/chat_message.py。若使用其他 Haystack 版本,请以对应版本的reference_versioned_docs/version-*文档为准,各版本间参数与默认模型可能存在差异。

【免费下载链接】haystackOpen-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.项目地址: https://gitcode.com/GitHub_Trending/ha/haystack

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询