@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 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, getTracer } from '@traccia/sdk';
339
- import { TraciaCallbackHandler } from '@traccia/sdk/integrations/langchain-callback';
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
- 'llm.model': 'gpt-4',
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
- 'error.type': 'ValidationError', // if applicable
399
- 'error.message': 'Invalid input', // if applicable
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/chat_models/openai';
12
- * import { LLMChain } from 'langchain/chains';
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 chain = new LLMChain({
17
- * llm: new ChatOpenAI(),
18
- * callbacks: [handler],
19
- * });
19
+ * const model = new ChatOpenAI({ callbacks: [handler] });
20
20
  *
21
- * await chain.run({ input: 'What is 2+2?' });
22
- * // Automatically traced with spans for LLM, chain execution, tokens, etc.
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;AAKH;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,SAAS,CAAiC;IAElD;;OAEG;IACU,cAAc,CACzB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IAahB;;OAEG;IACU,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BpE;;OAEG;IACU,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASvE;;OAEG;IACU,gBAAgB,CAC3B,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IAchB;;OAEG;IACU,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBtE;;OAEG;IACU,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASzE;;OAEG;IACU,eAAe,CAC1B,IAAI,EAAE,GAAG,EACT,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IAchB;;OAEG;IACU,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxE;;OAEG;IACU,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxE;;OAEG;IACU,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzE;;OAEG;IACU,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAa1E"}
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/chat_models/openai';
16
- * import { LLMChain } from 'langchain/chains';
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 chain = new LLMChain({
21
- * llm: new ChatOpenAI(),
22
- * callbacks: [handler],
23
- * });
49
+ * const model = new ChatOpenAI({ callbacks: [handler] });
24
50
  *
25
- * await chain.run({ input: 'What is 2+2?' });
26
- * // Automatically traced with spans for LLM, chain execution, tokens, etc.
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 span = this.tracer.startSpan('llm', {
38
- attributes: {
39
- type: 'llm',
40
- model: llm.name || llm._modelType || 'unknown',
41
- prompt_count: prompts.length,
42
- first_prompt_length: prompts[0]?.length || 0,
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
- const tokenUsage = output?.llmOutput?.token_usage || output?.token_usage;
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
- span.setAttribute('prompt_tokens', tokenUsage.prompt_tokens);
57
- span.setAttribute('completion_tokens', tokenUsage.completion_tokens);
58
- span.setAttribute('total_tokens', (tokenUsage.prompt_tokens || 0) + (tokenUsage.completion_tokens || 0));
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 span = this.tracer.startSpan(`chain:${chainName}`, {
88
- attributes: {
89
- type: 'chain',
90
- chain_name: chainName,
91
- chain_type: chain._chainType,
92
- input_keys: Object.keys(inputs).join(','),
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 span = this.tracer.startSpan(`tool:${toolName}`, {
133
- attributes: {
134
- type: 'tool',
135
- tool_name: toolName,
136
- tool_description: tool.description,
137
- input_length: typeof input === 'string' ? input.length : 0,
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":"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"}
1
+ {"version":3,"file":"langchain-callback.js","sourceRoot":"","sources":["../../src/integrations/langchain-callback.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@traccia2/sdk",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "description": "Tracing SDK for agent applications",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -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/chat_models/openai';
16
- * import { LLMChain } from 'langchain/chains';
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 chain = new LLMChain({
21
- * llm: new ChatOpenAI(),
22
- * callbacks: [handler],
23
- * });
47
+ * const model = new ChatOpenAI({ callbacks: [handler] });
24
48
  *
25
- * await chain.run({ input: 'What is 2+2?' });
26
- * // Automatically traced with spans for LLM, chain execution, tokens, etc.
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 span = this.tracer.startSpan('llm', {
42
- attributes: {
43
- type: 'llm',
44
- model: llm.name || llm._modelType || 'unknown',
45
- prompt_count: prompts.length,
46
- first_prompt_length: prompts[0]?.length || 0,
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
- const tokenUsage = output?.llmOutput?.token_usage || output?.token_usage;
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
- span.setAttribute('prompt_tokens', tokenUsage.prompt_tokens);
63
- span.setAttribute('completion_tokens', tokenUsage.completion_tokens);
64
- span.setAttribute(
65
- 'total_tokens',
66
- (tokenUsage.prompt_tokens || 0) + (tokenUsage.completion_tokens || 0)
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
- const span = this.tracer.startSpan(`chain:${chainName}`, {
105
- attributes: {
106
- type: 'chain',
107
- chain_name: chainName,
108
- chain_type: chain._chainType,
109
- input_keys: Object.keys(inputs).join(','),
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
- const span = this.tracer.startSpan(`tool:${toolName}`, {
159
- attributes: {
160
- type: 'tool',
161
- tool_name: toolName,
162
- tool_description: tool.description,
163
- input_length: typeof input === 'string' ? input.length : 0,
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
+