UNPKG

eve

Version:

Filesystem-first framework for durable backend AI agents that run anywhere.

1 lines 3.76 kB
import{normalizeChannelAudience}from"#shared/channel-audience.js";import{contextStorage}from"#context/container.js";import{SessionTraceSeedKey}from"#context/keys.js";import{applyLiveDeliveryAudienceCeiling,resolveForwardedTraceSeed}from"#shared/forwarded-trace-policy.js";import{isSampledTrace}from"#tracing/sampled-trace.js";import{ROOT_CONTEXT,SpanKind,context,trace}from"#compiled/@opentelemetry/api/index.js";import{isAgentTraceContext,markAgentTraceContext}from"#tracing/agent-trace-context.js";import{withErrorContent}from"#tracing/error-content-context.js";import{agentSpanNamingAttributes}from"#tracing/agent-span-naming.js";import{agentTraceIdentityAttributes}from"#tracing/agent-otel-attributes.js";import{genAiMemoryRecordsAttribute}from"#tracing/agent-otel-content.js";import{withChannelAudience}from"#tracing/channel-audience-context.js";import{recordAgentSpanError}from"#tracing/agent-span-error.js";import{suppressTracing}from"#tracing/suppress-tracing.js";function createAgentMemoryInstrumentation(e){let t=new Map,parentContext=async t=>{let n=context.active();if(isAgentTraceContext(n))return n;let r=await e.stateStore.getSession(t.sessionId);if(t.turnId!==void 0){let n=await e.stateStore.getTurn(t.sessionId,t.turnId);if(n!==void 0)return withChannelAudience(contextFromSpanContext(n.context),r?.channelAudience)}return r===void 0?void 0:withChannelAudience(contextFromSpanContext(r.context),r.channelAudience)},onStarted=async n=>{if(t.has(n.idempotencyKey))return;let r=await parentContext(n),i=r===void 0?void 0:trace.getSpan(r)?.spanContext();if(r===void 0||i===void 0||!isSampledTrace(i))return;let a=e.tracer.startSpan(n.operationName,{attributes:memorySpanAttributes(n),kind:SpanKind.CLIENT},r);t.set(n.idempotencyKey,{context:trace.setSpan(r,a),span:a})},onTerminal=e=>{let n=t.get(e.idempotencyKey);n!==void 0&&(t.delete(e.idempotencyKey),updateMemorySpan(n.span,e),n.span.end())};return{events:{"memory.operation.completed":onTerminal,"memory.operation.failed":onTerminal,"memory.operation.started":onStarted},async runInContext(n,r){let i=await e.stateStore.getSession(n.sessionId),a=t.get(n.idempotencyKey)?.context;if(a===void 0&&n.turnId!==void 0){let t=await e.stateStore.getTurn(n.sessionId,n.turnId);t!==void 0&&(a=withChannelAudience(contextFromSpanContext(t.context),i?.channelAudience),isSampledTrace(t.context)||(a=suppressTracing(a)))}a===void 0&&i!==void 0&&(a=withChannelAudience(contextFromSpanContext(i.context),i.channelAudience),isSampledTrace(i.context)||(a=suppressTracing(a)));let o=resolveForwardedTraceSeed(contextStorage.getStore()?.get(SessionTraceSeedKey)),s=o?.decision??i?.decision,c=s===void 0?void 0:applyLiveDeliveryAudienceCeiling(s,normalizeChannelAudience(i?.channelAudience),o?.forwardedTracePolicy);return a===void 0?await r():await context.with(markAgentTraceContext(withErrorContent(a,e.recordOutputs&&c?.action===`record`&&c.recordOutputs)),r)}}}function memorySpanAttributes(e){let t={"agent.memory.phase":e.phase,"agent.memory.slot":e.slot,"gen_ai.memory.store.id":e.storeId,"gen_ai.operation.name":e.operationName,...agentSpanNamingAttributes(e.operationName,e.operationName),...agentTraceIdentityAttributes({rootSessionId:e.rootSessionId,sessionId:e.sessionId})};return e.turnId!==void 0&&(t[`agent.turn.id`]=e.turnId),t}function updateMemorySpan(e,t){if(t.type===`memory.operation.failed`)recordAgentSpanError(e,t.error);else{t.recordCount!==void 0&&e.setAttribute(`gen_ai.memory.record.count`,t.recordCount);let n=genAiMemoryRecordsAttribute(t.outputRecords??[]);n!==void 0&&t.outputRecords!==void 0&&e.setAttribute(`gen_ai.memory.records`,n)}}function contextFromSpanContext(e){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(e))}export{createAgentMemoryInstrumentation};