@lanefoundry/gatelane-engine 0.0.0-stage → 0.1.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 (54) hide show
  1. package/dist/attack.d.ts +53 -0
  2. package/dist/attack.d.ts.map +1 -0
  3. package/dist/attack.js +75 -0
  4. package/dist/attack.js.map +1 -0
  5. package/dist/audit.d.ts +56 -0
  6. package/dist/audit.d.ts.map +1 -0
  7. package/dist/audit.js +115 -0
  8. package/dist/audit.js.map +1 -0
  9. package/dist/compare.d.ts +45 -0
  10. package/dist/compare.d.ts.map +1 -0
  11. package/dist/compare.js +118 -0
  12. package/dist/compare.js.map +1 -0
  13. package/dist/evaluate.d.ts +40 -0
  14. package/dist/evaluate.d.ts.map +1 -0
  15. package/dist/evaluate.js +87 -0
  16. package/dist/evaluate.js.map +1 -0
  17. package/dist/index.d.ts +19 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +19 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/judge.d.ts +68 -0
  22. package/dist/judge.d.ts.map +1 -0
  23. package/dist/judge.js +102 -0
  24. package/dist/judge.js.map +1 -0
  25. package/dist/llm.d.ts +158 -0
  26. package/dist/llm.d.ts.map +1 -0
  27. package/dist/llm.js +540 -0
  28. package/dist/llm.js.map +1 -0
  29. package/dist/otel-export.d.ts +36 -0
  30. package/dist/otel-export.d.ts.map +1 -0
  31. package/dist/otel-export.js +162 -0
  32. package/dist/otel-export.js.map +1 -0
  33. package/dist/replay.d.ts +51 -0
  34. package/dist/replay.d.ts.map +1 -0
  35. package/dist/replay.js +260 -0
  36. package/dist/replay.js.map +1 -0
  37. package/dist/runner.d.ts +46 -0
  38. package/dist/runner.d.ts.map +1 -0
  39. package/dist/runner.js +250 -0
  40. package/dist/runner.js.map +1 -0
  41. package/dist/scan.d.ts +172 -0
  42. package/dist/scan.d.ts.map +1 -0
  43. package/dist/scan.js +260 -0
  44. package/dist/scan.js.map +1 -0
  45. package/dist/sign.d.ts +20 -0
  46. package/dist/sign.d.ts.map +1 -0
  47. package/dist/sign.js +64 -0
  48. package/dist/sign.js.map +1 -0
  49. package/dist/tracing.d.ts +20 -0
  50. package/dist/tracing.d.ts.map +1 -0
  51. package/dist/tracing.js +65 -0
  52. package/dist/tracing.js.map +1 -0
  53. package/package.json +89 -4
  54. package/README.md +0 -3
package/dist/llm.js ADDED
@@ -0,0 +1,540 @@
1
+ /**
2
+ * LLMCaller — abstraction over LLM / agent invocation.
3
+ *
4
+ * gatelane's replay engine runs dataset items against candidates via this
5
+ * interface. Implementations:
6
+ * - MockLLMCaller — deterministic, used by tests + local dev
7
+ * - OpenAIChatCaller — OpenAI-compatible chat completions (also groq, openrouter, cloudflare)
8
+ * - AnthropicCaller — Anthropic messages API
9
+ * - GoogleCaller — Google Gemini generateContent API
10
+ *
11
+ * The replay engine doesn't care which one is plugged in; the gate runner
12
+ * picks the right caller per candidate (model candidates hit the API,
13
+ * skill / config / dispatch / guardrail candidates wrap an existing
14
+ * caller with their pre/post hooks).
15
+ *
16
+ * @see docs/prd.md §5.1 — The gate
17
+ */
18
+ /** Deterministic Mock for tests + local dev. Echoes input with seed offset. */
19
+ export class MockLLMCaller {
20
+ provider;
21
+ /** Per-model quality score: 0.0–1.0. Multiplied into the response so tests can
22
+ * simulate "model A is better than model B". */
23
+ quality;
24
+ constructor(opts = {}) {
25
+ this.provider = opts.provider ?? 'mock';
26
+ this.quality = opts.quality ?? 0.8;
27
+ }
28
+ async call(request) {
29
+ const start = performance.now();
30
+ const seed = request.seed ?? 0;
31
+ const qualityJitter = ((seed % 7) / 10) - 0.3; // [-0.3, 0.4]
32
+ const content = JSON.stringify({
33
+ candidate: request.candidate_ref,
34
+ model: request.model,
35
+ seed,
36
+ quality: this.quality + qualityJitter,
37
+ messages_count: request.messages.length,
38
+ echo: request.messages.at(-1)?.content ?? '',
39
+ });
40
+ return {
41
+ content,
42
+ cost_usd: 0.001 * (request.messages.length || 1),
43
+ latency_ms: performance.now() - start,
44
+ tokens_in: request.messages.reduce((n, m) => n + m.content.length, 0),
45
+ tokens_out: content.length,
46
+ finish_reason: 'stop',
47
+ raw: { mocked: true, quality: this.quality },
48
+ toCapturedCall: ({ id, started_at, completed_at, span_kind }) => ({
49
+ id,
50
+ input: {
51
+ prompt: request.messages.map((m) => ({ role: m.role, content: m.content })),
52
+ model: request.model,
53
+ metadata: request.metadata,
54
+ },
55
+ output: { content },
56
+ started_at,
57
+ completed_at,
58
+ cost_usd: 0.001 * (request.messages.length || 1),
59
+ latency_ms: performance.now() - start,
60
+ ...(span_kind !== undefined ? { span_kind } : {}),
61
+ }),
62
+ };
63
+ }
64
+ }
65
+ /** Compose N messages into a single prompt string for non-chat candidates. */
66
+ export function messagesToPrompt(messages) {
67
+ return messages.map((m) => `[${m.role}] ${m.content}`).join('\n');
68
+ }
69
+ /** Pricing maps for cost estimation (USD per 1M tokens). */
70
+ const OPENAI_PRICING = {
71
+ 'gpt-4o': { input: 5.0, output: 15.0 },
72
+ 'gpt-4o-mini': { input: 0.15, output: 0.6 },
73
+ 'gpt-4.1': { input: 2.0, output: 8.0 },
74
+ 'gpt-4.1-mini': { input: 0.4, output: 1.6 },
75
+ };
76
+ const ANTHROPIC_PRICING = {
77
+ 'claude-3-5-sonnet': { input: 3.0, output: 15.0 },
78
+ 'claude-3-5-haiku': { input: 0.25, output: 1.25 },
79
+ 'claude-3-opus': { input: 15.0, output: 75.0 },
80
+ 'claude-3-sonnet': { input: 3.0, output: 15.0 },
81
+ 'claude-3-haiku': { input: 0.25, output: 1.25 },
82
+ };
83
+ const GOOGLE_PRICING = {
84
+ 'gemini-2.5-pro': { input: 1.25, output: 10.0 },
85
+ 'gemini-2.5-flash': { input: 0.15, output: 0.6 },
86
+ 'gemini-2.0-flash': { input: 0.1, output: 0.4 },
87
+ };
88
+ const GROQ_PRICING = {
89
+ 'llama-3.1-70b-versatile': { input: 0.59, output: 0.79 },
90
+ 'llama-3.1-8b-instant': { input: 0.05, output: 0.08 },
91
+ 'mixtral-8x7b-32768': { input: 0.24, output: 0.24 },
92
+ };
93
+ /** All pricing maps keyed by provider for makeCaller to pass to OpenAIChatCaller. */
94
+ export const PROVIDER_PRICING = {
95
+ openai: OPENAI_PRICING,
96
+ anthropic: ANTHROPIC_PRICING,
97
+ google: GOOGLE_PRICING,
98
+ groq: GROQ_PRICING,
99
+ openrouter: { ...OPENAI_PRICING, ...ANTHROPIC_PRICING, ...GOOGLE_PRICING, ...GROQ_PRICING },
100
+ cloudflare: {},
101
+ };
102
+ function estimateCost(model, tokensIn, tokensOut, pricing) {
103
+ const baseModel = model.split(':')[0] ?? model;
104
+ const pricingEntry = pricing[model] ?? pricing[baseModel];
105
+ if (!pricingEntry) {
106
+ return 0;
107
+ }
108
+ return (tokensIn / 1_000_000) * pricingEntry.input + (tokensOut / 1_000_000) * pricingEntry.output;
109
+ }
110
+ function approxTokens(text) {
111
+ return Math.ceil(text.length / 4);
112
+ }
113
+ /**
114
+ * Normalize various response shapes to the OpenAI Chat Completions format.
115
+ *
116
+ * Handles:
117
+ * - Standard OpenAI: { choices: [...] }
118
+ * - CF wrapped: { success: true, result: { choices: [...] } }
119
+ * - CF legacy: { result: { response: "text" } }
120
+ * - CF legacy alt: { result: "text" }
121
+ */
122
+ function normalizeOpenAIResponse(raw) {
123
+ // Standard OpenAI format — choices at top level
124
+ if (Array.isArray(raw.choices) && raw.choices.length > 0) {
125
+ return raw;
126
+ }
127
+ // Cloudflare wrapped — { success, result: { choices: [...] } } or { result: { response } }
128
+ const result = raw.result;
129
+ if (result !== undefined) {
130
+ // result is a string — legacy CF format
131
+ if (typeof result === 'string') {
132
+ return { choices: [{ message: { content: result, role: 'assistant' }, finish_reason: 'stop' }] };
133
+ }
134
+ // result has choices — CF-wrapped OpenAI format
135
+ if (typeof result === 'object' && result !== null && Array.isArray(result.choices)) {
136
+ return result;
137
+ }
138
+ // result.response is a string — legacy CF REST format
139
+ if (typeof result === 'object' && result !== null && typeof result.response === 'string') {
140
+ return { choices: [{ message: { content: result.response, role: 'assistant' }, finish_reason: 'stop' }] };
141
+ }
142
+ }
143
+ // Unknown format — return empty so content falls through to ''
144
+ return { choices: [] };
145
+ }
146
+ /**
147
+ * OpenAI Chat Completions API caller.
148
+ * Also used for OpenAI-compatible providers (groq, openrouter, cloudflare workers ai, opencode).
149
+ */
150
+ export class OpenAIChatCaller {
151
+ provider;
152
+ apiKey;
153
+ baseURL;
154
+ defaultModel;
155
+ timeout;
156
+ pricing;
157
+ constructor(opts) {
158
+ this.apiKey = opts.apiKey;
159
+ this.baseURL = opts.baseURL ?? 'https://api.openai.com';
160
+ this.defaultModel = opts.defaultModel ?? 'gpt-4o-mini';
161
+ this.timeout = opts.timeout ?? 120_000;
162
+ this.provider = opts.provider ?? 'openai';
163
+ this.pricing = opts.pricing ?? OPENAI_PRICING;
164
+ }
165
+ async call(request) {
166
+ const start = performance.now();
167
+ const model = request.model || this.defaultModel;
168
+ const systemMessage = request.messages.find((m) => m.role === 'system');
169
+ const messages = request.messages
170
+ .filter((m) => m.role !== 'system')
171
+ .map((m) => ({ role: m.role, content: m.content }));
172
+ const body = {
173
+ model,
174
+ messages,
175
+ temperature: request.temperature ?? 0,
176
+ max_tokens: request.max_tokens ?? 4096,
177
+ };
178
+ if (request.seed !== undefined) {
179
+ body.seed = request.seed;
180
+ }
181
+ if (systemMessage) {
182
+ body.messages = [{ role: 'system', content: systemMessage.content }, ...messages];
183
+ }
184
+ const controller = new AbortController();
185
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
186
+ let response;
187
+ try {
188
+ response = await fetch(`${this.baseURL}/v1/chat/completions`, {
189
+ method: 'POST',
190
+ headers: {
191
+ 'Content-Type': 'application/json',
192
+ 'Authorization': `Bearer ${this.apiKey}`,
193
+ },
194
+ body: JSON.stringify(body),
195
+ signal: controller.signal,
196
+ });
197
+ }
198
+ finally {
199
+ clearTimeout(timeoutId);
200
+ }
201
+ const latency_ms = performance.now() - start;
202
+ if (!response.ok) {
203
+ const errorText = await response.text().catch(() => '');
204
+ return {
205
+ content: '',
206
+ cost_usd: 0,
207
+ latency_ms,
208
+ finish_reason: 'error',
209
+ raw: { status: response.status, error: errorText },
210
+ toCapturedCall: ({ id, started_at, completed_at, span_kind }) => ({
211
+ id,
212
+ input: {
213
+ prompt: request.messages.map((m) => ({ role: m.role, content: m.content })),
214
+ model,
215
+ metadata: request.metadata,
216
+ },
217
+ output: { error: errorText },
218
+ started_at,
219
+ completed_at,
220
+ cost_usd: 0,
221
+ latency_ms,
222
+ ...(span_kind !== undefined ? { span_kind } : {}),
223
+ }),
224
+ };
225
+ }
226
+ const rawJson = (await response.json());
227
+ // Normalize response: Cloudflare Workers AI REST API may wrap the
228
+ // OpenAI-compatible response inside { success, result: { ... } },
229
+ // or return the legacy format { result: { response: "text" } }.
230
+ const data = normalizeOpenAIResponse(rawJson);
231
+ const choice = data.choices[0];
232
+ // Cast to Record to access reasoning_content/reasoning (not in NormalizedResponse type)
233
+ const msg = choice?.message;
234
+ const content = msg?.content ||
235
+ msg?.reasoning_content ||
236
+ msg?.reasoning ||
237
+ '';
238
+ const tokens_in = data.usage?.prompt_tokens ?? approxTokens(request.messages.map((m) => m.content).join(''));
239
+ const tokens_out = data.usage?.completion_tokens ?? approxTokens(content);
240
+ const cost_usd = estimateCost(model, tokens_in, tokens_out, this.pricing);
241
+ const finish_reason = choice?.finish_reason ?? 'stop';
242
+ return {
243
+ content,
244
+ cost_usd,
245
+ latency_ms,
246
+ tokens_in,
247
+ tokens_out,
248
+ finish_reason: finish_reason,
249
+ raw: rawJson,
250
+ toCapturedCall: ({ id, started_at, completed_at, span_kind }) => ({
251
+ id,
252
+ input: {
253
+ prompt: request.messages.map((m) => ({ role: m.role, content: m.content })),
254
+ model,
255
+ metadata: request.metadata,
256
+ },
257
+ output: { content },
258
+ started_at,
259
+ completed_at,
260
+ cost_usd,
261
+ latency_ms,
262
+ ...(span_kind !== undefined ? { span_kind } : {}),
263
+ }),
264
+ };
265
+ }
266
+ }
267
+ /**
268
+ * Anthropic Messages API caller.
269
+ */
270
+ export class AnthropicCaller {
271
+ provider = 'anthropic';
272
+ apiKey;
273
+ baseURL;
274
+ defaultModel;
275
+ timeout;
276
+ constructor(opts) {
277
+ this.apiKey = opts.apiKey;
278
+ this.baseURL = opts.baseURL ?? 'https://api.anthropic.com';
279
+ this.defaultModel = opts.defaultModel ?? 'claude-3-5-haiku';
280
+ this.timeout = opts.timeout ?? 120_000;
281
+ }
282
+ async call(request) {
283
+ const start = performance.now();
284
+ const model = request.model || this.defaultModel;
285
+ const systemMessage = request.messages.find((m) => m.role === 'system');
286
+ const messages = request.messages
287
+ .filter((m) => m.role !== 'system')
288
+ .map((m) => ({ role: m.role, content: m.content }));
289
+ const temperature = request.seed !== undefined ? 0 : (request.temperature ?? 0);
290
+ const body = {
291
+ model,
292
+ messages,
293
+ max_tokens: request.max_tokens ?? 4096,
294
+ temperature,
295
+ };
296
+ if (systemMessage) {
297
+ body.system = systemMessage.content;
298
+ }
299
+ const controller = new AbortController();
300
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
301
+ let response;
302
+ try {
303
+ response = await fetch(`${this.baseURL}/v1/messages`, {
304
+ method: 'POST',
305
+ headers: {
306
+ 'Content-Type': 'application/json',
307
+ 'x-api-key': this.apiKey,
308
+ 'anthropic-version': '2023-06-01',
309
+ },
310
+ body: JSON.stringify(body),
311
+ signal: controller.signal,
312
+ });
313
+ }
314
+ finally {
315
+ clearTimeout(timeoutId);
316
+ }
317
+ const latency_ms = performance.now() - start;
318
+ if (!response.ok) {
319
+ const errorText = await response.text().catch(() => '');
320
+ return {
321
+ content: '',
322
+ cost_usd: 0,
323
+ latency_ms,
324
+ finish_reason: 'error',
325
+ raw: { status: response.status, error: errorText },
326
+ toCapturedCall: ({ id, started_at, completed_at, span_kind }) => ({
327
+ id,
328
+ input: {
329
+ prompt: request.messages.map((m) => ({ role: m.role, content: m.content })),
330
+ model,
331
+ metadata: request.metadata,
332
+ },
333
+ output: { error: errorText },
334
+ started_at,
335
+ completed_at,
336
+ cost_usd: 0,
337
+ latency_ms,
338
+ ...(span_kind !== undefined ? { span_kind } : {}),
339
+ }),
340
+ };
341
+ }
342
+ const data = (await response.json());
343
+ const content = data.content?.map((c) => c.text).join('') ?? '';
344
+ const tokens_in = data.usage?.input_tokens ?? approxTokens(request.messages.map((m) => m.content).join(''));
345
+ const tokens_out = data.usage?.output_tokens ?? approxTokens(content);
346
+ const cost_usd = estimateCost(model, tokens_in, tokens_out, ANTHROPIC_PRICING);
347
+ const finish_reason = data.stop_reason ?? 'stop';
348
+ return {
349
+ content,
350
+ cost_usd,
351
+ latency_ms,
352
+ tokens_in,
353
+ tokens_out,
354
+ finish_reason: finish_reason,
355
+ raw: data,
356
+ toCapturedCall: ({ id, started_at, completed_at, span_kind }) => ({
357
+ id,
358
+ input: {
359
+ prompt: request.messages.map((m) => ({ role: m.role, content: m.content })),
360
+ model,
361
+ metadata: request.metadata,
362
+ },
363
+ output: { content },
364
+ started_at,
365
+ completed_at,
366
+ cost_usd,
367
+ latency_ms,
368
+ ...(span_kind !== undefined ? { span_kind } : {}),
369
+ }),
370
+ };
371
+ }
372
+ }
373
+ /**
374
+ * Google Gemini API caller.
375
+ * Uses the generateContent REST endpoint (not OpenAI-compatible).
376
+ */
377
+ export class GoogleCaller {
378
+ provider = 'google';
379
+ apiKey;
380
+ defaultModel;
381
+ timeout;
382
+ constructor(opts) {
383
+ this.apiKey = opts.apiKey;
384
+ this.defaultModel = opts.defaultModel ?? 'gemini-2.5-flash';
385
+ this.timeout = opts.timeout ?? 120_000;
386
+ }
387
+ async call(request) {
388
+ const start = performance.now();
389
+ const model = request.model || this.defaultModel;
390
+ const systemMessage = request.messages.find((m) => m.role === 'system');
391
+ const contents = request.messages
392
+ .filter((m) => m.role !== 'system')
393
+ .map((m) => ({
394
+ role: m.role === 'assistant' ? 'model' : 'user',
395
+ parts: [{ text: m.content }],
396
+ }));
397
+ const body = {
398
+ contents,
399
+ generationConfig: {
400
+ temperature: request.temperature ?? 0,
401
+ maxOutputTokens: request.max_tokens ?? 4096,
402
+ },
403
+ };
404
+ if (systemMessage) {
405
+ body.systemInstruction = { parts: [{ text: systemMessage.content }] };
406
+ }
407
+ const controller = new AbortController();
408
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
409
+ let response;
410
+ try {
411
+ response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${this.apiKey}`, {
412
+ method: 'POST',
413
+ headers: { 'Content-Type': 'application/json' },
414
+ body: JSON.stringify(body),
415
+ signal: controller.signal,
416
+ });
417
+ }
418
+ finally {
419
+ clearTimeout(timeoutId);
420
+ }
421
+ const latency_ms = performance.now() - start;
422
+ if (!response.ok) {
423
+ const errorText = await response.text().catch(() => '');
424
+ return {
425
+ content: '',
426
+ cost_usd: 0,
427
+ latency_ms,
428
+ finish_reason: 'error',
429
+ raw: { status: response.status, error: errorText },
430
+ toCapturedCall: ({ id, started_at, completed_at, span_kind }) => ({
431
+ id,
432
+ input: {
433
+ prompt: request.messages.map((m) => ({ role: m.role, content: m.content })),
434
+ model,
435
+ metadata: request.metadata,
436
+ },
437
+ output: { error: errorText },
438
+ started_at,
439
+ completed_at,
440
+ cost_usd: 0,
441
+ latency_ms,
442
+ ...(span_kind !== undefined ? { span_kind } : {}),
443
+ }),
444
+ };
445
+ }
446
+ const data = (await response.json());
447
+ const content = data.candidates?.[0]?.content?.parts?.map((p) => p.text).join('') ?? '';
448
+ const tokens_in = data.usageMetadata?.promptTokenCount ?? approxTokens(request.messages.map((m) => m.content).join(''));
449
+ const tokens_out = data.usageMetadata?.candidatesTokenCount ?? approxTokens(content);
450
+ const cost_usd = estimateCost(model, tokens_in, tokens_out, GOOGLE_PRICING);
451
+ const geminiFinish = data.candidates?.[0]?.finishReason ?? 'STOP';
452
+ const finish_reason = geminiFinish === 'MAX_TOKENS' ? 'length' : 'stop';
453
+ return {
454
+ content,
455
+ cost_usd,
456
+ latency_ms,
457
+ tokens_in,
458
+ tokens_out,
459
+ finish_reason: finish_reason,
460
+ raw: data,
461
+ toCapturedCall: ({ id, started_at, completed_at, span_kind }) => ({
462
+ id,
463
+ input: {
464
+ prompt: request.messages.map((m) => ({ role: m.role, content: m.content })),
465
+ model,
466
+ metadata: request.metadata,
467
+ },
468
+ output: { content },
469
+ started_at,
470
+ completed_at,
471
+ cost_usd,
472
+ latency_ms,
473
+ ...(span_kind !== undefined ? { span_kind } : {}),
474
+ }),
475
+ };
476
+ }
477
+ }
478
+ /** Known providers and their env var / base URL defaults. */
479
+ export const PROVIDER_REGISTRY = {
480
+ openai: {
481
+ envKey: 'OPENAI_API_KEY',
482
+ envBaseURL: 'OPENAI_BASE_URL',
483
+ baseURL: 'https://api.openai.com',
484
+ defaultModel: 'gpt-4o-mini',
485
+ },
486
+ anthropic: {
487
+ envKey: 'ANTHROPIC_API_KEY',
488
+ envBaseURL: 'ANTHROPIC_BASE_URL',
489
+ baseURL: 'https://api.anthropic.com',
490
+ defaultModel: 'claude-3-5-haiku',
491
+ },
492
+ google: {
493
+ envKey: 'GOOGLE_API_KEY',
494
+ baseURL: 'https://generativelanguage.googleapis.com',
495
+ defaultModel: 'gemini-2.5-flash',
496
+ },
497
+ groq: {
498
+ envKey: 'GROQ_API_KEY',
499
+ baseURL: 'https://api.groq.com/openai',
500
+ defaultModel: 'llama-3.1-70b-versatile',
501
+ },
502
+ openrouter: {
503
+ envKey: 'OPENROUTER_API_KEY',
504
+ baseURL: 'https://openrouter.ai/api',
505
+ defaultModel: 'openai/gpt-4o-mini',
506
+ },
507
+ cloudflare: {
508
+ envKey: 'CLOUDFLARE_API_TOKEN',
509
+ baseURL: '',
510
+ defaultModel: '@cf/meta/llama-3.1-8b-instruct',
511
+ },
512
+ opencode: {
513
+ envKey: 'OPENCODE_API_KEY',
514
+ baseURL: 'https://opencode.ai/zen/v1',
515
+ defaultModel: 'deepseek-v4-flash',
516
+ },
517
+ ollama: {
518
+ envKey: 'OLLAMA_API_KEY',
519
+ envBaseURL: 'OLLAMA_BASE_URL',
520
+ baseURL: 'http://localhost:11434/v1',
521
+ defaultModel: 'llama3.1',
522
+ keyOptional: true,
523
+ },
524
+ };
525
+ /**
526
+ * Parse a "provider:model" candidate ref into { provider, model }.
527
+ * Falls back to the given defaultProvider if no colon prefix.
528
+ */
529
+ export function parseProviderModel(candidateRef, defaultProvider) {
530
+ const colonIdx = candidateRef.indexOf(':');
531
+ if (colonIdx === -1) {
532
+ return { provider: defaultProvider, model: candidateRef };
533
+ }
534
+ const prefix = candidateRef.slice(0, colonIdx);
535
+ if (prefix in PROVIDER_REGISTRY || prefix === 'mock') {
536
+ return { provider: prefix, model: candidateRef.slice(colonIdx + 1) };
537
+ }
538
+ return { provider: defaultProvider, model: candidateRef };
539
+ }
540
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * OTel export — convert Turn[] traces to OpenTelemetry spans and send
3
+ * to any OTLP-compatible backend (Langfuse, Jaeger, Datadog, Grafana Tempo, etc.).
4
+ *
5
+ * Uses GenAI semantic conventions for LLM-specific attributes.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { exportTurnsToOTel } from '@lanefoundry/gatelane-engine';
10
+ *
11
+ * await exportTurnsToOTel(turns, {
12
+ * endpoint: 'https://cloud.langfuse.com/api/public/otel',
13
+ * headers: { Authorization: 'Basic <base64(publicKey:secretKey)>' },
14
+ * });
15
+ * ```
16
+ */
17
+ import type { Turn } from '@lanefoundry/gatelane-sdk/capture';
18
+ export type OTelExportConfig = {
19
+ /** OTLP/HTTP endpoint, e.g. https://cloud.langfuse.com/api/public/otel */
20
+ endpoint: string;
21
+ /** Custom headers, e.g. Authorization for Langfuse/Datadog. */
22
+ headers?: Record<string, string>;
23
+ /** OTel service name (default: "gatelane"). */
24
+ service_name?: string;
25
+ };
26
+ /**
27
+ * Export Turn[] traces to an OTLP-compatible backend.
28
+ *
29
+ * Creates a temporary TracerProvider with an OTLP/HTTP exporter, converts
30
+ * each Turn with a span_id into an OTel span (using GenAI semantic
31
+ * conventions), exports them, and shuts down.
32
+ */
33
+ export declare function exportTurnsToOTel(turns: ReadonlyArray<Turn>, config: OTelExportConfig): Promise<{
34
+ exported: number;
35
+ }>;
36
+ //# sourceMappingURL=otel-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel-export.d.ts","sourceRoot":"","sources":["../src/otel-export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mCAAmC,CAAC;AAE9D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAUF;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,EAC1B,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAkI/B"}