From 9aaf28b00e6f3300add1da56e7997c0913a7fe2c Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 11 Oct 2026 20:21:03 +0200 Subject: [PATCH 1/4] Bugfix/required tool call in AI agent (#8136) Fix required tool call in AI agent --- apps/api/src/app/endpoints/ai/ai.service.spec.ts | 3 ++- apps/api/src/app/endpoints/ai/ai.service.ts | 10 ++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/apps/api/src/app/endpoints/ai/ai.service.spec.ts b/apps/api/src/app/endpoints/ai/ai.service.spec.ts index b2bb63addc..25ca009416 100644 --- a/apps/api/src/app/endpoints/ai/ai.service.spec.ts +++ b/apps/api/src/app/endpoints/ai/ai.service.spec.ts @@ -892,7 +892,7 @@ describe('AiService', () => { }); }); - it('Restricts the routing to endpoints with zero data retention, limits the number of steps, requires a tool call in the first step and allows no tool call in the last step', async () => { + it('Restricts the routing to endpoints with zero data retention, disables the reasoning, limits the number of steps, requires a tool call in the first step and allows no tool call in the last step', async () => { mockRowMatches({}); await aiService.getActivitiesFromRows({ @@ -905,6 +905,7 @@ describe('AiService', () => { expect(chat).toHaveBeenCalledWith('agent-model', { provider: { require_parameters: true, zdr: true }, + reasoning: { effort: 'none' }, usage: { include: true } }); diff --git a/apps/api/src/app/endpoints/ai/ai.service.ts b/apps/api/src/app/endpoints/ai/ai.service.ts index 3c30ea8e15..6bd88fc344 100644 --- a/apps/api/src/app/endpoints/ai/ai.service.ts +++ b/apps/api/src/app/endpoints/ai/ai.service.ts @@ -517,10 +517,11 @@ export class AiService { * tools search-asset-profiles and get-accounts of the server of the Model * Context Protocol. The accounts are given without values. The first step * requires a tool call, as a model can give the matches without any tool - * call otherwise. The last step allows no tool call, so that the model - * always gives the matches. An asset match whose asset profile no search - * gave is left out, as the import refuses a symbol which the data source - * cannot resolve. + * call otherwise. The reasoning is disabled, as some models ignore a + * required tool call while they reason. The last step allows no tool call, + * so that the model always gives the matches. An asset match whose asset + * profile no search gave is left out, as the import refuses a symbol which + * the data source cannot resolve. */ private async getRowMatches({ abortSignal, @@ -555,6 +556,7 @@ export class AiService { modelPropertyKey: PROPERTY_OPENROUTER_MODEL_AGENT, settings: { provider: { require_parameters: true, zdr: true }, + reasoning: { effort: 'none' }, usage: { include: true } } }), From 867c19f9e1ad00eb15f26f2504434622b2a5aaf8 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 11 Oct 2026 20:23:06 +0200 Subject: [PATCH 2/4] Release 3.84.1 (#8137) --- CHANGELOG.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e6600d7a9..42eda30cdc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## 3.84.0 - 2026-10-11 +## 3.84.1 - 2026-10-11 ### Added diff --git a/package-lock.json b/package-lock.json index c25a043d11..ed3e5c6f11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "3.84.0", + "version": "3.84.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "3.84.0", + "version": "3.84.1", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index e98c418d63..546d0364d8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "3.84.0", + "version": "3.84.1", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 9122858aa0ce411b11e47efe824d000d4bfed418 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 11 Oct 2026 20:54:34 +0200 Subject: [PATCH 3/4] Task/improve performance of reading activities with AI (#8138) Improve performance --- apps/api/src/app/endpoints/ai/ai.service.spec.ts | 3 ++- apps/api/src/app/endpoints/ai/ai.service.ts | 12 +++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/apps/api/src/app/endpoints/ai/ai.service.spec.ts b/apps/api/src/app/endpoints/ai/ai.service.spec.ts index 25ca009416..549bdcef35 100644 --- a/apps/api/src/app/endpoints/ai/ai.service.spec.ts +++ b/apps/api/src/app/endpoints/ai/ai.service.spec.ts @@ -197,7 +197,7 @@ describe('AiService', () => { ); }); - it('Restricts the routing to endpoints with zero data retention and passes a PDF file to the model itself', async () => { + it('Restricts the routing to endpoints with zero data retention, disables the reasoning and passes a PDF file to the model itself', async () => { await aiService.getActivityRowsFromFile({ file: { buffer: Buffer.from('%PDF-1.7'), mediaType: 'application/pdf' }, locale: 'de-CH' @@ -206,6 +206,7 @@ describe('AiService', () => { expect(chat).toHaveBeenCalledWith('vision-model', { plugins: [{ id: 'file-parser', pdf: { engine: 'native' } }], provider: { require_parameters: true, zdr: true }, + reasoning: { effort: 'none' }, usage: { include: true } }); }); diff --git a/apps/api/src/app/endpoints/ai/ai.service.ts b/apps/api/src/app/endpoints/ai/ai.service.ts index 6bd88fc344..006b47a358 100644 --- a/apps/api/src/app/endpoints/ai/ai.service.ts +++ b/apps/api/src/app/endpoints/ai/ai.service.ts @@ -289,11 +289,12 @@ export class AiService { * OpenRouter is not covered by the zero data retention. The model gets no * tools and copies the asset, the account and the broker as printed, hence * the rows still have to be matched to asset profiles and accounts. The - * name of the file is passed as well, as it can name the broker. A row above the - * maximum number of activities is left out. An output which reaches the - * maximum number of output tokens is cut, hence it gives an error for the - * caller. A cut output without any text is not parsed at all, hence the - * finish reason is checked as well. + * name of the file is passed as well, as it can name the broker. The + * reasoning is disabled, as it can add thousands of output tokens even for a + * single row. A row above the maximum number of activities is left out. An + * output which reaches the maximum number of output tokens is cut, hence it + * gives an error for the caller. A cut output without any text is not parsed + * at all, hence the finish reason is checked as well. */ public async getActivityRowsFromFile({ abortSignal, @@ -341,6 +342,7 @@ export class AiService { settings: { plugins: [{ id: 'file-parser', pdf: { engine: 'native' } }], provider: { require_parameters: true, zdr: true }, + reasoning: { effort: 'none' }, usage: { include: true } } }), From b9832e8eff7f8d5bf471fc02ef3ff3766f6bfe67 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 11 Oct 2026 20:56:07 +0200 Subject: [PATCH 4/4] Release 3.84.2 (#8139) --- CHANGELOG.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42eda30cdc..044f8186a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## 3.84.1 - 2026-10-11 +## 3.84.2 - 2026-10-11 ### Added diff --git a/package-lock.json b/package-lock.json index ed3e5c6f11..d9e320d790 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "3.84.1", + "version": "3.84.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "3.84.1", + "version": "3.84.2", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 546d0364d8..9f5005bb03 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "3.84.1", + "version": "3.84.2", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio",