@linnify/agentlens-langchain 0.0.0-stage → 0.3.1
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/LICENSE +18 -0
- package/README.md +76 -2
- package/dist/handler.d.ts +53 -0
- package/dist/handler.js +303 -0
- package/dist/handler.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/serialize.d.ts +37 -0
- package/dist/serialize.js +145 -0
- package/dist/serialize.js.map +1 -0
- package/dist/span.d.ts +35 -0
- package/dist/span.js +60 -0
- package/dist/span.js.map +1 -0
- package/package.json +53 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
Copyright (c) 2026 Linnify. All rights reserved.
|
|
2
|
+
|
|
3
|
+
This software and its documentation are proprietary to Linnify and are not
|
|
4
|
+
open source. Linnify grants you a limited, non-exclusive, non-transferable,
|
|
5
|
+
revocable license to install and use this software, unmodified, solely to
|
|
6
|
+
send data from your applications to the AgentLens service, subject to your
|
|
7
|
+
agreement with Linnify governing your use of AgentLens.
|
|
8
|
+
|
|
9
|
+
You may not copy, modify, distribute, sublicense, sell, reverse engineer, or
|
|
10
|
+
create derivative works of this software, or use it for any other purpose,
|
|
11
|
+
except as expressly permitted by Linnify in writing or by applicable law.
|
|
12
|
+
|
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
16
|
+
LINNIFY BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
17
|
+
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
18
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,77 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @linnify/agentlens-langchain
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
AgentLens callback handler for [LangChain](https://js.langchain.com) and [LangGraph](https://langchain-ai.github.io/langgraphjs/): every run becomes a trace in AgentLens via `@linnify/agentlens-otel`, and `handler.client` sends scores (👍/👎 and other feedback) via `@linnify/agentlens-client`.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install @linnify/agentlens-langchain
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
It works with `@langchain/core` 1.x: `createAgent` agents (from `langchain`), LangGraph `StateGraph`s, and plain models, chains, tools and retrievers. `createAgent` compiles to a LangGraph graph, so both are traced the same way.
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
Create one handler per agent and pass it in the `callbacks` of each run. Per-run values travel in the run's `metadata`.
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import { AgentLensCallbackHandler } from '@linnify/agentlens-langchain';
|
|
17
|
+
|
|
18
|
+
// Reads AGENTLENS_API_KEY (and AGENTLENS_BASE_URL, if set) when not passed.
|
|
19
|
+
export const agentLens = new AgentLensCallbackHandler({ agent: 'support_bot' });
|
|
20
|
+
|
|
21
|
+
await agent.invoke(
|
|
22
|
+
{ messages: [{ role: 'user', content: 'Where is my order?' }] },
|
|
23
|
+
{
|
|
24
|
+
callbacks: [agentLens],
|
|
25
|
+
configurable: { thread_id: conversationId }, // becomes the trace's session
|
|
26
|
+
metadata: { tenant: 'acme', userId: 'user-42' }
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
| Option | Run metadata | What it sets |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| `agent` | `agentlensAgent` | The AgentLens agent of the trace (lowercase letters, digits and underscores). Required, in one of the two. |
|
|
34
|
+
| `tenant` | `tenant` | The trace's tenant, to filter traces and usage per tenant. |
|
|
35
|
+
| `sessionId` | `sessionId`, else `thread_id` | The trace's session. LangGraph copies `configurable.thread_id` into the metadata, so a conversation's turns share a session. |
|
|
36
|
+
| `userId` | `userId` | The trace's user. |
|
|
37
|
+
| `environment` | `environment` | The trace's environment; defaults to `AGENTLENS_ENVIRONMENT`. |
|
|
38
|
+
| `apiKey`, `baseUrl` | | Default to `AGENTLENS_API_KEY` and `AGENTLENS_BASE_URL` (production when unset). |
|
|
39
|
+
| `mask` | | A function applied to every input, output and metadata value before it is sent, e.g. to redact secrets in graph state. |
|
|
40
|
+
| `serviceName` | | The `service.name` resource of the spans (default `langchain`). |
|
|
41
|
+
|
|
42
|
+
Run metadata wins over the handler's options. Spans without an agent are dropped with a logged error.
|
|
43
|
+
|
|
44
|
+
## What gets traced
|
|
45
|
+
|
|
46
|
+
- The root run is the trace. It is sent as it ran, and AgentLens reads the trace's input and output from it, trimmed to the turn: a chat app that resends the history each call shows only its last user messages, and a graph with a checkpointer, which returns every message of the thread, shows only what this run added. A compiled graph (`createAgent` or `StateGraph`) is an **agent** observation, each graph node a **span**, each model call a **generation** (model, parameters, token usage including cached and reasoning tokens, finish reason, available tools) and each tool call a **tool** (with its tool call id).
|
|
47
|
+
- LangGraph's own plumbing (`__start__`, channel writes, conditional-edge routers) is left out; its children attach to the nearest traced run.
|
|
48
|
+
- LangChain messages are sent as `{ role, content, tool_calls, tool_call_id }`, which AgentLens renders as a conversation. Other state is sent as plain JSON; class instances such as tools are named, not dumped.
|
|
49
|
+
- A LangGraph interrupt or `Command` is not an error. Runs still open when their trace ends (an aborted stream) are closed with an error.
|
|
50
|
+
- The handler never registers a global OpenTelemetry provider, so it runs next to other tracing (Langfuse, LangSmith, your own OTel setup).
|
|
51
|
+
|
|
52
|
+
## Feedback
|
|
53
|
+
|
|
54
|
+
The trace id is the root run's id without dashes. Pass your own `runId` to know it before the run ends, or read `handler.lastTraceId` after it when runs don't overlap:
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
import { randomUUID } from 'node:crypto';
|
|
58
|
+
import { traceIdFromRunId } from '@linnify/agentlens-langchain';
|
|
59
|
+
|
|
60
|
+
const runId = randomUUID();
|
|
61
|
+
await agent.invoke(input, { runId, callbacks: [agentLens] });
|
|
62
|
+
|
|
63
|
+
agentLens.client?.score.create({ traceId: traceIdFromRunId(runId), name: 'User Feedback', value: true });
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
For a trace sent to another agent with `agentlensAgent`, pass the same `agent` to `score.create()`.
|
|
67
|
+
|
|
68
|
+
## Short-lived processes
|
|
69
|
+
|
|
70
|
+
Spans are batched. In scripts, serverless functions and tests, wait for LangChain's background callbacks and flush before exiting:
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
import { awaitAllCallbacks } from '@langchain/core/callbacks/promises';
|
|
74
|
+
|
|
75
|
+
await awaitAllCallbacks();
|
|
76
|
+
await agentLens.shutdown(); // or flush() to keep using it
|
|
77
|
+
```
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { BaseCallbackHandler } from '@langchain/core/callbacks/base';
|
|
2
|
+
import type { DocumentInterface } from '@langchain/core/documents';
|
|
3
|
+
import { type BaseMessage } from '@langchain/core/messages';
|
|
4
|
+
import type { LLMResult } from '@langchain/core/outputs';
|
|
5
|
+
import type { Serialized } from '@langchain/core/load/serializable';
|
|
6
|
+
import type { ChainValues } from '@langchain/core/utils/types';
|
|
7
|
+
import { AgentLensClient } from '@linnify/agentlens-client';
|
|
8
|
+
export interface AgentLensCallbackHandlerParams {
|
|
9
|
+
apiKey?: string;
|
|
10
|
+
/** The AgentLens agent the traces belong to; `agentlensAgent` run metadata overrides it per trace. */
|
|
11
|
+
agent?: string;
|
|
12
|
+
baseUrl?: string;
|
|
13
|
+
flushAt?: number;
|
|
14
|
+
/** In seconds. */
|
|
15
|
+
flushInterval?: number;
|
|
16
|
+
environment?: string;
|
|
17
|
+
/** Defaults for every trace; `tenant`, `sessionId` and `userId` run metadata override them. */
|
|
18
|
+
tenant?: string;
|
|
19
|
+
sessionId?: string;
|
|
20
|
+
userId?: string;
|
|
21
|
+
/** Runs on every input, output and metadata value before it leaves the process, e.g. to redact secrets. */
|
|
22
|
+
mask?: (value: unknown) => unknown;
|
|
23
|
+
serviceName?: string;
|
|
24
|
+
}
|
|
25
|
+
/** The id AgentLens gives the trace a root run starts, so feedback can be sent for it with `client.score.create()`. */
|
|
26
|
+
export declare const traceIdFromRunId: (runId: string) => string;
|
|
27
|
+
export declare class AgentLensCallbackHandler extends BaseCallbackHandler {
|
|
28
|
+
#private;
|
|
29
|
+
name: string;
|
|
30
|
+
/** The trace id of the last root run that ended; read it right after `invoke()` when runs don't overlap. */
|
|
31
|
+
lastTraceId: string | null;
|
|
32
|
+
constructor(params?: AgentLensCallbackHandlerParams);
|
|
33
|
+
/** Sends scores, e.g. end-user feedback, for the traces this handler records. */
|
|
34
|
+
get client(): AgentLensClient | undefined;
|
|
35
|
+
copy(): this;
|
|
36
|
+
handleChainStart(chain: Serialized, inputs: ChainValues, runId: string, parentRunId?: string, tags?: string[], metadata?: Record<string, unknown>, _runType?: string, runName?: string): void;
|
|
37
|
+
handleChainEnd(outputs: ChainValues, runId: string): void;
|
|
38
|
+
handleChainError(error: unknown, runId: string): void;
|
|
39
|
+
handleChatModelStart(llm: Serialized, messages: BaseMessage[][], runId: string, parentRunId?: string, extraParams?: Record<string, unknown>, tags?: string[], metadata?: Record<string, unknown>, runName?: string): void;
|
|
40
|
+
handleLLMStart(llm: Serialized, prompts: string[], runId: string, parentRunId?: string, extraParams?: Record<string, unknown>, tags?: string[], metadata?: Record<string, unknown>, runName?: string): void;
|
|
41
|
+
handleLLMNewToken(_token: string, _idx: unknown, runId: string): void;
|
|
42
|
+
handleChatModelStreamEvent(_event: unknown, runId: string): void;
|
|
43
|
+
handleLLMEnd(output: LLMResult, runId: string): void;
|
|
44
|
+
handleLLMError(error: unknown, runId: string): void;
|
|
45
|
+
handleToolStart(tool: Serialized, input: string, runId: string, parentRunId?: string, tags?: string[], metadata?: Record<string, unknown>, runName?: string, toolCallId?: string): void;
|
|
46
|
+
handleToolEnd(output: unknown, runId: string): void;
|
|
47
|
+
handleToolError(error: unknown, runId: string): void;
|
|
48
|
+
handleRetrieverStart(retriever: Serialized, query: string, runId: string, parentRunId?: string, tags?: string[], metadata?: Record<string, unknown>, name?: string): void;
|
|
49
|
+
handleRetrieverEnd(documents: DocumentInterface[], runId: string): void;
|
|
50
|
+
handleRetrieverError(error: unknown, runId: string): void;
|
|
51
|
+
flush(): Promise<void>;
|
|
52
|
+
shutdown(): Promise<void>;
|
|
53
|
+
}
|
package/dist/handler.js
ADDED
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
import { BaseCallbackHandler } from '@langchain/core/callbacks/base';
|
|
3
|
+
import { isBaseMessage } from '@langchain/core/messages';
|
|
4
|
+
import { AgentLensClient } from '@linnify/agentlens-client';
|
|
5
|
+
import { AgentLensSpanProcessor } from '@linnify/agentlens-otel';
|
|
6
|
+
import { resourceFromAttributes } from '@opentelemetry/resources';
|
|
7
|
+
import { finishReason, generationOutput, modelParameters, responseModel, toChatMessage, toolNames, toSerializable, usageFrom } from './serialize.js';
|
|
8
|
+
import { toReadableSpan } from './span.js';
|
|
9
|
+
const SCOPE_NAME = '@linnify/agentlens-langchain';
|
|
10
|
+
const HIDDEN_TAG = 'langsmith:hidden';
|
|
11
|
+
const GRAPH_CLASSES = new Set(['CompiledStateGraph', 'CompiledGraph', 'Pregel']);
|
|
12
|
+
const MAX_OPEN_RUNS = 10_000;
|
|
13
|
+
const text = (value) => typeof value === 'string' && value ? value : undefined;
|
|
14
|
+
const hex = (runId) => runId.replace(/-/g, '').toLowerCase();
|
|
15
|
+
/** The id AgentLens gives the trace a root run starts, so feedback can be sent for it with `client.score.create()`. */
|
|
16
|
+
export const traceIdFromRunId = (runId) => {
|
|
17
|
+
const id = hex(runId);
|
|
18
|
+
return /^[0-9a-f]{32}$/.test(id) ? id : randomBytes(16).toString('hex');
|
|
19
|
+
};
|
|
20
|
+
// Run ids are UUIDv7: the leading digits are a timestamp shared by runs started together,
|
|
21
|
+
// so the span id takes the random tail.
|
|
22
|
+
const spanIdFromRunId = (runId) => {
|
|
23
|
+
const id = hex(runId);
|
|
24
|
+
return /^[0-9a-f]{32}$/.test(id) ? id.slice(16) : randomBytes(8).toString('hex');
|
|
25
|
+
};
|
|
26
|
+
const isBubbleUp = (error) => typeof error === 'object' && error !== null && error.is_bubble_up === true;
|
|
27
|
+
const isGraph = (serialized) => {
|
|
28
|
+
const name = serialized?.id?.at(-1);
|
|
29
|
+
return name !== undefined && GRAPH_CLASSES.has(name);
|
|
30
|
+
};
|
|
31
|
+
const parseJson = (value) => {
|
|
32
|
+
try {
|
|
33
|
+
return JSON.parse(value);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
export class AgentLensCallbackHandler extends BaseCallbackHandler {
|
|
40
|
+
name = 'AgentLensCallbackHandler';
|
|
41
|
+
/** The trace id of the last root run that ended; read it right after `invoke()` when runs don't overlap. */
|
|
42
|
+
lastTraceId = null;
|
|
43
|
+
#processor;
|
|
44
|
+
#client;
|
|
45
|
+
#resource;
|
|
46
|
+
#mask;
|
|
47
|
+
#defaults;
|
|
48
|
+
#runs = new Map();
|
|
49
|
+
// A hidden run (LangGraph plumbing) is not traced: its children attach to its nearest traced ancestor.
|
|
50
|
+
#hidden = new Map();
|
|
51
|
+
constructor(params = {}) {
|
|
52
|
+
super();
|
|
53
|
+
this.#mask = params.mask ?? ((value) => value);
|
|
54
|
+
this.#resource = resourceFromAttributes({ 'service.name': params.serviceName ?? 'langchain' });
|
|
55
|
+
this.#defaults = {
|
|
56
|
+
agent: params.agent,
|
|
57
|
+
tenant: params.tenant,
|
|
58
|
+
sessionId: params.sessionId,
|
|
59
|
+
userId: params.userId,
|
|
60
|
+
environment: params.environment ?? process.env.AGENTLENS_ENVIRONMENT
|
|
61
|
+
};
|
|
62
|
+
const apiKey = params.apiKey ?? process.env.AGENTLENS_API_KEY;
|
|
63
|
+
if (!apiKey) {
|
|
64
|
+
console.warn('[AgentLens] Missing API key; traces will not be sent. Set AGENTLENS_API_KEY.');
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const { baseUrl, flushAt, flushInterval } = params;
|
|
68
|
+
this.#processor = new AgentLensSpanProcessor({ apiKey, baseUrl, flushAt, flushInterval });
|
|
69
|
+
this.#client = new AgentLensClient({ apiKey, agent: params.agent, baseUrl, flushAt, flushInterval });
|
|
70
|
+
}
|
|
71
|
+
/** Sends scores, e.g. end-user feedback, for the traces this handler records. */
|
|
72
|
+
get client() {
|
|
73
|
+
return this.#client;
|
|
74
|
+
}
|
|
75
|
+
// LangChain copies handlers in a few code paths; the open runs must stay in one place.
|
|
76
|
+
copy() {
|
|
77
|
+
return this;
|
|
78
|
+
}
|
|
79
|
+
// LangChain calls `handleChainStart(chain, inputs, runId, parentRunId, tags, metadata, runType, runName)`,
|
|
80
|
+
// whatever order its type declaration lists them in.
|
|
81
|
+
handleChainStart(chain, inputs, runId, parentRunId, tags, metadata, _runType, runName) {
|
|
82
|
+
this.#safely(() => {
|
|
83
|
+
const name = runName ?? chain?.id?.at(-1) ?? 'chain';
|
|
84
|
+
// LangGraph tags its own plumbing (`__start__`, channel writes) as hidden, and a conditional
|
|
85
|
+
// edge runs as an unnamed lambda inside the node it leaves.
|
|
86
|
+
if (tags?.includes(HIDDEN_TAG) || (name === 'RunnableLambda' && metadata?.langgraph_node !== undefined)) {
|
|
87
|
+
this.#hidden.set(runId, this.#tracedParent(parentRunId));
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
this.#start(runId, parentRunId, {
|
|
91
|
+
name,
|
|
92
|
+
type: isGraph(chain) ? 'agent' : 'span',
|
|
93
|
+
input: toSerializable(inputs),
|
|
94
|
+
tags,
|
|
95
|
+
metadata
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
handleChainEnd(outputs, runId) {
|
|
100
|
+
this.#safely(() => this.#end(runId, { output: toSerializable(outputs) }));
|
|
101
|
+
}
|
|
102
|
+
handleChainError(error, runId) {
|
|
103
|
+
this.#safely(() => this.#fail(runId, error));
|
|
104
|
+
}
|
|
105
|
+
handleChatModelStart(llm, messages, runId, parentRunId, extraParams, tags, metadata, runName) {
|
|
106
|
+
this.#safely(() => {
|
|
107
|
+
const prompts = messages.map((batch) => batch.map(toChatMessage));
|
|
108
|
+
this.#startGeneration(runId, parentRunId, llm, runName, prompts.length === 1 ? prompts[0] : prompts, {
|
|
109
|
+
extraParams,
|
|
110
|
+
tags,
|
|
111
|
+
metadata
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
handleLLMStart(llm, prompts, runId, parentRunId, extraParams, tags, metadata, runName) {
|
|
116
|
+
this.#safely(() => {
|
|
117
|
+
this.#startGeneration(runId, parentRunId, llm, runName, prompts.length === 1 ? prompts[0] : prompts, {
|
|
118
|
+
extraParams,
|
|
119
|
+
tags,
|
|
120
|
+
metadata
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
handleLLMNewToken(_token, _idx, runId) {
|
|
125
|
+
this.#recordCompletionStart(runId);
|
|
126
|
+
}
|
|
127
|
+
handleChatModelStreamEvent(_event, runId) {
|
|
128
|
+
this.#recordCompletionStart(runId);
|
|
129
|
+
}
|
|
130
|
+
handleLLMEnd(output, runId) {
|
|
131
|
+
this.#safely(() => {
|
|
132
|
+
const run = this.#runs.get(runId);
|
|
133
|
+
if (run) {
|
|
134
|
+
run.attributes.finishReason = finishReason(output);
|
|
135
|
+
if (run.completionStartTime) {
|
|
136
|
+
run.attributes.completionStartTime = new Date(run.completionStartTime).toISOString();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
this.#end(runId, { output: generationOutput(output), model: responseModel(output), usage: usageFrom(output) });
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
handleLLMError(error, runId) {
|
|
143
|
+
this.#safely(() => this.#fail(runId, error));
|
|
144
|
+
}
|
|
145
|
+
handleToolStart(tool, input, runId, parentRunId, tags, metadata, runName, toolCallId) {
|
|
146
|
+
this.#safely(() => {
|
|
147
|
+
const name = runName ?? tool?.id?.at(-1) ?? 'tool';
|
|
148
|
+
this.#start(runId, parentRunId, {
|
|
149
|
+
name,
|
|
150
|
+
type: 'tool',
|
|
151
|
+
input: parseJson(input),
|
|
152
|
+
tags,
|
|
153
|
+
metadata,
|
|
154
|
+
attributes: { toolName: name, toolCallId }
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
handleToolEnd(output, runId) {
|
|
159
|
+
this.#safely(() => {
|
|
160
|
+
const content = isBaseMessage(output) ? output.content : output;
|
|
161
|
+
this.#end(runId, { output: toSerializable(typeof content === 'string' ? parseJson(content) : content) });
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
handleToolError(error, runId) {
|
|
165
|
+
this.#safely(() => this.#fail(runId, error));
|
|
166
|
+
}
|
|
167
|
+
handleRetrieverStart(retriever, query, runId, parentRunId, tags, metadata, name) {
|
|
168
|
+
this.#safely(() => {
|
|
169
|
+
this.#start(runId, parentRunId, {
|
|
170
|
+
name: name ?? retriever?.id?.at(-1) ?? 'retriever',
|
|
171
|
+
type: 'span',
|
|
172
|
+
input: query,
|
|
173
|
+
tags,
|
|
174
|
+
metadata
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
handleRetrieverEnd(documents, runId) {
|
|
179
|
+
this.#safely(() => {
|
|
180
|
+
const output = documents.map(({ pageContent, metadata }) => ({ pageContent, metadata }));
|
|
181
|
+
this.#end(runId, { output: toSerializable(output) });
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
handleRetrieverError(error, runId) {
|
|
185
|
+
this.#safely(() => this.#fail(runId, error));
|
|
186
|
+
}
|
|
187
|
+
async flush() {
|
|
188
|
+
await Promise.all([this.#processor?.forceFlush(), this.#client?.flush()]);
|
|
189
|
+
}
|
|
190
|
+
async shutdown() {
|
|
191
|
+
await Promise.all([this.#processor?.shutdown(), this.#client?.shutdown()]);
|
|
192
|
+
}
|
|
193
|
+
#startGeneration(runId, parentRunId, llm, runName, input, { extraParams, tags, metadata }) {
|
|
194
|
+
const invocationParams = extraParams?.invocation_params;
|
|
195
|
+
this.#start(runId, parentRunId, {
|
|
196
|
+
name: runName ?? llm?.id?.at(-1) ?? 'llm',
|
|
197
|
+
type: 'generation',
|
|
198
|
+
input,
|
|
199
|
+
tags,
|
|
200
|
+
metadata,
|
|
201
|
+
model: text(invocationParams?.model) ?? text(invocationParams?.model_name) ?? text(metadata?.ls_model_name),
|
|
202
|
+
modelParameters: modelParameters(invocationParams),
|
|
203
|
+
attributes: { provider: text(metadata?.ls_provider), availableTools: toolNames(invocationParams) }
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
#start(runId, parentRunId, run) {
|
|
207
|
+
const parent = this.#runs.get(this.#tracedParent(parentRunId) ?? '');
|
|
208
|
+
const trace = parent?.trace ?? this.#trace(runId, run.metadata);
|
|
209
|
+
this.#evictOldest();
|
|
210
|
+
this.#runs.set(runId, {
|
|
211
|
+
trace,
|
|
212
|
+
spanId: spanIdFromRunId(runId),
|
|
213
|
+
parentSpanId: parent?.spanId,
|
|
214
|
+
name: run.name,
|
|
215
|
+
type: run.type,
|
|
216
|
+
startTime: Date.now(),
|
|
217
|
+
input: run.input,
|
|
218
|
+
model: run.model,
|
|
219
|
+
modelParameters: run.modelParameters,
|
|
220
|
+
metadata: {
|
|
221
|
+
...toSerializable(run.metadata ?? {}),
|
|
222
|
+
...(run.tags?.length ? { tags: run.tags } : {})
|
|
223
|
+
},
|
|
224
|
+
attributes: Object.fromEntries(Object.entries(run.attributes ?? {}).filter(([, value]) => value !== undefined))
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
#trace(runId, metadata) {
|
|
228
|
+
return {
|
|
229
|
+
traceId: traceIdFromRunId(runId),
|
|
230
|
+
agent: text(metadata?.agentlensAgent) ?? this.#defaults.agent,
|
|
231
|
+
tenant: text(metadata?.tenant) ?? this.#defaults.tenant,
|
|
232
|
+
// LangGraph copies `configurable.thread_id` into the run metadata.
|
|
233
|
+
sessionId: text(metadata?.sessionId) ?? text(metadata?.thread_id) ?? this.#defaults.sessionId,
|
|
234
|
+
userId: text(metadata?.userId) ?? this.#defaults.userId,
|
|
235
|
+
environment: this.#defaults.environment ?? text(metadata?.environment)
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
#tracedParent(parentRunId) {
|
|
239
|
+
if (!parentRunId)
|
|
240
|
+
return undefined;
|
|
241
|
+
if (this.#runs.has(parentRunId))
|
|
242
|
+
return parentRunId;
|
|
243
|
+
return this.#hidden.get(parentRunId);
|
|
244
|
+
}
|
|
245
|
+
#recordCompletionStart(runId) {
|
|
246
|
+
const run = this.#runs.get(runId);
|
|
247
|
+
if (run && !run.completionStartTime)
|
|
248
|
+
run.completionStartTime = Date.now();
|
|
249
|
+
}
|
|
250
|
+
#fail(runId, error) {
|
|
251
|
+
// A LangGraph interrupt or `Command` travels as an error, but the run didn't fail.
|
|
252
|
+
if (isBubbleUp(error)) {
|
|
253
|
+
const run = this.#runs.get(runId);
|
|
254
|
+
if (run)
|
|
255
|
+
run.attributes.interrupted = true;
|
|
256
|
+
this.#end(runId, {});
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
this.#end(runId, { error: error instanceof Error ? `${error.name}: ${error.message}` : String(error) });
|
|
260
|
+
}
|
|
261
|
+
#end(runId, end) {
|
|
262
|
+
if (this.#hidden.delete(runId))
|
|
263
|
+
return;
|
|
264
|
+
const run = this.#runs.get(runId);
|
|
265
|
+
if (!run)
|
|
266
|
+
return;
|
|
267
|
+
this.#runs.delete(runId);
|
|
268
|
+
this.#export(run, end);
|
|
269
|
+
if (run.parentSpanId)
|
|
270
|
+
return;
|
|
271
|
+
this.lastTraceId = run.trace.traceId;
|
|
272
|
+
// An aborted stream can leave runs that never end; they close with their trace.
|
|
273
|
+
for (const [openId, open] of this.#runs) {
|
|
274
|
+
if (open.trace !== run.trace)
|
|
275
|
+
continue;
|
|
276
|
+
this.#runs.delete(openId);
|
|
277
|
+
this.#export(open, { error: 'The run had not ended when its trace ended' });
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
#export(run, end) {
|
|
281
|
+
if (!this.#processor)
|
|
282
|
+
return;
|
|
283
|
+
const attributes = Object.fromEntries(Object.entries(run.attributes).filter(([, value]) => value !== undefined));
|
|
284
|
+
const metadata = Object.keys(attributes).length > 0 ? { ...run.metadata, attributes } : run.metadata;
|
|
285
|
+
this.#processor.onEnd(toReadableSpan({ ...run, metadata }, end, { resource: this.#resource, scopeName: SCOPE_NAME, mask: this.#mask }));
|
|
286
|
+
}
|
|
287
|
+
#evictOldest() {
|
|
288
|
+
if (this.#runs.size < MAX_OPEN_RUNS)
|
|
289
|
+
return;
|
|
290
|
+
const oldest = this.#runs.keys().next().value;
|
|
291
|
+
if (oldest)
|
|
292
|
+
this.#runs.delete(oldest);
|
|
293
|
+
}
|
|
294
|
+
#safely(fn) {
|
|
295
|
+
try {
|
|
296
|
+
fn();
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
console.error('[AgentLens] Failed to record a LangChain run:', error);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { AgentLensCallbackHandler, traceIdFromRunId, type AgentLensCallbackHandlerParams } from './handler.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAEjB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type BaseMessage } from '@langchain/core/messages';
|
|
2
|
+
import type { LLMResult } from '@langchain/core/outputs';
|
|
3
|
+
export interface ChatMessage {
|
|
4
|
+
role: string;
|
|
5
|
+
content: unknown;
|
|
6
|
+
name?: string;
|
|
7
|
+
tool_calls?: {
|
|
8
|
+
id?: string;
|
|
9
|
+
name: string;
|
|
10
|
+
args: unknown;
|
|
11
|
+
}[];
|
|
12
|
+
tool_call_id?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare const toChatMessage: (message: BaseMessage) => ChatMessage;
|
|
15
|
+
/**
|
|
16
|
+
* LangGraph state holds class instances (messages, tools, clients) and can be circular, so it
|
|
17
|
+
* is turned into plain JSON before it is sent: messages become `{ role, content, tool_calls }`,
|
|
18
|
+
* which AgentLens renders as a conversation, and other LangChain objects are named, not dumped.
|
|
19
|
+
*/
|
|
20
|
+
export declare const toSerializable: (value: unknown, seen?: WeakSet<object>, depth?: number) => unknown;
|
|
21
|
+
export interface Usage {
|
|
22
|
+
input?: number;
|
|
23
|
+
output?: number;
|
|
24
|
+
total?: number;
|
|
25
|
+
cache_read?: number;
|
|
26
|
+
cache_write?: number;
|
|
27
|
+
reasoning?: number;
|
|
28
|
+
}
|
|
29
|
+
export declare const lastMessage: (output: LLMResult) => BaseMessage | undefined;
|
|
30
|
+
export declare const generationOutput: (output: LLMResult) => unknown;
|
|
31
|
+
/** Chat models report `usage_metadata` on the message; older LLM integrations only `llmOutput.tokenUsage`. */
|
|
32
|
+
export declare const usageFrom: (output: LLMResult) => Usage | undefined;
|
|
33
|
+
export declare const responseModel: (output: LLMResult) => string | undefined;
|
|
34
|
+
export declare const finishReason: (output: LLMResult) => string | undefined;
|
|
35
|
+
/** Invocation params also carry the tool schemas and the full request; only the settings are kept. */
|
|
36
|
+
export declare const modelParameters: (invocationParams: unknown) => Record<string, unknown> | undefined;
|
|
37
|
+
export declare const toolNames: (invocationParams: unknown) => string[] | undefined;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { isBaseMessage } from '@langchain/core/messages';
|
|
2
|
+
const MAX_DEPTH = 20;
|
|
3
|
+
const ROLES = {
|
|
4
|
+
human: 'user',
|
|
5
|
+
ai: 'assistant',
|
|
6
|
+
system: 'system',
|
|
7
|
+
tool: 'tool',
|
|
8
|
+
function: 'tool',
|
|
9
|
+
developer: 'system'
|
|
10
|
+
};
|
|
11
|
+
export const toChatMessage = (message) => {
|
|
12
|
+
const type = message.getType();
|
|
13
|
+
const role = ROLES[type] ?? (type === 'generic' && 'role' in message ? String(message.role) : type);
|
|
14
|
+
const toolCalls = 'tool_calls' in message && Array.isArray(message.tool_calls) && message.tool_calls.length > 0
|
|
15
|
+
? message.tool_calls.map(({ id, name, args }) => ({ id, name, args }))
|
|
16
|
+
: undefined;
|
|
17
|
+
const toolCallId = 'tool_call_id' in message ? message.tool_call_id : undefined;
|
|
18
|
+
return {
|
|
19
|
+
role,
|
|
20
|
+
content: toSerializable(message.content),
|
|
21
|
+
...(message.name ? { name: message.name } : {}),
|
|
22
|
+
...(toolCalls ? { tool_calls: toolCalls } : {}),
|
|
23
|
+
...(typeof toolCallId === 'string' ? { tool_call_id: toolCallId } : {})
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
const isLangChainSerializable = (value) => Array.isArray(value.lc_namespace);
|
|
27
|
+
/**
|
|
28
|
+
* LangGraph state holds class instances (messages, tools, clients) and can be circular, so it
|
|
29
|
+
* is turned into plain JSON before it is sent: messages become `{ role, content, tool_calls }`,
|
|
30
|
+
* which AgentLens renders as a conversation, and other LangChain objects are named, not dumped.
|
|
31
|
+
*/
|
|
32
|
+
export const toSerializable = (value, seen = new WeakSet(), depth = 0) => {
|
|
33
|
+
if (value === null || value === undefined)
|
|
34
|
+
return value;
|
|
35
|
+
if (typeof value === 'bigint')
|
|
36
|
+
return value.toString();
|
|
37
|
+
if (typeof value === 'function' || typeof value === 'symbol')
|
|
38
|
+
return undefined;
|
|
39
|
+
if (typeof value !== 'object')
|
|
40
|
+
return value;
|
|
41
|
+
if (depth > MAX_DEPTH)
|
|
42
|
+
return '[MaxDepth]';
|
|
43
|
+
if (seen.has(value))
|
|
44
|
+
return '[Circular]';
|
|
45
|
+
if (isBaseMessage(value))
|
|
46
|
+
return toChatMessage(value);
|
|
47
|
+
if (value instanceof Date)
|
|
48
|
+
return value.toISOString();
|
|
49
|
+
if (value instanceof Error)
|
|
50
|
+
return { name: value.name, message: value.message };
|
|
51
|
+
seen.add(value);
|
|
52
|
+
try {
|
|
53
|
+
if (Array.isArray(value))
|
|
54
|
+
return value.map((item) => toSerializable(item, seen, depth + 1) ?? null);
|
|
55
|
+
if (value instanceof Map)
|
|
56
|
+
return toSerializable(Object.fromEntries(value), seen, depth + 1);
|
|
57
|
+
if (value instanceof Set)
|
|
58
|
+
return toSerializable([...value], seen, depth + 1);
|
|
59
|
+
if (isLangChainSerializable(value)) {
|
|
60
|
+
const name = typeof value.name === 'string' ? value.name : value.constructor.name;
|
|
61
|
+
return `[${value.lc_namespace.at(-1) ?? 'langchain'}: ${name}]`;
|
|
62
|
+
}
|
|
63
|
+
const entries = Object.entries(value).flatMap(([key, item]) => {
|
|
64
|
+
const serialized = toSerializable(item, seen, depth + 1);
|
|
65
|
+
return serialized === undefined ? [] : [[key, serialized]];
|
|
66
|
+
});
|
|
67
|
+
return Object.fromEntries(entries);
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
seen.delete(value);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
const lastGeneration = (output) => output.generations.at(-1)?.at(-1);
|
|
74
|
+
export const lastMessage = (output) => {
|
|
75
|
+
const generation = lastGeneration(output);
|
|
76
|
+
return generation && 'message' in generation && isBaseMessage(generation.message)
|
|
77
|
+
? generation.message
|
|
78
|
+
: undefined;
|
|
79
|
+
};
|
|
80
|
+
export const generationOutput = (output) => {
|
|
81
|
+
const message = lastMessage(output);
|
|
82
|
+
if (message)
|
|
83
|
+
return toChatMessage(message);
|
|
84
|
+
return lastGeneration(output)?.text;
|
|
85
|
+
};
|
|
86
|
+
const withoutUndefined = (value) => Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined));
|
|
87
|
+
/** Chat models report `usage_metadata` on the message; older LLM integrations only `llmOutput.tokenUsage`. */
|
|
88
|
+
export const usageFrom = (output) => {
|
|
89
|
+
const message = lastMessage(output);
|
|
90
|
+
const metadata = (message && 'usage_metadata' in message ? message.usage_metadata : undefined);
|
|
91
|
+
if (metadata) {
|
|
92
|
+
return withoutUndefined({
|
|
93
|
+
input: metadata.input_tokens,
|
|
94
|
+
output: metadata.output_tokens,
|
|
95
|
+
total: metadata.total_tokens,
|
|
96
|
+
cache_read: metadata.input_token_details?.cache_read,
|
|
97
|
+
cache_write: metadata.input_token_details?.cache_creation,
|
|
98
|
+
reasoning: metadata.output_token_details?.reasoning
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
const legacy = output.llmOutput?.tokenUsage;
|
|
102
|
+
if (!legacy)
|
|
103
|
+
return undefined;
|
|
104
|
+
return withoutUndefined({
|
|
105
|
+
input: legacy.promptTokens,
|
|
106
|
+
output: legacy.completionTokens,
|
|
107
|
+
total: legacy.totalTokens
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
const responseMetadata = (output) => lastMessage(output)?.response_metadata;
|
|
111
|
+
export const responseModel = (output) => {
|
|
112
|
+
const metadata = responseMetadata(output);
|
|
113
|
+
const model = metadata?.model_name ?? metadata?.model;
|
|
114
|
+
return typeof model === 'string' && model ? model : undefined;
|
|
115
|
+
};
|
|
116
|
+
export const finishReason = (output) => {
|
|
117
|
+
const metadata = responseMetadata(output);
|
|
118
|
+
const reason = metadata?.finish_reason ?? metadata?.stop_reason;
|
|
119
|
+
return typeof reason === 'string' ? reason : undefined;
|
|
120
|
+
};
|
|
121
|
+
const PRIMITIVE_TYPES = new Set(['string', 'number', 'boolean']);
|
|
122
|
+
/** Invocation params also carry the tool schemas and the full request; only the settings are kept. */
|
|
123
|
+
export const modelParameters = (invocationParams) => {
|
|
124
|
+
if (!invocationParams || typeof invocationParams !== 'object')
|
|
125
|
+
return undefined;
|
|
126
|
+
const parameters = Object.fromEntries(Object.entries(invocationParams).filter(([key, value]) => PRIMITIVE_TYPES.has(typeof value) && !['model', 'model_name', 'modelName'].includes(key)));
|
|
127
|
+
return Object.keys(parameters).length > 0 ? parameters : undefined;
|
|
128
|
+
};
|
|
129
|
+
export const toolNames = (invocationParams) => {
|
|
130
|
+
const tools = invocationParams?.tools;
|
|
131
|
+
if (!Array.isArray(tools))
|
|
132
|
+
return undefined;
|
|
133
|
+
const names = tools.flatMap((tool) => {
|
|
134
|
+
if (!tool || typeof tool !== 'object')
|
|
135
|
+
return [];
|
|
136
|
+
const candidate = tool;
|
|
137
|
+
if (Array.isArray(candidate.functionDeclarations)) {
|
|
138
|
+
return candidate.functionDeclarations.flatMap((declaration) => typeof declaration.name === 'string' ? [declaration.name] : []);
|
|
139
|
+
}
|
|
140
|
+
const name = candidate.name ?? candidate.function?.name;
|
|
141
|
+
return typeof name === 'string' ? [name] : [];
|
|
142
|
+
});
|
|
143
|
+
return names.length > 0 ? names : undefined;
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=serialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"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"}
|
package/dist/span.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type AgentLensObservationType } from '@linnify/agentlens-otel';
|
|
2
|
+
import type { Resource } from '@opentelemetry/resources';
|
|
3
|
+
import type { ReadableSpan } from '@opentelemetry/sdk-trace-base';
|
|
4
|
+
export interface TraceContext {
|
|
5
|
+
traceId: string;
|
|
6
|
+
agent?: string;
|
|
7
|
+
sessionId?: string;
|
|
8
|
+
userId?: string;
|
|
9
|
+
tenant?: string;
|
|
10
|
+
environment?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface Run {
|
|
13
|
+
trace: TraceContext;
|
|
14
|
+
spanId: string;
|
|
15
|
+
parentSpanId?: string;
|
|
16
|
+
name: string;
|
|
17
|
+
type: AgentLensObservationType;
|
|
18
|
+
startTime: number;
|
|
19
|
+
input?: unknown;
|
|
20
|
+
metadata: Record<string, unknown>;
|
|
21
|
+
model?: string;
|
|
22
|
+
modelParameters?: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
export interface RunEnd {
|
|
25
|
+
output?: unknown;
|
|
26
|
+
error?: string;
|
|
27
|
+
model?: string;
|
|
28
|
+
usage?: object;
|
|
29
|
+
metadata?: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
export declare const toReadableSpan: (run: Run, end: RunEnd, { resource, scopeName, mask }: {
|
|
32
|
+
resource: Resource;
|
|
33
|
+
scopeName: string;
|
|
34
|
+
mask: (value: unknown) => unknown;
|
|
35
|
+
}) => ReadableSpan;
|
package/dist/span.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { AGENTLENS_ATTRIBUTES } from '@linnify/agentlens-otel';
|
|
2
|
+
import { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';
|
|
3
|
+
const toHrTime = (ms) => [Math.floor(ms / 1000), (ms % 1000) * 1_000_000];
|
|
4
|
+
const serialize = (value) => {
|
|
5
|
+
if (value === undefined)
|
|
6
|
+
return undefined;
|
|
7
|
+
if (typeof value === 'string')
|
|
8
|
+
return value;
|
|
9
|
+
try {
|
|
10
|
+
return JSON.stringify(value);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
export const toReadableSpan = (run, end, { resource, scopeName, mask }) => {
|
|
17
|
+
const endTime = Date.now();
|
|
18
|
+
const { trace } = run;
|
|
19
|
+
const input = mask(run.input);
|
|
20
|
+
const output = mask(end.output);
|
|
21
|
+
// Session, user, tenant and environment ride on every span: a trace's spans can reach
|
|
22
|
+
// AgentLens in several batches, and the root is the last to end.
|
|
23
|
+
const attributes = {
|
|
24
|
+
[AGENTLENS_ATTRIBUTES.AGENT]: trace.agent,
|
|
25
|
+
[AGENTLENS_ATTRIBUTES.OBSERVATION_TYPE]: run.type,
|
|
26
|
+
[AGENTLENS_ATTRIBUTES.OBSERVATION_INPUT]: serialize(input),
|
|
27
|
+
[AGENTLENS_ATTRIBUTES.OBSERVATION_OUTPUT]: serialize(output),
|
|
28
|
+
[AGENTLENS_ATTRIBUTES.OBSERVATION_METADATA]: serialize(mask({ ...run.metadata, ...end.metadata })),
|
|
29
|
+
[AGENTLENS_ATTRIBUTES.OBSERVATION_MODEL]: end.model ?? run.model,
|
|
30
|
+
[AGENTLENS_ATTRIBUTES.OBSERVATION_MODEL_PARAMETERS]: serialize(run.modelParameters),
|
|
31
|
+
[AGENTLENS_ATTRIBUTES.OBSERVATION_USAGE]: serialize(end.usage),
|
|
32
|
+
[AGENTLENS_ATTRIBUTES.TRACE_SESSION_ID]: trace.sessionId,
|
|
33
|
+
[AGENTLENS_ATTRIBUTES.TRACE_USER_ID]: trace.userId,
|
|
34
|
+
[AGENTLENS_ATTRIBUTES.TRACE_TENANT]: trace.tenant,
|
|
35
|
+
[AGENTLENS_ATTRIBUTES.TRACE_ENVIRONMENT]: trace.environment
|
|
36
|
+
};
|
|
37
|
+
const durationMs = endTime - run.startTime;
|
|
38
|
+
return {
|
|
39
|
+
name: run.name,
|
|
40
|
+
kind: SpanKind.INTERNAL,
|
|
41
|
+
spanContext: () => ({ traceId: trace.traceId, spanId: run.spanId, traceFlags: TraceFlags.SAMPLED }),
|
|
42
|
+
parentSpanContext: run.parentSpanId
|
|
43
|
+
? { traceId: trace.traceId, spanId: run.parentSpanId, traceFlags: TraceFlags.SAMPLED }
|
|
44
|
+
: undefined,
|
|
45
|
+
startTime: toHrTime(run.startTime),
|
|
46
|
+
endTime: toHrTime(endTime),
|
|
47
|
+
duration: toHrTime(durationMs),
|
|
48
|
+
status: end.error ? { code: SpanStatusCode.ERROR, message: end.error } : { code: SpanStatusCode.OK },
|
|
49
|
+
attributes: Object.fromEntries(Object.entries(attributes).filter(([, value]) => value !== undefined)),
|
|
50
|
+
links: [],
|
|
51
|
+
events: [],
|
|
52
|
+
ended: true,
|
|
53
|
+
resource,
|
|
54
|
+
instrumentationScope: { name: scopeName },
|
|
55
|
+
droppedAttributesCount: 0,
|
|
56
|
+
droppedEventsCount: 0,
|
|
57
|
+
droppedLinksCount: 0
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=span.js.map
|
package/dist/span.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"span.js","sourceRoot":"","sources":["../src/span.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,56 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@linnify/agentlens-langchain",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"description": "AgentLens callback handler for LangChain and LangGraph: traces and feedback",
|
|
5
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
6
|
+
"author": "Linnify",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/linnify/agentlens-sdk.git",
|
|
10
|
+
"directory": "packages/langchain"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"agentlens",
|
|
14
|
+
"observability",
|
|
15
|
+
"tracing",
|
|
16
|
+
"llm",
|
|
17
|
+
"opentelemetry",
|
|
18
|
+
"langchain",
|
|
19
|
+
"langgraph"
|
|
20
|
+
],
|
|
21
|
+
"type": "module",
|
|
22
|
+
"main": "./dist/index.js",
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"exports": {
|
|
25
|
+
".": {
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"default": "./dist/index.js"
|
|
28
|
+
},
|
|
29
|
+
"./package.json": "./package.json"
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"dist"
|
|
33
|
+
],
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@opentelemetry/resources": "^2.10.0",
|
|
39
|
+
"@opentelemetry/sdk-trace-base": "^2.10.0",
|
|
40
|
+
"@linnify/agentlens-client": "^0.3.1",
|
|
41
|
+
"@linnify/agentlens-otel": "^0.3.1"
|
|
42
|
+
},
|
|
43
|
+
"peerDependencies": {
|
|
44
|
+
"@langchain/core": ">=1.0.0 <2.0.0",
|
|
45
|
+
"@opentelemetry/api": "^1.9.0"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@langchain/core": "^1.2.0",
|
|
49
|
+
"@opentelemetry/api": "^1.9.1"
|
|
50
|
+
},
|
|
51
|
+
"scripts": {
|
|
52
|
+
"build": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\" && tsc",
|
|
53
|
+
"type-check": "tsc --noEmit",
|
|
54
|
+
"lint": "publint --strict && attw --pack --profile esm-only"
|
|
55
|
+
}
|
|
6
56
|
}
|