opik-openai 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- 'use strict';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;
1
+ 'use strict';var opik=require('opik');var k=(e,t="",n={})=>{for(let o in e)if(Object.prototype.hasOwnProperty.call(e,o)){let r=t?`${t}.${o}`:o;typeof e[o]=="object"&&e[o]!==null&&!Array.isArray(e[o])?k(e[o],r,n):n[r]=e[o];}return n};var I=e=>({model:e.model,input:K(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((n,o)=>e[o]!==void 0?{...n,[o]:e[o]}:n,{}),K=e=>S(e)?$(e):"prompt"in e?{prompt:e.prompt}:"input"in e?q(e.input):{},S=e=>!!(e&&typeof e=="object"&&!Array.isArray(e)&&"messages"in e),$=e=>["messages","function_call","functions","tools","tool_choice"].reduce((n,o)=>o in e?{...n,[o]:e[o]}:n,{}),q=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:{input:e},O=e=>{if(V(e))return {content:e.output_text};if(H(e)){let t=e.output,n=L(t);return n===null?void 0:Array.isArray(n)?{outputs:n}:n}if(z(e)){let t=J(e);return typeof t=="string"?{content:t}:t}if(Q(e))return W(e)},V=e=>e instanceof Object&&"output_text"in e&&typeof e.output_text=="string"&&e.output_text!=="",H=e=>!!(typeof e=="object"&&e!==null&&"output"in e&&Array.isArray(e.output)),L=e=>e.length>1?e:e.length===1&&typeof e[0]=="object"&&e[0]!==null?e[0]:e.length===1?{content:e[0]}:null,z=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):""},Q=e=>{if(!e||typeof e!="object"||!("data"in e)||!Array.isArray(e.data))return false;let t=e.data;if(t.length===0)return false;let n=t[0];return typeof n=="object"&&n!==null&&"embedding"in n&&Array.isArray(n.embedding)},x=5,W=e=>({embeddings:e.data.map(n=>{let o=n.embedding;return {embedding:o.length>x?[...o.slice(0,x),"..."]:o,index:n.index,dimensions:o.length}})}),h=e=>{if(X(e))return {completion_tokens:e.usage.completion_tokens,prompt_tokens:e.usage.prompt_tokens,total_tokens:e.usage.total_tokens,...k(e.usage,"original_usage")};if(Y(e))return {completion_tokens:e.usage.input_tokens,prompt_tokens:e.usage.output_tokens,total_tokens:e.usage.total_tokens,...k(e.usage,"original_usage")};if(Z(e))return {completion_tokens:0,prompt_tokens:e.usage.prompt_tokens,total_tokens:e.usage.total_tokens,...k(e.usage,"original_usage")}},X=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"},Y=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"},Z=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.total_tokens=="number"&&!("completion_tokens"in t)},P=e=>{var o,r;let t=e,n=(o=t==null?void 0:t.choices)==null?void 0:o[0];try{if(ee(n))return {isToolCall:!0,data:n.delta.tool_calls[0]};if(te(n))return {isToolCall:!1,data:((r=n.delta)==null?void 0:r.content)||""};if(ne(n))return {isToolCall:!1,data:n.text||""}}catch(a){opik.logger.debug(`Error parsing chunk: ${a}`);}return {isToolCall:false,data:""}},ee=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),te=e=>!!(e&&typeof e=="object"&&"delta"in e),ne=e=>!!(e&&typeof e=="object"&&"text"in e),D=e=>{let{name:t,arguments:n}=e.reduce((o,r)=>{var a,i;return {name:((a=r.function)==null?void 0:a.name)||o.name,arguments:o.arguments+(((i=r.function)==null?void 0:i.arguments)||"")}},{name:"",arguments:""});return {tool_calls:[{function:{name:t,arguments:n}}]}},T=e=>{if(typeof e!="object"||e===null)return {model:void 0,modelParameters:void 0,metadata:void 0};let t=oe(e)?e.model:void 0,n=ae(e),o=re(e);return {model:t,modelParameters:Object.keys(n).length>0?n:void 0,metadata:Object.keys(o).length>0?o:void 0}},oe=e=>"model"in e&&typeof e.model=="string",ae=e=>j(e,["max_output_tokens","parallel_tool_calls","store","temperature","tool_choice","top_p","truncation","user"]),re=e=>j(e,["reasoning","incomplete_details","instructions","previous_response_id","tools","metadata","status","error"]),j=(e,t)=>{let n={};for(let o of t)o in e&&e[o]!=null&&(n[o]=e[o]);return n};var R=e=>e!=null&&typeof e=="object"&&typeof e[Symbol.asyncIterator]=="function";var U=(e,t,n)=>{var o;t.span({...n,endTime:new Date,type:opik.OpikSpanType.General,errorInfo:{message:e.message,exceptionType:e.name,traceback:(o=e.stack)!=null?o:""}}),t.end();},E=(e,t)=>(...n)=>se(e,t,...n),se=(e,t,...n)=>{var y;let{tags:o=[],...r}=(y=t==null?void 0:t.traceMetadata)!=null?y:{},{model:a,input:i,modelParameters:u}=I(n[0]),m={...r,...u,model:a},s={model:a,input:i,provider:"openai",name:t.generationName,tags:o,startTime:new Date,metadata:m},l,d=!!(t!=null&&t.parent);t!=null&&t.parent?l=t.parent:l=t.client.trace(s);try{let p=e(...n);return R(p)?M(p,l,d,s):p instanceof Promise?p.then(c=>{if(R(c))return M(c,l,d,s);let g=O(c),b=h(c),{model:A,metadata:F}=T(c),N={...s.metadata,...F,usage:b,model:A||s.model};return l.span({...s,output:g,endTime:new Date,usage:b,model:A||s.model,type:opik.OpikSpanType.General,metadata:N}),d||l.update({output:g,endTime:new Date}),c}).catch(c=>{throw U(c,l,s),c}):p}catch(p){throw U(p,l,s),p}},ie=(e,t)=>{let n,o,r={...t};if(typeof e=="object"&&e&&"response"in e){let i=e.response;n=O(i);let{model:u,modelParameters:m,metadata:s}=T(i);r.model=u!=null?u:t.model,r.metadata={...t.metadata,...m,...s},typeof i=="object"&&i&&"usage"in i&&(o=i.usage);}typeof e=="object"&&e!=null&&"usage"in e&&(o=e.usage);let a=P(e);return {output:n,usage:o,chunkData:a,updatedObservationData:r}};function M(e,t,n,o){async function*r(){let a=[],i=[],m,s=null,l={...o};for await(let p of e){let{output:w,usage:c,chunkData:g,updatedObservationData:b}=ie(p,l);w&&(s=w),c&&(m=c),l=b,g.isToolCall?i=[...i,g.data]:a=[...a,g.data],yield p;}let d=s!=null?s:i.length>0?D(i):{message:a.join("")},y=h({usage:m});t.span({...l,output:d,endTime:new Date,type:opik.OpikSpanType.General,usage:y}),n||t.update({output:d,endTime:new Date});}return r()}var f=class f{static getInstance(t){return f.instance||(f.instance=new opik.Opik(t)),f.instance}};f.instance=null;var C=f;var v=(e,t)=>new Proxy(e,{get(n,o,r){var s,l,d;let a=n[o],i=(l=t==null?void 0:t.generationName)!=null?l:`${((s=e.constructor)==null?void 0:s.name)||"OpenAI"}.${o.toString()}`,u={...t,generationName:i,client:(d=t==null?void 0:t.client)!=null?d:C.getInstance()};return o==="flush"?u.client.flush.bind(u.client):typeof a=="function"?E(a.bind(n),u):a&&!Array.isArray(a)&&!(a instanceof Date)&&typeof a=="object"?v(a,u):Reflect.get(n,o,r)}});exports.trackOpenAI=v;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import {Opik,OpikSpanType,logger}from'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){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: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: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: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(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)}});export{v as trackOpenAI};
1
+ import {Opik,OpikSpanType,logger}from'opik';var k=(e,t="",n={})=>{for(let o in e)if(Object.prototype.hasOwnProperty.call(e,o)){let r=t?`${t}.${o}`:o;typeof e[o]=="object"&&e[o]!==null&&!Array.isArray(e[o])?k(e[o],r,n):n[r]=e[o];}return n};var I=e=>({model:e.model,input:K(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((n,o)=>e[o]!==void 0?{...n,[o]:e[o]}:n,{}),K=e=>S(e)?$(e):"prompt"in e?{prompt:e.prompt}:"input"in e?q(e.input):{},S=e=>!!(e&&typeof e=="object"&&!Array.isArray(e)&&"messages"in e),$=e=>["messages","function_call","functions","tools","tool_choice"].reduce((n,o)=>o in e?{...n,[o]:e[o]}:n,{}),q=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:{input:e},O=e=>{if(V(e))return {content:e.output_text};if(H(e)){let t=e.output,n=L(t);return n===null?void 0:Array.isArray(n)?{outputs:n}:n}if(z(e)){let t=J(e);return typeof t=="string"?{content:t}:t}if(Q(e))return W(e)},V=e=>e instanceof Object&&"output_text"in e&&typeof e.output_text=="string"&&e.output_text!=="",H=e=>!!(typeof e=="object"&&e!==null&&"output"in e&&Array.isArray(e.output)),L=e=>e.length>1?e:e.length===1&&typeof e[0]=="object"&&e[0]!==null?e[0]:e.length===1?{content:e[0]}:null,z=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):""},Q=e=>{if(!e||typeof e!="object"||!("data"in e)||!Array.isArray(e.data))return false;let t=e.data;if(t.length===0)return false;let n=t[0];return typeof n=="object"&&n!==null&&"embedding"in n&&Array.isArray(n.embedding)},x=5,W=e=>({embeddings:e.data.map(n=>{let o=n.embedding;return {embedding:o.length>x?[...o.slice(0,x),"..."]:o,index:n.index,dimensions:o.length}})}),h=e=>{if(X(e))return {completion_tokens:e.usage.completion_tokens,prompt_tokens:e.usage.prompt_tokens,total_tokens:e.usage.total_tokens,...k(e.usage,"original_usage")};if(Y(e))return {completion_tokens:e.usage.input_tokens,prompt_tokens:e.usage.output_tokens,total_tokens:e.usage.total_tokens,...k(e.usage,"original_usage")};if(Z(e))return {completion_tokens:0,prompt_tokens:e.usage.prompt_tokens,total_tokens:e.usage.total_tokens,...k(e.usage,"original_usage")}},X=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"},Y=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"},Z=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.total_tokens=="number"&&!("completion_tokens"in t)},P=e=>{var o,r;let t=e,n=(o=t==null?void 0:t.choices)==null?void 0:o[0];try{if(ee(n))return {isToolCall:!0,data:n.delta.tool_calls[0]};if(te(n))return {isToolCall:!1,data:((r=n.delta)==null?void 0:r.content)||""};if(ne(n))return {isToolCall:!1,data:n.text||""}}catch(a){logger.debug(`Error parsing chunk: ${a}`);}return {isToolCall:false,data:""}},ee=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),te=e=>!!(e&&typeof e=="object"&&"delta"in e),ne=e=>!!(e&&typeof e=="object"&&"text"in e),D=e=>{let{name:t,arguments:n}=e.reduce((o,r)=>{var a,i;return {name:((a=r.function)==null?void 0:a.name)||o.name,arguments:o.arguments+(((i=r.function)==null?void 0:i.arguments)||"")}},{name:"",arguments:""});return {tool_calls:[{function:{name:t,arguments:n}}]}},T=e=>{if(typeof e!="object"||e===null)return {model:void 0,modelParameters:void 0,metadata:void 0};let t=oe(e)?e.model:void 0,n=ae(e),o=re(e);return {model:t,modelParameters:Object.keys(n).length>0?n:void 0,metadata:Object.keys(o).length>0?o:void 0}},oe=e=>"model"in e&&typeof e.model=="string",ae=e=>j(e,["max_output_tokens","parallel_tool_calls","store","temperature","tool_choice","top_p","truncation","user"]),re=e=>j(e,["reasoning","incomplete_details","instructions","previous_response_id","tools","metadata","status","error"]),j=(e,t)=>{let n={};for(let o of t)o in e&&e[o]!=null&&(n[o]=e[o]);return n};var R=e=>e!=null&&typeof e=="object"&&typeof e[Symbol.asyncIterator]=="function";var U=(e,t,n)=>{var o;t.span({...n,endTime:new Date,type:OpikSpanType.General,errorInfo:{message:e.message,exceptionType:e.name,traceback:(o=e.stack)!=null?o:""}}),t.end();},E=(e,t)=>(...n)=>se(e,t,...n),se=(e,t,...n)=>{var y;let{tags:o=[],...r}=(y=t==null?void 0:t.traceMetadata)!=null?y:{},{model:a,input:i,modelParameters:u}=I(n[0]),m={...r,...u,model:a},s={model:a,input:i,provider:"openai",name:t.generationName,tags:o,startTime:new Date,metadata:m},l,d=!!(t!=null&&t.parent);t!=null&&t.parent?l=t.parent:l=t.client.trace(s);try{let p=e(...n);return R(p)?M(p,l,d,s):p instanceof Promise?p.then(c=>{if(R(c))return M(c,l,d,s);let g=O(c),b=h(c),{model:A,metadata:F}=T(c),N={...s.metadata,...F,usage:b,model:A||s.model};return l.span({...s,output:g,endTime:new Date,usage:b,model:A||s.model,type:OpikSpanType.General,metadata:N}),d||l.update({output:g,endTime:new Date}),c}).catch(c=>{throw U(c,l,s),c}):p}catch(p){throw U(p,l,s),p}},ie=(e,t)=>{let n,o,r={...t};if(typeof e=="object"&&e&&"response"in e){let i=e.response;n=O(i);let{model:u,modelParameters:m,metadata:s}=T(i);r.model=u!=null?u:t.model,r.metadata={...t.metadata,...m,...s},typeof i=="object"&&i&&"usage"in i&&(o=i.usage);}typeof e=="object"&&e!=null&&"usage"in e&&(o=e.usage);let a=P(e);return {output:n,usage:o,chunkData:a,updatedObservationData:r}};function M(e,t,n,o){async function*r(){let a=[],i=[],m,s=null,l={...o};for await(let p of e){let{output:w,usage:c,chunkData:g,updatedObservationData:b}=ie(p,l);w&&(s=w),c&&(m=c),l=b,g.isToolCall?i=[...i,g.data]:a=[...a,g.data],yield p;}let d=s!=null?s:i.length>0?D(i):{message:a.join("")},y=h({usage:m});t.span({...l,output:d,endTime:new Date,type:OpikSpanType.General,usage:y}),n||t.update({output:d,endTime:new Date});}return r()}var f=class f{static getInstance(t){return f.instance||(f.instance=new Opik(t)),f.instance}};f.instance=null;var C=f;var v=(e,t)=>new Proxy(e,{get(n,o,r){var s,l,d;let a=n[o],i=(l=t==null?void 0:t.generationName)!=null?l:`${((s=e.constructor)==null?void 0:s.name)||"OpenAI"}.${o.toString()}`,u={...t,generationName:i,client:(d=t==null?void 0:t.client)!=null?d:C.getInstance()};return o==="flush"?u.client.flush.bind(u.client):typeof a=="function"?E(a.bind(n),u):a&&!Array.isArray(a)&&!(a instanceof Date)&&typeof a=="object"?v(a,u):Reflect.get(n,o,r)}});export{v as trackOpenAI};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "opik-openai",
3
3
  "description": "Opik TypeScript and JavaScript SDK integration with OpenAI",
4
- "version": "1.0.2",
4
+ "version": "1.0.3",
5
5
  "engines": {
6
6
  "node": ">=18"
7
7
  },
@@ -50,7 +50,7 @@
50
50
  "lint": "eslint '**/*.{ts,tsx}'",
51
51
  "typecheck": "tsc --noEmit",
52
52
  "format": "prettier --write 'src/**/*.{ts,tsx,js,jsx,json,md}'",
53
- "test": "vitest"
53
+ "test": "vitest run"
54
54
  },
55
55
  "files": [
56
56
  "dist/**/*",