@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.cjs CHANGED
@@ -1178,17 +1178,6 @@ function wrapStreamText(originalFn, client, config) {
1178
1178
  const completionTokens = usage?.completionTokens || 0;
1179
1179
  const totalTokens = usage?.totalTokens || promptTokens + completionTokens;
1180
1180
  const cost = calculateCostForCall(provider, modelId, promptTokens, completionTokens);
1181
- await client.trackEvent({
1182
- sessionId: sid,
1183
- eventType: "llm_call",
1184
- eventData: {
1185
- model: modelId,
1186
- provider,
1187
- prompt_tokens: promptTokens,
1188
- completion_tokens: completionTokens,
1189
- total_tokens: totalTokens
1190
- }
1191
- });
1192
1181
  await client.completeSession({
1193
1182
  sessionId: sid,
1194
1183
  success: true,
@@ -1200,6 +1189,34 @@ function wrapStreamText(originalFn, client, config) {
1200
1189
  totalTokens
1201
1190
  });
1202
1191
  }
1192
+ const originalTextStream = result.textStream;
1193
+ let wrappedTextStream = null;
1194
+ const proxied = new Proxy(result, {
1195
+ get(target, prop, receiver) {
1196
+ if (prop === "textStream") {
1197
+ if (!wrappedTextStream) {
1198
+ let fullText = "";
1199
+ wrappedTextStream = (async function* () {
1200
+ try {
1201
+ for await (const chunk of originalTextStream) {
1202
+ fullText += chunk;
1203
+ yield chunk;
1204
+ }
1205
+ await trackCompletion(fullText);
1206
+ } catch (error) {
1207
+ await trackCompletion(
1208
+ fullText,
1209
+ error instanceof Error ? error : new Error(String(error))
1210
+ );
1211
+ throw error;
1212
+ }
1213
+ })();
1214
+ }
1215
+ return wrappedTextStream;
1216
+ }
1217
+ return Reflect.get(target, prop, receiver);
1218
+ }
1219
+ });
1203
1220
  const textProp = result.text;
1204
1221
  if (typeof textProp === "string") {
1205
1222
  trackCompletion(textProp).catch(() => {
@@ -1212,30 +1229,8 @@ function wrapStreamText(originalFn, client, config) {
1212
1229
  trackCompletion("", err instanceof Error ? err : new Error(String(err))).catch(() => {
1213
1230
  });
1214
1231
  });
1215
- } else {
1216
- const desc = Object.getOwnPropertyDescriptor(result, "textStream") ?? Object.getOwnPropertyDescriptor(Object.getPrototypeOf(result), "textStream");
1217
- const isWritable = !desc || desc.writable || desc.set;
1218
- if (isWritable) {
1219
- const originalTextStream = result.textStream;
1220
- let fullText = "";
1221
- result.textStream = (async function* () {
1222
- try {
1223
- for await (const chunk of originalTextStream) {
1224
- fullText += chunk;
1225
- yield chunk;
1226
- }
1227
- await trackCompletion(fullText);
1228
- } catch (error) {
1229
- await trackCompletion(
1230
- "",
1231
- error instanceof Error ? error : new Error(String(error))
1232
- );
1233
- throw error;
1234
- }
1235
- })();
1236
- }
1237
1232
  }
1238
- return result;
1233
+ return proxied;
1239
1234
  };
1240
1235
  }
1241
1236
  function wrapGenerateObject(originalFn, client, config) {
@@ -1322,46 +1317,64 @@ function wrapStreamObject(originalFn, client, config) {
1322
1317
  }
1323
1318
  })();
1324
1319
  const result = originalFn(params);
1325
- const objectProp = result.object;
1326
- if (objectProp && typeof objectProp.then === "function") {
1327
- objectProp.then(async (obj) => {
1328
- const durationMs = Date.now() - startTime;
1329
- const sid = await sessionPromise;
1330
- if (!sid) return;
1331
- let usage;
1332
- try {
1333
- usage = result.usage ? await result.usage : void 0;
1334
- } catch {
1320
+ const originalObjectPromise = result.object;
1321
+ if (originalObjectPromise && typeof originalObjectPromise.then === "function") {
1322
+ let tracked = false;
1323
+ let wrappedObjectPromise = null;
1324
+ return new Proxy(result, {
1325
+ get(target, prop, receiver) {
1326
+ if (prop === "object") {
1327
+ if (!wrappedObjectPromise) {
1328
+ wrappedObjectPromise = originalObjectPromise.then(async (obj) => {
1329
+ if (tracked) return obj;
1330
+ tracked = true;
1331
+ const durationMs = Date.now() - startTime;
1332
+ const sid = await sessionPromise;
1333
+ if (!sid) return obj;
1334
+ let usage;
1335
+ try {
1336
+ usage = result.usage ? await result.usage : void 0;
1337
+ } catch {
1338
+ }
1339
+ const promptTokens = usage?.promptTokens || 0;
1340
+ const completionTokens = usage?.completionTokens || 0;
1341
+ const totalTokens = usage?.totalTokens || promptTokens + completionTokens;
1342
+ const cost = calculateCostForCall(provider, modelId, promptTokens, completionTokens);
1343
+ await client.completeSession({
1344
+ sessionId: sid,
1345
+ success: true,
1346
+ output: JSON.stringify(obj),
1347
+ durationMs,
1348
+ estimatedCost: cost,
1349
+ promptTokens,
1350
+ completionTokens,
1351
+ totalTokens
1352
+ });
1353
+ return obj;
1354
+ }).catch(async (error) => {
1355
+ if (tracked) throw error;
1356
+ tracked = true;
1357
+ const durationMs = Date.now() - startTime;
1358
+ const sid = await sessionPromise;
1359
+ if (!sid) throw error;
1360
+ await client.trackError({
1361
+ sessionId: sid,
1362
+ errorType: error instanceof Error ? error.name : "Error",
1363
+ errorMessage: error instanceof Error ? error.message : "Unknown error"
1364
+ });
1365
+ await client.completeSession({
1366
+ sessionId: sid,
1367
+ success: false,
1368
+ failureReason: error instanceof Error ? error.message : "Unknown error",
1369
+ durationMs
1370
+ });
1371
+ throw error;
1372
+ });
1373
+ }
1374
+ return wrappedObjectPromise;
1375
+ }
1376
+ return Reflect.get(target, prop, receiver);
1335
1377
  }
1336
- const promptTokens = usage?.promptTokens || 0;
1337
- const completionTokens = usage?.completionTokens || 0;
1338
- const totalTokens = usage?.totalTokens || promptTokens + completionTokens;
1339
- const cost = calculateCostForCall(provider, modelId, promptTokens, completionTokens);
1340
- await client.completeSession({
1341
- sessionId: sid,
1342
- success: true,
1343
- output: JSON.stringify(obj),
1344
- durationMs,
1345
- estimatedCost: cost,
1346
- promptTokens,
1347
- completionTokens,
1348
- totalTokens
1349
- });
1350
- }).catch(async (error) => {
1351
- const durationMs = Date.now() - startTime;
1352
- const sid = await sessionPromise;
1353
- if (!sid) return;
1354
- await client.trackError({
1355
- sessionId: sid,
1356
- errorType: error instanceof Error ? error.name : "Error",
1357
- errorMessage: error instanceof Error ? error.message : "Unknown error"
1358
- });
1359
- await client.completeSession({
1360
- sessionId: sid,
1361
- success: false,
1362
- failureReason: error instanceof Error ? error.message : "Unknown error",
1363
- durationMs
1364
- });
1365
1378
  });
1366
1379
  }
1367
1380
  return result;