* Generate a response using a local model. * Routes to the appropriate underlying manager based on the server sentinel.
(
server: string,
messages: LocalLlmMessage[],
onToken?: (token: string) => void,
onReasoningToken?: (token: string) => void,
)
| 565 | * Routes to the appropriate underlying manager based on the server sentinel. |
| 566 | */ |
| 567 | public async generateWithLocalModel( |
| 568 | server: string, |
| 569 | messages: LocalLlmMessage[], |
| 570 | onToken?: (token: string) => void, |
| 571 | onReasoningToken?: (token: string) => void, |
| 572 | ): Promise<string> { |
| 573 | if (server === ModelManager.SKIP_MODEL) { |
| 574 | return ''; |
| 575 | } |
| 576 | |
| 577 | if (server === ModelManager.BROWSER_LOCAL) { |
| 578 | const manager = GemmaModelManager.getInstance(); |
| 579 | if (!manager.isReady()) { |
| 580 | throw new Error('Transformers.js model not loaded'); |
| 581 | } |
| 582 | const enableThinking = manager.getState().loadSettings?.enableThinking ?? false; |
| 583 | return manager.generate(messages, onToken, enableThinking, onReasoningToken); |
| 584 | } |
| 585 | |
| 586 | if (server === ModelManager.LLAMA_CPP_LOCAL && isTauri()) { |
| 587 | const manager = NativeLlmManager.getInstance(); |
| 588 | if (!manager.isReady()) { |
| 589 | throw new Error('llama.cpp model not loaded'); |
| 590 | } |
| 591 | const enableThinking = manager.getState().enableThinking; |
| 592 | if (!enableThinking || !onReasoningToken) { |
| 593 | return manager.generate(messages, onToken); |
| 594 | } |
| 595 | // Route thinking tokens to onReasoningToken, answer tokens to onToken. |
| 596 | // Accumulate answer tokens — manager.generate returns the raw backend string which |
| 597 | // still contains the thinking delimiters, so we can't use it directly. |
| 598 | let answer = ''; |
| 599 | const collectAndForward = (t: string) => { answer += t; onToken?.(t); }; |
| 600 | const router = makeLlamaCppThinkingRouter(collectAndForward, onReasoningToken); |
| 601 | await manager.generate(messages, router); |
| 602 | router.flush(); |
| 603 | return answer; |
| 604 | } |
| 605 | |
| 606 | throw new Error(`Cannot generate: unsupported server type "${server}"`); |
| 607 | } |
| 608 | |
| 609 | // =========================================================================== |
| 610 | // Per-Model Inference Params (remote models only — local models use their own settings) |
no test coverage detected