Agent Skills: langchain-models (JavaScript/TypeScript)

Initialize and use LangChain chat models - includes provider selection (OpenAI, Anthropic, Google), model configuration, and invocation patterns

UncategorizedID: evanfang0054/cc-system-creator-scripts/langchain-models

Install this agent skill to your local

pnpm dlx add-skill https://github.com/evanfang0054/cc-system-creator-scripts/tree/HEAD/skills/langchain-skills/langchain-models

Skill Files

Browse the full folder contents for langchain-models.

Download Skill

Loading file tree…

skills/langchain-skills/langchain-models/SKILL.md

Skill Metadata

Name
langchain-models
Description
Initialize and use LangChain chat models - includes provider selection (OpenAI, Anthropic, Google), model configuration, and invocation patterns

langchain-models (JavaScript/TypeScript)

概述

聊天模型是 LangChain 应用程序的核心。它们接收消息作为输入并返回 AI 生成的消息作为输出。LangChain 在多个提供商(OpenAI、Anthropic、Google 等)之间提供统一的接口。

核心概念:

  • initChatModel():任何提供商的通用初始化
  • 特定提供商的类:直接初始化(ChatOpenAI、ChatAnthropic 等)
  • 消息:结构化的输入/输出格式(HumanMessage、AIMessage 等)
  • 调用模式:invoke()、stream()、batch()

何时使用每个提供商

| 提供商 | 最适合 | 模型 | 优势 | |----------|----------|--------|-----------| | OpenAI | 通用、推理 | GPT-4.1、GPT-5 | 强大推理、大上下文 | | Anthropic | 安全性、分析 | Claude Sonnet/Opus | 安全性、长上下文、视觉 | | Google | 多模态、速度 | Gemini 2.5 | 快速、多模态、成本效益 | | AWS Bedrock | 企业级、合规性 | 多个提供商 | 安全性、合规性、多样性 | | Azure OpenAI | 企业级 OpenAI | GPT 模型 | 企业功能、SLA |

决策表

选择模型

| 用例 | 推荐模型 | 原因 | |----------|------------------|-----| | 复杂推理 | GPT-5、Claude Opus | 最佳逻辑能力 | | 快速响应 | Gemini Flash、GPT-4.1-mini | 低延迟 | | 视觉任务 | GPT-4.1、Claude Sonnet、Gemini | 多模态支持 | | 长上下文 | Claude Opus、Gemini | 100k+ token 窗口 | | 成本效益 | GPT-4.1-mini、Gemini Flash | 较低定价 | | 企业级/合规性 | Azure OpenAI、AWS Bedrock | 安全功能 |

初始化方法

| 方法 | 何时使用 | 示例 | |--------|-------------|---------| | initChatModel("provider:model") | 在提供商之间快速切换 | initChatModel("openai:gpt-4.1") | | 提供商类 | 需要特定于提供商的功能 | new ChatOpenAI({ model: "gpt-4.1" }) | | 带配置 | 需要自定义参数 | 温度、最大 token 等 |

代码示例

基本模型初始化

import { initChatModel } from "langchain";

// 通用初始化 - 最简单的方法
const model = await initChatModel("openai:gpt-4.1");

// 或使用提供商简写
const model2 = await initChatModel("gpt-4.1"); // 默认为 OpenAI

// 设置 API 密钥(通常从环境变量)
process.env.OPENAI_API_KEY = "your-api-key";
const model3 = await initChatModel("openai:gpt-4.1");

特定于提供商的初始化

import { ChatOpenAI } from "@langchain/openai";
import { ChatAnthropic } from "@langchain/anthropic";
import { ChatGoogleGenerativeAI } from "@langchain/google-genai";

// OpenAI
const openai = new ChatOpenAI({
  model: "gpt-4.1",
  temperature: 0.7,
  maxTokens: 1000,
  apiKey: process.env.OPENAI_API_KEY,
});

// Anthropic
const anthropic = new ChatAnthropic({
  model: "claude-sonnet-4-5-20250929",
  temperature: 0,
  maxTokens: 2000,
  apiKey: process.env.ANTHROPIC_API_KEY,
});

// Google
const google = new ChatGoogleGenerativeAI({
  model: "gemini-2.5-flash-lite",
  temperature: 0.5,
  apiKey: process.env.GOOGLE_API_KEY,
});

简单调用

import { initChatModel } from "langchain";

const model = await initChatModel("gpt-4.1");

// 字符串输入(转换为 HumanMessage)
const response = await model.invoke("什么是 LangChain?");
console.log(response.content);

// 消息数组输入
const response2 = await model.invoke([
  { role: "user", content: "你好!" }
]);
console.log(response2.content);

流式响应

import { initChatModel } from "langchain";

const model = await initChatModel("gpt-4.1");

// 在 token 到达时流式传输
const stream = await model.stream("解释量子计算");

for await (const chunk of stream) {
  process.stdout.write(chunk.content);
}

批处理

import { initChatModel } from "langchain";

const model = await initChatModel("gpt-4.1");

// 并行处理多个输入
const results = await model.batch([
  "什么是 AI?",
  "什么是 ML?",
  "什么是 LangChain?"
]);

results.forEach((result, i) => {
  console.log(`答案 ${i + 1}:`, result.content);
});

多轮对话

import { initChatModel } from "langchain";

const model = await initChatModel("gpt-4.1");

// 构建对话历史
const messages = [
  { role: "system", content: "您是一个有用的助手。" },
  { role: "user", content: "法国的首都是什么?" },
];

const response1 = await model.invoke(messages);
messages.push({ role: "assistant", content: response1.content });

// 继续对话
messages.push({ role: "user", content: "它的人口是多少?" });
const response2 = await model.invoke(messages);

console.log(response2.content); // 知道我们在谈论巴黎

模型配置选项

import { ChatOpenAI } from "@langchain/openai";

const model = new ChatOpenAI({
  model: "gpt-4.1",

  // 控制随机性(0 = 确定性,1 = 创造性)
  temperature: 0.7,

  // 限制响应长度
  maxTokens: 500,

  // 替代采样方法
  topP: 0.9,

  // 惩罚重复
  frequencyPenalty: 0.5,
  presencePenalty: 0.5,

  // 在这些字符串处停止生成
  stop: ["\n\n", "END"],

  // 请求超时
  timeout: 30000, // 30 秒

  // 失败时的最大重试次数
  maxRetries: 3,
});

Azure OpenAI

import { ChatOpenAI } from "@langchain/openai";

const azure = new ChatOpenAI({
  azureOpenAIApiKey: process.env.AZURE_OPENAI_API_KEY,
  azureOpenAIApiInstanceName: "your-instance-name",
  azureOpenAIApiDeploymentName: "your-deployment-name",
  azureOpenAIApiVersion: "2024-02-15-preview",
});

AWS Bedrock

import { ChatBedrock } from "@langchain/aws";

// 来自环境变量或 ~/.aws/credentials 的 AWS 凭证
const bedrock = new ChatBedrock({
  model: "anthropic.claude-3-5-sonnet-20240620-v1:0",
  region: "us-east-1",
  credentials: {
    accessKeyId: process.env.AWS_ACCESS_KEY_ID,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
  },
});

模型选择助手

import { initChatModel } from "langchain";

function getModel(task: string) {
  const modelMap = {
    reasoning: "openai:gpt-5",
    fast: "google-genai:gemini-2.5-flash-lite",
    vision: "openai:gpt-4.1",
    long_context: "anthropic:claude-sonnet-4-5-20250929",
    cost_effective: "openai:gpt-4.1-mini",
  };

  return initChatModel(modelMap[task] || "openai:gpt-4.1");
}

// 使用
const reasoningModel = await getModel("reasoning");
const fastModel = await getModel("fast");

错误处理

import { initChatModel } from "langchain";

const model = await initChatModel("gpt-4.1");

try {
  const response = await model.invoke("你好!");
  console.log(response.content);
} catch (error) {
  if (error.status === 429) {
    console.error("超过速率限制");
  } else if (error.status === 401) {
    console.error("无效的 API 密钥");
  } else {
    console.error("错误:", error.message);
  }
}

检查模型功能

import { initChatModel } from "langchain";

const model = await initChatModel("gpt-4.1");

// 检查模型是否支持功能
console.log("支持流式传输:", typeof model.stream === "function");
console.log("支持工具调用:", typeof model.bindTools === "function");
console.log("支持结构化输出:", typeof model.withStructuredOutput === "function");

边界

您可以配置什么

模型选择:来自任何提供商的任何支持的模型 ✅ 温度:控制随机性(0-1) ✅ 最大 Token:限制响应长度 ✅ 停止序列:定义停止生成的位置 ✅ 超时/重试:控制请求行为 ✅ API 密钥:每个模型或来自环境变量 ✅ 特定于提供商的选项:每个提供商都有独特的功能

您不能配置什么

模型训练数据:模型是预训练的 ❌ 模型架构:无法修改内部结构 ❌ Token 成本:由提供商设置 ❌ 速率限制:由提供商设置(可以使用队列管理) ❌ 模型功能:视觉/工具支持是特定于模型的

注意事项

1. 找不到 API 密钥

// ❌ 问题:缺少 API 密钥
const model = await initChatModel("openai:gpt-4.1");
await model.invoke("你好"); // 错误:找不到 API 密钥

// ✅ 解决方案:设置环境变量
process.env.OPENAI_API_KEY = "sk-...";
const model = await initChatModel("openai:gpt-4.1");

// 或直接传递
import { ChatOpenAI } from "@langchain/openai";
const model = new ChatOpenAI({
  model: "gpt-4.1",
  apiKey: "sk-...",
});

2. 模型名称拼写错误

// ❌ 问题:错误的模型名称
const model = await initChatModel("gpt4"); // 错误!

// ✅ 解决方案:使用正确的格式
const model = await initChatModel("openai:gpt-4.1");
// 或提供商简写
const model2 = await initChatModel("gpt-4.1");

3. 响应内容访问

// ❌ 问题:错误的属性访问
const response = await model.invoke("你好");
console.log(response); // AIMessage 对象,不是字符串

// ✅ 解决方案:访问 .content 属性
console.log(response.content); // "你好!我可以帮您吗?"

// 或使用 .toString()
console.log(response.toString());

4. 流式传输需要异步迭代

// ❌ 问题:未等待流
const stream = model.stream("你好");
console.log(stream); // Promise,不是 chunks

// ✅ 解决方案:使用 for await
const stream = await model.stream("你好");
for await (const chunk of stream) {
  console.log(chunk.content);
}

5. 温度混淆

// ❌ 问题:错误的温度范围
const model = new ChatOpenAI({
  temperature: 10, // 太高了!应该是 0-1
});

// ✅ 解决方案:使用 0-1 范围
const deterministic = new ChatOpenAI({ temperature: 0 }); // 始终相同
const balanced = new ChatOpenAI({ temperature: 0.7 }); // 默认
const creative = new ChatOpenAI({ temperature: 1 }); // 最大随机性

6. Token 限制

// ❌ 问题:输入 + 输出超过模型限制
const longText = "...50,000 个词...";
const model = await initChatModel("gpt-4.1"); // 128k 上下文
await model.invoke(longText); // 可能成功

const model2 = await initChatModel("gpt-4.1-mini"); // 16k 上下文
await model2.invoke(longText); // 错误:上下文太长

// ✅ 解决方案:检查输入长度或使用更大的上下文模型
import { encoding_for_model } from "tiktoken";

const enc = encoding_for_model("gpt-4.1");
const tokens = enc.encode(longText);
console.log(`输入 tokens:${tokens.length}`);

if (tokens.length > 100000) {
  // 使用具有 200k 上下文的 Claude
  const model = await initChatModel("anthropic:claude-opus-4");
}

7. 特定于提供商的功能

// ❌ 问题:对错误的模型使用特定于提供商的功能
const google = await initChatModel("google-genai:gemini-2.5-flash");
google.bindTools([tool]); // 可能无法以相同的方式工作

// ✅ 解决方案:检查每个提供商的文档
// OpenAI 有特定的工具调用格式
// Anthropic 有特定的工具调用格式
// Google 有特定的工具调用格式

// 使用 initChatModel 以获得可移植性,但要注意差异

文档链接