@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.
Files changed (56) hide show
  1. package/README.md +8 -10
  2. package/dist/{client-BrZstMQX.d.ts → client-CTcnqw0Y.d.ts} +21 -16
  3. package/dist/client-CTcnqw0Y.d.ts.map +1 -0
  4. package/dist/{client-C7RiAn7a.js → client-CkxOaNy0.js} +56 -25
  5. package/dist/client-CkxOaNy0.js.map +1 -0
  6. package/dist/{client-B9WXHjpz.cjs → client-DWaiEqR5.cjs} +56 -25
  7. package/dist/client-DWaiEqR5.cjs.map +1 -0
  8. package/dist/{client-BSsSpkZY.d.cts → client-DgiofMcL.d.cts} +21 -16
  9. package/dist/client-DgiofMcL.d.cts.map +1 -0
  10. package/dist/core.cjs +1 -1
  11. package/dist/core.d.cts +1 -1
  12. package/dist/core.d.ts +1 -1
  13. package/dist/core.js +1 -1
  14. package/dist/index.cjs +1 -1
  15. package/dist/index.d.cts +1 -1
  16. package/dist/index.d.ts +1 -1
  17. package/dist/index.js +1 -1
  18. package/dist/integrations/ai-sdk.cjs +16 -3
  19. package/dist/integrations/ai-sdk.cjs.map +1 -1
  20. package/dist/integrations/ai-sdk.d.cts +1 -1
  21. package/dist/integrations/ai-sdk.d.cts.map +1 -1
  22. package/dist/integrations/ai-sdk.d.ts +1 -1
  23. package/dist/integrations/ai-sdk.d.ts.map +1 -1
  24. package/dist/integrations/ai-sdk.js +16 -3
  25. package/dist/integrations/ai-sdk.js.map +1 -1
  26. package/dist/integrations/anthropic.cjs +11 -84
  27. package/dist/integrations/anthropic.cjs.map +1 -1
  28. package/dist/integrations/anthropic.d.cts +1 -1
  29. package/dist/integrations/anthropic.d.cts.map +1 -1
  30. package/dist/integrations/anthropic.d.ts +1 -1
  31. package/dist/integrations/anthropic.d.ts.map +1 -1
  32. package/dist/integrations/anthropic.js +5 -77
  33. package/dist/integrations/anthropic.js.map +1 -1
  34. package/dist/integrations/openai.cjs +13 -82
  35. package/dist/integrations/openai.cjs.map +1 -1
  36. package/dist/integrations/openai.d.cts +1 -1
  37. package/dist/integrations/openai.d.cts.map +1 -1
  38. package/dist/integrations/openai.d.ts +1 -1
  39. package/dist/integrations/openai.d.ts.map +1 -1
  40. package/dist/integrations/openai.js +6 -74
  41. package/dist/integrations/openai.js.map +1 -1
  42. package/dist/shared-CcAuQvBc.js +85 -0
  43. package/dist/shared-CcAuQvBc.js.map +1 -0
  44. package/dist/shared-Do8YbTDV.cjs +115 -0
  45. package/dist/shared-Do8YbTDV.cjs.map +1 -0
  46. package/dist/{wrapper-ByspXfxS.cjs → wrapper-3UjPvXBN.cjs} +16 -86
  47. package/dist/wrapper-3UjPvXBN.cjs.map +1 -0
  48. package/dist/{wrapper-7jRyp54U.js → wrapper-Czc4CgC-.js} +8 -78
  49. package/dist/wrapper-Czc4CgC-.js.map +1 -0
  50. package/package.json +1 -1
  51. package/dist/client-B9WXHjpz.cjs.map +0 -1
  52. package/dist/client-BSsSpkZY.d.cts.map +0 -1
  53. package/dist/client-BrZstMQX.d.ts.map +0 -1
  54. package/dist/client-C7RiAn7a.js.map +0 -1
  55. package/dist/wrapper-7jRyp54U.js.map +0 -1
  56. 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
- toolName: part.toolName ?? "tool",
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, pendingToolSpans, error);
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
- toolName: chunk.toolName,
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, pendingToolSpans, error);
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-ByspXfxS.cjs.map
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
- toolName: part.toolName ?? "tool",
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, pendingToolSpans, error);
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
- toolName: chunk.toolName,
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, pendingToolSpans, error);
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-7jRyp54U.js.map
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@aui-x/prism",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "LLM tracing SDK for auix — AI SDK middleware + manual tracing",
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -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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"}