// Manual facade. Keep loader boundary explicit. import type { ModelDefinitionConfig, ModelProviderConfig, OpenClawConfig, } from "../config/types.js"; import { createLazyFacadeValue as createLazyFacadeRuntimeValue, loadBundledPluginPublicSurfaceModuleSync, } from "./facade-runtime.js"; type LmstudioReasoningCapabilityWire = { allowed_options?: unknown; default?: unknown; }; export type LmstudioModelWire = { type?: "llm" | "embedding"; key?: string; display_name?: string; max_context_length?: number; format?: "gguf" | "mlx" | null; capabilities?: { vision?: boolean; trained_for_tool_use?: boolean; reasoning?: LmstudioReasoningCapabilityWire; }; loaded_instances?: Array<{ id?: string; config?: { context_length?: number; } | null; } | null>; }; export type LmstudioModelBase = { id: string; displayName: string; format: "gguf" | "mlx" | null; vision: boolean; trainedForToolUse: boolean; loaded: boolean; reasoning: boolean; input: Array<"text" | "image">; cost: ModelDefinitionConfig["cost"]; contextWindow: number; contextTokens: number; maxTokens: number; }; export type FetchLmstudioModelsResult = { reachable: boolean; status?: number; models: LmstudioModelWire[]; error?: unknown; }; type FacadeModule = { LMSTUDIO_DEFAULT_BASE_URL: string; LMSTUDIO_DEFAULT_INFERENCE_BASE_URL: string; LMSTUDIO_DEFAULT_EMBEDDING_MODEL: string; LMSTUDIO_PROVIDER_LABEL: string; LMSTUDIO_DEFAULT_API_KEY_ENV_VAR: string; LMSTUDIO_LOCAL_API_KEY_PLACEHOLDER: string; LMSTUDIO_MODEL_PLACEHOLDER: string; LMSTUDIO_DEFAULT_LOAD_CONTEXT_LENGTH: number; LMSTUDIO_DEFAULT_MODEL_ID: string; LMSTUDIO_PROVIDER_ID: string; resolveLmstudioReasoningCapability: (entry: Pick) => boolean; resolveLoadedContextWindow: (entry: Pick) => number | null; resolveLmstudioServerBase: (configuredBaseUrl?: string) => string; resolveLmstudioInferenceBase: (configuredBaseUrl?: string) => string; normalizeLmstudioProviderConfig: (provider: ModelProviderConfig) => ModelProviderConfig; fetchLmstudioModels: (params?: { baseUrl?: string; apiKey?: string; headers?: Record; ssrfPolicy?: unknown; timeoutMs?: number; fetchImpl?: typeof fetch; }) => Promise; mapLmstudioWireEntry: (entry: LmstudioModelWire) => LmstudioModelBase | null; discoverLmstudioModels: (params?: { config?: OpenClawConfig; baseUrl?: string; apiKey?: string; headers?: Record; }) => Promise; ensureLmstudioModelLoaded: (params: Record) => Promise; buildLmstudioAuthHeaders: (params: { apiKey?: string; json?: boolean; headers?: Record; }) => Record | undefined; resolveLmstudioConfiguredApiKey: (params: { config?: OpenClawConfig; env?: NodeJS.ProcessEnv; path?: string; }) => Promise; resolveLmstudioProviderHeaders: (params: { config?: OpenClawConfig; env?: NodeJS.ProcessEnv; headers?: unknown; path?: string; }) => Promise | undefined>; resolveLmstudioRequestContext: (params: { config?: OpenClawConfig; env?: NodeJS.ProcessEnv; headers?: unknown; providerHeaders?: unknown; path?: string; }) => Promise<{ apiKey?: string; headers?: Record; }>; resolveLmstudioRuntimeApiKey: (params: { config?: OpenClawConfig; agentDir?: string; env?: NodeJS.ProcessEnv; headers?: unknown; }) => Promise; }; function loadFacadeModule(): FacadeModule { return loadBundledPluginPublicSurfaceModuleSync({ dirName: "lmstudio", artifactBasename: "runtime-api.js", }); } // Keep defaults inline so importing the runtime facade stays cold until a helper // is actually used. These values are part of the public LM Studio contract. export const LMSTUDIO_DEFAULT_BASE_URL: FacadeModule["LMSTUDIO_DEFAULT_BASE_URL"] = "http://localhost:1234"; export const LMSTUDIO_DEFAULT_INFERENCE_BASE_URL: FacadeModule["LMSTUDIO_DEFAULT_INFERENCE_BASE_URL"] = `${LMSTUDIO_DEFAULT_BASE_URL}/v1`; export const LMSTUDIO_DEFAULT_EMBEDDING_MODEL: FacadeModule["LMSTUDIO_DEFAULT_EMBEDDING_MODEL"] = "text-embedding-nomic-embed-text-v1.5"; export const LMSTUDIO_PROVIDER_LABEL: FacadeModule["LMSTUDIO_PROVIDER_LABEL"] = "LM Studio"; export const LMSTUDIO_DEFAULT_API_KEY_ENV_VAR: FacadeModule["LMSTUDIO_DEFAULT_API_KEY_ENV_VAR"] = "LM_API_TOKEN"; export const LMSTUDIO_LOCAL_API_KEY_PLACEHOLDER: FacadeModule["LMSTUDIO_LOCAL_API_KEY_PLACEHOLDER"] = "lmstudio-local"; export const LMSTUDIO_MODEL_PLACEHOLDER: FacadeModule["LMSTUDIO_MODEL_PLACEHOLDER"] = "model-key-from-api-v1-models"; export const LMSTUDIO_DEFAULT_LOAD_CONTEXT_LENGTH: FacadeModule["LMSTUDIO_DEFAULT_LOAD_CONTEXT_LENGTH"] = 64000; export const LMSTUDIO_DEFAULT_MODEL_ID: FacadeModule["LMSTUDIO_DEFAULT_MODEL_ID"] = "qwen/qwen3.5-9b"; export const LMSTUDIO_PROVIDER_ID: FacadeModule["LMSTUDIO_PROVIDER_ID"] = "lmstudio"; export const resolveLmstudioReasoningCapability: FacadeModule["resolveLmstudioReasoningCapability"] = createLazyFacadeRuntimeValue(loadFacadeModule, "resolveLmstudioReasoningCapability"); export const resolveLoadedContextWindow: FacadeModule["resolveLoadedContextWindow"] = createLazyFacadeRuntimeValue(loadFacadeModule, "resolveLoadedContextWindow"); export const resolveLmstudioServerBase: FacadeModule["resolveLmstudioServerBase"] = createLazyFacadeRuntimeValue(loadFacadeModule, "resolveLmstudioServerBase"); export const resolveLmstudioInferenceBase: FacadeModule["resolveLmstudioInferenceBase"] = createLazyFacadeRuntimeValue(loadFacadeModule, "resolveLmstudioInferenceBase"); export const normalizeLmstudioProviderConfig: FacadeModule["normalizeLmstudioProviderConfig"] = createLazyFacadeRuntimeValue(loadFacadeModule, "normalizeLmstudioProviderConfig"); export const fetchLmstudioModels: FacadeModule["fetchLmstudioModels"] = createLazyFacadeRuntimeValue(loadFacadeModule, "fetchLmstudioModels"); export const mapLmstudioWireEntry: FacadeModule["mapLmstudioWireEntry"] = createLazyFacadeRuntimeValue(loadFacadeModule, "mapLmstudioWireEntry"); export const discoverLmstudioModels: FacadeModule["discoverLmstudioModels"] = createLazyFacadeRuntimeValue(loadFacadeModule, "discoverLmstudioModels"); export const ensureLmstudioModelLoaded: FacadeModule["ensureLmstudioModelLoaded"] = createLazyFacadeRuntimeValue(loadFacadeModule, "ensureLmstudioModelLoaded"); export const buildLmstudioAuthHeaders: FacadeModule["buildLmstudioAuthHeaders"] = createLazyFacadeRuntimeValue(loadFacadeModule, "buildLmstudioAuthHeaders"); export const resolveLmstudioConfiguredApiKey: FacadeModule["resolveLmstudioConfiguredApiKey"] = createLazyFacadeRuntimeValue(loadFacadeModule, "resolveLmstudioConfiguredApiKey"); export const resolveLmstudioProviderHeaders: FacadeModule["resolveLmstudioProviderHeaders"] = createLazyFacadeRuntimeValue(loadFacadeModule, "resolveLmstudioProviderHeaders"); export const resolveLmstudioRequestContext: FacadeModule["resolveLmstudioRequestContext"] = createLazyFacadeRuntimeValue(loadFacadeModule, "resolveLmstudioRequestContext"); export const resolveLmstudioRuntimeApiKey: FacadeModule["resolveLmstudioRuntimeApiKey"] = createLazyFacadeRuntimeValue(loadFacadeModule, "resolveLmstudioRuntimeApiKey");