让小龙虾OpenClaw支持谷歌Gemini Batch API批处理能力skill 支持异步超长上下文会话 至高支持2GB会话容量处理 价格反而下降50%
2026/03/17 09:13:12
[md]鍩轰簬DZ鎻掍欢缃戝皬榫欒櫨 claw.dz-x.net 鎻愪緵锛岀敱 DZ鎻掍欢缃戠粺涓€绠楀姏骞冲彴锛歛pi.dz-x.net(鏀寔浠讳綍绔欓暱鎺ュ叆锛岃В鍐硉oken鐒﹁檻) 鎻愪緵绠楀姏鏀拺銆
**馃搳 鐜扮姸鍒嗘瀽**
**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: 鎵╁睍璁板繂绯荤粺 (鎺ㄨ崘)**
閫傜敤鍦烘櫙**: 澶ц妯¤蹇嗙储寮/閲嶆柊绱㈠紩***// 鏂板鏂囦欢锛歴rc/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: 閫氱敤鎵瑰鐞嗗伐鍏**
閫傜敤鍦烘櫙**: 鐢ㄦ埛鑷畾涔夋壒閲忎换鍔 (濡傛壒閲忓垎鏋愭枃妗/鍥剧墖)***// 鏂板宸ュ叿锛歴rc/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. 瑙f瀽 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: 鎶€鑳藉皝瑁 (鏈€蹇惤鍦)**
閫傜敤鍦烘櫙**: 蹇€熼獙璇侊紝鏃犻渶淇敼鏍稿績浠g爜***// \~/.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. 閿欒澶勭悊**
*// 閮ㄥ垎澶辫触澶勭悊锛欽SONL 涓崟涓姹傚け璐ヤ笉褰卞搷鍏朵粬璇锋眰 *
*// 缁撴灉鏂囦欢鍖呭惈姣忎釜 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, 鍙€)
**馃巵 棰濆鏀剁泭**
1. **鎴愭湰浼樺寲**: 澶ц妯¤蹇嗙储寮曟垚鏈檷浣 50%
2. **閫熺巼闄愬埗绐佺牬**: 鍙竴娆℃€ф彁浜ゆ暟涓囪姹
3. **绂荤嚎澶勭悊**: 鎻愪氦鍚庡彲鍏抽棴 OpenClaw锛屽畬鎴愬悗閫氱煡
4. **缁撴灉澶嶇敤**: JSONL 缁撴灉鏂囦欢鍙紦瀛/鍒嗕韩
[/md]
**馃搳 鐜扮姸鍒嗘瀽**
**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: 鎵╁睍璁板繂绯荤粺 (鎺ㄨ崘)**
閫傜敤鍦烘櫙**: 澶ц妯¤蹇嗙储寮/閲嶆柊绱㈠紩***// 鏂板鏂囦欢锛歴rc/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: 閫氱敤鎵瑰鐞嗗伐鍏**
閫傜敤鍦烘櫙**: 鐢ㄦ埛鑷畾涔夋壒閲忎换鍔 (濡傛壒閲忓垎鏋愭枃妗/鍥剧墖)***// 鏂板宸ュ叿锛歴rc/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. 瑙f瀽 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: 鎶€鑳藉皝瑁 (鏈€蹇惤鍦)**
閫傜敤鍦烘櫙**: 蹇€熼獙璇侊紝鏃犻渶淇敼鏍稿績浠g爜***// \~/.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. 閿欒澶勭悊**
*// 閮ㄥ垎澶辫触澶勭悊锛欽SONL 涓崟涓姹傚け璐ヤ笉褰卞搷鍏朵粬璇锋眰 *
*// 缁撴灉鏂囦欢鍖呭惈姣忎釜 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, 鍙€)
**馃巵 棰濆鏀剁泭**
1. **鎴愭湰浼樺寲**: 澶ц妯¤蹇嗙储寮曟垚鏈檷浣 50%
2. **閫熺巼闄愬埗绐佺牬**: 鍙竴娆℃€ф彁浜ゆ暟涓囪姹
3. **绂荤嚎澶勭悊**: 鎻愪氦鍚庡彲鍏抽棴 OpenClaw锛屽畬鎴愬悗閫氱煡
4. **缁撴灉澶嶇敤**: JSONL 缁撴灉鏂囦欢鍙紦瀛/鍒嗕韩
[/md]