@voltagent/core 2.6.2 → 2.6.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/dist/index.d.mts CHANGED
@@ -9330,6 +9330,9 @@ declare class Agent {
9330
9330
  private getConversationBuffer;
9331
9331
  private getMemoryPersistQueue;
9332
9332
  private ensureStreamingResponseMessageId;
9333
+ private getOrCreateStepResponseMessageId;
9334
+ private getStepResponseMessageFingerprints;
9335
+ private normalizeStepResponseMessages;
9333
9336
  private flushPendingMessagesOnError;
9334
9337
  /**
9335
9338
  * Get contextual logger with parent tracking
@@ -15908,6 +15911,7 @@ declare class VoltAgent {
15908
15911
  private readonly ensureEnvironmentBinding;
15909
15912
  private readonly triggerRegistry;
15910
15913
  private readonly agentRefs;
15914
+ private lastServerlessRemoteConfig?;
15911
15915
  readonly ready: Promise<void>;
15912
15916
  initError?: unknown;
15913
15917
  degraded: boolean;
@@ -15916,6 +15920,8 @@ declare class VoltAgent {
15916
15920
  private ensureEnvironment;
15917
15921
  private autoConfigureVoltOpsClientFromEnv;
15918
15922
  private syncServerlessObservabilityRemote;
15923
+ private isSameServerlessRemoteConfig;
15924
+ private areHeaderRecordsEqual;
15919
15925
  /**
15920
15926
  * Setup graceful shutdown handlers
15921
15927
  */
package/dist/index.d.ts CHANGED
@@ -9330,6 +9330,9 @@ declare class Agent {
9330
9330
  private getConversationBuffer;
9331
9331
  private getMemoryPersistQueue;
9332
9332
  private ensureStreamingResponseMessageId;
9333
+ private getOrCreateStepResponseMessageId;
9334
+ private getStepResponseMessageFingerprints;
9335
+ private normalizeStepResponseMessages;
9333
9336
  private flushPendingMessagesOnError;
9334
9337
  /**
9335
9338
  * Get contextual logger with parent tracking
@@ -15908,6 +15911,7 @@ declare class VoltAgent {
15908
15911
  private readonly ensureEnvironmentBinding;
15909
15912
  private readonly triggerRegistry;
15910
15913
  private readonly agentRefs;
15914
+ private lastServerlessRemoteConfig?;
15911
15915
  readonly ready: Promise<void>;
15912
15916
  initError?: unknown;
15913
15917
  degraded: boolean;
@@ -15916,6 +15920,8 @@ declare class VoltAgent {
15916
15920
  private ensureEnvironment;
15917
15921
  private autoConfigureVoltOpsClientFromEnv;
15918
15922
  private syncServerlessObservabilityRemote;
15923
+ private isSameServerlessRemoteConfig;
15924
+ private areHeaderRecordsEqual;
15919
15925
  /**
15920
15926
  * Setup graceful shutdown handlers
15921
15927
  */
package/dist/index.js CHANGED
@@ -29966,6 +29966,7 @@ var STEP_PERSIST_COUNT_KEY = Symbol("persistedStepCount");
29966
29966
  var ABORT_LISTENER_ATTACHED_KEY = Symbol("abortListenerAttached");
29967
29967
  var MIDDLEWARE_RETRY_FEEDBACK_KEY = Symbol("middlewareRetryFeedback");
29968
29968
  var STREAM_RESPONSE_MESSAGE_ID_KEY = Symbol("streamResponseMessageId");
29969
+ var STEP_RESPONSE_MESSAGE_FINGERPRINTS_KEY = Symbol("stepResponseMessageFingerprints");
29969
29970
  var DEFAULT_FEEDBACK_KEY = "satisfaction";
29970
29971
  var DEFAULT_CONVERSATION_TITLE_PROMPT = [
29971
29972
  "You generate concise titles for new conversations.",
@@ -32416,6 +32417,7 @@ Metadata: ${(0, import_utils33.safeStringify)(metadata)}`;
32416
32417
  oc.systemContext.delete("conversationSteps");
32417
32418
  oc.systemContext.delete("bailedResult");
32418
32419
  oc.systemContext.delete(STREAM_RESPONSE_MESSAGE_ID_KEY);
32420
+ oc.systemContext.delete(STEP_RESPONSE_MESSAGE_FINGERPRINTS_KEY);
32419
32421
  oc.conversationSteps = [];
32420
32422
  oc.output = void 0;
32421
32423
  }
@@ -32440,20 +32442,56 @@ Metadata: ${(0, import_utils33.safeStringify)(metadata)}`;
32440
32442
  return queue;
32441
32443
  }
32442
32444
  async ensureStreamingResponseMessageId(oc, buffer) {
32443
- const existing = oc.systemContext.get(STREAM_RESPONSE_MESSAGE_ID_KEY);
32444
- if (typeof existing === "string" && existing.trim().length > 0) {
32445
- return existing;
32446
- }
32447
- const messageId = (0, import_ai7.generateId)();
32445
+ const messageId = this.getOrCreateStepResponseMessageId(oc);
32448
32446
  const placeholder = {
32449
32447
  id: messageId,
32450
32448
  role: "assistant",
32451
32449
  parts: []
32452
32450
  };
32453
32451
  buffer.ingestUIMessages([placeholder], false);
32452
+ return messageId;
32453
+ }
32454
+ getOrCreateStepResponseMessageId(oc) {
32455
+ const existing = oc.systemContext.get(STREAM_RESPONSE_MESSAGE_ID_KEY);
32456
+ if (typeof existing === "string" && existing.trim().length > 0) {
32457
+ return existing;
32458
+ }
32459
+ const messageId = (0, import_ai7.generateId)();
32454
32460
  oc.systemContext.set(STREAM_RESPONSE_MESSAGE_ID_KEY, messageId);
32455
32461
  return messageId;
32456
32462
  }
32463
+ getStepResponseMessageFingerprints(oc) {
32464
+ const existing = oc.systemContext.get(STEP_RESPONSE_MESSAGE_FINGERPRINTS_KEY);
32465
+ if (existing instanceof Set) {
32466
+ return existing;
32467
+ }
32468
+ const fingerprints = /* @__PURE__ */ new Set();
32469
+ oc.systemContext.set(STEP_RESPONSE_MESSAGE_FINGERPRINTS_KEY, fingerprints);
32470
+ return fingerprints;
32471
+ }
32472
+ normalizeStepResponseMessages(oc, responseMessages) {
32473
+ if (!responseMessages?.length) {
32474
+ return void 0;
32475
+ }
32476
+ const fallbackAssistantMessageId = this.getOrCreateStepResponseMessageId(oc);
32477
+ const fingerprints = this.getStepResponseMessageFingerprints(oc);
32478
+ const normalized = [];
32479
+ for (const responseMessage of responseMessages) {
32480
+ const normalizedMessage = responseMessage.role === "assistant" ? { ...responseMessage, id: fallbackAssistantMessageId } : responseMessage;
32481
+ const fingerprintMessageId = normalizedMessage.role === "assistant" ? fallbackAssistantMessageId : normalizedMessage.id ?? null;
32482
+ const fingerprint = (0, import_utils33.safeStringify)({
32483
+ role: normalizedMessage.role,
32484
+ id: fingerprintMessageId,
32485
+ content: normalizedMessage.content
32486
+ });
32487
+ if (fingerprints.has(fingerprint)) {
32488
+ continue;
32489
+ }
32490
+ fingerprints.add(fingerprint);
32491
+ normalized.push(normalizedMessage);
32492
+ }
32493
+ return normalized.length > 0 ? normalized : void 0;
32494
+ }
32457
32495
  async flushPendingMessagesOnError(oc) {
32458
32496
  const buffer = this.getConversationBuffer(oc);
32459
32497
  const queue = this.getMemoryPersistQueue(oc);
@@ -34618,7 +34656,10 @@ ${retrieverContext}`;
34618
34656
  const conversationPersistence = this.getConversationPersistenceOptionsForContext(oc);
34619
34657
  return async (event) => {
34620
34658
  const { shouldFlushForToolCompletion, bailedResult } = this.processStepContent(oc, event);
34621
- const responseMessages = filterResponseMessages(event.response?.messages);
34659
+ const responseMessages = this.normalizeStepResponseMessages(
34660
+ oc,
34661
+ filterResponseMessages(event.response?.messages)
34662
+ );
34622
34663
  const hasResponseMessages = Boolean(responseMessages && responseMessages.length > 0);
34623
34664
  if (hasResponseMessages && responseMessages) {
34624
34665
  buffer.addModelMessages(responseMessages, "response");
@@ -41148,6 +41189,7 @@ var VoltAgent = class {
41148
41189
  ensureEnvironmentBinding;
41149
41190
  triggerRegistry;
41150
41191
  agentRefs;
41192
+ lastServerlessRemoteConfig;
41151
41193
  ready;
41152
41194
  initError;
41153
41195
  degraded = false;
@@ -41366,17 +41408,53 @@ var VoltAgent = class {
41366
41408
  }
41367
41409
  const baseUrl = voltOpsClient.getApiUrl().replace(/\/$/, "");
41368
41410
  const headers = voltOpsClient.getAuthHeaders();
41411
+ const nextConfig = {
41412
+ tracesUrl: `${baseUrl}/api/public/otel/v1/traces`,
41413
+ logsUrl: `${baseUrl}/api/public/otel/v1/logs`,
41414
+ headers
41415
+ };
41416
+ if (this.isSameServerlessRemoteConfig(nextConfig)) {
41417
+ return;
41418
+ }
41419
+ this.lastServerlessRemoteConfig = {
41420
+ tracesUrl: nextConfig.tracesUrl,
41421
+ logsUrl: nextConfig.logsUrl,
41422
+ headers: { ...nextConfig.headers }
41423
+ };
41369
41424
  this.observability.updateServerlessRemote({
41370
41425
  traces: {
41371
- url: `${baseUrl}/api/public/otel/v1/traces`,
41372
- headers
41426
+ url: nextConfig.tracesUrl,
41427
+ headers: nextConfig.headers
41373
41428
  },
41374
41429
  logs: {
41375
- url: `${baseUrl}/api/public/otel/v1/logs`,
41376
- headers
41430
+ url: nextConfig.logsUrl,
41431
+ headers: nextConfig.headers
41377
41432
  }
41378
41433
  });
41379
41434
  }
41435
+ isSameServerlessRemoteConfig(nextConfig) {
41436
+ const previous = this.lastServerlessRemoteConfig;
41437
+ if (!previous) {
41438
+ return false;
41439
+ }
41440
+ if (previous.tracesUrl !== nextConfig.tracesUrl || previous.logsUrl !== nextConfig.logsUrl) {
41441
+ return false;
41442
+ }
41443
+ return this.areHeaderRecordsEqual(previous.headers, nextConfig.headers);
41444
+ }
41445
+ areHeaderRecordsEqual(left, right) {
41446
+ const leftKeys = Object.keys(left);
41447
+ const rightKeys = Object.keys(right);
41448
+ if (leftKeys.length !== rightKeys.length) {
41449
+ return false;
41450
+ }
41451
+ for (const key of leftKeys) {
41452
+ if (left[key] !== right[key]) {
41453
+ return false;
41454
+ }
41455
+ }
41456
+ return true;
41457
+ }
41380
41458
  /**
41381
41459
  * Setup graceful shutdown handlers
41382
41460
  */