
LangChain.js 集成 Groq 完整指南langchain/groq 的安装、ChatGroq 调用与开发实践【免费下载链接】langchainjsThe agent engineering platform项目地址: https://gitcode.com/GitHub_Trending/la/langchainjslangchain/groq是 LangChain.js 官方提供的 Groq 云推理集成包通过groq-sdk在 LangChain 生态内以统一接口调用 Groq 托管的开源大模型如 Llama、Qwen、DeepSeek 蒸馏模型等。本文将基于当前仓库中 libs/providers/langchain-groq/README.md 及配套源码完整讲解该包的安装配置、ChatGroq聊天模型的构造参数与运行时参数、流式输出、工具调用、结构化输出、模型能力画像以及参与该包开发所需的构建、测试与入口点管理流程。包概览与定位langchain/groq位于仓库 libs/providers/langchain-groq/是 LangChain.js monorepo 中libs/providers/下的官方 Provider 集成之一。它的职责是用 LangChain 的方式接入 Groq底层网络通信完全委托给groq-sdkpackage.json 中依赖声明为groq-sdk: ^1.6.0而模型抽象、消息结构、回调、流式与 Runnable 协议则来自同仓库的 langchain/corepeerDependency 为^1.1.30。从 package.json 可以看到该包的工程约束运行时要求 Node.js 20type: module同时通过exports字段提供 CJSdist/index.cjs与 ESMdist/index.js双格式产物包入口为 src/index.ts它目前只做一件事export * from ./chat_models.js即对外暴露核心类ChatGroq对外导出仅保留根入口与package.json保证 API 面收敛。安装与依赖按官方 README 的说明在任意 Node 20 项目中安装npm install langchain/groq langchain/core两点说明langchain/core是 peer dependency必须显式安装否则运行时无法解析消息类、Runnable 基类等核心类型如果你在 monorepo 中开发仓库内使用 pnpm workspace可在根目录执行pnpm install一次装齐所有包见下文开发指南。快速开始用 ChatGroq 发起第一次推理Groq 使用 API Key 鉴权。按 README 的步骤先在环境变量中配置密钥也可在构造函数里直接传入export GROQ_API_KEY然后实例化ChatGroq并调用import { ChatGroq } from langchain/groq; import { HumanMessage } from langchain/core/messages; const model new ChatGroq({ apiKey: process.env.GROQ_API_KEY, // Default value. model: llama-3.3-70b-versatile, }); const message new HumanMessage(What color is the sky?); const res await model.invoke([message]);这段代码背后的实现可以在 chat_models.ts 的构造函数中验证密钥解析顺序为params.apiKey || getEnvironmentVariable(GROQ_API_KEY)即构造函数显式传入优先其次读环境变量两者都缺失时会直接抛错Groq API key not found. Please set the GROQ_API_KEY environment variable or provide the key into apiKeySDK 客户端通过new Groq({ apiKey, dangerouslyAllowBrowser: true, baseURL, timeout, httpAgent, fetch, maxRetries: 0, defaultHeaders, defaultQuery })创建其中maxRetries: 0表示 SDK 层不自行重试重试策略交给 LangChain 的caller机制completionWithRetry方法中通过this.caller.call(...)包装类还支持字符串简写构造new ChatGroq(llama-3.3-70b-versatile, { apiKey: foo, temperature: 0.1 })该形式在 chat_models.test.ts 有对应单测。invoke返回的AIMessage会携带response_metadata含 tokenUsage、finish_reason 等与usage_metadata非流式路径下 token 用量从响应体的usage字段解析并累计见_generateNonStreaming实现。ChatGroq 构造参数与运行时参数全解ChatGroqInput接口chat_models.ts定义了构造函数可接受的参数下表整理了各参数的含义与默认值参数类型默认值说明modelstring必填Groq 模型名如llama-3.3-70b-versatileapiKeystringprocess.env.GROQ_API_KEYGroq API Keytemperaturenumber0.7采样温度maxTokensnumber无单次响应最大 token 数topPnumber无核采样概率质量frequencyPenaltynumber无按词频惩罚重复 tokenpresencePenaltynumber无按出现惩罚重复 tokennnumber无每个 prompt 生成的补全数logitBiasRecordstring, number无调整指定 token 的生成概率userstring无终端用户标识用于滥用监控streamUsagebooleantrue流式响应是否携带 token 用量logprobsboolean无是否返回输出 token 的对数概率topLogprobsnumber无每个 token 位置返回的最可能 token 数需先开 logprobsstop/stopSequencesstring / string[]无最多 4 个停止序列返回文本不含停止序列streamingbooleanfalse是否默认以流式方式响应baseUrlstring无覆盖默认 API 地址timeoutnumber无客户端等待响应的最长毫秒数httpAgent/fetchany无自定义连接管理 / fetch 实现defaultHeaders/defaultQueryRecord无每次请求附带的默认头 / 查询参数reasoningEffortnone | default | low | medium | high | null无推理强度支持openai/gpt-oss-20b、openai/gpt-oss-120b、qwen/qwen3-32b等模型除了构造参数ChatGroqCallOptions还允许在每次调用时覆盖一批运行时参数。源码中CREATE_PARAMS_BASE_CALL_KEYSchat_models.ts明确列出可随.invoke/.stream/.batch第二个参数、.withConfig或.bindTools传入的键frequency_penalty、function_call、functions、logit_bias、logprobs、max_completion_tokens、max_tokens、n、parallel_tool_calls、presence_penalty、reasoning_effort、reasoning_format、response_format、seed、service_tier、stop、temperature、tool_choice、top_logprobs、top_p外加扩展键headers、promptIndex、stream_options、tools。注意model、messages、stream、user不允许在调用时覆盖。invocationParams方法负责把这些字段组装成发给 Groq 的ChatCompletionCreateParams其中max_completion_tokens的优先级为options.max_completion_tokens ?? options.max_tokens ?? this.maxTokens且值为-1时会被删除表示不限制。集成测试 chat_models.int.test.ts 验证了 stop 序列与自定义 headers 的实际透传行为。流式输出stream 与 chunk 聚合Groq 的流式响应在 chat_models.ts 的_streamResponseChunks中实现请求体固定stream: true逐 chunk 解析choices[0].delta通过_convertDeltaToMessageChunk把 delta 映射为AIMessageChunk等消息块并同步触发runManager.handleLLMNewToken回调可用于 token 级日志或自定义 Handler。流式输出的经典用法for await (const chunk of await model.stream(input)) { console.log(chunk); }每个AIMessageChunk携带response_metadata含 finishReason 等最后一个 chunk 会额外带上system_fingerprint与model_name。需要完整结果时可用concat聚合所有分块import { AIMessageChunk } from langchain/core/messages; import { concat } from langchain/core/utils/stream; const stream await model.stream(input); let full: AIMessageChunk | undefined; for await (const chunk of stream) { full !full ? chunk : concat(full, chunk); }关于 token 用量当streamUsage为true且以流式方式调用时集成会自动附加stream_options: { include_usage: true }让服务端在流末尾追加一个带用量的 chunkstream_options也可通过调用参数显式覆盖。流中的x_groq.usageprompt/completion/total tokens 及 queue_time、completion_time、total_time 等时序指标会被整理进 chunk 的response_metadata。工具调用bindToolsGroq 的 API 与 OpenAI 兼容因此工具调用使用同样的绑定工具 - 模型返回 tool_calls模式。README 给出的完整示例import { z } from zod; const llmForToolCalling new ChatGroq({ model: llama3-groq-70b-8192-tool-use-preview, temperature: 0, }); const GetWeather { name: GetWeather, description: Get the current weather in a given location, schema: z.object({ location: z.string().describe(The city and state, e.g. San Francisco, CA), }), }; const GetPopulation { name: GetPopulation, description: Get the current population in a given location, schema: z.object({ location: z.string().describe(The city and state, e.g. San Francisco, CA), }), }; const llmWithTools llmForToolCalling.bindTools([GetWeather, GetPopulation]); const aiMsg await llmWithTools.invoke( Which city is hotter today and which is bigger: LA or NY? ); console.log(aiMsg.tool_calls);bindTools的底层实现chat_models.ts会把 LangChain 风格的工具逐一经convertToOpenAITool转换成 OpenAI 工具格式再通过withConfig({ tools, ...kwargs })注入调用配置。模型返回的tool_calls由parseToolCall解析为带 id 的ToolCall解析失败时则进入invalid_tool_calls列表而不会中断整个响应见groqResponseToChatMessage。tool_choice参数支持auto、none、required或别名any、具体的函数名字符串或命名工具对象_formatToGroqToolChoice负责完成这几种写法的归一化。结构化输出withStructuredOutput 的三种模式ChatGroq.withStructuredOutput(schema, config)用于把输出约束为指定 JSON Schema通常由 Zod 描述。该实现位于 chat_models.ts核心是getGroqStructuredOutputMethodutils/groq-schema.ts根据模型能力自动选择三种方法方法适用模型实现机制jsonSchema模型名以openai/gpt-oss开头的模型使用 Groq 原生严格 JSON Schemaresponse_format: { type: json_schema, json_schema: { strict: true, ... } }jsonMode不支持原生 JSON Schema 的模型使用response_format: { type: json_object }functionCalling默认通用模型把 schema 伪装成单个工具并强制tool_choice指向它再解析函数调用结果如果显式给非 gpt-oss 模型指定jsonSchema或传入不在SUPPORTED_STRUCTURED_OUTPUT_METHODS即jsonSchema/functionCalling/jsonMode中的方法都会抛出明确错误。README 中的 Zod 示例import { z } from zod; const Joke z .object({ setup: z.string().describe(The setup of the joke), punchline: z.string().describe(The punchline to the joke), rating: z.number().optional().describe(How funny the joke is, from 1 to 10), }) .describe(Joke to tell user.); const structuredLlm llmForToolCalling.withStructuredOutput(Joke, { name: Joke }); const jokeResult await structuredLlm.invoke(Tell me a joke about cats); console.log(jokeResult);值得关注的是jsonSchema模式下的strict 模式 schema 转换groqStrictifySchemautils/groq-schema.ts会递归地把 schema 改造成满足 Groq strict 模式四项硬性要求的形态——所有对象设置additionalProperties: false所有属性必须进入required数组原本可选的属性被改写为可空type: [T, null]而非顶层 anyOf根 schema 禁止anyOf/oneOf/enum/not若存在会抛错或提取 object 分支。整条转换逻辑有 groq-schema.test.ts 与 chat_models_structured_output.int.test.ts 覆盖。模型能力画像profile 与 profiles.tomlChatGroq提供一个profilegetterchat_models.ts返回所配置模型的能力描述包括maxInputTokens、maxOutputTokens、imageInputs、toolCalling、structuredOutput、reasoningOutput等字段const model new ChatGroq({ model: llama-3.1-8b-instant }); const profile model.profile; console.log(profile.maxInputTokens); // 131072这些画像数据来自 src/profiles.ts由 profiles.toml 声明、内部 model-profiles 工具自动生成勿手工编辑。从画像可以快速核对当前包内收录模型的关键差异例如llama-3.3-70b-versatile输入 131072 / 输出 32768支持工具调用不支持结构化输出openai/gpt-oss-120b与openai/gpt-oss-20b输入 131072 / 输出 65536支持推理reasoning与结构化输出meta-llama/llama-4-scout-17b-16e-instruct与meta-llama/llama-4-maverick-17b-128e-instruct支持图像输入imageInputs: truedeepseek-r1-distill-llama-70b、qwen/qwen3-32b等reasoningOutput: true。消息角色映射与序列化LangChain 消息在发往 Groq 前会被convertMessagesToGroqParams转换其中角色映射由messageToGroqRolechat_models.ts完成system→system、ai→assistant、human→user、function→function、tool→tool自定义角色ChatMessage只接受 system / assistant / user / function 四种否则抛错——该约束在 chat_models.test.ts 中有完整验证。集成还支持 LangChain 标准的序列化协议lc_namespace为[langchain, chat_models, groq]lc_secrets将apiKey映射到环境变量名GROQ_API_KEY序列化测试断言JSON.stringify(model)输出为{lc:1,type:constructor,id:[langchain,chat_models,groq,ChatGroq],...}密钥在序列化结果中以 secret 占位形式出现避免泄露。开发指南构建、测试与新增入口点README 的 Development 一节给出了参与本包开发的标准流程当前仓库完全支持安装依赖仓库使用 pnpm workspacepnpm install构建包——两种方式等价pnpm build # 在包目录内执行 pnpm build --filter langchain/groq # 或在仓库根目录执行构建实际由tsdown完成见 package.json 的build:compile脚本产物输出到dist/。运行测试——测试文件放在src/tests/目录内命名有严格约定单元测试以.test.ts结尾集成测试以.int.test.ts结尾pnpm test # vitest run运行单元测试 pnpm test:int # vitest run --mode int运行集成测试需真实 GROQ_API_KEY当前 src/tests/ 下包含chat_models.test.ts序列化、简写构造、角色映射、reasoningEffort、chat_models.int.test.tsinvoke / stop / headers / 流式 / 工具调用等真实 API 集成、chat_models_structured_output.int.test.ts、chat_models.standard.test.ts与chat_models.standard.int.test.ts对接 langchain/standard-tests 的跨 Provider 标准测试、chat_models_stream_events.test.ts与groq-schema.test.ts。此外还有脚本辅助test:standard:unit、test:standard:int分别运行标准单元/集成测试套件。Lint 与格式化pnpm lint pnpm format新增导出入口点——两种方式任选其一然后重新pnpm build生成新入口在 src/index.ts 中 import 并 re-export 新文件或在该包 package.json 的exports字段中登记新子路径。若更新了模型画像数据可运行pnpm typegen内部执行pnpm --filter langchain/model-profiles make --config profiles.toml重新生成src/profiles.ts。总结与注意事项密钥管理优先使用环境变量GROQ_API_KEY构造函数传参可作为覆盖手段二者皆缺会立即抛错。模型选择以profiles画像为参考挑选模型需结构化输出时优先openai/gpt-oss系列原生 strict JSON Schema否则走 functionCalling/jsonMode 兜底。流式与用量默认streamUsage: true流式场景自动附带include_usage可在 chunk 的response_metadata中读取 token 用量与排队/生成时序。重试策略SDK 层maxRetries: 0重试由 LangChain 的 call 机制接管符合生态统一行为。开发约束Node 20、pnpm workspace、测试命名.test.ts/.int.test.ts、新增导出需同步维护exports字段。通过本文你可以从零完成langchain/groq的接入并在需要时深入其源码与测试理解每条配置背后的实现逻辑。【免费下载链接】langchainjsThe agent engineering platform项目地址: https://gitcode.com/GitHub_Trending/la/langchainjs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考