@vibesdotdev/integrations-omlx 0.0.0-stage → 1.0.0-rc.4
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.
- package/LICENSE +126 -0
- package/README.md +14 -2
- package/dist/ai/index.d.ts +5 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +5 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/provider.plugin.d.ts +6 -0
- package/dist/ai/provider.plugin.d.ts.map +1 -0
- package/dist/ai/provider.plugin.js +88 -0
- package/dist/ai/provider.plugin.js.map +1 -0
- package/dist/ai/providers/local/llm/omlx/config/config.omlx.descriptor.d.ts +4206 -0
- package/dist/ai/providers/local/llm/omlx/config/config.omlx.descriptor.d.ts.map +1 -0
- package/dist/ai/providers/local/llm/omlx/config/config.omlx.descriptor.js +53 -0
- package/dist/ai/providers/local/llm/omlx/config/config.omlx.descriptor.js.map +1 -0
- package/dist/ai/providers/local/llm/omlx/config/schemas/index.d.ts +67 -0
- package/dist/ai/providers/local/llm/omlx/config/schemas/index.d.ts.map +1 -0
- package/dist/ai/providers/local/llm/omlx/config/schemas/index.js +39 -0
- package/dist/ai/providers/local/llm/omlx/config/schemas/index.js.map +1 -0
- package/dist/ai/providers/local/llm/omlx/index.d.ts +6 -0
- package/dist/ai/providers/local/llm/omlx/index.d.ts.map +1 -0
- package/dist/ai/providers/local/llm/omlx/index.js +5 -0
- package/dist/ai/providers/local/llm/omlx/index.js.map +1 -0
- package/dist/ai/providers/local/llm/omlx/model-ids.d.ts +19 -0
- package/dist/ai/providers/local/llm/omlx/model-ids.d.ts.map +1 -0
- package/dist/ai/providers/local/llm/omlx/model-ids.js +60 -0
- package/dist/ai/providers/local/llm/omlx/model-ids.js.map +1 -0
- package/dist/ai/providers/local/llm/omlx/provider.omlx.descriptor.d.ts +197 -0
- package/dist/ai/providers/local/llm/omlx/provider.omlx.descriptor.d.ts.map +1 -0
- package/dist/ai/providers/local/llm/omlx/provider.omlx.descriptor.js +177 -0
- package/dist/ai/providers/local/llm/omlx/provider.omlx.descriptor.js.map +1 -0
- package/dist/ai/providers/omlx/detection/index.d.ts +3 -0
- package/dist/ai/providers/omlx/detection/index.d.ts.map +1 -0
- package/dist/ai/providers/omlx/detection/index.js +2 -0
- package/dist/ai/providers/omlx/detection/index.js.map +1 -0
- package/dist/ai/providers/omlx/detection/system.d.ts +19 -0
- package/dist/ai/providers/omlx/detection/system.d.ts.map +1 -0
- package/dist/ai/providers/omlx/detection/system.js +64 -0
- package/dist/ai/providers/omlx/detection/system.js.map +1 -0
- package/dist/ai/providers/omlx/docs/ai.providers.omlx.docs.descriptor.d.ts +4 -0
- package/dist/ai/providers/omlx/docs/ai.providers.omlx.docs.descriptor.d.ts.map +1 -0
- package/dist/ai/providers/omlx/docs/ai.providers.omlx.docs.descriptor.js +39 -0
- package/dist/ai/providers/omlx/docs/ai.providers.omlx.docs.descriptor.js.map +1 -0
- package/dist/ai/providers/omlx/index.d.ts +6 -0
- package/dist/ai/providers/omlx/index.d.ts.map +1 -0
- package/dist/ai/providers/omlx/index.js +6 -0
- package/dist/ai/providers/omlx/index.js.map +1 -0
- package/dist/ai/providers/omlx/omlx.models.d.ts +20 -0
- package/dist/ai/providers/omlx/omlx.models.d.ts.map +1 -0
- package/dist/ai/providers/omlx/omlx.models.js +141 -0
- package/dist/ai/providers/omlx/omlx.models.js.map +1 -0
- package/dist/ai/providers/omlx/omlx.provider.impl.d.ts +54 -0
- package/dist/ai/providers/omlx/omlx.provider.impl.d.ts.map +1 -0
- package/dist/ai/providers/omlx/omlx.provider.impl.js +305 -0
- package/dist/ai/providers/omlx/omlx.provider.impl.js.map +1 -0
- package/dist/ai/providers/omlx/recommendations.d.ts +23 -0
- package/dist/ai/providers/omlx/recommendations.d.ts.map +1 -0
- package/dist/ai/providers/omlx/recommendations.js +111 -0
- package/dist/ai/providers/omlx/recommendations.js.map +1 -0
- package/dist/config/omlx.config.descriptor.d.ts +60 -0
- package/dist/config/omlx.config.descriptor.d.ts.map +1 -0
- package/dist/config/omlx.config.descriptor.js +47 -0
- package/dist/config/omlx.config.descriptor.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/discovery.d.ts +130 -0
- package/dist/schemas/discovery.d.ts.map +1 -0
- package/dist/schemas/discovery.js +51 -0
- package/dist/schemas/discovery.js.map +1 -0
- package/dist/schemas/settings.d.ts +11 -0
- package/dist/schemas/settings.d.ts.map +1 -0
- package/dist/schemas/settings.js +9 -0
- package/dist/schemas/settings.js.map +1 -0
- package/package.json +101 -4
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { CapabilityError, settle } from '@vibesdotdev/kernel';
|
|
2
|
+
import { getVibesAIClient } from '@vibesdotdev/ai/client';
|
|
3
|
+
import { AnyGenerationRequestSchema } from '@vibesdotdev/ai/generation/execution/schemas/request';
|
|
4
|
+
import { GenerationExecutionOptionsSchema } from '@vibesdotdev/ai/generation/execution/schemas/options';
|
|
5
|
+
import { OmlxModelConfigurationSchema } from "../../../schemas/discovery.js";
|
|
6
|
+
import { createAIModelDescriptor } from '@vibesdotdev/ai/models/schemas';
|
|
7
|
+
import { DEFAULT_OMLX_BASE_URL, DEFAULT_OMLX_API_KEY_SECRET, DEFAULT_OMLX_TIMEOUT_MS, OMLX_DISCOVERY_TIMEOUT_MS, omlxConnectionSchema } from "../local/llm/omlx/config/schemas/index.js";
|
|
8
|
+
import { DEFAULT_OMLX_MODEL_ID, OMLX_PREFERRED_WIRE_IDS, preferredOmlxRank, resolveOmlxWireModelId } from "../local/llm/omlx/model-ids.js";
|
|
9
|
+
import { loadOmlxSettings } from "../../../config/omlx.config.descriptor.js";
|
|
10
|
+
import { detectOmlxSystem } from "./detection/system.js";
|
|
11
|
+
import { describeOmlxProbeFailure, inspectOmlxModelReadiness, listOmlxModels, probeOmlxHealth, probeOmlxModels, probeOmlxModelStatus } from "./omlx.models.js";
|
|
12
|
+
function readConfiguredModelId(model) {
|
|
13
|
+
const configured = OmlxModelConfigurationSchema.parse(model.configuration ?? {});
|
|
14
|
+
return configured.modelId ?? model.id;
|
|
15
|
+
}
|
|
16
|
+
function capabilitiesFor(readiness) {
|
|
17
|
+
if (readiness.modelType === 'embedding')
|
|
18
|
+
return ['embedding'];
|
|
19
|
+
if (readiness.modelType === 'audio_stt')
|
|
20
|
+
return ['transcription'];
|
|
21
|
+
if (readiness.modelType === 'vlm' || /vision|vl/i.test(readiness.id))
|
|
22
|
+
return ['vision', 'chat'];
|
|
23
|
+
return ['chat'];
|
|
24
|
+
}
|
|
25
|
+
function scoreDiscoveredModel(model, useCase) {
|
|
26
|
+
const rank = preferredOmlxRank(model.id);
|
|
27
|
+
const loadedBoost = model.state === 'loaded' ? 4 : model.state === 'loading' ? 1 : 0;
|
|
28
|
+
let score = (rank === -1 ? 70 : 97 - rank * 3) + loadedBoost;
|
|
29
|
+
if (useCase === 'development' && rank === 1)
|
|
30
|
+
score += 2;
|
|
31
|
+
if ((useCase === 'chat' || useCase === 'research') && rank === 0)
|
|
32
|
+
score += 2;
|
|
33
|
+
if (useCase === 'organization' && rank === 2)
|
|
34
|
+
score += 2;
|
|
35
|
+
return { score, useCaseFit: score };
|
|
36
|
+
}
|
|
37
|
+
/** Catalog shape for one live oMLX model, keyed by its `/v1/models/status` type. */
|
|
38
|
+
function describeLiveModel(connectionId, model, readiness) {
|
|
39
|
+
const modelType = readiness?.modelType;
|
|
40
|
+
const contextLength = readiness?.contextLength ?? model.maxModelLen;
|
|
41
|
+
const base = {
|
|
42
|
+
id: `omlx:${model.id}`,
|
|
43
|
+
providerId: connectionId,
|
|
44
|
+
name: model.id,
|
|
45
|
+
displayName: model.id,
|
|
46
|
+
description: `Discovered from the running oMLX server${readiness ? ` (${readiness.state})` : ''}`,
|
|
47
|
+
configuration: { modelId: model.id, contextLength },
|
|
48
|
+
tokenLimit: contextLength ?? null,
|
|
49
|
+
hardware: ['consumer'],
|
|
50
|
+
enabled: true,
|
|
51
|
+
tags: ['omlx', 'local']
|
|
52
|
+
};
|
|
53
|
+
if (modelType === 'embedding') {
|
|
54
|
+
return createAIModelDescriptor({
|
|
55
|
+
...base,
|
|
56
|
+
modelType: 'llm_embedding',
|
|
57
|
+
capabilities: ['embedding_generation'],
|
|
58
|
+
modalities: ['embedding']
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (modelType === 'audio_stt') {
|
|
62
|
+
return createAIModelDescriptor({
|
|
63
|
+
...base,
|
|
64
|
+
modelType: 'audio_transcription',
|
|
65
|
+
capabilities: ['audio_transcription'],
|
|
66
|
+
modalities: ['transcription']
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (modelType === 'audio_tts') {
|
|
70
|
+
return createAIModelDescriptor({
|
|
71
|
+
...base,
|
|
72
|
+
modelType: 'audio_tts',
|
|
73
|
+
capabilities: ['audio_generation_text_to_speech'],
|
|
74
|
+
modalities: ['speech', 'audio']
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
const vision = modelType === 'vlm' || /vision|vl/i.test(model.id);
|
|
78
|
+
return createAIModelDescriptor({
|
|
79
|
+
...base,
|
|
80
|
+
modelType: 'llm_chat',
|
|
81
|
+
capabilities: [
|
|
82
|
+
'text_generation',
|
|
83
|
+
'chat_completion',
|
|
84
|
+
'function_calling',
|
|
85
|
+
'code_generation',
|
|
86
|
+
...(vision ? ['image_understanding'] : [])
|
|
87
|
+
],
|
|
88
|
+
modalities: ['text']
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
export class OmlxProviderType {
|
|
92
|
+
descriptor;
|
|
93
|
+
context;
|
|
94
|
+
services;
|
|
95
|
+
constructor(descriptor, context, services = { fetch: globalThis.fetch.bind(globalThis) }) {
|
|
96
|
+
this.descriptor = descriptor;
|
|
97
|
+
this.context = context;
|
|
98
|
+
this.services = services;
|
|
99
|
+
}
|
|
100
|
+
async generate(provider, model, request, options) {
|
|
101
|
+
const configuration = await this.connection(provider.configuration ?? {});
|
|
102
|
+
const wireId = resolveOmlxWireModelId(readConfiguredModelId(model));
|
|
103
|
+
const client = await getVibesAIClient(this.context.runtime);
|
|
104
|
+
const input = AnyGenerationRequestSchema.parse({
|
|
105
|
+
...request, modality: request.modality ?? model.modalities[0],
|
|
106
|
+
provider: { ...provider, configuration: { ...provider.configuration, ...configuration } },
|
|
107
|
+
model: { ...model, configuration: { ...model.configuration, modelId: wireId } }
|
|
108
|
+
});
|
|
109
|
+
const response = await client.requestGeneration(input, GenerationExecutionOptionsSchema.parse(options ?? {}));
|
|
110
|
+
// SAFETY: the AI owner dispatches and returns the response for the request's unchanged modality.
|
|
111
|
+
return { response: response, adapterId: 'runtime', generationMethod: 'runtime' };
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Materialize the connection's `apiKey` REFERENCE into a request credential.
|
|
115
|
+
* Prefers the owner-supplied `resolveCredential` (connection capability);
|
|
116
|
+
* falls back to the provider-type context (generation-time discovery passes
|
|
117
|
+
* no resolver). Returns `undefined` when the connection declares no key.
|
|
118
|
+
* Throws when a declared reference cannot be resolved.
|
|
119
|
+
*/
|
|
120
|
+
async resolveRequestAuth(config, options) {
|
|
121
|
+
if (config.authMethod === 'none' || config.apiKey === undefined)
|
|
122
|
+
return undefined;
|
|
123
|
+
const reference = config.apiKey;
|
|
124
|
+
const resolved = options?.resolveCredential
|
|
125
|
+
? { ok: true, value: await options.resolveCredential(reference) }
|
|
126
|
+
: await this.context.runtime.resolveCredential(reference);
|
|
127
|
+
if (!resolved.ok)
|
|
128
|
+
throw resolved.error;
|
|
129
|
+
if (!resolved.value)
|
|
130
|
+
throw new CapabilityError('oMLX credential is not set', 'UNAVAILABLE', {
|
|
131
|
+
reason: 'credential-not-set'
|
|
132
|
+
});
|
|
133
|
+
return { apiKey: resolved.value };
|
|
134
|
+
}
|
|
135
|
+
async connection(config) {
|
|
136
|
+
const settings = await loadOmlxSettings(this.context.runtime);
|
|
137
|
+
const parsed = omlxConnectionSchema.safeParse({ baseUrl: settings.baseUrl, timeout: settings.timeoutMs, ...config });
|
|
138
|
+
if (!parsed.success)
|
|
139
|
+
throw new CapabilityError('oMLX connection configuration is invalid', 'INVALID_INPUT', {
|
|
140
|
+
reason: 'omlx-invalid-configuration', cause: parsed.error
|
|
141
|
+
});
|
|
142
|
+
return parsed.data;
|
|
143
|
+
}
|
|
144
|
+
async detectInstalled() {
|
|
145
|
+
const detected = await detectOmlxSystem(this.context.runtime, {
|
|
146
|
+
probe: (baseUrl, timeoutMs, auth) => probeOmlxModels(this.context.runtime, baseUrl, this.services, timeoutMs, auth)
|
|
147
|
+
});
|
|
148
|
+
return detected ? [{ name: detected.name, source: 'system', config: detected.configuration ?? {} }] : [];
|
|
149
|
+
}
|
|
150
|
+
async recommendModels(useCase) {
|
|
151
|
+
const config = await this.connection({});
|
|
152
|
+
const credential = await this.context.runtime.resolveCredential({ source: 'secret', key: DEFAULT_OMLX_API_KEY_SECRET });
|
|
153
|
+
if (!credential.ok && credential.error.reason !== 'credential-not-set')
|
|
154
|
+
throw credential.error;
|
|
155
|
+
const auth = credential.ok ? { apiKey: credential.value } : undefined;
|
|
156
|
+
const readiness = await inspectOmlxModelReadiness(this.context.runtime, config.baseUrl, this.services, OMLX_DISCOVERY_TIMEOUT_MS, auth);
|
|
157
|
+
const preferred = new Set(OMLX_PREFERRED_WIRE_IDS);
|
|
158
|
+
const ranked = readiness
|
|
159
|
+
.map((model) => {
|
|
160
|
+
const scores = scoreDiscoveredModel(model, useCase);
|
|
161
|
+
return {
|
|
162
|
+
modelId: model.id,
|
|
163
|
+
modelName: model.id,
|
|
164
|
+
score: scores.score,
|
|
165
|
+
reason: preferred.has(model.id) && model.state === 'loaded'
|
|
166
|
+
? 'Preferred oMLX dogfood model, currently loaded'
|
|
167
|
+
: preferred.has(model.id)
|
|
168
|
+
? 'Preferred oMLX dogfood model'
|
|
169
|
+
: model.state === 'loaded'
|
|
170
|
+
? 'Loaded on the running oMLX server'
|
|
171
|
+
: 'Discovered from the running oMLX server',
|
|
172
|
+
capabilities: capabilitiesFor(model),
|
|
173
|
+
useCaseFit: scores.useCaseFit
|
|
174
|
+
};
|
|
175
|
+
})
|
|
176
|
+
.sort((left, right) => right.score - left.score);
|
|
177
|
+
if (ranked.length > 0)
|
|
178
|
+
return ranked;
|
|
179
|
+
return OMLX_PREFERRED_WIRE_IDS.map((modelId, index) => ({
|
|
180
|
+
modelId,
|
|
181
|
+
modelName: modelId,
|
|
182
|
+
score: 97 - index * 3,
|
|
183
|
+
reason: 'Preferred oMLX dogfood model',
|
|
184
|
+
capabilities: [/vision|vl|flash-next/i.test(modelId) ? 'vision' : 'chat'],
|
|
185
|
+
useCaseFit: 97 - index * 3
|
|
186
|
+
}));
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Live `/v1/models` catalog for one connection, sent with the connection's
|
|
190
|
+
* key when it declares one. A rejected probe THROWS (the catalog exists but
|
|
191
|
+
* could not be read) rather than returning `[]`, which the runtime would
|
|
192
|
+
* treat as an authoritative empty inventory.
|
|
193
|
+
*/
|
|
194
|
+
async listModels(providerInstance, options) {
|
|
195
|
+
const config = await this.connection(providerInstance.configuration ?? {});
|
|
196
|
+
const baseUrl = config.baseUrl;
|
|
197
|
+
const timeout = options?.timeout ?? OMLX_DISCOVERY_TIMEOUT_MS;
|
|
198
|
+
const auth = await this.resolveRequestAuth(config, options);
|
|
199
|
+
const probe = await probeOmlxModels(this.context.runtime, baseUrl, this.services, timeout, auth);
|
|
200
|
+
if (!probe.ok) {
|
|
201
|
+
throw new CapabilityError(describeOmlxProbeFailure(probe, baseUrl, auth !== undefined), 'UNAVAILABLE', {
|
|
202
|
+
reason: `omlx-catalog-${probe.reason}`, cause: probe.cause
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
const status = await probeOmlxModelStatus(this.context.runtime, baseUrl, this.services, timeout, auth);
|
|
206
|
+
const readiness = new Map((status ?? []).map((entry) => [entry.id, entry]));
|
|
207
|
+
const models = probe.models.map((model) => describeLiveModel(providerInstance.id, model, readiness.get(model.id)));
|
|
208
|
+
const modality = options?.modality;
|
|
209
|
+
return modality
|
|
210
|
+
? models.filter((model) => model.modalities.some(value => value === modality))
|
|
211
|
+
: models;
|
|
212
|
+
}
|
|
213
|
+
async listDiscoveredModels(baseUrl = DEFAULT_OMLX_BASE_URL, auth) {
|
|
214
|
+
return listOmlxModels(this.context.runtime, baseUrl, this.services, OMLX_DISCOVERY_TIMEOUT_MS, auth);
|
|
215
|
+
}
|
|
216
|
+
async inspectReadiness(baseUrl = DEFAULT_OMLX_BASE_URL, auth) {
|
|
217
|
+
return inspectOmlxModelReadiness(this.context.runtime, baseUrl, this.services, OMLX_DISCOVERY_TIMEOUT_MS, auth);
|
|
218
|
+
}
|
|
219
|
+
async checkHealth(config, options) {
|
|
220
|
+
const start = Date.now();
|
|
221
|
+
const connection = await this.connection(config);
|
|
222
|
+
const baseUrl = connection.baseUrl;
|
|
223
|
+
const timeout = options?.timeout ?? OMLX_DISCOVERY_TIMEOUT_MS;
|
|
224
|
+
const authResult = await settle(() => this.resolveRequestAuth(connection, options));
|
|
225
|
+
if (!authResult.ok) {
|
|
226
|
+
const failure = new CapabilityError('oMLX credential resolution failed', 'UNAVAILABLE', {
|
|
227
|
+
reason: 'omlx-credential-unavailable', cause: authResult.cause
|
|
228
|
+
});
|
|
229
|
+
const error = { code: 'MISSING_API_KEY', message: failure.message, cause: failure };
|
|
230
|
+
return { healthy: false, latencyMs: Date.now() - start,
|
|
231
|
+
message: 'oMLX API key reference could not be resolved', error, checkedAt: new Date() };
|
|
232
|
+
}
|
|
233
|
+
const auth = authResult.value;
|
|
234
|
+
const health = await probeOmlxHealth(this.context.runtime, baseUrl, this.services, timeout);
|
|
235
|
+
if (health.reachable && !health.ready) {
|
|
236
|
+
return {
|
|
237
|
+
healthy: false,
|
|
238
|
+
latencyMs: Date.now() - start,
|
|
239
|
+
message: health.status === 'loading' ? 'oMLX is loading models' : 'oMLX is not ready',
|
|
240
|
+
error: { code: 'NOT_READY', message: 'oMLX at the configured endpoint is not ready' },
|
|
241
|
+
checkedAt: new Date()
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
// `/health` is open even when `/v1` is key-gated, so the catalog probe is
|
|
245
|
+
// what proves this CONNECTION can actually talk to the server.
|
|
246
|
+
const probe = await probeOmlxModels(this.context.runtime, baseUrl, this.services, timeout, auth);
|
|
247
|
+
if (probe.reason === 'unauthorized') {
|
|
248
|
+
return {
|
|
249
|
+
healthy: false,
|
|
250
|
+
latencyMs: Date.now() - start,
|
|
251
|
+
message: auth ? 'oMLX rejected the configured API key' : 'oMLX requires an API key',
|
|
252
|
+
error: {
|
|
253
|
+
code: auth ? 'API_ERROR' : 'MISSING_API_KEY',
|
|
254
|
+
message: describeOmlxProbeFailure(probe, baseUrl, auth !== undefined)
|
|
255
|
+
},
|
|
256
|
+
checkedAt: new Date()
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
if (health.reachable && health.ready && probe.ok) {
|
|
260
|
+
const loaded = health.loadedCount ?? 0;
|
|
261
|
+
const total = health.modelCount ?? loaded;
|
|
262
|
+
const defaultModel = health.defaultModel ?? DEFAULT_OMLX_MODEL_ID;
|
|
263
|
+
return {
|
|
264
|
+
healthy: true,
|
|
265
|
+
latencyMs: Date.now() - start,
|
|
266
|
+
message: `oMLX is running with ${loaded}/${total} model(s) loaded; default ${defaultModel}`,
|
|
267
|
+
checkedAt: new Date(),
|
|
268
|
+
availableModalities: ['text', 'image', 'embedding', 'transcription', 'audio']
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
if (!probe.ok) {
|
|
272
|
+
return {
|
|
273
|
+
healthy: false,
|
|
274
|
+
latencyMs: Date.now() - start,
|
|
275
|
+
message: 'oMLX is unavailable',
|
|
276
|
+
error: {
|
|
277
|
+
code: probe.reason === 'unreachable' ? 'CONNECTION_ERROR' : 'API_ERROR',
|
|
278
|
+
message: describeOmlxProbeFailure(probe, baseUrl, auth !== undefined)
|
|
279
|
+
},
|
|
280
|
+
checkedAt: new Date()
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
return {
|
|
284
|
+
healthy: true,
|
|
285
|
+
latencyMs: Date.now() - start,
|
|
286
|
+
message: `oMLX is running with ${probe.models.length} model(s)`,
|
|
287
|
+
checkedAt: new Date(),
|
|
288
|
+
availableModalities: ['text']
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
async validateConnection(config) {
|
|
292
|
+
const parsed = omlxConnectionSchema.safeParse(config);
|
|
293
|
+
if (!parsed.success)
|
|
294
|
+
return {
|
|
295
|
+
valid: false,
|
|
296
|
+
errors: parsed.error.issues.map(issue => `Invalid oMLX configuration field: ${issue.path.join('.')}`)
|
|
297
|
+
};
|
|
298
|
+
const hostname = new URL(parsed.data.baseUrl).hostname;
|
|
299
|
+
return { valid: true, warnings: ['localhost', '127.0.0.1', '[::1]'].includes(hostname)
|
|
300
|
+
? undefined : ['Remote oMLX endpoints require an explicit trust decision by the host'] };
|
|
301
|
+
}
|
|
302
|
+
async dispose() { }
|
|
303
|
+
}
|
|
304
|
+
export { DEFAULT_OMLX_TIMEOUT_MS };
|
|
305
|
+
//# sourceMappingURL=omlx.provider.impl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omlx.provider.impl.js","sourceRoot":"","sources":["../../../../src/ai/providers/omlx/omlx.provider.impl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ProviderRecommendation, type ModelAdapter } from '@vibesdotdev/ai/recommendations/base';
|
|
2
|
+
import type { ModelRecommendation, RecommendationContext, ScannedModel, SetupMethod, SetupStep, UseCase } from '@vibesdotdev/ai/recommendations/schemas';
|
|
3
|
+
export declare class OmlxRecommendation extends ProviderRecommendation {
|
|
4
|
+
readonly providerType = "omlx";
|
|
5
|
+
readonly displayName = "oMLX";
|
|
6
|
+
getUseCaseScore(useCase: UseCase): number;
|
|
7
|
+
getRequiredEnvironmentVariables(): string[];
|
|
8
|
+
getReason(): string;
|
|
9
|
+
getStrengths(): string[];
|
|
10
|
+
getWeaknesses(context: RecommendationContext): string[];
|
|
11
|
+
getSupportedSetupMethods(): SetupMethod[];
|
|
12
|
+
getSetupSteps(method: SetupMethod): Promise<SetupStep[]>;
|
|
13
|
+
scanAvailableModels(adapter: ModelAdapter | null): Promise<ScannedModel[]>;
|
|
14
|
+
recommendModels(adapter: ModelAdapter | null, context: RecommendationContext): Promise<ModelRecommendation[]>;
|
|
15
|
+
getExecutionContext(): {
|
|
16
|
+
scanModels: "client";
|
|
17
|
+
getSetupSteps: "both";
|
|
18
|
+
recommendModels: "client";
|
|
19
|
+
};
|
|
20
|
+
supportsLocal(): boolean;
|
|
21
|
+
requiresGPU(): boolean;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=recommendations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommendations.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/omlx/recommendations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,KAAK,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACjG,OAAO,KAAK,EACX,mBAAmB,EACnB,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,SAAS,EACT,OAAO,EACP,MAAM,yCAAyC,CAAC;AAOjD,qBAAa,kBAAmB,SAAQ,sBAAsB;IAC7D,QAAQ,CAAC,YAAY,UAAU;IAC/B,QAAQ,CAAC,WAAW,UAAU;IAC9B,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAKzC,+BAA+B,IAAI,MAAM,EAAE;IAG3C,SAAS,IAAI,MAAM;IAGnB,YAAY,IAAI,MAAM,EAAE;IAQxB,aAAa,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,EAAE;IAKvD,wBAAwB,IAAI,WAAW,EAAE;IAGnC,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAsBxD,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoB1E,eAAe,CACpB,OAAO,EAAE,YAAY,GAAG,IAAI,EAC5B,OAAO,EAAE,qBAAqB,GAC5B,OAAO,CAAC,mBAAmB,EAAE,CAAC;IA2BjC,mBAAmB;;;;;IAOnB,aAAa,IAAI,OAAO;IAGxB,WAAW,IAAI,OAAO;CAGtB"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { ProviderRecommendation } from '@vibesdotdev/ai/recommendations/base';
|
|
2
|
+
import { OMLX_PREFERRED_WIRE_IDS, preferredOmlxRank, resolveOmlxWireModelId } from "../local/llm/omlx/model-ids.js";
|
|
3
|
+
export class OmlxRecommendation extends ProviderRecommendation {
|
|
4
|
+
providerType = 'omlx';
|
|
5
|
+
displayName = 'oMLX';
|
|
6
|
+
getUseCaseScore(useCase) {
|
|
7
|
+
return { chat: 42, development: 44, research: 36, images: 18, video: 0, audio: 12, organization: 22 }[useCase];
|
|
8
|
+
}
|
|
9
|
+
getRequiredEnvironmentVariables() {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
getReason() {
|
|
13
|
+
return 'Local MLX-based desktop inference through oMLX with private data flow and no hosted API credential';
|
|
14
|
+
}
|
|
15
|
+
getStrengths() {
|
|
16
|
+
return [
|
|
17
|
+
'Runs on consumer Apple Silicon hardware',
|
|
18
|
+
'OpenAI-compatible and Anthropic Messages-compatible local HTTP API',
|
|
19
|
+
'Vision, embeddings, transcription, and TTS on the same local origin',
|
|
20
|
+
'No cloud credential'
|
|
21
|
+
];
|
|
22
|
+
}
|
|
23
|
+
getWeaknesses(context) {
|
|
24
|
+
return context.hasGPU
|
|
25
|
+
? ['Performance depends on the local desktop runtime']
|
|
26
|
+
: ['CPU inference can be slow', 'Performance depends on local hardware'];
|
|
27
|
+
}
|
|
28
|
+
getSupportedSetupMethods() {
|
|
29
|
+
return ['local_scan', 'env_var'];
|
|
30
|
+
}
|
|
31
|
+
async getSetupSteps(method) {
|
|
32
|
+
if (method === 'local_scan') {
|
|
33
|
+
return [
|
|
34
|
+
{
|
|
35
|
+
step: 'Install oMLX',
|
|
36
|
+
description: 'Install the oMLX desktop server and start it locally.',
|
|
37
|
+
action: 'http://127.0.0.1:8000'
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
step: 'Load a preferred model',
|
|
41
|
+
description: 'Load Qwen3.8-Flash-Next-oQ8 or Qwen3.5-0.8B-MLX-8bit so /v1/models/status reports it as loaded.'
|
|
42
|
+
}
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
return [
|
|
46
|
+
{
|
|
47
|
+
step: 'Configure host',
|
|
48
|
+
description: 'Set integrations.omlx.baseUrl in runtime configuration when using a custom endpoint.'
|
|
49
|
+
}
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
async scanAvailableModels(adapter) {
|
|
53
|
+
if (!adapter?.listModels) {
|
|
54
|
+
return OMLX_PREFERRED_WIRE_IDS.map((id) => ({
|
|
55
|
+
id,
|
|
56
|
+
name: id,
|
|
57
|
+
recognized: true,
|
|
58
|
+
size: 0,
|
|
59
|
+
modality: [/flash-next/i.test(id) ? 'vision' : 'text'],
|
|
60
|
+
capabilities: [/flash-next/i.test(id) ? 'vision' : 'chat']
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
return (await adapter.listModels()).map((model) => ({
|
|
64
|
+
id: model.id,
|
|
65
|
+
name: model.id,
|
|
66
|
+
recognized: true,
|
|
67
|
+
size: 0,
|
|
68
|
+
modality: [/vision|vl|flash-next/i.test(model.id) ? 'vision' : 'text'],
|
|
69
|
+
capabilities: [/vision|vl|flash-next/i.test(model.id) ? 'vision' : 'chat']
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
async recommendModels(adapter, context) {
|
|
73
|
+
const scanned = await this.scanAvailableModels(adapter);
|
|
74
|
+
return scanned
|
|
75
|
+
.map((model) => {
|
|
76
|
+
const rank = preferredOmlxRank(model.id);
|
|
77
|
+
const score = rank === -1 ? 72 : 97 - rank * 3;
|
|
78
|
+
return {
|
|
79
|
+
modelId: resolveOmlxWireModelId(model.id),
|
|
80
|
+
modelName: model.name,
|
|
81
|
+
score,
|
|
82
|
+
reason: rank === -1
|
|
83
|
+
? 'Discovered from the running oMLX server'
|
|
84
|
+
: 'Preferred oMLX dogfood model',
|
|
85
|
+
capabilities: model.capabilities,
|
|
86
|
+
isAvailable: true,
|
|
87
|
+
requiresUpgrade: false,
|
|
88
|
+
useCaseFit: context.useCase === 'development' && rank === 1
|
|
89
|
+
? score + 2
|
|
90
|
+
: context.useCase === 'chat' && rank === 0
|
|
91
|
+
? score + 2
|
|
92
|
+
: score
|
|
93
|
+
};
|
|
94
|
+
})
|
|
95
|
+
.sort((left, right) => right.score - left.score);
|
|
96
|
+
}
|
|
97
|
+
getExecutionContext() {
|
|
98
|
+
return {
|
|
99
|
+
scanModels: 'client',
|
|
100
|
+
getSetupSteps: 'both',
|
|
101
|
+
recommendModels: 'client'
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
supportsLocal() {
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
requiresGPU() {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=recommendations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommendations.js","sourceRoot":"","sources":["../../../../src/ai/providers/omlx/recommendations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* oMLX settings — the `integrations.omlx` config manifest.
|
|
3
|
+
*/
|
|
4
|
+
import { type RuntimeRef } from '@vibesdotdev/kernel';
|
|
5
|
+
import { type OmlxSettings } from '../schemas/settings.ts';
|
|
6
|
+
export { OMLX_DEFAULT_BASE_URL, OmlxSettingsSchema, type OmlxSettings } from '../schemas/settings.ts';
|
|
7
|
+
export declare const OMLX_SETTINGS_MANIFEST_ID = "integrations.omlx";
|
|
8
|
+
export declare const omlxSettingsManifest: {
|
|
9
|
+
id: string;
|
|
10
|
+
schema: import("zod/v4").ZodObject<{
|
|
11
|
+
baseUrl: import("zod/v4").ZodDefault<import("zod/v4").ZodString>;
|
|
12
|
+
timeoutMs: import("zod/v4").ZodDefault<import("zod/v4").ZodNumber>;
|
|
13
|
+
}, import("zod/v4/core").$strip>;
|
|
14
|
+
};
|
|
15
|
+
export declare function loadOmlxSettings(runtime: RuntimeRef): Promise<OmlxSettings>;
|
|
16
|
+
export declare const omlxSettingsDescriptor: {
|
|
17
|
+
kind: "config/manifest";
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
namespace: string;
|
|
21
|
+
description: string;
|
|
22
|
+
tier: string;
|
|
23
|
+
category: string;
|
|
24
|
+
schema: import("zod/v4").ZodObject<{
|
|
25
|
+
baseUrl: import("zod/v4").ZodDefault<import("zod/v4").ZodString>;
|
|
26
|
+
timeoutMs: import("zod/v4").ZodDefault<import("zod/v4").ZodNumber>;
|
|
27
|
+
}, import("zod/v4/core").$strip>;
|
|
28
|
+
fields: {
|
|
29
|
+
baseUrl: {
|
|
30
|
+
ui: {
|
|
31
|
+
label: string;
|
|
32
|
+
component: string;
|
|
33
|
+
group: string;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
timeoutMs: {
|
|
37
|
+
ui: {
|
|
38
|
+
label: string;
|
|
39
|
+
component: string;
|
|
40
|
+
group: string;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
groups: {
|
|
45
|
+
id: string;
|
|
46
|
+
label: string;
|
|
47
|
+
}[];
|
|
48
|
+
allowedAdapters: string[];
|
|
49
|
+
defaultAdapter: string;
|
|
50
|
+
scope: string;
|
|
51
|
+
customTables: boolean;
|
|
52
|
+
version: number;
|
|
53
|
+
internal: boolean;
|
|
54
|
+
context: {
|
|
55
|
+
surfaces: string[];
|
|
56
|
+
};
|
|
57
|
+
enabled: true;
|
|
58
|
+
};
|
|
59
|
+
export default omlxSettingsDescriptor;
|
|
60
|
+
//# sourceMappingURL=omlx.config.descriptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omlx.config.descriptor.d.ts","sourceRoot":"","sources":["../../src/config/omlx.config.descriptor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAuC,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE3F,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtG,eAAO,MAAM,yBAAyB,sBAAsB,CAAC;AAE7D,eAAO,MAAM,oBAAoB;;;;;;CAAgE,CAAC;AAElG,wBAAsB,gBAAgB,CACrC,OAAO,EAAE,UAAU,GACjB,OAAO,CAAC,YAAY,CAAC,CAUvB;AAED,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsBjC,CAAC;AAEH,eAAe,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* oMLX settings — the `integrations.omlx` config manifest.
|
|
3
|
+
*/
|
|
4
|
+
import { ConfigManifest } from '@vibesdotdev/config';
|
|
5
|
+
import { CapabilityError, createRuntimeAsset } from '@vibesdotdev/kernel';
|
|
6
|
+
import { OmlxSettingsSchema } from "../schemas/settings.js";
|
|
7
|
+
export { OMLX_DEFAULT_BASE_URL, OmlxSettingsSchema } from "../schemas/settings.js";
|
|
8
|
+
export const OMLX_SETTINGS_MANIFEST_ID = 'integrations.omlx';
|
|
9
|
+
export const omlxSettingsManifest = { id: OMLX_SETTINGS_MANIFEST_ID, schema: OmlxSettingsSchema };
|
|
10
|
+
export async function loadOmlxSettings(runtime) {
|
|
11
|
+
if (!runtime.hasKind('config/manifest'))
|
|
12
|
+
return OmlxSettingsSchema.parse({});
|
|
13
|
+
try {
|
|
14
|
+
return await ConfigManifest.forRuntime(runtime, OMLX_SETTINGS_MANIFEST_ID).load();
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (error instanceof CapabilityError && error.reason === 'config-manifest-unregistered') {
|
|
18
|
+
return OmlxSettingsSchema.parse({});
|
|
19
|
+
}
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export const omlxSettingsDescriptor = createRuntimeAsset({
|
|
24
|
+
kind: 'config/manifest',
|
|
25
|
+
id: OMLX_SETTINGS_MANIFEST_ID,
|
|
26
|
+
name: 'oMLX',
|
|
27
|
+
namespace: 'integrations',
|
|
28
|
+
description: 'oMLX local MLX LLM connection settings',
|
|
29
|
+
tier: 'user',
|
|
30
|
+
category: 'integrations',
|
|
31
|
+
schema: OmlxSettingsSchema,
|
|
32
|
+
fields: {
|
|
33
|
+
baseUrl: { ui: { label: 'Server URL', component: 'text', group: 'omlx' } },
|
|
34
|
+
timeoutMs: { ui: { label: 'Timeout (ms)', component: 'number', group: 'omlx' } }
|
|
35
|
+
},
|
|
36
|
+
groups: [{ id: 'omlx', label: 'oMLX' }],
|
|
37
|
+
allowedAdapters: ['storage.localdb', 'storage.json'],
|
|
38
|
+
defaultAdapter: 'storage.localdb',
|
|
39
|
+
scope: 'auto',
|
|
40
|
+
customTables: false,
|
|
41
|
+
version: 1,
|
|
42
|
+
internal: false,
|
|
43
|
+
context: { surfaces: ['cli', 'tui'] },
|
|
44
|
+
enabled: true
|
|
45
|
+
});
|
|
46
|
+
export default omlxSettingsDescriptor;
|
|
47
|
+
//# sourceMappingURL=omlx.config.descriptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omlx.config.descriptor.js","sourceRoot":"","sources":["../../src/config/omlx.config.descriptor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAmB,MAAM,qBAAqB,CAAC;AAE3F,OAAO,EAAE,kBAAkB,EAAqB,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAqB,MAAM,wBAAwB,CAAC;AAEtG,MAAM,CAAC,MAAM,yBAAyB,GAAG,mBAAmB,CAAC;AAE7D,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,EAAE,EAAE,yBAAyB,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;AAElG,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,OAAmB;IAEnB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAAE,OAAO,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC;QACJ,OAAO,MAAM,cAAc,CAAC,UAAU,CAAe,OAAO,EAAE,yBAAyB,CAAC,CAAC,IAAI,EAAE,CAAC;IACjG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,eAAe,IAAI,KAAK,CAAC,MAAM,KAAK,8BAA8B,EAAE,CAAC;YACzF,OAAO,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;IACxD,IAAI,EAAE,iBAAiB;IACvB,EAAE,EAAE,yBAAyB;IAC7B,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,cAAc;IACzB,WAAW,EAAE,wCAAwC;IACrD,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,cAAc;IACxB,MAAM,EAAE,kBAAkB;IAC1B,MAAM,EAAE;QACP,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC1E,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;KAChF;IACD,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACvC,eAAe,EAAE,CAAC,iBAAiB,EAAE,cAAc,CAAC;IACpD,cAAc,EAAE,iBAAiB;IACjC,KAAK,EAAE,MAAM;IACb,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,KAAK;IACf,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;IACrC,OAAO,EAAE,IAAI;CACb,CAAC,CAAC;AAEH,eAAe,sBAAsB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uDAAuD,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uDAAuD,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC"}
|