promptlayer 1.2.2 → 1.3.0
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/claude-agents.js +1 -1
- package/dist/claude-agents.js.map +1 -1
- package/dist/esm/{chunk-7Y65WGSZ.js → chunk-KDVM55TG.js} +2 -2
- package/dist/esm/{chunk-7Y65WGSZ.js.map → chunk-KDVM55TG.js.map} +1 -1
- package/dist/esm/claude-agents.js +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/openai-agents.js +1 -1
- package/dist/esm/openai-agents.js.map +1 -1
- package/dist/index.d.mts +98 -1
- package/dist/index.d.ts +98 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/openai-agents.js +1 -1
- package/dist/openai-agents.js.map +1 -1
- package/package.json +1 -1
package/dist/openai-agents.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var mt=Object.create;var b=Object.defineProperty;var ft=Object.getOwnPropertyDescriptor;var gt=Object.getOwnPropertyNames,W=Object.getOwnPropertySymbols,yt=Object.getPrototypeOf,G=Object.prototype.hasOwnProperty,ht=Object.prototype.propertyIsEnumerable;var F=(n,t,e)=>t in n?b(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e,d=(n,t)=>{for(var e in t||(t={}))G.call(t,e)&&F(n,e,t[e]);if(W)for(var e of W(t))ht.call(t,e)&&F(n,e,t[e]);return n};var bt=(n,t)=>{for(var e in t)b(n,e,{get:t[e],enumerable:!0})},z=(n,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of gt(t))!G.call(n,s)&&s!==e&&b(n,s,{get:()=>t[s],enumerable:!(o=ft(t,s))||o.enumerable});return n};var O=(n,t,e)=>(e=n!=null?mt(yt(n)):{},z(t||!n||!n.__esModule?b(e,"default",{value:n,enumerable:!0}):e,n)),xt=n=>z(b({},"__esModule",{value:!0}),n);var u=(n,t,e)=>new Promise((o,s)=>{var r=l=>{try{i(e.next(l))}catch(c){s(c)}},a=l=>{try{i(e.throw(l))}catch(c){s(c)}},i=l=>l.done?o(l.value):Promise.resolve(l.value).then(r,a);i((e=e.apply(n,t)).next())});var Zt={};bt(Zt,{PromptLayerOpenAIAgentsProcessor:()=>h,instrumentOpenAIAgents:()=>dt});module.exports=xt(Zt);var Rt=O(require("ably")),wt=require("centrifuge"),B=O(require("p-retry"));var g="1.
|
|
1
|
+
"use strict";var mt=Object.create;var b=Object.defineProperty;var ft=Object.getOwnPropertyDescriptor;var gt=Object.getOwnPropertyNames,W=Object.getOwnPropertySymbols,yt=Object.getPrototypeOf,G=Object.prototype.hasOwnProperty,ht=Object.prototype.propertyIsEnumerable;var F=(n,t,e)=>t in n?b(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e,d=(n,t)=>{for(var e in t||(t={}))G.call(t,e)&&F(n,e,t[e]);if(W)for(var e of W(t))ht.call(t,e)&&F(n,e,t[e]);return n};var bt=(n,t)=>{for(var e in t)b(n,e,{get:t[e],enumerable:!0})},z=(n,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of gt(t))!G.call(n,s)&&s!==e&&b(n,s,{get:()=>t[s],enumerable:!(o=ft(t,s))||o.enumerable});return n};var O=(n,t,e)=>(e=n!=null?mt(yt(n)):{},z(t||!n||!n.__esModule?b(e,"default",{value:n,enumerable:!0}):e,n)),xt=n=>z(b({},"__esModule",{value:!0}),n);var u=(n,t,e)=>new Promise((o,s)=>{var r=l=>{try{i(e.next(l))}catch(c){s(c)}},a=l=>{try{i(e.throw(l))}catch(c){s(c)}},i=l=>l.done?o(l.value):Promise.resolve(l.value).then(r,a);i((e=e.apply(n,t)).next())});var Zt={};bt(Zt,{PromptLayerOpenAIAgentsProcessor:()=>h,instrumentOpenAIAgents:()=>dt});module.exports=xt(Zt);var Rt=O(require("ably")),wt=require("centrifuge"),B=O(require("p-retry"));var g="1.3.0",Pt=()=>{var n;if(typeof process!="undefined"&&((n=process.versions)!=null&&n.node)){let t=process.versions.node.split(".");return`${t[0]}.${t[1]}`}return"unknown"},kt=Pt(),Ot=`promptlayer-js/${g} (node ${kt})`,D=()=>({"User-Agent":Ot,"X-SDK-Version":g});var V=(n,t)=>u(null,null,function*(){return(0,B.default)(()=>u(null,null,function*(){let e=yield fetch(n,t);if(e.status>=500&&e.status<600||e.status===429)throw new Error(`Server error: ${e.status} ${e.statusText}`);return e}),{retries:3,factor:2,minTimeout:2e3,maxTimeout:15e3,randomize:!0,onFailedAttempt:e=>{console.info(`PromptLayer API request attempt ${e.attemptNumber} failed. ${e.retriesLeft} retries left.`)}})});var E=n=>{var t,e,o,s,r,a;if(typeof globalThis.process!="undefined")return(o=(e=(t=globalThis.process.env)==null?void 0:t[n])==null?void 0:e.trim())!=null?o:void 0;if(typeof globalThis.Deno!="undefined")return(a=(r=(s=globalThis.Deno.env)==null?void 0:s.get)==null?void 0:r.call(s,n))==null?void 0:a.trim()},J=n=>{if(n!==void 0){let e=n.trim();if(!e)throw new Error("PromptLayer API key not provided. Please set PROMPTLAYER_API_KEY or pass apiKey.");return e}let t=E("PROMPTLAYER_API_KEY");if(!t)throw new Error("PromptLayer API key not provided. Please set PROMPTLAYER_API_KEY or pass apiKey.");return t};var Et=1,Ct=3,p=n=>typeof n=="object"&&n!==null&&!Array.isArray(n),tt=n=>typeof n=="string"||typeof n=="number"||typeof n=="boolean",Nt=n=>n.replace(/[^a-zA-Z0-9_.-]/g,"_"),A=n=>n===null||typeof n=="string"||typeof n=="number"||typeof n=="boolean"?n:Array.isArray(n)?n.map(t=>A(t)):p(n)?Object.fromEntries(Object.entries(n).map(([t,e])=>[t,A(e)])):String(n),y=n=>{let t=e=>Array.isArray(e)?e.map(o=>t(o)):p(e)?Object.keys(e).sort().reduce((o,s)=>(o[s]=t(e[s]),o),{}):e;return JSON.stringify(t(A(n)))},_=(n,t,e)=>{e!=null&&e!==""&&(n[t]=String(e))},Y=(n,t,e)=>{if(e!=null&&e!==""){let o=Number(e);Number.isNaN(o)||(n[t]=o)}},m=(n,t,e,o)=>{o&&e!==void 0&&e!==null&&(n[t]=y(e))},S=(n,t,e)=>{t.forEach((o,s)=>{Object.entries(o).forEach(([r,a])=>{e[`${n}.${s}.${r}`]=tt(a)?a:y(a)})})},et=n=>Array.isArray(n)?n.map(t=>{var r,a,i,l,c;if(!p(t))return null;let e=p(t.function)?t.function:null,o=(a=(r=e==null?void 0:e.name)!=null?r:t.name)!=null?a:"tool",s=(l=(i=e==null?void 0:e.arguments)!=null?i:t.arguments)!=null?l:{};if(typeof s=="string")try{s=JSON.parse(s)}catch(k){s=s}return{id:String((c=t.id)!=null?c:""),type:"tool_call",name:String(o),arguments:A(s)}}).filter(t=>t!==null):[],nt=n=>{var e,o;let t=(o=(e=n.call_id)!=null?e:n.callId)!=null?o:n.id;return t!=null?String(t):void 0},Mt=n=>{if(n==null)return;if(typeof n=="string")return n;if(Array.isArray(n)){let e=x(n);return e!=null?e:y(n)}if(p(n)){let e=x([n]);return e!=null?e:y(n)}let t=x(n);return t!==void 0?t:y(n)},X=n=>{var e,o,s;let t=(e=n.arguments)!=null?e:{};if(typeof t=="string")try{t=JSON.parse(t)}catch(r){t=t}return{role:"assistant",tool_calls:[{id:(o=nt(n))!=null?o:"",type:"tool_call",name:String((s=n.name)!=null?s:"tool"),arguments:A(t)}]}},Z=(n,t)=>{var r;let e=nt(n),o=Mt((r=t!=null?t:n.output)!=null?r:n.content);if(!e&&!o)return null;let s={role:"tool"};return e&&(s.tool_call_id=e),o!==void 0&&(s.content=o),s};function x(n){if(n!=null){if(typeof n=="string")return n;if(Array.isArray(n)){let t=n.map(e=>{var s;if(!p(e))return null;let o=e.type;if(o==="text"||o==="input_text"||o==="output_text"){let r=(s=e.text)!=null?s:e.content;return r!=null?String(r):null}return null}).filter(e=>e!==null);return t.length>0?t.join(`
|
|
2
2
|
`):void 0}return String(n)}}var H=n=>Array.isArray(n)?n.map(t=>{if(!p(t))return null;let e={};t.role!==void 0&&(e.role=String(t.role));let o=x(t.content);o&&(e.content=o);let s=et(t.tool_calls);return s.length>0&&(e.tool_calls=s),t.tool_call_id&&(e.tool_call_id=String(t.tool_call_id)),Object.keys(e).length>0?e:null}).filter(t=>t!==null):[],Q=n=>{let t={},e=n.role,o=x(n.content),s=et(n.tool_calls);return e!=null?t.role=String(e):(o||s.length>0)&&(t.role="assistant"),o&&(t.content=o),s.length>0&&(t.tool_calls=s),n.tool_call_id&&(t.tool_call_id=String(n.tool_call_id)),Object.keys(t).length>0?t:null},jt=new Set(["function_call","computer_call","shell_call","apply_patch_call","custom_tool_call","mcp_call"]),Lt=new Set(["function_call_output","function_call_result","computer_call_output","computer_call_result","shell_call_output","apply_patch_call_output","custom_tool_call_output"]),v=n=>typeof n=="string"?[{role:"user",content:n}]:Array.isArray(n)?n.flatMap(t=>{if(!p(t))return[];if(t.type==="message_output_item"&&p(t.rawItem)){let o=Q(t.rawItem);return o?[o]:[]}if(t.type==="tool_call_item"&&p(t.rawItem)){let o=X(t.rawItem);return o?[o]:[]}if(t.type==="tool_call_output_item"&&p(t.rawItem)){let o=Z(t.rawItem,t.output);return o?[o]:[]}if(typeof t.type=="string"&&jt.has(t.type)){let o=X(t);return o?[o]:[]}if(typeof t.type=="string"&&Lt.has(t.type)){let o=Z(t);return o?[o]:[]}let e=Q(t);return e?[e]:[]}).filter(t=>t!==null):[],ot=(n,t)=>{var e,o;p(t)&&(Y(n,"gen_ai.usage.input_tokens",(e=t.input_tokens)!=null?e:t.prompt_tokens),Y(n,"gen_ai.usage.output_tokens",(o=t.output_tokens)!=null?o:t.completion_tokens))},qt=(n,t)=>{let e={"gen_ai.provider.name":"openai.responses"};return _(e,"gen_ai.request.model",n.model),ot(e,n.usage),S("gen_ai.prompt",H(n.input),e),S("gen_ai.completion",H(n.output),e),m(e,"openai_agents.model_config_json",n.model_config,t),m(e,"openai_agents.generation.raw_input_json",n.input,t),m(e,"openai_agents.generation.raw_output_json",n.output,t),e},Ut=(n,t)=>{var r,a,i;let e={"gen_ai.provider.name":"openai.responses"},o=p(n._response)?n._response:{},s=p(o.usage)?o.usage:void 0;return _(e,"gen_ai.request.model",o.model),_(e,"gen_ai.response.model",o.model),_(e,"gen_ai.response.id",(a=(r=n.response_id)!=null?r:o.id)!=null?a:o.response_id),ot(e,s),S("gen_ai.prompt",v((i=n._input)!=null?i:o.input),e),S("gen_ai.completion",v(o.output),e),m(e,"openai_agents.response.raw_json",o,t),_(e,"openai_agents.response.object",o.object),e},$t=(n,t)=>{let e={node_type:"CODE_EXECUTION",tool_name:n.name,"openai_agents.function.name":n.name};return _(e,"function_input",n.input),_(e,"function_output",n.output),_(e,"openai_agents.function.input",n.input),_(e,"openai_agents.function.output",n.output),m(e,"openai_agents.function.mcp_data_json",n.mcp_data,t),e},Wt=(n,t)=>{let e={"openai_agents.agent.name":n.name};return _(e,"openai_agents.agent.output_type",n.output_type),m(e,"openai_agents.agent.handoffs_json",n.handoffs,t),m(e,"openai_agents.agent.tools_json",n.tools,t),e},Ft=n=>{let t={};return _(t,"openai_agents.handoff.from_agent",n.from_agent),_(t,"openai_agents.handoff.to_agent",n.to_agent),t},Gt=n=>({"openai_agents.guardrail.name":n.name,"openai_agents.guardrail.triggered":n.triggered}),zt=(n,t)=>{let e={"openai_agents.custom.name":n.name};return m(e,"openai_agents.custom.data_json",n.data,t),e},Kt=(n,t)=>t?{"openai_agents.raw_json":y(n)}:{},st=()=>g,C=n=>n.spanData.type==="generation"||n.spanData.type==="response"?Ct:Et,N=n=>{switch(n.spanData.type){case"function":return`Function: ${n.spanData.name}`;case"agent":return`Agent: ${n.spanData.name}`;case"guardrail":return`Guardrail: ${n.spanData.name}`;case"custom":return String(n.spanData.name);default:return n.spanData.type.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}},M=(n,t)=>{let e={"promptlayer.telemetry.source":"openai-agents-js","promptlayer.telemetry.source_version":st(),"openai_agents.trace_id_original":n.traceId,"openai_agents.workflow_name":n.name};return n.groupId&&(e["openai_agents.group_id"]=n.groupId),p(n.metadata)&&(Object.entries(n.metadata).forEach(([o,s])=>{tt(s)&&(e[`openai_agents.metadata.${Nt(o)}`]=s)}),m(e,"openai_agents.metadata_json",n.metadata,t)),e},j=n=>{let t={"promptlayer.telemetry.source":"openai-agents-js","promptlayer.telemetry.source_version":st(),"openai_agents.span_id_original":n.spanId,"openai_agents.span_type":n.spanData.type};return n.parentId&&(t["openai_agents.parent_id_original"]=n.parentId),t},rt=(n,t)=>{switch(n.type){case"generation":return qt(n,t);case"response":return Ut(n,t);case"function":return $t(n,t);case"agent":return Wt(n,t);case"handoff":return Ft(n);case"guardrail":return Gt(n);case"custom":return zt(n,t);default:return Kt(n,t)}},I=0,at=1,it=2;var q=n=>typeof n=="string"?{stringValue:n}:typeof n=="boolean"?{boolValue:n}:typeof n=="number"?Number.isInteger(n)?{intValue:String(n)}:{doubleValue:n}:n===null?{stringValue:"null"}:Array.isArray(n)?{arrayValue:{values:n.map(t=>q(t))}}:{kvlistValue:{values:Object.entries(n).map(([t,e])=>({key:t,value:q(e)}))}},L=n=>Object.entries(n).map(([t,e])=>({key:t,value:q(e)})),lt=(n,{serviceName:t="promptlayer-openai-agents-js",scopeName:e="promptlayer.integrations.openai_agents",scopeVersion:o=g}={})=>({resourceSpans:[{resource:{attributes:L({"service.name":t})},scopeSpans:[{scope:{name:e,version:o},spans:n.map(s=>{var a,i;let r={traceId:s.traceId,spanId:s.spanId,name:s.name,kind:s.kind,startTimeUnixNano:s.startTimeUnixNano,endTimeUnixNano:(a=s.endTimeUnixNano)!=null?a:s.startTimeUnixNano,attributes:L(s.attributes),events:((i=s.events)!=null?i:[]).map(l=>{var c;return{name:l.name,timeUnixNano:l.timeUnixNano,attributes:L((c=l.attributes)!=null?c:{})}}),links:[]};return s.parentSpanId&&(r.parentSpanId=s.parentSpanId),s.traceState&&(r.traceState=s.traceState),s.status&&(r.status=d({code:s.status.code},s.status.message?{message:s.status.message}:{})),r})}]}]});var ct=require("crypto"),Bt=/^[0-9a-f]{32}$/i,U=n=>(0,ct.createHash)("sha256").update(n,"utf8").digest("hex"),R=n=>{let t=n.startsWith("trace_")?n.slice(6):n;return Bt.test(t)?t.toLowerCase():U(n).slice(0,32)},w=n=>U(n).slice(0,16),$=n=>U(`${n}:root`).slice(0,16);var Dt=/^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})(?:\.(\d{1,9}))?(Z|[+-]\d{2}:\d{2})?$/,f=()=>(BigInt(Date.now())*BigInt(1e6)).toString(),T=n=>{if(!n)return;let t=Dt.exec(n);if(!t){let i=Date.parse(n);return Number.isNaN(i)?void 0:(BigInt(i)*BigInt(1e6)).toString()}let[,e,o="",s="Z"]=t,r=Date.parse(`${e}${s}`);if(Number.isNaN(r))return;let a=BigInt((o+"000000000").slice(0,9));return(BigInt(r)*BigInt(1e6)+a).toString()},pt=(...n)=>{let t=n.filter(e=>e!==void 0);return t.length===0?f():t.reduce((e,o)=>BigInt(o)<BigInt(e)?o:e)},ut=(...n)=>{let t=n.filter(e=>e!==void 0);return t.length===0?f():t.reduce((e,o)=>BigInt(o)>BigInt(e)?o:e)};var P=n=>{let t=n.length;for(;t>0&&n.charCodeAt(t-1)===47;)t-=1;return n.slice(0,t)};var Vt=/^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/i,Jt="0".repeat(32),Yt="0".repeat(16),h=class{constructor({apiKey:t,baseURL:e,includeRawPayloads:o=!0}){this.traceStates=new Map;this.completedTraceQueue=new Map;this.pendingExports=new Map;this.apiKey=t,this.baseURL=P(e),this.includeRawPayloads=o}start(){}onTraceStart(t){return u(this,null,function*(){var s;if(this.traceStates.has(t.traceId))return;let e=this.resolveUpstreamTraceContext(t.metadata),o=(s=e==null?void 0:e.traceId)!=null?s:R(t.traceId);this.traceStates.set(t.traceId,{rootSpan:{traceId:o,spanId:$(t.traceId),name:t.name||"OpenAI Agents Trace",kind:1,startTimeUnixNano:f(),parentSpanId:e==null?void 0:e.parentSpanId,traceState:e==null?void 0:e.traceState,attributes:M(t,this.includeRawPayloads),status:{code:I},events:[]},spans:new Map})})}onTraceEnd(t){return u(this,null,function*(){let e=this.traceStates.get(t.traceId);if(!e)return;let o=Array.from(e.spans.values()).sort((l,c)=>BigInt(l.startTimeUnixNano)<BigInt(c.startTimeUnixNano)?-1:1),s=o.map(l=>l.startTimeUnixNano),r=o.map(l=>{var c;return(c=l.endTimeUnixNano)!=null?c:l.startTimeUnixNano}),a=ut(f(),...r);e.rootSpan.startTimeUnixNano=pt(e.rootSpan.startTimeUnixNano,...s),e.rootSpan.endTimeUnixNano=a;let i=lt([e.rootSpan,...o]);this.traceStates.delete(t.traceId),this.completedTraceQueue.set(t.traceId,i),this.startExportForTrace(t.traceId)})}onSpanStart(t){return u(this,null,function*(){var r;let e=this.ensureTraceStateForSpan(t),o=e.spans.get(t.spanId),s=o!=null?o:this.createSpanRecord(t,e.rootSpan.spanId);s.traceId=e.rootSpan.traceId,s.traceState=e.rootSpan.traceState,s.name=N(t),s.kind=C(t),s.startTimeUnixNano=(r=T(t.startedAt))!=null?r:s.startTimeUnixNano,s.parentSpanId=t.parentId?w(t.parentId):e.rootSpan.spanId,s.attributes=d(d({},s.attributes),j(t)),e.spans.set(t.spanId,s)})}onSpanEnd(t){return u(this,null,function*(){var s,r,a,i;let e=this.ensureTraceStateForSpan(t),o=(s=e.spans.get(t.spanId))!=null?s:this.createSpanRecord(t,e.rootSpan.spanId);o.attributes=d(d({},o.attributes),rt(t.spanData,this.includeRawPayloads)),o.endTimeUnixNano=(a=(r=T(t.endedAt))!=null?r:o.endTimeUnixNano)!=null?a:f(),o.status=this.statusForSpan(t),t.error&&(o.events=[...(i=o.events)!=null?i:[],{name:"exception",timeUnixNano:o.endTimeUnixNano,attributes:{"exception.type":"OpenAIAgentsError","exception.message":t.error.message,"openai_agents.error_json":JSON.stringify(t.error)}}]),e.spans.set(t.spanId,o)})}shutdown(){return u(this,null,function*(){yield this.forceFlush()})}forceFlush(){return u(this,null,function*(){for(let t=0;t<2;t+=1){for(let e of this.completedTraceQueue.keys())this.startExportForTrace(e);if(this.pendingExports.size===0||(yield Promise.all(Array.from(this.pendingExports.values())),this.completedTraceQueue.size===0))return}})}traceLikeFromSpan(t){var s,r,a,i,l;let e=this.asRecord(t.traceMetadata),o=this.asRecord(e==null?void 0:e.metadata);return{traceId:t.traceId,name:(r=(s=this.readString(e==null?void 0:e.workflow_name))!=null?s:this.readString(e==null?void 0:e.workflowName))!=null?r:"OpenAI Agents Trace",groupId:(i=(a=this.readString(e==null?void 0:e.group_id))!=null?a:this.readString(e==null?void 0:e.groupId))!=null?i:null,metadata:(l=o!=null?o:e)!=null?l:{}}}ensureTraceStateForSpan(t){var i,l;let e=this.traceStates.get(t.traceId);if(e)return e;let o=this.traceLikeFromSpan(t),s=this.resolveUpstreamTraceContext(o.metadata),a={rootSpan:{traceId:(i=s==null?void 0:s.traceId)!=null?i:R(t.traceId),spanId:$(t.traceId),name:o.name,kind:1,startTimeUnixNano:(l=T(t.startedAt))!=null?l:f(),parentSpanId:s==null?void 0:s.parentSpanId,traceState:s==null?void 0:s.traceState,attributes:M(o,this.includeRawPayloads),status:{code:I},events:[]},spans:new Map};return this.traceStates.set(t.traceId,a),a}createSpanRecord(t,e){var o,s,r,a;return{traceId:(s=(o=this.traceStates.get(t.traceId))==null?void 0:o.rootSpan.traceId)!=null?s:R(t.traceId),spanId:w(t.spanId),parentSpanId:t.parentId?w(t.parentId):e,name:N(t),kind:C(t),startTimeUnixNano:(r=T(t.startedAt))!=null?r:f(),traceState:(a=this.traceStates.get(t.traceId))==null?void 0:a.rootSpan.traceState,attributes:d({},j(t)),status:{code:I},events:[]}}statusForSpan(t){return t.error?{code:it,message:t.error.message}:{code:at}}exportPayload(t){return u(this,null,function*(){let e=yield V(`${this.baseURL}/v1/traces`,{method:"POST",headers:d({"Content-Type":"application/json","X-API-KEY":this.apiKey,"X-PromptLayer-Integration":"openai-agents-js"},D()),body:JSON.stringify(t)});if(!e.ok)throw new Error(`Failed to export OpenAI Agents traces: ${e.status} ${e.statusText}`)})}startExportForTrace(t){if(this.pendingExports.has(t))return;let e=this.completedTraceQueue.get(t);if(!e)return;let o=this.exportPayload(e).then(()=>{this.completedTraceQueue.delete(t)}).catch(s=>{console.error(`Failed to export OpenAI Agents trace '${t}'.`,s)}).finally(()=>{this.pendingExports.delete(t)});this.pendingExports.set(t,o)}resolveUpstreamTraceContext(t){let e=this.asRecord(t);if(!e)return null;let o=e.traceparent;if(typeof o!="string"||!o.trim())return null;let s=o.trim().match(Vt);if(!s)return null;let[,r,a,i]=s,l=r.toLowerCase(),c=a.toLowerCase(),k=i.toLowerCase();if(l==="ff"||c===Jt||k===Yt)return null;let _t=typeof e.tracestate=="string"&&e.tracestate.trim()?e.tracestate.trim():void 0;return{traceId:c,parentSpanId:k,traceState:_t}}asRecord(t){return!t||typeof t!="object"||Array.isArray(t)?null:t}readString(t){return typeof t=="string"&&t.trim()?t:void 0}};var Xt=n=>{var t;return P((t=n!=null?n:E("PROMPTLAYER_BASE_URL"))!=null?t:"https://api.promptlayer.com")},dt=(...s)=>u(null,[...s],function*({apiKey:n,baseURL:t,exclusive:e=!0,includeRawPayloads:o=!0}={}){let r=J(n),a=yield import("@openai/agents"),i=new h({apiKey:r,baseURL:Xt(t),includeRawPayloads:o});return e?a.setTraceProcessors([i]):a.addTraceProcessor(i),i});0&&(module.exports={PromptLayerOpenAIAgentsProcessor,instrumentOpenAIAgents});
|
|
3
3
|
//# sourceMappingURL=openai-agents.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/openai-agents.ts","../src/utils/utils.ts","../src/integrations/openai-agents/mapping.ts","../src/integrations/openai-agents/otlp-json.ts","../src/integrations/openai-agents/ids.ts","../src/integrations/openai-agents/time.ts","../src/integrations/openai-agents/url.ts","../src/integrations/openai-agents/processor.ts","../src/integrations/openai-agents/instrumentation.ts"],"sourcesContent":["export * from \"@/integrations/openai-agents\";\n","import {\n GetPromptTemplateParams,\n GetPromptTemplateResponse,\n ListPromptTemplatesResponse,\n LogRequest,\n Pagination,\n PublishPromptTemplate,\n PublishPromptTemplateResponse,\n RequestLog,\n RunWorkflowRequestParams,\n TrackGroup,\n TrackMetadata,\n TrackPrompt,\n TrackRequest,\n TrackScore,\n WorkflowResponse,\n} from \"@/types\";\nimport type { AnthropicBedrock } from \"@anthropic-ai/bedrock-sdk\";\nimport type TypeAnthropic from \"@anthropic-ai/sdk\";\nimport type { AnthropicVertex } from \"@anthropic-ai/vertex-sdk\";\nimport Ably from \"ably\";\nimport { Centrifuge } from \"centrifuge\";\nimport type TypeOpenAI from \"openai\";\nimport pRetry from \"p-retry\";\nimport {\n MAP_PROVIDER_TO_FUNCTION_NAME,\n cleaned_result,\n STREAMING_PROVIDERS_WITH_USAGE,\n} from \"./streaming\";\n\n// SDK version - injected at build time from package.json\ndeclare const __SDK_VERSION__: string;\nexport const SDK_VERSION = __SDK_VERSION__;\n\n// Get Node.js version (major.minor format)\nconst getNodeVersion = (): string => {\n if (typeof process !== \"undefined\" && process.versions?.node) {\n const parts = process.versions.node.split(\".\");\n return `${parts[0]}.${parts[1]}`;\n }\n return \"unknown\";\n};\n\nconst _NODE_VERSION = getNodeVersion();\nconst _PROMPTLAYER_USER_AGENT = `promptlayer-js/${SDK_VERSION} (node ${_NODE_VERSION})`;\n\n/**\n * Returns common headers to be included in all PromptLayer API requests.\n * Includes the SDK version and user agent for tracking and debugging purposes.\n */\nexport const getCommonHeaders = (): Record<string, string> => ({\n \"User-Agent\": _PROMPTLAYER_USER_AGENT,\n \"X-SDK-Version\": SDK_VERSION,\n});\n\nexport const SET_WORKFLOW_COMPLETE_MESSAGE = \"SET_WORKFLOW_COMPLETE\";\n\nexport enum FinalOutputCode {\n OK = \"OK\",\n EXCEEDS_SIZE_LIMIT = \"EXCEEDS_SIZE_LIMIT\",\n}\n\nasync function getFinalOutput(\n baseURL: string,\n executionId: number,\n returnAllOutputs: boolean,\n headers: Record<string, string>\n): Promise<any> {\n const response = await fetchWithRetry(\n `${baseURL}/workflow-version-execution-results?workflow_version_execution_id=${executionId}&return_all_outputs=${returnAllOutputs}`,\n { headers, ...getCommonHeaders() }\n );\n if (!response.ok) {\n throw new Error(\"Failed to fetch final output\");\n }\n return response.json();\n}\n\nfunction makeMessageListener(\n baseURL: string,\n resultsPromise: { resolve: (data: any) => void; reject: (err: any) => void },\n executionId: number,\n returnAllOutputs: boolean,\n headers: Record<string, string>\n) {\n return async function (message: any) {\n if (message.name !== SET_WORKFLOW_COMPLETE_MESSAGE) return;\n\n try {\n const data = JSON.parse(message.data);\n const resultCode = data.result_code;\n let results;\n\n if (resultCode === FinalOutputCode.OK || resultCode == null) {\n results = data.final_output;\n } else if (resultCode === FinalOutputCode.EXCEEDS_SIZE_LIMIT) {\n results = await getFinalOutput(\n baseURL,\n executionId,\n returnAllOutputs,\n headers\n );\n resultsPromise.resolve(results);\n } else {\n throw new Error(`Unsupported final output code: ${resultCode}`);\n }\n\n resultsPromise.resolve(results);\n } catch (err) {\n resultsPromise.reject(err);\n }\n };\n}\n\ninterface WaitForWorkflowCompletionParams {\n token: string;\n channelName: string;\n executionId: number;\n returnAllOutputs: boolean;\n headers: Record<string, string>;\n timeout: number;\n baseURL: string;\n}\n\nasync function waitForWorkflowCompletion({\n token,\n channelName,\n executionId,\n returnAllOutputs,\n headers,\n timeout,\n baseURL,\n}: WaitForWorkflowCompletionParams): Promise<any> {\n const client = new Ably.Realtime(token);\n const channel = client.channels.get(channelName);\n\n const resultsPromise = {} as {\n resolve: (value: any) => void;\n reject: (reason?: any) => void;\n };\n\n const promise = new Promise<any>((resolve, reject) => {\n resultsPromise.resolve = resolve;\n resultsPromise.reject = reject;\n });\n\n const listener = makeMessageListener(\n baseURL,\n resultsPromise,\n executionId,\n returnAllOutputs,\n headers\n );\n await channel.subscribe(SET_WORKFLOW_COMPLETE_MESSAGE, listener);\n\n try {\n return await new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(\n new Error(\"Workflow execution did not complete properly (timeout)\")\n );\n }, timeout);\n\n promise\n .then((result) => {\n clearTimeout(timer);\n resolve(result);\n })\n .catch((err) => {\n clearTimeout(timer);\n reject(err);\n });\n });\n } finally {\n console.log(\"Closing client\");\n channel.unsubscribe(SET_WORKFLOW_COMPLETE_MESSAGE, listener);\n client.close();\n console.log(\"Closed client\");\n }\n}\n\n/**\n * Wrapper around fetch that retries on 5xx server errors with exponential backoff.\n * Uses p-retry for industry-standard retry logic with exponential backoff.\n *\n * @param input - The URL or Request object to fetch\n * @param init - The request initialization options\n * @returns Promise<Response> - The fetch response\n */\nexport const fetchWithRetry = async (\n input: RequestInfo | URL,\n init?: RequestInit\n): Promise<Response> => {\n return pRetry(\n async () => {\n const response = await fetch(input, init);\n\n if ((response.status >= 500 && response.status < 600) || (response.status === 429)) {\n throw new Error(\n `Server error: ${response.status} ${response.statusText}`\n );\n }\n\n return response;\n },\n {\n retries: 3, // Retry up to 3 times (4 total attempts)\n factor: 2, // Exponential backoff factor\n minTimeout: 2000, // First retry after 2 seconds\n maxTimeout: 15000, // Cap at 15 seconds (gives us ~2s, ~4s, ~8s progression with randomization)\n randomize: true, // Add jitter to avoid thundering herd\n onFailedAttempt: (error) => {\n console.info(\n `PromptLayer API request attempt ${error.attemptNumber} failed. ${error.retriesLeft} retries left.`\n );\n },\n }\n );\n};\n\nconst promptlayerApiHandler = async <Item>(\n apiKey: string,\n baseURL: string,\n body: TrackRequest & {\n request_response: AsyncIterable<Item> | any;\n },\n throwOnError: boolean = true\n) => {\n const isGenerator = body.request_response[Symbol.asyncIterator] !== undefined;\n if (isGenerator) {\n return proxyGenerator(\n apiKey,\n baseURL,\n body.request_response,\n body,\n throwOnError\n );\n }\n return await promptLayerApiRequest(apiKey, baseURL, body, throwOnError);\n};\n\nconst promptLayerApiRequest = async (\n apiKey: string,\n baseURL: string,\n body: TrackRequest,\n throwOnError: boolean = true\n) => {\n try {\n const response = await fetchWithRetry(`${baseURL}/track-request`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...getCommonHeaders() },\n body: JSON.stringify(body),\n });\n const data = await response.json();\n if (response.status !== 200) {\n const errorMessage =\n data.message || data.error || \"Failed to log request\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While logging your request, PromptLayer experienced the following error:\"\n );\n }\n }\n if (data && body.return_pl_id) {\n return [body.request_response, data.request_id];\n }\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n console.warn(\n `WARNING: While logging your request PromptLayer had the following error: ${e}`\n );\n }\n return body.request_response;\n};\n\nconst promptLayerTrackMetadata = async (\n apiKey: string,\n baseURL: string,\n body: TrackMetadata,\n throwOnError: boolean = true\n): Promise<boolean> => {\n try {\n const response = await fetchWithRetry(`${baseURL}/library-track-metadata`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...getCommonHeaders() },\n body: JSON.stringify({\n ...body,\n api_key: apiKey,\n }),\n });\n const data = await response.json();\n if (response.status !== 200) {\n const errorMessage =\n data.message || data.error || \"Failed to track metadata\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While logging metadata to your request, PromptLayer experienced the following error\"\n );\n return false;\n }\n }\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n console.warn(\n `WARNING: While logging metadata to your request, PromptLayer experienced the following error: ${e}`\n );\n return false;\n }\n return true;\n};\n\nconst promptLayerTrackScore = async (\n apiKey: string,\n baseURL: string,\n body: TrackScore,\n throwOnError: boolean = true\n): Promise<boolean> => {\n try {\n const response = await fetchWithRetry(`${baseURL}/library-track-score`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...getCommonHeaders() },\n body: JSON.stringify({\n ...body,\n api_key: apiKey,\n }),\n });\n const data = await response.json();\n if (response.status !== 200) {\n const errorMessage =\n data.message || data.error || \"Failed to track score\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While scoring your request, PromptLayer experienced the following error\"\n );\n return false;\n }\n }\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n console.warn(\n `WARNING: While scoring your request, PromptLayer experienced the following error: ${e}`\n );\n return false;\n }\n return true;\n};\n\nconst promptLayerTrackPrompt = async (\n apiKey: string,\n baseURL: string,\n body: TrackPrompt,\n throwOnError: boolean = true\n): Promise<boolean> => {\n try {\n const response = await fetchWithRetry(`${baseURL}/library-track-prompt`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...getCommonHeaders() },\n body: JSON.stringify({\n ...body,\n api_key: apiKey,\n }),\n });\n const data = await response.json();\n if (response.status !== 200) {\n const errorMessage =\n data.message || data.error || \"Failed to track prompt\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While associating your request with a prompt template, PromptLayer experienced the following error\"\n );\n return false;\n }\n }\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n console.warn(\n `WARNING: While associating your request with a prompt template, PromptLayer experienced the following error: ${e}`\n );\n return false;\n }\n return true;\n};\n\nconst promptLayerTrackGroup = async (\n apiKey: string,\n baseURL: string,\n body: TrackGroup,\n throwOnError: boolean = true\n): Promise<boolean> => {\n try {\n const response = await fetchWithRetry(`${baseURL}/track-group`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...getCommonHeaders() },\n body: JSON.stringify({\n ...body,\n api_key: apiKey,\n }),\n });\n const data = await response.json();\n if (response.status !== 200) {\n const errorMessage =\n data.message || data.error || \"Failed to track group\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While associating your request with a group, PromptLayer experienced the following error\"\n );\n return false;\n }\n }\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n console.warn(\n `WARNING: While associating your request with a group, PromptLayer experienced the following error: ${e}`\n );\n return false;\n }\n return true;\n};\n\nconst promptLayerCreateGroup = async (\n apiKey: string,\n baseURL: string,\n throwOnError: boolean = true\n): Promise<number | boolean> => {\n try {\n const response = await fetchWithRetry(`${baseURL}/create-group`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...getCommonHeaders() },\n body: JSON.stringify({\n api_key: apiKey,\n }),\n });\n const data = await response.json();\n if (response.status !== 200) {\n const errorMessage =\n data.message || data.error || \"Failed to create group\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While creating a group PromptLayer had the following error\"\n );\n return false;\n }\n }\n return data.id;\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n console.warn(\n `WARNING: While creating a group PromptLayer had the following error: ${e}`\n );\n return false;\n }\n};\n\nconst getPromptTemplate = async (\n apiKey: string,\n baseURL: string,\n promptName: string,\n params?: Partial<GetPromptTemplateParams>,\n throwOnError: boolean = true\n): Promise<GetPromptTemplateResponse | null> => {\n try {\n const url = new URL(`${baseURL}/prompt-templates/${promptName}`);\n const response = await fetchWithRetry(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": apiKey,\n ...getCommonHeaders(),\n },\n body: JSON.stringify(params),\n });\n const data = await response.json();\n if (response.status !== 200) {\n const errorMessage =\n data.message || data.error || \"Failed to fetch prompt template\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n console.warn(\n `WARNING: While fetching a prompt template PromptLayer had the following error: ${errorMessage}`\n );\n return null;\n }\n }\n if (data.warning) {\n console.warn(\n `WARNING: While fetching your prompt PromptLayer had the following error: ${data.warning}`\n );\n }\n return data as GetPromptTemplateResponse;\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n console.warn(\n `WARNING: While fetching a prompt template PromptLayer had the following error: ${e}`\n );\n return null;\n }\n};\n\nconst publishPromptTemplate = async (\n apiKey: string,\n baseURL: string,\n body: PublishPromptTemplate,\n throwOnError: boolean = true\n): Promise<PublishPromptTemplateResponse> => {\n const response = await fetchWithRetry(`${baseURL}/rest/prompt-templates`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-API-KEY\": apiKey, ...getCommonHeaders() },\n body: JSON.stringify({\n prompt_template: { ...body },\n prompt_version: { ...body },\n release_labels: body.release_labels ? body.release_labels : undefined,\n }),\n });\n const data = await response.json();\n if (response.status !== 200 && response.status !== 201) {\n const errorMessage =\n data.message || data.error || \"Failed to publish prompt template\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While publishing a prompt template PromptLayer had the following error\"\n );\n }\n }\n return data as PublishPromptTemplateResponse;\n};\n\nconst getAllPromptTemplates = async (\n apiKey: string,\n baseURL: string,\n params?: Partial<Pagination>,\n throwOnError: boolean = true\n): Promise<Array<ListPromptTemplatesResponse>> => {\n const url = new URL(`${baseURL}/prompt-templates`);\n Object.entries(params || {}).forEach(([key, value]) =>\n url.searchParams.append(key, value.toString())\n );\n const response = await fetchWithRetry(url, {\n headers: { \"Content-Type\": \"application/json\", \"X-API-KEY\": apiKey, ...getCommonHeaders() },\n });\n const data = await response.json();\n if (response.status !== 200) {\n const errorMessage =\n data.message || data.error || \"Failed to fetch prompt templates\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While fetching all prompt templates PromptLayer had the following error\"\n );\n return [];\n }\n }\n return (data.items ?? []) as Array<ListPromptTemplatesResponse>;\n};\n\nconst waitForWorkflowCompletionCentrifugo = async (\n params: WaitForWorkflowCompletionParams\n): Promise<any> => {\n const url = new URL(`${params.baseURL}/connection/websocket`);\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n\n const client = new Centrifuge(url.toString(), { token: params.token });\n const sub = client.newSubscription(params.channelName);\n\n return new Promise((resolve, reject) => {\n const cleanupWithResolve = (data: any) => {\n cleanup();\n resolve(data);\n };\n\n const listener = makeMessageListener(\n params.baseURL,\n { resolve: cleanupWithResolve, reject },\n params.executionId,\n params.returnAllOutputs,\n params.headers\n );\n\n sub.on(\"publication\", (message) => {\n listener({\n name: message.data.message_name,\n data: message.data.data,\n });\n });\n\n const timeout = setTimeout(() => {\n reject(\n new Error(\"Workflow execution did not complete properly (timeout)\")\n );\n }, params.timeout);\n\n const cleanup = () => {\n clearTimeout(timeout);\n sub.unsubscribe();\n client.disconnect();\n };\n\n sub.on(\"error\", (err) => {\n cleanup();\n reject(`Centrifugo subscription error: ${err}`);\n });\n\n client.on(\"error\", (err) => {\n cleanup();\n reject(`Centrifugo client error: ${err}`);\n });\n\n sub.subscribe();\n client.connect();\n });\n};\n\nexport const runWorkflowRequest = async ({\n workflow_name,\n input_variables,\n metadata = {},\n workflow_label_name = null,\n workflow_version_number = null,\n return_all_outputs = false,\n api_key,\n timeout = 3600000, // Default timeout is 1 hour in milliseconds\n baseURL,\n}: RunWorkflowRequestParams): Promise<WorkflowResponse> => {\n const payload = {\n input_variables,\n metadata,\n workflow_label_name,\n workflow_version_number,\n return_all_outputs,\n };\n\n const headers = { \"Content-Type\": \"application/json\", \"X-API-KEY\": api_key, ...getCommonHeaders() };\n\n try {\n const response = await fetchWithRetry(\n `${baseURL}/workflows/${encodeURIComponent(workflow_name)}/run`,\n {\n method: \"POST\",\n headers: headers,\n body: JSON.stringify(payload),\n }\n );\n\n if (response.status !== 201) {\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n message: `Failed to run workflow: ${\n errorData.error || response.statusText\n }`,\n };\n }\n\n const result = await response.json();\n if (result.warning) {\n console.warn(`WARNING: ${result.warning}`);\n }\n const execution_id = result.workflow_version_execution_id;\n if (!execution_id) {\n console.log(\"No execution ID returned from workflow run\");\n return { success: false, message: \"Failed to run workflow\" };\n }\n\n const channel_name = `workflow_updates:${execution_id}`;\n const ws_response = await fetchWithRetry(\n `${baseURL}/ws-token-request-library?capability=${channel_name}`,\n {\n method: \"POST\",\n headers: headers,\n }\n );\n\n const ws_token_response = await ws_response.json();\n const token = ws_token_response.token_details.token;\n\n const params: WaitForWorkflowCompletionParams = {\n token,\n channelName: channel_name,\n executionId: execution_id,\n returnAllOutputs: return_all_outputs,\n headers: headers,\n timeout: timeout,\n baseURL: baseURL,\n };\n if (ws_token_response.messaging_backend === \"centrifugo\")\n return waitForWorkflowCompletionCentrifugo(params);\n return await waitForWorkflowCompletion(params);\n } catch (error) {\n console.error(\n `Failed to run workflow: ${\n error instanceof Error ? error.message : error\n }`\n );\n throw error;\n }\n};\n\nasync function* proxyGenerator<Item>(\n apiKey: string,\n baseURL: string,\n generator: AsyncIterable<Item>,\n body: TrackRequest,\n throwOnError: boolean = true\n) {\n const results = [];\n for await (const value of generator) {\n yield body.return_pl_id ? [value, null] : value;\n results.push(value);\n }\n const request_response = cleaned_result(results, body.function_name);\n const response = await promptLayerApiRequest(\n apiKey,\n baseURL,\n {\n ...body,\n request_response,\n request_end_time: new Date().toISOString(),\n },\n throwOnError\n );\n if (response) {\n if (body.return_pl_id) {\n const request_id = (response as any)[1];\n const lastResult = results.at(-1);\n yield [lastResult, request_id];\n }\n }\n}\n\nconst warnOnBadResponse = (request_response: any, main_message: string) => {\n try {\n console.warn(`${main_message}: ${request_response.message}`);\n } catch (e) {\n console.warn(`${main_message}: ${request_response}`);\n }\n};\n\nconst trackRequest = async (\n baseURL: string,\n body: TrackRequest,\n throwOnError: boolean = true\n) => {\n try {\n const response = await fetchWithRetry(`${baseURL}/track-request`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...getCommonHeaders() },\n body: JSON.stringify(body),\n });\n const data = await response.json();\n if (response.status !== 200) {\n const errorMessage =\n data.message || data.error || \"Failed to track request\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While logging your request, PromptLayer experienced the following error:\"\n );\n }\n }\n return data;\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n console.warn(\n `WARNING: While logging your request PromptLayer had the following error: ${e}`\n );\n }\n return {};\n};\n\nconst openaiChatRequest = async (client: TypeOpenAI, kwargs: any) => {\n return await client.chat.completions.create(kwargs);\n};\n\nconst openaiCompletionsRequest = async (client: TypeOpenAI, kwargs: any) => {\n return await client.completions.create(kwargs);\n};\n\nconst MAP_TYPE_TO_OPENAI_FUNCTION = {\n chat: openaiChatRequest,\n completion: openaiCompletionsRequest,\n};\n\nconst openaiRequest = async (\n promptBlueprint: GetPromptTemplateResponse,\n kwargs: any\n) => {\n const OpenAI = require(\"openai\").default;\n const client = new OpenAI({\n baseURL: kwargs.baseURL,\n apiKey: kwargs.apiKey,\n });\n\n delete kwargs?.apiKey;\n delete kwargs?.baseURL;\n\n const api_type = promptBlueprint.metadata?.model?.api_type;\n if (api_type === \"chat-completions\") {\n const requestToMake =\n MAP_TYPE_TO_OPENAI_FUNCTION[promptBlueprint.prompt_template.type];\n return await requestToMake(client, kwargs);\n } else if (api_type === \"images\") {\n return await client.images.generate(kwargs);\n } else {\n return await client.responses.create(kwargs);\n }\n};\n\nconst azureOpenAIRequest = async (\n promptBlueprint: GetPromptTemplateResponse,\n kwargs: any\n) => {\n const { AzureOpenAI } = require(\"openai\");\n const client = new AzureOpenAI({\n endpoint: process.env.AZURE_OPENAI_ENDPOINT || kwargs.baseURL,\n apiVersion: process.env.OPENAI_API_VERSION || kwargs.apiVersion,\n apiKey: process.env.AZURE_OPENAI_API_KEY || kwargs.apiKey,\n });\n delete kwargs?.baseURL;\n delete kwargs?.apiVersion;\n delete kwargs?.apiKey;\n\n const api_type = promptBlueprint.metadata?.model?.api_type;\n\n if (api_type === \"chat-completions\") {\n const requestToMake = MAP_TYPE_TO_OPENAI_FUNCTION[promptBlueprint.prompt_template.type];\n return await requestToMake(client, kwargs);\n } else if (api_type === \"images\") {\n return await client.images.generate(kwargs);\n } else {\n return await client.responses.create(kwargs);\n }\n};\n\nconst anthropicChatRequest = async (\n client: TypeAnthropic | AnthropicVertex | AnthropicBedrock,\n kwargs: any\n) => {\n return client.messages.create(kwargs);\n};\n\nconst anthropicCompletionsRequest = async (\n client: TypeAnthropic | AnthropicBedrock,\n kwargs: any\n) => {\n return client.completions.create(kwargs);\n};\n\nconst MAP_TYPE_TO_ANTHROPIC_FUNCTION = {\n chat: anthropicChatRequest,\n completion: anthropicCompletionsRequest,\n};\n\nconst anthropicRequest = async (\n promptBlueprint: GetPromptTemplateResponse,\n kwargs: any\n) => {\n const Anthropic = require(\"@anthropic-ai/sdk\").default;\n const client = new Anthropic({\n baseURL: kwargs.baseURL,\n apiKey: kwargs.apiKey,\n });\n const requestToMake =\n MAP_TYPE_TO_ANTHROPIC_FUNCTION[promptBlueprint.prompt_template.type];\n return requestToMake(client, kwargs);\n};\n\nconst utilLogRequest = async (\n apiKey: string,\n baseURL: string,\n body: LogRequest,\n throwOnError: boolean = true\n): Promise<RequestLog | null> => {\n try {\n const response = await fetchWithRetry(`${baseURL}/log-request`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-API-KEY\": apiKey, ...getCommonHeaders() },\n body: JSON.stringify(body),\n });\n const data = await response.json();\n if (response.status !== 201) {\n const errorMessage =\n data.message || data.error || \"Failed to log request\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While logging your request PromptLayer had the following error\"\n );\n return null;\n }\n }\n return data;\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n console.warn(\n `WARNING: While tracking your prompt PromptLayer had the following error: ${e}`\n );\n return null;\n }\n};\n\nconst googleChatRequest = async (model_client: any, kwargs: any) => {\n const history = kwargs?.history;\n const generationConfig = kwargs?.generationConfig;\n const lastMessage =\n history.length > 0 ? history[history.length - 1]?.parts : \"\";\n const chat = model_client.chats.create({\n model: kwargs?.model,\n history: history.slice(0, -1) ?? [],\n config: generationConfig,\n });\n\n if (kwargs?.stream)\n return await chat.sendMessageStream({ message: lastMessage });\n return await chat.sendMessage({ message: lastMessage });\n};\n\nconst googleCompletionsRequest = async (\n model_client: any,\n { stream, ...kwargs }: any\n) => {\n if (stream) return await model_client.generateContentStream({ ...kwargs });\n return await model_client.generateContent({ ...kwargs });\n};\n\nconst MAP_TYPE_TO_GOOGLE_FUNCTION = {\n chat: googleChatRequest,\n completion: googleCompletionsRequest,\n};\n\nconst googleRequest = async (\n promptBlueprint: GetPromptTemplateResponse,\n kwargs: any\n) => {\n const { GoogleGenAI } = await import(\"@google/genai\");\n\n const geminiAPI = process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY;\n const project =\n process.env.VERTEX_AI_PROJECT_ID ||\n process.env.GOOGLE_PROJECT_ID ||\n process.env.GOOGLE_CLOUD_PROJECT;\n const location =\n process.env.VERTEX_AI_PROJECT_LOCATION ||\n process.env.GOOGLE_PROJECT_LOCATION ||\n process.env.GOOGLE_CLOUD_PROJECT_LOCATION;\n const googleAuthOptions = {\n keyFilename: process.env.GOOGLE_APPLICATION_CREDENTIALS,\n projectId: project,\n scopes: [\"https://www.googleapis.com/auth/cloud-platform\"],\n };\n\n const genAI = geminiAPI\n ? new GoogleGenAI({ apiKey: geminiAPI })\n : new GoogleGenAI({\n vertexai: true,\n project: project,\n location: location,\n googleAuthOptions,\n });\n const requestToMake =\n MAP_TYPE_TO_GOOGLE_FUNCTION[promptBlueprint.prompt_template.type];\n\n return await requestToMake(genAI, kwargs);\n};\n\nconst snakeToCamel = (str: string): string =>\n str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n\nconst convertKeysToCamelCase = <T>(\n obj: T,\n ignoreValuesWithKeys: Set<string> = new Set()\n): T => {\n if (!obj || typeof obj !== \"object\") return obj;\n if (Array.isArray(obj))\n return obj.map((item) =>\n convertKeysToCamelCase(item, ignoreValuesWithKeys)\n ) as T;\n\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => {\n if (ignoreValuesWithKeys.has(key)) {\n return [snakeToCamel(key), value];\n }\n return [\n snakeToCamel(key),\n convertKeysToCamelCase(value, ignoreValuesWithKeys),\n ];\n })\n ) as T;\n};\n\nconst configureProviderSettings = (\n promptBlueprint: any,\n customProvider: any,\n modelParameterOverrides: any = {},\n stream: boolean = false\n) => {\n const provider_type =\n customProvider?.client ?? promptBlueprint.metadata?.model?.provider;\n const api_type = promptBlueprint.metadata?.model?.api_type;\n\n if (!provider_type) {\n throw new Error(\n \"Provider type not found in prompt blueprint or custom provider\"\n );\n }\n\n let kwargs = {\n ...(promptBlueprint.llm_kwargs || {}),\n stream,\n };\n\n if (\n [\"google\", \"vertexai\"].includes(provider_type) &&\n promptBlueprint.metadata?.model?.name.startsWith(\"gemini\")\n )\n kwargs = convertKeysToCamelCase(\n kwargs,\n new Set([\"function_declarations\", \"properties\"])\n );\n\n const providerConfig = {\n baseURL: customProvider?.base_url ?? promptBlueprint.provider_base_url?.url,\n apiKey: customProvider?.api_key,\n };\n\n Object.entries(providerConfig).forEach(([key, value]) => {\n if (value !== undefined) {\n kwargs[key] = value;\n }\n });\n\n if (stream && STREAMING_PROVIDERS_WITH_USAGE.includes(provider_type as any) && api_type === \"chat-completions\") {\n kwargs.stream_options = { include_usage: true };\n }\n\n return { provider_type, kwargs };\n};\n\nconst getProviderConfig = (provider_type: string, promptTemplate: any) => {\n const providerMap =\n MAP_PROVIDER_TO_FUNCTION_NAME[\n provider_type as keyof typeof MAP_PROVIDER_TO_FUNCTION_NAME\n ];\n\n if (!providerMap) {\n throw new Error(`Unsupported provider type: ${provider_type}`);\n }\n\n const templateType = promptTemplate.type as keyof typeof providerMap;\n const config = providerMap[templateType];\n\n if (!config) {\n throw new Error(\n `Unsupported template type '${promptTemplate.type}' for provider '${provider_type}'`\n );\n }\n\n return config;\n};\n\nconst vertexaiRequest = async (\n promptBlueprint: GetPromptTemplateResponse,\n kwargs: any\n) => {\n const model = promptBlueprint.metadata?.model;\n if (!model) throw new Error(\"Model metadata not found in prompt blueprint\");\n if (model.name.startsWith(\"gemini\"))\n return googleRequest(promptBlueprint, kwargs);\n if (model.name.startsWith(\"claude\")) {\n const { AnthropicVertex } = await import(\"@anthropic-ai/vertex-sdk\");\n const client = new AnthropicVertex({ baseURL: kwargs.baseURL });\n if (promptBlueprint.prompt_template.type === \"chat\")\n return anthropicChatRequest(client, kwargs);\n throw new Error(\n `Unsupported prompt template type '${promptBlueprint.prompt_template.type}' for Anthropic Vertex AI`\n );\n }\n throw new Error(\n `Unsupported model name '${model.name}' for Vertex AI request`\n );\n};\n\nconst amazonBedrockRequest = async (\n promptBlueprint: GetPromptTemplateResponse,\n kwargs: any\n) => {\n const { BedrockRuntimeClient, ConverseCommand, ConverseStreamCommand } =\n await import(\"@aws-sdk/client-bedrock-runtime\");\n const client = new BedrockRuntimeClient({\n credentials: {\n accessKeyId: kwargs?.aws_access_key || process.env.AWS_ACCESS_KEY_ID,\n secretAccessKey:\n kwargs?.aws_secret_key || process.env.AWS_SECRET_ACCESS_KEY,\n sessionToken: kwargs?.aws_session_token || process.env.AWS_SESSION_TOKEN,\n },\n region:\n kwargs?.aws_region ||\n process.env.AWS_REGION ||\n process.env.AWS_DEFAULT_REGION ||\n \"us-east-1\",\n });\n\n if (kwargs?.stream) {\n delete kwargs.stream;\n const command = new ConverseStreamCommand({\n ...kwargs,\n });\n return await client.send(command);\n } else {\n delete kwargs?.stream;\n const command = new ConverseCommand({\n ...kwargs,\n });\n return await client.send(command);\n }\n};\n\nconst anthropicBedrockRequest = async (\n promptBlueprint: GetPromptTemplateResponse,\n kwargs: any\n) => {\n const { AnthropicBedrock } = await import(\"@anthropic-ai/bedrock-sdk\");\n const client = new AnthropicBedrock({\n awsAccessKey: kwargs.aws_access_key,\n awsSecretKey: kwargs.aws_secret_key,\n awsRegion: kwargs.aws_region,\n awsSessionToken: kwargs.aws_session_token,\n baseURL: kwargs.base_url,\n });\n\n const requestToMake =\n MAP_TYPE_TO_ANTHROPIC_FUNCTION[promptBlueprint.prompt_template.type];\n return requestToMake(client, kwargs);\n};\n\nconst mistralRequest = async (\n promptBlueprint: GetPromptTemplateResponse,\n kwargs: any\n) => {\n const { Mistral } = await import(\"@mistralai/mistralai\");\n const client = new Mistral({ apiKey: process.env.MISTRAL_API_KEY });\n kwargs = convertKeysToCamelCase(kwargs, new Set());\n if (kwargs?.stream) {\n delete kwargs.stream;\n return await client.chat.stream(kwargs);\n }\n delete kwargs.stream;\n return await client.chat.complete(kwargs);\n};\n\nexport const readEnv = (env: string): string | undefined => {\n if (typeof (globalThis as any).process !== \"undefined\")\n return (globalThis as any).process.env?.[env]?.trim() ?? undefined;\n\n if (typeof (globalThis as any).Deno !== \"undefined\")\n return (globalThis as any).Deno.env?.get?.(env)?.trim();\n return undefined;\n};\n\nexport const requirePromptLayerApiKey = (apiKey?: string): string => {\n if (apiKey !== undefined) {\n const explicitApiKey = apiKey.trim();\n if (!explicitApiKey) {\n throw new Error(\n \"PromptLayer API key not provided. Please set PROMPTLAYER_API_KEY or pass apiKey.\"\n );\n }\n return explicitApiKey;\n }\n\n const envApiKey = readEnv(\"PROMPTLAYER_API_KEY\");\n if (!envApiKey) {\n throw new Error(\n \"PromptLayer API key not provided. Please set PROMPTLAYER_API_KEY or pass apiKey.\"\n );\n }\n\n return envApiKey;\n};\n\nexport {\n amazonBedrockRequest,\n anthropicBedrockRequest,\n anthropicRequest,\n azureOpenAIRequest,\n configureProviderSettings,\n getAllPromptTemplates,\n getPromptTemplate,\n getProviderConfig,\n googleRequest,\n mistralRequest,\n openaiRequest,\n promptlayerApiHandler,\n promptLayerApiRequest,\n promptLayerCreateGroup,\n promptLayerTrackGroup,\n promptLayerTrackMetadata,\n promptLayerTrackPrompt,\n promptLayerTrackScore,\n publishPromptTemplate,\n trackRequest,\n utilLogRequest,\n vertexaiRequest,\n};\n","import { SDK_VERSION } from \"@/utils/utils\";\nimport type {\n Span as AgentsSpan,\n SpanData,\n Trace as AgentsTrace,\n} from \"@openai/agents\";\nimport type { AttributeValue } from \"@/integrations/openai-agents/types\";\n\nconst SPAN_KIND_INTERNAL = 1;\nconst SPAN_KIND_CLIENT = 3;\n\ntype AttributeMap = Record<string, AttributeValue>;\ntype NormalizedMessage = Record<string, AttributeValue>;\ntype NormalizedToolCall = {\n id: string;\n type: \"tool_call\";\n name: string;\n arguments: AttributeValue;\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n};\n\nconst isScalar = (value: unknown): value is string | number | boolean => {\n return (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n );\n};\n\nconst sanitizeKey = (key: string): string => {\n return key.replace(/[^a-zA-Z0-9_.-]/g, \"_\");\n};\n\nconst toJsonable = (value: unknown): AttributeValue => {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => toJsonable(item));\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, toJsonable(item)])\n );\n }\n\n return String(value);\n};\n\nconst stableStringify = (value: unknown): string => {\n const normalize = (input: unknown): unknown => {\n if (Array.isArray(input)) {\n return input.map((item) => normalize(item));\n }\n\n if (isPlainObject(input)) {\n return Object.keys(input)\n .sort()\n .reduce<Record<string, unknown>>((acc, key) => {\n acc[key] = normalize(input[key]);\n return acc;\n }, {});\n }\n\n return input;\n };\n\n return JSON.stringify(normalize(toJsonable(value)));\n};\n\nconst setStringAttr = (attrs: AttributeMap, key: string, value: unknown) => {\n if (value !== undefined && value !== null && value !== \"\") {\n attrs[key] = String(value);\n }\n};\n\nconst setNumberAttr = (attrs: AttributeMap, key: string, value: unknown) => {\n if (value !== undefined && value !== null && value !== \"\") {\n const numericValue = Number(value);\n if (!Number.isNaN(numericValue)) {\n attrs[key] = numericValue;\n }\n }\n};\n\nconst setJsonAttr = (\n attrs: AttributeMap,\n key: string,\n value: unknown,\n includeRawPayloads: boolean\n) => {\n if (includeRawPayloads && value !== undefined && value !== null) {\n attrs[key] = stableStringify(value);\n }\n};\n\nconst flattenIndexedMessages = (\n prefix: string,\n messages: NormalizedMessage[],\n attrs: AttributeMap\n) => {\n messages.forEach((message, index) => {\n Object.entries(message).forEach(([key, value]) => {\n attrs[`${prefix}.${index}.${key}`] = isScalar(value)\n ? value\n : stableStringify(value);\n });\n });\n};\n\nconst normalizeToolCalls = (toolCalls: unknown): NormalizedToolCall[] => {\n if (!Array.isArray(toolCalls)) {\n return [];\n }\n\n return toolCalls\n .map((call) => {\n if (!isPlainObject(call)) {\n return null;\n }\n\n const functionData = isPlainObject(call.function) ? call.function : null;\n const name = functionData?.name ?? call.name ?? \"tool\";\n let argumentsValue =\n functionData?.arguments ?? call.arguments ?? {};\n\n if (typeof argumentsValue === \"string\") {\n try {\n argumentsValue = JSON.parse(argumentsValue);\n } catch {\n argumentsValue = argumentsValue;\n }\n }\n\n return {\n id: String(call.id ?? \"\"),\n type: \"tool_call\",\n name: String(name),\n arguments: toJsonable(argumentsValue),\n };\n })\n .filter((call): call is NormalizedToolCall => call !== null);\n};\n\nconst getCallId = (item: Record<string, unknown>): string | undefined => {\n const value = item.call_id ?? item.callId ?? item.id;\n return value !== undefined && value !== null ? String(value) : undefined;\n};\n\nconst normalizeToolOutputContent = (output: unknown): string | undefined => {\n if (output === undefined || output === null) {\n return undefined;\n }\n\n if (typeof output === \"string\") {\n return output;\n }\n\n if (Array.isArray(output)) {\n const textContent = extractTextContent(output);\n return textContent ?? stableStringify(output);\n }\n\n if (isPlainObject(output)) {\n const textContent = extractTextContent([output]);\n return textContent ?? stableStringify(output);\n }\n\n const textContent = extractTextContent(output);\n if (textContent !== undefined) {\n return textContent;\n }\n\n return stableStringify(output);\n};\n\nconst normalizeToolCallMessage = (\n item: Record<string, unknown>\n): NormalizedMessage | null => {\n let argumentsValue = item.arguments ?? {};\n if (typeof argumentsValue === \"string\") {\n try {\n argumentsValue = JSON.parse(argumentsValue);\n } catch {\n argumentsValue = argumentsValue;\n }\n }\n\n return {\n role: \"assistant\",\n tool_calls: [\n {\n id: getCallId(item) ?? \"\",\n type: \"tool_call\",\n name: String(item.name ?? \"tool\"),\n arguments: toJsonable(argumentsValue),\n },\n ],\n };\n};\n\nconst normalizeToolResultMessage = (\n item: Record<string, unknown>,\n outputOverride?: unknown\n): NormalizedMessage | null => {\n const toolCallId = getCallId(item);\n const content = normalizeToolOutputContent(\n outputOverride ?? item.output ?? item.content\n );\n\n if (!toolCallId && !content) {\n return null;\n }\n\n const message: NormalizedMessage = {\n role: \"tool\",\n };\n\n if (toolCallId) {\n message.tool_call_id = toolCallId;\n }\n\n if (content !== undefined) {\n message.content = content;\n }\n\n return message;\n};\n\nfunction extractTextContent(content: unknown): string | undefined {\n if (content === undefined || content === null) {\n return undefined;\n }\n\n if (typeof content === \"string\") {\n return content;\n }\n\n if (Array.isArray(content)) {\n const textParts = content\n .map((part) => {\n if (!isPlainObject(part)) {\n return null;\n }\n\n const partType = part.type;\n if (\n partType === \"text\" ||\n partType === \"input_text\" ||\n partType === \"output_text\"\n ) {\n const text = part.text ?? part.content;\n return text !== undefined && text !== null ? String(text) : null;\n }\n\n return null;\n })\n .filter((part): part is string => part !== null);\n\n return textParts.length > 0 ? textParts.join(\"\\n\") : undefined;\n }\n\n return String(content);\n}\n\nexport const normalizeMessages = (items: unknown): NormalizedMessage[] => {\n if (!Array.isArray(items)) {\n return [];\n }\n\n return items\n .map((item) => {\n if (!isPlainObject(item)) {\n return null;\n }\n\n const normalized: NormalizedMessage = {};\n if (item.role !== undefined) {\n normalized.role = String(item.role);\n }\n\n const content = extractTextContent(item.content);\n if (content) {\n normalized.content = content;\n }\n\n const toolCalls = normalizeToolCalls(item.tool_calls);\n if (toolCalls.length > 0) {\n normalized.tool_calls = toolCalls;\n }\n\n if (item.tool_call_id) {\n normalized.tool_call_id = String(item.tool_call_id);\n }\n\n return Object.keys(normalized).length > 0 ? normalized : null;\n })\n .filter((message): message is NormalizedMessage => message !== null);\n};\n\nconst normalizeResponseMessage = (\n item: Record<string, unknown>\n): NormalizedMessage | null => {\n const message: NormalizedMessage = {};\n const role = item.role;\n const content = extractTextContent(item.content);\n const toolCalls = normalizeToolCalls(item.tool_calls);\n\n if (role !== undefined && role !== null) {\n message.role = String(role);\n } else if (content || toolCalls.length > 0) {\n message.role = \"assistant\";\n }\n\n if (content) {\n message.content = content;\n }\n\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n\n if (item.tool_call_id) {\n message.tool_call_id = String(item.tool_call_id);\n }\n\n return Object.keys(message).length > 0 ? message : null;\n};\n\nconst RAW_TOOL_CALL_ITEM_TYPES = new Set([\n \"function_call\",\n \"computer_call\",\n \"shell_call\",\n \"apply_patch_call\",\n \"custom_tool_call\",\n \"mcp_call\",\n]);\n\nconst RAW_TOOL_RESULT_ITEM_TYPES = new Set([\n \"function_call_output\",\n \"function_call_result\",\n \"computer_call_output\",\n \"computer_call_result\",\n \"shell_call_output\",\n \"apply_patch_call_output\",\n \"custom_tool_call_output\",\n]);\n\nexport const normalizeResponseItems = (items: unknown): NormalizedMessage[] => {\n if (typeof items === \"string\") {\n return [{ role: \"user\", content: items }];\n }\n\n if (!Array.isArray(items)) {\n return [];\n }\n\n return items\n .flatMap((item) => {\n if (!isPlainObject(item)) {\n return [];\n }\n\n if (item.type === \"message_output_item\" && isPlainObject(item.rawItem)) {\n const message = normalizeResponseMessage(item.rawItem);\n return message ? [message] : [];\n }\n\n if (item.type === \"tool_call_item\" && isPlainObject(item.rawItem)) {\n const message = normalizeToolCallMessage(item.rawItem);\n return message ? [message] : [];\n }\n\n if (item.type === \"tool_call_output_item\" && isPlainObject(item.rawItem)) {\n const message = normalizeToolResultMessage(item.rawItem, item.output);\n return message ? [message] : [];\n }\n\n if (typeof item.type === \"string\" && RAW_TOOL_CALL_ITEM_TYPES.has(item.type)) {\n const message = normalizeToolCallMessage(item);\n return message ? [message] : [];\n }\n\n if (\n typeof item.type === \"string\" &&\n RAW_TOOL_RESULT_ITEM_TYPES.has(item.type)\n ) {\n const message = normalizeToolResultMessage(item);\n return message ? [message] : [];\n }\n\n const message = normalizeResponseMessage(item);\n return message ? [message] : [];\n })\n .filter((message): message is NormalizedMessage => message !== null);\n};\n\nconst applyUsageAttributes = (attrs: AttributeMap, usage: unknown) => {\n if (!isPlainObject(usage)) {\n return;\n }\n\n setNumberAttr(\n attrs,\n \"gen_ai.usage.input_tokens\",\n usage.input_tokens ?? usage.prompt_tokens\n );\n setNumberAttr(\n attrs,\n \"gen_ai.usage.output_tokens\",\n usage.output_tokens ?? usage.completion_tokens\n );\n};\n\nconst generationAttributes = (\n spanData: Extract<SpanData, { type: \"generation\" }>,\n includeRawPayloads: boolean\n): AttributeMap => {\n const attrs: AttributeMap = {\n \"gen_ai.provider.name\": \"openai.responses\",\n };\n\n setStringAttr(attrs, \"gen_ai.request.model\", spanData.model);\n applyUsageAttributes(attrs, spanData.usage);\n flattenIndexedMessages(\"gen_ai.prompt\", normalizeMessages(spanData.input), attrs);\n flattenIndexedMessages(\n \"gen_ai.completion\",\n normalizeMessages(spanData.output),\n attrs\n );\n setJsonAttr(\n attrs,\n \"openai_agents.model_config_json\",\n spanData.model_config,\n includeRawPayloads\n );\n setJsonAttr(\n attrs,\n \"openai_agents.generation.raw_input_json\",\n spanData.input,\n includeRawPayloads\n );\n setJsonAttr(\n attrs,\n \"openai_agents.generation.raw_output_json\",\n spanData.output,\n includeRawPayloads\n );\n\n return attrs;\n};\n\nconst responseAttributes = (\n spanData: Extract<SpanData, { type: \"response\" }>,\n includeRawPayloads: boolean\n): AttributeMap => {\n const attrs: AttributeMap = {\n \"gen_ai.provider.name\": \"openai.responses\",\n };\n const responseObject = isPlainObject(spanData._response) ? spanData._response : {};\n const usage =\n isPlainObject(responseObject.usage) ? responseObject.usage : undefined;\n\n setStringAttr(\n attrs,\n \"gen_ai.request.model\",\n responseObject.model\n );\n setStringAttr(\n attrs,\n \"gen_ai.response.model\",\n responseObject.model\n );\n setStringAttr(\n attrs,\n \"gen_ai.response.id\",\n spanData.response_id ?? responseObject.id ?? responseObject.response_id\n );\n applyUsageAttributes(attrs, usage);\n flattenIndexedMessages(\n \"gen_ai.prompt\",\n normalizeResponseItems(spanData._input ?? responseObject.input),\n attrs\n );\n flattenIndexedMessages(\n \"gen_ai.completion\",\n normalizeResponseItems(responseObject.output),\n attrs\n );\n setJsonAttr(\n attrs,\n \"openai_agents.response.raw_json\",\n responseObject,\n includeRawPayloads\n );\n setStringAttr(\n attrs,\n \"openai_agents.response.object\",\n responseObject.object\n );\n\n return attrs;\n};\n\nconst functionAttributes = (\n spanData: Extract<SpanData, { type: \"function\" }>,\n includeRawPayloads: boolean\n): AttributeMap => {\n const attrs: AttributeMap = {\n node_type: \"CODE_EXECUTION\",\n tool_name: spanData.name,\n \"openai_agents.function.name\": spanData.name,\n };\n\n setStringAttr(attrs, \"function_input\", spanData.input);\n setStringAttr(attrs, \"function_output\", spanData.output);\n setStringAttr(attrs, \"openai_agents.function.input\", spanData.input);\n setStringAttr(attrs, \"openai_agents.function.output\", spanData.output);\n setJsonAttr(\n attrs,\n \"openai_agents.function.mcp_data_json\",\n spanData.mcp_data,\n includeRawPayloads\n );\n\n return attrs;\n};\n\nconst agentAttributes = (\n spanData: Extract<SpanData, { type: \"agent\" }>,\n includeRawPayloads: boolean\n): AttributeMap => {\n const attrs: AttributeMap = {\n \"openai_agents.agent.name\": spanData.name,\n };\n\n setStringAttr(attrs, \"openai_agents.agent.output_type\", spanData.output_type);\n setJsonAttr(\n attrs,\n \"openai_agents.agent.handoffs_json\",\n spanData.handoffs,\n includeRawPayloads\n );\n setJsonAttr(\n attrs,\n \"openai_agents.agent.tools_json\",\n spanData.tools,\n includeRawPayloads\n );\n\n return attrs;\n};\n\nconst handoffAttributes = (\n spanData: Extract<SpanData, { type: \"handoff\" }>\n): AttributeMap => {\n const attrs: AttributeMap = {};\n setStringAttr(attrs, \"openai_agents.handoff.from_agent\", spanData.from_agent);\n setStringAttr(attrs, \"openai_agents.handoff.to_agent\", spanData.to_agent);\n return attrs;\n};\n\nconst guardrailAttributes = (\n spanData: Extract<SpanData, { type: \"guardrail\" }>\n): AttributeMap => {\n return {\n \"openai_agents.guardrail.name\": spanData.name,\n \"openai_agents.guardrail.triggered\": spanData.triggered,\n };\n};\n\nconst customAttributes = (\n spanData: Extract<SpanData, { type: \"custom\" }>,\n includeRawPayloads: boolean\n): AttributeMap => {\n const attrs: AttributeMap = {\n \"openai_agents.custom.name\": spanData.name,\n };\n setJsonAttr(\n attrs,\n \"openai_agents.custom.data_json\",\n spanData.data,\n includeRawPayloads\n );\n return attrs;\n};\n\nconst rawSpanDataAttributes = (\n spanData: SpanData,\n includeRawPayloads: boolean\n): AttributeMap => {\n if (!includeRawPayloads) {\n return {};\n }\n\n return {\n \"openai_agents.raw_json\": stableStringify(spanData),\n };\n};\n\nexport const telemetrySourceVersion = (): string => {\n return SDK_VERSION;\n};\n\nexport const spanKindFor = (span: Pick<AgentsSpan<any>, \"spanData\">): number => {\n return span.spanData.type === \"generation\" || span.spanData.type === \"response\"\n ? SPAN_KIND_CLIENT\n : SPAN_KIND_INTERNAL;\n};\n\nexport const spanNameFor = (span: Pick<AgentsSpan<any>, \"spanData\">): string => {\n switch (span.spanData.type) {\n case \"function\":\n return `Function: ${span.spanData.name}`;\n case \"agent\":\n return `Agent: ${span.spanData.name}`;\n case \"guardrail\":\n return `Guardrail: ${span.spanData.name}`;\n case \"custom\":\n return String(span.spanData.name);\n default:\n return span.spanData.type\n .split(\"_\")\n .map((part: string) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n }\n};\n\nexport const baseTraceAttributes = (\n trace: Pick<AgentsTrace, \"traceId\" | \"name\" | \"groupId\" | \"metadata\">,\n includeRawPayloads: boolean\n): AttributeMap => {\n const attrs: AttributeMap = {\n \"promptlayer.telemetry.source\": \"openai-agents-js\",\n \"promptlayer.telemetry.source_version\": telemetrySourceVersion(),\n \"openai_agents.trace_id_original\": trace.traceId,\n \"openai_agents.workflow_name\": trace.name,\n };\n\n if (trace.groupId) {\n attrs[\"openai_agents.group_id\"] = trace.groupId;\n }\n\n if (isPlainObject(trace.metadata)) {\n Object.entries(trace.metadata).forEach(([key, value]) => {\n if (isScalar(value)) {\n attrs[`openai_agents.metadata.${sanitizeKey(key)}`] = value;\n }\n });\n setJsonAttr(\n attrs,\n \"openai_agents.metadata_json\",\n trace.metadata,\n includeRawPayloads\n );\n }\n\n return attrs;\n};\n\nexport const baseSpanAttributes = (\n span: Pick<AgentsSpan<any>, \"spanId\" | \"parentId\" | \"spanData\">\n): AttributeMap => {\n const attrs: AttributeMap = {\n \"promptlayer.telemetry.source\": \"openai-agents-js\",\n \"promptlayer.telemetry.source_version\": telemetrySourceVersion(),\n \"openai_agents.span_id_original\": span.spanId,\n \"openai_agents.span_type\": span.spanData.type,\n };\n\n if (span.parentId) {\n attrs[\"openai_agents.parent_id_original\"] = span.parentId;\n }\n\n return attrs;\n};\n\nexport const spanDataAttributes = (\n spanData: SpanData,\n includeRawPayloads: boolean\n): AttributeMap => {\n switch (spanData.type) {\n case \"generation\":\n return generationAttributes(spanData, includeRawPayloads);\n case \"response\":\n return responseAttributes(spanData, includeRawPayloads);\n case \"function\":\n return functionAttributes(spanData, includeRawPayloads);\n case \"agent\":\n return agentAttributes(spanData, includeRawPayloads);\n case \"handoff\":\n return handoffAttributes(spanData);\n case \"guardrail\":\n return guardrailAttributes(spanData);\n case \"custom\":\n return customAttributes(spanData, includeRawPayloads);\n default:\n return rawSpanDataAttributes(spanData, includeRawPayloads);\n }\n};\n\nexport const OTLP_STATUS_CODE_UNSET = 0;\nexport const OTLP_STATUS_CODE_OK = 1;\nexport const OTLP_STATUS_CODE_ERROR = 2;\n","import { SDK_VERSION } from \"@/utils/utils\";\nimport type {\n AttributeValue,\n OtlpJsonPayload,\n OtlpSpanRecord,\n} from \"@/integrations/openai-agents/types\";\n\nconst toAnyValue = (value: AttributeValue): Record<string, unknown> => {\n if (typeof value === \"string\") {\n return { stringValue: value };\n }\n\n if (typeof value === \"boolean\") {\n return { boolValue: value };\n }\n\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) {\n return { intValue: String(value) };\n }\n return { doubleValue: value };\n }\n\n if (value === null) {\n return { stringValue: \"null\" };\n }\n\n if (Array.isArray(value)) {\n return {\n arrayValue: {\n values: value.map((item) => toAnyValue(item)),\n },\n };\n }\n\n return {\n kvlistValue: {\n values: Object.entries(value).map(([key, nestedValue]) => ({\n key,\n value: toAnyValue(nestedValue),\n })),\n },\n };\n};\n\nconst toKeyValues = (attributes: Record<string, AttributeValue>) => {\n return Object.entries(attributes).map(([key, value]) => ({\n key,\n value: toAnyValue(value),\n }));\n};\n\nexport interface BuildOtlpJsonPayloadOptions {\n serviceName?: string;\n scopeName?: string;\n scopeVersion?: string;\n}\n\nexport const buildOtlpJsonPayload = (\n spans: OtlpSpanRecord[],\n {\n serviceName = \"promptlayer-openai-agents-js\",\n scopeName = \"promptlayer.integrations.openai_agents\",\n scopeVersion = SDK_VERSION,\n }: BuildOtlpJsonPayloadOptions = {}\n): OtlpJsonPayload => {\n return {\n resourceSpans: [\n {\n resource: {\n attributes: toKeyValues({\n \"service.name\": serviceName,\n }),\n },\n scopeSpans: [\n {\n scope: {\n name: scopeName,\n version: scopeVersion,\n },\n spans: spans.map((span) => {\n const payload: Record<string, unknown> = {\n traceId: span.traceId,\n spanId: span.spanId,\n name: span.name,\n kind: span.kind,\n startTimeUnixNano: span.startTimeUnixNano,\n endTimeUnixNano: span.endTimeUnixNano ?? span.startTimeUnixNano,\n attributes: toKeyValues(span.attributes),\n events: (span.events ?? []).map((event) => ({\n name: event.name,\n timeUnixNano: event.timeUnixNano,\n attributes: toKeyValues(event.attributes ?? {}),\n })),\n links: [],\n };\n\n if (span.parentSpanId) {\n payload.parentSpanId = span.parentSpanId;\n }\n\n if (span.traceState) {\n payload.traceState = span.traceState;\n }\n\n if (span.status) {\n payload.status = {\n code: span.status.code,\n ...(span.status.message ? { message: span.status.message } : {}),\n };\n }\n\n return payload;\n }),\n },\n ],\n },\n ],\n };\n};\n","import { createHash } from \"crypto\";\n\nconst TRACE_HEX_RE = /^[0-9a-f]{32}$/i;\n\nconst sha256Hex = (value: string): string => {\n return createHash(\"sha256\").update(value, \"utf8\").digest(\"hex\");\n};\n\nexport const mapTraceId = (originalTraceId: string): string => {\n const suffix = originalTraceId.startsWith(\"trace_\")\n ? originalTraceId.slice(\"trace_\".length)\n : originalTraceId;\n\n if (TRACE_HEX_RE.test(suffix)) {\n return suffix.toLowerCase();\n }\n\n return sha256Hex(originalTraceId).slice(0, 32);\n};\n\nexport const mapSpanId = (originalSpanId: string): string => {\n return sha256Hex(originalSpanId).slice(0, 16);\n};\n\nexport const syntheticRootSpanId = (originalTraceId: string): string => {\n return sha256Hex(`${originalTraceId}:root`).slice(0, 16);\n};\n","const ISO_TIMESTAMP_RE =\n /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2})(?:\\.(\\d{1,9}))?(Z|[+-]\\d{2}:\\d{2})?$/;\n\nexport const nowUnixNano = (): string => {\n return (BigInt(Date.now()) * BigInt(1_000_000)).toString();\n};\n\nexport const isoToUnixNano = (\n timestamp: string | null | undefined\n): string | undefined => {\n if (!timestamp) {\n return undefined;\n }\n\n const match = ISO_TIMESTAMP_RE.exec(timestamp);\n if (!match) {\n const millis = Date.parse(timestamp);\n if (Number.isNaN(millis)) {\n return undefined;\n }\n return (BigInt(millis) * BigInt(1_000_000)).toString();\n }\n\n const [, base, fraction = \"\", timezone = \"Z\"] = match;\n const millis = Date.parse(`${base}${timezone}`);\n if (Number.isNaN(millis)) {\n return undefined;\n }\n\n const fractionalNanos = BigInt(\n (fraction + \"000000000\").slice(0, 9)\n );\n return (BigInt(millis) * BigInt(1_000_000) + fractionalNanos).toString();\n};\n\nexport const minUnixNano = (...values: Array<string | undefined>): string => {\n const filtered = values.filter((value): value is string => value !== undefined);\n if (filtered.length === 0) {\n return nowUnixNano();\n }\n\n return filtered.reduce((min, current) =>\n BigInt(current) < BigInt(min) ? current : min\n );\n};\n\nexport const maxUnixNano = (...values: Array<string | undefined>): string => {\n const filtered = values.filter((value): value is string => value !== undefined);\n if (filtered.length === 0) {\n return nowUnixNano();\n }\n\n return filtered.reduce((max, current) =>\n BigInt(current) > BigInt(max) ? current : max\n );\n};\n","export const trimTrailingSlashes = (value: string): string => {\n let end = value.length;\n\n while (end > 0 && value.charCodeAt(end - 1) === 47) {\n end -= 1;\n }\n\n return value.slice(0, end);\n};\n","import {\n OTLP_STATUS_CODE_ERROR,\n OTLP_STATUS_CODE_OK,\n OTLP_STATUS_CODE_UNSET,\n baseSpanAttributes,\n baseTraceAttributes,\n spanDataAttributes,\n spanKindFor,\n spanNameFor,\n} from \"@/integrations/openai-agents/mapping\";\nimport { buildOtlpJsonPayload } from \"@/integrations/openai-agents/otlp-json\";\nimport { mapSpanId, mapTraceId, syntheticRootSpanId } from \"@/integrations/openai-agents/ids\";\nimport {\n isoToUnixNano,\n maxUnixNano,\n minUnixNano,\n nowUnixNano,\n} from \"@/integrations/openai-agents/time\";\nimport { trimTrailingSlashes } from \"@/integrations/openai-agents/url\";\nimport type {\n OtlpSpanRecord,\n OtlpStatusRecord,\n} from \"@/integrations/openai-agents/types\";\nimport { fetchWithRetry, getCommonHeaders } from \"@/utils/utils\";\nimport type {\n Span as AgentsSpan,\n Trace as AgentsTrace,\n TracingProcessor,\n} from \"@openai/agents\";\n\nconst TRACEPARENT_RE = /^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/i;\nconst ZERO_TRACE_ID = \"0\".repeat(32);\nconst ZERO_SPAN_ID = \"0\".repeat(16);\n\ninterface UpstreamTraceContext {\n traceId: string;\n parentSpanId: string;\n traceState?: string;\n}\n\ntype TraceMetadataRecord = Record<string, unknown>;\n\ninterface TraceState {\n rootSpan: OtlpSpanRecord;\n spans: Map<string, OtlpSpanRecord>;\n}\n\nexport interface PromptLayerOpenAIAgentsProcessorOptions {\n apiKey: string;\n baseURL: string;\n includeRawPayloads?: boolean;\n}\n\nexport class PromptLayerOpenAIAgentsProcessor implements TracingProcessor {\n private readonly apiKey: string;\n private readonly baseURL: string;\n private readonly includeRawPayloads: boolean;\n private readonly traceStates = new Map<string, TraceState>();\n private readonly completedTraceQueue = new Map<\n string,\n ReturnType<typeof buildOtlpJsonPayload>\n >();\n private readonly pendingExports = new Map<string, Promise<void>>();\n\n constructor({\n apiKey,\n baseURL,\n includeRawPayloads = true,\n }: PromptLayerOpenAIAgentsProcessorOptions) {\n this.apiKey = apiKey;\n this.baseURL = trimTrailingSlashes(baseURL);\n this.includeRawPayloads = includeRawPayloads;\n }\n\n start(): void {}\n\n async onTraceStart(trace: AgentsTrace): Promise<void> {\n if (this.traceStates.has(trace.traceId)) {\n return;\n }\n\n const upstreamContext = this.resolveUpstreamTraceContext(trace.metadata);\n const traceId = upstreamContext?.traceId ?? mapTraceId(trace.traceId);\n this.traceStates.set(trace.traceId, {\n rootSpan: {\n traceId,\n spanId: syntheticRootSpanId(trace.traceId),\n name: trace.name || \"OpenAI Agents Trace\",\n kind: 1,\n startTimeUnixNano: nowUnixNano(),\n parentSpanId: upstreamContext?.parentSpanId,\n traceState: upstreamContext?.traceState,\n attributes: baseTraceAttributes(trace, this.includeRawPayloads),\n status: { code: OTLP_STATUS_CODE_UNSET },\n events: [],\n },\n spans: new Map(),\n });\n }\n\n async onTraceEnd(trace: AgentsTrace): Promise<void> {\n const state = this.traceStates.get(trace.traceId);\n if (!state) {\n return;\n }\n\n const childSpans = Array.from(state.spans.values()).sort((left, right) => {\n return BigInt(left.startTimeUnixNano) < BigInt(right.startTimeUnixNano)\n ? -1\n : 1;\n });\n const childStarts = childSpans.map((span) => span.startTimeUnixNano);\n const childEnds = childSpans.map(\n (span) => span.endTimeUnixNano ?? span.startTimeUnixNano\n );\n const rootEnd = maxUnixNano(nowUnixNano(), ...childEnds);\n\n state.rootSpan.startTimeUnixNano = minUnixNano(\n state.rootSpan.startTimeUnixNano,\n ...childStarts\n );\n state.rootSpan.endTimeUnixNano = rootEnd;\n\n const payload = buildOtlpJsonPayload([state.rootSpan, ...childSpans]);\n this.traceStates.delete(trace.traceId);\n this.completedTraceQueue.set(trace.traceId, payload);\n this.startExportForTrace(trace.traceId);\n }\n\n async onSpanStart(span: AgentsSpan<any>): Promise<void> {\n const state = this.ensureTraceStateForSpan(span);\n const existing = state.spans.get(span.spanId);\n const record = existing ?? this.createSpanRecord(span, state.rootSpan.spanId);\n\n record.traceId = state.rootSpan.traceId;\n record.traceState = state.rootSpan.traceState;\n record.name = spanNameFor(span);\n record.kind = spanKindFor(span);\n record.startTimeUnixNano = isoToUnixNano(span.startedAt) ?? record.startTimeUnixNano;\n record.parentSpanId = span.parentId\n ? mapSpanId(span.parentId)\n : state.rootSpan.spanId;\n record.attributes = {\n ...record.attributes,\n ...baseSpanAttributes(span),\n };\n\n state.spans.set(span.spanId, record);\n }\n\n async onSpanEnd(span: AgentsSpan<any>): Promise<void> {\n const state = this.ensureTraceStateForSpan(span);\n const record =\n state.spans.get(span.spanId) ??\n this.createSpanRecord(span, state.rootSpan.spanId);\n\n record.attributes = {\n ...record.attributes,\n ...spanDataAttributes(span.spanData, this.includeRawPayloads),\n };\n record.endTimeUnixNano =\n isoToUnixNano(span.endedAt) ?? record.endTimeUnixNano ?? nowUnixNano();\n record.status = this.statusForSpan(span);\n\n if (span.error) {\n record.events = [\n ...(record.events ?? []),\n {\n name: \"exception\",\n timeUnixNano: record.endTimeUnixNano,\n attributes: {\n \"exception.type\": \"OpenAIAgentsError\",\n \"exception.message\": span.error.message,\n \"openai_agents.error_json\": JSON.stringify(span.error),\n },\n },\n ];\n }\n\n state.spans.set(span.spanId, record);\n }\n\n async shutdown(): Promise<void> {\n await this.forceFlush();\n }\n\n async forceFlush(): Promise<void> {\n for (let pass = 0; pass < 2; pass += 1) {\n for (const traceId of this.completedTraceQueue.keys()) {\n this.startExportForTrace(traceId);\n }\n\n if (this.pendingExports.size === 0) {\n return;\n }\n\n await Promise.all(Array.from(this.pendingExports.values()));\n\n if (this.completedTraceQueue.size === 0) {\n return;\n }\n }\n }\n\n private traceLikeFromSpan(\n span: AgentsSpan<any>\n ): Pick<AgentsTrace, \"traceId\" | \"name\" | \"groupId\" | \"metadata\"> {\n const rawMetadata = this.asRecord(span.traceMetadata);\n const nestedMetadata = this.asRecord(rawMetadata?.metadata);\n\n return {\n traceId: span.traceId,\n name:\n this.readString(rawMetadata?.workflow_name) ??\n this.readString(rawMetadata?.workflowName) ??\n \"OpenAI Agents Trace\",\n groupId:\n this.readString(rawMetadata?.group_id) ??\n this.readString(rawMetadata?.groupId) ??\n null,\n metadata: nestedMetadata ?? rawMetadata ?? {},\n };\n }\n\n private ensureTraceStateForSpan(span: AgentsSpan<any>): TraceState {\n const existing = this.traceStates.get(span.traceId);\n if (existing) {\n return existing;\n }\n\n const traceLike = this.traceLikeFromSpan(span);\n\n const upstreamContext = this.resolveUpstreamTraceContext(traceLike.metadata);\n const traceId = upstreamContext?.traceId ?? mapTraceId(span.traceId);\n const state: TraceState = {\n rootSpan: {\n traceId,\n spanId: syntheticRootSpanId(span.traceId),\n name: traceLike.name,\n kind: 1,\n startTimeUnixNano: isoToUnixNano(span.startedAt) ?? nowUnixNano(),\n parentSpanId: upstreamContext?.parentSpanId,\n traceState: upstreamContext?.traceState,\n attributes: baseTraceAttributes(traceLike, this.includeRawPayloads),\n status: { code: OTLP_STATUS_CODE_UNSET },\n events: [],\n },\n spans: new Map(),\n };\n\n this.traceStates.set(span.traceId, state);\n return state;\n }\n\n private createSpanRecord(\n span: AgentsSpan<any>,\n rootSpanId: string\n ): OtlpSpanRecord {\n return {\n traceId:\n this.traceStates.get(span.traceId)?.rootSpan.traceId ?? mapTraceId(span.traceId),\n spanId: mapSpanId(span.spanId),\n parentSpanId: span.parentId ? mapSpanId(span.parentId) : rootSpanId,\n name: spanNameFor(span),\n kind: spanKindFor(span),\n startTimeUnixNano: isoToUnixNano(span.startedAt) ?? nowUnixNano(),\n traceState: this.traceStates.get(span.traceId)?.rootSpan.traceState,\n attributes: {\n ...baseSpanAttributes(span),\n },\n status: { code: OTLP_STATUS_CODE_UNSET },\n events: [],\n };\n }\n\n private statusForSpan(span: AgentsSpan<any>): OtlpStatusRecord {\n if (span.error) {\n return {\n code: OTLP_STATUS_CODE_ERROR,\n message: span.error.message,\n };\n }\n\n return {\n code: OTLP_STATUS_CODE_OK,\n };\n }\n\n private async exportPayload(payload: ReturnType<typeof buildOtlpJsonPayload>) {\n const response = await fetchWithRetry(`${this.baseURL}/v1/traces`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n \"X-PromptLayer-Integration\": \"openai-agents-js\",\n ...getCommonHeaders(),\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to export OpenAI Agents traces: ${response.status} ${response.statusText}`\n );\n }\n }\n\n private startExportForTrace(traceId: string): void {\n if (this.pendingExports.has(traceId)) {\n return;\n }\n\n const payload = this.completedTraceQueue.get(traceId);\n if (!payload) {\n return;\n }\n\n const exportPromise = this.exportPayload(payload)\n .then(() => {\n this.completedTraceQueue.delete(traceId);\n })\n .catch((error) => {\n console.error(\n `Failed to export OpenAI Agents trace '${traceId}'.`,\n error\n );\n })\n .finally(() => {\n this.pendingExports.delete(traceId);\n });\n\n this.pendingExports.set(traceId, exportPromise);\n }\n\n private resolveUpstreamTraceContext(\n metadata: AgentsTrace[\"metadata\"] | AgentsSpan<any>[\"traceMetadata\"]\n ): UpstreamTraceContext | null {\n const metadataRecord = this.asRecord(metadata);\n if (!metadataRecord) {\n return null;\n }\n\n const traceparent = metadataRecord.traceparent;\n if (typeof traceparent !== \"string\" || !traceparent.trim()) {\n return null;\n }\n\n const match = traceparent.trim().match(TRACEPARENT_RE);\n if (!match) {\n return null;\n }\n\n const [, version, traceId, parentSpanId] = match;\n const normalizedVersion = version.toLowerCase();\n const normalizedTraceId = traceId.toLowerCase();\n const normalizedParentSpanId = parentSpanId.toLowerCase();\n if (\n normalizedVersion === \"ff\" ||\n normalizedTraceId === ZERO_TRACE_ID ||\n normalizedParentSpanId === ZERO_SPAN_ID\n ) {\n return null;\n }\n\n const traceState =\n typeof metadataRecord.tracestate === \"string\" && metadataRecord.tracestate.trim()\n ? metadataRecord.tracestate.trim()\n : undefined;\n\n return {\n traceId: normalizedTraceId,\n parentSpanId: normalizedParentSpanId,\n traceState,\n };\n }\n\n private asRecord(value: unknown): TraceMetadataRecord | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n\n return value as TraceMetadataRecord;\n }\n\n private readString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n }\n}\n","import { PromptLayerOpenAIAgentsProcessor } from \"@/integrations/openai-agents/processor\";\nimport { trimTrailingSlashes } from \"@/integrations/openai-agents/url\";\nimport { readEnv, requirePromptLayerApiKey } from \"@/utils/utils\";\n\nexport interface InstrumentOpenAIAgentsOptions {\n apiKey?: string;\n baseURL?: string;\n exclusive?: boolean;\n includeRawPayloads?: boolean;\n}\n\nconst resolveBaseURL = (baseURL?: string): string => {\n return trimTrailingSlashes(\n baseURL ?? readEnv(\"PROMPTLAYER_BASE_URL\") ?? \"https://api.promptlayer.com\"\n );\n};\n\nexport const instrumentOpenAIAgents = async ({\n apiKey,\n baseURL,\n exclusive = true,\n includeRawPayloads = true,\n}: InstrumentOpenAIAgentsOptions = {}): Promise<PromptLayerOpenAIAgentsProcessor> => {\n const resolvedApiKey = requirePromptLayerApiKey(apiKey);\n\n const agentsModule: typeof import(\"@openai/agents\") = await import(\n \"@openai/agents\"\n );\n\n const processor = new PromptLayerOpenAIAgentsProcessor({\n apiKey: resolvedApiKey,\n baseURL: resolveBaseURL(baseURL),\n includeRawPayloads,\n });\n\n if (exclusive) {\n agentsModule.setTraceProcessors([processor]);\n } else {\n agentsModule.addTraceProcessor(processor);\n }\n\n return processor;\n};\n"],"mappings":"kiCAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,sCAAAE,EAAA,2BAAAC,KAAA,eAAAC,GAAAJ,ICoBA,IAAAK,GAAiB,mBACjBC,GAA2B,sBAE3BC,EAAmB,sBASZ,IAAMC,EAAc,QAGrBC,GAAiB,IAAc,CAnCrC,IAAAC,EAoCE,GAAI,OAAO,SAAY,eAAeA,EAAA,QAAQ,WAAR,MAAAA,EAAkB,MAAM,CAC5D,IAAMC,EAAQ,QAAQ,SAAS,KAAK,MAAM,GAAG,EAC7C,MAAO,GAAGA,EAAM,CAAC,CAAC,IAAIA,EAAM,CAAC,CAAC,EAChC,CACA,MAAO,SACT,EAEMC,GAAgBH,GAAe,EAC/BI,GAA0B,kBAAkBL,CAAW,UAAUI,EAAa,IAMvEE,EAAmB,KAA+B,CAC7D,aAAcD,GACd,gBAAiBL,CACnB,GAwIO,IAAMO,EAAiB,CAC5BC,EACAC,IACsBC,EAAA,sBACtB,SAAO,EAAAC,SACL,IAAYD,EAAA,sBACV,IAAME,EAAW,MAAM,MAAMJ,EAAOC,CAAI,EAExC,GAAKG,EAAS,QAAU,KAAOA,EAAS,OAAS,KAASA,EAAS,SAAW,IAC5E,MAAM,IAAI,MACR,iBAAiBA,EAAS,MAAM,IAAIA,EAAS,UAAU,EACzD,EAGF,OAAOA,CACT,GACA,CACE,QAAS,EACT,OAAQ,EACR,WAAY,IACZ,WAAY,KACZ,UAAW,GACX,gBAAkBC,GAAU,CAC1B,QAAQ,KACN,mCAAmCA,EAAM,aAAa,YAAYA,EAAM,WAAW,gBACrF,CACF,CACF,CACF,CACF,GAi9BO,IAAMC,EAAWC,GAAoC,CA3qC5D,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EA4qCE,GAAI,OAAQ,WAAmB,SAAY,YACzC,OAAQH,GAAAD,GAAAD,EAAA,WAAmB,QAAQ,MAA3B,YAAAA,EAAiCD,KAAjC,YAAAE,EAAuC,SAAvC,KAAAC,EAAiD,OAE3D,GAAI,OAAQ,WAAmB,MAAS,YACtC,OAAQG,GAAAD,GAAAD,EAAA,WAAmB,KAAK,MAAxB,YAAAA,EAA6B,MAA7B,YAAAC,EAAA,KAAAD,EAAmCJ,KAAnC,YAAAM,EAAyC,MAErD,EAEaC,EAA4BC,GAA4B,CACnE,GAAIA,IAAW,OAAW,CACxB,IAAMC,EAAiBD,EAAO,KAAK,EACnC,GAAI,CAACC,EACH,MAAM,IAAI,MACR,kFACF,EAEF,OAAOA,CACT,CAEA,IAAMC,EAAYX,EAAQ,qBAAqB,EAC/C,GAAI,CAACW,EACH,MAAM,IAAI,MACR,kFACF,EAGF,OAAOA,CACT,EC/rCA,IAAMC,GAAqB,EACrBC,GAAmB,EAWnBC,EAAiBC,GACd,OAAOA,GAAU,UAAYA,IAAU,MAAQ,CAAC,MAAM,QAAQA,CAAK,EAGtEC,GAAYD,GAEd,OAAOA,GAAU,UACjB,OAAOA,GAAU,UACjB,OAAOA,GAAU,UAIfE,GAAeC,GACZA,EAAI,QAAQ,mBAAoB,GAAG,EAGtCC,EAAcJ,GAEhBA,IAAU,MACV,OAAOA,GAAU,UACjB,OAAOA,GAAU,UACjB,OAAOA,GAAU,UAEVA,EAGL,MAAM,QAAQA,CAAK,EACdA,EAAM,IAAKK,GAASD,EAAWC,CAAI,CAAC,EAGzCN,EAAcC,CAAK,EACd,OAAO,YACZ,OAAO,QAAQA,CAAK,EAAE,IAAI,CAAC,CAACG,EAAKE,CAAI,IAAM,CAACF,EAAKC,EAAWC,CAAI,CAAC,CAAC,CACpE,EAGK,OAAOL,CAAK,EAGfM,EAAmBN,GAA2B,CAClD,IAAMO,EAAaC,GACb,MAAM,QAAQA,CAAK,EACdA,EAAM,IAAKH,GAASE,EAAUF,CAAI,CAAC,EAGxCN,EAAcS,CAAK,EACd,OAAO,KAAKA,CAAK,EACrB,KAAK,EACL,OAAgC,CAACC,EAAKN,KACrCM,EAAIN,CAAG,EAAII,EAAUC,EAAML,CAAG,CAAC,EACxBM,GACN,CAAC,CAAC,EAGFD,EAGT,OAAO,KAAK,UAAUD,EAAUH,EAAWJ,CAAK,CAAC,CAAC,CACpD,EAEMU,EAAgB,CAACC,EAAqBR,EAAaH,IAAmB,CAC/CA,GAAU,MAAQA,IAAU,KACrDW,EAAMR,CAAG,EAAI,OAAOH,CAAK,EAE7B,EAEMY,EAAgB,CAACD,EAAqBR,EAAaH,IAAmB,CAC1E,GAA2BA,GAAU,MAAQA,IAAU,GAAI,CACzD,IAAMa,EAAe,OAAOb,CAAK,EAC5B,OAAO,MAAMa,CAAY,IAC5BF,EAAMR,CAAG,EAAIU,EAEjB,CACF,EAEMC,EAAc,CAClBH,EACAR,EACAH,EACAe,IACG,CACCA,GAAsBf,IAAU,QAAaA,IAAU,OACzDW,EAAMR,CAAG,EAAIG,EAAgBN,CAAK,EAEtC,EAEMgB,EAAyB,CAC7BC,EACAC,EACAP,IACG,CACHO,EAAS,QAAQ,CAACC,EAASC,IAAU,CACnC,OAAO,QAAQD,CAAO,EAAE,QAAQ,CAAC,CAAChB,EAAKH,CAAK,IAAM,CAChDW,EAAM,GAAGM,CAAM,IAAIG,CAAK,IAAIjB,CAAG,EAAE,EAAIF,GAASD,CAAK,EAC/CA,EACAM,EAAgBN,CAAK,CAC3B,CAAC,CACH,CAAC,CACH,EAEMqB,GAAsBC,GACrB,MAAM,QAAQA,CAAS,EAIrBA,EACJ,IAAKC,GAAS,CA9HnB,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EA+HM,GAAI,CAAC7B,EAAcwB,CAAI,EACrB,OAAO,KAGT,IAAMM,EAAe9B,EAAcwB,EAAK,QAAQ,EAAIA,EAAK,SAAW,KAC9DO,GAAOL,GAAAD,EAAAK,GAAA,YAAAA,EAAc,OAAd,KAAAL,EAAsBD,EAAK,OAA3B,KAAAE,EAAmC,OAC5CM,GACFJ,GAAAD,EAAAG,GAAA,YAAAA,EAAc,YAAd,KAAAH,EAA2BH,EAAK,YAAhC,KAAAI,EAA6C,CAAC,EAEhD,GAAI,OAAOI,GAAmB,SAC5B,GAAI,CACFA,EAAiB,KAAK,MAAMA,CAAc,CAC5C,OAAQC,EAAA,CACND,EAAiBA,CACnB,CAGF,MAAO,CACL,GAAI,QAAOH,EAAAL,EAAK,KAAL,KAAAK,EAAW,EAAE,EACxB,KAAM,YACN,KAAM,OAAOE,CAAI,EACjB,UAAW1B,EAAW2B,CAAc,CACtC,CACF,CAAC,EACA,OAAQR,GAAqCA,IAAS,IAAI,EA7BpD,CAAC,EAgCNU,GAAa5B,GAAsD,CA1JzE,IAAAmB,EAAAC,EA2JE,IAAMzB,GAAQyB,GAAAD,EAAAnB,EAAK,UAAL,KAAAmB,EAAgBnB,EAAK,SAArB,KAAAoB,EAA+BpB,EAAK,GAClD,OAA8BL,GAAU,KAAO,OAAOA,CAAK,EAAI,MACjE,EAEMkC,GAA8BC,GAAwC,CAC1E,GAA4BA,GAAW,KACrC,OAGF,GAAI,OAAOA,GAAW,SACpB,OAAOA,EAGT,GAAI,MAAM,QAAQA,CAAM,EAAG,CACzB,IAAMC,EAAcC,EAAmBF,CAAM,EAC7C,OAAOC,GAAA,KAAAA,EAAe9B,EAAgB6B,CAAM,CAC9C,CAEA,GAAIpC,EAAcoC,CAAM,EAAG,CACzB,IAAMC,EAAcC,EAAmB,CAACF,CAAM,CAAC,EAC/C,OAAOC,GAAA,KAAAA,EAAe9B,EAAgB6B,CAAM,CAC9C,CAEA,IAAMC,EAAcC,EAAmBF,CAAM,EAC7C,OAAIC,IAAgB,OACXA,EAGF9B,EAAgB6B,CAAM,CAC/B,EAEMG,EACJjC,GAC6B,CA5L/B,IAAAmB,EAAAC,EAAAC,EA6LE,IAAIK,GAAiBP,EAAAnB,EAAK,YAAL,KAAAmB,EAAkB,CAAC,EACxC,GAAI,OAAOO,GAAmB,SAC5B,GAAI,CACFA,EAAiB,KAAK,MAAMA,CAAc,CAC5C,OAAQC,EAAA,CACND,EAAiBA,CACnB,CAGF,MAAO,CACL,KAAM,YACN,WAAY,CACV,CACE,IAAIN,EAAAQ,GAAU5B,CAAI,IAAd,KAAAoB,EAAmB,GACvB,KAAM,YACN,KAAM,QAAOC,EAAArB,EAAK,OAAL,KAAAqB,EAAa,MAAM,EAChC,UAAWtB,EAAW2B,CAAc,CACtC,CACF,CACF,CACF,EAEMQ,EAA6B,CACjClC,EACAmC,IAC6B,CAtN/B,IAAAhB,EAuNE,IAAMiB,EAAaR,GAAU5B,CAAI,EAC3BqC,EAAUR,IACdV,EAAAgB,GAAA,KAAAA,EAAkBnC,EAAK,SAAvB,KAAAmB,EAAiCnB,EAAK,OACxC,EAEA,GAAI,CAACoC,GAAc,CAACC,EAClB,OAAO,KAGT,IAAMvB,EAA6B,CACjC,KAAM,MACR,EAEA,OAAIsB,IACFtB,EAAQ,aAAesB,GAGrBC,IAAY,SACdvB,EAAQ,QAAUuB,GAGbvB,CACT,EAEA,SAASkB,EAAmBK,EAAsC,CAChE,GAA6BA,GAAY,KAIzC,IAAI,OAAOA,GAAY,SACrB,OAAOA,EAGT,GAAI,MAAM,QAAQA,CAAO,EAAG,CAC1B,IAAMC,EAAYD,EACf,IAAKE,GAAS,CA1PrB,IAAApB,EA2PQ,GAAI,CAACzB,EAAc6C,CAAI,EACrB,OAAO,KAGT,IAAMC,EAAWD,EAAK,KACtB,GACEC,IAAa,QACbA,IAAa,cACbA,IAAa,cACb,CACA,IAAMC,GAAOtB,EAAAoB,EAAK,OAAL,KAAApB,EAAaoB,EAAK,QAC/B,OAA6BE,GAAS,KAAO,OAAOA,CAAI,EAAI,IAC9D,CAEA,OAAO,IACT,CAAC,EACA,OAAQF,GAAyBA,IAAS,IAAI,EAEjD,OAAOD,EAAU,OAAS,EAAIA,EAAU,KAAK;AAAA,CAAI,EAAI,MACvD,CAEA,OAAO,OAAOD,CAAO,EACvB,CAEO,IAAMK,EAAqBC,GAC3B,MAAM,QAAQA,CAAK,EAIjBA,EACJ,IAAK3C,GAAS,CACb,GAAI,CAACN,EAAcM,CAAI,EACrB,OAAO,KAGT,IAAM4C,EAAgC,CAAC,EACnC5C,EAAK,OAAS,SAChB4C,EAAW,KAAO,OAAO5C,EAAK,IAAI,GAGpC,IAAMqC,EAAUL,EAAmBhC,EAAK,OAAO,EAC3CqC,IACFO,EAAW,QAAUP,GAGvB,IAAMpB,EAAYD,GAAmBhB,EAAK,UAAU,EACpD,OAAIiB,EAAU,OAAS,IACrB2B,EAAW,WAAa3B,GAGtBjB,EAAK,eACP4C,EAAW,aAAe,OAAO5C,EAAK,YAAY,GAG7C,OAAO,KAAK4C,CAAU,EAAE,OAAS,EAAIA,EAAa,IAC3D,CAAC,EACA,OAAQ9B,GAA0CA,IAAY,IAAI,EA9B5D,CAAC,EAiCN+B,EACJ7C,GAC6B,CAC7B,IAAMc,EAA6B,CAAC,EAC9BgC,EAAO9C,EAAK,KACZqC,EAAUL,EAAmBhC,EAAK,OAAO,EACzCiB,EAAYD,GAAmBhB,EAAK,UAAU,EAEpD,OAA0B8C,GAAS,KACjChC,EAAQ,KAAO,OAAOgC,CAAI,GACjBT,GAAWpB,EAAU,OAAS,KACvCH,EAAQ,KAAO,aAGbuB,IACFvB,EAAQ,QAAUuB,GAGhBpB,EAAU,OAAS,IACrBH,EAAQ,WAAaG,GAGnBjB,EAAK,eACPc,EAAQ,aAAe,OAAOd,EAAK,YAAY,GAG1C,OAAO,KAAKc,CAAO,EAAE,OAAS,EAAIA,EAAU,IACrD,EAEMiC,GAA2B,IAAI,IAAI,CACvC,gBACA,gBACA,aACA,mBACA,mBACA,UACF,CAAC,EAEKC,GAA6B,IAAI,IAAI,CACzC,uBACA,uBACA,uBACA,uBACA,oBACA,0BACA,yBACF,CAAC,EAEYC,EAA0BN,GACjC,OAAOA,GAAU,SACZ,CAAC,CAAE,KAAM,OAAQ,QAASA,CAAM,CAAC,EAGrC,MAAM,QAAQA,CAAK,EAIjBA,EACJ,QAAS3C,GAAS,CACjB,GAAI,CAACN,EAAcM,CAAI,EACrB,MAAO,CAAC,EAGV,GAAIA,EAAK,OAAS,uBAAyBN,EAAcM,EAAK,OAAO,EAAG,CACtE,IAAMc,EAAU+B,EAAyB7C,EAAK,OAAO,EACrD,OAAOc,EAAU,CAACA,CAAO,EAAI,CAAC,CAChC,CAEA,GAAId,EAAK,OAAS,kBAAoBN,EAAcM,EAAK,OAAO,EAAG,CACjE,IAAMc,EAAUmB,EAAyBjC,EAAK,OAAO,EACrD,OAAOc,EAAU,CAACA,CAAO,EAAI,CAAC,CAChC,CAEA,GAAId,EAAK,OAAS,yBAA2BN,EAAcM,EAAK,OAAO,EAAG,CACxE,IAAMc,EAAUoB,EAA2BlC,EAAK,QAASA,EAAK,MAAM,EACpE,OAAOc,EAAU,CAACA,CAAO,EAAI,CAAC,CAChC,CAEA,GAAI,OAAOd,EAAK,MAAS,UAAY+C,GAAyB,IAAI/C,EAAK,IAAI,EAAG,CAC5E,IAAMc,EAAUmB,EAAyBjC,CAAI,EAC7C,OAAOc,EAAU,CAACA,CAAO,EAAI,CAAC,CAChC,CAEA,GACE,OAAOd,EAAK,MAAS,UACrBgD,GAA2B,IAAIhD,EAAK,IAAI,EACxC,CACA,IAAMc,EAAUoB,EAA2BlC,CAAI,EAC/C,OAAOc,EAAU,CAACA,CAAO,EAAI,CAAC,CAChC,CAEA,IAAMA,EAAU+B,EAAyB7C,CAAI,EAC7C,OAAOc,EAAU,CAACA,CAAO,EAAI,CAAC,CAChC,CAAC,EACA,OAAQA,GAA0CA,IAAY,IAAI,EAxC5D,CAAC,EA2CNoC,GAAuB,CAAC5C,EAAqB6C,IAAmB,CAvZtE,IAAAhC,EAAAC,EAwZO1B,EAAcyD,CAAK,IAIxB5C,EACED,EACA,6BACAa,EAAAgC,EAAM,eAAN,KAAAhC,EAAsBgC,EAAM,aAC9B,EACA5C,EACED,EACA,8BACAc,EAAA+B,EAAM,gBAAN,KAAA/B,EAAuB+B,EAAM,iBAC/B,EACF,EAEMC,GAAuB,CAC3BC,EACA3C,IACiB,CACjB,IAAMJ,EAAsB,CAC1B,uBAAwB,kBAC1B,EAEA,OAAAD,EAAcC,EAAO,uBAAwB+C,EAAS,KAAK,EAC3DH,GAAqB5C,EAAO+C,EAAS,KAAK,EAC1C1C,EAAuB,gBAAiB+B,EAAkBW,EAAS,KAAK,EAAG/C,CAAK,EAChFK,EACE,oBACA+B,EAAkBW,EAAS,MAAM,EACjC/C,CACF,EACAG,EACEH,EACA,kCACA+C,EAAS,aACT3C,CACF,EACAD,EACEH,EACA,0CACA+C,EAAS,MACT3C,CACF,EACAD,EACEH,EACA,2CACA+C,EAAS,OACT3C,CACF,EAEOJ,CACT,EAEMgD,GAAqB,CACzBD,EACA3C,IACiB,CAjdnB,IAAAS,EAAAC,EAAAC,EAkdE,IAAMf,EAAsB,CAC1B,uBAAwB,kBAC1B,EACMiD,EAAiB7D,EAAc2D,EAAS,SAAS,EAAIA,EAAS,UAAY,CAAC,EAC3EF,EACJzD,EAAc6D,EAAe,KAAK,EAAIA,EAAe,MAAQ,OAE/D,OAAAlD,EACEC,EACA,uBACAiD,EAAe,KACjB,EACAlD,EACEC,EACA,wBACAiD,EAAe,KACjB,EACAlD,EACEC,EACA,sBACAc,GAAAD,EAAAkC,EAAS,cAAT,KAAAlC,EAAwBoC,EAAe,KAAvC,KAAAnC,EAA6CmC,EAAe,WAC9D,EACAL,GAAqB5C,EAAO6C,CAAK,EACjCxC,EACE,gBACAsC,GAAuB5B,EAAAgC,EAAS,SAAT,KAAAhC,EAAmBkC,EAAe,KAAK,EAC9DjD,CACF,EACAK,EACE,oBACAsC,EAAuBM,EAAe,MAAM,EAC5CjD,CACF,EACAG,EACEH,EACA,kCACAiD,EACA7C,CACF,EACAL,EACEC,EACA,gCACAiD,EAAe,MACjB,EAEOjD,CACT,EAEMkD,GAAqB,CACzBH,EACA3C,IACiB,CACjB,IAAMJ,EAAsB,CAC1B,UAAW,iBACX,UAAW+C,EAAS,KACpB,8BAA+BA,EAAS,IAC1C,EAEA,OAAAhD,EAAcC,EAAO,iBAAkB+C,EAAS,KAAK,EACrDhD,EAAcC,EAAO,kBAAmB+C,EAAS,MAAM,EACvDhD,EAAcC,EAAO,+BAAgC+C,EAAS,KAAK,EACnEhD,EAAcC,EAAO,gCAAiC+C,EAAS,MAAM,EACrE5C,EACEH,EACA,uCACA+C,EAAS,SACT3C,CACF,EAEOJ,CACT,EAEMmD,GAAkB,CACtBJ,EACA3C,IACiB,CACjB,IAAMJ,EAAsB,CAC1B,2BAA4B+C,EAAS,IACvC,EAEA,OAAAhD,EAAcC,EAAO,kCAAmC+C,EAAS,WAAW,EAC5E5C,EACEH,EACA,oCACA+C,EAAS,SACT3C,CACF,EACAD,EACEH,EACA,iCACA+C,EAAS,MACT3C,CACF,EAEOJ,CACT,EAEMoD,GACJL,GACiB,CACjB,IAAM/C,EAAsB,CAAC,EAC7B,OAAAD,EAAcC,EAAO,mCAAoC+C,EAAS,UAAU,EAC5EhD,EAAcC,EAAO,iCAAkC+C,EAAS,QAAQ,EACjE/C,CACT,EAEMqD,GACJN,IAEO,CACL,+BAAgCA,EAAS,KACzC,oCAAqCA,EAAS,SAChD,GAGIO,GAAmB,CACvBP,EACA3C,IACiB,CACjB,IAAMJ,EAAsB,CAC1B,4BAA6B+C,EAAS,IACxC,EACA,OAAA5C,EACEH,EACA,iCACA+C,EAAS,KACT3C,CACF,EACOJ,CACT,EAEMuD,GAAwB,CAC5BR,EACA3C,IAEKA,EAIE,CACL,yBAA0BT,EAAgBoD,CAAQ,CACpD,EALS,CAAC,EAQCS,GAAyB,IAC7BC,EAGIC,EAAeC,GACnBA,EAAK,SAAS,OAAS,cAAgBA,EAAK,SAAS,OAAS,WACjExE,GACAD,GAGO0E,EAAeD,GAAoD,CAC9E,OAAQA,EAAK,SAAS,KAAM,CAC1B,IAAK,WACH,MAAO,aAAaA,EAAK,SAAS,IAAI,GACxC,IAAK,QACH,MAAO,UAAUA,EAAK,SAAS,IAAI,GACrC,IAAK,YACH,MAAO,cAAcA,EAAK,SAAS,IAAI,GACzC,IAAK,SACH,OAAO,OAAOA,EAAK,SAAS,IAAI,EAClC,QACE,OAAOA,EAAK,SAAS,KAClB,MAAM,GAAG,EACT,IAAK1B,GAAiBA,EAAK,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAK,MAAM,CAAC,CAAC,EAClE,KAAK,GAAG,CACf,CACF,EAEa4B,EAAsB,CACjCC,EACA1D,IACiB,CACjB,IAAMJ,EAAsB,CAC1B,+BAAgC,mBAChC,uCAAwCwD,GAAuB,EAC/D,kCAAmCM,EAAM,QACzC,8BAA+BA,EAAM,IACvC,EAEA,OAAIA,EAAM,UACR9D,EAAM,wBAAwB,EAAI8D,EAAM,SAGtC1E,EAAc0E,EAAM,QAAQ,IAC9B,OAAO,QAAQA,EAAM,QAAQ,EAAE,QAAQ,CAAC,CAACtE,EAAKH,CAAK,IAAM,CACnDC,GAASD,CAAK,IAChBW,EAAM,0BAA0BT,GAAYC,CAAG,CAAC,EAAE,EAAIH,EAE1D,CAAC,EACDc,EACEH,EACA,8BACA8D,EAAM,SACN1D,CACF,GAGKJ,CACT,EAEa+D,EACXJ,GACiB,CACjB,IAAM3D,EAAsB,CAC1B,+BAAgC,mBAChC,uCAAwCwD,GAAuB,EAC/D,iCAAkCG,EAAK,OACvC,0BAA2BA,EAAK,SAAS,IAC3C,EAEA,OAAIA,EAAK,WACP3D,EAAM,kCAAkC,EAAI2D,EAAK,UAG5C3D,CACT,EAEagE,GAAqB,CAChCjB,EACA3C,IACiB,CACjB,OAAQ2C,EAAS,KAAM,CACrB,IAAK,aACH,OAAOD,GAAqBC,EAAU3C,CAAkB,EAC1D,IAAK,WACH,OAAO4C,GAAmBD,EAAU3C,CAAkB,EACxD,IAAK,WACH,OAAO8C,GAAmBH,EAAU3C,CAAkB,EACxD,IAAK,QACH,OAAO+C,GAAgBJ,EAAU3C,CAAkB,EACrD,IAAK,UACH,OAAOgD,GAAkBL,CAAQ,EACnC,IAAK,YACH,OAAOM,GAAoBN,CAAQ,EACrC,IAAK,SACH,OAAOO,GAAiBP,EAAU3C,CAAkB,EACtD,QACE,OAAOmD,GAAsBR,EAAU3C,CAAkB,CAC7D,CACF,EAEa6D,EAAyB,EACzBC,GAAsB,EACtBC,GAAyB,EClsBtC,IAAMC,EAAcC,GACd,OAAOA,GAAU,SACZ,CAAE,YAAaA,CAAM,EAG1B,OAAOA,GAAU,UACZ,CAAE,UAAWA,CAAM,EAGxB,OAAOA,GAAU,SACf,OAAO,UAAUA,CAAK,EACjB,CAAE,SAAU,OAAOA,CAAK,CAAE,EAE5B,CAAE,YAAaA,CAAM,EAG1BA,IAAU,KACL,CAAE,YAAa,MAAO,EAG3B,MAAM,QAAQA,CAAK,EACd,CACL,WAAY,CACV,OAAQA,EAAM,IAAKC,GAASF,EAAWE,CAAI,CAAC,CAC9C,CACF,EAGK,CACL,YAAa,CACX,OAAQ,OAAO,QAAQD,CAAK,EAAE,IAAI,CAAC,CAACE,EAAKC,CAAW,KAAO,CACzD,IAAAD,EACA,MAAOH,EAAWI,CAAW,CAC/B,EAAE,CACJ,CACF,EAGIC,EAAeC,GACZ,OAAO,QAAQA,CAAU,EAAE,IAAI,CAAC,CAACH,EAAKF,CAAK,KAAO,CACvD,IAAAE,EACA,MAAOH,EAAWC,CAAK,CACzB,EAAE,EASSM,GAAuB,CAClCC,EACA,CACE,YAAAC,EAAc,+BACd,UAAAC,EAAY,yCACZ,aAAAC,EAAeC,CACjB,EAAiC,CAAC,KAE3B,CACL,cAAe,CACb,CACE,SAAU,CACR,WAAYP,EAAY,CACtB,eAAgBI,CAClB,CAAC,CACH,EACA,WAAY,CACV,CACE,MAAO,CACL,KAAMC,EACN,QAASC,CACX,EACA,MAAOH,EAAM,IAAKK,GAAS,CAhFvC,IAAAC,EAAAC,EAiFc,IAAMC,EAAmC,CACvC,QAASH,EAAK,QACd,OAAQA,EAAK,OACb,KAAMA,EAAK,KACX,KAAMA,EAAK,KACX,kBAAmBA,EAAK,kBACxB,iBAAiBC,EAAAD,EAAK,kBAAL,KAAAC,EAAwBD,EAAK,kBAC9C,WAAYR,EAAYQ,EAAK,UAAU,EACvC,SAASE,EAAAF,EAAK,SAAL,KAAAE,EAAe,CAAC,GAAG,IAAKE,GAAO,CAzFxD,IAAAH,EAyF4D,OAC1C,KAAMG,EAAM,KACZ,aAAcA,EAAM,aACpB,WAAYZ,GAAYS,EAAAG,EAAM,aAAN,KAAAH,EAAoB,CAAC,CAAC,CAChD,EAAE,EACF,MAAO,CAAC,CACV,EAEA,OAAID,EAAK,eACPG,EAAQ,aAAeH,EAAK,cAG1BA,EAAK,aACPG,EAAQ,WAAaH,EAAK,YAGxBA,EAAK,SACPG,EAAQ,OAASE,EAAA,CACf,KAAML,EAAK,OAAO,MACdA,EAAK,OAAO,QAAU,CAAE,QAASA,EAAK,OAAO,OAAQ,EAAI,CAAC,IAI3DG,CACT,CAAC,CACH,CACF,CACF,CACF,CACF,GCtHF,IAAAG,GAA2B,kBAErBC,GAAe,kBAEfC,EAAaC,MACV,eAAW,QAAQ,EAAE,OAAOA,EAAO,MAAM,EAAE,OAAO,KAAK,EAGnDC,EAAcC,GAAoC,CAC7D,IAAMC,EAASD,EAAgB,WAAW,QAAQ,EAC9CA,EAAgB,MAAM,CAAe,EACrCA,EAEJ,OAAIJ,GAAa,KAAKK,CAAM,EACnBA,EAAO,YAAY,EAGrBJ,EAAUG,CAAe,EAAE,MAAM,EAAG,EAAE,CAC/C,EAEaE,EAAaC,GACjBN,EAAUM,CAAc,EAAE,MAAM,EAAG,EAAE,EAGjCC,EAAuBJ,GAC3BH,EAAU,GAAGG,CAAe,OAAO,EAAE,MAAM,EAAG,EAAE,ECzBzD,IAAMK,GACJ,8EAEWC,EAAc,KACjB,OAAO,KAAK,IAAI,CAAC,EAAI,OAAO,GAAS,GAAG,SAAS,EAG9CC,EACXC,GACuB,CACvB,GAAI,CAACA,EACH,OAGF,IAAMC,EAAQJ,GAAiB,KAAKG,CAAS,EAC7C,GAAI,CAACC,EAAO,CACV,IAAMC,EAAS,KAAK,MAAMF,CAAS,EACnC,OAAI,OAAO,MAAME,CAAM,EACrB,QAEM,OAAOA,CAAM,EAAI,OAAO,GAAS,GAAG,SAAS,CACvD,CAEA,GAAM,CAAC,CAAEC,EAAMC,EAAW,GAAIC,EAAW,GAAG,EAAIJ,EAC1CC,EAAS,KAAK,MAAM,GAAGC,CAAI,GAAGE,CAAQ,EAAE,EAC9C,GAAI,OAAO,MAAMH,CAAM,EACrB,OAGF,IAAMI,EAAkB,QACrBF,EAAW,aAAa,MAAM,EAAG,CAAC,CACrC,EACA,OAAQ,OAAOF,CAAM,EAAI,OAAO,GAAS,EAAII,GAAiB,SAAS,CACzE,EAEaC,GAAc,IAAIC,IAA8C,CAC3E,IAAMC,EAAWD,EAAO,OAAQE,GAA2BA,IAAU,MAAS,EAC9E,OAAID,EAAS,SAAW,EACfX,EAAY,EAGdW,EAAS,OAAO,CAACE,EAAKC,IAC3B,OAAOA,CAAO,EAAI,OAAOD,CAAG,EAAIC,EAAUD,CAC5C,CACF,EAEaE,GAAc,IAAIL,IAA8C,CAC3E,IAAMC,EAAWD,EAAO,OAAQE,GAA2BA,IAAU,MAAS,EAC9E,OAAID,EAAS,SAAW,EACfX,EAAY,EAGdW,EAAS,OAAO,CAACK,EAAKF,IAC3B,OAAOA,CAAO,EAAI,OAAOE,CAAG,EAAIF,EAAUE,CAC5C,CACF,ECvDO,IAAMC,EAAuBC,GAA0B,CAC5D,IAAIC,EAAMD,EAAM,OAEhB,KAAOC,EAAM,GAAKD,EAAM,WAAWC,EAAM,CAAC,IAAM,IAC9CA,GAAO,EAGT,OAAOD,EAAM,MAAM,EAAGC,CAAG,CAC3B,ECsBA,IAAMC,GAAiB,+DACjBC,GAAgB,IAAI,OAAO,EAAE,EAC7BC,GAAe,IAAI,OAAO,EAAE,EAqBrBC,EAAN,KAAmE,CAWxE,YAAY,CACV,OAAAC,EACA,QAAAC,EACA,mBAAAC,EAAqB,EACvB,EAA4C,CAX5C,KAAiB,YAAc,IAAI,IACnC,KAAiB,oBAAsB,IAAI,IAI3C,KAAiB,eAAiB,IAAI,IAOpC,KAAK,OAASF,EACd,KAAK,QAAUG,EAAoBF,CAAO,EAC1C,KAAK,mBAAqBC,CAC5B,CAEA,OAAc,CAAC,CAET,aAAaE,EAAmC,QAAAC,EAAA,sBA5ExD,IAAAC,EA6EI,GAAI,KAAK,YAAY,IAAIF,EAAM,OAAO,EACpC,OAGF,IAAMG,EAAkB,KAAK,4BAA4BH,EAAM,QAAQ,EACjEI,GAAUF,EAAAC,GAAA,YAAAA,EAAiB,UAAjB,KAAAD,EAA4BG,EAAWL,EAAM,OAAO,EACpE,KAAK,YAAY,IAAIA,EAAM,QAAS,CAClC,SAAU,CACR,QAAAI,EACA,OAAQE,EAAoBN,EAAM,OAAO,EACzC,KAAMA,EAAM,MAAQ,sBACpB,KAAM,EACN,kBAAmBO,EAAY,EAC/B,aAAcJ,GAAA,YAAAA,EAAiB,aAC/B,WAAYA,GAAA,YAAAA,EAAiB,WAC7B,WAAYK,EAAoBR,EAAO,KAAK,kBAAkB,EAC9D,OAAQ,CAAE,KAAMS,CAAuB,EACvC,OAAQ,CAAC,CACX,EACA,MAAO,IAAI,GACb,CAAC,CACH,GAEM,WAAWT,EAAmC,QAAAC,EAAA,sBAClD,IAAMS,EAAQ,KAAK,YAAY,IAAIV,EAAM,OAAO,EAChD,GAAI,CAACU,EACH,OAGF,IAAMC,EAAa,MAAM,KAAKD,EAAM,MAAM,OAAO,CAAC,EAAE,KAAK,CAACE,EAAMC,IACvD,OAAOD,EAAK,iBAAiB,EAAI,OAAOC,EAAM,iBAAiB,EAClE,GACA,CACL,EACKC,EAAcH,EAAW,IAAKI,GAASA,EAAK,iBAAiB,EAC7DC,EAAYL,EAAW,IAC1BI,GAAM,CAjHb,IAAAb,EAiHgB,OAAAA,EAAAa,EAAK,kBAAL,KAAAb,EAAwBa,EAAK,kBACzC,EACME,EAAUC,GAAYX,EAAY,EAAG,GAAGS,CAAS,EAEvDN,EAAM,SAAS,kBAAoBS,GACjCT,EAAM,SAAS,kBACf,GAAGI,CACL,EACAJ,EAAM,SAAS,gBAAkBO,EAEjC,IAAMG,EAAUC,GAAqB,CAACX,EAAM,SAAU,GAAGC,CAAU,CAAC,EACpE,KAAK,YAAY,OAAOX,EAAM,OAAO,EACrC,KAAK,oBAAoB,IAAIA,EAAM,QAASoB,CAAO,EACnD,KAAK,oBAAoBpB,EAAM,OAAO,CACxC,GAEM,YAAYe,EAAsC,QAAAd,EAAA,sBAjI1D,IAAAC,EAkII,IAAMQ,EAAQ,KAAK,wBAAwBK,CAAI,EACzCO,EAAWZ,EAAM,MAAM,IAAIK,EAAK,MAAM,EACtCQ,EAASD,GAAA,KAAAA,EAAY,KAAK,iBAAiBP,EAAML,EAAM,SAAS,MAAM,EAE5Ea,EAAO,QAAUb,EAAM,SAAS,QAChCa,EAAO,WAAab,EAAM,SAAS,WACnCa,EAAO,KAAOC,EAAYT,CAAI,EAC9BQ,EAAO,KAAOE,EAAYV,CAAI,EAC9BQ,EAAO,mBAAoBrB,EAAAwB,EAAcX,EAAK,SAAS,IAA5B,KAAAb,EAAiCqB,EAAO,kBACnEA,EAAO,aAAeR,EAAK,SACvBY,EAAUZ,EAAK,QAAQ,EACvBL,EAAM,SAAS,OACnBa,EAAO,WAAaK,IAAA,GACfL,EAAO,YACPM,EAAmBd,CAAI,GAG5BL,EAAM,MAAM,IAAIK,EAAK,OAAQQ,CAAM,CACrC,GAEM,UAAUR,EAAsC,QAAAd,EAAA,sBAtJxD,IAAAC,EAAA4B,EAAAC,EAAAC,EAuJI,IAAMtB,EAAQ,KAAK,wBAAwBK,CAAI,EACzCQ,GACJrB,EAAAQ,EAAM,MAAM,IAAIK,EAAK,MAAM,IAA3B,KAAAb,EACA,KAAK,iBAAiBa,EAAML,EAAM,SAAS,MAAM,EAEnDa,EAAO,WAAaK,IAAA,GACfL,EAAO,YACPU,GAAmBlB,EAAK,SAAU,KAAK,kBAAkB,GAE9DQ,EAAO,iBACLQ,GAAAD,EAAAJ,EAAcX,EAAK,OAAO,IAA1B,KAAAe,EAA+BP,EAAO,kBAAtC,KAAAQ,EAAyDxB,EAAY,EACvEgB,EAAO,OAAS,KAAK,cAAcR,CAAI,EAEnCA,EAAK,QACPQ,EAAO,OAAS,CACd,IAAIS,EAAAT,EAAO,SAAP,KAAAS,EAAiB,CAAC,EACtB,CACE,KAAM,YACN,aAAcT,EAAO,gBACrB,WAAY,CACV,iBAAkB,oBAClB,oBAAqBR,EAAK,MAAM,QAChC,2BAA4B,KAAK,UAAUA,EAAK,KAAK,CACvD,CACF,CACF,GAGFL,EAAM,MAAM,IAAIK,EAAK,OAAQQ,CAAM,CACrC,GAEM,UAA0B,QAAAtB,EAAA,sBAC9B,MAAM,KAAK,WAAW,CACxB,GAEM,YAA4B,QAAAA,EAAA,sBAChC,QAASiC,EAAO,EAAGA,EAAO,EAAGA,GAAQ,EAAG,CACtC,QAAW9B,KAAW,KAAK,oBAAoB,KAAK,EAClD,KAAK,oBAAoBA,CAAO,EASlC,GANI,KAAK,eAAe,OAAS,IAIjC,MAAM,QAAQ,IAAI,MAAM,KAAK,KAAK,eAAe,OAAO,CAAC,CAAC,EAEtD,KAAK,oBAAoB,OAAS,GACpC,MAEJ,CACF,GAEQ,kBACNW,EACgE,CA9MpE,IAAAb,EAAA4B,EAAAC,EAAAC,EAAAG,EA+MI,IAAMC,EAAc,KAAK,SAASrB,EAAK,aAAa,EAC9CsB,EAAiB,KAAK,SAASD,GAAA,YAAAA,EAAa,QAAQ,EAE1D,MAAO,CACL,QAASrB,EAAK,QACd,MACEe,GAAA5B,EAAA,KAAK,WAAWkC,GAAA,YAAAA,EAAa,aAAa,IAA1C,KAAAlC,EACA,KAAK,WAAWkC,GAAA,YAAAA,EAAa,YAAY,IADzC,KAAAN,EAEA,sBACF,SACEE,GAAAD,EAAA,KAAK,WAAWK,GAAA,YAAAA,EAAa,QAAQ,IAArC,KAAAL,EACA,KAAK,WAAWK,GAAA,YAAAA,EAAa,OAAO,IADpC,KAAAJ,EAEA,KACF,UAAUG,EAAAE,GAAA,KAAAA,EAAkBD,IAAlB,KAAAD,EAAiC,CAAC,CAC9C,CACF,CAEQ,wBAAwBpB,EAAmC,CAhOrE,IAAAb,EAAA4B,EAiOI,IAAMR,EAAW,KAAK,YAAY,IAAIP,EAAK,OAAO,EAClD,GAAIO,EACF,OAAOA,EAGT,IAAMgB,EAAY,KAAK,kBAAkBvB,CAAI,EAEvCZ,EAAkB,KAAK,4BAA4BmC,EAAU,QAAQ,EAErE5B,EAAoB,CACxB,SAAU,CACR,SAHYR,EAAAC,GAAA,YAAAA,EAAiB,UAAjB,KAAAD,EAA4BG,EAAWU,EAAK,OAAO,EAI/D,OAAQT,EAAoBS,EAAK,OAAO,EACxC,KAAMuB,EAAU,KAChB,KAAM,EACN,mBAAmBR,EAAAJ,EAAcX,EAAK,SAAS,IAA5B,KAAAe,EAAiCvB,EAAY,EAChE,aAAcJ,GAAA,YAAAA,EAAiB,aAC/B,WAAYA,GAAA,YAAAA,EAAiB,WAC7B,WAAYK,EAAoB8B,EAAW,KAAK,kBAAkB,EAClE,OAAQ,CAAE,KAAM7B,CAAuB,EACvC,OAAQ,CAAC,CACX,EACA,MAAO,IAAI,GACb,EAEA,YAAK,YAAY,IAAIM,EAAK,QAASL,CAAK,EACjCA,CACT,CAEQ,iBACNK,EACAwB,EACgB,CAjQpB,IAAArC,EAAA4B,EAAAC,EAAAC,EAkQI,MAAO,CACL,SACEF,GAAA5B,EAAA,KAAK,YAAY,IAAIa,EAAK,OAAO,IAAjC,YAAAb,EAAoC,SAAS,UAA7C,KAAA4B,EAAwDzB,EAAWU,EAAK,OAAO,EACjF,OAAQY,EAAUZ,EAAK,MAAM,EAC7B,aAAcA,EAAK,SAAWY,EAAUZ,EAAK,QAAQ,EAAIwB,EACzD,KAAMf,EAAYT,CAAI,EACtB,KAAMU,EAAYV,CAAI,EACtB,mBAAmBgB,EAAAL,EAAcX,EAAK,SAAS,IAA5B,KAAAgB,EAAiCxB,EAAY,EAChE,YAAYyB,EAAA,KAAK,YAAY,IAAIjB,EAAK,OAAO,IAAjC,YAAAiB,EAAoC,SAAS,WACzD,WAAYJ,EAAA,GACPC,EAAmBd,CAAI,GAE5B,OAAQ,CAAE,KAAMN,CAAuB,EACvC,OAAQ,CAAC,CACX,CACF,CAEQ,cAAcM,EAAyC,CAC7D,OAAIA,EAAK,MACA,CACL,KAAMyB,GACN,QAASzB,EAAK,MAAM,OACtB,EAGK,CACL,KAAM0B,EACR,CACF,CAEc,cAAcrB,EAAkD,QAAAnB,EAAA,sBAC5E,IAAMyC,EAAW,MAAMC,EAAe,GAAG,KAAK,OAAO,aAAc,CACjE,OAAQ,OACR,QAASf,EAAA,CACP,eAAgB,mBAChB,YAAa,KAAK,OAClB,4BAA6B,oBAC1BgB,EAAiB,GAEtB,KAAM,KAAK,UAAUxB,CAAO,CAC9B,CAAC,EAED,GAAI,CAACsB,EAAS,GACZ,MAAM,IAAI,MACR,0CAA0CA,EAAS,MAAM,IAAIA,EAAS,UAAU,EAClF,CAEJ,GAEQ,oBAAoBtC,EAAuB,CACjD,GAAI,KAAK,eAAe,IAAIA,CAAO,EACjC,OAGF,IAAMgB,EAAU,KAAK,oBAAoB,IAAIhB,CAAO,EACpD,GAAI,CAACgB,EACH,OAGF,IAAMyB,EAAgB,KAAK,cAAczB,CAAO,EAC7C,KAAK,IAAM,CACV,KAAK,oBAAoB,OAAOhB,CAAO,CACzC,CAAC,EACA,MAAO0C,GAAU,CAChB,QAAQ,MACN,yCAAyC1C,CAAO,KAChD0C,CACF,CACF,CAAC,EACA,QAAQ,IAAM,CACb,KAAK,eAAe,OAAO1C,CAAO,CACpC,CAAC,EAEH,KAAK,eAAe,IAAIA,EAASyC,CAAa,CAChD,CAEQ,4BACNE,EAC6B,CAC7B,IAAMC,EAAiB,KAAK,SAASD,CAAQ,EAC7C,GAAI,CAACC,EACH,OAAO,KAGT,IAAMC,EAAcD,EAAe,YACnC,GAAI,OAAOC,GAAgB,UAAY,CAACA,EAAY,KAAK,EACvD,OAAO,KAGT,IAAMC,EAAQD,EAAY,KAAK,EAAE,MAAMzD,EAAc,EACrD,GAAI,CAAC0D,EACH,OAAO,KAGT,GAAM,CAAC,CAAEC,EAAS/C,EAASgD,CAAY,EAAIF,EACrCG,EAAoBF,EAAQ,YAAY,EACxCG,EAAoBlD,EAAQ,YAAY,EACxCmD,EAAyBH,EAAa,YAAY,EACxD,GACEC,IAAsB,MACtBC,IAAsB7D,IACtB8D,IAA2B7D,GAE3B,OAAO,KAGT,IAAM8D,GACJ,OAAOR,EAAe,YAAe,UAAYA,EAAe,WAAW,KAAK,EAC5EA,EAAe,WAAW,KAAK,EAC/B,OAEN,MAAO,CACL,QAASM,EACT,aAAcC,EACd,WAAAC,EACF,CACF,CAEQ,SAASC,EAA4C,CAC3D,MAAI,CAACA,GAAS,OAAOA,GAAU,UAAY,MAAM,QAAQA,CAAK,EACrD,KAGFA,CACT,CAEQ,WAAWA,EAAoC,CACrD,OAAO,OAAOA,GAAU,UAAYA,EAAM,KAAK,EAAIA,EAAQ,MAC7D,CACF,ECxXA,IAAMC,GAAkBC,GAA6B,CAXrD,IAAAC,EAYE,OAAOC,GACLD,EAAAD,GAAA,KAAAA,EAAWG,EAAQ,sBAAsB,IAAzC,KAAAF,EAA8C,6BAChD,CACF,EAEaG,GAAyB,IAK+CC,IAAAC,EAAA,SAAAD,GAAA,UALxC,CAC3C,OAAAE,EACA,QAAAP,EACA,UAAAQ,EAAY,GACZ,mBAAAC,EAAqB,EACvB,EAAmC,CAAC,EAAiD,CACnF,IAAMC,EAAiBC,EAAyBJ,CAAM,EAEhDK,EAAgD,KAAM,QAC1D,gBACF,EAEMC,EAAY,IAAIC,EAAiC,CACrD,OAAQJ,EACR,QAASX,GAAeC,CAAO,EAC/B,mBAAAS,CACF,CAAC,EAED,OAAID,EACFI,EAAa,mBAAmB,CAACC,CAAS,CAAC,EAE3CD,EAAa,kBAAkBC,CAAS,EAGnCA,CACT","names":["openai_agents_exports","__export","PromptLayerOpenAIAgentsProcessor","instrumentOpenAIAgents","__toCommonJS","import_ably","import_centrifuge","import_p_retry","SDK_VERSION","getNodeVersion","_a","parts","_NODE_VERSION","_PROMPTLAYER_USER_AGENT","getCommonHeaders","fetchWithRetry","input","init","__async","pRetry","response","error","readEnv","env","_a","_b","_c","_d","_e","_f","requirePromptLayerApiKey","apiKey","explicitApiKey","envApiKey","SPAN_KIND_INTERNAL","SPAN_KIND_CLIENT","isPlainObject","value","isScalar","sanitizeKey","key","toJsonable","item","stableStringify","normalize","input","acc","setStringAttr","attrs","setNumberAttr","numericValue","setJsonAttr","includeRawPayloads","flattenIndexedMessages","prefix","messages","message","index","normalizeToolCalls","toolCalls","call","_a","_b","_c","_d","_e","functionData","name","argumentsValue","e","getCallId","normalizeToolOutputContent","output","textContent","extractTextContent","normalizeToolCallMessage","normalizeToolResultMessage","outputOverride","toolCallId","content","textParts","part","partType","text","normalizeMessages","items","normalized","normalizeResponseMessage","role","RAW_TOOL_CALL_ITEM_TYPES","RAW_TOOL_RESULT_ITEM_TYPES","normalizeResponseItems","applyUsageAttributes","usage","generationAttributes","spanData","responseAttributes","responseObject","functionAttributes","agentAttributes","handoffAttributes","guardrailAttributes","customAttributes","rawSpanDataAttributes","telemetrySourceVersion","SDK_VERSION","spanKindFor","span","spanNameFor","baseTraceAttributes","trace","baseSpanAttributes","spanDataAttributes","OTLP_STATUS_CODE_UNSET","OTLP_STATUS_CODE_OK","OTLP_STATUS_CODE_ERROR","toAnyValue","value","item","key","nestedValue","toKeyValues","attributes","buildOtlpJsonPayload","spans","serviceName","scopeName","scopeVersion","SDK_VERSION","span","_a","_b","payload","event","__spreadValues","import_crypto","TRACE_HEX_RE","sha256Hex","value","mapTraceId","originalTraceId","suffix","mapSpanId","originalSpanId","syntheticRootSpanId","ISO_TIMESTAMP_RE","nowUnixNano","isoToUnixNano","timestamp","match","millis","base","fraction","timezone","fractionalNanos","minUnixNano","values","filtered","value","min","current","maxUnixNano","max","trimTrailingSlashes","value","end","TRACEPARENT_RE","ZERO_TRACE_ID","ZERO_SPAN_ID","PromptLayerOpenAIAgentsProcessor","apiKey","baseURL","includeRawPayloads","trimTrailingSlashes","trace","__async","_a","upstreamContext","traceId","mapTraceId","syntheticRootSpanId","nowUnixNano","baseTraceAttributes","OTLP_STATUS_CODE_UNSET","state","childSpans","left","right","childStarts","span","childEnds","rootEnd","maxUnixNano","minUnixNano","payload","buildOtlpJsonPayload","existing","record","spanNameFor","spanKindFor","isoToUnixNano","mapSpanId","__spreadValues","baseSpanAttributes","_b","_c","_d","spanDataAttributes","pass","_e","rawMetadata","nestedMetadata","traceLike","rootSpanId","OTLP_STATUS_CODE_ERROR","OTLP_STATUS_CODE_OK","response","fetchWithRetry","getCommonHeaders","exportPromise","error","metadata","metadataRecord","traceparent","match","version","parentSpanId","normalizedVersion","normalizedTraceId","normalizedParentSpanId","traceState","value","resolveBaseURL","baseURL","_a","trimTrailingSlashes","readEnv","instrumentOpenAIAgents","_0","__async","apiKey","exclusive","includeRawPayloads","resolvedApiKey","requirePromptLayerApiKey","agentsModule","processor","PromptLayerOpenAIAgentsProcessor"]}
|
|
1
|
+
{"version":3,"sources":["../src/openai-agents.ts","../src/utils/utils.ts","../src/integrations/openai-agents/mapping.ts","../src/integrations/openai-agents/otlp-json.ts","../src/integrations/openai-agents/ids.ts","../src/integrations/openai-agents/time.ts","../src/integrations/openai-agents/url.ts","../src/integrations/openai-agents/processor.ts","../src/integrations/openai-agents/instrumentation.ts"],"sourcesContent":["export * from \"@/integrations/openai-agents\";\n","import {\n GetPromptTemplateParams,\n GetPromptTemplateResponse,\n ListPromptTemplatesResponse,\n LogRequest,\n Pagination,\n PublishPromptTemplate,\n PublishPromptTemplateResponse,\n RequestLog,\n RunWorkflowRequestParams,\n TrackGroup,\n TrackMetadata,\n TrackPrompt,\n TrackRequest,\n TrackScore,\n WorkflowResponse,\n} from \"@/types\";\nimport type { AnthropicBedrock } from \"@anthropic-ai/bedrock-sdk\";\nimport type TypeAnthropic from \"@anthropic-ai/sdk\";\nimport type { AnthropicVertex } from \"@anthropic-ai/vertex-sdk\";\nimport Ably from \"ably\";\nimport { Centrifuge } from \"centrifuge\";\nimport type TypeOpenAI from \"openai\";\nimport pRetry from \"p-retry\";\nimport {\n MAP_PROVIDER_TO_FUNCTION_NAME,\n cleaned_result,\n STREAMING_PROVIDERS_WITH_USAGE,\n} from \"./streaming\";\n\n// SDK version - injected at build time from package.json\ndeclare const __SDK_VERSION__: string;\nexport const SDK_VERSION = __SDK_VERSION__;\n\n// Get Node.js version (major.minor format)\nconst getNodeVersion = (): string => {\n if (typeof process !== \"undefined\" && process.versions?.node) {\n const parts = process.versions.node.split(\".\");\n return `${parts[0]}.${parts[1]}`;\n }\n return \"unknown\";\n};\n\nconst _NODE_VERSION = getNodeVersion();\nconst _PROMPTLAYER_USER_AGENT = `promptlayer-js/${SDK_VERSION} (node ${_NODE_VERSION})`;\n\n/**\n * Returns common headers to be included in all PromptLayer API requests.\n * Includes the SDK version and user agent for tracking and debugging purposes.\n */\nexport const getCommonHeaders = (): Record<string, string> => ({\n \"User-Agent\": _PROMPTLAYER_USER_AGENT,\n \"X-SDK-Version\": SDK_VERSION,\n});\n\nexport const SET_WORKFLOW_COMPLETE_MESSAGE = \"SET_WORKFLOW_COMPLETE\";\n\nexport enum FinalOutputCode {\n OK = \"OK\",\n EXCEEDS_SIZE_LIMIT = \"EXCEEDS_SIZE_LIMIT\",\n}\n\nasync function getFinalOutput(\n baseURL: string,\n executionId: number,\n returnAllOutputs: boolean,\n headers: Record<string, string>\n): Promise<any> {\n const response = await fetchWithRetry(\n `${baseURL}/workflow-version-execution-results?workflow_version_execution_id=${executionId}&return_all_outputs=${returnAllOutputs}`,\n { headers, ...getCommonHeaders() }\n );\n if (!response.ok) {\n throw new Error(\"Failed to fetch final output\");\n }\n return response.json();\n}\n\nfunction makeMessageListener(\n baseURL: string,\n resultsPromise: { resolve: (data: any) => void; reject: (err: any) => void },\n executionId: number,\n returnAllOutputs: boolean,\n headers: Record<string, string>\n) {\n return async function (message: any) {\n if (message.name !== SET_WORKFLOW_COMPLETE_MESSAGE) return;\n\n try {\n const data = JSON.parse(message.data);\n const resultCode = data.result_code;\n let results;\n\n if (resultCode === FinalOutputCode.OK || resultCode == null) {\n results = data.final_output;\n } else if (resultCode === FinalOutputCode.EXCEEDS_SIZE_LIMIT) {\n results = await getFinalOutput(\n baseURL,\n executionId,\n returnAllOutputs,\n headers\n );\n resultsPromise.resolve(results);\n } else {\n throw new Error(`Unsupported final output code: ${resultCode}`);\n }\n\n resultsPromise.resolve(results);\n } catch (err) {\n resultsPromise.reject(err);\n }\n };\n}\n\ninterface WaitForWorkflowCompletionParams {\n token: string;\n channelName: string;\n executionId: number;\n returnAllOutputs: boolean;\n headers: Record<string, string>;\n timeout: number;\n baseURL: string;\n}\n\nasync function waitForWorkflowCompletion({\n token,\n channelName,\n executionId,\n returnAllOutputs,\n headers,\n timeout,\n baseURL,\n}: WaitForWorkflowCompletionParams): Promise<any> {\n const client = new Ably.Realtime(token);\n const channel = client.channels.get(channelName);\n\n const resultsPromise = {} as {\n resolve: (value: any) => void;\n reject: (reason?: any) => void;\n };\n\n const promise = new Promise<any>((resolve, reject) => {\n resultsPromise.resolve = resolve;\n resultsPromise.reject = reject;\n });\n\n const listener = makeMessageListener(\n baseURL,\n resultsPromise,\n executionId,\n returnAllOutputs,\n headers\n );\n await channel.subscribe(SET_WORKFLOW_COMPLETE_MESSAGE, listener);\n\n try {\n return await new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(\n new Error(\"Workflow execution did not complete properly (timeout)\")\n );\n }, timeout);\n\n promise\n .then((result) => {\n clearTimeout(timer);\n resolve(result);\n })\n .catch((err) => {\n clearTimeout(timer);\n reject(err);\n });\n });\n } finally {\n console.log(\"Closing client\");\n channel.unsubscribe(SET_WORKFLOW_COMPLETE_MESSAGE, listener);\n client.close();\n console.log(\"Closed client\");\n }\n}\n\n/**\n * Wrapper around fetch that retries on 5xx server errors with exponential backoff.\n * Uses p-retry for industry-standard retry logic with exponential backoff.\n *\n * @param input - The URL or Request object to fetch\n * @param init - The request initialization options\n * @returns Promise<Response> - The fetch response\n */\nexport const fetchWithRetry = async (\n input: RequestInfo | URL,\n init?: RequestInit\n): Promise<Response> => {\n return pRetry(\n async () => {\n const response = await fetch(input, init);\n\n if ((response.status >= 500 && response.status < 600) || (response.status === 429)) {\n throw new Error(\n `Server error: ${response.status} ${response.statusText}`\n );\n }\n\n return response;\n },\n {\n retries: 3, // Retry up to 3 times (4 total attempts)\n factor: 2, // Exponential backoff factor\n minTimeout: 2000, // First retry after 2 seconds\n maxTimeout: 15000, // Cap at 15 seconds (gives us ~2s, ~4s, ~8s progression with randomization)\n randomize: true, // Add jitter to avoid thundering herd\n onFailedAttempt: (error) => {\n console.info(\n `PromptLayer API request attempt ${error.attemptNumber} failed. ${error.retriesLeft} retries left.`\n );\n },\n }\n );\n};\n\nconst promptlayerApiHandler = async <Item>(\n apiKey: string,\n baseURL: string,\n body: TrackRequest & {\n request_response: AsyncIterable<Item> | any;\n },\n throwOnError: boolean = true\n) => {\n const isGenerator = body.request_response[Symbol.asyncIterator] !== undefined;\n if (isGenerator) {\n return proxyGenerator(\n apiKey,\n baseURL,\n body.request_response,\n body,\n throwOnError\n );\n }\n return await promptLayerApiRequest(apiKey, baseURL, body, throwOnError);\n};\n\nconst promptLayerApiRequest = async (\n apiKey: string,\n baseURL: string,\n body: TrackRequest,\n throwOnError: boolean = true\n) => {\n try {\n const response = await fetchWithRetry(`${baseURL}/track-request`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...getCommonHeaders() },\n body: JSON.stringify(body),\n });\n const data = await response.json();\n if (response.status !== 200) {\n const errorMessage =\n data.message || data.error || \"Failed to log request\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While logging your request, PromptLayer experienced the following error:\"\n );\n }\n }\n if (data && body.return_pl_id) {\n return [body.request_response, data.request_id];\n }\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n console.warn(\n `WARNING: While logging your request PromptLayer had the following error: ${e}`\n );\n }\n return body.request_response;\n};\n\nconst promptLayerTrackMetadata = async (\n apiKey: string,\n baseURL: string,\n body: TrackMetadata,\n throwOnError: boolean = true\n): Promise<boolean> => {\n try {\n const response = await fetchWithRetry(`${baseURL}/library-track-metadata`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...getCommonHeaders() },\n body: JSON.stringify({\n ...body,\n api_key: apiKey,\n }),\n });\n const data = await response.json();\n if (response.status !== 200) {\n const errorMessage =\n data.message || data.error || \"Failed to track metadata\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While logging metadata to your request, PromptLayer experienced the following error\"\n );\n return false;\n }\n }\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n console.warn(\n `WARNING: While logging metadata to your request, PromptLayer experienced the following error: ${e}`\n );\n return false;\n }\n return true;\n};\n\nconst promptLayerTrackScore = async (\n apiKey: string,\n baseURL: string,\n body: TrackScore,\n throwOnError: boolean = true\n): Promise<boolean> => {\n try {\n const response = await fetchWithRetry(`${baseURL}/library-track-score`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...getCommonHeaders() },\n body: JSON.stringify({\n ...body,\n api_key: apiKey,\n }),\n });\n const data = await response.json();\n if (response.status !== 200) {\n const errorMessage =\n data.message || data.error || \"Failed to track score\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While scoring your request, PromptLayer experienced the following error\"\n );\n return false;\n }\n }\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n console.warn(\n `WARNING: While scoring your request, PromptLayer experienced the following error: ${e}`\n );\n return false;\n }\n return true;\n};\n\nconst promptLayerTrackPrompt = async (\n apiKey: string,\n baseURL: string,\n body: TrackPrompt,\n throwOnError: boolean = true\n): Promise<boolean> => {\n try {\n const response = await fetchWithRetry(`${baseURL}/library-track-prompt`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...getCommonHeaders() },\n body: JSON.stringify({\n ...body,\n api_key: apiKey,\n }),\n });\n const data = await response.json();\n if (response.status !== 200) {\n const errorMessage =\n data.message || data.error || \"Failed to track prompt\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While associating your request with a prompt template, PromptLayer experienced the following error\"\n );\n return false;\n }\n }\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n console.warn(\n `WARNING: While associating your request with a prompt template, PromptLayer experienced the following error: ${e}`\n );\n return false;\n }\n return true;\n};\n\nconst promptLayerTrackGroup = async (\n apiKey: string,\n baseURL: string,\n body: TrackGroup,\n throwOnError: boolean = true\n): Promise<boolean> => {\n try {\n const response = await fetchWithRetry(`${baseURL}/track-group`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...getCommonHeaders() },\n body: JSON.stringify({\n ...body,\n api_key: apiKey,\n }),\n });\n const data = await response.json();\n if (response.status !== 200) {\n const errorMessage =\n data.message || data.error || \"Failed to track group\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While associating your request with a group, PromptLayer experienced the following error\"\n );\n return false;\n }\n }\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n console.warn(\n `WARNING: While associating your request with a group, PromptLayer experienced the following error: ${e}`\n );\n return false;\n }\n return true;\n};\n\nconst promptLayerCreateGroup = async (\n apiKey: string,\n baseURL: string,\n throwOnError: boolean = true\n): Promise<number | boolean> => {\n try {\n const response = await fetchWithRetry(`${baseURL}/create-group`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...getCommonHeaders() },\n body: JSON.stringify({\n api_key: apiKey,\n }),\n });\n const data = await response.json();\n if (response.status !== 200) {\n const errorMessage =\n data.message || data.error || \"Failed to create group\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While creating a group PromptLayer had the following error\"\n );\n return false;\n }\n }\n return data.id;\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n console.warn(\n `WARNING: While creating a group PromptLayer had the following error: ${e}`\n );\n return false;\n }\n};\n\nconst getPromptTemplate = async (\n apiKey: string,\n baseURL: string,\n promptName: string,\n params?: Partial<GetPromptTemplateParams>,\n throwOnError: boolean = true\n): Promise<GetPromptTemplateResponse | null> => {\n try {\n const url = new URL(`${baseURL}/prompt-templates/${promptName}`);\n const response = await fetchWithRetry(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": apiKey,\n ...getCommonHeaders(),\n },\n body: JSON.stringify(params),\n });\n const data = await response.json();\n if (response.status !== 200) {\n const errorMessage =\n data.message || data.error || \"Failed to fetch prompt template\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n console.warn(\n `WARNING: While fetching a prompt template PromptLayer had the following error: ${errorMessage}`\n );\n return null;\n }\n }\n if (data.warning) {\n console.warn(\n `WARNING: While fetching your prompt PromptLayer had the following error: ${data.warning}`\n );\n }\n return data as GetPromptTemplateResponse;\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n console.warn(\n `WARNING: While fetching a prompt template PromptLayer had the following error: ${e}`\n );\n return null;\n }\n};\n\nconst publishPromptTemplate = async (\n apiKey: string,\n baseURL: string,\n body: PublishPromptTemplate,\n throwOnError: boolean = true\n): Promise<PublishPromptTemplateResponse> => {\n const response = await fetchWithRetry(`${baseURL}/rest/prompt-templates`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-API-KEY\": apiKey, ...getCommonHeaders() },\n body: JSON.stringify({\n prompt_template: { ...body },\n prompt_version: { ...body },\n release_labels: body.release_labels ? body.release_labels : undefined,\n }),\n });\n const data = await response.json();\n if (response.status !== 200 && response.status !== 201) {\n const errorMessage =\n data.message || data.error || \"Failed to publish prompt template\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While publishing a prompt template PromptLayer had the following error\"\n );\n }\n }\n return data as PublishPromptTemplateResponse;\n};\n\nconst getAllPromptTemplates = async (\n apiKey: string,\n baseURL: string,\n params?: Partial<Pagination>,\n throwOnError: boolean = true\n): Promise<Array<ListPromptTemplatesResponse>> => {\n const url = new URL(`${baseURL}/prompt-templates`);\n Object.entries(params || {}).forEach(([key, value]) =>\n url.searchParams.append(key, value.toString())\n );\n const response = await fetchWithRetry(url, {\n headers: { \"Content-Type\": \"application/json\", \"X-API-KEY\": apiKey, ...getCommonHeaders() },\n });\n const data = await response.json();\n if (response.status !== 200) {\n const errorMessage =\n data.message || data.error || \"Failed to fetch prompt templates\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While fetching all prompt templates PromptLayer had the following error\"\n );\n return [];\n }\n }\n return (data.items ?? []) as Array<ListPromptTemplatesResponse>;\n};\n\nconst waitForWorkflowCompletionCentrifugo = async (\n params: WaitForWorkflowCompletionParams\n): Promise<any> => {\n const url = new URL(`${params.baseURL}/connection/websocket`);\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n\n const client = new Centrifuge(url.toString(), { token: params.token });\n const sub = client.newSubscription(params.channelName);\n\n return new Promise((resolve, reject) => {\n const cleanupWithResolve = (data: any) => {\n cleanup();\n resolve(data);\n };\n\n const listener = makeMessageListener(\n params.baseURL,\n { resolve: cleanupWithResolve, reject },\n params.executionId,\n params.returnAllOutputs,\n params.headers\n );\n\n sub.on(\"publication\", (message) => {\n listener({\n name: message.data.message_name,\n data: message.data.data,\n });\n });\n\n const timeout = setTimeout(() => {\n reject(\n new Error(\"Workflow execution did not complete properly (timeout)\")\n );\n }, params.timeout);\n\n const cleanup = () => {\n clearTimeout(timeout);\n sub.unsubscribe();\n client.disconnect();\n };\n\n sub.on(\"error\", (err) => {\n cleanup();\n reject(`Centrifugo subscription error: ${err}`);\n });\n\n client.on(\"error\", (err) => {\n cleanup();\n reject(`Centrifugo client error: ${err}`);\n });\n\n sub.subscribe();\n client.connect();\n });\n};\n\nexport const runWorkflowRequest = async ({\n workflow_name,\n input_variables,\n metadata = {},\n workflow_label_name = null,\n workflow_version_number = null,\n return_all_outputs = false,\n api_key,\n timeout = 3600000, // Default timeout is 1 hour in milliseconds\n baseURL,\n}: RunWorkflowRequestParams): Promise<WorkflowResponse> => {\n const payload = {\n input_variables,\n metadata,\n workflow_label_name,\n workflow_version_number,\n return_all_outputs,\n };\n\n const headers = { \"Content-Type\": \"application/json\", \"X-API-KEY\": api_key, ...getCommonHeaders() };\n\n try {\n const response = await fetchWithRetry(\n `${baseURL}/workflows/${encodeURIComponent(workflow_name)}/run`,\n {\n method: \"POST\",\n headers: headers,\n body: JSON.stringify(payload),\n }\n );\n\n if (response.status !== 201) {\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n message: `Failed to run workflow: ${\n errorData.error || response.statusText\n }`,\n };\n }\n\n const result = await response.json();\n if (result.warning) {\n console.warn(`WARNING: ${result.warning}`);\n }\n const execution_id = result.workflow_version_execution_id;\n if (!execution_id) {\n console.log(\"No execution ID returned from workflow run\");\n return { success: false, message: \"Failed to run workflow\" };\n }\n\n const channel_name = `workflow_updates:${execution_id}`;\n const ws_response = await fetchWithRetry(\n `${baseURL}/ws-token-request-library?capability=${channel_name}`,\n {\n method: \"POST\",\n headers: headers,\n }\n );\n\n const ws_token_response = await ws_response.json();\n const token = ws_token_response.token_details.token;\n\n const params: WaitForWorkflowCompletionParams = {\n token,\n channelName: channel_name,\n executionId: execution_id,\n returnAllOutputs: return_all_outputs,\n headers: headers,\n timeout: timeout,\n baseURL: baseURL,\n };\n if (ws_token_response.messaging_backend === \"centrifugo\")\n return waitForWorkflowCompletionCentrifugo(params);\n return await waitForWorkflowCompletion(params);\n } catch (error) {\n console.error(\n `Failed to run workflow: ${\n error instanceof Error ? error.message : error\n }`\n );\n throw error;\n }\n};\n\nasync function* proxyGenerator<Item>(\n apiKey: string,\n baseURL: string,\n generator: AsyncIterable<Item>,\n body: TrackRequest,\n throwOnError: boolean = true\n) {\n const results = [];\n for await (const value of generator) {\n yield body.return_pl_id ? [value, null] : value;\n results.push(value);\n }\n const request_response = cleaned_result(results, body.function_name);\n const response = await promptLayerApiRequest(\n apiKey,\n baseURL,\n {\n ...body,\n request_response,\n request_end_time: new Date().toISOString(),\n },\n throwOnError\n );\n if (response) {\n if (body.return_pl_id) {\n const request_id = (response as any)[1];\n const lastResult = results.at(-1);\n yield [lastResult, request_id];\n }\n }\n}\n\nconst warnOnBadResponse = (request_response: any, main_message: string) => {\n try {\n console.warn(`${main_message}: ${request_response.message}`);\n } catch (e) {\n console.warn(`${main_message}: ${request_response}`);\n }\n};\n\nconst trackRequest = async (\n baseURL: string,\n body: TrackRequest,\n throwOnError: boolean = true\n) => {\n try {\n const response = await fetchWithRetry(`${baseURL}/track-request`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...getCommonHeaders() },\n body: JSON.stringify(body),\n });\n const data = await response.json();\n if (response.status !== 200) {\n const errorMessage =\n data.message || data.error || \"Failed to track request\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While logging your request, PromptLayer experienced the following error:\"\n );\n }\n }\n return data;\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n console.warn(\n `WARNING: While logging your request PromptLayer had the following error: ${e}`\n );\n }\n return {};\n};\n\nconst openaiChatRequest = async (client: TypeOpenAI, kwargs: any) => {\n return await client.chat.completions.create(kwargs);\n};\n\nconst openaiCompletionsRequest = async (client: TypeOpenAI, kwargs: any) => {\n return await client.completions.create(kwargs);\n};\n\nconst MAP_TYPE_TO_OPENAI_FUNCTION = {\n chat: openaiChatRequest,\n completion: openaiCompletionsRequest,\n};\n\nconst openaiRequest = async (\n promptBlueprint: GetPromptTemplateResponse,\n kwargs: any\n) => {\n const OpenAI = require(\"openai\").default;\n const client = new OpenAI({\n baseURL: kwargs.baseURL,\n apiKey: kwargs.apiKey,\n });\n\n delete kwargs?.apiKey;\n delete kwargs?.baseURL;\n\n const api_type = promptBlueprint.metadata?.model?.api_type;\n if (api_type === \"chat-completions\") {\n const requestToMake =\n MAP_TYPE_TO_OPENAI_FUNCTION[promptBlueprint.prompt_template.type];\n return await requestToMake(client, kwargs);\n } else if (api_type === \"images\") {\n return await client.images.generate(kwargs);\n } else {\n return await client.responses.create(kwargs);\n }\n};\n\nconst azureOpenAIRequest = async (\n promptBlueprint: GetPromptTemplateResponse,\n kwargs: any\n) => {\n const { AzureOpenAI } = require(\"openai\");\n const client = new AzureOpenAI({\n endpoint: process.env.AZURE_OPENAI_ENDPOINT || kwargs.baseURL,\n apiVersion: process.env.OPENAI_API_VERSION || kwargs.apiVersion,\n apiKey: process.env.AZURE_OPENAI_API_KEY || kwargs.apiKey,\n });\n delete kwargs?.baseURL;\n delete kwargs?.apiVersion;\n delete kwargs?.apiKey;\n\n const api_type = promptBlueprint.metadata?.model?.api_type;\n\n if (api_type === \"chat-completions\") {\n const requestToMake = MAP_TYPE_TO_OPENAI_FUNCTION[promptBlueprint.prompt_template.type];\n return await requestToMake(client, kwargs);\n } else if (api_type === \"images\") {\n return await client.images.generate(kwargs);\n } else {\n return await client.responses.create(kwargs);\n }\n};\n\nconst anthropicChatRequest = async (\n client: TypeAnthropic | AnthropicVertex | AnthropicBedrock,\n kwargs: any\n) => {\n return client.messages.create(kwargs);\n};\n\nconst anthropicCompletionsRequest = async (\n client: TypeAnthropic | AnthropicBedrock,\n kwargs: any\n) => {\n return client.completions.create(kwargs);\n};\n\nconst MAP_TYPE_TO_ANTHROPIC_FUNCTION = {\n chat: anthropicChatRequest,\n completion: anthropicCompletionsRequest,\n};\n\nconst anthropicRequest = async (\n promptBlueprint: GetPromptTemplateResponse,\n kwargs: any\n) => {\n const Anthropic = require(\"@anthropic-ai/sdk\").default;\n const client = new Anthropic({\n baseURL: kwargs.baseURL,\n apiKey: kwargs.apiKey,\n });\n const requestToMake =\n MAP_TYPE_TO_ANTHROPIC_FUNCTION[promptBlueprint.prompt_template.type];\n return requestToMake(client, kwargs);\n};\n\nconst utilLogRequest = async (\n apiKey: string,\n baseURL: string,\n body: LogRequest,\n throwOnError: boolean = true\n): Promise<RequestLog | null> => {\n try {\n const response = await fetchWithRetry(`${baseURL}/log-request`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-API-KEY\": apiKey, ...getCommonHeaders() },\n body: JSON.stringify(body),\n });\n const data = await response.json();\n if (response.status !== 201) {\n const errorMessage =\n data.message || data.error || \"Failed to log request\";\n if (throwOnError) {\n throw new Error(errorMessage);\n } else {\n warnOnBadResponse(\n data,\n \"WARNING: While logging your request PromptLayer had the following error\"\n );\n return null;\n }\n }\n return data;\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n console.warn(\n `WARNING: While tracking your prompt PromptLayer had the following error: ${e}`\n );\n return null;\n }\n};\n\nconst googleChatRequest = async (model_client: any, kwargs: any) => {\n const history = kwargs?.history;\n const generationConfig = kwargs?.generationConfig;\n const lastMessage =\n history.length > 0 ? history[history.length - 1]?.parts : \"\";\n const chat = model_client.chats.create({\n model: kwargs?.model,\n history: history.slice(0, -1) ?? [],\n config: generationConfig,\n });\n\n if (kwargs?.stream)\n return await chat.sendMessageStream({ message: lastMessage });\n return await chat.sendMessage({ message: lastMessage });\n};\n\nconst googleCompletionsRequest = async (\n model_client: any,\n { stream, ...kwargs }: any\n) => {\n if (stream) return await model_client.generateContentStream({ ...kwargs });\n return await model_client.generateContent({ ...kwargs });\n};\n\nconst MAP_TYPE_TO_GOOGLE_FUNCTION = {\n chat: googleChatRequest,\n completion: googleCompletionsRequest,\n};\n\nconst googleRequest = async (\n promptBlueprint: GetPromptTemplateResponse,\n kwargs: any\n) => {\n const { GoogleGenAI } = await import(\"@google/genai\");\n\n const geminiAPI = process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY;\n const project =\n process.env.VERTEX_AI_PROJECT_ID ||\n process.env.GOOGLE_PROJECT_ID ||\n process.env.GOOGLE_CLOUD_PROJECT;\n const location =\n process.env.VERTEX_AI_PROJECT_LOCATION ||\n process.env.GOOGLE_PROJECT_LOCATION ||\n process.env.GOOGLE_CLOUD_PROJECT_LOCATION;\n const googleAuthOptions = {\n keyFilename: process.env.GOOGLE_APPLICATION_CREDENTIALS,\n projectId: project,\n scopes: [\"https://www.googleapis.com/auth/cloud-platform\"],\n };\n\n const genAI = geminiAPI\n ? new GoogleGenAI({ apiKey: geminiAPI })\n : new GoogleGenAI({\n vertexai: true,\n project: project,\n location: location,\n googleAuthOptions,\n });\n const requestToMake =\n MAP_TYPE_TO_GOOGLE_FUNCTION[promptBlueprint.prompt_template.type];\n\n return await requestToMake(genAI, kwargs);\n};\n\nconst snakeToCamel = (str: string): string =>\n str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n\nconst convertKeysToCamelCase = <T>(\n obj: T,\n ignoreValuesWithKeys: Set<string> = new Set()\n): T => {\n if (!obj || typeof obj !== \"object\") return obj;\n if (Array.isArray(obj))\n return obj.map((item) =>\n convertKeysToCamelCase(item, ignoreValuesWithKeys)\n ) as T;\n\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => {\n if (ignoreValuesWithKeys.has(key)) {\n return [snakeToCamel(key), value];\n }\n return [\n snakeToCamel(key),\n convertKeysToCamelCase(value, ignoreValuesWithKeys),\n ];\n })\n ) as T;\n};\n\nconst configureProviderSettings = (\n promptBlueprint: any,\n customProvider: any,\n modelParameterOverrides: any = {},\n stream: boolean = false\n) => {\n const provider_type =\n customProvider?.client ?? promptBlueprint.metadata?.model?.provider;\n const api_type = promptBlueprint.metadata?.model?.api_type;\n\n if (!provider_type) {\n throw new Error(\n \"Provider type not found in prompt blueprint or custom provider\"\n );\n }\n\n let kwargs = {\n ...(promptBlueprint.llm_kwargs || {}),\n stream,\n };\n\n if (\n [\"google\", \"vertexai\"].includes(provider_type) &&\n promptBlueprint.metadata?.model?.name.startsWith(\"gemini\")\n )\n kwargs = convertKeysToCamelCase(\n kwargs,\n new Set([\"function_declarations\", \"properties\"])\n );\n\n const providerConfig = {\n baseURL: customProvider?.base_url ?? promptBlueprint.provider_base_url?.url,\n apiKey: customProvider?.api_key,\n };\n\n Object.entries(providerConfig).forEach(([key, value]) => {\n if (value !== undefined) {\n kwargs[key] = value;\n }\n });\n\n if (stream && STREAMING_PROVIDERS_WITH_USAGE.includes(provider_type as any) && api_type === \"chat-completions\") {\n kwargs.stream_options = { include_usage: true };\n }\n\n return { provider_type, kwargs };\n};\n\nconst getProviderConfig = (provider_type: string, promptTemplate: any) => {\n const providerMap =\n MAP_PROVIDER_TO_FUNCTION_NAME[\n provider_type as keyof typeof MAP_PROVIDER_TO_FUNCTION_NAME\n ];\n\n if (!providerMap) {\n throw new Error(`Unsupported provider type: ${provider_type}`);\n }\n\n const templateType = promptTemplate.type as keyof typeof providerMap;\n const config = providerMap[templateType];\n\n if (!config) {\n throw new Error(\n `Unsupported template type '${promptTemplate.type}' for provider '${provider_type}'`\n );\n }\n\n return config;\n};\n\nconst vertexaiRequest = async (\n promptBlueprint: GetPromptTemplateResponse,\n kwargs: any\n) => {\n const model = promptBlueprint.metadata?.model;\n if (!model) throw new Error(\"Model metadata not found in prompt blueprint\");\n if (model.name.startsWith(\"gemini\"))\n return googleRequest(promptBlueprint, kwargs);\n if (model.name.startsWith(\"claude\")) {\n const { AnthropicVertex } = await import(\"@anthropic-ai/vertex-sdk\");\n const client = new AnthropicVertex({ baseURL: kwargs.baseURL });\n if (promptBlueprint.prompt_template.type === \"chat\")\n return anthropicChatRequest(client, kwargs);\n throw new Error(\n `Unsupported prompt template type '${promptBlueprint.prompt_template.type}' for Anthropic Vertex AI`\n );\n }\n throw new Error(\n `Unsupported model name '${model.name}' for Vertex AI request`\n );\n};\n\nconst amazonBedrockRequest = async (\n promptBlueprint: GetPromptTemplateResponse,\n kwargs: any\n) => {\n const { BedrockRuntimeClient, ConverseCommand, ConverseStreamCommand } =\n await import(\"@aws-sdk/client-bedrock-runtime\");\n const client = new BedrockRuntimeClient({\n credentials: {\n accessKeyId: kwargs?.aws_access_key || process.env.AWS_ACCESS_KEY_ID,\n secretAccessKey:\n kwargs?.aws_secret_key || process.env.AWS_SECRET_ACCESS_KEY,\n sessionToken: kwargs?.aws_session_token || process.env.AWS_SESSION_TOKEN,\n },\n region:\n kwargs?.aws_region ||\n process.env.AWS_REGION ||\n process.env.AWS_DEFAULT_REGION ||\n \"us-east-1\",\n });\n\n if (kwargs?.stream) {\n delete kwargs.stream;\n const command = new ConverseStreamCommand({\n ...kwargs,\n });\n return await client.send(command);\n } else {\n delete kwargs?.stream;\n const command = new ConverseCommand({\n ...kwargs,\n });\n return await client.send(command);\n }\n};\n\nconst anthropicBedrockRequest = async (\n promptBlueprint: GetPromptTemplateResponse,\n kwargs: any\n) => {\n const { AnthropicBedrock } = await import(\"@anthropic-ai/bedrock-sdk\");\n const client = new AnthropicBedrock({\n awsAccessKey: kwargs.aws_access_key,\n awsSecretKey: kwargs.aws_secret_key,\n awsRegion: kwargs.aws_region,\n awsSessionToken: kwargs.aws_session_token,\n baseURL: kwargs.base_url,\n });\n\n const requestToMake =\n MAP_TYPE_TO_ANTHROPIC_FUNCTION[promptBlueprint.prompt_template.type];\n return requestToMake(client, kwargs);\n};\n\nconst mistralRequest = async (\n promptBlueprint: GetPromptTemplateResponse,\n kwargs: any\n) => {\n const { Mistral } = await import(\"@mistralai/mistralai\");\n const client = new Mistral({ apiKey: process.env.MISTRAL_API_KEY });\n kwargs = convertKeysToCamelCase(kwargs, new Set());\n if (kwargs?.stream) {\n delete kwargs.stream;\n return await client.chat.stream(kwargs);\n }\n delete kwargs.stream;\n return await client.chat.complete(kwargs);\n};\n\nexport const readEnv = (env: string): string | undefined => {\n if (typeof (globalThis as any).process !== \"undefined\")\n return (globalThis as any).process.env?.[env]?.trim() ?? undefined;\n\n if (typeof (globalThis as any).Deno !== \"undefined\")\n return (globalThis as any).Deno.env?.get?.(env)?.trim();\n return undefined;\n};\n\nexport const requirePromptLayerApiKey = (apiKey?: string): string => {\n if (apiKey !== undefined) {\n const explicitApiKey = apiKey.trim();\n if (!explicitApiKey) {\n throw new Error(\n \"PromptLayer API key not provided. Please set PROMPTLAYER_API_KEY or pass apiKey.\"\n );\n }\n return explicitApiKey;\n }\n\n const envApiKey = readEnv(\"PROMPTLAYER_API_KEY\");\n if (!envApiKey) {\n throw new Error(\n \"PromptLayer API key not provided. Please set PROMPTLAYER_API_KEY or pass apiKey.\"\n );\n }\n\n return envApiKey;\n};\n\nexport {\n amazonBedrockRequest,\n anthropicBedrockRequest,\n anthropicRequest,\n azureOpenAIRequest,\n configureProviderSettings,\n getAllPromptTemplates,\n getPromptTemplate,\n getProviderConfig,\n googleRequest,\n mistralRequest,\n openaiRequest,\n promptlayerApiHandler,\n promptLayerApiRequest,\n promptLayerCreateGroup,\n promptLayerTrackGroup,\n promptLayerTrackMetadata,\n promptLayerTrackPrompt,\n promptLayerTrackScore,\n publishPromptTemplate,\n trackRequest,\n utilLogRequest,\n vertexaiRequest,\n warnOnBadResponse,\n};\n","import { SDK_VERSION } from \"@/utils/utils\";\nimport type {\n Span as AgentsSpan,\n SpanData,\n Trace as AgentsTrace,\n} from \"@openai/agents\";\nimport type { AttributeValue } from \"@/integrations/openai-agents/types\";\n\nconst SPAN_KIND_INTERNAL = 1;\nconst SPAN_KIND_CLIENT = 3;\n\ntype AttributeMap = Record<string, AttributeValue>;\ntype NormalizedMessage = Record<string, AttributeValue>;\ntype NormalizedToolCall = {\n id: string;\n type: \"tool_call\";\n name: string;\n arguments: AttributeValue;\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n};\n\nconst isScalar = (value: unknown): value is string | number | boolean => {\n return (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n );\n};\n\nconst sanitizeKey = (key: string): string => {\n return key.replace(/[^a-zA-Z0-9_.-]/g, \"_\");\n};\n\nconst toJsonable = (value: unknown): AttributeValue => {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => toJsonable(item));\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, toJsonable(item)])\n );\n }\n\n return String(value);\n};\n\nconst stableStringify = (value: unknown): string => {\n const normalize = (input: unknown): unknown => {\n if (Array.isArray(input)) {\n return input.map((item) => normalize(item));\n }\n\n if (isPlainObject(input)) {\n return Object.keys(input)\n .sort()\n .reduce<Record<string, unknown>>((acc, key) => {\n acc[key] = normalize(input[key]);\n return acc;\n }, {});\n }\n\n return input;\n };\n\n return JSON.stringify(normalize(toJsonable(value)));\n};\n\nconst setStringAttr = (attrs: AttributeMap, key: string, value: unknown) => {\n if (value !== undefined && value !== null && value !== \"\") {\n attrs[key] = String(value);\n }\n};\n\nconst setNumberAttr = (attrs: AttributeMap, key: string, value: unknown) => {\n if (value !== undefined && value !== null && value !== \"\") {\n const numericValue = Number(value);\n if (!Number.isNaN(numericValue)) {\n attrs[key] = numericValue;\n }\n }\n};\n\nconst setJsonAttr = (\n attrs: AttributeMap,\n key: string,\n value: unknown,\n includeRawPayloads: boolean\n) => {\n if (includeRawPayloads && value !== undefined && value !== null) {\n attrs[key] = stableStringify(value);\n }\n};\n\nconst flattenIndexedMessages = (\n prefix: string,\n messages: NormalizedMessage[],\n attrs: AttributeMap\n) => {\n messages.forEach((message, index) => {\n Object.entries(message).forEach(([key, value]) => {\n attrs[`${prefix}.${index}.${key}`] = isScalar(value)\n ? value\n : stableStringify(value);\n });\n });\n};\n\nconst normalizeToolCalls = (toolCalls: unknown): NormalizedToolCall[] => {\n if (!Array.isArray(toolCalls)) {\n return [];\n }\n\n return toolCalls\n .map((call) => {\n if (!isPlainObject(call)) {\n return null;\n }\n\n const functionData = isPlainObject(call.function) ? call.function : null;\n const name = functionData?.name ?? call.name ?? \"tool\";\n let argumentsValue =\n functionData?.arguments ?? call.arguments ?? {};\n\n if (typeof argumentsValue === \"string\") {\n try {\n argumentsValue = JSON.parse(argumentsValue);\n } catch {\n argumentsValue = argumentsValue;\n }\n }\n\n return {\n id: String(call.id ?? \"\"),\n type: \"tool_call\",\n name: String(name),\n arguments: toJsonable(argumentsValue),\n };\n })\n .filter((call): call is NormalizedToolCall => call !== null);\n};\n\nconst getCallId = (item: Record<string, unknown>): string | undefined => {\n const value = item.call_id ?? item.callId ?? item.id;\n return value !== undefined && value !== null ? String(value) : undefined;\n};\n\nconst normalizeToolOutputContent = (output: unknown): string | undefined => {\n if (output === undefined || output === null) {\n return undefined;\n }\n\n if (typeof output === \"string\") {\n return output;\n }\n\n if (Array.isArray(output)) {\n const textContent = extractTextContent(output);\n return textContent ?? stableStringify(output);\n }\n\n if (isPlainObject(output)) {\n const textContent = extractTextContent([output]);\n return textContent ?? stableStringify(output);\n }\n\n const textContent = extractTextContent(output);\n if (textContent !== undefined) {\n return textContent;\n }\n\n return stableStringify(output);\n};\n\nconst normalizeToolCallMessage = (\n item: Record<string, unknown>\n): NormalizedMessage | null => {\n let argumentsValue = item.arguments ?? {};\n if (typeof argumentsValue === \"string\") {\n try {\n argumentsValue = JSON.parse(argumentsValue);\n } catch {\n argumentsValue = argumentsValue;\n }\n }\n\n return {\n role: \"assistant\",\n tool_calls: [\n {\n id: getCallId(item) ?? \"\",\n type: \"tool_call\",\n name: String(item.name ?? \"tool\"),\n arguments: toJsonable(argumentsValue),\n },\n ],\n };\n};\n\nconst normalizeToolResultMessage = (\n item: Record<string, unknown>,\n outputOverride?: unknown\n): NormalizedMessage | null => {\n const toolCallId = getCallId(item);\n const content = normalizeToolOutputContent(\n outputOverride ?? item.output ?? item.content\n );\n\n if (!toolCallId && !content) {\n return null;\n }\n\n const message: NormalizedMessage = {\n role: \"tool\",\n };\n\n if (toolCallId) {\n message.tool_call_id = toolCallId;\n }\n\n if (content !== undefined) {\n message.content = content;\n }\n\n return message;\n};\n\nfunction extractTextContent(content: unknown): string | undefined {\n if (content === undefined || content === null) {\n return undefined;\n }\n\n if (typeof content === \"string\") {\n return content;\n }\n\n if (Array.isArray(content)) {\n const textParts = content\n .map((part) => {\n if (!isPlainObject(part)) {\n return null;\n }\n\n const partType = part.type;\n if (\n partType === \"text\" ||\n partType === \"input_text\" ||\n partType === \"output_text\"\n ) {\n const text = part.text ?? part.content;\n return text !== undefined && text !== null ? String(text) : null;\n }\n\n return null;\n })\n .filter((part): part is string => part !== null);\n\n return textParts.length > 0 ? textParts.join(\"\\n\") : undefined;\n }\n\n return String(content);\n}\n\nexport const normalizeMessages = (items: unknown): NormalizedMessage[] => {\n if (!Array.isArray(items)) {\n return [];\n }\n\n return items\n .map((item) => {\n if (!isPlainObject(item)) {\n return null;\n }\n\n const normalized: NormalizedMessage = {};\n if (item.role !== undefined) {\n normalized.role = String(item.role);\n }\n\n const content = extractTextContent(item.content);\n if (content) {\n normalized.content = content;\n }\n\n const toolCalls = normalizeToolCalls(item.tool_calls);\n if (toolCalls.length > 0) {\n normalized.tool_calls = toolCalls;\n }\n\n if (item.tool_call_id) {\n normalized.tool_call_id = String(item.tool_call_id);\n }\n\n return Object.keys(normalized).length > 0 ? normalized : null;\n })\n .filter((message): message is NormalizedMessage => message !== null);\n};\n\nconst normalizeResponseMessage = (\n item: Record<string, unknown>\n): NormalizedMessage | null => {\n const message: NormalizedMessage = {};\n const role = item.role;\n const content = extractTextContent(item.content);\n const toolCalls = normalizeToolCalls(item.tool_calls);\n\n if (role !== undefined && role !== null) {\n message.role = String(role);\n } else if (content || toolCalls.length > 0) {\n message.role = \"assistant\";\n }\n\n if (content) {\n message.content = content;\n }\n\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n\n if (item.tool_call_id) {\n message.tool_call_id = String(item.tool_call_id);\n }\n\n return Object.keys(message).length > 0 ? message : null;\n};\n\nconst RAW_TOOL_CALL_ITEM_TYPES = new Set([\n \"function_call\",\n \"computer_call\",\n \"shell_call\",\n \"apply_patch_call\",\n \"custom_tool_call\",\n \"mcp_call\",\n]);\n\nconst RAW_TOOL_RESULT_ITEM_TYPES = new Set([\n \"function_call_output\",\n \"function_call_result\",\n \"computer_call_output\",\n \"computer_call_result\",\n \"shell_call_output\",\n \"apply_patch_call_output\",\n \"custom_tool_call_output\",\n]);\n\nexport const normalizeResponseItems = (items: unknown): NormalizedMessage[] => {\n if (typeof items === \"string\") {\n return [{ role: \"user\", content: items }];\n }\n\n if (!Array.isArray(items)) {\n return [];\n }\n\n return items\n .flatMap((item) => {\n if (!isPlainObject(item)) {\n return [];\n }\n\n if (item.type === \"message_output_item\" && isPlainObject(item.rawItem)) {\n const message = normalizeResponseMessage(item.rawItem);\n return message ? [message] : [];\n }\n\n if (item.type === \"tool_call_item\" && isPlainObject(item.rawItem)) {\n const message = normalizeToolCallMessage(item.rawItem);\n return message ? [message] : [];\n }\n\n if (item.type === \"tool_call_output_item\" && isPlainObject(item.rawItem)) {\n const message = normalizeToolResultMessage(item.rawItem, item.output);\n return message ? [message] : [];\n }\n\n if (typeof item.type === \"string\" && RAW_TOOL_CALL_ITEM_TYPES.has(item.type)) {\n const message = normalizeToolCallMessage(item);\n return message ? [message] : [];\n }\n\n if (\n typeof item.type === \"string\" &&\n RAW_TOOL_RESULT_ITEM_TYPES.has(item.type)\n ) {\n const message = normalizeToolResultMessage(item);\n return message ? [message] : [];\n }\n\n const message = normalizeResponseMessage(item);\n return message ? [message] : [];\n })\n .filter((message): message is NormalizedMessage => message !== null);\n};\n\nconst applyUsageAttributes = (attrs: AttributeMap, usage: unknown) => {\n if (!isPlainObject(usage)) {\n return;\n }\n\n setNumberAttr(\n attrs,\n \"gen_ai.usage.input_tokens\",\n usage.input_tokens ?? usage.prompt_tokens\n );\n setNumberAttr(\n attrs,\n \"gen_ai.usage.output_tokens\",\n usage.output_tokens ?? usage.completion_tokens\n );\n};\n\nconst generationAttributes = (\n spanData: Extract<SpanData, { type: \"generation\" }>,\n includeRawPayloads: boolean\n): AttributeMap => {\n const attrs: AttributeMap = {\n \"gen_ai.provider.name\": \"openai.responses\",\n };\n\n setStringAttr(attrs, \"gen_ai.request.model\", spanData.model);\n applyUsageAttributes(attrs, spanData.usage);\n flattenIndexedMessages(\"gen_ai.prompt\", normalizeMessages(spanData.input), attrs);\n flattenIndexedMessages(\n \"gen_ai.completion\",\n normalizeMessages(spanData.output),\n attrs\n );\n setJsonAttr(\n attrs,\n \"openai_agents.model_config_json\",\n spanData.model_config,\n includeRawPayloads\n );\n setJsonAttr(\n attrs,\n \"openai_agents.generation.raw_input_json\",\n spanData.input,\n includeRawPayloads\n );\n setJsonAttr(\n attrs,\n \"openai_agents.generation.raw_output_json\",\n spanData.output,\n includeRawPayloads\n );\n\n return attrs;\n};\n\nconst responseAttributes = (\n spanData: Extract<SpanData, { type: \"response\" }>,\n includeRawPayloads: boolean\n): AttributeMap => {\n const attrs: AttributeMap = {\n \"gen_ai.provider.name\": \"openai.responses\",\n };\n const responseObject = isPlainObject(spanData._response) ? spanData._response : {};\n const usage =\n isPlainObject(responseObject.usage) ? responseObject.usage : undefined;\n\n setStringAttr(\n attrs,\n \"gen_ai.request.model\",\n responseObject.model\n );\n setStringAttr(\n attrs,\n \"gen_ai.response.model\",\n responseObject.model\n );\n setStringAttr(\n attrs,\n \"gen_ai.response.id\",\n spanData.response_id ?? responseObject.id ?? responseObject.response_id\n );\n applyUsageAttributes(attrs, usage);\n flattenIndexedMessages(\n \"gen_ai.prompt\",\n normalizeResponseItems(spanData._input ?? responseObject.input),\n attrs\n );\n flattenIndexedMessages(\n \"gen_ai.completion\",\n normalizeResponseItems(responseObject.output),\n attrs\n );\n setJsonAttr(\n attrs,\n \"openai_agents.response.raw_json\",\n responseObject,\n includeRawPayloads\n );\n setStringAttr(\n attrs,\n \"openai_agents.response.object\",\n responseObject.object\n );\n\n return attrs;\n};\n\nconst functionAttributes = (\n spanData: Extract<SpanData, { type: \"function\" }>,\n includeRawPayloads: boolean\n): AttributeMap => {\n const attrs: AttributeMap = {\n node_type: \"CODE_EXECUTION\",\n tool_name: spanData.name,\n \"openai_agents.function.name\": spanData.name,\n };\n\n setStringAttr(attrs, \"function_input\", spanData.input);\n setStringAttr(attrs, \"function_output\", spanData.output);\n setStringAttr(attrs, \"openai_agents.function.input\", spanData.input);\n setStringAttr(attrs, \"openai_agents.function.output\", spanData.output);\n setJsonAttr(\n attrs,\n \"openai_agents.function.mcp_data_json\",\n spanData.mcp_data,\n includeRawPayloads\n );\n\n return attrs;\n};\n\nconst agentAttributes = (\n spanData: Extract<SpanData, { type: \"agent\" }>,\n includeRawPayloads: boolean\n): AttributeMap => {\n const attrs: AttributeMap = {\n \"openai_agents.agent.name\": spanData.name,\n };\n\n setStringAttr(attrs, \"openai_agents.agent.output_type\", spanData.output_type);\n setJsonAttr(\n attrs,\n \"openai_agents.agent.handoffs_json\",\n spanData.handoffs,\n includeRawPayloads\n );\n setJsonAttr(\n attrs,\n \"openai_agents.agent.tools_json\",\n spanData.tools,\n includeRawPayloads\n );\n\n return attrs;\n};\n\nconst handoffAttributes = (\n spanData: Extract<SpanData, { type: \"handoff\" }>\n): AttributeMap => {\n const attrs: AttributeMap = {};\n setStringAttr(attrs, \"openai_agents.handoff.from_agent\", spanData.from_agent);\n setStringAttr(attrs, \"openai_agents.handoff.to_agent\", spanData.to_agent);\n return attrs;\n};\n\nconst guardrailAttributes = (\n spanData: Extract<SpanData, { type: \"guardrail\" }>\n): AttributeMap => {\n return {\n \"openai_agents.guardrail.name\": spanData.name,\n \"openai_agents.guardrail.triggered\": spanData.triggered,\n };\n};\n\nconst customAttributes = (\n spanData: Extract<SpanData, { type: \"custom\" }>,\n includeRawPayloads: boolean\n): AttributeMap => {\n const attrs: AttributeMap = {\n \"openai_agents.custom.name\": spanData.name,\n };\n setJsonAttr(\n attrs,\n \"openai_agents.custom.data_json\",\n spanData.data,\n includeRawPayloads\n );\n return attrs;\n};\n\nconst rawSpanDataAttributes = (\n spanData: SpanData,\n includeRawPayloads: boolean\n): AttributeMap => {\n if (!includeRawPayloads) {\n return {};\n }\n\n return {\n \"openai_agents.raw_json\": stableStringify(spanData),\n };\n};\n\nexport const telemetrySourceVersion = (): string => {\n return SDK_VERSION;\n};\n\nexport const spanKindFor = (span: Pick<AgentsSpan<any>, \"spanData\">): number => {\n return span.spanData.type === \"generation\" || span.spanData.type === \"response\"\n ? SPAN_KIND_CLIENT\n : SPAN_KIND_INTERNAL;\n};\n\nexport const spanNameFor = (span: Pick<AgentsSpan<any>, \"spanData\">): string => {\n switch (span.spanData.type) {\n case \"function\":\n return `Function: ${span.spanData.name}`;\n case \"agent\":\n return `Agent: ${span.spanData.name}`;\n case \"guardrail\":\n return `Guardrail: ${span.spanData.name}`;\n case \"custom\":\n return String(span.spanData.name);\n default:\n return span.spanData.type\n .split(\"_\")\n .map((part: string) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n }\n};\n\nexport const baseTraceAttributes = (\n trace: Pick<AgentsTrace, \"traceId\" | \"name\" | \"groupId\" | \"metadata\">,\n includeRawPayloads: boolean\n): AttributeMap => {\n const attrs: AttributeMap = {\n \"promptlayer.telemetry.source\": \"openai-agents-js\",\n \"promptlayer.telemetry.source_version\": telemetrySourceVersion(),\n \"openai_agents.trace_id_original\": trace.traceId,\n \"openai_agents.workflow_name\": trace.name,\n };\n\n if (trace.groupId) {\n attrs[\"openai_agents.group_id\"] = trace.groupId;\n }\n\n if (isPlainObject(trace.metadata)) {\n Object.entries(trace.metadata).forEach(([key, value]) => {\n if (isScalar(value)) {\n attrs[`openai_agents.metadata.${sanitizeKey(key)}`] = value;\n }\n });\n setJsonAttr(\n attrs,\n \"openai_agents.metadata_json\",\n trace.metadata,\n includeRawPayloads\n );\n }\n\n return attrs;\n};\n\nexport const baseSpanAttributes = (\n span: Pick<AgentsSpan<any>, \"spanId\" | \"parentId\" | \"spanData\">\n): AttributeMap => {\n const attrs: AttributeMap = {\n \"promptlayer.telemetry.source\": \"openai-agents-js\",\n \"promptlayer.telemetry.source_version\": telemetrySourceVersion(),\n \"openai_agents.span_id_original\": span.spanId,\n \"openai_agents.span_type\": span.spanData.type,\n };\n\n if (span.parentId) {\n attrs[\"openai_agents.parent_id_original\"] = span.parentId;\n }\n\n return attrs;\n};\n\nexport const spanDataAttributes = (\n spanData: SpanData,\n includeRawPayloads: boolean\n): AttributeMap => {\n switch (spanData.type) {\n case \"generation\":\n return generationAttributes(spanData, includeRawPayloads);\n case \"response\":\n return responseAttributes(spanData, includeRawPayloads);\n case \"function\":\n return functionAttributes(spanData, includeRawPayloads);\n case \"agent\":\n return agentAttributes(spanData, includeRawPayloads);\n case \"handoff\":\n return handoffAttributes(spanData);\n case \"guardrail\":\n return guardrailAttributes(spanData);\n case \"custom\":\n return customAttributes(spanData, includeRawPayloads);\n default:\n return rawSpanDataAttributes(spanData, includeRawPayloads);\n }\n};\n\nexport const OTLP_STATUS_CODE_UNSET = 0;\nexport const OTLP_STATUS_CODE_OK = 1;\nexport const OTLP_STATUS_CODE_ERROR = 2;\n","import { SDK_VERSION } from \"@/utils/utils\";\nimport type {\n AttributeValue,\n OtlpJsonPayload,\n OtlpSpanRecord,\n} from \"@/integrations/openai-agents/types\";\n\nconst toAnyValue = (value: AttributeValue): Record<string, unknown> => {\n if (typeof value === \"string\") {\n return { stringValue: value };\n }\n\n if (typeof value === \"boolean\") {\n return { boolValue: value };\n }\n\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) {\n return { intValue: String(value) };\n }\n return { doubleValue: value };\n }\n\n if (value === null) {\n return { stringValue: \"null\" };\n }\n\n if (Array.isArray(value)) {\n return {\n arrayValue: {\n values: value.map((item) => toAnyValue(item)),\n },\n };\n }\n\n return {\n kvlistValue: {\n values: Object.entries(value).map(([key, nestedValue]) => ({\n key,\n value: toAnyValue(nestedValue),\n })),\n },\n };\n};\n\nconst toKeyValues = (attributes: Record<string, AttributeValue>) => {\n return Object.entries(attributes).map(([key, value]) => ({\n key,\n value: toAnyValue(value),\n }));\n};\n\nexport interface BuildOtlpJsonPayloadOptions {\n serviceName?: string;\n scopeName?: string;\n scopeVersion?: string;\n}\n\nexport const buildOtlpJsonPayload = (\n spans: OtlpSpanRecord[],\n {\n serviceName = \"promptlayer-openai-agents-js\",\n scopeName = \"promptlayer.integrations.openai_agents\",\n scopeVersion = SDK_VERSION,\n }: BuildOtlpJsonPayloadOptions = {}\n): OtlpJsonPayload => {\n return {\n resourceSpans: [\n {\n resource: {\n attributes: toKeyValues({\n \"service.name\": serviceName,\n }),\n },\n scopeSpans: [\n {\n scope: {\n name: scopeName,\n version: scopeVersion,\n },\n spans: spans.map((span) => {\n const payload: Record<string, unknown> = {\n traceId: span.traceId,\n spanId: span.spanId,\n name: span.name,\n kind: span.kind,\n startTimeUnixNano: span.startTimeUnixNano,\n endTimeUnixNano: span.endTimeUnixNano ?? span.startTimeUnixNano,\n attributes: toKeyValues(span.attributes),\n events: (span.events ?? []).map((event) => ({\n name: event.name,\n timeUnixNano: event.timeUnixNano,\n attributes: toKeyValues(event.attributes ?? {}),\n })),\n links: [],\n };\n\n if (span.parentSpanId) {\n payload.parentSpanId = span.parentSpanId;\n }\n\n if (span.traceState) {\n payload.traceState = span.traceState;\n }\n\n if (span.status) {\n payload.status = {\n code: span.status.code,\n ...(span.status.message ? { message: span.status.message } : {}),\n };\n }\n\n return payload;\n }),\n },\n ],\n },\n ],\n };\n};\n","import { createHash } from \"crypto\";\n\nconst TRACE_HEX_RE = /^[0-9a-f]{32}$/i;\n\nconst sha256Hex = (value: string): string => {\n return createHash(\"sha256\").update(value, \"utf8\").digest(\"hex\");\n};\n\nexport const mapTraceId = (originalTraceId: string): string => {\n const suffix = originalTraceId.startsWith(\"trace_\")\n ? originalTraceId.slice(\"trace_\".length)\n : originalTraceId;\n\n if (TRACE_HEX_RE.test(suffix)) {\n return suffix.toLowerCase();\n }\n\n return sha256Hex(originalTraceId).slice(0, 32);\n};\n\nexport const mapSpanId = (originalSpanId: string): string => {\n return sha256Hex(originalSpanId).slice(0, 16);\n};\n\nexport const syntheticRootSpanId = (originalTraceId: string): string => {\n return sha256Hex(`${originalTraceId}:root`).slice(0, 16);\n};\n","const ISO_TIMESTAMP_RE =\n /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2})(?:\\.(\\d{1,9}))?(Z|[+-]\\d{2}:\\d{2})?$/;\n\nexport const nowUnixNano = (): string => {\n return (BigInt(Date.now()) * BigInt(1_000_000)).toString();\n};\n\nexport const isoToUnixNano = (\n timestamp: string | null | undefined\n): string | undefined => {\n if (!timestamp) {\n return undefined;\n }\n\n const match = ISO_TIMESTAMP_RE.exec(timestamp);\n if (!match) {\n const millis = Date.parse(timestamp);\n if (Number.isNaN(millis)) {\n return undefined;\n }\n return (BigInt(millis) * BigInt(1_000_000)).toString();\n }\n\n const [, base, fraction = \"\", timezone = \"Z\"] = match;\n const millis = Date.parse(`${base}${timezone}`);\n if (Number.isNaN(millis)) {\n return undefined;\n }\n\n const fractionalNanos = BigInt(\n (fraction + \"000000000\").slice(0, 9)\n );\n return (BigInt(millis) * BigInt(1_000_000) + fractionalNanos).toString();\n};\n\nexport const minUnixNano = (...values: Array<string | undefined>): string => {\n const filtered = values.filter((value): value is string => value !== undefined);\n if (filtered.length === 0) {\n return nowUnixNano();\n }\n\n return filtered.reduce((min, current) =>\n BigInt(current) < BigInt(min) ? current : min\n );\n};\n\nexport const maxUnixNano = (...values: Array<string | undefined>): string => {\n const filtered = values.filter((value): value is string => value !== undefined);\n if (filtered.length === 0) {\n return nowUnixNano();\n }\n\n return filtered.reduce((max, current) =>\n BigInt(current) > BigInt(max) ? current : max\n );\n};\n","export const trimTrailingSlashes = (value: string): string => {\n let end = value.length;\n\n while (end > 0 && value.charCodeAt(end - 1) === 47) {\n end -= 1;\n }\n\n return value.slice(0, end);\n};\n","import {\n OTLP_STATUS_CODE_ERROR,\n OTLP_STATUS_CODE_OK,\n OTLP_STATUS_CODE_UNSET,\n baseSpanAttributes,\n baseTraceAttributes,\n spanDataAttributes,\n spanKindFor,\n spanNameFor,\n} from \"@/integrations/openai-agents/mapping\";\nimport { buildOtlpJsonPayload } from \"@/integrations/openai-agents/otlp-json\";\nimport { mapSpanId, mapTraceId, syntheticRootSpanId } from \"@/integrations/openai-agents/ids\";\nimport {\n isoToUnixNano,\n maxUnixNano,\n minUnixNano,\n nowUnixNano,\n} from \"@/integrations/openai-agents/time\";\nimport { trimTrailingSlashes } from \"@/integrations/openai-agents/url\";\nimport type {\n OtlpSpanRecord,\n OtlpStatusRecord,\n} from \"@/integrations/openai-agents/types\";\nimport { fetchWithRetry, getCommonHeaders } from \"@/utils/utils\";\nimport type {\n Span as AgentsSpan,\n Trace as AgentsTrace,\n TracingProcessor,\n} from \"@openai/agents\";\n\nconst TRACEPARENT_RE = /^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/i;\nconst ZERO_TRACE_ID = \"0\".repeat(32);\nconst ZERO_SPAN_ID = \"0\".repeat(16);\n\ninterface UpstreamTraceContext {\n traceId: string;\n parentSpanId: string;\n traceState?: string;\n}\n\ntype TraceMetadataRecord = Record<string, unknown>;\n\ninterface TraceState {\n rootSpan: OtlpSpanRecord;\n spans: Map<string, OtlpSpanRecord>;\n}\n\nexport interface PromptLayerOpenAIAgentsProcessorOptions {\n apiKey: string;\n baseURL: string;\n includeRawPayloads?: boolean;\n}\n\nexport class PromptLayerOpenAIAgentsProcessor implements TracingProcessor {\n private readonly apiKey: string;\n private readonly baseURL: string;\n private readonly includeRawPayloads: boolean;\n private readonly traceStates = new Map<string, TraceState>();\n private readonly completedTraceQueue = new Map<\n string,\n ReturnType<typeof buildOtlpJsonPayload>\n >();\n private readonly pendingExports = new Map<string, Promise<void>>();\n\n constructor({\n apiKey,\n baseURL,\n includeRawPayloads = true,\n }: PromptLayerOpenAIAgentsProcessorOptions) {\n this.apiKey = apiKey;\n this.baseURL = trimTrailingSlashes(baseURL);\n this.includeRawPayloads = includeRawPayloads;\n }\n\n start(): void {}\n\n async onTraceStart(trace: AgentsTrace): Promise<void> {\n if (this.traceStates.has(trace.traceId)) {\n return;\n }\n\n const upstreamContext = this.resolveUpstreamTraceContext(trace.metadata);\n const traceId = upstreamContext?.traceId ?? mapTraceId(trace.traceId);\n this.traceStates.set(trace.traceId, {\n rootSpan: {\n traceId,\n spanId: syntheticRootSpanId(trace.traceId),\n name: trace.name || \"OpenAI Agents Trace\",\n kind: 1,\n startTimeUnixNano: nowUnixNano(),\n parentSpanId: upstreamContext?.parentSpanId,\n traceState: upstreamContext?.traceState,\n attributes: baseTraceAttributes(trace, this.includeRawPayloads),\n status: { code: OTLP_STATUS_CODE_UNSET },\n events: [],\n },\n spans: new Map(),\n });\n }\n\n async onTraceEnd(trace: AgentsTrace): Promise<void> {\n const state = this.traceStates.get(trace.traceId);\n if (!state) {\n return;\n }\n\n const childSpans = Array.from(state.spans.values()).sort((left, right) => {\n return BigInt(left.startTimeUnixNano) < BigInt(right.startTimeUnixNano)\n ? -1\n : 1;\n });\n const childStarts = childSpans.map((span) => span.startTimeUnixNano);\n const childEnds = childSpans.map(\n (span) => span.endTimeUnixNano ?? span.startTimeUnixNano\n );\n const rootEnd = maxUnixNano(nowUnixNano(), ...childEnds);\n\n state.rootSpan.startTimeUnixNano = minUnixNano(\n state.rootSpan.startTimeUnixNano,\n ...childStarts\n );\n state.rootSpan.endTimeUnixNano = rootEnd;\n\n const payload = buildOtlpJsonPayload([state.rootSpan, ...childSpans]);\n this.traceStates.delete(trace.traceId);\n this.completedTraceQueue.set(trace.traceId, payload);\n this.startExportForTrace(trace.traceId);\n }\n\n async onSpanStart(span: AgentsSpan<any>): Promise<void> {\n const state = this.ensureTraceStateForSpan(span);\n const existing = state.spans.get(span.spanId);\n const record = existing ?? this.createSpanRecord(span, state.rootSpan.spanId);\n\n record.traceId = state.rootSpan.traceId;\n record.traceState = state.rootSpan.traceState;\n record.name = spanNameFor(span);\n record.kind = spanKindFor(span);\n record.startTimeUnixNano = isoToUnixNano(span.startedAt) ?? record.startTimeUnixNano;\n record.parentSpanId = span.parentId\n ? mapSpanId(span.parentId)\n : state.rootSpan.spanId;\n record.attributes = {\n ...record.attributes,\n ...baseSpanAttributes(span),\n };\n\n state.spans.set(span.spanId, record);\n }\n\n async onSpanEnd(span: AgentsSpan<any>): Promise<void> {\n const state = this.ensureTraceStateForSpan(span);\n const record =\n state.spans.get(span.spanId) ??\n this.createSpanRecord(span, state.rootSpan.spanId);\n\n record.attributes = {\n ...record.attributes,\n ...spanDataAttributes(span.spanData, this.includeRawPayloads),\n };\n record.endTimeUnixNano =\n isoToUnixNano(span.endedAt) ?? record.endTimeUnixNano ?? nowUnixNano();\n record.status = this.statusForSpan(span);\n\n if (span.error) {\n record.events = [\n ...(record.events ?? []),\n {\n name: \"exception\",\n timeUnixNano: record.endTimeUnixNano,\n attributes: {\n \"exception.type\": \"OpenAIAgentsError\",\n \"exception.message\": span.error.message,\n \"openai_agents.error_json\": JSON.stringify(span.error),\n },\n },\n ];\n }\n\n state.spans.set(span.spanId, record);\n }\n\n async shutdown(): Promise<void> {\n await this.forceFlush();\n }\n\n async forceFlush(): Promise<void> {\n for (let pass = 0; pass < 2; pass += 1) {\n for (const traceId of this.completedTraceQueue.keys()) {\n this.startExportForTrace(traceId);\n }\n\n if (this.pendingExports.size === 0) {\n return;\n }\n\n await Promise.all(Array.from(this.pendingExports.values()));\n\n if (this.completedTraceQueue.size === 0) {\n return;\n }\n }\n }\n\n private traceLikeFromSpan(\n span: AgentsSpan<any>\n ): Pick<AgentsTrace, \"traceId\" | \"name\" | \"groupId\" | \"metadata\"> {\n const rawMetadata = this.asRecord(span.traceMetadata);\n const nestedMetadata = this.asRecord(rawMetadata?.metadata);\n\n return {\n traceId: span.traceId,\n name:\n this.readString(rawMetadata?.workflow_name) ??\n this.readString(rawMetadata?.workflowName) ??\n \"OpenAI Agents Trace\",\n groupId:\n this.readString(rawMetadata?.group_id) ??\n this.readString(rawMetadata?.groupId) ??\n null,\n metadata: nestedMetadata ?? rawMetadata ?? {},\n };\n }\n\n private ensureTraceStateForSpan(span: AgentsSpan<any>): TraceState {\n const existing = this.traceStates.get(span.traceId);\n if (existing) {\n return existing;\n }\n\n const traceLike = this.traceLikeFromSpan(span);\n\n const upstreamContext = this.resolveUpstreamTraceContext(traceLike.metadata);\n const traceId = upstreamContext?.traceId ?? mapTraceId(span.traceId);\n const state: TraceState = {\n rootSpan: {\n traceId,\n spanId: syntheticRootSpanId(span.traceId),\n name: traceLike.name,\n kind: 1,\n startTimeUnixNano: isoToUnixNano(span.startedAt) ?? nowUnixNano(),\n parentSpanId: upstreamContext?.parentSpanId,\n traceState: upstreamContext?.traceState,\n attributes: baseTraceAttributes(traceLike, this.includeRawPayloads),\n status: { code: OTLP_STATUS_CODE_UNSET },\n events: [],\n },\n spans: new Map(),\n };\n\n this.traceStates.set(span.traceId, state);\n return state;\n }\n\n private createSpanRecord(\n span: AgentsSpan<any>,\n rootSpanId: string\n ): OtlpSpanRecord {\n return {\n traceId:\n this.traceStates.get(span.traceId)?.rootSpan.traceId ?? mapTraceId(span.traceId),\n spanId: mapSpanId(span.spanId),\n parentSpanId: span.parentId ? mapSpanId(span.parentId) : rootSpanId,\n name: spanNameFor(span),\n kind: spanKindFor(span),\n startTimeUnixNano: isoToUnixNano(span.startedAt) ?? nowUnixNano(),\n traceState: this.traceStates.get(span.traceId)?.rootSpan.traceState,\n attributes: {\n ...baseSpanAttributes(span),\n },\n status: { code: OTLP_STATUS_CODE_UNSET },\n events: [],\n };\n }\n\n private statusForSpan(span: AgentsSpan<any>): OtlpStatusRecord {\n if (span.error) {\n return {\n code: OTLP_STATUS_CODE_ERROR,\n message: span.error.message,\n };\n }\n\n return {\n code: OTLP_STATUS_CODE_OK,\n };\n }\n\n private async exportPayload(payload: ReturnType<typeof buildOtlpJsonPayload>) {\n const response = await fetchWithRetry(`${this.baseURL}/v1/traces`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n \"X-PromptLayer-Integration\": \"openai-agents-js\",\n ...getCommonHeaders(),\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to export OpenAI Agents traces: ${response.status} ${response.statusText}`\n );\n }\n }\n\n private startExportForTrace(traceId: string): void {\n if (this.pendingExports.has(traceId)) {\n return;\n }\n\n const payload = this.completedTraceQueue.get(traceId);\n if (!payload) {\n return;\n }\n\n const exportPromise = this.exportPayload(payload)\n .then(() => {\n this.completedTraceQueue.delete(traceId);\n })\n .catch((error) => {\n console.error(\n `Failed to export OpenAI Agents trace '${traceId}'.`,\n error\n );\n })\n .finally(() => {\n this.pendingExports.delete(traceId);\n });\n\n this.pendingExports.set(traceId, exportPromise);\n }\n\n private resolveUpstreamTraceContext(\n metadata: AgentsTrace[\"metadata\"] | AgentsSpan<any>[\"traceMetadata\"]\n ): UpstreamTraceContext | null {\n const metadataRecord = this.asRecord(metadata);\n if (!metadataRecord) {\n return null;\n }\n\n const traceparent = metadataRecord.traceparent;\n if (typeof traceparent !== \"string\" || !traceparent.trim()) {\n return null;\n }\n\n const match = traceparent.trim().match(TRACEPARENT_RE);\n if (!match) {\n return null;\n }\n\n const [, version, traceId, parentSpanId] = match;\n const normalizedVersion = version.toLowerCase();\n const normalizedTraceId = traceId.toLowerCase();\n const normalizedParentSpanId = parentSpanId.toLowerCase();\n if (\n normalizedVersion === \"ff\" ||\n normalizedTraceId === ZERO_TRACE_ID ||\n normalizedParentSpanId === ZERO_SPAN_ID\n ) {\n return null;\n }\n\n const traceState =\n typeof metadataRecord.tracestate === \"string\" && metadataRecord.tracestate.trim()\n ? metadataRecord.tracestate.trim()\n : undefined;\n\n return {\n traceId: normalizedTraceId,\n parentSpanId: normalizedParentSpanId,\n traceState,\n };\n }\n\n private asRecord(value: unknown): TraceMetadataRecord | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n\n return value as TraceMetadataRecord;\n }\n\n private readString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n }\n}\n","import { PromptLayerOpenAIAgentsProcessor } from \"@/integrations/openai-agents/processor\";\nimport { trimTrailingSlashes } from \"@/integrations/openai-agents/url\";\nimport { readEnv, requirePromptLayerApiKey } from \"@/utils/utils\";\n\nexport interface InstrumentOpenAIAgentsOptions {\n apiKey?: string;\n baseURL?: string;\n exclusive?: boolean;\n includeRawPayloads?: boolean;\n}\n\nconst resolveBaseURL = (baseURL?: string): string => {\n return trimTrailingSlashes(\n baseURL ?? readEnv(\"PROMPTLAYER_BASE_URL\") ?? \"https://api.promptlayer.com\"\n );\n};\n\nexport const instrumentOpenAIAgents = async ({\n apiKey,\n baseURL,\n exclusive = true,\n includeRawPayloads = true,\n}: InstrumentOpenAIAgentsOptions = {}): Promise<PromptLayerOpenAIAgentsProcessor> => {\n const resolvedApiKey = requirePromptLayerApiKey(apiKey);\n\n const agentsModule: typeof import(\"@openai/agents\") = await import(\n \"@openai/agents\"\n );\n\n const processor = new PromptLayerOpenAIAgentsProcessor({\n apiKey: resolvedApiKey,\n baseURL: resolveBaseURL(baseURL),\n includeRawPayloads,\n });\n\n if (exclusive) {\n agentsModule.setTraceProcessors([processor]);\n } else {\n agentsModule.addTraceProcessor(processor);\n }\n\n return processor;\n};\n"],"mappings":"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","names":["openai_agents_exports","__export","PromptLayerOpenAIAgentsProcessor","instrumentOpenAIAgents","__toCommonJS","import_ably","import_centrifuge","import_p_retry","SDK_VERSION","getNodeVersion","_a","parts","_NODE_VERSION","_PROMPTLAYER_USER_AGENT","getCommonHeaders","fetchWithRetry","input","init","__async","pRetry","response","error","readEnv","env","_a","_b","_c","_d","_e","_f","requirePromptLayerApiKey","apiKey","explicitApiKey","envApiKey","SPAN_KIND_INTERNAL","SPAN_KIND_CLIENT","isPlainObject","value","isScalar","sanitizeKey","key","toJsonable","item","stableStringify","normalize","input","acc","setStringAttr","attrs","setNumberAttr","numericValue","setJsonAttr","includeRawPayloads","flattenIndexedMessages","prefix","messages","message","index","normalizeToolCalls","toolCalls","call","_a","_b","_c","_d","_e","functionData","name","argumentsValue","e","getCallId","normalizeToolOutputContent","output","textContent","extractTextContent","normalizeToolCallMessage","normalizeToolResultMessage","outputOverride","toolCallId","content","textParts","part","partType","text","normalizeMessages","items","normalized","normalizeResponseMessage","role","RAW_TOOL_CALL_ITEM_TYPES","RAW_TOOL_RESULT_ITEM_TYPES","normalizeResponseItems","applyUsageAttributes","usage","generationAttributes","spanData","responseAttributes","responseObject","functionAttributes","agentAttributes","handoffAttributes","guardrailAttributes","customAttributes","rawSpanDataAttributes","telemetrySourceVersion","SDK_VERSION","spanKindFor","span","spanNameFor","baseTraceAttributes","trace","baseSpanAttributes","spanDataAttributes","OTLP_STATUS_CODE_UNSET","OTLP_STATUS_CODE_OK","OTLP_STATUS_CODE_ERROR","toAnyValue","value","item","key","nestedValue","toKeyValues","attributes","buildOtlpJsonPayload","spans","serviceName","scopeName","scopeVersion","SDK_VERSION","span","_a","_b","payload","event","__spreadValues","import_crypto","TRACE_HEX_RE","sha256Hex","value","mapTraceId","originalTraceId","suffix","mapSpanId","originalSpanId","syntheticRootSpanId","ISO_TIMESTAMP_RE","nowUnixNano","isoToUnixNano","timestamp","match","millis","base","fraction","timezone","fractionalNanos","minUnixNano","values","filtered","value","min","current","maxUnixNano","max","trimTrailingSlashes","value","end","TRACEPARENT_RE","ZERO_TRACE_ID","ZERO_SPAN_ID","PromptLayerOpenAIAgentsProcessor","apiKey","baseURL","includeRawPayloads","trimTrailingSlashes","trace","__async","_a","upstreamContext","traceId","mapTraceId","syntheticRootSpanId","nowUnixNano","baseTraceAttributes","OTLP_STATUS_CODE_UNSET","state","childSpans","left","right","childStarts","span","childEnds","rootEnd","maxUnixNano","minUnixNano","payload","buildOtlpJsonPayload","existing","record","spanNameFor","spanKindFor","isoToUnixNano","mapSpanId","__spreadValues","baseSpanAttributes","_b","_c","_d","spanDataAttributes","pass","_e","rawMetadata","nestedMetadata","traceLike","rootSpanId","OTLP_STATUS_CODE_ERROR","OTLP_STATUS_CODE_OK","response","fetchWithRetry","getCommonHeaders","exportPromise","error","metadata","metadataRecord","traceparent","match","version","parentSpanId","normalizedVersion","normalizedTraceId","normalizedParentSpanId","traceState","value","resolveBaseURL","baseURL","_a","trimTrailingSlashes","readEnv","instrumentOpenAIAgents","_0","__async","apiKey","exclusive","includeRawPayloads","resolvedApiKey","requirePromptLayerApiKey","agentsModule","processor","PromptLayerOpenAIAgentsProcessor"]}
|