@traccia2/sdk 0.0.3 → 0.0.5
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.
- package/README.md +177 -7
- package/dist/integrations/langchain-callback.d.ts +27 -10
- package/dist/integrations/langchain-callback.d.ts.map +1 -1
- package/dist/integrations/langchain-callback.js +189 -38
- package/dist/integrations/langchain-callback.js.map +1 -1
- package/package.json +1 -1
- package/src/integrations/langchain-callback.ts +217 -41
package/README.md
CHANGED
|
@@ -332,11 +332,11 @@ await stopTracing();
|
|
|
332
332
|
|
|
333
333
|
#### LangChain with Callback Handler
|
|
334
334
|
|
|
335
|
-
The SDK provides a `TraciaCallbackHandler` for seamless integration with LangChain:
|
|
335
|
+
The SDK provides a `TraciaCallbackHandler` for seamless integration with LangChain. It extends LangChain's `BaseCallbackHandler` for proper type safety and interface compliance:
|
|
336
336
|
|
|
337
337
|
```typescript
|
|
338
|
-
import { startTracing,
|
|
339
|
-
import { TraciaCallbackHandler } from '@traccia/sdk/integrations
|
|
338
|
+
import { startTracing, getTracerProvider } from '@traccia/sdk';
|
|
339
|
+
import { TraciaCallbackHandler } from '@traccia/sdk/integrations';
|
|
340
340
|
import { ChatOpenAI } from '@langchain/openai';
|
|
341
341
|
import { AgentExecutor, createOpenAIToolsAgent } from 'langchain/agents';
|
|
342
342
|
|
|
@@ -344,6 +344,9 @@ import { AgentExecutor, createOpenAIToolsAgent } from 'langchain/agents';
|
|
|
344
344
|
await startTracing({
|
|
345
345
|
apiKey: 'your-api-key',
|
|
346
346
|
enableConsoleExporter: true,
|
|
347
|
+
enableSpanLogging: true, // Log spans immediately as they complete
|
|
348
|
+
maxExportBatchSize: 1, // Export every span immediately
|
|
349
|
+
scheduleDelayMs: 100, // Quick flush interval
|
|
347
350
|
});
|
|
348
351
|
|
|
349
352
|
// Create callback handler for tracing
|
|
@@ -371,32 +374,199 @@ const executor = new AgentExecutor({
|
|
|
371
374
|
const result = await executor.invoke({
|
|
372
375
|
input: 'Your prompt here',
|
|
373
376
|
});
|
|
377
|
+
|
|
378
|
+
// Flush pending spans to ensure they're exported/logged
|
|
379
|
+
const provider = getTracerProvider();
|
|
380
|
+
await provider.forceFlush();
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
**Using with ChatOllama (Local Models):**
|
|
384
|
+
|
|
385
|
+
If you're using ChatOllama instead of ChatOpenAI for local LLM inference:
|
|
386
|
+
|
|
387
|
+
```typescript
|
|
388
|
+
import { startTracing, getTracerProvider } from '@traccia/sdk';
|
|
389
|
+
import { TraciaCallbackHandler } from '@traccia/sdk/integrations';
|
|
390
|
+
import { ChatOllama } from '@langchain/ollama';
|
|
391
|
+
|
|
392
|
+
// Initialize tracing
|
|
393
|
+
await startTracing({
|
|
394
|
+
enableConsoleExporter: true,
|
|
395
|
+
enableSpanLogging: true,
|
|
396
|
+
maxExportBatchSize: 1,
|
|
397
|
+
scheduleDelayMs: 100,
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
// Create callback handler
|
|
401
|
+
const traciaHandler = new TraciaCallbackHandler();
|
|
402
|
+
|
|
403
|
+
// Use with ChatOllama (local model)
|
|
404
|
+
const model = new ChatOllama({
|
|
405
|
+
model: 'mistral', // or 'llama2', 'neural-chat', etc.
|
|
406
|
+
baseUrl: 'http://localhost:11434', // Ollama server
|
|
407
|
+
callbacks: [traciaHandler], // Enable tracing
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
// Use the model - fully traced!
|
|
411
|
+
const response = await model.invoke({ input: 'Hello, how are you?' });
|
|
412
|
+
console.log(response);
|
|
413
|
+
|
|
414
|
+
// Flush spans
|
|
415
|
+
const provider = getTracerProvider();
|
|
416
|
+
await provider.forceFlush();
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
**Seeing Traces in Console:**
|
|
420
|
+
|
|
421
|
+
To see traces printed to the console immediately, use these configuration options:
|
|
422
|
+
|
|
423
|
+
```typescript
|
|
424
|
+
await startTracing({
|
|
425
|
+
enableConsoleExporter: true, // Export to console
|
|
426
|
+
enableSpanLogging: true, // Log each completed span
|
|
427
|
+
maxExportBatchSize: 1, // Export immediately (don't batch)
|
|
428
|
+
scheduleDelayMs: 100, // Flush frequently
|
|
429
|
+
});
|
|
374
430
|
```
|
|
375
431
|
|
|
432
|
+
Without these options, spans are batched and exported on a delay (default 5 seconds).
|
|
433
|
+
|
|
434
|
+
**Troubleshooting - No Traces in Console:**
|
|
435
|
+
|
|
436
|
+
If you don't see traces in the console, check:
|
|
437
|
+
|
|
438
|
+
1. **LangChain Version Compatibility:**
|
|
439
|
+
- TraciaCallbackHandler is compatible with LangChain 0.0.x, 0.1.x, 0.2.x, and 1.x
|
|
440
|
+
- Verified to work with LangChain 0.2.20
|
|
441
|
+
- Works with both `ChatOpenAI` and `ChatOllama`
|
|
442
|
+
- Check your installed version: `npm list @langchain/core`
|
|
443
|
+
|
|
444
|
+
**For ChatOllama (Ollama local models):**
|
|
445
|
+
```typescript
|
|
446
|
+
// Install Ollama integration
|
|
447
|
+
npm install @langchain/ollama
|
|
448
|
+
|
|
449
|
+
// Use with ChatOllama
|
|
450
|
+
import { ChatOllama } from '@langchain/ollama';
|
|
451
|
+
|
|
452
|
+
const handler = new TraciaCallbackHandler();
|
|
453
|
+
const model = new ChatOllama({
|
|
454
|
+
model: 'mistral',
|
|
455
|
+
baseUrl: 'http://localhost:11434',
|
|
456
|
+
callbacks: [handler], // Enable tracing
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
const response = await model.invoke({ input: 'Hello!' });
|
|
460
|
+
|
|
461
|
+
// Don't forget to flush!
|
|
462
|
+
const provider = getTracerProvider();
|
|
463
|
+
await provider.forceFlush();
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
2. **Callback Handler Configuration:**
|
|
467
|
+
```typescript
|
|
468
|
+
// Make sure the handler is passed to ALL components
|
|
469
|
+
const handler = new TraciaCallbackHandler();
|
|
470
|
+
|
|
471
|
+
const model = new ChatOpenAI({
|
|
472
|
+
callbacks: [handler], // Required for LLM
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
const executor = new AgentExecutor({
|
|
476
|
+
callbacks: [handler], // Required for executor
|
|
477
|
+
// ... other options
|
|
478
|
+
});
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
3. **Force Flush is Critical:**
|
|
482
|
+
```typescript
|
|
483
|
+
// Without this, spans may not be exported!
|
|
484
|
+
const provider = getTracerProvider();
|
|
485
|
+
await provider.forceFlush(); // Wait for all spans to flush
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
4. **Check Configuration:**
|
|
489
|
+
```typescript
|
|
490
|
+
// Verify these are set correctly
|
|
491
|
+
await startTracing({
|
|
492
|
+
enableSpanLogging: true, // Logs each span immediately
|
|
493
|
+
enableConsoleExporter: true, // Exports to console
|
|
494
|
+
maxExportBatchSize: 1, // Export immediately (don't batch)
|
|
495
|
+
scheduleDelayMs: 100, // Quick flush
|
|
496
|
+
});
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
5. **Verify Callbacks Are Being Called:**
|
|
500
|
+
- Add a console.log in your code to confirm model is being invoked
|
|
501
|
+
- Check that the handler instance is the same object passed to all components
|
|
502
|
+
- Ensure no errors are being silently caught
|
|
503
|
+
|
|
504
|
+
6. **Check Node.js Event Loop:**
|
|
505
|
+
- Spans are processed asynchronously
|
|
506
|
+
- Make sure you're not exiting the process immediately
|
|
507
|
+
- Use `await provider.forceFlush()` before process.exit()
|
|
508
|
+
|
|
509
|
+
**What Gets Traced:**
|
|
510
|
+
|
|
376
511
|
The `TraciaCallbackHandler` automatically traces:
|
|
377
512
|
|
|
378
|
-
- **LLM Calls**: Model name, token counts, latency
|
|
513
|
+
- **LLM Calls**: Model name, temperature, max tokens, top-p/k, token counts, latency
|
|
379
514
|
- **Agent Actions**: Tool selection and execution
|
|
380
515
|
- **Chain Steps**: Multi-step reasoning and intermediate results
|
|
381
516
|
- **Tool Usage**: Tool names, inputs, and outputs
|
|
382
517
|
- **Errors & Exceptions**: Automatic error recording
|
|
383
518
|
|
|
519
|
+
**Auto-Captured LLM Configuration:**
|
|
520
|
+
|
|
521
|
+
The handler automatically extracts and logs LLM defaults:
|
|
522
|
+
|
|
523
|
+
```typescript
|
|
524
|
+
// For any LLM, these are automatically captured:
|
|
525
|
+
{
|
|
526
|
+
'model': 'gpt-4', // Auto-detected from modelName/model/name
|
|
527
|
+
'temperature': 0.7, // Auto-detected from llm.temperature
|
|
528
|
+
'max_tokens': 2000, // Auto-detected from llm.maxTokens
|
|
529
|
+
'top_p': 0.9, // Auto-detected if available
|
|
530
|
+
'top_k': 40, // Auto-detected if available
|
|
531
|
+
'base_url': 'http://localhost:11434' // For local models (Ollama)
|
|
532
|
+
}
|
|
533
|
+
```
|
|
534
|
+
|
|
384
535
|
**Traced Metrics:**
|
|
385
536
|
|
|
386
537
|
```typescript
|
|
387
538
|
// Automatically captured attributes:
|
|
388
539
|
{
|
|
389
|
-
|
|
540
|
+
// LLM Configuration (auto-extracted from defaults)
|
|
541
|
+
'model': 'gpt-4', // Auto-detected model name
|
|
542
|
+
'temperature': 0.7, // If configured
|
|
543
|
+
'max_tokens': 2000, // If configured
|
|
544
|
+
'top_p': 0.9, // If available
|
|
545
|
+
'top_k': 40, // If available
|
|
546
|
+
'base_url': 'http://localhost:11434' // For local models
|
|
547
|
+
|
|
548
|
+
// LLM Runtime Metrics
|
|
390
549
|
'llm.tokens.prompt': 150,
|
|
391
550
|
'llm.tokens.completion': 75,
|
|
392
551
|
'llm.tokens.total': 225,
|
|
552
|
+
'output_length': 450,
|
|
553
|
+
'finish_reason': 'stop', // If provided by model
|
|
554
|
+
|
|
555
|
+
// Agent & Tool Usage
|
|
393
556
|
'agent.action': 'tool_use',
|
|
394
557
|
'agent.tool': 'calculator',
|
|
395
558
|
'agent.tool.input': '{"expression": "2 + 2"}',
|
|
396
559
|
'agent.tool.output': '4',
|
|
560
|
+
|
|
561
|
+
// Chain Execution
|
|
397
562
|
'chain.steps': 3,
|
|
398
|
-
'
|
|
399
|
-
'
|
|
563
|
+
'chain_type': 'agent_executor',
|
|
564
|
+
'input_length': 1250,
|
|
565
|
+
'output_length': 450,
|
|
566
|
+
|
|
567
|
+
// Error Handling
|
|
568
|
+
'error.type': 'ValidationError', // If applicable
|
|
569
|
+
'error.message': 'Invalid input', // If applicable
|
|
400
570
|
}
|
|
401
571
|
```
|
|
402
572
|
|
|
@@ -3,27 +3,32 @@
|
|
|
3
3
|
* Integrates with LangChain's callback system to automatically instrument
|
|
4
4
|
* LLM calls, chains, agents, and tools.
|
|
5
5
|
*/
|
|
6
|
+
declare let BaseCallbackHandler: any;
|
|
6
7
|
/**
|
|
7
8
|
* LangChain Callback Handler for Traccia SDK.
|
|
8
9
|
* Automatically traces LLM calls, chains, agents, and tools.
|
|
9
10
|
*
|
|
11
|
+
* Extends LangChain's BaseCallbackHandler for proper interface compliance.
|
|
12
|
+
* Compatible with LangChain 0.0.x, 0.1.x, 0.2.x, and 1.x versions.
|
|
13
|
+
*
|
|
10
14
|
* @example
|
|
11
|
-
* import { ChatOpenAI } from 'langchain/
|
|
12
|
-
* import {
|
|
13
|
-
* import { TraciaCallbackHandler } from '@traccia/sdk/integrations/langchain';
|
|
15
|
+
* import { ChatOpenAI } from '@langchain/openai';
|
|
16
|
+
* import { TraciaCallbackHandler } from '@traccia/sdk/integrations';
|
|
14
17
|
*
|
|
15
18
|
* const handler = new TraciaCallbackHandler();
|
|
16
|
-
* const
|
|
17
|
-
* llm: new ChatOpenAI(),
|
|
18
|
-
* callbacks: [handler],
|
|
19
|
-
* });
|
|
19
|
+
* const model = new ChatOpenAI({ callbacks: [handler] });
|
|
20
20
|
*
|
|
21
|
-
* await
|
|
22
|
-
* // Automatically traced with spans for LLM
|
|
21
|
+
* const response = await model.invoke({ input: 'Hello!' });
|
|
22
|
+
* // Automatically traced with spans for LLM calls, tokens, latency, etc.
|
|
23
23
|
*/
|
|
24
|
-
export declare class TraciaCallbackHandler {
|
|
24
|
+
export declare class TraciaCallbackHandler extends BaseCallbackHandler {
|
|
25
25
|
private tracer;
|
|
26
26
|
private spanStack;
|
|
27
|
+
/**
|
|
28
|
+
* Extract model name from LLM instance, checking multiple property locations.
|
|
29
|
+
* Different LLM implementations store the model name in different properties.
|
|
30
|
+
*/
|
|
31
|
+
private extractModelName;
|
|
27
32
|
/**
|
|
28
33
|
* Handle LLM start - called when an LLM begins execution.
|
|
29
34
|
*/
|
|
@@ -68,5 +73,17 @@ export declare class TraciaCallbackHandler {
|
|
|
68
73
|
* Handle agent finish.
|
|
69
74
|
*/
|
|
70
75
|
handleAgentFinish(finish: any, runId: string): Promise<void>;
|
|
76
|
+
onLLMStart(llm: any, prompts: string[], runId: string, parentRunId?: string): Promise<void>;
|
|
77
|
+
onLLMEnd(output: any, runId: string): Promise<void>;
|
|
78
|
+
onLLMError(error: Error, runId: string): Promise<void>;
|
|
79
|
+
onChainStart(chain: any, inputs: any, runId: string, parentRunId?: string): Promise<void>;
|
|
80
|
+
onChainEnd(output: any, runId: string): Promise<void>;
|
|
81
|
+
onChainError(error: Error, runId: string): Promise<void>;
|
|
82
|
+
onToolStart(tool: any, input: string, runId: string, parentRunId?: string): Promise<void>;
|
|
83
|
+
onToolEnd(output: string, runId: string): Promise<void>;
|
|
84
|
+
onToolError(error: Error, runId: string): Promise<void>;
|
|
85
|
+
onAgentAction(action: any, runId: string): Promise<void>;
|
|
86
|
+
onAgentFinish(finish: any, runId: string): Promise<void>;
|
|
71
87
|
}
|
|
88
|
+
export {};
|
|
72
89
|
//# sourceMappingURL=langchain-callback.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"langchain-callback.d.ts","sourceRoot":"","sources":["../../src/integrations/langchain-callback.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"langchain-callback.d.ts","sourceRoot":"","sources":["../../src/integrations/langchain-callback.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,41 +7,109 @@
|
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
8
|
exports.TraciaCallbackHandler = void 0;
|
|
9
9
|
const auto_1 = require("../auto");
|
|
10
|
+
// Try to import BaseCallbackHandler from different LangChain versions
|
|
11
|
+
let BaseCallbackHandler = class {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.ignoreAgent = false;
|
|
14
|
+
this.ignoreChain = false;
|
|
15
|
+
this.ignoreLLM = false;
|
|
16
|
+
this.ignoreRetriever = false;
|
|
17
|
+
this.ignoreToolUse = false;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
try {
|
|
21
|
+
// Try LangChain 0.2.x+
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
23
|
+
const { BaseCallbackHandler: Handler } = require('@langchain/core/callbacks/base');
|
|
24
|
+
BaseCallbackHandler = Handler;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
try {
|
|
28
|
+
// Try older LangChain versions
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
30
|
+
const { BaseCallbackHandler: Handler } = require('langchain/callbacks');
|
|
31
|
+
BaseCallbackHandler = Handler;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Fallback to basic implementation - user likely has LangChain installed
|
|
35
|
+
}
|
|
36
|
+
}
|
|
10
37
|
/**
|
|
11
38
|
* LangChain Callback Handler for Traccia SDK.
|
|
12
39
|
* Automatically traces LLM calls, chains, agents, and tools.
|
|
13
40
|
*
|
|
41
|
+
* Extends LangChain's BaseCallbackHandler for proper interface compliance.
|
|
42
|
+
* Compatible with LangChain 0.0.x, 0.1.x, 0.2.x, and 1.x versions.
|
|
43
|
+
*
|
|
14
44
|
* @example
|
|
15
|
-
* import { ChatOpenAI } from 'langchain/
|
|
16
|
-
* import {
|
|
17
|
-
* import { TraciaCallbackHandler } from '@traccia/sdk/integrations/langchain';
|
|
45
|
+
* import { ChatOpenAI } from '@langchain/openai';
|
|
46
|
+
* import { TraciaCallbackHandler } from '@traccia/sdk/integrations';
|
|
18
47
|
*
|
|
19
48
|
* const handler = new TraciaCallbackHandler();
|
|
20
|
-
* const
|
|
21
|
-
* llm: new ChatOpenAI(),
|
|
22
|
-
* callbacks: [handler],
|
|
23
|
-
* });
|
|
49
|
+
* const model = new ChatOpenAI({ callbacks: [handler] });
|
|
24
50
|
*
|
|
25
|
-
* await
|
|
26
|
-
* // Automatically traced with spans for LLM
|
|
51
|
+
* const response = await model.invoke({ input: 'Hello!' });
|
|
52
|
+
* // Automatically traced with spans for LLM calls, tokens, latency, etc.
|
|
27
53
|
*/
|
|
28
|
-
class TraciaCallbackHandler {
|
|
54
|
+
class TraciaCallbackHandler extends BaseCallbackHandler {
|
|
29
55
|
constructor() {
|
|
56
|
+
super(...arguments);
|
|
30
57
|
this.tracer = (0, auto_1.getTracer)('langchain');
|
|
31
58
|
this.spanStack = new Map();
|
|
32
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Extract model name from LLM instance, checking multiple property locations.
|
|
62
|
+
* Different LLM implementations store the model name in different properties.
|
|
63
|
+
*/
|
|
64
|
+
extractModelName(llm) {
|
|
65
|
+
// Check common model name properties
|
|
66
|
+
if (llm.modelName)
|
|
67
|
+
return llm.modelName; // ChatOpenAI, ChatAnthropic, etc.
|
|
68
|
+
if (llm.model)
|
|
69
|
+
return llm.model; // Ollama, etc.
|
|
70
|
+
if (llm.name && !llm.name.startsWith('langchain'))
|
|
71
|
+
return llm.name; // Generic name
|
|
72
|
+
if (llm._modelType)
|
|
73
|
+
return llm._modelType; // Fallback to type
|
|
74
|
+
if (llm.client?.model)
|
|
75
|
+
return llm.client.model; // Nested model property
|
|
76
|
+
return 'unknown';
|
|
77
|
+
}
|
|
33
78
|
/**
|
|
34
79
|
* Handle LLM start - called when an LLM begins execution.
|
|
35
80
|
*/
|
|
36
81
|
async handleLLMStart(llm, prompts, runId, _parentRunId) {
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
82
|
+
const modelName = this.extractModelName(llm);
|
|
83
|
+
const attributes = {
|
|
84
|
+
type: 'llm',
|
|
85
|
+
model: modelName,
|
|
86
|
+
prompt_count: prompts.length,
|
|
87
|
+
first_prompt_length: prompts[0]?.length || 0,
|
|
88
|
+
};
|
|
89
|
+
// Capture temperature if available
|
|
90
|
+
if (llm.temperature !== undefined) {
|
|
91
|
+
attributes.temperature = llm.temperature;
|
|
92
|
+
}
|
|
93
|
+
// Capture max tokens if available
|
|
94
|
+
if (llm.maxTokens !== undefined) {
|
|
95
|
+
attributes.max_tokens = llm.maxTokens;
|
|
96
|
+
}
|
|
97
|
+
if (llm.max_tokens !== undefined) {
|
|
98
|
+
attributes.max_tokens = llm.max_tokens;
|
|
99
|
+
}
|
|
100
|
+
// Capture top_p if available
|
|
101
|
+
if (llm.topP !== undefined) {
|
|
102
|
+
attributes.top_p = llm.topP;
|
|
103
|
+
}
|
|
104
|
+
// Capture top_k if available
|
|
105
|
+
if (llm.topK !== undefined) {
|
|
106
|
+
attributes.top_k = llm.topK;
|
|
107
|
+
}
|
|
108
|
+
// Capture base URL for local models (Ollama, etc.)
|
|
109
|
+
if (llm.baseUrl) {
|
|
110
|
+
attributes.base_url = llm.baseUrl;
|
|
111
|
+
}
|
|
112
|
+
const span = this.tracer.startSpan('llm', { attributes });
|
|
45
113
|
this.spanStack.set(runId, span);
|
|
46
114
|
}
|
|
47
115
|
/**
|
|
@@ -51,15 +119,47 @@ class TraciaCallbackHandler {
|
|
|
51
119
|
const span = this.spanStack.get(runId);
|
|
52
120
|
if (span) {
|
|
53
121
|
try {
|
|
54
|
-
|
|
122
|
+
// Try multiple ways to get token usage
|
|
123
|
+
// OpenAI format
|
|
124
|
+
const tokenUsage = output?.llmOutput?.token_usage ||
|
|
125
|
+
output?.token_usage ||
|
|
126
|
+
output?.metadata?.token_usage;
|
|
55
127
|
if (tokenUsage) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
128
|
+
if (tokenUsage.prompt_tokens !== undefined) {
|
|
129
|
+
span.setAttribute('llm.tokens.prompt', tokenUsage.prompt_tokens);
|
|
130
|
+
}
|
|
131
|
+
if (tokenUsage.completion_tokens !== undefined) {
|
|
132
|
+
span.setAttribute('llm.tokens.completion', tokenUsage.completion_tokens);
|
|
133
|
+
}
|
|
134
|
+
const totalTokens = (tokenUsage.prompt_tokens || 0) + (tokenUsage.completion_tokens || 0);
|
|
135
|
+
if (totalTokens > 0) {
|
|
136
|
+
span.setAttribute('llm.tokens.total', totalTokens);
|
|
137
|
+
}
|
|
59
138
|
}
|
|
139
|
+
// Capture output text length
|
|
60
140
|
if (output?.text) {
|
|
61
141
|
span.setAttribute('output_length', output.text.length);
|
|
62
142
|
}
|
|
143
|
+
else if (output?.generations && Array.isArray(output.generations)) {
|
|
144
|
+
const firstGeneration = output.generations[0];
|
|
145
|
+
if (firstGeneration?.[0]?.text) {
|
|
146
|
+
span.setAttribute('output_length', firstGeneration[0].text.length);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else if (output?.message?.content) {
|
|
150
|
+
// Ollama format (uses message.content)
|
|
151
|
+
const content = output.message.content;
|
|
152
|
+
const contentStr = typeof content === 'string' ? content : JSON.stringify(content);
|
|
153
|
+
span.setAttribute('output_length', contentStr.length);
|
|
154
|
+
}
|
|
155
|
+
else if (typeof output === 'string') {
|
|
156
|
+
// Direct string output
|
|
157
|
+
span.setAttribute('output_length', output.length);
|
|
158
|
+
}
|
|
159
|
+
// Capture finish reason if available
|
|
160
|
+
if (output?.llmOutput?.finish_reason) {
|
|
161
|
+
span.setAttribute('finish_reason', output.llmOutput.finish_reason);
|
|
162
|
+
}
|
|
63
163
|
}
|
|
64
164
|
catch (error) {
|
|
65
165
|
// Silently fail on attribute setting
|
|
@@ -84,14 +184,22 @@ class TraciaCallbackHandler {
|
|
|
84
184
|
*/
|
|
85
185
|
async handleChainStart(chain, inputs, runId, _parentRunId) {
|
|
86
186
|
const chainName = chain.name || chain._chainType || 'chain';
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
187
|
+
const attributes = {
|
|
188
|
+
type: 'chain',
|
|
189
|
+
chain_name: chainName,
|
|
190
|
+
chain_type: chain._chainType,
|
|
191
|
+
input_keys: Object.keys(inputs || {}).join(','),
|
|
192
|
+
input_count: Object.keys(inputs || {}).length,
|
|
193
|
+
};
|
|
194
|
+
// Capture total input length
|
|
195
|
+
try {
|
|
196
|
+
const inputStr = JSON.stringify(inputs);
|
|
197
|
+
attributes.input_length = inputStr.length;
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
// Silently fail
|
|
201
|
+
}
|
|
202
|
+
const span = this.tracer.startSpan(`chain:${chainName}`, { attributes });
|
|
95
203
|
this.spanStack.set(runId, span);
|
|
96
204
|
}
|
|
97
205
|
/**
|
|
@@ -129,14 +237,22 @@ class TraciaCallbackHandler {
|
|
|
129
237
|
*/
|
|
130
238
|
async handleToolStart(tool, input, runId, _parentRunId) {
|
|
131
239
|
const toolName = tool.name || 'unknown-tool';
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
240
|
+
const attributes = {
|
|
241
|
+
type: 'tool',
|
|
242
|
+
tool_name: toolName,
|
|
243
|
+
tool_description: tool.description || '',
|
|
244
|
+
input_length: typeof input === 'string' ? input.length : (typeof input === 'object' ? JSON.stringify(input).length : 0),
|
|
245
|
+
};
|
|
246
|
+
// Try to capture structured input
|
|
247
|
+
try {
|
|
248
|
+
if (typeof input === 'object') {
|
|
249
|
+
attributes.input_keys = Object.keys(input).join(',');
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
// Silently fail
|
|
254
|
+
}
|
|
255
|
+
const span = this.tracer.startSpan(`tool:${toolName}`, { attributes });
|
|
140
256
|
this.spanStack.set(runId, span);
|
|
141
257
|
}
|
|
142
258
|
/**
|
|
@@ -196,6 +312,41 @@ class TraciaCallbackHandler {
|
|
|
196
312
|
this.spanStack.delete(runId);
|
|
197
313
|
}
|
|
198
314
|
}
|
|
315
|
+
// LangChain uses 'on*' prefix for callback methods
|
|
316
|
+
// Provide aliases for compatibility
|
|
317
|
+
async onLLMStart(llm, prompts, runId, parentRunId) {
|
|
318
|
+
return this.handleLLMStart(llm, prompts, runId, parentRunId);
|
|
319
|
+
}
|
|
320
|
+
async onLLMEnd(output, runId) {
|
|
321
|
+
return this.handleLLMEnd(output, runId);
|
|
322
|
+
}
|
|
323
|
+
async onLLMError(error, runId) {
|
|
324
|
+
return this.handleLLMError(error, runId);
|
|
325
|
+
}
|
|
326
|
+
async onChainStart(chain, inputs, runId, parentRunId) {
|
|
327
|
+
return this.handleChainStart(chain, inputs, runId, parentRunId);
|
|
328
|
+
}
|
|
329
|
+
async onChainEnd(output, runId) {
|
|
330
|
+
return this.handleChainEnd(output, runId);
|
|
331
|
+
}
|
|
332
|
+
async onChainError(error, runId) {
|
|
333
|
+
return this.handleChainError(error, runId);
|
|
334
|
+
}
|
|
335
|
+
async onToolStart(tool, input, runId, parentRunId) {
|
|
336
|
+
return this.handleToolStart(tool, input, runId, parentRunId);
|
|
337
|
+
}
|
|
338
|
+
async onToolEnd(output, runId) {
|
|
339
|
+
return this.handleToolEnd(output, runId);
|
|
340
|
+
}
|
|
341
|
+
async onToolError(error, runId) {
|
|
342
|
+
return this.handleToolError(error, runId);
|
|
343
|
+
}
|
|
344
|
+
async onAgentAction(action, runId) {
|
|
345
|
+
return this.handleAgentAction(action, runId);
|
|
346
|
+
}
|
|
347
|
+
async onAgentFinish(finish, runId) {
|
|
348
|
+
return this.handleAgentFinish(finish, runId);
|
|
349
|
+
}
|
|
199
350
|
}
|
|
200
351
|
exports.TraciaCallbackHandler = TraciaCallbackHandler;
|
|
201
352
|
//# sourceMappingURL=langchain-callback.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"langchain-callback.js","sourceRoot":"","sources":["../../src/integrations/langchain-callback.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAGH,kCAAoC;AAEpC
|
|
1
|
+
{"version":3,"file":"langchain-callback.js","sourceRoot":"","sources":["../../src/integrations/langchain-callback.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -7,28 +7,66 @@
|
|
|
7
7
|
import { ISpan } from '../types';
|
|
8
8
|
import { getTracer } from '../auto';
|
|
9
9
|
|
|
10
|
+
// Try to import BaseCallbackHandler from different LangChain versions
|
|
11
|
+
let BaseCallbackHandler: any = class {
|
|
12
|
+
ignoreAgent = false;
|
|
13
|
+
ignoreChain = false;
|
|
14
|
+
ignoreLLM = false;
|
|
15
|
+
ignoreRetriever = false;
|
|
16
|
+
ignoreToolUse = false;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
// Try LangChain 0.2.x+
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
22
|
+
const { BaseCallbackHandler: Handler } = require('@langchain/core/callbacks/base');
|
|
23
|
+
BaseCallbackHandler = Handler;
|
|
24
|
+
} catch {
|
|
25
|
+
try {
|
|
26
|
+
// Try older LangChain versions
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
28
|
+
const { BaseCallbackHandler: Handler } = require('langchain/callbacks');
|
|
29
|
+
BaseCallbackHandler = Handler;
|
|
30
|
+
} catch {
|
|
31
|
+
// Fallback to basic implementation - user likely has LangChain installed
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
10
35
|
/**
|
|
11
36
|
* LangChain Callback Handler for Traccia SDK.
|
|
12
37
|
* Automatically traces LLM calls, chains, agents, and tools.
|
|
13
38
|
*
|
|
39
|
+
* Extends LangChain's BaseCallbackHandler for proper interface compliance.
|
|
40
|
+
* Compatible with LangChain 0.0.x, 0.1.x, 0.2.x, and 1.x versions.
|
|
41
|
+
*
|
|
14
42
|
* @example
|
|
15
|
-
* import { ChatOpenAI } from 'langchain/
|
|
16
|
-
* import {
|
|
17
|
-
* import { TraciaCallbackHandler } from '@traccia/sdk/integrations/langchain';
|
|
43
|
+
* import { ChatOpenAI } from '@langchain/openai';
|
|
44
|
+
* import { TraciaCallbackHandler } from '@traccia/sdk/integrations';
|
|
18
45
|
*
|
|
19
46
|
* const handler = new TraciaCallbackHandler();
|
|
20
|
-
* const
|
|
21
|
-
* llm: new ChatOpenAI(),
|
|
22
|
-
* callbacks: [handler],
|
|
23
|
-
* });
|
|
47
|
+
* const model = new ChatOpenAI({ callbacks: [handler] });
|
|
24
48
|
*
|
|
25
|
-
* await
|
|
26
|
-
* // Automatically traced with spans for LLM
|
|
49
|
+
* const response = await model.invoke({ input: 'Hello!' });
|
|
50
|
+
* // Automatically traced with spans for LLM calls, tokens, latency, etc.
|
|
27
51
|
*/
|
|
28
|
-
export class TraciaCallbackHandler {
|
|
52
|
+
export class TraciaCallbackHandler extends BaseCallbackHandler {
|
|
29
53
|
private tracer = getTracer('langchain');
|
|
30
54
|
private spanStack: Map<string, ISpan> = new Map();
|
|
31
55
|
|
|
56
|
+
/**
|
|
57
|
+
* Extract model name from LLM instance, checking multiple property locations.
|
|
58
|
+
* Different LLM implementations store the model name in different properties.
|
|
59
|
+
*/
|
|
60
|
+
private extractModelName(llm: any): string {
|
|
61
|
+
// Check common model name properties
|
|
62
|
+
if (llm.modelName) return llm.modelName; // ChatOpenAI, ChatAnthropic, etc.
|
|
63
|
+
if (llm.model) return llm.model; // Ollama, etc.
|
|
64
|
+
if (llm.name && !llm.name.startsWith('langchain')) return llm.name; // Generic name
|
|
65
|
+
if (llm._modelType) return llm._modelType; // Fallback to type
|
|
66
|
+
if (llm.client?.model) return llm.client.model; // Nested model property
|
|
67
|
+
return 'unknown';
|
|
68
|
+
}
|
|
69
|
+
|
|
32
70
|
/**
|
|
33
71
|
* Handle LLM start - called when an LLM begins execution.
|
|
34
72
|
*/
|
|
@@ -38,15 +76,44 @@ export class TraciaCallbackHandler {
|
|
|
38
76
|
runId: string,
|
|
39
77
|
_parentRunId?: string
|
|
40
78
|
): Promise<void> {
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
79
|
+
const modelName = this.extractModelName(llm);
|
|
80
|
+
|
|
81
|
+
const attributes: Record<string, any> = {
|
|
82
|
+
type: 'llm',
|
|
83
|
+
model: modelName,
|
|
84
|
+
prompt_count: prompts.length,
|
|
85
|
+
first_prompt_length: prompts[0]?.length || 0,
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// Capture temperature if available
|
|
89
|
+
if (llm.temperature !== undefined) {
|
|
90
|
+
attributes.temperature = llm.temperature;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Capture max tokens if available
|
|
94
|
+
if (llm.maxTokens !== undefined) {
|
|
95
|
+
attributes.max_tokens = llm.maxTokens;
|
|
96
|
+
}
|
|
97
|
+
if (llm.max_tokens !== undefined) {
|
|
98
|
+
attributes.max_tokens = llm.max_tokens;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Capture top_p if available
|
|
102
|
+
if (llm.topP !== undefined) {
|
|
103
|
+
attributes.top_p = llm.topP;
|
|
104
|
+
}
|
|
49
105
|
|
|
106
|
+
// Capture top_k if available
|
|
107
|
+
if (llm.topK !== undefined) {
|
|
108
|
+
attributes.top_k = llm.topK;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Capture base URL for local models (Ollama, etc.)
|
|
112
|
+
if (llm.baseUrl) {
|
|
113
|
+
attributes.base_url = llm.baseUrl;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const span = this.tracer.startSpan('llm', { attributes });
|
|
50
117
|
this.spanStack.set(runId, span);
|
|
51
118
|
}
|
|
52
119
|
|
|
@@ -57,18 +124,47 @@ export class TraciaCallbackHandler {
|
|
|
57
124
|
const span = this.spanStack.get(runId);
|
|
58
125
|
if (span) {
|
|
59
126
|
try {
|
|
60
|
-
|
|
127
|
+
// Try multiple ways to get token usage
|
|
128
|
+
// OpenAI format
|
|
129
|
+
const tokenUsage =
|
|
130
|
+
output?.llmOutput?.token_usage ||
|
|
131
|
+
output?.token_usage ||
|
|
132
|
+
output?.metadata?.token_usage;
|
|
133
|
+
|
|
61
134
|
if (tokenUsage) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
(
|
|
67
|
-
|
|
135
|
+
if (tokenUsage.prompt_tokens !== undefined) {
|
|
136
|
+
span.setAttribute('llm.tokens.prompt', tokenUsage.prompt_tokens);
|
|
137
|
+
}
|
|
138
|
+
if (tokenUsage.completion_tokens !== undefined) {
|
|
139
|
+
span.setAttribute('llm.tokens.completion', tokenUsage.completion_tokens);
|
|
140
|
+
}
|
|
141
|
+
const totalTokens = (tokenUsage.prompt_tokens || 0) + (tokenUsage.completion_tokens || 0);
|
|
142
|
+
if (totalTokens > 0) {
|
|
143
|
+
span.setAttribute('llm.tokens.total', totalTokens);
|
|
144
|
+
}
|
|
68
145
|
}
|
|
69
146
|
|
|
147
|
+
// Capture output text length
|
|
70
148
|
if (output?.text) {
|
|
71
149
|
span.setAttribute('output_length', output.text.length);
|
|
150
|
+
} else if (output?.generations && Array.isArray(output.generations)) {
|
|
151
|
+
const firstGeneration = output.generations[0];
|
|
152
|
+
if (firstGeneration?.[0]?.text) {
|
|
153
|
+
span.setAttribute('output_length', firstGeneration[0].text.length);
|
|
154
|
+
}
|
|
155
|
+
} else if (output?.message?.content) {
|
|
156
|
+
// Ollama format (uses message.content)
|
|
157
|
+
const content = output.message.content;
|
|
158
|
+
const contentStr = typeof content === 'string' ? content : JSON.stringify(content);
|
|
159
|
+
span.setAttribute('output_length', contentStr.length);
|
|
160
|
+
} else if (typeof output === 'string') {
|
|
161
|
+
// Direct string output
|
|
162
|
+
span.setAttribute('output_length', output.length);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Capture finish reason if available
|
|
166
|
+
if (output?.llmOutput?.finish_reason) {
|
|
167
|
+
span.setAttribute('finish_reason', output.llmOutput.finish_reason);
|
|
72
168
|
}
|
|
73
169
|
} catch (error) {
|
|
74
170
|
// Silently fail on attribute setting
|
|
@@ -101,15 +197,24 @@ export class TraciaCallbackHandler {
|
|
|
101
197
|
_parentRunId?: string
|
|
102
198
|
): Promise<void> {
|
|
103
199
|
const chainName = chain.name || chain._chainType || 'chain';
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
},
|
|
111
|
-
}
|
|
200
|
+
|
|
201
|
+
const attributes: Record<string, any> = {
|
|
202
|
+
type: 'chain',
|
|
203
|
+
chain_name: chainName,
|
|
204
|
+
chain_type: chain._chainType,
|
|
205
|
+
input_keys: Object.keys(inputs || {}).join(','),
|
|
206
|
+
input_count: Object.keys(inputs || {}).length,
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
// Capture total input length
|
|
210
|
+
try {
|
|
211
|
+
const inputStr = JSON.stringify(inputs);
|
|
212
|
+
attributes.input_length = inputStr.length;
|
|
213
|
+
} catch (error) {
|
|
214
|
+
// Silently fail
|
|
215
|
+
}
|
|
112
216
|
|
|
217
|
+
const span = this.tracer.startSpan(`chain:${chainName}`, { attributes });
|
|
113
218
|
this.spanStack.set(runId, span);
|
|
114
219
|
}
|
|
115
220
|
|
|
@@ -155,15 +260,24 @@ export class TraciaCallbackHandler {
|
|
|
155
260
|
_parentRunId?: string
|
|
156
261
|
): Promise<void> {
|
|
157
262
|
const toolName = tool.name || 'unknown-tool';
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
263
|
+
|
|
264
|
+
const attributes: Record<string, any> = {
|
|
265
|
+
type: 'tool',
|
|
266
|
+
tool_name: toolName,
|
|
267
|
+
tool_description: tool.description || '',
|
|
268
|
+
input_length: typeof input === 'string' ? input.length : (typeof input === 'object' ? JSON.stringify(input).length : 0),
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
// Try to capture structured input
|
|
272
|
+
try {
|
|
273
|
+
if (typeof input === 'object') {
|
|
274
|
+
attributes.input_keys = Object.keys(input).join(',');
|
|
275
|
+
}
|
|
276
|
+
} catch (error) {
|
|
277
|
+
// Silently fail
|
|
278
|
+
}
|
|
166
279
|
|
|
280
|
+
const span = this.tracer.startSpan(`tool:${toolName}`, { attributes });
|
|
167
281
|
this.spanStack.set(runId, span);
|
|
168
282
|
}
|
|
169
283
|
|
|
@@ -226,4 +340,66 @@ export class TraciaCallbackHandler {
|
|
|
226
340
|
this.spanStack.delete(runId);
|
|
227
341
|
}
|
|
228
342
|
}
|
|
343
|
+
|
|
344
|
+
// LangChain uses 'on*' prefix for callback methods
|
|
345
|
+
// Provide aliases for compatibility
|
|
346
|
+
public async onLLMStart(
|
|
347
|
+
llm: any,
|
|
348
|
+
prompts: string[],
|
|
349
|
+
runId: string,
|
|
350
|
+
parentRunId?: string
|
|
351
|
+
): Promise<void> {
|
|
352
|
+
return this.handleLLMStart(llm, prompts, runId, parentRunId);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
public async onLLMEnd(output: any, runId: string): Promise<void> {
|
|
356
|
+
return this.handleLLMEnd(output, runId);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
public async onLLMError(error: Error, runId: string): Promise<void> {
|
|
360
|
+
return this.handleLLMError(error, runId);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
public async onChainStart(
|
|
364
|
+
chain: any,
|
|
365
|
+
inputs: any,
|
|
366
|
+
runId: string,
|
|
367
|
+
parentRunId?: string
|
|
368
|
+
): Promise<void> {
|
|
369
|
+
return this.handleChainStart(chain, inputs, runId, parentRunId);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
public async onChainEnd(output: any, runId: string): Promise<void> {
|
|
373
|
+
return this.handleChainEnd(output, runId);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
public async onChainError(error: Error, runId: string): Promise<void> {
|
|
377
|
+
return this.handleChainError(error, runId);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
public async onToolStart(
|
|
381
|
+
tool: any,
|
|
382
|
+
input: string,
|
|
383
|
+
runId: string,
|
|
384
|
+
parentRunId?: string
|
|
385
|
+
): Promise<void> {
|
|
386
|
+
return this.handleToolStart(tool, input, runId, parentRunId);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
public async onToolEnd(output: string, runId: string): Promise<void> {
|
|
390
|
+
return this.handleToolEnd(output, runId);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
public async onToolError(error: Error, runId: string): Promise<void> {
|
|
394
|
+
return this.handleToolError(error, runId);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
public async onAgentAction(action: any, runId: string): Promise<void> {
|
|
398
|
+
return this.handleAgentAction(action, runId);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
public async onAgentFinish(finish: any, runId: string): Promise<void> {
|
|
402
|
+
return this.handleAgentFinish(finish, runId);
|
|
403
|
+
}
|
|
229
404
|
}
|
|
405
|
+
|