一键导入
langchain-multimodal
Work with multimodal inputs/outputs in LangChain - includes images, audio, video, content blocks, and vision capabilities
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Work with multimodal inputs/outputs in LangChain - includes images, audio, video, content blocks, and vision capabilities
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Mac 系统深度清理和优化工具。使用 Mole (mo 命令) 执行系统清理、磁盘分析、应用卸载、系统优化等任务。 触发场景(当用户提到以下任一内容时使用此 skill): - 清理 Mac、清理磁盘、释放空间、清理缓存、清理系统 - 卸载应用、删除应用、移除应用及其残留 - 磁盘分析、查看磁盘占用、大文件查找、空间分析 - 系统优化、系统维护、刷新系统、重建缓存 - 系统状态、系统监控、CPU/内存/磁盘监控 - 清理 node_modules、清理构建产物、清理项目依赖 - 清理安装包、删除 dmg/pkg 文件 - Mac 清理工具、类似 CleanMyMac 的功能 - "我的 Mac 太慢了"、"磁盘空间不足"、"电脑卡顿" - 即使没有明确说 "Mole",只要涉及上述场景就应使用
快速搭建和配置 pnpm monorepo 项目结构,包含 TypeScript、tsup 构建、私有 npm registry 配置。当用户需要"创建 monorepo"、"初始化 monorepo 项目"、"配置 pnpm workspace"、"设置 monorepo 构建"、"monorepo setup"时使用。特别适合需要统一管理多个包、配置构建工具、处理 TypeScript 路径问题的场景。即使用户只是说"帮我搭建项目结构"或"配置构建",如果涉及多包管理也应该使用此 skill。
智能拆分暂存区的代码变更为多个符合 Conventional Commits 规范的逻辑提交。当用户需要将大量变更按逻辑关系分组提交时使用,比如"拆分这些提交"、"把暂存区的变更分成多个 commit"、"按功能分别提交"、"split commits"等场景。特别适合处理包含多个模块、多种类型文件(配置、代码、测试、文档)的复杂变更集。
OKR 优化与质量评估专家。当用户需要:(1) 评估现有 OKR 的质量,(2) 优化模糊或不可量化的关键结果,(3) 检查 OKR 是否符合核心原则(聚焦、可量化、有挑战),(4) 将任务型 KR 转化为结果型 KR,(5) 提供具体的改进建议时使用。触发词包括"帮我优化 OKR"、"检查这个 OKR"、"这个 KR 写得好吗"、"如何量化这个目标"。
基于 git commits 自动生成 CHANGELOG.md 变更日志。支持语义化版本、分类整理、多格式输出。触发场景包括"生成变更日志"、"更新 CHANGELOG"、"版本记录"。
GitHub PR 代码审查技能。检查代码质量、安全性、性能和最佳实践,生成结构化审查报告。触发场景包括"审查 PR"、"代码检查"、"review pull request"。
| name | langchain-multimodal |
| description | Work with multimodal inputs/outputs in LangChain - includes images, audio, video, content blocks, and vision capabilities |
| language | js |
多模态支持让您能够处理图像、音频、视频和其他非文本数据。具有多模态功能的模型可以处理和生成这些不同格式的内容。
核心概念:
| 任务 | 推荐模型 | 原因 |
|---|---|---|
| 图像理解 | GPT-4.1、Claude Sonnet、Gemini | 强大的视觉功能 |
| 图像生成 | DALL-E(通过 OpenAI) | 专门用于生成 |
| 文档分析(PDF) | Claude、GPT-4.1 | 处理复杂的布局 |
| 音频转录 | Whisper(OpenAI) | 专门用于音频 |
| 方法 | 何时使用 | 示例 |
|---|---|---|
| URL | 公共图像 | { type: "image", url: "https://..." } |
| Base64 | 私有/本地图像 | { type: "image", data: "base64..." } |
| 文件引用 | 提供商文件 API | { type: "image", fileId: "..." } |
import { ChatOpenAI } from "@langchain/openai";
import { HumanMessage } from "langchain";
const model = new ChatOpenAI({ model: "gpt-4.1" });
const message = new HumanMessage({
contentBlocks: [
{ type: "text", text: "这张图片里有什么?" },
{
type: "image",
url: "https://example.com/photo.jpg",
},
],
});
const response = await model.invoke([message]);
console.log(response.content);
import { ChatOpenAI } from "@langchain/openai";
import { HumanMessage } from "langchain";
import fs from "fs";
const model = new ChatOpenAI({ model: "gpt-4.1" });
// 读取图像并转换为 base64
const imageBuffer = fs.readFileSync("./photo.jpg");
const base64Image = imageBuffer.toString("base64");
const message = new HumanMessage({
contentBlocks: [
{ type: "text", text: "详细描述这张图片" },
{
type: "image",
data: base64Image,
mimeType: "image/jpeg",
},
],
});
const response = await model.invoke([message]);
import { ChatOpenAI } from "@langchain/openai";
import { HumanMessage } from "langchain";
const model = new ChatOpenAI({ model: "gpt-4.1" });
const message = new HumanMessage({
contentBlocks: [
{ type: "text", text: "比较这两张图片" },
{ type: "image", url: "https://example.com/image1.jpg" },
{ type: "image", url: "https://example.com/image2.jpg" },
],
});
const response = await model.invoke([message]);
import { ChatAnthropic } from "@langchain/anthropic";
import { HumanMessage } from "langchain";
import fs from "fs";
const model = new ChatAnthropic({ model: "claude-sonnet-4-5-20250929" });
const pdfBuffer = fs.readFileSync("./document.pdf");
const base64Pdf = pdfBuffer.toString("base64");
const message = new HumanMessage({
contentBlocks: [
{ type: "text", text: "总结这个 PDF 文档" },
{
type: "file",
data: base64Pdf,
mimeType: "application/pdf",
},
],
});
const response = await model.invoke([message]);
// 使用假设的音频支持的示例
const message = new HumanMessage({
contentBlocks: [
{ type: "text", text: "转录这个音频" },
{
type: "audio",
data: base64Audio,
mimeType: "audio/mpeg",
},
],
});
import { ChatOpenAI } from "@langchain/openai";
const model = new ChatOpenAI({ model: "gpt-4.1" });
const response = await model.invoke("创建一个日落的图像");
// 访问内容块
for (const block of response.contentBlocks) {
if (block.type === "text") {
console.log("文本:", block.text);
} else if (block.type === "image") {
console.log("图像 URL:", block.url);
console.log("图像数据:", block.data?.substring(0, 50) + "...");
}
}
import { ChatAnthropic } from "@langchain/anthropic";
import { HumanMessage } from "langchain";
const model = new ChatAnthropic({
model: "claude-sonnet-4-5-20250929",
});
const message = new HumanMessage({
contentBlocks: [
{
type: "image",
url: "https://example.com/chart.png",
},
{
type: "text",
text: "从这个图表中提取所有数据点并格式化为表格",
},
],
});
const response = await model.invoke([message]);
import { ChatGoogleGenerativeAI } from "@langchain/google-genai";
import { HumanMessage } from "langchain";
const model = new ChatGoogleGenerativeAI({
model: "gemini-2.5-flash",
});
const message = new HumanMessage({
contentBlocks: [
{ type: "text", text: "这张图片中有什么物体?" },
{ type: "image", url: "https://example.com/scene.jpg" },
],
});
const response = await model.invoke([message]);
✅ 图像 URL:通过 HTTPS 的公共图像 ✅ Base64 图像:本地或私有图像 ✅ 多张图像:一起比较、分析 ✅ PDF 文档:文本提取、分析 ✅ 跨提供商格式:标准内容块
❌ 所有模型中的图像生成:限于特定模型 ❌ 视频理解:新兴的、有限的支持 ❌ 所有模型中的音频:特定于模型 ❌ 修改图像:模型分析,不编辑
// ❌ 问题:使用仅文本模型
const model = new ChatOpenAI({ model: "gpt-3.5-turbo" });
await model.invoke([imageMessage]); // 错误!
// ✅ 解决方案:使用支持视觉的模型
const model = new ChatOpenAI({ model: "gpt-4.1" });
// ❌ 问题:旧格式
const message = new HumanMessage({
content: [
{ type: "image_url", image_url: { url: "..." } } // OpenAI 特定
]
});
// ✅ 解决方案:使用标准内容块
const message = new HumanMessage({
contentBlocks: [
{ type: "image", url: "..." } // 跨提供商
]
});
// ❌ 问题:没有 MIME 类型
{ type: "image", data: base64Data } // 可能失败
// ✅ 解决方案:始终包含 MIME 类型
{ type: "image", data: base64Data, mimeType: "image/jpeg" }
// ❌ 问题:图像超过大小限制
const hugeImage = fs.readFileSync("./10mb_image.jpg");
// 模型可能会拒绝
// ✅ 解决方案:首先调整大小或压缩图像
import sharp from "sharp";
const resized = await sharp("./10mb_image.jpg")
.resize(1024, 1024, { fit: "inside" })
.jpeg({ quality: 80 })
.toBuffer();