/** * Layer 1 (v1.7.5): pure HuggingFace API client. No DB. No project deps. * * Resolves embedding-model metadata from HF's REST API by reading the model's * `config.json`, `tokenizer_config.json`, `sentence_bert_config.json`, * `config_sentence_transformers.json`, and `modules.json` in parallel. * Optionally cross-checks the upstream `base_model` for prompts when the * direct repo doesn't ship a `prompts` field. * * Used at runtime when a BYOM model isn't in the bundled seed (Layer 3 * calls this from `metadata-resolver.ts`). The release-time seed regen * (`scripts/build-seed.py`) reads MTEB's Python registry directly and * does not call this fetcher; the fetcher is BYOM-fallback-only now. * * Tier 3 README fingerprinting is intentionally NOT included in v1.7.5 — * its false-positive risk on long-form READMEs is too high to ship without * an eval harness. Deferred to v1.7.6 or beyond. */ /** Default per-request timeout. HF API is normally <100ms; 5s is generous. */ export declare const DEFAULT_HF_TIMEOUT_MS = 5000; /** Default retry count for transient (5xx / network) failures. */ export declare const DEFAULT_HF_RETRIES = 2; export type Dtype = 'fp32' | 'fp16' | 'q8' | 'q4' | 'q4f16' | 'int8' | 'uint8' | 'bnb4'; export type PrefixSource = 'metadata' | 'metadata-base' | 'readme' | 'none'; export interface HfMetadata { /** Canonical HF model id (org/name). */ modelId: string; /** transformers `model_type` (e.g. 'bert', 'xlm-roberta', 't5'). */ modelType: string; /** Hidden size from config.json — pre-Dense-projection. */ hiddenSize: number; /** Number of transformer layers. */ numLayers: number; /** Output embedding dim — overridden by Dense layer's `out_features` when present. */ dim: number; /** True if `modules.json` declares a Dense layer (post-pooling projection). */ hasDenseLayer: boolean; /** True if `modules.json` declares a Normalize layer (cosine-similarity-friendly). */ hasNormalize: boolean; /** Effective max input tokens. Resolved with the priority: sentence_bert_config.max_seq_length → * tokenizer_config.model_max_length → config.max_position_embeddings (xlm-roberta -2 offset). */ maxTokens: number; /** From `config_sentence_transformers.json prompts.query`, or upstream `base_model`'s same JSON. */ queryPrefix: string | null; /** From `config_sentence_transformers.json prompts.document` (or `passage`). */ documentPrefix: string | null; /** Where the prefixes came from. 'none' → no prompts field anywhere. */ prefixSource: PrefixSource; /** Upstream model id from README YAML frontmatter `base_model:`, or null. */ baseModel: string | null; /** Total bytes of the requested ONNX dtype variant (q8 by default), or null. */ sizeBytes: number | null; /** Diagnostic: which sources contributed to this metadata. */ sources: { hadModulesJson: boolean; hadSentenceBertConfig: boolean; hadSentenceTransformersConfig: boolean; hadOnnxDir: boolean; maxTokensFrom: 'sentence_bert_config' | 'tokenizer_config' | 'config' | 'default'; }; } export interface HfMetadataOptions { /** Quantization variant whose ONNX file size we want to report. Default 'q8'. */ dtype?: Dtype; /** Git revision (branch / commit / tag) to resolve files against. Default 'main'. */ revision?: string; /** Per-request timeout in ms. Default DEFAULT_HF_TIMEOUT_MS. */ timeoutMs?: number; /** Max retries for 5xx / network failures (4xx is permanent, no retry). Default DEFAULT_HF_RETRIES. */ retries?: number; /** Injected fetch — defaults to globalThis.fetch. Lets tests substitute. */ fetcher?: typeof fetch; } /** * Fetch metadata for a HuggingFace embedding model. * * Throws (only) when: * - `config.json` is unreachable / 404 (model doesn't exist). * - `config.json` has no scalar embedding dim (multimodal / vision / * audio model with nested configs — Layer 1 cannot represent these). * * All other config files are best-effort — missing files fall through to * fallback values, never throw. */ export declare function getEmbeddingMetadata(modelId: string, options?: HfMetadataOptions): Promise;