opik-openai
Version:
Opik TypeScript and JavaScript SDK integration with OpenAI
1 lines • 6.2 kB
JavaScript
;var opik=require('opik');var C=(e,t="",o={})=>{for(let n in e)if(Object.prototype.hasOwnProperty.call(e,n)){let s=t?`${t}.${n}`:n;typeof e[n]=="object"&&e[n]!==null&&!Array.isArray(e[n])?C(e[n],s,o):o[s]=e[n];}return o};var x=e=>({model:e.model,input:E(e),modelParameters:B(e)}),B=e=>["frequency_penalty","logit_bias","logprobs","max_tokens","n","presence_penalty","seed","stop","stream","temperature","top_p","user","response_format","top_logprobs"].reduce((o,n)=>e[n]!==void 0?{...o,[n]:e[n]}:o,{}),E=e=>K(e)?S(e):"prompt"in e?{prompt:e.prompt}:"input"in e?$(e.input):{},K=e=>!!(e&&typeof e=="object"&&!Array.isArray(e)&&"messages"in e),S=e=>["messages","function_call","functions","tools","tool_choice"].reduce((o,n)=>n in e?{...o,[n]:e[n]}:o,{}),$=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:{input:e},h=e=>{if(q(e))return {content:e.output_text};if(V(e)){let t=e.output,o=z(t);return o===null?void 0:Array.isArray(o)?{outputs:o}:o}if(H(e)){let t=J(e);return typeof t=="string"?{content:t}:t}},q=e=>e instanceof Object&&"output_text"in e&&typeof e.output_text=="string"&&e.output_text!=="",V=e=>!!(typeof e=="object"&&e!==null&&"output"in e&&Array.isArray(e.output)),z=e=>e.length>1?e:e.length===1&&typeof e[0]=="object"&&e[0]!==null?e[0]:e.length===1?{content:e[0]}:null,H=e=>!!(e instanceof Object&&"choices"in e&&Array.isArray(e.choices)&&e.choices.length>0),J=e=>{let t=e.choices[0];return "message"in t&&typeof t.message=="object"&&t.message!==null?t.message:"text"in t&&t.text?String(t.text):""},T=e=>{if(L(e))return {completion_tokens:e.usage.completion_tokens,prompt_tokens:e.usage.prompt_tokens,total_tokens:e.usage.total_tokens,...C(e.usage,"original_usage")};if(Q(e))return {completion_tokens:e.usage.input_tokens,prompt_tokens:e.usage.output_tokens,total_tokens:e.usage.total_tokens,...C(e.usage,"original_usage")}},L=e=>{if(!e||typeof e!="object"||!("usage"in e)||!e.usage||typeof e.usage!="object")return false;let t=e.usage;return typeof t.prompt_tokens=="number"&&typeof t.completion_tokens=="number"&&typeof t.total_tokens=="number"},Q=e=>{if(!e||typeof e!="object"||!("usage"in e)||!e.usage||typeof e.usage!="object")return false;let t=e.usage;return typeof t.total_tokens=="number"&&typeof t.input_tokens=="number"&&typeof t.output_tokens=="number"},P=e=>{var n,s;let t=e,o=(n=t==null?void 0:t.choices)==null?void 0:n[0];try{if(W(o))return {isToolCall:!0,data:o.delta.tool_calls[0]};if(X(o))return {isToolCall:!1,data:((s=o.delta)==null?void 0:s.content)||""};if(Y(o))return {isToolCall:!1,data:o.text||""}}catch(a){opik.logger.debug(`Error parsing chunk: ${a}`);}return {isToolCall:false,data:""}},W=e=>!!(e&&typeof e=="object"&&"delta"in e&&e.delta&&typeof e.delta=="object"&&"tool_calls"in e.delta&&Array.isArray(e.delta.tool_calls)&&e.delta.tool_calls.length>0),X=e=>!!(e&&typeof e=="object"&&"delta"in e),Y=e=>!!(e&&typeof e=="object"&&"text"in e),I=e=>{let{name:t,arguments:o}=e.reduce((n,s)=>{var a,i;return {name:((a=s.function)==null?void 0:a.name)||n.name,arguments:n.arguments+(((i=s.function)==null?void 0:i.arguments)||"")}},{name:"",arguments:""});return {tool_calls:[{function:{name:t,arguments:o}}]}},b=e=>{if(typeof e!="object"||e===null)return {model:void 0,modelParameters:void 0,metadata:void 0};let t=Z(e)?e.model:void 0,o=ee(e),n=te(e);return {model:t,modelParameters:Object.keys(o).length>0?o:void 0,metadata:Object.keys(n).length>0?n:void 0}},Z=e=>"model"in e&&typeof e.model=="string",ee=e=>D(e,["max_output_tokens","parallel_tool_calls","store","temperature","tool_choice","top_p","truncation","user"]),te=e=>D(e,["reasoning","incomplete_details","instructions","previous_response_id","tools","metadata","status","error"]),D=(e,t)=>{let o={};for(let n of t)n in e&&e[n]!=null&&(o[n]=e[n]);return o};var R=e=>e!=null&&typeof e=="object"&&typeof e[Symbol.asyncIterator]=="function";var j=(e,t,o)=>{var n;t.span({...o,endTime:new Date,type:opik.OpikSpanType.General,errorInfo:{message:e.message,exceptionType:e.name,traceback:(n=e.stack)!=null?n:""}}),t.end();},U=(e,t)=>(...o)=>ne(e,t,...o),ne=(e,t,...o)=>{var k;let{tags:n=[],...s}=(k=t==null?void 0:t.traceMetadata)!=null?k:{},{model:a,input:i,modelParameters:l}=x(o[0]),m={...s,...l,model:a},r={model:a,input:i,provider:"openai",name:t.generationName,tags:n,startTime:new Date,metadata:m},u,d=!!(t!=null&&t.parent);t!=null&&t.parent?u=t.parent:u=t.client.trace(r);try{let p=e(...o);return R(p)?M(p,u,d,r):p instanceof Promise?p.then(c=>{if(R(c))return M(c,u,d,r);let g=h(c),y=T(c),{model:_,metadata:F}=b(c),G={...r.metadata,...F,usage:y,model:_||r.model};return u.span({...r,output:g,endTime:new Date,usage:y,model:_||r.model,type:opik.OpikSpanType.General,metadata:G}),d||u.update({output:g,endTime:new Date}),c}).catch(c=>{throw j(c,u,r),c}):p}catch(p){throw j(p,u,r),p}},oe=(e,t)=>{let o,n,s={...t};if(typeof e=="object"&&e&&"response"in e){let i=e.response;o=h(i);let{model:l,modelParameters:m,metadata:r}=b(i);s.model=l!=null?l:t.model,s.metadata={...t.metadata,...m,...r},typeof i=="object"&&i&&"usage"in i&&(n=i.usage);}typeof e=="object"&&e!=null&&"usage"in e&&(n=e.usage);let a=P(e);return {output:o,usage:n,chunkData:a,updatedObservationData:s}};function M(e,t,o,n){async function*s(){let a=[],i=[],m,r=null,u={...n};for await(let p of e){let{output:w,usage:c,chunkData:g,updatedObservationData:y}=oe(p,u);w&&(r=w),c&&(m=c),u=y,g.isToolCall?i=[...i,g.data]:a=[...a,g.data],yield p;}let d=r!=null?r:i.length>0?I(i):{message:a.join("")},k=T({usage:m});t.span({...u,output:d,endTime:new Date,type:opik.OpikSpanType.General,usage:k}),o||t.update({output:d,endTime:new Date});}return s()}var f=class f{static getInstance(t){return f.instance||(f.instance=new opik.Opik(t)),f.instance}};f.instance=null;var O=f;var v=(e,t)=>new Proxy(e,{get(o,n,s){var r,u,d;let a=o[n],i=(u=t==null?void 0:t.generationName)!=null?u:`${((r=e.constructor)==null?void 0:r.name)||"OpenAI"}.${n.toString()}`,l={...t,generationName:i,client:(d=t==null?void 0:t.client)!=null?d:O.getInstance()};return n==="flush"?l.client.flush.bind(l.client):typeof a=="function"?U(a.bind(o),l):a&&!Array.isArray(a)&&!(a instanceof Date)&&typeof a=="object"?v(a,l):Reflect.get(o,n,s)}});exports.trackOpenAI=v;