@elizaos/plugin-lmstudio 2.0.3-beta.6 → 2.0.3-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/browser/index.browser.js +849 -0
  2. package/dist/browser/index.browser.js.map +17 -0
  3. package/dist/browser/index.d.ts +2 -0
  4. package/dist/cjs/index.d.ts +2 -0
  5. package/dist/cjs/index.node.cjs +879 -0
  6. package/dist/cjs/index.node.cjs.map +17 -0
  7. package/dist/node/auto-enable.d.ts +3 -0
  8. package/dist/node/auto-enable.d.ts.map +1 -0
  9. package/dist/node/index.browser.d.ts +8 -0
  10. package/dist/node/index.browser.d.ts.map +1 -0
  11. package/dist/node/index.d.ts +2 -0
  12. package/dist/node/index.d.ts.map +1 -0
  13. package/dist/node/index.node.d.ts +8 -0
  14. package/dist/node/index.node.d.ts.map +1 -0
  15. package/dist/node/index.node.js +849 -0
  16. package/dist/node/index.node.js.map +17 -0
  17. package/dist/node/models/embedding.d.ts +17 -0
  18. package/dist/node/models/embedding.d.ts.map +1 -0
  19. package/dist/node/models/index.d.ts +3 -0
  20. package/dist/node/models/index.d.ts.map +1 -0
  21. package/dist/node/models/text.d.ts +39 -0
  22. package/dist/node/models/text.d.ts.map +1 -0
  23. package/dist/node/plugin.d.ts +13 -0
  24. package/dist/node/plugin.d.ts.map +1 -0
  25. package/dist/node/types/index.d.ts +37 -0
  26. package/dist/node/types/index.d.ts.map +1 -0
  27. package/dist/node/utils/client.d.ts +17 -0
  28. package/dist/node/utils/client.d.ts.map +1 -0
  29. package/dist/node/utils/config.d.ts +37 -0
  30. package/dist/node/utils/config.d.ts.map +1 -0
  31. package/dist/node/utils/detect.d.ts +43 -0
  32. package/dist/node/utils/detect.d.ts.map +1 -0
  33. package/dist/node/utils/index.d.ts +4 -0
  34. package/dist/node/utils/index.d.ts.map +1 -0
  35. package/dist/node/utils/model-usage.d.ts +22 -0
  36. package/dist/node/utils/model-usage.d.ts.map +1 -0
  37. package/dist/node/vitest.config.d.ts +3 -0
  38. package/dist/node/vitest.config.d.ts.map +1 -0
  39. package/package.json +4 -4
@@ -0,0 +1,17 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../plugin.ts", "../../models/embedding.ts", "../../utils/client.ts", "../../utils/config.ts", "../../utils/model-usage.ts", "../../models/text.ts", "../../utils/detect.ts", "../../index.browser.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * `@elizaos/plugin-lmstudio` — LM Studio provider plugin.\n *\n * Mirrors `@elizaos/plugin-ollama`: model-type → handler wiring, init-time\n * detection logging, and a self-describing `autoEnable` block that activates\n * the plugin when LM Studio is reachable.\n *\n * LM Studio is OpenAI-compatible, so the actual byte-on-wire shape lives in\n * `@ai-sdk/openai-compatible` and the handlers are in `models/*`.\n */\n\nimport type {\n GenerateTextParams,\n IAgentRuntime,\n Plugin,\n ProcessEnvLike,\n TextEmbeddingParams,\n TextStreamResult,\n} from \"@elizaos/core\";\nimport { logger, ModelType } from \"@elizaos/core\";\nimport { handleTextEmbedding } from \"./models/embedding\";\nimport {\n handleActionPlanner,\n handleResponseHandler,\n handleTextLarge,\n handleTextMedium,\n handleTextMega,\n handleTextNano,\n handleTextSmall,\n} from \"./models/text\";\nimport { getApiKey, getBaseURL, shouldAutoDetect } from \"./utils/config\";\nimport { detectLMStudio } from \"./utils/detect\";\n\nfunction getProcessEnv(): ProcessEnvLike {\n if (typeof process === \"undefined\" || !process.env) {\n return {};\n }\n return process.env as ProcessEnvLike;\n}\n\nconst env = getProcessEnv();\nconst TEXT_NANO_MODEL_TYPE = ModelType.TEXT_NANO as string;\nconst TEXT_MEDIUM_MODEL_TYPE = ModelType.TEXT_MEDIUM as string;\nconst TEXT_MEGA_MODEL_TYPE = ModelType.TEXT_MEGA as string;\nconst RESPONSE_HANDLER_MODEL_TYPE = ModelType.RESPONSE_HANDLER as string;\nconst ACTION_PLANNER_MODEL_TYPE = ModelType.ACTION_PLANNER as string;\n\nexport const lmStudioPlugin: Plugin = {\n name: \"lmstudio\",\n description: \"LM Studio provider for local LLM inference via the OpenAI-compatible API\",\n autoEnable: {\n envKeys: [\"LMSTUDIO_BASE_URL\"],\n // Auto-enable when LM Studio is reachable at the default localhost endpoint, even\n // without an env var. Mirrors how plugin-ollama auto-detects.\n shouldEnable: async () => {\n try {\n const result = await detectLMStudio({ timeoutMs: 750 });\n return result.available;\n } catch {\n return false;\n }\n },\n },\n\n config: {\n LMSTUDIO_BASE_URL: env.LMSTUDIO_BASE_URL ?? null,\n LMSTUDIO_API_KEY: env.LMSTUDIO_API_KEY ?? null,\n LMSTUDIO_SMALL_MODEL: env.LMSTUDIO_SMALL_MODEL ?? null,\n LMSTUDIO_LARGE_MODEL: env.LMSTUDIO_LARGE_MODEL ?? null,\n LMSTUDIO_EMBEDDING_MODEL: env.LMSTUDIO_EMBEDDING_MODEL ?? null,\n LMSTUDIO_AUTO_DETECT: env.LMSTUDIO_AUTO_DETECT ?? null,\n SMALL_MODEL: env.SMALL_MODEL ?? null,\n LARGE_MODEL: env.LARGE_MODEL ?? null,\n },\n\n async init(_config, runtime) {\n const baseURL = getBaseURL(runtime);\n if (!shouldAutoDetect(runtime)) {\n logger.debug(\"[LMStudio] LMSTUDIO_AUTO_DETECT disabled — skipping init probe.\");\n return;\n }\n\n const apiKey = getApiKey(runtime);\n const result = await detectLMStudio({\n baseURL,\n ...(apiKey ? { apiKey } : {}),\n ...(runtime.fetch ? { fetcher: runtime.fetch } : {}),\n timeoutMs: 2000,\n });\n\n if (!result.available) {\n logger.warn(\n { src: \"plugin:lmstudio\", baseURL, error: result.error },\n \"[LMStudio] /v1/models probe failed — plugin will only succeed once LM Studio is running.\"\n );\n return;\n }\n\n const modelCount = result.models?.length ?? 0;\n logger.info(\n `[LMStudio] Detected ${modelCount} model${modelCount === 1 ? \"\" : \"s\"} at ${baseURL}`\n );\n },\n\n models: {\n [ModelType.TEXT_EMBEDDING]: async (\n runtime: IAgentRuntime,\n params: TextEmbeddingParams | string | null\n ): Promise<number[]> => {\n return handleTextEmbedding(runtime, params);\n },\n\n [TEXT_NANO_MODEL_TYPE]: async (\n runtime: IAgentRuntime,\n params: GenerateTextParams\n ): Promise<string | TextStreamResult> => {\n return handleTextNano(runtime, params);\n },\n\n [ModelType.TEXT_SMALL]: async (\n runtime: IAgentRuntime,\n params: GenerateTextParams\n ): Promise<string | TextStreamResult> => {\n return handleTextSmall(runtime, params);\n },\n\n [TEXT_MEDIUM_MODEL_TYPE]: async (\n runtime: IAgentRuntime,\n params: GenerateTextParams\n ): Promise<string | TextStreamResult> => {\n return handleTextMedium(runtime, params);\n },\n\n [ModelType.TEXT_LARGE]: async (\n runtime: IAgentRuntime,\n params: GenerateTextParams\n ): Promise<string | TextStreamResult> => {\n return handleTextLarge(runtime, params);\n },\n\n [TEXT_MEGA_MODEL_TYPE]: async (\n runtime: IAgentRuntime,\n params: GenerateTextParams\n ): Promise<string | TextStreamResult> => {\n return handleTextMega(runtime, params);\n },\n\n [RESPONSE_HANDLER_MODEL_TYPE]: async (\n runtime: IAgentRuntime,\n params: GenerateTextParams\n ): Promise<string | TextStreamResult> => {\n return handleResponseHandler(runtime, params);\n },\n\n [ACTION_PLANNER_MODEL_TYPE]: async (\n runtime: IAgentRuntime,\n params: GenerateTextParams\n ): Promise<string | TextStreamResult> => {\n return handleActionPlanner(runtime, params);\n },\n },\n\n tests: [\n {\n name: \"lmstudio_plugin_tests\",\n tests: [\n {\n name: \"lmstudio_test_models_endpoint\",\n fn: async (runtime: IAgentRuntime) => {\n const apiKey = getApiKey(runtime);\n const result = await detectLMStudio({\n baseURL: getBaseURL(runtime),\n ...(apiKey ? { apiKey } : {}),\n ...(runtime.fetch ? { fetcher: runtime.fetch } : {}),\n });\n if (!result.available) {\n logger.error({ result }, \"[LMStudio] /v1/models probe failed\");\n return;\n }\n logger.log({ models: result.models?.length ?? 0 }, \"[LMStudio] /v1/models OK\");\n },\n },\n ],\n },\n ],\n};\n",
6
+ "/**\n * Embeddings via LM Studio's OpenAI-compatible `/v1/embeddings` endpoint.\n *\n * LM Studio only exposes embeddings when the user explicitly loads an embedding-capable\n * model (e.g. `nomic-embed-text-v1.5-Q4_K_M`). When `LMSTUDIO_EMBEDDING_MODEL` is unset\n * (no embedding model configured at all), this handler returns a zero vector with a\n * logged warning so a text-only deployment stays alive — embeddings are simply absent,\n * not failing.\n *\n * A real embed failure is different: when the provider is configured but the request\n * errors, this throws (matching `plugin-openai`/`plugin-ollama`/`plugin-elizacloud`).\n * Fabricating a zero vector on error silently poisons the vector store and degrades RAG\n * with no signal — see #9324. Recall callers fail open to keyword search on the throw.\n */\n\nimport type { IAgentRuntime, TextEmbeddingParams } from \"@elizaos/core\";\nimport { logger, ModelType } from \"@elizaos/core\";\nimport { type EmbeddingModel, embed } from \"ai\";\nimport { createLMStudioClient } from \"../utils/client\";\nimport { getEmbeddingModel } from \"../utils/config\";\nimport { emitModelUsed, estimateEmbeddingUsage, normalizeTokenUsage } from \"../utils/model-usage\";\n\nconst DEFAULT_ZERO_VECTOR_DIM = 1536;\n\nfunction extractText(params: TextEmbeddingParams | string | null): string {\n if (params === null) {\n return \"\";\n }\n if (typeof params === \"string\") {\n return params;\n }\n if (typeof params === \"object\" && typeof params.text === \"string\") {\n return params.text;\n }\n return \"\";\n}\n\nexport async function handleTextEmbedding(\n runtime: IAgentRuntime,\n params: TextEmbeddingParams | string | null\n): Promise<number[]> {\n const modelName = getEmbeddingModel(runtime);\n\n if (!modelName) {\n logger.warn(\n \"[LMStudio] LMSTUDIO_EMBEDDING_MODEL not set — returning zero vector. Set it to a loaded embedding model in LM Studio.\"\n );\n return new Array<number>(DEFAULT_ZERO_VECTOR_DIM).fill(0);\n }\n\n let text = extractText(params);\n // Stay within typical embedding context windows (~8k tokens / 4 chars per token).\n const maxChars = 8_000 * 4;\n if (text.length > maxChars) {\n logger.warn(\n `[LMStudio] Embedding input too long (~${Math.ceil(\n text.length / 4\n )} tokens), truncating to ~8000 tokens`\n );\n text = text.slice(0, maxChars);\n }\n\n const embeddingText = text || \"test\";\n\n try {\n const client = createLMStudioClient(runtime);\n const { embedding, usage } = await embed({\n model: client.textEmbeddingModel(modelName) as EmbeddingModel,\n value: embeddingText,\n });\n\n emitModelUsed(\n runtime,\n ModelType.TEXT_EMBEDDING,\n modelName,\n normalizeTokenUsage(usage) ?? estimateEmbeddingUsage(embeddingText)\n );\n return embedding;\n } catch (error) {\n logger.error({ error }, \"[LMStudio] Error generating embedding\");\n throw error;\n }\n}\n",
7
+ "/**\n * AI SDK provider factory for LM Studio.\n *\n * LM Studio's HTTP API is OpenAI-compatible, so we use `@ai-sdk/openai-compatible`\n * (not `@ai-sdk/openai`) — that adapter is purpose-built for OpenAI-shaped servers\n * that don't implement the full OpenAI feature surface (e.g. assistants, image\n * generation), which describes LM Studio exactly.\n *\n * Why a thin wrapper: the AI SDK exposes `createOpenAICompatible` with a `name`,\n * `baseURL`, and optional `apiKey`. Centralizing the factory means tests can mock\n * one entry point, and the auto-detect + init paths share the same client construction.\n */\n\nimport { createOpenAICompatible, type OpenAICompatibleProvider } from \"@ai-sdk/openai-compatible\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport { getApiKey, getBaseURL } from \"./config\";\n\nexport type LMStudioProvider = OpenAICompatibleProvider;\n\nexport function createLMStudioClient(runtime: IAgentRuntime): LMStudioProvider {\n const baseURL = getBaseURL(runtime);\n const apiKey = getApiKey(runtime);\n\n return createOpenAICompatible({\n name: \"lmstudio\",\n baseURL,\n ...(apiKey ? { apiKey } : {}),\n ...(runtime.fetch ? { fetch: runtime.fetch } : {}),\n includeUsage: true,\n });\n}\n",
8
+ "/**\n * Setting resolution for `@elizaos/plugin-lmstudio`.\n *\n * LM Studio is functionally an OpenAI-compatible local server. We resolve settings the\n * same way as the Ollama plugin — runtime first, then `process.env`, then a default —\n * so character overrides, CLI launches, and test harnesses all agree on the same value.\n *\n * The default base URL `http://localhost:1234/v1` matches LM Studio's \"Local Server\" tab\n * out of the box. Callers that put LM Studio behind a proxy can override with\n * `LMSTUDIO_BASE_URL`.\n */\n\ntype SettingsProvider = {\n getSetting: (key: string) => string | number | boolean | null;\n};\n\nexport const DEFAULT_LMSTUDIO_URL = \"http://localhost:1234/v1\";\n\nfunction getEnvValue(key: string): string | undefined {\n if (typeof process === \"undefined\" || !process.env) {\n return undefined;\n }\n const value = process.env[key];\n return value === undefined ? undefined : String(value);\n}\n\nexport function getSetting(\n runtime: SettingsProvider,\n key: string,\n defaultValue?: string\n): string | undefined {\n const value = runtime.getSetting(key);\n if (value !== undefined && value !== null) {\n return String(value);\n }\n return getEnvValue(key) ?? defaultValue;\n}\n\n/**\n * Returns LM Studio's OpenAI-compatible base URL, always including `/v1`.\n *\n * Accepts callers that set `LMSTUDIO_BASE_URL` to either `http://host:1234` or\n * `http://host:1234/v1` — both normalize to the same canonical form so downstream\n * fetch calls don't have to second-guess.\n */\nexport function getBaseURL(runtime: SettingsProvider): string {\n const raw = getSetting(runtime, \"LMSTUDIO_BASE_URL\") ?? DEFAULT_LMSTUDIO_URL;\n const trimmed = raw.trim().replace(/\\/+$/, \"\");\n if (trimmed === \"\") {\n return DEFAULT_LMSTUDIO_URL;\n }\n if (/\\/v\\d+$/.test(trimmed)) {\n return trimmed;\n }\n return `${trimmed}/v1`;\n}\n\n/**\n * Root LM Studio URL (without `/v1`) — used for diagnostics. Mirrors how\n * `plugin-ollama` exposes `getApiBase` so health probes can append\n * their own paths.\n */\nexport function getApiBase(runtime: SettingsProvider): string {\n const baseURL = getBaseURL(runtime);\n return baseURL.replace(/\\/v\\d+$/, \"\");\n}\n\nexport function getApiKey(runtime: SettingsProvider): string | undefined {\n const value = getSetting(runtime, \"LMSTUDIO_API_KEY\");\n if (!value || value.trim() === \"\") {\n return undefined;\n }\n return value.trim();\n}\n\nexport function getSmallModel(runtime: SettingsProvider): string | undefined {\n return (\n getSetting(runtime, \"LMSTUDIO_SMALL_MODEL\") ?? getSetting(runtime, \"SMALL_MODEL\") ?? undefined\n );\n}\n\nexport function getLargeModel(runtime: SettingsProvider): string | undefined {\n return (\n getSetting(runtime, \"LMSTUDIO_LARGE_MODEL\") ?? getSetting(runtime, \"LARGE_MODEL\") ?? undefined\n );\n}\n\nexport function getEmbeddingModel(runtime: SettingsProvider): string | undefined {\n return getSetting(runtime, \"LMSTUDIO_EMBEDDING_MODEL\") ?? undefined;\n}\n\nexport function shouldAutoDetect(runtime: SettingsProvider): boolean {\n const value = getSetting(runtime, \"LMSTUDIO_AUTO_DETECT\", \"true\")?.trim().toLowerCase();\n if (value === undefined || value === \"\") {\n return true;\n }\n return value === \"1\" || value === \"true\" || value === \"yes\" || value === \"on\";\n}\n",
9
+ "/**\n * Token usage normalization and `MODEL_USED` event emission for LM Studio calls.\n *\n * LM Studio's OpenAI-compatible API returns usage with the same field names as\n * OpenAI (`prompt_tokens`, `completion_tokens`, `total_tokens`), while the AI SDK\n * normalizes them to `inputTokens` / `outputTokens` / `totalTokens` before handing\n * them to us. We accept either shape and fall back to a length-based estimate when\n * a model omits usage (some local builds do).\n */\n\nimport type { EventPayload, IAgentRuntime, ModelTypeName } from \"@elizaos/core\";\nimport { EventType } from \"@elizaos/core\";\n\ntype ProviderUsage = {\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n};\n\nexport type NormalizedUsage = {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n estimated?: boolean;\n};\n\nfunction toFiniteNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return undefined;\n }\n return Math.max(0, Math.round(value));\n}\n\nexport function normalizeTokenUsage(usage: unknown): NormalizedUsage | null {\n if (!usage || typeof usage !== \"object\") {\n return null;\n }\n\n const record = usage as ProviderUsage;\n const promptTokens = toFiniteNumber(record.inputTokens ?? record.promptTokens);\n const completionTokens = toFiniteNumber(record.outputTokens ?? record.completionTokens);\n const totalTokens = toFiniteNumber(record.totalTokens);\n\n if (promptTokens === undefined && completionTokens === undefined && totalTokens === undefined) {\n return null;\n }\n\n const normalizedPromptTokens =\n promptTokens ??\n (completionTokens === undefined && totalTokens !== undefined\n ? totalTokens\n : Math.max(0, (totalTokens ?? 0) - (completionTokens ?? 0)));\n const normalizedCompletionTokens =\n completionTokens ??\n Math.max(0, (totalTokens ?? normalizedPromptTokens) - normalizedPromptTokens);\n\n return {\n promptTokens: normalizedPromptTokens,\n completionTokens: normalizedCompletionTokens,\n totalTokens: totalTokens ?? normalizedPromptTokens + normalizedCompletionTokens,\n };\n}\n\nexport function estimateTokenCount(text: string): number {\n return text.length === 0 ? 0 : Math.ceil(text.length / 4);\n}\n\nfunction stringifyForUsage(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport function estimateUsage(prompt: string, response: unknown): NormalizedUsage {\n const promptTokens = estimateTokenCount(prompt);\n const completionTokens = estimateTokenCount(stringifyForUsage(response));\n return {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n estimated: true,\n };\n}\n\nexport function estimateEmbeddingUsage(text: string): NormalizedUsage {\n const promptTokens = estimateTokenCount(text);\n return {\n promptTokens,\n completionTokens: 0,\n totalTokens: promptTokens,\n estimated: true,\n };\n}\n\nexport function emitModelUsed(\n runtime: IAgentRuntime,\n type: ModelTypeName,\n model: string,\n usage: NormalizedUsage\n): void {\n void runtime.emitEvent(\n EventType.MODEL_USED as string,\n {\n runtime,\n source: \"lmstudio\",\n provider: \"lmstudio\",\n type,\n model,\n modelName: model,\n tokens: {\n prompt: usage.promptTokens,\n completion: usage.completionTokens,\n total: usage.totalTokens,\n ...(usage.estimated ? { estimated: true } : {}),\n },\n ...(usage.estimated ? { usageEstimated: true } : {}),\n } as EventPayload\n );\n}\n",
10
+ "/**\n * LM Studio text generation for ElizaOS.\n *\n * ## Why this module looks like Ollama's, not OpenAI's\n *\n * LM Studio is an OpenAI-compatible local server, so the bytes-on-the-wire are very\n * similar to `plugin-openai`. But the orchestration concerns are closer to\n * `plugin-ollama`:\n *\n * - Models are picked up from what the user has loaded locally — there is no canonical\n * \"gpt-4o-class\" identifier. Callers either override per-tier env vars\n * (`LMSTUDIO_SMALL_MODEL`, `LMSTUDIO_LARGE_MODEL`) or we fall back to the first id\n * returned by `GET /v1/models`.\n * - There's no need for the OpenAI plugin's Cerebras / reasoning / image branches.\n *\n * So we mirror Ollama's structure (single `handleTextWithModelType`, structured-output\n * via `Output.object`, optional streaming) but build on `@ai-sdk/openai-compatible`\n * instead of `ollama-ai-provider-v2`.\n *\n * ## Errors\n *\n * `AI_SDK` errors carry `responseBody` / `statusCode` / `url`. `summarizeAiSdkError`\n * surfaces these so operators get LM Studio's actual response body in logs instead\n * of a generic \"Internal Server Error\" — local servers commonly fail with \"no model\n * loaded\" or OOM, both of which are only visible in the body.\n */\n\nimport type {\n GenerateTextParams,\n GenerateTextResult,\n IAgentRuntime,\n ModelTypeName,\n TextStreamResult,\n TokenUsage,\n ToolCall,\n} from \"@elizaos/core\";\nimport {\n buildCanonicalSystemPrompt,\n dropDuplicateLeadingSystemMessage,\n logger,\n ModelType,\n renderChatMessagesForPrompt,\n resolveEffectiveSystemPrompt,\n} from \"@elizaos/core\";\nimport {\n generateText,\n type JSONSchema7,\n jsonSchema,\n type LanguageModel,\n type ModelMessage,\n Output,\n streamText,\n type ToolChoice,\n type ToolSet,\n type UserContent,\n} from \"ai\";\nimport type { LMStudioModelInfo } from \"../types\";\nimport { createLMStudioClient } from \"../utils/client\";\nimport { getBaseURL, getLargeModel, getSmallModel } from \"../utils/config\";\nimport { detectLMStudio } from \"../utils/detect\";\nimport { emitModelUsed, estimateUsage, normalizeTokenUsage } from \"../utils/model-usage\";\n\nconst TEXT_NANO_MODEL_TYPE = ModelType.TEXT_NANO as ModelTypeName;\nconst TEXT_MEDIUM_MODEL_TYPE = ModelType.TEXT_MEDIUM as ModelTypeName;\nconst TEXT_MEGA_MODEL_TYPE = ModelType.TEXT_MEGA as ModelTypeName;\nconst RESPONSE_HANDLER_MODEL_TYPE = ModelType.RESPONSE_HANDLER as ModelTypeName;\nconst ACTION_PLANNER_MODEL_TYPE = ModelType.ACTION_PLANNER as ModelTypeName;\n\ntype TextModelType =\n | typeof TEXT_NANO_MODEL_TYPE\n | typeof ModelType.TEXT_SMALL\n | typeof TEXT_MEDIUM_MODEL_TYPE\n | typeof ModelType.TEXT_LARGE\n | typeof TEXT_MEGA_MODEL_TYPE\n | typeof RESPONSE_HANDLER_MODEL_TYPE\n | typeof ACTION_PLANNER_MODEL_TYPE;\n\n/**\n * `GenerateTextParams` widened with the fields ElizaOS core sends alongside the documented\n * prompt parameters — messages, tools, toolChoice and an optional response schema. Typed\n * loosely (matching plugin-ollama) because callers cross several runtime versions.\n */\ntype GenerateTextParamsWithNativeOptions = Omit<GenerateTextParams, \"responseSchema\"> & {\n messages?: unknown[];\n tools?: unknown;\n toolChoice?: unknown;\n responseSchema?: unknown;\n};\n\ntype NativeTextOutput = NonNullable<Parameters<typeof generateText>[0][\"output\"]>;\ntype NativeTextModelResult = string & GenerateTextResult;\n\nconst _firstModelIdCache = new WeakMap<IAgentRuntime, Promise<string | null>>();\n\n/**\n * Resolves a model identifier for a given tier. Order of resolution:\n *\n * 1. `LMSTUDIO_<TIER>_MODEL` env (e.g. `LMSTUDIO_SMALL_MODEL`).\n * 2. Generic `<TIER>_MODEL` env fallback.\n * 3. First model returned by `GET /v1/models` — LM Studio always returns at least the\n * currently-loaded model, so this gives a useful default without per-install config.\n *\n * The detection result is cached per runtime so we don't hit `/v1/models` on every call.\n */\nasync function resolveModelForType(\n runtime: IAgentRuntime,\n modelType: TextModelType\n): Promise<string> {\n // Tier-specific overrides win.\n if (\n modelType === ModelType.TEXT_LARGE ||\n modelType === TEXT_MEGA_MODEL_TYPE ||\n modelType === ACTION_PLANNER_MODEL_TYPE\n ) {\n const large = getLargeModel(runtime);\n if (large) return large;\n } else {\n const small = getSmallModel(runtime);\n if (small) return small;\n }\n\n // Fall back to LM Studio's first reported model.\n let pending = _firstModelIdCache.get(runtime);\n if (!pending) {\n pending = (async (): Promise<string | null> => {\n const result = await detectLMStudio({\n baseURL: getBaseURL(runtime),\n ...(runtime.fetch ? { fetcher: runtime.fetch } : {}),\n });\n if (!result.available || !result.models || result.models.length === 0) {\n return null;\n }\n const first: LMStudioModelInfo = result.models[0] as LMStudioModelInfo;\n return first.id;\n })();\n _firstModelIdCache.set(runtime, pending);\n }\n\n const resolved = await pending;\n if (resolved) {\n return resolved;\n }\n\n throw new Error(\n \"[LMStudio] No model configured and `GET /v1/models` returned no entries. Set LMSTUDIO_SMALL_MODEL / LMSTUDIO_LARGE_MODEL or load a model in LM Studio.\"\n );\n}\n\nfunction summarizeAiSdkError(error: unknown, depth = 0): Record<string, unknown> {\n if (depth > 4) {\n return { note: \"max depth summarizing nested error\" };\n }\n if (error == null) {\n return { raw: String(error) };\n }\n if (typeof error !== \"object\") {\n return { message: String(error) };\n }\n const e = error as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n if (typeof e.name === \"string\") out.errorName = e.name;\n if (typeof e.message === \"string\") out.message = e.message;\n if (typeof e.url === \"string\") out.requestUrl = e.url;\n if (typeof e.statusCode === \"number\") out.httpStatus = e.statusCode;\n if (typeof e.responseBody === \"string\") out.lmstudioResponseBody = e.responseBody;\n if (e.cause != null && typeof e.cause === \"object\") {\n out.cause = summarizeAiSdkError(e.cause, depth + 1);\n }\n return out;\n}\n\nfunction logTextFailure(\n phase: \"generateText\" | \"streamText.textStream\",\n modelType: TextModelType,\n modelId: string,\n endpoint: string,\n error: unknown\n): void {\n logger.error(\n {\n src: \"plugin:lmstudio:text\",\n phase,\n modelType,\n modelId,\n lmstudioBaseURL: endpoint,\n ...summarizeAiSdkError(error),\n },\n `[LMStudio] ${phase} failed (${modelType}, model=${modelId}).`\n );\n}\n\nfunction buildStructuredOutput(responseSchema: unknown): NativeTextOutput {\n if (\n responseSchema &&\n typeof responseSchema === \"object\" &&\n \"responseFormat\" in responseSchema &&\n \"parseCompleteOutput\" in responseSchema\n ) {\n return responseSchema as NativeTextOutput;\n }\n\n const schemaOptions =\n responseSchema && typeof responseSchema === \"object\" && \"schema\" in responseSchema\n ? (responseSchema as { schema: unknown; name?: string; description?: string })\n : { schema: responseSchema };\n\n return Output.object({\n schema: jsonSchema(schemaOptions.schema as JSONSchema7),\n ...(schemaOptions.name ? { name: schemaOptions.name } : {}),\n ...(schemaOptions.description ? { description: schemaOptions.description } : {}),\n }) as NativeTextOutput;\n}\n\nfunction serializeStructuredResult(result: { text: string; output: unknown }): string {\n if (result.output !== undefined && result.output !== null) {\n return typeof result.output === \"string\" ? result.output : JSON.stringify(result.output);\n }\n const trimmed = result.text.trim();\n if (trimmed) return trimmed;\n throw new Error(\"[LMStudio] Structured generation returned no text or output.\");\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction firstString(...values: unknown[]): string | undefined {\n for (const value of values) {\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction parseJsonIfPossible(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\nfunction inferJsonSchemaType(schema: Record<string, unknown>, isRoot: boolean): string | undefined {\n if (\"items\" in schema && !(\"properties\" in schema)) {\n return \"array\";\n }\n if (\n \"properties\" in schema ||\n \"required\" in schema ||\n \"additionalProperties\" in schema ||\n isRoot\n ) {\n return \"object\";\n }\n if (Array.isArray(schema.enum) && schema.enum.length > 0) {\n const types = new Set(schema.enum.map((value) => typeof value));\n if (types.size === 1) {\n const [type] = [...types];\n if (type === \"string\" || type === \"number\" || type === \"boolean\") {\n return type;\n }\n }\n }\n return undefined;\n}\n\nfunction sanitizeJsonSchema(schema: unknown, isRoot = false): JSONSchema7 {\n if (!schema || typeof schema !== \"object\" || Array.isArray(schema)) {\n return { type: \"object\" };\n }\n\n const record = schema as Record<string, unknown>;\n const sanitized: Record<string, unknown> = { ...record };\n\n if (typeof sanitized.type !== \"string\") {\n const inferredType = inferJsonSchemaType(sanitized, isRoot);\n if (inferredType) {\n sanitized.type = inferredType;\n }\n }\n\n if (\n sanitized.properties &&\n typeof sanitized.properties === \"object\" &&\n !Array.isArray(sanitized.properties)\n ) {\n const properties: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(sanitized.properties as Record<string, unknown>)) {\n properties[key] = sanitizeJsonSchema(value);\n }\n sanitized.properties = properties;\n }\n\n if (sanitized.items) {\n sanitized.items = Array.isArray(sanitized.items)\n ? sanitized.items.map((item) => sanitizeJsonSchema(item))\n : sanitizeJsonSchema(sanitized.items);\n }\n\n for (const unionKey of [\"anyOf\", \"oneOf\", \"allOf\"] as const) {\n const value = sanitized[unionKey];\n if (Array.isArray(value)) {\n sanitized[unionKey] = value.map((item) => sanitizeJsonSchema(item));\n }\n }\n\n return sanitized as JSONSchema7;\n}\n\nexport function normalizeNativeTools(tools: unknown): ToolSet | undefined {\n if (!tools) {\n return undefined;\n }\n if (!Array.isArray(tools)) {\n return tools as ToolSet;\n }\n\n const toolSet: Record<string, unknown> = {};\n for (const rawTool of tools) {\n const tool = asRecord(rawTool);\n const functionTool = asRecord(tool.function);\n const name = firstString(tool.name, functionTool.name);\n\n if (!name) {\n throw new Error(\"[LMStudio] Native tool definition is missing a name.\");\n }\n\n const description = firstString(tool.description, functionTool.description);\n const rawSchema =\n tool.parameters ?? functionTool.parameters ?? ({ type: \"object\" } satisfies JSONSchema7);\n const inputSchema = sanitizeJsonSchema(rawSchema, true);\n\n toolSet[name] = {\n ...(description ? { description } : {}),\n inputSchema: jsonSchema(inputSchema as JSONSchema7),\n };\n }\n return Object.keys(toolSet).length > 0 ? (toolSet as ToolSet) : undefined;\n}\n\nexport function normalizeToolChoice(toolChoice: unknown): ToolChoice<ToolSet> | undefined {\n if (!toolChoice) {\n return undefined;\n }\n if (\n typeof toolChoice === \"string\" &&\n (toolChoice === \"auto\" || toolChoice === \"none\" || toolChoice === \"required\")\n ) {\n return toolChoice;\n }\n const choice = asRecord(toolChoice);\n if (choice.type === \"tool\") {\n const toolName = firstString(choice.toolName, choice.name);\n if (toolName) {\n return { type: \"tool\", toolName };\n }\n }\n if (choice.type === \"function\") {\n const fn = asRecord(choice.function);\n const toolName = firstString(fn.name);\n if (toolName) {\n return { type: \"tool\", toolName };\n }\n }\n return toolChoice as ToolChoice<ToolSet>;\n}\n\nfunction stringifyMessageContent(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (content == null) return \"\";\n if (typeof content === \"object\") {\n try {\n return JSON.stringify(content);\n } catch {\n return \"[unserializable content]\";\n }\n }\n return String(content);\n}\n\nfunction normalizeUserContent(content: unknown): UserContent {\n if (Array.isArray(content)) {\n return content as UserContent;\n }\n return stringifyMessageContent(content);\n}\n\nfunction normalizeNativeMessage(message: unknown): ModelMessage {\n const raw = asRecord(message);\n if (raw.role === \"system\") {\n return {\n role: \"system\",\n content: stringifyMessageContent(raw.content),\n } as ModelMessage;\n }\n if (raw.role === \"assistant\") {\n return {\n role: \"assistant\",\n content: typeof raw.content === \"string\" || Array.isArray(raw.content) ? raw.content : \"\",\n } as ModelMessage;\n }\n if (raw.role === \"tool\") {\n return {\n role: \"tool\",\n content: Array.isArray(raw.content)\n ? raw.content\n : [\n {\n type: \"tool-result\",\n toolCallId: String(firstString(raw.toolCallId, raw.id) ?? \"tool-call\"),\n toolName: String(firstString(raw.toolName, raw.name) ?? \"tool\"),\n output: {\n type: \"text\",\n value: stringifyMessageContent(raw.content),\n },\n },\n ],\n } as ModelMessage;\n }\n return {\n role: \"user\",\n content: normalizeUserContent(raw.content),\n } as ModelMessage;\n}\n\nexport function normalizeNativeMessages(messages: unknown): ModelMessage[] | undefined {\n if (!Array.isArray(messages)) {\n return undefined;\n }\n return messages.map((m) => normalizeNativeMessage(m));\n}\n\nfunction mapToolCalls(toolCalls: unknown[] | undefined): ToolCall[] {\n if (!Array.isArray(toolCalls) || toolCalls.length === 0) {\n return [];\n }\n const out: ToolCall[] = [];\n for (const raw of toolCalls) {\n const r = asRecord(raw);\n const id = String(firstString(r.toolCallId, r.id) ?? \"\");\n const name = String(firstString(r.toolName, r.name) ?? \"\").trim();\n if (!name) continue;\n\n const rawInput = r.input ?? r.arguments ?? r.args;\n let args: Record<string, unknown> | string;\n if (typeof rawInput === \"string\") {\n const parsed = parseJsonIfPossible(rawInput);\n args =\n parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : rawInput;\n } else if (rawInput && typeof rawInput === \"object\" && !Array.isArray(rawInput)) {\n args = rawInput as Record<string, unknown>;\n } else {\n args = {};\n }\n out.push({ id, name, arguments: args } as ToolCall);\n }\n return out;\n}\n\nfunction buildNativeResultCast(\n result: Awaited<ReturnType<typeof generateText>>,\n modelName: string,\n usage: TokenUsage\n): string {\n const payload: GenerateTextResult = {\n text: result.text,\n toolCalls: mapToolCalls(result.toolCalls as unknown[] | undefined),\n finishReason: String(result.finishReason),\n usage,\n providerMetadata: { modelName },\n };\n return payload as NativeTextModelResult;\n}\n\ntype StreamTextParams = Parameters<typeof streamText>[0];\n\nfunction buildStreamResult(args: {\n runtime: IAgentRuntime;\n modelType: TextModelType;\n model: string;\n endpoint: string;\n streamParams: StreamTextParams;\n promptForEstimate: string;\n}): TextStreamResult {\n const streamResult = streamText(args.streamParams);\n const textPromise = Promise.resolve(streamResult.text).catch(() => \"\");\n const finishReasonPromise = Promise.resolve(streamResult.finishReason).catch(\n () => undefined\n ) as Promise<string | undefined>;\n const usagePromise = Promise.resolve(streamResult.usage)\n .then(async (usage) => {\n const fullText = await textPromise;\n const normalized =\n normalizeTokenUsage(usage) ?? estimateUsage(args.promptForEstimate, fullText);\n emitModelUsed(args.runtime, args.modelType, args.model, normalized);\n return normalized;\n })\n .catch(() => undefined);\n\n async function* textStreamWithUsage(): AsyncIterable<string> {\n let completed = false;\n try {\n for await (const chunk of streamResult.textStream) {\n yield chunk;\n }\n completed = true;\n } catch (err) {\n logTextFailure(\"streamText.textStream\", args.modelType, args.model, args.endpoint, err);\n throw err;\n } finally {\n if (completed) {\n await usagePromise.catch(() => undefined);\n }\n }\n }\n\n return {\n textStream: textStreamWithUsage(),\n text: textPromise,\n usage: usagePromise,\n finishReason: finishReasonPromise,\n };\n}\n\nasync function handleTextWithModelType(\n runtime: IAgentRuntime,\n modelType: TextModelType,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n const extended = params as GenerateTextParamsWithNativeOptions;\n const responseSchema = extended.responseSchema;\n const tools = normalizeNativeTools(extended.tools);\n\n const {\n prompt,\n maxTokens = 8192,\n temperature = 0.7,\n frequencyPenalty = 0.7,\n presencePenalty = 0.7,\n } = params;\n\n let modelIdForLog = \"\";\n const baseURL = getBaseURL(runtime);\n\n try {\n const client = createLMStudioClient(runtime);\n const model = await resolveModelForType(runtime, modelType);\n modelIdForLog = model;\n\n logger.log(`[LMStudio] Using ${modelType} model: ${model}`);\n\n const system = resolveEffectiveSystemPrompt({\n params,\n fallback: buildCanonicalSystemPrompt({ character: runtime.character }),\n });\n\n let outputSpec: NativeTextOutput | undefined =\n responseSchema !== undefined && responseSchema !== null\n ? buildStructuredOutput(responseSchema)\n : undefined;\n\n if (tools && outputSpec) {\n logger.debug(\n \"[LMStudio] tools and responseSchema both present — omitting structured output for this call.\"\n );\n outputSpec = undefined;\n }\n\n const wireRaw = dropDuplicateLeadingSystemMessage(\n extended.messages as Parameters<typeof dropDuplicateLeadingSystemMessage>[0],\n system\n );\n const normalizedMessages = normalizeNativeMessages(wireRaw);\n const hasChatMessages = Array.isArray(normalizedMessages) && normalizedMessages.length > 0;\n const toolChoice = tools ? normalizeToolChoice(extended.toolChoice) : undefined;\n const shouldReturnNative = Boolean(\n hasChatMessages || tools || extended.toolChoice || outputSpec !== undefined\n );\n\n const renderedPrompt = hasChatMessages\n ? \"\"\n : (renderChatMessagesForPrompt(params.messages, {\n ...(system ? { omitDuplicateSystem: system } : {}),\n }) ??\n prompt ??\n \"\");\n\n const promptOrMessages = hasChatMessages\n ? { messages: normalizedMessages }\n : { prompt: renderedPrompt };\n\n const resolvedStopSequences =\n Array.isArray(params.stopSequences) && params.stopSequences.length > 0\n ? params.stopSequences\n : undefined;\n\n const promptForUsageEstimate = hasChatMessages\n ? JSON.stringify(normalizedMessages)\n : renderedPrompt;\n\n const baseArgs = {\n model: client(model) as LanguageModel,\n ...promptOrMessages,\n ...(system ? { system } : {}),\n temperature,\n maxOutputTokens: maxTokens,\n frequencyPenalty,\n presencePenalty,\n ...(resolvedStopSequences ? { stopSequences: resolvedStopSequences } : {}),\n ...(tools ? { tools, ...(toolChoice ? { toolChoice } : {}) } : {}),\n ...(outputSpec ? { output: outputSpec } : {}),\n };\n\n // Streaming branches — we only forward via `streamText` when there is no structured\n // output and no toolChoice without tools; structured + streaming combinations vary\n // across LM Studio model engines, so we conservatively go through generateText there.\n if (params.stream && !outputSpec && !(extended.toolChoice && !tools)) {\n return buildStreamResult({\n runtime,\n modelType,\n model,\n endpoint: baseURL,\n streamParams: baseArgs as StreamTextParams,\n promptForEstimate: promptForUsageEstimate,\n });\n }\n\n const result = await generateText(baseArgs);\n const usage =\n normalizeTokenUsage(result.usage) ?? estimateUsage(promptForUsageEstimate, result.text);\n emitModelUsed(runtime, modelType, model, usage);\n\n if (shouldReturnNative) {\n if (outputSpec !== undefined) {\n return serializeStructuredResult(result);\n }\n return buildNativeResultCast(result, model, usage);\n }\n return result.text;\n } catch (error) {\n logTextFailure(\"generateText\", modelType, modelIdForLog || \"(unknown)\", baseURL, error);\n // Throw, never fabricate a reply. A hardcoded \"Error generating text…\" string\n // would be persisted to memory and sent to the user as the agent's response —\n // in the wrong language/voice — and would bypass core's grounded failure-reply\n // path (buildFailureReplyPrompt). The canonical providers all throw here.\n throw error;\n }\n}\n\nexport async function handleTextSmall(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n return handleTextWithModelType(runtime, ModelType.TEXT_SMALL, params);\n}\n\nexport async function handleTextNano(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n return handleTextWithModelType(runtime, TEXT_NANO_MODEL_TYPE, params);\n}\n\nexport async function handleTextMedium(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n return handleTextWithModelType(runtime, TEXT_MEDIUM_MODEL_TYPE, params);\n}\n\nexport async function handleTextLarge(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n return handleTextWithModelType(runtime, ModelType.TEXT_LARGE, params);\n}\n\nexport async function handleTextMega(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n return handleTextWithModelType(runtime, TEXT_MEGA_MODEL_TYPE, params);\n}\n\nexport async function handleResponseHandler(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n return handleTextWithModelType(runtime, RESPONSE_HANDLER_MODEL_TYPE, params);\n}\n\nexport async function handleActionPlanner(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n return handleTextWithModelType(runtime, ACTION_PLANNER_MODEL_TYPE, params);\n}\n",
11
+ "/**\n * LM Studio detection — probes `GET <baseURL>/models` and parses the OpenAI-shaped\n * `{ object: \"list\", data: [...] }` response. The plugin uses this for two things:\n *\n * 1. Init-time logging: warn the operator if LM Studio is configured but unreachable.\n * 2. The auto-enable predicate: turn the plugin on when the local server responds.\n *\n * Detection is kept side-effect free and accepts an injected `fetch` so unit tests\n * can provide a fake implementation without touching network state.\n */\n\nimport type { LMStudioModelInfo, LMStudioModelsResponse } from \"../types\";\nimport { DEFAULT_LMSTUDIO_URL } from \"./config\";\n\nexport interface DetectionOptions {\n baseURL?: string;\n /** Override `fetch` (used by tests and the browser/sandbox build). */\n fetcher?: typeof fetch;\n /** Per-request timeout — LM Studio should answer instantly; bail fast otherwise. */\n timeoutMs?: number;\n /** Optional Bearer token (LM Studio behind an auth proxy). */\n apiKey?: string;\n}\n\nexport interface DetectionResult {\n available: boolean;\n baseURL: string;\n /** Parsed model list when `available` is true. */\n models?: LMStudioModelInfo[];\n /** Last error encountered when `available` is false. */\n error?: string;\n}\n\nfunction normalizeBaseURL(input: string | undefined): string {\n const raw = (input ?? DEFAULT_LMSTUDIO_URL).replace(/\\/+$/, \"\");\n if (/\\/v\\d+$/.test(raw)) {\n return raw;\n }\n return `${raw}/v1`;\n}\n\n/**\n * Parses a `GET /v1/models` response body, defensively against\n * implementations that return a bare array. Returns null when the body\n * is not a recognizable shape.\n */\nexport function parseModelsResponse(body: unknown): LMStudioModelInfo[] | null {\n if (Array.isArray(body)) {\n return body.filter((entry): entry is LMStudioModelInfo => {\n return Boolean(entry) && typeof (entry as LMStudioModelInfo).id === \"string\";\n });\n }\n\n if (body && typeof body === \"object\") {\n const shaped = body as Partial<LMStudioModelsResponse>;\n if (Array.isArray(shaped.data)) {\n return shaped.data.filter((entry): entry is LMStudioModelInfo => {\n return Boolean(entry) && typeof entry.id === \"string\";\n });\n }\n }\n\n return null;\n}\n\n/**\n * Probes the configured LM Studio endpoint. Always returns a result — never throws.\n *\n * Why catch all errors: this helper is called from auto-enable and the plugin `init`\n * hook. A network error during init must not crash the runtime; we surface it via the\n * returned `error` field and let the caller decide what to do.\n */\nexport async function detectLMStudio(options: DetectionOptions = {}): Promise<DetectionResult> {\n const baseURL = normalizeBaseURL(options.baseURL);\n const fetcher = options.fetcher ?? fetch;\n const timeoutMs = options.timeoutMs ?? 1500;\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (options.apiKey) {\n headers.Authorization = `Bearer ${options.apiKey}`;\n }\n\n const response = await fetcher(`${baseURL}/models`, {\n method: \"GET\",\n headers,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n return {\n available: false,\n baseURL,\n error: `HTTP ${response.status} ${response.statusText}`,\n };\n }\n\n const body = (await response.json()) as unknown;\n const models = parseModelsResponse(body);\n if (!models) {\n return {\n available: false,\n baseURL,\n error: \"unexpected /v1/models response shape\",\n };\n }\n\n return { available: true, baseURL, models };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { available: false, baseURL, error: message };\n } finally {\n clearTimeout(timer);\n }\n}\n",
12
+ "import { lmStudioPlugin } from \"./plugin\";\n\nexport * from \"./types\";\nexport * from \"./utils/config\";\nexport * from \"./utils/detect\";\nexport { lmStudioPlugin };\n\nconst defaultLMStudioPlugin = lmStudioPlugin;\n\nexport default defaultLMStudioPlugin;\n"
13
+ ],
14
+ "mappings": "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",
15
+ "debugId": "1609C405BA70E08F64756E2164756E21",
16
+ "names": []
17
+ }
@@ -0,0 +1,2 @@
1
+ export * from '../index';
2
+ export { default } from '../index';
@@ -0,0 +1,2 @@
1
+ export * from '../index';
2
+ export { default } from '../index';