@claude-flow/cli 3.10.4 → 3.10.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/benchmarks/capability-tasks.d.ts +126 -0
- package/dist/src/benchmarks/capability-tasks.d.ts.map +1 -0
- package/dist/src/benchmarks/capability-tasks.js +147 -0
- package/dist/src/benchmarks/capability-tasks.js.map +1 -0
- package/dist/src/benchmarks/gaia-agent-contrastive.d.ts +53 -0
- package/dist/src/benchmarks/gaia-agent-contrastive.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-agent-contrastive.js +177 -0
- package/dist/src/benchmarks/gaia-agent-contrastive.js.map +1 -0
- package/dist/src/benchmarks/gaia-agent-gemini.d.ts +51 -0
- package/dist/src/benchmarks/gaia-agent-gemini.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-agent-gemini.js +352 -0
- package/dist/src/benchmarks/gaia-agent-gemini.js.map +1 -0
- package/dist/src/benchmarks/gaia-agent-planning.smoke.d.ts +18 -0
- package/dist/src/benchmarks/gaia-agent-planning.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-agent-planning.smoke.js +253 -0
- package/dist/src/benchmarks/gaia-agent-planning.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-agent.d.ts +198 -0
- package/dist/src/benchmarks/gaia-agent.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-agent.js +651 -0
- package/dist/src/benchmarks/gaia-agent.js.map +1 -0
- package/dist/src/benchmarks/gaia-causal-memory.d.ts +133 -0
- package/dist/src/benchmarks/gaia-causal-memory.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-causal-memory.js +281 -0
- package/dist/src/benchmarks/gaia-causal-memory.js.map +1 -0
- package/dist/src/benchmarks/gaia-causal-memory.smoke.d.ts +22 -0
- package/dist/src/benchmarks/gaia-causal-memory.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-causal-memory.smoke.js +300 -0
- package/dist/src/benchmarks/gaia-causal-memory.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-claude-p.d.ts +105 -0
- package/dist/src/benchmarks/gaia-claude-p.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-claude-p.js +269 -0
- package/dist/src/benchmarks/gaia-claude-p.js.map +1 -0
- package/dist/src/benchmarks/gaia-claude-p.smoke.d.ts +20 -0
- package/dist/src/benchmarks/gaia-claude-p.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-claude-p.smoke.js +168 -0
- package/dist/src/benchmarks/gaia-claude-p.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-codeagent-runner.py +556 -0
- package/dist/src/benchmarks/gaia-codeagent.d.ts +129 -0
- package/dist/src/benchmarks/gaia-codeagent.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-codeagent.js +590 -0
- package/dist/src/benchmarks/gaia-codeagent.js.map +1 -0
- package/dist/src/benchmarks/gaia-codeagent.smoke.d.ts +33 -0
- package/dist/src/benchmarks/gaia-codeagent.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-codeagent.smoke.js +241 -0
- package/dist/src/benchmarks/gaia-codeagent.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-convergence.d.ts +138 -0
- package/dist/src/benchmarks/gaia-convergence.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-convergence.js +260 -0
- package/dist/src/benchmarks/gaia-convergence.js.map +1 -0
- package/dist/src/benchmarks/gaia-convergence.smoke.d.ts +19 -0
- package/dist/src/benchmarks/gaia-convergence.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-convergence.smoke.js +246 -0
- package/dist/src/benchmarks/gaia-convergence.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-critic.d.ts +123 -0
- package/dist/src/benchmarks/gaia-critic.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-critic.js +312 -0
- package/dist/src/benchmarks/gaia-critic.js.map +1 -0
- package/dist/src/benchmarks/gaia-critic.smoke.d.ts +21 -0
- package/dist/src/benchmarks/gaia-critic.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-critic.smoke.js +327 -0
- package/dist/src/benchmarks/gaia-critic.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-dag-pilot.d.ts +22 -0
- package/dist/src/benchmarks/gaia-dag-pilot.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-dag-pilot.js +158 -0
- package/dist/src/benchmarks/gaia-dag-pilot.js.map +1 -0
- package/dist/src/benchmarks/gaia-dag.d.ts +110 -0
- package/dist/src/benchmarks/gaia-dag.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-dag.js +658 -0
- package/dist/src/benchmarks/gaia-dag.js.map +1 -0
- package/dist/src/benchmarks/gaia-dag.smoke.d.ts +21 -0
- package/dist/src/benchmarks/gaia-dag.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-dag.smoke.js +290 -0
- package/dist/src/benchmarks/gaia-dag.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-decomposer.d.ts +125 -0
- package/dist/src/benchmarks/gaia-decomposer.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-decomposer.js +350 -0
- package/dist/src/benchmarks/gaia-decomposer.js.map +1 -0
- package/dist/src/benchmarks/gaia-decomposer.smoke.d.ts +21 -0
- package/dist/src/benchmarks/gaia-decomposer.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-decomposer.smoke.js +228 -0
- package/dist/src/benchmarks/gaia-decomposer.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-e2e-smoke.d.ts +27 -0
- package/dist/src/benchmarks/gaia-e2e-smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-e2e-smoke.js +136 -0
- package/dist/src/benchmarks/gaia-e2e-smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-ensemble-pilot.d.ts +17 -0
- package/dist/src/benchmarks/gaia-ensemble-pilot.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-ensemble-pilot.js +106 -0
- package/dist/src/benchmarks/gaia-ensemble-pilot.js.map +1 -0
- package/dist/src/benchmarks/gaia-ensemble.d.ts +103 -0
- package/dist/src/benchmarks/gaia-ensemble.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-ensemble.js +462 -0
- package/dist/src/benchmarks/gaia-ensemble.js.map +1 -0
- package/dist/src/benchmarks/gaia-extract.smoke.d.ts +45 -0
- package/dist/src/benchmarks/gaia-extract.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-extract.smoke.js +242 -0
- package/dist/src/benchmarks/gaia-extract.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-gemini-pilot.d.ts +17 -0
- package/dist/src/benchmarks/gaia-gemini-pilot.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-gemini-pilot.js +168 -0
- package/dist/src/benchmarks/gaia-gemini-pilot.js.map +1 -0
- package/dist/src/benchmarks/gaia-hardness/features.d.ts +46 -0
- package/dist/src/benchmarks/gaia-hardness/features.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-hardness/features.js +170 -0
- package/dist/src/benchmarks/gaia-hardness/features.js.map +1 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.d.ts +105 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.js +260 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.js.map +1 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.smoke.d.ts +20 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.smoke.js +235 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-hardness/train-data-loader.d.ts +51 -0
- package/dist/src/benchmarks/gaia-hardness/train-data-loader.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-hardness/train-data-loader.js +179 -0
- package/dist/src/benchmarks/gaia-hardness/train-data-loader.js.map +1 -0
- package/dist/src/benchmarks/gaia-judge.d.ts +88 -0
- package/dist/src/benchmarks/gaia-judge.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-judge.js +437 -0
- package/dist/src/benchmarks/gaia-judge.js.map +1 -0
- package/dist/src/benchmarks/gaia-loader.d.ts +87 -0
- package/dist/src/benchmarks/gaia-loader.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-loader.js +326 -0
- package/dist/src/benchmarks/gaia-loader.js.map +1 -0
- package/dist/src/benchmarks/gaia-mode-router.d.ts +67 -0
- package/dist/src/benchmarks/gaia-mode-router.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-mode-router.js +126 -0
- package/dist/src/benchmarks/gaia-mode-router.js.map +1 -0
- package/dist/src/benchmarks/gaia-mode-router.smoke.d.ts +15 -0
- package/dist/src/benchmarks/gaia-mode-router.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-mode-router.smoke.js +131 -0
- package/dist/src/benchmarks/gaia-mode-router.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/file_read.d.ts +35 -0
- package/dist/src/benchmarks/gaia-tools/file_read.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/file_read.js +403 -0
- package/dist/src/benchmarks/gaia-tools/file_read.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.d.ts +126 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.js +225 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.d.ts +24 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.js +276 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.d.ts +45 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.js +222 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.smoke.d.ts +24 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.smoke.js +169 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/index.d.ts +32 -0
- package/dist/src/benchmarks/gaia-tools/index.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/index.js +36 -0
- package/dist/src/benchmarks/gaia-tools/index.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/pdf_read.d.ts +27 -0
- package/dist/src/benchmarks/gaia-tools/pdf_read.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/pdf_read.js +226 -0
- package/dist/src/benchmarks/gaia-tools/pdf_read.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.d.ts +31 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.js +94 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.smoke.d.ts +13 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.smoke.js +98 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/types.d.ts +62 -0
- package/dist/src/benchmarks/gaia-tools/types.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/types.js +12 -0
- package/dist/src/benchmarks/gaia-tools/types.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/visit_webpage.d.ts +52 -0
- package/dist/src/benchmarks/gaia-tools/visit_webpage.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/visit_webpage.js +304 -0
- package/dist/src/benchmarks/gaia-tools/visit_webpage.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.d.ts +61 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.js +217 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.smoke.d.ts +26 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.smoke.js +152 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_search.d.ts +30 -0
- package/dist/src/benchmarks/gaia-tools/web_search.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_search.js +210 -0
- package/dist/src/benchmarks/gaia-tools/web_search.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_search.smoke.d.ts +24 -0
- package/dist/src/benchmarks/gaia-tools/web_search.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_search.smoke.js +311 -0
- package/dist/src/benchmarks/gaia-tools/web_search.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-visit-webpage.smoke.d.ts +25 -0
- package/dist/src/benchmarks/gaia-visit-webpage.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-visit-webpage.smoke.js +304 -0
- package/dist/src/benchmarks/gaia-visit-webpage.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-voting.d.ts +88 -0
- package/dist/src/benchmarks/gaia-voting.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-voting.js +297 -0
- package/dist/src/benchmarks/gaia-voting.js.map +1 -0
- package/dist/src/benchmarks/gaia-voting.smoke.d.ts +20 -0
- package/dist/src/benchmarks/gaia-voting.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-voting.smoke.js +332 -0
- package/dist/src/benchmarks/gaia-voting.smoke.js.map +1 -0
- package/dist/src/commands/gaia-bench.d.ts +40 -0
- package/dist/src/commands/gaia-bench.d.ts.map +1 -0
- package/dist/src/commands/gaia-bench.js +597 -0
- package/dist/src/commands/gaia-bench.js.map +1 -0
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +2 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +41 -4
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/performance-capability.d.ts +30 -0
- package/dist/src/commands/performance-capability.d.ts.map +1 -0
- package/dist/src/commands/performance-capability.js +349 -0
- package/dist/src/commands/performance-capability.js.map +1 -0
- package/dist/src/commands/route.d.ts.map +1 -1
- package/dist/src/commands/route.js +9 -0
- package/dist/src/commands/route.js.map +1 -1
- package/dist/src/init/executor.d.ts.map +1 -1
- package/dist/src/init/executor.js +25 -6
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/mcp-generator.d.ts.map +1 -1
- package/dist/src/init/mcp-generator.js +9 -4
- package/dist/src/init/mcp-generator.js.map +1 -1
- package/dist/src/init/statusline-generator.d.ts.map +1 -1
- package/dist/src/init/statusline-generator.js +25 -2
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/src/mcp-tools/agentdb-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/agentdb-tools.js +20 -3
- package/dist/src/mcp-tools/agentdb-tools.js.map +1 -1
- package/dist/src/mcp-tools/system-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/system-tools.js +12 -1
- package/dist/src/mcp-tools/system-tools.js.map +1 -1
- package/dist/src/memory/memory-bridge.d.ts.map +1 -1
- package/dist/src/memory/memory-bridge.js +34 -0
- package/dist/src/memory/memory-bridge.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GAIA Agent — Gemini 2.5 Pro Thinking adapter (Phase 2 pilot)
|
|
3
|
+
*
|
|
4
|
+
* Adapts the existing GAIA tool catalogue to Google's generateContent API,
|
|
5
|
+
* translating Anthropic tool_use ↔ Gemini functionCall/functionResponse.
|
|
6
|
+
*
|
|
7
|
+
* Loop algorithm mirrors gaia-agent.ts:
|
|
8
|
+
* 1. Build initial contents array with system instruction + first user turn.
|
|
9
|
+
* 2. Call Gemini generateContent with functionDeclarations.
|
|
10
|
+
* 3. On functionCall parts: execute tools, append functionResponse, repeat.
|
|
11
|
+
* 4. On text-only response: scan for FINAL_ANSWER pattern.
|
|
12
|
+
* 5. On maxTurns: return timedOut result.
|
|
13
|
+
*
|
|
14
|
+
* Gemini 2.5 Pro pricing (2026-05-28, per million tokens):
|
|
15
|
+
* Input: $1.25 (≤200k tokens), $2.50 (>200k)
|
|
16
|
+
* Output: $10.00 (≤200k tokens), $15.00 (>200k)
|
|
17
|
+
* Thinking tokens are billed as output tokens.
|
|
18
|
+
*
|
|
19
|
+
* Cost gate for pilot: ≤$0.12 per question average.
|
|
20
|
+
* Expected per-question cost at ~10k input + ~2k output: ~$0.032 — well within gate.
|
|
21
|
+
*
|
|
22
|
+
* Refs: ADR-133, ADR-135, #2156 Phase 2
|
|
23
|
+
*/
|
|
24
|
+
import { execSync } from 'node:child_process';
|
|
25
|
+
import * as fs from 'node:fs';
|
|
26
|
+
import * as path from 'node:path';
|
|
27
|
+
import { createDefaultToolCatalogue, } from './gaia-tools/index.js';
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Constants
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
const GEMINI_API_BASE = 'https://generativelanguage.googleapis.com/v1beta/models';
|
|
32
|
+
export const DEFAULT_GEMINI_MODEL = 'gemini-2.5-pro';
|
|
33
|
+
const DEFAULT_MAX_TURNS = 12;
|
|
34
|
+
const DEFAULT_MAX_TOKENS_PER_TURN = 8192;
|
|
35
|
+
const DEFAULT_PER_TURN_TIMEOUT_MS = 120_000;
|
|
36
|
+
/** Gemini 2.5 Pro pricing (USD per million tokens, ≤200k bracket). */
|
|
37
|
+
const GEMINI_INPUT_COST_PER_M = 1.25;
|
|
38
|
+
const GEMINI_OUTPUT_COST_PER_M = 10.00;
|
|
39
|
+
const FINAL_ANSWER_RE = /FINAL_ANSWER:\s*(.+)/i;
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// API key resolution
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
export function resolveGeminiApiKey(apiKey) {
|
|
44
|
+
if (apiKey && apiKey.trim())
|
|
45
|
+
return apiKey.trim();
|
|
46
|
+
const envKey = process.env['GOOGLE_AI_API_KEY'];
|
|
47
|
+
if (envKey && envKey.trim())
|
|
48
|
+
return envKey.trim();
|
|
49
|
+
try {
|
|
50
|
+
const out = execSync('gcloud secrets versions access latest --secret=GOOGLE_AI_API_KEY --project=ruv-dev 2>/dev/null', { encoding: 'utf-8', timeout: 10_000 }).trim();
|
|
51
|
+
if (out)
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
/* fall through */
|
|
56
|
+
}
|
|
57
|
+
throw new Error('GOOGLE_AI_API_KEY not found. Set the env var or store in GCP Secret Manager.');
|
|
58
|
+
}
|
|
59
|
+
function toGeminiType(anthropicType) {
|
|
60
|
+
const map = {
|
|
61
|
+
string: 'STRING',
|
|
62
|
+
number: 'NUMBER',
|
|
63
|
+
integer: 'INTEGER',
|
|
64
|
+
boolean: 'BOOLEAN',
|
|
65
|
+
array: 'ARRAY',
|
|
66
|
+
object: 'OBJECT',
|
|
67
|
+
};
|
|
68
|
+
return map[anthropicType.toLowerCase()] ?? 'STRING';
|
|
69
|
+
}
|
|
70
|
+
function translateToolDef(def) {
|
|
71
|
+
const props = {};
|
|
72
|
+
for (const [key, val] of Object.entries(def.input_schema.properties)) {
|
|
73
|
+
props[key] = { type: toGeminiType(val.type), description: val.description };
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
name: def.name,
|
|
77
|
+
description: def.description,
|
|
78
|
+
parameters: {
|
|
79
|
+
type: 'OBJECT',
|
|
80
|
+
properties: props,
|
|
81
|
+
required: def.input_schema.required ?? [],
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
// Single Gemini API call
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
async function callGemini(apiKey, model, contents, systemInstruction, functionDeclarations, maxTokens, timeoutMs) {
|
|
89
|
+
const url = `${GEMINI_API_BASE}/${model}:generateContent?key=${encodeURIComponent(apiKey)}`;
|
|
90
|
+
const requestBody = {
|
|
91
|
+
contents,
|
|
92
|
+
systemInstruction: { parts: [{ text: systemInstruction }] },
|
|
93
|
+
generationConfig: {
|
|
94
|
+
maxOutputTokens: maxTokens,
|
|
95
|
+
thinkingConfig: { thinkingBudget: 8192 },
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
if (functionDeclarations.length > 0) {
|
|
99
|
+
requestBody['tools'] = [{ functionDeclarations }];
|
|
100
|
+
requestBody['toolConfig'] = { functionCallingConfig: { mode: 'AUTO' } };
|
|
101
|
+
}
|
|
102
|
+
const controller = new AbortController();
|
|
103
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
104
|
+
let res;
|
|
105
|
+
try {
|
|
106
|
+
res = await fetch(url, {
|
|
107
|
+
method: 'POST',
|
|
108
|
+
headers: { 'Content-Type': 'application/json' },
|
|
109
|
+
body: JSON.stringify(requestBody),
|
|
110
|
+
signal: controller.signal,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
clearTimeout(timer);
|
|
115
|
+
}
|
|
116
|
+
if (!res.ok) {
|
|
117
|
+
const errText = await res.text().catch(() => '<unreadable>');
|
|
118
|
+
throw new Error(`Gemini API ${res.status}: ${errText.slice(0, 400)}`);
|
|
119
|
+
}
|
|
120
|
+
return (await res.json());
|
|
121
|
+
}
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
// Build initial contents (handles image attachments inline)
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
function buildInitialContents(question) {
|
|
126
|
+
const questionText = question.question;
|
|
127
|
+
const parts = [];
|
|
128
|
+
if (question.file_path) {
|
|
129
|
+
const ext = path.extname(question.file_path).toLowerCase();
|
|
130
|
+
const imageExts = ['.png', '.jpg', '.jpeg', '.gif', '.webp'];
|
|
131
|
+
if (imageExts.includes(ext)) {
|
|
132
|
+
try {
|
|
133
|
+
const buf = fs.readFileSync(question.file_path);
|
|
134
|
+
const mediaTypeMap = {
|
|
135
|
+
'.png': 'image/png', '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg',
|
|
136
|
+
'.gif': 'image/gif', '.webp': 'image/webp',
|
|
137
|
+
};
|
|
138
|
+
parts.push({ text: questionText });
|
|
139
|
+
// Gemini inline image part
|
|
140
|
+
parts.push({
|
|
141
|
+
inlineData: {
|
|
142
|
+
mimeType: mediaTypeMap[ext] ?? 'image/png',
|
|
143
|
+
data: buf.toString('base64'),
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
parts.push({
|
|
149
|
+
text: questionText + `\n\nAttached file: ${question.file_path}. Call file_read to read it.`,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
parts.push({
|
|
155
|
+
text: questionText + `\n\nThis question has an attached file. Call file_read with path="${question.file_path}" to read it, then answer.`,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
parts.push({ text: questionText });
|
|
161
|
+
}
|
|
162
|
+
return [{ role: 'user', parts }];
|
|
163
|
+
}
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
// Extract FINAL_ANSWER from model response text
|
|
166
|
+
// ---------------------------------------------------------------------------
|
|
167
|
+
function extractFinalAnswer(candidate) {
|
|
168
|
+
if (!candidate?.content?.parts)
|
|
169
|
+
return null;
|
|
170
|
+
for (const part of candidate.content.parts) {
|
|
171
|
+
if (part.thought)
|
|
172
|
+
continue;
|
|
173
|
+
if (part.text) {
|
|
174
|
+
const match = FINAL_ANSWER_RE.exec(part.text);
|
|
175
|
+
if (match?.[1])
|
|
176
|
+
return match[1].trim();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
// Check if response has any functionCall parts
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
function getFunctionCalls(candidate) {
|
|
185
|
+
if (!candidate?.content?.parts)
|
|
186
|
+
return [];
|
|
187
|
+
return candidate.content.parts
|
|
188
|
+
.filter((p) => !!p.functionCall)
|
|
189
|
+
.map((p) => p.functionCall);
|
|
190
|
+
}
|
|
191
|
+
// ---------------------------------------------------------------------------
|
|
192
|
+
// Main agent loop
|
|
193
|
+
// ---------------------------------------------------------------------------
|
|
194
|
+
export async function runGeminiAgent(question, options = {}) {
|
|
195
|
+
const { model = DEFAULT_GEMINI_MODEL, maxTurns = DEFAULT_MAX_TURNS, maxTokensPerTurn = DEFAULT_MAX_TOKENS_PER_TURN, perTurnTimeoutMs = DEFAULT_PER_TURN_TIMEOUT_MS, apiKey: suppliedKey, catalogue: suppliedCatalogue, } = options;
|
|
196
|
+
const wallStart = Date.now();
|
|
197
|
+
const apiKey = resolveGeminiApiKey(suppliedKey);
|
|
198
|
+
const catalogue = suppliedCatalogue ?? createDefaultToolCatalogue();
|
|
199
|
+
const functionDeclarations = catalogue.map((t) => translateToolDef(t.definition));
|
|
200
|
+
const systemInstruction = [
|
|
201
|
+
'You are a precise question-answering agent. Answer the user\'s question using the tools available.',
|
|
202
|
+
'',
|
|
203
|
+
'RULES:',
|
|
204
|
+
'1. Use tools when you need information you do not have with certainty.',
|
|
205
|
+
'2. When you have a final answer, output it on its own line in this EXACT format:',
|
|
206
|
+
' FINAL_ANSWER: <your answer here>',
|
|
207
|
+
'3. Keep answers concise. For numbers, give just the number. For names, give just the name.',
|
|
208
|
+
'4. Do not include units unless the question specifically asks for them.',
|
|
209
|
+
'5. MANDATORY: You MUST ALWAYS end your final response with a FINAL_ANSWER line.',
|
|
210
|
+
'6. If the question text appears garbled or reversed, try to interpret it before concluding you cannot answer.',
|
|
211
|
+
].join('\n');
|
|
212
|
+
const toolCallsByName = {};
|
|
213
|
+
let totalInputTokens = 0;
|
|
214
|
+
let totalOutputTokens = 0;
|
|
215
|
+
let totalThinkingTokens = 0;
|
|
216
|
+
const contents = buildInitialContents(question);
|
|
217
|
+
let turns = 0;
|
|
218
|
+
for (let turn = 0; turn < maxTurns; turn++) {
|
|
219
|
+
turns = turn + 1;
|
|
220
|
+
let resp;
|
|
221
|
+
try {
|
|
222
|
+
resp = await callGemini(apiKey, model, contents, systemInstruction, functionDeclarations, maxTokensPerTurn, perTurnTimeoutMs);
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
return {
|
|
226
|
+
questionId: question.task_id,
|
|
227
|
+
finalAnswer: null,
|
|
228
|
+
turns,
|
|
229
|
+
toolCallsByName,
|
|
230
|
+
totalInputTokens,
|
|
231
|
+
totalOutputTokens,
|
|
232
|
+
totalThinkingTokens,
|
|
233
|
+
wallMs: Date.now() - wallStart,
|
|
234
|
+
estimatedCostUsd: estimateCost(totalInputTokens, totalOutputTokens),
|
|
235
|
+
error: err instanceof Error ? err.message : String(err),
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
if (resp.error) {
|
|
239
|
+
return {
|
|
240
|
+
questionId: question.task_id,
|
|
241
|
+
finalAnswer: null,
|
|
242
|
+
turns,
|
|
243
|
+
toolCallsByName,
|
|
244
|
+
totalInputTokens,
|
|
245
|
+
totalOutputTokens,
|
|
246
|
+
totalThinkingTokens,
|
|
247
|
+
wallMs: Date.now() - wallStart,
|
|
248
|
+
estimatedCostUsd: estimateCost(totalInputTokens, totalOutputTokens),
|
|
249
|
+
error: `Gemini error ${resp.error.code}: ${resp.error.message}`,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
// Accumulate token counts
|
|
253
|
+
const usage = resp.usageMetadata ?? {};
|
|
254
|
+
totalInputTokens += usage.promptTokenCount ?? 0;
|
|
255
|
+
totalOutputTokens += usage.candidatesTokenCount ?? 0;
|
|
256
|
+
totalThinkingTokens += usage.thoughtsTokenCount ?? 0;
|
|
257
|
+
const candidate = resp.candidates?.[0];
|
|
258
|
+
const functionCalls = getFunctionCalls(candidate);
|
|
259
|
+
if (functionCalls.length > 0) {
|
|
260
|
+
// Append model turn (with functionCall parts)
|
|
261
|
+
if (candidate?.content) {
|
|
262
|
+
contents.push({ role: 'model', parts: candidate.content.parts });
|
|
263
|
+
}
|
|
264
|
+
// Execute all function calls and build functionResponse parts
|
|
265
|
+
const responseParts = await Promise.all(functionCalls.map(async (call) => {
|
|
266
|
+
toolCallsByName[call.name] = (toolCallsByName[call.name] ?? 0) + 1;
|
|
267
|
+
const tool = catalogue.find((t) => t.name === call.name);
|
|
268
|
+
if (!tool) {
|
|
269
|
+
return {
|
|
270
|
+
functionResponse: {
|
|
271
|
+
name: call.name,
|
|
272
|
+
response: { error: `Unknown tool "${call.name}"` },
|
|
273
|
+
},
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
try {
|
|
277
|
+
const output = await tool.execute(call.args);
|
|
278
|
+
return {
|
|
279
|
+
functionResponse: {
|
|
280
|
+
name: call.name,
|
|
281
|
+
response: { output },
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
catch (err) {
|
|
286
|
+
return {
|
|
287
|
+
functionResponse: {
|
|
288
|
+
name: call.name,
|
|
289
|
+
response: { error: err instanceof Error ? err.message : String(err) },
|
|
290
|
+
},
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
}));
|
|
294
|
+
contents.push({ role: 'user', parts: responseParts });
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
// No function calls — extract final answer
|
|
298
|
+
const finalAnswer = extractFinalAnswer(candidate);
|
|
299
|
+
return {
|
|
300
|
+
questionId: question.task_id,
|
|
301
|
+
finalAnswer,
|
|
302
|
+
turns,
|
|
303
|
+
toolCallsByName,
|
|
304
|
+
totalInputTokens,
|
|
305
|
+
totalOutputTokens,
|
|
306
|
+
totalThinkingTokens,
|
|
307
|
+
wallMs: Date.now() - wallStart,
|
|
308
|
+
estimatedCostUsd: estimateCost(totalInputTokens, totalOutputTokens + totalThinkingTokens),
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
// Exhausted maxTurns
|
|
312
|
+
return {
|
|
313
|
+
questionId: question.task_id,
|
|
314
|
+
finalAnswer: null,
|
|
315
|
+
turns,
|
|
316
|
+
toolCallsByName,
|
|
317
|
+
totalInputTokens,
|
|
318
|
+
totalOutputTokens,
|
|
319
|
+
totalThinkingTokens,
|
|
320
|
+
wallMs: Date.now() - wallStart,
|
|
321
|
+
estimatedCostUsd: estimateCost(totalInputTokens, totalOutputTokens + totalThinkingTokens),
|
|
322
|
+
timedOut: true,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
function estimateCost(inputTokens, outputTokens) {
|
|
326
|
+
return ((inputTokens / 1_000_000) * GEMINI_INPUT_COST_PER_M +
|
|
327
|
+
(outputTokens / 1_000_000) * GEMINI_OUTPUT_COST_PER_M);
|
|
328
|
+
}
|
|
329
|
+
// ---------------------------------------------------------------------------
|
|
330
|
+
// Answer matching (same as gaia-agent.ts)
|
|
331
|
+
// ---------------------------------------------------------------------------
|
|
332
|
+
export function isGeminiAnswerCorrect(modelAnswer, expected) {
|
|
333
|
+
if (!modelAnswer)
|
|
334
|
+
return false;
|
|
335
|
+
const norm = (s) => s.trim().toLowerCase();
|
|
336
|
+
const normModel = norm(modelAnswer);
|
|
337
|
+
const normExpected = norm(expected);
|
|
338
|
+
if (normModel === normExpected)
|
|
339
|
+
return true;
|
|
340
|
+
if (normModel.includes(normExpected))
|
|
341
|
+
return true;
|
|
342
|
+
if (normExpected.includes(normModel))
|
|
343
|
+
return true;
|
|
344
|
+
const numModel = parseFloat(normModel.replace(/[^0-9.\-]/g, ''));
|
|
345
|
+
const numExpected = parseFloat(normExpected.replace(/[^0-9.\-]/g, ''));
|
|
346
|
+
if (!Number.isNaN(numModel) && !Number.isNaN(numExpected) &&
|
|
347
|
+
numExpected !== 0 &&
|
|
348
|
+
Math.abs((numModel - numExpected) / numExpected) < 0.01)
|
|
349
|
+
return true;
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=gaia-agent-gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gaia-agent-gemini.js","sourceRoot":"","sources":["../../../src/benchmarks/gaia-agent-gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GAIA Agent — Planning Interval Smoke Tests
|
|
3
|
+
*
|
|
4
|
+
* Verifies that the planning-checkpoint injection logic fires at the correct
|
|
5
|
+
* turns and stays silent when conditions are not met. All tests are fully
|
|
6
|
+
* mocked — no live Anthropic API calls, $0 cost.
|
|
7
|
+
*
|
|
8
|
+
* Test cases:
|
|
9
|
+
* 1. 12-turn loop with interval=4 → replans at turns 4, 8, 12 (3 replans)
|
|
10
|
+
* 2. 3-turn loop with interval=4 → NO replan (interval never hit)
|
|
11
|
+
* 3. end_turn at turn 5 → NO replan injected (terminal state)
|
|
12
|
+
* 4. all-tool_use 8-turn loop → exactly floor(8/4) = 2 replans
|
|
13
|
+
* 5. planningInterval=0 → disabled entirely, 0 replans
|
|
14
|
+
*
|
|
15
|
+
* Refs: ADR-133, ADR-135, iter 34, #2156
|
|
16
|
+
*/
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=gaia-agent-planning.smoke.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gaia-agent-planning.smoke.d.ts","sourceRoot":"","sources":["../../../src/benchmarks/gaia-agent-planning.smoke.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GAIA Agent — Planning Interval Smoke Tests
|
|
3
|
+
*
|
|
4
|
+
* Verifies that the planning-checkpoint injection logic fires at the correct
|
|
5
|
+
* turns and stays silent when conditions are not met. All tests are fully
|
|
6
|
+
* mocked — no live Anthropic API calls, $0 cost.
|
|
7
|
+
*
|
|
8
|
+
* Test cases:
|
|
9
|
+
* 1. 12-turn loop with interval=4 → replans at turns 4, 8, 12 (3 replans)
|
|
10
|
+
* 2. 3-turn loop with interval=4 → NO replan (interval never hit)
|
|
11
|
+
* 3. end_turn at turn 5 → NO replan injected (terminal state)
|
|
12
|
+
* 4. all-tool_use 8-turn loop → exactly floor(8/4) = 2 replans
|
|
13
|
+
* 5. planningInterval=0 → disabled entirely, 0 replans
|
|
14
|
+
*
|
|
15
|
+
* Refs: ADR-133, ADR-135, iter 34, #2156
|
|
16
|
+
*/
|
|
17
|
+
import assert from 'node:assert/strict';
|
|
18
|
+
import { runGaiaAgent, PLANNING_INTERVAL, buildPlanningCheckpoint } from './gaia-agent.js';
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Helpers
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
/** Minimal GAIA question fixture. */
|
|
23
|
+
const FAKE_QUESTION = {
|
|
24
|
+
task_id: 'smoke-planning-01',
|
|
25
|
+
question: 'What is 2 + 2?',
|
|
26
|
+
final_answer: '4',
|
|
27
|
+
level: 1,
|
|
28
|
+
file_name: null,
|
|
29
|
+
file_path: null,
|
|
30
|
+
};
|
|
31
|
+
/** A trivial tool catalogue with one no-op tool. */
|
|
32
|
+
const NOOP_CATALOGUE = [
|
|
33
|
+
{
|
|
34
|
+
name: 'noop',
|
|
35
|
+
definition: {
|
|
36
|
+
name: 'noop',
|
|
37
|
+
description: 'Does nothing',
|
|
38
|
+
input_schema: { type: 'object', properties: {}, required: [] },
|
|
39
|
+
},
|
|
40
|
+
execute: async () => 'ok',
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// Mock Anthropic API call factory
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
/**
|
|
47
|
+
* Build a mock `fetch` that simulates a specific turn sequence.
|
|
48
|
+
*
|
|
49
|
+
* `sequence` is an array of stop_reasons. The mock returns `tool_use`
|
|
50
|
+
* responses (with one `noop` tool_use block) for `tool_use` entries, and
|
|
51
|
+
* `end_turn` with a FINAL_ANSWER text block for `end_turn` entries.
|
|
52
|
+
*
|
|
53
|
+
* The mock replaces `global.fetch` for the duration of the test and is
|
|
54
|
+
* restored automatically via the returned `restore` function.
|
|
55
|
+
*/
|
|
56
|
+
function mockFetchSequence(sequence) {
|
|
57
|
+
const calls = []; // turn indices (0-based) of actual calls
|
|
58
|
+
let callIdx = 0;
|
|
59
|
+
const originalFetch = global.fetch;
|
|
60
|
+
global.fetch = async (_url, options) => {
|
|
61
|
+
const idx = callIdx++;
|
|
62
|
+
calls.push(idx);
|
|
63
|
+
const stopReason = sequence[idx] ?? 'end_turn';
|
|
64
|
+
let content;
|
|
65
|
+
if (stopReason === 'tool_use') {
|
|
66
|
+
content = [
|
|
67
|
+
{
|
|
68
|
+
type: 'tool_use',
|
|
69
|
+
id: `tool-${idx}`,
|
|
70
|
+
name: 'noop',
|
|
71
|
+
input: {},
|
|
72
|
+
},
|
|
73
|
+
];
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
content = [
|
|
77
|
+
{
|
|
78
|
+
type: 'text',
|
|
79
|
+
text: 'FINAL_ANSWER: 4',
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
}
|
|
83
|
+
const body = JSON.stringify({
|
|
84
|
+
id: `msg-${idx}`,
|
|
85
|
+
model: 'claude-haiku-4-5',
|
|
86
|
+
stop_reason: stopReason,
|
|
87
|
+
content,
|
|
88
|
+
usage: { input_tokens: 100, output_tokens: 50 },
|
|
89
|
+
});
|
|
90
|
+
return new Response(body, {
|
|
91
|
+
status: 200,
|
|
92
|
+
headers: { 'content-type': 'application/json' },
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
return {
|
|
96
|
+
calls,
|
|
97
|
+
restore: () => {
|
|
98
|
+
global.fetch = originalFetch;
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
// Base options for all tests
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
function baseOpts(overrides = {}) {
|
|
106
|
+
return {
|
|
107
|
+
apiKey: 'sk-ant-test-key',
|
|
108
|
+
catalogue: NOOP_CATALOGUE,
|
|
109
|
+
model: 'claude-haiku-4-5',
|
|
110
|
+
perTurnTimeoutMs: 5_000,
|
|
111
|
+
...overrides,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
// Test 1: 12-turn all-tool_use loop → 3 replans at turns 4, 8, 12
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
async function test_twelveToolUseTurns_threeReplans() {
|
|
118
|
+
// Turns 0-11 are tool_use, turn 12 (index 12) is end_turn
|
|
119
|
+
const sequence = [
|
|
120
|
+
...Array(12).fill('tool_use'),
|
|
121
|
+
'end_turn',
|
|
122
|
+
];
|
|
123
|
+
const { restore } = mockFetchSequence(sequence);
|
|
124
|
+
try {
|
|
125
|
+
const result = await runGaiaAgent(FAKE_QUESTION, baseOpts({ maxTurns: 13 }));
|
|
126
|
+
assert.equal(result.replanCount, 3, `Expected 3 replans, got ${result.replanCount}`);
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
restore();
|
|
130
|
+
}
|
|
131
|
+
console.log(' PASS test_twelveToolUseTurns_threeReplans');
|
|
132
|
+
}
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
// Test 2: 3-turn loop → 0 replans (interval=4 never hit)
|
|
135
|
+
// ---------------------------------------------------------------------------
|
|
136
|
+
async function test_threeToolUseTurns_zeroReplans() {
|
|
137
|
+
const sequence = [
|
|
138
|
+
'tool_use',
|
|
139
|
+
'tool_use',
|
|
140
|
+
'tool_use',
|
|
141
|
+
'end_turn',
|
|
142
|
+
];
|
|
143
|
+
const { restore } = mockFetchSequence(sequence);
|
|
144
|
+
try {
|
|
145
|
+
const result = await runGaiaAgent(FAKE_QUESTION, baseOpts({ maxTurns: 8 }));
|
|
146
|
+
assert.equal(result.replanCount, 0, `Expected 0 replans, got ${result.replanCount}`);
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
restore();
|
|
150
|
+
}
|
|
151
|
+
console.log(' PASS test_threeToolUseTurns_zeroReplans');
|
|
152
|
+
}
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
// Test 3: end_turn at turn 5 → 1 replan (at turn 4), not at turn 5
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
async function test_endTurnAtFive_oneReplan() {
|
|
157
|
+
// Turns 0-4 are tool_use (5 of them), turn 5 is end_turn
|
|
158
|
+
// Replan fires at turn 4 (turns=4, turns%4===0), but NOT at turn 5 (end_turn → no injection)
|
|
159
|
+
const sequence = [
|
|
160
|
+
'tool_use',
|
|
161
|
+
'tool_use',
|
|
162
|
+
'tool_use',
|
|
163
|
+
'tool_use',
|
|
164
|
+
'tool_use',
|
|
165
|
+
'end_turn',
|
|
166
|
+
];
|
|
167
|
+
const { restore } = mockFetchSequence(sequence);
|
|
168
|
+
try {
|
|
169
|
+
const result = await runGaiaAgent(FAKE_QUESTION, baseOpts({ maxTurns: 10 }));
|
|
170
|
+
assert.equal(result.replanCount, 1, `Expected 1 replan (at turn 4), got ${result.replanCount}`);
|
|
171
|
+
assert.equal(result.timedOut, undefined, 'Should not time out');
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
restore();
|
|
175
|
+
}
|
|
176
|
+
console.log(' PASS test_endTurnAtFive_oneReplan');
|
|
177
|
+
}
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
// Test 4: all tool_use for 8 turns → floor(8/4) = 2 replans
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
async function test_eightToolUseTurns_twoReplans() {
|
|
182
|
+
const sequence = [
|
|
183
|
+
...Array(8).fill('tool_use'),
|
|
184
|
+
'end_turn',
|
|
185
|
+
];
|
|
186
|
+
const { restore } = mockFetchSequence(sequence);
|
|
187
|
+
try {
|
|
188
|
+
const result = await runGaiaAgent(FAKE_QUESTION, baseOpts({ maxTurns: 9 }));
|
|
189
|
+
assert.equal(result.replanCount, 2, `Expected 2 replans, got ${result.replanCount}`);
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
restore();
|
|
193
|
+
}
|
|
194
|
+
console.log(' PASS test_eightToolUseTurns_twoReplans');
|
|
195
|
+
}
|
|
196
|
+
// ---------------------------------------------------------------------------
|
|
197
|
+
// Test 5: planningInterval=0 → disabled, 0 replans even on long runs
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
async function test_intervalZero_disabledReplanning() {
|
|
200
|
+
const sequence = [
|
|
201
|
+
...Array(8).fill('tool_use'),
|
|
202
|
+
'end_turn',
|
|
203
|
+
];
|
|
204
|
+
const { restore } = mockFetchSequence(sequence);
|
|
205
|
+
try {
|
|
206
|
+
const result = await runGaiaAgent(FAKE_QUESTION, baseOpts({ maxTurns: 9, planningInterval: 0 }));
|
|
207
|
+
assert.equal(result.replanCount, 0, `Expected 0 replans with interval=0, got ${result.replanCount}`);
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
restore();
|
|
211
|
+
}
|
|
212
|
+
console.log(' PASS test_intervalZero_disabledReplanning');
|
|
213
|
+
}
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
// Test 6: buildPlanningCheckpoint content smoke
|
|
216
|
+
// ---------------------------------------------------------------------------
|
|
217
|
+
function test_buildPlanningCheckpoint_content() {
|
|
218
|
+
const text = buildPlanningCheckpoint(4, 12);
|
|
219
|
+
assert.ok(text.includes('[PLANNING CHECKPOINT'), 'Missing checkpoint header');
|
|
220
|
+
assert.ok(text.includes('turn 4/12'), 'Missing turn counter');
|
|
221
|
+
assert.ok(text.includes('4 turns so far'), 'Missing turn count phrase');
|
|
222
|
+
assert.ok(text.includes('switch strategy'), 'Missing strategy-switch instruction');
|
|
223
|
+
assert.ok(text.includes('FINAL_ANSWER'), 'Missing FINAL_ANSWER instruction');
|
|
224
|
+
console.log(' PASS test_buildPlanningCheckpoint_content');
|
|
225
|
+
}
|
|
226
|
+
// ---------------------------------------------------------------------------
|
|
227
|
+
// Test 7: PLANNING_INTERVAL constant equals 4
|
|
228
|
+
// ---------------------------------------------------------------------------
|
|
229
|
+
function test_planningInterval_constant() {
|
|
230
|
+
assert.equal(PLANNING_INTERVAL, 4, `Expected PLANNING_INTERVAL=4, got ${PLANNING_INTERVAL}`);
|
|
231
|
+
console.log(' PASS test_planningInterval_constant');
|
|
232
|
+
}
|
|
233
|
+
// ---------------------------------------------------------------------------
|
|
234
|
+
// Runner
|
|
235
|
+
// ---------------------------------------------------------------------------
|
|
236
|
+
async function main() {
|
|
237
|
+
console.log('\n=== GAIA Agent Planning Interval Smoke Tests ===\n');
|
|
238
|
+
// Synchronous tests first
|
|
239
|
+
test_buildPlanningCheckpoint_content();
|
|
240
|
+
test_planningInterval_constant();
|
|
241
|
+
// Async tests
|
|
242
|
+
await test_twelveToolUseTurns_threeReplans();
|
|
243
|
+
await test_threeToolUseTurns_zeroReplans();
|
|
244
|
+
await test_endTurnAtFive_oneReplan();
|
|
245
|
+
await test_eightToolUseTurns_twoReplans();
|
|
246
|
+
await test_intervalZero_disabledReplanning();
|
|
247
|
+
console.log('\n=== All planning-interval smoke tests PASSED ===\n');
|
|
248
|
+
}
|
|
249
|
+
main().catch((err) => {
|
|
250
|
+
console.error('Planning interval smoke failed:', err);
|
|
251
|
+
process.exit(1);
|
|
252
|
+
});
|
|
253
|
+
//# sourceMappingURL=gaia-agent-planning.smoke.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gaia-agent-planning.smoke.js","sourceRoot":"","sources":["../../../src/benchmarks/gaia-agent-planning.smoke.ts"],"names":[],"mappings":"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"}
|