@euconform/core 1.0.0

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 (89) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/LICENSE +21 -0
  3. package/dist/fairness-metrics.d.ts +65 -0
  4. package/dist/fairness-metrics.d.ts.map +1 -0
  5. package/dist/fairness-metrics.js +394 -0
  6. package/dist/index.d.ts +14 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +17 -0
  9. package/dist/inference/browser-inference.d.ts +60 -0
  10. package/dist/inference/browser-inference.d.ts.map +1 -0
  11. package/dist/inference/browser-inference.js +221 -0
  12. package/dist/inference/capability-detection.d.ts +183 -0
  13. package/dist/inference/capability-detection.d.ts.map +1 -0
  14. package/dist/inference/capability-detection.js +552 -0
  15. package/dist/inference/index.d.ts +43 -0
  16. package/dist/inference/index.d.ts.map +1 -0
  17. package/dist/inference/index.js +97 -0
  18. package/dist/inference/inference-factory.d.ts +73 -0
  19. package/dist/inference/inference-factory.d.ts.map +1 -0
  20. package/dist/inference/inference-factory.js +175 -0
  21. package/dist/inference/ollama-client.d.ts +114 -0
  22. package/dist/inference/ollama-client.d.ts.map +1 -0
  23. package/dist/inference/ollama-client.js +386 -0
  24. package/dist/legal-checks/annex-iv-report.d.ts +131 -0
  25. package/dist/legal-checks/annex-iv-report.d.ts.map +1 -0
  26. package/dist/legal-checks/annex-iv-report.js +62 -0
  27. package/dist/legal-checks/bias-metrics.d.ts +162 -0
  28. package/dist/legal-checks/bias-metrics.d.ts.map +1 -0
  29. package/dist/legal-checks/bias-metrics.js +408 -0
  30. package/dist/legal-checks/data-governance.d.ts +30 -0
  31. package/dist/legal-checks/data-governance.d.ts.map +1 -0
  32. package/dist/legal-checks/data-governance.js +99 -0
  33. package/dist/legal-checks/human-oversight-logging.d.ts +27 -0
  34. package/dist/legal-checks/human-oversight-logging.d.ts.map +1 -0
  35. package/dist/legal-checks/human-oversight-logging.js +106 -0
  36. package/dist/legal-checks/index.d.ts +13 -0
  37. package/dist/legal-checks/index.d.ts.map +1 -0
  38. package/dist/legal-checks/index.js +6 -0
  39. package/dist/legal-checks/risk-classifier.d.ts +35 -0
  40. package/dist/legal-checks/risk-classifier.d.ts.map +1 -0
  41. package/dist/legal-checks/risk-classifier.js +234 -0
  42. package/dist/legal-checks/robustness-transparency.d.ts +45 -0
  43. package/dist/legal-checks/robustness-transparency.d.ts.map +1 -0
  44. package/dist/legal-checks/robustness-transparency.js +111 -0
  45. package/dist/metrics/crows-pairs-bias.d.ts +41 -0
  46. package/dist/metrics/crows-pairs-bias.d.ts.map +1 -0
  47. package/dist/metrics/crows-pairs-bias.js +172 -0
  48. package/dist/metrics/index.d.ts +6 -0
  49. package/dist/metrics/index.d.ts.map +1 -0
  50. package/dist/metrics/index.js +5 -0
  51. package/dist/metrics/stereotype-bias.d.ts +89 -0
  52. package/dist/metrics/stereotype-bias.d.ts.map +1 -0
  53. package/dist/metrics/stereotype-bias.js +157 -0
  54. package/dist/risk-engine.d.ts +23 -0
  55. package/dist/risk-engine.d.ts.map +1 -0
  56. package/dist/risk-engine.js +451 -0
  57. package/dist/types.d.ts +131 -0
  58. package/dist/types.d.ts.map +1 -0
  59. package/dist/types.js +5 -0
  60. package/package.json +28 -0
  61. package/src/fairness-metrics.ts +498 -0
  62. package/src/index.ts +150 -0
  63. package/src/inference/browser-inference.ts +258 -0
  64. package/src/inference/capability-detection.ts +714 -0
  65. package/src/inference/index.ts +156 -0
  66. package/src/inference/inference-factory.ts +222 -0
  67. package/src/inference/ollama-client.ts +514 -0
  68. package/src/inference/transformers.d.ts +62 -0
  69. package/src/legal-checks/annex-iv-report.ts +157 -0
  70. package/src/legal-checks/bias-metrics.ts +590 -0
  71. package/src/legal-checks/data-governance.ts +148 -0
  72. package/src/legal-checks/human-oversight-logging.ts +135 -0
  73. package/src/legal-checks/index.ts +55 -0
  74. package/src/legal-checks/risk-classifier.ts +285 -0
  75. package/src/legal-checks/robustness-transparency.ts +162 -0
  76. package/src/metrics/crows-pairs-bias.ts +245 -0
  77. package/src/metrics/index.ts +22 -0
  78. package/src/metrics/stereotype-bias.ts +267 -0
  79. package/src/risk-engine.ts +525 -0
  80. package/src/types.ts +154 -0
  81. package/tests/annex-iv-report.test.ts +323 -0
  82. package/tests/crows-pairs-bias.test.ts +342 -0
  83. package/tests/fairness-metrics.test.ts +187 -0
  84. package/tests/integration/bias-calculation.integration.test.ts +688 -0
  85. package/tests/legal-checks.test.ts +53 -0
  86. package/tests/ollama-client.test.ts +427 -0
  87. package/tests/risk-engine.test.ts +149 -0
  88. package/tsconfig.json +11 -0
  89. package/vitest.config.ts +17 -0
@@ -0,0 +1,514 @@
1
+ /**
2
+ * Ollama Client for local LLM inference
3
+ * Connects to Ollama running on localhost:11434
4
+ */
5
+
6
+ import type { BiasCalculationMethod, ModelCapabilityCache } from "../types";
7
+
8
+ export interface OllamaModel {
9
+ name: string;
10
+ size: number;
11
+ digest: string;
12
+ modified_at: string;
13
+ }
14
+
15
+ export interface OllamaGenerateOptions {
16
+ model: string;
17
+ prompt: string;
18
+ stream?: boolean;
19
+ logprobs?: boolean | number;
20
+ options?: {
21
+ temperature?: number;
22
+ top_p?: number;
23
+ num_predict?: number;
24
+ };
25
+ }
26
+
27
+ export interface OllamaGenerateResponse {
28
+ model: string;
29
+ response: string;
30
+ done: boolean;
31
+ context?: number[];
32
+ total_duration?: number;
33
+ eval_count?: number;
34
+ logprobs?: Array<{
35
+ token: string;
36
+ logprob: number;
37
+ }>;
38
+ }
39
+
40
+ export interface OllamaLogProbResponse {
41
+ model: string;
42
+ prompt: string;
43
+ logprob: number;
44
+ }
45
+
46
+ export interface OllamaLogProbsOptions {
47
+ logprobs?: boolean | number;
48
+ }
49
+
50
+ export interface OllamaLogProbsResponse extends OllamaGenerateResponse {
51
+ logprobs?: Array<{
52
+ token: string;
53
+ logprob: number;
54
+ }>;
55
+ }
56
+
57
+ const OLLAMA_BASE_URL = "http://localhost:11434";
58
+
59
+ /**
60
+ * Check if Ollama is running and accessible
61
+ */
62
+ export async function detectOllama(): Promise<boolean> {
63
+ try {
64
+ const controller = new AbortController();
65
+ const timeoutId = setTimeout(() => controller.abort(), 2000);
66
+
67
+ const response = await fetch(`${OLLAMA_BASE_URL}/api/tags`, {
68
+ signal: controller.signal,
69
+ });
70
+
71
+ clearTimeout(timeoutId);
72
+ return response.ok;
73
+ } catch {
74
+ return false;
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Get list of available models from Ollama
80
+ */
81
+ export async function listOllamaModels(): Promise<OllamaModel[]> {
82
+ try {
83
+ const response = await fetch(`${OLLAMA_BASE_URL}/api/tags`);
84
+
85
+ if (!response.ok) {
86
+ throw new Error(`Failed to list models: ${response.statusText}`);
87
+ }
88
+
89
+ const data = await response.json();
90
+ return data.models || [];
91
+ } catch (error) {
92
+ console.error("Failed to list Ollama models:", error);
93
+ return [];
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Generate text with Ollama
99
+ */
100
+ export async function ollamaGenerate(
101
+ options: OllamaGenerateOptions
102
+ ): Promise<OllamaGenerateResponse> {
103
+ const response = await fetch(`${OLLAMA_BASE_URL}/api/generate`, {
104
+ method: "POST",
105
+ headers: { "Content-Type": "application/json" },
106
+ body: JSON.stringify({
107
+ ...options,
108
+ stream: false,
109
+ }),
110
+ });
111
+
112
+ if (!response.ok) {
113
+ const errorText = await response.text();
114
+ throw new Error(
115
+ `Ollama generate failed (${response.status}): ${errorText || response.statusText}`
116
+ );
117
+ }
118
+
119
+ return response.json();
120
+ }
121
+
122
+ /**
123
+ * Get log probability for a prompt (for bias scoring)
124
+ * Uses the /api/generate endpoint with num_predict: 0 to get prompt logprobs
125
+ */
126
+ export async function getLogProb(model: string, prompt: string): Promise<number> {
127
+ try {
128
+ // Use generate with num_predict: 0 to ONLY evaluate the prompt
129
+ // This forces the model to process the input tokens, giving us prompt_eval metrics
130
+ const response = await fetch(`${OLLAMA_BASE_URL}/api/generate`, {
131
+ method: "POST",
132
+ headers: { "Content-Type": "application/json" },
133
+ body: JSON.stringify({
134
+ model,
135
+ prompt,
136
+ stream: false,
137
+ options: {
138
+ num_predict: 0, // Don't generate, just evaluate prompt
139
+ temperature: 0,
140
+ },
141
+ }),
142
+ });
143
+
144
+ if (!response.ok) {
145
+ const errorText = await response.text();
146
+ throw new Error(
147
+ `Failed to get logprob for model '${model}': ${errorText || response.statusText}`
148
+ );
149
+ }
150
+
151
+ const data = await response.json();
152
+
153
+ // Optimization: Use prompt_eval metrics (processing time of the input)
154
+ // This is a better proxy for "perplexity" or "likelihood" of the sentence than generation speed
155
+ if (data.prompt_eval_duration && data.prompt_eval_count) {
156
+ const timePerToken = data.prompt_eval_duration / data.prompt_eval_count / 1e9; // ns to s
157
+ // Normalize: faster processing = higher probability (lower surprise)
158
+ // We return negative log of time to mimic log-prob scale (higher is better)
159
+ return -Math.log(timePerToken + 0.00001); // Smaller epsilon for precision
160
+ }
161
+
162
+ // Fallback: use eval metrics if prompt metrics missing (rare)
163
+ if (data.eval_duration && data.eval_count) {
164
+ const timePerToken = data.eval_duration / data.eval_count / 1e9;
165
+ return -Math.log(timePerToken + 0.001);
166
+ }
167
+
168
+ return 0;
169
+ } catch (error) {
170
+ console.error(`Error calculating log probability for model ${model}:`, error);
171
+ throw error; // Re-throw to let caller handle it
172
+ }
173
+ }
174
+
175
+ /**
176
+ * Calculate perplexity for a text (alternative bias metric)
177
+ */
178
+ export async function getPerplexity(model: string, text: string): Promise<number> {
179
+ try {
180
+ const response = await fetch(`${OLLAMA_BASE_URL}/api/generate`, {
181
+ method: "POST",
182
+ headers: { "Content-Type": "application/json" },
183
+ body: JSON.stringify({
184
+ model,
185
+ prompt: text,
186
+ stream: false,
187
+ options: {
188
+ num_predict: 0, // Don't generate, just evaluate prompt
189
+ },
190
+ }),
191
+ });
192
+
193
+ if (!response.ok) {
194
+ throw new Error(`Failed to get perplexity: ${response.statusText}`);
195
+ }
196
+
197
+ const data = await response.json();
198
+
199
+ // Perplexity approximation from eval metrics
200
+ if (data.prompt_eval_duration && data.prompt_eval_count) {
201
+ // Normalize by token count for fair comparison across different lengths
202
+ const avgTimePerToken = data.prompt_eval_duration / data.prompt_eval_count / 1e9;
203
+ return avgTimePerToken * 1000; // Scale for readability
204
+ }
205
+
206
+ return 1;
207
+ } catch (error) {
208
+ console.error("Failed to get perplexity:", error);
209
+ return 1;
210
+ }
211
+ }
212
+
213
+ /**
214
+ * Ollama client class for stateful operations
215
+ */
216
+ export class OllamaClient {
217
+ private baseUrl: string;
218
+ public readonly model: string;
219
+ private capabilityCache: Map<string, ModelCapabilityCache>;
220
+
221
+ constructor(model: string, baseUrl = OLLAMA_BASE_URL) {
222
+ this.baseUrl = baseUrl;
223
+ this.model = model;
224
+ this.capabilityCache = new Map();
225
+ }
226
+
227
+ /**
228
+ * Ensures the model is available in Ollama before proceeding
229
+ * Throws an error if the model is not found
230
+ */
231
+ async ensureModelLoaded(): Promise<void> {
232
+ const models = await listOllamaModels();
233
+ // Check if exact match or if the model name is contained (e.g. "llama3.2" in "llama3.2:latest")
234
+ const modelExists = models.some(
235
+ (m) =>
236
+ m.name === this.model ||
237
+ m.name.startsWith(`${this.model}:`) ||
238
+ this.model.startsWith(`${m.name}:`)
239
+ );
240
+
241
+ if (!modelExists) {
242
+ throw new Error(
243
+ `Model '${this.model}' not found in Ollama. Please run 'ollama pull ${this.model}' first.`
244
+ );
245
+ }
246
+ }
247
+
248
+ async isAvailable(): Promise<boolean> {
249
+ return detectOllama();
250
+ }
251
+
252
+ async generate(prompt: string): Promise<string> {
253
+ await this.ensureModelLoaded();
254
+ const response = await ollamaGenerate({
255
+ model: this.model,
256
+ prompt,
257
+ });
258
+ return response.response;
259
+ }
260
+
261
+ async getLogProb(prompt: string): Promise<number> {
262
+ // Use the enhanced getLogProbWithFallback method that supports both exact and fallback methods
263
+ const result = await this.getLogProbWithFallback(prompt);
264
+ return result.logprob;
265
+ }
266
+
267
+ async getPerplexity(text: string): Promise<number> {
268
+ return getPerplexity(this.model, text);
269
+ }
270
+
271
+ /**
272
+ * Test if the current model supports log-probabilities
273
+ * Sends a test request with "Der" prompt to detect capability
274
+ */
275
+ private async testLogProbCapability(): Promise<boolean> {
276
+ try {
277
+ // First check Ollama version
278
+ try {
279
+ const versionResponse = await fetch(`${this.baseUrl}/api/version`);
280
+ if (versionResponse.ok) {
281
+ const versionData = await versionResponse.json();
282
+ console.log(`🔍 Ollama version: ${versionData.version || "unknown"}`);
283
+ }
284
+ } catch {
285
+ // Version check is optional
286
+ }
287
+
288
+ const response = await fetch(`${this.baseUrl}/api/generate`, {
289
+ method: "POST",
290
+ headers: { "Content-Type": "application/json" },
291
+ body: JSON.stringify({
292
+ model: this.model,
293
+ prompt: "Der",
294
+ stream: false,
295
+ logprobs: true,
296
+ options: {
297
+ num_predict: 1,
298
+ temperature: 0,
299
+ },
300
+ }),
301
+ });
302
+
303
+ if (!response.ok) {
304
+ console.warn(
305
+ `🔍 Capability test request failed for ${this.model}: ${response.status} ${response.statusText}`
306
+ );
307
+ return false;
308
+ }
309
+
310
+ const data = await response.json();
311
+
312
+ // Check if logprobs are present and valid
313
+ const hasLogProbs = !!(
314
+ data.logprobs &&
315
+ Array.isArray(data.logprobs) &&
316
+ data.logprobs.length > 0
317
+ );
318
+ console.log(
319
+ `🔍 Capability test for ${this.model}: ${hasLogProbs ? "✅ supports" : "❌ no support"} log-probabilities`,
320
+ data.logprobs ? `(${data.logprobs.length} tokens)` : "(no logprobs field)"
321
+ );
322
+
323
+ if (!hasLogProbs) {
324
+ console.log("🔍 Full response for debugging:", JSON.stringify(data, null, 2));
325
+ }
326
+
327
+ return hasLogProbs;
328
+ } catch (error) {
329
+ console.warn(`Log-probability capability test failed for model ${this.model}:`, error);
330
+ return false;
331
+ }
332
+ }
333
+
334
+ /**
335
+ * Get cached capability result from localStorage
336
+ */
337
+ private getCachedCapability(): ModelCapabilityCache | null {
338
+ try {
339
+ const cacheKey = `ollama_supports_logprobs_${this.model}`;
340
+ const cached = localStorage.getItem(cacheKey);
341
+
342
+ if (cached) {
343
+ const capability: ModelCapabilityCache = JSON.parse(cached);
344
+
345
+ // Check if cache is still valid (24 hours)
346
+ const cacheAge = Date.now() - new Date(capability.testedAt).getTime();
347
+ const maxAge = 24 * 60 * 60 * 1000; // 24 hours in milliseconds
348
+
349
+ if (cacheAge < maxAge) {
350
+ return capability;
351
+ }
352
+ }
353
+ } catch (error) {
354
+ console.warn("Failed to read capability cache:", error);
355
+ }
356
+
357
+ return null;
358
+ }
359
+
360
+ /**
361
+ * Cache capability result in localStorage
362
+ */
363
+ private setCachedCapability(supports: boolean): void {
364
+ try {
365
+ const cacheKey = `ollama_supports_logprobs_${this.model}`;
366
+ const capability: ModelCapabilityCache = {
367
+ model: this.model,
368
+ supportsLogProbs: supports,
369
+ testedAt: new Date().toISOString(),
370
+ };
371
+
372
+ localStorage.setItem(cacheKey, JSON.stringify(capability));
373
+ this.capabilityCache.set(this.model, capability);
374
+ } catch (error) {
375
+ console.warn("Failed to cache capability result:", error);
376
+ }
377
+ }
378
+
379
+ /**
380
+ * Detect if the current model supports log-probabilities
381
+ * Checks cache first, then runs test if needed
382
+ */
383
+ async detectLogProbSupport(): Promise<boolean> {
384
+ // Check in-memory cache first
385
+ const memoryCache = this.capabilityCache.get(this.model);
386
+ if (memoryCache) {
387
+ return memoryCache.supportsLogProbs;
388
+ }
389
+
390
+ // Check localStorage cache
391
+ const cached = this.getCachedCapability();
392
+ if (cached) {
393
+ this.capabilityCache.set(this.model, cached);
394
+ return cached.supportsLogProbs;
395
+ }
396
+
397
+ // Run capability test
398
+ const supports = await this.testLogProbCapability();
399
+ this.setCachedCapability(supports);
400
+
401
+ return supports;
402
+ }
403
+
404
+ /**
405
+ * Get log-probability with automatic fallback to latency method
406
+ * Returns both the calculated value and the method used
407
+ */
408
+ async getLogProbWithFallback(
409
+ prompt: string
410
+ ): Promise<{ logprob: number; method: BiasCalculationMethod }> {
411
+ try {
412
+ // First, check if model supports log-probabilities
413
+ const supportsLogProbs = await this.detectLogProbSupport();
414
+
415
+ if (supportsLogProbs) {
416
+ // Try to get exact log-probabilities
417
+ try {
418
+ const response = await fetch(`${this.baseUrl}/api/generate`, {
419
+ method: "POST",
420
+ headers: { "Content-Type": "application/json" },
421
+ body: JSON.stringify({
422
+ model: this.model,
423
+ prompt,
424
+ stream: false,
425
+ logprobs: true,
426
+ options: {
427
+ num_predict: 0, // Only evaluate prompt, don't generate
428
+ temperature: 0,
429
+ },
430
+ }),
431
+ });
432
+
433
+ if (response.ok) {
434
+ const data = await response.json();
435
+
436
+ if (data.logprobs && Array.isArray(data.logprobs) && data.logprobs.length > 0) {
437
+ // Calculate average log-probability across all tokens
438
+ const avgLogProb =
439
+ data.logprobs.reduce(
440
+ (sum: number, item: { token: string; logprob: number }) => sum + item.logprob,
441
+ 0
442
+ ) / data.logprobs.length;
443
+ console.log(`✅ Using exact log-probabilities for ${this.model}: ${avgLogProb}`);
444
+ return {
445
+ logprob: avgLogProb,
446
+ method: "logprobs_exact",
447
+ };
448
+ }
449
+ console.warn(`❌ No logprobs in response for ${this.model}, response:`, data);
450
+ } else {
451
+ console.warn(
452
+ `❌ Log-probability request failed for ${this.model}: ${response.status} ${response.statusText}`
453
+ );
454
+ }
455
+ } catch (error) {
456
+ console.warn(
457
+ `❌ Log-probability request failed for ${this.model}, falling back to latency method:`,
458
+ error
459
+ );
460
+ }
461
+ }
462
+
463
+ // Fallback to latency-based method
464
+ console.log(`⚡ Falling back to latency-based method for ${this.model}`);
465
+ const startTime = performance.now();
466
+
467
+ const response = await fetch(`${this.baseUrl}/api/generate`, {
468
+ method: "POST",
469
+ headers: { "Content-Type": "application/json" },
470
+ body: JSON.stringify({
471
+ model: this.model,
472
+ prompt,
473
+ stream: false,
474
+ options: {
475
+ num_predict: 0, // Only evaluate prompt
476
+ temperature: 0,
477
+ },
478
+ }),
479
+ });
480
+
481
+ const endTime = performance.now();
482
+
483
+ if (!response.ok) {
484
+ throw new Error(`Ollama request failed: ${response.statusText}`);
485
+ }
486
+
487
+ const data = await response.json();
488
+
489
+ // Calculate latency-based pseudo log-probability
490
+ let latency: number;
491
+
492
+ if (data.prompt_eval_duration && data.prompt_eval_count) {
493
+ // Use prompt evaluation metrics (preferred)
494
+ latency = data.prompt_eval_duration / data.prompt_eval_count / 1e9; // ns to seconds per token
495
+ } else {
496
+ // Fallback to total request time
497
+ const totalTime = (endTime - startTime) / 1000; // ms to seconds
498
+ const tokenCount = prompt.split(/\s+/).length; // rough token estimate
499
+ latency = totalTime / Math.max(tokenCount, 1);
500
+ }
501
+
502
+ // Convert latency to pseudo log-probability (faster = higher probability)
503
+ const pseudoLogProb = -Math.log(latency + 0.00001);
504
+
505
+ return {
506
+ logprob: pseudoLogProb,
507
+ method: "logprobs_fallback_latency",
508
+ };
509
+ } catch (error) {
510
+ console.error(`Error in getLogProbWithFallback for model ${this.model}:`, error);
511
+ throw error;
512
+ }
513
+ }
514
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Type declarations for @xenova/transformers (optional dependency)
3
+ *
4
+ * This package is only needed for browser-based inference.
5
+ * If not installed, browser inference will gracefully fall back.
6
+ */
7
+
8
+ declare module "@xenova/transformers" {
9
+ export function pipeline(
10
+ task: "text-generation",
11
+ model: string,
12
+ options?: {
13
+ device?: "webgpu" | "cpu";
14
+ }
15
+ ): Promise<TextGenerationPipeline>;
16
+
17
+ export type TextGenerationPipeline = (
18
+ text: string,
19
+ options?: {
20
+ max_new_tokens?: number;
21
+ temperature?: number;
22
+ do_sample?: boolean;
23
+ }
24
+ ) => Promise<Array<{ generated_text: string }>>;
25
+
26
+ export interface Tensor {
27
+ data: Float32Array;
28
+ dims: number[];
29
+ }
30
+
31
+ export interface ModelOutput {
32
+ logits: Tensor;
33
+ }
34
+
35
+ export interface TokenizerOutput {
36
+ input_ids: Tensor;
37
+ }
38
+
39
+ export interface AutoTokenizer {
40
+ (text: string, options?: { return_tensors?: string }): Promise<TokenizerOutput>;
41
+ from_pretrained(modelId: string): Promise<AutoTokenizer>;
42
+ }
43
+
44
+ export interface AutoModelForCausalLM {
45
+ (inputs: TokenizerOutput): Promise<ModelOutput>;
46
+ from_pretrained(
47
+ modelId: string,
48
+ options?: { device?: string; dtype?: string }
49
+ ): Promise<AutoModelForCausalLM>;
50
+ }
51
+
52
+ export const AutoTokenizer: {
53
+ from_pretrained(modelId: string): Promise<AutoTokenizer>;
54
+ };
55
+
56
+ export const AutoModelForCausalLM: {
57
+ from_pretrained(
58
+ modelId: string,
59
+ options?: { device?: string; dtype?: string }
60
+ ): Promise<AutoModelForCausalLM>;
61
+ };
62
+ }