基于DZ插件网小龙虾 claw.dz-x.net 提供,由 DZ插件网统一算力平台:api.dz-x.net(支持任何站长接入,解决token焦虑) 提供算力支撑。
📊 现状分析
OpenClaw 已有的批量处理能力
| 组件 |
状态 |
说明 |
| Voyage Batch API |
✅ 已实现 |
src/memory/batch-voyage.ts完整支持 |
| OpenAI Batch API |
✅ 已实现 |
文档提及支持异步嵌入批处理 |
| Gemini 嵌入批处理 |
⚠️ 部分支持 |
文档提及需要 Gemini Batch API 可用性 |
| Gemini 同步调用 |
✅ 已实现 |
web-search.ts/pdf-native-providers.ts |
Gemini Batch API 核心优势
| 特性 |
同步 API |
Batch API |
| 成本 |
100% |
50% 折扣 |
| 速率限制 |
标准限制 |
更高配额 |
| 处理模式 |
实时响应 |
异步 (24 小时内完成) |
| 输入格式 |
单次请求 |
JSONL 文件 (最大 2GB) |
| 适用场景 |
交互式对话 |
大规模数据处理/评估 |
🏗️ 实现思路
方案 1: 扩展记忆系统 (推荐)
适用场景**: 大规模记忆索引/重新索引**// 新增文件:src/memory/batch-gemini.ts
// 参考 batch-voyage.ts 架构
// 1. JSONL 格式定义
type GeminiBatchRequest = {
custom_id: string;
body: {
model: "gemini-embedding-001";
content: { parts: [{ text: string }] };
};
};
// 2. 提交流程
async function submitGeminiBatch(params: {
apiKey: string;
requests: GeminiBatchRequest[];
}): Promise<GeminiBatchStatus> {
// 2.1 上传 JSONL 文件到 Google File API
const uploadedFile = await client.files.upload({
file: "batch\_requests.jsonl",
config: { mime\_type: "jsonl" }
});
// 2.2 创建批处理任务
const batchJob = await client.batches.create({
model: "gemini-3-flash-preview",
src: uploadedFile.name,
config: { display\_name: "memory-index-batch" }
});
return batchJob;
}
// 3. 结果获取
async function fetchGeminiBatchResults(batchJobId: string) {
const batchJob = await client.batches.get({ name: batchJobId });
if (batchJob.state.name === "JOB_STATE_SUCCEEDED") {
const results = await client.files.download({ file: batchJob.dest.file\_name });
return parseResults(results);
}
}
配置扩展 (openclaw.json):{
agents: {
defaults: {
memorySearch: {
provider: "gemini",
model: "gemini-embedding-001",
remote: {
batch: {
enabled: true,
concurrency: 2,
wait: true,
pollIntervalMs: 30000,
timeoutMinutes: 1440
}
}
}
}
}
}
方案 2: 通用批处理工具
适用场景**: 用户自定义批量任务 (如批量分析文档/图片)**// 新增工具:src/agents/tools/gemini-batch.ts
export const geminiBatchTool: AnyAgentTool = {
name: "gemini_batch",
description: "Submit batch jobs to Gemini API for 50% cost savings",
parameters: {
jsonlPath: Type.String(), *// JSONL 文件路径 *
model: Type.String(),
timeoutMinutes: Type.Optional(Type.Number())
},
handler: async (params) => {
*// 1. 解析 JSONL *
*// 2. 提交到 Gemini Batch API *
*// 3. 轮询状态 *
*// 4. 返回结果文件路径 *
}
};
使用示例**:**# 用户准备 JSONL 文件
cat > /tmp/batch_requests.jsonl << 'EOF'
{"custom_id": "req-1", "body": {"model": "gemini-2.0-flash", "contents": [{"parts": [{"text": "分析这个文档..."}]}]}}
{"custom_id": "req-2", "body": {"model": "gemini-2.0-flash", "contents": [{"parts": [{"text": "提取表格数据..."}]}]}}
EOF
# 通过 OpenClaw 提交
openclaw tools gemini_batch --jsonlPath /tmp/batch_requests.jsonl --model gemini-2.0-flash
方案 3: 技能封装 (最快落地)
适用场景**: 快速验证,无需修改核心代码**// ~/.openclaw/workspace/skills/gemini-batch-processor/index.js
const { genai } = require("@google/genai");
module.exports = {
name: "gemini_batch_processor",
description: "使用 Gemini Batch API 节省 50% 成本",
handler: async (context, params) => {
const client = new genai.Client({ apiKey: process.env.GEMINI\_API\_KEY });
*// 1. 上传 JSONL *
const uploadedFile = await client.files.upload({
file: params.jsonlPath,
config: { mime\_type: "jsonl" }
});
*// 2. 创建批处理 *
const batchJob = await client.batches.create({
model: params.model || "gemini-2.0-flash",
src: uploadedFile.name
});
*// 3. 轮询等待 *
while (batchJob.state.name === "JOB\_STATE\_RUNNING") {
await sleep(30000);
batchJob = await client.batches.get({ name: batchJob.name });
}
*// 4. 下载结果 *
const results = await client.files.download({ file: batchJob.dest.file\_name });
return { status: "completed", results: results };
}
};
🔧 技术要点
1. JSONL 格式规范
{"custom_id": "task-001", "body": {"model": "gemini-2.0-flash", "contents": [{"parts": [{"text": "你好"}]}]}}
{"custom_id": "task-002", "body": {"model": "gemini-2.0-flash", "contents": [{"parts": [{"text": "世界"}]}]}}
2. 状态轮询机制
const BATCH_STATES = {
JOB_STATE_PENDING: "等待中",
JOB_STATE_RUNNING: "处理中",
JOB_STATE_SUCCEEDED: "成功",
JOB_STATE_FAILED: "失败",
JOB_STATE_CANCELLED: "已取消"
};
// 轮询间隔:30 秒 - 5 分钟 (根据任务规模调整)
// 超时时间:最长 24 小时 (Google 保证)
3. 错误处理
// 部分失败处理:JSONL 中单个请求失败不影响其他请求
// 结果文件包含每个 custom_id 对应的响应或错误信息
{
"custom_id": "task-001",
"response": { "status": 200, "body": {...} }
}
📋 实施建议
优先级排序
| 方案 |
开发成本 |
适用范围 |
推荐度 |
| 方案 3: 技能封装 |
低 (1-2 分钟) |
特定场景 |
⭐⭐⭐⭐ |
| 方案 1: 记忆系统扩展 |
中 (1-2 分钟) |
记忆索引 |
⭐⭐⭐⭐⭐ |
| 方案 2: 通用工具 |
高 (3-5 分钟) |
全场景 |
⭐⭐⭐ |
推荐实施路径
Week 1: 技能封装验证 (方案 3)
↓
Week 2: 收集使用反馈 + 优化 JSONL 生成工具
↓
Week 3: 集成到记忆系统 (方案 1)
↓
Week 4: 通用批处理工具 (方案 2, 可选)
🎁 额外收益
- 成本优化: 大规模记忆索引成本降低 50%
- 速率限制突破: 可一次性提交数万请求
- 离线处理: 提交后可关闭 OpenClaw,完成后通知
- 结果复用: JSONL 结果文件可缓存/分享
©DZ插件网所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
本站内容为站长个人技术研究记录或网络,不提供用户交互功能,所有内容版权归原作者所有。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,得到更好的正版服务。
您在本站任何的赞助购买、下载、查阅、回复等行为等均表示接受并同意签订《DZ插件网免责声明协议》。
如有侵权请邮件与我们联系处理: discuzaddons@vip.qq.com 并出示相关证明以便删除。敬请谅解!