diff --git a/package.json b/package.json
index 1c4133e..bc670cf 100644
--- a/package.json
+++ b/package.json
@@ -15,8 +15,8 @@
"devDependencies": {
"@git.zone/tsrun": "^2.0.1",
"@git.zone/tstest": "^3.1.5",
- "@push.rocks/smartagent": "^1.3.0",
- "@push.rocks/smartai": "^0.12.0"
+ "@push.rocks/smartagent": "^1.5.1",
+ "@push.rocks/smartai": "^0.13.2"
},
"repository": {
"type": "git",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0c87b95..ce340e7 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -19,11 +19,11 @@ importers:
specifier: ^3.1.5
version: 3.1.6(socks@2.8.7)(typescript@5.9.3)
'@push.rocks/smartagent':
- specifier: ^1.3.0
- version: 1.3.0(typescript@5.9.3)(ws@8.19.0)(zod@3.25.76)
+ specifier: ^1.5.1
+ version: 1.5.1(typescript@5.9.3)(ws@8.19.0)(zod@3.25.76)
'@push.rocks/smartai':
- specifier: ^0.12.0
- version: 0.12.0(typescript@5.9.3)(ws@8.19.0)(zod@3.25.76)
+ specifier: ^0.13.2
+ version: 0.13.2(typescript@5.9.3)(ws@8.19.0)(zod@3.25.76)
packages:
@@ -868,11 +868,11 @@ packages:
'@push.rocks/qenv@6.1.3':
resolution: {integrity: sha512-+z2hsAU/7CIgpYLFqvda8cn9rUBMHqLdQLjsFfRn5jPoD7dJ5rFlpkbhfM4Ws8mHMniwWaxGKo+q/YBhtzRBLg==}
- '@push.rocks/smartagent@1.3.0':
- resolution: {integrity: sha512-MuiJVJcl9Pdr03k1zVwgxTqprbIHKwqPqXdOmYFYn0xYnixOX1tBUYkGsu6xIntXq8t4WazBJiF9hCiMpDTiRA==}
+ '@push.rocks/smartagent@1.5.1':
+ resolution: {integrity: sha512-NQF5RRvSqmUAP9gbpwAzRaJ9pDSgyoc9vs9iewy0cXysZ1TavIHRXvNai6K1G8F8jLbLPf+M5zTh889x2jBf7w==}
- '@push.rocks/smartai@0.12.0':
- resolution: {integrity: sha512-T4HRaSSxO6TQGGXlQeswX2eYkB+gMu0FbKF9qCUri6FdRlYzmPDn19jgPrPJxyg5m3oj6TzflvfYwcBCFlWo/A==}
+ '@push.rocks/smartai@0.13.2':
+ resolution: {integrity: sha512-FqnHh31tU0Nkr/g25UMAjjE7gZVN8cuioRlSq1xo19rS9kyMiux+UzpylO2tgXF5S+lTsw5cGtfP0BUfrxlTGg==}
'@push.rocks/smartarchive@5.2.1':
resolution: {integrity: sha512-TNv5q6QuBRX7jrzffiyb6A8AALNAr0kyAcJswa0l3ahBP1Q6zszNo9xOVXmW2gKX2KShtO/Y+Cn0i46n8lbnaQ==}
@@ -5206,9 +5206,9 @@ snapshots:
'@push.rocks/smartlog': 3.1.10
'@push.rocks/smartpath': 6.0.0
- '@push.rocks/smartagent@1.3.0(typescript@5.9.3)(ws@8.19.0)(zod@3.25.76)':
+ '@push.rocks/smartagent@1.5.1(typescript@5.9.3)(ws@8.19.0)(zod@3.25.76)':
dependencies:
- '@push.rocks/smartai': 0.12.0(typescript@5.9.3)(ws@8.19.0)(zod@3.25.76)
+ '@push.rocks/smartai': 0.13.2(typescript@5.9.3)(ws@8.19.0)(zod@3.25.76)
'@push.rocks/smartbrowser': 2.0.8(typescript@5.9.3)
'@push.rocks/smartdeno': 1.2.0
'@push.rocks/smartfs': 1.3.1
@@ -5230,7 +5230,7 @@ snapshots:
- ws
- zod
- '@push.rocks/smartai@0.12.0(typescript@5.9.3)(ws@8.19.0)(zod@3.25.76)':
+ '@push.rocks/smartai@0.13.2(typescript@5.9.3)(ws@8.19.0)(zod@3.25.76)':
dependencies:
'@anthropic-ai/sdk': 0.71.2(zod@3.25.76)
'@mistralai/mistralai': 1.12.0
diff --git a/test/test.invoices.nanonets.ts b/test/test.invoices.nanonets.ts
index f0c8dae..54fbbc5 100644
--- a/test/test.invoices.nanonets.ts
+++ b/test/test.invoices.nanonets.ts
@@ -30,8 +30,10 @@ const smartAi = new SmartAi({
baseUrl: OLLAMA_URL,
model: EXTRACTION_MODEL,
defaultOptions: {
- num_ctx: 32768, // Larger context for long invoices + thinking
- temperature: 0, // Deterministic for JSON extraction
+ num_ctx: 65536, // 64K context for long invoices + reasoning chains
+ temperature: 0, // Deterministic for JSON extraction
+ repeat_penalty: 1.3, // Penalty to prevent repetition loops
+ think: true, // Enable thinking mode for GPT-OSS reasoning
},
defaultTimeout: 600000, // 10 minute timeout for large documents
},
@@ -636,7 +638,7 @@ tap.test('Stage 2: Setup Ollama + GPT-OSS 20B', async () => {
console.log(' [SmartAgent] Starting SmartAi...');
await smartAi.start();
- console.log(' [SmartAgent] Creating DualAgentOrchestrator...');
+ console.log(' [SmartAgent] Creating DualAgentOrchestrator with native tool calling...');
orchestrator = new DualAgentOrchestrator({
smartAiInstance: smartAi,
defaultProvider: 'ollama',
@@ -652,18 +654,11 @@ tap.test('Stage 2: Setup Ollama + GPT-OSS 20B', async () => {
CRITICAL RULES:
1. Output valid JSON with the exact format requested
2. If you cannot find a value, use empty string "" or 0 for numbers
-3. IMPORTANT: Before completing, validate your JSON using the json.validate tool:
-
-
- json
- validate
- {"jsonString": "YOUR_JSON", "requiredFields": ["invoice_number", "invoice_date", "vendor_name", "currency", "net_amount", "vat_amount", "total_amount"]}
-
-
-4. Only complete after validation passes
-
-When done, wrap your JSON in tags.`,
+3. Before completing, validate your JSON using the json_validate tool
+4. Only complete after validation passes`,
maxIterations: 5,
+ // Enable native tool calling for GPT-OSS (uses Harmony format instead of XML)
+ useNativeToolCalling: true,
// Enable streaming for real-time progress visibility
onToken: (token, source) => {
if (source === 'driver') {