@aui-x/prism 0.0.1 → 0.0.3
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 +8 -10
- package/dist/{client-BrZstMQX.d.ts → client-CTcnqw0Y.d.ts} +21 -16
- package/dist/client-CTcnqw0Y.d.ts.map +1 -0
- package/dist/{client-C7RiAn7a.js → client-CkxOaNy0.js} +56 -25
- package/dist/client-CkxOaNy0.js.map +1 -0
- package/dist/{client-B9WXHjpz.cjs → client-DWaiEqR5.cjs} +56 -25
- package/dist/client-DWaiEqR5.cjs.map +1 -0
- package/dist/{client-BSsSpkZY.d.cts → client-DgiofMcL.d.cts} +21 -16
- package/dist/client-DgiofMcL.d.cts.map +1 -0
- package/dist/core.cjs +1 -1
- package/dist/core.d.cts +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/integrations/ai-sdk.cjs +16 -3
- package/dist/integrations/ai-sdk.cjs.map +1 -1
- package/dist/integrations/ai-sdk.d.cts +1 -1
- package/dist/integrations/ai-sdk.d.cts.map +1 -1
- package/dist/integrations/ai-sdk.d.ts +1 -1
- package/dist/integrations/ai-sdk.d.ts.map +1 -1
- package/dist/integrations/ai-sdk.js +16 -3
- package/dist/integrations/ai-sdk.js.map +1 -1
- package/dist/integrations/anthropic.cjs +11 -84
- package/dist/integrations/anthropic.cjs.map +1 -1
- package/dist/integrations/anthropic.d.cts +1 -1
- package/dist/integrations/anthropic.d.cts.map +1 -1
- package/dist/integrations/anthropic.d.ts +1 -1
- package/dist/integrations/anthropic.d.ts.map +1 -1
- package/dist/integrations/anthropic.js +5 -77
- package/dist/integrations/anthropic.js.map +1 -1
- package/dist/integrations/openai.cjs +13 -82
- package/dist/integrations/openai.cjs.map +1 -1
- package/dist/integrations/openai.d.cts +1 -1
- package/dist/integrations/openai.d.cts.map +1 -1
- package/dist/integrations/openai.d.ts +1 -1
- package/dist/integrations/openai.d.ts.map +1 -1
- package/dist/integrations/openai.js +6 -74
- package/dist/integrations/openai.js.map +1 -1
- package/dist/shared-CcAuQvBc.js +85 -0
- package/dist/shared-CcAuQvBc.js.map +1 -0
- package/dist/shared-Do8YbTDV.cjs +115 -0
- package/dist/shared-Do8YbTDV.cjs.map +1 -0
- package/dist/{wrapper-ByspXfxS.cjs → wrapper-3UjPvXBN.cjs} +16 -86
- package/dist/wrapper-3UjPvXBN.cjs.map +1 -0
- package/dist/{wrapper-7jRyp54U.js → wrapper-Czc4CgC-.js} +8 -78
- package/dist/wrapper-Czc4CgC-.js.map +1 -0
- package/package.json +1 -1
- package/dist/client-B9WXHjpz.cjs.map +0 -1
- package/dist/client-BSsSpkZY.d.cts.map +0 -1
- package/dist/client-BrZstMQX.d.ts.map +0 -1
- package/dist/client-C7RiAn7a.js.map +0 -1
- package/dist/wrapper-7jRyp54U.js.map +0 -1
- package/dist/wrapper-ByspXfxS.cjs.map +0 -1
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/shared.ts
|
|
3
|
+
function truncateInput(messages, maxBytes = 32768) {
|
|
4
|
+
let json = JSON.stringify(messages);
|
|
5
|
+
if (new TextEncoder().encode(json).length <= maxBytes) return messages;
|
|
6
|
+
if (!Array.isArray(messages)) return messages;
|
|
7
|
+
const arr = [...messages];
|
|
8
|
+
while (arr.length > 1) {
|
|
9
|
+
arr.shift();
|
|
10
|
+
json = JSON.stringify(arr);
|
|
11
|
+
if (new TextEncoder().encode(json).length <= maxBytes) return arr;
|
|
12
|
+
}
|
|
13
|
+
return arr;
|
|
14
|
+
}
|
|
15
|
+
function createRootHandle(tracer, opts, model, provider, input, metadata) {
|
|
16
|
+
const parentTraceId = opts?.parentTraceId;
|
|
17
|
+
if (parentTraceId) return {
|
|
18
|
+
isSpanMode: true,
|
|
19
|
+
traceId: parentTraceId,
|
|
20
|
+
handle: tracer.startSpanOnTrace(parentTraceId, {
|
|
21
|
+
name: opts?.name ?? model,
|
|
22
|
+
type: "llm",
|
|
23
|
+
input,
|
|
24
|
+
model,
|
|
25
|
+
provider,
|
|
26
|
+
metadata
|
|
27
|
+
})
|
|
28
|
+
};
|
|
29
|
+
const handle = tracer.startTrace({
|
|
30
|
+
name: opts?.name ?? model,
|
|
31
|
+
model,
|
|
32
|
+
provider,
|
|
33
|
+
input,
|
|
34
|
+
metadata,
|
|
35
|
+
tags: opts?.tags,
|
|
36
|
+
endUserId: opts?.endUserId
|
|
37
|
+
});
|
|
38
|
+
return {
|
|
39
|
+
isSpanMode: false,
|
|
40
|
+
traceId: handle.traceId,
|
|
41
|
+
handle
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function createToolSpan(tracer, root, toolCall) {
|
|
45
|
+
if (root.isSpanMode) return tracer.startSpanOnTrace(root.traceId, {
|
|
46
|
+
name: toolCall.name,
|
|
47
|
+
type: "tool",
|
|
48
|
+
input: toolCall.input,
|
|
49
|
+
parentSpanId: root.handle.spanId
|
|
50
|
+
});
|
|
51
|
+
return root.handle.startSpan({
|
|
52
|
+
name: toolCall.name,
|
|
53
|
+
type: "tool",
|
|
54
|
+
input: toolCall.input
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function endRootHandle(root, result, usage) {
|
|
58
|
+
if (usage) {
|
|
59
|
+
usage.inputTokens += result.inputTokens;
|
|
60
|
+
usage.outputTokens += result.outputTokens;
|
|
61
|
+
usage.ttftMs ??= result.ttftMs;
|
|
62
|
+
usage.output = result.output;
|
|
63
|
+
}
|
|
64
|
+
root.handle.end({
|
|
65
|
+
output: result.output,
|
|
66
|
+
status: "completed",
|
|
67
|
+
totalTokens: result.inputTokens + result.outputTokens,
|
|
68
|
+
inputTokens: result.inputTokens,
|
|
69
|
+
outputTokens: result.outputTokens,
|
|
70
|
+
ttftMs: result.ttftMs
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function cleanupOnError(root, error, pendingToolSpans) {
|
|
74
|
+
if (pendingToolSpans) {
|
|
75
|
+
for (const span of pendingToolSpans.values()) span.end({ status: "error" });
|
|
76
|
+
pendingToolSpans.clear();
|
|
77
|
+
}
|
|
78
|
+
root.handle.end({
|
|
79
|
+
status: "error",
|
|
80
|
+
error: error instanceof Error ? error.message : String(error)
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
//#endregion
|
|
85
|
+
Object.defineProperty(exports, 'cleanupOnError', {
|
|
86
|
+
enumerable: true,
|
|
87
|
+
get: function () {
|
|
88
|
+
return cleanupOnError;
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
Object.defineProperty(exports, 'createRootHandle', {
|
|
92
|
+
enumerable: true,
|
|
93
|
+
get: function () {
|
|
94
|
+
return createRootHandle;
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
Object.defineProperty(exports, 'createToolSpan', {
|
|
98
|
+
enumerable: true,
|
|
99
|
+
get: function () {
|
|
100
|
+
return createToolSpan;
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
Object.defineProperty(exports, 'endRootHandle', {
|
|
104
|
+
enumerable: true,
|
|
105
|
+
get: function () {
|
|
106
|
+
return endRootHandle;
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
Object.defineProperty(exports, 'truncateInput', {
|
|
110
|
+
enumerable: true,
|
|
111
|
+
get: function () {
|
|
112
|
+
return truncateInput;
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
//# sourceMappingURL=shared-Do8YbTDV.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-Do8YbTDV.cjs","names":[],"sources":["../src/shared.ts"],"sourcesContent":["import type { AuixPrism, SpanHandle, TraceHandle } from \"./client\";\n\nexport type RootHandle =\n | { isSpanMode: true; traceId: string; handle: SpanHandle }\n | { isSpanMode: false; traceId: string; handle: TraceHandle };\n\nexport interface RootHandleOptions {\n name?: string;\n tags?: string[];\n metadata?: Record<string, unknown>;\n parentTraceId?: string;\n endUserId?: string;\n}\n\nexport interface ToolCallInput {\n id: string;\n name: string;\n input: string;\n}\n\nexport interface UsageAccumulator {\n inputTokens: number;\n outputTokens: number;\n ttftMs?: number;\n output?: string;\n}\n\nexport function truncateInput(messages: unknown, maxBytes = 32768): unknown {\n let json = JSON.stringify(messages);\n if (new TextEncoder().encode(json).length <= maxBytes) {\n return messages;\n }\n\n if (!Array.isArray(messages)) return messages;\n const arr = [...messages];\n while (arr.length > 1) {\n arr.shift();\n json = JSON.stringify(arr);\n if (new TextEncoder().encode(json).length <= maxBytes) {\n return arr;\n }\n }\n return arr;\n}\n\nexport function createRootHandle(\n tracer: AuixPrism,\n opts: RootHandleOptions | undefined,\n model: string,\n provider: string,\n input: unknown,\n metadata: Record<string, unknown> | undefined,\n): RootHandle {\n const parentTraceId = opts?.parentTraceId;\n\n if (parentTraceId) {\n const handle = tracer.startSpanOnTrace(parentTraceId, {\n name: opts?.name ?? model,\n type: \"llm\",\n input,\n model,\n provider,\n metadata,\n });\n return { isSpanMode: true, traceId: parentTraceId, handle };\n }\n\n const handle = tracer.startTrace({\n name: opts?.name ?? model,\n model,\n provider,\n input,\n metadata,\n tags: opts?.tags,\n endUserId: opts?.endUserId,\n });\n return { isSpanMode: false, traceId: handle.traceId, handle };\n}\n\nexport function createToolSpan(\n tracer: AuixPrism,\n root: RootHandle,\n toolCall: ToolCallInput,\n): SpanHandle {\n if (root.isSpanMode) {\n return tracer.startSpanOnTrace(root.traceId, {\n name: toolCall.name,\n type: \"tool\",\n input: toolCall.input,\n parentSpanId: root.handle.spanId,\n });\n }\n return root.handle.startSpan({\n name: toolCall.name,\n type: \"tool\",\n input: toolCall.input,\n });\n}\n\nexport function endRootHandle(\n root: RootHandle,\n result: {\n output: string;\n inputTokens: number;\n outputTokens: number;\n ttftMs?: number;\n },\n usage?: UsageAccumulator,\n): void {\n if (usage) {\n usage.inputTokens += result.inputTokens;\n usage.outputTokens += result.outputTokens;\n usage.ttftMs ??= result.ttftMs;\n usage.output = result.output;\n }\n\n root.handle.end({\n output: result.output,\n status: \"completed\",\n totalTokens: result.inputTokens + result.outputTokens,\n inputTokens: result.inputTokens,\n outputTokens: result.outputTokens,\n ttftMs: result.ttftMs,\n });\n}\n\nexport function cleanupOnError(\n root: RootHandle,\n error: unknown,\n pendingToolSpans?: Map<string, SpanHandle>,\n): void {\n if (pendingToolSpans) {\n for (const span of pendingToolSpans.values()) {\n span.end({ status: \"error\" });\n }\n pendingToolSpans.clear();\n }\n\n root.handle.end({\n status: \"error\",\n error: error instanceof Error ? error.message : String(error),\n });\n}\n"],"mappings":";;AA2BA,SAAgB,cAAc,UAAmB,WAAW,OAAgB;CAC1E,IAAI,OAAO,KAAK,UAAU,SAAS;AACnC,KAAI,IAAI,aAAa,CAAC,OAAO,KAAK,CAAC,UAAU,SAC3C,QAAO;AAGT,KAAI,CAAC,MAAM,QAAQ,SAAS,CAAE,QAAO;CACrC,MAAM,MAAM,CAAC,GAAG,SAAS;AACzB,QAAO,IAAI,SAAS,GAAG;AACrB,MAAI,OAAO;AACX,SAAO,KAAK,UAAU,IAAI;AAC1B,MAAI,IAAI,aAAa,CAAC,OAAO,KAAK,CAAC,UAAU,SAC3C,QAAO;;AAGX,QAAO;;AAGT,SAAgB,iBACd,QACA,MACA,OACA,UACA,OACA,UACY;CACZ,MAAM,gBAAgB,MAAM;AAE5B,KAAI,cASF,QAAO;EAAE,YAAY;EAAM,SAAS;EAAe,QARpC,OAAO,iBAAiB,eAAe;GACpD,MAAM,MAAM,QAAQ;GACpB,MAAM;GACN;GACA;GACA;GACA;GACD,CAAC;EACyD;CAG7D,MAAM,SAAS,OAAO,WAAW;EAC/B,MAAM,MAAM,QAAQ;EACpB;EACA;EACA;EACA;EACA,MAAM,MAAM;EACZ,WAAW,MAAM;EAClB,CAAC;AACF,QAAO;EAAE,YAAY;EAAO,SAAS,OAAO;EAAS;EAAQ;;AAG/D,SAAgB,eACd,QACA,MACA,UACY;AACZ,KAAI,KAAK,WACP,QAAO,OAAO,iBAAiB,KAAK,SAAS;EAC3C,MAAM,SAAS;EACf,MAAM;EACN,OAAO,SAAS;EAChB,cAAc,KAAK,OAAO;EAC3B,CAAC;AAEJ,QAAO,KAAK,OAAO,UAAU;EAC3B,MAAM,SAAS;EACf,MAAM;EACN,OAAO,SAAS;EACjB,CAAC;;AAGJ,SAAgB,cACd,MACA,QAMA,OACM;AACN,KAAI,OAAO;AACT,QAAM,eAAe,OAAO;AAC5B,QAAM,gBAAgB,OAAO;AAC7B,QAAM,WAAW,OAAO;AACxB,QAAM,SAAS,OAAO;;AAGxB,MAAK,OAAO,IAAI;EACd,QAAQ,OAAO;EACf,QAAQ;EACR,aAAa,OAAO,cAAc,OAAO;EACzC,aAAa,OAAO;EACpB,cAAc,OAAO;EACrB,QAAQ,OAAO;EAChB,CAAC;;AAGJ,SAAgB,eACd,MACA,OACA,kBACM;AACN,KAAI,kBAAkB;AACpB,OAAK,MAAM,QAAQ,iBAAiB,QAAQ,CAC1C,MAAK,IAAI,EAAE,QAAQ,SAAS,CAAC;AAE/B,mBAAiB,OAAO;;AAG1B,MAAK,OAAO,IAAI;EACd,QAAQ;EACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;EAC9D,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const require_shared = require('./shared-Do8YbTDV.cjs');
|
|
1
2
|
let ai = require("ai");
|
|
2
3
|
|
|
3
4
|
//#region src/wrapper.ts
|
|
@@ -10,17 +11,6 @@ function wrapModelWithMiddleware(tracer, model, opts) {
|
|
|
10
11
|
function extractTextFromContent(content) {
|
|
11
12
|
return content.filter((c) => c.type === "text" && typeof c.text === "string").map((c) => c.text).join("");
|
|
12
13
|
}
|
|
13
|
-
function truncateInput(prompt, maxBytes = 32768) {
|
|
14
|
-
let json = JSON.stringify(prompt);
|
|
15
|
-
if (new TextEncoder().encode(json).length <= maxBytes) return prompt;
|
|
16
|
-
const arr = [...prompt];
|
|
17
|
-
while (arr.length > 1) {
|
|
18
|
-
arr.shift();
|
|
19
|
-
json = JSON.stringify(arr);
|
|
20
|
-
if (new TextEncoder().encode(json).length <= maxBytes) return arr;
|
|
21
|
-
}
|
|
22
|
-
return arr;
|
|
23
|
-
}
|
|
24
14
|
function extractModelConfig(params) {
|
|
25
15
|
const keys = [
|
|
26
16
|
"temperature",
|
|
@@ -60,66 +50,6 @@ function resolveToolResults(prompt, pendingToolSpans) {
|
|
|
60
50
|
}
|
|
61
51
|
}
|
|
62
52
|
}
|
|
63
|
-
function createRootHandle(tracer, opts, modelId, provider, input, metadata) {
|
|
64
|
-
const parentTraceId = opts?.parentTraceId;
|
|
65
|
-
if (parentTraceId) return {
|
|
66
|
-
isSpanMode: true,
|
|
67
|
-
traceId: parentTraceId,
|
|
68
|
-
handle: tracer.startSpanOnTrace(parentTraceId, {
|
|
69
|
-
name: opts?.name ?? modelId,
|
|
70
|
-
type: "llm",
|
|
71
|
-
input,
|
|
72
|
-
model: modelId,
|
|
73
|
-
provider,
|
|
74
|
-
metadata
|
|
75
|
-
})
|
|
76
|
-
};
|
|
77
|
-
const handle = tracer.startTrace({
|
|
78
|
-
name: opts?.name ?? modelId,
|
|
79
|
-
model: modelId,
|
|
80
|
-
provider,
|
|
81
|
-
input,
|
|
82
|
-
metadata,
|
|
83
|
-
tags: opts?.tags,
|
|
84
|
-
endUserId: opts?.endUserId
|
|
85
|
-
});
|
|
86
|
-
return {
|
|
87
|
-
isSpanMode: false,
|
|
88
|
-
traceId: handle.traceId,
|
|
89
|
-
handle
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
function createToolSpan(tracer, root, toolCall) {
|
|
93
|
-
if (root.isSpanMode) return tracer.startSpanOnTrace(root.traceId, {
|
|
94
|
-
name: toolCall.toolName,
|
|
95
|
-
type: "tool",
|
|
96
|
-
input: toolCall.input,
|
|
97
|
-
parentSpanId: root.handle.spanId
|
|
98
|
-
});
|
|
99
|
-
return root.handle.startSpan({
|
|
100
|
-
name: toolCall.toolName,
|
|
101
|
-
type: "tool",
|
|
102
|
-
input: toolCall.input
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
function endRootHandle(root, result) {
|
|
106
|
-
root.handle.end({
|
|
107
|
-
output: result.output,
|
|
108
|
-
status: "completed",
|
|
109
|
-
totalTokens: result.inputTokens + result.outputTokens,
|
|
110
|
-
promptTokens: result.inputTokens,
|
|
111
|
-
completionTokens: result.outputTokens,
|
|
112
|
-
ttftMs: result.ttftMs
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
function cleanupOnError(root, pendingToolSpans, error) {
|
|
116
|
-
for (const span of pendingToolSpans.values()) span.end({ status: "error" });
|
|
117
|
-
pendingToolSpans.clear();
|
|
118
|
-
root.handle.end({
|
|
119
|
-
status: "error",
|
|
120
|
-
error: error instanceof Error ? error.message : String(error)
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
53
|
function buildMetadata(opts, params) {
|
|
124
54
|
const modelConfig = extractModelConfig(params);
|
|
125
55
|
if (modelConfig) return {
|
|
@@ -133,10 +63,10 @@ function createPrismMiddleware(tracer, opts) {
|
|
|
133
63
|
return {
|
|
134
64
|
specificationVersion: "v3",
|
|
135
65
|
wrapGenerate: async ({ doGenerate, params, model }) => {
|
|
136
|
-
const input = truncateInput(params.prompt);
|
|
66
|
+
const input = require_shared.truncateInput(params.prompt);
|
|
137
67
|
const metadata = buildMetadata(opts, params);
|
|
138
68
|
resolveToolResults(params.prompt, pendingToolSpans);
|
|
139
|
-
const root = createRootHandle(tracer, opts, model.modelId, model.provider, input, metadata);
|
|
69
|
+
const root = require_shared.createRootHandle(tracer, opts, model.modelId, model.provider, input, metadata);
|
|
140
70
|
try {
|
|
141
71
|
const result = await doGenerate();
|
|
142
72
|
const content = result.content;
|
|
@@ -144,30 +74,30 @@ function createPrismMiddleware(tracer, opts) {
|
|
|
144
74
|
const inputTokens = result.usage.inputTokens.total ?? 0;
|
|
145
75
|
const outputTokens = result.usage.outputTokens.total ?? 0;
|
|
146
76
|
for (const part of content) if (part.type === "tool-call" && part.toolCallId) {
|
|
147
|
-
const span = createToolSpan(tracer, root, {
|
|
77
|
+
const span = require_shared.createToolSpan(tracer, root, {
|
|
148
78
|
id: part.toolCallId,
|
|
149
|
-
|
|
79
|
+
name: part.toolName ?? "tool",
|
|
150
80
|
input: part.input ?? ""
|
|
151
81
|
});
|
|
152
82
|
if (root.isSpanMode) pendingToolSpans.set(part.toolCallId, span);
|
|
153
83
|
else span.end({ status: "completed" });
|
|
154
84
|
}
|
|
155
|
-
endRootHandle(root, {
|
|
85
|
+
require_shared.endRootHandle(root, {
|
|
156
86
|
output,
|
|
157
87
|
inputTokens,
|
|
158
88
|
outputTokens
|
|
159
|
-
});
|
|
89
|
+
}, opts?.usage);
|
|
160
90
|
return result;
|
|
161
91
|
} catch (error) {
|
|
162
|
-
cleanupOnError(root,
|
|
92
|
+
require_shared.cleanupOnError(root, error, pendingToolSpans);
|
|
163
93
|
throw error;
|
|
164
94
|
}
|
|
165
95
|
},
|
|
166
96
|
wrapStream: async ({ doStream, params, model }) => {
|
|
167
|
-
const input = truncateInput(params.prompt);
|
|
97
|
+
const input = require_shared.truncateInput(params.prompt);
|
|
168
98
|
const metadata = buildMetadata(opts, params);
|
|
169
99
|
resolveToolResults(params.prompt, pendingToolSpans);
|
|
170
|
-
const root = createRootHandle(tracer, opts, model.modelId, model.provider, input, metadata);
|
|
100
|
+
const root = require_shared.createRootHandle(tracer, opts, model.modelId, model.provider, input, metadata);
|
|
171
101
|
try {
|
|
172
102
|
const streamStart = Date.now();
|
|
173
103
|
const { stream, ...rest } = await doStream();
|
|
@@ -191,7 +121,7 @@ function createPrismMiddleware(tracer, opts) {
|
|
|
191
121
|
case "tool-input-start":
|
|
192
122
|
currentToolInput = {
|
|
193
123
|
id: chunk.id,
|
|
194
|
-
|
|
124
|
+
name: chunk.toolName,
|
|
195
125
|
input: ""
|
|
196
126
|
};
|
|
197
127
|
break;
|
|
@@ -213,16 +143,16 @@ function createPrismMiddleware(tracer, opts) {
|
|
|
213
143
|
},
|
|
214
144
|
flush() {
|
|
215
145
|
for (const tc of toolCalls) {
|
|
216
|
-
const span = createToolSpan(tracer, root, tc);
|
|
146
|
+
const span = require_shared.createToolSpan(tracer, root, tc);
|
|
217
147
|
if (root.isSpanMode) pendingToolSpans.set(tc.id, span);
|
|
218
148
|
else span.end({ status: "completed" });
|
|
219
149
|
}
|
|
220
|
-
endRootHandle(root, {
|
|
150
|
+
require_shared.endRootHandle(root, {
|
|
221
151
|
output,
|
|
222
152
|
inputTokens,
|
|
223
153
|
outputTokens,
|
|
224
154
|
ttftMs
|
|
225
|
-
});
|
|
155
|
+
}, opts?.usage);
|
|
226
156
|
}
|
|
227
157
|
});
|
|
228
158
|
return {
|
|
@@ -230,7 +160,7 @@ function createPrismMiddleware(tracer, opts) {
|
|
|
230
160
|
...rest
|
|
231
161
|
};
|
|
232
162
|
} catch (error) {
|
|
233
|
-
cleanupOnError(root,
|
|
163
|
+
require_shared.cleanupOnError(root, error, pendingToolSpans);
|
|
234
164
|
throw error;
|
|
235
165
|
}
|
|
236
166
|
}
|
|
@@ -244,4 +174,4 @@ Object.defineProperty(exports, 'wrapModelWithMiddleware', {
|
|
|
244
174
|
return wrapModelWithMiddleware;
|
|
245
175
|
}
|
|
246
176
|
});
|
|
247
|
-
//# sourceMappingURL=wrapper-
|
|
177
|
+
//# sourceMappingURL=wrapper-3UjPvXBN.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrapper-3UjPvXBN.cjs","names":["truncateInput","createRootHandle","createToolSpan"],"sources":["../src/wrapper.ts"],"sourcesContent":["import type {\n LanguageModelV3,\n LanguageModelV3Middleware,\n LanguageModelV3Prompt,\n} from \"@ai-sdk/provider\";\nimport { wrapLanguageModel } from \"ai\";\nimport type { AuixPrism, SpanHandle } from \"./client\";\nimport type { AISDKPrismOptions } from \"./integrations/ai-sdk\";\nimport type { ToolCallInput, UsageAccumulator } from \"./shared\";\nimport {\n cleanupOnError,\n createRootHandle,\n createToolSpan,\n endRootHandle,\n truncateInput,\n} from \"./shared\";\n\ntype MiddlewareOptions = AISDKPrismOptions & {\n parentTraceId?: string;\n usage?: UsageAccumulator;\n};\n\nexport function wrapModelWithMiddleware(\n tracer: AuixPrism,\n model: LanguageModelV3,\n opts?: MiddlewareOptions,\n): LanguageModelV3 {\n return wrapLanguageModel({\n model,\n middleware: createPrismMiddleware(tracer, opts),\n });\n}\n\ntype ContentPart = {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n input?: string;\n [key: string]: unknown;\n};\n\nfunction extractTextFromContent(content: ContentPart[]): string {\n return content\n .filter((c) => c.type === \"text\" && typeof c.text === \"string\")\n .map((c) => c.text)\n .join(\"\");\n}\n\nfunction extractModelConfig(params: Record<string, unknown>) {\n const keys = [\n \"temperature\",\n \"maxOutputTokens\",\n \"topP\",\n \"topK\",\n \"frequencyPenalty\",\n \"presencePenalty\",\n \"stopSequences\",\n ] as const;\n\n const config: Record<string, unknown> = {};\n for (const key of keys) {\n if (params[key] !== undefined) {\n config[key] = params[key];\n }\n }\n return Object.keys(config).length > 0 ? config : undefined;\n}\n\nfunction extractToolOutput(output: unknown): unknown {\n if (output && typeof output === \"object\" && \"type\" in output) {\n const o = output as {\n type: string;\n value?: unknown;\n reason?: string;\n };\n if (o.type === \"text\" || o.type === \"json\") return o.value;\n if (o.type === \"denied\") return `[denied] ${o.reason ?? \"\"}`;\n }\n return output;\n}\n\nfunction resolveToolResults(\n prompt: LanguageModelV3Prompt,\n pendingToolSpans: Map<string, SpanHandle>,\n): void {\n if (pendingToolSpans.size === 0) return;\n\n for (const msg of prompt) {\n if (msg.role !== \"tool\") continue;\n for (const part of msg.content) {\n if (part.type !== \"tool-result\") continue;\n const span = pendingToolSpans.get(part.toolCallId);\n if (span) {\n span.end({\n output: extractToolOutput(part.output),\n status: \"completed\",\n });\n pendingToolSpans.delete(part.toolCallId);\n }\n }\n }\n}\n\nfunction buildMetadata(\n opts: MiddlewareOptions | undefined,\n params: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const modelConfig = extractModelConfig(params);\n if (modelConfig) return { ...opts?.metadata, modelConfig };\n return opts?.metadata;\n}\n\nfunction createPrismMiddleware(\n tracer: AuixPrism,\n opts?: MiddlewareOptions,\n): LanguageModelV3Middleware {\n const pendingToolSpans = new Map<string, SpanHandle>();\n\n return {\n specificationVersion: \"v3\",\n\n wrapGenerate: async ({ doGenerate, params, model }) => {\n const input = truncateInput(params.prompt);\n const metadata = buildMetadata(opts, params);\n\n resolveToolResults(params.prompt, pendingToolSpans);\n\n const root = createRootHandle(\n tracer,\n opts,\n model.modelId,\n model.provider,\n input,\n metadata,\n );\n\n try {\n const result = await doGenerate();\n const content = result.content as ContentPart[];\n const output = extractTextFromContent(content);\n const inputTokens = result.usage.inputTokens.total ?? 0;\n const outputTokens = result.usage.outputTokens.total ?? 0;\n\n for (const part of content) {\n if (part.type === \"tool-call\" && part.toolCallId) {\n const span = createToolSpan(tracer, root, {\n id: part.toolCallId,\n name: part.toolName ?? \"tool\",\n input: part.input ?? \"\",\n });\n if (root.isSpanMode) {\n pendingToolSpans.set(part.toolCallId, span);\n } else {\n span.end({ status: \"completed\" });\n }\n }\n }\n\n endRootHandle(root, { output, inputTokens, outputTokens }, opts?.usage);\n return result;\n } catch (error) {\n cleanupOnError(root, error, pendingToolSpans);\n throw error;\n }\n },\n\n wrapStream: async ({ doStream, params, model }) => {\n const input = truncateInput(params.prompt);\n const metadata = buildMetadata(opts, params);\n\n resolveToolResults(params.prompt, pendingToolSpans);\n\n const root = createRootHandle(\n tracer,\n opts,\n model.modelId,\n model.provider,\n input,\n metadata,\n );\n\n try {\n const streamStart = Date.now();\n const { stream, ...rest } = await doStream();\n\n let output = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let ttftMs: number | undefined;\n let firstChunk = true;\n const toolCalls: ToolCallInput[] = [];\n let currentToolInput: ToolCallInput | null = null;\n\n const transformStream = new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"text-delta\":\n if (firstChunk) {\n ttftMs = Date.now() - streamStart;\n firstChunk = false;\n }\n output += chunk.delta;\n break;\n case \"tool-input-start\":\n currentToolInput = {\n id: chunk.id,\n name: chunk.toolName,\n input: \"\",\n };\n break;\n case \"tool-input-delta\":\n if (currentToolInput && currentToolInput.id === chunk.id) {\n currentToolInput.input += chunk.delta;\n }\n break;\n case \"tool-input-end\":\n if (currentToolInput && currentToolInput.id === chunk.id) {\n toolCalls.push(currentToolInput);\n currentToolInput = null;\n }\n break;\n case \"finish\":\n inputTokens = chunk.usage.inputTokens.total ?? 0;\n outputTokens = chunk.usage.outputTokens.total ?? 0;\n break;\n }\n controller.enqueue(chunk);\n },\n flush() {\n for (const tc of toolCalls) {\n const span = createToolSpan(tracer, root, tc);\n if (root.isSpanMode) {\n pendingToolSpans.set(tc.id, span);\n } else {\n span.end({ status: \"completed\" });\n }\n }\n\n endRootHandle(\n root,\n { output, inputTokens, outputTokens, ttftMs },\n opts?.usage,\n );\n },\n });\n\n return {\n stream: stream.pipeThrough(transformStream),\n ...rest,\n };\n } catch (error) {\n cleanupOnError(root, error, pendingToolSpans);\n throw error;\n }\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { a as truncateInput, i as endRootHandle, n as createRootHandle, r as createToolSpan, t as cleanupOnError } from "./shared-CcAuQvBc.js";
|
|
1
2
|
import { wrapLanguageModel } from "ai";
|
|
2
3
|
|
|
3
4
|
//#region src/wrapper.ts
|
|
@@ -10,17 +11,6 @@ function wrapModelWithMiddleware(tracer, model, opts) {
|
|
|
10
11
|
function extractTextFromContent(content) {
|
|
11
12
|
return content.filter((c) => c.type === "text" && typeof c.text === "string").map((c) => c.text).join("");
|
|
12
13
|
}
|
|
13
|
-
function truncateInput(prompt, maxBytes = 32768) {
|
|
14
|
-
let json = JSON.stringify(prompt);
|
|
15
|
-
if (new TextEncoder().encode(json).length <= maxBytes) return prompt;
|
|
16
|
-
const arr = [...prompt];
|
|
17
|
-
while (arr.length > 1) {
|
|
18
|
-
arr.shift();
|
|
19
|
-
json = JSON.stringify(arr);
|
|
20
|
-
if (new TextEncoder().encode(json).length <= maxBytes) return arr;
|
|
21
|
-
}
|
|
22
|
-
return arr;
|
|
23
|
-
}
|
|
24
14
|
function extractModelConfig(params) {
|
|
25
15
|
const keys = [
|
|
26
16
|
"temperature",
|
|
@@ -60,66 +50,6 @@ function resolveToolResults(prompt, pendingToolSpans) {
|
|
|
60
50
|
}
|
|
61
51
|
}
|
|
62
52
|
}
|
|
63
|
-
function createRootHandle(tracer, opts, modelId, provider, input, metadata) {
|
|
64
|
-
const parentTraceId = opts?.parentTraceId;
|
|
65
|
-
if (parentTraceId) return {
|
|
66
|
-
isSpanMode: true,
|
|
67
|
-
traceId: parentTraceId,
|
|
68
|
-
handle: tracer.startSpanOnTrace(parentTraceId, {
|
|
69
|
-
name: opts?.name ?? modelId,
|
|
70
|
-
type: "llm",
|
|
71
|
-
input,
|
|
72
|
-
model: modelId,
|
|
73
|
-
provider,
|
|
74
|
-
metadata
|
|
75
|
-
})
|
|
76
|
-
};
|
|
77
|
-
const handle = tracer.startTrace({
|
|
78
|
-
name: opts?.name ?? modelId,
|
|
79
|
-
model: modelId,
|
|
80
|
-
provider,
|
|
81
|
-
input,
|
|
82
|
-
metadata,
|
|
83
|
-
tags: opts?.tags,
|
|
84
|
-
endUserId: opts?.endUserId
|
|
85
|
-
});
|
|
86
|
-
return {
|
|
87
|
-
isSpanMode: false,
|
|
88
|
-
traceId: handle.traceId,
|
|
89
|
-
handle
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
function createToolSpan(tracer, root, toolCall) {
|
|
93
|
-
if (root.isSpanMode) return tracer.startSpanOnTrace(root.traceId, {
|
|
94
|
-
name: toolCall.toolName,
|
|
95
|
-
type: "tool",
|
|
96
|
-
input: toolCall.input,
|
|
97
|
-
parentSpanId: root.handle.spanId
|
|
98
|
-
});
|
|
99
|
-
return root.handle.startSpan({
|
|
100
|
-
name: toolCall.toolName,
|
|
101
|
-
type: "tool",
|
|
102
|
-
input: toolCall.input
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
function endRootHandle(root, result) {
|
|
106
|
-
root.handle.end({
|
|
107
|
-
output: result.output,
|
|
108
|
-
status: "completed",
|
|
109
|
-
totalTokens: result.inputTokens + result.outputTokens,
|
|
110
|
-
promptTokens: result.inputTokens,
|
|
111
|
-
completionTokens: result.outputTokens,
|
|
112
|
-
ttftMs: result.ttftMs
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
function cleanupOnError(root, pendingToolSpans, error) {
|
|
116
|
-
for (const span of pendingToolSpans.values()) span.end({ status: "error" });
|
|
117
|
-
pendingToolSpans.clear();
|
|
118
|
-
root.handle.end({
|
|
119
|
-
status: "error",
|
|
120
|
-
error: error instanceof Error ? error.message : String(error)
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
53
|
function buildMetadata(opts, params) {
|
|
124
54
|
const modelConfig = extractModelConfig(params);
|
|
125
55
|
if (modelConfig) return {
|
|
@@ -146,7 +76,7 @@ function createPrismMiddleware(tracer, opts) {
|
|
|
146
76
|
for (const part of content) if (part.type === "tool-call" && part.toolCallId) {
|
|
147
77
|
const span = createToolSpan(tracer, root, {
|
|
148
78
|
id: part.toolCallId,
|
|
149
|
-
|
|
79
|
+
name: part.toolName ?? "tool",
|
|
150
80
|
input: part.input ?? ""
|
|
151
81
|
});
|
|
152
82
|
if (root.isSpanMode) pendingToolSpans.set(part.toolCallId, span);
|
|
@@ -156,10 +86,10 @@ function createPrismMiddleware(tracer, opts) {
|
|
|
156
86
|
output,
|
|
157
87
|
inputTokens,
|
|
158
88
|
outputTokens
|
|
159
|
-
});
|
|
89
|
+
}, opts?.usage);
|
|
160
90
|
return result;
|
|
161
91
|
} catch (error) {
|
|
162
|
-
cleanupOnError(root,
|
|
92
|
+
cleanupOnError(root, error, pendingToolSpans);
|
|
163
93
|
throw error;
|
|
164
94
|
}
|
|
165
95
|
},
|
|
@@ -191,7 +121,7 @@ function createPrismMiddleware(tracer, opts) {
|
|
|
191
121
|
case "tool-input-start":
|
|
192
122
|
currentToolInput = {
|
|
193
123
|
id: chunk.id,
|
|
194
|
-
|
|
124
|
+
name: chunk.toolName,
|
|
195
125
|
input: ""
|
|
196
126
|
};
|
|
197
127
|
break;
|
|
@@ -222,7 +152,7 @@ function createPrismMiddleware(tracer, opts) {
|
|
|
222
152
|
inputTokens,
|
|
223
153
|
outputTokens,
|
|
224
154
|
ttftMs
|
|
225
|
-
});
|
|
155
|
+
}, opts?.usage);
|
|
226
156
|
}
|
|
227
157
|
});
|
|
228
158
|
return {
|
|
@@ -230,7 +160,7 @@ function createPrismMiddleware(tracer, opts) {
|
|
|
230
160
|
...rest
|
|
231
161
|
};
|
|
232
162
|
} catch (error) {
|
|
233
|
-
cleanupOnError(root,
|
|
163
|
+
cleanupOnError(root, error, pendingToolSpans);
|
|
234
164
|
throw error;
|
|
235
165
|
}
|
|
236
166
|
}
|
|
@@ -239,4 +169,4 @@ function createPrismMiddleware(tracer, opts) {
|
|
|
239
169
|
|
|
240
170
|
//#endregion
|
|
241
171
|
export { wrapModelWithMiddleware as t };
|
|
242
|
-
//# sourceMappingURL=wrapper-
|
|
172
|
+
//# sourceMappingURL=wrapper-Czc4CgC-.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrapper-Czc4CgC-.js","names":[],"sources":["../src/wrapper.ts"],"sourcesContent":["import type {\n LanguageModelV3,\n LanguageModelV3Middleware,\n LanguageModelV3Prompt,\n} from \"@ai-sdk/provider\";\nimport { wrapLanguageModel } from \"ai\";\nimport type { AuixPrism, SpanHandle } from \"./client\";\nimport type { AISDKPrismOptions } from \"./integrations/ai-sdk\";\nimport type { ToolCallInput, UsageAccumulator } from \"./shared\";\nimport {\n cleanupOnError,\n createRootHandle,\n createToolSpan,\n endRootHandle,\n truncateInput,\n} from \"./shared\";\n\ntype MiddlewareOptions = AISDKPrismOptions & {\n parentTraceId?: string;\n usage?: UsageAccumulator;\n};\n\nexport function wrapModelWithMiddleware(\n tracer: AuixPrism,\n model: LanguageModelV3,\n opts?: MiddlewareOptions,\n): LanguageModelV3 {\n return wrapLanguageModel({\n model,\n middleware: createPrismMiddleware(tracer, opts),\n });\n}\n\ntype ContentPart = {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n input?: string;\n [key: string]: unknown;\n};\n\nfunction extractTextFromContent(content: ContentPart[]): string {\n return content\n .filter((c) => c.type === \"text\" && typeof c.text === \"string\")\n .map((c) => c.text)\n .join(\"\");\n}\n\nfunction extractModelConfig(params: Record<string, unknown>) {\n const keys = [\n \"temperature\",\n \"maxOutputTokens\",\n \"topP\",\n \"topK\",\n \"frequencyPenalty\",\n \"presencePenalty\",\n \"stopSequences\",\n ] as const;\n\n const config: Record<string, unknown> = {};\n for (const key of keys) {\n if (params[key] !== undefined) {\n config[key] = params[key];\n }\n }\n return Object.keys(config).length > 0 ? config : undefined;\n}\n\nfunction extractToolOutput(output: unknown): unknown {\n if (output && typeof output === \"object\" && \"type\" in output) {\n const o = output as {\n type: string;\n value?: unknown;\n reason?: string;\n };\n if (o.type === \"text\" || o.type === \"json\") return o.value;\n if (o.type === \"denied\") return `[denied] ${o.reason ?? \"\"}`;\n }\n return output;\n}\n\nfunction resolveToolResults(\n prompt: LanguageModelV3Prompt,\n pendingToolSpans: Map<string, SpanHandle>,\n): void {\n if (pendingToolSpans.size === 0) return;\n\n for (const msg of prompt) {\n if (msg.role !== \"tool\") continue;\n for (const part of msg.content) {\n if (part.type !== \"tool-result\") continue;\n const span = pendingToolSpans.get(part.toolCallId);\n if (span) {\n span.end({\n output: extractToolOutput(part.output),\n status: \"completed\",\n });\n pendingToolSpans.delete(part.toolCallId);\n }\n }\n }\n}\n\nfunction buildMetadata(\n opts: MiddlewareOptions | undefined,\n params: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const modelConfig = extractModelConfig(params);\n if (modelConfig) return { ...opts?.metadata, modelConfig };\n return opts?.metadata;\n}\n\nfunction createPrismMiddleware(\n tracer: AuixPrism,\n opts?: MiddlewareOptions,\n): LanguageModelV3Middleware {\n const pendingToolSpans = new Map<string, SpanHandle>();\n\n return {\n specificationVersion: \"v3\",\n\n wrapGenerate: async ({ doGenerate, params, model }) => {\n const input = truncateInput(params.prompt);\n const metadata = buildMetadata(opts, params);\n\n resolveToolResults(params.prompt, pendingToolSpans);\n\n const root = createRootHandle(\n tracer,\n opts,\n model.modelId,\n model.provider,\n input,\n metadata,\n );\n\n try {\n const result = await doGenerate();\n const content = result.content as ContentPart[];\n const output = extractTextFromContent(content);\n const inputTokens = result.usage.inputTokens.total ?? 0;\n const outputTokens = result.usage.outputTokens.total ?? 0;\n\n for (const part of content) {\n if (part.type === \"tool-call\" && part.toolCallId) {\n const span = createToolSpan(tracer, root, {\n id: part.toolCallId,\n name: part.toolName ?? \"tool\",\n input: part.input ?? \"\",\n });\n if (root.isSpanMode) {\n pendingToolSpans.set(part.toolCallId, span);\n } else {\n span.end({ status: \"completed\" });\n }\n }\n }\n\n endRootHandle(root, { output, inputTokens, outputTokens }, opts?.usage);\n return result;\n } catch (error) {\n cleanupOnError(root, error, pendingToolSpans);\n throw error;\n }\n },\n\n wrapStream: async ({ doStream, params, model }) => {\n const input = truncateInput(params.prompt);\n const metadata = buildMetadata(opts, params);\n\n resolveToolResults(params.prompt, pendingToolSpans);\n\n const root = createRootHandle(\n tracer,\n opts,\n model.modelId,\n model.provider,\n input,\n metadata,\n );\n\n try {\n const streamStart = Date.now();\n const { stream, ...rest } = await doStream();\n\n let output = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let ttftMs: number | undefined;\n let firstChunk = true;\n const toolCalls: ToolCallInput[] = [];\n let currentToolInput: ToolCallInput | null = null;\n\n const transformStream = new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"text-delta\":\n if (firstChunk) {\n ttftMs = Date.now() - streamStart;\n firstChunk = false;\n }\n output += chunk.delta;\n break;\n case \"tool-input-start\":\n currentToolInput = {\n id: chunk.id,\n name: chunk.toolName,\n input: \"\",\n };\n break;\n case \"tool-input-delta\":\n if (currentToolInput && currentToolInput.id === chunk.id) {\n currentToolInput.input += chunk.delta;\n }\n break;\n case \"tool-input-end\":\n if (currentToolInput && currentToolInput.id === chunk.id) {\n toolCalls.push(currentToolInput);\n currentToolInput = null;\n }\n break;\n case \"finish\":\n inputTokens = chunk.usage.inputTokens.total ?? 0;\n outputTokens = chunk.usage.outputTokens.total ?? 0;\n break;\n }\n controller.enqueue(chunk);\n },\n flush() {\n for (const tc of toolCalls) {\n const span = createToolSpan(tracer, root, tc);\n if (root.isSpanMode) {\n pendingToolSpans.set(tc.id, span);\n } else {\n span.end({ status: \"completed\" });\n }\n }\n\n endRootHandle(\n root,\n { output, inputTokens, outputTokens, ttftMs },\n opts?.usage,\n );\n },\n });\n\n return {\n stream: stream.pipeThrough(transformStream),\n ...rest,\n };\n } catch (error) {\n cleanupOnError(root, error, pendingToolSpans);\n throw error;\n }\n },\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-B9WXHjpz.cjs","names":[],"sources":["../src/utils.ts","../src/client.ts"],"sourcesContent":["const CHARS = \"0123456789abcdefghjkmnpqrstvwxyz\";\n\nexport function ulid(): string {\n const ts = Date.now().toString(36);\n let rand = \"\";\n for (let i = 0; i < 16; i++) {\n rand += CHARS[Math.floor(Math.random() * CHARS.length)];\n }\n return ts + rand;\n}\n\nexport function nowISO(): string {\n return new Date().toISOString();\n}\n","import type {\n AuixPrismConfig,\n TraceEndOptions,\n TraceEvent,\n TraceOptions,\n TraceResult,\n} from \"./types\";\nimport { nowISO, ulid } from \"./utils\";\n\nconst FLUSH_INTERVAL_MS = 1000;\nconst FLUSH_BATCH_SIZE = 10;\n\nexport class AuixPrism {\n private apiKey: string;\n private baseUrl: string;\n private project?: string;\n private sessionId?: string;\n private transport?: (events: TraceEvent[]) => Promise<void>;\n private onFlushError?: (error: unknown) => void;\n private events: TraceEvent[] = [];\n private timer: ReturnType<typeof setInterval>;\n private _flushChain: Promise<void> = Promise.resolve();\n\n constructor(config: AuixPrismConfig) {\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl ?? \"https://api.auix.dev\";\n this.project = config.project;\n this.sessionId = config.sessionId;\n this.transport = config.transport;\n this.onFlushError = config.onFlushError;\n this.timer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);\n }\n\n enqueue(event: TraceEvent): void {\n this.events.push(event);\n if (this.events.length >= FLUSH_BATCH_SIZE) {\n this.flush();\n }\n }\n\n flush(): Promise<void> {\n if (this.events.length === 0) return this._flushChain;\n\n const batch = this.events.splice(0);\n const send = () => {\n if (this.transport) return this.transport(batch);\n return fetch(`${this.baseUrl}/v1/prism/ingest`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({ events: batch }),\n }).then(() => {});\n };\n\n this._flushChain = this._flushChain.then(() =>\n send().catch(() =>\n send().catch((err) => {\n console.warn(\"[@auix/prism] flush failed after retry\", err);\n this.onFlushError?.(err);\n }),\n ),\n );\n return this._flushChain;\n }\n\n startTrace(opts: {\n name?: string;\n input?: unknown;\n model?: string;\n provider?: string;\n endUserId?: string;\n metadata?: Record<string, unknown>;\n tags?: string[];\n }): TraceHandle {\n const traceId = ulid();\n const startedAt = nowISO();\n\n this.enqueue({\n type: \"trace.start\",\n traceId,\n name: opts.name,\n input: opts.input,\n model: opts.model,\n provider: opts.provider,\n endUserId: opts.endUserId,\n metadata: opts.metadata,\n tags: opts.tags,\n project: this.project,\n sessionId: this.sessionId,\n startedAt,\n });\n\n return new TraceHandle(this, traceId, startedAt);\n }\n\n startSpanOnTrace(\n traceId: string,\n opts: {\n name: string;\n type: \"llm\" | \"tool\" | \"retrieval\" | \"custom\";\n input?: unknown;\n model?: string;\n provider?: string;\n parentSpanId?: string;\n metadata?: Record<string, unknown>;\n },\n ): SpanHandle {\n const spanId = ulid();\n const startedAt = nowISO();\n\n this.enqueue({\n type: \"span.start\",\n traceId,\n spanId,\n parentSpanId: opts.parentSpanId,\n name: opts.name,\n spanType: opts.type,\n input: opts.input,\n model: opts.model,\n provider: opts.provider,\n metadata: opts.metadata,\n startedAt,\n });\n\n return new SpanHandle(this, traceId, spanId, startedAt);\n }\n\n trace(opts: TraceOptions): TraceResult {\n const traceHandle = this.startTrace(opts);\n const finish = async (endOpts?: TraceEndOptions) => {\n traceHandle.end(endOpts);\n await this.destroy();\n };\n return { trace: traceHandle, finish };\n }\n\n destroy(): Promise<void> {\n clearInterval(this.timer);\n return this.flush();\n }\n}\n\nexport class TraceHandle {\n constructor(\n private tracer: AuixPrism,\n readonly traceId: string,\n private startedAt: string,\n ) {}\n\n startSpan(opts: {\n name: string;\n type: \"llm\" | \"tool\" | \"retrieval\" | \"custom\";\n input?: unknown;\n model?: string;\n }): SpanHandle {\n const spanId = ulid();\n const startedAt = nowISO();\n\n this.tracer.enqueue({\n type: \"span.start\",\n traceId: this.traceId,\n spanId,\n name: opts.name,\n spanType: opts.type,\n input: opts.input,\n model: opts.model,\n startedAt,\n });\n\n return new SpanHandle(this.tracer, this.traceId, spanId, startedAt);\n }\n\n end(opts?: {\n output?: unknown;\n status?: \"completed\" | \"error\";\n error?: string;\n totalTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n ttftMs?: number;\n }): void {\n const endedAt = nowISO();\n const latencyMs =\n new Date(endedAt).getTime() - new Date(this.startedAt).getTime();\n\n this.tracer.enqueue({\n type: \"trace.end\",\n traceId: this.traceId,\n output: opts?.output,\n status: opts?.status ?? \"completed\",\n error: opts?.error,\n totalTokens: opts?.totalTokens,\n promptTokens: opts?.promptTokens,\n completionTokens: opts?.completionTokens,\n ttftMs: opts?.ttftMs,\n latencyMs,\n endedAt,\n });\n }\n}\n\nexport class SpanHandle {\n constructor(\n private tracer: AuixPrism,\n private traceId: string,\n readonly spanId: string,\n private startedAt: string,\n ) {}\n\n end(opts?: {\n output?: unknown;\n status?: \"completed\" | \"error\";\n error?: string;\n totalTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n ttftMs?: number;\n }): void {\n const endedAt = nowISO();\n const latencyMs =\n new Date(endedAt).getTime() - new Date(this.startedAt).getTime();\n\n this.tracer.enqueue({\n type: \"span.end\",\n traceId: this.traceId,\n spanId: this.spanId,\n output: opts?.output,\n status: opts?.status ?? \"completed\",\n error: opts?.error,\n totalTokens: opts?.totalTokens,\n promptTokens: opts?.promptTokens,\n completionTokens: opts?.completionTokens,\n ttftMs: opts?.ttftMs,\n latencyMs,\n endedAt,\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-BSsSpkZY.d.cts","names":[],"sources":["../src/types.ts","../src/client.ts"],"mappings":";UAAiB,eAAA;EACf,MAAA;EACA,OAAA;EACA,OAAA;EACA,SAAA;EAHA;EAKA,SAAA,IAAa,MAAA,EAAQ,UAAA,OAAiB,OAAA;EAHtC;EAKA,YAAA,IAAgB,KAAA;AAAA;AAAA,UAGD,YAAA;EACf,IAAA;EACA,KAAA;EACA,QAAA;EACA,SAAA;EACA,IAAA;EACA,QAAA,GAAW,MAAA;AAAA;AAAA,UAGI,WAAA;EACf,KAAA,EAD0B,WAAA;EAE1B,MAAA,GAAS,IAAA,GAAO,eAAA,KAAoB,OAAA;AAAA;AAAA,UAGrB,eAAA;EACf,MAAA;EACA,MAAA;EACA,WAAA;EACA,YAAA;EACA,gBAAA;AAAA;AAAA,KAGU,UAAA;EAEN,IAAA;EACA,OAAA;EACA,IAAA;EACA,KAAA;EACA,KAAA;EACA,QAAA;EACA,SAAA;EACA,QAAA,GAAW,MAAA;EACX,IAAA;EACA,OAAA;EACA,SAAA;EACA,SAAA;AAAA;EAGA,IAAA;EACA,OAAA;EACA,MAAA;EACA,MAAA;EACA,KAAA;EACA,WAAA;EACA,YAAA;EACA,gBAAA;EACA,MAAA;EACA,SAAA;EACA,OAAA;AAAA;EAGA,IAAA;EACA,OAAA;EACA,MAAA;EACA,YAAA;EACA,IAAA;EACA,QAAA;EACA,KAAA;EACA,KAAA;EACA,QAAA;EACA,QAAA,GAAW,MAAA;EACX,SAAA;AAAA;EAGA,IAAA;EACA,OAAA;EACA,MAAA;EACA,MAAA;EACA,MAAA;EACA,KAAA;EACA,WAAA;EACA,YAAA;EACA,gBAAA;EACA,MAAA;EACA,SAAA;EACA,OAAA;AAAA;;;cC1EO,SAAA;EAAA,QACH,MAAA;EAAA,QACA,OAAA;EAAA,QACA,OAAA;EAAA,QACA,SAAA;EAAA,QACA,SAAA;EAAA,QACA,YAAA;EAAA,QACA,MAAA;EAAA,QACA,KAAA;EAAA,QACA,WAAA;cAEI,MAAA,EAAQ,eAAA;EAUpB,OAAA,CAAQ,KAAA,EAAO,UAAA;EAOf,KAAA,CAAA,GAAS,OAAA;EA2BT,UAAA,CAAW,IAAA;IACT,IAAA;IACA,KAAA;IACA,KAAA;IACA,QAAA;IACA,SAAA;IACA,QAAA,GAAW,MAAA;IACX,IAAA;EAAA,IACE,WAAA;EAsBJ,gBAAA,CACE,OAAA,UACA,IAAA;IACE,IAAA;IACA,IAAA;IACA,KAAA;IACA,KAAA;IACA,QAAA;IACA,YAAA;IACA,QAAA,GAAW,MAAA;EAAA,IAEZ,UAAA;EAqBH,KAAA,CAAM,IAAA,EAAM,YAAA,GAAe,WAAA;EAS3B,OAAA,CAAA,GAAW,OAAA;AAAA;AAAA,cAMA,WAAA;EAAA,QAED,MAAA;EAAA,SACC,OAAA;EAAA,QACD,SAAA;cAFA,MAAA,EAAQ,SAAA,EACP,OAAA,UACD,SAAA;EAGV,SAAA,CAAU,IAAA;IACR,IAAA;IACA,IAAA;IACA,KAAA;IACA,KAAA;EAAA,IACE,UAAA;EAkBJ,GAAA,CAAI,IAAA;IACF,MAAA;IACA,MAAA;IACA,KAAA;IACA,WAAA;IACA,YAAA;IACA,gBAAA;IACA,MAAA;EAAA;AAAA;AAAA,cAsBS,UAAA;EAAA,QAED,MAAA;EAAA,QACA,OAAA;EAAA,SACC,MAAA;EAAA,QACD,SAAA;cAHA,MAAA,EAAQ,SAAA,EACR,OAAA,UACC,MAAA,UACD,SAAA;EAGV,GAAA,CAAI,IAAA;IACF,MAAA;IACA,MAAA;IACA,KAAA;IACA,WAAA;IACA,YAAA;IACA,gBAAA;IACA,MAAA;EAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-BrZstMQX.d.ts","names":[],"sources":["../src/types.ts","../src/client.ts"],"mappings":";UAAiB,eAAA;EACf,MAAA;EACA,OAAA;EACA,OAAA;EACA,SAAA;EAHA;EAKA,SAAA,IAAa,MAAA,EAAQ,UAAA,OAAiB,OAAA;EAHtC;EAKA,YAAA,IAAgB,KAAA;AAAA;AAAA,UAGD,YAAA;EACf,IAAA;EACA,KAAA;EACA,QAAA;EACA,SAAA;EACA,IAAA;EACA,QAAA,GAAW,MAAA;AAAA;AAAA,UAGI,WAAA;EACf,KAAA,EAD0B,WAAA;EAE1B,MAAA,GAAS,IAAA,GAAO,eAAA,KAAoB,OAAA;AAAA;AAAA,UAGrB,eAAA;EACf,MAAA;EACA,MAAA;EACA,WAAA;EACA,YAAA;EACA,gBAAA;AAAA;AAAA,KAGU,UAAA;EAEN,IAAA;EACA,OAAA;EACA,IAAA;EACA,KAAA;EACA,KAAA;EACA,QAAA;EACA,SAAA;EACA,QAAA,GAAW,MAAA;EACX,IAAA;EACA,OAAA;EACA,SAAA;EACA,SAAA;AAAA;EAGA,IAAA;EACA,OAAA;EACA,MAAA;EACA,MAAA;EACA,KAAA;EACA,WAAA;EACA,YAAA;EACA,gBAAA;EACA,MAAA;EACA,SAAA;EACA,OAAA;AAAA;EAGA,IAAA;EACA,OAAA;EACA,MAAA;EACA,YAAA;EACA,IAAA;EACA,QAAA;EACA,KAAA;EACA,KAAA;EACA,QAAA;EACA,QAAA,GAAW,MAAA;EACX,SAAA;AAAA;EAGA,IAAA;EACA,OAAA;EACA,MAAA;EACA,MAAA;EACA,MAAA;EACA,KAAA;EACA,WAAA;EACA,YAAA;EACA,gBAAA;EACA,MAAA;EACA,SAAA;EACA,OAAA;AAAA;;;cC1EO,SAAA;EAAA,QACH,MAAA;EAAA,QACA,OAAA;EAAA,QACA,OAAA;EAAA,QACA,SAAA;EAAA,QACA,SAAA;EAAA,QACA,YAAA;EAAA,QACA,MAAA;EAAA,QACA,KAAA;EAAA,QACA,WAAA;cAEI,MAAA,EAAQ,eAAA;EAUpB,OAAA,CAAQ,KAAA,EAAO,UAAA;EAOf,KAAA,CAAA,GAAS,OAAA;EA2BT,UAAA,CAAW,IAAA;IACT,IAAA;IACA,KAAA;IACA,KAAA;IACA,QAAA;IACA,SAAA;IACA,QAAA,GAAW,MAAA;IACX,IAAA;EAAA,IACE,WAAA;EAsBJ,gBAAA,CACE,OAAA,UACA,IAAA;IACE,IAAA;IACA,IAAA;IACA,KAAA;IACA,KAAA;IACA,QAAA;IACA,YAAA;IACA,QAAA,GAAW,MAAA;EAAA,IAEZ,UAAA;EAqBH,KAAA,CAAM,IAAA,EAAM,YAAA,GAAe,WAAA;EAS3B,OAAA,CAAA,GAAW,OAAA;AAAA;AAAA,cAMA,WAAA;EAAA,QAED,MAAA;EAAA,SACC,OAAA;EAAA,QACD,SAAA;cAFA,MAAA,EAAQ,SAAA,EACP,OAAA,UACD,SAAA;EAGV,SAAA,CAAU,IAAA;IACR,IAAA;IACA,IAAA;IACA,KAAA;IACA,KAAA;EAAA,IACE,UAAA;EAkBJ,GAAA,CAAI,IAAA;IACF,MAAA;IACA,MAAA;IACA,KAAA;IACA,WAAA;IACA,YAAA;IACA,gBAAA;IACA,MAAA;EAAA;AAAA;AAAA,cAsBS,UAAA;EAAA,QAED,MAAA;EAAA,QACA,OAAA;EAAA,SACC,MAAA;EAAA,QACD,SAAA;cAHA,MAAA,EAAQ,SAAA,EACR,OAAA,UACC,MAAA,UACD,SAAA;EAGV,GAAA,CAAI,IAAA;IACF,MAAA;IACA,MAAA;IACA,KAAA;IACA,WAAA;IACA,YAAA;IACA,gBAAA;IACA,MAAA;EAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-C7RiAn7a.js","names":[],"sources":["../src/utils.ts","../src/client.ts"],"sourcesContent":["const CHARS = \"0123456789abcdefghjkmnpqrstvwxyz\";\n\nexport function ulid(): string {\n const ts = Date.now().toString(36);\n let rand = \"\";\n for (let i = 0; i < 16; i++) {\n rand += CHARS[Math.floor(Math.random() * CHARS.length)];\n }\n return ts + rand;\n}\n\nexport function nowISO(): string {\n return new Date().toISOString();\n}\n","import type {\n AuixPrismConfig,\n TraceEndOptions,\n TraceEvent,\n TraceOptions,\n TraceResult,\n} from \"./types\";\nimport { nowISO, ulid } from \"./utils\";\n\nconst FLUSH_INTERVAL_MS = 1000;\nconst FLUSH_BATCH_SIZE = 10;\n\nexport class AuixPrism {\n private apiKey: string;\n private baseUrl: string;\n private project?: string;\n private sessionId?: string;\n private transport?: (events: TraceEvent[]) => Promise<void>;\n private onFlushError?: (error: unknown) => void;\n private events: TraceEvent[] = [];\n private timer: ReturnType<typeof setInterval>;\n private _flushChain: Promise<void> = Promise.resolve();\n\n constructor(config: AuixPrismConfig) {\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl ?? \"https://api.auix.dev\";\n this.project = config.project;\n this.sessionId = config.sessionId;\n this.transport = config.transport;\n this.onFlushError = config.onFlushError;\n this.timer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);\n }\n\n enqueue(event: TraceEvent): void {\n this.events.push(event);\n if (this.events.length >= FLUSH_BATCH_SIZE) {\n this.flush();\n }\n }\n\n flush(): Promise<void> {\n if (this.events.length === 0) return this._flushChain;\n\n const batch = this.events.splice(0);\n const send = () => {\n if (this.transport) return this.transport(batch);\n return fetch(`${this.baseUrl}/v1/prism/ingest`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({ events: batch }),\n }).then(() => {});\n };\n\n this._flushChain = this._flushChain.then(() =>\n send().catch(() =>\n send().catch((err) => {\n console.warn(\"[@auix/prism] flush failed after retry\", err);\n this.onFlushError?.(err);\n }),\n ),\n );\n return this._flushChain;\n }\n\n startTrace(opts: {\n name?: string;\n input?: unknown;\n model?: string;\n provider?: string;\n endUserId?: string;\n metadata?: Record<string, unknown>;\n tags?: string[];\n }): TraceHandle {\n const traceId = ulid();\n const startedAt = nowISO();\n\n this.enqueue({\n type: \"trace.start\",\n traceId,\n name: opts.name,\n input: opts.input,\n model: opts.model,\n provider: opts.provider,\n endUserId: opts.endUserId,\n metadata: opts.metadata,\n tags: opts.tags,\n project: this.project,\n sessionId: this.sessionId,\n startedAt,\n });\n\n return new TraceHandle(this, traceId, startedAt);\n }\n\n startSpanOnTrace(\n traceId: string,\n opts: {\n name: string;\n type: \"llm\" | \"tool\" | \"retrieval\" | \"custom\";\n input?: unknown;\n model?: string;\n provider?: string;\n parentSpanId?: string;\n metadata?: Record<string, unknown>;\n },\n ): SpanHandle {\n const spanId = ulid();\n const startedAt = nowISO();\n\n this.enqueue({\n type: \"span.start\",\n traceId,\n spanId,\n parentSpanId: opts.parentSpanId,\n name: opts.name,\n spanType: opts.type,\n input: opts.input,\n model: opts.model,\n provider: opts.provider,\n metadata: opts.metadata,\n startedAt,\n });\n\n return new SpanHandle(this, traceId, spanId, startedAt);\n }\n\n trace(opts: TraceOptions): TraceResult {\n const traceHandle = this.startTrace(opts);\n const finish = async (endOpts?: TraceEndOptions) => {\n traceHandle.end(endOpts);\n await this.destroy();\n };\n return { trace: traceHandle, finish };\n }\n\n destroy(): Promise<void> {\n clearInterval(this.timer);\n return this.flush();\n }\n}\n\nexport class TraceHandle {\n constructor(\n private tracer: AuixPrism,\n readonly traceId: string,\n private startedAt: string,\n ) {}\n\n startSpan(opts: {\n name: string;\n type: \"llm\" | \"tool\" | \"retrieval\" | \"custom\";\n input?: unknown;\n model?: string;\n }): SpanHandle {\n const spanId = ulid();\n const startedAt = nowISO();\n\n this.tracer.enqueue({\n type: \"span.start\",\n traceId: this.traceId,\n spanId,\n name: opts.name,\n spanType: opts.type,\n input: opts.input,\n model: opts.model,\n startedAt,\n });\n\n return new SpanHandle(this.tracer, this.traceId, spanId, startedAt);\n }\n\n end(opts?: {\n output?: unknown;\n status?: \"completed\" | \"error\";\n error?: string;\n totalTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n ttftMs?: number;\n }): void {\n const endedAt = nowISO();\n const latencyMs =\n new Date(endedAt).getTime() - new Date(this.startedAt).getTime();\n\n this.tracer.enqueue({\n type: \"trace.end\",\n traceId: this.traceId,\n output: opts?.output,\n status: opts?.status ?? \"completed\",\n error: opts?.error,\n totalTokens: opts?.totalTokens,\n promptTokens: opts?.promptTokens,\n completionTokens: opts?.completionTokens,\n ttftMs: opts?.ttftMs,\n latencyMs,\n endedAt,\n });\n }\n}\n\nexport class SpanHandle {\n constructor(\n private tracer: AuixPrism,\n private traceId: string,\n readonly spanId: string,\n private startedAt: string,\n ) {}\n\n end(opts?: {\n output?: unknown;\n status?: \"completed\" | \"error\";\n error?: string;\n totalTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n ttftMs?: number;\n }): void {\n const endedAt = nowISO();\n const latencyMs =\n new Date(endedAt).getTime() - new Date(this.startedAt).getTime();\n\n this.tracer.enqueue({\n type: \"span.end\",\n traceId: this.traceId,\n spanId: this.spanId,\n output: opts?.output,\n status: opts?.status ?? \"completed\",\n error: opts?.error,\n totalTokens: opts?.totalTokens,\n promptTokens: opts?.promptTokens,\n completionTokens: opts?.completionTokens,\n ttftMs: opts?.ttftMs,\n latencyMs,\n endedAt,\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wrapper-7jRyp54U.js","names":[],"sources":["../src/wrapper.ts"],"sourcesContent":["import type {\n LanguageModelV3,\n LanguageModelV3Middleware,\n LanguageModelV3Prompt,\n} from \"@ai-sdk/provider\";\nimport { wrapLanguageModel } from \"ai\";\nimport type { AuixPrism, SpanHandle, TraceHandle } from \"./client\";\nimport type { AISDKPrismOptions } from \"./integrations/ai-sdk\";\n\ntype MiddlewareOptions = AISDKPrismOptions & { parentTraceId?: string };\n\nexport function wrapModelWithMiddleware(\n tracer: AuixPrism,\n model: LanguageModelV3,\n opts?: MiddlewareOptions,\n): LanguageModelV3 {\n return wrapLanguageModel({\n model,\n middleware: createPrismMiddleware(tracer, opts),\n });\n}\n\ntype ContentPart = {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n input?: string;\n [key: string]: unknown;\n};\n\nfunction extractTextFromContent(content: ContentPart[]): string {\n return content\n .filter((c) => c.type === \"text\" && typeof c.text === \"string\")\n .map((c) => c.text)\n .join(\"\");\n}\n\nfunction truncateInput(\n prompt: LanguageModelV3Prompt,\n maxBytes = 32768,\n): unknown {\n let json = JSON.stringify(prompt);\n if (new TextEncoder().encode(json).length <= maxBytes) {\n return prompt;\n }\n\n const arr = [...prompt];\n while (arr.length > 1) {\n arr.shift();\n json = JSON.stringify(arr);\n if (new TextEncoder().encode(json).length <= maxBytes) {\n return arr;\n }\n }\n return arr;\n}\n\nfunction extractModelConfig(params: Record<string, unknown>) {\n const keys = [\n \"temperature\",\n \"maxOutputTokens\",\n \"topP\",\n \"topK\",\n \"frequencyPenalty\",\n \"presencePenalty\",\n \"stopSequences\",\n ] as const;\n\n const config: Record<string, unknown> = {};\n for (const key of keys) {\n if (params[key] !== undefined) {\n config[key] = params[key];\n }\n }\n return Object.keys(config).length > 0 ? config : undefined;\n}\n\nfunction extractToolOutput(output: unknown): unknown {\n if (output && typeof output === \"object\" && \"type\" in output) {\n const o = output as { type: string; value?: unknown; reason?: string };\n if (o.type === \"text\" || o.type === \"json\") return o.value;\n if (o.type === \"denied\") return `[denied] ${o.reason ?? \"\"}`;\n }\n return output;\n}\n\nfunction resolveToolResults(\n prompt: LanguageModelV3Prompt,\n pendingToolSpans: Map<string, SpanHandle>,\n): void {\n if (pendingToolSpans.size === 0) return;\n\n for (const msg of prompt) {\n if (msg.role !== \"tool\") continue;\n for (const part of msg.content) {\n if (part.type !== \"tool-result\") continue;\n const span = pendingToolSpans.get(part.toolCallId);\n if (span) {\n span.end({\n output: extractToolOutput(part.output),\n status: \"completed\",\n });\n pendingToolSpans.delete(part.toolCallId);\n }\n }\n }\n}\n\ntype RootHandle =\n | { isSpanMode: true; traceId: string; handle: SpanHandle }\n | { isSpanMode: false; traceId: string; handle: TraceHandle };\n\nfunction createRootHandle(\n tracer: AuixPrism,\n opts: MiddlewareOptions | undefined,\n modelId: string,\n provider: string,\n input: unknown,\n metadata: Record<string, unknown> | undefined,\n): RootHandle {\n const parentTraceId = opts?.parentTraceId;\n\n if (parentTraceId) {\n const handle = tracer.startSpanOnTrace(parentTraceId, {\n name: opts?.name ?? modelId,\n type: \"llm\",\n input,\n model: modelId,\n provider,\n metadata,\n });\n return { isSpanMode: true, traceId: parentTraceId, handle };\n }\n\n const handle = tracer.startTrace({\n name: opts?.name ?? modelId,\n model: modelId,\n provider,\n input,\n metadata,\n tags: opts?.tags,\n endUserId: opts?.endUserId,\n });\n return { isSpanMode: false, traceId: handle.traceId, handle };\n}\n\nfunction createToolSpan(\n tracer: AuixPrism,\n root: RootHandle,\n toolCall: { id: string; toolName: string; input: string },\n): SpanHandle {\n if (root.isSpanMode) {\n return tracer.startSpanOnTrace(root.traceId, {\n name: toolCall.toolName,\n type: \"tool\",\n input: toolCall.input,\n parentSpanId: root.handle.spanId,\n });\n }\n return root.handle.startSpan({\n name: toolCall.toolName,\n type: \"tool\",\n input: toolCall.input,\n });\n}\n\nfunction endRootHandle(\n root: RootHandle,\n result: {\n output: string;\n inputTokens: number;\n outputTokens: number;\n ttftMs?: number;\n },\n): void {\n root.handle.end({\n output: result.output,\n status: \"completed\",\n totalTokens: result.inputTokens + result.outputTokens,\n promptTokens: result.inputTokens,\n completionTokens: result.outputTokens,\n ttftMs: result.ttftMs,\n });\n}\n\nfunction cleanupOnError(\n root: RootHandle,\n pendingToolSpans: Map<string, SpanHandle>,\n error: unknown,\n): void {\n for (const span of pendingToolSpans.values()) {\n span.end({ status: \"error\" });\n }\n pendingToolSpans.clear();\n\n root.handle.end({\n status: \"error\",\n error: error instanceof Error ? error.message : String(error),\n });\n}\n\nfunction buildMetadata(\n opts: MiddlewareOptions | undefined,\n params: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const modelConfig = extractModelConfig(params);\n if (modelConfig) return { ...opts?.metadata, modelConfig };\n return opts?.metadata;\n}\n\nfunction createPrismMiddleware(\n tracer: AuixPrism,\n opts?: MiddlewareOptions,\n): LanguageModelV3Middleware {\n const pendingToolSpans = new Map<string, SpanHandle>();\n\n return {\n specificationVersion: \"v3\",\n\n wrapGenerate: async ({ doGenerate, params, model }) => {\n const input = truncateInput(params.prompt);\n const metadata = buildMetadata(opts, params);\n\n resolveToolResults(params.prompt, pendingToolSpans);\n\n const root = createRootHandle(\n tracer,\n opts,\n model.modelId,\n model.provider,\n input,\n metadata,\n );\n\n try {\n const result = await doGenerate();\n const content = result.content as ContentPart[];\n const output = extractTextFromContent(content);\n const inputTokens = result.usage.inputTokens.total ?? 0;\n const outputTokens = result.usage.outputTokens.total ?? 0;\n\n for (const part of content) {\n if (part.type === \"tool-call\" && part.toolCallId) {\n const span = createToolSpan(tracer, root, {\n id: part.toolCallId,\n toolName: part.toolName ?? \"tool\",\n input: part.input ?? \"\",\n });\n if (root.isSpanMode) {\n pendingToolSpans.set(part.toolCallId, span);\n } else {\n span.end({ status: \"completed\" });\n }\n }\n }\n\n endRootHandle(root, { output, inputTokens, outputTokens });\n return result;\n } catch (error) {\n cleanupOnError(root, pendingToolSpans, error);\n throw error;\n }\n },\n\n wrapStream: async ({ doStream, params, model }) => {\n const input = truncateInput(params.prompt);\n const metadata = buildMetadata(opts, params);\n\n resolveToolResults(params.prompt, pendingToolSpans);\n\n const root = createRootHandle(\n tracer,\n opts,\n model.modelId,\n model.provider,\n input,\n metadata,\n );\n\n try {\n const streamStart = Date.now();\n const { stream, ...rest } = await doStream();\n\n let output = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let ttftMs: number | undefined;\n let firstChunk = true;\n const toolCalls: Array<{\n id: string;\n toolName: string;\n input: string;\n }> = [];\n let currentToolInput: {\n id: string;\n toolName: string;\n input: string;\n } | null = null;\n\n const transformStream = new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"text-delta\":\n if (firstChunk) {\n ttftMs = Date.now() - streamStart;\n firstChunk = false;\n }\n output += chunk.delta;\n break;\n case \"tool-input-start\":\n currentToolInput = {\n id: chunk.id,\n toolName: chunk.toolName,\n input: \"\",\n };\n break;\n case \"tool-input-delta\":\n if (currentToolInput && currentToolInput.id === chunk.id) {\n currentToolInput.input += chunk.delta;\n }\n break;\n case \"tool-input-end\":\n if (currentToolInput && currentToolInput.id === chunk.id) {\n toolCalls.push(currentToolInput);\n currentToolInput = null;\n }\n break;\n case \"finish\":\n inputTokens = chunk.usage.inputTokens.total ?? 0;\n outputTokens = chunk.usage.outputTokens.total ?? 0;\n break;\n }\n controller.enqueue(chunk);\n },\n flush() {\n for (const tc of toolCalls) {\n const span = createToolSpan(tracer, root, tc);\n if (root.isSpanMode) {\n pendingToolSpans.set(tc.id, span);\n } else {\n span.end({ status: \"completed\" });\n }\n }\n\n endRootHandle(root, {\n output,\n inputTokens,\n outputTokens,\n ttftMs,\n });\n },\n });\n\n return {\n stream: stream.pipeThrough(transformStream),\n ...rest,\n };\n } catch (error) {\n cleanupOnError(root, pendingToolSpans, error);\n throw error;\n }\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wrapper-ByspXfxS.cjs","names":[],"sources":["../src/wrapper.ts"],"sourcesContent":["import type {\n LanguageModelV3,\n LanguageModelV3Middleware,\n LanguageModelV3Prompt,\n} from \"@ai-sdk/provider\";\nimport { wrapLanguageModel } from \"ai\";\nimport type { AuixPrism, SpanHandle, TraceHandle } from \"./client\";\nimport type { AISDKPrismOptions } from \"./integrations/ai-sdk\";\n\ntype MiddlewareOptions = AISDKPrismOptions & { parentTraceId?: string };\n\nexport function wrapModelWithMiddleware(\n tracer: AuixPrism,\n model: LanguageModelV3,\n opts?: MiddlewareOptions,\n): LanguageModelV3 {\n return wrapLanguageModel({\n model,\n middleware: createPrismMiddleware(tracer, opts),\n });\n}\n\ntype ContentPart = {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n input?: string;\n [key: string]: unknown;\n};\n\nfunction extractTextFromContent(content: ContentPart[]): string {\n return content\n .filter((c) => c.type === \"text\" && typeof c.text === \"string\")\n .map((c) => c.text)\n .join(\"\");\n}\n\nfunction truncateInput(\n prompt: LanguageModelV3Prompt,\n maxBytes = 32768,\n): unknown {\n let json = JSON.stringify(prompt);\n if (new TextEncoder().encode(json).length <= maxBytes) {\n return prompt;\n }\n\n const arr = [...prompt];\n while (arr.length > 1) {\n arr.shift();\n json = JSON.stringify(arr);\n if (new TextEncoder().encode(json).length <= maxBytes) {\n return arr;\n }\n }\n return arr;\n}\n\nfunction extractModelConfig(params: Record<string, unknown>) {\n const keys = [\n \"temperature\",\n \"maxOutputTokens\",\n \"topP\",\n \"topK\",\n \"frequencyPenalty\",\n \"presencePenalty\",\n \"stopSequences\",\n ] as const;\n\n const config: Record<string, unknown> = {};\n for (const key of keys) {\n if (params[key] !== undefined) {\n config[key] = params[key];\n }\n }\n return Object.keys(config).length > 0 ? config : undefined;\n}\n\nfunction extractToolOutput(output: unknown): unknown {\n if (output && typeof output === \"object\" && \"type\" in output) {\n const o = output as { type: string; value?: unknown; reason?: string };\n if (o.type === \"text\" || o.type === \"json\") return o.value;\n if (o.type === \"denied\") return `[denied] ${o.reason ?? \"\"}`;\n }\n return output;\n}\n\nfunction resolveToolResults(\n prompt: LanguageModelV3Prompt,\n pendingToolSpans: Map<string, SpanHandle>,\n): void {\n if (pendingToolSpans.size === 0) return;\n\n for (const msg of prompt) {\n if (msg.role !== \"tool\") continue;\n for (const part of msg.content) {\n if (part.type !== \"tool-result\") continue;\n const span = pendingToolSpans.get(part.toolCallId);\n if (span) {\n span.end({\n output: extractToolOutput(part.output),\n status: \"completed\",\n });\n pendingToolSpans.delete(part.toolCallId);\n }\n }\n }\n}\n\ntype RootHandle =\n | { isSpanMode: true; traceId: string; handle: SpanHandle }\n | { isSpanMode: false; traceId: string; handle: TraceHandle };\n\nfunction createRootHandle(\n tracer: AuixPrism,\n opts: MiddlewareOptions | undefined,\n modelId: string,\n provider: string,\n input: unknown,\n metadata: Record<string, unknown> | undefined,\n): RootHandle {\n const parentTraceId = opts?.parentTraceId;\n\n if (parentTraceId) {\n const handle = tracer.startSpanOnTrace(parentTraceId, {\n name: opts?.name ?? modelId,\n type: \"llm\",\n input,\n model: modelId,\n provider,\n metadata,\n });\n return { isSpanMode: true, traceId: parentTraceId, handle };\n }\n\n const handle = tracer.startTrace({\n name: opts?.name ?? modelId,\n model: modelId,\n provider,\n input,\n metadata,\n tags: opts?.tags,\n endUserId: opts?.endUserId,\n });\n return { isSpanMode: false, traceId: handle.traceId, handle };\n}\n\nfunction createToolSpan(\n tracer: AuixPrism,\n root: RootHandle,\n toolCall: { id: string; toolName: string; input: string },\n): SpanHandle {\n if (root.isSpanMode) {\n return tracer.startSpanOnTrace(root.traceId, {\n name: toolCall.toolName,\n type: \"tool\",\n input: toolCall.input,\n parentSpanId: root.handle.spanId,\n });\n }\n return root.handle.startSpan({\n name: toolCall.toolName,\n type: \"tool\",\n input: toolCall.input,\n });\n}\n\nfunction endRootHandle(\n root: RootHandle,\n result: {\n output: string;\n inputTokens: number;\n outputTokens: number;\n ttftMs?: number;\n },\n): void {\n root.handle.end({\n output: result.output,\n status: \"completed\",\n totalTokens: result.inputTokens + result.outputTokens,\n promptTokens: result.inputTokens,\n completionTokens: result.outputTokens,\n ttftMs: result.ttftMs,\n });\n}\n\nfunction cleanupOnError(\n root: RootHandle,\n pendingToolSpans: Map<string, SpanHandle>,\n error: unknown,\n): void {\n for (const span of pendingToolSpans.values()) {\n span.end({ status: \"error\" });\n }\n pendingToolSpans.clear();\n\n root.handle.end({\n status: \"error\",\n error: error instanceof Error ? error.message : String(error),\n });\n}\n\nfunction buildMetadata(\n opts: MiddlewareOptions | undefined,\n params: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const modelConfig = extractModelConfig(params);\n if (modelConfig) return { ...opts?.metadata, modelConfig };\n return opts?.metadata;\n}\n\nfunction createPrismMiddleware(\n tracer: AuixPrism,\n opts?: MiddlewareOptions,\n): LanguageModelV3Middleware {\n const pendingToolSpans = new Map<string, SpanHandle>();\n\n return {\n specificationVersion: \"v3\",\n\n wrapGenerate: async ({ doGenerate, params, model }) => {\n const input = truncateInput(params.prompt);\n const metadata = buildMetadata(opts, params);\n\n resolveToolResults(params.prompt, pendingToolSpans);\n\n const root = createRootHandle(\n tracer,\n opts,\n model.modelId,\n model.provider,\n input,\n metadata,\n );\n\n try {\n const result = await doGenerate();\n const content = result.content as ContentPart[];\n const output = extractTextFromContent(content);\n const inputTokens = result.usage.inputTokens.total ?? 0;\n const outputTokens = result.usage.outputTokens.total ?? 0;\n\n for (const part of content) {\n if (part.type === \"tool-call\" && part.toolCallId) {\n const span = createToolSpan(tracer, root, {\n id: part.toolCallId,\n toolName: part.toolName ?? \"tool\",\n input: part.input ?? \"\",\n });\n if (root.isSpanMode) {\n pendingToolSpans.set(part.toolCallId, span);\n } else {\n span.end({ status: \"completed\" });\n }\n }\n }\n\n endRootHandle(root, { output, inputTokens, outputTokens });\n return result;\n } catch (error) {\n cleanupOnError(root, pendingToolSpans, error);\n throw error;\n }\n },\n\n wrapStream: async ({ doStream, params, model }) => {\n const input = truncateInput(params.prompt);\n const metadata = buildMetadata(opts, params);\n\n resolveToolResults(params.prompt, pendingToolSpans);\n\n const root = createRootHandle(\n tracer,\n opts,\n model.modelId,\n model.provider,\n input,\n metadata,\n );\n\n try {\n const streamStart = Date.now();\n const { stream, ...rest } = await doStream();\n\n let output = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let ttftMs: number | undefined;\n let firstChunk = true;\n const toolCalls: Array<{\n id: string;\n toolName: string;\n input: string;\n }> = [];\n let currentToolInput: {\n id: string;\n toolName: string;\n input: string;\n } | null = null;\n\n const transformStream = new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"text-delta\":\n if (firstChunk) {\n ttftMs = Date.now() - streamStart;\n firstChunk = false;\n }\n output += chunk.delta;\n break;\n case \"tool-input-start\":\n currentToolInput = {\n id: chunk.id,\n toolName: chunk.toolName,\n input: \"\",\n };\n break;\n case \"tool-input-delta\":\n if (currentToolInput && currentToolInput.id === chunk.id) {\n currentToolInput.input += chunk.delta;\n }\n break;\n case \"tool-input-end\":\n if (currentToolInput && currentToolInput.id === chunk.id) {\n toolCalls.push(currentToolInput);\n currentToolInput = null;\n }\n break;\n case \"finish\":\n inputTokens = chunk.usage.inputTokens.total ?? 0;\n outputTokens = chunk.usage.outputTokens.total ?? 0;\n break;\n }\n controller.enqueue(chunk);\n },\n flush() {\n for (const tc of toolCalls) {\n const span = createToolSpan(tracer, root, tc);\n if (root.isSpanMode) {\n pendingToolSpans.set(tc.id, span);\n } else {\n span.end({ status: \"completed\" });\n }\n }\n\n endRootHandle(root, {\n output,\n inputTokens,\n outputTokens,\n ttftMs,\n });\n },\n });\n\n return {\n stream: stream.pipeThrough(transformStream),\n ...rest,\n };\n } catch (error) {\n cleanupOnError(root, pendingToolSpans, error);\n throw error;\n }\n },\n };\n}\n"],"mappings":"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"}
|