refactor: remove models snapshot feature and related code
- Remove models snapshot UI section from Models page - Delete models API route handler and related logic - Remove models store implementation and exports - Clean up internationalization messages for removed feature - Update main entry point exports to exclude models store
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
export * from './settings';
|
||||
export * from './models';
|
||||
export * from './agents';
|
||||
export * from './chat';
|
||||
export * from './task';
|
||||
|
||||
@@ -1,147 +0,0 @@
|
||||
import { useSyncExternalStore } from 'react';
|
||||
import {
|
||||
DEFAULT_AGENT_ID,
|
||||
DEFAULT_MAIN_SESSION_SUFFIX,
|
||||
buildMainSessionKey,
|
||||
normalizeAgentId,
|
||||
type AgentSummary,
|
||||
type ModelsSnapshot,
|
||||
} from '@runtime/lib/models';
|
||||
import { hostApiFetch } from '../lib/host-api';
|
||||
|
||||
export interface ModelsStoreState {
|
||||
initialized: boolean;
|
||||
loading: boolean;
|
||||
error: string | null;
|
||||
models: AgentSummary[];
|
||||
defaultAgentId: string;
|
||||
defaultProviderAccountId: string | null;
|
||||
defaultModelRef: string | null;
|
||||
mainSessionSuffix: string;
|
||||
}
|
||||
|
||||
const listeners = new Set<() => void>();
|
||||
|
||||
let loadModelsInFlight: Promise<void> | null = null;
|
||||
let state: ModelsStoreState = {
|
||||
initialized: false,
|
||||
loading: false,
|
||||
error: null,
|
||||
models: [],
|
||||
defaultAgentId: DEFAULT_AGENT_ID,
|
||||
defaultProviderAccountId: null,
|
||||
defaultModelRef: null,
|
||||
mainSessionSuffix: DEFAULT_MAIN_SESSION_SUFFIX,
|
||||
};
|
||||
|
||||
function emit(): void {
|
||||
for (const listener of listeners) {
|
||||
listener();
|
||||
}
|
||||
}
|
||||
|
||||
function patchState(patch: Partial<ModelsStoreState>): ModelsStoreState {
|
||||
state = { ...state, ...patch };
|
||||
emit();
|
||||
return state;
|
||||
}
|
||||
|
||||
function sanitizeModel(model: AgentSummary): AgentSummary {
|
||||
const normalizedId = normalizeAgentId(model.id);
|
||||
const normalizedMainSessionKey = model.mainSessionKey || buildMainSessionKey(normalizedId);
|
||||
|
||||
return {
|
||||
id: normalizedId,
|
||||
name: model.name || normalizedId,
|
||||
isDefault: Boolean(model.isDefault),
|
||||
providerAccountId: model.providerAccountId ?? null,
|
||||
modelRef: model.modelRef ?? null,
|
||||
modelDisplay: model.modelDisplay || model.modelRef || model.name || normalizedId,
|
||||
mainSessionKey: normalizedMainSessionKey,
|
||||
vendorId: model.vendorId ?? null,
|
||||
source: model.source,
|
||||
};
|
||||
}
|
||||
|
||||
async function loadModels(): Promise<void> {
|
||||
if (loadModelsInFlight) {
|
||||
await loadModelsInFlight;
|
||||
return;
|
||||
}
|
||||
|
||||
loadModelsInFlight = (async () => {
|
||||
patchState({ loading: true, error: null });
|
||||
|
||||
try {
|
||||
const snapshot = await hostApiFetch<ModelsSnapshot & { success?: boolean }>('/api/models');
|
||||
const models = Array.isArray(snapshot?.models)
|
||||
? snapshot.models.map((model) => sanitizeModel(model))
|
||||
: Array.isArray(snapshot?.agents)
|
||||
? snapshot.agents.map((model) => sanitizeModel(model))
|
||||
: [];
|
||||
|
||||
patchState({
|
||||
initialized: true,
|
||||
loading: false,
|
||||
error: null,
|
||||
models,
|
||||
defaultAgentId: snapshot?.defaultAgentId ? normalizeAgentId(snapshot.defaultAgentId) : DEFAULT_AGENT_ID,
|
||||
defaultProviderAccountId: snapshot?.defaultProviderAccountId ?? null,
|
||||
defaultModelRef: snapshot?.defaultModelRef ?? null,
|
||||
mainSessionSuffix: snapshot?.mainSessionSuffix || DEFAULT_MAIN_SESSION_SUFFIX,
|
||||
});
|
||||
} catch (error) {
|
||||
patchState({
|
||||
initialized: true,
|
||||
loading: false,
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
});
|
||||
}
|
||||
})();
|
||||
|
||||
try {
|
||||
await loadModelsInFlight;
|
||||
} finally {
|
||||
loadModelsInFlight = null;
|
||||
}
|
||||
}
|
||||
|
||||
function subscribe(listener: () => void): () => void {
|
||||
listeners.add(listener);
|
||||
return () => listeners.delete(listener);
|
||||
}
|
||||
|
||||
function getSnapshot(): ModelsStoreState {
|
||||
return state;
|
||||
}
|
||||
|
||||
function getModelById(modelId: string | null | undefined): AgentSummary | undefined {
|
||||
const normalizedId = normalizeAgentId(modelId);
|
||||
return state.models.find((model) => model.id === normalizedId);
|
||||
}
|
||||
|
||||
function resolveMainSessionKey(agentId: string | null | undefined): string {
|
||||
const normalizedId = normalizeAgentId(agentId || state.defaultAgentId);
|
||||
return getModelById(normalizedId)?.mainSessionKey || buildMainSessionKey(normalizedId, state.mainSessionSuffix);
|
||||
}
|
||||
|
||||
function resolveProviderAccountId(agentId: string | null | undefined): string | null {
|
||||
const normalizedId = normalizeAgentId(agentId || state.defaultAgentId);
|
||||
return getModelById(normalizedId)?.providerAccountId ?? state.defaultProviderAccountId;
|
||||
}
|
||||
|
||||
export const modelsStore = {
|
||||
subscribe,
|
||||
getSnapshot,
|
||||
getState: () => state,
|
||||
init: loadModels,
|
||||
load: loadModels,
|
||||
getModelById,
|
||||
resolveMainSessionKey,
|
||||
resolveProviderAccountId,
|
||||
};
|
||||
|
||||
export function useModelsStore<T = ModelsStoreState>(selector?: (state: ModelsStoreState) => T): T {
|
||||
const select = selector ?? ((current: ModelsStoreState) => current as unknown as T);
|
||||
return useSyncExternalStore(subscribe, () => select(getSnapshot()), () => select(getSnapshot()));
|
||||
}
|
||||
Reference in New Issue
Block a user