@lanefoundry/gatelane-engine 0.0.0-canary-b3f6165

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/LICENSE +190 -0
  2. package/dist/attack.d.ts +53 -0
  3. package/dist/attack.d.ts.map +1 -0
  4. package/dist/attack.js +75 -0
  5. package/dist/attack.js.map +1 -0
  6. package/dist/audit.d.ts +56 -0
  7. package/dist/audit.d.ts.map +1 -0
  8. package/dist/audit.js +115 -0
  9. package/dist/audit.js.map +1 -0
  10. package/dist/compare.d.ts +45 -0
  11. package/dist/compare.d.ts.map +1 -0
  12. package/dist/compare.js +118 -0
  13. package/dist/compare.js.map +1 -0
  14. package/dist/evaluate.d.ts +40 -0
  15. package/dist/evaluate.d.ts.map +1 -0
  16. package/dist/evaluate.js +87 -0
  17. package/dist/evaluate.js.map +1 -0
  18. package/dist/index.d.ts +19 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +19 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/judge.d.ts +68 -0
  23. package/dist/judge.d.ts.map +1 -0
  24. package/dist/judge.js +102 -0
  25. package/dist/judge.js.map +1 -0
  26. package/dist/llm.d.ts +158 -0
  27. package/dist/llm.d.ts.map +1 -0
  28. package/dist/llm.js +540 -0
  29. package/dist/llm.js.map +1 -0
  30. package/dist/otel-export.d.ts +36 -0
  31. package/dist/otel-export.d.ts.map +1 -0
  32. package/dist/otel-export.js +162 -0
  33. package/dist/otel-export.js.map +1 -0
  34. package/dist/replay.d.ts +51 -0
  35. package/dist/replay.d.ts.map +1 -0
  36. package/dist/replay.js +260 -0
  37. package/dist/replay.js.map +1 -0
  38. package/dist/runner.d.ts +46 -0
  39. package/dist/runner.d.ts.map +1 -0
  40. package/dist/runner.js +250 -0
  41. package/dist/runner.js.map +1 -0
  42. package/dist/scan.d.ts +172 -0
  43. package/dist/scan.d.ts.map +1 -0
  44. package/dist/scan.js +260 -0
  45. package/dist/scan.js.map +1 -0
  46. package/dist/sign.d.ts +20 -0
  47. package/dist/sign.d.ts.map +1 -0
  48. package/dist/sign.js +64 -0
  49. package/dist/sign.js.map +1 -0
  50. package/dist/tracing.d.ts +20 -0
  51. package/dist/tracing.d.ts.map +1 -0
  52. package/dist/tracing.js +65 -0
  53. package/dist/tracing.js.map +1 -0
  54. package/package.json +91 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"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"}
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"}