From 9bc1f74978c971f675a2c7486164093692342ef4 Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Tue, 20 Jan 2026 02:51:52 +0000 Subject: [PATCH] feat(test): enable native tool calling for GPT-OSS invoice extraction - Update smartai to v0.13.2 (native tool calling support) - Update smartagent to v1.5.1 (useNativeToolCalling option) - Enable think: true for GPT-OSS reasoning mode in Ollama config - Enable useNativeToolCalling: true in DualAgentOrchestrator - Simplify driver system message (native tools don't need XML instructions) Native tool calling uses Ollama's built-in Harmony format parser instead of requiring XML generation, which is more efficient for GPT-OSS models. --- package.json | 4 ++-- pnpm-lock.yaml | 22 +++++++++++----------- test/test.invoices.nanonets.ts | 23 +++++++++-------------- 3 files changed, 22 insertions(+), 27 deletions(-) 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') {