import { CreateEmbeddingResponse } from 'openai/resources'; import { DyFM_AI_Provider, DyFM_AI_ProviderCapabilities, DyFM_AI_Config } from '@futdevpro/fsm-dynamo/ai'; import { DyFM_DAI_EmbeddingInfo } from '@futdevpro/fsm-dynamo/ai/document-ai'; import { DyNTS_AI_CostEventCallback } from '../_models/interfaces/dynts-ai-cost-event-callback.interface'; import { DyNTS_AI_Embedding_ServiceBase } from './ai-embedding.service-base'; /** * Az LM Studio embedding control-service config-set-je. A `baseUrl` az OpenAI-kompatibilis * lokális endpoint (pl. `http://localhost:1234/v1`), az `apiKey` opcionális (LM Studio default- * ban nem kér Bearer-t). Az `onCostEvent` a per-call cost-event sink (FR-002, BFR-AM-007). */ export interface DyNTS_LMStudio_Embedding_Settings { /** OpenAI-kompatibilis lokális embedding-endpoint base URL-je (pl. `http://localhost:1234/v1`). */ baseUrl: string; /** Opcionális Bearer token (LM Studio default-ban nem kér). */ apiKey?: string; /** Per-call cost-event callback (FR-002 / BFR-AM-007). Non-breaking: ha undefined, nincs emit. */ onCostEvent?: DyNTS_AI_CostEventCallback; } /** * `DyNTS_LMStudio_Embedding_ControlService` (BFR-AM-002) — OpenAI-kompatibilis **lokális** embedding * adapter `fetch`-en (Node 20 global `fetch`, így a Dynamo NEM hoz be provider-specifikus SDK-t a * lokális path-hoz). A FAM `FAM_LMStudio_EmbeddingProvider` workaround-ját emeli bedrock-szintre. * * A `baseUrl` + `modelId` config-ot a constructor-on kapja (mint a `DyNTS_OAI_Embedding_ControlService` * a `DyFM_OAI_Settings`-et). A `${baseUrl}/embeddings` POST-ra a `{ model, input }` body-t küldi, a * `data[].embedding` sorrendje == a `texts` sorrendje. * * **Cost-event (BFR-AM-007):** minden sikeres call után `emitCostEvent`-tel jelez (callType * `embedding-single` / `embedding-batch`, provider `'lm-studio'`). Lokális futás → nincs USD-költség, * a token-fogyasztás a `usage`-ből (ha az endpoint adja), különben becsült (4 char ≈ 1 token). */ export declare class DyNTS_LMStudio_Embedding_ControlService extends DyNTS_AI_Embedding_ServiceBase { /** A provider-azonosító a `LocalAI` enum-érték (LM Studio = lokális OpenAI-kompatibilis endpoint). */ readonly aiProvider: DyFM_AI_Provider; /** A cost-event provider-string (a `DyNTS_AI_CostEvent.provider` szabad-string mezőjéhez). */ protected readonly costProvider: string; /** LM Studio (OpenAI-kompatibilis lokális) capability-k: csak embedding-et igénylünk innen. */ readonly capabilities: DyFM_AI_ProviderCapabilities; /** Az OpenAI-kompatibilis endpoint base URL-je (trailing slash-mentes). */ protected baseUrl: string; /** Opcionális Bearer token. */ protected apiKey?: string; /** * @param set baseUrl + opc. apiKey + opc. onCostEvent. A `baseUrl` kötelező — ha üres, a * `DyNTS-LMS-ECS-CFG` hibát dobjuk (lokális endpoint nincs konfigurálva). */ constructor(set: DyNTS_LMStudio_Embedding_Settings); /** * Az LM Studio client-et nem SDK-val, hanem `fetch`-csel hívjuk; a `setup` a `baseUrl` (és * opcionálisan az `apiKey`) átkonfigurálását teszi lehetővé (a base-szerződés egységessége miatt). */ setup(config: DyFM_AI_Config): void; /** * Egy-szöveg embedding (a `createEmbeddings` egyelemű alakja). `fullResponse=true` esetén a * teljes (OpenAI-alakú) válasz-objektumot adja vissza, különben a tiszta `number[]`-t. */ createEmbedding(set: { text: string; model: string; fullResponse?: boolean; issuer: string; }): Promise; /** * Batch-embedding az OpenAI-kompatibilis `/embeddings` végpontra. A `texts` sorrendje == a * visszaadott `number[][]` sorrendje. `fullResponse=true` esetén a teljes válasz-objektum. */ createEmbeddings(set: { texts: string[]; model: string; fullResponse?: boolean; issuer: string; }): Promise; /** * Embedding model-info (a `DyFM_DAI_EmbeddingInfo` szerződés szerint). A provider `LocalAI`, a * model a megadott azonosító (a lokális endpoint natív dimenzióját nem ismerjük előre). */ getEmbeddingInfo(model: string): DyFM_DAI_EmbeddingInfo; /** * Provider-elérhetőség: egy minimál embedding-próba (rövid token). Ha a hívás dob (endpoint down / * model hiányzik), `false`. Soha nem propagál hibát (try/catch → false). */ testConnection(issuer: string): Promise; /** * Az OpenAI-kompatibilis `/embeddings` POST-hívás `fetch`-csel. A `input` lehet egyetlen string * vagy string-tömb (mindkettőt az OpenAI-spec megengedi). A választ `CreateEmbeddingResponse`-alakra * normalizáljuk (a `data[].embedding`-eket kivonatoljuk). HTTP-/parse-hiba deskriptív üzenettel dobódik. */ protected callEmbeddingsEndpoint(model: string, input: string | string[], issuer: string): Promise; /** * A nyers (OpenAI-kompatibilis) választ `CreateEmbeddingResponse`-alakra normalizálja: a `data[]`-ból * a `embedding` tömböket emeli ki (csak véges number-eket), a darabszámot ellenőrzi (1:1 a `texts`-szel), * és átveszi a `usage`-t ha van (a cost-event token-számához). Hibás/hiányzó mező → deskriptív hiba. */ protected normalizeResponse(json: unknown, expectedCount: number, url: string, modelId: string): CreateEmbeddingResponse; /** * Cost-event emit (BFR-AM-007). A token a `usage`-ből (ha az endpoint adta), különben becsült * (4 char ≈ 1 token, defenzív lokális heurisztika). A provider mindig `'lm-studio'` string. */ protected emitLmStudioCostEvent(callType: 'embedding-single' | 'embedding-batch', model: string, texts: string[], response: CreateEmbeddingResponse, durationMs: number, issuer: string): void; /** Becsült token-szám lokális endpoint-hoz (ha nincs `usage`): 4 char ≈ 1 token. */ protected estimateTokens(texts: string[]): number; /** A `testConnection` próba-modellje (env-override-olható, default a FAM-mintára). */ protected defaultProbeModel(): string; /** Trailing `/`-ek levágása (kettős slash elkerülése a `/embeddings` join-nál). */ protected trimTrailingSlashes(value: string): string; /** Rövid, biztonságos válasz-snapshot a hiba-üzenethez (max 300 char). */ protected snapshot(value: string): string; /** Egy number mező típusbiztos kiolvasása egy ismeretlen objektumból (hiány → 0). */ protected readNumber(obj: unknown, key: string): number; } //# sourceMappingURL=lmstudio-embedding.control-service.d.ts.map