@sentrial/sdk 0.3.1 → 0.3.2

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/dist/index.js CHANGED
@@ -1108,17 +1108,6 @@ function wrapStreamText(originalFn, client, config) {
1108
1108
  const completionTokens = usage?.completionTokens || 0;
1109
1109
  const totalTokens = usage?.totalTokens || promptTokens + completionTokens;
1110
1110
  const cost = calculateCostForCall(provider, modelId, promptTokens, completionTokens);
1111
- await client.trackEvent({
1112
- sessionId: sid,
1113
- eventType: "llm_call",
1114
- eventData: {
1115
- model: modelId,
1116
- provider,
1117
- prompt_tokens: promptTokens,
1118
- completion_tokens: completionTokens,
1119
- total_tokens: totalTokens
1120
- }
1121
- });
1122
1111
  await client.completeSession({
1123
1112
  sessionId: sid,
1124
1113
  success: true,
@@ -1130,6 +1119,34 @@ function wrapStreamText(originalFn, client, config) {
1130
1119
  totalTokens
1131
1120
  });
1132
1121
  }
1122
+ const originalTextStream = result.textStream;
1123
+ let wrappedTextStream = null;
1124
+ const proxied = new Proxy(result, {
1125
+ get(target, prop, receiver) {
1126
+ if (prop === "textStream") {
1127
+ if (!wrappedTextStream) {
1128
+ let fullText = "";
1129
+ wrappedTextStream = (async function* () {
1130
+ try {
1131
+ for await (const chunk of originalTextStream) {
1132
+ fullText += chunk;
1133
+ yield chunk;
1134
+ }
1135
+ await trackCompletion(fullText);
1136
+ } catch (error) {
1137
+ await trackCompletion(
1138
+ fullText,
1139
+ error instanceof Error ? error : new Error(String(error))
1140
+ );
1141
+ throw error;
1142
+ }
1143
+ })();
1144
+ }
1145
+ return wrappedTextStream;
1146
+ }
1147
+ return Reflect.get(target, prop, receiver);
1148
+ }
1149
+ });
1133
1150
  const textProp = result.text;
1134
1151
  if (typeof textProp === "string") {
1135
1152
  trackCompletion(textProp).catch(() => {
@@ -1142,30 +1159,8 @@ function wrapStreamText(originalFn, client, config) {
1142
1159
  trackCompletion("", err instanceof Error ? err : new Error(String(err))).catch(() => {
1143
1160
  });
1144
1161
  });
1145
- } else {
1146
- const desc = Object.getOwnPropertyDescriptor(result, "textStream") ?? Object.getOwnPropertyDescriptor(Object.getPrototypeOf(result), "textStream");
1147
- const isWritable = !desc || desc.writable || desc.set;
1148
- if (isWritable) {
1149
- const originalTextStream = result.textStream;
1150
- let fullText = "";
1151
- result.textStream = (async function* () {
1152
- try {
1153
- for await (const chunk of originalTextStream) {
1154
- fullText += chunk;
1155
- yield chunk;
1156
- }
1157
- await trackCompletion(fullText);
1158
- } catch (error) {
1159
- await trackCompletion(
1160
- "",
1161
- error instanceof Error ? error : new Error(String(error))
1162
- );
1163
- throw error;
1164
- }
1165
- })();
1166
- }
1167
1162
  }
1168
- return result;
1163
+ return proxied;
1169
1164
  };
1170
1165
  }
1171
1166
  function wrapGenerateObject(originalFn, client, config) {
@@ -1252,46 +1247,64 @@ function wrapStreamObject(originalFn, client, config) {
1252
1247
  }
1253
1248
  })();
1254
1249
  const result = originalFn(params);
1255
- const objectProp = result.object;
1256
- if (objectProp && typeof objectProp.then === "function") {
1257
- objectProp.then(async (obj) => {
1258
- const durationMs = Date.now() - startTime;
1259
- const sid = await sessionPromise;
1260
- if (!sid) return;
1261
- let usage;
1262
- try {
1263
- usage = result.usage ? await result.usage : void 0;
1264
- } catch {
1250
+ const originalObjectPromise = result.object;
1251
+ if (originalObjectPromise && typeof originalObjectPromise.then === "function") {
1252
+ let tracked = false;
1253
+ let wrappedObjectPromise = null;
1254
+ return new Proxy(result, {
1255
+ get(target, prop, receiver) {
1256
+ if (prop === "object") {
1257
+ if (!wrappedObjectPromise) {
1258
+ wrappedObjectPromise = originalObjectPromise.then(async (obj) => {
1259
+ if (tracked) return obj;
1260
+ tracked = true;
1261
+ const durationMs = Date.now() - startTime;
1262
+ const sid = await sessionPromise;
1263
+ if (!sid) return obj;
1264
+ let usage;
1265
+ try {
1266
+ usage = result.usage ? await result.usage : void 0;
1267
+ } catch {
1268
+ }
1269
+ const promptTokens = usage?.promptTokens || 0;
1270
+ const completionTokens = usage?.completionTokens || 0;
1271
+ const totalTokens = usage?.totalTokens || promptTokens + completionTokens;
1272
+ const cost = calculateCostForCall(provider, modelId, promptTokens, completionTokens);
1273
+ await client.completeSession({
1274
+ sessionId: sid,
1275
+ success: true,
1276
+ output: JSON.stringify(obj),
1277
+ durationMs,
1278
+ estimatedCost: cost,
1279
+ promptTokens,
1280
+ completionTokens,
1281
+ totalTokens
1282
+ });
1283
+ return obj;
1284
+ }).catch(async (error) => {
1285
+ if (tracked) throw error;
1286
+ tracked = true;
1287
+ const durationMs = Date.now() - startTime;
1288
+ const sid = await sessionPromise;
1289
+ if (!sid) throw error;
1290
+ await client.trackError({
1291
+ sessionId: sid,
1292
+ errorType: error instanceof Error ? error.name : "Error",
1293
+ errorMessage: error instanceof Error ? error.message : "Unknown error"
1294
+ });
1295
+ await client.completeSession({
1296
+ sessionId: sid,
1297
+ success: false,
1298
+ failureReason: error instanceof Error ? error.message : "Unknown error",
1299
+ durationMs
1300
+ });
1301
+ throw error;
1302
+ });
1303
+ }
1304
+ return wrappedObjectPromise;
1305
+ }
1306
+ return Reflect.get(target, prop, receiver);
1265
1307
  }
1266
- const promptTokens = usage?.promptTokens || 0;
1267
- const completionTokens = usage?.completionTokens || 0;
1268
- const totalTokens = usage?.totalTokens || promptTokens + completionTokens;
1269
- const cost = calculateCostForCall(provider, modelId, promptTokens, completionTokens);
1270
- await client.completeSession({
1271
- sessionId: sid,
1272
- success: true,
1273
- output: JSON.stringify(obj),
1274
- durationMs,
1275
- estimatedCost: cost,
1276
- promptTokens,
1277
- completionTokens,
1278
- totalTokens
1279
- });
1280
- }).catch(async (error) => {
1281
- const durationMs = Date.now() - startTime;
1282
- const sid = await sessionPromise;
1283
- if (!sid) return;
1284
- await client.trackError({
1285
- sessionId: sid,
1286
- errorType: error instanceof Error ? error.name : "Error",
1287
- errorMessage: error instanceof Error ? error.message : "Unknown error"
1288
- });
1289
- await client.completeSession({
1290
- sessionId: sid,
1291
- success: false,
1292
- failureReason: error instanceof Error ? error.message : "Unknown error",
1293
- durationMs
1294
- });
1295
1308
  });
1296
1309
  }
1297
1310
  return result;