mirror of
https://github.com/open-jarvis/OpenJarvis.git
synced 2026-08-14 00:47:52 +00:00
* fix: never auto-select embed-only models for chat Ollama lists nomic-embed-text alongside chat models. Auto-picking models[0] / recommending the only available id selected the embedder and every generation failed with HTTP 400 "does not support chat". - Filter embed-only ids out of GET /v1/models (chat picker) - Exclude them from /v1/recommended-model; return empty when none left - Frontend setModels prefers chat models and clears a bad embed selection - Regression tests for mixed, embed-only, and classifier cases * fix: harden chat model capability filtering --------- Co-authored-by: Elliot Slusky <elliot@slusky.com>
65 lines
1.7 KiB
TypeScript
65 lines
1.7 KiB
TypeScript
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
|
|
import type { ModelInfo } from '../types';
|
|
|
|
class MemoryStorage {
|
|
private store = new Map<string, string>();
|
|
|
|
getItem(key: string): string | null {
|
|
return this.store.get(key) ?? null;
|
|
}
|
|
|
|
setItem(key: string, value: string): void {
|
|
this.store.set(key, String(value));
|
|
}
|
|
}
|
|
|
|
const model = (id: string): ModelInfo => ({
|
|
id,
|
|
object: 'model',
|
|
created: 0,
|
|
owned_by: 'openjarvis',
|
|
});
|
|
|
|
beforeEach(() => {
|
|
vi.resetModules();
|
|
(globalThis as unknown as { localStorage: MemoryStorage }).localStorage =
|
|
new MemoryStorage();
|
|
});
|
|
|
|
afterEach(() => {
|
|
(globalThis as unknown as { localStorage?: MemoryStorage }).localStorage =
|
|
undefined;
|
|
});
|
|
|
|
describe('setModels', () => {
|
|
it('does not select an embedding-only model', async () => {
|
|
const { useAppStore } = await import('./store');
|
|
|
|
useAppStore.getState().setModels([model('nomic-embed-text')]);
|
|
|
|
expect(useAppStore.getState().selectedModel).toBe('');
|
|
});
|
|
|
|
it('clears a missing selection when no chat fallback exists', async () => {
|
|
const { useAppStore } = await import('./store');
|
|
useAppStore.getState().setSelectedModel('deleted-chat-model');
|
|
|
|
useAppStore.getState().setModels([model('nomic-embed-text')]);
|
|
|
|
expect(useAppStore.getState().selectedModel).toBe('');
|
|
});
|
|
|
|
it('replaces an embedding selection with an available chat model', async () => {
|
|
const { useAppStore } = await import('./store');
|
|
useAppStore.getState().setSelectedModel('all-minilm:latest');
|
|
|
|
useAppStore.getState().setModels([
|
|
model('all-minilm:latest'),
|
|
model('qwen3.5:4b'),
|
|
]);
|
|
|
|
expect(useAppStore.getState().selectedModel).toBe('qwen3.5:4b');
|
|
});
|
|
});
|