\ No newline at end of file
diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/777-38cea0d1f2b563b1.js b/litellm/proxy/_experimental/out/_next/static/chunks/777-38cea0d1f2b563b1.js
new file mode 100644
index 00000000000..fd4ed54e562
--- /dev/null
+++ b/litellm/proxy/_experimental/out/_next/static/chunks/777-38cea0d1f2b563b1.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[777],{777:function(e,t,o){o.d(t,{$I:function(){return P},AZ:function(){return x},Au:function(){return W},BL:function(){return ew},Br:function(){return E},Dj:function(){return ek},E9:function(){return eh},EY:function(){return ef},FC:function(){return M},Gh:function(){return ea},HK:function(){return L},I1:function(){return g},J$:function(){return V},K8:function(){return l},K_:function(){return eu},N8:function(){return J},NV:function(){return p},Nc:function(){return er},O3:function(){return ei},OU:function(){return X},Og:function(){return h},Ov:function(){return m},PT:function(){return O},Qy:function(){return _},RQ:function(){return f},Rg:function(){return G},So:function(){return I},W_:function(){return N},X:function(){return U},XO:function(){return u},Xd:function(){return ee},Xm:function(){return j},YU:function(){return ed},Zr:function(){return y},ao:function(){return ey},b1:function(){return K},cu:function(){return ec},e2:function(){return Y},eH:function(){return S},fP:function(){return A},hT:function(){return eo},hy:function(){return d},j2:function(){return Z},jA:function(){return ep},jE:function(){return el},kK:function(){return w},kn:function(){return B},lg:function(){return et},mR:function(){return R},m_:function(){return C},n$:function(){return $},o6:function(){return v},pf:function(){return es},qm:function(){return i},rs:function(){return T},tN:function(){return H},um:function(){return en},v9:function(){return Q},wX:function(){return k},wd:function(){return z},xA:function(){return q},zg:function(){return D}});var r=o(80588);console.log=function(){};let a=0,n=e=>new Promise(t=>setTimeout(t,e)),c=async e=>{let t=Date.now();t-a>6e4?(e.includes("Authentication Error - Expired Key")?(r.ZP.info("UI Session Expired. Logging out."),a=t,await n(3e3),window.location.href="/"):r.ZP.error(e),a=t):console.log("Error suppressed to prevent spam:",e)},s="Authorization";function l(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"Authorization";console.log("setGlobalLitellmHeaderName: ".concat(e)),s=e}let i=async e=>{try{let t=await fetch("/get/litellm_model_cost_map",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}}),o=await t.json();return console.log("received litellm model cost data: ".concat(o)),o}catch(e){throw console.error("Failed to get model cost map:",e),e}},w=async(e,t)=>{try{let o=await fetch("/model/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await o.json();return console.log("API Response:",a),r.ZP.success("Model created successfully. Wait 60s and refresh on 'All Models' page"),a}catch(e){throw console.error("Failed to create key:",e),e}},d=async e=>{try{let t=await fetch("/model/settings",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},h=async(e,t)=>{console.log("model_id in model delete call: ".concat(t));try{let o=await fetch("/model/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({id:t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await o.json();return console.log("API Response:",a),r.ZP.success("Model deleted successfully. Restart server to see this."),a}catch(e){throw console.error("Failed to create key:",e),e}},p=async(e,t)=>{if(console.log("budget_id in budget delete call: ".concat(t)),null!=e)try{let o=await fetch("/budget/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({id:t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("API Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},y=async(e,t)=>{try{console.log("Form Values in budgetCreateCall:",t),console.log("Form Values after check:",t);let o=await fetch("/budget/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("API Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},u=async(e,t)=>{try{let o=await fetch("/invitation/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("API Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},f=async e=>{try{let t=await fetch("/alerting/settings",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},k=async(e,t,o)=>{try{if(console.log("Form Values in keyCreateCall:",o),o.description&&(o.metadata||(o.metadata={}),o.metadata.description=o.description,delete o.description,o.metadata=JSON.stringify(o.metadata)),o.metadata){console.log("formValues.metadata:",o.metadata);try{o.metadata=JSON.parse(o.metadata)}catch(e){throw Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",o);let r=await fetch("/key/generate",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...o})});if(!r.ok){let e=await r.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),a}catch(e){throw console.error("Failed to create key:",e),e}},m=async(e,t,o)=>{try{if(console.log("Form Values in keyCreateCall:",o),o.description&&(o.metadata||(o.metadata={}),o.metadata.description=o.description,delete o.description,o.metadata=JSON.stringify(o.metadata)),o.metadata){console.log("formValues.metadata:",o.metadata);try{o.metadata=JSON.parse(o.metadata)}catch(e){throw Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",o);let r=await fetch("/user/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...o})});if(!r.ok){let e=await r.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),a}catch(e){throw console.error("Failed to create key:",e),e}},g=async(e,t)=>{try{console.log("in keyDeleteCall:",t);let o=await fetch("/key/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:[t]})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},T=async(e,t)=>{try{console.log("in teamDeleteCall:",t);let o=await fetch("/team/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_ids:[t]})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to delete key:",e),e}},E=async function(e,t,o){let r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],a=arguments.length>4?arguments[4]:void 0,n=arguments.length>5?arguments[5]:void 0;try{let l="/user/info";"App Owner"==o&&t&&(l="".concat(l,"?user_id=").concat(t)),"App User"==o&&t&&(l="".concat(l,"?user_id=").concat(t)),("Internal User"==o||"Internal Viewer"==o)&&t&&(l="".concat(l,"?user_id=").concat(t)),console.log("in userInfoCall viewAll=",r),r&&n&&null!=a&&void 0!=a&&(l="".concat(l,"?view_all=true&page=").concat(a,"&page_size=").concat(n));let i=await fetch(l,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!i.ok){let e=await i.text();throw c(e),Error("Network response was not ok")}let w=await i.json();return console.log("API Response:",w),w}catch(e){throw console.error("Failed to create key:",e),e}},j=async(e,t)=>{try{let o="/team/info";t&&(o="".concat(o,"?team_id=").concat(t)),console.log("in teamInfoCall");let r=await fetch(o,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c(e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),a}catch(e){throw console.error("Failed to create key:",e),e}},_=async e=>{try{let t=await fetch("/global/spend",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to create key:",e),e}},N=async e=>{try{let t="/onboarding/get_token";t+="?invite_link=".concat(e);let o=await fetch(t,{method:"GET",headers:{"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to create key:",e),e}},C=async(e,t,o,r)=>{try{let a=await fetch("/onboarding/claim_token",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({invitation_link:t,user_id:o,password:r})});if(!a.ok){let e=await a.text();throw c(e),Error("Network response was not ok")}let n=await a.json();return console.log(n),n}catch(e){throw console.error("Failed to delete key:",e),e}},F=!1,b=null,x=async(e,t,o)=>{try{let t=await fetch("/v2/model/info",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw e+="error shown=".concat(F),F||(e.includes("No model list passed")&&(e="No Models Exist. Click Add Model to get started."),r.ZP.info(e,10),F=!0,b&&clearTimeout(b),b=setTimeout(()=>{F=!1},1e4)),Error("Network response was not ok")}let o=await t.json();return console.log("modelInfoCall:",o),o}catch(e){throw console.error("Failed to create key:",e),e}},B=async e=>{try{let t=await fetch("/model_group/info",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok)throw await t.text(),Error("Network response was not ok");let o=await t.json();return console.log("modelHubCall:",o),o}catch(e){throw console.error("Failed to create key:",e),e}},O=async e=>{try{let t=await fetch("/get/allowed_ips",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw Error("Network response was not ok: ".concat(e))}let o=await t.json();return console.log("getAllowedIPs:",o),o.data}catch(e){throw console.error("Failed to get allowed IPs:",e),e}},S=async(e,t)=>{try{let o=await fetch("/add/allowed_ip",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({ip:t})});if(!o.ok){let e=await o.text();throw Error("Network response was not ok: ".concat(e))}let r=await o.json();return console.log("addAllowedIP:",r),r}catch(e){throw console.error("Failed to add allowed IP:",e),e}},P=async(e,t)=>{try{let o=await fetch("/delete/allowed_ip",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({ip:t})});if(!o.ok){let e=await o.text();throw Error("Network response was not ok: ".concat(e))}let r=await o.json();return console.log("deleteAllowedIP:",r),r}catch(e){throw console.error("Failed to delete allowed IP:",e),e}},v=async(e,t,o,r,a,n,l,i)=>{try{let t="/model/metrics";r&&(t="".concat(t,"?_selected_model_group=").concat(r,"&startTime=").concat(a,"&endTime=").concat(n,"&api_key=").concat(l,"&customer=").concat(i));let o=await fetch(t,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to create key:",e),e}},G=async(e,t,o,r)=>{try{let a="/model/streaming_metrics";t&&(a="".concat(a,"?_selected_model_group=").concat(t,"&startTime=").concat(o,"&endTime=").concat(r));let n=await fetch(a,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!n.ok){let e=await n.text();throw c(e),Error("Network response was not ok")}return await n.json()}catch(e){throw console.error("Failed to create key:",e),e}},A=async(e,t,o,r,a,n,l,i)=>{try{let t="/model/metrics/slow_responses";r&&(t="".concat(t,"?_selected_model_group=").concat(r,"&startTime=").concat(a,"&endTime=").concat(n,"&api_key=").concat(l,"&customer=").concat(i));let o=await fetch(t,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to create key:",e),e}},J=async(e,t,o,r,a,n,l,i)=>{try{let t="/model/metrics/exceptions";r&&(t="".concat(t,"?_selected_model_group=").concat(r,"&startTime=").concat(a,"&endTime=").concat(n,"&api_key=").concat(l,"&customer=").concat(i));let o=await fetch(t,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to create key:",e),e}},I=async(e,t,o)=>{console.log("in /models calls, globalLitellmHeaderName",s);try{let t=await fetch("/models",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to create key:",e),e}},R=async e=>{try{let t="/global/spend/teams";console.log("in teamSpendLogsCall:",t);let o=await fetch("".concat(t),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},V=async(e,t,o,r)=>{try{let a="/global/spend/tags";t&&o&&(a="".concat(a,"?start_date=").concat(t,"&end_date=").concat(o)),r&&(a+="".concat(a,"&tags=").concat(r.join(","))),console.log("in tagsSpendLogsCall:",a);let n=await fetch("".concat(a),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!n.ok)throw await n.text(),Error("Network response was not ok");let c=await n.json();return console.log(c),c}catch(e){throw console.error("Failed to create key:",e),e}},U=async e=>{try{let t="/global/spend/all_tag_names";console.log("in global/spend/all_tag_names call",t);let o=await fetch("".concat(t),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok)throw await o.text(),Error("Network response was not ok");let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},Z=async e=>{try{let t="/global/all_end_users";console.log("in global/all_end_users call",t);let o=await fetch("".concat(t),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok)throw await o.text(),Error("Network response was not ok");let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},L=async(e,t,o,r,a,n)=>{try{console.log("user role in spend logs call: ".concat(o));let t="/spend/logs";t="App Owner"==o?"".concat(t,"?user_id=").concat(r,"&start_date=").concat(a,"&end_date=").concat(n):"".concat(t,"?start_date=").concat(a,"&end_date=").concat(n);let l=await fetch(t,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c(e),Error("Network response was not ok")}let i=await l.json();return console.log(i),i}catch(e){throw console.error("Failed to create key:",e),e}},M=async e=>{try{let t=await fetch("/global/spend/logs",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}let o=await t.json();return console.log(o),o}catch(e){throw console.error("Failed to create key:",e),e}},H=async e=>{try{let t=await fetch("/global/spend/keys?limit=5",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}let o=await t.json();return console.log(o),o}catch(e){throw console.error("Failed to create key:",e),e}},K=async(e,t,o,r)=>{try{let a="";a=t?JSON.stringify({api_key:t,startTime:o,endTime:r}):JSON.stringify({startTime:o,endTime:r});let n={method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:a},l=await fetch("/global/spend/end_users",n);if(!l.ok){let e=await l.text();throw c(e),Error("Network response was not ok")}let i=await l.json();return console.log(i),i}catch(e){throw console.error("Failed to create key:",e),e}},X=async(e,t,o,r)=>{try{let a="/global/spend/provider";o&&r&&(a+="?start_date=".concat(o,"&end_date=").concat(r)),t&&(a+="&api_key=".concat(t));let n={method:"GET",headers:{[s]:"Bearer ".concat(e)}},l=await fetch(a,n);if(!l.ok){let e=await l.text();throw c(e),Error("Network response was not ok")}let i=await l.json();return console.log(i),i}catch(e){throw console.error("Failed to fetch spend data:",e),e}},z=async(e,t,o)=>{try{let r="/global/activity";t&&o&&(r+="?start_date=".concat(t,"&end_date=").concat(o));let a={method:"GET",headers:{[s]:"Bearer ".concat(e)}},n=await fetch(r,a);if(!n.ok)throw await n.text(),Error("Network response was not ok");let c=await n.json();return console.log(c),c}catch(e){throw console.error("Failed to fetch spend data:",e),e}},D=async(e,t,o)=>{try{let r="/global/activity/cache_hits";t&&o&&(r+="?start_date=".concat(t,"&end_date=").concat(o));let a={method:"GET",headers:{[s]:"Bearer ".concat(e)}},n=await fetch(r,a);if(!n.ok)throw await n.text(),Error("Network response was not ok");let c=await n.json();return console.log(c),c}catch(e){throw console.error("Failed to fetch spend data:",e),e}},q=async(e,t,o)=>{try{let r="/global/activity/model";t&&o&&(r+="?start_date=".concat(t,"&end_date=").concat(o));let a={method:"GET",headers:{[s]:"Bearer ".concat(e)}},n=await fetch(r,a);if(!n.ok)throw await n.text(),Error("Network response was not ok");let c=await n.json();return console.log(c),c}catch(e){throw console.error("Failed to fetch spend data:",e),e}},$=async(e,t,o,r)=>{try{let a="/global/activity/exceptions";t&&o&&(a+="?start_date=".concat(t,"&end_date=").concat(o)),r&&(a+="&model_group=".concat(r));let n={method:"GET",headers:{[s]:"Bearer ".concat(e)}},c=await fetch(a,n);if(!c.ok)throw await c.text(),Error("Network response was not ok");let l=await c.json();return console.log(l),l}catch(e){throw console.error("Failed to fetch spend data:",e),e}},Q=async(e,t,o,r)=>{try{let a="/global/activity/exceptions/deployment";t&&o&&(a+="?start_date=".concat(t,"&end_date=").concat(o)),r&&(a+="&model_group=".concat(r));let n={method:"GET",headers:{[s]:"Bearer ".concat(e)}},c=await fetch(a,n);if(!c.ok)throw await c.text(),Error("Network response was not ok");let l=await c.json();return console.log(l),l}catch(e){throw console.error("Failed to fetch spend data:",e),e}},W=async e=>{try{let t=await fetch("/global/spend/models?limit=5",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}let o=await t.json();return console.log(o),o}catch(e){throw console.error("Failed to create key:",e),e}},Y=async(e,t)=>{try{let o=await fetch("/v2/key/info",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:t})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},ee=async(e,t)=>{try{let o="/user/get_users?role=".concat(t);console.log("in userGetAllUsersCall:",o);let r=await fetch(o,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c(e),Error("Network response was not ok")}let a=await r.json();return console.log(a),a}catch(e){throw console.error("Failed to get requested models:",e),e}},et=async e=>{try{let t=await fetch("/user/available_roles",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok)throw await t.text(),Error("Network response was not ok");let o=await t.json();return console.log("response from user/available_role",o),o}catch(e){throw e}},eo=async(e,t)=>{try{console.log("Form Values in teamCreateCall:",t);let o=await fetch("/team/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("API Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},er=async(e,t)=>{try{console.log("Form Values in keyUpdateCall:",t);let o=await fetch("/key/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("Update key Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},ea=async(e,t)=>{try{console.log("Form Values in teamUpateCall:",t);let o=await fetch("/team/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("Update Team Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},en=async(e,t)=>{try{console.log("Form Values in modelUpateCall:",t);let o=await fetch("/model/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error update from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("Update model Response:",r),r}catch(e){throw console.error("Failed to update model:",e),e}},ec=async(e,t,o)=>{try{console.log("Form Values in teamMemberAddCall:",o);let r=await fetch("/team/member_add",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_id:t,member:o})});if(!r.ok){let e=await r.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),a}catch(e){throw console.error("Failed to create key:",e),e}},es=async(e,t,o)=>{try{console.log("Form Values in userUpdateUserCall:",t);let r={...t};null!==o&&(r.user_role=o),r=JSON.stringify(r);let a=await fetch("/user/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:r});if(!a.ok){let e=await a.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await a.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},el=async(e,t)=>{try{let o="/health/services?service=".concat(t);console.log("Checking Slack Budget Alerts service health");let a=await fetch(o,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!a.ok){let e=await a.text();throw c(e),Error(e)}let n=await a.json();return r.ZP.success("Test request to ".concat(t," made - check logs/alerts on ").concat(t," to verify")),n}catch(e){throw console.error("Failed to perform health check:",e),e}},ei=async e=>{try{let t=await fetch("/budget/list",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},ew=async(e,t,o)=>{try{let t=await fetch("/get/config/callbacks",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},ed=async e=>{try{let t=await fetch("/config/list?config_type=general_settings",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},eh=async(e,t)=>{try{let o=await fetch("/config/field/info?field_name=".concat(t),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok)throw await o.text(),Error("Network response was not ok");return await o.json()}catch(e){throw console.error("Failed to set callbacks:",e),e}},ep=async(e,t,o)=>{try{let a=await fetch("/config/field/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({field_name:t,field_value:o,config_type:"general_settings"})});if(!a.ok){let e=await a.text();throw c(e),Error("Network response was not ok")}let n=await a.json();return r.ZP.success("Successfully updated value!"),n}catch(e){throw console.error("Failed to set callbacks:",e),e}},ey=async(e,t)=>{try{let o=await fetch("/config/field/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({field_name:t,config_type:"general_settings"})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let a=await o.json();return r.ZP.success("Field reset on proxy"),a}catch(e){throw console.error("Failed to get callbacks:",e),e}},eu=async(e,t)=>{try{let o=await fetch("/config/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to set callbacks:",e),e}},ef=async e=>{try{let t=await fetch("/health",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to call /health:",e),e}},ek=async e=>{try{let t=await fetch("/sso/get/logout_url",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok)throw await t.text(),Error("Network response was not ok");return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}}}}]);
\ No newline at end of file
diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/777-71e19aabdac85a01.js b/litellm/proxy/_experimental/out/_next/static/chunks/777-71e19aabdac85a01.js
deleted file mode 100644
index 7c8a631472f..00000000000
--- a/litellm/proxy/_experimental/out/_next/static/chunks/777-71e19aabdac85a01.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[777],{777:function(e,t,o){o.d(t,{$I:function(){return P},AZ:function(){return x},Au:function(){return W},BL:function(){return ew},Br:function(){return E},Dj:function(){return ek},E9:function(){return eh},EY:function(){return ef},FC:function(){return M},Gh:function(){return ea},HK:function(){return L},I1:function(){return g},J$:function(){return V},K8:function(){return l},K_:function(){return eu},N8:function(){return J},NV:function(){return p},Nc:function(){return er},O3:function(){return ei},OU:function(){return X},Og:function(){return h},Ov:function(){return m},PT:function(){return O},Qy:function(){return _},RQ:function(){return f},Rg:function(){return G},So:function(){return I},W_:function(){return N},X:function(){return U},XO:function(){return u},Xd:function(){return ee},Xm:function(){return j},YU:function(){return ed},Zr:function(){return y},ao:function(){return ey},b1:function(){return K},cu:function(){return ec},e2:function(){return Y},eH:function(){return S},fP:function(){return A},hT:function(){return eo},hy:function(){return d},j2:function(){return Z},jA:function(){return ep},jE:function(){return el},kK:function(){return w},kn:function(){return B},lg:function(){return et},mR:function(){return R},m_:function(){return C},n$:function(){return $},o6:function(){return v},pf:function(){return es},qm:function(){return i},rs:function(){return T},tN:function(){return H},um:function(){return en},v9:function(){return Q},wX:function(){return k},wd:function(){return z},xA:function(){return q},zg:function(){return D}});var r=o(80588);let a=0,n=e=>new Promise(t=>setTimeout(t,e)),c=async e=>{let t=Date.now();t-a>6e4?(e.includes("Authentication Error - Expired Key")?(r.ZP.info("UI Session Expired. Logging out."),a=t,await n(3e3),window.location.href="/"):r.ZP.error(e),a=t):console.log("Error suppressed to prevent spam:",e)},s="Authorization";function l(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"Authorization";console.log("setGlobalLitellmHeaderName: ".concat(e)),s=e}let i=async e=>{try{let t=await fetch("/get/litellm_model_cost_map",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}}),o=await t.json();return console.log("received litellm model cost data: ".concat(o)),o}catch(e){throw console.error("Failed to get model cost map:",e),e}},w=async(e,t)=>{try{let o=await fetch("/model/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await o.json();return console.log("API Response:",a),r.ZP.success("Model created successfully. Wait 60s and refresh on 'All Models' page"),a}catch(e){throw console.error("Failed to create key:",e),e}},d=async e=>{try{let t=await fetch("/model/settings",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},h=async(e,t)=>{console.log("model_id in model delete call: ".concat(t));try{let o=await fetch("/model/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({id:t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await o.json();return console.log("API Response:",a),r.ZP.success("Model deleted successfully. Restart server to see this."),a}catch(e){throw console.error("Failed to create key:",e),e}},p=async(e,t)=>{if(console.log("budget_id in budget delete call: ".concat(t)),null!=e)try{let o=await fetch("/budget/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({id:t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("API Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},y=async(e,t)=>{try{console.log("Form Values in budgetCreateCall:",t),console.log("Form Values after check:",t);let o=await fetch("/budget/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("API Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},u=async(e,t)=>{try{let o=await fetch("/invitation/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("API Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},f=async e=>{try{let t=await fetch("/alerting/settings",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},k=async(e,t,o)=>{try{if(console.log("Form Values in keyCreateCall:",o),o.description&&(o.metadata||(o.metadata={}),o.metadata.description=o.description,delete o.description,o.metadata=JSON.stringify(o.metadata)),o.metadata){console.log("formValues.metadata:",o.metadata);try{o.metadata=JSON.parse(o.metadata)}catch(e){throw Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",o);let r=await fetch("/key/generate",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...o})});if(!r.ok){let e=await r.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),a}catch(e){throw console.error("Failed to create key:",e),e}},m=async(e,t,o)=>{try{if(console.log("Form Values in keyCreateCall:",o),o.description&&(o.metadata||(o.metadata={}),o.metadata.description=o.description,delete o.description,o.metadata=JSON.stringify(o.metadata)),o.metadata){console.log("formValues.metadata:",o.metadata);try{o.metadata=JSON.parse(o.metadata)}catch(e){throw Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",o);let r=await fetch("/user/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...o})});if(!r.ok){let e=await r.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),a}catch(e){throw console.error("Failed to create key:",e),e}},g=async(e,t)=>{try{console.log("in keyDeleteCall:",t);let o=await fetch("/key/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:[t]})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},T=async(e,t)=>{try{console.log("in teamDeleteCall:",t);let o=await fetch("/team/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_ids:[t]})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to delete key:",e),e}},E=async function(e,t,o){let r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],a=arguments.length>4?arguments[4]:void 0,n=arguments.length>5?arguments[5]:void 0;try{let l="/user/info";"App Owner"==o&&t&&(l="".concat(l,"?user_id=").concat(t)),"App User"==o&&t&&(l="".concat(l,"?user_id=").concat(t)),("Internal User"==o||"Internal Viewer"==o)&&t&&(l="".concat(l,"?user_id=").concat(t)),console.log("in userInfoCall viewAll=",r),r&&n&&null!=a&&void 0!=a&&(l="".concat(l,"?view_all=true&page=").concat(a,"&page_size=").concat(n));let i=await fetch(l,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!i.ok){let e=await i.text();throw c(e),Error("Network response was not ok")}let w=await i.json();return console.log("API Response:",w),w}catch(e){throw console.error("Failed to create key:",e),e}},j=async(e,t)=>{try{let o="/team/info";t&&(o="".concat(o,"?team_id=").concat(t)),console.log("in teamInfoCall");let r=await fetch(o,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c(e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),a}catch(e){throw console.error("Failed to create key:",e),e}},_=async e=>{try{let t=await fetch("/global/spend",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to create key:",e),e}},N=async e=>{try{let t="/onboarding/get_token";t+="?invite_link=".concat(e);let o=await fetch(t,{method:"GET",headers:{"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to create key:",e),e}},C=async(e,t,o,r)=>{try{let a=await fetch("/onboarding/claim_token",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({invitation_link:t,user_id:o,password:r})});if(!a.ok){let e=await a.text();throw c(e),Error("Network response was not ok")}let n=await a.json();return console.log(n),n}catch(e){throw console.error("Failed to delete key:",e),e}},F=!1,b=null,x=async(e,t,o)=>{try{let t=await fetch("/v2/model/info",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw e+="error shown=".concat(F),F||(e.includes("No model list passed")&&(e="No Models Exist. Click Add Model to get started."),r.ZP.info(e,10),F=!0,b&&clearTimeout(b),b=setTimeout(()=>{F=!1},1e4)),Error("Network response was not ok")}let o=await t.json();return console.log("modelInfoCall:",o),o}catch(e){throw console.error("Failed to create key:",e),e}},B=async e=>{try{let t=await fetch("/model_group/info",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok)throw await t.text(),Error("Network response was not ok");let o=await t.json();return console.log("modelHubCall:",o),o}catch(e){throw console.error("Failed to create key:",e),e}},O=async e=>{try{let t=await fetch("/get/allowed_ips",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw Error("Network response was not ok: ".concat(e))}let o=await t.json();return console.log("getAllowedIPs:",o),o.data}catch(e){throw console.error("Failed to get allowed IPs:",e),e}},S=async(e,t)=>{try{let o=await fetch("/add/allowed_ip",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({ip:t})});if(!o.ok){let e=await o.text();throw Error("Network response was not ok: ".concat(e))}let r=await o.json();return console.log("addAllowedIP:",r),r}catch(e){throw console.error("Failed to add allowed IP:",e),e}},P=async(e,t)=>{try{let o=await fetch("/delete/allowed_ip",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({ip:t})});if(!o.ok){let e=await o.text();throw Error("Network response was not ok: ".concat(e))}let r=await o.json();return console.log("deleteAllowedIP:",r),r}catch(e){throw console.error("Failed to delete allowed IP:",e),e}},v=async(e,t,o,r,a,n,l,i)=>{try{let t="/model/metrics";r&&(t="".concat(t,"?_selected_model_group=").concat(r,"&startTime=").concat(a,"&endTime=").concat(n,"&api_key=").concat(l,"&customer=").concat(i));let o=await fetch(t,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to create key:",e),e}},G=async(e,t,o,r)=>{try{let a="/model/streaming_metrics";t&&(a="".concat(a,"?_selected_model_group=").concat(t,"&startTime=").concat(o,"&endTime=").concat(r));let n=await fetch(a,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!n.ok){let e=await n.text();throw c(e),Error("Network response was not ok")}return await n.json()}catch(e){throw console.error("Failed to create key:",e),e}},A=async(e,t,o,r,a,n,l,i)=>{try{let t="/model/metrics/slow_responses";r&&(t="".concat(t,"?_selected_model_group=").concat(r,"&startTime=").concat(a,"&endTime=").concat(n,"&api_key=").concat(l,"&customer=").concat(i));let o=await fetch(t,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to create key:",e),e}},J=async(e,t,o,r,a,n,l,i)=>{try{let t="/model/metrics/exceptions";r&&(t="".concat(t,"?_selected_model_group=").concat(r,"&startTime=").concat(a,"&endTime=").concat(n,"&api_key=").concat(l,"&customer=").concat(i));let o=await fetch(t,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to create key:",e),e}},I=async(e,t,o)=>{console.log("in /models calls, globalLitellmHeaderName",s);try{let t=await fetch("/models",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to create key:",e),e}},R=async e=>{try{let t="/global/spend/teams";console.log("in teamSpendLogsCall:",t);let o=await fetch("".concat(t),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},V=async(e,t,o,r)=>{try{let a="/global/spend/tags";t&&o&&(a="".concat(a,"?start_date=").concat(t,"&end_date=").concat(o)),r&&(a+="".concat(a,"&tags=").concat(r.join(","))),console.log("in tagsSpendLogsCall:",a);let n=await fetch("".concat(a),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!n.ok)throw await n.text(),Error("Network response was not ok");let c=await n.json();return console.log(c),c}catch(e){throw console.error("Failed to create key:",e),e}},U=async e=>{try{let t="/global/spend/all_tag_names";console.log("in global/spend/all_tag_names call",t);let o=await fetch("".concat(t),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok)throw await o.text(),Error("Network response was not ok");let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},Z=async e=>{try{let t="/global/all_end_users";console.log("in global/all_end_users call",t);let o=await fetch("".concat(t),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok)throw await o.text(),Error("Network response was not ok");let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},L=async(e,t,o,r,a,n)=>{try{console.log("user role in spend logs call: ".concat(o));let t="/spend/logs";t="App Owner"==o?"".concat(t,"?user_id=").concat(r,"&start_date=").concat(a,"&end_date=").concat(n):"".concat(t,"?start_date=").concat(a,"&end_date=").concat(n);let l=await fetch(t,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c(e),Error("Network response was not ok")}let i=await l.json();return console.log(i),i}catch(e){throw console.error("Failed to create key:",e),e}},M=async e=>{try{let t=await fetch("/global/spend/logs",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}let o=await t.json();return console.log(o),o}catch(e){throw console.error("Failed to create key:",e),e}},H=async e=>{try{let t=await fetch("/global/spend/keys?limit=5",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}let o=await t.json();return console.log(o),o}catch(e){throw console.error("Failed to create key:",e),e}},K=async(e,t,o,r)=>{try{let a="";a=t?JSON.stringify({api_key:t,startTime:o,endTime:r}):JSON.stringify({startTime:o,endTime:r});let n={method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:a},l=await fetch("/global/spend/end_users",n);if(!l.ok){let e=await l.text();throw c(e),Error("Network response was not ok")}let i=await l.json();return console.log(i),i}catch(e){throw console.error("Failed to create key:",e),e}},X=async(e,t,o,r)=>{try{let a="/global/spend/provider";o&&r&&(a+="?start_date=".concat(o,"&end_date=").concat(r)),t&&(a+="&api_key=".concat(t));let n={method:"GET",headers:{[s]:"Bearer ".concat(e)}},l=await fetch(a,n);if(!l.ok){let e=await l.text();throw c(e),Error("Network response was not ok")}let i=await l.json();return console.log(i),i}catch(e){throw console.error("Failed to fetch spend data:",e),e}},z=async(e,t,o)=>{try{let r="/global/activity";t&&o&&(r+="?start_date=".concat(t,"&end_date=").concat(o));let a={method:"GET",headers:{[s]:"Bearer ".concat(e)}},n=await fetch(r,a);if(!n.ok)throw await n.text(),Error("Network response was not ok");let c=await n.json();return console.log(c),c}catch(e){throw console.error("Failed to fetch spend data:",e),e}},D=async(e,t,o)=>{try{let r="/global/activity/cache_hits";t&&o&&(r+="?start_date=".concat(t,"&end_date=").concat(o));let a={method:"GET",headers:{[s]:"Bearer ".concat(e)}},n=await fetch(r,a);if(!n.ok)throw await n.text(),Error("Network response was not ok");let c=await n.json();return console.log(c),c}catch(e){throw console.error("Failed to fetch spend data:",e),e}},q=async(e,t,o)=>{try{let r="/global/activity/model";t&&o&&(r+="?start_date=".concat(t,"&end_date=").concat(o));let a={method:"GET",headers:{[s]:"Bearer ".concat(e)}},n=await fetch(r,a);if(!n.ok)throw await n.text(),Error("Network response was not ok");let c=await n.json();return console.log(c),c}catch(e){throw console.error("Failed to fetch spend data:",e),e}},$=async(e,t,o,r)=>{try{let a="/global/activity/exceptions";t&&o&&(a+="?start_date=".concat(t,"&end_date=").concat(o)),r&&(a+="&model_group=".concat(r));let n={method:"GET",headers:{[s]:"Bearer ".concat(e)}},c=await fetch(a,n);if(!c.ok)throw await c.text(),Error("Network response was not ok");let l=await c.json();return console.log(l),l}catch(e){throw console.error("Failed to fetch spend data:",e),e}},Q=async(e,t,o,r)=>{try{let a="/global/activity/exceptions/deployment";t&&o&&(a+="?start_date=".concat(t,"&end_date=").concat(o)),r&&(a+="&model_group=".concat(r));let n={method:"GET",headers:{[s]:"Bearer ".concat(e)}},c=await fetch(a,n);if(!c.ok)throw await c.text(),Error("Network response was not ok");let l=await c.json();return console.log(l),l}catch(e){throw console.error("Failed to fetch spend data:",e),e}},W=async e=>{try{let t=await fetch("/global/spend/models?limit=5",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}let o=await t.json();return console.log(o),o}catch(e){throw console.error("Failed to create key:",e),e}},Y=async(e,t)=>{try{let o=await fetch("/v2/key/info",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:t})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},ee=async(e,t)=>{try{let o="/user/get_users?role=".concat(t);console.log("in userGetAllUsersCall:",o);let r=await fetch(o,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c(e),Error("Network response was not ok")}let a=await r.json();return console.log(a),a}catch(e){throw console.error("Failed to get requested models:",e),e}},et=async e=>{try{let t=await fetch("/user/available_roles",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok)throw await t.text(),Error("Network response was not ok");let o=await t.json();return console.log("response from user/available_role",o),o}catch(e){throw e}},eo=async(e,t)=>{try{console.log("Form Values in teamCreateCall:",t);let o=await fetch("/team/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("API Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},er=async(e,t)=>{try{console.log("Form Values in keyUpdateCall:",t);let o=await fetch("/key/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("Update key Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},ea=async(e,t)=>{try{console.log("Form Values in teamUpateCall:",t);let o=await fetch("/team/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("Update Team Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},en=async(e,t)=>{try{console.log("Form Values in modelUpateCall:",t);let o=await fetch("/model/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error update from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("Update model Response:",r),r}catch(e){throw console.error("Failed to update model:",e),e}},ec=async(e,t,o)=>{try{console.log("Form Values in teamMemberAddCall:",o);let r=await fetch("/team/member_add",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_id:t,member:o})});if(!r.ok){let e=await r.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),a}catch(e){throw console.error("Failed to create key:",e),e}},es=async(e,t,o)=>{try{console.log("Form Values in userUpdateUserCall:",t);let r={...t};null!==o&&(r.user_role=o),r=JSON.stringify(r);let a=await fetch("/user/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:r});if(!a.ok){let e=await a.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await a.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},el=async(e,t)=>{try{let o="/health/services?service=".concat(t);console.log("Checking Slack Budget Alerts service health");let a=await fetch(o,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!a.ok){let e=await a.text();throw c(e),Error(e)}let n=await a.json();return r.ZP.success("Test request to ".concat(t," made - check logs/alerts on ").concat(t," to verify")),n}catch(e){throw console.error("Failed to perform health check:",e),e}},ei=async e=>{try{let t=await fetch("/budget/list",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},ew=async(e,t,o)=>{try{let t=await fetch("/get/config/callbacks",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},ed=async e=>{try{let t=await fetch("/config/list?config_type=general_settings",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},eh=async(e,t)=>{try{let o=await fetch("/config/field/info?field_name=".concat(t),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok)throw await o.text(),Error("Network response was not ok");return await o.json()}catch(e){throw console.error("Failed to set callbacks:",e),e}},ep=async(e,t,o)=>{try{let a=await fetch("/config/field/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({field_name:t,field_value:o,config_type:"general_settings"})});if(!a.ok){let e=await a.text();throw c(e),Error("Network response was not ok")}let n=await a.json();return r.ZP.success("Successfully updated value!"),n}catch(e){throw console.error("Failed to set callbacks:",e),e}},ey=async(e,t)=>{try{let o=await fetch("/config/field/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({field_name:t,config_type:"general_settings"})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let a=await o.json();return r.ZP.success("Field reset on proxy"),a}catch(e){throw console.error("Failed to get callbacks:",e),e}},eu=async(e,t)=>{try{let o=await fetch("/config/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to set callbacks:",e),e}},ef=async e=>{try{let t=await fetch("/health",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to call /health:",e),e}},ek=async e=>{try{let t=await fetch("/sso/get/logout_url",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok)throw await t.text(),Error("Network response was not ok");return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}}}}]);
\ No newline at end of file
diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/app/page-b6860ddd56500b95.js b/litellm/proxy/_experimental/out/_next/static/chunks/app/page-b6860ddd56500b95.js
new file mode 100644
index 00000000000..e8221c4aa2c
--- /dev/null
+++ b/litellm/proxy/_experimental/out/_next/static/chunks/app/page-b6860ddd56500b95.js
@@ -0,0 +1 @@
+(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{20661:function(e,l,s){Promise.resolve().then(s.bind(s,48951))},667:function(e,l,s){"use strict";s.r(l),s.d(l,{default:function(){return f}});var t=s(3827),n=s(64090),a=s(47907),r=s(16450),i=s(18190),o=s(13810),d=s(10384),c=s(46453),m=s(71801),u=s(52273),h=s(42440),x=s(30953),p=s(777),j=s(37963),g=s(60620),Z=s(1861);function f(){let[e]=g.Z.useForm(),l=(0,a.useSearchParams)();!function(e){console.log("COOKIES",document.cookie);let l=document.cookie.split("; ").find(l=>l.startsWith(e+"="));l&&l.split("=")[1]}("token");let s=l.get("invitation_id"),[f,_]=(0,n.useState)(null),[y,b]=(0,n.useState)(""),[v,S]=(0,n.useState)(""),[k,w]=(0,n.useState)(null),[N,I]=(0,n.useState)(""),[A,C]=(0,n.useState)("");return(0,n.useEffect)(()=>{s&&(0,p.W_)(s).then(e=>{let l=e.login_url;console.log("login_url:",l),I(l);let s=e.token,t=(0,j.o)(s);C(s),console.log("decoded:",t),_(t.key),console.log("decoded user email:",t.user_email),S(t.user_email),w(t.user_id)})},[s]),(0,t.jsx)("div",{className:"mx-auto w-full max-w-md mt-10",children:(0,t.jsxs)(o.Z,{children:[(0,t.jsx)(h.Z,{className:"text-sm mb-5 text-center",children:"\uD83D\uDE85 LiteLLM"}),(0,t.jsx)(h.Z,{className:"text-xl",children:"Sign up"}),(0,t.jsx)(m.Z,{children:"Claim your user account to login to Admin UI."}),(0,t.jsx)(i.Z,{className:"mt-4",title:"SSO",icon:x.GH$,color:"sky",children:(0,t.jsxs)(c.Z,{numItems:2,className:"flex justify-between items-center",children:[(0,t.jsx)(d.Z,{children:"SSO is under the Enterprise Tirer."}),(0,t.jsx)(d.Z,{children:(0,t.jsx)(r.Z,{variant:"primary",className:"mb-2",children:(0,t.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get Free Trial"})})})]})}),(0,t.jsxs)(g.Z,{className:"mt-10 mb-5 mx-auto",layout:"vertical",onFinish:e=>{console.log("in handle submit. accessToken:",f,"token:",A,"formValues:",e),f&&A&&(e.user_email=v,k&&s&&(0,p.m_)(f,s,k,e.password).then(e=>{var l;let s="/ui/";s+="?userID="+((null===(l=e.data)||void 0===l?void 0:l.user_id)||e.user_id),document.cookie="token="+A,console.log("redirecting to:",s),window.location.href=s}))},children:[(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(g.Z.Item,{label:"Email Address",name:"user_email",children:(0,t.jsx)(u.Z,{type:"email",disabled:!0,value:v,defaultValue:v,className:"max-w-md"})}),(0,t.jsx)(g.Z.Item,{label:"Password",name:"password",rules:[{required:!0,message:"password required to sign up"}],help:"Create a password for your account",children:(0,t.jsx)(u.Z,{placeholder:"",type:"password",className:"max-w-md"})})]}),(0,t.jsx)("div",{className:"mt-10",children:(0,t.jsx)(Z.ZP,{htmlType:"submit",children:"Sign Up"})})]})]})})}},48951:function(e,l,s){"use strict";s.r(l),s.d(l,{default:function(){return lo}});var t,n,a=s(3827),r=s(64090),i=s(47907),o=s(8792),d=s(40491),c=s(65270),m=e=>{let{userID:l,userRole:s,userEmail:t,showSSOBanner:n,premiumUser:r,setProxySettings:i,proxySettings:m}=e;console.log("User ID:",l),console.log("userEmail:",t),console.log("showSSOBanner:",n),console.log("premiumUser:",r),console.log=function(){};let u="";console.log("PROXY_settings=",m),m&&m.PROXY_LOGOUT_URL&&void 0!==m.PROXY_LOGOUT_URL&&(u=m.PROXY_LOGOUT_URL),console.log("logoutUrl=",u);let h=[{key:"1",label:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("p",{children:["Role: ",s]}),(0,a.jsxs)("p",{children:["ID: ",l]}),(0,a.jsxs)("p",{children:["Premium User: ",String(r)]})]})},{key:"2",label:(0,a.jsx)("p",{onClick:()=>{document.cookie="token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;",window.location.href=u},children:"Logout"})}];return(0,a.jsxs)("nav",{className:"left-0 right-0 top-0 flex justify-between items-center h-12 mb-4",children:[(0,a.jsx)("div",{className:"text-left my-2 absolute top-0 left-0",children:(0,a.jsx)("div",{className:"flex flex-col items-center",children:(0,a.jsx)(o.default,{href:"/",children:(0,a.jsx)("button",{className:"text-gray-800 rounded text-center",children:(0,a.jsx)("img",{src:"/get_image",width:160,height:160,alt:"LiteLLM Brand",className:"mr-2"})})})})}),(0,a.jsxs)("div",{className:"text-right mx-4 my-2 absolute top-0 right-0 flex items-center justify-end space-x-2",children:[n?(0,a.jsx)("div",{style:{padding:"6px",borderRadius:"8px"},children:(0,a.jsx)("a",{href:"https://calendly.com/d/4mp-gd3-k5k/litellm-1-1-onboarding-chat",target:"_blank",style:{fontSize:"14px",textDecoration:"underline"},children:"Get enterprise license"})}):null,(0,a.jsx)("div",{style:{border:"1px solid #391085",padding:"6px",borderRadius:"8px"},children:(0,a.jsx)(d.Z,{menu:{items:h},children:(0,a.jsx)(c.Z,{children:t})})})]})]})},u=s(777),h=s(10384),x=s(46453),p=s(16450),j=s(52273),g=s(26780),Z=s(15595),f=s(6698),_=s(71801),y=s(42440),b=s(42308),v=s(50670),S=s(60620),k=s(80588),w=s(99129),N=s(44839),I=s(88707),A=s(1861);let{Option:C}=v.default;var P=e=>{let{userID:l,team:s,userRole:t,accessToken:n,data:i,setData:o}=e,[d]=S.Z.useForm(),[c,m]=(0,r.useState)(!1),[P,T]=(0,r.useState)(null),[E,O]=(0,r.useState)(null),[R,F]=(0,r.useState)([]),[M,D]=(0,r.useState)([]),L=()=>{m(!1),d.resetFields()},U=()=>{m(!1),T(null),d.resetFields()};(0,r.useEffect)(()=>{(async()=>{try{if(null===l||null===t)return;if(null!==n){let e=(await (0,u.So)(n,l,t)).data.map(e=>e.id);console.log("available_model_names:",e),F(e)}}catch(e){console.error("Error fetching user models:",e)}})()},[n,l,t]);let V=async e=>{try{var s,t,a;let r=null!==(s=null==e?void 0:e.key_alias)&&void 0!==s?s:"",c=null!==(t=null==e?void 0:e.team_id)&&void 0!==t?t:null;if((null!==(a=null==i?void 0:i.filter(e=>e.team_id===c).map(e=>e.key_alias))&&void 0!==a?a:[]).includes(r))throw Error("Key alias ".concat(r," already exists for team with ID ").concat(c,", please provide another key alias"));k.ZP.info("Making API Call"),m(!0);let h=await (0,u.wX)(n,l,e);console.log("key create Response:",h),o(e=>e?[...e,h]:[h]),T(h.key),O(h.soft_budget),k.ZP.success("API Key Created"),d.resetFields(),localStorage.removeItem("userData"+l)}catch(e){console.error("Error creating the key:",e),k.ZP.error("Error creating the key: ".concat(e),20)}};return(0,r.useEffect)(()=>{D(s&&s.models.length>0?s.models.includes("all-proxy-models")?R:s.models:R)},[s,R]),(0,a.jsxs)("div",{children:[(0,a.jsx)(p.Z,{className:"mx-auto",onClick:()=>m(!0),children:"+ Create New Key"}),(0,a.jsx)(w.Z,{title:"Create Key",visible:c,width:800,footer:null,onOk:L,onCancel:U,children:(0,a.jsxs)(S.Z,{form:d,onFinish:V,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{label:"Key Name",name:"key_alias",rules:[{required:!0,message:"Please input a key name"}],help:"required",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(S.Z.Item,{label:"Team ID",name:"team_id",hidden:!0,initialValue:s?s.team_id:null,valuePropName:"team_id",className:"mt-8",children:(0,a.jsx)(N.Z,{value:s?s.team_alias:"",disabled:!0})}),(0,a.jsx)(S.Z.Item,{label:"Models",name:"models",rules:[{required:!0,message:"Please select a model"}],help:"required",children:(0,a.jsxs)(v.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},onChange:e=>{e.includes("all-team-models")&&d.setFieldsValue({models:["all-team-models"]})},children:[(0,a.jsx)(C,{value:"all-team-models",children:"All Team Models"},"all-team-models"),M.map(e=>(0,a.jsx)(C,{value:e,children:e},e))]})}),(0,a.jsxs)(g.Z,{className:"mt-20 mb-8",children:[(0,a.jsx)(f.Z,{children:(0,a.jsx)("b",{children:"Optional Settings"})}),(0,a.jsxs)(Z.Z,{children:[(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"Max Budget (USD)",name:"max_budget",help:"Budget cannot exceed team max budget: $".concat((null==s?void 0:s.max_budget)!==null&&(null==s?void 0:s.max_budget)!==void 0?null==s?void 0:s.max_budget:"unlimited"),rules:[{validator:async(e,l)=>{if(l&&s&&null!==s.max_budget&&l>s.max_budget)throw Error("Budget cannot exceed team max budget: $".concat(s.max_budget))}}],children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",help:"Team Reset Budget: ".concat((null==s?void 0:s.budget_duration)!==null&&(null==s?void 0:s.budget_duration)!==void 0?null==s?void 0:s.budget_duration:"None"),children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})}),(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"Tokens per minute Limit (TPM)",name:"tpm_limit",help:"TPM cannot exceed team TPM limit: ".concat((null==s?void 0:s.tpm_limit)!==null&&(null==s?void 0:s.tpm_limit)!==void 0?null==s?void 0:s.tpm_limit:"unlimited"),rules:[{validator:async(e,l)=>{if(l&&s&&null!==s.tpm_limit&&l>s.tpm_limit)throw Error("TPM limit cannot exceed team TPM limit: ".concat(s.tpm_limit))}}],children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"Requests per minute Limit (RPM)",name:"rpm_limit",help:"RPM cannot exceed team RPM limit: ".concat((null==s?void 0:s.rpm_limit)!==null&&(null==s?void 0:s.rpm_limit)!==void 0?null==s?void 0:s.rpm_limit:"unlimited"),rules:[{validator:async(e,l)=>{if(l&&s&&null!==s.rpm_limit&&l>s.rpm_limit)throw Error("RPM limit cannot exceed team RPM limit: ".concat(s.rpm_limit))}}],children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(S.Z.Item,{label:"Expire Key (eg: 30s, 30h, 30d)",name:"duration",className:"mt-8",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(S.Z.Item,{label:"Metadata",name:"metadata",className:"mt-8",children:(0,a.jsx)(N.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})})]})]})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Create Key"})})]})}),P&&(0,a.jsx)(w.Z,{visible:c,onOk:L,onCancel:U,footer:null,children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 w-full",children:[(0,a.jsx)(y.Z,{children:"Save your Key"}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)("p",{children:["Please save this secret key somewhere safe and accessible. For security reasons, ",(0,a.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]})}),(0,a.jsx)(h.Z,{numColSpan:1,children:null!=P?(0,a.jsxs)("div",{children:[(0,a.jsx)(_.Z,{className:"mt-3",children:"API Key:"}),(0,a.jsx)("div",{style:{background:"#f8f8f8",padding:"10px",borderRadius:"5px",marginBottom:"10px"},children:(0,a.jsx)("pre",{style:{wordWrap:"break-word",whiteSpace:"normal"},children:P})}),(0,a.jsx)(b.CopyToClipboard,{text:P,onCopy:()=>{k.ZP.success("API Key copied to clipboard")},children:(0,a.jsx)(p.Z,{className:"mt-3",children:"Copy API Key"})})]}):(0,a.jsx)(_.Z,{children:"Key being created, this might take 30s"})})]})})]})},T=s(9454),E=s(98941),O=s(33393),R=s(5),F=s(13810),M=s(61244),D=s(10827),L=s(3851),U=s(2044),V=s(64167),q=s(74480),z=s(7178),B=s(95093),K=s(27166);let{Option:W}=v.default;console.log=function(){};var H=e=>{let{userID:l,userRole:s,accessToken:t,selectedTeam:n,data:i,setData:o,teams:d}=e,[c,m]=(0,r.useState)(!1),[h,x]=(0,r.useState)(!1),[j,g]=(0,r.useState)(null),[Z,f]=(0,r.useState)(null),[b,C]=(0,r.useState)(null),[P,H]=(0,r.useState)(""),[G,Y]=(0,r.useState)(!1),[J,X]=(0,r.useState)(!1),[$,Q]=(0,r.useState)(null),[ee,el]=(0,r.useState)([]),es=new Set,[et,en]=(0,r.useState)(es);(0,r.useEffect)(()=>{(async()=>{try{if(null===l)return;if(null!==t&&null!==s){let e=(await (0,u.So)(t,l,s)).data.map(e=>e.id);console.log("available_model_names:",e),el(e)}}catch(e){console.error("Error fetching user models:",e)}})()},[t,l,s]),(0,r.useEffect)(()=>{if(d){let e=new Set;d.forEach((l,s)=>{let t=l.team_id;e.add(t)}),en(e)}},[d]);let ea=e=>{console.log("handleEditClick:",e),null==e.token&&null!==e.token_id&&(e.token=e.token_id),Q(e),Y(!0)},er=async e=>{if(null==t)return;let l=e.token;e.key=l,console.log("handleEditSubmit:",e);let s=await (0,u.Nc)(t,e);console.log("handleEditSubmit: newKeyValues",s),i&&o(i.map(e=>e.token===l?s:e)),k.ZP.success("Key updated successfully"),Y(!1),Q(null)},ei=async e=>{console.log("handleDelete:",e),null==e.token&&null!==e.token_id&&(e.token=e.token_id),null!=i&&(g(e.token),localStorage.removeItem("userData"+l),x(!0))},eo=async()=>{if(null!=j&&null!=i){try{await (0,u.I1)(t,j);let e=i.filter(e=>e.token!==j);o(e)}catch(e){console.error("Error deleting the key:",e)}x(!1),g(null)}};if(null!=i)return console.log("RERENDER TRIGGERED"),(0,a.jsxs)("div",{children:[(0,a.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4 mt-2",children:[(0,a.jsxs)(D.Z,{className:"mt-5 max-h-[300px] min-h-[300px]",children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Key Alias"}),(0,a.jsx)(q.Z,{children:"Secret Key"}),(0,a.jsx)(q.Z,{children:"Spend (USD)"}),(0,a.jsx)(q.Z,{children:"Budget (USD)"}),(0,a.jsx)(q.Z,{children:"Models"}),(0,a.jsx)(q.Z,{children:"TPM / RPM Limits"})]})}),(0,a.jsx)(L.Z,{children:i.map(e=>{if(console.log(e),"litellm-dashboard"===e.team_id)return null;if(n){if(console.log("item team id: ".concat(e.team_id,", knownTeamIDs.has(item.team_id): ").concat(et.has(e.team_id),", selectedTeam id: ").concat(n.team_id)),(null!=n.team_id||null===e.team_id||et.has(e.team_id))&&e.team_id!=n.team_id)return null;console.log("item team id: ".concat(e.team_id,", is returned"))}return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{style:{maxWidth:"2px",whiteSpace:"pre-wrap",overflow:"hidden"},children:null!=e.key_alias?(0,a.jsx)(_.Z,{children:e.key_alias}):(0,a.jsx)(_.Z,{children:"Not Set"})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(_.Z,{children:e.key_name})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(_.Z,{children:(()=>{try{return parseFloat(e.spend).toFixed(4)}catch(l){return e.spend}})()})}),(0,a.jsx)(U.Z,{children:null!=e.max_budget?(0,a.jsx)(_.Z,{children:e.max_budget}):(0,a.jsx)(_.Z,{children:"Unlimited"})}),(0,a.jsx)(U.Z,{children:Array.isArray(e.models)?(0,a.jsx)("div",{style:{display:"flex",flexDirection:"column"},children:0===e.models.length?(0,a.jsx)(a.Fragment,{children:n&&n.models&&n.models.length>0?n.models.map((e,l)=>"all-proxy-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Proxy Models"})},l):"all-team-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Team Models"})},l):(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"blue",children:(0,a.jsx)(_.Z,{children:e.length>30?"".concat(e.slice(0,30),"..."):e})},l)):(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"blue",children:(0,a.jsx)(_.Z,{children:"all-proxy-models"})})}):e.models.map((e,l)=>"all-proxy-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Proxy Models"})},l):"all-team-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Team Models"})},l):(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"blue",children:(0,a.jsx)(_.Z,{children:e.length>30?"".concat(e.slice(0,30),"..."):e})},l))}):null}),(0,a.jsx)(U.Z,{children:(0,a.jsxs)(_.Z,{children:["TPM: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,a.jsx)("br",{})," RPM:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(M.Z,{onClick:()=>{Q(e),X(!0)},icon:T.Z,size:"sm"}),(0,a.jsx)(w.Z,{open:J,onCancel:()=>{X(!1),Q(null)},footer:null,width:800,children:$&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3 mt-8",children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Spend"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:(()=>{try{return parseFloat($.spend).toFixed(4)}catch(e){return $.spend}})()})})]}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Budget"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:null!=$.max_budget?(0,a.jsx)(a.Fragment,{children:$.max_budget}):(0,a.jsx)(a.Fragment,{children:"Unlimited"})})})]},e.name),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Expires"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor-default font-small text-tremor-content-strong dark:text-dark-tremor-content-strong",children:null!=$.expires?(0,a.jsx)(a.Fragment,{children:new Date($.expires).toLocaleString(void 0,{day:"numeric",month:"long",year:"numeric",hour:"numeric",minute:"numeric",second:"numeric"})}):(0,a.jsx)(a.Fragment,{children:"Never"})})})]},e.name)]}),(0,a.jsxs)(F.Z,{className:"my-4",children:[(0,a.jsx)(y.Z,{children:"Token Name"}),(0,a.jsx)(_.Z,{className:"my-1",children:$.key_alias?$.key_alias:$.key_name}),(0,a.jsx)(y.Z,{children:"Token ID"}),(0,a.jsx)(_.Z,{className:"my-1 text-[12px]",children:$.token}),(0,a.jsx)(y.Z,{children:"Metadata"}),(0,a.jsx)(_.Z,{className:"my-1",children:(0,a.jsxs)("pre",{children:[JSON.stringify($.metadata)," "]})})]}),(0,a.jsx)(p.Z,{className:"mx-auto flex items-center",onClick:()=>{X(!1),Q(null)},children:"Close"})]})}),(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>ea(e)}),(0,a.jsx)(M.Z,{onClick:()=>ei(e),icon:O.Z,size:"sm"})]})]},e.token)})})]}),h&&(0,a.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,a.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,a.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,a.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,a.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:""}),(0,a.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,a.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,a.jsx)("div",{className:"sm:flex sm:items-start",children:(0,a.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,a.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Key"}),(0,a.jsx)("div",{className:"mt-2",children:(0,a.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this key ?"})})]})})}),(0,a.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,a.jsx)(p.Z,{onClick:eo,color:"red",className:"ml-2",children:"Delete"}),(0,a.jsx)(p.Z,{onClick:()=>{x(!1),g(null)},children:"Cancel"})]})]})]})})]}),$&&(0,a.jsx)(e=>{let{visible:l,onCancel:s,token:t,onSubmit:i}=e,[o]=S.Z.useForm(),[c,m]=(0,r.useState)(n),[u,h]=(0,r.useState)([]),[x,p]=(0,r.useState)(!1);return(0,a.jsx)(w.Z,{title:"Edit Key",visible:l,width:800,footer:null,onOk:()=>{o.validateFields().then(e=>{o.resetFields()}).catch(e=>{console.error("Validation failed:",e)})},onCancel:s,children:(0,a.jsxs)(S.Z,{form:o,onFinish:er,initialValues:t,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{label:"Key Name",name:"key_alias",rules:[{required:!0,message:"Please input a key name"}],help:"required",children:(0,a.jsx)(N.Z,{})}),(0,a.jsx)(S.Z.Item,{label:"Models",name:"models",rules:[{validator:(e,l)=>{let s=l.filter(e=>!c.models.includes(e)&&"all-team-models"!==e&&"all-proxy-models"!==e&&!c.models.includes("all-proxy-models"));return(console.log("errorModels: ".concat(s)),s.length>0)?Promise.reject("Some models are not part of the new team's models - ".concat(s,"Team models: ").concat(c.models)):Promise.resolve()}}],children:(0,a.jsxs)(v.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:[(0,a.jsx)(W,{value:"all-team-models",children:"All Team Models"},"all-team-models"),c&&c.models?c.models.includes("all-proxy-models")?ee.filter(e=>"all-proxy-models"!==e).map(e=>(0,a.jsx)(W,{value:e,children:e},e)):c.models.map(e=>(0,a.jsx)(W,{value:e,children:e},e)):ee.map(e=>(0,a.jsx)(W,{value:e,children:e},e))]})}),(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"Max Budget (USD)",name:"max_budget",help:"Budget cannot exceed team max budget: ".concat((null==c?void 0:c.max_budget)!==null&&(null==c?void 0:c.max_budget)!==void 0?null==c?void 0:c.max_budget:"unlimited"),rules:[{validator:async(e,l)=>{if(l&&c&&null!==c.max_budget&&l>c.max_budget)throw console.log("keyTeam.max_budget: ".concat(c.max_budget)),Error("Budget cannot exceed team max budget: $".concat(c.max_budget))}}],children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(S.Z.Item,{label:"token",name:"token",hidden:!0}),(0,a.jsx)(S.Z.Item,{label:"Team",name:"team_id",help:"the team this key belongs to",children:(0,a.jsx)(B.Z,{value:t.team_alias,children:null==d?void 0:d.map((e,l)=>(0,a.jsx)(K.Z,{value:e.team_id,onClick:()=>m(e),children:e.team_alias},l))})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Edit Key"})})]})})},{visible:G,onCancel:()=>{Y(!1),Q(null)},token:$,onSubmit:er})]})};console.log=function(){};var G=e=>{let{userID:l,userRole:s,accessToken:t,userSpend:n,selectedTeam:i}=e;console.log("userSpend: ".concat(n));let[o,d]=(0,r.useState)(null!==n?n:0),[c,m]=(0,r.useState)(0),[h,x]=(0,r.useState)([]);(0,r.useEffect)(()=>{let e=async()=>{if(t&&l&&s&&"Admin"===s&&null==n)try{let e=await (0,u.Qy)(t);e&&(e.spend?d(e.spend):d(0),e.max_budget?m(e.max_budget):m(0))}catch(e){console.error("Error fetching global spend data:",e)}};(async()=>{try{if(null===l||null===s)return;if(null!==t){let e=(await (0,u.So)(t,l,s)).data.map(e=>e.id);console.log("available_model_names:",e),x(e)}}catch(e){console.error("Error fetching user models:",e)}})(),e()},[s,t,l]),(0,r.useEffect)(()=>{null!==n&&d(n)},[n]);let p=[];i&&i.models&&(p=i.models),p&&p.includes("all-proxy-models")?(console.log("user models:",h),p=h):p&&p.includes("all-team-models")?p=i.models:p&&0===p.length&&(p=h);let j=void 0!==o?o.toFixed(4):null;return console.log("spend in view user spend: ".concat(o)),(0,a.jsx)("div",{className:"flex items-center",children:(0,a.jsxs)("div",{children:[(0,a.jsxs)("p",{className:"text-tremor-default text-tremor-content dark:text-dark-tremor-content",children:["Total Spend"," "]}),(0,a.jsxs)("p",{className:"text-2xl text-tremor-content-strong dark:text-dark-tremor-content-strong font-semibold",children:["$",j]})]})})};console.log=function(){};var Y=e=>{let{userID:l,userRole:s,selectedTeam:t,accessToken:n}=e,[i,o]=(0,r.useState)([]);(0,r.useEffect)(()=>{(async()=>{try{if(null===l||null===s)return;if(null!==n){let e=(await (0,u.So)(n,l,s)).data.map(e=>e.id);console.log("available_model_names:",e),o(e)}}catch(e){console.error("Error fetching user models:",e)}})()},[n,l,s]);let d=[];return t&&t.models&&(d=t.models),d&&d.includes("all-proxy-models")&&(console.log("user models:",i),d=i),(0,a.jsx)(a.Fragment,{children:(0,a.jsx)("div",{className:"mb-5",children:(0,a.jsx)("p",{className:"text-3xl text-tremor-content-strong dark:text-dark-tremor-content-strong font-semibold",children:null==t?void 0:t.team_alias})})})},J=e=>{let l,{teams:s,setSelectedTeam:t,userRole:n}=e,i={models:[],team_id:null,team_alias:"Default Team"},[o,d]=(0,r.useState)(i);return(l="App User"===n?s:s?[...s,i]:[i],"App User"===n)?null:(0,a.jsxs)("div",{className:"mt-5 mb-5",children:[(0,a.jsx)(y.Z,{children:"Select Team"}),(0,a.jsx)(_.Z,{children:"If you belong to multiple teams, this setting controls which team is used by default when creating new API Keys."}),(0,a.jsxs)(_.Z,{className:"mt-3 mb-3",children:[(0,a.jsx)("b",{children:"Default Team:"})," If no team_id is set for a key, it will be grouped under here."]}),l&&l.length>0?(0,a.jsx)(B.Z,{defaultValue:"0",children:l.map((e,l)=>(0,a.jsx)(K.Z,{value:String(l),onClick:()=>t(e),children:e.team_alias},l))}):(0,a.jsxs)(_.Z,{children:["No team created. ",(0,a.jsx)("b",{children:"Defaulting to personal account."})]})]})},X=s(667),$=s(37963),Q=s(97482);console.log=function(){},console.log("isLocal:",!1);var ee=e=>{let{userID:l,userRole:s,teams:t,keys:n,setUserRole:o,userEmail:d,setUserEmail:c,setTeams:m,setKeys:p,setProxySettings:j,proxySettings:g}=e,[Z,f]=(0,r.useState)(null),_=(0,i.useSearchParams)();_.get("viewSpend"),(0,i.useRouter)();let y=function(e){console.log("COOKIES",document.cookie);let l=document.cookie.split("; ").find(l=>l.startsWith(e+"="));return l?l.split("=")[1]:null}("token"),b=_.get("invitation_id"),[v,S]=(0,r.useState)(null),[k,w]=(0,r.useState)(null),[N,I]=(0,r.useState)([]),A={models:[],team_alias:"Default Team",team_id:null},[C,T]=(0,r.useState)(t?t[0]:A);if(window.addEventListener("beforeunload",function(){sessionStorage.clear()}),(0,r.useEffect)(()=>{if(y){let e=(0,$.o)(y);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),S(e.key),e.user_role){let l=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";case"internal_user":return"Internal User";case"internal_user_viewer":return"Internal Viewer";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",l),o(l)}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e))}}if(l&&v&&s&&!n&&!Z){let e=sessionStorage.getItem("userModels"+l);e?I(JSON.parse(e)):(async()=>{try{let e=await (0,u.Dj)(v);j(e);let t=await (0,u.Br)(v,l,s,!1,null,null);if(console.log("received teams in user dashboard: ".concat(Object.keys(t),"; team values: ").concat(Object.entries(t.teams))),"Admin"==s){let e=await (0,u.Qy)(v);f(e),console.log("globalSpend:",e)}else f(t.user_info);p(t.keys),m(t.teams);let n=[...t.teams];n.length>0?(console.log("response['teams']: ".concat(n)),T(n[0])):T(A),sessionStorage.setItem("userData"+l,JSON.stringify(t.keys)),sessionStorage.setItem("userSpendData"+l,JSON.stringify(t.user_info));let a=(await (0,u.So)(v,l,s)).data.map(e=>e.id);console.log("available_model_names:",a),I(a),console.log("userModels:",N),sessionStorage.setItem("userModels"+l,JSON.stringify(a))}catch(e){console.error("There was an error fetching the data",e)}})()}},[l,y,v,n,s]),(0,r.useEffect)(()=>{if(null!==n&&null!=C&&null!==C.team_id){let e=0;for(let l of n)C.hasOwnProperty("team_id")&&null!==l.team_id&&l.team_id===C.team_id&&(e+=l.spend);w(e)}else if(null!==n){let e=0;for(let l of n)e+=l.spend;w(e)}},[C]),null!=b)return(0,a.jsx)(X.default,{});if(null==l||null==y){let e="/sso/key/generate";return document.cookie="token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;",console.log("Full URL:",e),window.location.href=e,null}if(null==v)return null;if(null==s&&o("App Owner"),s&&"Admin Viewer"==s){let{Title:e,Paragraph:l}=Q.default;return(0,a.jsxs)("div",{children:[(0,a.jsx)(e,{level:1,children:"Access Denied"}),(0,a.jsx)(l,{children:"Ask your proxy admin for access to create keys"})]})}return console.log("inside user dashboard, selected team",C),(0,a.jsx)("div",{className:"w-full mx-4",children:(0,a.jsx)(x.Z,{numItems:1,className:"gap-2 p-8 h-[75vh] w-full mt-2",children:(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(Y,{userID:l,userRole:s,selectedTeam:C||null,accessToken:v}),(0,a.jsx)(G,{userID:l,userRole:s,accessToken:v,userSpend:k,selectedTeam:C||null}),(0,a.jsx)(H,{userID:l,userRole:s,accessToken:v,selectedTeam:C||null,data:n,setData:p,teams:t}),(0,a.jsx)(P,{userID:l,team:C||null,userRole:s,accessToken:v,data:n,setData:p},C?C.team_id:null),(0,a.jsx)(J,{teams:t,setSelectedTeam:T,userRole:s})]})})})},el=s(49167),es=s(35087),et=s(92836),en=s(26734),ea=s(41608),er=s(32126),ei=s(23682),eo=s(47047),ed=s(76628),ec=s(25707),em=s(44041),eu=s(6180),eh=s(28683),ex=s(38302),ep=s(66242),ej=s(78578),eg=s(63954),eZ=s(34658),ef=e=>{let{modelID:l,accessToken:s}=e,[t,n]=(0,r.useState)(!1),i=async()=>{try{k.ZP.info("Making API Call"),n(!0);let e=await (0,u.Og)(s,l);console.log("model delete Response:",e),k.ZP.success("Model ".concat(l," deleted successfully")),n(!1)}catch(e){console.error("Error deleting the model:",e)}};return(0,a.jsxs)("div",{children:[(0,a.jsx)(M.Z,{onClick:()=>n(!0),icon:O.Z,size:"sm"}),(0,a.jsx)(w.Z,{open:t,onOk:i,okType:"danger",onCancel:()=>n(!1),children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 w-full",children:[(0,a.jsx)(y.Z,{children:"Delete Model"}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsx)("p",{children:"Are you sure you want to delete this model? This action is irreversible."})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)("p",{children:["Model ID: ",(0,a.jsx)("b",{children:l})]})})]})})]})},e_=s(97766),ey=s(46495),eb=s(18190),ev=s(91118),eS=e=>{let{modelMetrics:l,modelMetricsCategories:s,customTooltip:t,premiumUser:n}=e;return n?(0,a.jsx)(ev.Z,{title:"Time to First token (s)",className:"h-72",data:l,index:"date",showLegend:!1,categories:s,colors:["indigo","rose"],connectNulls:!0,customTooltip:t}):(0,a.jsxs)("div",{children:[(0,a.jsx)(eb.Z,{title:"✨ Enterprise Feature",color:"teal",className:"mt-2 mb-4",children:"Enterprise features are available for users with a specific license, please contact LiteLLM to unlock this limitation."}),(0,a.jsx)(p.Z,{variant:"primary",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get in touch"})})]})},ek=e=>{let{fields:l,selectedProvider:s}=e;return 0===l.length?null:(0,a.jsx)(a.Fragment,{children:l.map(e=>(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:e.field_name.replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase()),name:e.field_name,tooltip:e.field_description,className:"mb-2",children:(0,a.jsx)(j.Z,{placeholder:e.field_value,type:"password"})},e.field_name))})},ew=s(67951);let{Title:eN,Link:eI}=Q.default;(t=n||(n={})).OpenAI="OpenAI",t.Azure="Azure",t.Azure_AI_Studio="Azure AI Studio",t.Anthropic="Anthropic",t.Google_AI_Studio="Google AI Studio",t.Bedrock="Amazon Bedrock",t.OpenAI_Compatible="OpenAI-Compatible Endpoints (Groq, Together AI, Mistral AI, etc.)",t.Vertex_AI="Vertex AI (Anthropic, Gemini, etc.)",t.Databricks="Databricks",t.Ollama="Ollama";let eA={OpenAI:"openai",Azure:"azure",Azure_AI_Studio:"azure_ai",Anthropic:"anthropic",Google_AI_Studio:"gemini",Bedrock:"bedrock",OpenAI_Compatible:"openai",Vertex_AI:"vertex_ai",Databricks:"databricks",Ollama:"ollama"},eC={"BadRequestError (400)":"BadRequestErrorRetries","AuthenticationError (401)":"AuthenticationErrorRetries","TimeoutError (408)":"TimeoutErrorRetries","RateLimitError (429)":"RateLimitErrorRetries","ContentPolicyViolationError (400)":"ContentPolicyViolationErrorRetries","InternalServerError (500)":"InternalServerErrorRetries"},eP=async(e,l,s)=>{try{let t=Array.isArray(e.model)?e.model:[e.model];console.log("received deployments: ".concat(t)),console.log("received type of deployments: ".concat(typeof t)),t.forEach(async s=>{console.log("litellm_model: ".concat(s));let t={},n={};t.model=s;let a="";for(let[l,s]of(console.log("formValues add deployment:",e),Object.entries(e)))if(""!==s){if("model_name"==l)a+=s;else if("custom_llm_provider"==l){console.log("custom_llm_provider:",s);let e=eA[s];t.custom_llm_provider=e,console.log("custom_llm_provider mappingResult:",e)}else if("model"==l)continue;else if("base_model"===l)n[l]=s;else if("custom_model_name"===l)t.model=s;else if("litellm_extra_params"==l){console.log("litellm_extra_params:",s);let e={};if(s&&void 0!=s){try{e=JSON.parse(s)}catch(e){throw k.ZP.error("Failed to parse LiteLLM Extra Params: "+e,10),Error("Failed to parse litellm_extra_params: "+e)}for(let[l,s]of Object.entries(e))t[l]=s}}else t[l]=s}let r={model_name:a,litellm_params:t,model_info:n},i=await (0,u.kK)(l,r);console.log("response for model create call: ".concat(i.data))}),s.resetFields()}catch(e){k.ZP.error("Failed to create model: "+e,10)}};var eT=e=>{let l,{accessToken:s,token:t,userRole:i,userID:o,modelData:d={data:[]},keys:c,setModelData:m,premiumUser:h}=e,[g,Z]=(0,r.useState)([]),[f]=S.Z.useForm(),[b,v]=(0,r.useState)(null),[N,C]=(0,r.useState)(""),[P,O]=(0,r.useState)([]),W=Object.values(n).filter(e=>isNaN(Number(e))),[H,G]=(0,r.useState)([]),[Y,J]=(0,r.useState)("OpenAI"),[X,$]=(0,r.useState)(""),[ee,eb]=(0,r.useState)(!1),[ev,eT]=(0,r.useState)(!1),[eE,eO]=(0,r.useState)(null),[eR,eF]=(0,r.useState)([]),[eM,eD]=(0,r.useState)(null),[eL,eU]=(0,r.useState)([]),[eV,eq]=(0,r.useState)([]),[ez,eB]=(0,r.useState)([]),[eK,eW]=(0,r.useState)([]),[eH,eG]=(0,r.useState)([]),[eY,eJ]=(0,r.useState)([]),[eX,e$]=(0,r.useState)([]),[eQ,e0]=(0,r.useState)([]),[e1,e2]=(0,r.useState)([]),[e4,e5]=(0,r.useState)({from:new Date(Date.now()-6048e5),to:new Date}),[e8,e3]=(0,r.useState)(null),[e6,e9]=(0,r.useState)(0),[e7,le]=(0,r.useState)({}),[ll,ls]=(0,r.useState)([]),[lt,ln]=(0,r.useState)(!1),[la,lr]=(0,r.useState)(null),[li,lo]=(0,r.useState)(null),[ld,lc]=(0,r.useState)([]);(0,r.useEffect)(()=>{lb(eM,e4.from,e4.to)},[la,li]);let lm=e=>{eO(e),eb(!0)},lu=e=>{eO(e),eT(!0)},lh=async e=>{if(console.log("handleEditSubmit:",e),null==s)return;let l={},t=null;for(let[s,n]of Object.entries(e))"model_id"!==s?l[s]=n:t=n;let n={litellm_params:l,model_info:{id:t}};console.log("handleEditSubmit payload:",n);try{await (0,u.um)(s,n),k.ZP.success("Model updated successfully, restart server to see updates"),eb(!1),eO(null)}catch(e){console.log("Error occurred")}},lx=()=>{C(new Date().toLocaleString())},lp=async()=>{if(!s){console.error("Access token is missing");return}console.log("new modelGroupRetryPolicy:",e8);try{await (0,u.K_)(s,{router_settings:{model_group_retry_policy:e8}}),k.ZP.success("Retry settings saved successfully")}catch(e){console.error("Failed to save retry settings:",e),k.ZP.error("Failed to save retry settings")}};if((0,r.useEffect)(()=>{if(!s||!t||!i||!o)return;let e=async()=>{try{var e,l,t,n,a,r,d,c,h,x,p,j;let g=await (0,u.hy)(s);G(g);let Z=await (0,u.AZ)(s,o,i);console.log("Model data response:",Z.data),m(Z);let f=new Set;for(let e=0;e0&&(y=_[_.length-1],console.log("_initial_model_group:",y)),console.log("selectedModelGroup:",eM);let b=await (0,u.o6)(s,o,i,y,null===(e=e4.from)||void 0===e?void 0:e.toISOString(),null===(l=e4.to)||void 0===l?void 0:l.toISOString(),null==la?void 0:la.token,li);console.log("Model metrics response:",b),eq(b.data),eB(b.all_api_bases);let v=await (0,u.Rg)(s,y,null===(t=e4.from)||void 0===t?void 0:t.toISOString(),null===(n=e4.to)||void 0===n?void 0:n.toISOString());eW(v.data),eG(v.all_api_bases);let S=await (0,u.N8)(s,o,i,y,null===(a=e4.from)||void 0===a?void 0:a.toISOString(),null===(r=e4.to)||void 0===r?void 0:r.toISOString(),null==la?void 0:la.token,li);console.log("Model exceptions response:",S),eJ(S.data),e$(S.exception_types);let k=await (0,u.fP)(s,o,i,y,null===(d=e4.from)||void 0===d?void 0:d.toISOString(),null===(c=e4.to)||void 0===c?void 0:c.toISOString(),null==la?void 0:la.token,li),w=await (0,u.n$)(s,null===(h=e4.from)||void 0===h?void 0:h.toISOString().split("T")[0],null===(x=e4.to)||void 0===x?void 0:x.toISOString().split("T")[0],y);le(w);let N=await (0,u.v9)(s,null===(p=e4.from)||void 0===p?void 0:p.toISOString().split("T")[0],null===(j=e4.to)||void 0===j?void 0:j.toISOString().split("T")[0],y);ls(N),console.log("dailyExceptions:",w),console.log("dailyExceptionsPerDeplyment:",N),console.log("slowResponses:",k),e2(k);let I=await (0,u.j2)(s);lc(null==I?void 0:I.end_users);let A=(await (0,u.BL)(s,o,i)).router_settings;console.log("routerSettingsInfo:",A);let C=A.model_group_retry_policy,P=A.num_retries;console.log("model_group_retry_policy:",C),console.log("default_retries:",P),e3(C),e9(P)}catch(e){console.error("There was an error fetching the model data",e)}};s&&t&&i&&o&&e();let l=async()=>{let e=await (0,u.qm)(s);console.log("received model cost map data: ".concat(Object.keys(e))),v(e)};null==b&&l(),lx()},[s,t,i,o,b,N]),!d||!s||!t||!i||!o)return(0,a.jsx)("div",{children:"Loading..."});let lj=[];for(let e=0;e(console.log("GET PROVIDER CALLED! - ".concat(b)),null!=b&&"object"==typeof b&&e in b)?b[e].litellm_provider:"openai";if(s){let e=s.split("/"),l=e[0];(a=t)||(a=1===e.length?u(s):l)}else a="-";n&&(r=null==n?void 0:n.input_cost_per_token,i=null==n?void 0:n.output_cost_per_token,o=null==n?void 0:n.max_tokens,c=null==n?void 0:n.max_input_tokens),(null==l?void 0:l.litellm_params)&&(m=Object.fromEntries(Object.entries(null==l?void 0:l.litellm_params).filter(e=>{let[l]=e;return"model"!==l&&"api_base"!==l}))),d.data[e].provider=a,d.data[e].input_cost=r,d.data[e].output_cost=i,d.data[e].input_cost&&(d.data[e].input_cost=(1e6*Number(d.data[e].input_cost)).toFixed(2)),d.data[e].output_cost&&(d.data[e].output_cost=(1e6*Number(d.data[e].output_cost)).toFixed(2)),d.data[e].max_tokens=o,d.data[e].max_input_tokens=c,d.data[e].api_base=null==l?void 0:null===(lf=l.litellm_params)||void 0===lf?void 0:lf.api_base,d.data[e].cleanedLitellmParams=m,lj.push(l.model_name),console.log(d.data[e])}if(i&&"Admin Viewer"==i){let{Title:e,Paragraph:l}=Q.default;return(0,a.jsxs)("div",{children:[(0,a.jsx)(e,{level:1,children:"Access Denied"}),(0,a.jsx)(l,{children:"Ask your proxy admin for access to view all models"})]})}let l_=e=>{console.log("received provider string: ".concat(e));let l=Object.keys(n).find(l=>n[l]===e);if(l){let e=eA[l];console.log("mappingResult: ".concat(e));let s=[];"object"==typeof b&&Object.entries(b).forEach(l=>{let[t,n]=l;null!==n&&"object"==typeof n&&"litellm_provider"in n&&(n.litellm_provider===e||n.litellm_provider.includes(e))&&s.push(t)}),O(s),console.log("providerModels: ".concat(P))}},ly=async()=>{try{k.ZP.info("Running health check..."),$("");let e=await (0,u.EY)(s);$(e)}catch(e){console.error("Error running health check:",e),$("Error running health check")}},lb=async(e,l,t)=>{if(console.log("Updating model metrics for group:",e),!s||!o||!i||!l||!t)return;console.log("inside updateModelMetrics - startTime:",l,"endTime:",t),eD(e);let n=null==la?void 0:la.token;void 0===n&&(n=null);let a=li;void 0===a&&(a=null),l.setHours(0),l.setMinutes(0),l.setSeconds(0),t.setHours(23),t.setMinutes(59),t.setSeconds(59);try{let r=await (0,u.o6)(s,o,i,e,l.toISOString(),t.toISOString(),n,a);console.log("Model metrics response:",r),eq(r.data),eB(r.all_api_bases);let d=await (0,u.Rg)(s,e,l.toISOString(),t.toISOString());eW(d.data),eG(d.all_api_bases);let c=await (0,u.N8)(s,o,i,e,l.toISOString(),t.toISOString(),n,a);console.log("Model exceptions response:",c),eJ(c.data),e$(c.exception_types);let m=await (0,u.fP)(s,o,i,e,l.toISOString(),t.toISOString(),n,a);if(console.log("slowResponses:",m),e2(m),e){let n=await (0,u.n$)(s,null==l?void 0:l.toISOString().split("T")[0],null==t?void 0:t.toISOString().split("T")[0],e);le(n);let a=await (0,u.v9)(s,null==l?void 0:l.toISOString().split("T")[0],null==t?void 0:t.toISOString().split("T")[0],e);ls(a)}}catch(e){console.error("Failed to fetch model metrics",e)}},lv=(0,a.jsxs)("div",{children:[(0,a.jsx)(_.Z,{className:"mb-1",children:"Select API Key Name"}),h?(0,a.jsxs)("div",{children:[(0,a.jsxs)(B.Z,{defaultValue:"all-keys",children:[(0,a.jsx)(K.Z,{value:"all-keys",onClick:()=>{lr(null)},children:"All Keys"},"all-keys"),null==c?void 0:c.map((e,l)=>e&&null!==e.key_alias&&e.key_alias.length>0?(0,a.jsx)(K.Z,{value:String(l),onClick:()=>{lr(e)},children:e.key_alias},l):null)]}),(0,a.jsx)(_.Z,{className:"mt-1",children:"Select Customer Name"}),(0,a.jsxs)(B.Z,{defaultValue:"all-customers",children:[(0,a.jsx)(K.Z,{value:"all-customers",onClick:()=>{lo(null)},children:"All Customers"},"all-customers"),null==ld?void 0:ld.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>{lo(e)},children:e},l))]})]}):(0,a.jsxs)("div",{children:[(0,a.jsxs)(B.Z,{defaultValue:"all-keys",children:[(0,a.jsx)(K.Z,{value:"all-keys",onClick:()=>{lr(null)},children:"All Keys"},"all-keys"),null==c?void 0:c.map((e,l)=>e&&null!==e.key_alias&&e.key_alias.length>0?(0,a.jsxs)(K.Z,{value:String(l),disabled:!0,onClick:()=>{lr(e)},children:["✨ ",e.key_alias," (Enterprise only Feature)"]},l):null)]}),(0,a.jsx)(_.Z,{className:"mt-1",children:"Select Customer Name"}),(0,a.jsxs)(B.Z,{defaultValue:"all-customers",children:[(0,a.jsx)(K.Z,{value:"all-customers",onClick:()=>{lo(null)},children:"All Customers"},"all-customers"),null==ld?void 0:ld.map((e,l)=>(0,a.jsxs)(K.Z,{value:e,disabled:!0,onClick:()=>{lo(e)},children:["✨ ",e," (Enterprise only Feature)"]},l))]})]})]}),lS=e=>{var l,s;let{payload:t,active:n}=e;if(!n||!t)return null;let r=null===(s=t[0])||void 0===s?void 0:null===(l=s.payload)||void 0===l?void 0:l.date,i=t.sort((e,l)=>l.value-e.value);if(i.length>5){let e=i.length-5;(i=i.slice(0,5)).push({dataKey:"".concat(e," other deployments"),value:t.slice(5).reduce((e,l)=>e+l.value,0),color:"gray"})}return(0,a.jsxs)("div",{className:"w-150 rounded-tremor-default border border-tremor-border bg-tremor-background p-2 text-tremor-default shadow-tremor-dropdown",children:[r&&(0,a.jsxs)("p",{className:"text-tremor-content-emphasis mb-2",children:["Date: ",r]}),i.map((e,l)=>{let s=parseFloat(e.value.toFixed(5)),t=0===s&&e.value>0?"<0.00001":s.toFixed(5);return(0,a.jsxs)("div",{className:"flex justify-between",children:[(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,a.jsx)("div",{className:"w-2 h-2 mt-1 rounded-full bg-".concat(e.color,"-500")}),(0,a.jsx)("p",{className:"text-tremor-content",children:e.dataKey})]}),(0,a.jsx)("p",{className:"font-medium text-tremor-content-emphasis text-righ ml-2",children:t})]},l)})]})},lk=e=>"Vertex AI (Anthropic, Gemini, etc.)"===e?"gemini-pro":"Anthropic"==e||"Amazon Bedrock"==e?"claude-3-opus":"Google AI Studio"==e?"gemini-pro":"Azure AI Studio"==e?"azure_ai/command-r-plus":"Azure"==e?"azure/my-deployment":"gpt-3.5-turbo";console.log("selectedProvider: ".concat(Y)),console.log("providerModels.length: ".concat(P.length));let lw=Object.keys(n).find(e=>n[e]===Y);return lw&&(l=H.find(e=>e.name===eA[lw])),(0,a.jsx)("div",{style:{width:"100%",height:"100%"},children:(0,a.jsxs)(en.Z,{className:"gap-2 p-8 h-[75vh] w-full mt-2",children:[(0,a.jsxs)(ea.Z,{className:"flex justify-between mt-2 w-full items-center",children:[(0,a.jsxs)("div",{className:"flex",children:[(0,a.jsx)(et.Z,{children:"All Models"}),(0,a.jsx)(et.Z,{children:"Add Model"}),(0,a.jsx)(et.Z,{children:(0,a.jsx)("pre",{children:"/health Models"})}),(0,a.jsx)(et.Z,{children:"Model Analytics"}),(0,a.jsx)(et.Z,{children:"Model Retry Settings"})]}),(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[N&&(0,a.jsxs)(_.Z,{children:["Last Refreshed: ",N]}),(0,a.jsx)(M.Z,{icon:eg.Z,variant:"shadow",size:"xs",className:"self-center",onClick:lx})]})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)(x.Z,{children:[(0,a.jsxs)("div",{className:"flex items-center",children:[(0,a.jsx)(_.Z,{children:"Filter by Public Model Name"}),(0,a.jsxs)(B.Z,{className:"mb-4 mt-2 ml-2 w-50",defaultValue:eM||void 0,onValueChange:e=>eD("all"===e?"all":e),value:eM||void 0,children:[(0,a.jsx)(K.Z,{value:"all",children:"All Models"}),eR.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>eD(e),children:e},l))]})]}),(0,a.jsx)(F.Z,{children:(0,a.jsxs)(D.Z,{style:{maxWidth:"1500px",width:"100%"},children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:"Public Model Name"}),(0,a.jsx)(q.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:"Provider"}),"Admin"===i&&(0,a.jsx)(q.Z,{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:"API Base"}),(0,a.jsxs)(q.Z,{style:{maxWidth:"85px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:["Input Price"," ",(0,a.jsx)("p",{style:{fontSize:"10px",color:"gray"},children:"/1M Tokens ($)"})]}),(0,a.jsxs)(q.Z,{style:{maxWidth:"85px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:["Output Price"," ",(0,a.jsx)("p",{style:{fontSize:"10px",color:"gray"},children:"/1M Tokens ($)"})]}),(0,a.jsx)(q.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:h?"Created At":(0,a.jsxs)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",style:{color:"#72bcd4"},children:[" ","✨ Created At"]})}),(0,a.jsx)(q.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:h?"Created By":(0,a.jsxs)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",style:{color:"#72bcd4"},children:[" ","✨ Created By"]})}),(0,a.jsx)(q.Z,{style:{maxWidth:"50px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:"Status"}),(0,a.jsx)(q.Z,{})]})}),(0,a.jsx)(L.Z,{children:d.data.filter(e=>"all"===eM||e.model_name===eM||null==eM||""===eM).map((e,l)=>{var t;return(0,a.jsxs)(z.Z,{style:{maxHeight:"1px",minHeight:"1px"},children:[(0,a.jsx)(U.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)("p",{className:"text-xs",children:e.model_name||"-"})}),(0,a.jsx)(U.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)("p",{className:"text-xs",children:e.provider||"-"})}),"Admin"===i&&(0,a.jsx)(U.Z,{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)(eu.Z,{title:e&&e.api_base,children:(0,a.jsx)("pre",{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word"},className:"text-xs",title:e&&e.api_base?e.api_base:"",children:e&&e.api_base?e.api_base.slice(0,20):"-"})})}),(0,a.jsx)(U.Z,{style:{maxWidth:"80px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)("pre",{className:"text-xs",children:e.input_cost?e.input_cost:null!=e.litellm_params.input_cost_per_token&&void 0!=e.litellm_params.input_cost_per_token?(1e6*Number(e.litellm_params.input_cost_per_token)).toFixed(2):null})}),(0,a.jsx)(U.Z,{style:{maxWidth:"80px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)("pre",{className:"text-xs",children:e.output_cost?e.output_cost:e.litellm_params.output_cost_per_token?(1e6*Number(e.litellm_params.output_cost_per_token)).toFixed(2):null})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)("p",{className:"text-xs",children:h&&((t=e.model_info.created_at)?new Date(t).toLocaleDateString("en-US"):null)||"-"})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)("p",{className:"text-xs",children:h&&e.model_info.created_by||"-"})}),(0,a.jsx)(U.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word"},children:e.model_info.db_model?(0,a.jsx)(R.Z,{size:"xs",className:"text-white",children:(0,a.jsx)("p",{className:"text-xs",children:"DB Model"})}):(0,a.jsx)(R.Z,{size:"xs",className:"text-black",children:(0,a.jsx)("p",{className:"text-xs",children:"Config Model"})})}),(0,a.jsx)(U.Z,{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsxs)(x.Z,{numItems:3,children:[(0,a.jsx)(eh.Z,{children:(0,a.jsx)(M.Z,{icon:T.Z,size:"sm",onClick:()=>lu(e)})}),(0,a.jsx)(eh.Z,{children:(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>lm(e)})}),(0,a.jsx)(eh.Z,{children:(0,a.jsx)(ef,{modelID:e.model_info.id,accessToken:s})})]})})]},l)})})]})})]}),(0,a.jsx)(e=>{let{visible:l,onCancel:s,model:t,onSubmit:n}=e,[r]=S.Z.useForm(),i={},o="",d="";if(t){i=t.litellm_params,o=t.model_name;let e=t.model_info;e&&(d=e.id,console.log("model_id: ".concat(d)),i.model_id=d)}return(0,a.jsx)(w.Z,{title:"Edit Model "+o,visible:l,width:800,footer:null,onOk:()=>{r.validateFields().then(e=>{n(e),r.resetFields()}).catch(e=>{console.error("Validation failed:",e)})},onCancel:s,children:(0,a.jsxs)(S.Z,{form:r,onFinish:lh,initialValues:i,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"api_base",name:"api_base",children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(S.Z.Item,{label:"organization",name:"organization",tooltip:"OpenAI Organization ID",children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(S.Z.Item,{label:"tpm",name:"tpm",tooltip:"int (optional) - Tokens limit for this deployment: in tokens per minute (tpm). Find this information on your model/providers website",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(S.Z.Item,{label:"rpm",name:"rpm",tooltip:"int (optional) - Rate limit for this deployment: in requests per minute (rpm). Find this information on your model/providers website",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(S.Z.Item,{label:"max_retries",name:"max_retries",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(S.Z.Item,{label:"timeout",name:"timeout",tooltip:"int (optional) - Timeout in seconds for LLM requests (Defaults to 600 seconds)",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(S.Z.Item,{label:"stream_timeout",name:"stream_timeout",tooltip:"int (optional) - Timeout for stream requests (seconds)",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(S.Z.Item,{label:"input_cost_per_token",name:"input_cost_per_token",tooltip:"float (optional) - Input cost per token",children:(0,a.jsx)(I.Z,{min:0,step:1e-4})}),(0,a.jsx)(S.Z.Item,{label:"output_cost_per_token",name:"output_cost_per_token",tooltip:"float (optional) - Output cost per token",children:(0,a.jsx)(I.Z,{min:0,step:1e-4})}),(0,a.jsx)(S.Z.Item,{label:"model_id",name:"model_id",hidden:!0})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})})},{visible:ee,onCancel:()=>{eb(!1),eO(null)},model:eE,onSubmit:lh}),(0,a.jsxs)(w.Z,{title:eE&&eE.model_name,visible:ev,width:800,footer:null,onCancel:()=>{eT(!1),eO(null)},children:[(0,a.jsx)(y.Z,{children:"Model Info"}),(0,a.jsx)(ew.Z,{language:"json",children:eE&&JSON.stringify(eE,null,2)})]})]}),(0,a.jsxs)(er.Z,{className:"h-full",children:[(0,a.jsx)(eN,{level:2,children:"Add new model"}),(0,a.jsx)(F.Z,{children:(0,a.jsxs)(S.Z,{form:f,onFinish:()=>{f.validateFields().then(e=>{eP(e,s,f)}).catch(e=>{console.error("Validation failed:",e)})},labelCol:{span:10},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Provider:",name:"custom_llm_provider",tooltip:"E.g. OpenAI, Azure OpenAI, Anthropic, Bedrock, etc.",labelCol:{span:10},labelAlign:"left",children:(0,a.jsx)(B.Z,{value:Y.toString(),children:W.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>{l_(e),J(e)},children:e},l))})}),(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Public Model Name",name:"model_name",tooltip:"Model name your users will pass in. Also used for load-balancing, LiteLLM will load balance between all models with this public name.",className:"mb-0",children:(0,a.jsx)(j.Z,{})}),(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsx)(_.Z,{className:"mb-3 mt-1",children:"Model name your users will pass in."})})]}),(0,a.jsxs)(S.Z.Item,{label:"LiteLLM Model Name(s)",tooltip:"Actual model name used for making litellm.completion() call.",className:"mb-0",children:[(0,a.jsx)(S.Z.Item,{name:"model",rules:[{required:!0,message:"Required"}],noStyle:!0,children:"Azure"===Y||"OpenAI-Compatible Endpoints (Groq, Together AI, Mistral AI, etc.)"===Y||"Ollama"===Y?(0,a.jsx)(j.Z,{placeholder:lk(Y.toString())}):P.length>0?(0,a.jsxs)(eo.Z,{children:[(0,a.jsx)(ed.Z,{value:"custom",children:"Custom Model Name (Enter below)"}),P.map((e,l)=>(0,a.jsx)(ed.Z,{value:e,children:e},l))]}):(0,a.jsx)(j.Z,{placeholder:lk(Y.toString())})}),(0,a.jsx)(S.Z.Item,{noStyle:!0,shouldUpdate:(e,l)=>e.model!==l.model,children:e=>{let{getFieldValue:l}=e;return(l("model")||[]).includes("custom")&&(0,a.jsx)(S.Z.Item,{name:"custom_model_name",rules:[{required:!0,message:"Please enter a custom model name"}],className:"mt-2",children:(0,a.jsx)(j.Z,{placeholder:"Enter custom model name"})})}})]}),(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsxs)(_.Z,{className:"mb-3 mt-1",children:["Actual model name used for making"," ",(0,a.jsx)(eI,{href:"https://docs.litellm.ai/docs/providers",target:"_blank",children:"litellm.completion() call"}),". We'll"," ",(0,a.jsx)(eI,{href:"https://docs.litellm.ai/docs/proxy/reliability#step-1---set-deployments-on-config",target:"_blank",children:"loadbalance"})," ","models with the same 'public name'"]})})]}),void 0!==l&&l.fields.length>0&&(0,a.jsx)(ek,{fields:l.fields,selectedProvider:l.name}),"Amazon Bedrock"!=Y&&"Vertex AI (Anthropic, Gemini, etc.)"!=Y&&"Ollama"!=Y&&(void 0===l||0==l.fields.length)&&(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"API Key",name:"api_key",children:(0,a.jsx)(j.Z,{placeholder:"sk-",type:"password"})}),"OpenAI"==Y&&(0,a.jsx)(S.Z.Item,{label:"Organization ID",name:"organization",children:(0,a.jsx)(j.Z,{placeholder:"[OPTIONAL] my-unique-org"})}),"Vertex AI (Anthropic, Gemini, etc.)"==Y&&(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Vertex Project",name:"vertex_project",children:(0,a.jsx)(j.Z,{placeholder:"adroit-cadet-1234.."})}),"Vertex AI (Anthropic, Gemini, etc.)"==Y&&(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Vertex Location",name:"vertex_location",children:(0,a.jsx)(j.Z,{placeholder:"us-east-1"})}),"Vertex AI (Anthropic, Gemini, etc.)"==Y&&(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Vertex Credentials",name:"vertex_credentials",className:"mb-0",children:(0,a.jsx)(ey.Z,{name:"file",accept:".json",beforeUpload:e=>{if("application/json"===e.type){let l=new FileReader;l.onload=e=>{if(e.target){let l=e.target.result;f.setFieldsValue({vertex_credentials:l})}},l.readAsText(e)}return!1},onChange(e){"uploading"!==e.file.status&&console.log(e.file,e.fileList),"done"===e.file.status?k.ZP.success("".concat(e.file.name," file uploaded successfully")):"error"===e.file.status&&k.ZP.error("".concat(e.file.name," file upload failed."))},children:(0,a.jsx)(A.ZP,{icon:(0,a.jsx)(e_.Z,{}),children:"Click to Upload"})})}),"Vertex AI (Anthropic, Gemini, etc.)"==Y&&(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsx)(_.Z,{className:"mb-3 mt-1",children:"Give litellm a gcp service account(.json file), so it can make the relevant calls"})})]}),("Azure"==Y||"OpenAI-Compatible Endpoints (Groq, Together AI, Mistral AI, etc.)"==Y)&&(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"API Base",name:"api_base",children:(0,a.jsx)(j.Z,{placeholder:"https://..."})}),"Azure"==Y&&(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"API Version",name:"api_version",children:(0,a.jsx)(j.Z,{placeholder:"2023-07-01-preview"})}),"Azure"==Y&&(0,a.jsxs)("div",{children:[(0,a.jsx)(S.Z.Item,{label:"Base Model",name:"base_model",className:"mb-0",children:(0,a.jsx)(j.Z,{placeholder:"azure/gpt-3.5-turbo"})}),(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsxs)(_.Z,{className:"mb-2",children:["The actual model your azure deployment uses. Used for accurate cost tracking. Select name from"," ",(0,a.jsx)(eI,{href:"https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json",target:"_blank",children:"here"})]})})]})]}),"Amazon Bedrock"==Y&&(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"AWS Access Key ID",name:"aws_access_key_id",tooltip:"You can provide the raw key or the environment variable (e.g. `os.environ/MY_SECRET_KEY`).",children:(0,a.jsx)(j.Z,{placeholder:""})}),"Amazon Bedrock"==Y&&(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"AWS Secret Access Key",name:"aws_secret_access_key",tooltip:"You can provide the raw key or the environment variable (e.g. `os.environ/MY_SECRET_KEY`).",children:(0,a.jsx)(j.Z,{placeholder:""})}),"Amazon Bedrock"==Y&&(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"AWS Region Name",name:"aws_region_name",tooltip:"You can provide the raw key or the environment variable (e.g. `os.environ/MY_SECRET_KEY`).",children:(0,a.jsx)(j.Z,{placeholder:"us-east-1"})}),(0,a.jsx)(S.Z.Item,{label:"LiteLLM Params",name:"litellm_extra_params",tooltip:"Optional litellm params used for making a litellm.completion() call.",className:"mb-0",children:(0,a.jsx)(ej.Z,{rows:4,placeholder:'{ "rpm": 100, "timeout": 0, "stream_timeout": 0 }'})}),(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsxs)(_.Z,{className:"mb-3 mt-1",children:["Pass JSON of litellm supported params"," ",(0,a.jsx)(eI,{href:"https://docs.litellm.ai/docs/completion/input",target:"_blank",children:"litellm.completion() call"})]})})]})]}),(0,a.jsx)("div",{style:{textAlign:"center",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add Model"})}),(0,a.jsx)(eu.Z,{title:"Get help on our github",children:(0,a.jsx)(Q.default.Link,{href:"https://github.com/BerriAI/litellm/issues",children:"Need Help?"})})]})})]}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(_.Z,{children:"`/health` will run a very small request through your models configured on litellm"}),(0,a.jsx)(p.Z,{onClick:ly,children:"Run `/health`"}),X&&(0,a.jsx)("pre",{children:JSON.stringify(X,null,2)})]})}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)(x.Z,{numItems:4,className:"mt-2 mb-2",children:[(0,a.jsxs)(eh.Z,{children:[(0,a.jsx)(_.Z,{children:"Select Time Range"}),(0,a.jsx)(es.Z,{enableSelect:!0,value:e4,className:"mr-2",onValueChange:e=>{e5(e),lb(eM,e.from,e.to)}})]}),(0,a.jsxs)(eh.Z,{className:"ml-2",children:[(0,a.jsx)(_.Z,{children:"Select Model Group"}),(0,a.jsx)(B.Z,{defaultValue:eM||eR[0],value:eM||eR[0],children:eR.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>lb(e,e4.from,e4.to),children:e},l))})]}),(0,a.jsx)(eh.Z,{children:(0,a.jsx)(ep.Z,{trigger:"click",content:lv,overlayStyle:{width:"20vw"},children:(0,a.jsx)(p.Z,{icon:eZ.Z,size:"md",variant:"secondary",className:"mt-4 ml-2",style:{border:"none"},onClick:()=>ln(!0)})})})]}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsx)(eh.Z,{children:(0,a.jsx)(F.Z,{className:"mr-2 max-h-[400px] min-h-[400px]",children:(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{variant:"line",defaultValue:"1",children:[(0,a.jsx)(et.Z,{value:"1",children:"Avg. Latency per Token"}),(0,a.jsx)(et.Z,{value:"2",children:"✨ Time to first token"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsxs)(er.Z,{children:[(0,a.jsx)("p",{className:"text-gray-500 italic",children:" (seconds/token)"}),(0,a.jsx)(_.Z,{className:"text-gray-500 italic mt-1 mb-1",children:"average Latency for successfull requests divided by the total tokens"}),eV&&ez&&(0,a.jsx)(ec.Z,{title:"Model Latency",className:"h-72",data:eV,showLegend:!1,index:"date",categories:ez,connectNulls:!0,customTooltip:lS})]}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(eS,{modelMetrics:eK,modelMetricsCategories:eH,customTooltip:lS,premiumUser:h})})]})]})})}),(0,a.jsx)(eh.Z,{children:(0,a.jsx)(F.Z,{className:"ml-2 max-h-[400px] min-h-[400px] overflow-y-auto",children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Deployment"}),(0,a.jsx)(q.Z,{children:"Success Responses"}),(0,a.jsxs)(q.Z,{children:["Slow Responses ",(0,a.jsx)("p",{children:"Success Responses taking 600+s"})]})]})}),(0,a.jsx)(L.Z,{children:e1.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.api_base}),(0,a.jsx)(U.Z,{children:e.total_count}),(0,a.jsx)(U.Z,{children:e.slow_count})]},l))})]})})})]}),(0,a.jsx)(x.Z,{numItems:1,className:"gap-2 w-full mt-2",children:(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(y.Z,{children:["All Exceptions for ",eM]}),(0,a.jsx)(em.Z,{className:"h-60",data:eY,index:"model",categories:eX,stack:!0,yAxisWidth:30})]})}),(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 w-full mt-2",children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(y.Z,{children:["All Up Rate Limit Errors (429) for ",eM]}),(0,a.jsxs)(x.Z,{numItems:1,children:[(0,a.jsxs)(eh.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Num Rate Limit Errors ",e7.sum_num_rate_limit_exceptions]}),(0,a.jsx)(em.Z,{className:"h-40",data:e7.daily_data,index:"date",colors:["rose"],categories:["num_rate_limit_exceptions"],onValueChange:e=>console.log(e)})]}),(0,a.jsx)(eh.Z,{})]})]}),h?(0,a.jsx)(a.Fragment,{children:ll.map((e,l)=>(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:e.api_base?e.api_base:"Unknown API Base"}),(0,a.jsx)(x.Z,{numItems:1,children:(0,a.jsxs)(eh.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Num Rate Limit Errors (429) ",e.sum_num_rate_limit_exceptions]}),(0,a.jsx)(em.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["rose"],categories:["num_rate_limit_exceptions"],onValueChange:e=>console.log(e)})]})})]},l))}):(0,a.jsx)(a.Fragment,{children:ll&&ll.length>0&&ll.slice(0,1).map((e,l)=>(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"✨ Rate Limit Errors by Deployment"}),(0,a.jsx)("p",{className:"mb-2 text-gray-500 italic text-[12px]",children:"Upgrade to see exceptions for all deployments"}),(0,a.jsx)(p.Z,{variant:"primary",className:"mb-2",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get Free Trial"})}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:e.api_base}),(0,a.jsx)(x.Z,{numItems:1,children:(0,a.jsxs)(eh.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Num Rate Limit Errors ",e.sum_num_rate_limit_exceptions]}),(0,a.jsx)(em.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["rose"],categories:["num_rate_limit_exceptions"],onValueChange:e=>console.log(e)})]})})]})]},l))})]})]}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)("div",{className:"flex items-center",children:[(0,a.jsx)(_.Z,{children:"Filter by Public Model Name"}),(0,a.jsx)(B.Z,{className:"mb-4 mt-2 ml-2 w-50",defaultValue:eM||eR[0],value:eM||eR[0],onValueChange:e=>eD(e),children:eR.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>eD(e),children:e},l))})]}),(0,a.jsxs)(y.Z,{children:["Retry Policy for ",eM]}),(0,a.jsx)(_.Z,{className:"mb-6",children:"How many retries should be attempted based on the Exception"}),eC&&(0,a.jsx)("table",{children:(0,a.jsx)("tbody",{children:Object.entries(eC).map((e,l)=>{var s;let[t,n]=e,r=null==e8?void 0:null===(s=e8[eM])||void 0===s?void 0:s[n];return null==r&&(r=e6),(0,a.jsxs)("tr",{className:"flex justify-between items-center mt-2",children:[(0,a.jsx)("td",{children:(0,a.jsx)(_.Z,{children:t})}),(0,a.jsx)("td",{children:(0,a.jsx)(I.Z,{className:"ml-5",value:r,min:0,step:1,onChange:e=>{e3(l=>{var s;let t=null!==(s=null==l?void 0:l[eM])&&void 0!==s?s:{};return{...null!=l?l:{},[eM]:{...t,[n]:e}}})}})})]},l)})})}),(0,a.jsx)(p.Z,{className:"mt-6 mr-8",onClick:lp,children:"Save"})]})]})]})})},eE=e=>{let{isInvitationLinkModalVisible:l,setIsInvitationLinkModalVisible:s,baseUrl:t,invitationLinkData:n}=e,{Title:r,Paragraph:i}=Q.default;return(0,a.jsxs)(w.Z,{title:"Invitation Link",visible:l,width:800,footer:null,onOk:()=>{s(!1)},onCancel:()=>{s(!1)},children:[(0,a.jsx)(i,{children:"Copy and send the generated link to onboard this user to the proxy."}),(0,a.jsxs)("div",{className:"flex justify-between pt-5 pb-2",children:[(0,a.jsx)(_.Z,{className:"text-base",children:"User ID"}),(0,a.jsx)(_.Z,{children:null==n?void 0:n.user_id})]}),(0,a.jsxs)("div",{className:"flex justify-between pt-5 pb-2",children:[(0,a.jsx)(_.Z,{children:"Invitation Link"}),(0,a.jsxs)(_.Z,{children:[t,"/ui?invitation_id=",null==n?void 0:n.id]})]}),(0,a.jsxs)("div",{className:"flex justify-end mt-5",children:[(0,a.jsx)("div",{}),(0,a.jsx)(b.CopyToClipboard,{text:"".concat(t,"/ui?invitation_id=").concat(null==n?void 0:n.id),onCopy:()=>k.ZP.success("Copied!"),children:(0,a.jsx)(p.Z,{variant:"primary",children:"Copy invitation link"})})]})]})};let{Option:eO}=v.default;var eR=e=>{let{userID:l,accessToken:s,teams:t,possibleUIRoles:n}=e,[o]=S.Z.useForm(),[d,c]=(0,r.useState)(!1),[m,h]=(0,r.useState)(null),[x,g]=(0,r.useState)([]),[Z,f]=(0,r.useState)(!1),[y,b]=(0,r.useState)(null),I=(0,i.useRouter)();console.log=function(){};let[C,P]=(0,r.useState)("");(0,r.useEffect)(()=>{(async()=>{try{let e=await (0,u.So)(s,l,"any"),t=[];for(let l=0;l{if(I){let{protocol:e,host:l}=window.location;P("".concat(e,"/").concat(l))}},[I]);let T=async e=>{try{var t;k.ZP.info("Making API Call"),c(!0),console.log("formValues in create user:",e);let n=await (0,u.Ov)(s,null,e);console.log("user create Response:",n),h(n.key);let a=(null===(t=n.data)||void 0===t?void 0:t.user_id)||n.user_id;(0,u.XO)(s,a).then(e=>{b(e),f(!0)}),k.ZP.success("API user Created"),o.resetFields(),localStorage.removeItem("userData"+l)}catch(e){console.error("Error creating the user:",e)}};return(0,a.jsxs)("div",{children:[(0,a.jsx)(p.Z,{className:"mx-auto mb-0",onClick:()=>c(!0),children:"+ Invite User"}),(0,a.jsxs)(w.Z,{title:"Invite User",visible:d,width:800,footer:null,onOk:()=>{c(!1),o.resetFields()},onCancel:()=>{c(!1),h(null),o.resetFields()},children:[(0,a.jsx)(_.Z,{className:"mb-1",children:"Create a User who can own keys"}),(0,a.jsxs)(S.Z,{form:o,onFinish:T,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsx)(S.Z.Item,{label:"User Email",name:"user_email",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(S.Z.Item,{label:"User Role",name:"user_role",children:(0,a.jsx)(v.default,{children:n&&Object.entries(n).map(e=>{let[l,{ui_label:s,description:t}]=e;return(0,a.jsx)(K.Z,{value:l,title:s,children:(0,a.jsxs)("div",{className:"flex",children:[s," ",(0,a.jsx)("p",{className:"ml-2",style:{color:"gray",fontSize:"12px"},children:t})]})},l)})})}),(0,a.jsx)(S.Z.Item,{label:"Team ID",name:"team_id",children:(0,a.jsx)(v.default,{placeholder:"Select Team ID",style:{width:"100%"},children:t?t.map(e=>(0,a.jsx)(eO,{value:e.team_id,children:e.team_alias},e.team_id)):(0,a.jsx)(eO,{value:null,children:"Default Team"},"default")})}),(0,a.jsx)(S.Z.Item,{label:"Metadata",name:"metadata",children:(0,a.jsx)(N.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Create User"})})]})]}),m&&(0,a.jsx)(eE,{isInvitationLinkModalVisible:Z,setIsInvitationLinkModalVisible:f,baseUrl:C,invitationLinkData:y})]})},eF=e=>{let{visible:l,possibleUIRoles:s,onCancel:t,user:n,onSubmit:i}=e,[o,d]=(0,r.useState)(n),[c]=S.Z.useForm();(0,r.useEffect)(()=>{c.resetFields()},[n]);let m=async()=>{c.resetFields(),t()},u=async e=>{i(e),c.resetFields(),t()};return n?(0,a.jsx)(w.Z,{visible:l,onCancel:m,footer:null,title:"Edit User "+n.user_id,width:1e3,children:(0,a.jsx)(S.Z,{form:c,onFinish:u,initialValues:n,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"User Email",tooltip:"Email of the User",name:"user_email",children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(S.Z.Item,{label:"user_id",name:"user_id",hidden:!0,children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(S.Z.Item,{label:"User Role",name:"user_role",children:(0,a.jsx)(v.default,{children:s&&Object.entries(s).map(e=>{let[l,{ui_label:s,description:t}]=e;return(0,a.jsx)(K.Z,{value:l,title:s,children:(0,a.jsxs)("div",{className:"flex",children:[s," ",(0,a.jsx)("p",{className:"ml-2",style:{color:"gray",fontSize:"12px"},children:t})]})},l)})})}),(0,a.jsx)(S.Z.Item,{label:"Spend (USD)",name:"spend",tooltip:"(float) - Spend of all LLM calls completed by this user",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(S.Z.Item,{label:"User Budget (USD)",name:"max_budget",tooltip:"(float) - Maximum budget of this user",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})})}):null};console.log=function(){};var eM=e=>{let{accessToken:l,token:s,keys:t,userRole:n,userID:i,teams:o,setKeys:d}=e,[c,m]=(0,r.useState)(null),[h,p]=(0,r.useState)(null),[j,g]=(0,r.useState)(0),[Z,f]=r.useState(null),[_,y]=(0,r.useState)(null),[b,v]=(0,r.useState)(!1),[S,w]=(0,r.useState)(null),[N,I]=(0,r.useState)({}),A=async()=>{w(null),v(!1)},C=async e=>{if(console.log("inside handleEditSubmit:",e),l&&s&&n&&i){try{await (0,u.pf)(l,e,null),k.ZP.success("User ".concat(e.user_id," updated successfully"))}catch(e){console.error("There was an error updating the user",e)}c&&m(c.map(l=>l.user_id===e.user_id?e:l)),w(null),v(!1)}};return((0,r.useEffect)(()=>{if(!l||!s||!n||!i)return;let e=async()=>{try{let e=await (0,u.Br)(l,null,n,!0,j,25);console.log("user data response:",e),m(e);let s=await (0,u.lg)(l);I(s)}catch(e){console.error("There was an error fetching the model data",e)}};l&&s&&n&&i&&e()},[l,s,n,i,j]),c&&l&&s&&n&&i)?(0,a.jsx)("div",{style:{width:"100%"},children:(0,a.jsxs)(x.Z,{className:"gap-2 p-2 h-[90vh] w-full mt-8",children:[(0,a.jsx)(eR,{userID:i,accessToken:l,teams:o,possibleUIRoles:N}),(0,a.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[90vh] mb-4",children:[(0,a.jsx)("div",{className:"mb-4 mt-1"}),(0,a.jsx)(en.Z,{children:(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsxs)(D.Z,{className:"mt-5",children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"User ID"}),(0,a.jsx)(q.Z,{children:"User Email"}),(0,a.jsx)(q.Z,{children:"Role"}),(0,a.jsx)(q.Z,{children:"User Spend ($ USD)"}),(0,a.jsx)(q.Z,{children:"User Max Budget ($ USD)"}),(0,a.jsx)(q.Z,{children:"API Keys"}),(0,a.jsx)(q.Z,{})]})}),(0,a.jsx)(L.Z,{children:c.map(e=>{var l,s;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.user_id||"-"}),(0,a.jsx)(U.Z,{children:e.user_email||"-"}),(0,a.jsx)(U.Z,{children:(null==N?void 0:null===(l=N[null==e?void 0:e.user_role])||void 0===l?void 0:l.ui_label)||"-"}),(0,a.jsx)(U.Z,{children:e.spend?null===(s=e.spend)||void 0===s?void 0:s.toFixed(2):"-"}),(0,a.jsx)(U.Z,{children:e.max_budget?e.max_budget:"Unlimited"}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(x.Z,{numItems:2,children:e&&e.key_aliases&&e.key_aliases.filter(e=>null!==e).length>0?(0,a.jsxs)(R.Z,{size:"xs",color:"indigo",children:[e.key_aliases.filter(e=>null!==e).length,"\xa0Keys"]}):(0,a.jsx)(R.Z,{size:"xs",color:"gray",children:"No Keys"})})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(M.Z,{icon:E.Z,onClick:()=>{w(e),v(!0)},children:"View Keys"})})]},e.user_id)})})]})}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)("div",{className:"flex items-center",children:[(0,a.jsx)("div",{className:"flex-1"}),(0,a.jsx)("div",{className:"flex-1 flex justify-between items-center"})]})})]})}),(0,a.jsx)(eF,{visible:b,possibleUIRoles:N,onCancel:A,user:S,onSubmit:C})]}),function(){if(!c)return null;let e=Math.ceil(c.length/25);return(0,a.jsxs)("div",{className:"flex justify-between items-center",children:[(0,a.jsxs)("div",{children:["Showing Page ",j+1," of ",e]}),(0,a.jsxs)("div",{className:"flex",children:[(0,a.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-l focus:outline-none",disabled:0===j,onClick:()=>g(j-1),children:"← Prev"}),(0,a.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-r focus:outline-none",onClick:()=>{g(j+1)},children:"Next →"})]})]})}()]})}):(0,a.jsx)("div",{children:"Loading..."})};console.log=function(){};var eD=e=>{let{teams:l,searchParams:s,accessToken:t,setTeams:n,userID:i,userRole:o}=e,[d]=S.Z.useForm(),[c]=S.Z.useForm(),{Title:m,Paragraph:g}=Q.default,[Z,f]=(0,r.useState)(""),[y,b]=(0,r.useState)(!1),[C,P]=(0,r.useState)(l?l[0]:null),[T,W]=(0,r.useState)(!1),[H,G]=(0,r.useState)(!1),[Y,J]=(0,r.useState)([]),[X,$]=(0,r.useState)(!1),[ee,el]=(0,r.useState)(null),[es,et]=(0,r.useState)({}),en=e=>{P(e),b(!0)},ea=async e=>{let s=e.team_id;if(console.log("handleEditSubmit:",e),null==t)return;let a=await (0,u.Gh)(t,e);l&&n(l.map(e=>e.team_id===s?a.data:e)),k.ZP.success("Team updated successfully"),b(!1),P(null)},er=async e=>{el(e),$(!0)},ei=async()=>{if(null!=ee&&null!=l&&null!=t){try{await (0,u.rs)(t,ee);let e=l.filter(e=>e.team_id!==ee);n(e)}catch(e){console.error("Error deleting the team:",e)}$(!1),el(null)}};(0,r.useEffect)(()=>{let e=async()=>{try{if(null===i||null===o||null===t||null===l)return;console.log("fetching team info:");let e={};for(let s=0;s<(null==l?void 0:l.length);s++){let n=l[s].team_id,a=await (0,u.Xm)(t,n);console.log("teamInfo response:",a),null!==a&&(e={...e,[n]:a})}et(e)}catch(e){console.error("Error fetching team info:",e)}};(async()=>{try{if(null===i||null===o)return;if(null!==t){let e=(await (0,u.So)(t,i,o)).data.map(e=>e.id);console.log("available_model_names:",e),J(e)}}catch(e){console.error("Error fetching user models:",e)}})(),e()},[t,i,o,l]);let eo=async e=>{try{if(null!=t){var s;let a=null==e?void 0:e.team_alias;if((null!==(s=null==l?void 0:l.map(e=>e.team_alias))&&void 0!==s?s:[]).includes(a))throw Error("Team alias ".concat(a," already exists, please pick another alias"));k.ZP.info("Creating Team");let r=await (0,u.hT)(t,e);null!==l?n([...l,r]):n([r]),console.log("response for team create call: ".concat(r)),k.ZP.success("Team created"),W(!1)}}catch(e){console.error("Error creating the team:",e),k.ZP.error("Error creating the team: "+e,20)}},ed=async e=>{try{if(null!=t&&null!=l){k.ZP.info("Adding Member");let s={role:"user",user_email:e.user_email,user_id:e.user_id},a=await (0,u.cu)(t,C.team_id,s);console.log("response for team create call: ".concat(a.data));let r=l.findIndex(e=>(console.log("team.team_id=".concat(e.team_id,"; response.data.team_id=").concat(a.data.team_id)),e.team_id===a.data.team_id));if(console.log("foundIndex: ".concat(r)),-1!==r){let e=[...l];e[r]=a.data,n(e),P(a.data)}G(!1)}}catch(e){console.error("Error creating the team:",e)}};return console.log("received teams ".concat(JSON.stringify(l))),(0,a.jsx)("div",{className:"w-full mx-4",children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 p-8 h-[75vh] w-full mt-2",children:[(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(m,{level:4,children:"All Teams"}),(0,a.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:[(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Team Name"}),(0,a.jsx)(q.Z,{children:"Spend (USD)"}),(0,a.jsx)(q.Z,{children:"Budget (USD)"}),(0,a.jsx)(q.Z,{children:"Models"}),(0,a.jsx)(q.Z,{children:"TPM / RPM Limits"}),(0,a.jsx)(q.Z,{children:"Info"})]})}),(0,a.jsx)(L.Z,{children:l&&l.length>0?l.map(e=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{style:{maxWidth:"4px",whiteSpace:"pre-wrap",overflow:"hidden"},children:e.team_alias}),(0,a.jsx)(U.Z,{style:{maxWidth:"4px",whiteSpace:"pre-wrap",overflow:"hidden"},children:e.spend}),(0,a.jsx)(U.Z,{style:{maxWidth:"4px",whiteSpace:"pre-wrap",overflow:"hidden"},children:null!==e.max_budget&&void 0!==e.max_budget?e.max_budget:"No limit"}),(0,a.jsx)(U.Z,{style:{maxWidth:"8-x",whiteSpace:"pre-wrap",overflow:"hidden"},children:Array.isArray(e.models)?(0,a.jsx)("div",{style:{display:"flex",flexDirection:"column"},children:0===e.models.length?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Proxy Models"})}):e.models.map((e,l)=>"all-proxy-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Proxy Models"})},l):(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"blue",children:(0,a.jsx)(_.Z,{children:e.length>30?"".concat(e.slice(0,30),"..."):e})},l))}):null}),(0,a.jsx)(U.Z,{style:{maxWidth:"4px",whiteSpace:"pre-wrap",overflow:"hidden"},children:(0,a.jsxs)(_.Z,{children:["TPM: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,a.jsx)("br",{}),"RPM:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,a.jsxs)(U.Z,{children:[(0,a.jsxs)(_.Z,{children:[es&&e.team_id&&es[e.team_id]&&es[e.team_id].keys&&es[e.team_id].keys.length," ","Keys"]}),(0,a.jsxs)(_.Z,{children:[es&&e.team_id&&es[e.team_id]&&es[e.team_id].team_info&&es[e.team_id].team_info.members_with_roles&&es[e.team_id].team_info.members_with_roles.length," ","Members"]})]}),(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>en(e)}),(0,a.jsx)(M.Z,{onClick:()=>er(e.team_id),icon:O.Z,size:"sm"})]})]},e.team_id)):null})]}),X&&(0,a.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,a.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,a.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,a.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,a.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:""}),(0,a.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,a.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,a.jsx)("div",{className:"sm:flex sm:items-start",children:(0,a.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,a.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Team"}),(0,a.jsx)("div",{className:"mt-2",children:(0,a.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this team ?"})})]})})}),(0,a.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,a.jsx)(p.Z,{onClick:ei,color:"red",className:"ml-2",children:"Delete"}),(0,a.jsx)(p.Z,{onClick:()=>{$(!1),el(null)},children:"Cancel"})]})]})]})})]})]}),(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(p.Z,{className:"mx-auto",onClick:()=>W(!0),children:"+ Create New Team"}),(0,a.jsx)(w.Z,{title:"Create Team",visible:T,width:800,footer:null,onOk:()=>{W(!1),d.resetFields()},onCancel:()=>{W(!1),d.resetFields()},children:(0,a.jsxs)(S.Z,{form:d,onFinish:eo,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{label:"Team Name",name:"team_alias",rules:[{required:!0,message:"Please input a team name"}],children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(S.Z.Item,{label:"Models",name:"models",children:(0,a.jsxs)(v.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:[(0,a.jsx)(v.default.Option,{value:"all-proxy-models",children:"All Proxy Models"},"all-proxy-models"),Y.map(e=>(0,a.jsx)(v.default.Option,{value:e,children:e},e))]})}),(0,a.jsx)(S.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})}),(0,a.jsx)(S.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(S.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,a.jsx)(I.Z,{step:1,width:400})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Create Team"})})]})})]}),(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(m,{level:4,children:"Team Members"}),(0,a.jsx)(g,{children:"If you belong to multiple teams, this setting controls which teams members you see."}),l&&l.length>0?(0,a.jsx)(B.Z,{defaultValue:"0",children:l.map((e,l)=>(0,a.jsx)(K.Z,{value:String(l),onClick:()=>{P(e)},children:e.team_alias},l))}):(0,a.jsxs)(g,{children:["No team created. ",(0,a.jsx)("b",{children:"Defaulting to personal account."})]})]}),(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Member Name"}),(0,a.jsx)(q.Z,{children:"Role"})]})}),(0,a.jsx)(L.Z,{children:C?C.members_with_roles.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,a.jsx)(U.Z,{children:e.role})]},l)):null})]})}),C&&(0,a.jsx)(e=>{let{visible:l,onCancel:s,team:t,onSubmit:n}=e,[r]=S.Z.useForm();return(0,a.jsx)(w.Z,{title:"Edit Team",visible:l,width:800,footer:null,onOk:()=>{r.validateFields().then(e=>{n({...e,team_id:t.team_id}),r.resetFields()}).catch(e=>{console.error("Validation failed:",e)})},onCancel:s,children:(0,a.jsxs)(S.Z,{form:r,onFinish:ea,initialValues:t,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{label:"Team Name",name:"team_alias",rules:[{required:!0,message:"Please input a team name"}],children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(S.Z.Item,{label:"Models",name:"models",children:(0,a.jsxs)(v.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:[(0,a.jsx)(v.default.Option,{value:"all-proxy-models",children:"All Proxy Models"},"all-proxy-models"),Y&&Y.map(e=>(0,a.jsx)(v.default.Option,{value:e,children:e},e))]})}),(0,a.jsx)(S.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})}),(0,a.jsx)(S.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(S.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(S.Z.Item,{label:"Requests per minute Limit (RPM)",name:"team_id",hidden:!0})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Edit Team"})})]})})},{visible:y,onCancel:()=>{b(!1),P(null)},team:C,onSubmit:ea})]}),(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(p.Z,{className:"mx-auto mb-5",onClick:()=>G(!0),children:"+ Add member"}),(0,a.jsx)(w.Z,{title:"Add member",visible:H,width:800,footer:null,onOk:()=>{G(!1),c.resetFields()},onCancel:()=>{G(!1),c.resetFields()},children:(0,a.jsxs)(S.Z,{form:d,onFinish:ed,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,a.jsx)(N.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,a.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,a.jsx)(S.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,a.jsx)(N.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})})},eL=e=>{let l,{searchParams:s,accessToken:t,showSSOBanner:n,premiumUser:o}=e,[d]=S.Z.useForm(),[c]=S.Z.useForm(),{Title:m,Paragraph:j}=Q.default,[g,Z]=(0,r.useState)(""),[f,y]=(0,r.useState)(null),[b,v]=(0,r.useState)(null),[I,C]=(0,r.useState)(!1),[P,T]=(0,r.useState)(!1),[O,R]=(0,r.useState)(!1),[W,H]=(0,r.useState)(!1),[G,Y]=(0,r.useState)(!1),[J,X]=(0,r.useState)(!1),[$,ee]=(0,r.useState)(!1),[el,es]=(0,r.useState)(!1),[et,en]=(0,r.useState)(!1),[ea,er]=(0,r.useState)([]),[ei,eo]=(0,r.useState)(null),ed=(0,i.useRouter)(),[ec,em]=(0,r.useState)(null);console.log=function(){};let[eu,eh]=(0,r.useState)(""),ex="All IP Addresses Allowed";try{l=window.location.origin}catch(e){l=""}l+="/fallback/login";let ep=async()=>{try{if(!0!==o){k.ZP.error("This feature is only available for premium users. Please upgrade your account.");return}if(t){let e=await (0,u.PT)(t);er(e&&e.length>0?e:[ex])}else er([ex])}catch(e){console.error("Error fetching allowed IPs:",e),k.ZP.error("Failed to fetch allowed IPs ".concat(e)),er([ex])}finally{!0===o&&ee(!0)}},ej=async e=>{try{if(t){await (0,u.eH)(t,e.ip);let l=await (0,u.PT)(t);er(l),k.ZP.success("IP address added successfully")}}catch(e){console.error("Error adding IP:",e),k.ZP.error("Failed to add IP address ".concat(e))}finally{es(!1)}},eg=async e=>{eo(e),en(!0)},eZ=async()=>{if(ei&&t)try{await (0,u.$I)(t,ei);let e=await (0,u.PT)(t);er(e.length>0?e:[ex]),k.ZP.success("IP address deleted successfully")}catch(e){console.error("Error deleting IP:",e),k.ZP.error("Failed to delete IP address ".concat(e))}finally{en(!1),eo(null)}},ef=()=>{X(!1)},e_=["proxy_admin","proxy_admin_viewer"];(0,r.useEffect)(()=>{if(ed){let{protocol:e,host:l}=window.location;eh("".concat(e,"//").concat(l))}},[ed]),(0,r.useEffect)(()=>{(async()=>{if(null!=t){let e=[],l=await (0,u.Xd)(t,"proxy_admin_viewer");l.forEach(l=>{e.push({user_role:l.user_role,user_id:l.user_id,user_email:l.user_email})}),console.log("proxy viewers: ".concat(l));let s=await (0,u.Xd)(t,"proxy_admin");s.forEach(l=>{e.push({user_role:l.user_role,user_id:l.user_id,user_email:l.user_email})}),console.log("proxy admins: ".concat(s)),console.log("combinedList: ".concat(e)),y(e),em(await (0,u.lg)(t))}})()},[t]);let ey=()=>{H(!1),c.resetFields(),d.resetFields()},ev=()=>{H(!1),c.resetFields(),d.resetFields()},eS=e=>(0,a.jsxs)(S.Z,{form:d,onFinish:e,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsx)(a.Fragment,{children:(0,a.jsx)(S.Z.Item,{label:"Email",name:"user_email",className:"mb-8 mt-4",children:(0,a.jsx)(N.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})})}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},className:"mt-4",children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add member"})})]}),ek=(e,l,s)=>(0,a.jsxs)(S.Z,{form:d,onFinish:e,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"User Role",name:"user_role",labelCol:{span:10},labelAlign:"left",children:(0,a.jsx)(B.Z,{value:l,children:e_.map((e,l)=>(0,a.jsx)(K.Z,{value:e,children:e},l))})}),(0,a.jsx)(S.Z.Item,{label:"Team ID",name:"user_id",hidden:!0,initialValue:s,valuePropName:"user_id",className:"mt-8",children:(0,a.jsx)(N.Z,{value:s,disabled:!0})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Update role"})})]}),ew=async e=>{try{if(null!=t&&null!=f){k.ZP.info("Making API Call");let l=await (0,u.pf)(t,e,null);console.log("response for team create call: ".concat(l));let s=f.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(l.user_id)),e.user_id===l.user_id));console.log("foundIndex: ".concat(s)),-1==s&&(console.log("updates admin with new user"),f.push(l),y(f)),k.ZP.success("Refresh tab to see updated user role"),H(!1)}}catch(e){console.error("Error creating the key:",e)}},eN=async e=>{try{if(null!=t&&null!=f){var l;k.ZP.info("Making API Call");let s=await (0,u.pf)(t,e,"proxy_admin_viewer");console.log("response for team create call: ".concat(s));let n=(null===(l=s.data)||void 0===l?void 0:l.user_id)||s.user_id;(0,u.XO)(t,n).then(e=>{v(e),C(!0)});let a=f.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(s.user_id)),e.user_id===s.user_id));console.log("foundIndex: ".concat(a)),-1==a&&(console.log("updates admin with new user"),f.push(s),y(f)),d.resetFields(),T(!1)}}catch(e){console.error("Error creating the key:",e)}},eI=async e=>{try{if(null!=t&&null!=f){var l;k.ZP.info("Making API Call"),e.user_email,e.user_id;let s=await (0,u.pf)(t,e,"proxy_admin"),n=(null===(l=s.data)||void 0===l?void 0:l.user_id)||s.user_id;(0,u.XO)(t,n).then(e=>{v(e),C(!0)}),console.log("response for team create call: ".concat(s));let a=f.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(n)),e.user_id===s.user_id));console.log("foundIndex: ".concat(a)),-1==a&&(console.log("updates admin with new user"),f.push(s),y(f)),d.resetFields(),R(!1)}}catch(e){console.error("Error creating the key:",e)}},eA=async e=>{if(null==t)return;let l={environment_variables:{PROXY_BASE_URL:e.proxy_base_url,GOOGLE_CLIENT_ID:e.google_client_id,GOOGLE_CLIENT_SECRET:e.google_client_secret}};(0,u.K_)(t,l)};return console.log("admins: ".concat(null==f?void 0:f.length)),(0,a.jsxs)("div",{className:"w-full m-2 mt-2 p-8",children:[(0,a.jsx)(m,{level:4,children:"Admin Access "}),(0,a.jsxs)(j,{children:[n&&(0,a.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access",children:"Requires SSO Setup"}),(0,a.jsx)("br",{}),(0,a.jsx)("b",{children:"Proxy Admin: "})," Can create keys, teams, users, add models, etc."," ",(0,a.jsx)("br",{}),(0,a.jsx)("b",{children:"Proxy Admin Viewer: "}),"Can just view spend. They cannot create keys, teams or grant users access to new models."," "]}),(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 p-2 w-full",children:[(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Member Name"}),(0,a.jsx)(q.Z,{children:"Role"})]})}),(0,a.jsx)(L.Z,{children:f?f.map((e,l)=>{var s;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,a.jsxs)(U.Z,{children:[" ",(null==ec?void 0:null===(s=ec[null==e?void 0:e.user_role])||void 0===s?void 0:s.ui_label)||"-"]}),(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>H(!0)}),(0,a.jsx)(w.Z,{title:"Update role",visible:W,width:800,footer:null,onOk:ey,onCancel:ev,children:ek(ew,e.user_role,e.user_id)})]})]},l)}):null})]})})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)("div",{className:"flex justify-start",children:[(0,a.jsx)(p.Z,{className:"mr-4 mb-5",onClick:()=>R(!0),children:"+ Add admin"}),(0,a.jsx)(w.Z,{title:"Add admin",visible:O,width:800,footer:null,onOk:()=>{R(!1),c.resetFields(),d.resetFields()},onCancel:()=>{R(!1),C(!1),c.resetFields(),d.resetFields()},children:eS(eI)}),(0,a.jsx)(eE,{isInvitationLinkModalVisible:I,setIsInvitationLinkModalVisible:C,baseUrl:eu,invitationLinkData:b}),(0,a.jsx)(p.Z,{className:"mb-5",onClick:()=>T(!0),children:"+ Add viewer"}),(0,a.jsx)(w.Z,{title:"Add viewer",visible:P,width:800,footer:null,onOk:()=>{T(!1),c.resetFields(),d.resetFields()},onCancel:()=>{T(!1),c.resetFields(),d.resetFields()},children:eS(eN)})]})})]}),(0,a.jsxs)(x.Z,{children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(m,{level:4,children:" ✨ Security Settings"}),(0,a.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"1rem",marginTop:"1rem"},children:[(0,a.jsx)("div",{children:(0,a.jsx)(p.Z,{onClick:()=>!0===o?Y(!0):k.ZP.error("Only premium users can add SSO"),children:"Add SSO"})}),(0,a.jsx)("div",{children:(0,a.jsx)(p.Z,{onClick:ep,children:"Allowed IPs"})})]})]}),(0,a.jsxs)("div",{className:"flex justify-start mb-4",children:[(0,a.jsx)(w.Z,{title:"Add SSO",visible:G,width:800,footer:null,onOk:()=>{Y(!1),d.resetFields()},onCancel:()=>{Y(!1),d.resetFields()},children:(0,a.jsxs)(S.Z,{form:d,onFinish:e=>{eI(e),eA(e),Y(!1),X(!0)},labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{label:"Admin Email",name:"user_email",rules:[{required:!0,message:"Please enter the email of the proxy admin"}],children:(0,a.jsx)(N.Z,{})}),(0,a.jsx)(S.Z.Item,{label:"PROXY BASE URL",name:"proxy_base_url",rules:[{required:!0,message:"Please enter the proxy base url"}],children:(0,a.jsx)(N.Z,{})}),(0,a.jsx)(S.Z.Item,{label:"GOOGLE CLIENT ID",name:"google_client_id",rules:[{required:!0,message:"Please enter the google client id"}],children:(0,a.jsx)(N.Z.Password,{})}),(0,a.jsx)(S.Z.Item,{label:"GOOGLE CLIENT SECRET",name:"google_client_secret",rules:[{required:!0,message:"Please enter the google client secret"}],children:(0,a.jsx)(N.Z.Password,{})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})}),(0,a.jsxs)(w.Z,{title:"SSO Setup Instructions",visible:J,width:800,footer:null,onOk:ef,onCancel:()=>{X(!1)},children:[(0,a.jsx)("p",{children:"Follow these steps to complete the SSO setup:"}),(0,a.jsx)(_.Z,{className:"mt-2",children:"1. DO NOT Exit this TAB"}),(0,a.jsx)(_.Z,{className:"mt-2",children:"2. Open a new tab, visit your proxy base url"}),(0,a.jsx)(_.Z,{className:"mt-2",children:"3. Confirm your SSO is configured correctly and you can login on the new Tab"}),(0,a.jsx)(_.Z,{className:"mt-2",children:"4. If Step 3 is successful, you can close this tab"}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{onClick:ef,children:"Done"})})]}),(0,a.jsx)(w.Z,{title:"Manage Allowed IP Addresses",width:800,visible:$,onCancel:()=>ee(!1),footer:[(0,a.jsx)(p.Z,{className:"mx-1",onClick:()=>es(!0),children:"Add IP Address"},"add"),(0,a.jsx)(p.Z,{onClick:()=>ee(!1),children:"Close"},"close")],children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"IP Address"}),(0,a.jsx)(q.Z,{className:"text-right",children:"Action"})]})}),(0,a.jsx)(L.Z,{children:ea.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e}),(0,a.jsx)(U.Z,{className:"text-right",children:e!==ex&&(0,a.jsx)(p.Z,{onClick:()=>eg(e),color:"red",size:"xs",children:"Delete"})})]},l))})]})}),(0,a.jsx)(w.Z,{title:"Add Allowed IP Address",visible:el,onCancel:()=>es(!1),footer:null,children:(0,a.jsxs)(S.Z,{onFinish:ej,children:[(0,a.jsx)(S.Z.Item,{name:"ip",rules:[{required:!0,message:"Please enter an IP address"}],children:(0,a.jsx)(N.Z,{placeholder:"Enter IP address"})}),(0,a.jsx)(S.Z.Item,{children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add IP Address"})})]})}),(0,a.jsx)(w.Z,{title:"Confirm Delete",visible:et,onCancel:()=>en(!1),onOk:eZ,footer:[(0,a.jsx)(p.Z,{className:"mx-1",onClick:()=>eZ(),children:"Yes"},"delete"),(0,a.jsx)(p.Z,{onClick:()=>en(!1),children:"Close"},"close")],children:(0,a.jsxs)("p",{children:["Are you sure you want to delete the IP address: ",ei,"?"]})})]}),(0,a.jsxs)(eb.Z,{title:"Login without SSO",color:"teal",children:["If you need to login without sso, you can access"," ",(0,a.jsxs)("a",{href:l,target:"_blank",children:[(0,a.jsx)("b",{children:l})," "]})]})]})]})},eU=s(42556),eV=s(90252),eq=e=>{let{alertingSettings:l,handleInputChange:s,handleResetField:t,handleSubmit:n,premiumUser:r}=e,[i]=S.Z.useForm();return(0,a.jsxs)(S.Z,{form:i,onFinish:()=>{let e=i.getFieldsValue();Object.values(e).some(e=>""===e||null==e)?console.log("Some form fields are empty."):n(e)},labelAlign:"left",children:[l.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsxs)(U.Z,{align:"center",children:[(0,a.jsx)(_.Z,{children:e.field_name}),(0,a.jsx)("p",{style:{fontSize:"0.65rem",color:"#808080",fontStyle:"italic"},className:"mt-1",children:e.field_description})]}),e.premium_field?r?(0,a.jsx)(S.Z.Item,{name:e.field_name,children:(0,a.jsx)(U.Z,{children:"Integer"===e.field_type?(0,a.jsx)(I.Z,{step:1,value:e.field_value,onChange:l=>s(e.field_name,l)}):(0,a.jsx)(N.Z,{value:e.field_value,onChange:l=>s(e.field_name,l)})})}):(0,a.jsx)(U.Z,{children:(0,a.jsx)(p.Z,{className:"flex items-center justify-center",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"✨ Enterprise Feature"})})}):(0,a.jsx)(S.Z.Item,{name:e.field_name,className:"mb-0",children:(0,a.jsx)(U.Z,{children:"Integer"===e.field_type?(0,a.jsx)(I.Z,{step:1,value:e.field_value,onChange:l=>s(e.field_name,l),className:"p-0"}):(0,a.jsx)(N.Z,{value:e.field_value,onChange:l=>s(e.field_name,l)})})}),(0,a.jsx)(U.Z,{children:!0==e.stored_in_db?(0,a.jsx)(R.Z,{icon:eV.Z,className:"text-white",children:"In DB"}):!1==e.stored_in_db?(0,a.jsx)(R.Z,{className:"text-gray bg-white outline",children:"In Config"}):(0,a.jsx)(R.Z,{className:"text-gray bg-white outline",children:"Not Set"})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(M.Z,{icon:O.Z,color:"red",onClick:()=>t(e.field_name,l),children:"Reset"})})]},l)),(0,a.jsx)("div",{children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Update Settings"})})]})},ez=e=>{let{accessToken:l,premiumUser:s}=e,[t,n]=(0,r.useState)([]);return console.log("INSIDE ALERTING SETTINGS"),(0,r.useEffect)(()=>{l&&(0,u.RQ)(l).then(e=>{n(e)})},[l]),(0,a.jsx)(eq,{alertingSettings:t,handleInputChange:(e,l)=>{n(t.map(s=>s.field_name===e?{...s,field_value:l}:s))},handleResetField:(e,s)=>{if(l)try{let l=t.map(l=>l.field_name===e?{...l,stored_in_db:null,field_value:l.field_default_value}:l);console.log("INSIDE HANDLE RESET FIELD"),n(l)}catch(e){console.log("ERROR OCCURRED!")}},handleSubmit:e=>{if(!l||null==e||void 0==e)return;let s={};t.forEach(e=>{s[e.field_name]=e.field_value});let n={...e,...s};try{(0,u.jA)(l,"alerting_args",n),k.ZP.success("Wait 10s for proxy to update.")}catch(e){}},premiumUser:s})},eB=s(84406);let{Title:eK,Paragraph:eW}=Q.default;console.log=function(){};var eH=e=>{let{accessToken:l,userRole:s,userID:t,premiumUser:n}=e,[i,o]=(0,r.useState)([]),[d,c]=(0,r.useState)([]),[m,h]=(0,r.useState)(!1),[g]=S.Z.useForm(),[Z,f]=(0,r.useState)(null),[y,b]=(0,r.useState)([]),[N,I]=(0,r.useState)(""),[C,P]=(0,r.useState)({}),[T,O]=(0,r.useState)([]),[R,B]=(0,r.useState)(!1),[W,H]=(0,r.useState)([]),[G,Y]=(0,r.useState)(null),[J,X]=(0,r.useState)([]),[$,Q]=(0,r.useState)(!1),[ee,el]=(0,r.useState)(null),es=e=>{T.includes(e)?O(T.filter(l=>l!==e)):O([...T,e])},eo={llm_exceptions:"LLM Exceptions",llm_too_slow:"LLM Responses Too Slow",llm_requests_hanging:"LLM Requests Hanging",budget_alerts:"Budget Alerts (API Keys, Users)",db_exceptions:"Database Exceptions (Read/Write)",daily_reports:"Weekly/Monthly Spend Reports",outage_alerts:"Outage Alerts",region_outage_alerts:"Region Outage Alerts"};(0,r.useEffect)(()=>{l&&s&&t&&(0,u.BL)(l,t,s).then(e=>{console.log("callbacks",e),o(e.callbacks),H(e.available_callbacks);let l=e.alerts;if(console.log("alerts_data",l),l&&l.length>0){let e=l[0];console.log("_alert_info",e);let s=e.variables.SLACK_WEBHOOK_URL;console.log("catch_all_webhook",s),O(e.active_alerts),I(s),P(e.alerts_to_webhook)}c(l)})},[l,s,t]);let ed=e=>T&&T.includes(e),ec=()=>{if(!l)return;let e={};d.filter(e=>"email"===e.name).forEach(l=>{var s;Object.entries(null!==(s=l.variables)&&void 0!==s?s:{}).forEach(l=>{let[s,t]=l,n=document.querySelector('input[name="'.concat(s,'"]'));n&&n.value&&(e[s]=null==n?void 0:n.value)})}),console.log("updatedVariables",e);try{(0,u.K_)(l,{general_settings:{alerting:["email"]},environment_variables:e})}catch(e){k.ZP.error("Failed to update alerts: "+e,20)}k.ZP.success("Email settings updated successfully")},em=async e=>{if(!l)return;let s={};Object.entries(e).forEach(e=>{let[l,t]=e;"callback"!==l&&(s[l]=t)});try{await (0,u.K_)(l,{environment_variables:s}),k.ZP.success("Callback added successfully"),h(!1),g.resetFields(),f(null)}catch(e){k.ZP.error("Failed to add callback: "+e,20)}},eu=async e=>{if(!l)return;let s=null==e?void 0:e.callback,t={};Object.entries(e).forEach(e=>{let[l,s]=e;"callback"!==l&&(t[l]=s)});try{await (0,u.K_)(l,{environment_variables:t,litellm_settings:{success_callback:[s]}}),k.ZP.success("Callback ".concat(s," added successfully")),h(!1),g.resetFields(),f(null)}catch(e){k.ZP.error("Failed to add callback: "+e,20)}},eh=e=>{console.log("inside handleSelectedCallbackChange",e),f(e.litellm_callback_name),console.log("all callbacks",W),e&&e.litellm_callback_params?(X(e.litellm_callback_params),console.log("selectedCallbackParams",J)):X([])};return l?(console.log("callbacks: ".concat(i)),(0,a.jsxs)("div",{className:"w-full mx-4",children:[(0,a.jsx)(x.Z,{numItems:1,className:"gap-2 p-8 w-full mt-2",children:(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{variant:"line",defaultValue:"1",children:[(0,a.jsx)(et.Z,{value:"1",children:"Logging Callbacks"}),(0,a.jsx)(et.Z,{value:"2",children:"Alerting Types"}),(0,a.jsx)(et.Z,{value:"3",children:"Alerting Settings"}),(0,a.jsx)(et.Z,{value:"4",children:"Email Alerts"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsxs)(er.Z,{children:[(0,a.jsx)(eK,{level:4,children:"Active Logging Callbacks"}),(0,a.jsx)(x.Z,{numItems:2,children:(0,a.jsx)(F.Z,{className:"max-h-[50vh]",children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsx)(z.Z,{children:(0,a.jsx)(q.Z,{children:"Callback Name"})})}),(0,a.jsx)(L.Z,{children:i.map((e,s)=>(0,a.jsxs)(z.Z,{className:"flex justify-between",children:[(0,a.jsx)(U.Z,{children:(0,a.jsx)(_.Z,{children:e.name})}),(0,a.jsx)(U.Z,{children:(0,a.jsxs)(x.Z,{numItems:2,className:"flex justify-between",children:[(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>{el(e),Q(!0)}}),(0,a.jsx)(p.Z,{onClick:()=>(0,u.jE)(l,e.name),className:"ml-2",variant:"secondary",children:"Test Callback"})]})})]},s))})]})})}),(0,a.jsx)(p.Z,{className:"mt-2",onClick:()=>B(!0),children:"Add Callback"})]}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(_.Z,{className:"my-2",children:["Alerts are only supported for Slack Webhook URLs. Get your webhook urls from"," ",(0,a.jsx)("a",{href:"https://api.slack.com/messaging/webhooks",target:"_blank",style:{color:"blue"},children:"here"})]}),(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{}),(0,a.jsx)(q.Z,{}),(0,a.jsx)(q.Z,{children:"Slack Webhook URL"})]})}),(0,a.jsx)(L.Z,{children:Object.entries(eo).map((e,l)=>{let[s,t]=e;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:"region_outage_alerts"==s?n?(0,a.jsx)(eU.Z,{id:"switch",name:"switch",checked:ed(s),onChange:()=>es(s)}):(0,a.jsx)(p.Z,{className:"flex items-center justify-center",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"✨ Enterprise Feature"})}):(0,a.jsx)(eU.Z,{id:"switch",name:"switch",checked:ed(s),onChange:()=>es(s)})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(_.Z,{children:t})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(j.Z,{name:s,type:"password",defaultValue:C&&C[s]?C[s]:N})})]},l)})})]}),(0,a.jsx)(p.Z,{size:"xs",className:"mt-2",onClick:()=>{if(!l)return;let e={};Object.entries(eo).forEach(l=>{let[s,t]=l,n=document.querySelector('input[name="'.concat(s,'"]'));console.log("key",s),console.log("webhookInput",n);let a=(null==n?void 0:n.value)||"";console.log("newWebhookValue",a),e[s]=a}),console.log("updatedAlertToWebhooks",e);let s={general_settings:{alert_to_webhook_url:e,alert_types:T}};console.log("payload",s);try{(0,u.K_)(l,s)}catch(e){k.ZP.error("Failed to update alerts: "+e,20)}k.ZP.success("Alerts updated successfully")},children:"Save Changes"}),(0,a.jsx)(p.Z,{onClick:()=>(0,u.jE)(l,"slack"),className:"mx-2",children:"Test Alerts"})]})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ez,{accessToken:l,premiumUser:n})}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(eK,{level:4,children:"Email Settings"}),(0,a.jsxs)(_.Z,{children:[(0,a.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/email",target:"_blank",style:{color:"blue"},children:" LiteLLM Docs: email alerts"})," ",(0,a.jsx)("br",{})]}),(0,a.jsx)("div",{className:"flex w-full",children:d.filter(e=>"email"===e.name).map((e,l)=>{var s;return(0,a.jsx)(U.Z,{children:(0,a.jsx)("ul",{children:(0,a.jsx)(x.Z,{numItems:2,children:Object.entries(null!==(s=e.variables)&&void 0!==s?s:{}).map(e=>{let[l,s]=e;return(0,a.jsxs)("li",{className:"mx-2 my-2",children:[!0!=n&&("EMAIL_LOGO_URL"===l||"EMAIL_SUPPORT_CONTACT"===l)?(0,a.jsxs)("div",{children:[(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:(0,a.jsxs)(_.Z,{className:"mt-2",children:[" ","✨ ",l]})}),(0,a.jsx)(j.Z,{name:l,defaultValue:s,type:"password",disabled:!0,style:{width:"400px"}})]}):(0,a.jsxs)("div",{children:[(0,a.jsx)(_.Z,{className:"mt-2",children:l}),(0,a.jsx)(j.Z,{name:l,defaultValue:s,type:"password",style:{width:"400px"}})]}),(0,a.jsxs)("p",{style:{fontSize:"small",fontStyle:"italic"},children:["SMTP_HOST"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Enter the SMTP host address, e.g. `smtp.resend.com`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"SMTP_PORT"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Enter the SMTP port number, e.g. `587`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"SMTP_USERNAME"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Enter the SMTP username, e.g. `username`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"SMTP_PASSWORD"===l&&(0,a.jsx)("span",{style:{color:"red"},children:" Required * "}),"SMTP_SENDER_EMAIL"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Enter the sender email address, e.g. `sender@berri.ai`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"TEST_EMAIL_ADDRESS"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Email Address to send `Test Email Alert` to. example: `info@berri.ai`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"EMAIL_LOGO_URL"===l&&(0,a.jsx)("div",{style:{color:"gray"},children:"(Optional) Customize the Logo that appears in the email, pass a url to your logo"}),"EMAIL_SUPPORT_CONTACT"===l&&(0,a.jsx)("div",{style:{color:"gray"},children:"(Optional) Customize the support email address that appears in the email. Default is support@berri.ai"})]})]},l)})})})},l)})}),(0,a.jsx)(p.Z,{className:"mt-2",onClick:()=>ec(),children:"Save Changes"}),(0,a.jsx)(p.Z,{onClick:()=>(0,u.jE)(l,"email"),className:"mx-2",children:"Test Email Alerts"})]})})]})]})}),(0,a.jsxs)(w.Z,{title:"Add Logging Callback",visible:R,width:800,onCancel:()=>B(!1),footer:null,children:[(0,a.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/logging",className:"mb-8 mt-4",target:"_blank",style:{color:"blue"},children:" LiteLLM Docs: Logging"}),(0,a.jsx)(S.Z,{form:g,onFinish:eu,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(eB.Z,{label:"Callback",name:"callback",rules:[{required:!0,message:"Please select a callback"}],children:(0,a.jsx)(v.default,{onChange:e=>{let l=W[e];l&&(console.log(l.ui_callback_name),eh(l))},children:W&&Object.values(W).map(e=>(0,a.jsx)(K.Z,{value:e.litellm_callback_name,children:e.ui_callback_name},e.litellm_callback_name))})}),J&&J.map(e=>(0,a.jsx)(eB.Z,{label:e,name:e,rules:[{required:!0,message:"Please enter the value for "+e}],children:(0,a.jsx)(j.Z,{type:"password"})},e)),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})})]}),(0,a.jsx)(w.Z,{visible:$,width:800,title:"Edit ".concat(null==ee?void 0:ee.name," Settings"),onCancel:()=>Q(!1),footer:null,children:(0,a.jsxs)(S.Z,{form:g,onFinish:em,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsx)(a.Fragment,{children:ee&&ee.variables&&Object.entries(ee.variables).map(e=>{let[l,s]=e;return(0,a.jsx)(eB.Z,{label:l,name:l,children:(0,a.jsx)(j.Z,{type:"password",defaultValue:s})},l)})}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})})]})):null};let{Option:eG}=v.default;var eY=e=>{let{models:l,accessToken:s,routerSettings:t,setRouterSettings:n}=e,[i]=S.Z.useForm(),[o,d]=(0,r.useState)(!1),[c,m]=(0,r.useState)("");return(0,a.jsxs)("div",{children:[(0,a.jsx)(p.Z,{className:"mx-auto",onClick:()=>d(!0),children:"+ Add Fallbacks"}),(0,a.jsx)(w.Z,{title:"Add Fallbacks",visible:o,width:800,footer:null,onOk:()=>{d(!1),i.resetFields()},onCancel:()=>{d(!1),i.resetFields()},children:(0,a.jsxs)(S.Z,{form:i,onFinish:e=>{console.log(e);let{model_name:l,models:a}=e,r=[...t.fallbacks||[],{[l]:a}],o={...t,fallbacks:r};console.log(o);try{(0,u.K_)(s,{router_settings:o}),n(o)}catch(e){k.ZP.error("Failed to update router settings: "+e,20)}k.ZP.success("router settings updated successfully"),d(!1),i.resetFields()},labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{label:"Public Model Name",name:"model_name",rules:[{required:!0,message:"Set the model to fallback for"}],help:"required",children:(0,a.jsx)(B.Z,{defaultValue:c,children:l&&l.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>m(e),children:e},l))})}),(0,a.jsx)(S.Z.Item,{label:"Fallback Models",name:"models",rules:[{required:!0,message:"Please select a model"}],help:"required",children:(0,a.jsx)(eo.Z,{value:l,children:l&&l.filter(e=>e!=c).map(e=>(0,a.jsx)(ed.Z,{value:e,children:e},e))})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add Fallbacks"})})]})})]})},eJ=s(12968);async function eX(e,l){console.log=function(){},console.log("isLocal:",!1);let s=window.location.origin,t=new eJ.ZP.OpenAI({apiKey:l,baseURL:s,dangerouslyAllowBrowser:!0});try{let l=await t.chat.completions.create({model:e,messages:[{role:"user",content:"Hi, this is a test message"}],mock_testing_fallbacks:!0});k.ZP.success((0,a.jsxs)("span",{children:["Test model=",(0,a.jsx)("strong",{children:e}),", received model=",(0,a.jsx)("strong",{children:l.model}),". See"," ",(0,a.jsx)("a",{href:"#",onClick:()=>window.open("https://docs.litellm.ai/docs/proxy/reliability","_blank"),style:{textDecoration:"underline",color:"blue"},children:"curl"})]}))}catch(e){k.ZP.error("Error occurred while generating model response. Please try again. Error: ".concat(e),20)}}let e$={ttl:3600,lowest_latency_buffer:0},eQ=e=>{let{selectedStrategy:l,strategyArgs:s,paramExplanation:t}=e;return(0,a.jsxs)(g.Z,{children:[(0,a.jsx)(f.Z,{className:"text-sm font-medium text-tremor-content-strong dark:text-dark-tremor-content-strong",children:"Routing Strategy Specific Args"}),(0,a.jsx)(Z.Z,{children:"latency-based-routing"==l?(0,a.jsx)(F.Z,{children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Setting"}),(0,a.jsx)(q.Z,{children:"Value"})]})}),(0,a.jsx)(L.Z,{children:Object.entries(s).map(e=>{let[l,s]=e;return(0,a.jsxs)(z.Z,{children:[(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(_.Z,{children:l}),(0,a.jsx)("p",{style:{fontSize:"0.65rem",color:"#808080",fontStyle:"italic"},className:"mt-1",children:t[l]})]}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(j.Z,{name:l,defaultValue:"object"==typeof s?JSON.stringify(s,null,2):s.toString()})})]},l)})})]})}):(0,a.jsx)(_.Z,{children:"No specific settings"})})]})};var e0=e=>{let{accessToken:l,userRole:s,userID:t,modelData:n}=e,[i,o]=(0,r.useState)({}),[d,c]=(0,r.useState)({}),[m,g]=(0,r.useState)([]),[Z,f]=(0,r.useState)(!1),[b]=S.Z.useForm(),[v,w]=(0,r.useState)(null),[N,A]=(0,r.useState)(null),[C,P]=(0,r.useState)(null),T={routing_strategy_args:"(dict) Arguments to pass to the routing strategy",routing_strategy:"(string) Routing strategy to use",allowed_fails:"(int) Number of times a deployment can fail before being added to cooldown",cooldown_time:"(int) time in seconds to cooldown a deployment after failure",num_retries:"(int) Number of retries for failed requests. Defaults to 0.",timeout:"(float) Timeout for requests. Defaults to None.",retry_after:"(int) Minimum time to wait before retrying a failed request",ttl:"(int) Sliding window to look back over when calculating the average latency of a deployment. Default - 1 hour (in seconds).",lowest_latency_buffer:"(float) Shuffle between deployments within this % of the lowest latency. Default - 0 (i.e. always pick lowest latency)."};(0,r.useEffect)(()=>{l&&s&&t&&((0,u.BL)(l,t,s).then(e=>{console.log("callbacks",e);let l=e.router_settings;"model_group_retry_policy"in l&&delete l.model_group_retry_policy,o(l)}),(0,u.YU)(l).then(e=>{g(e)}))},[l,s,t]);let E=async e=>{if(l){console.log("received key: ".concat(e)),console.log("routerSettings['fallbacks']: ".concat(i.fallbacks)),i.fallbacks.map(l=>(e in l&&delete l[e],l));try{await (0,u.K_)(l,{router_settings:i}),o({...i}),A(i.routing_strategy),k.ZP.success("Router settings updated successfully")}catch(e){k.ZP.error("Failed to update router settings: "+e,20)}}},W=(e,l)=>{g(m.map(s=>s.field_name===e?{...s,field_value:l}:s))},H=(e,s)=>{if(!l)return;let t=m[s].field_value;if(null!=t&&void 0!=t)try{(0,u.jA)(l,e,t);let s=m.map(l=>l.field_name===e?{...l,stored_in_db:!0}:l);g(s)}catch(e){}},G=(e,s)=>{if(l)try{(0,u.ao)(l,e);let s=m.map(l=>l.field_name===e?{...l,stored_in_db:null,field_value:null}:l);g(s)}catch(e){}},Y=e=>{if(!l)return;console.log("router_settings",e);let s=Object.fromEntries(Object.entries(e).map(e=>{let[l,s]=e;if("routing_strategy_args"!==l&&"routing_strategy"!==l){var t;return[l,(null===(t=document.querySelector('input[name="'.concat(l,'"]')))||void 0===t?void 0:t.value)||s]}if("routing_strategy"==l)return[l,N];if("routing_strategy_args"==l&&"latency-based-routing"==N){let e={},l=document.querySelector('input[name="lowest_latency_buffer"]'),s=document.querySelector('input[name="ttl"]');return(null==l?void 0:l.value)&&(e.lowest_latency_buffer=Number(l.value)),(null==s?void 0:s.value)&&(e.ttl=Number(s.value)),console.log("setRoutingStrategyArgs: ".concat(e)),["routing_strategy_args",e]}return null}).filter(e=>null!=e));console.log("updatedVariables",s);try{(0,u.K_)(l,{router_settings:s})}catch(e){k.ZP.error("Failed to update router settings: "+e,20)}k.ZP.success("router settings updated successfully")};return l?(0,a.jsx)("div",{className:"w-full mx-4",children:(0,a.jsxs)(en.Z,{className:"gap-2 p-8 h-[75vh] w-full mt-2",children:[(0,a.jsxs)(ea.Z,{variant:"line",defaultValue:"1",children:[(0,a.jsx)(et.Z,{value:"1",children:"Loadbalancing"}),(0,a.jsx)(et.Z,{value:"2",children:"Fallbacks"}),(0,a.jsx)(et.Z,{value:"3",children:"General"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 p-8 w-full mt-2",children:[(0,a.jsx)(y.Z,{children:"Router Settings"}),(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Setting"}),(0,a.jsx)(q.Z,{children:"Value"})]})}),(0,a.jsx)(L.Z,{children:Object.entries(i).filter(e=>{let[l,s]=e;return"fallbacks"!=l&&"context_window_fallbacks"!=l&&"routing_strategy_args"!=l}).map(e=>{let[l,s]=e;return(0,a.jsxs)(z.Z,{children:[(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(_.Z,{children:l}),(0,a.jsx)("p",{style:{fontSize:"0.65rem",color:"#808080",fontStyle:"italic"},className:"mt-1",children:T[l]})]}),(0,a.jsx)(U.Z,{children:"routing_strategy"==l?(0,a.jsxs)(B.Z,{defaultValue:s,className:"w-full max-w-md",onValueChange:A,children:[(0,a.jsx)(K.Z,{value:"usage-based-routing",children:"usage-based-routing"}),(0,a.jsx)(K.Z,{value:"latency-based-routing",children:"latency-based-routing"}),(0,a.jsx)(K.Z,{value:"simple-shuffle",children:"simple-shuffle"})]}):(0,a.jsx)(j.Z,{name:l,defaultValue:"object"==typeof s?JSON.stringify(s,null,2):s.toString()})})]},l)})})]}),(0,a.jsx)(eQ,{selectedStrategy:N,strategyArgs:i&&i.routing_strategy_args&&Object.keys(i.routing_strategy_args).length>0?i.routing_strategy_args:e$,paramExplanation:T})]}),(0,a.jsx)(h.Z,{children:(0,a.jsx)(p.Z,{className:"mt-2",onClick:()=>Y(i),children:"Save Changes"})})]})}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Model Name"}),(0,a.jsx)(q.Z,{children:"Fallbacks"})]})}),(0,a.jsx)(L.Z,{children:i.fallbacks&&i.fallbacks.map((e,s)=>Object.entries(e).map(e=>{let[t,n]=e;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:t}),(0,a.jsx)(U.Z,{children:Array.isArray(n)?n.join(", "):n}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(p.Z,{onClick:()=>eX(t,l),children:"Test Fallback"})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(M.Z,{icon:O.Z,size:"sm",onClick:()=>E(t)})})]},s.toString()+t)}))})]}),(0,a.jsx)(eY,{models:(null==n?void 0:n.data)?n.data.map(e=>e.model_name):[],accessToken:l,routerSettings:i,setRouterSettings:o})]}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(F.Z,{children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Setting"}),(0,a.jsx)(q.Z,{children:"Value"}),(0,a.jsx)(q.Z,{children:"Status"}),(0,a.jsx)(q.Z,{children:"Action"})]})}),(0,a.jsx)(L.Z,{children:m.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(_.Z,{children:e.field_name}),(0,a.jsx)("p",{style:{fontSize:"0.65rem",color:"#808080",fontStyle:"italic"},className:"mt-1",children:e.field_description})]}),(0,a.jsx)(U.Z,{children:"Integer"==e.field_type?(0,a.jsx)(I.Z,{step:1,value:e.field_value,onChange:l=>W(e.field_name,l)}):null}),(0,a.jsx)(U.Z,{children:!0==e.stored_in_db?(0,a.jsx)(R.Z,{icon:eV.Z,className:"text-white",children:"In DB"}):!1==e.stored_in_db?(0,a.jsx)(R.Z,{className:"text-gray bg-white outline",children:"In Config"}):(0,a.jsx)(R.Z,{className:"text-gray bg-white outline",children:"Not Set"})}),(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(p.Z,{onClick:()=>H(e.field_name,l),children:"Update"}),(0,a.jsx)(M.Z,{icon:O.Z,color:"red",onClick:()=>G(e.field_name,l),children:"Reset"})]})]},l))})]})})})]})]})}):null},e1=e=>{let{isModalVisible:l,accessToken:s,setIsModalVisible:t,setBudgetList:n}=e,[r]=S.Z.useForm(),i=async e=>{if(null!=s&&void 0!=s)try{k.ZP.info("Making API Call");let l=await (0,u.Zr)(s,e);console.log("key create Response:",l),n(e=>e?[...e,l]:[l]),k.ZP.success("API Key Created"),r.resetFields()}catch(e){console.error("Error creating the key:",e),k.ZP.error("Error creating the key: ".concat(e),20)}};return(0,a.jsx)(w.Z,{title:"Create Budget",visible:l,width:800,footer:null,onOk:()=>{t(!1),r.resetFields()},onCancel:()=>{t(!1),r.resetFields()},children:(0,a.jsxs)(S.Z,{form:r,onFinish:i,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{label:"Budget ID",name:"budget_id",rules:[{required:!0,message:"Please input a human-friendly name for the budget"}],help:"A human-friendly name for the budget",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(S.Z.Item,{label:"Max Tokens per minute",name:"tpm_limit",help:"Default is model limit.",children:(0,a.jsx)(I.Z,{step:1,precision:2,width:200})}),(0,a.jsx)(S.Z.Item,{label:"Max Requests per minute",name:"rpm_limit",help:"Default is model limit.",children:(0,a.jsx)(I.Z,{step:1,precision:2,width:200})}),(0,a.jsxs)(g.Z,{className:"mt-20 mb-8",children:[(0,a.jsx)(f.Z,{children:(0,a.jsx)("b",{children:"Optional Settings"})}),(0,a.jsxs)(Z.Z,{children:[(0,a.jsx)(S.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})})]})]})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Create Budget"})})]})})},e2=e=>{let{isModalVisible:l,accessToken:s,setIsModalVisible:t,setBudgetList:n,existingBudget:r}=e,[i]=S.Z.useForm(),o=async e=>{if(null!=s&&void 0!=s)try{k.ZP.info("Making API Call");let l=await (0,u.Zr)(s,e);console.log("key create Response:",l),n(e=>e?[...e,l]:[l]),k.ZP.success("API Key Created"),i.resetFields()}catch(e){console.error("Error creating the key:",e),k.ZP.error("Error creating the key: ".concat(e),20)}};return(0,a.jsx)(w.Z,{title:"Edit Budget",visible:l,width:800,footer:null,onOk:()=>{t(!1),i.resetFields()},onCancel:()=>{t(!1),i.resetFields()},children:(0,a.jsxs)(S.Z,{form:i,onFinish:o,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",initialValues:r,children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{label:"Budget ID",name:"budget_id",rules:[{required:!0,message:"Please input a human-friendly name for the budget"}],help:"A human-friendly name for the budget",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(S.Z.Item,{label:"Max Tokens per minute",name:"tpm_limit",help:"Default is model limit.",children:(0,a.jsx)(I.Z,{step:1,precision:2,width:200})}),(0,a.jsx)(S.Z.Item,{label:"Max Requests per minute",name:"rpm_limit",help:"Default is model limit.",children:(0,a.jsx)(I.Z,{step:1,precision:2,width:200})}),(0,a.jsxs)(g.Z,{className:"mt-20 mb-8",children:[(0,a.jsx)(f.Z,{children:(0,a.jsx)("b",{children:"Optional Settings"})}),(0,a.jsxs)(Z.Z,{children:[(0,a.jsx)(S.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})})]})]})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Edit Budget"})})]})})},e4=e=>{let{accessToken:l}=e,[s,t]=(0,r.useState)(!1),[n,i]=(0,r.useState)(!1),[o,d]=(0,r.useState)(null),[c,m]=(0,r.useState)([]);(0,r.useEffect)(()=>{l&&(0,u.O3)(l).then(e=>{m(e)})},[l]);let h=async(e,s)=>{null!=l&&(d(c[s]),i(!0))},x=async(e,s)=>{if(null==l)return;k.ZP.info("Request made"),await (0,u.NV)(l,e);let t=[...c];t.splice(s,1),m(t),k.ZP.success("Budget Deleted.")};return(0,a.jsxs)("div",{className:"w-full mx-auto flex-auto overflow-y-auto m-8 p-2",children:[(0,a.jsx)(p.Z,{size:"sm",variant:"primary",className:"mb-2",onClick:()=>t(!0),children:"+ Create Budget"}),(0,a.jsx)(e1,{accessToken:l,isModalVisible:s,setIsModalVisible:t,setBudgetList:m}),o&&(0,a.jsx)(e2,{accessToken:l,isModalVisible:n,setIsModalVisible:i,setBudgetList:m,existingBudget:o}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(_.Z,{children:"Create a budget to assign to customers."}),(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Budget ID"}),(0,a.jsx)(q.Z,{children:"Max Budget"}),(0,a.jsx)(q.Z,{children:"TPM"}),(0,a.jsx)(q.Z,{children:"RPM"})]})}),(0,a.jsx)(L.Z,{children:c.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.budget_id}),(0,a.jsx)(U.Z,{children:e.max_budget?e.max_budget:"n/a"}),(0,a.jsx)(U.Z,{children:e.tpm_limit?e.tpm_limit:"n/a"}),(0,a.jsx)(U.Z,{children:e.rpm_limit?e.rpm_limit:"n/a"}),(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>h(e.budget_id,l)}),(0,a.jsx)(M.Z,{icon:O.Z,size:"sm",onClick:()=>x(e.budget_id,l)})]},l))})]})]}),(0,a.jsxs)("div",{className:"mt-5",children:[(0,a.jsx)(_.Z,{className:"text-base",children:"How to use budget id"}),(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{children:[(0,a.jsx)(et.Z,{children:"Assign Budget to Customer"}),(0,a.jsx)(et.Z,{children:"Test it (Curl)"}),(0,a.jsx)(et.Z,{children:"Test it (OpenAI SDK)"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"bash",children:"\ncurl -X POST --location '/end_user/new' \n-H 'Authorization: Bearer ' \n-H 'Content-Type: application/json' \n-d '{\"user_id\": \"my-customer-id', \"budget_id\": \"\"}' # \uD83D\uDC48 KEY CHANGE\n\n "})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"bash",children:'\ncurl -X POST --location \'/chat/completions\' \n-H \'Authorization: Bearer \' \n-H \'Content-Type: application/json\' \n-d \'{\n "model": "gpt-3.5-turbo\', \n "messages":[{"role": "user", "content": "Hey, how\'s it going?"}],\n "user": "my-customer-id"\n}\' # \uD83D\uDC48 KEY CHANGE\n\n '})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"python",children:'from openai import OpenAI\nclient = OpenAI(\n base_url="",\n api_key=""\n)\n\ncompletion = client.chat.completions.create(\n model="gpt-3.5-turbo",\n messages=[\n {"role": "system", "content": "You are a helpful assistant."},\n {"role": "user", "content": "Hello!"}\n ],\n user="my-customer-id"\n)\n\nprint(completion.choices[0].message)'})})]})]})]})]})},e5=s(41134),e8=e=>{let{proxySettings:l}=e,s="";return l&&l.PROXY_BASE_URL&&void 0!==l.PROXY_BASE_URL&&(s=l.PROXY_BASE_URL),(0,a.jsx)(a.Fragment,{children:(0,a.jsx)(x.Z,{className:"gap-2 p-8 h-[80vh] w-full mt-2",children:(0,a.jsxs)("div",{className:"mb-5",children:[(0,a.jsx)("p",{className:"text-2xl text-tremor-content-strong dark:text-dark-tremor-content-strong font-semibold",children:"OpenAI Compatible Proxy: API Reference"}),(0,a.jsx)(_.Z,{className:"mt-2 mb-2",children:"LiteLLM is OpenAI Compatible. This means your API Key works with the OpenAI SDK. Just replace the base_url to point to your litellm proxy. Example Below "}),(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{children:[(0,a.jsx)(et.Z,{children:"OpenAI Python SDK"}),(0,a.jsx)(et.Z,{children:"LlamaIndex"}),(0,a.jsx)(et.Z,{children:"Langchain Py"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="'.concat(s,'" # LiteLLM Proxy is OpenAI compatible, Read More: https://docs.litellm.ai/docs/proxy/user_keys\n)\n\nresponse = client.chat.completions.create(\n model="gpt-3.5-turbo", # model to send to the proxy\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ]\n)\n\nprint(response)\n ')})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="azure-gpt-3.5", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="'.concat(s,'", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="').concat(s,'",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n ')})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="'.concat(s,'",\n model = "gpt-3.5-turbo",\n temperature=0.1\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n ')})})]})]})]})})})};async function e3(e,l,s,t){console.log=function(){},console.log("isLocal:",!1);let n=window.location.origin,a=new eJ.ZP.OpenAI({apiKey:t,baseURL:n,dangerouslyAllowBrowser:!0});try{for await(let t of(await a.chat.completions.create({model:s,stream:!0,messages:[{role:"user",content:e}]})))console.log(t),t.choices[0].delta.content&&l(t.choices[0].delta.content)}catch(e){k.ZP.error("Error occurred while generating model response. Please try again. Error: ".concat(e),20)}}var e6=e=>{let{accessToken:l,token:s,userRole:t,userID:n}=e,[i,o]=(0,r.useState)(""),[d,c]=(0,r.useState)(""),[m,g]=(0,r.useState)([]),[Z,f]=(0,r.useState)(void 0),[y,b]=(0,r.useState)([]);(0,r.useEffect)(()=>{l&&s&&t&&n&&(async()=>{try{let e=await (0,u.So)(l,n,t);if(console.log("model_info:",e),(null==e?void 0:e.data.length)>0){let l=e.data.map(e=>({value:e.id,label:e.id}));if(console.log(l),l.length>0){let e=Array.from(new Set(l));console.log("Unique models:",e),e.sort((e,l)=>e.label.localeCompare(l.label)),console.log("Model info:",y),b(e)}f(e.data[0].id)}}catch(e){console.error("Error fetching model info:",e)}})()},[l,n,t]);let S=(e,l)=>{g(s=>{let t=s[s.length-1];return t&&t.role===e?[...s.slice(0,s.length-1),{role:e,content:t.content+l}]:[...s,{role:e,content:l}]})},k=async()=>{if(""!==d.trim()&&i&&s&&t&&n){g(e=>[...e,{role:"user",content:d}]);try{Z&&await e3(d,e=>S("assistant",e),Z,i)}catch(e){console.error("Error fetching model response",e),S("assistant","Error fetching model response")}c("")}};if(t&&"Admin Viewer"==t){let{Title:e,Paragraph:l}=Q.default;return(0,a.jsxs)("div",{children:[(0,a.jsx)(e,{level:1,children:"Access Denied"}),(0,a.jsx)(l,{children:"Ask your proxy admin for access to test models"})]})}return(0,a.jsx)("div",{style:{width:"100%",position:"relative"},children:(0,a.jsx)(x.Z,{className:"gap-2 p-8 h-[80vh] w-full mt-2",children:(0,a.jsx)(F.Z,{children:(0,a.jsxs)(en.Z,{children:[(0,a.jsx)(ea.Z,{children:(0,a.jsx)(et.Z,{children:"Chat"})}),(0,a.jsx)(ei.Z,{children:(0,a.jsxs)(er.Z,{children:[(0,a.jsx)("div",{className:"sm:max-w-2xl",children:(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsx)(_.Z,{children:"API Key"}),(0,a.jsx)(j.Z,{placeholder:"Type API Key here",type:"password",onValueChange:o,value:i})]}),(0,a.jsxs)(h.Z,{className:"mx-2",children:[(0,a.jsx)(_.Z,{children:"Select Model:"}),(0,a.jsx)(v.default,{placeholder:"Select a Model",onChange:e=>{console.log("selected ".concat(e)),f(e)},options:y,style:{width:"200px"}})]})]})}),(0,a.jsxs)(D.Z,{className:"mt-5",style:{display:"block",maxHeight:"60vh",overflowY:"auto"},children:[(0,a.jsx)(V.Z,{children:(0,a.jsx)(z.Z,{children:(0,a.jsx)(U.Z,{})})}),(0,a.jsx)(L.Z,{children:m.map((e,l)=>(0,a.jsx)(z.Z,{children:(0,a.jsx)(U.Z,{children:"".concat(e.role,": ").concat(e.content)})},l))})]}),(0,a.jsx)("div",{className:"mt-3",style:{position:"absolute",bottom:5,width:"95%"},children:(0,a.jsxs)("div",{className:"flex",children:[(0,a.jsx)(j.Z,{type:"text",value:d,onChange:e=>c(e.target.value),onKeyDown:e=>{"Enter"===e.key&&k()},placeholder:"Type your message..."}),(0,a.jsx)(p.Z,{onClick:k,className:"ml-2",children:"Send"})]})})]})})]})})})})},e9=s(33509),e7=s(95781);let{Sider:le}=e9.default;var ll=e=>{let{setPage:l,userRole:s,defaultSelectedKey:t}=e;return"Admin Viewer"==s?(0,a.jsx)(e9.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,a.jsx)(le,{width:120,children:(0,a.jsxs)(e7.Z,{mode:"inline",defaultSelectedKeys:t||["4"],style:{height:"100%",borderRight:0},children:[(0,a.jsx)(e7.Z.Item,{onClick:()=>l("usage"),children:"Usage"},"1"),(0,a.jsx)(e7.Z.Item,{onClick:()=>l("caching"),children:(0,a.jsx)(_.Z,{children:"Caching"})},"9")]})})}):(0,a.jsx)(e9.default,{style:{minHeight:"100vh",maxWidth:"145px"},children:(0,a.jsx)(le,{width:145,children:(0,a.jsxs)(e7.Z,{mode:"inline",defaultSelectedKeys:t||["1"],style:{height:"100%",borderRight:0},children:[(0,a.jsx)(e7.Z.Item,{onClick:()=>l("api-keys"),children:(0,a.jsx)(_.Z,{children:"Virtual Keys"})},"1"),(0,a.jsx)(e7.Z.Item,{onClick:()=>l("llm-playground"),children:(0,a.jsx)(_.Z,{children:"Test Key"})},"3"),"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("models"),children:(0,a.jsx)(_.Z,{children:"Models"})},"2"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("usage"),children:(0,a.jsx)(_.Z,{children:"Usage"})},"4"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("teams"),children:(0,a.jsx)(_.Z,{children:"Teams"})},"6"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("users"),children:(0,a.jsx)(_.Z,{children:"Internal Users"})},"5"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("settings"),children:(0,a.jsx)(_.Z,{children:"Logging & Alerts"})},"8"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("caching"),children:(0,a.jsx)(_.Z,{children:"Caching"})},"9"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("budgets"),children:(0,a.jsx)(_.Z,{children:"Budgets"})},"10"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("general-settings"),children:(0,a.jsx)(_.Z,{children:"Router Settings"})},"11"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("admin-panel"),children:(0,a.jsx)(_.Z,{children:"Admin Settings"})},"12"):null,(0,a.jsx)(e7.Z.Item,{onClick:()=>l("api_ref"),children:(0,a.jsx)(_.Z,{children:"API Reference"})},"13"),(0,a.jsx)(e7.Z.Item,{onClick:()=>l("model-hub"),children:(0,a.jsx)(_.Z,{children:"Model Hub"})},"15")]})})})},ls=s(67989),lt=s(52703);console.log("process.env.NODE_ENV","production"),console.log=function(){};var ln=e=>{let{accessToken:l,token:s,userRole:t,userID:n,keys:i,premiumUser:o}=e,d=new Date,[c,m]=(0,r.useState)([]),[j,g]=(0,r.useState)([]),[Z,f]=(0,r.useState)([]),[b,v]=(0,r.useState)([]),[S,k]=(0,r.useState)([]),[w,N]=(0,r.useState)([]),[I,A]=(0,r.useState)([]),[C,P]=(0,r.useState)([]),[T,E]=(0,r.useState)([]),[O,R]=(0,r.useState)([]),[M,W]=(0,r.useState)({}),[H,Y]=(0,r.useState)([]),[J,X]=(0,r.useState)(""),[$,Q]=(0,r.useState)(["all-tags"]),[ee,eu]=(0,r.useState)({from:new Date(Date.now()-6048e5),to:new Date}),eh=new Date(d.getFullYear(),d.getMonth(),1),ex=new Date(d.getFullYear(),d.getMonth()+1,0),ep=e_(eh),ej=e_(ex);function eg(e){return new Intl.NumberFormat("en-US",{maximumFractionDigits:0,notation:"compact",compactDisplay:"short"}).format(e)}console.log("keys in usage",i),console.log("premium user in usage",o),(0,r.useEffect)(()=>{ef(ee.from,ee.to)},[ee,$]);let eZ=async(e,s,t)=>{if(!e||!s||!l)return;s.setHours(23,59,59,999),e.setHours(0,0,0,0),console.log("uiSelectedKey",t);let n=await (0,u.b1)(l,t,e.toISOString(),s.toISOString());console.log("End user data updated successfully",n),v(n)},ef=async(e,s)=>{e&&s&&l&&(s.setHours(23,59,59,999),e.setHours(0,0,0,0),N((await (0,u.J$)(l,e.toISOString(),s.toISOString(),0===$.length?void 0:$)).spend_per_tag),console.log("Tag spend data updated successfully"))};function e_(e){let l=e.getFullYear(),s=e.getMonth()+1,t=e.getDate();return"".concat(l,"-").concat(s<10?"0"+s:s,"-").concat(t<10?"0"+t:t)}return console.log("Start date is ".concat(ep)),console.log("End date is ".concat(ej)),(0,r.useEffect)(()=>{l&&s&&t&&n&&(async()=>{try{if(console.log("user role: ".concat(t)),"Admin"==t||"Admin Viewer"==t){var e,a;let t=await (0,u.FC)(l);m(t);let n=await (0,u.OU)(l,s,ep,ej);console.log("provider_spend",n),R(n);let r=(await (0,u.tN)(l)).map(e=>({key:(e.key_alias||e.key_name||e.api_key).substring(0,10),spend:e.total_spend}));g(r);let i=(await (0,u.Au)(l)).map(e=>({key:e.model,spend:e.total_spend}));f(i);let o=await (0,u.mR)(l);console.log("teamSpend",o),k(o.daily_spend),P(o.teams);let d=o.total_spend_per_team;d=d.map(e=>(e.name=e.team_id||"",e.value=e.total_spend||0,e.value=e.value.toFixed(2),e)),E(d);let c=await (0,u.X)(l);A(c.tag_names);let h=await (0,u.J$)(l,null===(e=ee.from)||void 0===e?void 0:e.toISOString(),null===(a=ee.to)||void 0===a?void 0:a.toISOString(),void 0);N(h.spend_per_tag);let x=await (0,u.b1)(l,null,void 0,void 0);v(x),console.log("spend/user result",x);let p=await (0,u.wd)(l,ep,ej);W(p);let j=await (0,u.xA)(l,ep,ej);console.log("global activity per model",j),Y(j)}else"App Owner"==t&&await (0,u.HK)(l,s,t,n,ep,ej).then(async e=>{if(console.log("result from spend logs call",e),"daily_spend"in e){let l=e.daily_spend;console.log("daily spend",l),m(l);let s=e.top_api_keys;g(s)}else{let s=(await (0,u.e2)(l,function(e){let l=[];e.forEach(e=>{Object.entries(e).forEach(e=>{let[s,t]=e;"spend"!==s&&"startTime"!==s&&"models"!==s&&"users"!==s&&l.push({key:s,spend:t})})}),l.sort((e,l)=>Number(l.spend)-Number(e.spend));let s=l.slice(0,5).map(e=>e.key);return console.log("topKeys: ".concat(Object.keys(s[0]))),s}(e))).info.map(e=>({key:(e.key_name||e.key_alias).substring(0,10),spend:e.spend}));g(s),m(e)}})}catch(e){console.error("There was an error fetching the data",e)}})()},[l,s,t,n,ep,ej]),(0,a.jsx)("div",{style:{width:"100%"},className:"p-8",children:(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{className:"mt-2",children:[(0,a.jsx)(et.Z,{children:"All Up"}),(0,a.jsx)(et.Z,{children:"Team Based Usage"}),(0,a.jsx)(et.Z,{children:"Customer Usage"}),(0,a.jsx)(et.Z,{children:"Tag Based Usage"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{variant:"solid",className:"mt-1",children:[(0,a.jsx)(et.Z,{children:"Cost"}),(0,a.jsx)(et.Z,{children:"Activity"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsxs)(x.Z,{numItems:2,className:"gap-2 h-[100vh] w-full",children:[(0,a.jsx)(G,{userID:n,userRole:t,accessToken:l,userSpend:null,selectedTeam:null}),(0,a.jsx)(h.Z,{numColSpan:2,children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Monthly Spend"}),(0,a.jsx)(em.Z,{data:c,index:"date",categories:["spend"],colors:["blue"],valueFormatter:e=>"$ ".concat(new Intl.NumberFormat("us").format(e).toString()),yAxisWidth:100,tickGap:5})]})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Top API Keys"}),(0,a.jsx)(em.Z,{className:"mt-4 h-40",data:j,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:80,tickGap:5,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Top Models"}),(0,a.jsx)(em.Z,{className:"mt-4 h-40",data:Z,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,a.jsx)(h.Z,{numColSpan:1}),(0,a.jsx)(h.Z,{numColSpan:2,children:(0,a.jsxs)(F.Z,{className:"mb-2",children:[(0,a.jsx)(y.Z,{children:"✨ Spend by Provider"}),o?(0,a.jsx)(a.Fragment,{children:(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsx)(lt.Z,{className:"mt-4 h-40",variant:"pie",data:O,index:"provider",category:"spend"})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Provider"}),(0,a.jsx)(q.Z,{children:"Spend"})]})}),(0,a.jsx)(L.Z,{children:O.map(e=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.provider}),(0,a.jsx)(U.Z,{children:1e-5>parseFloat(e.spend.toFixed(2))?"less than 0.00":e.spend.toFixed(2)})]},e.provider))})]})})]})}):(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"mb-2 text-gray-500 italic text-[12px]",children:"Upgrade to use this feature"}),(0,a.jsx)(p.Z,{variant:"primary",className:"mb-2",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get Free Trial"})})]})]})})]})}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 h-[75vh] w-full",children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"All Up"}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["API Requests ",eg(M.sum_api_requests)]}),(0,a.jsx)(ec.Z,{className:"h-40",data:M.daily_data,valueFormatter:eg,index:"date",colors:["cyan"],categories:["api_requests"],onValueChange:e=>console.log(e)})]}),(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Tokens ",eg(M.sum_total_tokens)]}),(0,a.jsx)(em.Z,{className:"h-40",data:M.daily_data,valueFormatter:eg,index:"date",colors:["cyan"],categories:["total_tokens"],onValueChange:e=>console.log(e)})]})]})]}),o?(0,a.jsx)(a.Fragment,{children:H.map((e,l)=>(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:e.model}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["API Requests ",eg(e.sum_api_requests)]}),(0,a.jsx)(ec.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["cyan"],categories:["api_requests"],valueFormatter:eg,onValueChange:e=>console.log(e)})]}),(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Tokens ",eg(e.sum_total_tokens)]}),(0,a.jsx)(em.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["cyan"],categories:["total_tokens"],valueFormatter:eg,onValueChange:e=>console.log(e)})]})]})]},l))}):(0,a.jsx)(a.Fragment,{children:H&&H.length>0&&H.slice(0,1).map((e,l)=>(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"✨ Activity by Model"}),(0,a.jsx)("p",{className:"mb-2 text-gray-500 italic text-[12px]",children:"Upgrade to see analytics for all models"}),(0,a.jsx)(p.Z,{variant:"primary",className:"mb-2",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get Free Trial"})}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:e.model}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["API Requests ",eg(e.sum_api_requests)]}),(0,a.jsx)(ec.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["cyan"],categories:["api_requests"],valueFormatter:eg,onValueChange:e=>console.log(e)})]}),(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Tokens ",eg(e.sum_total_tokens)]}),(0,a.jsx)(em.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["cyan"],valueFormatter:eg,categories:["total_tokens"],onValueChange:e=>console.log(e)})]})]})]})]},l))})]})})]})]})}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(x.Z,{numItems:2,className:"gap-2 h-[75vh] w-full",children:[(0,a.jsxs)(h.Z,{numColSpan:2,children:[(0,a.jsxs)(F.Z,{className:"mb-2",children:[(0,a.jsx)(y.Z,{children:"Total Spend Per Team"}),(0,a.jsx)(ls.Z,{data:T})]}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Daily Spend Per Team"}),(0,a.jsx)(em.Z,{className:"h-72",data:S,showLegend:!0,index:"date",categories:C,yAxisWidth:80,stack:!0})]})]}),(0,a.jsx)(h.Z,{numColSpan:2})]})}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)("p",{className:"mb-2 text-gray-500 italic text-[12px]",children:["Customers of your LLM API calls. Tracked when a `user` param is passed in your LLM calls ",(0,a.jsx)("a",{className:"text-blue-500",href:"https://docs.litellm.ai/docs/proxy/users",target:"_blank",children:"docs here"})]}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsx)(_.Z,{children:"Select Time Range"}),(0,a.jsx)(es.Z,{enableSelect:!0,value:ee,onValueChange:e=>{eu(e),eZ(e.from,e.to,null)}})]}),(0,a.jsxs)(h.Z,{children:[(0,a.jsx)(_.Z,{children:"Select Key"}),(0,a.jsxs)(B.Z,{defaultValue:"all-keys",children:[(0,a.jsx)(K.Z,{value:"all-keys",onClick:()=>{eZ(ee.from,ee.to,null)},children:"All Keys"},"all-keys"),null==i?void 0:i.map((e,l)=>e&&null!==e.key_alias&&e.key_alias.length>0?(0,a.jsx)(K.Z,{value:String(l),onClick:()=>{eZ(ee.from,ee.to,e.token)},children:e.key_alias},l):null)]})]})]}),(0,a.jsx)(F.Z,{className:"mt-4",children:(0,a.jsxs)(D.Z,{className:"max-h-[70vh] min-h-[500px]",children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Customer"}),(0,a.jsx)(q.Z,{children:"Spend"}),(0,a.jsx)(q.Z,{children:"Total Events"})]})}),(0,a.jsx)(L.Z,{children:null==b?void 0:b.map((e,l)=>{var s;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.end_user}),(0,a.jsx)(U.Z,{children:null===(s=e.total_spend)||void 0===s?void 0:s.toFixed(4)}),(0,a.jsx)(U.Z,{children:e.total_count})]},l)})})]})})]}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsx)(es.Z,{className:"mb-4",enableSelect:!0,value:ee,onValueChange:e=>{eu(e),ef(e.from,e.to)}})}),(0,a.jsx)(h.Z,{children:o?(0,a.jsx)("div",{children:(0,a.jsxs)(eo.Z,{value:$,onValueChange:e=>Q(e),children:[(0,a.jsx)(ed.Z,{value:"all-tags",onClick:()=>Q(["all-tags"]),children:"All Tags"},"all-tags"),I&&I.filter(e=>"all-tags"!==e).map((e,l)=>(0,a.jsx)(ed.Z,{value:String(e),children:e},e))]})}):(0,a.jsx)("div",{children:(0,a.jsxs)(eo.Z,{value:$,onValueChange:e=>Q(e),children:[(0,a.jsx)(ed.Z,{value:"all-tags",onClick:()=>Q(["all-tags"]),children:"All Tags"},"all-tags"),I&&I.filter(e=>"all-tags"!==e).map((e,l)=>(0,a.jsxs)(K.Z,{value:String(e),disabled:!0,children:["✨ ",e," (Enterprise only Feature)"]},e))]})})})]}),(0,a.jsxs)(x.Z,{numItems:2,className:"gap-2 h-[75vh] w-full mb-4",children:[(0,a.jsx)(h.Z,{numColSpan:2,children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Spend Per Tag"}),(0,a.jsxs)(_.Z,{children:["Get Started Tracking cost per tag ",(0,a.jsx)("a",{className:"text-blue-500",href:"https://docs.litellm.ai/docs/proxy/cost_tracking",target:"_blank",children:"here"})]}),(0,a.jsx)(em.Z,{className:"h-72",data:w,index:"name",categories:["spend"],colors:["blue"]})]})}),(0,a.jsx)(h.Z,{numColSpan:2})]})]})]})]})})};let la=e=>{if(e)return e.toISOString().split("T")[0]};function lr(e){return new Intl.NumberFormat("en-US",{maximumFractionDigits:0,notation:"compact",compactDisplay:"short"}).format(e)}var li=e=>{let{accessToken:l,token:s,userRole:t,userID:n,premiumUser:i}=e,[o,d]=(0,r.useState)([]),[c,m]=(0,r.useState)([]),[p,j]=(0,r.useState)([]),[g,Z]=(0,r.useState)([]),[f,_]=(0,r.useState)("0"),[y,b]=(0,r.useState)("0"),[v,S]=(0,r.useState)("0"),[k,w]=(0,r.useState)({from:new Date(Date.now()-6048e5),to:new Date});(0,r.useEffect)(()=>{l&&k&&(async()=>{Z(await (0,u.zg)(l,la(k.from),la(k.to)))})()},[l]);let N=Array.from(new Set(g.map(e=>{var l;return null!==(l=null==e?void 0:e.api_key)&&void 0!==l?l:""}))),I=Array.from(new Set(g.map(e=>{var l;return null!==(l=null==e?void 0:e.model)&&void 0!==l?l:""})));Array.from(new Set(g.map(e=>{var l;return null!==(l=null==e?void 0:e.call_type)&&void 0!==l?l:""})));let A=async(e,s)=>{e&&s&&l&&(s.setHours(23,59,59,999),e.setHours(0,0,0,0),Z(await (0,u.zg)(l,la(e),la(s))))};return(0,r.useEffect)(()=>{console.log("DATA IN CACHE DASHBOARD",g);let e=g;c.length>0&&(e=e.filter(e=>c.includes(e.api_key))),p.length>0&&(e=e.filter(e=>p.includes(e.model))),console.log("before processed data in cache dashboard",e);let l=0,s=0,t=0,n=e.reduce((e,n)=>{console.log("Processing item:",n),n.call_type||(console.log("Item has no call_type:",n),n.call_type="Unknown"),l+=(n.total_rows||0)-(n.cache_hit_true_rows||0),s+=n.cache_hit_true_rows||0,t+=n.cached_completion_tokens||0;let a=e.find(e=>e.name===n.call_type);return a?(a["LLM API requests"]+=(n.total_rows||0)-(n.cache_hit_true_rows||0),a["Cache hit"]+=n.cache_hit_true_rows||0,a["Cached Completion Tokens"]+=n.cached_completion_tokens||0,a["Generated Completion Tokens"]+=n.generated_completion_tokens||0):e.push({name:n.call_type,"LLM API requests":(n.total_rows||0)-(n.cache_hit_true_rows||0),"Cache hit":n.cache_hit_true_rows||0,"Cached Completion Tokens":n.cached_completion_tokens||0,"Generated Completion Tokens":n.generated_completion_tokens||0}),e},[]);_(lr(s)),b(lr(t));let a=s+l;a>0?S((s/a*100).toFixed(2)):S("0"),d(n),console.log("PROCESSED DATA IN CACHE DASHBOARD",n)},[c,p,k,g]),(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(x.Z,{numItems:3,className:"gap-4 mt-4",children:[(0,a.jsx)(h.Z,{children:(0,a.jsx)(eo.Z,{placeholder:"Select API Keys",value:c,onValueChange:m,children:N.map(e=>(0,a.jsx)(ed.Z,{value:e,children:e},e))})}),(0,a.jsx)(h.Z,{children:(0,a.jsx)(eo.Z,{placeholder:"Select Models",value:p,onValueChange:j,children:I.map(e=>(0,a.jsx)(ed.Z,{value:e,children:e},e))})}),(0,a.jsx)(h.Z,{children:(0,a.jsx)(es.Z,{enableSelect:!0,value:k,onValueChange:e=>{w(e),A(e.from,e.to)},selectPlaceholder:"Select date range"})})]}),(0,a.jsxs)("div",{className:"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3 mt-4",children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Cache Hit Ratio"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsxs)("p",{className:"text-tremor-metric font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:[v,"%"]})})]}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Cache Hits"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor-metric font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:f})})]}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Cached Tokens"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor-metric font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:y})})]})]}),(0,a.jsx)(el.Z,{className:"mt-4",children:"Cache Hits vs API Requests"}),(0,a.jsx)(em.Z,{title:"Cache Hits vs API Requests",data:o,stack:!0,index:"name",valueFormatter:lr,categories:["LLM API requests","Cache hit"],colors:["sky","teal"],yAxisWidth:48}),(0,a.jsx)(el.Z,{className:"mt-4",children:"Cached Completion Tokens vs Generated Completion Tokens"}),(0,a.jsx)(em.Z,{className:"mt-6",data:o,stack:!0,index:"name",valueFormatter:lr,categories:["Generated Completion Tokens","Cached Completion Tokens"],colors:["sky","teal"],yAxisWidth:48})]})},lo=()=>{let{Title:e,Paragraph:l}=Q.default,[s,t]=(0,r.useState)(""),[n,o]=(0,r.useState)(!1),[d,c]=(0,r.useState)(null),[h,x]=(0,r.useState)(null),[p,j]=(0,r.useState)(null),[g,Z]=(0,r.useState)({PROXY_BASE_URL:"",PROXY_LOGOUT_URL:""}),[f,_]=(0,r.useState)(!0),y=(0,i.useSearchParams)(),[b,v]=(0,r.useState)({data:[]}),S=y.get("userID"),k=y.get("invitation_id"),w=function(e){console.log("COOKIES",document.cookie);let l=document.cookie.split("; ").find(l=>l.startsWith(e+"="));return l?l.split("=")[1]:null}("token"),[N,I]=(0,r.useState)("api-keys"),[A,C]=(0,r.useState)(null);return(0,r.useEffect)(()=>{if(w){let e=(0,$.o)(w);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),C(e.key),e.user_role){let l=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e.toLowerCase())),console.log("Received user role length: ".concat(e.toLowerCase().length)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"internal_user":return"Internal User";case"internal_viewer":return"Internal Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",l),t(l),"Admin Viewer"==l&&I("usage")}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e)),e.login_method?_("username_password"==e.login_method):console.log("User Email is not set ".concat(e)),e.premium_user&&o(e.premium_user),e.auth_header_name&&(0,u.K8)(e.auth_header_name)}}},[w]),(0,a.jsx)(r.Suspense,{fallback:(0,a.jsx)("div",{children:"Loading..."}),children:k?(0,a.jsx)(ee,{userID:S,userRole:s,teams:h,keys:p,setUserRole:t,userEmail:d,setUserEmail:c,setTeams:x,setKeys:j,setProxySettings:Z,proxySettings:g}):(0,a.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,a.jsx)(m,{userID:S,userRole:s,userEmail:d,showSSOBanner:f,premiumUser:n,setProxySettings:Z,proxySettings:g}),(0,a.jsxs)("div",{className:"flex flex-1 overflow-auto",children:[(0,a.jsx)("div",{className:"mt-8",children:(0,a.jsx)(ll,{setPage:I,userRole:s,defaultSelectedKey:null})}),"api-keys"==N?(0,a.jsx)(ee,{userID:S,userRole:s,teams:h,keys:p,setUserRole:t,userEmail:d,setUserEmail:c,setTeams:x,setKeys:j,setProxySettings:Z,proxySettings:g}):"models"==N?(0,a.jsx)(eT,{userID:S,userRole:s,token:w,keys:p,accessToken:A,modelData:b,setModelData:v,premiumUser:n}):"llm-playground"==N?(0,a.jsx)(e6,{userID:S,userRole:s,token:w,accessToken:A}):"users"==N?(0,a.jsx)(eM,{userID:S,userRole:s,token:w,keys:p,teams:h,accessToken:A,setKeys:j}):"teams"==N?(0,a.jsx)(eD,{teams:h,setTeams:x,searchParams:y,accessToken:A,userID:S,userRole:s}):"admin-panel"==N?(0,a.jsx)(eL,{setTeams:x,searchParams:y,accessToken:A,showSSOBanner:f,premiumUser:n}):"api_ref"==N?(0,a.jsx)(e8,{proxySettings:g}):"settings"==N?(0,a.jsx)(eH,{userID:S,userRole:s,accessToken:A,premiumUser:n}):"budgets"==N?(0,a.jsx)(e4,{accessToken:A}):"general-settings"==N?(0,a.jsx)(e0,{userID:S,userRole:s,accessToken:A,modelData:b}):"model-hub"==N?(0,a.jsx)(e5.Z,{accessToken:A,publicPage:!1,premiumUser:n}):"caching"==N?(0,a.jsx)(li,{userID:S,userRole:s,token:w,accessToken:A,premiumUser:n}):(0,a.jsx)(ln,{userID:S,userRole:s,token:w,accessToken:A,keys:p,premiumUser:n})]})]})})}},41134:function(e,l,s){"use strict";s.d(l,{Z:function(){return y}});var t=s(3827),n=s(64090),a=s(47907),r=s(777),i=s(16450),o=s(13810),d=s(92836),c=s(26734),m=s(41608),u=s(32126),h=s(23682),x=s(71801),p=s(42440),j=s(84174),g=s(50459),Z=s(6180),f=s(99129),_=s(67951),y=e=>{var l;let{accessToken:s,publicPage:y,premiumUser:b}=e,[v,S]=(0,n.useState)(!1),[k,w]=(0,n.useState)(null),[N,I]=(0,n.useState)(!1),[A,C]=(0,n.useState)(!1),[P,T]=(0,n.useState)(null),E=(0,a.useRouter)();(0,n.useEffect)(()=>{s&&(async()=>{try{let e=await (0,r.kn)(s);console.log("ModelHubData:",e),w(e.data),(0,r.E9)(s,"enable_public_model_hub").then(e=>{console.log("data: ".concat(JSON.stringify(e))),!0==e.field_value&&S(!0)}).catch(e=>{})}catch(e){console.error("There was an error fetching the model data",e)}})()},[s,y]);let O=e=>{T(e),I(!0)},R=async()=>{s&&(0,r.jA)(s,"enable_public_model_hub",!0).then(e=>{C(!0)})},F=()=>{I(!1),C(!1),T(null)},M=()=>{I(!1),C(!1),T(null)},D=e=>{navigator.clipboard.writeText(e)};return(0,t.jsxs)("div",{children:[y&&v||!1==y?(0,t.jsxs)("div",{className:"w-full m-2 mt-2 p-8",children:[(0,t.jsx)("div",{className:"relative w-full"}),(0,t.jsxs)("div",{className:"flex ".concat(y?"justify-between":"items-center"),children:[(0,t.jsx)(p.Z,{className:"ml-8 text-center ",children:"Model Hub"}),!1==y?b?(0,t.jsx)(i.Z,{className:"ml-4",onClick:()=>R(),children:"✨ Make Public"}):(0,t.jsx)(i.Z,{className:"ml-4",children:(0,t.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"✨ Make Public"})}):(0,t.jsxs)("div",{className:"flex justify-between items-center",children:[(0,t.jsx)("p",{children:"Filter by key:"}),(0,t.jsx)(x.Z,{className:"bg-gray-200 pr-2 pl-2 pt-1 pb-1 text-center",children:"/ui/model_hub?key="})]})]}),(0,t.jsx)("div",{className:"grid grid-cols-2 gap-6 sm:grid-cols-3 lg:grid-cols-4 pr-8",children:k&&k.map(e=>(0,t.jsxs)(o.Z,{className:"mt-5 mx-8",children:[(0,t.jsxs)("pre",{className:"flex justify-between",children:[(0,t.jsx)(p.Z,{children:e.model_group}),(0,t.jsx)(Z.Z,{title:e.model_group,children:(0,t.jsx)(j.Z,{onClick:()=>D(e.model_group),style:{cursor:"pointer",marginRight:"10px"}})})]}),(0,t.jsxs)("div",{className:"my-5",children:[(0,t.jsxs)(x.Z,{children:["Mode: ",e.mode]}),(0,t.jsxs)(x.Z,{children:["Supports Function Calling:"," ",(null==e?void 0:e.supports_function_calling)==!0?"Yes":"No"]}),(0,t.jsxs)(x.Z,{children:["Supports Vision:"," ",(null==e?void 0:e.supports_vision)==!0?"Yes":"No"]}),(0,t.jsxs)(x.Z,{children:["Max Input Tokens:"," ",(null==e?void 0:e.max_input_tokens)?null==e?void 0:e.max_input_tokens:"N/A"]}),(0,t.jsxs)(x.Z,{children:["Max Output Tokens:"," ",(null==e?void 0:e.max_output_tokens)?null==e?void 0:e.max_output_tokens:"N/A"]})]}),(0,t.jsx)("div",{style:{marginTop:"auto",textAlign:"right"},children:(0,t.jsxs)("a",{href:"#",onClick:()=>O(e),style:{color:"#1890ff",fontSize:"smaller"},children:["View more ",(0,t.jsx)(g.Z,{})]})})]},e.model_group))})]}):(0,t.jsxs)(o.Z,{className:"mx-auto max-w-xl mt-10",children:[(0,t.jsx)(x.Z,{className:"text-xl text-center mb-2 text-black",children:"Public Model Hub not enabled."}),(0,t.jsx)("p",{className:"text-base text-center text-slate-800",children:"Ask your proxy admin to enable this on their Admin UI."})]}),(0,t.jsx)(f.Z,{title:"Public Model Hub",width:600,visible:A,footer:null,onOk:F,onCancel:M,children:(0,t.jsxs)("div",{className:"pt-5 pb-5",children:[(0,t.jsxs)("div",{className:"flex justify-between mb-4",children:[(0,t.jsx)(x.Z,{className:"text-base mr-2",children:"Shareable Link:"}),(0,t.jsx)(x.Z,{className:"max-w-sm ml-2 bg-gray-200 pr-2 pl-2 pt-1 pb-1 text-center rounded",children:"/ui/model_hub?key="})]}),(0,t.jsx)("div",{className:"flex justify-end",children:(0,t.jsx)(i.Z,{onClick:()=>{E.replace("/model_hub?key=".concat(s))},children:"See Page"})})]})}),(0,t.jsx)(f.Z,{title:P&&P.model_group?P.model_group:"Unknown Model",width:800,visible:N,footer:null,onOk:F,onCancel:M,children:P&&(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"mb-4",children:(0,t.jsx)("strong",{children:"Model Information & Usage"})}),(0,t.jsxs)(c.Z,{children:[(0,t.jsxs)(m.Z,{children:[(0,t.jsx)(d.Z,{children:"OpenAI Python SDK"}),(0,t.jsx)(d.Z,{children:"Supported OpenAI Params"}),(0,t.jsx)(d.Z,{children:"LlamaIndex"}),(0,t.jsx)(d.Z,{children:"Langchain Py"})]}),(0,t.jsxs)(h.Z,{children:[(0,t.jsx)(u.Z,{children:(0,t.jsx)(_.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="http://0.0.0.0:4000" # LiteLLM Proxy is OpenAI compatible, Read More: https://docs.litellm.ai/docs/proxy/user_keys\n)\n\nresponse = client.chat.completions.create(\n model="'.concat(P.model_group,'", # model to send to the proxy\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ]\n)\n\nprint(response)\n ')})}),(0,t.jsx)(u.Z,{children:(0,t.jsx)(_.Z,{language:"python",children:"".concat(null===(l=P.supported_openai_params)||void 0===l?void 0:l.map(e=>"".concat(e,"\n")).join(""))})}),(0,t.jsx)(u.Z,{children:(0,t.jsx)(_.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="'.concat(P.model_group,'", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="http://0.0.0.0:4000", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="http://0.0.0.0:4000",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n ')})}),(0,t.jsx)(u.Z,{children:(0,t.jsx)(_.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="http://0.0.0.0:4000",\n model = "'.concat(P.model_group,'",\n temperature=0.1\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n ')})})]})]})]})})]})}}},function(e){e.O(0,[665,936,294,131,684,759,777,971,69,744],function(){return e(e.s=20661)}),_N_E=e.O()}]);
\ No newline at end of file
diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/app/page-cab98591303c1c5d.js b/litellm/proxy/_experimental/out/_next/static/chunks/app/page-cab98591303c1c5d.js
deleted file mode 100644
index 734635fd2e9..00000000000
--- a/litellm/proxy/_experimental/out/_next/static/chunks/app/page-cab98591303c1c5d.js
+++ /dev/null
@@ -1 +0,0 @@
-(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{20661:function(e,l,s){Promise.resolve().then(s.bind(s,48951))},667:function(e,l,s){"use strict";s.r(l),s.d(l,{default:function(){return f}});var t=s(3827),n=s(64090),a=s(47907),r=s(16450),i=s(18190),o=s(13810),d=s(10384),c=s(46453),m=s(71801),u=s(52273),h=s(42440),x=s(30953),p=s(777),j=s(37963),g=s(60620),Z=s(1861);function f(){let[e]=g.Z.useForm(),l=(0,a.useSearchParams)();!function(e){console.log("COOKIES",document.cookie);let l=document.cookie.split("; ").find(l=>l.startsWith(e+"="));l&&l.split("=")[1]}("token");let s=l.get("invitation_id"),[f,_]=(0,n.useState)(null),[y,b]=(0,n.useState)(""),[v,k]=(0,n.useState)(""),[S,w]=(0,n.useState)(null),[N,I]=(0,n.useState)(""),[A,C]=(0,n.useState)("");return(0,n.useEffect)(()=>{s&&(0,p.W_)(s).then(e=>{let l=e.login_url;console.log("login_url:",l),I(l);let s=e.token,t=(0,j.o)(s);C(s),console.log("decoded:",t),_(t.key),console.log("decoded user email:",t.user_email),k(t.user_email),w(t.user_id)})},[s]),(0,t.jsx)("div",{className:"mx-auto w-full max-w-md mt-10",children:(0,t.jsxs)(o.Z,{children:[(0,t.jsx)(h.Z,{className:"text-sm mb-5 text-center",children:"\uD83D\uDE85 LiteLLM"}),(0,t.jsx)(h.Z,{className:"text-xl",children:"Sign up"}),(0,t.jsx)(m.Z,{children:"Claim your user account to login to Admin UI."}),(0,t.jsx)(i.Z,{className:"mt-4",title:"SSO",icon:x.GH$,color:"sky",children:(0,t.jsxs)(c.Z,{numItems:2,className:"flex justify-between items-center",children:[(0,t.jsx)(d.Z,{children:"SSO is under the Enterprise Tirer."}),(0,t.jsx)(d.Z,{children:(0,t.jsx)(r.Z,{variant:"primary",className:"mb-2",children:(0,t.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get Free Trial"})})})]})}),(0,t.jsxs)(g.Z,{className:"mt-10 mb-5 mx-auto",layout:"vertical",onFinish:e=>{console.log("in handle submit. accessToken:",f,"token:",A,"formValues:",e),f&&A&&(e.user_email=v,S&&s&&(0,p.m_)(f,s,S,e.password).then(e=>{var l;let s="/ui/";s+="?userID="+((null===(l=e.data)||void 0===l?void 0:l.user_id)||e.user_id),document.cookie="token="+A,console.log("redirecting to:",s),window.location.href=s}))},children:[(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(g.Z.Item,{label:"Email Address",name:"user_email",children:(0,t.jsx)(u.Z,{type:"email",disabled:!0,value:v,defaultValue:v,className:"max-w-md"})}),(0,t.jsx)(g.Z.Item,{label:"Password",name:"password",rules:[{required:!0,message:"password required to sign up"}],help:"Create a password for your account",children:(0,t.jsx)(u.Z,{placeholder:"",type:"password",className:"max-w-md"})})]}),(0,t.jsx)("div",{className:"mt-10",children:(0,t.jsx)(Z.ZP,{htmlType:"submit",children:"Sign Up"})})]})]})})}},48951:function(e,l,s){"use strict";s.r(l),s.d(l,{default:function(){return lo}});var t,n,a=s(3827),r=s(64090),i=s(47907),o=s(8792),d=s(40491),c=s(65270),m=e=>{let{userID:l,userRole:s,userEmail:t,showSSOBanner:n,premiumUser:r,setProxySettings:i,proxySettings:m}=e;console.log("User ID:",l),console.log("userEmail:",t),console.log("showSSOBanner:",n),console.log("premiumUser:",r);let u="";console.log("PROXY_settings=",m),m&&m.PROXY_LOGOUT_URL&&void 0!==m.PROXY_LOGOUT_URL&&(u=m.PROXY_LOGOUT_URL),console.log("logoutUrl=",u);let h=[{key:"1",label:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("p",{children:["Role: ",s]}),(0,a.jsxs)("p",{children:["ID: ",l]}),(0,a.jsxs)("p",{children:["Premium User: ",String(r)]})]})},{key:"2",label:(0,a.jsx)("p",{onClick:()=>{document.cookie="token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;",window.location.href=u},children:"Logout"})}];return(0,a.jsxs)("nav",{className:"left-0 right-0 top-0 flex justify-between items-center h-12 mb-4",children:[(0,a.jsx)("div",{className:"text-left my-2 absolute top-0 left-0",children:(0,a.jsx)("div",{className:"flex flex-col items-center",children:(0,a.jsx)(o.default,{href:"/",children:(0,a.jsx)("button",{className:"text-gray-800 rounded text-center",children:(0,a.jsx)("img",{src:"/get_image",width:160,height:160,alt:"LiteLLM Brand",className:"mr-2"})})})})}),(0,a.jsxs)("div",{className:"text-right mx-4 my-2 absolute top-0 right-0 flex items-center justify-end space-x-2",children:[n?(0,a.jsx)("div",{style:{padding:"6px",borderRadius:"8px"},children:(0,a.jsx)("a",{href:"https://calendly.com/d/4mp-gd3-k5k/litellm-1-1-onboarding-chat",target:"_blank",style:{fontSize:"14px",textDecoration:"underline"},children:"Get enterprise license"})}):null,(0,a.jsx)("div",{style:{border:"1px solid #391085",padding:"6px",borderRadius:"8px"},children:(0,a.jsx)(d.Z,{menu:{items:h},children:(0,a.jsx)(c.Z,{children:t})})})]})]})},u=s(777),h=s(10384),x=s(46453),p=s(16450),j=s(52273),g=s(26780),Z=s(15595),f=s(6698),_=s(71801),y=s(42440),b=s(42308),v=s(50670),k=s(60620),S=s(80588),w=s(99129),N=s(44839),I=s(88707),A=s(1861);let{Option:C}=v.default;var P=e=>{let{userID:l,team:s,userRole:t,accessToken:n,data:i,setData:o}=e,[d]=k.Z.useForm(),[c,m]=(0,r.useState)(!1),[P,T]=(0,r.useState)(null),[E,O]=(0,r.useState)(null),[R,F]=(0,r.useState)([]),[M,D]=(0,r.useState)([]),L=()=>{m(!1),d.resetFields()},U=()=>{m(!1),T(null),d.resetFields()};(0,r.useEffect)(()=>{(async()=>{try{if(null===l||null===t)return;if(null!==n){let e=(await (0,u.So)(n,l,t)).data.map(e=>e.id);console.log("available_model_names:",e),F(e)}}catch(e){console.error("Error fetching user models:",e)}})()},[n,l,t]);let V=async e=>{try{var s,t,a;let r=null!==(s=null==e?void 0:e.key_alias)&&void 0!==s?s:"",c=null!==(t=null==e?void 0:e.team_id)&&void 0!==t?t:null;if((null!==(a=null==i?void 0:i.filter(e=>e.team_id===c).map(e=>e.key_alias))&&void 0!==a?a:[]).includes(r))throw Error("Key alias ".concat(r," already exists for team with ID ").concat(c,", please provide another key alias"));S.ZP.info("Making API Call"),m(!0);let h=await (0,u.wX)(n,l,e);console.log("key create Response:",h),o(e=>e?[...e,h]:[h]),T(h.key),O(h.soft_budget),S.ZP.success("API Key Created"),d.resetFields(),localStorage.removeItem("userData"+l)}catch(e){console.error("Error creating the key:",e),S.ZP.error("Error creating the key: ".concat(e),20)}};return(0,r.useEffect)(()=>{D(s&&s.models.length>0?s.models.includes("all-proxy-models")?R:s.models:R)},[s,R]),(0,a.jsxs)("div",{children:[(0,a.jsx)(p.Z,{className:"mx-auto",onClick:()=>m(!0),children:"+ Create New Key"}),(0,a.jsx)(w.Z,{title:"Create Key",visible:c,width:800,footer:null,onOk:L,onCancel:U,children:(0,a.jsxs)(k.Z,{form:d,onFinish:V,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{label:"Key Name",name:"key_alias",rules:[{required:!0,message:"Please input a key name"}],help:"required",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(k.Z.Item,{label:"Team ID",name:"team_id",hidden:!0,initialValue:s?s.team_id:null,valuePropName:"team_id",className:"mt-8",children:(0,a.jsx)(N.Z,{value:s?s.team_alias:"",disabled:!0})}),(0,a.jsx)(k.Z.Item,{label:"Models",name:"models",rules:[{required:!0,message:"Please select a model"}],help:"required",children:(0,a.jsxs)(v.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},onChange:e=>{e.includes("all-team-models")&&d.setFieldsValue({models:["all-team-models"]})},children:[(0,a.jsx)(C,{value:"all-team-models",children:"All Team Models"},"all-team-models"),M.map(e=>(0,a.jsx)(C,{value:e,children:e},e))]})}),(0,a.jsxs)(g.Z,{className:"mt-20 mb-8",children:[(0,a.jsx)(f.Z,{children:(0,a.jsx)("b",{children:"Optional Settings"})}),(0,a.jsxs)(Z.Z,{children:[(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"Max Budget (USD)",name:"max_budget",help:"Budget cannot exceed team max budget: $".concat((null==s?void 0:s.max_budget)!==null&&(null==s?void 0:s.max_budget)!==void 0?null==s?void 0:s.max_budget:"unlimited"),rules:[{validator:async(e,l)=>{if(l&&s&&null!==s.max_budget&&l>s.max_budget)throw Error("Budget cannot exceed team max budget: $".concat(s.max_budget))}}],children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",help:"Team Reset Budget: ".concat((null==s?void 0:s.budget_duration)!==null&&(null==s?void 0:s.budget_duration)!==void 0?null==s?void 0:s.budget_duration:"None"),children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})}),(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"Tokens per minute Limit (TPM)",name:"tpm_limit",help:"TPM cannot exceed team TPM limit: ".concat((null==s?void 0:s.tpm_limit)!==null&&(null==s?void 0:s.tpm_limit)!==void 0?null==s?void 0:s.tpm_limit:"unlimited"),rules:[{validator:async(e,l)=>{if(l&&s&&null!==s.tpm_limit&&l>s.tpm_limit)throw Error("TPM limit cannot exceed team TPM limit: ".concat(s.tpm_limit))}}],children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"Requests per minute Limit (RPM)",name:"rpm_limit",help:"RPM cannot exceed team RPM limit: ".concat((null==s?void 0:s.rpm_limit)!==null&&(null==s?void 0:s.rpm_limit)!==void 0?null==s?void 0:s.rpm_limit:"unlimited"),rules:[{validator:async(e,l)=>{if(l&&s&&null!==s.rpm_limit&&l>s.rpm_limit)throw Error("RPM limit cannot exceed team RPM limit: ".concat(s.rpm_limit))}}],children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(k.Z.Item,{label:"Expire Key (eg: 30s, 30h, 30d)",name:"duration",className:"mt-8",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(k.Z.Item,{label:"Metadata",name:"metadata",className:"mt-8",children:(0,a.jsx)(N.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})})]})]})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Create Key"})})]})}),P&&(0,a.jsx)(w.Z,{visible:c,onOk:L,onCancel:U,footer:null,children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 w-full",children:[(0,a.jsx)(y.Z,{children:"Save your Key"}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)("p",{children:["Please save this secret key somewhere safe and accessible. For security reasons, ",(0,a.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]})}),(0,a.jsx)(h.Z,{numColSpan:1,children:null!=P?(0,a.jsxs)("div",{children:[(0,a.jsx)(_.Z,{className:"mt-3",children:"API Key:"}),(0,a.jsx)("div",{style:{background:"#f8f8f8",padding:"10px",borderRadius:"5px",marginBottom:"10px"},children:(0,a.jsx)("pre",{style:{wordWrap:"break-word",whiteSpace:"normal"},children:P})}),(0,a.jsx)(b.CopyToClipboard,{text:P,onCopy:()=>{S.ZP.success("API Key copied to clipboard")},children:(0,a.jsx)(p.Z,{className:"mt-3",children:"Copy API Key"})})]}):(0,a.jsx)(_.Z,{children:"Key being created, this might take 30s"})})]})})]})},T=s(9454),E=s(98941),O=s(33393),R=s(5),F=s(13810),M=s(61244),D=s(10827),L=s(3851),U=s(2044),V=s(64167),q=s(74480),z=s(7178),B=s(95093),K=s(27166);let{Option:W}=v.default;var H=e=>{let{userID:l,userRole:s,accessToken:t,selectedTeam:n,data:i,setData:o,teams:d}=e,[c,m]=(0,r.useState)(!1),[h,x]=(0,r.useState)(!1),[j,g]=(0,r.useState)(null),[Z,f]=(0,r.useState)(null),[b,C]=(0,r.useState)(null),[P,H]=(0,r.useState)(""),[G,Y]=(0,r.useState)(!1),[J,X]=(0,r.useState)(!1),[$,Q]=(0,r.useState)(null),[ee,el]=(0,r.useState)([]),es=new Set,[et,en]=(0,r.useState)(es);(0,r.useEffect)(()=>{(async()=>{try{if(null===l)return;if(null!==t&&null!==s){let e=(await (0,u.So)(t,l,s)).data.map(e=>e.id);console.log("available_model_names:",e),el(e)}}catch(e){console.error("Error fetching user models:",e)}})()},[t,l,s]),(0,r.useEffect)(()=>{if(d){let e=new Set;d.forEach((l,s)=>{let t=l.team_id;e.add(t)}),en(e)}},[d]);let ea=e=>{console.log("handleEditClick:",e),null==e.token&&null!==e.token_id&&(e.token=e.token_id),Q(e),Y(!0)},er=async e=>{if(null==t)return;let l=e.token;e.key=l,console.log("handleEditSubmit:",e);let s=await (0,u.Nc)(t,e);console.log("handleEditSubmit: newKeyValues",s),i&&o(i.map(e=>e.token===l?s:e)),S.ZP.success("Key updated successfully"),Y(!1),Q(null)},ei=async e=>{console.log("handleDelete:",e),null==e.token&&null!==e.token_id&&(e.token=e.token_id),null!=i&&(g(e.token),localStorage.removeItem("userData"+l),x(!0))},eo=async()=>{if(null!=j&&null!=i){try{await (0,u.I1)(t,j);let e=i.filter(e=>e.token!==j);o(e)}catch(e){console.error("Error deleting the key:",e)}x(!1),g(null)}};if(null!=i)return console.log("RERENDER TRIGGERED"),(0,a.jsxs)("div",{children:[(0,a.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4 mt-2",children:[(0,a.jsxs)(D.Z,{className:"mt-5 max-h-[300px] min-h-[300px]",children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Key Alias"}),(0,a.jsx)(q.Z,{children:"Secret Key"}),(0,a.jsx)(q.Z,{children:"Spend (USD)"}),(0,a.jsx)(q.Z,{children:"Budget (USD)"}),(0,a.jsx)(q.Z,{children:"Models"}),(0,a.jsx)(q.Z,{children:"TPM / RPM Limits"})]})}),(0,a.jsx)(L.Z,{children:i.map(e=>{if(console.log(e),"litellm-dashboard"===e.team_id)return null;if(n){if(console.log("item team id: ".concat(e.team_id,", knownTeamIDs.has(item.team_id): ").concat(et.has(e.team_id),", selectedTeam id: ").concat(n.team_id)),(null!=n.team_id||null===e.team_id||et.has(e.team_id))&&e.team_id!=n.team_id)return null;console.log("item team id: ".concat(e.team_id,", is returned"))}return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{style:{maxWidth:"2px",whiteSpace:"pre-wrap",overflow:"hidden"},children:null!=e.key_alias?(0,a.jsx)(_.Z,{children:e.key_alias}):(0,a.jsx)(_.Z,{children:"Not Set"})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(_.Z,{children:e.key_name})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(_.Z,{children:(()=>{try{return parseFloat(e.spend).toFixed(4)}catch(l){return e.spend}})()})}),(0,a.jsx)(U.Z,{children:null!=e.max_budget?(0,a.jsx)(_.Z,{children:e.max_budget}):(0,a.jsx)(_.Z,{children:"Unlimited"})}),(0,a.jsx)(U.Z,{children:Array.isArray(e.models)?(0,a.jsx)("div",{style:{display:"flex",flexDirection:"column"},children:0===e.models.length?(0,a.jsx)(a.Fragment,{children:n&&n.models&&n.models.length>0?n.models.map((e,l)=>"all-proxy-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Proxy Models"})},l):"all-team-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Team Models"})},l):(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"blue",children:(0,a.jsx)(_.Z,{children:e.length>30?"".concat(e.slice(0,30),"..."):e})},l)):(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"blue",children:(0,a.jsx)(_.Z,{children:"all-proxy-models"})})}):e.models.map((e,l)=>"all-proxy-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Proxy Models"})},l):"all-team-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Team Models"})},l):(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"blue",children:(0,a.jsx)(_.Z,{children:e.length>30?"".concat(e.slice(0,30),"..."):e})},l))}):null}),(0,a.jsx)(U.Z,{children:(0,a.jsxs)(_.Z,{children:["TPM: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,a.jsx)("br",{})," RPM:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(M.Z,{onClick:()=>{Q(e),X(!0)},icon:T.Z,size:"sm"}),(0,a.jsx)(w.Z,{open:J,onCancel:()=>{X(!1),Q(null)},footer:null,width:800,children:$&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3 mt-8",children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Spend"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:(()=>{try{return parseFloat($.spend).toFixed(4)}catch(e){return $.spend}})()})})]}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Budget"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:null!=$.max_budget?(0,a.jsx)(a.Fragment,{children:$.max_budget}):(0,a.jsx)(a.Fragment,{children:"Unlimited"})})})]},e.name),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Expires"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor-default font-small text-tremor-content-strong dark:text-dark-tremor-content-strong",children:null!=$.expires?(0,a.jsx)(a.Fragment,{children:new Date($.expires).toLocaleString(void 0,{day:"numeric",month:"long",year:"numeric",hour:"numeric",minute:"numeric",second:"numeric"})}):(0,a.jsx)(a.Fragment,{children:"Never"})})})]},e.name)]}),(0,a.jsxs)(F.Z,{className:"my-4",children:[(0,a.jsx)(y.Z,{children:"Token Name"}),(0,a.jsx)(_.Z,{className:"my-1",children:$.key_alias?$.key_alias:$.key_name}),(0,a.jsx)(y.Z,{children:"Token ID"}),(0,a.jsx)(_.Z,{className:"my-1 text-[12px]",children:$.token}),(0,a.jsx)(y.Z,{children:"Metadata"}),(0,a.jsx)(_.Z,{className:"my-1",children:(0,a.jsxs)("pre",{children:[JSON.stringify($.metadata)," "]})})]}),(0,a.jsx)(p.Z,{className:"mx-auto flex items-center",onClick:()=>{X(!1),Q(null)},children:"Close"})]})}),(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>ea(e)}),(0,a.jsx)(M.Z,{onClick:()=>ei(e),icon:O.Z,size:"sm"})]})]},e.token)})})]}),h&&(0,a.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,a.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,a.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,a.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,a.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:""}),(0,a.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,a.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,a.jsx)("div",{className:"sm:flex sm:items-start",children:(0,a.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,a.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Key"}),(0,a.jsx)("div",{className:"mt-2",children:(0,a.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this key ?"})})]})})}),(0,a.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,a.jsx)(p.Z,{onClick:eo,color:"red",className:"ml-2",children:"Delete"}),(0,a.jsx)(p.Z,{onClick:()=>{x(!1),g(null)},children:"Cancel"})]})]})]})})]}),$&&(0,a.jsx)(e=>{let{visible:l,onCancel:s,token:t,onSubmit:i}=e,[o]=k.Z.useForm(),[c,m]=(0,r.useState)(n),[u,h]=(0,r.useState)([]),[x,p]=(0,r.useState)(!1);return(0,a.jsx)(w.Z,{title:"Edit Key",visible:l,width:800,footer:null,onOk:()=>{o.validateFields().then(e=>{o.resetFields()}).catch(e=>{console.error("Validation failed:",e)})},onCancel:s,children:(0,a.jsxs)(k.Z,{form:o,onFinish:er,initialValues:t,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{label:"Key Name",name:"key_alias",rules:[{required:!0,message:"Please input a key name"}],help:"required",children:(0,a.jsx)(N.Z,{})}),(0,a.jsx)(k.Z.Item,{label:"Models",name:"models",rules:[{validator:(e,l)=>{let s=l.filter(e=>!c.models.includes(e)&&"all-team-models"!==e&&"all-proxy-models"!==e&&!c.models.includes("all-proxy-models"));return(console.log("errorModels: ".concat(s)),s.length>0)?Promise.reject("Some models are not part of the new team's models - ".concat(s,"Team models: ").concat(c.models)):Promise.resolve()}}],children:(0,a.jsxs)(v.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:[(0,a.jsx)(W,{value:"all-team-models",children:"All Team Models"},"all-team-models"),c&&c.models?c.models.includes("all-proxy-models")?ee.filter(e=>"all-proxy-models"!==e).map(e=>(0,a.jsx)(W,{value:e,children:e},e)):c.models.map(e=>(0,a.jsx)(W,{value:e,children:e},e)):ee.map(e=>(0,a.jsx)(W,{value:e,children:e},e))]})}),(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"Max Budget (USD)",name:"max_budget",help:"Budget cannot exceed team max budget: ".concat((null==c?void 0:c.max_budget)!==null&&(null==c?void 0:c.max_budget)!==void 0?null==c?void 0:c.max_budget:"unlimited"),rules:[{validator:async(e,l)=>{if(l&&c&&null!==c.max_budget&&l>c.max_budget)throw console.log("keyTeam.max_budget: ".concat(c.max_budget)),Error("Budget cannot exceed team max budget: $".concat(c.max_budget))}}],children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(k.Z.Item,{label:"token",name:"token",hidden:!0}),(0,a.jsx)(k.Z.Item,{label:"Team",name:"team_id",help:"the team this key belongs to",children:(0,a.jsx)(B.Z,{value:t.team_alias,children:null==d?void 0:d.map((e,l)=>(0,a.jsx)(K.Z,{value:e.team_id,onClick:()=>m(e),children:e.team_alias},l))})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Edit Key"})})]})})},{visible:G,onCancel:()=>{Y(!1),Q(null)},token:$,onSubmit:er})]})},G=e=>{let{userID:l,userRole:s,accessToken:t,userSpend:n,selectedTeam:i}=e;console.log("userSpend: ".concat(n));let[o,d]=(0,r.useState)(null!==n?n:0),[c,m]=(0,r.useState)(0),[h,x]=(0,r.useState)([]);(0,r.useEffect)(()=>{let e=async()=>{if(t&&l&&s&&"Admin"===s&&null==n)try{let e=await (0,u.Qy)(t);e&&(e.spend?d(e.spend):d(0),e.max_budget?m(e.max_budget):m(0))}catch(e){console.error("Error fetching global spend data:",e)}};(async()=>{try{if(null===l||null===s)return;if(null!==t){let e=(await (0,u.So)(t,l,s)).data.map(e=>e.id);console.log("available_model_names:",e),x(e)}}catch(e){console.error("Error fetching user models:",e)}})(),e()},[s,t,l]),(0,r.useEffect)(()=>{null!==n&&d(n)},[n]);let p=[];i&&i.models&&(p=i.models),p&&p.includes("all-proxy-models")?(console.log("user models:",h),p=h):p&&p.includes("all-team-models")?p=i.models:p&&0===p.length&&(p=h);let j=void 0!==o?o.toFixed(4):null;return console.log("spend in view user spend: ".concat(o)),(0,a.jsx)("div",{className:"flex items-center",children:(0,a.jsxs)("div",{children:[(0,a.jsxs)("p",{className:"text-tremor-default text-tremor-content dark:text-dark-tremor-content",children:["Total Spend"," "]}),(0,a.jsxs)("p",{className:"text-2xl text-tremor-content-strong dark:text-dark-tremor-content-strong font-semibold",children:["$",j]})]})})},Y=e=>{let{userID:l,userRole:s,selectedTeam:t,accessToken:n}=e,[i,o]=(0,r.useState)([]);(0,r.useEffect)(()=>{(async()=>{try{if(null===l||null===s)return;if(null!==n){let e=(await (0,u.So)(n,l,s)).data.map(e=>e.id);console.log("available_model_names:",e),o(e)}}catch(e){console.error("Error fetching user models:",e)}})()},[n,l,s]);let d=[];return t&&t.models&&(d=t.models),d&&d.includes("all-proxy-models")&&(console.log("user models:",i),d=i),(0,a.jsx)(a.Fragment,{children:(0,a.jsx)("div",{className:"mb-5",children:(0,a.jsx)("p",{className:"text-3xl text-tremor-content-strong dark:text-dark-tremor-content-strong font-semibold",children:null==t?void 0:t.team_alias})})})},J=e=>{let l,{teams:s,setSelectedTeam:t,userRole:n}=e,i={models:[],team_id:null,team_alias:"Default Team"},[o,d]=(0,r.useState)(i);return(l="App User"===n?s:s?[...s,i]:[i],"App User"===n)?null:(0,a.jsxs)("div",{className:"mt-5 mb-5",children:[(0,a.jsx)(y.Z,{children:"Select Team"}),(0,a.jsx)(_.Z,{children:"If you belong to multiple teams, this setting controls which team is used by default when creating new API Keys."}),(0,a.jsxs)(_.Z,{className:"mt-3 mb-3",children:[(0,a.jsx)("b",{children:"Default Team:"})," If no team_id is set for a key, it will be grouped under here."]}),l&&l.length>0?(0,a.jsx)(B.Z,{defaultValue:"0",children:l.map((e,l)=>(0,a.jsx)(K.Z,{value:String(l),onClick:()=>t(e),children:e.team_alias},l))}):(0,a.jsxs)(_.Z,{children:["No team created. ",(0,a.jsx)("b",{children:"Defaulting to personal account."})]})]})},X=s(667),$=s(37963),Q=s(97482);console.log("isLocal:",!1);var ee=e=>{let{userID:l,userRole:s,teams:t,keys:n,setUserRole:o,userEmail:d,setUserEmail:c,setTeams:m,setKeys:p,setProxySettings:j,proxySettings:g}=e,[Z,f]=(0,r.useState)(null),_=(0,i.useSearchParams)();_.get("viewSpend"),(0,i.useRouter)();let y=function(e){console.log("COOKIES",document.cookie);let l=document.cookie.split("; ").find(l=>l.startsWith(e+"="));return l?l.split("=")[1]:null}("token"),b=_.get("invitation_id"),[v,k]=(0,r.useState)(null),[S,w]=(0,r.useState)(null),[N,I]=(0,r.useState)([]),A={models:[],team_alias:"Default Team",team_id:null},[C,T]=(0,r.useState)(t?t[0]:A);if(window.addEventListener("beforeunload",function(){sessionStorage.clear()}),(0,r.useEffect)(()=>{if(y){let e=(0,$.o)(y);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),k(e.key),e.user_role){let l=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";case"internal_user":return"Internal User";case"internal_user_viewer":return"Internal Viewer";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",l),o(l)}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e))}}if(l&&v&&s&&!n&&!Z){let e=sessionStorage.getItem("userModels"+l);e?I(JSON.parse(e)):(async()=>{try{let e=await (0,u.Dj)(v);j(e);let t=await (0,u.Br)(v,l,s,!1,null,null);if(console.log("received teams in user dashboard: ".concat(Object.keys(t),"; team values: ").concat(Object.entries(t.teams))),"Admin"==s){let e=await (0,u.Qy)(v);f(e),console.log("globalSpend:",e)}else f(t.user_info);p(t.keys),m(t.teams);let n=[...t.teams];n.length>0?(console.log("response['teams']: ".concat(n)),T(n[0])):T(A),sessionStorage.setItem("userData"+l,JSON.stringify(t.keys)),sessionStorage.setItem("userSpendData"+l,JSON.stringify(t.user_info));let a=(await (0,u.So)(v,l,s)).data.map(e=>e.id);console.log("available_model_names:",a),I(a),console.log("userModels:",N),sessionStorage.setItem("userModels"+l,JSON.stringify(a))}catch(e){console.error("There was an error fetching the data",e)}})()}},[l,y,v,n,s]),(0,r.useEffect)(()=>{if(null!==n&&null!=C&&null!==C.team_id){let e=0;for(let l of n)C.hasOwnProperty("team_id")&&null!==l.team_id&&l.team_id===C.team_id&&(e+=l.spend);w(e)}else if(null!==n){let e=0;for(let l of n)e+=l.spend;w(e)}},[C]),null!=b)return(0,a.jsx)(X.default,{});if(null==l||null==y){let e="/sso/key/generate";return document.cookie="token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;",console.log("Full URL:",e),window.location.href=e,null}if(null==v)return null;if(null==s&&o("App Owner"),s&&"Admin Viewer"==s){let{Title:e,Paragraph:l}=Q.default;return(0,a.jsxs)("div",{children:[(0,a.jsx)(e,{level:1,children:"Access Denied"}),(0,a.jsx)(l,{children:"Ask your proxy admin for access to create keys"})]})}return console.log("inside user dashboard, selected team",C),(0,a.jsx)("div",{className:"w-full mx-4",children:(0,a.jsx)(x.Z,{numItems:1,className:"gap-2 p-8 h-[75vh] w-full mt-2",children:(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(Y,{userID:l,userRole:s,selectedTeam:C||null,accessToken:v}),(0,a.jsx)(G,{userID:l,userRole:s,accessToken:v,userSpend:S,selectedTeam:C||null}),(0,a.jsx)(H,{userID:l,userRole:s,accessToken:v,selectedTeam:C||null,data:n,setData:p,teams:t}),(0,a.jsx)(P,{userID:l,team:C||null,userRole:s,accessToken:v,data:n,setData:p},C?C.team_id:null),(0,a.jsx)(J,{teams:t,setSelectedTeam:T,userRole:s})]})})})},el=s(49167),es=s(35087),et=s(92836),en=s(26734),ea=s(41608),er=s(32126),ei=s(23682),eo=s(47047),ed=s(76628),ec=s(25707),em=s(44041),eu=s(6180),eh=s(28683),ex=s(38302),ep=s(66242),ej=s(78578),eg=s(63954),eZ=s(34658),ef=e=>{let{modelID:l,accessToken:s}=e,[t,n]=(0,r.useState)(!1),i=async()=>{try{S.ZP.info("Making API Call"),n(!0);let e=await (0,u.Og)(s,l);console.log("model delete Response:",e),S.ZP.success("Model ".concat(l," deleted successfully")),n(!1)}catch(e){console.error("Error deleting the model:",e)}};return(0,a.jsxs)("div",{children:[(0,a.jsx)(M.Z,{onClick:()=>n(!0),icon:O.Z,size:"sm"}),(0,a.jsx)(w.Z,{open:t,onOk:i,okType:"danger",onCancel:()=>n(!1),children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 w-full",children:[(0,a.jsx)(y.Z,{children:"Delete Model"}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsx)("p",{children:"Are you sure you want to delete this model? This action is irreversible."})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)("p",{children:["Model ID: ",(0,a.jsx)("b",{children:l})]})})]})})]})},e_=s(97766),ey=s(46495),eb=s(18190),ev=s(91118),ek=e=>{let{modelMetrics:l,modelMetricsCategories:s,customTooltip:t,premiumUser:n}=e;return n?(0,a.jsx)(ev.Z,{title:"Time to First token (s)",className:"h-72",data:l,index:"date",showLegend:!1,categories:s,colors:["indigo","rose"],connectNulls:!0,customTooltip:t}):(0,a.jsxs)("div",{children:[(0,a.jsx)(eb.Z,{title:"✨ Enterprise Feature",color:"teal",className:"mt-2 mb-4",children:"Enterprise features are available for users with a specific license, please contact LiteLLM to unlock this limitation."}),(0,a.jsx)(p.Z,{variant:"primary",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get in touch"})})]})},eS=e=>{let{fields:l,selectedProvider:s}=e;return 0===l.length?null:(0,a.jsx)(a.Fragment,{children:l.map(e=>(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:e.field_name.replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase()),name:e.field_name,tooltip:e.field_description,className:"mb-2",children:(0,a.jsx)(j.Z,{placeholder:e.field_value,type:"password"})},e.field_name))})},ew=s(67951);let{Title:eN,Link:eI}=Q.default;(t=n||(n={})).OpenAI="OpenAI",t.Azure="Azure",t.Azure_AI_Studio="Azure AI Studio",t.Anthropic="Anthropic",t.Google_AI_Studio="Google AI Studio",t.Bedrock="Amazon Bedrock",t.OpenAI_Compatible="OpenAI-Compatible Endpoints (Groq, Together AI, Mistral AI, etc.)",t.Vertex_AI="Vertex AI (Anthropic, Gemini, etc.)",t.Databricks="Databricks",t.Ollama="Ollama";let eA={OpenAI:"openai",Azure:"azure",Azure_AI_Studio:"azure_ai",Anthropic:"anthropic",Google_AI_Studio:"gemini",Bedrock:"bedrock",OpenAI_Compatible:"openai",Vertex_AI:"vertex_ai",Databricks:"databricks",Ollama:"ollama"},eC={"BadRequestError (400)":"BadRequestErrorRetries","AuthenticationError (401)":"AuthenticationErrorRetries","TimeoutError (408)":"TimeoutErrorRetries","RateLimitError (429)":"RateLimitErrorRetries","ContentPolicyViolationError (400)":"ContentPolicyViolationErrorRetries","InternalServerError (500)":"InternalServerErrorRetries"},eP=async(e,l,s)=>{try{let t=Array.isArray(e.model)?e.model:[e.model];console.log("received deployments: ".concat(t)),console.log("received type of deployments: ".concat(typeof t)),t.forEach(async s=>{console.log("litellm_model: ".concat(s));let t={},n={};t.model=s;let a="";for(let[l,s]of(console.log("formValues add deployment:",e),Object.entries(e)))if(""!==s){if("model_name"==l)a+=s;else if("custom_llm_provider"==l){console.log("custom_llm_provider:",s);let e=eA[s];t.custom_llm_provider=e,console.log("custom_llm_provider mappingResult:",e)}else if("model"==l)continue;else if("base_model"===l)n[l]=s;else if("custom_model_name"===l)t.model=s;else if("litellm_extra_params"==l){console.log("litellm_extra_params:",s);let e={};if(s&&void 0!=s){try{e=JSON.parse(s)}catch(e){throw S.ZP.error("Failed to parse LiteLLM Extra Params: "+e,10),Error("Failed to parse litellm_extra_params: "+e)}for(let[l,s]of Object.entries(e))t[l]=s}}else t[l]=s}let r={model_name:a,litellm_params:t,model_info:n},i=await (0,u.kK)(l,r);console.log("response for model create call: ".concat(i.data))}),s.resetFields()}catch(e){S.ZP.error("Failed to create model: "+e,10)}};var eT=e=>{let l,{accessToken:s,token:t,userRole:i,userID:o,modelData:d={data:[]},keys:c,setModelData:m,premiumUser:h}=e,[g,Z]=(0,r.useState)([]),[f]=k.Z.useForm(),[b,v]=(0,r.useState)(null),[N,C]=(0,r.useState)(""),[P,O]=(0,r.useState)([]),W=Object.values(n).filter(e=>isNaN(Number(e))),[H,G]=(0,r.useState)([]),[Y,J]=(0,r.useState)("OpenAI"),[X,$]=(0,r.useState)(""),[ee,eb]=(0,r.useState)(!1),[ev,eT]=(0,r.useState)(!1),[eE,eO]=(0,r.useState)(null),[eR,eF]=(0,r.useState)([]),[eM,eD]=(0,r.useState)(null),[eL,eU]=(0,r.useState)([]),[eV,eq]=(0,r.useState)([]),[ez,eB]=(0,r.useState)([]),[eK,eW]=(0,r.useState)([]),[eH,eG]=(0,r.useState)([]),[eY,eJ]=(0,r.useState)([]),[eX,e$]=(0,r.useState)([]),[eQ,e0]=(0,r.useState)([]),[e1,e2]=(0,r.useState)([]),[e4,e5]=(0,r.useState)({from:new Date(Date.now()-6048e5),to:new Date}),[e8,e3]=(0,r.useState)(null),[e6,e9]=(0,r.useState)(0),[e7,le]=(0,r.useState)({}),[ll,ls]=(0,r.useState)([]),[lt,ln]=(0,r.useState)(!1),[la,lr]=(0,r.useState)(null),[li,lo]=(0,r.useState)(null),[ld,lc]=(0,r.useState)([]);(0,r.useEffect)(()=>{lb(eM,e4.from,e4.to)},[la,li]);let lm=e=>{eO(e),eb(!0)},lu=e=>{eO(e),eT(!0)},lh=async e=>{if(console.log("handleEditSubmit:",e),null==s)return;let l={},t=null;for(let[s,n]of Object.entries(e))"model_id"!==s?l[s]=n:t=n;let n={litellm_params:l,model_info:{id:t}};console.log("handleEditSubmit payload:",n);try{await (0,u.um)(s,n),S.ZP.success("Model updated successfully, restart server to see updates"),eb(!1),eO(null)}catch(e){console.log("Error occurred")}},lx=()=>{C(new Date().toLocaleString())},lp=async()=>{if(!s){console.error("Access token is missing");return}console.log("new modelGroupRetryPolicy:",e8);try{await (0,u.K_)(s,{router_settings:{model_group_retry_policy:e8}}),S.ZP.success("Retry settings saved successfully")}catch(e){console.error("Failed to save retry settings:",e),S.ZP.error("Failed to save retry settings")}};if((0,r.useEffect)(()=>{if(!s||!t||!i||!o)return;let e=async()=>{try{var e,l,t,n,a,r,d,c,h,x,p,j;let g=await (0,u.hy)(s);G(g);let Z=await (0,u.AZ)(s,o,i);console.log("Model data response:",Z.data),m(Z);let f=new Set;for(let e=0;e0&&(y=_[_.length-1],console.log("_initial_model_group:",y)),console.log("selectedModelGroup:",eM);let b=await (0,u.o6)(s,o,i,y,null===(e=e4.from)||void 0===e?void 0:e.toISOString(),null===(l=e4.to)||void 0===l?void 0:l.toISOString(),null==la?void 0:la.token,li);console.log("Model metrics response:",b),eq(b.data),eB(b.all_api_bases);let v=await (0,u.Rg)(s,y,null===(t=e4.from)||void 0===t?void 0:t.toISOString(),null===(n=e4.to)||void 0===n?void 0:n.toISOString());eW(v.data),eG(v.all_api_bases);let k=await (0,u.N8)(s,o,i,y,null===(a=e4.from)||void 0===a?void 0:a.toISOString(),null===(r=e4.to)||void 0===r?void 0:r.toISOString(),null==la?void 0:la.token,li);console.log("Model exceptions response:",k),eJ(k.data),e$(k.exception_types);let S=await (0,u.fP)(s,o,i,y,null===(d=e4.from)||void 0===d?void 0:d.toISOString(),null===(c=e4.to)||void 0===c?void 0:c.toISOString(),null==la?void 0:la.token,li),w=await (0,u.n$)(s,null===(h=e4.from)||void 0===h?void 0:h.toISOString().split("T")[0],null===(x=e4.to)||void 0===x?void 0:x.toISOString().split("T")[0],y);le(w);let N=await (0,u.v9)(s,null===(p=e4.from)||void 0===p?void 0:p.toISOString().split("T")[0],null===(j=e4.to)||void 0===j?void 0:j.toISOString().split("T")[0],y);ls(N),console.log("dailyExceptions:",w),console.log("dailyExceptionsPerDeplyment:",N),console.log("slowResponses:",S),e2(S);let I=await (0,u.j2)(s);lc(null==I?void 0:I.end_users);let A=(await (0,u.BL)(s,o,i)).router_settings;console.log("routerSettingsInfo:",A);let C=A.model_group_retry_policy,P=A.num_retries;console.log("model_group_retry_policy:",C),console.log("default_retries:",P),e3(C),e9(P)}catch(e){console.error("There was an error fetching the model data",e)}};s&&t&&i&&o&&e();let l=async()=>{let e=await (0,u.qm)(s);console.log("received model cost map data: ".concat(Object.keys(e))),v(e)};null==b&&l(),lx()},[s,t,i,o,b,N]),!d||!s||!t||!i||!o)return(0,a.jsx)("div",{children:"Loading..."});let lj=[];for(let e=0;e(console.log("GET PROVIDER CALLED! - ".concat(b)),null!=b&&"object"==typeof b&&e in b)?b[e].litellm_provider:"openai";if(s){let e=s.split("/"),l=e[0];(a=t)||(a=1===e.length?u(s):l)}else a="-";n&&(r=null==n?void 0:n.input_cost_per_token,i=null==n?void 0:n.output_cost_per_token,o=null==n?void 0:n.max_tokens,c=null==n?void 0:n.max_input_tokens),(null==l?void 0:l.litellm_params)&&(m=Object.fromEntries(Object.entries(null==l?void 0:l.litellm_params).filter(e=>{let[l]=e;return"model"!==l&&"api_base"!==l}))),d.data[e].provider=a,d.data[e].input_cost=r,d.data[e].output_cost=i,d.data[e].input_cost&&(d.data[e].input_cost=(1e6*Number(d.data[e].input_cost)).toFixed(2)),d.data[e].output_cost&&(d.data[e].output_cost=(1e6*Number(d.data[e].output_cost)).toFixed(2)),d.data[e].max_tokens=o,d.data[e].max_input_tokens=c,d.data[e].api_base=null==l?void 0:null===(lf=l.litellm_params)||void 0===lf?void 0:lf.api_base,d.data[e].cleanedLitellmParams=m,lj.push(l.model_name),console.log(d.data[e])}if(i&&"Admin Viewer"==i){let{Title:e,Paragraph:l}=Q.default;return(0,a.jsxs)("div",{children:[(0,a.jsx)(e,{level:1,children:"Access Denied"}),(0,a.jsx)(l,{children:"Ask your proxy admin for access to view all models"})]})}let l_=e=>{console.log("received provider string: ".concat(e));let l=Object.keys(n).find(l=>n[l]===e);if(l){let e=eA[l];console.log("mappingResult: ".concat(e));let s=[];"object"==typeof b&&Object.entries(b).forEach(l=>{let[t,n]=l;null!==n&&"object"==typeof n&&"litellm_provider"in n&&(n.litellm_provider===e||n.litellm_provider.includes(e))&&s.push(t)}),O(s),console.log("providerModels: ".concat(P))}},ly=async()=>{try{S.ZP.info("Running health check..."),$("");let e=await (0,u.EY)(s);$(e)}catch(e){console.error("Error running health check:",e),$("Error running health check")}},lb=async(e,l,t)=>{if(console.log("Updating model metrics for group:",e),!s||!o||!i||!l||!t)return;console.log("inside updateModelMetrics - startTime:",l,"endTime:",t),eD(e);let n=null==la?void 0:la.token;void 0===n&&(n=null);let a=li;void 0===a&&(a=null),l.setHours(0),l.setMinutes(0),l.setSeconds(0),t.setHours(23),t.setMinutes(59),t.setSeconds(59);try{let r=await (0,u.o6)(s,o,i,e,l.toISOString(),t.toISOString(),n,a);console.log("Model metrics response:",r),eq(r.data),eB(r.all_api_bases);let d=await (0,u.Rg)(s,e,l.toISOString(),t.toISOString());eW(d.data),eG(d.all_api_bases);let c=await (0,u.N8)(s,o,i,e,l.toISOString(),t.toISOString(),n,a);console.log("Model exceptions response:",c),eJ(c.data),e$(c.exception_types);let m=await (0,u.fP)(s,o,i,e,l.toISOString(),t.toISOString(),n,a);if(console.log("slowResponses:",m),e2(m),e){let n=await (0,u.n$)(s,null==l?void 0:l.toISOString().split("T")[0],null==t?void 0:t.toISOString().split("T")[0],e);le(n);let a=await (0,u.v9)(s,null==l?void 0:l.toISOString().split("T")[0],null==t?void 0:t.toISOString().split("T")[0],e);ls(a)}}catch(e){console.error("Failed to fetch model metrics",e)}},lv=(0,a.jsxs)("div",{children:[(0,a.jsx)(_.Z,{className:"mb-1",children:"Select API Key Name"}),h?(0,a.jsxs)("div",{children:[(0,a.jsxs)(B.Z,{defaultValue:"all-keys",children:[(0,a.jsx)(K.Z,{value:"all-keys",onClick:()=>{lr(null)},children:"All Keys"},"all-keys"),null==c?void 0:c.map((e,l)=>e&&null!==e.key_alias&&e.key_alias.length>0?(0,a.jsx)(K.Z,{value:String(l),onClick:()=>{lr(e)},children:e.key_alias},l):null)]}),(0,a.jsx)(_.Z,{className:"mt-1",children:"Select Customer Name"}),(0,a.jsxs)(B.Z,{defaultValue:"all-customers",children:[(0,a.jsx)(K.Z,{value:"all-customers",onClick:()=>{lo(null)},children:"All Customers"},"all-customers"),null==ld?void 0:ld.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>{lo(e)},children:e},l))]})]}):(0,a.jsxs)("div",{children:[(0,a.jsxs)(B.Z,{defaultValue:"all-keys",children:[(0,a.jsx)(K.Z,{value:"all-keys",onClick:()=>{lr(null)},children:"All Keys"},"all-keys"),null==c?void 0:c.map((e,l)=>e&&null!==e.key_alias&&e.key_alias.length>0?(0,a.jsxs)(K.Z,{value:String(l),disabled:!0,onClick:()=>{lr(e)},children:["✨ ",e.key_alias," (Enterprise only Feature)"]},l):null)]}),(0,a.jsx)(_.Z,{className:"mt-1",children:"Select Customer Name"}),(0,a.jsxs)(B.Z,{defaultValue:"all-customers",children:[(0,a.jsx)(K.Z,{value:"all-customers",onClick:()=>{lo(null)},children:"All Customers"},"all-customers"),null==ld?void 0:ld.map((e,l)=>(0,a.jsxs)(K.Z,{value:e,disabled:!0,onClick:()=>{lo(e)},children:["✨ ",e," (Enterprise only Feature)"]},l))]})]})]}),lk=e=>{var l,s;let{payload:t,active:n}=e;if(!n||!t)return null;let r=null===(s=t[0])||void 0===s?void 0:null===(l=s.payload)||void 0===l?void 0:l.date,i=t.sort((e,l)=>l.value-e.value);if(i.length>5){let e=i.length-5;(i=i.slice(0,5)).push({dataKey:"".concat(e," other deployments"),value:t.slice(5).reduce((e,l)=>e+l.value,0),color:"gray"})}return(0,a.jsxs)("div",{className:"w-150 rounded-tremor-default border border-tremor-border bg-tremor-background p-2 text-tremor-default shadow-tremor-dropdown",children:[r&&(0,a.jsxs)("p",{className:"text-tremor-content-emphasis mb-2",children:["Date: ",r]}),i.map((e,l)=>{let s=parseFloat(e.value.toFixed(5)),t=0===s&&e.value>0?"<0.00001":s.toFixed(5);return(0,a.jsxs)("div",{className:"flex justify-between",children:[(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,a.jsx)("div",{className:"w-2 h-2 mt-1 rounded-full bg-".concat(e.color,"-500")}),(0,a.jsx)("p",{className:"text-tremor-content",children:e.dataKey})]}),(0,a.jsx)("p",{className:"font-medium text-tremor-content-emphasis text-righ ml-2",children:t})]},l)})]})};console.log("selectedProvider: ".concat(Y)),console.log("providerModels.length: ".concat(P.length));let lS=Object.keys(n).find(e=>n[e]===Y);return lS&&(l=H.find(e=>e.name===eA[lS])),(0,a.jsx)("div",{style:{width:"100%",height:"100%"},children:(0,a.jsxs)(en.Z,{className:"gap-2 p-8 h-[75vh] w-full mt-2",children:[(0,a.jsxs)(ea.Z,{className:"flex justify-between mt-2 w-full items-center",children:[(0,a.jsxs)("div",{className:"flex",children:[(0,a.jsx)(et.Z,{children:"All Models"}),(0,a.jsx)(et.Z,{children:"Add Model"}),(0,a.jsx)(et.Z,{children:(0,a.jsx)("pre",{children:"/health Models"})}),(0,a.jsx)(et.Z,{children:"Model Analytics"}),(0,a.jsx)(et.Z,{children:"Model Retry Settings"})]}),(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[N&&(0,a.jsxs)(_.Z,{children:["Last Refreshed: ",N]}),(0,a.jsx)(M.Z,{icon:eg.Z,variant:"shadow",size:"xs",className:"self-center",onClick:lx})]})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)(x.Z,{children:[(0,a.jsxs)("div",{className:"flex items-center",children:[(0,a.jsx)(_.Z,{children:"Filter by Public Model Name"}),(0,a.jsxs)(B.Z,{className:"mb-4 mt-2 ml-2 w-50",defaultValue:eM||void 0,onValueChange:e=>eD("all"===e?"all":e),value:eM||void 0,children:[(0,a.jsx)(K.Z,{value:"all",children:"All Models"}),eR.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>eD(e),children:e},l))]})]}),(0,a.jsx)(F.Z,{children:(0,a.jsxs)(D.Z,{style:{maxWidth:"1500px",width:"100%"},children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:"Public Model Name"}),(0,a.jsx)(q.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:"Provider"}),"Admin"===i&&(0,a.jsx)(q.Z,{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:"API Base"}),(0,a.jsxs)(q.Z,{style:{maxWidth:"85px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:["Input Price"," ",(0,a.jsx)("p",{style:{fontSize:"10px",color:"gray"},children:"/1M Tokens ($)"})]}),(0,a.jsxs)(q.Z,{style:{maxWidth:"85px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:["Output Price"," ",(0,a.jsx)("p",{style:{fontSize:"10px",color:"gray"},children:"/1M Tokens ($)"})]}),(0,a.jsx)(q.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:h?"Created At":(0,a.jsxs)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",style:{color:"#72bcd4"},children:[" ","✨ Created At"]})}),(0,a.jsx)(q.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:h?"Created By":(0,a.jsxs)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",style:{color:"#72bcd4"},children:[" ","✨ Created By"]})}),(0,a.jsx)(q.Z,{style:{maxWidth:"50px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:"Status"}),(0,a.jsx)(q.Z,{})]})}),(0,a.jsx)(L.Z,{children:d.data.filter(e=>"all"===eM||e.model_name===eM||null==eM||""===eM).map((e,l)=>{var t;return(0,a.jsxs)(z.Z,{style:{maxHeight:"1px",minHeight:"1px"},children:[(0,a.jsx)(U.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)("p",{className:"text-xs",children:e.model_name||"-"})}),(0,a.jsx)(U.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)("p",{className:"text-xs",children:e.provider||"-"})}),"Admin"===i&&(0,a.jsx)(U.Z,{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)(eu.Z,{title:e&&e.api_base,children:(0,a.jsx)("pre",{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word"},className:"text-xs",title:e&&e.api_base?e.api_base:"",children:e&&e.api_base?e.api_base.slice(0,20):"-"})})}),(0,a.jsx)(U.Z,{style:{maxWidth:"80px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)("pre",{className:"text-xs",children:e.input_cost?e.input_cost:null!=e.litellm_params.input_cost_per_token&&void 0!=e.litellm_params.input_cost_per_token?(1e6*Number(e.litellm_params.input_cost_per_token)).toFixed(2):null})}),(0,a.jsx)(U.Z,{style:{maxWidth:"80px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)("pre",{className:"text-xs",children:e.output_cost?e.output_cost:e.litellm_params.output_cost_per_token?(1e6*Number(e.litellm_params.output_cost_per_token)).toFixed(2):null})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)("p",{className:"text-xs",children:h&&((t=e.model_info.created_at)?new Date(t).toLocaleDateString("en-US"):null)||"-"})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)("p",{className:"text-xs",children:h&&e.model_info.created_by||"-"})}),(0,a.jsx)(U.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word"},children:e.model_info.db_model?(0,a.jsx)(R.Z,{size:"xs",className:"text-white",children:(0,a.jsx)("p",{className:"text-xs",children:"DB Model"})}):(0,a.jsx)(R.Z,{size:"xs",className:"text-black",children:(0,a.jsx)("p",{className:"text-xs",children:"Config Model"})})}),(0,a.jsx)(U.Z,{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsxs)(x.Z,{numItems:3,children:[(0,a.jsx)(eh.Z,{children:(0,a.jsx)(M.Z,{icon:T.Z,size:"sm",onClick:()=>lu(e)})}),(0,a.jsx)(eh.Z,{children:(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>lm(e)})}),(0,a.jsx)(eh.Z,{children:(0,a.jsx)(ef,{modelID:e.model_info.id,accessToken:s})})]})})]},l)})})]})})]}),(0,a.jsx)(e=>{let{visible:l,onCancel:s,model:t,onSubmit:n}=e,[r]=k.Z.useForm(),i={},o="",d="";if(t){i=t.litellm_params,o=t.model_name;let e=t.model_info;e&&(d=e.id,console.log("model_id: ".concat(d)),i.model_id=d)}return(0,a.jsx)(w.Z,{title:"Edit Model "+o,visible:l,width:800,footer:null,onOk:()=>{r.validateFields().then(e=>{n(e),r.resetFields()}).catch(e=>{console.error("Validation failed:",e)})},onCancel:s,children:(0,a.jsxs)(k.Z,{form:r,onFinish:lh,initialValues:i,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"api_base",name:"api_base",children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(k.Z.Item,{label:"organization",name:"organization",tooltip:"OpenAI Organization ID",children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(k.Z.Item,{label:"tpm",name:"tpm",tooltip:"int (optional) - Tokens limit for this deployment: in tokens per minute (tpm). Find this information on your model/providers website",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(k.Z.Item,{label:"rpm",name:"rpm",tooltip:"int (optional) - Rate limit for this deployment: in requests per minute (rpm). Find this information on your model/providers website",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(k.Z.Item,{label:"max_retries",name:"max_retries",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(k.Z.Item,{label:"timeout",name:"timeout",tooltip:"int (optional) - Timeout in seconds for LLM requests (Defaults to 600 seconds)",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(k.Z.Item,{label:"stream_timeout",name:"stream_timeout",tooltip:"int (optional) - Timeout for stream requests (seconds)",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(k.Z.Item,{label:"input_cost_per_token",name:"input_cost_per_token",tooltip:"float (optional) - Input cost per token",children:(0,a.jsx)(I.Z,{min:0,step:1e-4})}),(0,a.jsx)(k.Z.Item,{label:"output_cost_per_token",name:"output_cost_per_token",tooltip:"float (optional) - Output cost per token",children:(0,a.jsx)(I.Z,{min:0,step:1e-4})}),(0,a.jsx)(k.Z.Item,{label:"model_id",name:"model_id",hidden:!0})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})})},{visible:ee,onCancel:()=>{eb(!1),eO(null)},model:eE,onSubmit:lh}),(0,a.jsxs)(w.Z,{title:eE&&eE.model_name,visible:ev,width:800,footer:null,onCancel:()=>{eT(!1),eO(null)},children:[(0,a.jsx)(y.Z,{children:"Model Info"}),(0,a.jsx)(ew.Z,{language:"json",children:eE&&JSON.stringify(eE,null,2)})]})]}),(0,a.jsxs)(er.Z,{className:"h-full",children:[(0,a.jsx)(eN,{level:2,children:"Add new model"}),(0,a.jsx)(F.Z,{children:(0,a.jsxs)(k.Z,{form:f,onFinish:()=>{f.validateFields().then(e=>{eP(e,s,f)}).catch(e=>{console.error("Validation failed:",e)})},labelCol:{span:10},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Provider:",name:"custom_llm_provider",tooltip:"E.g. OpenAI, Azure OpenAI, Anthropic, Bedrock, etc.",labelCol:{span:10},labelAlign:"left",children:(0,a.jsx)(B.Z,{value:Y.toString(),children:W.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>{l_(e),J(e)},children:e},l))})}),(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Public Model Name",name:"model_name",tooltip:"Model name your users will pass in. Also used for load-balancing, LiteLLM will load balance between all models with this public name.",className:"mb-0",children:(0,a.jsx)(j.Z,{})}),(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsx)(_.Z,{className:"mb-3 mt-1",children:"Model name your users will pass in."})})]}),(0,a.jsxs)(k.Z.Item,{label:"LiteLLM Model Name(s)",tooltip:"Actual model name used for making litellm.completion() call.",className:"mb-0",children:[(0,a.jsx)(k.Z.Item,{name:"model",rules:[{required:!0,message:"Required"}],noStyle:!0,children:(0,a.jsxs)(eo.Z,{children:[(0,a.jsx)(ed.Z,{value:"custom",children:"Custom Model Name (Enter below)"}),P.map((e,l)=>(0,a.jsx)(ed.Z,{value:e,children:e},l))]})}),(0,a.jsx)(k.Z.Item,{noStyle:!0,shouldUpdate:(e,l)=>e.model!==l.model,children:e=>{let{getFieldValue:l}=e;return(l("model")||[]).includes("custom")&&(0,a.jsx)(k.Z.Item,{name:"custom_model_name",rules:[{required:!0,message:"Please enter a custom model name"}],className:"mt-2",children:(0,a.jsx)(j.Z,{placeholder:"Enter custom model name"})})}})]}),(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsxs)(_.Z,{className:"mb-3 mt-1",children:["Actual model name used for making"," ",(0,a.jsx)(eI,{href:"https://docs.litellm.ai/docs/providers",target:"_blank",children:"litellm.completion() call"}),". We'll"," ",(0,a.jsx)(eI,{href:"https://docs.litellm.ai/docs/proxy/reliability#step-1---set-deployments-on-config",target:"_blank",children:"loadbalance"})," ","models with the same 'public name'"]})})]}),void 0!==l&&l.fields.length>0&&(0,a.jsx)(eS,{fields:l.fields,selectedProvider:l.name}),"Amazon Bedrock"!=Y&&"Vertex AI (Anthropic, Gemini, etc.)"!=Y&&"Ollama"!=Y&&(void 0===l||0==l.fields.length)&&(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"API Key",name:"api_key",children:(0,a.jsx)(j.Z,{placeholder:"sk-",type:"password"})}),"OpenAI"==Y&&(0,a.jsx)(k.Z.Item,{label:"Organization ID",name:"organization",children:(0,a.jsx)(j.Z,{placeholder:"[OPTIONAL] my-unique-org"})}),"Vertex AI (Anthropic, Gemini, etc.)"==Y&&(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Vertex Project",name:"vertex_project",children:(0,a.jsx)(j.Z,{placeholder:"adroit-cadet-1234.."})}),"Vertex AI (Anthropic, Gemini, etc.)"==Y&&(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Vertex Location",name:"vertex_location",children:(0,a.jsx)(j.Z,{placeholder:"us-east-1"})}),"Vertex AI (Anthropic, Gemini, etc.)"==Y&&(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Vertex Credentials",name:"vertex_credentials",className:"mb-0",children:(0,a.jsx)(ey.Z,{name:"file",accept:".json",beforeUpload:e=>{if("application/json"===e.type){let l=new FileReader;l.onload=e=>{if(e.target){let l=e.target.result;f.setFieldsValue({vertex_credentials:l})}},l.readAsText(e)}return!1},onChange(e){"uploading"!==e.file.status&&console.log(e.file,e.fileList),"done"===e.file.status?S.ZP.success("".concat(e.file.name," file uploaded successfully")):"error"===e.file.status&&S.ZP.error("".concat(e.file.name," file upload failed."))},children:(0,a.jsx)(A.ZP,{icon:(0,a.jsx)(e_.Z,{}),children:"Click to Upload"})})}),"Vertex AI (Anthropic, Gemini, etc.)"==Y&&(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsx)(_.Z,{className:"mb-3 mt-1",children:"Give litellm a gcp service account(.json file), so it can make the relevant calls"})})]}),("Azure"==Y||"OpenAI-Compatible Endpoints (Groq, Together AI, Mistral AI, etc.)"==Y)&&(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"API Base",name:"api_base",children:(0,a.jsx)(j.Z,{placeholder:"https://..."})}),"Azure"==Y&&(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"API Version",name:"api_version",children:(0,a.jsx)(j.Z,{placeholder:"2023-07-01-preview"})}),"Azure"==Y&&(0,a.jsxs)("div",{children:[(0,a.jsx)(k.Z.Item,{label:"Base Model",name:"base_model",className:"mb-0",children:(0,a.jsx)(j.Z,{placeholder:"azure/gpt-3.5-turbo"})}),(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsxs)(_.Z,{className:"mb-2",children:["The actual model your azure deployment uses. Used for accurate cost tracking. Select name from"," ",(0,a.jsx)(eI,{href:"https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json",target:"_blank",children:"here"})]})})]})]}),"Amazon Bedrock"==Y&&(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"AWS Access Key ID",name:"aws_access_key_id",tooltip:"You can provide the raw key or the environment variable (e.g. `os.environ/MY_SECRET_KEY`).",children:(0,a.jsx)(j.Z,{placeholder:""})}),"Amazon Bedrock"==Y&&(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"AWS Secret Access Key",name:"aws_secret_access_key",tooltip:"You can provide the raw key or the environment variable (e.g. `os.environ/MY_SECRET_KEY`).",children:(0,a.jsx)(j.Z,{placeholder:""})}),"Amazon Bedrock"==Y&&(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"AWS Region Name",name:"aws_region_name",tooltip:"You can provide the raw key or the environment variable (e.g. `os.environ/MY_SECRET_KEY`).",children:(0,a.jsx)(j.Z,{placeholder:"us-east-1"})}),(0,a.jsx)(k.Z.Item,{label:"LiteLLM Params",name:"litellm_extra_params",tooltip:"Optional litellm params used for making a litellm.completion() call.",className:"mb-0",children:(0,a.jsx)(ej.Z,{rows:4,placeholder:'{ "rpm": 100, "timeout": 0, "stream_timeout": 0 }'})}),(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsxs)(_.Z,{className:"mb-3 mt-1",children:["Pass JSON of litellm supported params"," ",(0,a.jsx)(eI,{href:"https://docs.litellm.ai/docs/completion/input",target:"_blank",children:"litellm.completion() call"})]})})]})]}),(0,a.jsx)("div",{style:{textAlign:"center",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add Model"})}),(0,a.jsx)(eu.Z,{title:"Get help on our github",children:(0,a.jsx)(Q.default.Link,{href:"https://github.com/BerriAI/litellm/issues",children:"Need Help?"})})]})})]}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(_.Z,{children:"`/health` will run a very small request through your models configured on litellm"}),(0,a.jsx)(p.Z,{onClick:ly,children:"Run `/health`"}),X&&(0,a.jsx)("pre",{children:JSON.stringify(X,null,2)})]})}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)(x.Z,{numItems:4,className:"mt-2 mb-2",children:[(0,a.jsxs)(eh.Z,{children:[(0,a.jsx)(_.Z,{children:"Select Time Range"}),(0,a.jsx)(es.Z,{enableSelect:!0,value:e4,className:"mr-2",onValueChange:e=>{e5(e),lb(eM,e.from,e.to)}})]}),(0,a.jsxs)(eh.Z,{className:"ml-2",children:[(0,a.jsx)(_.Z,{children:"Select Model Group"}),(0,a.jsx)(B.Z,{defaultValue:eM||eR[0],value:eM||eR[0],children:eR.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>lb(e,e4.from,e4.to),children:e},l))})]}),(0,a.jsx)(eh.Z,{children:(0,a.jsx)(ep.Z,{trigger:"click",content:lv,overlayStyle:{width:"20vw"},children:(0,a.jsx)(p.Z,{icon:eZ.Z,size:"md",variant:"secondary",className:"mt-4 ml-2",style:{border:"none"},onClick:()=>ln(!0)})})})]}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsx)(eh.Z,{children:(0,a.jsx)(F.Z,{className:"mr-2 max-h-[400px] min-h-[400px]",children:(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{variant:"line",defaultValue:"1",children:[(0,a.jsx)(et.Z,{value:"1",children:"Avg. Latency per Token"}),(0,a.jsx)(et.Z,{value:"2",children:"✨ Time to first token"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsxs)(er.Z,{children:[(0,a.jsx)("p",{className:"text-gray-500 italic",children:" (seconds/token)"}),(0,a.jsx)(_.Z,{className:"text-gray-500 italic mt-1 mb-1",children:"average Latency for successfull requests divided by the total tokens"}),eV&&ez&&(0,a.jsx)(ec.Z,{title:"Model Latency",className:"h-72",data:eV,showLegend:!1,index:"date",categories:ez,connectNulls:!0,customTooltip:lk})]}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ek,{modelMetrics:eK,modelMetricsCategories:eH,customTooltip:lk,premiumUser:h})})]})]})})}),(0,a.jsx)(eh.Z,{children:(0,a.jsx)(F.Z,{className:"ml-2 max-h-[400px] min-h-[400px] overflow-y-auto",children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Deployment"}),(0,a.jsx)(q.Z,{children:"Success Responses"}),(0,a.jsxs)(q.Z,{children:["Slow Responses ",(0,a.jsx)("p",{children:"Success Responses taking 600+s"})]})]})}),(0,a.jsx)(L.Z,{children:e1.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.api_base}),(0,a.jsx)(U.Z,{children:e.total_count}),(0,a.jsx)(U.Z,{children:e.slow_count})]},l))})]})})})]}),(0,a.jsx)(x.Z,{numItems:1,className:"gap-2 w-full mt-2",children:(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(y.Z,{children:["All Exceptions for ",eM]}),(0,a.jsx)(em.Z,{className:"h-60",data:eY,index:"model",categories:eX,stack:!0,yAxisWidth:30})]})}),(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 w-full mt-2",children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(y.Z,{children:["All Up Rate Limit Errors (429) for ",eM]}),(0,a.jsxs)(x.Z,{numItems:1,children:[(0,a.jsxs)(eh.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Num Rate Limit Errors ",e7.sum_num_rate_limit_exceptions]}),(0,a.jsx)(em.Z,{className:"h-40",data:e7.daily_data,index:"date",colors:["rose"],categories:["num_rate_limit_exceptions"],onValueChange:e=>console.log(e)})]}),(0,a.jsx)(eh.Z,{})]})]}),h?(0,a.jsx)(a.Fragment,{children:ll.map((e,l)=>(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:e.api_base?e.api_base:"Unknown API Base"}),(0,a.jsx)(x.Z,{numItems:1,children:(0,a.jsxs)(eh.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Num Rate Limit Errors (429) ",e.sum_num_rate_limit_exceptions]}),(0,a.jsx)(em.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["rose"],categories:["num_rate_limit_exceptions"],onValueChange:e=>console.log(e)})]})})]},l))}):(0,a.jsx)(a.Fragment,{children:ll&&ll.length>0&&ll.slice(0,1).map((e,l)=>(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"✨ Rate Limit Errors by Deployment"}),(0,a.jsx)("p",{className:"mb-2 text-gray-500 italic text-[12px]",children:"Upgrade to see exceptions for all deployments"}),(0,a.jsx)(p.Z,{variant:"primary",className:"mb-2",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get Free Trial"})}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:e.api_base}),(0,a.jsx)(x.Z,{numItems:1,children:(0,a.jsxs)(eh.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Num Rate Limit Errors ",e.sum_num_rate_limit_exceptions]}),(0,a.jsx)(em.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["rose"],categories:["num_rate_limit_exceptions"],onValueChange:e=>console.log(e)})]})})]})]},l))})]})]}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)("div",{className:"flex items-center",children:[(0,a.jsx)(_.Z,{children:"Filter by Public Model Name"}),(0,a.jsx)(B.Z,{className:"mb-4 mt-2 ml-2 w-50",defaultValue:eM||eR[0],value:eM||eR[0],onValueChange:e=>eD(e),children:eR.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>eD(e),children:e},l))})]}),(0,a.jsxs)(y.Z,{children:["Retry Policy for ",eM]}),(0,a.jsx)(_.Z,{className:"mb-6",children:"How many retries should be attempted based on the Exception"}),eC&&(0,a.jsx)("table",{children:(0,a.jsx)("tbody",{children:Object.entries(eC).map((e,l)=>{var s;let[t,n]=e,r=null==e8?void 0:null===(s=e8[eM])||void 0===s?void 0:s[n];return null==r&&(r=e6),(0,a.jsxs)("tr",{className:"flex justify-between items-center mt-2",children:[(0,a.jsx)("td",{children:(0,a.jsx)(_.Z,{children:t})}),(0,a.jsx)("td",{children:(0,a.jsx)(I.Z,{className:"ml-5",value:r,min:0,step:1,onChange:e=>{e3(l=>{var s;let t=null!==(s=null==l?void 0:l[eM])&&void 0!==s?s:{};return{...null!=l?l:{},[eM]:{...t,[n]:e}}})}})})]},l)})})}),(0,a.jsx)(p.Z,{className:"mt-6 mr-8",onClick:lp,children:"Save"})]})]})]})})},eE=e=>{let{isInvitationLinkModalVisible:l,setIsInvitationLinkModalVisible:s,baseUrl:t,invitationLinkData:n}=e,{Title:r,Paragraph:i}=Q.default;return(0,a.jsxs)(w.Z,{title:"Invitation Link",visible:l,width:800,footer:null,onOk:()=>{s(!1)},onCancel:()=>{s(!1)},children:[(0,a.jsx)(i,{children:"Copy and send the generated link to onboard this user to the proxy."}),(0,a.jsxs)("div",{className:"flex justify-between pt-5 pb-2",children:[(0,a.jsx)(_.Z,{className:"text-base",children:"User ID"}),(0,a.jsx)(_.Z,{children:null==n?void 0:n.user_id})]}),(0,a.jsxs)("div",{className:"flex justify-between pt-5 pb-2",children:[(0,a.jsx)(_.Z,{children:"Invitation Link"}),(0,a.jsxs)(_.Z,{children:[t,"/ui?invitation_id=",null==n?void 0:n.id]})]}),(0,a.jsxs)("div",{className:"flex justify-end mt-5",children:[(0,a.jsx)("div",{}),(0,a.jsx)(b.CopyToClipboard,{text:"".concat(t,"/ui?invitation_id=").concat(null==n?void 0:n.id),onCopy:()=>S.ZP.success("Copied!"),children:(0,a.jsx)(p.Z,{variant:"primary",children:"Copy invitation link"})})]})]})};let{Option:eO}=v.default;var eR=e=>{let{userID:l,accessToken:s,teams:t,possibleUIRoles:n}=e,[o]=k.Z.useForm(),[d,c]=(0,r.useState)(!1),[m,h]=(0,r.useState)(null),[x,g]=(0,r.useState)([]),[Z,f]=(0,r.useState)(!1),[y,b]=(0,r.useState)(null),I=(0,i.useRouter)(),[C,P]=(0,r.useState)("");(0,r.useEffect)(()=>{(async()=>{try{let e=await (0,u.So)(s,l,"any"),t=[];for(let l=0;l{if(I){let{protocol:e,host:l}=window.location;P("".concat(e,"/").concat(l))}},[I]);let T=async e=>{try{var t;S.ZP.info("Making API Call"),c(!0),console.log("formValues in create user:",e);let n=await (0,u.Ov)(s,null,e);console.log("user create Response:",n),h(n.key);let a=(null===(t=n.data)||void 0===t?void 0:t.user_id)||n.user_id;(0,u.XO)(s,a).then(e=>{b(e),f(!0)}),S.ZP.success("API user Created"),o.resetFields(),localStorage.removeItem("userData"+l)}catch(e){console.error("Error creating the user:",e)}};return(0,a.jsxs)("div",{children:[(0,a.jsx)(p.Z,{className:"mx-auto mb-0",onClick:()=>c(!0),children:"+ Invite User"}),(0,a.jsxs)(w.Z,{title:"Invite User",visible:d,width:800,footer:null,onOk:()=>{c(!1),o.resetFields()},onCancel:()=>{c(!1),h(null),o.resetFields()},children:[(0,a.jsx)(_.Z,{className:"mb-1",children:"Create a User who can own keys"}),(0,a.jsxs)(k.Z,{form:o,onFinish:T,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsx)(k.Z.Item,{label:"User Email",name:"user_email",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(k.Z.Item,{label:"User Role",name:"user_role",children:(0,a.jsx)(v.default,{children:n&&Object.entries(n).map(e=>{let[l,{ui_label:s,description:t}]=e;return(0,a.jsx)(K.Z,{value:l,title:s,children:(0,a.jsxs)("div",{className:"flex",children:[s," ",(0,a.jsx)("p",{className:"ml-2",style:{color:"gray",fontSize:"12px"},children:t})]})},l)})})}),(0,a.jsx)(k.Z.Item,{label:"Team ID",name:"team_id",children:(0,a.jsx)(v.default,{placeholder:"Select Team ID",style:{width:"100%"},children:t?t.map(e=>(0,a.jsx)(eO,{value:e.team_id,children:e.team_alias},e.team_id)):(0,a.jsx)(eO,{value:null,children:"Default Team"},"default")})}),(0,a.jsx)(k.Z.Item,{label:"Metadata",name:"metadata",children:(0,a.jsx)(N.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Create User"})})]})]}),m&&(0,a.jsx)(eE,{isInvitationLinkModalVisible:Z,setIsInvitationLinkModalVisible:f,baseUrl:C,invitationLinkData:y})]})},eF=e=>{let{visible:l,possibleUIRoles:s,onCancel:t,user:n,onSubmit:i}=e,[o,d]=(0,r.useState)(n),[c]=k.Z.useForm();(0,r.useEffect)(()=>{c.resetFields()},[n]);let m=async()=>{c.resetFields(),t()},u=async e=>{i(e),c.resetFields(),t()};return n?(0,a.jsx)(w.Z,{visible:l,onCancel:m,footer:null,title:"Edit User "+n.user_id,width:1e3,children:(0,a.jsx)(k.Z,{form:c,onFinish:u,initialValues:n,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"User Email",tooltip:"Email of the User",name:"user_email",children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(k.Z.Item,{label:"user_id",name:"user_id",hidden:!0,children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(k.Z.Item,{label:"User Role",name:"user_role",children:(0,a.jsx)(v.default,{children:s&&Object.entries(s).map(e=>{let[l,{ui_label:s,description:t}]=e;return(0,a.jsx)(K.Z,{value:l,title:s,children:(0,a.jsxs)("div",{className:"flex",children:[s," ",(0,a.jsx)("p",{className:"ml-2",style:{color:"gray",fontSize:"12px"},children:t})]})},l)})})}),(0,a.jsx)(k.Z.Item,{label:"Spend (USD)",name:"spend",tooltip:"(float) - Spend of all LLM calls completed by this user",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(k.Z.Item,{label:"User Budget (USD)",name:"max_budget",tooltip:"(float) - Maximum budget of this user",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})})}):null},eM=e=>{let{accessToken:l,token:s,keys:t,userRole:n,userID:i,teams:o,setKeys:d}=e,[c,m]=(0,r.useState)(null),[h,p]=(0,r.useState)(null),[j,g]=(0,r.useState)(0),[Z,f]=r.useState(null),[_,y]=(0,r.useState)(null),[b,v]=(0,r.useState)(!1),[k,w]=(0,r.useState)(null),[N,I]=(0,r.useState)({}),A=async()=>{w(null),v(!1)},C=async e=>{if(console.log("inside handleEditSubmit:",e),l&&s&&n&&i){try{await (0,u.pf)(l,e,null),S.ZP.success("User ".concat(e.user_id," updated successfully"))}catch(e){console.error("There was an error updating the user",e)}c&&m(c.map(l=>l.user_id===e.user_id?e:l)),w(null),v(!1)}};return((0,r.useEffect)(()=>{if(!l||!s||!n||!i)return;let e=async()=>{try{let e=await (0,u.Br)(l,null,n,!0,j,25);console.log("user data response:",e),m(e);let s=await (0,u.lg)(l);I(s)}catch(e){console.error("There was an error fetching the model data",e)}};l&&s&&n&&i&&e()},[l,s,n,i,j]),c&&l&&s&&n&&i)?(0,a.jsx)("div",{style:{width:"100%"},children:(0,a.jsxs)(x.Z,{className:"gap-2 p-2 h-[90vh] w-full mt-8",children:[(0,a.jsx)(eR,{userID:i,accessToken:l,teams:o,possibleUIRoles:N}),(0,a.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[90vh] mb-4",children:[(0,a.jsx)("div",{className:"mb-4 mt-1"}),(0,a.jsx)(en.Z,{children:(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsxs)(D.Z,{className:"mt-5",children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"User ID"}),(0,a.jsx)(q.Z,{children:"User Email"}),(0,a.jsx)(q.Z,{children:"Role"}),(0,a.jsx)(q.Z,{children:"User Spend ($ USD)"}),(0,a.jsx)(q.Z,{children:"User Max Budget ($ USD)"}),(0,a.jsx)(q.Z,{children:"API Keys"}),(0,a.jsx)(q.Z,{})]})}),(0,a.jsx)(L.Z,{children:c.map(e=>{var l,s;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.user_id||"-"}),(0,a.jsx)(U.Z,{children:e.user_email||"-"}),(0,a.jsx)(U.Z,{children:(null==N?void 0:null===(l=N[null==e?void 0:e.user_role])||void 0===l?void 0:l.ui_label)||"-"}),(0,a.jsx)(U.Z,{children:e.spend?null===(s=e.spend)||void 0===s?void 0:s.toFixed(2):"-"}),(0,a.jsx)(U.Z,{children:e.max_budget?e.max_budget:"Unlimited"}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(x.Z,{numItems:2,children:e&&e.key_aliases&&e.key_aliases.filter(e=>null!==e).length>0?(0,a.jsxs)(R.Z,{size:"xs",color:"indigo",children:[e.key_aliases.filter(e=>null!==e).length,"\xa0Keys"]}):(0,a.jsx)(R.Z,{size:"xs",color:"gray",children:"No Keys"})})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(M.Z,{icon:E.Z,onClick:()=>{w(e),v(!0)},children:"View Keys"})})]},e.user_id)})})]})}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)("div",{className:"flex items-center",children:[(0,a.jsx)("div",{className:"flex-1"}),(0,a.jsx)("div",{className:"flex-1 flex justify-between items-center"})]})})]})}),(0,a.jsx)(eF,{visible:b,possibleUIRoles:N,onCancel:A,user:k,onSubmit:C})]}),function(){if(!c)return null;let e=Math.ceil(c.length/25);return(0,a.jsxs)("div",{className:"flex justify-between items-center",children:[(0,a.jsxs)("div",{children:["Showing Page ",j+1," of ",e]}),(0,a.jsxs)("div",{className:"flex",children:[(0,a.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-l focus:outline-none",disabled:0===j,onClick:()=>g(j-1),children:"← Prev"}),(0,a.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-r focus:outline-none",onClick:()=>{g(j+1)},children:"Next →"})]})]})}()]})}):(0,a.jsx)("div",{children:"Loading..."})},eD=e=>{let{teams:l,searchParams:s,accessToken:t,setTeams:n,userID:i,userRole:o}=e,[d]=k.Z.useForm(),[c]=k.Z.useForm(),{Title:m,Paragraph:g}=Q.default,[Z,f]=(0,r.useState)(""),[y,b]=(0,r.useState)(!1),[C,P]=(0,r.useState)(l?l[0]:null),[T,W]=(0,r.useState)(!1),[H,G]=(0,r.useState)(!1),[Y,J]=(0,r.useState)([]),[X,$]=(0,r.useState)(!1),[ee,el]=(0,r.useState)(null),[es,et]=(0,r.useState)({}),en=e=>{P(e),b(!0)},ea=async e=>{let s=e.team_id;if(console.log("handleEditSubmit:",e),null==t)return;let a=await (0,u.Gh)(t,e);l&&n(l.map(e=>e.team_id===s?a.data:e)),S.ZP.success("Team updated successfully"),b(!1),P(null)},er=async e=>{el(e),$(!0)},ei=async()=>{if(null!=ee&&null!=l&&null!=t){try{await (0,u.rs)(t,ee);let e=l.filter(e=>e.team_id!==ee);n(e)}catch(e){console.error("Error deleting the team:",e)}$(!1),el(null)}};(0,r.useEffect)(()=>{let e=async()=>{try{if(null===i||null===o||null===t||null===l)return;console.log("fetching team info:");let e={};for(let s=0;s<(null==l?void 0:l.length);s++){let n=l[s].team_id,a=await (0,u.Xm)(t,n);console.log("teamInfo response:",a),null!==a&&(e={...e,[n]:a})}et(e)}catch(e){console.error("Error fetching team info:",e)}};(async()=>{try{if(null===i||null===o)return;if(null!==t){let e=(await (0,u.So)(t,i,o)).data.map(e=>e.id);console.log("available_model_names:",e),J(e)}}catch(e){console.error("Error fetching user models:",e)}})(),e()},[t,i,o,l]);let eo=async e=>{try{if(null!=t){var s;let a=null==e?void 0:e.team_alias;if((null!==(s=null==l?void 0:l.map(e=>e.team_alias))&&void 0!==s?s:[]).includes(a))throw Error("Team alias ".concat(a," already exists, please pick another alias"));S.ZP.info("Creating Team");let r=await (0,u.hT)(t,e);null!==l?n([...l,r]):n([r]),console.log("response for team create call: ".concat(r)),S.ZP.success("Team created"),W(!1)}}catch(e){console.error("Error creating the team:",e),S.ZP.error("Error creating the team: "+e,20)}},ed=async e=>{try{if(null!=t&&null!=l){S.ZP.info("Adding Member");let s={role:"user",user_email:e.user_email,user_id:e.user_id},a=await (0,u.cu)(t,C.team_id,s);console.log("response for team create call: ".concat(a.data));let r=l.findIndex(e=>(console.log("team.team_id=".concat(e.team_id,"; response.data.team_id=").concat(a.data.team_id)),e.team_id===a.data.team_id));if(console.log("foundIndex: ".concat(r)),-1!==r){let e=[...l];e[r]=a.data,n(e),P(a.data)}G(!1)}}catch(e){console.error("Error creating the team:",e)}};return console.log("received teams ".concat(JSON.stringify(l))),(0,a.jsx)("div",{className:"w-full mx-4",children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 p-8 h-[75vh] w-full mt-2",children:[(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(m,{level:4,children:"All Teams"}),(0,a.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:[(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Team Name"}),(0,a.jsx)(q.Z,{children:"Spend (USD)"}),(0,a.jsx)(q.Z,{children:"Budget (USD)"}),(0,a.jsx)(q.Z,{children:"Models"}),(0,a.jsx)(q.Z,{children:"TPM / RPM Limits"}),(0,a.jsx)(q.Z,{children:"Info"})]})}),(0,a.jsx)(L.Z,{children:l&&l.length>0?l.map(e=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{style:{maxWidth:"4px",whiteSpace:"pre-wrap",overflow:"hidden"},children:e.team_alias}),(0,a.jsx)(U.Z,{style:{maxWidth:"4px",whiteSpace:"pre-wrap",overflow:"hidden"},children:e.spend}),(0,a.jsx)(U.Z,{style:{maxWidth:"4px",whiteSpace:"pre-wrap",overflow:"hidden"},children:null!==e.max_budget&&void 0!==e.max_budget?e.max_budget:"No limit"}),(0,a.jsx)(U.Z,{style:{maxWidth:"8-x",whiteSpace:"pre-wrap",overflow:"hidden"},children:Array.isArray(e.models)?(0,a.jsx)("div",{style:{display:"flex",flexDirection:"column"},children:0===e.models.length?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Proxy Models"})}):e.models.map((e,l)=>"all-proxy-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Proxy Models"})},l):(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"blue",children:(0,a.jsx)(_.Z,{children:e.length>30?"".concat(e.slice(0,30),"..."):e})},l))}):null}),(0,a.jsx)(U.Z,{style:{maxWidth:"4px",whiteSpace:"pre-wrap",overflow:"hidden"},children:(0,a.jsxs)(_.Z,{children:["TPM: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,a.jsx)("br",{}),"RPM:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,a.jsxs)(U.Z,{children:[(0,a.jsxs)(_.Z,{children:[es&&e.team_id&&es[e.team_id]&&es[e.team_id].keys&&es[e.team_id].keys.length," ","Keys"]}),(0,a.jsxs)(_.Z,{children:[es&&e.team_id&&es[e.team_id]&&es[e.team_id].team_info&&es[e.team_id].team_info.members_with_roles&&es[e.team_id].team_info.members_with_roles.length," ","Members"]})]}),(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>en(e)}),(0,a.jsx)(M.Z,{onClick:()=>er(e.team_id),icon:O.Z,size:"sm"})]})]},e.team_id)):null})]}),X&&(0,a.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,a.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,a.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,a.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,a.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:""}),(0,a.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,a.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,a.jsx)("div",{className:"sm:flex sm:items-start",children:(0,a.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,a.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Team"}),(0,a.jsx)("div",{className:"mt-2",children:(0,a.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this team ?"})})]})})}),(0,a.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,a.jsx)(p.Z,{onClick:ei,color:"red",className:"ml-2",children:"Delete"}),(0,a.jsx)(p.Z,{onClick:()=>{$(!1),el(null)},children:"Cancel"})]})]})]})})]})]}),(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(p.Z,{className:"mx-auto",onClick:()=>W(!0),children:"+ Create New Team"}),(0,a.jsx)(w.Z,{title:"Create Team",visible:T,width:800,footer:null,onOk:()=>{W(!1),d.resetFields()},onCancel:()=>{W(!1),d.resetFields()},children:(0,a.jsxs)(k.Z,{form:d,onFinish:eo,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{label:"Team Name",name:"team_alias",rules:[{required:!0,message:"Please input a team name"}],children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(k.Z.Item,{label:"Models",name:"models",children:(0,a.jsxs)(v.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:[(0,a.jsx)(v.default.Option,{value:"all-proxy-models",children:"All Proxy Models"},"all-proxy-models"),Y.map(e=>(0,a.jsx)(v.default.Option,{value:e,children:e},e))]})}),(0,a.jsx)(k.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})}),(0,a.jsx)(k.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(k.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,a.jsx)(I.Z,{step:1,width:400})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Create Team"})})]})})]}),(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(m,{level:4,children:"Team Members"}),(0,a.jsx)(g,{children:"If you belong to multiple teams, this setting controls which teams members you see."}),l&&l.length>0?(0,a.jsx)(B.Z,{defaultValue:"0",children:l.map((e,l)=>(0,a.jsx)(K.Z,{value:String(l),onClick:()=>{P(e)},children:e.team_alias},l))}):(0,a.jsxs)(g,{children:["No team created. ",(0,a.jsx)("b",{children:"Defaulting to personal account."})]})]}),(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Member Name"}),(0,a.jsx)(q.Z,{children:"Role"})]})}),(0,a.jsx)(L.Z,{children:C?C.members_with_roles.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,a.jsx)(U.Z,{children:e.role})]},l)):null})]})}),C&&(0,a.jsx)(e=>{let{visible:l,onCancel:s,team:t,onSubmit:n}=e,[r]=k.Z.useForm();return(0,a.jsx)(w.Z,{title:"Edit Team",visible:l,width:800,footer:null,onOk:()=>{r.validateFields().then(e=>{n({...e,team_id:t.team_id}),r.resetFields()}).catch(e=>{console.error("Validation failed:",e)})},onCancel:s,children:(0,a.jsxs)(k.Z,{form:r,onFinish:ea,initialValues:t,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{label:"Team Name",name:"team_alias",rules:[{required:!0,message:"Please input a team name"}],children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(k.Z.Item,{label:"Models",name:"models",children:(0,a.jsxs)(v.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:[(0,a.jsx)(v.default.Option,{value:"all-proxy-models",children:"All Proxy Models"},"all-proxy-models"),Y&&Y.map(e=>(0,a.jsx)(v.default.Option,{value:e,children:e},e))]})}),(0,a.jsx)(k.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})}),(0,a.jsx)(k.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(k.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(k.Z.Item,{label:"Requests per minute Limit (RPM)",name:"team_id",hidden:!0})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Edit Team"})})]})})},{visible:y,onCancel:()=>{b(!1),P(null)},team:C,onSubmit:ea})]}),(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(p.Z,{className:"mx-auto mb-5",onClick:()=>G(!0),children:"+ Add member"}),(0,a.jsx)(w.Z,{title:"Add member",visible:H,width:800,footer:null,onOk:()=>{G(!1),c.resetFields()},onCancel:()=>{G(!1),c.resetFields()},children:(0,a.jsxs)(k.Z,{form:d,onFinish:ed,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,a.jsx)(N.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,a.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,a.jsx)(k.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,a.jsx)(N.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})})},eL=e=>{let l,{searchParams:s,accessToken:t,showSSOBanner:n,premiumUser:o}=e,[d]=k.Z.useForm(),[c]=k.Z.useForm(),{Title:m,Paragraph:j}=Q.default,[g,Z]=(0,r.useState)(""),[f,y]=(0,r.useState)(null),[b,v]=(0,r.useState)(null),[I,C]=(0,r.useState)(!1),[P,T]=(0,r.useState)(!1),[O,R]=(0,r.useState)(!1),[W,H]=(0,r.useState)(!1),[G,Y]=(0,r.useState)(!1),[J,X]=(0,r.useState)(!1),[$,ee]=(0,r.useState)(!1),[el,es]=(0,r.useState)(!1),[et,en]=(0,r.useState)(!1),[ea,er]=(0,r.useState)([]),[ei,eo]=(0,r.useState)(null),ed=(0,i.useRouter)(),[ec,em]=(0,r.useState)(null),[eu,eh]=(0,r.useState)(""),ex="All IP Addresses Allowed";try{l=window.location.origin}catch(e){l=""}l+="/fallback/login";let ep=async()=>{try{if(!0!==o){S.ZP.error("This feature is only available for premium users. Please upgrade your account.");return}if(t){let e=await (0,u.PT)(t);er(e&&e.length>0?e:[ex])}else er([ex])}catch(e){console.error("Error fetching allowed IPs:",e),S.ZP.error("Failed to fetch allowed IPs ".concat(e)),er([ex])}finally{!0===o&&ee(!0)}},ej=async e=>{try{if(t){await (0,u.eH)(t,e.ip);let l=await (0,u.PT)(t);er(l),S.ZP.success("IP address added successfully")}}catch(e){console.error("Error adding IP:",e),S.ZP.error("Failed to add IP address ".concat(e))}finally{es(!1)}},eg=async e=>{eo(e),en(!0)},eZ=async()=>{if(ei&&t)try{await (0,u.$I)(t,ei);let e=await (0,u.PT)(t);er(e.length>0?e:[ex]),S.ZP.success("IP address deleted successfully")}catch(e){console.error("Error deleting IP:",e),S.ZP.error("Failed to delete IP address ".concat(e))}finally{en(!1),eo(null)}},ef=()=>{X(!1)},e_=["proxy_admin","proxy_admin_viewer"];(0,r.useEffect)(()=>{if(ed){let{protocol:e,host:l}=window.location;eh("".concat(e,"//").concat(l))}},[ed]),(0,r.useEffect)(()=>{(async()=>{if(null!=t){let e=[],l=await (0,u.Xd)(t,"proxy_admin_viewer");l.forEach(l=>{e.push({user_role:l.user_role,user_id:l.user_id,user_email:l.user_email})}),console.log("proxy viewers: ".concat(l));let s=await (0,u.Xd)(t,"proxy_admin");s.forEach(l=>{e.push({user_role:l.user_role,user_id:l.user_id,user_email:l.user_email})}),console.log("proxy admins: ".concat(s)),console.log("combinedList: ".concat(e)),y(e),em(await (0,u.lg)(t))}})()},[t]);let ey=()=>{H(!1),c.resetFields(),d.resetFields()},ev=()=>{H(!1),c.resetFields(),d.resetFields()},ek=e=>(0,a.jsxs)(k.Z,{form:d,onFinish:e,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsx)(a.Fragment,{children:(0,a.jsx)(k.Z.Item,{label:"Email",name:"user_email",className:"mb-8 mt-4",children:(0,a.jsx)(N.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})})}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},className:"mt-4",children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add member"})})]}),eS=(e,l,s)=>(0,a.jsxs)(k.Z,{form:d,onFinish:e,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"User Role",name:"user_role",labelCol:{span:10},labelAlign:"left",children:(0,a.jsx)(B.Z,{value:l,children:e_.map((e,l)=>(0,a.jsx)(K.Z,{value:e,children:e},l))})}),(0,a.jsx)(k.Z.Item,{label:"Team ID",name:"user_id",hidden:!0,initialValue:s,valuePropName:"user_id",className:"mt-8",children:(0,a.jsx)(N.Z,{value:s,disabled:!0})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Update role"})})]}),ew=async e=>{try{if(null!=t&&null!=f){S.ZP.info("Making API Call");let l=await (0,u.pf)(t,e,null);console.log("response for team create call: ".concat(l));let s=f.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(l.user_id)),e.user_id===l.user_id));console.log("foundIndex: ".concat(s)),-1==s&&(console.log("updates admin with new user"),f.push(l),y(f)),S.ZP.success("Refresh tab to see updated user role"),H(!1)}}catch(e){console.error("Error creating the key:",e)}},eN=async e=>{try{if(null!=t&&null!=f){var l;S.ZP.info("Making API Call");let s=await (0,u.pf)(t,e,"proxy_admin_viewer");console.log("response for team create call: ".concat(s));let n=(null===(l=s.data)||void 0===l?void 0:l.user_id)||s.user_id;(0,u.XO)(t,n).then(e=>{v(e),C(!0)});let a=f.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(s.user_id)),e.user_id===s.user_id));console.log("foundIndex: ".concat(a)),-1==a&&(console.log("updates admin with new user"),f.push(s),y(f)),d.resetFields(),T(!1)}}catch(e){console.error("Error creating the key:",e)}},eI=async e=>{try{if(null!=t&&null!=f){var l;S.ZP.info("Making API Call"),e.user_email,e.user_id;let s=await (0,u.pf)(t,e,"proxy_admin"),n=(null===(l=s.data)||void 0===l?void 0:l.user_id)||s.user_id;(0,u.XO)(t,n).then(e=>{v(e),C(!0)}),console.log("response for team create call: ".concat(s));let a=f.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(n)),e.user_id===s.user_id));console.log("foundIndex: ".concat(a)),-1==a&&(console.log("updates admin with new user"),f.push(s),y(f)),d.resetFields(),R(!1)}}catch(e){console.error("Error creating the key:",e)}},eA=async e=>{if(null==t)return;let l={environment_variables:{PROXY_BASE_URL:e.proxy_base_url,GOOGLE_CLIENT_ID:e.google_client_id,GOOGLE_CLIENT_SECRET:e.google_client_secret}};(0,u.K_)(t,l)};return console.log("admins: ".concat(null==f?void 0:f.length)),(0,a.jsxs)("div",{className:"w-full m-2 mt-2 p-8",children:[(0,a.jsx)(m,{level:4,children:"Admin Access "}),(0,a.jsxs)(j,{children:[n&&(0,a.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access",children:"Requires SSO Setup"}),(0,a.jsx)("br",{}),(0,a.jsx)("b",{children:"Proxy Admin: "})," Can create keys, teams, users, add models, etc."," ",(0,a.jsx)("br",{}),(0,a.jsx)("b",{children:"Proxy Admin Viewer: "}),"Can just view spend. They cannot create keys, teams or grant users access to new models."," "]}),(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 p-2 w-full",children:[(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Member Name"}),(0,a.jsx)(q.Z,{children:"Role"})]})}),(0,a.jsx)(L.Z,{children:f?f.map((e,l)=>{var s;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,a.jsxs)(U.Z,{children:[" ",(null==ec?void 0:null===(s=ec[null==e?void 0:e.user_role])||void 0===s?void 0:s.ui_label)||"-"]}),(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>H(!0)}),(0,a.jsx)(w.Z,{title:"Update role",visible:W,width:800,footer:null,onOk:ey,onCancel:ev,children:eS(ew,e.user_role,e.user_id)})]})]},l)}):null})]})})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)("div",{className:"flex justify-start",children:[(0,a.jsx)(p.Z,{className:"mr-4 mb-5",onClick:()=>R(!0),children:"+ Add admin"}),(0,a.jsx)(w.Z,{title:"Add admin",visible:O,width:800,footer:null,onOk:()=>{R(!1),c.resetFields(),d.resetFields()},onCancel:()=>{R(!1),C(!1),c.resetFields(),d.resetFields()},children:ek(eI)}),(0,a.jsx)(eE,{isInvitationLinkModalVisible:I,setIsInvitationLinkModalVisible:C,baseUrl:eu,invitationLinkData:b}),(0,a.jsx)(p.Z,{className:"mb-5",onClick:()=>T(!0),children:"+ Add viewer"}),(0,a.jsx)(w.Z,{title:"Add viewer",visible:P,width:800,footer:null,onOk:()=>{T(!1),c.resetFields(),d.resetFields()},onCancel:()=>{T(!1),c.resetFields(),d.resetFields()},children:ek(eN)})]})})]}),(0,a.jsxs)(x.Z,{children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(m,{level:4,children:" ✨ Security Settings"}),(0,a.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"1rem",marginTop:"1rem"},children:[(0,a.jsx)("div",{children:(0,a.jsx)(p.Z,{onClick:()=>!0===o?Y(!0):S.ZP.error("Only premium users can add SSO"),children:"Add SSO"})}),(0,a.jsx)("div",{children:(0,a.jsx)(p.Z,{onClick:ep,children:"Allowed IPs"})})]})]}),(0,a.jsxs)("div",{className:"flex justify-start mb-4",children:[(0,a.jsx)(w.Z,{title:"Add SSO",visible:G,width:800,footer:null,onOk:()=>{Y(!1),d.resetFields()},onCancel:()=>{Y(!1),d.resetFields()},children:(0,a.jsxs)(k.Z,{form:d,onFinish:e=>{eI(e),eA(e),Y(!1),X(!0)},labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{label:"Admin Email",name:"user_email",rules:[{required:!0,message:"Please enter the email of the proxy admin"}],children:(0,a.jsx)(N.Z,{})}),(0,a.jsx)(k.Z.Item,{label:"PROXY BASE URL",name:"proxy_base_url",rules:[{required:!0,message:"Please enter the proxy base url"}],children:(0,a.jsx)(N.Z,{})}),(0,a.jsx)(k.Z.Item,{label:"GOOGLE CLIENT ID",name:"google_client_id",rules:[{required:!0,message:"Please enter the google client id"}],children:(0,a.jsx)(N.Z.Password,{})}),(0,a.jsx)(k.Z.Item,{label:"GOOGLE CLIENT SECRET",name:"google_client_secret",rules:[{required:!0,message:"Please enter the google client secret"}],children:(0,a.jsx)(N.Z.Password,{})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})}),(0,a.jsxs)(w.Z,{title:"SSO Setup Instructions",visible:J,width:800,footer:null,onOk:ef,onCancel:()=>{X(!1)},children:[(0,a.jsx)("p",{children:"Follow these steps to complete the SSO setup:"}),(0,a.jsx)(_.Z,{className:"mt-2",children:"1. DO NOT Exit this TAB"}),(0,a.jsx)(_.Z,{className:"mt-2",children:"2. Open a new tab, visit your proxy base url"}),(0,a.jsx)(_.Z,{className:"mt-2",children:"3. Confirm your SSO is configured correctly and you can login on the new Tab"}),(0,a.jsx)(_.Z,{className:"mt-2",children:"4. If Step 3 is successful, you can close this tab"}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{onClick:ef,children:"Done"})})]}),(0,a.jsx)(w.Z,{title:"Manage Allowed IP Addresses",width:800,visible:$,onCancel:()=>ee(!1),footer:[(0,a.jsx)(p.Z,{className:"mx-1",onClick:()=>es(!0),children:"Add IP Address"},"add"),(0,a.jsx)(p.Z,{onClick:()=>ee(!1),children:"Close"},"close")],children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"IP Address"}),(0,a.jsx)(q.Z,{className:"text-right",children:"Action"})]})}),(0,a.jsx)(L.Z,{children:ea.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e}),(0,a.jsx)(U.Z,{className:"text-right",children:e!==ex&&(0,a.jsx)(p.Z,{onClick:()=>eg(e),color:"red",size:"xs",children:"Delete"})})]},l))})]})}),(0,a.jsx)(w.Z,{title:"Add Allowed IP Address",visible:el,onCancel:()=>es(!1),footer:null,children:(0,a.jsxs)(k.Z,{onFinish:ej,children:[(0,a.jsx)(k.Z.Item,{name:"ip",rules:[{required:!0,message:"Please enter an IP address"}],children:(0,a.jsx)(N.Z,{placeholder:"Enter IP address"})}),(0,a.jsx)(k.Z.Item,{children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add IP Address"})})]})}),(0,a.jsx)(w.Z,{title:"Confirm Delete",visible:et,onCancel:()=>en(!1),onOk:eZ,footer:[(0,a.jsx)(p.Z,{className:"mx-1",onClick:()=>eZ(),children:"Yes"},"delete"),(0,a.jsx)(p.Z,{onClick:()=>en(!1),children:"Close"},"close")],children:(0,a.jsxs)("p",{children:["Are you sure you want to delete the IP address: ",ei,"?"]})})]}),(0,a.jsxs)(eb.Z,{title:"Login without SSO",color:"teal",children:["If you need to login without sso, you can access"," ",(0,a.jsxs)("a",{href:l,target:"_blank",children:[(0,a.jsx)("b",{children:l})," "]})]})]})]})},eU=s(42556),eV=s(90252),eq=e=>{let{alertingSettings:l,handleInputChange:s,handleResetField:t,handleSubmit:n,premiumUser:r}=e,[i]=k.Z.useForm();return(0,a.jsxs)(k.Z,{form:i,onFinish:()=>{let e=i.getFieldsValue();Object.values(e).some(e=>""===e||null==e)?console.log("Some form fields are empty."):n(e)},labelAlign:"left",children:[l.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsxs)(U.Z,{align:"center",children:[(0,a.jsx)(_.Z,{children:e.field_name}),(0,a.jsx)("p",{style:{fontSize:"0.65rem",color:"#808080",fontStyle:"italic"},className:"mt-1",children:e.field_description})]}),e.premium_field?r?(0,a.jsx)(k.Z.Item,{name:e.field_name,children:(0,a.jsx)(U.Z,{children:"Integer"===e.field_type?(0,a.jsx)(I.Z,{step:1,value:e.field_value,onChange:l=>s(e.field_name,l)}):(0,a.jsx)(N.Z,{value:e.field_value,onChange:l=>s(e.field_name,l)})})}):(0,a.jsx)(U.Z,{children:(0,a.jsx)(p.Z,{className:"flex items-center justify-center",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"✨ Enterprise Feature"})})}):(0,a.jsx)(k.Z.Item,{name:e.field_name,className:"mb-0",children:(0,a.jsx)(U.Z,{children:"Integer"===e.field_type?(0,a.jsx)(I.Z,{step:1,value:e.field_value,onChange:l=>s(e.field_name,l),className:"p-0"}):(0,a.jsx)(N.Z,{value:e.field_value,onChange:l=>s(e.field_name,l)})})}),(0,a.jsx)(U.Z,{children:!0==e.stored_in_db?(0,a.jsx)(R.Z,{icon:eV.Z,className:"text-white",children:"In DB"}):!1==e.stored_in_db?(0,a.jsx)(R.Z,{className:"text-gray bg-white outline",children:"In Config"}):(0,a.jsx)(R.Z,{className:"text-gray bg-white outline",children:"Not Set"})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(M.Z,{icon:O.Z,color:"red",onClick:()=>t(e.field_name,l),children:"Reset"})})]},l)),(0,a.jsx)("div",{children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Update Settings"})})]})},ez=e=>{let{accessToken:l,premiumUser:s}=e,[t,n]=(0,r.useState)([]);return console.log("INSIDE ALERTING SETTINGS"),(0,r.useEffect)(()=>{l&&(0,u.RQ)(l).then(e=>{n(e)})},[l]),(0,a.jsx)(eq,{alertingSettings:t,handleInputChange:(e,l)=>{n(t.map(s=>s.field_name===e?{...s,field_value:l}:s))},handleResetField:(e,s)=>{if(l)try{let l=t.map(l=>l.field_name===e?{...l,stored_in_db:null,field_value:l.field_default_value}:l);console.log("INSIDE HANDLE RESET FIELD"),n(l)}catch(e){console.log("ERROR OCCURRED!")}},handleSubmit:e=>{if(!l||null==e||void 0==e)return;let s={};t.forEach(e=>{s[e.field_name]=e.field_value});let n={...e,...s};try{(0,u.jA)(l,"alerting_args",n),S.ZP.success("Wait 10s for proxy to update.")}catch(e){}},premiumUser:s})},eB=s(84406);let{Title:eK,Paragraph:eW}=Q.default;var eH=e=>{let{accessToken:l,userRole:s,userID:t,premiumUser:n}=e,[i,o]=(0,r.useState)([]),[d,c]=(0,r.useState)([]),[m,h]=(0,r.useState)(!1),[g]=k.Z.useForm(),[Z,f]=(0,r.useState)(null),[y,b]=(0,r.useState)([]),[N,I]=(0,r.useState)(""),[C,P]=(0,r.useState)({}),[T,O]=(0,r.useState)([]),[R,B]=(0,r.useState)(!1),[W,H]=(0,r.useState)([]),[G,Y]=(0,r.useState)(null),[J,X]=(0,r.useState)([]),[$,Q]=(0,r.useState)(!1),[ee,el]=(0,r.useState)(null),es=e=>{T.includes(e)?O(T.filter(l=>l!==e)):O([...T,e])},eo={llm_exceptions:"LLM Exceptions",llm_too_slow:"LLM Responses Too Slow",llm_requests_hanging:"LLM Requests Hanging",budget_alerts:"Budget Alerts (API Keys, Users)",db_exceptions:"Database Exceptions (Read/Write)",daily_reports:"Weekly/Monthly Spend Reports",outage_alerts:"Outage Alerts",region_outage_alerts:"Region Outage Alerts"};(0,r.useEffect)(()=>{l&&s&&t&&(0,u.BL)(l,t,s).then(e=>{console.log("callbacks",e),o(e.callbacks),H(e.available_callbacks);let l=e.alerts;if(console.log("alerts_data",l),l&&l.length>0){let e=l[0];console.log("_alert_info",e);let s=e.variables.SLACK_WEBHOOK_URL;console.log("catch_all_webhook",s),O(e.active_alerts),I(s),P(e.alerts_to_webhook)}c(l)})},[l,s,t]);let ed=e=>T&&T.includes(e),ec=()=>{if(!l)return;let e={};d.filter(e=>"email"===e.name).forEach(l=>{var s;Object.entries(null!==(s=l.variables)&&void 0!==s?s:{}).forEach(l=>{let[s,t]=l,n=document.querySelector('input[name="'.concat(s,'"]'));n&&n.value&&(e[s]=null==n?void 0:n.value)})}),console.log("updatedVariables",e);try{(0,u.K_)(l,{general_settings:{alerting:["email"]},environment_variables:e})}catch(e){S.ZP.error("Failed to update alerts: "+e,20)}S.ZP.success("Email settings updated successfully")},em=async e=>{if(!l)return;let s={};Object.entries(e).forEach(e=>{let[l,t]=e;"callback"!==l&&(s[l]=t)});try{await (0,u.K_)(l,{environment_variables:s}),S.ZP.success("Callback added successfully"),h(!1),g.resetFields(),f(null)}catch(e){S.ZP.error("Failed to add callback: "+e,20)}},eu=async e=>{if(!l)return;let s=null==e?void 0:e.callback,t={};Object.entries(e).forEach(e=>{let[l,s]=e;"callback"!==l&&(t[l]=s)});try{await (0,u.K_)(l,{environment_variables:t,litellm_settings:{success_callback:[s]}}),S.ZP.success("Callback ".concat(s," added successfully")),h(!1),g.resetFields(),f(null)}catch(e){S.ZP.error("Failed to add callback: "+e,20)}},eh=e=>{console.log("inside handleSelectedCallbackChange",e),f(e.litellm_callback_name),console.log("all callbacks",W),e&&e.litellm_callback_params?(X(e.litellm_callback_params),console.log("selectedCallbackParams",J)):X([])};return l?(console.log("callbacks: ".concat(i)),(0,a.jsxs)("div",{className:"w-full mx-4",children:[(0,a.jsx)(x.Z,{numItems:1,className:"gap-2 p-8 w-full mt-2",children:(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{variant:"line",defaultValue:"1",children:[(0,a.jsx)(et.Z,{value:"1",children:"Logging Callbacks"}),(0,a.jsx)(et.Z,{value:"2",children:"Alerting Types"}),(0,a.jsx)(et.Z,{value:"3",children:"Alerting Settings"}),(0,a.jsx)(et.Z,{value:"4",children:"Email Alerts"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsxs)(er.Z,{children:[(0,a.jsx)(eK,{level:4,children:"Active Logging Callbacks"}),(0,a.jsx)(x.Z,{numItems:2,children:(0,a.jsx)(F.Z,{className:"max-h-[50vh]",children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsx)(z.Z,{children:(0,a.jsx)(q.Z,{children:"Callback Name"})})}),(0,a.jsx)(L.Z,{children:i.map((e,s)=>(0,a.jsxs)(z.Z,{className:"flex justify-between",children:[(0,a.jsx)(U.Z,{children:(0,a.jsx)(_.Z,{children:e.name})}),(0,a.jsx)(U.Z,{children:(0,a.jsxs)(x.Z,{numItems:2,className:"flex justify-between",children:[(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>{el(e),Q(!0)}}),(0,a.jsx)(p.Z,{onClick:()=>(0,u.jE)(l,e.name),className:"ml-2",variant:"secondary",children:"Test Callback"})]})})]},s))})]})})}),(0,a.jsx)(p.Z,{className:"mt-2",onClick:()=>B(!0),children:"Add Callback"})]}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(_.Z,{className:"my-2",children:["Alerts are only supported for Slack Webhook URLs. Get your webhook urls from"," ",(0,a.jsx)("a",{href:"https://api.slack.com/messaging/webhooks",target:"_blank",style:{color:"blue"},children:"here"})]}),(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{}),(0,a.jsx)(q.Z,{}),(0,a.jsx)(q.Z,{children:"Slack Webhook URL"})]})}),(0,a.jsx)(L.Z,{children:Object.entries(eo).map((e,l)=>{let[s,t]=e;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:"region_outage_alerts"==s?n?(0,a.jsx)(eU.Z,{id:"switch",name:"switch",checked:ed(s),onChange:()=>es(s)}):(0,a.jsx)(p.Z,{className:"flex items-center justify-center",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"✨ Enterprise Feature"})}):(0,a.jsx)(eU.Z,{id:"switch",name:"switch",checked:ed(s),onChange:()=>es(s)})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(_.Z,{children:t})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(j.Z,{name:s,type:"password",defaultValue:C&&C[s]?C[s]:N})})]},l)})})]}),(0,a.jsx)(p.Z,{size:"xs",className:"mt-2",onClick:()=>{if(!l)return;let e={};Object.entries(eo).forEach(l=>{let[s,t]=l,n=document.querySelector('input[name="'.concat(s,'"]'));console.log("key",s),console.log("webhookInput",n);let a=(null==n?void 0:n.value)||"";console.log("newWebhookValue",a),e[s]=a}),console.log("updatedAlertToWebhooks",e);let s={general_settings:{alert_to_webhook_url:e,alert_types:T}};console.log("payload",s);try{(0,u.K_)(l,s)}catch(e){S.ZP.error("Failed to update alerts: "+e,20)}S.ZP.success("Alerts updated successfully")},children:"Save Changes"}),(0,a.jsx)(p.Z,{onClick:()=>(0,u.jE)(l,"slack"),className:"mx-2",children:"Test Alerts"})]})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ez,{accessToken:l,premiumUser:n})}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(eK,{level:4,children:"Email Settings"}),(0,a.jsxs)(_.Z,{children:[(0,a.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/email",target:"_blank",style:{color:"blue"},children:" LiteLLM Docs: email alerts"})," ",(0,a.jsx)("br",{})]}),(0,a.jsx)("div",{className:"flex w-full",children:d.filter(e=>"email"===e.name).map((e,l)=>{var s;return(0,a.jsx)(U.Z,{children:(0,a.jsx)("ul",{children:(0,a.jsx)(x.Z,{numItems:2,children:Object.entries(null!==(s=e.variables)&&void 0!==s?s:{}).map(e=>{let[l,s]=e;return(0,a.jsxs)("li",{className:"mx-2 my-2",children:[!0!=n&&("EMAIL_LOGO_URL"===l||"EMAIL_SUPPORT_CONTACT"===l)?(0,a.jsxs)("div",{children:[(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:(0,a.jsxs)(_.Z,{className:"mt-2",children:[" ","✨ ",l]})}),(0,a.jsx)(j.Z,{name:l,defaultValue:s,type:"password",disabled:!0,style:{width:"400px"}})]}):(0,a.jsxs)("div",{children:[(0,a.jsx)(_.Z,{className:"mt-2",children:l}),(0,a.jsx)(j.Z,{name:l,defaultValue:s,type:"password",style:{width:"400px"}})]}),(0,a.jsxs)("p",{style:{fontSize:"small",fontStyle:"italic"},children:["SMTP_HOST"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Enter the SMTP host address, e.g. `smtp.resend.com`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"SMTP_PORT"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Enter the SMTP port number, e.g. `587`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"SMTP_USERNAME"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Enter the SMTP username, e.g. `username`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"SMTP_PASSWORD"===l&&(0,a.jsx)("span",{style:{color:"red"},children:" Required * "}),"SMTP_SENDER_EMAIL"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Enter the sender email address, e.g. `sender@berri.ai`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"TEST_EMAIL_ADDRESS"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Email Address to send `Test Email Alert` to. example: `info@berri.ai`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"EMAIL_LOGO_URL"===l&&(0,a.jsx)("div",{style:{color:"gray"},children:"(Optional) Customize the Logo that appears in the email, pass a url to your logo"}),"EMAIL_SUPPORT_CONTACT"===l&&(0,a.jsx)("div",{style:{color:"gray"},children:"(Optional) Customize the support email address that appears in the email. Default is support@berri.ai"})]})]},l)})})})},l)})}),(0,a.jsx)(p.Z,{className:"mt-2",onClick:()=>ec(),children:"Save Changes"}),(0,a.jsx)(p.Z,{onClick:()=>(0,u.jE)(l,"email"),className:"mx-2",children:"Test Email Alerts"})]})})]})]})}),(0,a.jsxs)(w.Z,{title:"Add Logging Callback",visible:R,width:800,onCancel:()=>B(!1),footer:null,children:[(0,a.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/logging",className:"mb-8 mt-4",target:"_blank",style:{color:"blue"},children:" LiteLLM Docs: Logging"}),(0,a.jsx)(k.Z,{form:g,onFinish:eu,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(eB.Z,{label:"Callback",name:"callback",rules:[{required:!0,message:"Please select a callback"}],children:(0,a.jsx)(v.default,{onChange:e=>{let l=W[e];l&&(console.log(l.ui_callback_name),eh(l))},children:W&&Object.values(W).map(e=>(0,a.jsx)(K.Z,{value:e.litellm_callback_name,children:e.ui_callback_name},e.litellm_callback_name))})}),J&&J.map(e=>(0,a.jsx)(eB.Z,{label:e,name:e,rules:[{required:!0,message:"Please enter the value for "+e}],children:(0,a.jsx)(j.Z,{type:"password"})},e)),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})})]}),(0,a.jsx)(w.Z,{visible:$,width:800,title:"Edit ".concat(null==ee?void 0:ee.name," Settings"),onCancel:()=>Q(!1),footer:null,children:(0,a.jsxs)(k.Z,{form:g,onFinish:em,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsx)(a.Fragment,{children:ee&&ee.variables&&Object.entries(ee.variables).map(e=>{let[l,s]=e;return(0,a.jsx)(eB.Z,{label:l,name:l,children:(0,a.jsx)(j.Z,{type:"password",defaultValue:s})},l)})}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})})]})):null};let{Option:eG}=v.default;var eY=e=>{let{models:l,accessToken:s,routerSettings:t,setRouterSettings:n}=e,[i]=k.Z.useForm(),[o,d]=(0,r.useState)(!1),[c,m]=(0,r.useState)("");return(0,a.jsxs)("div",{children:[(0,a.jsx)(p.Z,{className:"mx-auto",onClick:()=>d(!0),children:"+ Add Fallbacks"}),(0,a.jsx)(w.Z,{title:"Add Fallbacks",visible:o,width:800,footer:null,onOk:()=>{d(!1),i.resetFields()},onCancel:()=>{d(!1),i.resetFields()},children:(0,a.jsxs)(k.Z,{form:i,onFinish:e=>{console.log(e);let{model_name:l,models:a}=e,r=[...t.fallbacks||[],{[l]:a}],o={...t,fallbacks:r};console.log(o);try{(0,u.K_)(s,{router_settings:o}),n(o)}catch(e){S.ZP.error("Failed to update router settings: "+e,20)}S.ZP.success("router settings updated successfully"),d(!1),i.resetFields()},labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{label:"Public Model Name",name:"model_name",rules:[{required:!0,message:"Set the model to fallback for"}],help:"required",children:(0,a.jsx)(B.Z,{defaultValue:c,children:l&&l.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>m(e),children:e},l))})}),(0,a.jsx)(k.Z.Item,{label:"Fallback Models",name:"models",rules:[{required:!0,message:"Please select a model"}],help:"required",children:(0,a.jsx)(eo.Z,{value:l,children:l&&l.filter(e=>e!=c).map(e=>(0,a.jsx)(ed.Z,{value:e,children:e},e))})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add Fallbacks"})})]})})]})},eJ=s(12968);async function eX(e,l){console.log("isLocal:",!1);let s=window.location.origin,t=new eJ.ZP.OpenAI({apiKey:l,baseURL:s,dangerouslyAllowBrowser:!0});try{let l=await t.chat.completions.create({model:e,messages:[{role:"user",content:"Hi, this is a test message"}],mock_testing_fallbacks:!0});S.ZP.success((0,a.jsxs)("span",{children:["Test model=",(0,a.jsx)("strong",{children:e}),", received model=",(0,a.jsx)("strong",{children:l.model}),". See"," ",(0,a.jsx)("a",{href:"#",onClick:()=>window.open("https://docs.litellm.ai/docs/proxy/reliability","_blank"),style:{textDecoration:"underline",color:"blue"},children:"curl"})]}))}catch(e){S.ZP.error("Error occurred while generating model response. Please try again. Error: ".concat(e),20)}}let e$={ttl:3600,lowest_latency_buffer:0},eQ=e=>{let{selectedStrategy:l,strategyArgs:s,paramExplanation:t}=e;return(0,a.jsxs)(g.Z,{children:[(0,a.jsx)(f.Z,{className:"text-sm font-medium text-tremor-content-strong dark:text-dark-tremor-content-strong",children:"Routing Strategy Specific Args"}),(0,a.jsx)(Z.Z,{children:"latency-based-routing"==l?(0,a.jsx)(F.Z,{children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Setting"}),(0,a.jsx)(q.Z,{children:"Value"})]})}),(0,a.jsx)(L.Z,{children:Object.entries(s).map(e=>{let[l,s]=e;return(0,a.jsxs)(z.Z,{children:[(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(_.Z,{children:l}),(0,a.jsx)("p",{style:{fontSize:"0.65rem",color:"#808080",fontStyle:"italic"},className:"mt-1",children:t[l]})]}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(j.Z,{name:l,defaultValue:"object"==typeof s?JSON.stringify(s,null,2):s.toString()})})]},l)})})]})}):(0,a.jsx)(_.Z,{children:"No specific settings"})})]})};var e0=e=>{let{accessToken:l,userRole:s,userID:t,modelData:n}=e,[i,o]=(0,r.useState)({}),[d,c]=(0,r.useState)({}),[m,g]=(0,r.useState)([]),[Z,f]=(0,r.useState)(!1),[b]=k.Z.useForm(),[v,w]=(0,r.useState)(null),[N,A]=(0,r.useState)(null),[C,P]=(0,r.useState)(null),T={routing_strategy_args:"(dict) Arguments to pass to the routing strategy",routing_strategy:"(string) Routing strategy to use",allowed_fails:"(int) Number of times a deployment can fail before being added to cooldown",cooldown_time:"(int) time in seconds to cooldown a deployment after failure",num_retries:"(int) Number of retries for failed requests. Defaults to 0.",timeout:"(float) Timeout for requests. Defaults to None.",retry_after:"(int) Minimum time to wait before retrying a failed request",ttl:"(int) Sliding window to look back over when calculating the average latency of a deployment. Default - 1 hour (in seconds).",lowest_latency_buffer:"(float) Shuffle between deployments within this % of the lowest latency. Default - 0 (i.e. always pick lowest latency)."};(0,r.useEffect)(()=>{l&&s&&t&&((0,u.BL)(l,t,s).then(e=>{console.log("callbacks",e);let l=e.router_settings;"model_group_retry_policy"in l&&delete l.model_group_retry_policy,o(l)}),(0,u.YU)(l).then(e=>{g(e)}))},[l,s,t]);let E=async e=>{if(l){console.log("received key: ".concat(e)),console.log("routerSettings['fallbacks']: ".concat(i.fallbacks)),i.fallbacks.map(l=>(e in l&&delete l[e],l));try{await (0,u.K_)(l,{router_settings:i}),o({...i}),A(i.routing_strategy),S.ZP.success("Router settings updated successfully")}catch(e){S.ZP.error("Failed to update router settings: "+e,20)}}},W=(e,l)=>{g(m.map(s=>s.field_name===e?{...s,field_value:l}:s))},H=(e,s)=>{if(!l)return;let t=m[s].field_value;if(null!=t&&void 0!=t)try{(0,u.jA)(l,e,t);let s=m.map(l=>l.field_name===e?{...l,stored_in_db:!0}:l);g(s)}catch(e){}},G=(e,s)=>{if(l)try{(0,u.ao)(l,e);let s=m.map(l=>l.field_name===e?{...l,stored_in_db:null,field_value:null}:l);g(s)}catch(e){}},Y=e=>{if(!l)return;console.log("router_settings",e);let s=Object.fromEntries(Object.entries(e).map(e=>{let[l,s]=e;if("routing_strategy_args"!==l&&"routing_strategy"!==l){var t;return[l,(null===(t=document.querySelector('input[name="'.concat(l,'"]')))||void 0===t?void 0:t.value)||s]}if("routing_strategy"==l)return[l,N];if("routing_strategy_args"==l&&"latency-based-routing"==N){let e={},l=document.querySelector('input[name="lowest_latency_buffer"]'),s=document.querySelector('input[name="ttl"]');return(null==l?void 0:l.value)&&(e.lowest_latency_buffer=Number(l.value)),(null==s?void 0:s.value)&&(e.ttl=Number(s.value)),console.log("setRoutingStrategyArgs: ".concat(e)),["routing_strategy_args",e]}return null}).filter(e=>null!=e));console.log("updatedVariables",s);try{(0,u.K_)(l,{router_settings:s})}catch(e){S.ZP.error("Failed to update router settings: "+e,20)}S.ZP.success("router settings updated successfully")};return l?(0,a.jsx)("div",{className:"w-full mx-4",children:(0,a.jsxs)(en.Z,{className:"gap-2 p-8 h-[75vh] w-full mt-2",children:[(0,a.jsxs)(ea.Z,{variant:"line",defaultValue:"1",children:[(0,a.jsx)(et.Z,{value:"1",children:"Loadbalancing"}),(0,a.jsx)(et.Z,{value:"2",children:"Fallbacks"}),(0,a.jsx)(et.Z,{value:"3",children:"General"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 p-8 w-full mt-2",children:[(0,a.jsx)(y.Z,{children:"Router Settings"}),(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Setting"}),(0,a.jsx)(q.Z,{children:"Value"})]})}),(0,a.jsx)(L.Z,{children:Object.entries(i).filter(e=>{let[l,s]=e;return"fallbacks"!=l&&"context_window_fallbacks"!=l&&"routing_strategy_args"!=l}).map(e=>{let[l,s]=e;return(0,a.jsxs)(z.Z,{children:[(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(_.Z,{children:l}),(0,a.jsx)("p",{style:{fontSize:"0.65rem",color:"#808080",fontStyle:"italic"},className:"mt-1",children:T[l]})]}),(0,a.jsx)(U.Z,{children:"routing_strategy"==l?(0,a.jsxs)(B.Z,{defaultValue:s,className:"w-full max-w-md",onValueChange:A,children:[(0,a.jsx)(K.Z,{value:"usage-based-routing",children:"usage-based-routing"}),(0,a.jsx)(K.Z,{value:"latency-based-routing",children:"latency-based-routing"}),(0,a.jsx)(K.Z,{value:"simple-shuffle",children:"simple-shuffle"})]}):(0,a.jsx)(j.Z,{name:l,defaultValue:"object"==typeof s?JSON.stringify(s,null,2):s.toString()})})]},l)})})]}),(0,a.jsx)(eQ,{selectedStrategy:N,strategyArgs:i&&i.routing_strategy_args&&Object.keys(i.routing_strategy_args).length>0?i.routing_strategy_args:e$,paramExplanation:T})]}),(0,a.jsx)(h.Z,{children:(0,a.jsx)(p.Z,{className:"mt-2",onClick:()=>Y(i),children:"Save Changes"})})]})}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Model Name"}),(0,a.jsx)(q.Z,{children:"Fallbacks"})]})}),(0,a.jsx)(L.Z,{children:i.fallbacks&&i.fallbacks.map((e,s)=>Object.entries(e).map(e=>{let[t,n]=e;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:t}),(0,a.jsx)(U.Z,{children:Array.isArray(n)?n.join(", "):n}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(p.Z,{onClick:()=>eX(t,l),children:"Test Fallback"})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(M.Z,{icon:O.Z,size:"sm",onClick:()=>E(t)})})]},s.toString()+t)}))})]}),(0,a.jsx)(eY,{models:(null==n?void 0:n.data)?n.data.map(e=>e.model_name):[],accessToken:l,routerSettings:i,setRouterSettings:o})]}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(F.Z,{children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Setting"}),(0,a.jsx)(q.Z,{children:"Value"}),(0,a.jsx)(q.Z,{children:"Status"}),(0,a.jsx)(q.Z,{children:"Action"})]})}),(0,a.jsx)(L.Z,{children:m.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(_.Z,{children:e.field_name}),(0,a.jsx)("p",{style:{fontSize:"0.65rem",color:"#808080",fontStyle:"italic"},className:"mt-1",children:e.field_description})]}),(0,a.jsx)(U.Z,{children:"Integer"==e.field_type?(0,a.jsx)(I.Z,{step:1,value:e.field_value,onChange:l=>W(e.field_name,l)}):null}),(0,a.jsx)(U.Z,{children:!0==e.stored_in_db?(0,a.jsx)(R.Z,{icon:eV.Z,className:"text-white",children:"In DB"}):!1==e.stored_in_db?(0,a.jsx)(R.Z,{className:"text-gray bg-white outline",children:"In Config"}):(0,a.jsx)(R.Z,{className:"text-gray bg-white outline",children:"Not Set"})}),(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(p.Z,{onClick:()=>H(e.field_name,l),children:"Update"}),(0,a.jsx)(M.Z,{icon:O.Z,color:"red",onClick:()=>G(e.field_name,l),children:"Reset"})]})]},l))})]})})})]})]})}):null},e1=e=>{let{isModalVisible:l,accessToken:s,setIsModalVisible:t,setBudgetList:n}=e,[r]=k.Z.useForm(),i=async e=>{if(null!=s&&void 0!=s)try{S.ZP.info("Making API Call");let l=await (0,u.Zr)(s,e);console.log("key create Response:",l),n(e=>e?[...e,l]:[l]),S.ZP.success("API Key Created"),r.resetFields()}catch(e){console.error("Error creating the key:",e),S.ZP.error("Error creating the key: ".concat(e),20)}};return(0,a.jsx)(w.Z,{title:"Create Budget",visible:l,width:800,footer:null,onOk:()=>{t(!1),r.resetFields()},onCancel:()=>{t(!1),r.resetFields()},children:(0,a.jsxs)(k.Z,{form:r,onFinish:i,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{label:"Budget ID",name:"budget_id",rules:[{required:!0,message:"Please input a human-friendly name for the budget"}],help:"A human-friendly name for the budget",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(k.Z.Item,{label:"Max Tokens per minute",name:"tpm_limit",help:"Default is model limit.",children:(0,a.jsx)(I.Z,{step:1,precision:2,width:200})}),(0,a.jsx)(k.Z.Item,{label:"Max Requests per minute",name:"rpm_limit",help:"Default is model limit.",children:(0,a.jsx)(I.Z,{step:1,precision:2,width:200})}),(0,a.jsxs)(g.Z,{className:"mt-20 mb-8",children:[(0,a.jsx)(f.Z,{children:(0,a.jsx)("b",{children:"Optional Settings"})}),(0,a.jsxs)(Z.Z,{children:[(0,a.jsx)(k.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})})]})]})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Create Budget"})})]})})},e2=e=>{let{isModalVisible:l,accessToken:s,setIsModalVisible:t,setBudgetList:n,existingBudget:r}=e,[i]=k.Z.useForm(),o=async e=>{if(null!=s&&void 0!=s)try{S.ZP.info("Making API Call");let l=await (0,u.Zr)(s,e);console.log("key create Response:",l),n(e=>e?[...e,l]:[l]),S.ZP.success("API Key Created"),i.resetFields()}catch(e){console.error("Error creating the key:",e),S.ZP.error("Error creating the key: ".concat(e),20)}};return(0,a.jsx)(w.Z,{title:"Edit Budget",visible:l,width:800,footer:null,onOk:()=>{t(!1),i.resetFields()},onCancel:()=>{t(!1),i.resetFields()},children:(0,a.jsxs)(k.Z,{form:i,onFinish:o,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",initialValues:r,children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{label:"Budget ID",name:"budget_id",rules:[{required:!0,message:"Please input a human-friendly name for the budget"}],help:"A human-friendly name for the budget",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(k.Z.Item,{label:"Max Tokens per minute",name:"tpm_limit",help:"Default is model limit.",children:(0,a.jsx)(I.Z,{step:1,precision:2,width:200})}),(0,a.jsx)(k.Z.Item,{label:"Max Requests per minute",name:"rpm_limit",help:"Default is model limit.",children:(0,a.jsx)(I.Z,{step:1,precision:2,width:200})}),(0,a.jsxs)(g.Z,{className:"mt-20 mb-8",children:[(0,a.jsx)(f.Z,{children:(0,a.jsx)("b",{children:"Optional Settings"})}),(0,a.jsxs)(Z.Z,{children:[(0,a.jsx)(k.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})})]})]})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Edit Budget"})})]})})},e4=e=>{let{accessToken:l}=e,[s,t]=(0,r.useState)(!1),[n,i]=(0,r.useState)(!1),[o,d]=(0,r.useState)(null),[c,m]=(0,r.useState)([]);(0,r.useEffect)(()=>{l&&(0,u.O3)(l).then(e=>{m(e)})},[l]);let h=async(e,s)=>{null!=l&&(d(c[s]),i(!0))},x=async(e,s)=>{if(null==l)return;S.ZP.info("Request made"),await (0,u.NV)(l,e);let t=[...c];t.splice(s,1),m(t),S.ZP.success("Budget Deleted.")};return(0,a.jsxs)("div",{className:"w-full mx-auto flex-auto overflow-y-auto m-8 p-2",children:[(0,a.jsx)(p.Z,{size:"sm",variant:"primary",className:"mb-2",onClick:()=>t(!0),children:"+ Create Budget"}),(0,a.jsx)(e1,{accessToken:l,isModalVisible:s,setIsModalVisible:t,setBudgetList:m}),o&&(0,a.jsx)(e2,{accessToken:l,isModalVisible:n,setIsModalVisible:i,setBudgetList:m,existingBudget:o}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(_.Z,{children:"Create a budget to assign to customers."}),(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Budget ID"}),(0,a.jsx)(q.Z,{children:"Max Budget"}),(0,a.jsx)(q.Z,{children:"TPM"}),(0,a.jsx)(q.Z,{children:"RPM"})]})}),(0,a.jsx)(L.Z,{children:c.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.budget_id}),(0,a.jsx)(U.Z,{children:e.max_budget?e.max_budget:"n/a"}),(0,a.jsx)(U.Z,{children:e.tpm_limit?e.tpm_limit:"n/a"}),(0,a.jsx)(U.Z,{children:e.rpm_limit?e.rpm_limit:"n/a"}),(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>h(e.budget_id,l)}),(0,a.jsx)(M.Z,{icon:O.Z,size:"sm",onClick:()=>x(e.budget_id,l)})]},l))})]})]}),(0,a.jsxs)("div",{className:"mt-5",children:[(0,a.jsx)(_.Z,{className:"text-base",children:"How to use budget id"}),(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{children:[(0,a.jsx)(et.Z,{children:"Assign Budget to Customer"}),(0,a.jsx)(et.Z,{children:"Test it (Curl)"}),(0,a.jsx)(et.Z,{children:"Test it (OpenAI SDK)"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"bash",children:"\ncurl -X POST --location '/end_user/new' \n-H 'Authorization: Bearer ' \n-H 'Content-Type: application/json' \n-d '{\"user_id\": \"my-customer-id', \"budget_id\": \"\"}' # \uD83D\uDC48 KEY CHANGE\n\n "})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"bash",children:'\ncurl -X POST --location \'/chat/completions\' \n-H \'Authorization: Bearer \' \n-H \'Content-Type: application/json\' \n-d \'{\n "model": "gpt-3.5-turbo\', \n "messages":[{"role": "user", "content": "Hey, how\'s it going?"}],\n "user": "my-customer-id"\n}\' # \uD83D\uDC48 KEY CHANGE\n\n '})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"python",children:'from openai import OpenAI\nclient = OpenAI(\n base_url="",\n api_key=""\n)\n\ncompletion = client.chat.completions.create(\n model="gpt-3.5-turbo",\n messages=[\n {"role": "system", "content": "You are a helpful assistant."},\n {"role": "user", "content": "Hello!"}\n ],\n user="my-customer-id"\n)\n\nprint(completion.choices[0].message)'})})]})]})]})]})},e5=s(41134),e8=e=>{let{proxySettings:l}=e,s="";return l&&l.PROXY_BASE_URL&&void 0!==l.PROXY_BASE_URL&&(s=l.PROXY_BASE_URL),(0,a.jsx)(a.Fragment,{children:(0,a.jsx)(x.Z,{className:"gap-2 p-8 h-[80vh] w-full mt-2",children:(0,a.jsxs)("div",{className:"mb-5",children:[(0,a.jsx)("p",{className:"text-2xl text-tremor-content-strong dark:text-dark-tremor-content-strong font-semibold",children:"OpenAI Compatible Proxy: API Reference"}),(0,a.jsx)(_.Z,{className:"mt-2 mb-2",children:"LiteLLM is OpenAI Compatible. This means your API Key works with the OpenAI SDK. Just replace the base_url to point to your litellm proxy. Example Below "}),(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{children:[(0,a.jsx)(et.Z,{children:"OpenAI Python SDK"}),(0,a.jsx)(et.Z,{children:"LlamaIndex"}),(0,a.jsx)(et.Z,{children:"Langchain Py"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="'.concat(s,'" # LiteLLM Proxy is OpenAI compatible, Read More: https://docs.litellm.ai/docs/proxy/user_keys\n)\n\nresponse = client.chat.completions.create(\n model="gpt-3.5-turbo", # model to send to the proxy\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ]\n)\n\nprint(response)\n ')})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="azure-gpt-3.5", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="'.concat(s,'", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="').concat(s,'",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n ')})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="'.concat(s,'",\n model = "gpt-3.5-turbo",\n temperature=0.1\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n ')})})]})]})]})})})};async function e3(e,l,s,t){console.log("isLocal:",!1);let n=window.location.origin,a=new eJ.ZP.OpenAI({apiKey:t,baseURL:n,dangerouslyAllowBrowser:!0});try{for await(let t of(await a.chat.completions.create({model:s,stream:!0,messages:[{role:"user",content:e}]})))console.log(t),t.choices[0].delta.content&&l(t.choices[0].delta.content)}catch(e){S.ZP.error("Error occurred while generating model response. Please try again. Error: ".concat(e),20)}}var e6=e=>{let{accessToken:l,token:s,userRole:t,userID:n}=e,[i,o]=(0,r.useState)(""),[d,c]=(0,r.useState)(""),[m,g]=(0,r.useState)([]),[Z,f]=(0,r.useState)(void 0),[y,b]=(0,r.useState)([]);(0,r.useEffect)(()=>{l&&s&&t&&n&&(async()=>{try{let e=await (0,u.So)(l,n,t);if(console.log("model_info:",e),(null==e?void 0:e.data.length)>0){let l=e.data.map(e=>({value:e.id,label:e.id}));if(console.log(l),l.length>0){let e=Array.from(new Set(l));console.log("Unique models:",e),e.sort((e,l)=>e.label.localeCompare(l.label)),console.log("Model info:",y),b(e)}f(e.data[0].id)}}catch(e){console.error("Error fetching model info:",e)}})()},[l,n,t]);let k=(e,l)=>{g(s=>{let t=s[s.length-1];return t&&t.role===e?[...s.slice(0,s.length-1),{role:e,content:t.content+l}]:[...s,{role:e,content:l}]})},S=async()=>{if(""!==d.trim()&&i&&s&&t&&n){g(e=>[...e,{role:"user",content:d}]);try{Z&&await e3(d,e=>k("assistant",e),Z,i)}catch(e){console.error("Error fetching model response",e),k("assistant","Error fetching model response")}c("")}};if(t&&"Admin Viewer"==t){let{Title:e,Paragraph:l}=Q.default;return(0,a.jsxs)("div",{children:[(0,a.jsx)(e,{level:1,children:"Access Denied"}),(0,a.jsx)(l,{children:"Ask your proxy admin for access to test models"})]})}return(0,a.jsx)("div",{style:{width:"100%",position:"relative"},children:(0,a.jsx)(x.Z,{className:"gap-2 p-8 h-[80vh] w-full mt-2",children:(0,a.jsx)(F.Z,{children:(0,a.jsxs)(en.Z,{children:[(0,a.jsx)(ea.Z,{children:(0,a.jsx)(et.Z,{children:"Chat"})}),(0,a.jsx)(ei.Z,{children:(0,a.jsxs)(er.Z,{children:[(0,a.jsx)("div",{className:"sm:max-w-2xl",children:(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsx)(_.Z,{children:"API Key"}),(0,a.jsx)(j.Z,{placeholder:"Type API Key here",type:"password",onValueChange:o,value:i})]}),(0,a.jsxs)(h.Z,{className:"mx-2",children:[(0,a.jsx)(_.Z,{children:"Select Model:"}),(0,a.jsx)(v.default,{placeholder:"Select a Model",onChange:e=>{console.log("selected ".concat(e)),f(e)},options:y,style:{width:"200px"}})]})]})}),(0,a.jsxs)(D.Z,{className:"mt-5",style:{display:"block",maxHeight:"60vh",overflowY:"auto"},children:[(0,a.jsx)(V.Z,{children:(0,a.jsx)(z.Z,{children:(0,a.jsx)(U.Z,{})})}),(0,a.jsx)(L.Z,{children:m.map((e,l)=>(0,a.jsx)(z.Z,{children:(0,a.jsx)(U.Z,{children:"".concat(e.role,": ").concat(e.content)})},l))})]}),(0,a.jsx)("div",{className:"mt-3",style:{position:"absolute",bottom:5,width:"95%"},children:(0,a.jsxs)("div",{className:"flex",children:[(0,a.jsx)(j.Z,{type:"text",value:d,onChange:e=>c(e.target.value),onKeyDown:e=>{"Enter"===e.key&&S()},placeholder:"Type your message..."}),(0,a.jsx)(p.Z,{onClick:S,className:"ml-2",children:"Send"})]})})]})})]})})})})},e9=s(33509),e7=s(95781);let{Sider:le}=e9.default;var ll=e=>{let{setPage:l,userRole:s,defaultSelectedKey:t}=e;return"Admin Viewer"==s?(0,a.jsx)(e9.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,a.jsx)(le,{width:120,children:(0,a.jsxs)(e7.Z,{mode:"inline",defaultSelectedKeys:t||["4"],style:{height:"100%",borderRight:0},children:[(0,a.jsx)(e7.Z.Item,{onClick:()=>l("usage"),children:"Usage"},"1"),(0,a.jsx)(e7.Z.Item,{onClick:()=>l("caching"),children:(0,a.jsx)(_.Z,{children:"Caching"})},"9")]})})}):(0,a.jsx)(e9.default,{style:{minHeight:"100vh",maxWidth:"145px"},children:(0,a.jsx)(le,{width:145,children:(0,a.jsxs)(e7.Z,{mode:"inline",defaultSelectedKeys:t||["1"],style:{height:"100%",borderRight:0},children:[(0,a.jsx)(e7.Z.Item,{onClick:()=>l("api-keys"),children:(0,a.jsx)(_.Z,{children:"Virtual Keys"})},"1"),(0,a.jsx)(e7.Z.Item,{onClick:()=>l("llm-playground"),children:(0,a.jsx)(_.Z,{children:"Test Key"})},"3"),"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("models"),children:(0,a.jsx)(_.Z,{children:"Models"})},"2"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("usage"),children:(0,a.jsx)(_.Z,{children:"Usage"})},"4"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("teams"),children:(0,a.jsx)(_.Z,{children:"Teams"})},"6"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("users"),children:(0,a.jsx)(_.Z,{children:"Internal Users"})},"5"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("settings"),children:(0,a.jsx)(_.Z,{children:"Logging & Alerts"})},"8"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("caching"),children:(0,a.jsx)(_.Z,{children:"Caching"})},"9"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("budgets"),children:(0,a.jsx)(_.Z,{children:"Budgets"})},"10"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("general-settings"),children:(0,a.jsx)(_.Z,{children:"Router Settings"})},"11"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("admin-panel"),children:(0,a.jsx)(_.Z,{children:"Admin Settings"})},"12"):null,(0,a.jsx)(e7.Z.Item,{onClick:()=>l("api_ref"),children:(0,a.jsx)(_.Z,{children:"API Reference"})},"13"),(0,a.jsx)(e7.Z.Item,{onClick:()=>l("model-hub"),children:(0,a.jsx)(_.Z,{children:"Model Hub"})},"15")]})})})},ls=s(67989),lt=s(52703),ln=e=>{let{accessToken:l,token:s,userRole:t,userID:n,keys:i,premiumUser:o}=e,d=new Date,[c,m]=(0,r.useState)([]),[j,g]=(0,r.useState)([]),[Z,f]=(0,r.useState)([]),[b,v]=(0,r.useState)([]),[k,S]=(0,r.useState)([]),[w,N]=(0,r.useState)([]),[I,A]=(0,r.useState)([]),[C,P]=(0,r.useState)([]),[T,E]=(0,r.useState)([]),[O,R]=(0,r.useState)([]),[M,W]=(0,r.useState)({}),[H,Y]=(0,r.useState)([]),[J,X]=(0,r.useState)(""),[$,Q]=(0,r.useState)(["all-tags"]),[ee,eu]=(0,r.useState)({from:new Date(Date.now()-6048e5),to:new Date}),eh=new Date(d.getFullYear(),d.getMonth(),1),ex=new Date(d.getFullYear(),d.getMonth()+1,0),ep=e_(eh),ej=e_(ex);function eg(e){return new Intl.NumberFormat("en-US",{maximumFractionDigits:0,notation:"compact",compactDisplay:"short"}).format(e)}console.log("keys in usage",i),console.log("premium user in usage",o),(0,r.useEffect)(()=>{ef(ee.from,ee.to)},[ee,$]);let eZ=async(e,s,t)=>{if(!e||!s||!l)return;s.setHours(23,59,59,999),e.setHours(0,0,0,0),console.log("uiSelectedKey",t);let n=await (0,u.b1)(l,t,e.toISOString(),s.toISOString());console.log("End user data updated successfully",n),v(n)},ef=async(e,s)=>{e&&s&&l&&(s.setHours(23,59,59,999),e.setHours(0,0,0,0),N((await (0,u.J$)(l,e.toISOString(),s.toISOString(),0===$.length?void 0:$)).spend_per_tag),console.log("Tag spend data updated successfully"))};function e_(e){let l=e.getFullYear(),s=e.getMonth()+1,t=e.getDate();return"".concat(l,"-").concat(s<10?"0"+s:s,"-").concat(t<10?"0"+t:t)}return console.log("Start date is ".concat(ep)),console.log("End date is ".concat(ej)),(0,r.useEffect)(()=>{l&&s&&t&&n&&(async()=>{try{if(console.log("user role: ".concat(t)),"Admin"==t||"Admin Viewer"==t){var e,a;let t=await (0,u.FC)(l);m(t);let n=await (0,u.OU)(l,s,ep,ej);console.log("provider_spend",n),R(n);let r=(await (0,u.tN)(l)).map(e=>({key:(e.key_alias||e.key_name||e.api_key).substring(0,10),spend:e.total_spend}));g(r);let i=(await (0,u.Au)(l)).map(e=>({key:e.model,spend:e.total_spend}));f(i);let o=await (0,u.mR)(l);console.log("teamSpend",o),S(o.daily_spend),P(o.teams);let d=o.total_spend_per_team;d=d.map(e=>(e.name=e.team_id||"",e.value=e.total_spend||0,e.value=e.value.toFixed(2),e)),E(d);let c=await (0,u.X)(l);A(c.tag_names);let h=await (0,u.J$)(l,null===(e=ee.from)||void 0===e?void 0:e.toISOString(),null===(a=ee.to)||void 0===a?void 0:a.toISOString(),void 0);N(h.spend_per_tag);let x=await (0,u.b1)(l,null,void 0,void 0);v(x),console.log("spend/user result",x);let p=await (0,u.wd)(l,ep,ej);W(p);let j=await (0,u.xA)(l,ep,ej);console.log("global activity per model",j),Y(j)}else"App Owner"==t&&await (0,u.HK)(l,s,t,n,ep,ej).then(async e=>{if(console.log("result from spend logs call",e),"daily_spend"in e){let l=e.daily_spend;console.log("daily spend",l),m(l);let s=e.top_api_keys;g(s)}else{let s=(await (0,u.e2)(l,function(e){let l=[];e.forEach(e=>{Object.entries(e).forEach(e=>{let[s,t]=e;"spend"!==s&&"startTime"!==s&&"models"!==s&&"users"!==s&&l.push({key:s,spend:t})})}),l.sort((e,l)=>Number(l.spend)-Number(e.spend));let s=l.slice(0,5).map(e=>e.key);return console.log("topKeys: ".concat(Object.keys(s[0]))),s}(e))).info.map(e=>({key:(e.key_name||e.key_alias).substring(0,10),spend:e.spend}));g(s),m(e)}})}catch(e){console.error("There was an error fetching the data",e)}})()},[l,s,t,n,ep,ej]),(0,a.jsx)("div",{style:{width:"100%"},className:"p-8",children:(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{className:"mt-2",children:[(0,a.jsx)(et.Z,{children:"All Up"}),(0,a.jsx)(et.Z,{children:"Team Based Usage"}),(0,a.jsx)(et.Z,{children:"Customer Usage"}),(0,a.jsx)(et.Z,{children:"Tag Based Usage"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{variant:"solid",className:"mt-1",children:[(0,a.jsx)(et.Z,{children:"Cost"}),(0,a.jsx)(et.Z,{children:"Activity"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsxs)(x.Z,{numItems:2,className:"gap-2 h-[100vh] w-full",children:[(0,a.jsx)(G,{userID:n,userRole:t,accessToken:l,userSpend:null,selectedTeam:null}),(0,a.jsx)(h.Z,{numColSpan:2,children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Monthly Spend"}),(0,a.jsx)(em.Z,{data:c,index:"date",categories:["spend"],colors:["blue"],valueFormatter:e=>"$ ".concat(new Intl.NumberFormat("us").format(e).toString()),yAxisWidth:100,tickGap:5})]})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Top API Keys"}),(0,a.jsx)(em.Z,{className:"mt-4 h-40",data:j,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:80,tickGap:5,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Top Models"}),(0,a.jsx)(em.Z,{className:"mt-4 h-40",data:Z,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,a.jsx)(h.Z,{numColSpan:1}),(0,a.jsx)(h.Z,{numColSpan:2,children:(0,a.jsxs)(F.Z,{className:"mb-2",children:[(0,a.jsx)(y.Z,{children:"✨ Spend by Provider"}),o?(0,a.jsx)(a.Fragment,{children:(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsx)(lt.Z,{className:"mt-4 h-40",variant:"pie",data:O,index:"provider",category:"spend"})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Provider"}),(0,a.jsx)(q.Z,{children:"Spend"})]})}),(0,a.jsx)(L.Z,{children:O.map(e=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.provider}),(0,a.jsx)(U.Z,{children:1e-5>parseFloat(e.spend.toFixed(2))?"less than 0.00":e.spend.toFixed(2)})]},e.provider))})]})})]})}):(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"mb-2 text-gray-500 italic text-[12px]",children:"Upgrade to use this feature"}),(0,a.jsx)(p.Z,{variant:"primary",className:"mb-2",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get Free Trial"})})]})]})})]})}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 h-[75vh] w-full",children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"All Up"}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["API Requests ",eg(M.sum_api_requests)]}),(0,a.jsx)(ec.Z,{className:"h-40",data:M.daily_data,valueFormatter:eg,index:"date",colors:["cyan"],categories:["api_requests"],onValueChange:e=>console.log(e)})]}),(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Tokens ",eg(M.sum_total_tokens)]}),(0,a.jsx)(em.Z,{className:"h-40",data:M.daily_data,valueFormatter:eg,index:"date",colors:["cyan"],categories:["total_tokens"],onValueChange:e=>console.log(e)})]})]})]}),o?(0,a.jsx)(a.Fragment,{children:H.map((e,l)=>(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:e.model}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["API Requests ",eg(e.sum_api_requests)]}),(0,a.jsx)(ec.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["cyan"],categories:["api_requests"],valueFormatter:eg,onValueChange:e=>console.log(e)})]}),(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Tokens ",eg(e.sum_total_tokens)]}),(0,a.jsx)(em.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["cyan"],categories:["total_tokens"],valueFormatter:eg,onValueChange:e=>console.log(e)})]})]})]},l))}):(0,a.jsx)(a.Fragment,{children:H&&H.length>0&&H.slice(0,1).map((e,l)=>(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"✨ Activity by Model"}),(0,a.jsx)("p",{className:"mb-2 text-gray-500 italic text-[12px]",children:"Upgrade to see analytics for all models"}),(0,a.jsx)(p.Z,{variant:"primary",className:"mb-2",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get Free Trial"})}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:e.model}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["API Requests ",eg(e.sum_api_requests)]}),(0,a.jsx)(ec.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["cyan"],categories:["api_requests"],valueFormatter:eg,onValueChange:e=>console.log(e)})]}),(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Tokens ",eg(e.sum_total_tokens)]}),(0,a.jsx)(em.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["cyan"],valueFormatter:eg,categories:["total_tokens"],onValueChange:e=>console.log(e)})]})]})]})]},l))})]})})]})]})}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(x.Z,{numItems:2,className:"gap-2 h-[75vh] w-full",children:[(0,a.jsxs)(h.Z,{numColSpan:2,children:[(0,a.jsxs)(F.Z,{className:"mb-2",children:[(0,a.jsx)(y.Z,{children:"Total Spend Per Team"}),(0,a.jsx)(ls.Z,{data:T})]}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Daily Spend Per Team"}),(0,a.jsx)(em.Z,{className:"h-72",data:k,showLegend:!0,index:"date",categories:C,yAxisWidth:80,stack:!0})]})]}),(0,a.jsx)(h.Z,{numColSpan:2})]})}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)("p",{className:"mb-2 text-gray-500 italic text-[12px]",children:["Customers of your LLM API calls. Tracked when a `user` param is passed in your LLM calls ",(0,a.jsx)("a",{className:"text-blue-500",href:"https://docs.litellm.ai/docs/proxy/users",target:"_blank",children:"docs here"})]}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsx)(_.Z,{children:"Select Time Range"}),(0,a.jsx)(es.Z,{enableSelect:!0,value:ee,onValueChange:e=>{eu(e),eZ(e.from,e.to,null)}})]}),(0,a.jsxs)(h.Z,{children:[(0,a.jsx)(_.Z,{children:"Select Key"}),(0,a.jsxs)(B.Z,{defaultValue:"all-keys",children:[(0,a.jsx)(K.Z,{value:"all-keys",onClick:()=>{eZ(ee.from,ee.to,null)},children:"All Keys"},"all-keys"),null==i?void 0:i.map((e,l)=>e&&null!==e.key_alias&&e.key_alias.length>0?(0,a.jsx)(K.Z,{value:String(l),onClick:()=>{eZ(ee.from,ee.to,e.token)},children:e.key_alias},l):null)]})]})]}),(0,a.jsx)(F.Z,{className:"mt-4",children:(0,a.jsxs)(D.Z,{className:"max-h-[70vh] min-h-[500px]",children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Customer"}),(0,a.jsx)(q.Z,{children:"Spend"}),(0,a.jsx)(q.Z,{children:"Total Events"})]})}),(0,a.jsx)(L.Z,{children:null==b?void 0:b.map((e,l)=>{var s;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.end_user}),(0,a.jsx)(U.Z,{children:null===(s=e.total_spend)||void 0===s?void 0:s.toFixed(4)}),(0,a.jsx)(U.Z,{children:e.total_count})]},l)})})]})})]}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsx)(es.Z,{className:"mb-4",enableSelect:!0,value:ee,onValueChange:e=>{eu(e),ef(e.from,e.to)}})}),(0,a.jsx)(h.Z,{children:o?(0,a.jsx)("div",{children:(0,a.jsxs)(eo.Z,{value:$,onValueChange:e=>Q(e),children:[(0,a.jsx)(ed.Z,{value:"all-tags",onClick:()=>Q(["all-tags"]),children:"All Tags"},"all-tags"),I&&I.filter(e=>"all-tags"!==e).map((e,l)=>(0,a.jsx)(ed.Z,{value:String(e),children:e},e))]})}):(0,a.jsx)("div",{children:(0,a.jsxs)(eo.Z,{value:$,onValueChange:e=>Q(e),children:[(0,a.jsx)(ed.Z,{value:"all-tags",onClick:()=>Q(["all-tags"]),children:"All Tags"},"all-tags"),I&&I.filter(e=>"all-tags"!==e).map((e,l)=>(0,a.jsxs)(K.Z,{value:String(e),disabled:!0,children:["✨ ",e," (Enterprise only Feature)"]},e))]})})})]}),(0,a.jsxs)(x.Z,{numItems:2,className:"gap-2 h-[75vh] w-full mb-4",children:[(0,a.jsx)(h.Z,{numColSpan:2,children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Spend Per Tag"}),(0,a.jsxs)(_.Z,{children:["Get Started Tracking cost per tag ",(0,a.jsx)("a",{className:"text-blue-500",href:"https://docs.litellm.ai/docs/proxy/cost_tracking",target:"_blank",children:"here"})]}),(0,a.jsx)(em.Z,{className:"h-72",data:w,index:"name",categories:["spend"],colors:["blue"]})]})}),(0,a.jsx)(h.Z,{numColSpan:2})]})]})]})]})})};let la=e=>{if(e)return e.toISOString().split("T")[0]};function lr(e){return new Intl.NumberFormat("en-US",{maximumFractionDigits:0,notation:"compact",compactDisplay:"short"}).format(e)}var li=e=>{let{accessToken:l,token:s,userRole:t,userID:n,premiumUser:i}=e,[o,d]=(0,r.useState)([]),[c,m]=(0,r.useState)([]),[p,j]=(0,r.useState)([]),[g,Z]=(0,r.useState)([]),[f,_]=(0,r.useState)("0"),[y,b]=(0,r.useState)("0"),[v,k]=(0,r.useState)("0"),[S,w]=(0,r.useState)({from:new Date(Date.now()-6048e5),to:new Date});(0,r.useEffect)(()=>{l&&S&&(async()=>{Z(await (0,u.zg)(l,la(S.from),la(S.to)))})()},[l]);let N=Array.from(new Set(g.map(e=>{var l;return null!==(l=null==e?void 0:e.api_key)&&void 0!==l?l:""}))),I=Array.from(new Set(g.map(e=>{var l;return null!==(l=null==e?void 0:e.model)&&void 0!==l?l:""})));Array.from(new Set(g.map(e=>{var l;return null!==(l=null==e?void 0:e.call_type)&&void 0!==l?l:""})));let A=async(e,s)=>{e&&s&&l&&(s.setHours(23,59,59,999),e.setHours(0,0,0,0),Z(await (0,u.zg)(l,la(e),la(s))))};return(0,r.useEffect)(()=>{console.log("DATA IN CACHE DASHBOARD",g);let e=g;c.length>0&&(e=e.filter(e=>c.includes(e.api_key))),p.length>0&&(e=e.filter(e=>p.includes(e.model))),console.log("before processed data in cache dashboard",e);let l=0,s=0,t=0,n=e.reduce((e,n)=>{console.log("Processing item:",n),n.call_type||(console.log("Item has no call_type:",n),n.call_type="Unknown"),l+=(n.total_rows||0)-(n.cache_hit_true_rows||0),s+=n.cache_hit_true_rows||0,t+=n.cached_completion_tokens||0;let a=e.find(e=>e.name===n.call_type);return a?(a["LLM API requests"]+=(n.total_rows||0)-(n.cache_hit_true_rows||0),a["Cache hit"]+=n.cache_hit_true_rows||0,a["Cached Completion Tokens"]+=n.cached_completion_tokens||0,a["Generated Completion Tokens"]+=n.generated_completion_tokens||0):e.push({name:n.call_type,"LLM API requests":(n.total_rows||0)-(n.cache_hit_true_rows||0),"Cache hit":n.cache_hit_true_rows||0,"Cached Completion Tokens":n.cached_completion_tokens||0,"Generated Completion Tokens":n.generated_completion_tokens||0}),e},[]);_(lr(s)),b(lr(t));let a=s+l;a>0?k((s/a*100).toFixed(2)):k("0"),d(n),console.log("PROCESSED DATA IN CACHE DASHBOARD",n)},[c,p,S,g]),(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(x.Z,{numItems:3,className:"gap-4 mt-4",children:[(0,a.jsx)(h.Z,{children:(0,a.jsx)(eo.Z,{placeholder:"Select API Keys",value:c,onValueChange:m,children:N.map(e=>(0,a.jsx)(ed.Z,{value:e,children:e},e))})}),(0,a.jsx)(h.Z,{children:(0,a.jsx)(eo.Z,{placeholder:"Select Models",value:p,onValueChange:j,children:I.map(e=>(0,a.jsx)(ed.Z,{value:e,children:e},e))})}),(0,a.jsx)(h.Z,{children:(0,a.jsx)(es.Z,{enableSelect:!0,value:S,onValueChange:e=>{w(e),A(e.from,e.to)},selectPlaceholder:"Select date range"})})]}),(0,a.jsxs)("div",{className:"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3 mt-4",children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Cache Hit Ratio"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsxs)("p",{className:"text-tremor-metric font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:[v,"%"]})})]}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Cache Hits"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor-metric font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:f})})]}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Cached Tokens"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor-metric font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:y})})]})]}),(0,a.jsx)(el.Z,{className:"mt-4",children:"Cache Hits vs API Requests"}),(0,a.jsx)(em.Z,{title:"Cache Hits vs API Requests",data:o,stack:!0,index:"name",valueFormatter:lr,categories:["LLM API requests","Cache hit"],colors:["sky","teal"],yAxisWidth:48}),(0,a.jsx)(el.Z,{className:"mt-4",children:"Cached Completion Tokens vs Generated Completion Tokens"}),(0,a.jsx)(em.Z,{className:"mt-6",data:o,stack:!0,index:"name",valueFormatter:lr,categories:["Generated Completion Tokens","Cached Completion Tokens"],colors:["sky","teal"],yAxisWidth:48})]})},lo=()=>{let{Title:e,Paragraph:l}=Q.default,[s,t]=(0,r.useState)(""),[n,o]=(0,r.useState)(!1),[d,c]=(0,r.useState)(null),[h,x]=(0,r.useState)(null),[p,j]=(0,r.useState)(null),[g,Z]=(0,r.useState)({PROXY_BASE_URL:"",PROXY_LOGOUT_URL:""}),[f,_]=(0,r.useState)(!0),y=(0,i.useSearchParams)(),[b,v]=(0,r.useState)({data:[]}),k=y.get("userID"),S=y.get("invitation_id"),w=function(e){console.log("COOKIES",document.cookie);let l=document.cookie.split("; ").find(l=>l.startsWith(e+"="));return l?l.split("=")[1]:null}("token"),[N,I]=(0,r.useState)("api-keys"),[A,C]=(0,r.useState)(null);return(0,r.useEffect)(()=>{if(w){let e=(0,$.o)(w);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),C(e.key),e.user_role){let l=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e.toLowerCase())),console.log("Received user role length: ".concat(e.toLowerCase().length)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"internal_user":return"Internal User";case"internal_viewer":return"Internal Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",l),t(l),"Admin Viewer"==l&&I("usage")}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e)),e.login_method?_("username_password"==e.login_method):console.log("User Email is not set ".concat(e)),e.premium_user&&o(e.premium_user),e.auth_header_name&&(0,u.K8)(e.auth_header_name)}}},[w]),(0,a.jsx)(r.Suspense,{fallback:(0,a.jsx)("div",{children:"Loading..."}),children:S?(0,a.jsx)(ee,{userID:k,userRole:s,teams:h,keys:p,setUserRole:t,userEmail:d,setUserEmail:c,setTeams:x,setKeys:j,setProxySettings:Z,proxySettings:g}):(0,a.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,a.jsx)(m,{userID:k,userRole:s,userEmail:d,showSSOBanner:f,premiumUser:n,setProxySettings:Z,proxySettings:g}),(0,a.jsxs)("div",{className:"flex flex-1 overflow-auto",children:[(0,a.jsx)("div",{className:"mt-8",children:(0,a.jsx)(ll,{setPage:I,userRole:s,defaultSelectedKey:null})}),"api-keys"==N?(0,a.jsx)(ee,{userID:k,userRole:s,teams:h,keys:p,setUserRole:t,userEmail:d,setUserEmail:c,setTeams:x,setKeys:j,setProxySettings:Z,proxySettings:g}):"models"==N?(0,a.jsx)(eT,{userID:k,userRole:s,token:w,keys:p,accessToken:A,modelData:b,setModelData:v,premiumUser:n}):"llm-playground"==N?(0,a.jsx)(e6,{userID:k,userRole:s,token:w,accessToken:A}):"users"==N?(0,a.jsx)(eM,{userID:k,userRole:s,token:w,keys:p,teams:h,accessToken:A,setKeys:j}):"teams"==N?(0,a.jsx)(eD,{teams:h,setTeams:x,searchParams:y,accessToken:A,userID:k,userRole:s}):"admin-panel"==N?(0,a.jsx)(eL,{setTeams:x,searchParams:y,accessToken:A,showSSOBanner:f,premiumUser:n}):"api_ref"==N?(0,a.jsx)(e8,{proxySettings:g}):"settings"==N?(0,a.jsx)(eH,{userID:k,userRole:s,accessToken:A,premiumUser:n}):"budgets"==N?(0,a.jsx)(e4,{accessToken:A}):"general-settings"==N?(0,a.jsx)(e0,{userID:k,userRole:s,accessToken:A,modelData:b}):"model-hub"==N?(0,a.jsx)(e5.Z,{accessToken:A,publicPage:!1,premiumUser:n}):"caching"==N?(0,a.jsx)(li,{userID:k,userRole:s,token:w,accessToken:A,premiumUser:n}):(0,a.jsx)(ln,{userID:k,userRole:s,token:w,accessToken:A,keys:p,premiumUser:n})]})]})})}},41134:function(e,l,s){"use strict";s.d(l,{Z:function(){return y}});var t=s(3827),n=s(64090),a=s(47907),r=s(777),i=s(16450),o=s(13810),d=s(92836),c=s(26734),m=s(41608),u=s(32126),h=s(23682),x=s(71801),p=s(42440),j=s(84174),g=s(50459),Z=s(6180),f=s(99129),_=s(67951),y=e=>{var l;let{accessToken:s,publicPage:y,premiumUser:b}=e,[v,k]=(0,n.useState)(!1),[S,w]=(0,n.useState)(null),[N,I]=(0,n.useState)(!1),[A,C]=(0,n.useState)(!1),[P,T]=(0,n.useState)(null),E=(0,a.useRouter)();(0,n.useEffect)(()=>{s&&(async()=>{try{let e=await (0,r.kn)(s);console.log("ModelHubData:",e),w(e.data),(0,r.E9)(s,"enable_public_model_hub").then(e=>{console.log("data: ".concat(JSON.stringify(e))),!0==e.field_value&&k(!0)}).catch(e=>{})}catch(e){console.error("There was an error fetching the model data",e)}})()},[s,y]);let O=e=>{T(e),I(!0)},R=async()=>{s&&(0,r.jA)(s,"enable_public_model_hub",!0).then(e=>{C(!0)})},F=()=>{I(!1),C(!1),T(null)},M=()=>{I(!1),C(!1),T(null)},D=e=>{navigator.clipboard.writeText(e)};return(0,t.jsxs)("div",{children:[y&&v||!1==y?(0,t.jsxs)("div",{className:"w-full m-2 mt-2 p-8",children:[(0,t.jsx)("div",{className:"relative w-full"}),(0,t.jsxs)("div",{className:"flex ".concat(y?"justify-between":"items-center"),children:[(0,t.jsx)(p.Z,{className:"ml-8 text-center ",children:"Model Hub"}),!1==y?b?(0,t.jsx)(i.Z,{className:"ml-4",onClick:()=>R(),children:"✨ Make Public"}):(0,t.jsx)(i.Z,{className:"ml-4",children:(0,t.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"✨ Make Public"})}):(0,t.jsxs)("div",{className:"flex justify-between items-center",children:[(0,t.jsx)("p",{children:"Filter by key:"}),(0,t.jsx)(x.Z,{className:"bg-gray-200 pr-2 pl-2 pt-1 pb-1 text-center",children:"/ui/model_hub?key="})]})]}),(0,t.jsx)("div",{className:"grid grid-cols-2 gap-6 sm:grid-cols-3 lg:grid-cols-4 pr-8",children:S&&S.map(e=>(0,t.jsxs)(o.Z,{className:"mt-5 mx-8",children:[(0,t.jsxs)("pre",{className:"flex justify-between",children:[(0,t.jsx)(p.Z,{children:e.model_group}),(0,t.jsx)(Z.Z,{title:e.model_group,children:(0,t.jsx)(j.Z,{onClick:()=>D(e.model_group),style:{cursor:"pointer",marginRight:"10px"}})})]}),(0,t.jsxs)("div",{className:"my-5",children:[(0,t.jsxs)(x.Z,{children:["Mode: ",e.mode]}),(0,t.jsxs)(x.Z,{children:["Supports Function Calling:"," ",(null==e?void 0:e.supports_function_calling)==!0?"Yes":"No"]}),(0,t.jsxs)(x.Z,{children:["Supports Vision:"," ",(null==e?void 0:e.supports_vision)==!0?"Yes":"No"]}),(0,t.jsxs)(x.Z,{children:["Max Input Tokens:"," ",(null==e?void 0:e.max_input_tokens)?null==e?void 0:e.max_input_tokens:"N/A"]}),(0,t.jsxs)(x.Z,{children:["Max Output Tokens:"," ",(null==e?void 0:e.max_output_tokens)?null==e?void 0:e.max_output_tokens:"N/A"]})]}),(0,t.jsx)("div",{style:{marginTop:"auto",textAlign:"right"},children:(0,t.jsxs)("a",{href:"#",onClick:()=>O(e),style:{color:"#1890ff",fontSize:"smaller"},children:["View more ",(0,t.jsx)(g.Z,{})]})})]},e.model_group))})]}):(0,t.jsxs)(o.Z,{className:"mx-auto max-w-xl mt-10",children:[(0,t.jsx)(x.Z,{className:"text-xl text-center mb-2 text-black",children:"Public Model Hub not enabled."}),(0,t.jsx)("p",{className:"text-base text-center text-slate-800",children:"Ask your proxy admin to enable this on their Admin UI."})]}),(0,t.jsx)(f.Z,{title:"Public Model Hub",width:600,visible:A,footer:null,onOk:F,onCancel:M,children:(0,t.jsxs)("div",{className:"pt-5 pb-5",children:[(0,t.jsxs)("div",{className:"flex justify-between mb-4",children:[(0,t.jsx)(x.Z,{className:"text-base mr-2",children:"Shareable Link:"}),(0,t.jsx)(x.Z,{className:"max-w-sm ml-2 bg-gray-200 pr-2 pl-2 pt-1 pb-1 text-center rounded",children:"/ui/model_hub?key="})]}),(0,t.jsx)("div",{className:"flex justify-end",children:(0,t.jsx)(i.Z,{onClick:()=>{E.replace("/model_hub?key=".concat(s))},children:"See Page"})})]})}),(0,t.jsx)(f.Z,{title:P&&P.model_group?P.model_group:"Unknown Model",width:800,visible:N,footer:null,onOk:F,onCancel:M,children:P&&(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"mb-4",children:(0,t.jsx)("strong",{children:"Model Information & Usage"})}),(0,t.jsxs)(c.Z,{children:[(0,t.jsxs)(m.Z,{children:[(0,t.jsx)(d.Z,{children:"OpenAI Python SDK"}),(0,t.jsx)(d.Z,{children:"Supported OpenAI Params"}),(0,t.jsx)(d.Z,{children:"LlamaIndex"}),(0,t.jsx)(d.Z,{children:"Langchain Py"})]}),(0,t.jsxs)(h.Z,{children:[(0,t.jsx)(u.Z,{children:(0,t.jsx)(_.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="http://0.0.0.0:4000" # LiteLLM Proxy is OpenAI compatible, Read More: https://docs.litellm.ai/docs/proxy/user_keys\n)\n\nresponse = client.chat.completions.create(\n model="'.concat(P.model_group,'", # model to send to the proxy\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ]\n)\n\nprint(response)\n ')})}),(0,t.jsx)(u.Z,{children:(0,t.jsx)(_.Z,{language:"python",children:"".concat(null===(l=P.supported_openai_params)||void 0===l?void 0:l.map(e=>"".concat(e,"\n")).join(""))})}),(0,t.jsx)(u.Z,{children:(0,t.jsx)(_.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="'.concat(P.model_group,'", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="http://0.0.0.0:4000", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="http://0.0.0.0:4000",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n ')})}),(0,t.jsx)(u.Z,{children:(0,t.jsx)(_.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="http://0.0.0.0:4000",\n model = "'.concat(P.model_group,'",\n temperature=0.1\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n ')})})]})]})]})})]})}}},function(e){e.O(0,[665,936,294,131,684,759,777,971,69,744],function(){return e(e.s=20661)}),_N_E=e.O()}]);
\ No newline at end of file
diff --git a/litellm/proxy/_experimental/out/_next/static/InOW9_FWGxjcBmhCsnjat/_buildManifest.js b/litellm/proxy/_experimental/out/_next/static/pWVTV6soYeXDMn2RtKwTT/_buildManifest.js
similarity index 100%
rename from litellm/proxy/_experimental/out/_next/static/InOW9_FWGxjcBmhCsnjat/_buildManifest.js
rename to litellm/proxy/_experimental/out/_next/static/pWVTV6soYeXDMn2RtKwTT/_buildManifest.js
diff --git a/litellm/proxy/_experimental/out/_next/static/InOW9_FWGxjcBmhCsnjat/_ssgManifest.js b/litellm/proxy/_experimental/out/_next/static/pWVTV6soYeXDMn2RtKwTT/_ssgManifest.js
similarity index 100%
rename from litellm/proxy/_experimental/out/_next/static/InOW9_FWGxjcBmhCsnjat/_ssgManifest.js
rename to litellm/proxy/_experimental/out/_next/static/pWVTV6soYeXDMn2RtKwTT/_ssgManifest.js
diff --git a/litellm/proxy/_experimental/out/index.html b/litellm/proxy/_experimental/out/index.html
index f214bcaeb32..20872570c16 100644
--- a/litellm/proxy/_experimental/out/index.html
+++ b/litellm/proxy/_experimental/out/index.html
@@ -1 +1 @@
-LiteLLM Dashboard
\ No newline at end of file
+LiteLLM Dashboard
\ No newline at end of file
diff --git a/litellm/proxy/_experimental/out/index.txt b/litellm/proxy/_experimental/out/index.txt
index 3e48434895a..d2d9892f660 100644
--- a/litellm/proxy/_experimental/out/index.txt
+++ b/litellm/proxy/_experimental/out/index.txt
@@ -1,7 +1,7 @@
2:I[77831,[],""]
-3:I[48951,["665","static/chunks/3014691f-589a5f4865c3822f.js","936","static/chunks/2f6dbc85-052c4579f80d66ae.js","294","static/chunks/294-0e35509d5ca95267.js","131","static/chunks/131-6a03368053f9d26d.js","684","static/chunks/684-bb2d2f93d92acb0b.js","759","static/chunks/759-83a8bdddfe32b5d9.js","777","static/chunks/777-71e19aabdac85a01.js","931","static/chunks/app/page-cab98591303c1c5d.js"],""]
+3:I[48951,["665","static/chunks/3014691f-589a5f4865c3822f.js","936","static/chunks/2f6dbc85-052c4579f80d66ae.js","294","static/chunks/294-0e35509d5ca95267.js","131","static/chunks/131-6a03368053f9d26d.js","684","static/chunks/684-bb2d2f93d92acb0b.js","759","static/chunks/759-83a8bdddfe32b5d9.js","777","static/chunks/777-38cea0d1f2b563b1.js","931","static/chunks/app/page-b6860ddd56500b95.js"],""]
4:I[5613,[],""]
5:I[31778,[],""]
-0:["InOW9_FWGxjcBmhCsnjat",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_12bbc4","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/275ab6ee150b4fea.css","precedence":"next","crossOrigin":""}]],"$L6"]]]]
+0:["pWVTV6soYeXDMn2RtKwTT",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_12bbc4","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/275ab6ee150b4fea.css","precedence":"next","crossOrigin":""}]],"$L6"]]]]
6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"LiteLLM Dashboard"}],["$","meta","3",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","4",{"rel":"icon","href":"/ui/favicon.ico","type":"image/x-icon","sizes":"16x16"}],["$","meta","5",{"name":"next-size-adjust"}]]
1:null
diff --git a/litellm/proxy/_experimental/out/model_hub.html b/litellm/proxy/_experimental/out/model_hub.html
deleted file mode 100644
index 3b289bfa53f..00000000000
--- a/litellm/proxy/_experimental/out/model_hub.html
+++ /dev/null
@@ -1 +0,0 @@
-LiteLLM Dashboard
\ No newline at end of file
diff --git a/litellm/proxy/_experimental/out/model_hub.txt b/litellm/proxy/_experimental/out/model_hub.txt
index c61acddcd19..69980181308 100644
--- a/litellm/proxy/_experimental/out/model_hub.txt
+++ b/litellm/proxy/_experimental/out/model_hub.txt
@@ -1,7 +1,7 @@
2:I[77831,[],""]
-3:I[87494,["294","static/chunks/294-0e35509d5ca95267.js","131","static/chunks/131-6a03368053f9d26d.js","777","static/chunks/777-71e19aabdac85a01.js","418","static/chunks/app/model_hub/page-3c4dcad891da09b7.js"],""]
+3:I[87494,["294","static/chunks/294-0e35509d5ca95267.js","131","static/chunks/131-6a03368053f9d26d.js","777","static/chunks/777-38cea0d1f2b563b1.js","418","static/chunks/app/model_hub/page-3c4dcad891da09b7.js"],""]
4:I[5613,[],""]
5:I[31778,[],""]
-0:["InOW9_FWGxjcBmhCsnjat",[[["",{"children":["model_hub",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["model_hub",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","model_hub","children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","styles":null}]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_12bbc4","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/275ab6ee150b4fea.css","precedence":"next","crossOrigin":""}]],"$L6"]]]]
+0:["pWVTV6soYeXDMn2RtKwTT",[[["",{"children":["model_hub",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["model_hub",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","model_hub","children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","styles":null}]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_12bbc4","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/275ab6ee150b4fea.css","precedence":"next","crossOrigin":""}]],"$L6"]]]]
6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"LiteLLM Dashboard"}],["$","meta","3",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","4",{"rel":"icon","href":"/ui/favicon.ico","type":"image/x-icon","sizes":"16x16"}],["$","meta","5",{"name":"next-size-adjust"}]]
1:null
diff --git a/litellm/proxy/_experimental/out/onboarding.html b/litellm/proxy/_experimental/out/onboarding.html
deleted file mode 100644
index 1198e9d9db3..00000000000
--- a/litellm/proxy/_experimental/out/onboarding.html
+++ /dev/null
@@ -1 +0,0 @@
-LiteLLM Dashboard
\ No newline at end of file
diff --git a/litellm/proxy/_experimental/out/onboarding.txt b/litellm/proxy/_experimental/out/onboarding.txt
index 559f80289ed..eb5140b1c92 100644
--- a/litellm/proxy/_experimental/out/onboarding.txt
+++ b/litellm/proxy/_experimental/out/onboarding.txt
@@ -1,7 +1,7 @@
2:I[77831,[],""]
-3:I[667,["665","static/chunks/3014691f-589a5f4865c3822f.js","294","static/chunks/294-0e35509d5ca95267.js","684","static/chunks/684-bb2d2f93d92acb0b.js","777","static/chunks/777-71e19aabdac85a01.js","461","static/chunks/app/onboarding/page-5e1163825ccf7b7a.js"],""]
+3:I[667,["665","static/chunks/3014691f-589a5f4865c3822f.js","294","static/chunks/294-0e35509d5ca95267.js","684","static/chunks/684-bb2d2f93d92acb0b.js","777","static/chunks/777-38cea0d1f2b563b1.js","461","static/chunks/app/onboarding/page-5e1163825ccf7b7a.js"],""]
4:I[5613,[],""]
5:I[31778,[],""]
-0:["InOW9_FWGxjcBmhCsnjat",[[["",{"children":["onboarding",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["onboarding",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","onboarding","children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","styles":null}]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_12bbc4","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/275ab6ee150b4fea.css","precedence":"next","crossOrigin":""}]],"$L6"]]]]
+0:["pWVTV6soYeXDMn2RtKwTT",[[["",{"children":["onboarding",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["onboarding",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","onboarding","children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","styles":null}]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_12bbc4","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/275ab6ee150b4fea.css","precedence":"next","crossOrigin":""}]],"$L6"]]]]
6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"LiteLLM Dashboard"}],["$","meta","3",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","4",{"rel":"icon","href":"/ui/favicon.ico","type":"image/x-icon","sizes":"16x16"}],["$","meta","5",{"name":"next-size-adjust"}]]
1:null
diff --git a/litellm/proxy/_new_secret_config.yaml b/litellm/proxy/_new_secret_config.yaml
index c31c9873a92..08fa2d95461 100644
--- a/litellm/proxy/_new_secret_config.yaml
+++ b/litellm/proxy/_new_secret_config.yaml
@@ -1,9 +1,8 @@
model_list:
- - model_name: "*"
+ - model_name: "predibase-llama"
litellm_params:
- model: "*"
+ model: "predibase/llama-3-8b-instruct"
+ request_timeout: 1
-# litellm_settings:
-# cache: true
-# cache_params:
-# type: redis
\ No newline at end of file
+litellm_settings:
+ failure_callback: ["langfuse"]
diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py
index d3f1bc844b9..17481913435 100644
--- a/litellm/proxy/_types.py
+++ b/litellm/proxy/_types.py
@@ -199,8 +199,8 @@ class LiteLLMRoutes(enum.Enum):
# batches
"/v1/batches",
"/batches",
- "/v1/batches{batch_id}",
- "/batches{batch_id}",
+ "/v1/batches/{batch_id}",
+ "/batches/{batch_id}",
# files
"/v1/files",
"/files",
@@ -208,6 +208,11 @@ class LiteLLMRoutes(enum.Enum):
"/files/{file_id}",
"/v1/files/{file_id}/content",
"/files/{file_id}/content",
+ # fine_tuning
+ "/fine_tuning/jobs",
+ "/v1/fine_tuning/jobs",
+ "/fine_tuning/jobs/{fine_tuning_job_id}/cancel",
+ "/v1/fine_tuning/jobs/{fine_tuning_job_id}/cancel",
# assistants-related routes
"/assistants",
"/v1/assistants",
@@ -910,7 +915,6 @@ class LiteLLM_TeamTable(TeamBase):
budget_duration: Optional[str] = None
budget_reset_at: Optional[datetime] = None
model_id: Optional[int] = None
- last_refreshed_at: Optional[float] = None
model_config = ConfigDict(protected_namespaces=())
@@ -936,6 +940,10 @@ class LiteLLM_TeamTable(TeamBase):
return values
+class LiteLLM_TeamTableCachedObj(LiteLLM_TeamTable):
+ last_refreshed_at: Optional[float] = None
+
+
class TeamRequest(LiteLLMBase):
teams: List[str]
@@ -1554,6 +1562,22 @@ class AllCallbacks(LiteLLMBase):
ui_callback_name="Datadog",
)
+ braintrust: CallbackOnUI = CallbackOnUI(
+ litellm_callback_name="braintrust",
+ litellm_callback_params=["BRAINTRUST_API_KEY"],
+ ui_callback_name="Braintrust",
+ )
+
+ langsmith: CallbackOnUI = CallbackOnUI(
+ litellm_callback_name="langsmith",
+ litellm_callback_params=[
+ "LANGSMITH_API_KEY",
+ "LANGSMITH_PROJECT",
+ "LANGSMITH_DEFAULT_RUN_NAME",
+ ],
+ ui_callback_name="Langsmith",
+ )
+
class SpendLogsMetadata(TypedDict):
"""
@@ -1661,13 +1685,17 @@ class ProxyException(Exception):
message: str,
type: str,
param: Optional[str],
- code: Optional[int],
+ code: Optional[Union[int, str]] = None,
headers: Optional[Dict[str, str]] = None,
):
self.message = message
self.type = type
self.param = param
- self.code = code
+
+ # If we look on official python OpenAI lib, the code should be a string:
+ # https://github.com/openai/openai-python/blob/195c05a64d39c87b2dfdf1eca2d339597f1fce03/src/openai/types/shared/error_object.py#L11
+ # Related LiteLLM issue: https://github.com/BerriAI/litellm/discussions/4834
+ self.code = str(code)
if headers is not None:
for k, v in headers.items():
if not isinstance(v, str):
@@ -1681,7 +1709,7 @@ class ProxyException(Exception):
"No healthy deployment available" in self.message
or "No deployments available" in self.message
):
- self.code = 429
+ self.code = "429"
def to_dict(self) -> dict:
"""Converts the ProxyException instance to a dictionary."""
diff --git a/litellm/proxy/auth/auth_checks.py b/litellm/proxy/auth/auth_checks.py
index 75f5dd10866..2d306ceb314 100644
--- a/litellm/proxy/auth/auth_checks.py
+++ b/litellm/proxy/auth/auth_checks.py
@@ -8,6 +8,7 @@ Run checks for:
2. If user is in budget
3. If end_user ('user' passed to /chat/completions, /embeddings endpoint) is in budget
"""
+import time
from datetime import datetime
from typing import TYPE_CHECKING, Any, Literal, Optional
@@ -19,6 +20,7 @@ from litellm.proxy._types import (
LiteLLM_JWTAuth,
LiteLLM_OrganizationTable,
LiteLLM_TeamTable,
+ LiteLLM_TeamTableCachedObj,
LiteLLM_UserTable,
LiteLLMRoutes,
LitellmUserRoles,
@@ -368,11 +370,15 @@ async def get_user_object(
async def _cache_team_object(
team_id: str,
- team_table: LiteLLM_TeamTable,
+ team_table: LiteLLM_TeamTableCachedObj,
user_api_key_cache: DualCache,
proxy_logging_obj: Optional[ProxyLogging],
):
key = "team_id:{}".format(team_id)
+
+ ## CACHE REFRESH TIME!
+ team_table.last_refreshed_at = time.time()
+
value = team_table.model_dump_json(exclude_unset=True)
await user_api_key_cache.async_set_cache(key=key, value=value)
@@ -390,7 +396,8 @@ async def get_team_object(
user_api_key_cache: DualCache,
parent_otel_span: Optional[Span] = None,
proxy_logging_obj: Optional[ProxyLogging] = None,
-) -> LiteLLM_TeamTable:
+ check_cache_only: Optional[bool] = None,
+) -> LiteLLM_TeamTableCachedObj:
"""
- Check if team id in proxy Team Table
- if valid, return LiteLLM_TeamTable object with defined limits
@@ -404,11 +411,17 @@ async def get_team_object(
# check if in cache
key = "team_id:{}".format(team_id)
- cached_team_obj: Optional[LiteLLM_TeamTable] = None
+ cached_team_obj: Optional[LiteLLM_TeamTableCachedObj] = None
+
## CHECK REDIS CACHE ##
- if proxy_logging_obj is not None:
- cached_team_obj = await proxy_logging_obj.internal_usage_cache.async_get_cache(
- key=key
+ if (
+ proxy_logging_obj is not None
+ and proxy_logging_obj.internal_usage_cache.redis_cache is not None
+ ):
+ cached_team_obj = (
+ await proxy_logging_obj.internal_usage_cache.redis_cache.async_get_cache(
+ key=key
+ )
)
if cached_team_obj is None:
@@ -416,9 +429,15 @@ async def get_team_object(
if cached_team_obj is not None:
if isinstance(cached_team_obj, dict):
- return LiteLLM_TeamTable(**cached_team_obj)
- elif isinstance(cached_team_obj, LiteLLM_TeamTable):
+ return LiteLLM_TeamTableCachedObj(**cached_team_obj)
+ elif isinstance(cached_team_obj, LiteLLM_TeamTableCachedObj):
return cached_team_obj
+
+ if check_cache_only:
+ raise Exception(
+ f"Team doesn't exist in cache + check_cache_only=True. Team={team_id}. Create team via `/team/new` call."
+ )
+
# else, check db
try:
response = await prisma_client.db.litellm_teamtable.find_unique(
@@ -428,7 +447,7 @@ async def get_team_object(
if response is None:
raise Exception
- _response = LiteLLM_TeamTable(**response.dict())
+ _response = LiteLLM_TeamTableCachedObj(**response.dict())
# save the team object to cache
await _cache_team_object(
team_id=team_id,
diff --git a/litellm/proxy/auth/user_api_key_auth.py b/litellm/proxy/auth/user_api_key_auth.py
index 0507e455b39..8f78857d599 100644
--- a/litellm/proxy/auth/user_api_key_auth.py
+++ b/litellm/proxy/auth/user_api_key_auth.py
@@ -461,27 +461,31 @@ async def user_api_key_auth(
valid_token is not None
and isinstance(valid_token, UserAPIKeyAuth)
and valid_token.team_id is not None
- and user_api_key_cache.get_cache(
- key="team_id:{}".format(valid_token.team_id)
- )
- is not None
):
## UPDATE TEAM VALUES BASED ON CACHED TEAM OBJECT - allows `/team/update` values to work for cached token
- team_obj: LiteLLM_TeamTable = user_api_key_cache.get_cache(
- key="team_id:{}".format(valid_token.team_id)
- )
+ try:
+ team_obj: LiteLLM_TeamTableCachedObj = await get_team_object(
+ team_id=valid_token.team_id,
+ prisma_client=prisma_client,
+ user_api_key_cache=user_api_key_cache,
+ parent_otel_span=parent_otel_span,
+ proxy_logging_obj=proxy_logging_obj,
+ check_cache_only=True,
+ )
- if (
- team_obj.last_refreshed_at is not None
- and valid_token.last_refreshed_at is not None
- and team_obj.last_refreshed_at > valid_token.last_refreshed_at
- ):
- team_obj_dict = team_obj.__dict__
+ if (
+ team_obj.last_refreshed_at is not None
+ and valid_token.last_refreshed_at is not None
+ and team_obj.last_refreshed_at > valid_token.last_refreshed_at
+ ):
+ team_obj_dict = team_obj.__dict__
- for k, v in team_obj_dict.items():
- field_name = f"team_{k}"
- if field_name in valid_token.__fields__:
- setattr(valid_token, field_name, v)
+ for k, v in team_obj_dict.items():
+ field_name = f"team_{k}"
+ if field_name in valid_token.__fields__:
+ setattr(valid_token, field_name, v)
+ except Exception as e:
+ verbose_logger.warning(e)
try:
is_master_key_valid = secrets.compare_digest(api_key, master_key) # type: ignore
diff --git a/litellm/proxy/fine_tuning_endpoints/endpoints.py b/litellm/proxy/fine_tuning_endpoints/endpoints.py
new file mode 100644
index 00000000000..cda226b5aa7
--- /dev/null
+++ b/litellm/proxy/fine_tuning_endpoints/endpoints.py
@@ -0,0 +1,431 @@
+#########################################################################
+
+# /v1/fine_tuning Endpoints
+
+# Equivalent of https://platform.openai.com/docs/api-reference/fine-tuning
+##########################################################################
+
+import asyncio
+import traceback
+from datetime import datetime, timedelta, timezone
+from typing import List, Optional
+
+import fastapi
+import httpx
+from fastapi import (
+ APIRouter,
+ Depends,
+ File,
+ Form,
+ Header,
+ HTTPException,
+ Request,
+ Response,
+ UploadFile,
+ status,
+)
+
+import litellm
+from litellm._logging import verbose_proxy_logger
+from litellm.batches.main import FileObject
+from litellm.proxy._types import *
+from litellm.proxy.auth.user_api_key_auth import user_api_key_auth
+
+router = APIRouter()
+
+from litellm.types.llms.openai import LiteLLMFineTuningJobCreate
+
+fine_tuning_config = None
+
+
+def set_fine_tuning_config(config):
+ if config is None:
+ return
+
+ global fine_tuning_config
+ if not isinstance(config, list):
+ raise ValueError("invalid fine_tuning config, expected a list is not a list")
+
+ for element in config:
+ if isinstance(element, dict):
+ for key, value in element.items():
+ if isinstance(value, str) and value.startswith("os.environ/"):
+ element[key] = litellm.get_secret(value)
+
+ fine_tuning_config = config
+
+
+# Function to search for specific custom_llm_provider and return its configuration
+def get_fine_tuning_provider_config(
+ custom_llm_provider: str,
+):
+ global fine_tuning_config
+ if fine_tuning_config is None:
+ raise ValueError(
+ "fine_tuning_config is not set, set it on your config.yaml file."
+ )
+ for setting in fine_tuning_config:
+ if setting.get("custom_llm_provider") == custom_llm_provider:
+ return setting
+ return None
+
+
+@router.post(
+ "/v1/fine_tuning/jobs",
+ dependencies=[Depends(user_api_key_auth)],
+ tags=["fine-tuning"],
+ summary="✨ (Enterprise) Create Fine-Tuning Job",
+)
+@router.post(
+ "/fine_tuning/jobs",
+ dependencies=[Depends(user_api_key_auth)],
+ tags=["fine-tuning"],
+ summary="✨ (Enterprise) Create Fine-Tuning Job",
+)
+async def create_fine_tuning_job(
+ request: Request,
+ fastapi_response: Response,
+ fine_tuning_request: LiteLLMFineTuningJobCreate,
+ user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth),
+):
+ """
+ Creates a fine-tuning job which begins the process of creating a new model from a given dataset.
+ This is the equivalent of POST https://api.openai.com/v1/fine_tuning/jobs
+
+ Supports Identical Params as: https://platform.openai.com/docs/api-reference/fine-tuning/create
+
+ Example Curl:
+ ```
+ curl http://localhost:4000/v1/fine_tuning/jobs \
+ -H "Content-Type: application/json" \
+ -H "Authorization: Bearer sk-1234" \
+ -d '{
+ "model": "gpt-3.5-turbo",
+ "training_file": "file-abc123",
+ "hyperparameters": {
+ "n_epochs": 4
+ }
+ }'
+ ```
+ """
+ from litellm.proxy.proxy_server import (
+ add_litellm_data_to_request,
+ general_settings,
+ get_custom_headers,
+ premium_user,
+ proxy_config,
+ proxy_logging_obj,
+ version,
+ )
+
+ try:
+ if premium_user is not True:
+ raise ValueError(
+ f"Only premium users can use this endpoint + {CommonProxyErrors.not_premium_user.value}"
+ )
+ # Convert Pydantic model to dict
+ data = fine_tuning_request.model_dump(exclude_none=True)
+
+ verbose_proxy_logger.debug(
+ "Request received by LiteLLM:\n{}".format(json.dumps(data, indent=4)),
+ )
+
+ # Include original request and headers in the data
+ data = await add_litellm_data_to_request(
+ data=data,
+ request=request,
+ general_settings=general_settings,
+ user_api_key_dict=user_api_key_dict,
+ version=version,
+ proxy_config=proxy_config,
+ )
+
+ # get configs for custom_llm_provider
+ llm_provider_config = get_fine_tuning_provider_config(
+ custom_llm_provider=fine_tuning_request.custom_llm_provider,
+ )
+
+ # add llm_provider_config to data
+ data.update(llm_provider_config)
+
+ response = await litellm.acreate_fine_tuning_job(**data)
+
+ ### ALERTING ###
+ asyncio.create_task(
+ proxy_logging_obj.update_request_status(
+ litellm_call_id=data.get("litellm_call_id", ""), status="success"
+ )
+ )
+
+ ### RESPONSE HEADERS ###
+ hidden_params = getattr(response, "_hidden_params", {}) or {}
+ model_id = hidden_params.get("model_id", None) or ""
+ cache_key = hidden_params.get("cache_key", None) or ""
+ api_base = hidden_params.get("api_base", None) or ""
+
+ fastapi_response.headers.update(
+ get_custom_headers(
+ user_api_key_dict=user_api_key_dict,
+ model_id=model_id,
+ cache_key=cache_key,
+ api_base=api_base,
+ version=version,
+ model_region=getattr(user_api_key_dict, "allowed_model_region", ""),
+ )
+ )
+
+ return response
+ except Exception as e:
+ await proxy_logging_obj.post_call_failure_hook(
+ user_api_key_dict=user_api_key_dict, original_exception=e, request_data=data
+ )
+ verbose_proxy_logger.error(
+ "litellm.proxy.proxy_server.create_fine_tuning_job(): Exception occurred - {}".format(
+ str(e)
+ )
+ )
+ verbose_proxy_logger.debug(traceback.format_exc())
+ if isinstance(e, HTTPException):
+ raise ProxyException(
+ message=getattr(e, "message", str(e.detail)),
+ type=getattr(e, "type", "None"),
+ param=getattr(e, "param", "None"),
+ code=getattr(e, "status_code", status.HTTP_400_BAD_REQUEST),
+ )
+ else:
+ error_msg = f"{str(e)}"
+ raise ProxyException(
+ message=getattr(e, "message", error_msg),
+ type=getattr(e, "type", "None"),
+ param=getattr(e, "param", "None"),
+ code=getattr(e, "status_code", 500),
+ )
+
+
+@router.get(
+ "/v1/fine_tuning/jobs",
+ dependencies=[Depends(user_api_key_auth)],
+ tags=["fine-tuning"],
+ summary="✨ (Enterprise) List Fine-Tuning Jobs",
+)
+@router.get(
+ "/fine_tuning/jobs",
+ dependencies=[Depends(user_api_key_auth)],
+ tags=["fine-tuning"],
+ summary="✨ (Enterprise) List Fine-Tuning Jobs",
+)
+async def list_fine_tuning_jobs(
+ request: Request,
+ fastapi_response: Response,
+ custom_llm_provider: Literal["openai", "azure"],
+ after: Optional[str] = None,
+ limit: Optional[int] = None,
+ user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth),
+):
+ """
+ Lists fine-tuning jobs for the organization.
+ This is the equivalent of GET https://api.openai.com/v1/fine_tuning/jobs
+
+ Supported Query Params:
+ - `custom_llm_provider`: Name of the LiteLLM provider
+ - `after`: Identifier for the last job from the previous pagination request.
+ - `limit`: Number of fine-tuning jobs to retrieve (default is 20).
+ """
+ from litellm.proxy.proxy_server import (
+ add_litellm_data_to_request,
+ general_settings,
+ get_custom_headers,
+ premium_user,
+ proxy_config,
+ proxy_logging_obj,
+ version,
+ )
+
+ data: dict = {}
+ try:
+ if premium_user is not True:
+ raise ValueError(
+ f"Only premium users can use this endpoint + {CommonProxyErrors.not_premium_user.value}"
+ )
+ # Include original request and headers in the data
+ data = await add_litellm_data_to_request(
+ data=data,
+ request=request,
+ general_settings=general_settings,
+ user_api_key_dict=user_api_key_dict,
+ version=version,
+ proxy_config=proxy_config,
+ )
+
+ # get configs for custom_llm_provider
+ llm_provider_config = get_fine_tuning_provider_config(
+ custom_llm_provider=custom_llm_provider
+ )
+
+ data.update(llm_provider_config)
+
+ response = await litellm.alist_fine_tuning_jobs(
+ **data,
+ after=after,
+ limit=limit,
+ )
+
+ ### RESPONSE HEADERS ###
+ hidden_params = getattr(response, "_hidden_params", {}) or {}
+ model_id = hidden_params.get("model_id", None) or ""
+ cache_key = hidden_params.get("cache_key", None) or ""
+ api_base = hidden_params.get("api_base", None) or ""
+
+ fastapi_response.headers.update(
+ get_custom_headers(
+ user_api_key_dict=user_api_key_dict,
+ model_id=model_id,
+ cache_key=cache_key,
+ api_base=api_base,
+ version=version,
+ model_region=getattr(user_api_key_dict, "allowed_model_region", ""),
+ )
+ )
+
+ return response
+
+ except Exception as e:
+ await proxy_logging_obj.post_call_failure_hook(
+ user_api_key_dict=user_api_key_dict, original_exception=e, request_data=data
+ )
+ verbose_proxy_logger.error(
+ "litellm.proxy.proxy_server.list_fine_tuning_jobs(): Exception occurred - {}".format(
+ str(e)
+ )
+ )
+ verbose_proxy_logger.debug(traceback.format_exc())
+ if isinstance(e, HTTPException):
+ raise ProxyException(
+ message=getattr(e, "message", str(e.detail)),
+ type=getattr(e, "type", "None"),
+ param=getattr(e, "param", "None"),
+ code=getattr(e, "status_code", status.HTTP_400_BAD_REQUEST),
+ )
+ else:
+ error_msg = f"{str(e)}"
+ raise ProxyException(
+ message=getattr(e, "message", error_msg),
+ type=getattr(e, "type", "None"),
+ param=getattr(e, "param", "None"),
+ code=getattr(e, "status_code", 500),
+ )
+
+
+@router.post(
+ "/v1/fine_tuning/jobs/{fine_tuning_job_id:path}/cancel",
+ dependencies=[Depends(user_api_key_auth)],
+ tags=["fine-tuning"],
+ summary="✨ (Enterprise) Cancel Fine-Tuning Jobs",
+)
+@router.post(
+ "/fine_tuning/jobs/{fine_tuning_job_id:path}/cancel",
+ dependencies=[Depends(user_api_key_auth)],
+ tags=["fine-tuning"],
+ summary="✨ (Enterprise) Cancel Fine-Tuning Jobs",
+)
+async def retrieve_fine_tuning_job(
+ request: Request,
+ fastapi_response: Response,
+ fine_tuning_job_id: str,
+ user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth),
+):
+ """
+ Cancel a fine-tuning job.
+
+ This is the equivalent of POST https://api.openai.com/v1/fine_tuning/jobs/{fine_tuning_job_id}/cancel
+
+ Supported Query Params:
+ - `custom_llm_provider`: Name of the LiteLLM provider
+ - `fine_tuning_job_id`: The ID of the fine-tuning job to cancel.
+ """
+ from litellm.proxy.proxy_server import (
+ add_litellm_data_to_request,
+ general_settings,
+ get_custom_headers,
+ premium_user,
+ proxy_config,
+ proxy_logging_obj,
+ version,
+ )
+
+ data: dict = {}
+ try:
+ if premium_user is not True:
+ raise ValueError(
+ f"Only premium users can use this endpoint + {CommonProxyErrors.not_premium_user.value}"
+ )
+ # Include original request and headers in the data
+ data = await add_litellm_data_to_request(
+ data=data,
+ request=request,
+ general_settings=general_settings,
+ user_api_key_dict=user_api_key_dict,
+ version=version,
+ proxy_config=proxy_config,
+ )
+
+ request_body = await request.json()
+
+ custom_llm_provider = request_body.get("custom_llm_provider", None)
+
+ # get configs for custom_llm_provider
+ llm_provider_config = get_fine_tuning_provider_config(
+ custom_llm_provider=custom_llm_provider
+ )
+
+ data.update(llm_provider_config)
+
+ response = await litellm.acancel_fine_tuning_job(
+ **data,
+ fine_tuning_job_id=fine_tuning_job_id,
+ )
+
+ ### RESPONSE HEADERS ###
+ hidden_params = getattr(response, "_hidden_params", {}) or {}
+ model_id = hidden_params.get("model_id", None) or ""
+ cache_key = hidden_params.get("cache_key", None) or ""
+ api_base = hidden_params.get("api_base", None) or ""
+
+ fastapi_response.headers.update(
+ get_custom_headers(
+ user_api_key_dict=user_api_key_dict,
+ model_id=model_id,
+ cache_key=cache_key,
+ api_base=api_base,
+ version=version,
+ model_region=getattr(user_api_key_dict, "allowed_model_region", ""),
+ )
+ )
+
+ return response
+
+ except Exception as e:
+ await proxy_logging_obj.post_call_failure_hook(
+ user_api_key_dict=user_api_key_dict, original_exception=e, request_data=data
+ )
+ verbose_proxy_logger.error(
+ "litellm.proxy.proxy_server.list_fine_tuning_jobs(): Exception occurred - {}".format(
+ str(e)
+ )
+ )
+ verbose_proxy_logger.debug(traceback.format_exc())
+ if isinstance(e, HTTPException):
+ raise ProxyException(
+ message=getattr(e, "message", str(e.detail)),
+ type=getattr(e, "type", "None"),
+ param=getattr(e, "param", "None"),
+ code=getattr(e, "status_code", status.HTTP_400_BAD_REQUEST),
+ )
+ else:
+ error_msg = f"{str(e)}"
+ raise ProxyException(
+ message=getattr(e, "message", error_msg),
+ type=getattr(e, "type", "None"),
+ param=getattr(e, "param", "None"),
+ code=getattr(e, "status_code", 500),
+ )
diff --git a/litellm/proxy/health_endpoints/_health_endpoints.py b/litellm/proxy/health_endpoints/_health_endpoints.py
index fa9edcdc83b..b1f30e04aa3 100644
--- a/litellm/proxy/health_endpoints/_health_endpoints.py
+++ b/litellm/proxy/health_endpoints/_health_endpoints.py
@@ -3,7 +3,7 @@ import copy
import os
import traceback
from datetime import datetime, timedelta
-from typing import Literal, Optional
+from typing import Literal, Optional, Union
import fastapi
from fastapi import APIRouter, Depends, Header, HTTPException, Request, Response, status
@@ -54,8 +54,17 @@ async def test_endpoint(request: Request):
)
async def health_services_endpoint(
user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth),
- service: Literal[
- "slack_budget_alerts", "langfuse", "slack", "openmeter", "webhook", "email"
+ service: Union[
+ Literal[
+ "slack_budget_alerts",
+ "langfuse",
+ "slack",
+ "openmeter",
+ "webhook",
+ "email",
+ "braintrust",
+ ],
+ str,
] = fastapi.Query(description="Specify the service being hit."),
):
"""
@@ -81,6 +90,10 @@ async def health_services_endpoint(
"slack",
"openmeter",
"webhook",
+ "braintrust",
+ "otel",
+ "custom_callback_api",
+ "langsmith",
]:
raise HTTPException(
status_code=400,
@@ -89,7 +102,11 @@ async def health_services_endpoint(
},
)
- if service == "openmeter":
+ if (
+ service == "openmeter"
+ or service == "braintrust"
+ or (service in litellm.success_callback and service != "langfuse")
+ ):
_ = await litellm.acompletion(
model="openai/litellm-mock-response-model",
messages=[{"role": "user", "content": "Hey, how's it going?"}],
@@ -98,7 +115,7 @@ async def health_services_endpoint(
)
return {
"status": "success",
- "message": "Mock LLM request made - check openmeter.",
+ "message": "Mock LLM request made - check {}.".format(service),
}
if service == "langfuse":
@@ -283,11 +300,11 @@ async def health_endpoint(
else, the health checks will be run on models when /health is called.
"""
from litellm.proxy.proxy_server import (
+ health_check_details,
health_check_results,
llm_model_list,
use_background_health_checks,
user_model,
- health_check_details
)
try:
@@ -438,7 +455,9 @@ async def health_readiness():
try:
# this was returning a JSON of the values in some of the callbacks
# all we need is the callback name, hence we do str(callback)
- success_callback_names = [callback_name(x) for x in litellm.success_callback]
+ success_callback_names = [
+ callback_name(x) for x in litellm.success_callback
+ ]
except AttributeError:
# don't let this block the /health/readiness response, if we can't convert to str -> return litellm.success_callback
success_callback_names = litellm.success_callback
@@ -483,12 +502,12 @@ async def health_readiness():
@router.get(
- "/health/liveliness", # Historical LiteLLM name; doesn't match k8s terminology but kept for backwards compatibility
+ "/health/liveliness", # Historical LiteLLM name; doesn't match k8s terminology but kept for backwards compatibility
tags=["health"],
dependencies=[Depends(user_api_key_auth)],
)
@router.get(
- "/health/liveness", # Kubernetes has "liveness" probes (https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-a-liveness-command)
+ "/health/liveness", # Kubernetes has "liveness" probes (https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-a-liveness-command)
tags=["health"],
dependencies=[Depends(user_api_key_auth)],
)
@@ -522,7 +541,7 @@ async def health_readiness_options():
dependencies=[Depends(user_api_key_auth)],
)
@router.options(
- "/health/liveness", # Kubernetes has "liveness" probes (https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-a-liveness-command)
+ "/health/liveness", # Kubernetes has "liveness" probes (https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-a-liveness-command)
tags=["health"],
dependencies=[Depends(user_api_key_auth)],
)
diff --git a/litellm/proxy/litellm_pre_call_utils.py b/litellm/proxy/litellm_pre_call_utils.py
index ffea850a336..13f9475c5c7 100644
--- a/litellm/proxy/litellm_pre_call_utils.py
+++ b/litellm/proxy/litellm_pre_call_utils.py
@@ -3,6 +3,7 @@ from typing import TYPE_CHECKING, Any, Dict, Optional
from fastapi import Request
+import litellm
from litellm._logging import verbose_logger, verbose_proxy_logger
from litellm.proxy._types import CommonProxyErrors, TeamCallbackMetadata, UserAPIKeyAuth
from litellm.types.utils import SupportedCacheControls
@@ -250,13 +251,15 @@ def _add_otel_traceparent_to_data(data: dict, request: Request):
# if user is not use OTEL don't send extra_headers
# relevant issue: https://github.com/BerriAI/litellm/issues/4448
return
- if request.headers:
- if "traceparent" in request.headers:
- # we want to forward this to the LLM Provider
- # Relevant issue: https://github.com/BerriAI/litellm/issues/4419
- # pass this in extra_headers
- if "extra_headers" not in data:
- data["extra_headers"] = {}
- _exra_headers = data["extra_headers"]
- if "traceparent" not in _exra_headers:
- _exra_headers["traceparent"] = request.headers["traceparent"]
+
+ if litellm.forward_traceparent_to_llm_provider is True:
+ if request.headers:
+ if "traceparent" in request.headers:
+ # we want to forward this to the LLM Provider
+ # Relevant issue: https://github.com/BerriAI/litellm/issues/4419
+ # pass this in extra_headers
+ if "extra_headers" not in data:
+ data["extra_headers"] = {}
+ _exra_headers = data["extra_headers"]
+ if "traceparent" not in _exra_headers:
+ _exra_headers["traceparent"] = request.headers["traceparent"]
diff --git a/litellm/proxy/management_endpoints/team_endpoints.py b/litellm/proxy/management_endpoints/team_endpoints.py
index 9c20836d2b6..fd46dbd89e7 100644
--- a/litellm/proxy/management_endpoints/team_endpoints.py
+++ b/litellm/proxy/management_endpoints/team_endpoints.py
@@ -18,6 +18,7 @@ from litellm.proxy._types import (
LiteLLM_AuditLogs,
LiteLLM_ModelTable,
LiteLLM_TeamTable,
+ LiteLLM_TeamTableCachedObj,
LitellmTableNames,
LitellmUserRoles,
Member,
@@ -379,7 +380,7 @@ async def update_team(
await _cache_team_object(
team_id=team_row.team_id,
- team_table=team_row,
+ team_table=LiteLLM_TeamTableCachedObj(**team_row.model_dump()),
user_api_key_cache=user_api_key_cache,
proxy_logging_obj=proxy_logging_obj,
)
diff --git a/litellm/proxy/openai_files_endpoints/files_endpoints.py b/litellm/proxy/openai_files_endpoints/files_endpoints.py
index e4ac8fc8042..807e02a3a51 100644
--- a/litellm/proxy/openai_files_endpoints/files_endpoints.py
+++ b/litellm/proxy/openai_files_endpoints/files_endpoints.py
@@ -34,6 +34,37 @@ from litellm.proxy.auth.user_api_key_auth import user_api_key_auth
router = APIRouter()
+files_config = None
+
+
+def set_files_config(config):
+ global files_config
+ if config is None:
+ return
+
+ if not isinstance(config, list):
+ raise ValueError("invalid files config, expected a list is not a list")
+
+ for element in config:
+ if isinstance(element, dict):
+ for key, value in element.items():
+ if isinstance(value, str) and value.startswith("os.environ/"):
+ element[key] = litellm.get_secret(value)
+
+ files_config = config
+
+
+def get_files_provider_config(
+ custom_llm_provider: str,
+):
+ global files_config
+ if files_config is None:
+ raise ValueError("files_config is not set, set it on your config.yaml file.")
+ for setting in files_config:
+ if setting.get("custom_llm_provider") == custom_llm_provider:
+ return setting
+ return None
+
@router.post(
"/v1/files",
@@ -49,6 +80,7 @@ async def create_file(
request: Request,
fastapi_response: Response,
purpose: str = Form(...),
+ custom_llm_provider: str = Form(default="openai"),
file: UploadFile = File(...),
user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth),
):
@@ -100,11 +132,17 @@ async def create_file(
_create_file_request = CreateFileRequest(file=file_data, **data)
- # for now use custom_llm_provider=="openai" -> this will change as LiteLLM adds more providers for acreate_batch
- response = await litellm.acreate_file(
- custom_llm_provider="openai", **_create_file_request
+ # get configs for custom_llm_provider
+ llm_provider_config = get_files_provider_config(
+ custom_llm_provider=custom_llm_provider
)
+ # add llm_provider_config to data
+ _create_file_request.update(llm_provider_config)
+
+ # for now use custom_llm_provider=="openai" -> this will change as LiteLLM adds more providers for acreate_batch
+ response = await litellm.acreate_file(**_create_file_request)
+
### ALERTING ###
asyncio.create_task(
proxy_logging_obj.update_request_status(
diff --git a/litellm/proxy/proxy_config.yaml b/litellm/proxy/proxy_config.yaml
index f7e5a894f01..4bc9a87692b 100644
--- a/litellm/proxy/proxy_config.yaml
+++ b/litellm/proxy/proxy_config.yaml
@@ -25,6 +25,27 @@ model_list:
api_key: "os.environ/OPENAI_API_KEY"
model_info:
mode: audio_speech
+
+# For /fine_tuning/jobs endpoints
+finetune_settings:
+ - custom_llm_provider: azure
+ api_base: https://exampleopenaiendpoint-production.up.railway.app
+ api_key: fake-key
+ api_version: "2023-03-15-preview"
+ - custom_llm_provider: openai
+ api_key: os.environ/OPENAI_API_KEY
+
+# for /files endpoints
+files_settings:
+ - custom_llm_provider: azure
+ api_base: https://exampleopenaiendpoint-production.up.railway.app
+ api_key: fake-key
+ api_version: "2023-03-15-preview"
+ - custom_llm_provider: openai
+ api_key: os.environ/OPENAI_API_KEY
+
+
+
general_settings:
master_key: sk-1234
@@ -34,4 +55,4 @@ general_settings:
max_response_size_mb: 10
litellm_settings:
- success_callback: ["langfuse"]
\ No newline at end of file
+ callbacks: ["gcs_bucket"] # 👈 KEY CHANGE
\ No newline at end of file
diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py
index fe9b7487424..943a52a9677 100644
--- a/litellm/proxy/proxy_server.py
+++ b/litellm/proxy/proxy_server.py
@@ -153,6 +153,8 @@ from litellm.proxy.common_utils.init_callbacks import initialize_callbacks_on_pr
from litellm.proxy.common_utils.openai_endpoint_utils import (
remove_sensitive_info_from_deployment,
)
+from litellm.proxy.fine_tuning_endpoints.endpoints import router as fine_tuning_router
+from litellm.proxy.fine_tuning_endpoints.endpoints import set_fine_tuning_config
from litellm.proxy.guardrails.init_guardrails import initialize_guardrails
from litellm.proxy.health_check import perform_health_check
from litellm.proxy.health_endpoints._health_endpoints import router as health_router
@@ -179,6 +181,7 @@ from litellm.proxy.management_endpoints.team_endpoints import router as team_rou
from litellm.proxy.openai_files_endpoints.files_endpoints import (
router as openai_files_router,
)
+from litellm.proxy.openai_files_endpoints.files_endpoints import set_files_config
from litellm.proxy.pass_through_endpoints.pass_through_endpoints import (
initialize_pass_through_endpoints,
)
@@ -1807,6 +1810,14 @@ class ProxyConfig:
assistant_settings["litellm_params"][k] = v
assistants_config = AssistantsTypedDict(**assistant_settings) # type: ignore
+ ## /fine_tuning/jobs endpoints config
+ finetuning_config = config.get("finetune_settings", None)
+ set_fine_tuning_config(config=finetuning_config)
+
+ ## /files endpoint config
+ files_config = config.get("files_settings", None)
+ set_files_config(config=files_config)
+
## ROUTER SETTINGS (e.g. routing_strategy, ...)
router_settings = config.get("router_settings", None)
if router_settings and isinstance(router_settings, dict):
@@ -3069,6 +3080,7 @@ async def chat_completion(
type=getattr(e, "type", "None"),
param=getattr(e, "param", "None"),
code=getattr(e, "status_code", 500),
+ headers=getattr(e, "headers", {}),
)
@@ -4898,12 +4910,12 @@ async def create_batch(
@router.get(
- "/v1/batches{batch_id:path}",
+ "/v1/batches/{batch_id:path}",
dependencies=[Depends(user_api_key_auth)],
tags=["batch"],
)
@router.get(
- "/batches{batch_id:path}",
+ "/batches/{batch_id:path}",
dependencies=[Depends(user_api_key_auth)],
tags=["batch"],
)
@@ -4993,6 +5005,93 @@ async def retrieve_batch(
)
+@router.get(
+ "/v1/batches",
+ dependencies=[Depends(user_api_key_auth)],
+ tags=["batch"],
+)
+@router.get(
+ "/batches",
+ dependencies=[Depends(user_api_key_auth)],
+ tags=["batch"],
+)
+async def list_batches(
+ fastapi_response: Response,
+ limit: Optional[int] = None,
+ after: Optional[str] = None,
+ user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth),
+):
+ """
+ Lists
+ This is the equivalent of GET https://api.openai.com/v1/batches/
+ Supports Identical Params as: https://platform.openai.com/docs/api-reference/batch/list
+
+ Example Curl
+ ```
+ curl http://localhost:4000/v1/batches?limit=2 \
+ -H "Authorization: Bearer sk-1234" \
+ -H "Content-Type: application/json" \
+
+ ```
+ """
+ global proxy_logging_obj
+ verbose_proxy_logger.debug("GET /v1/batches after={} limit={}".format(after, limit))
+ try:
+ # for now use custom_llm_provider=="openai" -> this will change as LiteLLM adds more providers for acreate_batch
+ response = await litellm.alist_batches(
+ custom_llm_provider="openai",
+ after=after,
+ limit=limit,
+ )
+
+ ### RESPONSE HEADERS ###
+ hidden_params = getattr(response, "_hidden_params", {}) or {}
+ model_id = hidden_params.get("model_id", None) or ""
+ cache_key = hidden_params.get("cache_key", None) or ""
+ api_base = hidden_params.get("api_base", None) or ""
+
+ fastapi_response.headers.update(
+ get_custom_headers(
+ user_api_key_dict=user_api_key_dict,
+ model_id=model_id,
+ cache_key=cache_key,
+ api_base=api_base,
+ version=version,
+ model_region=getattr(user_api_key_dict, "allowed_model_region", ""),
+ )
+ )
+
+ return response
+ except Exception as e:
+ await proxy_logging_obj.post_call_failure_hook(
+ user_api_key_dict=user_api_key_dict,
+ original_exception=e,
+ request_data={"after": after, "limit": limit},
+ )
+ verbose_proxy_logger.error(
+ "litellm.proxy.proxy_server.retrieve_batch(): Exception occured - {}".format(
+ str(e)
+ )
+ )
+ verbose_proxy_logger.debug(traceback.format_exc())
+ if isinstance(e, HTTPException):
+ raise ProxyException(
+ message=getattr(e, "message", str(e.detail)),
+ type=getattr(e, "type", "None"),
+ param=getattr(e, "param", "None"),
+ code=getattr(e, "status_code", status.HTTP_400_BAD_REQUEST),
+ )
+ else:
+ error_traceback = traceback.format_exc()
+ error_msg = f"{str(e)}"
+ raise ProxyException(
+ message=getattr(e, "message", error_msg),
+ type=getattr(e, "type", "None"),
+ param=getattr(e, "param", "None"),
+ code=getattr(e, "status_code", 500),
+ )
+
+
######################################################################
# END OF /v1/batches Endpoints Implementation
@@ -9235,10 +9334,30 @@ async def get_config():
"""
for _callback in _success_callbacks:
- if _callback == "openmeter":
- env_vars = [
- "OPENMETER_API_KEY",
- ]
+ if _callback != "langfuse":
+ if _callback == "openmeter":
+ env_vars = [
+ "OPENMETER_API_KEY",
+ ]
+ elif _callback == "braintrust":
+ env_vars = [
+ "BRAINTRUST_API_KEY",
+ ]
+ elif _callback == "traceloop":
+ env_vars = ["TRACELOOP_API_KEY"]
+ elif _callback == "custom_callback_api":
+ env_vars = ["GENERIC_LOGGER_ENDPOINT"]
+ elif _callback == "otel":
+ env_vars = ["OTEL_EXPORTER", "OTEL_ENDPOINT", "OTEL_HEADERS"]
+ elif _callback == "langsmith":
+ env_vars = [
+ "LANGSMITH_API_KEY",
+ "LANGSMITH_PROJECT",
+ "LANGSMITH_DEFAULT_RUN_NAME",
+ ]
+ else:
+ env_vars = []
+
env_vars_dict = {}
for _var in env_vars:
env_variable = environment_variables.get(_var, None)
@@ -9345,8 +9464,8 @@ async def get_config():
}
except Exception as e:
verbose_proxy_logger.error(
- "litellm.proxy.proxy_server.get_config(): Exception occured - {}".format(
- str(e)
+ "litellm.proxy.proxy_server.get_config(): Exception occured - {}\n{}".format(
+ str(e), traceback.format_exc()
)
)
verbose_proxy_logger.debug(traceback.format_exc())
@@ -9510,6 +9629,7 @@ def cleanup_router_config_variables():
app.include_router(router)
+app.include_router(fine_tuning_router)
app.include_router(health_router)
app.include_router(key_management_router)
app.include_router(internal_user_router)
diff --git a/litellm/router.py b/litellm/router.py
index d72f3ea5ecf..108ca706c5f 100644
--- a/litellm/router.py
+++ b/litellm/router.py
@@ -2944,7 +2944,7 @@ class Router:
elif isinstance(id, int):
id = str(id)
- total_tokens = completion_response["usage"]["total_tokens"]
+ total_tokens = completion_response["usage"].get("total_tokens", 0)
# ------------
# Setup values
@@ -3865,6 +3865,7 @@ class Router:
if supported_openai_params is None:
supported_openai_params = []
model_info = ModelMapInfo(
+ key=model_group,
max_tokens=None,
max_input_tokens=None,
max_output_tokens=None,
diff --git a/litellm/tests/adroit-crow-413218-bc47f303efc9.json b/litellm/tests/adroit-crow-413218-bc47f303efc9.json
new file mode 100644
index 00000000000..e2fd8512b19
--- /dev/null
+++ b/litellm/tests/adroit-crow-413218-bc47f303efc9.json
@@ -0,0 +1,13 @@
+{
+ "type": "service_account",
+ "project_id": "adroit-crow-413218",
+ "private_key_id": "",
+ "private_key": "",
+ "client_email": "test-adroit-crow@adroit-crow-413218.iam.gserviceaccount.com",
+ "client_id": "104886546564708740969",
+ "auth_uri": "https://accounts.google.com/o/oauth2/auth",
+ "token_uri": "https://oauth2.googleapis.com/token",
+ "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
+ "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/test-adroit-crow%40adroit-crow-413218.iam.gserviceaccount.com",
+ "universe_domain": "googleapis.com"
+}
diff --git a/litellm/tests/azure_fine_tune.jsonl b/litellm/tests/azure_fine_tune.jsonl
new file mode 100644
index 00000000000..ef41bd97731
--- /dev/null
+++ b/litellm/tests/azure_fine_tune.jsonl
@@ -0,0 +1,12 @@
+{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}
+{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
+{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}
+{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}
+{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
+{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}
+{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}
+{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
+{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}
+{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}
+{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
+{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}
\ No newline at end of file
diff --git a/litellm/tests/test_amazing_vertex_completion.py b/litellm/tests/test_amazing_vertex_completion.py
index e2d35c9720a..f0b243c36eb 100644
--- a/litellm/tests/test_amazing_vertex_completion.py
+++ b/litellm/tests/test_amazing_vertex_completion.py
@@ -608,6 +608,8 @@ def test_completion_function_plus_pdf(load_pdf):
print(response)
except litellm.InternalServerError as e:
+ pass
+ except Exception as e:
pytest.fail("Got={}".format(str(e)))
@@ -901,8 +903,10 @@ from litellm.tests.test_completion import response_format_tests
@pytest.mark.parametrize(
"model",
[
- "vertex_ai/mistral-large@2407",
- "vertex_ai/meta/llama3-405b-instruct-maas",
+ # "vertex_ai/mistral-large@2407",
+ # "vertex_ai/mistral-nemo@2407",
+ "vertex_ai/codestral@2405",
+ # "vertex_ai/meta/llama3-405b-instruct-maas",
], #
) # "vertex_ai",
@pytest.mark.parametrize(
@@ -940,7 +944,7 @@ async def test_partner_models_httpx(model, sync_mode):
print(f"response: {response}")
- assert response._hidden_params["response_cost"] > 0
+ assert isinstance(response._hidden_params["response_cost"], float)
except litellm.RateLimitError as e:
pass
except Exception as e:
diff --git a/litellm/tests/test_async_fn.py b/litellm/tests/test_async_fn.py
index 65db9a57a6f..ec322f6d5e0 100644
--- a/litellm/tests/test_async_fn.py
+++ b/litellm/tests/test_async_fn.py
@@ -18,6 +18,7 @@ from litellm import acompletion, acreate, completion
litellm.num_retries = 3
+@pytest.mark.skip(reason="anyscale stopped serving public api endpoints")
def test_sync_response_anyscale():
litellm.set_verbose = False
user_message = "Hello, how are you?"
@@ -119,6 +120,7 @@ def test_async_response_azure():
# test_async_response_azure()
+@pytest.mark.skip(reason="anyscale stopped serving public api endpoints")
def test_async_anyscale_response():
import asyncio
@@ -301,6 +303,7 @@ def test_get_response_streaming():
# test_get_response_streaming()
+@pytest.mark.skip(reason="anyscale stopped serving public api endpoints")
def test_get_response_non_openai_streaming():
import asyncio
diff --git a/litellm/tests/test_cohere_completion.py b/litellm/tests/test_cohere_completion.py
index 372c87b4000..e90818fee5d 100644
--- a/litellm/tests/test_cohere_completion.py
+++ b/litellm/tests/test_cohere_completion.py
@@ -1,19 +1,23 @@
-import sys, os
+import os
+import sys
import traceback
+
from dotenv import load_dotenv
load_dotenv()
-import os, io
+import io
+import os
sys.path.insert(
0, os.path.abspath("../..")
) # Adds the parent directory to the system path
-import pytest
-import litellm
-from litellm import embedding, completion, completion_cost, Timeout
-from litellm import RateLimitError
import json
+import pytest
+
+import litellm
+from litellm import RateLimitError, Timeout, completion, completion_cost, embedding
+
litellm.num_retries = 3
@@ -37,28 +41,6 @@ def test_chat_completion_cohere():
pytest.fail(f"Error occurred: {e}")
-def test_chat_completion_cohere_stream():
- try:
- litellm.set_verbose = False
- messages = [
- {
- "role": "user",
- "content": "Hey",
- },
- ]
- response = completion(
- model="cohere_chat/command-r",
- messages=messages,
- max_tokens=10,
- stream=True,
- )
- print(response)
- for chunk in response:
- print(chunk)
- except Exception as e:
- pytest.fail(f"Error occurred: {e}")
-
-
def test_chat_completion_cohere_tool_calling():
try:
litellm.set_verbose = True
diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py
index 6aaf9951540..8e7e333ff12 100644
--- a/litellm/tests/test_completion.py
+++ b/litellm/tests/test_completion.py
@@ -11,7 +11,7 @@ import os
sys.path.insert(
0, os.path.abspath("../..")
-) # Adds-the parent directory to the system path
+) # Adds the parent directory to the system path
import os
from unittest.mock import MagicMock, patch
@@ -23,7 +23,7 @@ from litellm import RateLimitError, Timeout, completion, completion_cost, embedd
from litellm.llms.custom_httpx.http_handler import AsyncHTTPHandler, HTTPHandler
from litellm.llms.prompt_templates.factory import anthropic_messages_pt
-# litellm.num_retries=3
+# litellm.num_retries = 3
litellm.cache = None
litellm.success_callback = []
user_message = "Write a short poem about the sky"
@@ -211,7 +211,7 @@ async def test_completion_databricks(sync_mode):
response_format_tests(response=response)
-def predibase_mock_post(url, data=None, json=None, headers=None):
+def predibase_mock_post(url, data=None, json=None, headers=None, timeout=None):
mock_response = MagicMock()
mock_response.status_code = 200
mock_response.headers = {"Content-Type": "application/json"}
@@ -261,18 +261,20 @@ async def test_completion_predibase():
try:
litellm.set_verbose = True
- with patch("requests.post", side_effect=predibase_mock_post):
- response = completion(
- model="predibase/llama-3-8b-instruct",
- tenant_id="c4768f95",
- api_key=os.getenv("PREDIBASE_API_KEY"),
- messages=[{"role": "user", "content": "What is the meaning of life?"}],
- max_tokens=10,
- )
+ # with patch("requests.post", side_effect=predibase_mock_post):
+ response = await litellm.acompletion(
+ model="predibase/llama-3-8b-instruct",
+ tenant_id="c4768f95",
+ api_key=os.getenv("PREDIBASE_API_KEY"),
+ messages=[{"role": "user", "content": "What is the meaning of life?"}],
+ max_tokens=10,
+ )
- print(response)
+ print(response)
except litellm.Timeout as e:
pass
+ except litellm.ServiceUnavailableError as e:
+ pass
except Exception as e:
pytest.fail(f"Error occurred: {e}")
@@ -646,6 +648,8 @@ def test_gemini_completion_call_error():
print(f"response: {response}")
for chunk in response:
print(chunk)
+ except litellm.InternalServerError:
+ pass
except Exception as e:
pytest.fail(f"error occurred: {str(e)}")
@@ -717,6 +721,8 @@ def test_completion_cohere_command_r_plus_function_call():
force_single_step=True,
)
print(second_response)
+ except litellm.Timeout:
+ pass
except Exception as e:
pytest.fail(f"Error occurred: {e}")
@@ -1529,27 +1535,73 @@ def test_completion_fireworks_ai_dynamic_params(api_key, api_base):
pass
-@pytest.mark.skip(reason="this test is flaky")
+# @pytest.mark.skip(reason="this test is flaky")
def test_completion_perplexity_api():
try:
- # litellm.set_verbose= True
- messages = [
- {"role": "system", "content": "You're a good bot"},
- {
- "role": "user",
- "content": "Hey",
- },
- {
- "role": "user",
- "content": "Hey",
- },
- ]
- response = completion(
- model="mistral-7b-instruct",
- messages=messages,
- api_base="https://api.perplexity.ai",
- )
- print(response)
+ response_object = {
+ "id": "a8f37485-026e-45da-81a9-cf0184896840",
+ "model": "llama-3-sonar-small-32k-online",
+ "created": 1722186391,
+ "usage": {"prompt_tokens": 17, "completion_tokens": 65, "total_tokens": 82},
+ "citations": [
+ "https://www.sciencedirect.com/science/article/pii/S007961232200156X",
+ "https://www.britannica.com/event/World-War-II",
+ "https://www.loc.gov/classroom-materials/united-states-history-primary-source-timeline/great-depression-and-world-war-ii-1929-1945/world-war-ii/",
+ "https://www.nationalww2museum.org/war/topics/end-world-war-ii-1945",
+ "https://en.wikipedia.org/wiki/World_War_II",
+ ],
+ "object": "chat.completion",
+ "choices": [
+ {
+ "index": 0,
+ "finish_reason": "stop",
+ "message": {
+ "role": "assistant",
+ "content": "World War II was won by the Allied powers, which included the United States, the Soviet Union, Great Britain, France, China, and other countries. The war concluded with the surrender of Germany on May 8, 1945, and Japan on September 2, 1945[2][3][4].",
+ },
+ "delta": {"role": "assistant", "content": ""},
+ }
+ ],
+ }
+
+ from openai import OpenAI
+ from openai.types.chat.chat_completion import ChatCompletion
+
+ pydantic_obj = ChatCompletion(**response_object)
+
+ def _return_pydantic_obj(*args, **kwargs):
+ return pydantic_obj
+
+ print(f"pydantic_obj: {pydantic_obj}")
+
+ openai_client = OpenAI()
+
+ openai_client.chat.completions.create = MagicMock()
+
+ with patch.object(
+ openai_client.chat.completions, "create", side_effect=_return_pydantic_obj
+ ) as mock_client:
+ pass
+ # litellm.set_verbose= True
+ messages = [
+ {"role": "system", "content": "You're a good bot"},
+ {
+ "role": "user",
+ "content": "Hey",
+ },
+ {
+ "role": "user",
+ "content": "Hey",
+ },
+ ]
+ response = completion(
+ model="mistral-7b-instruct",
+ messages=messages,
+ api_base="https://api.perplexity.ai",
+ client=openai_client,
+ )
+ print(response)
+ assert hasattr(response, "citations")
except Exception as e:
pytest.fail(f"Error occurred: {e}")
@@ -2522,6 +2574,7 @@ def test_completion_hf_model_no_provider():
# test_completion_hf_model_no_provider()
+@pytest.mark.skip(reason="anyscale stopped serving public api endpoints")
def test_completion_anyscale_with_functions():
function1 = [
{
@@ -3542,9 +3595,10 @@ def test_completion_anthropic_hanging():
assert msg["role"] != converted_messages[i + 1]["role"]
+@pytest.mark.skip(reason="anyscale stopped serving public api endpoints")
def test_completion_anyscale_api():
try:
- # litellm.set_verbose=True
+ # litellm.set_verbose = True
messages = [
{"role": "system", "content": "You're a good bot"},
{
@@ -3628,6 +3682,8 @@ def test_chat_completion_cohere_stream():
print(response)
for chunk in response:
print(chunk)
+ except litellm.APIConnectionError as e:
+ pass
except Exception as e:
pytest.fail(f"Error occurred: {e}")
@@ -3657,6 +3713,7 @@ def test_azure_cloudflare_api():
# test_azure_cloudflare_api()
+@pytest.mark.skip(reason="anyscale stopped serving public api endpoints")
def test_completion_anyscale_2():
try:
# litellm.set_verbose = True
@@ -3679,6 +3736,7 @@ def test_completion_anyscale_2():
pytest.fail(f"Error occurred: {e}")
+@pytest.mark.skip(reason="anyscale stopped serving public api endpoints")
def test_mistral_anyscale_stream():
litellm.set_verbose = False
response = completion(
diff --git a/litellm/tests/test_completion_cost.py b/litellm/tests/test_completion_cost.py
index 53cbaa31dc8..fc0fdc32355 100644
--- a/litellm/tests/test_completion_cost.py
+++ b/litellm/tests/test_completion_cost.py
@@ -966,3 +966,44 @@ def test_completion_cost_tts(model):
)
assert cost > 0
+
+
+def test_completion_cost_anthropic():
+ """
+ model_name: claude-3-haiku-20240307
+ litellm_params:
+ model: anthropic/claude-3-haiku-20240307
+ max_tokens: 4096
+ """
+ router = litellm.Router(
+ model_list=[
+ {
+ "model_name": "claude-3-haiku-20240307",
+ "litellm_params": {
+ "model": "anthropic/claude-3-haiku-20240307",
+ "max_tokens": 4096,
+ },
+ }
+ ]
+ )
+ data = {
+ "model": "claude-3-haiku-20240307",
+ "prompt_tokens": 21,
+ "completion_tokens": 20,
+ "response_time_ms": 871.7040000000001,
+ "custom_llm_provider": "anthropic",
+ "region_name": None,
+ "prompt_characters": 0,
+ "completion_characters": 0,
+ "custom_cost_per_token": None,
+ "custom_cost_per_second": None,
+ "call_type": "acompletion",
+ }
+
+ input_cost, output_cost = cost_per_token(**data)
+
+ assert input_cost > 0
+ assert output_cost > 0
+
+ print(input_cost)
+ print(output_cost)
diff --git a/litellm/tests/test_cost_calc.py b/litellm/tests/test_cost_calc.py
new file mode 100644
index 00000000000..39d3c28fd75
--- /dev/null
+++ b/litellm/tests/test_cost_calc.py
@@ -0,0 +1,105 @@
+import os
+import sys
+import traceback
+
+from dotenv import load_dotenv
+
+load_dotenv()
+import io
+import os
+
+sys.path.insert(
+ 0, os.path.abspath("../..")
+) # Adds the parent directory to the system path
+from typing import Literal
+
+import pytest
+from pydantic import BaseModel, ConfigDict
+
+import litellm
+from litellm import Router, completion_cost, stream_chunk_builder
+
+models = [
+ dict(
+ model_name="openai/gpt-3.5-turbo",
+ ),
+ dict(
+ model_name="anthropic/claude-3-haiku-20240307",
+ ),
+ dict(
+ model_name="together_ai/meta-llama/Llama-2-7b-chat-hf",
+ ),
+]
+
+router = Router(
+ model_list=[
+ {
+ "model_name": m["model_name"],
+ "litellm_params": {
+ "model": m.get("model", m["model_name"]),
+ },
+ }
+ for m in models
+ ],
+ routing_strategy="simple-shuffle",
+ num_retries=3,
+ retry_after=1,
+ timeout=60.0,
+ allowed_fails=2,
+ cooldown_time=0,
+ debug_level="INFO",
+)
+
+
+@pytest.mark.parametrize(
+ "model",
+ [
+ "openai/gpt-3.5-turbo",
+ "anthropic/claude-3-haiku-20240307",
+ "together_ai/meta-llama/Llama-2-7b-chat-hf",
+ ],
+)
+def test_run(model: str):
+ """
+ Relevant issue - https://github.com/BerriAI/litellm/issues/4965
+ """
+ prompt = "Hi"
+ kwargs = dict(
+ model=model,
+ messages=[{"role": "user", "content": prompt}],
+ temperature=0.001,
+ top_p=0.001,
+ max_tokens=20,
+ input_cost_per_token=2,
+ output_cost_per_token=2,
+ )
+
+ print(f"--------- {model} ---------")
+ print(f"Prompt: {prompt}")
+
+ response = router.completion(**kwargs) # type: ignore
+ non_stream_output = response.choices[0].message.content.replace("\n", "") # type: ignore
+ non_stream_cost_calc = response._hidden_params["response_cost"] * 100
+
+ print(f"Non-stream output: {non_stream_output}")
+ print(f"Non-stream usage : {response.usage}") # type: ignore
+ try:
+ print(
+ f"Non-stream cost : {response._hidden_params['response_cost'] * 100:.4f}"
+ )
+ except TypeError:
+ print("Non-stream cost : NONE")
+ print(f"Non-stream cost : {completion_cost(response) * 100:.4f} (response)")
+
+ response = router.completion(**kwargs, stream=True) # type: ignore
+ response = stream_chunk_builder(list(response), messages=kwargs["messages"]) # type: ignore
+ output = response.choices[0].message.content.replace("\n", "") # type: ignore
+ streaming_cost_calc = completion_cost(response) * 100
+ print(f"Stream output : {output}")
+
+ if output == non_stream_output:
+ # assert cost is the same
+ assert streaming_cost_calc == non_stream_cost_calc
+ print(f"Stream usage : {response.usage}") # type: ignore
+ print(f"Stream cost : {streaming_cost_calc} (response)")
+ print("")
diff --git a/litellm/tests/test_embedding.py b/litellm/tests/test_embedding.py
index 79ba8bc3ee6..62487b48865 100644
--- a/litellm/tests/test_embedding.py
+++ b/litellm/tests/test_embedding.py
@@ -257,14 +257,20 @@ def test_openai_azure_embedding_optional_arg(mocker):
# test_openai_embedding()
-def test_cohere_embedding():
+@pytest.mark.parametrize("sync_mode", [True, False])
+@pytest.mark.asyncio
+async def test_cohere_embedding(sync_mode):
try:
# litellm.set_verbose=True
- response = embedding(
- model="embed-english-v2.0",
- input=["good morning from litellm", "this is another item"],
- input_type="search_query",
- )
+ data = {
+ "model": "embed-english-v2.0",
+ "input": ["good morning from litellm", "this is another item"],
+ "input_type": "search_query",
+ }
+ if sync_mode:
+ response = embedding(**data)
+ else:
+ response = await litellm.aembedding(**data)
print(f"response:", response)
assert isinstance(response.usage, litellm.Usage)
@@ -409,6 +415,62 @@ def test_hf_embedding():
# test_hf_embedding()
+from unittest.mock import MagicMock, patch
+
+
+def tgi_mock_post(*args, **kwargs):
+ import json
+
+ expected_data = {
+ "inputs": {
+ "source_sentence": "good morning from litellm",
+ "sentences": ["this is another item"],
+ }
+ }
+ assert (
+ json.loads(kwargs["data"]) == expected_data
+ ), "Data does not match the expected data"
+ mock_response = MagicMock()
+ mock_response.status_code = 200
+ mock_response.headers = {"Content-Type": "application/json"}
+ mock_response.json.return_value = [0.7708950042724609]
+ return mock_response
+
+
+from litellm.llms.custom_httpx.http_handler import AsyncHTTPHandler, HTTPHandler
+
+
+@pytest.mark.parametrize("sync_mode", [True, False])
+@pytest.mark.asyncio
+async def test_hf_embedding_sentence_sim(sync_mode):
+ try:
+ # huggingface/microsoft/codebert-base
+ # huggingface/facebook/bart-large
+ if sync_mode is True:
+ client = HTTPHandler(concurrent_limit=1)
+ else:
+ client = AsyncHTTPHandler(concurrent_limit=1)
+ with patch.object(client, "post", side_effect=tgi_mock_post) as mock_client:
+ data = {
+ "model": "huggingface/TaylorAI/bge-micro-v2",
+ "input": ["good morning from litellm", "this is another item"],
+ "client": client,
+ }
+ if sync_mode is True:
+ response = embedding(**data)
+ else:
+ response = await litellm.aembedding(**data)
+
+ print(f"response:", response)
+
+ mock_client.assert_called_once()
+
+ assert isinstance(response.usage, litellm.Usage)
+
+ except Exception as e:
+ # Note: Huggingface inference API is unstable and fails with "model loading errors all the time"
+ raise e
+
# test async embeddings
def test_aembedding():
diff --git a/litellm/tests/test_fine_tuning_api.py b/litellm/tests/test_fine_tuning_api.py
new file mode 100644
index 00000000000..1bb33cdf979
--- /dev/null
+++ b/litellm/tests/test_fine_tuning_api.py
@@ -0,0 +1,185 @@
+import os
+import sys
+import traceback
+
+import pytest
+
+sys.path.insert(
+ 0, os.path.abspath("../..")
+) # Adds the parent directory to the system path
+from openai import APITimeoutError as Timeout
+
+import litellm
+
+litellm.num_retries = 0
+import asyncio
+import logging
+
+import openai
+
+from litellm import create_fine_tuning_job
+from litellm._logging import verbose_logger
+
+
+def test_create_fine_tune_job():
+ try:
+ verbose_logger.setLevel(logging.DEBUG)
+ file_name = "openai_batch_completions.jsonl"
+ _current_dir = os.path.dirname(os.path.abspath(__file__))
+ file_path = os.path.join(_current_dir, file_name)
+
+ file_obj = litellm.create_file(
+ file=open(file_path, "rb"),
+ purpose="fine-tune",
+ custom_llm_provider="openai",
+ )
+ print("Response from creating file=", file_obj)
+
+ create_fine_tuning_response = litellm.create_fine_tuning_job(
+ model="gpt-3.5-turbo-0125",
+ training_file=file_obj.id,
+ )
+
+ print(
+ "response from litellm.create_fine_tuning_job=", create_fine_tuning_response
+ )
+
+ assert create_fine_tuning_response.id is not None
+ assert create_fine_tuning_response.model == "gpt-3.5-turbo-0125"
+
+ # list fine tuning jobs
+ print("listing ft jobs")
+ ft_jobs = litellm.list_fine_tuning_jobs(limit=2)
+ print("response from litellm.list_fine_tuning_jobs=", ft_jobs)
+
+ assert len(list(ft_jobs)) > 0
+
+ # delete file
+
+ litellm.file_delete(
+ file_id=file_obj.id,
+ )
+
+ # cancel ft job
+ response = litellm.cancel_fine_tuning_job(
+ fine_tuning_job_id=create_fine_tuning_response.id,
+ )
+
+ print("response from litellm.cancel_fine_tuning_job=", response)
+
+ assert response.status == "cancelled"
+ assert response.id == create_fine_tuning_response.id
+ pass
+ except openai.RateLimitError:
+ pass
+ except Exception as e:
+ pytest.fail(f"Error occurred: {e}")
+
+
+@pytest.mark.asyncio
+async def test_create_fine_tune_jobs_async():
+ try:
+ verbose_logger.setLevel(logging.DEBUG)
+ file_name = "openai_batch_completions.jsonl"
+ _current_dir = os.path.dirname(os.path.abspath(__file__))
+ file_path = os.path.join(_current_dir, file_name)
+
+ file_obj = await litellm.acreate_file(
+ file=open(file_path, "rb"),
+ purpose="fine-tune",
+ custom_llm_provider="openai",
+ )
+ print("Response from creating file=", file_obj)
+
+ create_fine_tuning_response = await litellm.acreate_fine_tuning_job(
+ model="gpt-3.5-turbo-0125",
+ training_file=file_obj.id,
+ )
+
+ print(
+ "response from litellm.create_fine_tuning_job=", create_fine_tuning_response
+ )
+
+ assert create_fine_tuning_response.id is not None
+ assert create_fine_tuning_response.model == "gpt-3.5-turbo-0125"
+
+ # list fine tuning jobs
+ print("listing ft jobs")
+ ft_jobs = await litellm.alist_fine_tuning_jobs(limit=2)
+ print("response from litellm.list_fine_tuning_jobs=", ft_jobs)
+ assert len(list(ft_jobs)) > 0
+
+ # delete file
+
+ await litellm.afile_delete(
+ file_id=file_obj.id,
+ )
+
+ # cancel ft job
+ response = await litellm.acancel_fine_tuning_job(
+ fine_tuning_job_id=create_fine_tuning_response.id,
+ )
+
+ print("response from litellm.cancel_fine_tuning_job=", response)
+
+ assert response.status == "cancelled"
+ assert response.id == create_fine_tuning_response.id
+ except openai.RateLimitError:
+ pass
+ except Exception as e:
+ pytest.fail(f"Error occurred: {e}")
+ pass
+
+
+@pytest.mark.asyncio
+async def test_azure_create_fine_tune_jobs_async():
+ try:
+ verbose_logger.setLevel(logging.DEBUG)
+ file_name = "azure_fine_tune.jsonl"
+ _current_dir = os.path.dirname(os.path.abspath(__file__))
+ file_path = os.path.join(_current_dir, file_name)
+
+ file_id = "file-5e4b20ecbd724182b9964f3cd2ab7212"
+
+ create_fine_tuning_response = await litellm.acreate_fine_tuning_job(
+ model="gpt-35-turbo-1106",
+ training_file=file_id,
+ custom_llm_provider="azure",
+ api_key=os.getenv("AZURE_SWEDEN_API_KEY"),
+ api_base="https://my-endpoint-sweden-berri992.openai.azure.com/",
+ )
+
+ print(
+ "response from litellm.create_fine_tuning_job=", create_fine_tuning_response
+ )
+
+ assert create_fine_tuning_response.id is not None
+ assert create_fine_tuning_response.model == "gpt-35-turbo-1106"
+
+ # list fine tuning jobs
+ print("listing ft jobs")
+ ft_jobs = await litellm.alist_fine_tuning_jobs(
+ limit=2,
+ custom_llm_provider="azure",
+ api_key=os.getenv("AZURE_SWEDEN_API_KEY"),
+ api_base="https://my-endpoint-sweden-berri992.openai.azure.com/",
+ )
+ print("response from litellm.list_fine_tuning_jobs=", ft_jobs)
+
+ # cancel ft job
+ response = await litellm.acancel_fine_tuning_job(
+ fine_tuning_job_id=create_fine_tuning_response.id,
+ custom_llm_provider="azure",
+ api_key=os.getenv("AZURE_SWEDEN_API_KEY"),
+ api_base="https://my-endpoint-sweden-berri992.openai.azure.com/",
+ )
+
+ print("response from litellm.cancel_fine_tuning_job=", response)
+
+ assert response.status == "cancelled"
+ assert response.id == create_fine_tuning_response.id
+ except openai.RateLimitError:
+ pass
+ except Exception as e:
+ pytest.fail(f"Error occurred: {e}")
+ pass
diff --git a/litellm/tests/test_gcs_bucket.py b/litellm/tests/test_gcs_bucket.py
new file mode 100644
index 00000000000..53ef96fda68
--- /dev/null
+++ b/litellm/tests/test_gcs_bucket.py
@@ -0,0 +1,96 @@
+import io
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath("../.."))
+
+import asyncio
+import json
+import logging
+import tempfile
+import uuid
+
+import pytest
+
+import litellm
+from litellm import completion
+from litellm._logging import verbose_logger
+from litellm.integrations.gcs_bucket import GCSBucketLogger
+
+verbose_logger.setLevel(logging.DEBUG)
+
+
+def load_vertex_ai_credentials():
+ # Define the path to the vertex_key.json file
+ print("loading vertex ai credentials")
+ filepath = os.path.dirname(os.path.abspath(__file__))
+ vertex_key_path = filepath + "/adroit-crow-413218-bc47f303efc9.json"
+
+ # Read the existing content of the file or create an empty dictionary
+ try:
+ with open(vertex_key_path, "r") as file:
+ # Read the file content
+ print("Read vertexai file path")
+ content = file.read()
+
+ # If the file is empty or not valid JSON, create an empty dictionary
+ if not content or not content.strip():
+ service_account_key_data = {}
+ else:
+ # Attempt to load the existing JSON content
+ file.seek(0)
+ service_account_key_data = json.load(file)
+ except FileNotFoundError:
+ # If the file doesn't exist, create an empty dictionary
+ service_account_key_data = {}
+
+ # Update the service_account_key_data with environment variables
+ private_key_id = os.environ.get("GCS_PRIVATE_KEY_ID", "")
+ private_key = os.environ.get("GCS_PRIVATE_KEY", "")
+ private_key = private_key.replace("\\n", "\n")
+ service_account_key_data["private_key_id"] = private_key_id
+ service_account_key_data["private_key"] = private_key
+
+ # Create a temporary file
+ with tempfile.NamedTemporaryFile(mode="w+", delete=False) as temp_file:
+ # Write the updated content to the temporary files
+ json.dump(service_account_key_data, temp_file, indent=2)
+
+ # Export the temporary file as GOOGLE_APPLICATION_CREDENTIALS
+ os.environ["GCS_PATH_SERVICE_ACCOUNT"] = os.path.abspath(temp_file.name)
+ print("created gcs path service account=", os.environ["GCS_PATH_SERVICE_ACCOUNT"])
+
+
+@pytest.mark.asyncio
+async def test_basic_gcs_logger():
+ load_vertex_ai_credentials()
+ gcs_logger = GCSBucketLogger()
+ print("GCSBucketLogger", gcs_logger)
+
+ litellm.callbacks = [gcs_logger]
+ response = await litellm.acompletion(
+ model="gpt-3.5-turbo",
+ temperature=0.7,
+ messages=[{"role": "user", "content": "This is a test"}],
+ max_tokens=10,
+ user="ishaan-2",
+ mock_response="Hi!",
+ )
+
+ print("response", response)
+
+ await asyncio.sleep(5)
+
+ # Check if object landed on GCS
+ object_from_gcs = await gcs_logger.download_gcs_object(object_name=response.id)
+ # convert object_from_gcs from bytes to DICT
+ object_from_gcs = json.loads(object_from_gcs)
+ print("object_from_gcs", object_from_gcs)
+
+ assert object_from_gcs["request_id"] == response.id
+ assert object_from_gcs["call_type"] == "acompletion"
+ assert object_from_gcs["model"] == "gpt-3.5-turbo"
+
+ # Delete Object from GCS
+ print("deleting object from GCS")
+ await gcs_logger.delete_gcs_object(object_name=response.id)
diff --git a/litellm/tests/test_key_generate_prisma.py b/litellm/tests/test_key_generate_prisma.py
index a74625c0ce1..53f6ab7f5c4 100644
--- a/litellm/tests/test_key_generate_prisma.py
+++ b/litellm/tests/test_key_generate_prisma.py
@@ -1953,7 +1953,7 @@ async def test_upperbound_key_params(prisma_client):
key = await generate_key_fn(request)
# print(result)
except Exception as e:
- assert e.code == 400
+ assert e.code == str(400)
def test_get_bearer_token():
diff --git a/litellm/tests/test_model_alias_map.py b/litellm/tests/test_model_alias_map.py
index 31a7d34b8e1..1e69bcf95e2 100644
--- a/litellm/tests/test_model_alias_map.py
+++ b/litellm/tests/test_model_alias_map.py
@@ -1,19 +1,21 @@
#### What this tests ####
# This tests the model alias mapping - if user passes in an alias, and has set an alias, set it to the actual value
-import sys, os
+import os
+import sys
import traceback
sys.path.insert(
0, os.path.abspath("../..")
) # Adds the parent directory to the system path
-import litellm
-from litellm import embedding, completion
import pytest
+import litellm
+from litellm import completion, embedding
+
litellm.set_verbose = True
-model_alias_map = {"good-model": "anyscale/meta-llama/Llama-2-7b-chat-hf"}
+model_alias_map = {"good-model": "groq/llama3-8b-8192"}
def test_model_alias_map(caplog):
@@ -33,7 +35,7 @@ def test_model_alias_map(caplog):
for log in captured_logs:
assert "ERROR" not in log
- assert "Llama-2-7b-chat-hf" in response.model
+ assert "groq/llama3-8b-8192" in response.model
except Exception as e:
pytest.fail(f"Error occurred: {e}")
diff --git a/litellm/tests/test_openai_batches_and_files.py b/litellm/tests/test_openai_batches_and_files.py
index 14aee6e19f1..e8bde4d20de 100644
--- a/litellm/tests/test_openai_batches_and_files.py
+++ b/litellm/tests/test_openai_batches_and_files.py
@@ -72,6 +72,10 @@ def test_create_batch():
assert retrieved_batch.id == create_batch_response.id
+ # list all batches
+ list_batches = litellm.list_batches(custom_llm_provider="openai", limit=2)
+ print("list_batches=", list_batches)
+
file_content = litellm.file_content(
file_id=batch_input_file_id, custom_llm_provider="openai"
)
@@ -140,6 +144,10 @@ async def test_async_create_batch():
assert retrieved_batch.id == create_batch_response.id
+ # list all batches
+ list_batches = await litellm.alist_batches(custom_llm_provider="openai", limit=2)
+ print("list_batches=", list_batches)
+
# try to get file content for our original file
file_content = await litellm.afile_content(
diff --git a/litellm/tests/test_proxy_custom_auth.py b/litellm/tests/test_proxy_custom_auth.py
index d4c39e3d5d6..cffcc2e7f2c 100644
--- a/litellm/tests/test_proxy_custom_auth.py
+++ b/litellm/tests/test_proxy_custom_auth.py
@@ -1,29 +1,34 @@
-import sys, os
+import os
+import sys
import traceback
+
from dotenv import load_dotenv
load_dotenv()
-import os, io
+import io
+import os
# this file is to test litellm/proxy
sys.path.insert(
0, os.path.abspath("../..")
) # Adds the parent directory to the system path
-import pytest, asyncio
-import litellm
-from litellm import embedding, completion, completion_cost, Timeout
-from litellm import RateLimitError
+import asyncio
+
+import pytest
+from fastapi import FastAPI
# test /chat/completion request to the proxy
from fastapi.testclient import TestClient
-from fastapi import FastAPI
-from litellm.proxy.proxy_server import (
+
+import litellm
+from litellm import RateLimitError, Timeout, completion, completion_cost, embedding
+from litellm.proxy.proxy_server import ( # Replace with the actual module where your FastAPI router is defined
+ ProxyConfig,
+ initialize,
router,
save_worker_config,
- initialize,
- ProxyConfig,
-) # Replace with the actual module where your FastAPI router is defined
+)
# Here you create a fixture that will be used by your tests
@@ -62,7 +67,7 @@ def test_custom_auth(client):
except Exception as e:
print(vars(e))
print("got an exception")
- assert e.code == 401
+ assert e.code == "401"
assert e.message == "Authentication Error, Failed custom auth"
pass
@@ -86,7 +91,7 @@ def test_custom_auth_bearer(client):
except Exception as e:
print(vars(e))
print("got an exception")
- assert e.code == 401
+ assert e.code == "401"
assert (
e.message
== "Authentication Error, CustomAuth - Malformed API Key passed in. Ensure Key has `Bearer` prefix"
diff --git a/litellm/tests/test_proxy_exception_mapping.py b/litellm/tests/test_proxy_exception_mapping.py
index 07ae7f5a876..a774d1b0ef0 100644
--- a/litellm/tests/test_proxy_exception_mapping.py
+++ b/litellm/tests/test_proxy_exception_mapping.py
@@ -79,6 +79,13 @@ def test_chat_completion_exception(client):
in json_response["error"]["message"]
)
+ code_in_error = json_response["error"]["code"]
+ # OpenAI SDK required code to be STR, https://github.com/BerriAI/litellm/issues/4970
+ # If we look on official python OpenAI lib, the code should be a string:
+ # https://github.com/openai/openai-python/blob/195c05a64d39c87b2dfdf1eca2d339597f1fce03/src/openai/types/shared/error_object.py#L11
+ # Related LiteLLM issue: https://github.com/BerriAI/litellm/discussions/4834
+ assert type(code_in_error) == str
+
# make an openai client to call _make_status_error_from_response
openai_client = openai.OpenAI(api_key="anything")
openai_exception = openai_client._make_status_error_from_response(
diff --git a/litellm/tests/test_proxy_routes.py b/litellm/tests/test_proxy_routes.py
index 6f5774d3e73..03f112a5e22 100644
--- a/litellm/tests/test_proxy_routes.py
+++ b/litellm/tests/test_proxy_routes.py
@@ -69,7 +69,7 @@ def test_routes_on_litellm_proxy():
("/v1/threads/thread_49EIN5QF32s4mH20M7GFKdlZ", True),
("/threads/thread_49EIN5QF32s4mH20M7GFKdlZ/messages", True),
("/v1/threads/thread_49EIN5QF32s4mH20M7GFKdlZ/runs", True),
- ("/v1/batches123456", True),
+ ("/v1/batches/123456", True),
# Test non-OpenAI routes
("/some/random/route", False),
("/v2/chat/completions", False),
@@ -81,7 +81,7 @@ def test_is_llm_api_route(route: str, expected: bool):
assert is_llm_api_route(route) == expected
-# Test case for routes that are similar but should return False
+# Test-case for routes that are similar but should return False
@pytest.mark.parametrize(
"route",
[
diff --git a/litellm/tests/test_proxy_server.py b/litellm/tests/test_proxy_server.py
index 0e5431c3fe2..b0a972bddc8 100644
--- a/litellm/tests/test_proxy_server.py
+++ b/litellm/tests/test_proxy_server.py
@@ -188,7 +188,12 @@ async def test_team_disable_guardrails(mock_acompletion, client_no_auth):
from fastapi import HTTPException, Request
from starlette.datastructures import URL
- from litellm.proxy._types import LiteLLM_TeamTable, ProxyException, UserAPIKeyAuth
+ from litellm.proxy._types import (
+ LiteLLM_TeamTable,
+ LiteLLM_TeamTableCachedObj,
+ ProxyException,
+ UserAPIKeyAuth,
+ )
from litellm.proxy.auth.user_api_key_auth import user_api_key_auth
from litellm.proxy.proxy_server import hash_token, user_api_key_cache
@@ -202,7 +207,7 @@ async def test_team_disable_guardrails(mock_acompletion, client_no_auth):
last_refreshed_at=time.time(),
)
await asyncio.sleep(1)
- team_obj = LiteLLM_TeamTable(
+ team_obj = LiteLLM_TeamTableCachedObj(
team_id=_team_id,
blocked=False,
last_refreshed_at=time.time(),
@@ -227,7 +232,7 @@ async def test_team_disable_guardrails(mock_acompletion, client_no_auth):
await user_api_key_auth(request=request, api_key="Bearer " + user_key)
pytest.fail("Expected to raise 403 forbidden error.")
except ProxyException as e:
- assert e.code == 403
+ assert e.code == str(403)
from litellm.tests.test_custom_callback_input import CompletionCustomHandler
@@ -740,7 +745,7 @@ async def test_team_update_redis():
Tests if team update, updates the redis cache if set
"""
from litellm.caching import DualCache, RedisCache
- from litellm.proxy._types import LiteLLM_TeamTable
+ from litellm.proxy._types import LiteLLM_TeamTableCachedObj
from litellm.proxy.auth.auth_checks import _cache_team_object
proxy_logging_obj: ProxyLogging = getattr(
@@ -756,7 +761,7 @@ async def test_team_update_redis():
) as mock_client:
await _cache_team_object(
team_id="1234",
- team_table=LiteLLM_TeamTable(),
+ team_table=LiteLLM_TeamTableCachedObj(),
user_api_key_cache=DualCache(),
proxy_logging_obj=proxy_logging_obj,
)
@@ -770,7 +775,6 @@ async def test_get_team_redis(client_no_auth):
Tests if get_team_object gets value from redis cache, if set
"""
from litellm.caching import DualCache, RedisCache
- from litellm.proxy._types import LiteLLM_TeamTable
from litellm.proxy.auth.auth_checks import _cache_team_object, get_team_object
proxy_logging_obj: ProxyLogging = getattr(
diff --git a/litellm/tests/test_proxy_utils.py b/litellm/tests/test_proxy_utils.py
index aea81b0173b..c8f6916e2c5 100644
--- a/litellm/tests/test_proxy_utils.py
+++ b/litellm/tests/test_proxy_utils.py
@@ -1,9 +1,16 @@
import asyncio
+import os
+import sys
from unittest.mock import Mock
import pytest
from fastapi import Request
+import litellm
+
+sys.path.insert(
+ 0, os.path.abspath("../..")
+) # Adds the parent directory to the system path
from litellm.proxy._types import UserAPIKeyAuth
from litellm.proxy.litellm_pre_call_utils import add_litellm_data_to_request
from litellm.types.utils import SupportedCacheControls
@@ -13,7 +20,7 @@ from litellm.types.utils import SupportedCacheControls
def mock_request(monkeypatch):
mock_request = Mock(spec=Request)
mock_request.query_params = {} # Set mock query_params to an empty dictionary
- mock_request.headers = {}
+ mock_request.headers = {"traceparent": "test_traceparent"}
monkeypatch.setattr(
"litellm.proxy.litellm_pre_call_utils.add_litellm_data_to_request", mock_request
)
@@ -60,3 +67,40 @@ async def test_add_litellm_data_to_request_non_thread_endpoint(endpoint, mock_re
assert "metadata" in data
assert "litellm_metadata" not in data
+
+
+# test adding traceparent
+
+
+@pytest.mark.parametrize(
+ "endpoint", ["/chat/completions", "/v1/completions", "/completions"]
+)
+@pytest.mark.asyncio
+async def test_traceparent_not_added_by_default(endpoint, mock_request):
+ """
+ This tests that traceparent is not forwarded in the extra_headers
+
+ We had an incident where bedrock calls were failing because traceparent was forwarded
+ """
+ from litellm.integrations.opentelemetry import OpenTelemetry
+
+ otel_logger = OpenTelemetry()
+ setattr(litellm.proxy.proxy_server, "open_telemetry_logger", otel_logger)
+
+ mock_request.url.path = endpoint
+ user_api_key_dict = UserAPIKeyAuth(
+ api_key="test_api_key", user_id="test_user_id", org_id="test_org_id"
+ )
+ proxy_config = Mock()
+
+ data = {}
+ await add_litellm_data_to_request(
+ data, mock_request, user_api_key_dict, proxy_config
+ )
+
+ print("DATA: ", data)
+
+ _extra_headers = data.get("extra_headers") or {}
+ assert "traceparent" not in _extra_headers
+
+ setattr(litellm.proxy.proxy_server, "open_telemetry_logger", None)
diff --git a/litellm/tests/test_streaming.py b/litellm/tests/test_streaming.py
index 9aebc0f2477..9c53d5cfbcf 100644
--- a/litellm/tests/test_streaming.py
+++ b/litellm/tests/test_streaming.py
@@ -510,10 +510,10 @@ def test_completion_azure_stream():
async def test_completion_predibase_streaming(sync_mode):
try:
litellm.set_verbose = True
-
if sync_mode:
response = completion(
model="predibase/llama-3-8b-instruct",
+ timeout=5,
tenant_id="c4768f95",
max_tokens=10,
api_base="https://serving.app.predibase.com",
@@ -540,6 +540,7 @@ async def test_completion_predibase_streaming(sync_mode):
response = await litellm.acompletion(
model="predibase/llama-3-8b-instruct",
tenant_id="c4768f95",
+ timeout=5,
max_tokens=10,
api_base="https://serving.app.predibase.com",
api_key=os.getenv("PREDIBASE_API_KEY"),
@@ -567,9 +568,13 @@ async def test_completion_predibase_streaming(sync_mode):
raise Exception("Empty response received")
print(f"complete_response: {complete_response}")
- except litellm.Timeout as e:
+ except litellm.Timeout:
pass
- except litellm.InternalServerError as e:
+ except litellm.InternalServerError:
+ pass
+ except litellm.ServiceUnavailableError:
+ pass
+ except litellm.APIConnectionError:
pass
except Exception as e:
print("ERROR class", e.__class__)
@@ -690,26 +695,31 @@ def test_completion_claude_2_stream():
@pytest.mark.asyncio
async def test_acompletion_claude_2_stream():
- litellm.set_verbose = True
- response = await litellm.acompletion(
- model="claude-2",
- messages=[{"role": "user", "content": "hello from litellm"}],
- stream=True,
- )
- complete_response = ""
- # Add any assertions here to check the response
- idx = 0
- async for chunk in response:
- print(chunk)
- # print(chunk.choices[0].delta)
- chunk, finished = streaming_format_tests(idx, chunk)
- if finished:
- break
- complete_response += chunk
- idx += 1
- if complete_response.strip() == "":
- raise Exception("Empty response received")
- print(f"completion_response: {complete_response}")
+ try:
+ litellm.set_verbose = True
+ response = await litellm.acompletion(
+ model="claude-2",
+ messages=[{"role": "user", "content": "hello from litellm"}],
+ stream=True,
+ )
+ complete_response = ""
+ # Add any assertions here to check the response
+ idx = 0
+ async for chunk in response:
+ print(chunk)
+ # print(chunk.choices[0].delta)
+ chunk, finished = streaming_format_tests(idx, chunk)
+ if finished:
+ break
+ complete_response += chunk
+ idx += 1
+ if complete_response.strip() == "":
+ raise Exception("Empty response received")
+ print(f"completion_response: {complete_response}")
+ except litellm.RateLimitError:
+ pass
+ except Exception as e:
+ pytest.fail(f"Error occurred: {e}")
def test_completion_palm_stream():
@@ -1446,6 +1456,7 @@ async def test_parallel_streaming_requests(sync_mode, model):
messages=messages,
stream=True,
max_tokens=10,
+ timeout=10,
)
complete_response = ""
# Add any assertions here to-check the response
@@ -1463,6 +1474,7 @@ async def test_parallel_streaming_requests(sync_mode, model):
messages=messages,
stream=True,
max_tokens=10,
+ timeout=10,
)
complete_response = ""
# Add any assertions here to-check the response
@@ -1493,6 +1505,13 @@ async def test_parallel_streaming_requests(sync_mode, model):
except RateLimitError:
pass
+ except litellm.Timeout:
+ pass
+ except litellm.ServiceUnavailableError as e:
+ if model == "predibase/llama-3-8b-instruct":
+ pass
+ else:
+ pytest.fail(f"Service Unavailable Error got{str(e)}")
except litellm.InternalServerError as e:
if "predibase" in str(e).lower():
# only skip internal server error from predibase - their endpoint seems quite unstable
@@ -1722,6 +1741,7 @@ def test_sagemaker_weird_response():
# test_sagemaker_weird_response()
+@pytest.mark.skip(reason="Move to being a mock endpoint")
@pytest.mark.asyncio
async def test_sagemaker_streaming_async():
try:
@@ -1764,6 +1784,7 @@ async def test_sagemaker_streaming_async():
# asyncio.run(test_sagemaker_streaming_async())
+@pytest.mark.skip(reason="costly sagemaker deployment. Move to mock implementation")
def test_completion_sagemaker_stream():
try:
response = completion(
@@ -3075,6 +3096,7 @@ def test_completion_claude_3_function_call_with_streaming():
elif idx == 1 and chunk.choices[0].finish_reason is None:
validate_second_streaming_function_calling_chunk(chunk=chunk)
elif chunk.choices[0].finish_reason is not None: # last chunk
+ assert "usage" in chunk._hidden_params
validate_final_streaming_function_calling_chunk(chunk=chunk)
idx += 1
# raise Exception("it worked!")
diff --git a/litellm/tests/test_text_completion.py b/litellm/tests/test_text_completion.py
index 6a0080b3736..618a6095f03 100644
--- a/litellm/tests/test_text_completion.py
+++ b/litellm/tests/test_text_completion.py
@@ -4104,9 +4104,19 @@ async def test_async_text_completion_chat_model_stream():
# asyncio.run(test_async_text_completion_chat_model_stream())
+@pytest.mark.parametrize(
+ "model", ["vertex_ai/codestral@2405", "text-completion-codestral/codestral-2405"] #
+)
@pytest.mark.asyncio
-async def test_completion_codestral_fim_api():
+async def test_completion_codestral_fim_api(model):
try:
+ if model == "vertex_ai/codestral@2405":
+ from litellm.tests.test_amazing_vertex_completion import (
+ load_vertex_ai_credentials,
+ )
+
+ load_vertex_ai_credentials()
+
litellm.set_verbose = True
import logging
@@ -4114,7 +4124,7 @@ async def test_completion_codestral_fim_api():
verbose_logger.setLevel(level=logging.DEBUG)
response = await litellm.atext_completion(
- model="text-completion-codestral/codestral-2405",
+ model=model,
prompt="def is_odd(n): \n return n % 2 == 1 \ndef test_is_odd():",
suffix="return True",
temperature=0,
@@ -4137,9 +4147,19 @@ async def test_completion_codestral_fim_api():
pytest.fail(f"Error occurred: {e}")
+@pytest.mark.parametrize(
+ "model",
+ ["vertex_ai/codestral@2405", "text-completion-codestral/codestral-2405"],
+)
@pytest.mark.asyncio
-async def test_completion_codestral_fim_api_stream():
+async def test_completion_codestral_fim_api_stream(model):
try:
+ if model == "vertex_ai/codestral@2405":
+ from litellm.tests.test_amazing_vertex_completion import (
+ load_vertex_ai_credentials,
+ )
+
+ load_vertex_ai_credentials()
import logging
from litellm._logging import verbose_logger
@@ -4148,7 +4168,7 @@ async def test_completion_codestral_fim_api_stream():
# verbose_logger.setLevel(level=logging.DEBUG)
response = await litellm.atext_completion(
- model="text-completion-codestral/codestral-2405",
+ model=model,
prompt="def is_odd(n): \n return n % 2 == 1 \ndef test_is_odd():",
suffix="return True",
temperature=0,
diff --git a/litellm/tests/test_timeout.py b/litellm/tests/test_timeout.py
index f24b26a0cf2..b74cf89eaa4 100644
--- a/litellm/tests/test_timeout.py
+++ b/litellm/tests/test_timeout.py
@@ -1,16 +1,21 @@
#### What this tests ####
# This tests the timeout decorator
-import sys, os
+import os
+import sys
import traceback
sys.path.insert(
0, os.path.abspath("../..")
) # Adds the parent directory to the system path
import time
-import litellm
+import uuid
+
+import httpx
import openai
-import pytest, uuid, httpx
+import pytest
+
+import litellm
@pytest.mark.parametrize(
@@ -245,3 +250,39 @@ def test_timeout_ollama():
# test_timeout_ollama()
+
+
+@pytest.mark.parametrize("streaming", [True, False])
+@pytest.mark.parametrize("sync_mode", [True, False])
+@pytest.mark.asyncio
+async def test_anthropic_timeout(streaming, sync_mode):
+ litellm.set_verbose = False
+
+ try:
+ if sync_mode:
+ response = litellm.completion(
+ model="claude-3-5-sonnet-20240620",
+ timeout=0.01,
+ messages=[{"role": "user", "content": "hello, write a 20 pg essay"}],
+ stream=streaming,
+ )
+ if isinstance(response, litellm.CustomStreamWrapper):
+ for chunk in response:
+ pass
+ else:
+ response = await litellm.acompletion(
+ model="claude-3-5-sonnet-20240620",
+ timeout=0.01,
+ messages=[{"role": "user", "content": "hello, write a 20 pg essay"}],
+ stream=streaming,
+ )
+ if isinstance(response, litellm.CustomStreamWrapper):
+ async for chunk in response:
+ pass
+ pytest.fail("Did not raise error `openai.APITimeoutError`")
+ except openai.APITimeoutError as e:
+ print(
+ "Passed: Raised correct exception. Got openai.APITimeoutError\nGood Job", e
+ )
+ print(type(e))
+ pass
diff --git a/litellm/tests/test_traceloop.py b/litellm/tests/test_traceloop.py
index f9697362858..bcc120323cb 100644
--- a/litellm/tests/test_traceloop.py
+++ b/litellm/tests/test_traceloop.py
@@ -1,11 +1,13 @@
-import sys
import os
+import sys
import time
+
import pytest
-import litellm
from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter
from traceloop.sdk import Traceloop
+import litellm
+
sys.path.insert(0, os.path.abspath("../.."))
@@ -25,11 +27,11 @@ def exporter():
@pytest.mark.parametrize("model", ["claude-instant-1.2", "gpt-3.5-turbo"])
def test_traceloop_logging(exporter, model):
-
litellm.completion(
model=model,
messages=[{"role": "user", "content": "This is a test"}],
max_tokens=1000,
temperature=0.7,
timeout=5,
+ mock_response="hi",
)
diff --git a/litellm/tests/test_user_api_key_auth.py b/litellm/tests/test_user_api_key_auth.py
index 5a8402bdcc6..6ad0a62e799 100644
--- a/litellm/tests/test_user_api_key_auth.py
+++ b/litellm/tests/test_user_api_key_auth.py
@@ -61,7 +61,11 @@ async def test_check_blocked_team():
from fastapi import Request
from starlette.datastructures import URL
- from litellm.proxy._types import LiteLLM_TeamTable, UserAPIKeyAuth
+ from litellm.proxy._types import (
+ LiteLLM_TeamTable,
+ LiteLLM_TeamTableCachedObj,
+ UserAPIKeyAuth,
+ )
from litellm.proxy.auth.user_api_key_auth import user_api_key_auth
from litellm.proxy.proxy_server import hash_token, user_api_key_cache
@@ -75,7 +79,7 @@ async def test_check_blocked_team():
last_refreshed_at=time.time(),
)
await asyncio.sleep(1)
- team_obj = LiteLLM_TeamTable(
+ team_obj = LiteLLM_TeamTableCachedObj(
team_id=_team_id, blocked=False, last_refreshed_at=time.time()
)
user_api_key_cache.set_cache(key=hash_token(user_key), value=valid_token)
diff --git a/litellm/types/llms/openai.py b/litellm/types/llms/openai.py
index 35e442119de..875ccadf14e 100644
--- a/litellm/types/llms/openai.py
+++ b/litellm/types/llms/openai.py
@@ -9,7 +9,6 @@ from typing import (
Mapping,
Optional,
Tuple,
- TypedDict,
Union,
)
@@ -30,8 +29,8 @@ from openai.types.beta.thread_create_params import (
from openai.types.beta.threads.message import Message as OpenAIMessage
from openai.types.beta.threads.message_content import MessageContent
from openai.types.beta.threads.run import Run
-from pydantic import BaseModel
-from typing_extensions import Dict, Required, override
+from pydantic import BaseModel, Field
+from typing_extensions import Dict, Required, TypedDict, override
FileContent = Union[IO[bytes], bytes, PathLike]
@@ -455,3 +454,56 @@ class ChatCompletionUsageBlock(TypedDict):
prompt_tokens: int
completion_tokens: int
total_tokens: int
+
+
+class Hyperparameters(BaseModel):
+ batch_size: Optional[Union[str, int]] = None # "Number of examples in each batch."
+ learning_rate_multiplier: Optional[Union[str, float]] = (
+ None # Scaling factor for the learning rate
+ )
+ n_epochs: Optional[Union[str, int]] = (
+ None # "The number of epochs to train the model for"
+ )
+
+
+class FineTuningJobCreate(BaseModel):
+ """
+ FineTuningJobCreate - Create a fine-tuning job
+
+ Example Request
+ ```
+ {
+ "model": "gpt-3.5-turbo",
+ "training_file": "file-abc123",
+ "hyperparameters": {
+ "batch_size": "auto",
+ "learning_rate_multiplier": 0.1,
+ "n_epochs": 3
+ },
+ "suffix": "custom-model-name",
+ "validation_file": "file-xyz789",
+ "integrations": ["slack"],
+ "seed": 42
+ }
+ ```
+ """
+
+ model: str # "The name of the model to fine-tune."
+ training_file: str # "The ID of an uploaded file that contains training data."
+ hyperparameters: Optional[Hyperparameters] = (
+ None # "The hyperparameters used for the fine-tuning job."
+ )
+ suffix: Optional[str] = (
+ None # "A string of up to 18 characters that will be added to your fine-tuned model name."
+ )
+ validation_file: Optional[str] = (
+ None # "The ID of an uploaded file that contains validation data."
+ )
+ integrations: Optional[List[str]] = (
+ None # "A list of integrations to enable for your fine-tuning job."
+ )
+ seed: Optional[int] = None # "The seed controls the reproducibility of the job."
+
+
+class LiteLLMFineTuningJobCreate(FineTuningJobCreate):
+ custom_llm_provider: Literal["openai", "azure"]
diff --git a/litellm/types/utils.py b/litellm/types/utils.py
index 3f7b16a2ad9..199edef6b45 100644
--- a/litellm/types/utils.py
+++ b/litellm/types/utils.py
@@ -40,6 +40,8 @@ class ModelInfo(TypedDict, total=False):
Model info for a given model, this is information found in litellm.model_prices_and_context_window.json
"""
+ key: Required[str] # the key in litellm.model_cost which is returned
+
max_tokens: Required[Optional[int]]
max_input_tokens: Required[Optional[int]]
max_output_tokens: Required[Optional[int]]
diff --git a/litellm/utils.py b/litellm/utils.py
index 1475639eacd..ff3fe472221 100644
--- a/litellm/utils.py
+++ b/litellm/utils.py
@@ -1376,15 +1376,7 @@ def client(original_function):
optional_params=kwargs,
)
result._hidden_params["response_cost"] = (
- litellm.response_cost_calculator(
- response_object=result,
- model=getattr(logging_obj, "model", ""),
- custom_llm_provider=getattr(
- logging_obj, "custom_llm_provider", None
- ),
- call_type=getattr(logging_obj, "call_type", "completion"),
- optional_params=getattr(logging_obj, "optional_params", {}),
- )
+ logging_obj._response_cost_calculator(result=result)
)
if (
isinstance(result, ModelResponse)
@@ -2156,6 +2148,13 @@ def supports_parallel_function_calling(model: str):
####### HELPER FUNCTIONS ################
+def _update_dictionary(existing_dict: Dict, new_dict: dict) -> dict:
+ for k, v in new_dict.items():
+ existing_dict[k] = v
+
+ return existing_dict
+
+
def register_model(model_cost: Union[str, dict]):
"""
Register new / Override existing models (and their pricing) to specific providers.
@@ -2178,8 +2177,17 @@ def register_model(model_cost: Union[str, dict]):
loaded_model_cost = litellm.get_model_cost_map(url=model_cost)
for key, value in loaded_model_cost.items():
+ ## get model info ##
+ try:
+ existing_model: Union[ModelInfo, dict] = get_model_info(model=key)
+ model_cost_key = existing_model["key"]
+ except Exception:
+ existing_model = {}
+ model_cost_key = key
## override / add new keys to the existing model cost dictionary
- litellm.model_cost.setdefault(key, {}).update(value)
+ litellm.model_cost.setdefault(model_cost_key, {}).update(
+ _update_dictionary(existing_model, value) # type: ignore
+ )
verbose_logger.debug(f"{key} added to model cost map")
# add new model names to provider lists
if value.get("litellm_provider") == "openai":
@@ -2250,6 +2258,7 @@ def get_litellm_params(
output_cost_per_token=None,
output_cost_per_second=None,
cooldown_time=None,
+ text_completion=None,
):
litellm_params = {
"acompletion": acompletion,
@@ -2273,6 +2282,7 @@ def get_litellm_params(
"output_cost_per_token": output_cost_per_token,
"output_cost_per_second": output_cost_per_second,
"cooldown_time": cooldown_time,
+ "text_completion": text_completion,
}
return litellm_params
@@ -3119,10 +3129,15 @@ def get_optional_params(
model=model, custom_llm_provider=custom_llm_provider
)
_check_valid_arg(supported_params=supported_params)
- optional_params = litellm.MistralConfig().map_openai_params(
- non_default_params=non_default_params,
- optional_params=optional_params,
- )
+ if "codestral" in model:
+ optional_params = litellm.MistralTextCompletionConfig().map_openai_params(
+ non_default_params=non_default_params, optional_params=optional_params
+ )
+ else:
+ optional_params = litellm.MistralConfig().map_openai_params(
+ non_default_params=non_default_params,
+ optional_params=optional_params,
+ )
elif custom_llm_provider == "sagemaker":
## check if unsupported param passed in
supported_params = get_supported_openai_params(
@@ -4231,6 +4246,10 @@ def get_supported_openai_params(
return litellm.VertexAILlama3Config().get_supported_openai_params()
if model.startswith("mistral"):
return litellm.MistralConfig().get_supported_openai_params()
+ if model.startswith("codestral"):
+ return (
+ litellm.MistralTextCompletionConfig().get_supported_openai_params()
+ )
return litellm.VertexAIConfig().get_supported_openai_params()
elif request_type == "embeddings":
return litellm.VertexAITextEmbeddingConfig().get_supported_openai_params()
@@ -4866,6 +4885,7 @@ def get_model_info(model: str, custom_llm_provider: Optional[str] = None) -> Mod
Returns:
dict: A dictionary containing the following information:
+ key: Required[str] # the key in litellm.model_cost which is returned
max_tokens: Required[Optional[int]]
max_input_tokens: Required[Optional[int]]
max_output_tokens: Required[Optional[int]]
@@ -4946,6 +4966,8 @@ def get_model_info(model: str, custom_llm_provider: Optional[str] = None) -> Mod
if custom_llm_provider is not None and custom_llm_provider == "vertex_ai":
if "meta/" + model in litellm.vertex_llama3_models:
model = "meta/" + model
+ elif model + "@latest" in litellm.vertex_mistral_models:
+ model = model + "@latest"
##########################
if custom_llm_provider is None:
# Get custom_llm_provider
@@ -4965,6 +4987,7 @@ def get_model_info(model: str, custom_llm_provider: Optional[str] = None) -> Mod
if custom_llm_provider == "huggingface":
max_tokens = _get_max_position_embeddings(model_name=model)
return ModelInfo(
+ key=model,
max_tokens=max_tokens, # type: ignore
max_input_tokens=None,
max_output_tokens=None,
@@ -4985,6 +5008,7 @@ def get_model_info(model: str, custom_llm_provider: Optional[str] = None) -> Mod
3. 'split_model' in litellm.model_cost. Checks "llama3-8b-8192" in litellm.model_cost if model="groq/llama3-8b-8192"
"""
if combined_model_name in litellm.model_cost:
+ key = combined_model_name
_model_info = litellm.model_cost[combined_model_name]
_model_info["supported_openai_params"] = supported_openai_params
if (
@@ -4998,6 +5022,7 @@ def get_model_info(model: str, custom_llm_provider: Optional[str] = None) -> Mod
else:
raise Exception
elif model in litellm.model_cost:
+ key = model
_model_info = litellm.model_cost[model]
_model_info["supported_openai_params"] = supported_openai_params
if (
@@ -5011,6 +5036,7 @@ def get_model_info(model: str, custom_llm_provider: Optional[str] = None) -> Mod
else:
raise Exception
elif split_model in litellm.model_cost:
+ key = split_model
_model_info = litellm.model_cost[split_model]
_model_info["supported_openai_params"] = supported_openai_params
if (
@@ -5033,6 +5059,7 @@ def get_model_info(model: str, custom_llm_provider: Optional[str] = None) -> Mod
_model_info["supports_response_schema"] = True
return ModelInfo(
+ key=key,
max_tokens=_model_info.get("max_tokens", None),
max_input_tokens=_model_info.get("max_input_tokens", None),
max_output_tokens=_model_info.get("max_output_tokens", None),
@@ -5843,6 +5870,12 @@ def convert_to_model_response_object(
if _response_headers is not None:
model_response_object._response_headers = _response_headers
+ special_keys = list(litellm.ModelResponse.model_fields.keys())
+ special_keys.append("usage")
+ for k, v in response_object.items():
+ if k not in special_keys:
+ setattr(model_response_object, k, v)
+
return model_response_object
elif response_type == "embedding" and (
model_response_object is None
@@ -7312,6 +7345,13 @@ def exception_type(
model=model,
response=original_exception.response,
)
+ elif original_exception.status_code == 408:
+ exception_mapping_worked = True
+ raise Timeout(
+ message=f"CohereException - {original_exception.message}",
+ llm_provider="cohere",
+ model=model,
+ )
elif original_exception.status_code == 500:
exception_mapping_worked = True
raise ServiceUnavailableError(
@@ -8349,6 +8389,28 @@ def get_secret(
######## Streaming Class ############################
# wraps the completion stream to return the correct format for the model
# replicate/anthropic/cohere
+
+
+def calculate_total_usage(chunks: List[ModelResponse]) -> Usage:
+ """Assume most recent usage chunk has total usage uptil then."""
+ prompt_tokens: int = 0
+ completion_tokens: int = 0
+ for chunk in chunks:
+ if "usage" in chunk:
+ if "prompt_tokens" in chunk["usage"]:
+ prompt_tokens = chunk["usage"].get("prompt_tokens", 0) or 0
+ if "completion_tokens" in chunk["usage"]:
+ completion_tokens = chunk["usage"].get("completion_tokens", 0) or 0
+
+ returned_usage_chunk = Usage(
+ prompt_tokens=prompt_tokens,
+ completion_tokens=completion_tokens,
+ total_tokens=prompt_tokens + completion_tokens,
+ )
+
+ return returned_usage_chunk
+
+
class CustomStreamWrapper:
def __init__(
self,
@@ -9238,7 +9300,9 @@ class CustomStreamWrapper:
verbose_logger.debug(traceback.format_exc())
return ""
- def model_response_creator(self, chunk: Optional[dict] = None):
+ def model_response_creator(
+ self, chunk: Optional[dict] = None, hidden_params: Optional[dict] = None
+ ):
_model = self.model
_received_llm_provider = self.custom_llm_provider
_logging_obj_llm_provider = self.logging_obj.model_call_details.get("custom_llm_provider", None) # type: ignore
@@ -9252,6 +9316,7 @@ class CustomStreamWrapper:
else:
# pop model keyword
chunk.pop("model", None)
+
model_response = ModelResponse(
stream=True, model=_model, stream_options=self.stream_options, **chunk
)
@@ -9261,6 +9326,8 @@ class CustomStreamWrapper:
self.response_id = model_response.id # type: ignore
if self.system_fingerprint is not None:
model_response.system_fingerprint = self.system_fingerprint
+ if hidden_params is not None:
+ model_response._hidden_params = hidden_params
model_response._hidden_params["custom_llm_provider"] = _logging_obj_llm_provider
model_response._hidden_params["created_at"] = time.time()
@@ -9315,11 +9382,7 @@ class CustomStreamWrapper:
"finish_reason"
]
- if (
- self.stream_options
- and self.stream_options.get("include_usage", False) is True
- and anthropic_response_obj["usage"] is not None
- ):
+ if anthropic_response_obj["usage"] is not None:
model_response.usage = litellm.Usage(
prompt_tokens=anthropic_response_obj["usage"]["prompt_tokens"],
completion_tokens=anthropic_response_obj["usage"][
@@ -9642,11 +9705,7 @@ class CustomStreamWrapper:
print_verbose(f"completion obj content: {completion_obj['content']}")
if response_obj["is_finished"]:
self.received_finish_reason = response_obj["finish_reason"]
- if (
- self.stream_options
- and self.stream_options.get("include_usage", False) == True
- and response_obj["usage"] is not None
- ):
+ if response_obj["usage"] is not None:
model_response.usage = litellm.Usage(
prompt_tokens=response_obj["usage"].prompt_tokens,
completion_tokens=response_obj["usage"].completion_tokens,
@@ -9660,11 +9719,7 @@ class CustomStreamWrapper:
print_verbose(f"completion obj content: {completion_obj['content']}")
if response_obj["is_finished"]:
self.received_finish_reason = response_obj["finish_reason"]
- if (
- self.stream_options
- and self.stream_options.get("include_usage", False) == True
- and response_obj["usage"] is not None
- ):
+ if "usage" in response_obj is not None:
model_response.usage = litellm.Usage(
prompt_tokens=response_obj["usage"].prompt_tokens,
completion_tokens=response_obj["usage"].completion_tokens,
@@ -9732,16 +9787,26 @@ class CustomStreamWrapper:
if response_obj["logprobs"] is not None:
model_response.choices[0].logprobs = response_obj["logprobs"]
- if (
- self.stream_options is not None
- and self.stream_options["include_usage"] == True
- and response_obj["usage"] is not None
- ):
- model_response.usage = litellm.Usage(
- prompt_tokens=response_obj["usage"].prompt_tokens,
- completion_tokens=response_obj["usage"].completion_tokens,
- total_tokens=response_obj["usage"].total_tokens,
- )
+ if response_obj["usage"] is not None:
+ if isinstance(response_obj["usage"], dict):
+ model_response.usage = litellm.Usage(
+ prompt_tokens=response_obj["usage"].get(
+ "prompt_tokens", None
+ )
+ or None,
+ completion_tokens=response_obj["usage"].get(
+ "completion_tokens", None
+ )
+ or None,
+ total_tokens=response_obj["usage"].get("total_tokens", None)
+ or None,
+ )
+ elif isinstance(response_obj["usage"], BaseModel):
+ model_response.usage = litellm.Usage(
+ prompt_tokens=response_obj["usage"].prompt_tokens,
+ completion_tokens=response_obj["usage"].completion_tokens,
+ total_tokens=response_obj["usage"].total_tokens,
+ )
model_response.model = self.model
print_verbose(
@@ -9855,19 +9920,6 @@ class CustomStreamWrapper:
## RETURN ARG
if (
- "content" in completion_obj
- and isinstance(completion_obj["content"], str)
- and len(completion_obj["content"]) == 0
- and hasattr(model_response, "usage")
- and hasattr(model_response.usage, "prompt_tokens")
- ):
- if self.sent_first_chunk is False:
- completion_obj["role"] = "assistant"
- self.sent_first_chunk = True
- model_response.choices[0].delta = Delta(**completion_obj)
- print_verbose(f"returning model_response: {model_response}")
- return model_response
- elif (
"content" in completion_obj
and (
isinstance(completion_obj["content"], str)
@@ -9962,6 +10014,7 @@ class CustomStreamWrapper:
model_response.choices[0].finish_reason = map_finish_reason(
finish_reason=self.received_finish_reason
) # ensure consistent output to openai
+
self.sent_last_chunk = True
return model_response
@@ -9974,6 +10027,8 @@ class CustomStreamWrapper:
self.sent_first_chunk = True
return model_response
else:
+ if hasattr(model_response, "usage"):
+ self.chunks.append(model_response)
return
except StopIteration:
raise StopIteration
@@ -10090,17 +10145,22 @@ class CustomStreamWrapper:
del obj_dict["usage"]
# Create a new object without the removed attribute
- response = self.model_response_creator(chunk=obj_dict)
-
+ response = self.model_response_creator(
+ chunk=obj_dict, hidden_params=response._hidden_params
+ )
+ # add usage as hidden param
+ if self.sent_last_chunk is True and self.stream_options is None:
+ usage = calculate_total_usage(chunks=self.chunks)
+ response._hidden_params["usage"] = usage
# RETURN RESULT
return response
except StopIteration:
if self.sent_last_chunk is True:
if (
- self.sent_stream_usage == False
+ self.sent_stream_usage is False
and self.stream_options is not None
- and self.stream_options.get("include_usage", False) == True
+ and self.stream_options.get("include_usage", False) is True
):
# send the final chunk with stream options
complete_streaming_response = litellm.stream_chunk_builder(
@@ -10108,6 +10168,7 @@ class CustomStreamWrapper:
)
response = self.model_response_creator()
response.usage = complete_streaming_response.usage # type: ignore
+ response._hidden_params["usage"] = complete_streaming_response.usage # type: ignore
## LOGGING
threading.Thread(
target=self.logging_obj.success_handler,
@@ -10119,6 +10180,9 @@ class CustomStreamWrapper:
else:
self.sent_last_chunk = True
processed_chunk = self.finish_reason_handler()
+ if self.stream_options is None: # add usage as hidden param
+ usage = calculate_total_usage(chunks=self.chunks)
+ processed_chunk._hidden_params["usage"] = usage
## LOGGING
threading.Thread(
target=self.logging_obj.success_handler,
diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json
index 8a07eca34ef..3139f050fdf 100644
--- a/model_prices_and_context_window.json
+++ b/model_prices_and_context_window.json
@@ -460,6 +460,30 @@
"supports_parallel_function_calling": true,
"supports_vision": true
},
+ "azure/global-standard/gpt-4o-mini": {
+ "max_tokens": 4096,
+ "max_input_tokens": 128000,
+ "max_output_tokens": 4096,
+ "input_cost_per_token": 0.00000015,
+ "output_cost_per_token": 0.00000060,
+ "litellm_provider": "azure",
+ "mode": "chat",
+ "supports_function_calling": true,
+ "supports_parallel_function_calling": true,
+ "supports_vision": true
+ },
+ "azure/gpt-4o-mini": {
+ "max_tokens": 4096,
+ "max_input_tokens": 128000,
+ "max_output_tokens": 4096,
+ "input_cost_per_token": 0.000000165,
+ "output_cost_per_token": 0.00000066,
+ "litellm_provider": "azure",
+ "mode": "chat",
+ "supports_function_calling": true,
+ "supports_parallel_function_calling": true,
+ "supports_vision": true
+ },
"azure/gpt-4-turbo-2024-04-09": {
"max_tokens": 4096,
"max_input_tokens": 128000,
@@ -2048,6 +2072,16 @@
"mode": "chat",
"supports_function_calling": true
},
+ "vertex_ai/mistral-nemo@latest": {
+ "max_tokens": 128000,
+ "max_input_tokens": 128000,
+ "max_output_tokens": 128000,
+ "input_cost_per_token": 0.000003,
+ "output_cost_per_token": 0.000003,
+ "litellm_provider": "vertex_ai-mistral_models",
+ "mode": "chat",
+ "supports_function_calling": true
+ },
"vertex_ai/mistral-nemo@2407": {
"max_tokens": 128000,
"max_input_tokens": 128000,
@@ -2058,6 +2092,16 @@
"mode": "chat",
"supports_function_calling": true
},
+ "vertex_ai/codestral@latest": {
+ "max_tokens": 128000,
+ "max_input_tokens": 128000,
+ "max_output_tokens": 128000,
+ "input_cost_per_token": 0.000001,
+ "output_cost_per_token": 0.000003,
+ "litellm_provider": "vertex_ai-mistral_models",
+ "mode": "chat",
+ "supports_function_calling": true
+ },
"vertex_ai/codestral@2405": {
"max_tokens": 128000,
"max_input_tokens": 128000,
@@ -2297,6 +2341,23 @@
"supports_response_schema": true,
"source": "https://ai.google.dev/pricing"
},
+ "gemini/gemini-1.5-pro-exp-0801": {
+ "max_tokens": 8192,
+ "max_input_tokens": 2097152,
+ "max_output_tokens": 8192,
+ "input_cost_per_token": 0.0000035,
+ "input_cost_per_token_above_128k_tokens": 0.000007,
+ "output_cost_per_token": 0.0000105,
+ "output_cost_per_token_above_128k_tokens": 0.000021,
+ "litellm_provider": "gemini",
+ "mode": "chat",
+ "supports_system_messages": true,
+ "supports_function_calling": true,
+ "supports_vision": true,
+ "supports_tool_choice": true,
+ "supports_response_schema": true,
+ "source": "https://ai.google.dev/pricing"
+ },
"gemini/gemini-1.5-pro-latest": {
"max_tokens": 8192,
"max_input_tokens": 1048576,
@@ -4654,6 +4715,26 @@
"litellm_provider": "voyage",
"mode": "embedding"
},
+ "databricks/databricks-meta-llama-3-1-405b-instruct": {
+ "max_tokens": 128000,
+ "max_input_tokens": 128000,
+ "max_output_tokens": 128000,
+ "input_cost_per_token": 0.000005,
+ "output_cost_per_token": 0.000015,
+ "litellm_provider": "databricks",
+ "mode": "chat",
+ "source": "https://www.databricks.com/product/pricing/foundation-model-serving"
+ },
+ "databricks/databricks-meta-llama-3-1-70b-instruct": {
+ "max_tokens": 128000,
+ "max_input_tokens": 128000,
+ "max_output_tokens": 128000,
+ "input_cost_per_token": 0.000001,
+ "output_cost_per_token": 0.000003,
+ "litellm_provider": "databricks",
+ "mode": "chat",
+ "source": "https://www.databricks.com/product/pricing/foundation-model-serving"
+ },
"databricks/databricks-dbrx-instruct": {
"max_tokens": 32768,
"max_input_tokens": 32768,
diff --git a/proxy_server_config.yaml b/proxy_server_config.yaml
index f7766b65bfe..dc943d59d95 100644
--- a/proxy_server_config.yaml
+++ b/proxy_server_config.yaml
@@ -120,6 +120,24 @@ litellm_settings:
langfuse_secret: os.environ/LANGFUSE_PROJECT2_SECRET # Project 2
langfuse_host: https://us.cloud.langfuse.com
+# For /fine_tuning/jobs endpoints
+finetune_settings:
+ - custom_llm_provider: azure
+ api_base: https://exampleopenaiendpoint-production.up.railway.app
+ api_key: fake-key
+ api_version: "2023-03-15-preview"
+ - custom_llm_provider: openai
+ api_key: os.environ/OPENAI_API_KEY
+
+# for /files endpoints
+files_settings:
+ - custom_llm_provider: azure
+ api_base: https://exampleopenaiendpoint-production.up.railway.app
+ api_key: fake-key
+ api_version: "2023-03-15-preview"
+ - custom_llm_provider: openai
+ api_key: os.environ/OPENAI_API_KEY
+
router_settings:
routing_strategy: usage-based-routing-v2
redis_host: os.environ/REDIS_HOST
diff --git a/pyproject.toml b/pyproject.toml
index b92ff7646b8..f180814d2ee 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "litellm"
-version = "1.42.6"
+version = "1.42.10"
description = "Library to easily interface with LLM API providers"
authors = ["BerriAI"]
license = "MIT"
@@ -91,7 +91,7 @@ requires = ["poetry-core", "wheel"]
build-backend = "poetry.core.masonry.api"
[tool.commitizen]
-version = "1.42.6"
+version = "1.42.10"
version_files = [
"pyproject.toml:^version"
]
diff --git a/tests/openai_batch_completions.jsonl b/tests/openai_batch_completions.jsonl
new file mode 100644
index 00000000000..05448952a0f
--- /dev/null
+++ b/tests/openai_batch_completions.jsonl
@@ -0,0 +1,2 @@
+{"custom_id": "request-1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-3.5-turbo-0125", "messages": [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Hello world!"}],"max_tokens": 10}}
+{"custom_id": "request-2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-3.5-turbo-0125", "messages": [{"role": "system", "content": "You are an unhelpful assistant."},{"role": "user", "content": "Hello world!"}],"max_tokens": 10}}
\ No newline at end of file
diff --git a/tests/test_debug_warning.py b/tests/test_debug_warning.py
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/test_openai_batches_endpoint.py b/tests/test_openai_batches_endpoint.py
index 75e3c3f881e..a6e26e782b3 100644
--- a/tests/test_openai_batches_endpoint.py
+++ b/tests/test_openai_batches_endpoint.py
@@ -41,6 +41,19 @@ async def get_batch_by_id(session, batch_id):
return None
+async def list_batches(session):
+ url = f"{BASE_URL}/v1/batches"
+ headers = {"Authorization": f"Bearer {API_KEY}"}
+
+ async with session.get(url, headers=headers) as response:
+ if response.status == 200:
+ result = await response.json()
+ return result
+ else:
+ print(f"Error: Failed to get batch. Status code: {response.status}")
+ return None
+
+
@pytest.mark.asyncio
async def test_batches_operations():
async with aiohttp.ClientSession() as session:
@@ -60,5 +73,15 @@ async def test_batches_operations():
assert get_batch_response["id"] == batch_id
assert get_batch_response["input_file_id"] == file_id
+ # test LIST Batches
+ list_batch_response = await list_batches(session)
+ print("response from list batch", list_batch_response)
+
+ assert list_batch_response is not None
+ assert len(list_batch_response["data"]) > 0
+
+ element_0 = list_batch_response["data"][0]
+ assert element_0["id"] is not None
+
# Test delete file
await delete_file(session, file_id)
diff --git a/tests/test_openai_fine_tuning.py b/tests/test_openai_fine_tuning.py
new file mode 100644
index 00000000000..6d67d414485
--- /dev/null
+++ b/tests/test_openai_fine_tuning.py
@@ -0,0 +1,53 @@
+from openai import AsyncOpenAI
+import os
+import pytest
+
+
+@pytest.mark.asyncio
+async def test_openai_fine_tuning():
+ """
+ [PROD Test] Ensures logprobs are returned correctly
+ """
+ client = AsyncOpenAI(api_key="sk-1234", base_url="http://0.0.0.0:4000")
+
+ file_name = "openai_batch_completions.jsonl"
+ _current_dir = os.path.dirname(os.path.abspath(__file__))
+ file_path = os.path.join(_current_dir, file_name)
+
+ response = await client.files.create(
+ extra_body={"custom_llm_provider": "azure"},
+ file=open(file_path, "rb"),
+ purpose="fine-tune",
+ )
+
+ print("response from files.create: {}".format(response))
+
+ # create fine tuning job
+
+ ft_job = await client.fine_tuning.jobs.create(
+ model="gpt-35-turbo-1106",
+ training_file=response.id,
+ extra_body={"custom_llm_provider": "azure"},
+ )
+
+ print("response from ft job={}".format(ft_job))
+
+ # response from example endpoint
+ assert ft_job.id == "ftjob-abc123"
+
+ # list all fine tuning jobs
+ list_ft_jobs = await client.fine_tuning.jobs.list(
+ extra_query={"custom_llm_provider": "azure"}
+ )
+
+ print("list of ft jobs={}".format(list_ft_jobs))
+
+ # cancel specific fine tuning job
+ cancel_ft_job = await client.fine_tuning.jobs.cancel(
+ fine_tuning_job_id="123",
+ extra_body={"custom_llm_provider": "azure"},
+ )
+
+ print("response from cancel ft job={}".format(cancel_ft_job))
+
+ assert cancel_ft_job.id is not None
diff --git a/ui/litellm-dashboard/out/404.html b/ui/litellm-dashboard/out/404.html
index 1bf101ffe9d..2beadd6d15a 100644
--- a/ui/litellm-dashboard/out/404.html
+++ b/ui/litellm-dashboard/out/404.html
@@ -1 +1 @@
-404: This page could not be found.LiteLLM Dashboard
404
This page could not be found.
\ No newline at end of file
+404: This page could not be found.LiteLLM Dashboard
404
This page could not be found.
\ No newline at end of file
diff --git a/ui/litellm-dashboard/out/_next/static/chunks/777-38cea0d1f2b563b1.js b/ui/litellm-dashboard/out/_next/static/chunks/777-38cea0d1f2b563b1.js
new file mode 100644
index 00000000000..fd4ed54e562
--- /dev/null
+++ b/ui/litellm-dashboard/out/_next/static/chunks/777-38cea0d1f2b563b1.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[777],{777:function(e,t,o){o.d(t,{$I:function(){return P},AZ:function(){return x},Au:function(){return W},BL:function(){return ew},Br:function(){return E},Dj:function(){return ek},E9:function(){return eh},EY:function(){return ef},FC:function(){return M},Gh:function(){return ea},HK:function(){return L},I1:function(){return g},J$:function(){return V},K8:function(){return l},K_:function(){return eu},N8:function(){return J},NV:function(){return p},Nc:function(){return er},O3:function(){return ei},OU:function(){return X},Og:function(){return h},Ov:function(){return m},PT:function(){return O},Qy:function(){return _},RQ:function(){return f},Rg:function(){return G},So:function(){return I},W_:function(){return N},X:function(){return U},XO:function(){return u},Xd:function(){return ee},Xm:function(){return j},YU:function(){return ed},Zr:function(){return y},ao:function(){return ey},b1:function(){return K},cu:function(){return ec},e2:function(){return Y},eH:function(){return S},fP:function(){return A},hT:function(){return eo},hy:function(){return d},j2:function(){return Z},jA:function(){return ep},jE:function(){return el},kK:function(){return w},kn:function(){return B},lg:function(){return et},mR:function(){return R},m_:function(){return C},n$:function(){return $},o6:function(){return v},pf:function(){return es},qm:function(){return i},rs:function(){return T},tN:function(){return H},um:function(){return en},v9:function(){return Q},wX:function(){return k},wd:function(){return z},xA:function(){return q},zg:function(){return D}});var r=o(80588);console.log=function(){};let a=0,n=e=>new Promise(t=>setTimeout(t,e)),c=async e=>{let t=Date.now();t-a>6e4?(e.includes("Authentication Error - Expired Key")?(r.ZP.info("UI Session Expired. Logging out."),a=t,await n(3e3),window.location.href="/"):r.ZP.error(e),a=t):console.log("Error suppressed to prevent spam:",e)},s="Authorization";function l(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"Authorization";console.log("setGlobalLitellmHeaderName: ".concat(e)),s=e}let i=async e=>{try{let t=await fetch("/get/litellm_model_cost_map",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}}),o=await t.json();return console.log("received litellm model cost data: ".concat(o)),o}catch(e){throw console.error("Failed to get model cost map:",e),e}},w=async(e,t)=>{try{let o=await fetch("/model/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await o.json();return console.log("API Response:",a),r.ZP.success("Model created successfully. Wait 60s and refresh on 'All Models' page"),a}catch(e){throw console.error("Failed to create key:",e),e}},d=async e=>{try{let t=await fetch("/model/settings",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},h=async(e,t)=>{console.log("model_id in model delete call: ".concat(t));try{let o=await fetch("/model/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({id:t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await o.json();return console.log("API Response:",a),r.ZP.success("Model deleted successfully. Restart server to see this."),a}catch(e){throw console.error("Failed to create key:",e),e}},p=async(e,t)=>{if(console.log("budget_id in budget delete call: ".concat(t)),null!=e)try{let o=await fetch("/budget/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({id:t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("API Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},y=async(e,t)=>{try{console.log("Form Values in budgetCreateCall:",t),console.log("Form Values after check:",t);let o=await fetch("/budget/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("API Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},u=async(e,t)=>{try{let o=await fetch("/invitation/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("API Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},f=async e=>{try{let t=await fetch("/alerting/settings",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},k=async(e,t,o)=>{try{if(console.log("Form Values in keyCreateCall:",o),o.description&&(o.metadata||(o.metadata={}),o.metadata.description=o.description,delete o.description,o.metadata=JSON.stringify(o.metadata)),o.metadata){console.log("formValues.metadata:",o.metadata);try{o.metadata=JSON.parse(o.metadata)}catch(e){throw Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",o);let r=await fetch("/key/generate",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...o})});if(!r.ok){let e=await r.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),a}catch(e){throw console.error("Failed to create key:",e),e}},m=async(e,t,o)=>{try{if(console.log("Form Values in keyCreateCall:",o),o.description&&(o.metadata||(o.metadata={}),o.metadata.description=o.description,delete o.description,o.metadata=JSON.stringify(o.metadata)),o.metadata){console.log("formValues.metadata:",o.metadata);try{o.metadata=JSON.parse(o.metadata)}catch(e){throw Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",o);let r=await fetch("/user/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...o})});if(!r.ok){let e=await r.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),a}catch(e){throw console.error("Failed to create key:",e),e}},g=async(e,t)=>{try{console.log("in keyDeleteCall:",t);let o=await fetch("/key/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:[t]})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},T=async(e,t)=>{try{console.log("in teamDeleteCall:",t);let o=await fetch("/team/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_ids:[t]})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to delete key:",e),e}},E=async function(e,t,o){let r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],a=arguments.length>4?arguments[4]:void 0,n=arguments.length>5?arguments[5]:void 0;try{let l="/user/info";"App Owner"==o&&t&&(l="".concat(l,"?user_id=").concat(t)),"App User"==o&&t&&(l="".concat(l,"?user_id=").concat(t)),("Internal User"==o||"Internal Viewer"==o)&&t&&(l="".concat(l,"?user_id=").concat(t)),console.log("in userInfoCall viewAll=",r),r&&n&&null!=a&&void 0!=a&&(l="".concat(l,"?view_all=true&page=").concat(a,"&page_size=").concat(n));let i=await fetch(l,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!i.ok){let e=await i.text();throw c(e),Error("Network response was not ok")}let w=await i.json();return console.log("API Response:",w),w}catch(e){throw console.error("Failed to create key:",e),e}},j=async(e,t)=>{try{let o="/team/info";t&&(o="".concat(o,"?team_id=").concat(t)),console.log("in teamInfoCall");let r=await fetch(o,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c(e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),a}catch(e){throw console.error("Failed to create key:",e),e}},_=async e=>{try{let t=await fetch("/global/spend",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to create key:",e),e}},N=async e=>{try{let t="/onboarding/get_token";t+="?invite_link=".concat(e);let o=await fetch(t,{method:"GET",headers:{"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to create key:",e),e}},C=async(e,t,o,r)=>{try{let a=await fetch("/onboarding/claim_token",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({invitation_link:t,user_id:o,password:r})});if(!a.ok){let e=await a.text();throw c(e),Error("Network response was not ok")}let n=await a.json();return console.log(n),n}catch(e){throw console.error("Failed to delete key:",e),e}},F=!1,b=null,x=async(e,t,o)=>{try{let t=await fetch("/v2/model/info",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw e+="error shown=".concat(F),F||(e.includes("No model list passed")&&(e="No Models Exist. Click Add Model to get started."),r.ZP.info(e,10),F=!0,b&&clearTimeout(b),b=setTimeout(()=>{F=!1},1e4)),Error("Network response was not ok")}let o=await t.json();return console.log("modelInfoCall:",o),o}catch(e){throw console.error("Failed to create key:",e),e}},B=async e=>{try{let t=await fetch("/model_group/info",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok)throw await t.text(),Error("Network response was not ok");let o=await t.json();return console.log("modelHubCall:",o),o}catch(e){throw console.error("Failed to create key:",e),e}},O=async e=>{try{let t=await fetch("/get/allowed_ips",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw Error("Network response was not ok: ".concat(e))}let o=await t.json();return console.log("getAllowedIPs:",o),o.data}catch(e){throw console.error("Failed to get allowed IPs:",e),e}},S=async(e,t)=>{try{let o=await fetch("/add/allowed_ip",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({ip:t})});if(!o.ok){let e=await o.text();throw Error("Network response was not ok: ".concat(e))}let r=await o.json();return console.log("addAllowedIP:",r),r}catch(e){throw console.error("Failed to add allowed IP:",e),e}},P=async(e,t)=>{try{let o=await fetch("/delete/allowed_ip",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({ip:t})});if(!o.ok){let e=await o.text();throw Error("Network response was not ok: ".concat(e))}let r=await o.json();return console.log("deleteAllowedIP:",r),r}catch(e){throw console.error("Failed to delete allowed IP:",e),e}},v=async(e,t,o,r,a,n,l,i)=>{try{let t="/model/metrics";r&&(t="".concat(t,"?_selected_model_group=").concat(r,"&startTime=").concat(a,"&endTime=").concat(n,"&api_key=").concat(l,"&customer=").concat(i));let o=await fetch(t,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to create key:",e),e}},G=async(e,t,o,r)=>{try{let a="/model/streaming_metrics";t&&(a="".concat(a,"?_selected_model_group=").concat(t,"&startTime=").concat(o,"&endTime=").concat(r));let n=await fetch(a,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!n.ok){let e=await n.text();throw c(e),Error("Network response was not ok")}return await n.json()}catch(e){throw console.error("Failed to create key:",e),e}},A=async(e,t,o,r,a,n,l,i)=>{try{let t="/model/metrics/slow_responses";r&&(t="".concat(t,"?_selected_model_group=").concat(r,"&startTime=").concat(a,"&endTime=").concat(n,"&api_key=").concat(l,"&customer=").concat(i));let o=await fetch(t,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to create key:",e),e}},J=async(e,t,o,r,a,n,l,i)=>{try{let t="/model/metrics/exceptions";r&&(t="".concat(t,"?_selected_model_group=").concat(r,"&startTime=").concat(a,"&endTime=").concat(n,"&api_key=").concat(l,"&customer=").concat(i));let o=await fetch(t,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to create key:",e),e}},I=async(e,t,o)=>{console.log("in /models calls, globalLitellmHeaderName",s);try{let t=await fetch("/models",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to create key:",e),e}},R=async e=>{try{let t="/global/spend/teams";console.log("in teamSpendLogsCall:",t);let o=await fetch("".concat(t),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},V=async(e,t,o,r)=>{try{let a="/global/spend/tags";t&&o&&(a="".concat(a,"?start_date=").concat(t,"&end_date=").concat(o)),r&&(a+="".concat(a,"&tags=").concat(r.join(","))),console.log("in tagsSpendLogsCall:",a);let n=await fetch("".concat(a),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!n.ok)throw await n.text(),Error("Network response was not ok");let c=await n.json();return console.log(c),c}catch(e){throw console.error("Failed to create key:",e),e}},U=async e=>{try{let t="/global/spend/all_tag_names";console.log("in global/spend/all_tag_names call",t);let o=await fetch("".concat(t),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok)throw await o.text(),Error("Network response was not ok");let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},Z=async e=>{try{let t="/global/all_end_users";console.log("in global/all_end_users call",t);let o=await fetch("".concat(t),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok)throw await o.text(),Error("Network response was not ok");let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},L=async(e,t,o,r,a,n)=>{try{console.log("user role in spend logs call: ".concat(o));let t="/spend/logs";t="App Owner"==o?"".concat(t,"?user_id=").concat(r,"&start_date=").concat(a,"&end_date=").concat(n):"".concat(t,"?start_date=").concat(a,"&end_date=").concat(n);let l=await fetch(t,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c(e),Error("Network response was not ok")}let i=await l.json();return console.log(i),i}catch(e){throw console.error("Failed to create key:",e),e}},M=async e=>{try{let t=await fetch("/global/spend/logs",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}let o=await t.json();return console.log(o),o}catch(e){throw console.error("Failed to create key:",e),e}},H=async e=>{try{let t=await fetch("/global/spend/keys?limit=5",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}let o=await t.json();return console.log(o),o}catch(e){throw console.error("Failed to create key:",e),e}},K=async(e,t,o,r)=>{try{let a="";a=t?JSON.stringify({api_key:t,startTime:o,endTime:r}):JSON.stringify({startTime:o,endTime:r});let n={method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:a},l=await fetch("/global/spend/end_users",n);if(!l.ok){let e=await l.text();throw c(e),Error("Network response was not ok")}let i=await l.json();return console.log(i),i}catch(e){throw console.error("Failed to create key:",e),e}},X=async(e,t,o,r)=>{try{let a="/global/spend/provider";o&&r&&(a+="?start_date=".concat(o,"&end_date=").concat(r)),t&&(a+="&api_key=".concat(t));let n={method:"GET",headers:{[s]:"Bearer ".concat(e)}},l=await fetch(a,n);if(!l.ok){let e=await l.text();throw c(e),Error("Network response was not ok")}let i=await l.json();return console.log(i),i}catch(e){throw console.error("Failed to fetch spend data:",e),e}},z=async(e,t,o)=>{try{let r="/global/activity";t&&o&&(r+="?start_date=".concat(t,"&end_date=").concat(o));let a={method:"GET",headers:{[s]:"Bearer ".concat(e)}},n=await fetch(r,a);if(!n.ok)throw await n.text(),Error("Network response was not ok");let c=await n.json();return console.log(c),c}catch(e){throw console.error("Failed to fetch spend data:",e),e}},D=async(e,t,o)=>{try{let r="/global/activity/cache_hits";t&&o&&(r+="?start_date=".concat(t,"&end_date=").concat(o));let a={method:"GET",headers:{[s]:"Bearer ".concat(e)}},n=await fetch(r,a);if(!n.ok)throw await n.text(),Error("Network response was not ok");let c=await n.json();return console.log(c),c}catch(e){throw console.error("Failed to fetch spend data:",e),e}},q=async(e,t,o)=>{try{let r="/global/activity/model";t&&o&&(r+="?start_date=".concat(t,"&end_date=").concat(o));let a={method:"GET",headers:{[s]:"Bearer ".concat(e)}},n=await fetch(r,a);if(!n.ok)throw await n.text(),Error("Network response was not ok");let c=await n.json();return console.log(c),c}catch(e){throw console.error("Failed to fetch spend data:",e),e}},$=async(e,t,o,r)=>{try{let a="/global/activity/exceptions";t&&o&&(a+="?start_date=".concat(t,"&end_date=").concat(o)),r&&(a+="&model_group=".concat(r));let n={method:"GET",headers:{[s]:"Bearer ".concat(e)}},c=await fetch(a,n);if(!c.ok)throw await c.text(),Error("Network response was not ok");let l=await c.json();return console.log(l),l}catch(e){throw console.error("Failed to fetch spend data:",e),e}},Q=async(e,t,o,r)=>{try{let a="/global/activity/exceptions/deployment";t&&o&&(a+="?start_date=".concat(t,"&end_date=").concat(o)),r&&(a+="&model_group=".concat(r));let n={method:"GET",headers:{[s]:"Bearer ".concat(e)}},c=await fetch(a,n);if(!c.ok)throw await c.text(),Error("Network response was not ok");let l=await c.json();return console.log(l),l}catch(e){throw console.error("Failed to fetch spend data:",e),e}},W=async e=>{try{let t=await fetch("/global/spend/models?limit=5",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}let o=await t.json();return console.log(o),o}catch(e){throw console.error("Failed to create key:",e),e}},Y=async(e,t)=>{try{let o=await fetch("/v2/key/info",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:t})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},ee=async(e,t)=>{try{let o="/user/get_users?role=".concat(t);console.log("in userGetAllUsersCall:",o);let r=await fetch(o,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c(e),Error("Network response was not ok")}let a=await r.json();return console.log(a),a}catch(e){throw console.error("Failed to get requested models:",e),e}},et=async e=>{try{let t=await fetch("/user/available_roles",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok)throw await t.text(),Error("Network response was not ok");let o=await t.json();return console.log("response from user/available_role",o),o}catch(e){throw e}},eo=async(e,t)=>{try{console.log("Form Values in teamCreateCall:",t);let o=await fetch("/team/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("API Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},er=async(e,t)=>{try{console.log("Form Values in keyUpdateCall:",t);let o=await fetch("/key/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("Update key Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},ea=async(e,t)=>{try{console.log("Form Values in teamUpateCall:",t);let o=await fetch("/team/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("Update Team Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},en=async(e,t)=>{try{console.log("Form Values in modelUpateCall:",t);let o=await fetch("/model/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error update from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("Update model Response:",r),r}catch(e){throw console.error("Failed to update model:",e),e}},ec=async(e,t,o)=>{try{console.log("Form Values in teamMemberAddCall:",o);let r=await fetch("/team/member_add",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_id:t,member:o})});if(!r.ok){let e=await r.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),a}catch(e){throw console.error("Failed to create key:",e),e}},es=async(e,t,o)=>{try{console.log("Form Values in userUpdateUserCall:",t);let r={...t};null!==o&&(r.user_role=o),r=JSON.stringify(r);let a=await fetch("/user/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:r});if(!a.ok){let e=await a.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await a.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},el=async(e,t)=>{try{let o="/health/services?service=".concat(t);console.log("Checking Slack Budget Alerts service health");let a=await fetch(o,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!a.ok){let e=await a.text();throw c(e),Error(e)}let n=await a.json();return r.ZP.success("Test request to ".concat(t," made - check logs/alerts on ").concat(t," to verify")),n}catch(e){throw console.error("Failed to perform health check:",e),e}},ei=async e=>{try{let t=await fetch("/budget/list",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},ew=async(e,t,o)=>{try{let t=await fetch("/get/config/callbacks",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},ed=async e=>{try{let t=await fetch("/config/list?config_type=general_settings",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},eh=async(e,t)=>{try{let o=await fetch("/config/field/info?field_name=".concat(t),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok)throw await o.text(),Error("Network response was not ok");return await o.json()}catch(e){throw console.error("Failed to set callbacks:",e),e}},ep=async(e,t,o)=>{try{let a=await fetch("/config/field/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({field_name:t,field_value:o,config_type:"general_settings"})});if(!a.ok){let e=await a.text();throw c(e),Error("Network response was not ok")}let n=await a.json();return r.ZP.success("Successfully updated value!"),n}catch(e){throw console.error("Failed to set callbacks:",e),e}},ey=async(e,t)=>{try{let o=await fetch("/config/field/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({field_name:t,config_type:"general_settings"})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let a=await o.json();return r.ZP.success("Field reset on proxy"),a}catch(e){throw console.error("Failed to get callbacks:",e),e}},eu=async(e,t)=>{try{let o=await fetch("/config/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to set callbacks:",e),e}},ef=async e=>{try{let t=await fetch("/health",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to call /health:",e),e}},ek=async e=>{try{let t=await fetch("/sso/get/logout_url",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok)throw await t.text(),Error("Network response was not ok");return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}}}}]);
\ No newline at end of file
diff --git a/ui/litellm-dashboard/out/_next/static/chunks/777-71e19aabdac85a01.js b/ui/litellm-dashboard/out/_next/static/chunks/777-71e19aabdac85a01.js
deleted file mode 100644
index 7c8a631472f..00000000000
--- a/ui/litellm-dashboard/out/_next/static/chunks/777-71e19aabdac85a01.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[777],{777:function(e,t,o){o.d(t,{$I:function(){return P},AZ:function(){return x},Au:function(){return W},BL:function(){return ew},Br:function(){return E},Dj:function(){return ek},E9:function(){return eh},EY:function(){return ef},FC:function(){return M},Gh:function(){return ea},HK:function(){return L},I1:function(){return g},J$:function(){return V},K8:function(){return l},K_:function(){return eu},N8:function(){return J},NV:function(){return p},Nc:function(){return er},O3:function(){return ei},OU:function(){return X},Og:function(){return h},Ov:function(){return m},PT:function(){return O},Qy:function(){return _},RQ:function(){return f},Rg:function(){return G},So:function(){return I},W_:function(){return N},X:function(){return U},XO:function(){return u},Xd:function(){return ee},Xm:function(){return j},YU:function(){return ed},Zr:function(){return y},ao:function(){return ey},b1:function(){return K},cu:function(){return ec},e2:function(){return Y},eH:function(){return S},fP:function(){return A},hT:function(){return eo},hy:function(){return d},j2:function(){return Z},jA:function(){return ep},jE:function(){return el},kK:function(){return w},kn:function(){return B},lg:function(){return et},mR:function(){return R},m_:function(){return C},n$:function(){return $},o6:function(){return v},pf:function(){return es},qm:function(){return i},rs:function(){return T},tN:function(){return H},um:function(){return en},v9:function(){return Q},wX:function(){return k},wd:function(){return z},xA:function(){return q},zg:function(){return D}});var r=o(80588);let a=0,n=e=>new Promise(t=>setTimeout(t,e)),c=async e=>{let t=Date.now();t-a>6e4?(e.includes("Authentication Error - Expired Key")?(r.ZP.info("UI Session Expired. Logging out."),a=t,await n(3e3),window.location.href="/"):r.ZP.error(e),a=t):console.log("Error suppressed to prevent spam:",e)},s="Authorization";function l(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"Authorization";console.log("setGlobalLitellmHeaderName: ".concat(e)),s=e}let i=async e=>{try{let t=await fetch("/get/litellm_model_cost_map",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}}),o=await t.json();return console.log("received litellm model cost data: ".concat(o)),o}catch(e){throw console.error("Failed to get model cost map:",e),e}},w=async(e,t)=>{try{let o=await fetch("/model/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await o.json();return console.log("API Response:",a),r.ZP.success("Model created successfully. Wait 60s and refresh on 'All Models' page"),a}catch(e){throw console.error("Failed to create key:",e),e}},d=async e=>{try{let t=await fetch("/model/settings",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},h=async(e,t)=>{console.log("model_id in model delete call: ".concat(t));try{let o=await fetch("/model/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({id:t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await o.json();return console.log("API Response:",a),r.ZP.success("Model deleted successfully. Restart server to see this."),a}catch(e){throw console.error("Failed to create key:",e),e}},p=async(e,t)=>{if(console.log("budget_id in budget delete call: ".concat(t)),null!=e)try{let o=await fetch("/budget/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({id:t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("API Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},y=async(e,t)=>{try{console.log("Form Values in budgetCreateCall:",t),console.log("Form Values after check:",t);let o=await fetch("/budget/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("API Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},u=async(e,t)=>{try{let o=await fetch("/invitation/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("API Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},f=async e=>{try{let t=await fetch("/alerting/settings",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},k=async(e,t,o)=>{try{if(console.log("Form Values in keyCreateCall:",o),o.description&&(o.metadata||(o.metadata={}),o.metadata.description=o.description,delete o.description,o.metadata=JSON.stringify(o.metadata)),o.metadata){console.log("formValues.metadata:",o.metadata);try{o.metadata=JSON.parse(o.metadata)}catch(e){throw Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",o);let r=await fetch("/key/generate",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...o})});if(!r.ok){let e=await r.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),a}catch(e){throw console.error("Failed to create key:",e),e}},m=async(e,t,o)=>{try{if(console.log("Form Values in keyCreateCall:",o),o.description&&(o.metadata||(o.metadata={}),o.metadata.description=o.description,delete o.description,o.metadata=JSON.stringify(o.metadata)),o.metadata){console.log("formValues.metadata:",o.metadata);try{o.metadata=JSON.parse(o.metadata)}catch(e){throw Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",o);let r=await fetch("/user/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...o})});if(!r.ok){let e=await r.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),a}catch(e){throw console.error("Failed to create key:",e),e}},g=async(e,t)=>{try{console.log("in keyDeleteCall:",t);let o=await fetch("/key/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:[t]})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},T=async(e,t)=>{try{console.log("in teamDeleteCall:",t);let o=await fetch("/team/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_ids:[t]})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to delete key:",e),e}},E=async function(e,t,o){let r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],a=arguments.length>4?arguments[4]:void 0,n=arguments.length>5?arguments[5]:void 0;try{let l="/user/info";"App Owner"==o&&t&&(l="".concat(l,"?user_id=").concat(t)),"App User"==o&&t&&(l="".concat(l,"?user_id=").concat(t)),("Internal User"==o||"Internal Viewer"==o)&&t&&(l="".concat(l,"?user_id=").concat(t)),console.log("in userInfoCall viewAll=",r),r&&n&&null!=a&&void 0!=a&&(l="".concat(l,"?view_all=true&page=").concat(a,"&page_size=").concat(n));let i=await fetch(l,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!i.ok){let e=await i.text();throw c(e),Error("Network response was not ok")}let w=await i.json();return console.log("API Response:",w),w}catch(e){throw console.error("Failed to create key:",e),e}},j=async(e,t)=>{try{let o="/team/info";t&&(o="".concat(o,"?team_id=").concat(t)),console.log("in teamInfoCall");let r=await fetch(o,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c(e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),a}catch(e){throw console.error("Failed to create key:",e),e}},_=async e=>{try{let t=await fetch("/global/spend",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to create key:",e),e}},N=async e=>{try{let t="/onboarding/get_token";t+="?invite_link=".concat(e);let o=await fetch(t,{method:"GET",headers:{"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to create key:",e),e}},C=async(e,t,o,r)=>{try{let a=await fetch("/onboarding/claim_token",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({invitation_link:t,user_id:o,password:r})});if(!a.ok){let e=await a.text();throw c(e),Error("Network response was not ok")}let n=await a.json();return console.log(n),n}catch(e){throw console.error("Failed to delete key:",e),e}},F=!1,b=null,x=async(e,t,o)=>{try{let t=await fetch("/v2/model/info",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw e+="error shown=".concat(F),F||(e.includes("No model list passed")&&(e="No Models Exist. Click Add Model to get started."),r.ZP.info(e,10),F=!0,b&&clearTimeout(b),b=setTimeout(()=>{F=!1},1e4)),Error("Network response was not ok")}let o=await t.json();return console.log("modelInfoCall:",o),o}catch(e){throw console.error("Failed to create key:",e),e}},B=async e=>{try{let t=await fetch("/model_group/info",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok)throw await t.text(),Error("Network response was not ok");let o=await t.json();return console.log("modelHubCall:",o),o}catch(e){throw console.error("Failed to create key:",e),e}},O=async e=>{try{let t=await fetch("/get/allowed_ips",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw Error("Network response was not ok: ".concat(e))}let o=await t.json();return console.log("getAllowedIPs:",o),o.data}catch(e){throw console.error("Failed to get allowed IPs:",e),e}},S=async(e,t)=>{try{let o=await fetch("/add/allowed_ip",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({ip:t})});if(!o.ok){let e=await o.text();throw Error("Network response was not ok: ".concat(e))}let r=await o.json();return console.log("addAllowedIP:",r),r}catch(e){throw console.error("Failed to add allowed IP:",e),e}},P=async(e,t)=>{try{let o=await fetch("/delete/allowed_ip",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({ip:t})});if(!o.ok){let e=await o.text();throw Error("Network response was not ok: ".concat(e))}let r=await o.json();return console.log("deleteAllowedIP:",r),r}catch(e){throw console.error("Failed to delete allowed IP:",e),e}},v=async(e,t,o,r,a,n,l,i)=>{try{let t="/model/metrics";r&&(t="".concat(t,"?_selected_model_group=").concat(r,"&startTime=").concat(a,"&endTime=").concat(n,"&api_key=").concat(l,"&customer=").concat(i));let o=await fetch(t,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to create key:",e),e}},G=async(e,t,o,r)=>{try{let a="/model/streaming_metrics";t&&(a="".concat(a,"?_selected_model_group=").concat(t,"&startTime=").concat(o,"&endTime=").concat(r));let n=await fetch(a,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!n.ok){let e=await n.text();throw c(e),Error("Network response was not ok")}return await n.json()}catch(e){throw console.error("Failed to create key:",e),e}},A=async(e,t,o,r,a,n,l,i)=>{try{let t="/model/metrics/slow_responses";r&&(t="".concat(t,"?_selected_model_group=").concat(r,"&startTime=").concat(a,"&endTime=").concat(n,"&api_key=").concat(l,"&customer=").concat(i));let o=await fetch(t,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to create key:",e),e}},J=async(e,t,o,r,a,n,l,i)=>{try{let t="/model/metrics/exceptions";r&&(t="".concat(t,"?_selected_model_group=").concat(r,"&startTime=").concat(a,"&endTime=").concat(n,"&api_key=").concat(l,"&customer=").concat(i));let o=await fetch(t,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to create key:",e),e}},I=async(e,t,o)=>{console.log("in /models calls, globalLitellmHeaderName",s);try{let t=await fetch("/models",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to create key:",e),e}},R=async e=>{try{let t="/global/spend/teams";console.log("in teamSpendLogsCall:",t);let o=await fetch("".concat(t),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},V=async(e,t,o,r)=>{try{let a="/global/spend/tags";t&&o&&(a="".concat(a,"?start_date=").concat(t,"&end_date=").concat(o)),r&&(a+="".concat(a,"&tags=").concat(r.join(","))),console.log("in tagsSpendLogsCall:",a);let n=await fetch("".concat(a),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!n.ok)throw await n.text(),Error("Network response was not ok");let c=await n.json();return console.log(c),c}catch(e){throw console.error("Failed to create key:",e),e}},U=async e=>{try{let t="/global/spend/all_tag_names";console.log("in global/spend/all_tag_names call",t);let o=await fetch("".concat(t),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok)throw await o.text(),Error("Network response was not ok");let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},Z=async e=>{try{let t="/global/all_end_users";console.log("in global/all_end_users call",t);let o=await fetch("".concat(t),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok)throw await o.text(),Error("Network response was not ok");let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},L=async(e,t,o,r,a,n)=>{try{console.log("user role in spend logs call: ".concat(o));let t="/spend/logs";t="App Owner"==o?"".concat(t,"?user_id=").concat(r,"&start_date=").concat(a,"&end_date=").concat(n):"".concat(t,"?start_date=").concat(a,"&end_date=").concat(n);let l=await fetch(t,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c(e),Error("Network response was not ok")}let i=await l.json();return console.log(i),i}catch(e){throw console.error("Failed to create key:",e),e}},M=async e=>{try{let t=await fetch("/global/spend/logs",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}let o=await t.json();return console.log(o),o}catch(e){throw console.error("Failed to create key:",e),e}},H=async e=>{try{let t=await fetch("/global/spend/keys?limit=5",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}let o=await t.json();return console.log(o),o}catch(e){throw console.error("Failed to create key:",e),e}},K=async(e,t,o,r)=>{try{let a="";a=t?JSON.stringify({api_key:t,startTime:o,endTime:r}):JSON.stringify({startTime:o,endTime:r});let n={method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:a},l=await fetch("/global/spend/end_users",n);if(!l.ok){let e=await l.text();throw c(e),Error("Network response was not ok")}let i=await l.json();return console.log(i),i}catch(e){throw console.error("Failed to create key:",e),e}},X=async(e,t,o,r)=>{try{let a="/global/spend/provider";o&&r&&(a+="?start_date=".concat(o,"&end_date=").concat(r)),t&&(a+="&api_key=".concat(t));let n={method:"GET",headers:{[s]:"Bearer ".concat(e)}},l=await fetch(a,n);if(!l.ok){let e=await l.text();throw c(e),Error("Network response was not ok")}let i=await l.json();return console.log(i),i}catch(e){throw console.error("Failed to fetch spend data:",e),e}},z=async(e,t,o)=>{try{let r="/global/activity";t&&o&&(r+="?start_date=".concat(t,"&end_date=").concat(o));let a={method:"GET",headers:{[s]:"Bearer ".concat(e)}},n=await fetch(r,a);if(!n.ok)throw await n.text(),Error("Network response was not ok");let c=await n.json();return console.log(c),c}catch(e){throw console.error("Failed to fetch spend data:",e),e}},D=async(e,t,o)=>{try{let r="/global/activity/cache_hits";t&&o&&(r+="?start_date=".concat(t,"&end_date=").concat(o));let a={method:"GET",headers:{[s]:"Bearer ".concat(e)}},n=await fetch(r,a);if(!n.ok)throw await n.text(),Error("Network response was not ok");let c=await n.json();return console.log(c),c}catch(e){throw console.error("Failed to fetch spend data:",e),e}},q=async(e,t,o)=>{try{let r="/global/activity/model";t&&o&&(r+="?start_date=".concat(t,"&end_date=").concat(o));let a={method:"GET",headers:{[s]:"Bearer ".concat(e)}},n=await fetch(r,a);if(!n.ok)throw await n.text(),Error("Network response was not ok");let c=await n.json();return console.log(c),c}catch(e){throw console.error("Failed to fetch spend data:",e),e}},$=async(e,t,o,r)=>{try{let a="/global/activity/exceptions";t&&o&&(a+="?start_date=".concat(t,"&end_date=").concat(o)),r&&(a+="&model_group=".concat(r));let n={method:"GET",headers:{[s]:"Bearer ".concat(e)}},c=await fetch(a,n);if(!c.ok)throw await c.text(),Error("Network response was not ok");let l=await c.json();return console.log(l),l}catch(e){throw console.error("Failed to fetch spend data:",e),e}},Q=async(e,t,o,r)=>{try{let a="/global/activity/exceptions/deployment";t&&o&&(a+="?start_date=".concat(t,"&end_date=").concat(o)),r&&(a+="&model_group=".concat(r));let n={method:"GET",headers:{[s]:"Bearer ".concat(e)}},c=await fetch(a,n);if(!c.ok)throw await c.text(),Error("Network response was not ok");let l=await c.json();return console.log(l),l}catch(e){throw console.error("Failed to fetch spend data:",e),e}},W=async e=>{try{let t=await fetch("/global/spend/models?limit=5",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}let o=await t.json();return console.log(o),o}catch(e){throw console.error("Failed to create key:",e),e}},Y=async(e,t)=>{try{let o=await fetch("/v2/key/info",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:t})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let r=await o.json();return console.log(r),r}catch(e){throw console.error("Failed to create key:",e),e}},ee=async(e,t)=>{try{let o="/user/get_users?role=".concat(t);console.log("in userGetAllUsersCall:",o);let r=await fetch(o,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c(e),Error("Network response was not ok")}let a=await r.json();return console.log(a),a}catch(e){throw console.error("Failed to get requested models:",e),e}},et=async e=>{try{let t=await fetch("/user/available_roles",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok)throw await t.text(),Error("Network response was not ok");let o=await t.json();return console.log("response from user/available_role",o),o}catch(e){throw e}},eo=async(e,t)=>{try{console.log("Form Values in teamCreateCall:",t);let o=await fetch("/team/new",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("API Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},er=async(e,t)=>{try{console.log("Form Values in keyUpdateCall:",t);let o=await fetch("/key/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("Update key Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},ea=async(e,t)=>{try{console.log("Form Values in teamUpateCall:",t);let o=await fetch("/team/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("Update Team Response:",r),r}catch(e){throw console.error("Failed to create key:",e),e}},en=async(e,t)=>{try{console.log("Form Values in modelUpateCall:",t);let o=await fetch("/model/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),console.error("Error update from the server:",e),Error("Network response was not ok")}let r=await o.json();return console.log("Update model Response:",r),r}catch(e){throw console.error("Failed to update model:",e),e}},ec=async(e,t,o)=>{try{console.log("Form Values in teamMemberAddCall:",o);let r=await fetch("/team/member_add",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_id:t,member:o})});if(!r.ok){let e=await r.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),a}catch(e){throw console.error("Failed to create key:",e),e}},es=async(e,t,o)=>{try{console.log("Form Values in userUpdateUserCall:",t);let r={...t};null!==o&&(r.user_role=o),r=JSON.stringify(r);let a=await fetch("/user/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:r});if(!a.ok){let e=await a.text();throw c(e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await a.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},el=async(e,t)=>{try{let o="/health/services?service=".concat(t);console.log("Checking Slack Budget Alerts service health");let a=await fetch(o,{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!a.ok){let e=await a.text();throw c(e),Error(e)}let n=await a.json();return r.ZP.success("Test request to ".concat(t," made - check logs/alerts on ").concat(t," to verify")),n}catch(e){throw console.error("Failed to perform health check:",e),e}},ei=async e=>{try{let t=await fetch("/budget/list",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},ew=async(e,t,o)=>{try{let t=await fetch("/get/config/callbacks",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},ed=async e=>{try{let t=await fetch("/config/list?config_type=general_settings",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}},eh=async(e,t)=>{try{let o=await fetch("/config/field/info?field_name=".concat(t),{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!o.ok)throw await o.text(),Error("Network response was not ok");return await o.json()}catch(e){throw console.error("Failed to set callbacks:",e),e}},ep=async(e,t,o)=>{try{let a=await fetch("/config/field/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({field_name:t,field_value:o,config_type:"general_settings"})});if(!a.ok){let e=await a.text();throw c(e),Error("Network response was not ok")}let n=await a.json();return r.ZP.success("Successfully updated value!"),n}catch(e){throw console.error("Failed to set callbacks:",e),e}},ey=async(e,t)=>{try{let o=await fetch("/config/field/delete",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({field_name:t,config_type:"general_settings"})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}let a=await o.json();return r.ZP.success("Field reset on proxy"),a}catch(e){throw console.error("Failed to get callbacks:",e),e}},eu=async(e,t)=>{try{let o=await fetch("/config/update",{method:"POST",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!o.ok){let e=await o.text();throw c(e),Error("Network response was not ok")}return await o.json()}catch(e){throw console.error("Failed to set callbacks:",e),e}},ef=async e=>{try{let t=await fetch("/health",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to call /health:",e),e}},ek=async e=>{try{let t=await fetch("/sso/get/logout_url",{method:"GET",headers:{[s]:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok)throw await t.text(),Error("Network response was not ok");return await t.json()}catch(e){throw console.error("Failed to get callbacks:",e),e}}}}]);
\ No newline at end of file
diff --git a/ui/litellm-dashboard/out/_next/static/chunks/app/page-b6860ddd56500b95.js b/ui/litellm-dashboard/out/_next/static/chunks/app/page-b6860ddd56500b95.js
new file mode 100644
index 00000000000..e8221c4aa2c
--- /dev/null
+++ b/ui/litellm-dashboard/out/_next/static/chunks/app/page-b6860ddd56500b95.js
@@ -0,0 +1 @@
+(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{20661:function(e,l,s){Promise.resolve().then(s.bind(s,48951))},667:function(e,l,s){"use strict";s.r(l),s.d(l,{default:function(){return f}});var t=s(3827),n=s(64090),a=s(47907),r=s(16450),i=s(18190),o=s(13810),d=s(10384),c=s(46453),m=s(71801),u=s(52273),h=s(42440),x=s(30953),p=s(777),j=s(37963),g=s(60620),Z=s(1861);function f(){let[e]=g.Z.useForm(),l=(0,a.useSearchParams)();!function(e){console.log("COOKIES",document.cookie);let l=document.cookie.split("; ").find(l=>l.startsWith(e+"="));l&&l.split("=")[1]}("token");let s=l.get("invitation_id"),[f,_]=(0,n.useState)(null),[y,b]=(0,n.useState)(""),[v,S]=(0,n.useState)(""),[k,w]=(0,n.useState)(null),[N,I]=(0,n.useState)(""),[A,C]=(0,n.useState)("");return(0,n.useEffect)(()=>{s&&(0,p.W_)(s).then(e=>{let l=e.login_url;console.log("login_url:",l),I(l);let s=e.token,t=(0,j.o)(s);C(s),console.log("decoded:",t),_(t.key),console.log("decoded user email:",t.user_email),S(t.user_email),w(t.user_id)})},[s]),(0,t.jsx)("div",{className:"mx-auto w-full max-w-md mt-10",children:(0,t.jsxs)(o.Z,{children:[(0,t.jsx)(h.Z,{className:"text-sm mb-5 text-center",children:"\uD83D\uDE85 LiteLLM"}),(0,t.jsx)(h.Z,{className:"text-xl",children:"Sign up"}),(0,t.jsx)(m.Z,{children:"Claim your user account to login to Admin UI."}),(0,t.jsx)(i.Z,{className:"mt-4",title:"SSO",icon:x.GH$,color:"sky",children:(0,t.jsxs)(c.Z,{numItems:2,className:"flex justify-between items-center",children:[(0,t.jsx)(d.Z,{children:"SSO is under the Enterprise Tirer."}),(0,t.jsx)(d.Z,{children:(0,t.jsx)(r.Z,{variant:"primary",className:"mb-2",children:(0,t.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get Free Trial"})})})]})}),(0,t.jsxs)(g.Z,{className:"mt-10 mb-5 mx-auto",layout:"vertical",onFinish:e=>{console.log("in handle submit. accessToken:",f,"token:",A,"formValues:",e),f&&A&&(e.user_email=v,k&&s&&(0,p.m_)(f,s,k,e.password).then(e=>{var l;let s="/ui/";s+="?userID="+((null===(l=e.data)||void 0===l?void 0:l.user_id)||e.user_id),document.cookie="token="+A,console.log("redirecting to:",s),window.location.href=s}))},children:[(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(g.Z.Item,{label:"Email Address",name:"user_email",children:(0,t.jsx)(u.Z,{type:"email",disabled:!0,value:v,defaultValue:v,className:"max-w-md"})}),(0,t.jsx)(g.Z.Item,{label:"Password",name:"password",rules:[{required:!0,message:"password required to sign up"}],help:"Create a password for your account",children:(0,t.jsx)(u.Z,{placeholder:"",type:"password",className:"max-w-md"})})]}),(0,t.jsx)("div",{className:"mt-10",children:(0,t.jsx)(Z.ZP,{htmlType:"submit",children:"Sign Up"})})]})]})})}},48951:function(e,l,s){"use strict";s.r(l),s.d(l,{default:function(){return lo}});var t,n,a=s(3827),r=s(64090),i=s(47907),o=s(8792),d=s(40491),c=s(65270),m=e=>{let{userID:l,userRole:s,userEmail:t,showSSOBanner:n,premiumUser:r,setProxySettings:i,proxySettings:m}=e;console.log("User ID:",l),console.log("userEmail:",t),console.log("showSSOBanner:",n),console.log("premiumUser:",r),console.log=function(){};let u="";console.log("PROXY_settings=",m),m&&m.PROXY_LOGOUT_URL&&void 0!==m.PROXY_LOGOUT_URL&&(u=m.PROXY_LOGOUT_URL),console.log("logoutUrl=",u);let h=[{key:"1",label:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("p",{children:["Role: ",s]}),(0,a.jsxs)("p",{children:["ID: ",l]}),(0,a.jsxs)("p",{children:["Premium User: ",String(r)]})]})},{key:"2",label:(0,a.jsx)("p",{onClick:()=>{document.cookie="token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;",window.location.href=u},children:"Logout"})}];return(0,a.jsxs)("nav",{className:"left-0 right-0 top-0 flex justify-between items-center h-12 mb-4",children:[(0,a.jsx)("div",{className:"text-left my-2 absolute top-0 left-0",children:(0,a.jsx)("div",{className:"flex flex-col items-center",children:(0,a.jsx)(o.default,{href:"/",children:(0,a.jsx)("button",{className:"text-gray-800 rounded text-center",children:(0,a.jsx)("img",{src:"/get_image",width:160,height:160,alt:"LiteLLM Brand",className:"mr-2"})})})})}),(0,a.jsxs)("div",{className:"text-right mx-4 my-2 absolute top-0 right-0 flex items-center justify-end space-x-2",children:[n?(0,a.jsx)("div",{style:{padding:"6px",borderRadius:"8px"},children:(0,a.jsx)("a",{href:"https://calendly.com/d/4mp-gd3-k5k/litellm-1-1-onboarding-chat",target:"_blank",style:{fontSize:"14px",textDecoration:"underline"},children:"Get enterprise license"})}):null,(0,a.jsx)("div",{style:{border:"1px solid #391085",padding:"6px",borderRadius:"8px"},children:(0,a.jsx)(d.Z,{menu:{items:h},children:(0,a.jsx)(c.Z,{children:t})})})]})]})},u=s(777),h=s(10384),x=s(46453),p=s(16450),j=s(52273),g=s(26780),Z=s(15595),f=s(6698),_=s(71801),y=s(42440),b=s(42308),v=s(50670),S=s(60620),k=s(80588),w=s(99129),N=s(44839),I=s(88707),A=s(1861);let{Option:C}=v.default;var P=e=>{let{userID:l,team:s,userRole:t,accessToken:n,data:i,setData:o}=e,[d]=S.Z.useForm(),[c,m]=(0,r.useState)(!1),[P,T]=(0,r.useState)(null),[E,O]=(0,r.useState)(null),[R,F]=(0,r.useState)([]),[M,D]=(0,r.useState)([]),L=()=>{m(!1),d.resetFields()},U=()=>{m(!1),T(null),d.resetFields()};(0,r.useEffect)(()=>{(async()=>{try{if(null===l||null===t)return;if(null!==n){let e=(await (0,u.So)(n,l,t)).data.map(e=>e.id);console.log("available_model_names:",e),F(e)}}catch(e){console.error("Error fetching user models:",e)}})()},[n,l,t]);let V=async e=>{try{var s,t,a;let r=null!==(s=null==e?void 0:e.key_alias)&&void 0!==s?s:"",c=null!==(t=null==e?void 0:e.team_id)&&void 0!==t?t:null;if((null!==(a=null==i?void 0:i.filter(e=>e.team_id===c).map(e=>e.key_alias))&&void 0!==a?a:[]).includes(r))throw Error("Key alias ".concat(r," already exists for team with ID ").concat(c,", please provide another key alias"));k.ZP.info("Making API Call"),m(!0);let h=await (0,u.wX)(n,l,e);console.log("key create Response:",h),o(e=>e?[...e,h]:[h]),T(h.key),O(h.soft_budget),k.ZP.success("API Key Created"),d.resetFields(),localStorage.removeItem("userData"+l)}catch(e){console.error("Error creating the key:",e),k.ZP.error("Error creating the key: ".concat(e),20)}};return(0,r.useEffect)(()=>{D(s&&s.models.length>0?s.models.includes("all-proxy-models")?R:s.models:R)},[s,R]),(0,a.jsxs)("div",{children:[(0,a.jsx)(p.Z,{className:"mx-auto",onClick:()=>m(!0),children:"+ Create New Key"}),(0,a.jsx)(w.Z,{title:"Create Key",visible:c,width:800,footer:null,onOk:L,onCancel:U,children:(0,a.jsxs)(S.Z,{form:d,onFinish:V,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{label:"Key Name",name:"key_alias",rules:[{required:!0,message:"Please input a key name"}],help:"required",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(S.Z.Item,{label:"Team ID",name:"team_id",hidden:!0,initialValue:s?s.team_id:null,valuePropName:"team_id",className:"mt-8",children:(0,a.jsx)(N.Z,{value:s?s.team_alias:"",disabled:!0})}),(0,a.jsx)(S.Z.Item,{label:"Models",name:"models",rules:[{required:!0,message:"Please select a model"}],help:"required",children:(0,a.jsxs)(v.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},onChange:e=>{e.includes("all-team-models")&&d.setFieldsValue({models:["all-team-models"]})},children:[(0,a.jsx)(C,{value:"all-team-models",children:"All Team Models"},"all-team-models"),M.map(e=>(0,a.jsx)(C,{value:e,children:e},e))]})}),(0,a.jsxs)(g.Z,{className:"mt-20 mb-8",children:[(0,a.jsx)(f.Z,{children:(0,a.jsx)("b",{children:"Optional Settings"})}),(0,a.jsxs)(Z.Z,{children:[(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"Max Budget (USD)",name:"max_budget",help:"Budget cannot exceed team max budget: $".concat((null==s?void 0:s.max_budget)!==null&&(null==s?void 0:s.max_budget)!==void 0?null==s?void 0:s.max_budget:"unlimited"),rules:[{validator:async(e,l)=>{if(l&&s&&null!==s.max_budget&&l>s.max_budget)throw Error("Budget cannot exceed team max budget: $".concat(s.max_budget))}}],children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",help:"Team Reset Budget: ".concat((null==s?void 0:s.budget_duration)!==null&&(null==s?void 0:s.budget_duration)!==void 0?null==s?void 0:s.budget_duration:"None"),children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})}),(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"Tokens per minute Limit (TPM)",name:"tpm_limit",help:"TPM cannot exceed team TPM limit: ".concat((null==s?void 0:s.tpm_limit)!==null&&(null==s?void 0:s.tpm_limit)!==void 0?null==s?void 0:s.tpm_limit:"unlimited"),rules:[{validator:async(e,l)=>{if(l&&s&&null!==s.tpm_limit&&l>s.tpm_limit)throw Error("TPM limit cannot exceed team TPM limit: ".concat(s.tpm_limit))}}],children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"Requests per minute Limit (RPM)",name:"rpm_limit",help:"RPM cannot exceed team RPM limit: ".concat((null==s?void 0:s.rpm_limit)!==null&&(null==s?void 0:s.rpm_limit)!==void 0?null==s?void 0:s.rpm_limit:"unlimited"),rules:[{validator:async(e,l)=>{if(l&&s&&null!==s.rpm_limit&&l>s.rpm_limit)throw Error("RPM limit cannot exceed team RPM limit: ".concat(s.rpm_limit))}}],children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(S.Z.Item,{label:"Expire Key (eg: 30s, 30h, 30d)",name:"duration",className:"mt-8",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(S.Z.Item,{label:"Metadata",name:"metadata",className:"mt-8",children:(0,a.jsx)(N.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})})]})]})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Create Key"})})]})}),P&&(0,a.jsx)(w.Z,{visible:c,onOk:L,onCancel:U,footer:null,children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 w-full",children:[(0,a.jsx)(y.Z,{children:"Save your Key"}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)("p",{children:["Please save this secret key somewhere safe and accessible. For security reasons, ",(0,a.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]})}),(0,a.jsx)(h.Z,{numColSpan:1,children:null!=P?(0,a.jsxs)("div",{children:[(0,a.jsx)(_.Z,{className:"mt-3",children:"API Key:"}),(0,a.jsx)("div",{style:{background:"#f8f8f8",padding:"10px",borderRadius:"5px",marginBottom:"10px"},children:(0,a.jsx)("pre",{style:{wordWrap:"break-word",whiteSpace:"normal"},children:P})}),(0,a.jsx)(b.CopyToClipboard,{text:P,onCopy:()=>{k.ZP.success("API Key copied to clipboard")},children:(0,a.jsx)(p.Z,{className:"mt-3",children:"Copy API Key"})})]}):(0,a.jsx)(_.Z,{children:"Key being created, this might take 30s"})})]})})]})},T=s(9454),E=s(98941),O=s(33393),R=s(5),F=s(13810),M=s(61244),D=s(10827),L=s(3851),U=s(2044),V=s(64167),q=s(74480),z=s(7178),B=s(95093),K=s(27166);let{Option:W}=v.default;console.log=function(){};var H=e=>{let{userID:l,userRole:s,accessToken:t,selectedTeam:n,data:i,setData:o,teams:d}=e,[c,m]=(0,r.useState)(!1),[h,x]=(0,r.useState)(!1),[j,g]=(0,r.useState)(null),[Z,f]=(0,r.useState)(null),[b,C]=(0,r.useState)(null),[P,H]=(0,r.useState)(""),[G,Y]=(0,r.useState)(!1),[J,X]=(0,r.useState)(!1),[$,Q]=(0,r.useState)(null),[ee,el]=(0,r.useState)([]),es=new Set,[et,en]=(0,r.useState)(es);(0,r.useEffect)(()=>{(async()=>{try{if(null===l)return;if(null!==t&&null!==s){let e=(await (0,u.So)(t,l,s)).data.map(e=>e.id);console.log("available_model_names:",e),el(e)}}catch(e){console.error("Error fetching user models:",e)}})()},[t,l,s]),(0,r.useEffect)(()=>{if(d){let e=new Set;d.forEach((l,s)=>{let t=l.team_id;e.add(t)}),en(e)}},[d]);let ea=e=>{console.log("handleEditClick:",e),null==e.token&&null!==e.token_id&&(e.token=e.token_id),Q(e),Y(!0)},er=async e=>{if(null==t)return;let l=e.token;e.key=l,console.log("handleEditSubmit:",e);let s=await (0,u.Nc)(t,e);console.log("handleEditSubmit: newKeyValues",s),i&&o(i.map(e=>e.token===l?s:e)),k.ZP.success("Key updated successfully"),Y(!1),Q(null)},ei=async e=>{console.log("handleDelete:",e),null==e.token&&null!==e.token_id&&(e.token=e.token_id),null!=i&&(g(e.token),localStorage.removeItem("userData"+l),x(!0))},eo=async()=>{if(null!=j&&null!=i){try{await (0,u.I1)(t,j);let e=i.filter(e=>e.token!==j);o(e)}catch(e){console.error("Error deleting the key:",e)}x(!1),g(null)}};if(null!=i)return console.log("RERENDER TRIGGERED"),(0,a.jsxs)("div",{children:[(0,a.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4 mt-2",children:[(0,a.jsxs)(D.Z,{className:"mt-5 max-h-[300px] min-h-[300px]",children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Key Alias"}),(0,a.jsx)(q.Z,{children:"Secret Key"}),(0,a.jsx)(q.Z,{children:"Spend (USD)"}),(0,a.jsx)(q.Z,{children:"Budget (USD)"}),(0,a.jsx)(q.Z,{children:"Models"}),(0,a.jsx)(q.Z,{children:"TPM / RPM Limits"})]})}),(0,a.jsx)(L.Z,{children:i.map(e=>{if(console.log(e),"litellm-dashboard"===e.team_id)return null;if(n){if(console.log("item team id: ".concat(e.team_id,", knownTeamIDs.has(item.team_id): ").concat(et.has(e.team_id),", selectedTeam id: ").concat(n.team_id)),(null!=n.team_id||null===e.team_id||et.has(e.team_id))&&e.team_id!=n.team_id)return null;console.log("item team id: ".concat(e.team_id,", is returned"))}return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{style:{maxWidth:"2px",whiteSpace:"pre-wrap",overflow:"hidden"},children:null!=e.key_alias?(0,a.jsx)(_.Z,{children:e.key_alias}):(0,a.jsx)(_.Z,{children:"Not Set"})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(_.Z,{children:e.key_name})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(_.Z,{children:(()=>{try{return parseFloat(e.spend).toFixed(4)}catch(l){return e.spend}})()})}),(0,a.jsx)(U.Z,{children:null!=e.max_budget?(0,a.jsx)(_.Z,{children:e.max_budget}):(0,a.jsx)(_.Z,{children:"Unlimited"})}),(0,a.jsx)(U.Z,{children:Array.isArray(e.models)?(0,a.jsx)("div",{style:{display:"flex",flexDirection:"column"},children:0===e.models.length?(0,a.jsx)(a.Fragment,{children:n&&n.models&&n.models.length>0?n.models.map((e,l)=>"all-proxy-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Proxy Models"})},l):"all-team-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Team Models"})},l):(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"blue",children:(0,a.jsx)(_.Z,{children:e.length>30?"".concat(e.slice(0,30),"..."):e})},l)):(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"blue",children:(0,a.jsx)(_.Z,{children:"all-proxy-models"})})}):e.models.map((e,l)=>"all-proxy-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Proxy Models"})},l):"all-team-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Team Models"})},l):(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"blue",children:(0,a.jsx)(_.Z,{children:e.length>30?"".concat(e.slice(0,30),"..."):e})},l))}):null}),(0,a.jsx)(U.Z,{children:(0,a.jsxs)(_.Z,{children:["TPM: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,a.jsx)("br",{})," RPM:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(M.Z,{onClick:()=>{Q(e),X(!0)},icon:T.Z,size:"sm"}),(0,a.jsx)(w.Z,{open:J,onCancel:()=>{X(!1),Q(null)},footer:null,width:800,children:$&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3 mt-8",children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Spend"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:(()=>{try{return parseFloat($.spend).toFixed(4)}catch(e){return $.spend}})()})})]}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Budget"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:null!=$.max_budget?(0,a.jsx)(a.Fragment,{children:$.max_budget}):(0,a.jsx)(a.Fragment,{children:"Unlimited"})})})]},e.name),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Expires"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor-default font-small text-tremor-content-strong dark:text-dark-tremor-content-strong",children:null!=$.expires?(0,a.jsx)(a.Fragment,{children:new Date($.expires).toLocaleString(void 0,{day:"numeric",month:"long",year:"numeric",hour:"numeric",minute:"numeric",second:"numeric"})}):(0,a.jsx)(a.Fragment,{children:"Never"})})})]},e.name)]}),(0,a.jsxs)(F.Z,{className:"my-4",children:[(0,a.jsx)(y.Z,{children:"Token Name"}),(0,a.jsx)(_.Z,{className:"my-1",children:$.key_alias?$.key_alias:$.key_name}),(0,a.jsx)(y.Z,{children:"Token ID"}),(0,a.jsx)(_.Z,{className:"my-1 text-[12px]",children:$.token}),(0,a.jsx)(y.Z,{children:"Metadata"}),(0,a.jsx)(_.Z,{className:"my-1",children:(0,a.jsxs)("pre",{children:[JSON.stringify($.metadata)," "]})})]}),(0,a.jsx)(p.Z,{className:"mx-auto flex items-center",onClick:()=>{X(!1),Q(null)},children:"Close"})]})}),(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>ea(e)}),(0,a.jsx)(M.Z,{onClick:()=>ei(e),icon:O.Z,size:"sm"})]})]},e.token)})})]}),h&&(0,a.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,a.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,a.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,a.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,a.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:""}),(0,a.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,a.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,a.jsx)("div",{className:"sm:flex sm:items-start",children:(0,a.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,a.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Key"}),(0,a.jsx)("div",{className:"mt-2",children:(0,a.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this key ?"})})]})})}),(0,a.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,a.jsx)(p.Z,{onClick:eo,color:"red",className:"ml-2",children:"Delete"}),(0,a.jsx)(p.Z,{onClick:()=>{x(!1),g(null)},children:"Cancel"})]})]})]})})]}),$&&(0,a.jsx)(e=>{let{visible:l,onCancel:s,token:t,onSubmit:i}=e,[o]=S.Z.useForm(),[c,m]=(0,r.useState)(n),[u,h]=(0,r.useState)([]),[x,p]=(0,r.useState)(!1);return(0,a.jsx)(w.Z,{title:"Edit Key",visible:l,width:800,footer:null,onOk:()=>{o.validateFields().then(e=>{o.resetFields()}).catch(e=>{console.error("Validation failed:",e)})},onCancel:s,children:(0,a.jsxs)(S.Z,{form:o,onFinish:er,initialValues:t,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{label:"Key Name",name:"key_alias",rules:[{required:!0,message:"Please input a key name"}],help:"required",children:(0,a.jsx)(N.Z,{})}),(0,a.jsx)(S.Z.Item,{label:"Models",name:"models",rules:[{validator:(e,l)=>{let s=l.filter(e=>!c.models.includes(e)&&"all-team-models"!==e&&"all-proxy-models"!==e&&!c.models.includes("all-proxy-models"));return(console.log("errorModels: ".concat(s)),s.length>0)?Promise.reject("Some models are not part of the new team's models - ".concat(s,"Team models: ").concat(c.models)):Promise.resolve()}}],children:(0,a.jsxs)(v.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:[(0,a.jsx)(W,{value:"all-team-models",children:"All Team Models"},"all-team-models"),c&&c.models?c.models.includes("all-proxy-models")?ee.filter(e=>"all-proxy-models"!==e).map(e=>(0,a.jsx)(W,{value:e,children:e},e)):c.models.map(e=>(0,a.jsx)(W,{value:e,children:e},e)):ee.map(e=>(0,a.jsx)(W,{value:e,children:e},e))]})}),(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"Max Budget (USD)",name:"max_budget",help:"Budget cannot exceed team max budget: ".concat((null==c?void 0:c.max_budget)!==null&&(null==c?void 0:c.max_budget)!==void 0?null==c?void 0:c.max_budget:"unlimited"),rules:[{validator:async(e,l)=>{if(l&&c&&null!==c.max_budget&&l>c.max_budget)throw console.log("keyTeam.max_budget: ".concat(c.max_budget)),Error("Budget cannot exceed team max budget: $".concat(c.max_budget))}}],children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(S.Z.Item,{label:"token",name:"token",hidden:!0}),(0,a.jsx)(S.Z.Item,{label:"Team",name:"team_id",help:"the team this key belongs to",children:(0,a.jsx)(B.Z,{value:t.team_alias,children:null==d?void 0:d.map((e,l)=>(0,a.jsx)(K.Z,{value:e.team_id,onClick:()=>m(e),children:e.team_alias},l))})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Edit Key"})})]})})},{visible:G,onCancel:()=>{Y(!1),Q(null)},token:$,onSubmit:er})]})};console.log=function(){};var G=e=>{let{userID:l,userRole:s,accessToken:t,userSpend:n,selectedTeam:i}=e;console.log("userSpend: ".concat(n));let[o,d]=(0,r.useState)(null!==n?n:0),[c,m]=(0,r.useState)(0),[h,x]=(0,r.useState)([]);(0,r.useEffect)(()=>{let e=async()=>{if(t&&l&&s&&"Admin"===s&&null==n)try{let e=await (0,u.Qy)(t);e&&(e.spend?d(e.spend):d(0),e.max_budget?m(e.max_budget):m(0))}catch(e){console.error("Error fetching global spend data:",e)}};(async()=>{try{if(null===l||null===s)return;if(null!==t){let e=(await (0,u.So)(t,l,s)).data.map(e=>e.id);console.log("available_model_names:",e),x(e)}}catch(e){console.error("Error fetching user models:",e)}})(),e()},[s,t,l]),(0,r.useEffect)(()=>{null!==n&&d(n)},[n]);let p=[];i&&i.models&&(p=i.models),p&&p.includes("all-proxy-models")?(console.log("user models:",h),p=h):p&&p.includes("all-team-models")?p=i.models:p&&0===p.length&&(p=h);let j=void 0!==o?o.toFixed(4):null;return console.log("spend in view user spend: ".concat(o)),(0,a.jsx)("div",{className:"flex items-center",children:(0,a.jsxs)("div",{children:[(0,a.jsxs)("p",{className:"text-tremor-default text-tremor-content dark:text-dark-tremor-content",children:["Total Spend"," "]}),(0,a.jsxs)("p",{className:"text-2xl text-tremor-content-strong dark:text-dark-tremor-content-strong font-semibold",children:["$",j]})]})})};console.log=function(){};var Y=e=>{let{userID:l,userRole:s,selectedTeam:t,accessToken:n}=e,[i,o]=(0,r.useState)([]);(0,r.useEffect)(()=>{(async()=>{try{if(null===l||null===s)return;if(null!==n){let e=(await (0,u.So)(n,l,s)).data.map(e=>e.id);console.log("available_model_names:",e),o(e)}}catch(e){console.error("Error fetching user models:",e)}})()},[n,l,s]);let d=[];return t&&t.models&&(d=t.models),d&&d.includes("all-proxy-models")&&(console.log("user models:",i),d=i),(0,a.jsx)(a.Fragment,{children:(0,a.jsx)("div",{className:"mb-5",children:(0,a.jsx)("p",{className:"text-3xl text-tremor-content-strong dark:text-dark-tremor-content-strong font-semibold",children:null==t?void 0:t.team_alias})})})},J=e=>{let l,{teams:s,setSelectedTeam:t,userRole:n}=e,i={models:[],team_id:null,team_alias:"Default Team"},[o,d]=(0,r.useState)(i);return(l="App User"===n?s:s?[...s,i]:[i],"App User"===n)?null:(0,a.jsxs)("div",{className:"mt-5 mb-5",children:[(0,a.jsx)(y.Z,{children:"Select Team"}),(0,a.jsx)(_.Z,{children:"If you belong to multiple teams, this setting controls which team is used by default when creating new API Keys."}),(0,a.jsxs)(_.Z,{className:"mt-3 mb-3",children:[(0,a.jsx)("b",{children:"Default Team:"})," If no team_id is set for a key, it will be grouped under here."]}),l&&l.length>0?(0,a.jsx)(B.Z,{defaultValue:"0",children:l.map((e,l)=>(0,a.jsx)(K.Z,{value:String(l),onClick:()=>t(e),children:e.team_alias},l))}):(0,a.jsxs)(_.Z,{children:["No team created. ",(0,a.jsx)("b",{children:"Defaulting to personal account."})]})]})},X=s(667),$=s(37963),Q=s(97482);console.log=function(){},console.log("isLocal:",!1);var ee=e=>{let{userID:l,userRole:s,teams:t,keys:n,setUserRole:o,userEmail:d,setUserEmail:c,setTeams:m,setKeys:p,setProxySettings:j,proxySettings:g}=e,[Z,f]=(0,r.useState)(null),_=(0,i.useSearchParams)();_.get("viewSpend"),(0,i.useRouter)();let y=function(e){console.log("COOKIES",document.cookie);let l=document.cookie.split("; ").find(l=>l.startsWith(e+"="));return l?l.split("=")[1]:null}("token"),b=_.get("invitation_id"),[v,S]=(0,r.useState)(null),[k,w]=(0,r.useState)(null),[N,I]=(0,r.useState)([]),A={models:[],team_alias:"Default Team",team_id:null},[C,T]=(0,r.useState)(t?t[0]:A);if(window.addEventListener("beforeunload",function(){sessionStorage.clear()}),(0,r.useEffect)(()=>{if(y){let e=(0,$.o)(y);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),S(e.key),e.user_role){let l=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";case"internal_user":return"Internal User";case"internal_user_viewer":return"Internal Viewer";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",l),o(l)}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e))}}if(l&&v&&s&&!n&&!Z){let e=sessionStorage.getItem("userModels"+l);e?I(JSON.parse(e)):(async()=>{try{let e=await (0,u.Dj)(v);j(e);let t=await (0,u.Br)(v,l,s,!1,null,null);if(console.log("received teams in user dashboard: ".concat(Object.keys(t),"; team values: ").concat(Object.entries(t.teams))),"Admin"==s){let e=await (0,u.Qy)(v);f(e),console.log("globalSpend:",e)}else f(t.user_info);p(t.keys),m(t.teams);let n=[...t.teams];n.length>0?(console.log("response['teams']: ".concat(n)),T(n[0])):T(A),sessionStorage.setItem("userData"+l,JSON.stringify(t.keys)),sessionStorage.setItem("userSpendData"+l,JSON.stringify(t.user_info));let a=(await (0,u.So)(v,l,s)).data.map(e=>e.id);console.log("available_model_names:",a),I(a),console.log("userModels:",N),sessionStorage.setItem("userModels"+l,JSON.stringify(a))}catch(e){console.error("There was an error fetching the data",e)}})()}},[l,y,v,n,s]),(0,r.useEffect)(()=>{if(null!==n&&null!=C&&null!==C.team_id){let e=0;for(let l of n)C.hasOwnProperty("team_id")&&null!==l.team_id&&l.team_id===C.team_id&&(e+=l.spend);w(e)}else if(null!==n){let e=0;for(let l of n)e+=l.spend;w(e)}},[C]),null!=b)return(0,a.jsx)(X.default,{});if(null==l||null==y){let e="/sso/key/generate";return document.cookie="token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;",console.log("Full URL:",e),window.location.href=e,null}if(null==v)return null;if(null==s&&o("App Owner"),s&&"Admin Viewer"==s){let{Title:e,Paragraph:l}=Q.default;return(0,a.jsxs)("div",{children:[(0,a.jsx)(e,{level:1,children:"Access Denied"}),(0,a.jsx)(l,{children:"Ask your proxy admin for access to create keys"})]})}return console.log("inside user dashboard, selected team",C),(0,a.jsx)("div",{className:"w-full mx-4",children:(0,a.jsx)(x.Z,{numItems:1,className:"gap-2 p-8 h-[75vh] w-full mt-2",children:(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(Y,{userID:l,userRole:s,selectedTeam:C||null,accessToken:v}),(0,a.jsx)(G,{userID:l,userRole:s,accessToken:v,userSpend:k,selectedTeam:C||null}),(0,a.jsx)(H,{userID:l,userRole:s,accessToken:v,selectedTeam:C||null,data:n,setData:p,teams:t}),(0,a.jsx)(P,{userID:l,team:C||null,userRole:s,accessToken:v,data:n,setData:p},C?C.team_id:null),(0,a.jsx)(J,{teams:t,setSelectedTeam:T,userRole:s})]})})})},el=s(49167),es=s(35087),et=s(92836),en=s(26734),ea=s(41608),er=s(32126),ei=s(23682),eo=s(47047),ed=s(76628),ec=s(25707),em=s(44041),eu=s(6180),eh=s(28683),ex=s(38302),ep=s(66242),ej=s(78578),eg=s(63954),eZ=s(34658),ef=e=>{let{modelID:l,accessToken:s}=e,[t,n]=(0,r.useState)(!1),i=async()=>{try{k.ZP.info("Making API Call"),n(!0);let e=await (0,u.Og)(s,l);console.log("model delete Response:",e),k.ZP.success("Model ".concat(l," deleted successfully")),n(!1)}catch(e){console.error("Error deleting the model:",e)}};return(0,a.jsxs)("div",{children:[(0,a.jsx)(M.Z,{onClick:()=>n(!0),icon:O.Z,size:"sm"}),(0,a.jsx)(w.Z,{open:t,onOk:i,okType:"danger",onCancel:()=>n(!1),children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 w-full",children:[(0,a.jsx)(y.Z,{children:"Delete Model"}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsx)("p",{children:"Are you sure you want to delete this model? This action is irreversible."})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)("p",{children:["Model ID: ",(0,a.jsx)("b",{children:l})]})})]})})]})},e_=s(97766),ey=s(46495),eb=s(18190),ev=s(91118),eS=e=>{let{modelMetrics:l,modelMetricsCategories:s,customTooltip:t,premiumUser:n}=e;return n?(0,a.jsx)(ev.Z,{title:"Time to First token (s)",className:"h-72",data:l,index:"date",showLegend:!1,categories:s,colors:["indigo","rose"],connectNulls:!0,customTooltip:t}):(0,a.jsxs)("div",{children:[(0,a.jsx)(eb.Z,{title:"✨ Enterprise Feature",color:"teal",className:"mt-2 mb-4",children:"Enterprise features are available for users with a specific license, please contact LiteLLM to unlock this limitation."}),(0,a.jsx)(p.Z,{variant:"primary",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get in touch"})})]})},ek=e=>{let{fields:l,selectedProvider:s}=e;return 0===l.length?null:(0,a.jsx)(a.Fragment,{children:l.map(e=>(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:e.field_name.replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase()),name:e.field_name,tooltip:e.field_description,className:"mb-2",children:(0,a.jsx)(j.Z,{placeholder:e.field_value,type:"password"})},e.field_name))})},ew=s(67951);let{Title:eN,Link:eI}=Q.default;(t=n||(n={})).OpenAI="OpenAI",t.Azure="Azure",t.Azure_AI_Studio="Azure AI Studio",t.Anthropic="Anthropic",t.Google_AI_Studio="Google AI Studio",t.Bedrock="Amazon Bedrock",t.OpenAI_Compatible="OpenAI-Compatible Endpoints (Groq, Together AI, Mistral AI, etc.)",t.Vertex_AI="Vertex AI (Anthropic, Gemini, etc.)",t.Databricks="Databricks",t.Ollama="Ollama";let eA={OpenAI:"openai",Azure:"azure",Azure_AI_Studio:"azure_ai",Anthropic:"anthropic",Google_AI_Studio:"gemini",Bedrock:"bedrock",OpenAI_Compatible:"openai",Vertex_AI:"vertex_ai",Databricks:"databricks",Ollama:"ollama"},eC={"BadRequestError (400)":"BadRequestErrorRetries","AuthenticationError (401)":"AuthenticationErrorRetries","TimeoutError (408)":"TimeoutErrorRetries","RateLimitError (429)":"RateLimitErrorRetries","ContentPolicyViolationError (400)":"ContentPolicyViolationErrorRetries","InternalServerError (500)":"InternalServerErrorRetries"},eP=async(e,l,s)=>{try{let t=Array.isArray(e.model)?e.model:[e.model];console.log("received deployments: ".concat(t)),console.log("received type of deployments: ".concat(typeof t)),t.forEach(async s=>{console.log("litellm_model: ".concat(s));let t={},n={};t.model=s;let a="";for(let[l,s]of(console.log("formValues add deployment:",e),Object.entries(e)))if(""!==s){if("model_name"==l)a+=s;else if("custom_llm_provider"==l){console.log("custom_llm_provider:",s);let e=eA[s];t.custom_llm_provider=e,console.log("custom_llm_provider mappingResult:",e)}else if("model"==l)continue;else if("base_model"===l)n[l]=s;else if("custom_model_name"===l)t.model=s;else if("litellm_extra_params"==l){console.log("litellm_extra_params:",s);let e={};if(s&&void 0!=s){try{e=JSON.parse(s)}catch(e){throw k.ZP.error("Failed to parse LiteLLM Extra Params: "+e,10),Error("Failed to parse litellm_extra_params: "+e)}for(let[l,s]of Object.entries(e))t[l]=s}}else t[l]=s}let r={model_name:a,litellm_params:t,model_info:n},i=await (0,u.kK)(l,r);console.log("response for model create call: ".concat(i.data))}),s.resetFields()}catch(e){k.ZP.error("Failed to create model: "+e,10)}};var eT=e=>{let l,{accessToken:s,token:t,userRole:i,userID:o,modelData:d={data:[]},keys:c,setModelData:m,premiumUser:h}=e,[g,Z]=(0,r.useState)([]),[f]=S.Z.useForm(),[b,v]=(0,r.useState)(null),[N,C]=(0,r.useState)(""),[P,O]=(0,r.useState)([]),W=Object.values(n).filter(e=>isNaN(Number(e))),[H,G]=(0,r.useState)([]),[Y,J]=(0,r.useState)("OpenAI"),[X,$]=(0,r.useState)(""),[ee,eb]=(0,r.useState)(!1),[ev,eT]=(0,r.useState)(!1),[eE,eO]=(0,r.useState)(null),[eR,eF]=(0,r.useState)([]),[eM,eD]=(0,r.useState)(null),[eL,eU]=(0,r.useState)([]),[eV,eq]=(0,r.useState)([]),[ez,eB]=(0,r.useState)([]),[eK,eW]=(0,r.useState)([]),[eH,eG]=(0,r.useState)([]),[eY,eJ]=(0,r.useState)([]),[eX,e$]=(0,r.useState)([]),[eQ,e0]=(0,r.useState)([]),[e1,e2]=(0,r.useState)([]),[e4,e5]=(0,r.useState)({from:new Date(Date.now()-6048e5),to:new Date}),[e8,e3]=(0,r.useState)(null),[e6,e9]=(0,r.useState)(0),[e7,le]=(0,r.useState)({}),[ll,ls]=(0,r.useState)([]),[lt,ln]=(0,r.useState)(!1),[la,lr]=(0,r.useState)(null),[li,lo]=(0,r.useState)(null),[ld,lc]=(0,r.useState)([]);(0,r.useEffect)(()=>{lb(eM,e4.from,e4.to)},[la,li]);let lm=e=>{eO(e),eb(!0)},lu=e=>{eO(e),eT(!0)},lh=async e=>{if(console.log("handleEditSubmit:",e),null==s)return;let l={},t=null;for(let[s,n]of Object.entries(e))"model_id"!==s?l[s]=n:t=n;let n={litellm_params:l,model_info:{id:t}};console.log("handleEditSubmit payload:",n);try{await (0,u.um)(s,n),k.ZP.success("Model updated successfully, restart server to see updates"),eb(!1),eO(null)}catch(e){console.log("Error occurred")}},lx=()=>{C(new Date().toLocaleString())},lp=async()=>{if(!s){console.error("Access token is missing");return}console.log("new modelGroupRetryPolicy:",e8);try{await (0,u.K_)(s,{router_settings:{model_group_retry_policy:e8}}),k.ZP.success("Retry settings saved successfully")}catch(e){console.error("Failed to save retry settings:",e),k.ZP.error("Failed to save retry settings")}};if((0,r.useEffect)(()=>{if(!s||!t||!i||!o)return;let e=async()=>{try{var e,l,t,n,a,r,d,c,h,x,p,j;let g=await (0,u.hy)(s);G(g);let Z=await (0,u.AZ)(s,o,i);console.log("Model data response:",Z.data),m(Z);let f=new Set;for(let e=0;e0&&(y=_[_.length-1],console.log("_initial_model_group:",y)),console.log("selectedModelGroup:",eM);let b=await (0,u.o6)(s,o,i,y,null===(e=e4.from)||void 0===e?void 0:e.toISOString(),null===(l=e4.to)||void 0===l?void 0:l.toISOString(),null==la?void 0:la.token,li);console.log("Model metrics response:",b),eq(b.data),eB(b.all_api_bases);let v=await (0,u.Rg)(s,y,null===(t=e4.from)||void 0===t?void 0:t.toISOString(),null===(n=e4.to)||void 0===n?void 0:n.toISOString());eW(v.data),eG(v.all_api_bases);let S=await (0,u.N8)(s,o,i,y,null===(a=e4.from)||void 0===a?void 0:a.toISOString(),null===(r=e4.to)||void 0===r?void 0:r.toISOString(),null==la?void 0:la.token,li);console.log("Model exceptions response:",S),eJ(S.data),e$(S.exception_types);let k=await (0,u.fP)(s,o,i,y,null===(d=e4.from)||void 0===d?void 0:d.toISOString(),null===(c=e4.to)||void 0===c?void 0:c.toISOString(),null==la?void 0:la.token,li),w=await (0,u.n$)(s,null===(h=e4.from)||void 0===h?void 0:h.toISOString().split("T")[0],null===(x=e4.to)||void 0===x?void 0:x.toISOString().split("T")[0],y);le(w);let N=await (0,u.v9)(s,null===(p=e4.from)||void 0===p?void 0:p.toISOString().split("T")[0],null===(j=e4.to)||void 0===j?void 0:j.toISOString().split("T")[0],y);ls(N),console.log("dailyExceptions:",w),console.log("dailyExceptionsPerDeplyment:",N),console.log("slowResponses:",k),e2(k);let I=await (0,u.j2)(s);lc(null==I?void 0:I.end_users);let A=(await (0,u.BL)(s,o,i)).router_settings;console.log("routerSettingsInfo:",A);let C=A.model_group_retry_policy,P=A.num_retries;console.log("model_group_retry_policy:",C),console.log("default_retries:",P),e3(C),e9(P)}catch(e){console.error("There was an error fetching the model data",e)}};s&&t&&i&&o&&e();let l=async()=>{let e=await (0,u.qm)(s);console.log("received model cost map data: ".concat(Object.keys(e))),v(e)};null==b&&l(),lx()},[s,t,i,o,b,N]),!d||!s||!t||!i||!o)return(0,a.jsx)("div",{children:"Loading..."});let lj=[];for(let e=0;e(console.log("GET PROVIDER CALLED! - ".concat(b)),null!=b&&"object"==typeof b&&e in b)?b[e].litellm_provider:"openai";if(s){let e=s.split("/"),l=e[0];(a=t)||(a=1===e.length?u(s):l)}else a="-";n&&(r=null==n?void 0:n.input_cost_per_token,i=null==n?void 0:n.output_cost_per_token,o=null==n?void 0:n.max_tokens,c=null==n?void 0:n.max_input_tokens),(null==l?void 0:l.litellm_params)&&(m=Object.fromEntries(Object.entries(null==l?void 0:l.litellm_params).filter(e=>{let[l]=e;return"model"!==l&&"api_base"!==l}))),d.data[e].provider=a,d.data[e].input_cost=r,d.data[e].output_cost=i,d.data[e].input_cost&&(d.data[e].input_cost=(1e6*Number(d.data[e].input_cost)).toFixed(2)),d.data[e].output_cost&&(d.data[e].output_cost=(1e6*Number(d.data[e].output_cost)).toFixed(2)),d.data[e].max_tokens=o,d.data[e].max_input_tokens=c,d.data[e].api_base=null==l?void 0:null===(lf=l.litellm_params)||void 0===lf?void 0:lf.api_base,d.data[e].cleanedLitellmParams=m,lj.push(l.model_name),console.log(d.data[e])}if(i&&"Admin Viewer"==i){let{Title:e,Paragraph:l}=Q.default;return(0,a.jsxs)("div",{children:[(0,a.jsx)(e,{level:1,children:"Access Denied"}),(0,a.jsx)(l,{children:"Ask your proxy admin for access to view all models"})]})}let l_=e=>{console.log("received provider string: ".concat(e));let l=Object.keys(n).find(l=>n[l]===e);if(l){let e=eA[l];console.log("mappingResult: ".concat(e));let s=[];"object"==typeof b&&Object.entries(b).forEach(l=>{let[t,n]=l;null!==n&&"object"==typeof n&&"litellm_provider"in n&&(n.litellm_provider===e||n.litellm_provider.includes(e))&&s.push(t)}),O(s),console.log("providerModels: ".concat(P))}},ly=async()=>{try{k.ZP.info("Running health check..."),$("");let e=await (0,u.EY)(s);$(e)}catch(e){console.error("Error running health check:",e),$("Error running health check")}},lb=async(e,l,t)=>{if(console.log("Updating model metrics for group:",e),!s||!o||!i||!l||!t)return;console.log("inside updateModelMetrics - startTime:",l,"endTime:",t),eD(e);let n=null==la?void 0:la.token;void 0===n&&(n=null);let a=li;void 0===a&&(a=null),l.setHours(0),l.setMinutes(0),l.setSeconds(0),t.setHours(23),t.setMinutes(59),t.setSeconds(59);try{let r=await (0,u.o6)(s,o,i,e,l.toISOString(),t.toISOString(),n,a);console.log("Model metrics response:",r),eq(r.data),eB(r.all_api_bases);let d=await (0,u.Rg)(s,e,l.toISOString(),t.toISOString());eW(d.data),eG(d.all_api_bases);let c=await (0,u.N8)(s,o,i,e,l.toISOString(),t.toISOString(),n,a);console.log("Model exceptions response:",c),eJ(c.data),e$(c.exception_types);let m=await (0,u.fP)(s,o,i,e,l.toISOString(),t.toISOString(),n,a);if(console.log("slowResponses:",m),e2(m),e){let n=await (0,u.n$)(s,null==l?void 0:l.toISOString().split("T")[0],null==t?void 0:t.toISOString().split("T")[0],e);le(n);let a=await (0,u.v9)(s,null==l?void 0:l.toISOString().split("T")[0],null==t?void 0:t.toISOString().split("T")[0],e);ls(a)}}catch(e){console.error("Failed to fetch model metrics",e)}},lv=(0,a.jsxs)("div",{children:[(0,a.jsx)(_.Z,{className:"mb-1",children:"Select API Key Name"}),h?(0,a.jsxs)("div",{children:[(0,a.jsxs)(B.Z,{defaultValue:"all-keys",children:[(0,a.jsx)(K.Z,{value:"all-keys",onClick:()=>{lr(null)},children:"All Keys"},"all-keys"),null==c?void 0:c.map((e,l)=>e&&null!==e.key_alias&&e.key_alias.length>0?(0,a.jsx)(K.Z,{value:String(l),onClick:()=>{lr(e)},children:e.key_alias},l):null)]}),(0,a.jsx)(_.Z,{className:"mt-1",children:"Select Customer Name"}),(0,a.jsxs)(B.Z,{defaultValue:"all-customers",children:[(0,a.jsx)(K.Z,{value:"all-customers",onClick:()=>{lo(null)},children:"All Customers"},"all-customers"),null==ld?void 0:ld.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>{lo(e)},children:e},l))]})]}):(0,a.jsxs)("div",{children:[(0,a.jsxs)(B.Z,{defaultValue:"all-keys",children:[(0,a.jsx)(K.Z,{value:"all-keys",onClick:()=>{lr(null)},children:"All Keys"},"all-keys"),null==c?void 0:c.map((e,l)=>e&&null!==e.key_alias&&e.key_alias.length>0?(0,a.jsxs)(K.Z,{value:String(l),disabled:!0,onClick:()=>{lr(e)},children:["✨ ",e.key_alias," (Enterprise only Feature)"]},l):null)]}),(0,a.jsx)(_.Z,{className:"mt-1",children:"Select Customer Name"}),(0,a.jsxs)(B.Z,{defaultValue:"all-customers",children:[(0,a.jsx)(K.Z,{value:"all-customers",onClick:()=>{lo(null)},children:"All Customers"},"all-customers"),null==ld?void 0:ld.map((e,l)=>(0,a.jsxs)(K.Z,{value:e,disabled:!0,onClick:()=>{lo(e)},children:["✨ ",e," (Enterprise only Feature)"]},l))]})]})]}),lS=e=>{var l,s;let{payload:t,active:n}=e;if(!n||!t)return null;let r=null===(s=t[0])||void 0===s?void 0:null===(l=s.payload)||void 0===l?void 0:l.date,i=t.sort((e,l)=>l.value-e.value);if(i.length>5){let e=i.length-5;(i=i.slice(0,5)).push({dataKey:"".concat(e," other deployments"),value:t.slice(5).reduce((e,l)=>e+l.value,0),color:"gray"})}return(0,a.jsxs)("div",{className:"w-150 rounded-tremor-default border border-tremor-border bg-tremor-background p-2 text-tremor-default shadow-tremor-dropdown",children:[r&&(0,a.jsxs)("p",{className:"text-tremor-content-emphasis mb-2",children:["Date: ",r]}),i.map((e,l)=>{let s=parseFloat(e.value.toFixed(5)),t=0===s&&e.value>0?"<0.00001":s.toFixed(5);return(0,a.jsxs)("div",{className:"flex justify-between",children:[(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,a.jsx)("div",{className:"w-2 h-2 mt-1 rounded-full bg-".concat(e.color,"-500")}),(0,a.jsx)("p",{className:"text-tremor-content",children:e.dataKey})]}),(0,a.jsx)("p",{className:"font-medium text-tremor-content-emphasis text-righ ml-2",children:t})]},l)})]})},lk=e=>"Vertex AI (Anthropic, Gemini, etc.)"===e?"gemini-pro":"Anthropic"==e||"Amazon Bedrock"==e?"claude-3-opus":"Google AI Studio"==e?"gemini-pro":"Azure AI Studio"==e?"azure_ai/command-r-plus":"Azure"==e?"azure/my-deployment":"gpt-3.5-turbo";console.log("selectedProvider: ".concat(Y)),console.log("providerModels.length: ".concat(P.length));let lw=Object.keys(n).find(e=>n[e]===Y);return lw&&(l=H.find(e=>e.name===eA[lw])),(0,a.jsx)("div",{style:{width:"100%",height:"100%"},children:(0,a.jsxs)(en.Z,{className:"gap-2 p-8 h-[75vh] w-full mt-2",children:[(0,a.jsxs)(ea.Z,{className:"flex justify-between mt-2 w-full items-center",children:[(0,a.jsxs)("div",{className:"flex",children:[(0,a.jsx)(et.Z,{children:"All Models"}),(0,a.jsx)(et.Z,{children:"Add Model"}),(0,a.jsx)(et.Z,{children:(0,a.jsx)("pre",{children:"/health Models"})}),(0,a.jsx)(et.Z,{children:"Model Analytics"}),(0,a.jsx)(et.Z,{children:"Model Retry Settings"})]}),(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[N&&(0,a.jsxs)(_.Z,{children:["Last Refreshed: ",N]}),(0,a.jsx)(M.Z,{icon:eg.Z,variant:"shadow",size:"xs",className:"self-center",onClick:lx})]})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)(x.Z,{children:[(0,a.jsxs)("div",{className:"flex items-center",children:[(0,a.jsx)(_.Z,{children:"Filter by Public Model Name"}),(0,a.jsxs)(B.Z,{className:"mb-4 mt-2 ml-2 w-50",defaultValue:eM||void 0,onValueChange:e=>eD("all"===e?"all":e),value:eM||void 0,children:[(0,a.jsx)(K.Z,{value:"all",children:"All Models"}),eR.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>eD(e),children:e},l))]})]}),(0,a.jsx)(F.Z,{children:(0,a.jsxs)(D.Z,{style:{maxWidth:"1500px",width:"100%"},children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:"Public Model Name"}),(0,a.jsx)(q.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:"Provider"}),"Admin"===i&&(0,a.jsx)(q.Z,{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:"API Base"}),(0,a.jsxs)(q.Z,{style:{maxWidth:"85px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:["Input Price"," ",(0,a.jsx)("p",{style:{fontSize:"10px",color:"gray"},children:"/1M Tokens ($)"})]}),(0,a.jsxs)(q.Z,{style:{maxWidth:"85px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:["Output Price"," ",(0,a.jsx)("p",{style:{fontSize:"10px",color:"gray"},children:"/1M Tokens ($)"})]}),(0,a.jsx)(q.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:h?"Created At":(0,a.jsxs)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",style:{color:"#72bcd4"},children:[" ","✨ Created At"]})}),(0,a.jsx)(q.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:h?"Created By":(0,a.jsxs)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",style:{color:"#72bcd4"},children:[" ","✨ Created By"]})}),(0,a.jsx)(q.Z,{style:{maxWidth:"50px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:"Status"}),(0,a.jsx)(q.Z,{})]})}),(0,a.jsx)(L.Z,{children:d.data.filter(e=>"all"===eM||e.model_name===eM||null==eM||""===eM).map((e,l)=>{var t;return(0,a.jsxs)(z.Z,{style:{maxHeight:"1px",minHeight:"1px"},children:[(0,a.jsx)(U.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)("p",{className:"text-xs",children:e.model_name||"-"})}),(0,a.jsx)(U.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)("p",{className:"text-xs",children:e.provider||"-"})}),"Admin"===i&&(0,a.jsx)(U.Z,{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)(eu.Z,{title:e&&e.api_base,children:(0,a.jsx)("pre",{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word"},className:"text-xs",title:e&&e.api_base?e.api_base:"",children:e&&e.api_base?e.api_base.slice(0,20):"-"})})}),(0,a.jsx)(U.Z,{style:{maxWidth:"80px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)("pre",{className:"text-xs",children:e.input_cost?e.input_cost:null!=e.litellm_params.input_cost_per_token&&void 0!=e.litellm_params.input_cost_per_token?(1e6*Number(e.litellm_params.input_cost_per_token)).toFixed(2):null})}),(0,a.jsx)(U.Z,{style:{maxWidth:"80px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)("pre",{className:"text-xs",children:e.output_cost?e.output_cost:e.litellm_params.output_cost_per_token?(1e6*Number(e.litellm_params.output_cost_per_token)).toFixed(2):null})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)("p",{className:"text-xs",children:h&&((t=e.model_info.created_at)?new Date(t).toLocaleDateString("en-US"):null)||"-"})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)("p",{className:"text-xs",children:h&&e.model_info.created_by||"-"})}),(0,a.jsx)(U.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word"},children:e.model_info.db_model?(0,a.jsx)(R.Z,{size:"xs",className:"text-white",children:(0,a.jsx)("p",{className:"text-xs",children:"DB Model"})}):(0,a.jsx)(R.Z,{size:"xs",className:"text-black",children:(0,a.jsx)("p",{className:"text-xs",children:"Config Model"})})}),(0,a.jsx)(U.Z,{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsxs)(x.Z,{numItems:3,children:[(0,a.jsx)(eh.Z,{children:(0,a.jsx)(M.Z,{icon:T.Z,size:"sm",onClick:()=>lu(e)})}),(0,a.jsx)(eh.Z,{children:(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>lm(e)})}),(0,a.jsx)(eh.Z,{children:(0,a.jsx)(ef,{modelID:e.model_info.id,accessToken:s})})]})})]},l)})})]})})]}),(0,a.jsx)(e=>{let{visible:l,onCancel:s,model:t,onSubmit:n}=e,[r]=S.Z.useForm(),i={},o="",d="";if(t){i=t.litellm_params,o=t.model_name;let e=t.model_info;e&&(d=e.id,console.log("model_id: ".concat(d)),i.model_id=d)}return(0,a.jsx)(w.Z,{title:"Edit Model "+o,visible:l,width:800,footer:null,onOk:()=>{r.validateFields().then(e=>{n(e),r.resetFields()}).catch(e=>{console.error("Validation failed:",e)})},onCancel:s,children:(0,a.jsxs)(S.Z,{form:r,onFinish:lh,initialValues:i,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"api_base",name:"api_base",children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(S.Z.Item,{label:"organization",name:"organization",tooltip:"OpenAI Organization ID",children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(S.Z.Item,{label:"tpm",name:"tpm",tooltip:"int (optional) - Tokens limit for this deployment: in tokens per minute (tpm). Find this information on your model/providers website",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(S.Z.Item,{label:"rpm",name:"rpm",tooltip:"int (optional) - Rate limit for this deployment: in requests per minute (rpm). Find this information on your model/providers website",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(S.Z.Item,{label:"max_retries",name:"max_retries",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(S.Z.Item,{label:"timeout",name:"timeout",tooltip:"int (optional) - Timeout in seconds for LLM requests (Defaults to 600 seconds)",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(S.Z.Item,{label:"stream_timeout",name:"stream_timeout",tooltip:"int (optional) - Timeout for stream requests (seconds)",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(S.Z.Item,{label:"input_cost_per_token",name:"input_cost_per_token",tooltip:"float (optional) - Input cost per token",children:(0,a.jsx)(I.Z,{min:0,step:1e-4})}),(0,a.jsx)(S.Z.Item,{label:"output_cost_per_token",name:"output_cost_per_token",tooltip:"float (optional) - Output cost per token",children:(0,a.jsx)(I.Z,{min:0,step:1e-4})}),(0,a.jsx)(S.Z.Item,{label:"model_id",name:"model_id",hidden:!0})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})})},{visible:ee,onCancel:()=>{eb(!1),eO(null)},model:eE,onSubmit:lh}),(0,a.jsxs)(w.Z,{title:eE&&eE.model_name,visible:ev,width:800,footer:null,onCancel:()=>{eT(!1),eO(null)},children:[(0,a.jsx)(y.Z,{children:"Model Info"}),(0,a.jsx)(ew.Z,{language:"json",children:eE&&JSON.stringify(eE,null,2)})]})]}),(0,a.jsxs)(er.Z,{className:"h-full",children:[(0,a.jsx)(eN,{level:2,children:"Add new model"}),(0,a.jsx)(F.Z,{children:(0,a.jsxs)(S.Z,{form:f,onFinish:()=>{f.validateFields().then(e=>{eP(e,s,f)}).catch(e=>{console.error("Validation failed:",e)})},labelCol:{span:10},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Provider:",name:"custom_llm_provider",tooltip:"E.g. OpenAI, Azure OpenAI, Anthropic, Bedrock, etc.",labelCol:{span:10},labelAlign:"left",children:(0,a.jsx)(B.Z,{value:Y.toString(),children:W.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>{l_(e),J(e)},children:e},l))})}),(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Public Model Name",name:"model_name",tooltip:"Model name your users will pass in. Also used for load-balancing, LiteLLM will load balance between all models with this public name.",className:"mb-0",children:(0,a.jsx)(j.Z,{})}),(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsx)(_.Z,{className:"mb-3 mt-1",children:"Model name your users will pass in."})})]}),(0,a.jsxs)(S.Z.Item,{label:"LiteLLM Model Name(s)",tooltip:"Actual model name used for making litellm.completion() call.",className:"mb-0",children:[(0,a.jsx)(S.Z.Item,{name:"model",rules:[{required:!0,message:"Required"}],noStyle:!0,children:"Azure"===Y||"OpenAI-Compatible Endpoints (Groq, Together AI, Mistral AI, etc.)"===Y||"Ollama"===Y?(0,a.jsx)(j.Z,{placeholder:lk(Y.toString())}):P.length>0?(0,a.jsxs)(eo.Z,{children:[(0,a.jsx)(ed.Z,{value:"custom",children:"Custom Model Name (Enter below)"}),P.map((e,l)=>(0,a.jsx)(ed.Z,{value:e,children:e},l))]}):(0,a.jsx)(j.Z,{placeholder:lk(Y.toString())})}),(0,a.jsx)(S.Z.Item,{noStyle:!0,shouldUpdate:(e,l)=>e.model!==l.model,children:e=>{let{getFieldValue:l}=e;return(l("model")||[]).includes("custom")&&(0,a.jsx)(S.Z.Item,{name:"custom_model_name",rules:[{required:!0,message:"Please enter a custom model name"}],className:"mt-2",children:(0,a.jsx)(j.Z,{placeholder:"Enter custom model name"})})}})]}),(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsxs)(_.Z,{className:"mb-3 mt-1",children:["Actual model name used for making"," ",(0,a.jsx)(eI,{href:"https://docs.litellm.ai/docs/providers",target:"_blank",children:"litellm.completion() call"}),". We'll"," ",(0,a.jsx)(eI,{href:"https://docs.litellm.ai/docs/proxy/reliability#step-1---set-deployments-on-config",target:"_blank",children:"loadbalance"})," ","models with the same 'public name'"]})})]}),void 0!==l&&l.fields.length>0&&(0,a.jsx)(ek,{fields:l.fields,selectedProvider:l.name}),"Amazon Bedrock"!=Y&&"Vertex AI (Anthropic, Gemini, etc.)"!=Y&&"Ollama"!=Y&&(void 0===l||0==l.fields.length)&&(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"API Key",name:"api_key",children:(0,a.jsx)(j.Z,{placeholder:"sk-",type:"password"})}),"OpenAI"==Y&&(0,a.jsx)(S.Z.Item,{label:"Organization ID",name:"organization",children:(0,a.jsx)(j.Z,{placeholder:"[OPTIONAL] my-unique-org"})}),"Vertex AI (Anthropic, Gemini, etc.)"==Y&&(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Vertex Project",name:"vertex_project",children:(0,a.jsx)(j.Z,{placeholder:"adroit-cadet-1234.."})}),"Vertex AI (Anthropic, Gemini, etc.)"==Y&&(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Vertex Location",name:"vertex_location",children:(0,a.jsx)(j.Z,{placeholder:"us-east-1"})}),"Vertex AI (Anthropic, Gemini, etc.)"==Y&&(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Vertex Credentials",name:"vertex_credentials",className:"mb-0",children:(0,a.jsx)(ey.Z,{name:"file",accept:".json",beforeUpload:e=>{if("application/json"===e.type){let l=new FileReader;l.onload=e=>{if(e.target){let l=e.target.result;f.setFieldsValue({vertex_credentials:l})}},l.readAsText(e)}return!1},onChange(e){"uploading"!==e.file.status&&console.log(e.file,e.fileList),"done"===e.file.status?k.ZP.success("".concat(e.file.name," file uploaded successfully")):"error"===e.file.status&&k.ZP.error("".concat(e.file.name," file upload failed."))},children:(0,a.jsx)(A.ZP,{icon:(0,a.jsx)(e_.Z,{}),children:"Click to Upload"})})}),"Vertex AI (Anthropic, Gemini, etc.)"==Y&&(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsx)(_.Z,{className:"mb-3 mt-1",children:"Give litellm a gcp service account(.json file), so it can make the relevant calls"})})]}),("Azure"==Y||"OpenAI-Compatible Endpoints (Groq, Together AI, Mistral AI, etc.)"==Y)&&(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"API Base",name:"api_base",children:(0,a.jsx)(j.Z,{placeholder:"https://..."})}),"Azure"==Y&&(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"API Version",name:"api_version",children:(0,a.jsx)(j.Z,{placeholder:"2023-07-01-preview"})}),"Azure"==Y&&(0,a.jsxs)("div",{children:[(0,a.jsx)(S.Z.Item,{label:"Base Model",name:"base_model",className:"mb-0",children:(0,a.jsx)(j.Z,{placeholder:"azure/gpt-3.5-turbo"})}),(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsxs)(_.Z,{className:"mb-2",children:["The actual model your azure deployment uses. Used for accurate cost tracking. Select name from"," ",(0,a.jsx)(eI,{href:"https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json",target:"_blank",children:"here"})]})})]})]}),"Amazon Bedrock"==Y&&(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"AWS Access Key ID",name:"aws_access_key_id",tooltip:"You can provide the raw key or the environment variable (e.g. `os.environ/MY_SECRET_KEY`).",children:(0,a.jsx)(j.Z,{placeholder:""})}),"Amazon Bedrock"==Y&&(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"AWS Secret Access Key",name:"aws_secret_access_key",tooltip:"You can provide the raw key or the environment variable (e.g. `os.environ/MY_SECRET_KEY`).",children:(0,a.jsx)(j.Z,{placeholder:""})}),"Amazon Bedrock"==Y&&(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"AWS Region Name",name:"aws_region_name",tooltip:"You can provide the raw key or the environment variable (e.g. `os.environ/MY_SECRET_KEY`).",children:(0,a.jsx)(j.Z,{placeholder:"us-east-1"})}),(0,a.jsx)(S.Z.Item,{label:"LiteLLM Params",name:"litellm_extra_params",tooltip:"Optional litellm params used for making a litellm.completion() call.",className:"mb-0",children:(0,a.jsx)(ej.Z,{rows:4,placeholder:'{ "rpm": 100, "timeout": 0, "stream_timeout": 0 }'})}),(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsxs)(_.Z,{className:"mb-3 mt-1",children:["Pass JSON of litellm supported params"," ",(0,a.jsx)(eI,{href:"https://docs.litellm.ai/docs/completion/input",target:"_blank",children:"litellm.completion() call"})]})})]})]}),(0,a.jsx)("div",{style:{textAlign:"center",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add Model"})}),(0,a.jsx)(eu.Z,{title:"Get help on our github",children:(0,a.jsx)(Q.default.Link,{href:"https://github.com/BerriAI/litellm/issues",children:"Need Help?"})})]})})]}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(_.Z,{children:"`/health` will run a very small request through your models configured on litellm"}),(0,a.jsx)(p.Z,{onClick:ly,children:"Run `/health`"}),X&&(0,a.jsx)("pre",{children:JSON.stringify(X,null,2)})]})}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)(x.Z,{numItems:4,className:"mt-2 mb-2",children:[(0,a.jsxs)(eh.Z,{children:[(0,a.jsx)(_.Z,{children:"Select Time Range"}),(0,a.jsx)(es.Z,{enableSelect:!0,value:e4,className:"mr-2",onValueChange:e=>{e5(e),lb(eM,e.from,e.to)}})]}),(0,a.jsxs)(eh.Z,{className:"ml-2",children:[(0,a.jsx)(_.Z,{children:"Select Model Group"}),(0,a.jsx)(B.Z,{defaultValue:eM||eR[0],value:eM||eR[0],children:eR.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>lb(e,e4.from,e4.to),children:e},l))})]}),(0,a.jsx)(eh.Z,{children:(0,a.jsx)(ep.Z,{trigger:"click",content:lv,overlayStyle:{width:"20vw"},children:(0,a.jsx)(p.Z,{icon:eZ.Z,size:"md",variant:"secondary",className:"mt-4 ml-2",style:{border:"none"},onClick:()=>ln(!0)})})})]}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsx)(eh.Z,{children:(0,a.jsx)(F.Z,{className:"mr-2 max-h-[400px] min-h-[400px]",children:(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{variant:"line",defaultValue:"1",children:[(0,a.jsx)(et.Z,{value:"1",children:"Avg. Latency per Token"}),(0,a.jsx)(et.Z,{value:"2",children:"✨ Time to first token"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsxs)(er.Z,{children:[(0,a.jsx)("p",{className:"text-gray-500 italic",children:" (seconds/token)"}),(0,a.jsx)(_.Z,{className:"text-gray-500 italic mt-1 mb-1",children:"average Latency for successfull requests divided by the total tokens"}),eV&&ez&&(0,a.jsx)(ec.Z,{title:"Model Latency",className:"h-72",data:eV,showLegend:!1,index:"date",categories:ez,connectNulls:!0,customTooltip:lS})]}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(eS,{modelMetrics:eK,modelMetricsCategories:eH,customTooltip:lS,premiumUser:h})})]})]})})}),(0,a.jsx)(eh.Z,{children:(0,a.jsx)(F.Z,{className:"ml-2 max-h-[400px] min-h-[400px] overflow-y-auto",children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Deployment"}),(0,a.jsx)(q.Z,{children:"Success Responses"}),(0,a.jsxs)(q.Z,{children:["Slow Responses ",(0,a.jsx)("p",{children:"Success Responses taking 600+s"})]})]})}),(0,a.jsx)(L.Z,{children:e1.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.api_base}),(0,a.jsx)(U.Z,{children:e.total_count}),(0,a.jsx)(U.Z,{children:e.slow_count})]},l))})]})})})]}),(0,a.jsx)(x.Z,{numItems:1,className:"gap-2 w-full mt-2",children:(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(y.Z,{children:["All Exceptions for ",eM]}),(0,a.jsx)(em.Z,{className:"h-60",data:eY,index:"model",categories:eX,stack:!0,yAxisWidth:30})]})}),(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 w-full mt-2",children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(y.Z,{children:["All Up Rate Limit Errors (429) for ",eM]}),(0,a.jsxs)(x.Z,{numItems:1,children:[(0,a.jsxs)(eh.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Num Rate Limit Errors ",e7.sum_num_rate_limit_exceptions]}),(0,a.jsx)(em.Z,{className:"h-40",data:e7.daily_data,index:"date",colors:["rose"],categories:["num_rate_limit_exceptions"],onValueChange:e=>console.log(e)})]}),(0,a.jsx)(eh.Z,{})]})]}),h?(0,a.jsx)(a.Fragment,{children:ll.map((e,l)=>(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:e.api_base?e.api_base:"Unknown API Base"}),(0,a.jsx)(x.Z,{numItems:1,children:(0,a.jsxs)(eh.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Num Rate Limit Errors (429) ",e.sum_num_rate_limit_exceptions]}),(0,a.jsx)(em.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["rose"],categories:["num_rate_limit_exceptions"],onValueChange:e=>console.log(e)})]})})]},l))}):(0,a.jsx)(a.Fragment,{children:ll&&ll.length>0&&ll.slice(0,1).map((e,l)=>(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"✨ Rate Limit Errors by Deployment"}),(0,a.jsx)("p",{className:"mb-2 text-gray-500 italic text-[12px]",children:"Upgrade to see exceptions for all deployments"}),(0,a.jsx)(p.Z,{variant:"primary",className:"mb-2",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get Free Trial"})}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:e.api_base}),(0,a.jsx)(x.Z,{numItems:1,children:(0,a.jsxs)(eh.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Num Rate Limit Errors ",e.sum_num_rate_limit_exceptions]}),(0,a.jsx)(em.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["rose"],categories:["num_rate_limit_exceptions"],onValueChange:e=>console.log(e)})]})})]})]},l))})]})]}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)("div",{className:"flex items-center",children:[(0,a.jsx)(_.Z,{children:"Filter by Public Model Name"}),(0,a.jsx)(B.Z,{className:"mb-4 mt-2 ml-2 w-50",defaultValue:eM||eR[0],value:eM||eR[0],onValueChange:e=>eD(e),children:eR.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>eD(e),children:e},l))})]}),(0,a.jsxs)(y.Z,{children:["Retry Policy for ",eM]}),(0,a.jsx)(_.Z,{className:"mb-6",children:"How many retries should be attempted based on the Exception"}),eC&&(0,a.jsx)("table",{children:(0,a.jsx)("tbody",{children:Object.entries(eC).map((e,l)=>{var s;let[t,n]=e,r=null==e8?void 0:null===(s=e8[eM])||void 0===s?void 0:s[n];return null==r&&(r=e6),(0,a.jsxs)("tr",{className:"flex justify-between items-center mt-2",children:[(0,a.jsx)("td",{children:(0,a.jsx)(_.Z,{children:t})}),(0,a.jsx)("td",{children:(0,a.jsx)(I.Z,{className:"ml-5",value:r,min:0,step:1,onChange:e=>{e3(l=>{var s;let t=null!==(s=null==l?void 0:l[eM])&&void 0!==s?s:{};return{...null!=l?l:{},[eM]:{...t,[n]:e}}})}})})]},l)})})}),(0,a.jsx)(p.Z,{className:"mt-6 mr-8",onClick:lp,children:"Save"})]})]})]})})},eE=e=>{let{isInvitationLinkModalVisible:l,setIsInvitationLinkModalVisible:s,baseUrl:t,invitationLinkData:n}=e,{Title:r,Paragraph:i}=Q.default;return(0,a.jsxs)(w.Z,{title:"Invitation Link",visible:l,width:800,footer:null,onOk:()=>{s(!1)},onCancel:()=>{s(!1)},children:[(0,a.jsx)(i,{children:"Copy and send the generated link to onboard this user to the proxy."}),(0,a.jsxs)("div",{className:"flex justify-between pt-5 pb-2",children:[(0,a.jsx)(_.Z,{className:"text-base",children:"User ID"}),(0,a.jsx)(_.Z,{children:null==n?void 0:n.user_id})]}),(0,a.jsxs)("div",{className:"flex justify-between pt-5 pb-2",children:[(0,a.jsx)(_.Z,{children:"Invitation Link"}),(0,a.jsxs)(_.Z,{children:[t,"/ui?invitation_id=",null==n?void 0:n.id]})]}),(0,a.jsxs)("div",{className:"flex justify-end mt-5",children:[(0,a.jsx)("div",{}),(0,a.jsx)(b.CopyToClipboard,{text:"".concat(t,"/ui?invitation_id=").concat(null==n?void 0:n.id),onCopy:()=>k.ZP.success("Copied!"),children:(0,a.jsx)(p.Z,{variant:"primary",children:"Copy invitation link"})})]})]})};let{Option:eO}=v.default;var eR=e=>{let{userID:l,accessToken:s,teams:t,possibleUIRoles:n}=e,[o]=S.Z.useForm(),[d,c]=(0,r.useState)(!1),[m,h]=(0,r.useState)(null),[x,g]=(0,r.useState)([]),[Z,f]=(0,r.useState)(!1),[y,b]=(0,r.useState)(null),I=(0,i.useRouter)();console.log=function(){};let[C,P]=(0,r.useState)("");(0,r.useEffect)(()=>{(async()=>{try{let e=await (0,u.So)(s,l,"any"),t=[];for(let l=0;l{if(I){let{protocol:e,host:l}=window.location;P("".concat(e,"/").concat(l))}},[I]);let T=async e=>{try{var t;k.ZP.info("Making API Call"),c(!0),console.log("formValues in create user:",e);let n=await (0,u.Ov)(s,null,e);console.log("user create Response:",n),h(n.key);let a=(null===(t=n.data)||void 0===t?void 0:t.user_id)||n.user_id;(0,u.XO)(s,a).then(e=>{b(e),f(!0)}),k.ZP.success("API user Created"),o.resetFields(),localStorage.removeItem("userData"+l)}catch(e){console.error("Error creating the user:",e)}};return(0,a.jsxs)("div",{children:[(0,a.jsx)(p.Z,{className:"mx-auto mb-0",onClick:()=>c(!0),children:"+ Invite User"}),(0,a.jsxs)(w.Z,{title:"Invite User",visible:d,width:800,footer:null,onOk:()=>{c(!1),o.resetFields()},onCancel:()=>{c(!1),h(null),o.resetFields()},children:[(0,a.jsx)(_.Z,{className:"mb-1",children:"Create a User who can own keys"}),(0,a.jsxs)(S.Z,{form:o,onFinish:T,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsx)(S.Z.Item,{label:"User Email",name:"user_email",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(S.Z.Item,{label:"User Role",name:"user_role",children:(0,a.jsx)(v.default,{children:n&&Object.entries(n).map(e=>{let[l,{ui_label:s,description:t}]=e;return(0,a.jsx)(K.Z,{value:l,title:s,children:(0,a.jsxs)("div",{className:"flex",children:[s," ",(0,a.jsx)("p",{className:"ml-2",style:{color:"gray",fontSize:"12px"},children:t})]})},l)})})}),(0,a.jsx)(S.Z.Item,{label:"Team ID",name:"team_id",children:(0,a.jsx)(v.default,{placeholder:"Select Team ID",style:{width:"100%"},children:t?t.map(e=>(0,a.jsx)(eO,{value:e.team_id,children:e.team_alias},e.team_id)):(0,a.jsx)(eO,{value:null,children:"Default Team"},"default")})}),(0,a.jsx)(S.Z.Item,{label:"Metadata",name:"metadata",children:(0,a.jsx)(N.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Create User"})})]})]}),m&&(0,a.jsx)(eE,{isInvitationLinkModalVisible:Z,setIsInvitationLinkModalVisible:f,baseUrl:C,invitationLinkData:y})]})},eF=e=>{let{visible:l,possibleUIRoles:s,onCancel:t,user:n,onSubmit:i}=e,[o,d]=(0,r.useState)(n),[c]=S.Z.useForm();(0,r.useEffect)(()=>{c.resetFields()},[n]);let m=async()=>{c.resetFields(),t()},u=async e=>{i(e),c.resetFields(),t()};return n?(0,a.jsx)(w.Z,{visible:l,onCancel:m,footer:null,title:"Edit User "+n.user_id,width:1e3,children:(0,a.jsx)(S.Z,{form:c,onFinish:u,initialValues:n,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"User Email",tooltip:"Email of the User",name:"user_email",children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(S.Z.Item,{label:"user_id",name:"user_id",hidden:!0,children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(S.Z.Item,{label:"User Role",name:"user_role",children:(0,a.jsx)(v.default,{children:s&&Object.entries(s).map(e=>{let[l,{ui_label:s,description:t}]=e;return(0,a.jsx)(K.Z,{value:l,title:s,children:(0,a.jsxs)("div",{className:"flex",children:[s," ",(0,a.jsx)("p",{className:"ml-2",style:{color:"gray",fontSize:"12px"},children:t})]})},l)})})}),(0,a.jsx)(S.Z.Item,{label:"Spend (USD)",name:"spend",tooltip:"(float) - Spend of all LLM calls completed by this user",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(S.Z.Item,{label:"User Budget (USD)",name:"max_budget",tooltip:"(float) - Maximum budget of this user",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})})}):null};console.log=function(){};var eM=e=>{let{accessToken:l,token:s,keys:t,userRole:n,userID:i,teams:o,setKeys:d}=e,[c,m]=(0,r.useState)(null),[h,p]=(0,r.useState)(null),[j,g]=(0,r.useState)(0),[Z,f]=r.useState(null),[_,y]=(0,r.useState)(null),[b,v]=(0,r.useState)(!1),[S,w]=(0,r.useState)(null),[N,I]=(0,r.useState)({}),A=async()=>{w(null),v(!1)},C=async e=>{if(console.log("inside handleEditSubmit:",e),l&&s&&n&&i){try{await (0,u.pf)(l,e,null),k.ZP.success("User ".concat(e.user_id," updated successfully"))}catch(e){console.error("There was an error updating the user",e)}c&&m(c.map(l=>l.user_id===e.user_id?e:l)),w(null),v(!1)}};return((0,r.useEffect)(()=>{if(!l||!s||!n||!i)return;let e=async()=>{try{let e=await (0,u.Br)(l,null,n,!0,j,25);console.log("user data response:",e),m(e);let s=await (0,u.lg)(l);I(s)}catch(e){console.error("There was an error fetching the model data",e)}};l&&s&&n&&i&&e()},[l,s,n,i,j]),c&&l&&s&&n&&i)?(0,a.jsx)("div",{style:{width:"100%"},children:(0,a.jsxs)(x.Z,{className:"gap-2 p-2 h-[90vh] w-full mt-8",children:[(0,a.jsx)(eR,{userID:i,accessToken:l,teams:o,possibleUIRoles:N}),(0,a.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[90vh] mb-4",children:[(0,a.jsx)("div",{className:"mb-4 mt-1"}),(0,a.jsx)(en.Z,{children:(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsxs)(D.Z,{className:"mt-5",children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"User ID"}),(0,a.jsx)(q.Z,{children:"User Email"}),(0,a.jsx)(q.Z,{children:"Role"}),(0,a.jsx)(q.Z,{children:"User Spend ($ USD)"}),(0,a.jsx)(q.Z,{children:"User Max Budget ($ USD)"}),(0,a.jsx)(q.Z,{children:"API Keys"}),(0,a.jsx)(q.Z,{})]})}),(0,a.jsx)(L.Z,{children:c.map(e=>{var l,s;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.user_id||"-"}),(0,a.jsx)(U.Z,{children:e.user_email||"-"}),(0,a.jsx)(U.Z,{children:(null==N?void 0:null===(l=N[null==e?void 0:e.user_role])||void 0===l?void 0:l.ui_label)||"-"}),(0,a.jsx)(U.Z,{children:e.spend?null===(s=e.spend)||void 0===s?void 0:s.toFixed(2):"-"}),(0,a.jsx)(U.Z,{children:e.max_budget?e.max_budget:"Unlimited"}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(x.Z,{numItems:2,children:e&&e.key_aliases&&e.key_aliases.filter(e=>null!==e).length>0?(0,a.jsxs)(R.Z,{size:"xs",color:"indigo",children:[e.key_aliases.filter(e=>null!==e).length,"\xa0Keys"]}):(0,a.jsx)(R.Z,{size:"xs",color:"gray",children:"No Keys"})})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(M.Z,{icon:E.Z,onClick:()=>{w(e),v(!0)},children:"View Keys"})})]},e.user_id)})})]})}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)("div",{className:"flex items-center",children:[(0,a.jsx)("div",{className:"flex-1"}),(0,a.jsx)("div",{className:"flex-1 flex justify-between items-center"})]})})]})}),(0,a.jsx)(eF,{visible:b,possibleUIRoles:N,onCancel:A,user:S,onSubmit:C})]}),function(){if(!c)return null;let e=Math.ceil(c.length/25);return(0,a.jsxs)("div",{className:"flex justify-between items-center",children:[(0,a.jsxs)("div",{children:["Showing Page ",j+1," of ",e]}),(0,a.jsxs)("div",{className:"flex",children:[(0,a.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-l focus:outline-none",disabled:0===j,onClick:()=>g(j-1),children:"← Prev"}),(0,a.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-r focus:outline-none",onClick:()=>{g(j+1)},children:"Next →"})]})]})}()]})}):(0,a.jsx)("div",{children:"Loading..."})};console.log=function(){};var eD=e=>{let{teams:l,searchParams:s,accessToken:t,setTeams:n,userID:i,userRole:o}=e,[d]=S.Z.useForm(),[c]=S.Z.useForm(),{Title:m,Paragraph:g}=Q.default,[Z,f]=(0,r.useState)(""),[y,b]=(0,r.useState)(!1),[C,P]=(0,r.useState)(l?l[0]:null),[T,W]=(0,r.useState)(!1),[H,G]=(0,r.useState)(!1),[Y,J]=(0,r.useState)([]),[X,$]=(0,r.useState)(!1),[ee,el]=(0,r.useState)(null),[es,et]=(0,r.useState)({}),en=e=>{P(e),b(!0)},ea=async e=>{let s=e.team_id;if(console.log("handleEditSubmit:",e),null==t)return;let a=await (0,u.Gh)(t,e);l&&n(l.map(e=>e.team_id===s?a.data:e)),k.ZP.success("Team updated successfully"),b(!1),P(null)},er=async e=>{el(e),$(!0)},ei=async()=>{if(null!=ee&&null!=l&&null!=t){try{await (0,u.rs)(t,ee);let e=l.filter(e=>e.team_id!==ee);n(e)}catch(e){console.error("Error deleting the team:",e)}$(!1),el(null)}};(0,r.useEffect)(()=>{let e=async()=>{try{if(null===i||null===o||null===t||null===l)return;console.log("fetching team info:");let e={};for(let s=0;s<(null==l?void 0:l.length);s++){let n=l[s].team_id,a=await (0,u.Xm)(t,n);console.log("teamInfo response:",a),null!==a&&(e={...e,[n]:a})}et(e)}catch(e){console.error("Error fetching team info:",e)}};(async()=>{try{if(null===i||null===o)return;if(null!==t){let e=(await (0,u.So)(t,i,o)).data.map(e=>e.id);console.log("available_model_names:",e),J(e)}}catch(e){console.error("Error fetching user models:",e)}})(),e()},[t,i,o,l]);let eo=async e=>{try{if(null!=t){var s;let a=null==e?void 0:e.team_alias;if((null!==(s=null==l?void 0:l.map(e=>e.team_alias))&&void 0!==s?s:[]).includes(a))throw Error("Team alias ".concat(a," already exists, please pick another alias"));k.ZP.info("Creating Team");let r=await (0,u.hT)(t,e);null!==l?n([...l,r]):n([r]),console.log("response for team create call: ".concat(r)),k.ZP.success("Team created"),W(!1)}}catch(e){console.error("Error creating the team:",e),k.ZP.error("Error creating the team: "+e,20)}},ed=async e=>{try{if(null!=t&&null!=l){k.ZP.info("Adding Member");let s={role:"user",user_email:e.user_email,user_id:e.user_id},a=await (0,u.cu)(t,C.team_id,s);console.log("response for team create call: ".concat(a.data));let r=l.findIndex(e=>(console.log("team.team_id=".concat(e.team_id,"; response.data.team_id=").concat(a.data.team_id)),e.team_id===a.data.team_id));if(console.log("foundIndex: ".concat(r)),-1!==r){let e=[...l];e[r]=a.data,n(e),P(a.data)}G(!1)}}catch(e){console.error("Error creating the team:",e)}};return console.log("received teams ".concat(JSON.stringify(l))),(0,a.jsx)("div",{className:"w-full mx-4",children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 p-8 h-[75vh] w-full mt-2",children:[(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(m,{level:4,children:"All Teams"}),(0,a.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:[(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Team Name"}),(0,a.jsx)(q.Z,{children:"Spend (USD)"}),(0,a.jsx)(q.Z,{children:"Budget (USD)"}),(0,a.jsx)(q.Z,{children:"Models"}),(0,a.jsx)(q.Z,{children:"TPM / RPM Limits"}),(0,a.jsx)(q.Z,{children:"Info"})]})}),(0,a.jsx)(L.Z,{children:l&&l.length>0?l.map(e=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{style:{maxWidth:"4px",whiteSpace:"pre-wrap",overflow:"hidden"},children:e.team_alias}),(0,a.jsx)(U.Z,{style:{maxWidth:"4px",whiteSpace:"pre-wrap",overflow:"hidden"},children:e.spend}),(0,a.jsx)(U.Z,{style:{maxWidth:"4px",whiteSpace:"pre-wrap",overflow:"hidden"},children:null!==e.max_budget&&void 0!==e.max_budget?e.max_budget:"No limit"}),(0,a.jsx)(U.Z,{style:{maxWidth:"8-x",whiteSpace:"pre-wrap",overflow:"hidden"},children:Array.isArray(e.models)?(0,a.jsx)("div",{style:{display:"flex",flexDirection:"column"},children:0===e.models.length?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Proxy Models"})}):e.models.map((e,l)=>"all-proxy-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Proxy Models"})},l):(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"blue",children:(0,a.jsx)(_.Z,{children:e.length>30?"".concat(e.slice(0,30),"..."):e})},l))}):null}),(0,a.jsx)(U.Z,{style:{maxWidth:"4px",whiteSpace:"pre-wrap",overflow:"hidden"},children:(0,a.jsxs)(_.Z,{children:["TPM: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,a.jsx)("br",{}),"RPM:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,a.jsxs)(U.Z,{children:[(0,a.jsxs)(_.Z,{children:[es&&e.team_id&&es[e.team_id]&&es[e.team_id].keys&&es[e.team_id].keys.length," ","Keys"]}),(0,a.jsxs)(_.Z,{children:[es&&e.team_id&&es[e.team_id]&&es[e.team_id].team_info&&es[e.team_id].team_info.members_with_roles&&es[e.team_id].team_info.members_with_roles.length," ","Members"]})]}),(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>en(e)}),(0,a.jsx)(M.Z,{onClick:()=>er(e.team_id),icon:O.Z,size:"sm"})]})]},e.team_id)):null})]}),X&&(0,a.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,a.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,a.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,a.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,a.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:""}),(0,a.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,a.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,a.jsx)("div",{className:"sm:flex sm:items-start",children:(0,a.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,a.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Team"}),(0,a.jsx)("div",{className:"mt-2",children:(0,a.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this team ?"})})]})})}),(0,a.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,a.jsx)(p.Z,{onClick:ei,color:"red",className:"ml-2",children:"Delete"}),(0,a.jsx)(p.Z,{onClick:()=>{$(!1),el(null)},children:"Cancel"})]})]})]})})]})]}),(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(p.Z,{className:"mx-auto",onClick:()=>W(!0),children:"+ Create New Team"}),(0,a.jsx)(w.Z,{title:"Create Team",visible:T,width:800,footer:null,onOk:()=>{W(!1),d.resetFields()},onCancel:()=>{W(!1),d.resetFields()},children:(0,a.jsxs)(S.Z,{form:d,onFinish:eo,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{label:"Team Name",name:"team_alias",rules:[{required:!0,message:"Please input a team name"}],children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(S.Z.Item,{label:"Models",name:"models",children:(0,a.jsxs)(v.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:[(0,a.jsx)(v.default.Option,{value:"all-proxy-models",children:"All Proxy Models"},"all-proxy-models"),Y.map(e=>(0,a.jsx)(v.default.Option,{value:e,children:e},e))]})}),(0,a.jsx)(S.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})}),(0,a.jsx)(S.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(S.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,a.jsx)(I.Z,{step:1,width:400})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Create Team"})})]})})]}),(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(m,{level:4,children:"Team Members"}),(0,a.jsx)(g,{children:"If you belong to multiple teams, this setting controls which teams members you see."}),l&&l.length>0?(0,a.jsx)(B.Z,{defaultValue:"0",children:l.map((e,l)=>(0,a.jsx)(K.Z,{value:String(l),onClick:()=>{P(e)},children:e.team_alias},l))}):(0,a.jsxs)(g,{children:["No team created. ",(0,a.jsx)("b",{children:"Defaulting to personal account."})]})]}),(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Member Name"}),(0,a.jsx)(q.Z,{children:"Role"})]})}),(0,a.jsx)(L.Z,{children:C?C.members_with_roles.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,a.jsx)(U.Z,{children:e.role})]},l)):null})]})}),C&&(0,a.jsx)(e=>{let{visible:l,onCancel:s,team:t,onSubmit:n}=e,[r]=S.Z.useForm();return(0,a.jsx)(w.Z,{title:"Edit Team",visible:l,width:800,footer:null,onOk:()=>{r.validateFields().then(e=>{n({...e,team_id:t.team_id}),r.resetFields()}).catch(e=>{console.error("Validation failed:",e)})},onCancel:s,children:(0,a.jsxs)(S.Z,{form:r,onFinish:ea,initialValues:t,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{label:"Team Name",name:"team_alias",rules:[{required:!0,message:"Please input a team name"}],children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(S.Z.Item,{label:"Models",name:"models",children:(0,a.jsxs)(v.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:[(0,a.jsx)(v.default.Option,{value:"all-proxy-models",children:"All Proxy Models"},"all-proxy-models"),Y&&Y.map(e=>(0,a.jsx)(v.default.Option,{value:e,children:e},e))]})}),(0,a.jsx)(S.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})}),(0,a.jsx)(S.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(S.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(S.Z.Item,{label:"Requests per minute Limit (RPM)",name:"team_id",hidden:!0})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Edit Team"})})]})})},{visible:y,onCancel:()=>{b(!1),P(null)},team:C,onSubmit:ea})]}),(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(p.Z,{className:"mx-auto mb-5",onClick:()=>G(!0),children:"+ Add member"}),(0,a.jsx)(w.Z,{title:"Add member",visible:H,width:800,footer:null,onOk:()=>{G(!1),c.resetFields()},onCancel:()=>{G(!1),c.resetFields()},children:(0,a.jsxs)(S.Z,{form:d,onFinish:ed,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,a.jsx)(N.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,a.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,a.jsx)(S.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,a.jsx)(N.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})})},eL=e=>{let l,{searchParams:s,accessToken:t,showSSOBanner:n,premiumUser:o}=e,[d]=S.Z.useForm(),[c]=S.Z.useForm(),{Title:m,Paragraph:j}=Q.default,[g,Z]=(0,r.useState)(""),[f,y]=(0,r.useState)(null),[b,v]=(0,r.useState)(null),[I,C]=(0,r.useState)(!1),[P,T]=(0,r.useState)(!1),[O,R]=(0,r.useState)(!1),[W,H]=(0,r.useState)(!1),[G,Y]=(0,r.useState)(!1),[J,X]=(0,r.useState)(!1),[$,ee]=(0,r.useState)(!1),[el,es]=(0,r.useState)(!1),[et,en]=(0,r.useState)(!1),[ea,er]=(0,r.useState)([]),[ei,eo]=(0,r.useState)(null),ed=(0,i.useRouter)(),[ec,em]=(0,r.useState)(null);console.log=function(){};let[eu,eh]=(0,r.useState)(""),ex="All IP Addresses Allowed";try{l=window.location.origin}catch(e){l=""}l+="/fallback/login";let ep=async()=>{try{if(!0!==o){k.ZP.error("This feature is only available for premium users. Please upgrade your account.");return}if(t){let e=await (0,u.PT)(t);er(e&&e.length>0?e:[ex])}else er([ex])}catch(e){console.error("Error fetching allowed IPs:",e),k.ZP.error("Failed to fetch allowed IPs ".concat(e)),er([ex])}finally{!0===o&&ee(!0)}},ej=async e=>{try{if(t){await (0,u.eH)(t,e.ip);let l=await (0,u.PT)(t);er(l),k.ZP.success("IP address added successfully")}}catch(e){console.error("Error adding IP:",e),k.ZP.error("Failed to add IP address ".concat(e))}finally{es(!1)}},eg=async e=>{eo(e),en(!0)},eZ=async()=>{if(ei&&t)try{await (0,u.$I)(t,ei);let e=await (0,u.PT)(t);er(e.length>0?e:[ex]),k.ZP.success("IP address deleted successfully")}catch(e){console.error("Error deleting IP:",e),k.ZP.error("Failed to delete IP address ".concat(e))}finally{en(!1),eo(null)}},ef=()=>{X(!1)},e_=["proxy_admin","proxy_admin_viewer"];(0,r.useEffect)(()=>{if(ed){let{protocol:e,host:l}=window.location;eh("".concat(e,"//").concat(l))}},[ed]),(0,r.useEffect)(()=>{(async()=>{if(null!=t){let e=[],l=await (0,u.Xd)(t,"proxy_admin_viewer");l.forEach(l=>{e.push({user_role:l.user_role,user_id:l.user_id,user_email:l.user_email})}),console.log("proxy viewers: ".concat(l));let s=await (0,u.Xd)(t,"proxy_admin");s.forEach(l=>{e.push({user_role:l.user_role,user_id:l.user_id,user_email:l.user_email})}),console.log("proxy admins: ".concat(s)),console.log("combinedList: ".concat(e)),y(e),em(await (0,u.lg)(t))}})()},[t]);let ey=()=>{H(!1),c.resetFields(),d.resetFields()},ev=()=>{H(!1),c.resetFields(),d.resetFields()},eS=e=>(0,a.jsxs)(S.Z,{form:d,onFinish:e,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsx)(a.Fragment,{children:(0,a.jsx)(S.Z.Item,{label:"Email",name:"user_email",className:"mb-8 mt-4",children:(0,a.jsx)(N.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})})}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},className:"mt-4",children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add member"})})]}),ek=(e,l,s)=>(0,a.jsxs)(S.Z,{form:d,onFinish:e,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{rules:[{required:!0,message:"Required"}],label:"User Role",name:"user_role",labelCol:{span:10},labelAlign:"left",children:(0,a.jsx)(B.Z,{value:l,children:e_.map((e,l)=>(0,a.jsx)(K.Z,{value:e,children:e},l))})}),(0,a.jsx)(S.Z.Item,{label:"Team ID",name:"user_id",hidden:!0,initialValue:s,valuePropName:"user_id",className:"mt-8",children:(0,a.jsx)(N.Z,{value:s,disabled:!0})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Update role"})})]}),ew=async e=>{try{if(null!=t&&null!=f){k.ZP.info("Making API Call");let l=await (0,u.pf)(t,e,null);console.log("response for team create call: ".concat(l));let s=f.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(l.user_id)),e.user_id===l.user_id));console.log("foundIndex: ".concat(s)),-1==s&&(console.log("updates admin with new user"),f.push(l),y(f)),k.ZP.success("Refresh tab to see updated user role"),H(!1)}}catch(e){console.error("Error creating the key:",e)}},eN=async e=>{try{if(null!=t&&null!=f){var l;k.ZP.info("Making API Call");let s=await (0,u.pf)(t,e,"proxy_admin_viewer");console.log("response for team create call: ".concat(s));let n=(null===(l=s.data)||void 0===l?void 0:l.user_id)||s.user_id;(0,u.XO)(t,n).then(e=>{v(e),C(!0)});let a=f.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(s.user_id)),e.user_id===s.user_id));console.log("foundIndex: ".concat(a)),-1==a&&(console.log("updates admin with new user"),f.push(s),y(f)),d.resetFields(),T(!1)}}catch(e){console.error("Error creating the key:",e)}},eI=async e=>{try{if(null!=t&&null!=f){var l;k.ZP.info("Making API Call"),e.user_email,e.user_id;let s=await (0,u.pf)(t,e,"proxy_admin"),n=(null===(l=s.data)||void 0===l?void 0:l.user_id)||s.user_id;(0,u.XO)(t,n).then(e=>{v(e),C(!0)}),console.log("response for team create call: ".concat(s));let a=f.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(n)),e.user_id===s.user_id));console.log("foundIndex: ".concat(a)),-1==a&&(console.log("updates admin with new user"),f.push(s),y(f)),d.resetFields(),R(!1)}}catch(e){console.error("Error creating the key:",e)}},eA=async e=>{if(null==t)return;let l={environment_variables:{PROXY_BASE_URL:e.proxy_base_url,GOOGLE_CLIENT_ID:e.google_client_id,GOOGLE_CLIENT_SECRET:e.google_client_secret}};(0,u.K_)(t,l)};return console.log("admins: ".concat(null==f?void 0:f.length)),(0,a.jsxs)("div",{className:"w-full m-2 mt-2 p-8",children:[(0,a.jsx)(m,{level:4,children:"Admin Access "}),(0,a.jsxs)(j,{children:[n&&(0,a.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access",children:"Requires SSO Setup"}),(0,a.jsx)("br",{}),(0,a.jsx)("b",{children:"Proxy Admin: "})," Can create keys, teams, users, add models, etc."," ",(0,a.jsx)("br",{}),(0,a.jsx)("b",{children:"Proxy Admin Viewer: "}),"Can just view spend. They cannot create keys, teams or grant users access to new models."," "]}),(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 p-2 w-full",children:[(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Member Name"}),(0,a.jsx)(q.Z,{children:"Role"})]})}),(0,a.jsx)(L.Z,{children:f?f.map((e,l)=>{var s;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,a.jsxs)(U.Z,{children:[" ",(null==ec?void 0:null===(s=ec[null==e?void 0:e.user_role])||void 0===s?void 0:s.ui_label)||"-"]}),(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>H(!0)}),(0,a.jsx)(w.Z,{title:"Update role",visible:W,width:800,footer:null,onOk:ey,onCancel:ev,children:ek(ew,e.user_role,e.user_id)})]})]},l)}):null})]})})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)("div",{className:"flex justify-start",children:[(0,a.jsx)(p.Z,{className:"mr-4 mb-5",onClick:()=>R(!0),children:"+ Add admin"}),(0,a.jsx)(w.Z,{title:"Add admin",visible:O,width:800,footer:null,onOk:()=>{R(!1),c.resetFields(),d.resetFields()},onCancel:()=>{R(!1),C(!1),c.resetFields(),d.resetFields()},children:eS(eI)}),(0,a.jsx)(eE,{isInvitationLinkModalVisible:I,setIsInvitationLinkModalVisible:C,baseUrl:eu,invitationLinkData:b}),(0,a.jsx)(p.Z,{className:"mb-5",onClick:()=>T(!0),children:"+ Add viewer"}),(0,a.jsx)(w.Z,{title:"Add viewer",visible:P,width:800,footer:null,onOk:()=>{T(!1),c.resetFields(),d.resetFields()},onCancel:()=>{T(!1),c.resetFields(),d.resetFields()},children:eS(eN)})]})})]}),(0,a.jsxs)(x.Z,{children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(m,{level:4,children:" ✨ Security Settings"}),(0,a.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"1rem",marginTop:"1rem"},children:[(0,a.jsx)("div",{children:(0,a.jsx)(p.Z,{onClick:()=>!0===o?Y(!0):k.ZP.error("Only premium users can add SSO"),children:"Add SSO"})}),(0,a.jsx)("div",{children:(0,a.jsx)(p.Z,{onClick:ep,children:"Allowed IPs"})})]})]}),(0,a.jsxs)("div",{className:"flex justify-start mb-4",children:[(0,a.jsx)(w.Z,{title:"Add SSO",visible:G,width:800,footer:null,onOk:()=>{Y(!1),d.resetFields()},onCancel:()=>{Y(!1),d.resetFields()},children:(0,a.jsxs)(S.Z,{form:d,onFinish:e=>{eI(e),eA(e),Y(!1),X(!0)},labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{label:"Admin Email",name:"user_email",rules:[{required:!0,message:"Please enter the email of the proxy admin"}],children:(0,a.jsx)(N.Z,{})}),(0,a.jsx)(S.Z.Item,{label:"PROXY BASE URL",name:"proxy_base_url",rules:[{required:!0,message:"Please enter the proxy base url"}],children:(0,a.jsx)(N.Z,{})}),(0,a.jsx)(S.Z.Item,{label:"GOOGLE CLIENT ID",name:"google_client_id",rules:[{required:!0,message:"Please enter the google client id"}],children:(0,a.jsx)(N.Z.Password,{})}),(0,a.jsx)(S.Z.Item,{label:"GOOGLE CLIENT SECRET",name:"google_client_secret",rules:[{required:!0,message:"Please enter the google client secret"}],children:(0,a.jsx)(N.Z.Password,{})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})}),(0,a.jsxs)(w.Z,{title:"SSO Setup Instructions",visible:J,width:800,footer:null,onOk:ef,onCancel:()=>{X(!1)},children:[(0,a.jsx)("p",{children:"Follow these steps to complete the SSO setup:"}),(0,a.jsx)(_.Z,{className:"mt-2",children:"1. DO NOT Exit this TAB"}),(0,a.jsx)(_.Z,{className:"mt-2",children:"2. Open a new tab, visit your proxy base url"}),(0,a.jsx)(_.Z,{className:"mt-2",children:"3. Confirm your SSO is configured correctly and you can login on the new Tab"}),(0,a.jsx)(_.Z,{className:"mt-2",children:"4. If Step 3 is successful, you can close this tab"}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{onClick:ef,children:"Done"})})]}),(0,a.jsx)(w.Z,{title:"Manage Allowed IP Addresses",width:800,visible:$,onCancel:()=>ee(!1),footer:[(0,a.jsx)(p.Z,{className:"mx-1",onClick:()=>es(!0),children:"Add IP Address"},"add"),(0,a.jsx)(p.Z,{onClick:()=>ee(!1),children:"Close"},"close")],children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"IP Address"}),(0,a.jsx)(q.Z,{className:"text-right",children:"Action"})]})}),(0,a.jsx)(L.Z,{children:ea.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e}),(0,a.jsx)(U.Z,{className:"text-right",children:e!==ex&&(0,a.jsx)(p.Z,{onClick:()=>eg(e),color:"red",size:"xs",children:"Delete"})})]},l))})]})}),(0,a.jsx)(w.Z,{title:"Add Allowed IP Address",visible:el,onCancel:()=>es(!1),footer:null,children:(0,a.jsxs)(S.Z,{onFinish:ej,children:[(0,a.jsx)(S.Z.Item,{name:"ip",rules:[{required:!0,message:"Please enter an IP address"}],children:(0,a.jsx)(N.Z,{placeholder:"Enter IP address"})}),(0,a.jsx)(S.Z.Item,{children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add IP Address"})})]})}),(0,a.jsx)(w.Z,{title:"Confirm Delete",visible:et,onCancel:()=>en(!1),onOk:eZ,footer:[(0,a.jsx)(p.Z,{className:"mx-1",onClick:()=>eZ(),children:"Yes"},"delete"),(0,a.jsx)(p.Z,{onClick:()=>en(!1),children:"Close"},"close")],children:(0,a.jsxs)("p",{children:["Are you sure you want to delete the IP address: ",ei,"?"]})})]}),(0,a.jsxs)(eb.Z,{title:"Login without SSO",color:"teal",children:["If you need to login without sso, you can access"," ",(0,a.jsxs)("a",{href:l,target:"_blank",children:[(0,a.jsx)("b",{children:l})," "]})]})]})]})},eU=s(42556),eV=s(90252),eq=e=>{let{alertingSettings:l,handleInputChange:s,handleResetField:t,handleSubmit:n,premiumUser:r}=e,[i]=S.Z.useForm();return(0,a.jsxs)(S.Z,{form:i,onFinish:()=>{let e=i.getFieldsValue();Object.values(e).some(e=>""===e||null==e)?console.log("Some form fields are empty."):n(e)},labelAlign:"left",children:[l.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsxs)(U.Z,{align:"center",children:[(0,a.jsx)(_.Z,{children:e.field_name}),(0,a.jsx)("p",{style:{fontSize:"0.65rem",color:"#808080",fontStyle:"italic"},className:"mt-1",children:e.field_description})]}),e.premium_field?r?(0,a.jsx)(S.Z.Item,{name:e.field_name,children:(0,a.jsx)(U.Z,{children:"Integer"===e.field_type?(0,a.jsx)(I.Z,{step:1,value:e.field_value,onChange:l=>s(e.field_name,l)}):(0,a.jsx)(N.Z,{value:e.field_value,onChange:l=>s(e.field_name,l)})})}):(0,a.jsx)(U.Z,{children:(0,a.jsx)(p.Z,{className:"flex items-center justify-center",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"✨ Enterprise Feature"})})}):(0,a.jsx)(S.Z.Item,{name:e.field_name,className:"mb-0",children:(0,a.jsx)(U.Z,{children:"Integer"===e.field_type?(0,a.jsx)(I.Z,{step:1,value:e.field_value,onChange:l=>s(e.field_name,l),className:"p-0"}):(0,a.jsx)(N.Z,{value:e.field_value,onChange:l=>s(e.field_name,l)})})}),(0,a.jsx)(U.Z,{children:!0==e.stored_in_db?(0,a.jsx)(R.Z,{icon:eV.Z,className:"text-white",children:"In DB"}):!1==e.stored_in_db?(0,a.jsx)(R.Z,{className:"text-gray bg-white outline",children:"In Config"}):(0,a.jsx)(R.Z,{className:"text-gray bg-white outline",children:"Not Set"})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(M.Z,{icon:O.Z,color:"red",onClick:()=>t(e.field_name,l),children:"Reset"})})]},l)),(0,a.jsx)("div",{children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Update Settings"})})]})},ez=e=>{let{accessToken:l,premiumUser:s}=e,[t,n]=(0,r.useState)([]);return console.log("INSIDE ALERTING SETTINGS"),(0,r.useEffect)(()=>{l&&(0,u.RQ)(l).then(e=>{n(e)})},[l]),(0,a.jsx)(eq,{alertingSettings:t,handleInputChange:(e,l)=>{n(t.map(s=>s.field_name===e?{...s,field_value:l}:s))},handleResetField:(e,s)=>{if(l)try{let l=t.map(l=>l.field_name===e?{...l,stored_in_db:null,field_value:l.field_default_value}:l);console.log("INSIDE HANDLE RESET FIELD"),n(l)}catch(e){console.log("ERROR OCCURRED!")}},handleSubmit:e=>{if(!l||null==e||void 0==e)return;let s={};t.forEach(e=>{s[e.field_name]=e.field_value});let n={...e,...s};try{(0,u.jA)(l,"alerting_args",n),k.ZP.success("Wait 10s for proxy to update.")}catch(e){}},premiumUser:s})},eB=s(84406);let{Title:eK,Paragraph:eW}=Q.default;console.log=function(){};var eH=e=>{let{accessToken:l,userRole:s,userID:t,premiumUser:n}=e,[i,o]=(0,r.useState)([]),[d,c]=(0,r.useState)([]),[m,h]=(0,r.useState)(!1),[g]=S.Z.useForm(),[Z,f]=(0,r.useState)(null),[y,b]=(0,r.useState)([]),[N,I]=(0,r.useState)(""),[C,P]=(0,r.useState)({}),[T,O]=(0,r.useState)([]),[R,B]=(0,r.useState)(!1),[W,H]=(0,r.useState)([]),[G,Y]=(0,r.useState)(null),[J,X]=(0,r.useState)([]),[$,Q]=(0,r.useState)(!1),[ee,el]=(0,r.useState)(null),es=e=>{T.includes(e)?O(T.filter(l=>l!==e)):O([...T,e])},eo={llm_exceptions:"LLM Exceptions",llm_too_slow:"LLM Responses Too Slow",llm_requests_hanging:"LLM Requests Hanging",budget_alerts:"Budget Alerts (API Keys, Users)",db_exceptions:"Database Exceptions (Read/Write)",daily_reports:"Weekly/Monthly Spend Reports",outage_alerts:"Outage Alerts",region_outage_alerts:"Region Outage Alerts"};(0,r.useEffect)(()=>{l&&s&&t&&(0,u.BL)(l,t,s).then(e=>{console.log("callbacks",e),o(e.callbacks),H(e.available_callbacks);let l=e.alerts;if(console.log("alerts_data",l),l&&l.length>0){let e=l[0];console.log("_alert_info",e);let s=e.variables.SLACK_WEBHOOK_URL;console.log("catch_all_webhook",s),O(e.active_alerts),I(s),P(e.alerts_to_webhook)}c(l)})},[l,s,t]);let ed=e=>T&&T.includes(e),ec=()=>{if(!l)return;let e={};d.filter(e=>"email"===e.name).forEach(l=>{var s;Object.entries(null!==(s=l.variables)&&void 0!==s?s:{}).forEach(l=>{let[s,t]=l,n=document.querySelector('input[name="'.concat(s,'"]'));n&&n.value&&(e[s]=null==n?void 0:n.value)})}),console.log("updatedVariables",e);try{(0,u.K_)(l,{general_settings:{alerting:["email"]},environment_variables:e})}catch(e){k.ZP.error("Failed to update alerts: "+e,20)}k.ZP.success("Email settings updated successfully")},em=async e=>{if(!l)return;let s={};Object.entries(e).forEach(e=>{let[l,t]=e;"callback"!==l&&(s[l]=t)});try{await (0,u.K_)(l,{environment_variables:s}),k.ZP.success("Callback added successfully"),h(!1),g.resetFields(),f(null)}catch(e){k.ZP.error("Failed to add callback: "+e,20)}},eu=async e=>{if(!l)return;let s=null==e?void 0:e.callback,t={};Object.entries(e).forEach(e=>{let[l,s]=e;"callback"!==l&&(t[l]=s)});try{await (0,u.K_)(l,{environment_variables:t,litellm_settings:{success_callback:[s]}}),k.ZP.success("Callback ".concat(s," added successfully")),h(!1),g.resetFields(),f(null)}catch(e){k.ZP.error("Failed to add callback: "+e,20)}},eh=e=>{console.log("inside handleSelectedCallbackChange",e),f(e.litellm_callback_name),console.log("all callbacks",W),e&&e.litellm_callback_params?(X(e.litellm_callback_params),console.log("selectedCallbackParams",J)):X([])};return l?(console.log("callbacks: ".concat(i)),(0,a.jsxs)("div",{className:"w-full mx-4",children:[(0,a.jsx)(x.Z,{numItems:1,className:"gap-2 p-8 w-full mt-2",children:(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{variant:"line",defaultValue:"1",children:[(0,a.jsx)(et.Z,{value:"1",children:"Logging Callbacks"}),(0,a.jsx)(et.Z,{value:"2",children:"Alerting Types"}),(0,a.jsx)(et.Z,{value:"3",children:"Alerting Settings"}),(0,a.jsx)(et.Z,{value:"4",children:"Email Alerts"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsxs)(er.Z,{children:[(0,a.jsx)(eK,{level:4,children:"Active Logging Callbacks"}),(0,a.jsx)(x.Z,{numItems:2,children:(0,a.jsx)(F.Z,{className:"max-h-[50vh]",children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsx)(z.Z,{children:(0,a.jsx)(q.Z,{children:"Callback Name"})})}),(0,a.jsx)(L.Z,{children:i.map((e,s)=>(0,a.jsxs)(z.Z,{className:"flex justify-between",children:[(0,a.jsx)(U.Z,{children:(0,a.jsx)(_.Z,{children:e.name})}),(0,a.jsx)(U.Z,{children:(0,a.jsxs)(x.Z,{numItems:2,className:"flex justify-between",children:[(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>{el(e),Q(!0)}}),(0,a.jsx)(p.Z,{onClick:()=>(0,u.jE)(l,e.name),className:"ml-2",variant:"secondary",children:"Test Callback"})]})})]},s))})]})})}),(0,a.jsx)(p.Z,{className:"mt-2",onClick:()=>B(!0),children:"Add Callback"})]}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(_.Z,{className:"my-2",children:["Alerts are only supported for Slack Webhook URLs. Get your webhook urls from"," ",(0,a.jsx)("a",{href:"https://api.slack.com/messaging/webhooks",target:"_blank",style:{color:"blue"},children:"here"})]}),(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{}),(0,a.jsx)(q.Z,{}),(0,a.jsx)(q.Z,{children:"Slack Webhook URL"})]})}),(0,a.jsx)(L.Z,{children:Object.entries(eo).map((e,l)=>{let[s,t]=e;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:"region_outage_alerts"==s?n?(0,a.jsx)(eU.Z,{id:"switch",name:"switch",checked:ed(s),onChange:()=>es(s)}):(0,a.jsx)(p.Z,{className:"flex items-center justify-center",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"✨ Enterprise Feature"})}):(0,a.jsx)(eU.Z,{id:"switch",name:"switch",checked:ed(s),onChange:()=>es(s)})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(_.Z,{children:t})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(j.Z,{name:s,type:"password",defaultValue:C&&C[s]?C[s]:N})})]},l)})})]}),(0,a.jsx)(p.Z,{size:"xs",className:"mt-2",onClick:()=>{if(!l)return;let e={};Object.entries(eo).forEach(l=>{let[s,t]=l,n=document.querySelector('input[name="'.concat(s,'"]'));console.log("key",s),console.log("webhookInput",n);let a=(null==n?void 0:n.value)||"";console.log("newWebhookValue",a),e[s]=a}),console.log("updatedAlertToWebhooks",e);let s={general_settings:{alert_to_webhook_url:e,alert_types:T}};console.log("payload",s);try{(0,u.K_)(l,s)}catch(e){k.ZP.error("Failed to update alerts: "+e,20)}k.ZP.success("Alerts updated successfully")},children:"Save Changes"}),(0,a.jsx)(p.Z,{onClick:()=>(0,u.jE)(l,"slack"),className:"mx-2",children:"Test Alerts"})]})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ez,{accessToken:l,premiumUser:n})}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(eK,{level:4,children:"Email Settings"}),(0,a.jsxs)(_.Z,{children:[(0,a.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/email",target:"_blank",style:{color:"blue"},children:" LiteLLM Docs: email alerts"})," ",(0,a.jsx)("br",{})]}),(0,a.jsx)("div",{className:"flex w-full",children:d.filter(e=>"email"===e.name).map((e,l)=>{var s;return(0,a.jsx)(U.Z,{children:(0,a.jsx)("ul",{children:(0,a.jsx)(x.Z,{numItems:2,children:Object.entries(null!==(s=e.variables)&&void 0!==s?s:{}).map(e=>{let[l,s]=e;return(0,a.jsxs)("li",{className:"mx-2 my-2",children:[!0!=n&&("EMAIL_LOGO_URL"===l||"EMAIL_SUPPORT_CONTACT"===l)?(0,a.jsxs)("div",{children:[(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:(0,a.jsxs)(_.Z,{className:"mt-2",children:[" ","✨ ",l]})}),(0,a.jsx)(j.Z,{name:l,defaultValue:s,type:"password",disabled:!0,style:{width:"400px"}})]}):(0,a.jsxs)("div",{children:[(0,a.jsx)(_.Z,{className:"mt-2",children:l}),(0,a.jsx)(j.Z,{name:l,defaultValue:s,type:"password",style:{width:"400px"}})]}),(0,a.jsxs)("p",{style:{fontSize:"small",fontStyle:"italic"},children:["SMTP_HOST"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Enter the SMTP host address, e.g. `smtp.resend.com`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"SMTP_PORT"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Enter the SMTP port number, e.g. `587`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"SMTP_USERNAME"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Enter the SMTP username, e.g. `username`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"SMTP_PASSWORD"===l&&(0,a.jsx)("span",{style:{color:"red"},children:" Required * "}),"SMTP_SENDER_EMAIL"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Enter the sender email address, e.g. `sender@berri.ai`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"TEST_EMAIL_ADDRESS"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Email Address to send `Test Email Alert` to. example: `info@berri.ai`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"EMAIL_LOGO_URL"===l&&(0,a.jsx)("div",{style:{color:"gray"},children:"(Optional) Customize the Logo that appears in the email, pass a url to your logo"}),"EMAIL_SUPPORT_CONTACT"===l&&(0,a.jsx)("div",{style:{color:"gray"},children:"(Optional) Customize the support email address that appears in the email. Default is support@berri.ai"})]})]},l)})})})},l)})}),(0,a.jsx)(p.Z,{className:"mt-2",onClick:()=>ec(),children:"Save Changes"}),(0,a.jsx)(p.Z,{onClick:()=>(0,u.jE)(l,"email"),className:"mx-2",children:"Test Email Alerts"})]})})]})]})}),(0,a.jsxs)(w.Z,{title:"Add Logging Callback",visible:R,width:800,onCancel:()=>B(!1),footer:null,children:[(0,a.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/logging",className:"mb-8 mt-4",target:"_blank",style:{color:"blue"},children:" LiteLLM Docs: Logging"}),(0,a.jsx)(S.Z,{form:g,onFinish:eu,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(eB.Z,{label:"Callback",name:"callback",rules:[{required:!0,message:"Please select a callback"}],children:(0,a.jsx)(v.default,{onChange:e=>{let l=W[e];l&&(console.log(l.ui_callback_name),eh(l))},children:W&&Object.values(W).map(e=>(0,a.jsx)(K.Z,{value:e.litellm_callback_name,children:e.ui_callback_name},e.litellm_callback_name))})}),J&&J.map(e=>(0,a.jsx)(eB.Z,{label:e,name:e,rules:[{required:!0,message:"Please enter the value for "+e}],children:(0,a.jsx)(j.Z,{type:"password"})},e)),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})})]}),(0,a.jsx)(w.Z,{visible:$,width:800,title:"Edit ".concat(null==ee?void 0:ee.name," Settings"),onCancel:()=>Q(!1),footer:null,children:(0,a.jsxs)(S.Z,{form:g,onFinish:em,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsx)(a.Fragment,{children:ee&&ee.variables&&Object.entries(ee.variables).map(e=>{let[l,s]=e;return(0,a.jsx)(eB.Z,{label:l,name:l,children:(0,a.jsx)(j.Z,{type:"password",defaultValue:s})},l)})}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})})]})):null};let{Option:eG}=v.default;var eY=e=>{let{models:l,accessToken:s,routerSettings:t,setRouterSettings:n}=e,[i]=S.Z.useForm(),[o,d]=(0,r.useState)(!1),[c,m]=(0,r.useState)("");return(0,a.jsxs)("div",{children:[(0,a.jsx)(p.Z,{className:"mx-auto",onClick:()=>d(!0),children:"+ Add Fallbacks"}),(0,a.jsx)(w.Z,{title:"Add Fallbacks",visible:o,width:800,footer:null,onOk:()=>{d(!1),i.resetFields()},onCancel:()=>{d(!1),i.resetFields()},children:(0,a.jsxs)(S.Z,{form:i,onFinish:e=>{console.log(e);let{model_name:l,models:a}=e,r=[...t.fallbacks||[],{[l]:a}],o={...t,fallbacks:r};console.log(o);try{(0,u.K_)(s,{router_settings:o}),n(o)}catch(e){k.ZP.error("Failed to update router settings: "+e,20)}k.ZP.success("router settings updated successfully"),d(!1),i.resetFields()},labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{label:"Public Model Name",name:"model_name",rules:[{required:!0,message:"Set the model to fallback for"}],help:"required",children:(0,a.jsx)(B.Z,{defaultValue:c,children:l&&l.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>m(e),children:e},l))})}),(0,a.jsx)(S.Z.Item,{label:"Fallback Models",name:"models",rules:[{required:!0,message:"Please select a model"}],help:"required",children:(0,a.jsx)(eo.Z,{value:l,children:l&&l.filter(e=>e!=c).map(e=>(0,a.jsx)(ed.Z,{value:e,children:e},e))})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add Fallbacks"})})]})})]})},eJ=s(12968);async function eX(e,l){console.log=function(){},console.log("isLocal:",!1);let s=window.location.origin,t=new eJ.ZP.OpenAI({apiKey:l,baseURL:s,dangerouslyAllowBrowser:!0});try{let l=await t.chat.completions.create({model:e,messages:[{role:"user",content:"Hi, this is a test message"}],mock_testing_fallbacks:!0});k.ZP.success((0,a.jsxs)("span",{children:["Test model=",(0,a.jsx)("strong",{children:e}),", received model=",(0,a.jsx)("strong",{children:l.model}),". See"," ",(0,a.jsx)("a",{href:"#",onClick:()=>window.open("https://docs.litellm.ai/docs/proxy/reliability","_blank"),style:{textDecoration:"underline",color:"blue"},children:"curl"})]}))}catch(e){k.ZP.error("Error occurred while generating model response. Please try again. Error: ".concat(e),20)}}let e$={ttl:3600,lowest_latency_buffer:0},eQ=e=>{let{selectedStrategy:l,strategyArgs:s,paramExplanation:t}=e;return(0,a.jsxs)(g.Z,{children:[(0,a.jsx)(f.Z,{className:"text-sm font-medium text-tremor-content-strong dark:text-dark-tremor-content-strong",children:"Routing Strategy Specific Args"}),(0,a.jsx)(Z.Z,{children:"latency-based-routing"==l?(0,a.jsx)(F.Z,{children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Setting"}),(0,a.jsx)(q.Z,{children:"Value"})]})}),(0,a.jsx)(L.Z,{children:Object.entries(s).map(e=>{let[l,s]=e;return(0,a.jsxs)(z.Z,{children:[(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(_.Z,{children:l}),(0,a.jsx)("p",{style:{fontSize:"0.65rem",color:"#808080",fontStyle:"italic"},className:"mt-1",children:t[l]})]}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(j.Z,{name:l,defaultValue:"object"==typeof s?JSON.stringify(s,null,2):s.toString()})})]},l)})})]})}):(0,a.jsx)(_.Z,{children:"No specific settings"})})]})};var e0=e=>{let{accessToken:l,userRole:s,userID:t,modelData:n}=e,[i,o]=(0,r.useState)({}),[d,c]=(0,r.useState)({}),[m,g]=(0,r.useState)([]),[Z,f]=(0,r.useState)(!1),[b]=S.Z.useForm(),[v,w]=(0,r.useState)(null),[N,A]=(0,r.useState)(null),[C,P]=(0,r.useState)(null),T={routing_strategy_args:"(dict) Arguments to pass to the routing strategy",routing_strategy:"(string) Routing strategy to use",allowed_fails:"(int) Number of times a deployment can fail before being added to cooldown",cooldown_time:"(int) time in seconds to cooldown a deployment after failure",num_retries:"(int) Number of retries for failed requests. Defaults to 0.",timeout:"(float) Timeout for requests. Defaults to None.",retry_after:"(int) Minimum time to wait before retrying a failed request",ttl:"(int) Sliding window to look back over when calculating the average latency of a deployment. Default - 1 hour (in seconds).",lowest_latency_buffer:"(float) Shuffle between deployments within this % of the lowest latency. Default - 0 (i.e. always pick lowest latency)."};(0,r.useEffect)(()=>{l&&s&&t&&((0,u.BL)(l,t,s).then(e=>{console.log("callbacks",e);let l=e.router_settings;"model_group_retry_policy"in l&&delete l.model_group_retry_policy,o(l)}),(0,u.YU)(l).then(e=>{g(e)}))},[l,s,t]);let E=async e=>{if(l){console.log("received key: ".concat(e)),console.log("routerSettings['fallbacks']: ".concat(i.fallbacks)),i.fallbacks.map(l=>(e in l&&delete l[e],l));try{await (0,u.K_)(l,{router_settings:i}),o({...i}),A(i.routing_strategy),k.ZP.success("Router settings updated successfully")}catch(e){k.ZP.error("Failed to update router settings: "+e,20)}}},W=(e,l)=>{g(m.map(s=>s.field_name===e?{...s,field_value:l}:s))},H=(e,s)=>{if(!l)return;let t=m[s].field_value;if(null!=t&&void 0!=t)try{(0,u.jA)(l,e,t);let s=m.map(l=>l.field_name===e?{...l,stored_in_db:!0}:l);g(s)}catch(e){}},G=(e,s)=>{if(l)try{(0,u.ao)(l,e);let s=m.map(l=>l.field_name===e?{...l,stored_in_db:null,field_value:null}:l);g(s)}catch(e){}},Y=e=>{if(!l)return;console.log("router_settings",e);let s=Object.fromEntries(Object.entries(e).map(e=>{let[l,s]=e;if("routing_strategy_args"!==l&&"routing_strategy"!==l){var t;return[l,(null===(t=document.querySelector('input[name="'.concat(l,'"]')))||void 0===t?void 0:t.value)||s]}if("routing_strategy"==l)return[l,N];if("routing_strategy_args"==l&&"latency-based-routing"==N){let e={},l=document.querySelector('input[name="lowest_latency_buffer"]'),s=document.querySelector('input[name="ttl"]');return(null==l?void 0:l.value)&&(e.lowest_latency_buffer=Number(l.value)),(null==s?void 0:s.value)&&(e.ttl=Number(s.value)),console.log("setRoutingStrategyArgs: ".concat(e)),["routing_strategy_args",e]}return null}).filter(e=>null!=e));console.log("updatedVariables",s);try{(0,u.K_)(l,{router_settings:s})}catch(e){k.ZP.error("Failed to update router settings: "+e,20)}k.ZP.success("router settings updated successfully")};return l?(0,a.jsx)("div",{className:"w-full mx-4",children:(0,a.jsxs)(en.Z,{className:"gap-2 p-8 h-[75vh] w-full mt-2",children:[(0,a.jsxs)(ea.Z,{variant:"line",defaultValue:"1",children:[(0,a.jsx)(et.Z,{value:"1",children:"Loadbalancing"}),(0,a.jsx)(et.Z,{value:"2",children:"Fallbacks"}),(0,a.jsx)(et.Z,{value:"3",children:"General"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 p-8 w-full mt-2",children:[(0,a.jsx)(y.Z,{children:"Router Settings"}),(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Setting"}),(0,a.jsx)(q.Z,{children:"Value"})]})}),(0,a.jsx)(L.Z,{children:Object.entries(i).filter(e=>{let[l,s]=e;return"fallbacks"!=l&&"context_window_fallbacks"!=l&&"routing_strategy_args"!=l}).map(e=>{let[l,s]=e;return(0,a.jsxs)(z.Z,{children:[(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(_.Z,{children:l}),(0,a.jsx)("p",{style:{fontSize:"0.65rem",color:"#808080",fontStyle:"italic"},className:"mt-1",children:T[l]})]}),(0,a.jsx)(U.Z,{children:"routing_strategy"==l?(0,a.jsxs)(B.Z,{defaultValue:s,className:"w-full max-w-md",onValueChange:A,children:[(0,a.jsx)(K.Z,{value:"usage-based-routing",children:"usage-based-routing"}),(0,a.jsx)(K.Z,{value:"latency-based-routing",children:"latency-based-routing"}),(0,a.jsx)(K.Z,{value:"simple-shuffle",children:"simple-shuffle"})]}):(0,a.jsx)(j.Z,{name:l,defaultValue:"object"==typeof s?JSON.stringify(s,null,2):s.toString()})})]},l)})})]}),(0,a.jsx)(eQ,{selectedStrategy:N,strategyArgs:i&&i.routing_strategy_args&&Object.keys(i.routing_strategy_args).length>0?i.routing_strategy_args:e$,paramExplanation:T})]}),(0,a.jsx)(h.Z,{children:(0,a.jsx)(p.Z,{className:"mt-2",onClick:()=>Y(i),children:"Save Changes"})})]})}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Model Name"}),(0,a.jsx)(q.Z,{children:"Fallbacks"})]})}),(0,a.jsx)(L.Z,{children:i.fallbacks&&i.fallbacks.map((e,s)=>Object.entries(e).map(e=>{let[t,n]=e;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:t}),(0,a.jsx)(U.Z,{children:Array.isArray(n)?n.join(", "):n}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(p.Z,{onClick:()=>eX(t,l),children:"Test Fallback"})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(M.Z,{icon:O.Z,size:"sm",onClick:()=>E(t)})})]},s.toString()+t)}))})]}),(0,a.jsx)(eY,{models:(null==n?void 0:n.data)?n.data.map(e=>e.model_name):[],accessToken:l,routerSettings:i,setRouterSettings:o})]}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(F.Z,{children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Setting"}),(0,a.jsx)(q.Z,{children:"Value"}),(0,a.jsx)(q.Z,{children:"Status"}),(0,a.jsx)(q.Z,{children:"Action"})]})}),(0,a.jsx)(L.Z,{children:m.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(_.Z,{children:e.field_name}),(0,a.jsx)("p",{style:{fontSize:"0.65rem",color:"#808080",fontStyle:"italic"},className:"mt-1",children:e.field_description})]}),(0,a.jsx)(U.Z,{children:"Integer"==e.field_type?(0,a.jsx)(I.Z,{step:1,value:e.field_value,onChange:l=>W(e.field_name,l)}):null}),(0,a.jsx)(U.Z,{children:!0==e.stored_in_db?(0,a.jsx)(R.Z,{icon:eV.Z,className:"text-white",children:"In DB"}):!1==e.stored_in_db?(0,a.jsx)(R.Z,{className:"text-gray bg-white outline",children:"In Config"}):(0,a.jsx)(R.Z,{className:"text-gray bg-white outline",children:"Not Set"})}),(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(p.Z,{onClick:()=>H(e.field_name,l),children:"Update"}),(0,a.jsx)(M.Z,{icon:O.Z,color:"red",onClick:()=>G(e.field_name,l),children:"Reset"})]})]},l))})]})})})]})]})}):null},e1=e=>{let{isModalVisible:l,accessToken:s,setIsModalVisible:t,setBudgetList:n}=e,[r]=S.Z.useForm(),i=async e=>{if(null!=s&&void 0!=s)try{k.ZP.info("Making API Call");let l=await (0,u.Zr)(s,e);console.log("key create Response:",l),n(e=>e?[...e,l]:[l]),k.ZP.success("API Key Created"),r.resetFields()}catch(e){console.error("Error creating the key:",e),k.ZP.error("Error creating the key: ".concat(e),20)}};return(0,a.jsx)(w.Z,{title:"Create Budget",visible:l,width:800,footer:null,onOk:()=>{t(!1),r.resetFields()},onCancel:()=>{t(!1),r.resetFields()},children:(0,a.jsxs)(S.Z,{form:r,onFinish:i,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{label:"Budget ID",name:"budget_id",rules:[{required:!0,message:"Please input a human-friendly name for the budget"}],help:"A human-friendly name for the budget",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(S.Z.Item,{label:"Max Tokens per minute",name:"tpm_limit",help:"Default is model limit.",children:(0,a.jsx)(I.Z,{step:1,precision:2,width:200})}),(0,a.jsx)(S.Z.Item,{label:"Max Requests per minute",name:"rpm_limit",help:"Default is model limit.",children:(0,a.jsx)(I.Z,{step:1,precision:2,width:200})}),(0,a.jsxs)(g.Z,{className:"mt-20 mb-8",children:[(0,a.jsx)(f.Z,{children:(0,a.jsx)("b",{children:"Optional Settings"})}),(0,a.jsxs)(Z.Z,{children:[(0,a.jsx)(S.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})})]})]})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Create Budget"})})]})})},e2=e=>{let{isModalVisible:l,accessToken:s,setIsModalVisible:t,setBudgetList:n,existingBudget:r}=e,[i]=S.Z.useForm(),o=async e=>{if(null!=s&&void 0!=s)try{k.ZP.info("Making API Call");let l=await (0,u.Zr)(s,e);console.log("key create Response:",l),n(e=>e?[...e,l]:[l]),k.ZP.success("API Key Created"),i.resetFields()}catch(e){console.error("Error creating the key:",e),k.ZP.error("Error creating the key: ".concat(e),20)}};return(0,a.jsx)(w.Z,{title:"Edit Budget",visible:l,width:800,footer:null,onOk:()=>{t(!1),i.resetFields()},onCancel:()=>{t(!1),i.resetFields()},children:(0,a.jsxs)(S.Z,{form:i,onFinish:o,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",initialValues:r,children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.Z.Item,{label:"Budget ID",name:"budget_id",rules:[{required:!0,message:"Please input a human-friendly name for the budget"}],help:"A human-friendly name for the budget",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(S.Z.Item,{label:"Max Tokens per minute",name:"tpm_limit",help:"Default is model limit.",children:(0,a.jsx)(I.Z,{step:1,precision:2,width:200})}),(0,a.jsx)(S.Z.Item,{label:"Max Requests per minute",name:"rpm_limit",help:"Default is model limit.",children:(0,a.jsx)(I.Z,{step:1,precision:2,width:200})}),(0,a.jsxs)(g.Z,{className:"mt-20 mb-8",children:[(0,a.jsx)(f.Z,{children:(0,a.jsx)("b",{children:"Optional Settings"})}),(0,a.jsxs)(Z.Z,{children:[(0,a.jsx)(S.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(S.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})})]})]})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Edit Budget"})})]})})},e4=e=>{let{accessToken:l}=e,[s,t]=(0,r.useState)(!1),[n,i]=(0,r.useState)(!1),[o,d]=(0,r.useState)(null),[c,m]=(0,r.useState)([]);(0,r.useEffect)(()=>{l&&(0,u.O3)(l).then(e=>{m(e)})},[l]);let h=async(e,s)=>{null!=l&&(d(c[s]),i(!0))},x=async(e,s)=>{if(null==l)return;k.ZP.info("Request made"),await (0,u.NV)(l,e);let t=[...c];t.splice(s,1),m(t),k.ZP.success("Budget Deleted.")};return(0,a.jsxs)("div",{className:"w-full mx-auto flex-auto overflow-y-auto m-8 p-2",children:[(0,a.jsx)(p.Z,{size:"sm",variant:"primary",className:"mb-2",onClick:()=>t(!0),children:"+ Create Budget"}),(0,a.jsx)(e1,{accessToken:l,isModalVisible:s,setIsModalVisible:t,setBudgetList:m}),o&&(0,a.jsx)(e2,{accessToken:l,isModalVisible:n,setIsModalVisible:i,setBudgetList:m,existingBudget:o}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(_.Z,{children:"Create a budget to assign to customers."}),(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Budget ID"}),(0,a.jsx)(q.Z,{children:"Max Budget"}),(0,a.jsx)(q.Z,{children:"TPM"}),(0,a.jsx)(q.Z,{children:"RPM"})]})}),(0,a.jsx)(L.Z,{children:c.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.budget_id}),(0,a.jsx)(U.Z,{children:e.max_budget?e.max_budget:"n/a"}),(0,a.jsx)(U.Z,{children:e.tpm_limit?e.tpm_limit:"n/a"}),(0,a.jsx)(U.Z,{children:e.rpm_limit?e.rpm_limit:"n/a"}),(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>h(e.budget_id,l)}),(0,a.jsx)(M.Z,{icon:O.Z,size:"sm",onClick:()=>x(e.budget_id,l)})]},l))})]})]}),(0,a.jsxs)("div",{className:"mt-5",children:[(0,a.jsx)(_.Z,{className:"text-base",children:"How to use budget id"}),(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{children:[(0,a.jsx)(et.Z,{children:"Assign Budget to Customer"}),(0,a.jsx)(et.Z,{children:"Test it (Curl)"}),(0,a.jsx)(et.Z,{children:"Test it (OpenAI SDK)"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"bash",children:"\ncurl -X POST --location '/end_user/new' \n-H 'Authorization: Bearer ' \n-H 'Content-Type: application/json' \n-d '{\"user_id\": \"my-customer-id', \"budget_id\": \"\"}' # \uD83D\uDC48 KEY CHANGE\n\n "})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"bash",children:'\ncurl -X POST --location \'/chat/completions\' \n-H \'Authorization: Bearer \' \n-H \'Content-Type: application/json\' \n-d \'{\n "model": "gpt-3.5-turbo\', \n "messages":[{"role": "user", "content": "Hey, how\'s it going?"}],\n "user": "my-customer-id"\n}\' # \uD83D\uDC48 KEY CHANGE\n\n '})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"python",children:'from openai import OpenAI\nclient = OpenAI(\n base_url="",\n api_key=""\n)\n\ncompletion = client.chat.completions.create(\n model="gpt-3.5-turbo",\n messages=[\n {"role": "system", "content": "You are a helpful assistant."},\n {"role": "user", "content": "Hello!"}\n ],\n user="my-customer-id"\n)\n\nprint(completion.choices[0].message)'})})]})]})]})]})},e5=s(41134),e8=e=>{let{proxySettings:l}=e,s="";return l&&l.PROXY_BASE_URL&&void 0!==l.PROXY_BASE_URL&&(s=l.PROXY_BASE_URL),(0,a.jsx)(a.Fragment,{children:(0,a.jsx)(x.Z,{className:"gap-2 p-8 h-[80vh] w-full mt-2",children:(0,a.jsxs)("div",{className:"mb-5",children:[(0,a.jsx)("p",{className:"text-2xl text-tremor-content-strong dark:text-dark-tremor-content-strong font-semibold",children:"OpenAI Compatible Proxy: API Reference"}),(0,a.jsx)(_.Z,{className:"mt-2 mb-2",children:"LiteLLM is OpenAI Compatible. This means your API Key works with the OpenAI SDK. Just replace the base_url to point to your litellm proxy. Example Below "}),(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{children:[(0,a.jsx)(et.Z,{children:"OpenAI Python SDK"}),(0,a.jsx)(et.Z,{children:"LlamaIndex"}),(0,a.jsx)(et.Z,{children:"Langchain Py"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="'.concat(s,'" # LiteLLM Proxy is OpenAI compatible, Read More: https://docs.litellm.ai/docs/proxy/user_keys\n)\n\nresponse = client.chat.completions.create(\n model="gpt-3.5-turbo", # model to send to the proxy\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ]\n)\n\nprint(response)\n ')})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="azure-gpt-3.5", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="'.concat(s,'", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="').concat(s,'",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n ')})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="'.concat(s,'",\n model = "gpt-3.5-turbo",\n temperature=0.1\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n ')})})]})]})]})})})};async function e3(e,l,s,t){console.log=function(){},console.log("isLocal:",!1);let n=window.location.origin,a=new eJ.ZP.OpenAI({apiKey:t,baseURL:n,dangerouslyAllowBrowser:!0});try{for await(let t of(await a.chat.completions.create({model:s,stream:!0,messages:[{role:"user",content:e}]})))console.log(t),t.choices[0].delta.content&&l(t.choices[0].delta.content)}catch(e){k.ZP.error("Error occurred while generating model response. Please try again. Error: ".concat(e),20)}}var e6=e=>{let{accessToken:l,token:s,userRole:t,userID:n}=e,[i,o]=(0,r.useState)(""),[d,c]=(0,r.useState)(""),[m,g]=(0,r.useState)([]),[Z,f]=(0,r.useState)(void 0),[y,b]=(0,r.useState)([]);(0,r.useEffect)(()=>{l&&s&&t&&n&&(async()=>{try{let e=await (0,u.So)(l,n,t);if(console.log("model_info:",e),(null==e?void 0:e.data.length)>0){let l=e.data.map(e=>({value:e.id,label:e.id}));if(console.log(l),l.length>0){let e=Array.from(new Set(l));console.log("Unique models:",e),e.sort((e,l)=>e.label.localeCompare(l.label)),console.log("Model info:",y),b(e)}f(e.data[0].id)}}catch(e){console.error("Error fetching model info:",e)}})()},[l,n,t]);let S=(e,l)=>{g(s=>{let t=s[s.length-1];return t&&t.role===e?[...s.slice(0,s.length-1),{role:e,content:t.content+l}]:[...s,{role:e,content:l}]})},k=async()=>{if(""!==d.trim()&&i&&s&&t&&n){g(e=>[...e,{role:"user",content:d}]);try{Z&&await e3(d,e=>S("assistant",e),Z,i)}catch(e){console.error("Error fetching model response",e),S("assistant","Error fetching model response")}c("")}};if(t&&"Admin Viewer"==t){let{Title:e,Paragraph:l}=Q.default;return(0,a.jsxs)("div",{children:[(0,a.jsx)(e,{level:1,children:"Access Denied"}),(0,a.jsx)(l,{children:"Ask your proxy admin for access to test models"})]})}return(0,a.jsx)("div",{style:{width:"100%",position:"relative"},children:(0,a.jsx)(x.Z,{className:"gap-2 p-8 h-[80vh] w-full mt-2",children:(0,a.jsx)(F.Z,{children:(0,a.jsxs)(en.Z,{children:[(0,a.jsx)(ea.Z,{children:(0,a.jsx)(et.Z,{children:"Chat"})}),(0,a.jsx)(ei.Z,{children:(0,a.jsxs)(er.Z,{children:[(0,a.jsx)("div",{className:"sm:max-w-2xl",children:(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsx)(_.Z,{children:"API Key"}),(0,a.jsx)(j.Z,{placeholder:"Type API Key here",type:"password",onValueChange:o,value:i})]}),(0,a.jsxs)(h.Z,{className:"mx-2",children:[(0,a.jsx)(_.Z,{children:"Select Model:"}),(0,a.jsx)(v.default,{placeholder:"Select a Model",onChange:e=>{console.log("selected ".concat(e)),f(e)},options:y,style:{width:"200px"}})]})]})}),(0,a.jsxs)(D.Z,{className:"mt-5",style:{display:"block",maxHeight:"60vh",overflowY:"auto"},children:[(0,a.jsx)(V.Z,{children:(0,a.jsx)(z.Z,{children:(0,a.jsx)(U.Z,{})})}),(0,a.jsx)(L.Z,{children:m.map((e,l)=>(0,a.jsx)(z.Z,{children:(0,a.jsx)(U.Z,{children:"".concat(e.role,": ").concat(e.content)})},l))})]}),(0,a.jsx)("div",{className:"mt-3",style:{position:"absolute",bottom:5,width:"95%"},children:(0,a.jsxs)("div",{className:"flex",children:[(0,a.jsx)(j.Z,{type:"text",value:d,onChange:e=>c(e.target.value),onKeyDown:e=>{"Enter"===e.key&&k()},placeholder:"Type your message..."}),(0,a.jsx)(p.Z,{onClick:k,className:"ml-2",children:"Send"})]})})]})})]})})})})},e9=s(33509),e7=s(95781);let{Sider:le}=e9.default;var ll=e=>{let{setPage:l,userRole:s,defaultSelectedKey:t}=e;return"Admin Viewer"==s?(0,a.jsx)(e9.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,a.jsx)(le,{width:120,children:(0,a.jsxs)(e7.Z,{mode:"inline",defaultSelectedKeys:t||["4"],style:{height:"100%",borderRight:0},children:[(0,a.jsx)(e7.Z.Item,{onClick:()=>l("usage"),children:"Usage"},"1"),(0,a.jsx)(e7.Z.Item,{onClick:()=>l("caching"),children:(0,a.jsx)(_.Z,{children:"Caching"})},"9")]})})}):(0,a.jsx)(e9.default,{style:{minHeight:"100vh",maxWidth:"145px"},children:(0,a.jsx)(le,{width:145,children:(0,a.jsxs)(e7.Z,{mode:"inline",defaultSelectedKeys:t||["1"],style:{height:"100%",borderRight:0},children:[(0,a.jsx)(e7.Z.Item,{onClick:()=>l("api-keys"),children:(0,a.jsx)(_.Z,{children:"Virtual Keys"})},"1"),(0,a.jsx)(e7.Z.Item,{onClick:()=>l("llm-playground"),children:(0,a.jsx)(_.Z,{children:"Test Key"})},"3"),"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("models"),children:(0,a.jsx)(_.Z,{children:"Models"})},"2"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("usage"),children:(0,a.jsx)(_.Z,{children:"Usage"})},"4"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("teams"),children:(0,a.jsx)(_.Z,{children:"Teams"})},"6"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("users"),children:(0,a.jsx)(_.Z,{children:"Internal Users"})},"5"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("settings"),children:(0,a.jsx)(_.Z,{children:"Logging & Alerts"})},"8"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("caching"),children:(0,a.jsx)(_.Z,{children:"Caching"})},"9"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("budgets"),children:(0,a.jsx)(_.Z,{children:"Budgets"})},"10"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("general-settings"),children:(0,a.jsx)(_.Z,{children:"Router Settings"})},"11"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("admin-panel"),children:(0,a.jsx)(_.Z,{children:"Admin Settings"})},"12"):null,(0,a.jsx)(e7.Z.Item,{onClick:()=>l("api_ref"),children:(0,a.jsx)(_.Z,{children:"API Reference"})},"13"),(0,a.jsx)(e7.Z.Item,{onClick:()=>l("model-hub"),children:(0,a.jsx)(_.Z,{children:"Model Hub"})},"15")]})})})},ls=s(67989),lt=s(52703);console.log("process.env.NODE_ENV","production"),console.log=function(){};var ln=e=>{let{accessToken:l,token:s,userRole:t,userID:n,keys:i,premiumUser:o}=e,d=new Date,[c,m]=(0,r.useState)([]),[j,g]=(0,r.useState)([]),[Z,f]=(0,r.useState)([]),[b,v]=(0,r.useState)([]),[S,k]=(0,r.useState)([]),[w,N]=(0,r.useState)([]),[I,A]=(0,r.useState)([]),[C,P]=(0,r.useState)([]),[T,E]=(0,r.useState)([]),[O,R]=(0,r.useState)([]),[M,W]=(0,r.useState)({}),[H,Y]=(0,r.useState)([]),[J,X]=(0,r.useState)(""),[$,Q]=(0,r.useState)(["all-tags"]),[ee,eu]=(0,r.useState)({from:new Date(Date.now()-6048e5),to:new Date}),eh=new Date(d.getFullYear(),d.getMonth(),1),ex=new Date(d.getFullYear(),d.getMonth()+1,0),ep=e_(eh),ej=e_(ex);function eg(e){return new Intl.NumberFormat("en-US",{maximumFractionDigits:0,notation:"compact",compactDisplay:"short"}).format(e)}console.log("keys in usage",i),console.log("premium user in usage",o),(0,r.useEffect)(()=>{ef(ee.from,ee.to)},[ee,$]);let eZ=async(e,s,t)=>{if(!e||!s||!l)return;s.setHours(23,59,59,999),e.setHours(0,0,0,0),console.log("uiSelectedKey",t);let n=await (0,u.b1)(l,t,e.toISOString(),s.toISOString());console.log("End user data updated successfully",n),v(n)},ef=async(e,s)=>{e&&s&&l&&(s.setHours(23,59,59,999),e.setHours(0,0,0,0),N((await (0,u.J$)(l,e.toISOString(),s.toISOString(),0===$.length?void 0:$)).spend_per_tag),console.log("Tag spend data updated successfully"))};function e_(e){let l=e.getFullYear(),s=e.getMonth()+1,t=e.getDate();return"".concat(l,"-").concat(s<10?"0"+s:s,"-").concat(t<10?"0"+t:t)}return console.log("Start date is ".concat(ep)),console.log("End date is ".concat(ej)),(0,r.useEffect)(()=>{l&&s&&t&&n&&(async()=>{try{if(console.log("user role: ".concat(t)),"Admin"==t||"Admin Viewer"==t){var e,a;let t=await (0,u.FC)(l);m(t);let n=await (0,u.OU)(l,s,ep,ej);console.log("provider_spend",n),R(n);let r=(await (0,u.tN)(l)).map(e=>({key:(e.key_alias||e.key_name||e.api_key).substring(0,10),spend:e.total_spend}));g(r);let i=(await (0,u.Au)(l)).map(e=>({key:e.model,spend:e.total_spend}));f(i);let o=await (0,u.mR)(l);console.log("teamSpend",o),k(o.daily_spend),P(o.teams);let d=o.total_spend_per_team;d=d.map(e=>(e.name=e.team_id||"",e.value=e.total_spend||0,e.value=e.value.toFixed(2),e)),E(d);let c=await (0,u.X)(l);A(c.tag_names);let h=await (0,u.J$)(l,null===(e=ee.from)||void 0===e?void 0:e.toISOString(),null===(a=ee.to)||void 0===a?void 0:a.toISOString(),void 0);N(h.spend_per_tag);let x=await (0,u.b1)(l,null,void 0,void 0);v(x),console.log("spend/user result",x);let p=await (0,u.wd)(l,ep,ej);W(p);let j=await (0,u.xA)(l,ep,ej);console.log("global activity per model",j),Y(j)}else"App Owner"==t&&await (0,u.HK)(l,s,t,n,ep,ej).then(async e=>{if(console.log("result from spend logs call",e),"daily_spend"in e){let l=e.daily_spend;console.log("daily spend",l),m(l);let s=e.top_api_keys;g(s)}else{let s=(await (0,u.e2)(l,function(e){let l=[];e.forEach(e=>{Object.entries(e).forEach(e=>{let[s,t]=e;"spend"!==s&&"startTime"!==s&&"models"!==s&&"users"!==s&&l.push({key:s,spend:t})})}),l.sort((e,l)=>Number(l.spend)-Number(e.spend));let s=l.slice(0,5).map(e=>e.key);return console.log("topKeys: ".concat(Object.keys(s[0]))),s}(e))).info.map(e=>({key:(e.key_name||e.key_alias).substring(0,10),spend:e.spend}));g(s),m(e)}})}catch(e){console.error("There was an error fetching the data",e)}})()},[l,s,t,n,ep,ej]),(0,a.jsx)("div",{style:{width:"100%"},className:"p-8",children:(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{className:"mt-2",children:[(0,a.jsx)(et.Z,{children:"All Up"}),(0,a.jsx)(et.Z,{children:"Team Based Usage"}),(0,a.jsx)(et.Z,{children:"Customer Usage"}),(0,a.jsx)(et.Z,{children:"Tag Based Usage"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{variant:"solid",className:"mt-1",children:[(0,a.jsx)(et.Z,{children:"Cost"}),(0,a.jsx)(et.Z,{children:"Activity"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsxs)(x.Z,{numItems:2,className:"gap-2 h-[100vh] w-full",children:[(0,a.jsx)(G,{userID:n,userRole:t,accessToken:l,userSpend:null,selectedTeam:null}),(0,a.jsx)(h.Z,{numColSpan:2,children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Monthly Spend"}),(0,a.jsx)(em.Z,{data:c,index:"date",categories:["spend"],colors:["blue"],valueFormatter:e=>"$ ".concat(new Intl.NumberFormat("us").format(e).toString()),yAxisWidth:100,tickGap:5})]})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Top API Keys"}),(0,a.jsx)(em.Z,{className:"mt-4 h-40",data:j,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:80,tickGap:5,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Top Models"}),(0,a.jsx)(em.Z,{className:"mt-4 h-40",data:Z,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,a.jsx)(h.Z,{numColSpan:1}),(0,a.jsx)(h.Z,{numColSpan:2,children:(0,a.jsxs)(F.Z,{className:"mb-2",children:[(0,a.jsx)(y.Z,{children:"✨ Spend by Provider"}),o?(0,a.jsx)(a.Fragment,{children:(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsx)(lt.Z,{className:"mt-4 h-40",variant:"pie",data:O,index:"provider",category:"spend"})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Provider"}),(0,a.jsx)(q.Z,{children:"Spend"})]})}),(0,a.jsx)(L.Z,{children:O.map(e=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.provider}),(0,a.jsx)(U.Z,{children:1e-5>parseFloat(e.spend.toFixed(2))?"less than 0.00":e.spend.toFixed(2)})]},e.provider))})]})})]})}):(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"mb-2 text-gray-500 italic text-[12px]",children:"Upgrade to use this feature"}),(0,a.jsx)(p.Z,{variant:"primary",className:"mb-2",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get Free Trial"})})]})]})})]})}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 h-[75vh] w-full",children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"All Up"}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["API Requests ",eg(M.sum_api_requests)]}),(0,a.jsx)(ec.Z,{className:"h-40",data:M.daily_data,valueFormatter:eg,index:"date",colors:["cyan"],categories:["api_requests"],onValueChange:e=>console.log(e)})]}),(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Tokens ",eg(M.sum_total_tokens)]}),(0,a.jsx)(em.Z,{className:"h-40",data:M.daily_data,valueFormatter:eg,index:"date",colors:["cyan"],categories:["total_tokens"],onValueChange:e=>console.log(e)})]})]})]}),o?(0,a.jsx)(a.Fragment,{children:H.map((e,l)=>(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:e.model}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["API Requests ",eg(e.sum_api_requests)]}),(0,a.jsx)(ec.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["cyan"],categories:["api_requests"],valueFormatter:eg,onValueChange:e=>console.log(e)})]}),(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Tokens ",eg(e.sum_total_tokens)]}),(0,a.jsx)(em.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["cyan"],categories:["total_tokens"],valueFormatter:eg,onValueChange:e=>console.log(e)})]})]})]},l))}):(0,a.jsx)(a.Fragment,{children:H&&H.length>0&&H.slice(0,1).map((e,l)=>(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"✨ Activity by Model"}),(0,a.jsx)("p",{className:"mb-2 text-gray-500 italic text-[12px]",children:"Upgrade to see analytics for all models"}),(0,a.jsx)(p.Z,{variant:"primary",className:"mb-2",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get Free Trial"})}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:e.model}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["API Requests ",eg(e.sum_api_requests)]}),(0,a.jsx)(ec.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["cyan"],categories:["api_requests"],valueFormatter:eg,onValueChange:e=>console.log(e)})]}),(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Tokens ",eg(e.sum_total_tokens)]}),(0,a.jsx)(em.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["cyan"],valueFormatter:eg,categories:["total_tokens"],onValueChange:e=>console.log(e)})]})]})]})]},l))})]})})]})]})}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(x.Z,{numItems:2,className:"gap-2 h-[75vh] w-full",children:[(0,a.jsxs)(h.Z,{numColSpan:2,children:[(0,a.jsxs)(F.Z,{className:"mb-2",children:[(0,a.jsx)(y.Z,{children:"Total Spend Per Team"}),(0,a.jsx)(ls.Z,{data:T})]}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Daily Spend Per Team"}),(0,a.jsx)(em.Z,{className:"h-72",data:S,showLegend:!0,index:"date",categories:C,yAxisWidth:80,stack:!0})]})]}),(0,a.jsx)(h.Z,{numColSpan:2})]})}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)("p",{className:"mb-2 text-gray-500 italic text-[12px]",children:["Customers of your LLM API calls. Tracked when a `user` param is passed in your LLM calls ",(0,a.jsx)("a",{className:"text-blue-500",href:"https://docs.litellm.ai/docs/proxy/users",target:"_blank",children:"docs here"})]}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsx)(_.Z,{children:"Select Time Range"}),(0,a.jsx)(es.Z,{enableSelect:!0,value:ee,onValueChange:e=>{eu(e),eZ(e.from,e.to,null)}})]}),(0,a.jsxs)(h.Z,{children:[(0,a.jsx)(_.Z,{children:"Select Key"}),(0,a.jsxs)(B.Z,{defaultValue:"all-keys",children:[(0,a.jsx)(K.Z,{value:"all-keys",onClick:()=>{eZ(ee.from,ee.to,null)},children:"All Keys"},"all-keys"),null==i?void 0:i.map((e,l)=>e&&null!==e.key_alias&&e.key_alias.length>0?(0,a.jsx)(K.Z,{value:String(l),onClick:()=>{eZ(ee.from,ee.to,e.token)},children:e.key_alias},l):null)]})]})]}),(0,a.jsx)(F.Z,{className:"mt-4",children:(0,a.jsxs)(D.Z,{className:"max-h-[70vh] min-h-[500px]",children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Customer"}),(0,a.jsx)(q.Z,{children:"Spend"}),(0,a.jsx)(q.Z,{children:"Total Events"})]})}),(0,a.jsx)(L.Z,{children:null==b?void 0:b.map((e,l)=>{var s;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.end_user}),(0,a.jsx)(U.Z,{children:null===(s=e.total_spend)||void 0===s?void 0:s.toFixed(4)}),(0,a.jsx)(U.Z,{children:e.total_count})]},l)})})]})})]}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsx)(es.Z,{className:"mb-4",enableSelect:!0,value:ee,onValueChange:e=>{eu(e),ef(e.from,e.to)}})}),(0,a.jsx)(h.Z,{children:o?(0,a.jsx)("div",{children:(0,a.jsxs)(eo.Z,{value:$,onValueChange:e=>Q(e),children:[(0,a.jsx)(ed.Z,{value:"all-tags",onClick:()=>Q(["all-tags"]),children:"All Tags"},"all-tags"),I&&I.filter(e=>"all-tags"!==e).map((e,l)=>(0,a.jsx)(ed.Z,{value:String(e),children:e},e))]})}):(0,a.jsx)("div",{children:(0,a.jsxs)(eo.Z,{value:$,onValueChange:e=>Q(e),children:[(0,a.jsx)(ed.Z,{value:"all-tags",onClick:()=>Q(["all-tags"]),children:"All Tags"},"all-tags"),I&&I.filter(e=>"all-tags"!==e).map((e,l)=>(0,a.jsxs)(K.Z,{value:String(e),disabled:!0,children:["✨ ",e," (Enterprise only Feature)"]},e))]})})})]}),(0,a.jsxs)(x.Z,{numItems:2,className:"gap-2 h-[75vh] w-full mb-4",children:[(0,a.jsx)(h.Z,{numColSpan:2,children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Spend Per Tag"}),(0,a.jsxs)(_.Z,{children:["Get Started Tracking cost per tag ",(0,a.jsx)("a",{className:"text-blue-500",href:"https://docs.litellm.ai/docs/proxy/cost_tracking",target:"_blank",children:"here"})]}),(0,a.jsx)(em.Z,{className:"h-72",data:w,index:"name",categories:["spend"],colors:["blue"]})]})}),(0,a.jsx)(h.Z,{numColSpan:2})]})]})]})]})})};let la=e=>{if(e)return e.toISOString().split("T")[0]};function lr(e){return new Intl.NumberFormat("en-US",{maximumFractionDigits:0,notation:"compact",compactDisplay:"short"}).format(e)}var li=e=>{let{accessToken:l,token:s,userRole:t,userID:n,premiumUser:i}=e,[o,d]=(0,r.useState)([]),[c,m]=(0,r.useState)([]),[p,j]=(0,r.useState)([]),[g,Z]=(0,r.useState)([]),[f,_]=(0,r.useState)("0"),[y,b]=(0,r.useState)("0"),[v,S]=(0,r.useState)("0"),[k,w]=(0,r.useState)({from:new Date(Date.now()-6048e5),to:new Date});(0,r.useEffect)(()=>{l&&k&&(async()=>{Z(await (0,u.zg)(l,la(k.from),la(k.to)))})()},[l]);let N=Array.from(new Set(g.map(e=>{var l;return null!==(l=null==e?void 0:e.api_key)&&void 0!==l?l:""}))),I=Array.from(new Set(g.map(e=>{var l;return null!==(l=null==e?void 0:e.model)&&void 0!==l?l:""})));Array.from(new Set(g.map(e=>{var l;return null!==(l=null==e?void 0:e.call_type)&&void 0!==l?l:""})));let A=async(e,s)=>{e&&s&&l&&(s.setHours(23,59,59,999),e.setHours(0,0,0,0),Z(await (0,u.zg)(l,la(e),la(s))))};return(0,r.useEffect)(()=>{console.log("DATA IN CACHE DASHBOARD",g);let e=g;c.length>0&&(e=e.filter(e=>c.includes(e.api_key))),p.length>0&&(e=e.filter(e=>p.includes(e.model))),console.log("before processed data in cache dashboard",e);let l=0,s=0,t=0,n=e.reduce((e,n)=>{console.log("Processing item:",n),n.call_type||(console.log("Item has no call_type:",n),n.call_type="Unknown"),l+=(n.total_rows||0)-(n.cache_hit_true_rows||0),s+=n.cache_hit_true_rows||0,t+=n.cached_completion_tokens||0;let a=e.find(e=>e.name===n.call_type);return a?(a["LLM API requests"]+=(n.total_rows||0)-(n.cache_hit_true_rows||0),a["Cache hit"]+=n.cache_hit_true_rows||0,a["Cached Completion Tokens"]+=n.cached_completion_tokens||0,a["Generated Completion Tokens"]+=n.generated_completion_tokens||0):e.push({name:n.call_type,"LLM API requests":(n.total_rows||0)-(n.cache_hit_true_rows||0),"Cache hit":n.cache_hit_true_rows||0,"Cached Completion Tokens":n.cached_completion_tokens||0,"Generated Completion Tokens":n.generated_completion_tokens||0}),e},[]);_(lr(s)),b(lr(t));let a=s+l;a>0?S((s/a*100).toFixed(2)):S("0"),d(n),console.log("PROCESSED DATA IN CACHE DASHBOARD",n)},[c,p,k,g]),(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(x.Z,{numItems:3,className:"gap-4 mt-4",children:[(0,a.jsx)(h.Z,{children:(0,a.jsx)(eo.Z,{placeholder:"Select API Keys",value:c,onValueChange:m,children:N.map(e=>(0,a.jsx)(ed.Z,{value:e,children:e},e))})}),(0,a.jsx)(h.Z,{children:(0,a.jsx)(eo.Z,{placeholder:"Select Models",value:p,onValueChange:j,children:I.map(e=>(0,a.jsx)(ed.Z,{value:e,children:e},e))})}),(0,a.jsx)(h.Z,{children:(0,a.jsx)(es.Z,{enableSelect:!0,value:k,onValueChange:e=>{w(e),A(e.from,e.to)},selectPlaceholder:"Select date range"})})]}),(0,a.jsxs)("div",{className:"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3 mt-4",children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Cache Hit Ratio"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsxs)("p",{className:"text-tremor-metric font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:[v,"%"]})})]}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Cache Hits"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor-metric font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:f})})]}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Cached Tokens"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor-metric font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:y})})]})]}),(0,a.jsx)(el.Z,{className:"mt-4",children:"Cache Hits vs API Requests"}),(0,a.jsx)(em.Z,{title:"Cache Hits vs API Requests",data:o,stack:!0,index:"name",valueFormatter:lr,categories:["LLM API requests","Cache hit"],colors:["sky","teal"],yAxisWidth:48}),(0,a.jsx)(el.Z,{className:"mt-4",children:"Cached Completion Tokens vs Generated Completion Tokens"}),(0,a.jsx)(em.Z,{className:"mt-6",data:o,stack:!0,index:"name",valueFormatter:lr,categories:["Generated Completion Tokens","Cached Completion Tokens"],colors:["sky","teal"],yAxisWidth:48})]})},lo=()=>{let{Title:e,Paragraph:l}=Q.default,[s,t]=(0,r.useState)(""),[n,o]=(0,r.useState)(!1),[d,c]=(0,r.useState)(null),[h,x]=(0,r.useState)(null),[p,j]=(0,r.useState)(null),[g,Z]=(0,r.useState)({PROXY_BASE_URL:"",PROXY_LOGOUT_URL:""}),[f,_]=(0,r.useState)(!0),y=(0,i.useSearchParams)(),[b,v]=(0,r.useState)({data:[]}),S=y.get("userID"),k=y.get("invitation_id"),w=function(e){console.log("COOKIES",document.cookie);let l=document.cookie.split("; ").find(l=>l.startsWith(e+"="));return l?l.split("=")[1]:null}("token"),[N,I]=(0,r.useState)("api-keys"),[A,C]=(0,r.useState)(null);return(0,r.useEffect)(()=>{if(w){let e=(0,$.o)(w);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),C(e.key),e.user_role){let l=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e.toLowerCase())),console.log("Received user role length: ".concat(e.toLowerCase().length)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"internal_user":return"Internal User";case"internal_viewer":return"Internal Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",l),t(l),"Admin Viewer"==l&&I("usage")}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e)),e.login_method?_("username_password"==e.login_method):console.log("User Email is not set ".concat(e)),e.premium_user&&o(e.premium_user),e.auth_header_name&&(0,u.K8)(e.auth_header_name)}}},[w]),(0,a.jsx)(r.Suspense,{fallback:(0,a.jsx)("div",{children:"Loading..."}),children:k?(0,a.jsx)(ee,{userID:S,userRole:s,teams:h,keys:p,setUserRole:t,userEmail:d,setUserEmail:c,setTeams:x,setKeys:j,setProxySettings:Z,proxySettings:g}):(0,a.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,a.jsx)(m,{userID:S,userRole:s,userEmail:d,showSSOBanner:f,premiumUser:n,setProxySettings:Z,proxySettings:g}),(0,a.jsxs)("div",{className:"flex flex-1 overflow-auto",children:[(0,a.jsx)("div",{className:"mt-8",children:(0,a.jsx)(ll,{setPage:I,userRole:s,defaultSelectedKey:null})}),"api-keys"==N?(0,a.jsx)(ee,{userID:S,userRole:s,teams:h,keys:p,setUserRole:t,userEmail:d,setUserEmail:c,setTeams:x,setKeys:j,setProxySettings:Z,proxySettings:g}):"models"==N?(0,a.jsx)(eT,{userID:S,userRole:s,token:w,keys:p,accessToken:A,modelData:b,setModelData:v,premiumUser:n}):"llm-playground"==N?(0,a.jsx)(e6,{userID:S,userRole:s,token:w,accessToken:A}):"users"==N?(0,a.jsx)(eM,{userID:S,userRole:s,token:w,keys:p,teams:h,accessToken:A,setKeys:j}):"teams"==N?(0,a.jsx)(eD,{teams:h,setTeams:x,searchParams:y,accessToken:A,userID:S,userRole:s}):"admin-panel"==N?(0,a.jsx)(eL,{setTeams:x,searchParams:y,accessToken:A,showSSOBanner:f,premiumUser:n}):"api_ref"==N?(0,a.jsx)(e8,{proxySettings:g}):"settings"==N?(0,a.jsx)(eH,{userID:S,userRole:s,accessToken:A,premiumUser:n}):"budgets"==N?(0,a.jsx)(e4,{accessToken:A}):"general-settings"==N?(0,a.jsx)(e0,{userID:S,userRole:s,accessToken:A,modelData:b}):"model-hub"==N?(0,a.jsx)(e5.Z,{accessToken:A,publicPage:!1,premiumUser:n}):"caching"==N?(0,a.jsx)(li,{userID:S,userRole:s,token:w,accessToken:A,premiumUser:n}):(0,a.jsx)(ln,{userID:S,userRole:s,token:w,accessToken:A,keys:p,premiumUser:n})]})]})})}},41134:function(e,l,s){"use strict";s.d(l,{Z:function(){return y}});var t=s(3827),n=s(64090),a=s(47907),r=s(777),i=s(16450),o=s(13810),d=s(92836),c=s(26734),m=s(41608),u=s(32126),h=s(23682),x=s(71801),p=s(42440),j=s(84174),g=s(50459),Z=s(6180),f=s(99129),_=s(67951),y=e=>{var l;let{accessToken:s,publicPage:y,premiumUser:b}=e,[v,S]=(0,n.useState)(!1),[k,w]=(0,n.useState)(null),[N,I]=(0,n.useState)(!1),[A,C]=(0,n.useState)(!1),[P,T]=(0,n.useState)(null),E=(0,a.useRouter)();(0,n.useEffect)(()=>{s&&(async()=>{try{let e=await (0,r.kn)(s);console.log("ModelHubData:",e),w(e.data),(0,r.E9)(s,"enable_public_model_hub").then(e=>{console.log("data: ".concat(JSON.stringify(e))),!0==e.field_value&&S(!0)}).catch(e=>{})}catch(e){console.error("There was an error fetching the model data",e)}})()},[s,y]);let O=e=>{T(e),I(!0)},R=async()=>{s&&(0,r.jA)(s,"enable_public_model_hub",!0).then(e=>{C(!0)})},F=()=>{I(!1),C(!1),T(null)},M=()=>{I(!1),C(!1),T(null)},D=e=>{navigator.clipboard.writeText(e)};return(0,t.jsxs)("div",{children:[y&&v||!1==y?(0,t.jsxs)("div",{className:"w-full m-2 mt-2 p-8",children:[(0,t.jsx)("div",{className:"relative w-full"}),(0,t.jsxs)("div",{className:"flex ".concat(y?"justify-between":"items-center"),children:[(0,t.jsx)(p.Z,{className:"ml-8 text-center ",children:"Model Hub"}),!1==y?b?(0,t.jsx)(i.Z,{className:"ml-4",onClick:()=>R(),children:"✨ Make Public"}):(0,t.jsx)(i.Z,{className:"ml-4",children:(0,t.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"✨ Make Public"})}):(0,t.jsxs)("div",{className:"flex justify-between items-center",children:[(0,t.jsx)("p",{children:"Filter by key:"}),(0,t.jsx)(x.Z,{className:"bg-gray-200 pr-2 pl-2 pt-1 pb-1 text-center",children:"/ui/model_hub?key="})]})]}),(0,t.jsx)("div",{className:"grid grid-cols-2 gap-6 sm:grid-cols-3 lg:grid-cols-4 pr-8",children:k&&k.map(e=>(0,t.jsxs)(o.Z,{className:"mt-5 mx-8",children:[(0,t.jsxs)("pre",{className:"flex justify-between",children:[(0,t.jsx)(p.Z,{children:e.model_group}),(0,t.jsx)(Z.Z,{title:e.model_group,children:(0,t.jsx)(j.Z,{onClick:()=>D(e.model_group),style:{cursor:"pointer",marginRight:"10px"}})})]}),(0,t.jsxs)("div",{className:"my-5",children:[(0,t.jsxs)(x.Z,{children:["Mode: ",e.mode]}),(0,t.jsxs)(x.Z,{children:["Supports Function Calling:"," ",(null==e?void 0:e.supports_function_calling)==!0?"Yes":"No"]}),(0,t.jsxs)(x.Z,{children:["Supports Vision:"," ",(null==e?void 0:e.supports_vision)==!0?"Yes":"No"]}),(0,t.jsxs)(x.Z,{children:["Max Input Tokens:"," ",(null==e?void 0:e.max_input_tokens)?null==e?void 0:e.max_input_tokens:"N/A"]}),(0,t.jsxs)(x.Z,{children:["Max Output Tokens:"," ",(null==e?void 0:e.max_output_tokens)?null==e?void 0:e.max_output_tokens:"N/A"]})]}),(0,t.jsx)("div",{style:{marginTop:"auto",textAlign:"right"},children:(0,t.jsxs)("a",{href:"#",onClick:()=>O(e),style:{color:"#1890ff",fontSize:"smaller"},children:["View more ",(0,t.jsx)(g.Z,{})]})})]},e.model_group))})]}):(0,t.jsxs)(o.Z,{className:"mx-auto max-w-xl mt-10",children:[(0,t.jsx)(x.Z,{className:"text-xl text-center mb-2 text-black",children:"Public Model Hub not enabled."}),(0,t.jsx)("p",{className:"text-base text-center text-slate-800",children:"Ask your proxy admin to enable this on their Admin UI."})]}),(0,t.jsx)(f.Z,{title:"Public Model Hub",width:600,visible:A,footer:null,onOk:F,onCancel:M,children:(0,t.jsxs)("div",{className:"pt-5 pb-5",children:[(0,t.jsxs)("div",{className:"flex justify-between mb-4",children:[(0,t.jsx)(x.Z,{className:"text-base mr-2",children:"Shareable Link:"}),(0,t.jsx)(x.Z,{className:"max-w-sm ml-2 bg-gray-200 pr-2 pl-2 pt-1 pb-1 text-center rounded",children:"/ui/model_hub?key="})]}),(0,t.jsx)("div",{className:"flex justify-end",children:(0,t.jsx)(i.Z,{onClick:()=>{E.replace("/model_hub?key=".concat(s))},children:"See Page"})})]})}),(0,t.jsx)(f.Z,{title:P&&P.model_group?P.model_group:"Unknown Model",width:800,visible:N,footer:null,onOk:F,onCancel:M,children:P&&(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"mb-4",children:(0,t.jsx)("strong",{children:"Model Information & Usage"})}),(0,t.jsxs)(c.Z,{children:[(0,t.jsxs)(m.Z,{children:[(0,t.jsx)(d.Z,{children:"OpenAI Python SDK"}),(0,t.jsx)(d.Z,{children:"Supported OpenAI Params"}),(0,t.jsx)(d.Z,{children:"LlamaIndex"}),(0,t.jsx)(d.Z,{children:"Langchain Py"})]}),(0,t.jsxs)(h.Z,{children:[(0,t.jsx)(u.Z,{children:(0,t.jsx)(_.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="http://0.0.0.0:4000" # LiteLLM Proxy is OpenAI compatible, Read More: https://docs.litellm.ai/docs/proxy/user_keys\n)\n\nresponse = client.chat.completions.create(\n model="'.concat(P.model_group,'", # model to send to the proxy\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ]\n)\n\nprint(response)\n ')})}),(0,t.jsx)(u.Z,{children:(0,t.jsx)(_.Z,{language:"python",children:"".concat(null===(l=P.supported_openai_params)||void 0===l?void 0:l.map(e=>"".concat(e,"\n")).join(""))})}),(0,t.jsx)(u.Z,{children:(0,t.jsx)(_.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="'.concat(P.model_group,'", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="http://0.0.0.0:4000", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="http://0.0.0.0:4000",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n ')})}),(0,t.jsx)(u.Z,{children:(0,t.jsx)(_.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="http://0.0.0.0:4000",\n model = "'.concat(P.model_group,'",\n temperature=0.1\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n ')})})]})]})]})})]})}}},function(e){e.O(0,[665,936,294,131,684,759,777,971,69,744],function(){return e(e.s=20661)}),_N_E=e.O()}]);
\ No newline at end of file
diff --git a/ui/litellm-dashboard/out/_next/static/chunks/app/page-cab98591303c1c5d.js b/ui/litellm-dashboard/out/_next/static/chunks/app/page-cab98591303c1c5d.js
deleted file mode 100644
index 734635fd2e9..00000000000
--- a/ui/litellm-dashboard/out/_next/static/chunks/app/page-cab98591303c1c5d.js
+++ /dev/null
@@ -1 +0,0 @@
-(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{20661:function(e,l,s){Promise.resolve().then(s.bind(s,48951))},667:function(e,l,s){"use strict";s.r(l),s.d(l,{default:function(){return f}});var t=s(3827),n=s(64090),a=s(47907),r=s(16450),i=s(18190),o=s(13810),d=s(10384),c=s(46453),m=s(71801),u=s(52273),h=s(42440),x=s(30953),p=s(777),j=s(37963),g=s(60620),Z=s(1861);function f(){let[e]=g.Z.useForm(),l=(0,a.useSearchParams)();!function(e){console.log("COOKIES",document.cookie);let l=document.cookie.split("; ").find(l=>l.startsWith(e+"="));l&&l.split("=")[1]}("token");let s=l.get("invitation_id"),[f,_]=(0,n.useState)(null),[y,b]=(0,n.useState)(""),[v,k]=(0,n.useState)(""),[S,w]=(0,n.useState)(null),[N,I]=(0,n.useState)(""),[A,C]=(0,n.useState)("");return(0,n.useEffect)(()=>{s&&(0,p.W_)(s).then(e=>{let l=e.login_url;console.log("login_url:",l),I(l);let s=e.token,t=(0,j.o)(s);C(s),console.log("decoded:",t),_(t.key),console.log("decoded user email:",t.user_email),k(t.user_email),w(t.user_id)})},[s]),(0,t.jsx)("div",{className:"mx-auto w-full max-w-md mt-10",children:(0,t.jsxs)(o.Z,{children:[(0,t.jsx)(h.Z,{className:"text-sm mb-5 text-center",children:"\uD83D\uDE85 LiteLLM"}),(0,t.jsx)(h.Z,{className:"text-xl",children:"Sign up"}),(0,t.jsx)(m.Z,{children:"Claim your user account to login to Admin UI."}),(0,t.jsx)(i.Z,{className:"mt-4",title:"SSO",icon:x.GH$,color:"sky",children:(0,t.jsxs)(c.Z,{numItems:2,className:"flex justify-between items-center",children:[(0,t.jsx)(d.Z,{children:"SSO is under the Enterprise Tirer."}),(0,t.jsx)(d.Z,{children:(0,t.jsx)(r.Z,{variant:"primary",className:"mb-2",children:(0,t.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get Free Trial"})})})]})}),(0,t.jsxs)(g.Z,{className:"mt-10 mb-5 mx-auto",layout:"vertical",onFinish:e=>{console.log("in handle submit. accessToken:",f,"token:",A,"formValues:",e),f&&A&&(e.user_email=v,S&&s&&(0,p.m_)(f,s,S,e.password).then(e=>{var l;let s="/ui/";s+="?userID="+((null===(l=e.data)||void 0===l?void 0:l.user_id)||e.user_id),document.cookie="token="+A,console.log("redirecting to:",s),window.location.href=s}))},children:[(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(g.Z.Item,{label:"Email Address",name:"user_email",children:(0,t.jsx)(u.Z,{type:"email",disabled:!0,value:v,defaultValue:v,className:"max-w-md"})}),(0,t.jsx)(g.Z.Item,{label:"Password",name:"password",rules:[{required:!0,message:"password required to sign up"}],help:"Create a password for your account",children:(0,t.jsx)(u.Z,{placeholder:"",type:"password",className:"max-w-md"})})]}),(0,t.jsx)("div",{className:"mt-10",children:(0,t.jsx)(Z.ZP,{htmlType:"submit",children:"Sign Up"})})]})]})})}},48951:function(e,l,s){"use strict";s.r(l),s.d(l,{default:function(){return lo}});var t,n,a=s(3827),r=s(64090),i=s(47907),o=s(8792),d=s(40491),c=s(65270),m=e=>{let{userID:l,userRole:s,userEmail:t,showSSOBanner:n,premiumUser:r,setProxySettings:i,proxySettings:m}=e;console.log("User ID:",l),console.log("userEmail:",t),console.log("showSSOBanner:",n),console.log("premiumUser:",r);let u="";console.log("PROXY_settings=",m),m&&m.PROXY_LOGOUT_URL&&void 0!==m.PROXY_LOGOUT_URL&&(u=m.PROXY_LOGOUT_URL),console.log("logoutUrl=",u);let h=[{key:"1",label:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("p",{children:["Role: ",s]}),(0,a.jsxs)("p",{children:["ID: ",l]}),(0,a.jsxs)("p",{children:["Premium User: ",String(r)]})]})},{key:"2",label:(0,a.jsx)("p",{onClick:()=>{document.cookie="token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;",window.location.href=u},children:"Logout"})}];return(0,a.jsxs)("nav",{className:"left-0 right-0 top-0 flex justify-between items-center h-12 mb-4",children:[(0,a.jsx)("div",{className:"text-left my-2 absolute top-0 left-0",children:(0,a.jsx)("div",{className:"flex flex-col items-center",children:(0,a.jsx)(o.default,{href:"/",children:(0,a.jsx)("button",{className:"text-gray-800 rounded text-center",children:(0,a.jsx)("img",{src:"/get_image",width:160,height:160,alt:"LiteLLM Brand",className:"mr-2"})})})})}),(0,a.jsxs)("div",{className:"text-right mx-4 my-2 absolute top-0 right-0 flex items-center justify-end space-x-2",children:[n?(0,a.jsx)("div",{style:{padding:"6px",borderRadius:"8px"},children:(0,a.jsx)("a",{href:"https://calendly.com/d/4mp-gd3-k5k/litellm-1-1-onboarding-chat",target:"_blank",style:{fontSize:"14px",textDecoration:"underline"},children:"Get enterprise license"})}):null,(0,a.jsx)("div",{style:{border:"1px solid #391085",padding:"6px",borderRadius:"8px"},children:(0,a.jsx)(d.Z,{menu:{items:h},children:(0,a.jsx)(c.Z,{children:t})})})]})]})},u=s(777),h=s(10384),x=s(46453),p=s(16450),j=s(52273),g=s(26780),Z=s(15595),f=s(6698),_=s(71801),y=s(42440),b=s(42308),v=s(50670),k=s(60620),S=s(80588),w=s(99129),N=s(44839),I=s(88707),A=s(1861);let{Option:C}=v.default;var P=e=>{let{userID:l,team:s,userRole:t,accessToken:n,data:i,setData:o}=e,[d]=k.Z.useForm(),[c,m]=(0,r.useState)(!1),[P,T]=(0,r.useState)(null),[E,O]=(0,r.useState)(null),[R,F]=(0,r.useState)([]),[M,D]=(0,r.useState)([]),L=()=>{m(!1),d.resetFields()},U=()=>{m(!1),T(null),d.resetFields()};(0,r.useEffect)(()=>{(async()=>{try{if(null===l||null===t)return;if(null!==n){let e=(await (0,u.So)(n,l,t)).data.map(e=>e.id);console.log("available_model_names:",e),F(e)}}catch(e){console.error("Error fetching user models:",e)}})()},[n,l,t]);let V=async e=>{try{var s,t,a;let r=null!==(s=null==e?void 0:e.key_alias)&&void 0!==s?s:"",c=null!==(t=null==e?void 0:e.team_id)&&void 0!==t?t:null;if((null!==(a=null==i?void 0:i.filter(e=>e.team_id===c).map(e=>e.key_alias))&&void 0!==a?a:[]).includes(r))throw Error("Key alias ".concat(r," already exists for team with ID ").concat(c,", please provide another key alias"));S.ZP.info("Making API Call"),m(!0);let h=await (0,u.wX)(n,l,e);console.log("key create Response:",h),o(e=>e?[...e,h]:[h]),T(h.key),O(h.soft_budget),S.ZP.success("API Key Created"),d.resetFields(),localStorage.removeItem("userData"+l)}catch(e){console.error("Error creating the key:",e),S.ZP.error("Error creating the key: ".concat(e),20)}};return(0,r.useEffect)(()=>{D(s&&s.models.length>0?s.models.includes("all-proxy-models")?R:s.models:R)},[s,R]),(0,a.jsxs)("div",{children:[(0,a.jsx)(p.Z,{className:"mx-auto",onClick:()=>m(!0),children:"+ Create New Key"}),(0,a.jsx)(w.Z,{title:"Create Key",visible:c,width:800,footer:null,onOk:L,onCancel:U,children:(0,a.jsxs)(k.Z,{form:d,onFinish:V,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{label:"Key Name",name:"key_alias",rules:[{required:!0,message:"Please input a key name"}],help:"required",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(k.Z.Item,{label:"Team ID",name:"team_id",hidden:!0,initialValue:s?s.team_id:null,valuePropName:"team_id",className:"mt-8",children:(0,a.jsx)(N.Z,{value:s?s.team_alias:"",disabled:!0})}),(0,a.jsx)(k.Z.Item,{label:"Models",name:"models",rules:[{required:!0,message:"Please select a model"}],help:"required",children:(0,a.jsxs)(v.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},onChange:e=>{e.includes("all-team-models")&&d.setFieldsValue({models:["all-team-models"]})},children:[(0,a.jsx)(C,{value:"all-team-models",children:"All Team Models"},"all-team-models"),M.map(e=>(0,a.jsx)(C,{value:e,children:e},e))]})}),(0,a.jsxs)(g.Z,{className:"mt-20 mb-8",children:[(0,a.jsx)(f.Z,{children:(0,a.jsx)("b",{children:"Optional Settings"})}),(0,a.jsxs)(Z.Z,{children:[(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"Max Budget (USD)",name:"max_budget",help:"Budget cannot exceed team max budget: $".concat((null==s?void 0:s.max_budget)!==null&&(null==s?void 0:s.max_budget)!==void 0?null==s?void 0:s.max_budget:"unlimited"),rules:[{validator:async(e,l)=>{if(l&&s&&null!==s.max_budget&&l>s.max_budget)throw Error("Budget cannot exceed team max budget: $".concat(s.max_budget))}}],children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",help:"Team Reset Budget: ".concat((null==s?void 0:s.budget_duration)!==null&&(null==s?void 0:s.budget_duration)!==void 0?null==s?void 0:s.budget_duration:"None"),children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})}),(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"Tokens per minute Limit (TPM)",name:"tpm_limit",help:"TPM cannot exceed team TPM limit: ".concat((null==s?void 0:s.tpm_limit)!==null&&(null==s?void 0:s.tpm_limit)!==void 0?null==s?void 0:s.tpm_limit:"unlimited"),rules:[{validator:async(e,l)=>{if(l&&s&&null!==s.tpm_limit&&l>s.tpm_limit)throw Error("TPM limit cannot exceed team TPM limit: ".concat(s.tpm_limit))}}],children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"Requests per minute Limit (RPM)",name:"rpm_limit",help:"RPM cannot exceed team RPM limit: ".concat((null==s?void 0:s.rpm_limit)!==null&&(null==s?void 0:s.rpm_limit)!==void 0?null==s?void 0:s.rpm_limit:"unlimited"),rules:[{validator:async(e,l)=>{if(l&&s&&null!==s.rpm_limit&&l>s.rpm_limit)throw Error("RPM limit cannot exceed team RPM limit: ".concat(s.rpm_limit))}}],children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(k.Z.Item,{label:"Expire Key (eg: 30s, 30h, 30d)",name:"duration",className:"mt-8",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(k.Z.Item,{label:"Metadata",name:"metadata",className:"mt-8",children:(0,a.jsx)(N.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})})]})]})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Create Key"})})]})}),P&&(0,a.jsx)(w.Z,{visible:c,onOk:L,onCancel:U,footer:null,children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 w-full",children:[(0,a.jsx)(y.Z,{children:"Save your Key"}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)("p",{children:["Please save this secret key somewhere safe and accessible. For security reasons, ",(0,a.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]})}),(0,a.jsx)(h.Z,{numColSpan:1,children:null!=P?(0,a.jsxs)("div",{children:[(0,a.jsx)(_.Z,{className:"mt-3",children:"API Key:"}),(0,a.jsx)("div",{style:{background:"#f8f8f8",padding:"10px",borderRadius:"5px",marginBottom:"10px"},children:(0,a.jsx)("pre",{style:{wordWrap:"break-word",whiteSpace:"normal"},children:P})}),(0,a.jsx)(b.CopyToClipboard,{text:P,onCopy:()=>{S.ZP.success("API Key copied to clipboard")},children:(0,a.jsx)(p.Z,{className:"mt-3",children:"Copy API Key"})})]}):(0,a.jsx)(_.Z,{children:"Key being created, this might take 30s"})})]})})]})},T=s(9454),E=s(98941),O=s(33393),R=s(5),F=s(13810),M=s(61244),D=s(10827),L=s(3851),U=s(2044),V=s(64167),q=s(74480),z=s(7178),B=s(95093),K=s(27166);let{Option:W}=v.default;var H=e=>{let{userID:l,userRole:s,accessToken:t,selectedTeam:n,data:i,setData:o,teams:d}=e,[c,m]=(0,r.useState)(!1),[h,x]=(0,r.useState)(!1),[j,g]=(0,r.useState)(null),[Z,f]=(0,r.useState)(null),[b,C]=(0,r.useState)(null),[P,H]=(0,r.useState)(""),[G,Y]=(0,r.useState)(!1),[J,X]=(0,r.useState)(!1),[$,Q]=(0,r.useState)(null),[ee,el]=(0,r.useState)([]),es=new Set,[et,en]=(0,r.useState)(es);(0,r.useEffect)(()=>{(async()=>{try{if(null===l)return;if(null!==t&&null!==s){let e=(await (0,u.So)(t,l,s)).data.map(e=>e.id);console.log("available_model_names:",e),el(e)}}catch(e){console.error("Error fetching user models:",e)}})()},[t,l,s]),(0,r.useEffect)(()=>{if(d){let e=new Set;d.forEach((l,s)=>{let t=l.team_id;e.add(t)}),en(e)}},[d]);let ea=e=>{console.log("handleEditClick:",e),null==e.token&&null!==e.token_id&&(e.token=e.token_id),Q(e),Y(!0)},er=async e=>{if(null==t)return;let l=e.token;e.key=l,console.log("handleEditSubmit:",e);let s=await (0,u.Nc)(t,e);console.log("handleEditSubmit: newKeyValues",s),i&&o(i.map(e=>e.token===l?s:e)),S.ZP.success("Key updated successfully"),Y(!1),Q(null)},ei=async e=>{console.log("handleDelete:",e),null==e.token&&null!==e.token_id&&(e.token=e.token_id),null!=i&&(g(e.token),localStorage.removeItem("userData"+l),x(!0))},eo=async()=>{if(null!=j&&null!=i){try{await (0,u.I1)(t,j);let e=i.filter(e=>e.token!==j);o(e)}catch(e){console.error("Error deleting the key:",e)}x(!1),g(null)}};if(null!=i)return console.log("RERENDER TRIGGERED"),(0,a.jsxs)("div",{children:[(0,a.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4 mt-2",children:[(0,a.jsxs)(D.Z,{className:"mt-5 max-h-[300px] min-h-[300px]",children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Key Alias"}),(0,a.jsx)(q.Z,{children:"Secret Key"}),(0,a.jsx)(q.Z,{children:"Spend (USD)"}),(0,a.jsx)(q.Z,{children:"Budget (USD)"}),(0,a.jsx)(q.Z,{children:"Models"}),(0,a.jsx)(q.Z,{children:"TPM / RPM Limits"})]})}),(0,a.jsx)(L.Z,{children:i.map(e=>{if(console.log(e),"litellm-dashboard"===e.team_id)return null;if(n){if(console.log("item team id: ".concat(e.team_id,", knownTeamIDs.has(item.team_id): ").concat(et.has(e.team_id),", selectedTeam id: ").concat(n.team_id)),(null!=n.team_id||null===e.team_id||et.has(e.team_id))&&e.team_id!=n.team_id)return null;console.log("item team id: ".concat(e.team_id,", is returned"))}return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{style:{maxWidth:"2px",whiteSpace:"pre-wrap",overflow:"hidden"},children:null!=e.key_alias?(0,a.jsx)(_.Z,{children:e.key_alias}):(0,a.jsx)(_.Z,{children:"Not Set"})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(_.Z,{children:e.key_name})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(_.Z,{children:(()=>{try{return parseFloat(e.spend).toFixed(4)}catch(l){return e.spend}})()})}),(0,a.jsx)(U.Z,{children:null!=e.max_budget?(0,a.jsx)(_.Z,{children:e.max_budget}):(0,a.jsx)(_.Z,{children:"Unlimited"})}),(0,a.jsx)(U.Z,{children:Array.isArray(e.models)?(0,a.jsx)("div",{style:{display:"flex",flexDirection:"column"},children:0===e.models.length?(0,a.jsx)(a.Fragment,{children:n&&n.models&&n.models.length>0?n.models.map((e,l)=>"all-proxy-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Proxy Models"})},l):"all-team-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Team Models"})},l):(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"blue",children:(0,a.jsx)(_.Z,{children:e.length>30?"".concat(e.slice(0,30),"..."):e})},l)):(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"blue",children:(0,a.jsx)(_.Z,{children:"all-proxy-models"})})}):e.models.map((e,l)=>"all-proxy-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Proxy Models"})},l):"all-team-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Team Models"})},l):(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"blue",children:(0,a.jsx)(_.Z,{children:e.length>30?"".concat(e.slice(0,30),"..."):e})},l))}):null}),(0,a.jsx)(U.Z,{children:(0,a.jsxs)(_.Z,{children:["TPM: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,a.jsx)("br",{})," RPM:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(M.Z,{onClick:()=>{Q(e),X(!0)},icon:T.Z,size:"sm"}),(0,a.jsx)(w.Z,{open:J,onCancel:()=>{X(!1),Q(null)},footer:null,width:800,children:$&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3 mt-8",children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Spend"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:(()=>{try{return parseFloat($.spend).toFixed(4)}catch(e){return $.spend}})()})})]}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Budget"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:null!=$.max_budget?(0,a.jsx)(a.Fragment,{children:$.max_budget}):(0,a.jsx)(a.Fragment,{children:"Unlimited"})})})]},e.name),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Expires"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor-default font-small text-tremor-content-strong dark:text-dark-tremor-content-strong",children:null!=$.expires?(0,a.jsx)(a.Fragment,{children:new Date($.expires).toLocaleString(void 0,{day:"numeric",month:"long",year:"numeric",hour:"numeric",minute:"numeric",second:"numeric"})}):(0,a.jsx)(a.Fragment,{children:"Never"})})})]},e.name)]}),(0,a.jsxs)(F.Z,{className:"my-4",children:[(0,a.jsx)(y.Z,{children:"Token Name"}),(0,a.jsx)(_.Z,{className:"my-1",children:$.key_alias?$.key_alias:$.key_name}),(0,a.jsx)(y.Z,{children:"Token ID"}),(0,a.jsx)(_.Z,{className:"my-1 text-[12px]",children:$.token}),(0,a.jsx)(y.Z,{children:"Metadata"}),(0,a.jsx)(_.Z,{className:"my-1",children:(0,a.jsxs)("pre",{children:[JSON.stringify($.metadata)," "]})})]}),(0,a.jsx)(p.Z,{className:"mx-auto flex items-center",onClick:()=>{X(!1),Q(null)},children:"Close"})]})}),(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>ea(e)}),(0,a.jsx)(M.Z,{onClick:()=>ei(e),icon:O.Z,size:"sm"})]})]},e.token)})})]}),h&&(0,a.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,a.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,a.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,a.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,a.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:""}),(0,a.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,a.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,a.jsx)("div",{className:"sm:flex sm:items-start",children:(0,a.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,a.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Key"}),(0,a.jsx)("div",{className:"mt-2",children:(0,a.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this key ?"})})]})})}),(0,a.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,a.jsx)(p.Z,{onClick:eo,color:"red",className:"ml-2",children:"Delete"}),(0,a.jsx)(p.Z,{onClick:()=>{x(!1),g(null)},children:"Cancel"})]})]})]})})]}),$&&(0,a.jsx)(e=>{let{visible:l,onCancel:s,token:t,onSubmit:i}=e,[o]=k.Z.useForm(),[c,m]=(0,r.useState)(n),[u,h]=(0,r.useState)([]),[x,p]=(0,r.useState)(!1);return(0,a.jsx)(w.Z,{title:"Edit Key",visible:l,width:800,footer:null,onOk:()=>{o.validateFields().then(e=>{o.resetFields()}).catch(e=>{console.error("Validation failed:",e)})},onCancel:s,children:(0,a.jsxs)(k.Z,{form:o,onFinish:er,initialValues:t,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{label:"Key Name",name:"key_alias",rules:[{required:!0,message:"Please input a key name"}],help:"required",children:(0,a.jsx)(N.Z,{})}),(0,a.jsx)(k.Z.Item,{label:"Models",name:"models",rules:[{validator:(e,l)=>{let s=l.filter(e=>!c.models.includes(e)&&"all-team-models"!==e&&"all-proxy-models"!==e&&!c.models.includes("all-proxy-models"));return(console.log("errorModels: ".concat(s)),s.length>0)?Promise.reject("Some models are not part of the new team's models - ".concat(s,"Team models: ").concat(c.models)):Promise.resolve()}}],children:(0,a.jsxs)(v.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:[(0,a.jsx)(W,{value:"all-team-models",children:"All Team Models"},"all-team-models"),c&&c.models?c.models.includes("all-proxy-models")?ee.filter(e=>"all-proxy-models"!==e).map(e=>(0,a.jsx)(W,{value:e,children:e},e)):c.models.map(e=>(0,a.jsx)(W,{value:e,children:e},e)):ee.map(e=>(0,a.jsx)(W,{value:e,children:e},e))]})}),(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"Max Budget (USD)",name:"max_budget",help:"Budget cannot exceed team max budget: ".concat((null==c?void 0:c.max_budget)!==null&&(null==c?void 0:c.max_budget)!==void 0?null==c?void 0:c.max_budget:"unlimited"),rules:[{validator:async(e,l)=>{if(l&&c&&null!==c.max_budget&&l>c.max_budget)throw console.log("keyTeam.max_budget: ".concat(c.max_budget)),Error("Budget cannot exceed team max budget: $".concat(c.max_budget))}}],children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(k.Z.Item,{label:"token",name:"token",hidden:!0}),(0,a.jsx)(k.Z.Item,{label:"Team",name:"team_id",help:"the team this key belongs to",children:(0,a.jsx)(B.Z,{value:t.team_alias,children:null==d?void 0:d.map((e,l)=>(0,a.jsx)(K.Z,{value:e.team_id,onClick:()=>m(e),children:e.team_alias},l))})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Edit Key"})})]})})},{visible:G,onCancel:()=>{Y(!1),Q(null)},token:$,onSubmit:er})]})},G=e=>{let{userID:l,userRole:s,accessToken:t,userSpend:n,selectedTeam:i}=e;console.log("userSpend: ".concat(n));let[o,d]=(0,r.useState)(null!==n?n:0),[c,m]=(0,r.useState)(0),[h,x]=(0,r.useState)([]);(0,r.useEffect)(()=>{let e=async()=>{if(t&&l&&s&&"Admin"===s&&null==n)try{let e=await (0,u.Qy)(t);e&&(e.spend?d(e.spend):d(0),e.max_budget?m(e.max_budget):m(0))}catch(e){console.error("Error fetching global spend data:",e)}};(async()=>{try{if(null===l||null===s)return;if(null!==t){let e=(await (0,u.So)(t,l,s)).data.map(e=>e.id);console.log("available_model_names:",e),x(e)}}catch(e){console.error("Error fetching user models:",e)}})(),e()},[s,t,l]),(0,r.useEffect)(()=>{null!==n&&d(n)},[n]);let p=[];i&&i.models&&(p=i.models),p&&p.includes("all-proxy-models")?(console.log("user models:",h),p=h):p&&p.includes("all-team-models")?p=i.models:p&&0===p.length&&(p=h);let j=void 0!==o?o.toFixed(4):null;return console.log("spend in view user spend: ".concat(o)),(0,a.jsx)("div",{className:"flex items-center",children:(0,a.jsxs)("div",{children:[(0,a.jsxs)("p",{className:"text-tremor-default text-tremor-content dark:text-dark-tremor-content",children:["Total Spend"," "]}),(0,a.jsxs)("p",{className:"text-2xl text-tremor-content-strong dark:text-dark-tremor-content-strong font-semibold",children:["$",j]})]})})},Y=e=>{let{userID:l,userRole:s,selectedTeam:t,accessToken:n}=e,[i,o]=(0,r.useState)([]);(0,r.useEffect)(()=>{(async()=>{try{if(null===l||null===s)return;if(null!==n){let e=(await (0,u.So)(n,l,s)).data.map(e=>e.id);console.log("available_model_names:",e),o(e)}}catch(e){console.error("Error fetching user models:",e)}})()},[n,l,s]);let d=[];return t&&t.models&&(d=t.models),d&&d.includes("all-proxy-models")&&(console.log("user models:",i),d=i),(0,a.jsx)(a.Fragment,{children:(0,a.jsx)("div",{className:"mb-5",children:(0,a.jsx)("p",{className:"text-3xl text-tremor-content-strong dark:text-dark-tremor-content-strong font-semibold",children:null==t?void 0:t.team_alias})})})},J=e=>{let l,{teams:s,setSelectedTeam:t,userRole:n}=e,i={models:[],team_id:null,team_alias:"Default Team"},[o,d]=(0,r.useState)(i);return(l="App User"===n?s:s?[...s,i]:[i],"App User"===n)?null:(0,a.jsxs)("div",{className:"mt-5 mb-5",children:[(0,a.jsx)(y.Z,{children:"Select Team"}),(0,a.jsx)(_.Z,{children:"If you belong to multiple teams, this setting controls which team is used by default when creating new API Keys."}),(0,a.jsxs)(_.Z,{className:"mt-3 mb-3",children:[(0,a.jsx)("b",{children:"Default Team:"})," If no team_id is set for a key, it will be grouped under here."]}),l&&l.length>0?(0,a.jsx)(B.Z,{defaultValue:"0",children:l.map((e,l)=>(0,a.jsx)(K.Z,{value:String(l),onClick:()=>t(e),children:e.team_alias},l))}):(0,a.jsxs)(_.Z,{children:["No team created. ",(0,a.jsx)("b",{children:"Defaulting to personal account."})]})]})},X=s(667),$=s(37963),Q=s(97482);console.log("isLocal:",!1);var ee=e=>{let{userID:l,userRole:s,teams:t,keys:n,setUserRole:o,userEmail:d,setUserEmail:c,setTeams:m,setKeys:p,setProxySettings:j,proxySettings:g}=e,[Z,f]=(0,r.useState)(null),_=(0,i.useSearchParams)();_.get("viewSpend"),(0,i.useRouter)();let y=function(e){console.log("COOKIES",document.cookie);let l=document.cookie.split("; ").find(l=>l.startsWith(e+"="));return l?l.split("=")[1]:null}("token"),b=_.get("invitation_id"),[v,k]=(0,r.useState)(null),[S,w]=(0,r.useState)(null),[N,I]=(0,r.useState)([]),A={models:[],team_alias:"Default Team",team_id:null},[C,T]=(0,r.useState)(t?t[0]:A);if(window.addEventListener("beforeunload",function(){sessionStorage.clear()}),(0,r.useEffect)(()=>{if(y){let e=(0,$.o)(y);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),k(e.key),e.user_role){let l=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";case"internal_user":return"Internal User";case"internal_user_viewer":return"Internal Viewer";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",l),o(l)}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e))}}if(l&&v&&s&&!n&&!Z){let e=sessionStorage.getItem("userModels"+l);e?I(JSON.parse(e)):(async()=>{try{let e=await (0,u.Dj)(v);j(e);let t=await (0,u.Br)(v,l,s,!1,null,null);if(console.log("received teams in user dashboard: ".concat(Object.keys(t),"; team values: ").concat(Object.entries(t.teams))),"Admin"==s){let e=await (0,u.Qy)(v);f(e),console.log("globalSpend:",e)}else f(t.user_info);p(t.keys),m(t.teams);let n=[...t.teams];n.length>0?(console.log("response['teams']: ".concat(n)),T(n[0])):T(A),sessionStorage.setItem("userData"+l,JSON.stringify(t.keys)),sessionStorage.setItem("userSpendData"+l,JSON.stringify(t.user_info));let a=(await (0,u.So)(v,l,s)).data.map(e=>e.id);console.log("available_model_names:",a),I(a),console.log("userModels:",N),sessionStorage.setItem("userModels"+l,JSON.stringify(a))}catch(e){console.error("There was an error fetching the data",e)}})()}},[l,y,v,n,s]),(0,r.useEffect)(()=>{if(null!==n&&null!=C&&null!==C.team_id){let e=0;for(let l of n)C.hasOwnProperty("team_id")&&null!==l.team_id&&l.team_id===C.team_id&&(e+=l.spend);w(e)}else if(null!==n){let e=0;for(let l of n)e+=l.spend;w(e)}},[C]),null!=b)return(0,a.jsx)(X.default,{});if(null==l||null==y){let e="/sso/key/generate";return document.cookie="token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;",console.log("Full URL:",e),window.location.href=e,null}if(null==v)return null;if(null==s&&o("App Owner"),s&&"Admin Viewer"==s){let{Title:e,Paragraph:l}=Q.default;return(0,a.jsxs)("div",{children:[(0,a.jsx)(e,{level:1,children:"Access Denied"}),(0,a.jsx)(l,{children:"Ask your proxy admin for access to create keys"})]})}return console.log("inside user dashboard, selected team",C),(0,a.jsx)("div",{className:"w-full mx-4",children:(0,a.jsx)(x.Z,{numItems:1,className:"gap-2 p-8 h-[75vh] w-full mt-2",children:(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(Y,{userID:l,userRole:s,selectedTeam:C||null,accessToken:v}),(0,a.jsx)(G,{userID:l,userRole:s,accessToken:v,userSpend:S,selectedTeam:C||null}),(0,a.jsx)(H,{userID:l,userRole:s,accessToken:v,selectedTeam:C||null,data:n,setData:p,teams:t}),(0,a.jsx)(P,{userID:l,team:C||null,userRole:s,accessToken:v,data:n,setData:p},C?C.team_id:null),(0,a.jsx)(J,{teams:t,setSelectedTeam:T,userRole:s})]})})})},el=s(49167),es=s(35087),et=s(92836),en=s(26734),ea=s(41608),er=s(32126),ei=s(23682),eo=s(47047),ed=s(76628),ec=s(25707),em=s(44041),eu=s(6180),eh=s(28683),ex=s(38302),ep=s(66242),ej=s(78578),eg=s(63954),eZ=s(34658),ef=e=>{let{modelID:l,accessToken:s}=e,[t,n]=(0,r.useState)(!1),i=async()=>{try{S.ZP.info("Making API Call"),n(!0);let e=await (0,u.Og)(s,l);console.log("model delete Response:",e),S.ZP.success("Model ".concat(l," deleted successfully")),n(!1)}catch(e){console.error("Error deleting the model:",e)}};return(0,a.jsxs)("div",{children:[(0,a.jsx)(M.Z,{onClick:()=>n(!0),icon:O.Z,size:"sm"}),(0,a.jsx)(w.Z,{open:t,onOk:i,okType:"danger",onCancel:()=>n(!1),children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 w-full",children:[(0,a.jsx)(y.Z,{children:"Delete Model"}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsx)("p",{children:"Are you sure you want to delete this model? This action is irreversible."})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)("p",{children:["Model ID: ",(0,a.jsx)("b",{children:l})]})})]})})]})},e_=s(97766),ey=s(46495),eb=s(18190),ev=s(91118),ek=e=>{let{modelMetrics:l,modelMetricsCategories:s,customTooltip:t,premiumUser:n}=e;return n?(0,a.jsx)(ev.Z,{title:"Time to First token (s)",className:"h-72",data:l,index:"date",showLegend:!1,categories:s,colors:["indigo","rose"],connectNulls:!0,customTooltip:t}):(0,a.jsxs)("div",{children:[(0,a.jsx)(eb.Z,{title:"✨ Enterprise Feature",color:"teal",className:"mt-2 mb-4",children:"Enterprise features are available for users with a specific license, please contact LiteLLM to unlock this limitation."}),(0,a.jsx)(p.Z,{variant:"primary",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get in touch"})})]})},eS=e=>{let{fields:l,selectedProvider:s}=e;return 0===l.length?null:(0,a.jsx)(a.Fragment,{children:l.map(e=>(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:e.field_name.replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase()),name:e.field_name,tooltip:e.field_description,className:"mb-2",children:(0,a.jsx)(j.Z,{placeholder:e.field_value,type:"password"})},e.field_name))})},ew=s(67951);let{Title:eN,Link:eI}=Q.default;(t=n||(n={})).OpenAI="OpenAI",t.Azure="Azure",t.Azure_AI_Studio="Azure AI Studio",t.Anthropic="Anthropic",t.Google_AI_Studio="Google AI Studio",t.Bedrock="Amazon Bedrock",t.OpenAI_Compatible="OpenAI-Compatible Endpoints (Groq, Together AI, Mistral AI, etc.)",t.Vertex_AI="Vertex AI (Anthropic, Gemini, etc.)",t.Databricks="Databricks",t.Ollama="Ollama";let eA={OpenAI:"openai",Azure:"azure",Azure_AI_Studio:"azure_ai",Anthropic:"anthropic",Google_AI_Studio:"gemini",Bedrock:"bedrock",OpenAI_Compatible:"openai",Vertex_AI:"vertex_ai",Databricks:"databricks",Ollama:"ollama"},eC={"BadRequestError (400)":"BadRequestErrorRetries","AuthenticationError (401)":"AuthenticationErrorRetries","TimeoutError (408)":"TimeoutErrorRetries","RateLimitError (429)":"RateLimitErrorRetries","ContentPolicyViolationError (400)":"ContentPolicyViolationErrorRetries","InternalServerError (500)":"InternalServerErrorRetries"},eP=async(e,l,s)=>{try{let t=Array.isArray(e.model)?e.model:[e.model];console.log("received deployments: ".concat(t)),console.log("received type of deployments: ".concat(typeof t)),t.forEach(async s=>{console.log("litellm_model: ".concat(s));let t={},n={};t.model=s;let a="";for(let[l,s]of(console.log("formValues add deployment:",e),Object.entries(e)))if(""!==s){if("model_name"==l)a+=s;else if("custom_llm_provider"==l){console.log("custom_llm_provider:",s);let e=eA[s];t.custom_llm_provider=e,console.log("custom_llm_provider mappingResult:",e)}else if("model"==l)continue;else if("base_model"===l)n[l]=s;else if("custom_model_name"===l)t.model=s;else if("litellm_extra_params"==l){console.log("litellm_extra_params:",s);let e={};if(s&&void 0!=s){try{e=JSON.parse(s)}catch(e){throw S.ZP.error("Failed to parse LiteLLM Extra Params: "+e,10),Error("Failed to parse litellm_extra_params: "+e)}for(let[l,s]of Object.entries(e))t[l]=s}}else t[l]=s}let r={model_name:a,litellm_params:t,model_info:n},i=await (0,u.kK)(l,r);console.log("response for model create call: ".concat(i.data))}),s.resetFields()}catch(e){S.ZP.error("Failed to create model: "+e,10)}};var eT=e=>{let l,{accessToken:s,token:t,userRole:i,userID:o,modelData:d={data:[]},keys:c,setModelData:m,premiumUser:h}=e,[g,Z]=(0,r.useState)([]),[f]=k.Z.useForm(),[b,v]=(0,r.useState)(null),[N,C]=(0,r.useState)(""),[P,O]=(0,r.useState)([]),W=Object.values(n).filter(e=>isNaN(Number(e))),[H,G]=(0,r.useState)([]),[Y,J]=(0,r.useState)("OpenAI"),[X,$]=(0,r.useState)(""),[ee,eb]=(0,r.useState)(!1),[ev,eT]=(0,r.useState)(!1),[eE,eO]=(0,r.useState)(null),[eR,eF]=(0,r.useState)([]),[eM,eD]=(0,r.useState)(null),[eL,eU]=(0,r.useState)([]),[eV,eq]=(0,r.useState)([]),[ez,eB]=(0,r.useState)([]),[eK,eW]=(0,r.useState)([]),[eH,eG]=(0,r.useState)([]),[eY,eJ]=(0,r.useState)([]),[eX,e$]=(0,r.useState)([]),[eQ,e0]=(0,r.useState)([]),[e1,e2]=(0,r.useState)([]),[e4,e5]=(0,r.useState)({from:new Date(Date.now()-6048e5),to:new Date}),[e8,e3]=(0,r.useState)(null),[e6,e9]=(0,r.useState)(0),[e7,le]=(0,r.useState)({}),[ll,ls]=(0,r.useState)([]),[lt,ln]=(0,r.useState)(!1),[la,lr]=(0,r.useState)(null),[li,lo]=(0,r.useState)(null),[ld,lc]=(0,r.useState)([]);(0,r.useEffect)(()=>{lb(eM,e4.from,e4.to)},[la,li]);let lm=e=>{eO(e),eb(!0)},lu=e=>{eO(e),eT(!0)},lh=async e=>{if(console.log("handleEditSubmit:",e),null==s)return;let l={},t=null;for(let[s,n]of Object.entries(e))"model_id"!==s?l[s]=n:t=n;let n={litellm_params:l,model_info:{id:t}};console.log("handleEditSubmit payload:",n);try{await (0,u.um)(s,n),S.ZP.success("Model updated successfully, restart server to see updates"),eb(!1),eO(null)}catch(e){console.log("Error occurred")}},lx=()=>{C(new Date().toLocaleString())},lp=async()=>{if(!s){console.error("Access token is missing");return}console.log("new modelGroupRetryPolicy:",e8);try{await (0,u.K_)(s,{router_settings:{model_group_retry_policy:e8}}),S.ZP.success("Retry settings saved successfully")}catch(e){console.error("Failed to save retry settings:",e),S.ZP.error("Failed to save retry settings")}};if((0,r.useEffect)(()=>{if(!s||!t||!i||!o)return;let e=async()=>{try{var e,l,t,n,a,r,d,c,h,x,p,j;let g=await (0,u.hy)(s);G(g);let Z=await (0,u.AZ)(s,o,i);console.log("Model data response:",Z.data),m(Z);let f=new Set;for(let e=0;e0&&(y=_[_.length-1],console.log("_initial_model_group:",y)),console.log("selectedModelGroup:",eM);let b=await (0,u.o6)(s,o,i,y,null===(e=e4.from)||void 0===e?void 0:e.toISOString(),null===(l=e4.to)||void 0===l?void 0:l.toISOString(),null==la?void 0:la.token,li);console.log("Model metrics response:",b),eq(b.data),eB(b.all_api_bases);let v=await (0,u.Rg)(s,y,null===(t=e4.from)||void 0===t?void 0:t.toISOString(),null===(n=e4.to)||void 0===n?void 0:n.toISOString());eW(v.data),eG(v.all_api_bases);let k=await (0,u.N8)(s,o,i,y,null===(a=e4.from)||void 0===a?void 0:a.toISOString(),null===(r=e4.to)||void 0===r?void 0:r.toISOString(),null==la?void 0:la.token,li);console.log("Model exceptions response:",k),eJ(k.data),e$(k.exception_types);let S=await (0,u.fP)(s,o,i,y,null===(d=e4.from)||void 0===d?void 0:d.toISOString(),null===(c=e4.to)||void 0===c?void 0:c.toISOString(),null==la?void 0:la.token,li),w=await (0,u.n$)(s,null===(h=e4.from)||void 0===h?void 0:h.toISOString().split("T")[0],null===(x=e4.to)||void 0===x?void 0:x.toISOString().split("T")[0],y);le(w);let N=await (0,u.v9)(s,null===(p=e4.from)||void 0===p?void 0:p.toISOString().split("T")[0],null===(j=e4.to)||void 0===j?void 0:j.toISOString().split("T")[0],y);ls(N),console.log("dailyExceptions:",w),console.log("dailyExceptionsPerDeplyment:",N),console.log("slowResponses:",S),e2(S);let I=await (0,u.j2)(s);lc(null==I?void 0:I.end_users);let A=(await (0,u.BL)(s,o,i)).router_settings;console.log("routerSettingsInfo:",A);let C=A.model_group_retry_policy,P=A.num_retries;console.log("model_group_retry_policy:",C),console.log("default_retries:",P),e3(C),e9(P)}catch(e){console.error("There was an error fetching the model data",e)}};s&&t&&i&&o&&e();let l=async()=>{let e=await (0,u.qm)(s);console.log("received model cost map data: ".concat(Object.keys(e))),v(e)};null==b&&l(),lx()},[s,t,i,o,b,N]),!d||!s||!t||!i||!o)return(0,a.jsx)("div",{children:"Loading..."});let lj=[];for(let e=0;e(console.log("GET PROVIDER CALLED! - ".concat(b)),null!=b&&"object"==typeof b&&e in b)?b[e].litellm_provider:"openai";if(s){let e=s.split("/"),l=e[0];(a=t)||(a=1===e.length?u(s):l)}else a="-";n&&(r=null==n?void 0:n.input_cost_per_token,i=null==n?void 0:n.output_cost_per_token,o=null==n?void 0:n.max_tokens,c=null==n?void 0:n.max_input_tokens),(null==l?void 0:l.litellm_params)&&(m=Object.fromEntries(Object.entries(null==l?void 0:l.litellm_params).filter(e=>{let[l]=e;return"model"!==l&&"api_base"!==l}))),d.data[e].provider=a,d.data[e].input_cost=r,d.data[e].output_cost=i,d.data[e].input_cost&&(d.data[e].input_cost=(1e6*Number(d.data[e].input_cost)).toFixed(2)),d.data[e].output_cost&&(d.data[e].output_cost=(1e6*Number(d.data[e].output_cost)).toFixed(2)),d.data[e].max_tokens=o,d.data[e].max_input_tokens=c,d.data[e].api_base=null==l?void 0:null===(lf=l.litellm_params)||void 0===lf?void 0:lf.api_base,d.data[e].cleanedLitellmParams=m,lj.push(l.model_name),console.log(d.data[e])}if(i&&"Admin Viewer"==i){let{Title:e,Paragraph:l}=Q.default;return(0,a.jsxs)("div",{children:[(0,a.jsx)(e,{level:1,children:"Access Denied"}),(0,a.jsx)(l,{children:"Ask your proxy admin for access to view all models"})]})}let l_=e=>{console.log("received provider string: ".concat(e));let l=Object.keys(n).find(l=>n[l]===e);if(l){let e=eA[l];console.log("mappingResult: ".concat(e));let s=[];"object"==typeof b&&Object.entries(b).forEach(l=>{let[t,n]=l;null!==n&&"object"==typeof n&&"litellm_provider"in n&&(n.litellm_provider===e||n.litellm_provider.includes(e))&&s.push(t)}),O(s),console.log("providerModels: ".concat(P))}},ly=async()=>{try{S.ZP.info("Running health check..."),$("");let e=await (0,u.EY)(s);$(e)}catch(e){console.error("Error running health check:",e),$("Error running health check")}},lb=async(e,l,t)=>{if(console.log("Updating model metrics for group:",e),!s||!o||!i||!l||!t)return;console.log("inside updateModelMetrics - startTime:",l,"endTime:",t),eD(e);let n=null==la?void 0:la.token;void 0===n&&(n=null);let a=li;void 0===a&&(a=null),l.setHours(0),l.setMinutes(0),l.setSeconds(0),t.setHours(23),t.setMinutes(59),t.setSeconds(59);try{let r=await (0,u.o6)(s,o,i,e,l.toISOString(),t.toISOString(),n,a);console.log("Model metrics response:",r),eq(r.data),eB(r.all_api_bases);let d=await (0,u.Rg)(s,e,l.toISOString(),t.toISOString());eW(d.data),eG(d.all_api_bases);let c=await (0,u.N8)(s,o,i,e,l.toISOString(),t.toISOString(),n,a);console.log("Model exceptions response:",c),eJ(c.data),e$(c.exception_types);let m=await (0,u.fP)(s,o,i,e,l.toISOString(),t.toISOString(),n,a);if(console.log("slowResponses:",m),e2(m),e){let n=await (0,u.n$)(s,null==l?void 0:l.toISOString().split("T")[0],null==t?void 0:t.toISOString().split("T")[0],e);le(n);let a=await (0,u.v9)(s,null==l?void 0:l.toISOString().split("T")[0],null==t?void 0:t.toISOString().split("T")[0],e);ls(a)}}catch(e){console.error("Failed to fetch model metrics",e)}},lv=(0,a.jsxs)("div",{children:[(0,a.jsx)(_.Z,{className:"mb-1",children:"Select API Key Name"}),h?(0,a.jsxs)("div",{children:[(0,a.jsxs)(B.Z,{defaultValue:"all-keys",children:[(0,a.jsx)(K.Z,{value:"all-keys",onClick:()=>{lr(null)},children:"All Keys"},"all-keys"),null==c?void 0:c.map((e,l)=>e&&null!==e.key_alias&&e.key_alias.length>0?(0,a.jsx)(K.Z,{value:String(l),onClick:()=>{lr(e)},children:e.key_alias},l):null)]}),(0,a.jsx)(_.Z,{className:"mt-1",children:"Select Customer Name"}),(0,a.jsxs)(B.Z,{defaultValue:"all-customers",children:[(0,a.jsx)(K.Z,{value:"all-customers",onClick:()=>{lo(null)},children:"All Customers"},"all-customers"),null==ld?void 0:ld.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>{lo(e)},children:e},l))]})]}):(0,a.jsxs)("div",{children:[(0,a.jsxs)(B.Z,{defaultValue:"all-keys",children:[(0,a.jsx)(K.Z,{value:"all-keys",onClick:()=>{lr(null)},children:"All Keys"},"all-keys"),null==c?void 0:c.map((e,l)=>e&&null!==e.key_alias&&e.key_alias.length>0?(0,a.jsxs)(K.Z,{value:String(l),disabled:!0,onClick:()=>{lr(e)},children:["✨ ",e.key_alias," (Enterprise only Feature)"]},l):null)]}),(0,a.jsx)(_.Z,{className:"mt-1",children:"Select Customer Name"}),(0,a.jsxs)(B.Z,{defaultValue:"all-customers",children:[(0,a.jsx)(K.Z,{value:"all-customers",onClick:()=>{lo(null)},children:"All Customers"},"all-customers"),null==ld?void 0:ld.map((e,l)=>(0,a.jsxs)(K.Z,{value:e,disabled:!0,onClick:()=>{lo(e)},children:["✨ ",e," (Enterprise only Feature)"]},l))]})]})]}),lk=e=>{var l,s;let{payload:t,active:n}=e;if(!n||!t)return null;let r=null===(s=t[0])||void 0===s?void 0:null===(l=s.payload)||void 0===l?void 0:l.date,i=t.sort((e,l)=>l.value-e.value);if(i.length>5){let e=i.length-5;(i=i.slice(0,5)).push({dataKey:"".concat(e," other deployments"),value:t.slice(5).reduce((e,l)=>e+l.value,0),color:"gray"})}return(0,a.jsxs)("div",{className:"w-150 rounded-tremor-default border border-tremor-border bg-tremor-background p-2 text-tremor-default shadow-tremor-dropdown",children:[r&&(0,a.jsxs)("p",{className:"text-tremor-content-emphasis mb-2",children:["Date: ",r]}),i.map((e,l)=>{let s=parseFloat(e.value.toFixed(5)),t=0===s&&e.value>0?"<0.00001":s.toFixed(5);return(0,a.jsxs)("div",{className:"flex justify-between",children:[(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,a.jsx)("div",{className:"w-2 h-2 mt-1 rounded-full bg-".concat(e.color,"-500")}),(0,a.jsx)("p",{className:"text-tremor-content",children:e.dataKey})]}),(0,a.jsx)("p",{className:"font-medium text-tremor-content-emphasis text-righ ml-2",children:t})]},l)})]})};console.log("selectedProvider: ".concat(Y)),console.log("providerModels.length: ".concat(P.length));let lS=Object.keys(n).find(e=>n[e]===Y);return lS&&(l=H.find(e=>e.name===eA[lS])),(0,a.jsx)("div",{style:{width:"100%",height:"100%"},children:(0,a.jsxs)(en.Z,{className:"gap-2 p-8 h-[75vh] w-full mt-2",children:[(0,a.jsxs)(ea.Z,{className:"flex justify-between mt-2 w-full items-center",children:[(0,a.jsxs)("div",{className:"flex",children:[(0,a.jsx)(et.Z,{children:"All Models"}),(0,a.jsx)(et.Z,{children:"Add Model"}),(0,a.jsx)(et.Z,{children:(0,a.jsx)("pre",{children:"/health Models"})}),(0,a.jsx)(et.Z,{children:"Model Analytics"}),(0,a.jsx)(et.Z,{children:"Model Retry Settings"})]}),(0,a.jsxs)("div",{className:"flex items-center space-x-2",children:[N&&(0,a.jsxs)(_.Z,{children:["Last Refreshed: ",N]}),(0,a.jsx)(M.Z,{icon:eg.Z,variant:"shadow",size:"xs",className:"self-center",onClick:lx})]})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)(x.Z,{children:[(0,a.jsxs)("div",{className:"flex items-center",children:[(0,a.jsx)(_.Z,{children:"Filter by Public Model Name"}),(0,a.jsxs)(B.Z,{className:"mb-4 mt-2 ml-2 w-50",defaultValue:eM||void 0,onValueChange:e=>eD("all"===e?"all":e),value:eM||void 0,children:[(0,a.jsx)(K.Z,{value:"all",children:"All Models"}),eR.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>eD(e),children:e},l))]})]}),(0,a.jsx)(F.Z,{children:(0,a.jsxs)(D.Z,{style:{maxWidth:"1500px",width:"100%"},children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:"Public Model Name"}),(0,a.jsx)(q.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:"Provider"}),"Admin"===i&&(0,a.jsx)(q.Z,{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:"API Base"}),(0,a.jsxs)(q.Z,{style:{maxWidth:"85px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:["Input Price"," ",(0,a.jsx)("p",{style:{fontSize:"10px",color:"gray"},children:"/1M Tokens ($)"})]}),(0,a.jsxs)(q.Z,{style:{maxWidth:"85px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:["Output Price"," ",(0,a.jsx)("p",{style:{fontSize:"10px",color:"gray"},children:"/1M Tokens ($)"})]}),(0,a.jsx)(q.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:h?"Created At":(0,a.jsxs)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",style:{color:"#72bcd4"},children:[" ","✨ Created At"]})}),(0,a.jsx)(q.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:h?"Created By":(0,a.jsxs)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",style:{color:"#72bcd4"},children:[" ","✨ Created By"]})}),(0,a.jsx)(q.Z,{style:{maxWidth:"50px",whiteSpace:"normal",wordBreak:"break-word",fontSize:"11px"},children:"Status"}),(0,a.jsx)(q.Z,{})]})}),(0,a.jsx)(L.Z,{children:d.data.filter(e=>"all"===eM||e.model_name===eM||null==eM||""===eM).map((e,l)=>{var t;return(0,a.jsxs)(z.Z,{style:{maxHeight:"1px",minHeight:"1px"},children:[(0,a.jsx)(U.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)("p",{className:"text-xs",children:e.model_name||"-"})}),(0,a.jsx)(U.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)("p",{className:"text-xs",children:e.provider||"-"})}),"Admin"===i&&(0,a.jsx)(U.Z,{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)(eu.Z,{title:e&&e.api_base,children:(0,a.jsx)("pre",{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word"},className:"text-xs",title:e&&e.api_base?e.api_base:"",children:e&&e.api_base?e.api_base.slice(0,20):"-"})})}),(0,a.jsx)(U.Z,{style:{maxWidth:"80px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)("pre",{className:"text-xs",children:e.input_cost?e.input_cost:null!=e.litellm_params.input_cost_per_token&&void 0!=e.litellm_params.input_cost_per_token?(1e6*Number(e.litellm_params.input_cost_per_token)).toFixed(2):null})}),(0,a.jsx)(U.Z,{style:{maxWidth:"80px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsx)("pre",{className:"text-xs",children:e.output_cost?e.output_cost:e.litellm_params.output_cost_per_token?(1e6*Number(e.litellm_params.output_cost_per_token)).toFixed(2):null})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)("p",{className:"text-xs",children:h&&((t=e.model_info.created_at)?new Date(t).toLocaleDateString("en-US"):null)||"-"})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)("p",{className:"text-xs",children:h&&e.model_info.created_by||"-"})}),(0,a.jsx)(U.Z,{style:{maxWidth:"100px",whiteSpace:"normal",wordBreak:"break-word"},children:e.model_info.db_model?(0,a.jsx)(R.Z,{size:"xs",className:"text-white",children:(0,a.jsx)("p",{className:"text-xs",children:"DB Model"})}):(0,a.jsx)(R.Z,{size:"xs",className:"text-black",children:(0,a.jsx)("p",{className:"text-xs",children:"Config Model"})})}),(0,a.jsx)(U.Z,{style:{maxWidth:"150px",whiteSpace:"normal",wordBreak:"break-word"},children:(0,a.jsxs)(x.Z,{numItems:3,children:[(0,a.jsx)(eh.Z,{children:(0,a.jsx)(M.Z,{icon:T.Z,size:"sm",onClick:()=>lu(e)})}),(0,a.jsx)(eh.Z,{children:(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>lm(e)})}),(0,a.jsx)(eh.Z,{children:(0,a.jsx)(ef,{modelID:e.model_info.id,accessToken:s})})]})})]},l)})})]})})]}),(0,a.jsx)(e=>{let{visible:l,onCancel:s,model:t,onSubmit:n}=e,[r]=k.Z.useForm(),i={},o="",d="";if(t){i=t.litellm_params,o=t.model_name;let e=t.model_info;e&&(d=e.id,console.log("model_id: ".concat(d)),i.model_id=d)}return(0,a.jsx)(w.Z,{title:"Edit Model "+o,visible:l,width:800,footer:null,onOk:()=>{r.validateFields().then(e=>{n(e),r.resetFields()}).catch(e=>{console.error("Validation failed:",e)})},onCancel:s,children:(0,a.jsxs)(k.Z,{form:r,onFinish:lh,initialValues:i,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"api_base",name:"api_base",children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(k.Z.Item,{label:"organization",name:"organization",tooltip:"OpenAI Organization ID",children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(k.Z.Item,{label:"tpm",name:"tpm",tooltip:"int (optional) - Tokens limit for this deployment: in tokens per minute (tpm). Find this information on your model/providers website",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(k.Z.Item,{label:"rpm",name:"rpm",tooltip:"int (optional) - Rate limit for this deployment: in requests per minute (rpm). Find this information on your model/providers website",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(k.Z.Item,{label:"max_retries",name:"max_retries",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(k.Z.Item,{label:"timeout",name:"timeout",tooltip:"int (optional) - Timeout in seconds for LLM requests (Defaults to 600 seconds)",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(k.Z.Item,{label:"stream_timeout",name:"stream_timeout",tooltip:"int (optional) - Timeout for stream requests (seconds)",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(k.Z.Item,{label:"input_cost_per_token",name:"input_cost_per_token",tooltip:"float (optional) - Input cost per token",children:(0,a.jsx)(I.Z,{min:0,step:1e-4})}),(0,a.jsx)(k.Z.Item,{label:"output_cost_per_token",name:"output_cost_per_token",tooltip:"float (optional) - Output cost per token",children:(0,a.jsx)(I.Z,{min:0,step:1e-4})}),(0,a.jsx)(k.Z.Item,{label:"model_id",name:"model_id",hidden:!0})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})})},{visible:ee,onCancel:()=>{eb(!1),eO(null)},model:eE,onSubmit:lh}),(0,a.jsxs)(w.Z,{title:eE&&eE.model_name,visible:ev,width:800,footer:null,onCancel:()=>{eT(!1),eO(null)},children:[(0,a.jsx)(y.Z,{children:"Model Info"}),(0,a.jsx)(ew.Z,{language:"json",children:eE&&JSON.stringify(eE,null,2)})]})]}),(0,a.jsxs)(er.Z,{className:"h-full",children:[(0,a.jsx)(eN,{level:2,children:"Add new model"}),(0,a.jsx)(F.Z,{children:(0,a.jsxs)(k.Z,{form:f,onFinish:()=>{f.validateFields().then(e=>{eP(e,s,f)}).catch(e=>{console.error("Validation failed:",e)})},labelCol:{span:10},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Provider:",name:"custom_llm_provider",tooltip:"E.g. OpenAI, Azure OpenAI, Anthropic, Bedrock, etc.",labelCol:{span:10},labelAlign:"left",children:(0,a.jsx)(B.Z,{value:Y.toString(),children:W.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>{l_(e),J(e)},children:e},l))})}),(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Public Model Name",name:"model_name",tooltip:"Model name your users will pass in. Also used for load-balancing, LiteLLM will load balance between all models with this public name.",className:"mb-0",children:(0,a.jsx)(j.Z,{})}),(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsx)(_.Z,{className:"mb-3 mt-1",children:"Model name your users will pass in."})})]}),(0,a.jsxs)(k.Z.Item,{label:"LiteLLM Model Name(s)",tooltip:"Actual model name used for making litellm.completion() call.",className:"mb-0",children:[(0,a.jsx)(k.Z.Item,{name:"model",rules:[{required:!0,message:"Required"}],noStyle:!0,children:(0,a.jsxs)(eo.Z,{children:[(0,a.jsx)(ed.Z,{value:"custom",children:"Custom Model Name (Enter below)"}),P.map((e,l)=>(0,a.jsx)(ed.Z,{value:e,children:e},l))]})}),(0,a.jsx)(k.Z.Item,{noStyle:!0,shouldUpdate:(e,l)=>e.model!==l.model,children:e=>{let{getFieldValue:l}=e;return(l("model")||[]).includes("custom")&&(0,a.jsx)(k.Z.Item,{name:"custom_model_name",rules:[{required:!0,message:"Please enter a custom model name"}],className:"mt-2",children:(0,a.jsx)(j.Z,{placeholder:"Enter custom model name"})})}})]}),(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsxs)(_.Z,{className:"mb-3 mt-1",children:["Actual model name used for making"," ",(0,a.jsx)(eI,{href:"https://docs.litellm.ai/docs/providers",target:"_blank",children:"litellm.completion() call"}),". We'll"," ",(0,a.jsx)(eI,{href:"https://docs.litellm.ai/docs/proxy/reliability#step-1---set-deployments-on-config",target:"_blank",children:"loadbalance"})," ","models with the same 'public name'"]})})]}),void 0!==l&&l.fields.length>0&&(0,a.jsx)(eS,{fields:l.fields,selectedProvider:l.name}),"Amazon Bedrock"!=Y&&"Vertex AI (Anthropic, Gemini, etc.)"!=Y&&"Ollama"!=Y&&(void 0===l||0==l.fields.length)&&(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"API Key",name:"api_key",children:(0,a.jsx)(j.Z,{placeholder:"sk-",type:"password"})}),"OpenAI"==Y&&(0,a.jsx)(k.Z.Item,{label:"Organization ID",name:"organization",children:(0,a.jsx)(j.Z,{placeholder:"[OPTIONAL] my-unique-org"})}),"Vertex AI (Anthropic, Gemini, etc.)"==Y&&(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Vertex Project",name:"vertex_project",children:(0,a.jsx)(j.Z,{placeholder:"adroit-cadet-1234.."})}),"Vertex AI (Anthropic, Gemini, etc.)"==Y&&(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Vertex Location",name:"vertex_location",children:(0,a.jsx)(j.Z,{placeholder:"us-east-1"})}),"Vertex AI (Anthropic, Gemini, etc.)"==Y&&(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"Vertex Credentials",name:"vertex_credentials",className:"mb-0",children:(0,a.jsx)(ey.Z,{name:"file",accept:".json",beforeUpload:e=>{if("application/json"===e.type){let l=new FileReader;l.onload=e=>{if(e.target){let l=e.target.result;f.setFieldsValue({vertex_credentials:l})}},l.readAsText(e)}return!1},onChange(e){"uploading"!==e.file.status&&console.log(e.file,e.fileList),"done"===e.file.status?S.ZP.success("".concat(e.file.name," file uploaded successfully")):"error"===e.file.status&&S.ZP.error("".concat(e.file.name," file upload failed."))},children:(0,a.jsx)(A.ZP,{icon:(0,a.jsx)(e_.Z,{}),children:"Click to Upload"})})}),"Vertex AI (Anthropic, Gemini, etc.)"==Y&&(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsx)(_.Z,{className:"mb-3 mt-1",children:"Give litellm a gcp service account(.json file), so it can make the relevant calls"})})]}),("Azure"==Y||"OpenAI-Compatible Endpoints (Groq, Together AI, Mistral AI, etc.)"==Y)&&(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"API Base",name:"api_base",children:(0,a.jsx)(j.Z,{placeholder:"https://..."})}),"Azure"==Y&&(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"API Version",name:"api_version",children:(0,a.jsx)(j.Z,{placeholder:"2023-07-01-preview"})}),"Azure"==Y&&(0,a.jsxs)("div",{children:[(0,a.jsx)(k.Z.Item,{label:"Base Model",name:"base_model",className:"mb-0",children:(0,a.jsx)(j.Z,{placeholder:"azure/gpt-3.5-turbo"})}),(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsxs)(_.Z,{className:"mb-2",children:["The actual model your azure deployment uses. Used for accurate cost tracking. Select name from"," ",(0,a.jsx)(eI,{href:"https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json",target:"_blank",children:"here"})]})})]})]}),"Amazon Bedrock"==Y&&(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"AWS Access Key ID",name:"aws_access_key_id",tooltip:"You can provide the raw key or the environment variable (e.g. `os.environ/MY_SECRET_KEY`).",children:(0,a.jsx)(j.Z,{placeholder:""})}),"Amazon Bedrock"==Y&&(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"AWS Secret Access Key",name:"aws_secret_access_key",tooltip:"You can provide the raw key or the environment variable (e.g. `os.environ/MY_SECRET_KEY`).",children:(0,a.jsx)(j.Z,{placeholder:""})}),"Amazon Bedrock"==Y&&(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"AWS Region Name",name:"aws_region_name",tooltip:"You can provide the raw key or the environment variable (e.g. `os.environ/MY_SECRET_KEY`).",children:(0,a.jsx)(j.Z,{placeholder:"us-east-1"})}),(0,a.jsx)(k.Z.Item,{label:"LiteLLM Params",name:"litellm_extra_params",tooltip:"Optional litellm params used for making a litellm.completion() call.",className:"mb-0",children:(0,a.jsx)(ej.Z,{rows:4,placeholder:'{ "rpm": 100, "timeout": 0, "stream_timeout": 0 }'})}),(0,a.jsxs)(ex.Z,{children:[(0,a.jsx)(eh.Z,{span:10}),(0,a.jsx)(eh.Z,{span:10,children:(0,a.jsxs)(_.Z,{className:"mb-3 mt-1",children:["Pass JSON of litellm supported params"," ",(0,a.jsx)(eI,{href:"https://docs.litellm.ai/docs/completion/input",target:"_blank",children:"litellm.completion() call"})]})})]})]}),(0,a.jsx)("div",{style:{textAlign:"center",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add Model"})}),(0,a.jsx)(eu.Z,{title:"Get help on our github",children:(0,a.jsx)(Q.default.Link,{href:"https://github.com/BerriAI/litellm/issues",children:"Need Help?"})})]})})]}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(_.Z,{children:"`/health` will run a very small request through your models configured on litellm"}),(0,a.jsx)(p.Z,{onClick:ly,children:"Run `/health`"}),X&&(0,a.jsx)("pre",{children:JSON.stringify(X,null,2)})]})}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)(x.Z,{numItems:4,className:"mt-2 mb-2",children:[(0,a.jsxs)(eh.Z,{children:[(0,a.jsx)(_.Z,{children:"Select Time Range"}),(0,a.jsx)(es.Z,{enableSelect:!0,value:e4,className:"mr-2",onValueChange:e=>{e5(e),lb(eM,e.from,e.to)}})]}),(0,a.jsxs)(eh.Z,{className:"ml-2",children:[(0,a.jsx)(_.Z,{children:"Select Model Group"}),(0,a.jsx)(B.Z,{defaultValue:eM||eR[0],value:eM||eR[0],children:eR.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>lb(e,e4.from,e4.to),children:e},l))})]}),(0,a.jsx)(eh.Z,{children:(0,a.jsx)(ep.Z,{trigger:"click",content:lv,overlayStyle:{width:"20vw"},children:(0,a.jsx)(p.Z,{icon:eZ.Z,size:"md",variant:"secondary",className:"mt-4 ml-2",style:{border:"none"},onClick:()=>ln(!0)})})})]}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsx)(eh.Z,{children:(0,a.jsx)(F.Z,{className:"mr-2 max-h-[400px] min-h-[400px]",children:(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{variant:"line",defaultValue:"1",children:[(0,a.jsx)(et.Z,{value:"1",children:"Avg. Latency per Token"}),(0,a.jsx)(et.Z,{value:"2",children:"✨ Time to first token"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsxs)(er.Z,{children:[(0,a.jsx)("p",{className:"text-gray-500 italic",children:" (seconds/token)"}),(0,a.jsx)(_.Z,{className:"text-gray-500 italic mt-1 mb-1",children:"average Latency for successfull requests divided by the total tokens"}),eV&&ez&&(0,a.jsx)(ec.Z,{title:"Model Latency",className:"h-72",data:eV,showLegend:!1,index:"date",categories:ez,connectNulls:!0,customTooltip:lk})]}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ek,{modelMetrics:eK,modelMetricsCategories:eH,customTooltip:lk,premiumUser:h})})]})]})})}),(0,a.jsx)(eh.Z,{children:(0,a.jsx)(F.Z,{className:"ml-2 max-h-[400px] min-h-[400px] overflow-y-auto",children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Deployment"}),(0,a.jsx)(q.Z,{children:"Success Responses"}),(0,a.jsxs)(q.Z,{children:["Slow Responses ",(0,a.jsx)("p",{children:"Success Responses taking 600+s"})]})]})}),(0,a.jsx)(L.Z,{children:e1.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.api_base}),(0,a.jsx)(U.Z,{children:e.total_count}),(0,a.jsx)(U.Z,{children:e.slow_count})]},l))})]})})})]}),(0,a.jsx)(x.Z,{numItems:1,className:"gap-2 w-full mt-2",children:(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(y.Z,{children:["All Exceptions for ",eM]}),(0,a.jsx)(em.Z,{className:"h-60",data:eY,index:"model",categories:eX,stack:!0,yAxisWidth:30})]})}),(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 w-full mt-2",children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(y.Z,{children:["All Up Rate Limit Errors (429) for ",eM]}),(0,a.jsxs)(x.Z,{numItems:1,children:[(0,a.jsxs)(eh.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Num Rate Limit Errors ",e7.sum_num_rate_limit_exceptions]}),(0,a.jsx)(em.Z,{className:"h-40",data:e7.daily_data,index:"date",colors:["rose"],categories:["num_rate_limit_exceptions"],onValueChange:e=>console.log(e)})]}),(0,a.jsx)(eh.Z,{})]})]}),h?(0,a.jsx)(a.Fragment,{children:ll.map((e,l)=>(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:e.api_base?e.api_base:"Unknown API Base"}),(0,a.jsx)(x.Z,{numItems:1,children:(0,a.jsxs)(eh.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Num Rate Limit Errors (429) ",e.sum_num_rate_limit_exceptions]}),(0,a.jsx)(em.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["rose"],categories:["num_rate_limit_exceptions"],onValueChange:e=>console.log(e)})]})})]},l))}):(0,a.jsx)(a.Fragment,{children:ll&&ll.length>0&&ll.slice(0,1).map((e,l)=>(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"✨ Rate Limit Errors by Deployment"}),(0,a.jsx)("p",{className:"mb-2 text-gray-500 italic text-[12px]",children:"Upgrade to see exceptions for all deployments"}),(0,a.jsx)(p.Z,{variant:"primary",className:"mb-2",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get Free Trial"})}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:e.api_base}),(0,a.jsx)(x.Z,{numItems:1,children:(0,a.jsxs)(eh.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Num Rate Limit Errors ",e.sum_num_rate_limit_exceptions]}),(0,a.jsx)(em.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["rose"],categories:["num_rate_limit_exceptions"],onValueChange:e=>console.log(e)})]})})]})]},l))})]})]}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)("div",{className:"flex items-center",children:[(0,a.jsx)(_.Z,{children:"Filter by Public Model Name"}),(0,a.jsx)(B.Z,{className:"mb-4 mt-2 ml-2 w-50",defaultValue:eM||eR[0],value:eM||eR[0],onValueChange:e=>eD(e),children:eR.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>eD(e),children:e},l))})]}),(0,a.jsxs)(y.Z,{children:["Retry Policy for ",eM]}),(0,a.jsx)(_.Z,{className:"mb-6",children:"How many retries should be attempted based on the Exception"}),eC&&(0,a.jsx)("table",{children:(0,a.jsx)("tbody",{children:Object.entries(eC).map((e,l)=>{var s;let[t,n]=e,r=null==e8?void 0:null===(s=e8[eM])||void 0===s?void 0:s[n];return null==r&&(r=e6),(0,a.jsxs)("tr",{className:"flex justify-between items-center mt-2",children:[(0,a.jsx)("td",{children:(0,a.jsx)(_.Z,{children:t})}),(0,a.jsx)("td",{children:(0,a.jsx)(I.Z,{className:"ml-5",value:r,min:0,step:1,onChange:e=>{e3(l=>{var s;let t=null!==(s=null==l?void 0:l[eM])&&void 0!==s?s:{};return{...null!=l?l:{},[eM]:{...t,[n]:e}}})}})})]},l)})})}),(0,a.jsx)(p.Z,{className:"mt-6 mr-8",onClick:lp,children:"Save"})]})]})]})})},eE=e=>{let{isInvitationLinkModalVisible:l,setIsInvitationLinkModalVisible:s,baseUrl:t,invitationLinkData:n}=e,{Title:r,Paragraph:i}=Q.default;return(0,a.jsxs)(w.Z,{title:"Invitation Link",visible:l,width:800,footer:null,onOk:()=>{s(!1)},onCancel:()=>{s(!1)},children:[(0,a.jsx)(i,{children:"Copy and send the generated link to onboard this user to the proxy."}),(0,a.jsxs)("div",{className:"flex justify-between pt-5 pb-2",children:[(0,a.jsx)(_.Z,{className:"text-base",children:"User ID"}),(0,a.jsx)(_.Z,{children:null==n?void 0:n.user_id})]}),(0,a.jsxs)("div",{className:"flex justify-between pt-5 pb-2",children:[(0,a.jsx)(_.Z,{children:"Invitation Link"}),(0,a.jsxs)(_.Z,{children:[t,"/ui?invitation_id=",null==n?void 0:n.id]})]}),(0,a.jsxs)("div",{className:"flex justify-end mt-5",children:[(0,a.jsx)("div",{}),(0,a.jsx)(b.CopyToClipboard,{text:"".concat(t,"/ui?invitation_id=").concat(null==n?void 0:n.id),onCopy:()=>S.ZP.success("Copied!"),children:(0,a.jsx)(p.Z,{variant:"primary",children:"Copy invitation link"})})]})]})};let{Option:eO}=v.default;var eR=e=>{let{userID:l,accessToken:s,teams:t,possibleUIRoles:n}=e,[o]=k.Z.useForm(),[d,c]=(0,r.useState)(!1),[m,h]=(0,r.useState)(null),[x,g]=(0,r.useState)([]),[Z,f]=(0,r.useState)(!1),[y,b]=(0,r.useState)(null),I=(0,i.useRouter)(),[C,P]=(0,r.useState)("");(0,r.useEffect)(()=>{(async()=>{try{let e=await (0,u.So)(s,l,"any"),t=[];for(let l=0;l{if(I){let{protocol:e,host:l}=window.location;P("".concat(e,"/").concat(l))}},[I]);let T=async e=>{try{var t;S.ZP.info("Making API Call"),c(!0),console.log("formValues in create user:",e);let n=await (0,u.Ov)(s,null,e);console.log("user create Response:",n),h(n.key);let a=(null===(t=n.data)||void 0===t?void 0:t.user_id)||n.user_id;(0,u.XO)(s,a).then(e=>{b(e),f(!0)}),S.ZP.success("API user Created"),o.resetFields(),localStorage.removeItem("userData"+l)}catch(e){console.error("Error creating the user:",e)}};return(0,a.jsxs)("div",{children:[(0,a.jsx)(p.Z,{className:"mx-auto mb-0",onClick:()=>c(!0),children:"+ Invite User"}),(0,a.jsxs)(w.Z,{title:"Invite User",visible:d,width:800,footer:null,onOk:()=>{c(!1),o.resetFields()},onCancel:()=>{c(!1),h(null),o.resetFields()},children:[(0,a.jsx)(_.Z,{className:"mb-1",children:"Create a User who can own keys"}),(0,a.jsxs)(k.Z,{form:o,onFinish:T,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsx)(k.Z.Item,{label:"User Email",name:"user_email",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(k.Z.Item,{label:"User Role",name:"user_role",children:(0,a.jsx)(v.default,{children:n&&Object.entries(n).map(e=>{let[l,{ui_label:s,description:t}]=e;return(0,a.jsx)(K.Z,{value:l,title:s,children:(0,a.jsxs)("div",{className:"flex",children:[s," ",(0,a.jsx)("p",{className:"ml-2",style:{color:"gray",fontSize:"12px"},children:t})]})},l)})})}),(0,a.jsx)(k.Z.Item,{label:"Team ID",name:"team_id",children:(0,a.jsx)(v.default,{placeholder:"Select Team ID",style:{width:"100%"},children:t?t.map(e=>(0,a.jsx)(eO,{value:e.team_id,children:e.team_alias},e.team_id)):(0,a.jsx)(eO,{value:null,children:"Default Team"},"default")})}),(0,a.jsx)(k.Z.Item,{label:"Metadata",name:"metadata",children:(0,a.jsx)(N.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Create User"})})]})]}),m&&(0,a.jsx)(eE,{isInvitationLinkModalVisible:Z,setIsInvitationLinkModalVisible:f,baseUrl:C,invitationLinkData:y})]})},eF=e=>{let{visible:l,possibleUIRoles:s,onCancel:t,user:n,onSubmit:i}=e,[o,d]=(0,r.useState)(n),[c]=k.Z.useForm();(0,r.useEffect)(()=>{c.resetFields()},[n]);let m=async()=>{c.resetFields(),t()},u=async e=>{i(e),c.resetFields(),t()};return n?(0,a.jsx)(w.Z,{visible:l,onCancel:m,footer:null,title:"Edit User "+n.user_id,width:1e3,children:(0,a.jsx)(k.Z,{form:c,onFinish:u,initialValues:n,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"User Email",tooltip:"Email of the User",name:"user_email",children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(k.Z.Item,{label:"user_id",name:"user_id",hidden:!0,children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(k.Z.Item,{label:"User Role",name:"user_role",children:(0,a.jsx)(v.default,{children:s&&Object.entries(s).map(e=>{let[l,{ui_label:s,description:t}]=e;return(0,a.jsx)(K.Z,{value:l,title:s,children:(0,a.jsxs)("div",{className:"flex",children:[s," ",(0,a.jsx)("p",{className:"ml-2",style:{color:"gray",fontSize:"12px"},children:t})]})},l)})})}),(0,a.jsx)(k.Z.Item,{label:"Spend (USD)",name:"spend",tooltip:"(float) - Spend of all LLM calls completed by this user",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)(k.Z.Item,{label:"User Budget (USD)",name:"max_budget",tooltip:"(float) - Maximum budget of this user",children:(0,a.jsx)(I.Z,{min:0,step:1})}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})})}):null},eM=e=>{let{accessToken:l,token:s,keys:t,userRole:n,userID:i,teams:o,setKeys:d}=e,[c,m]=(0,r.useState)(null),[h,p]=(0,r.useState)(null),[j,g]=(0,r.useState)(0),[Z,f]=r.useState(null),[_,y]=(0,r.useState)(null),[b,v]=(0,r.useState)(!1),[k,w]=(0,r.useState)(null),[N,I]=(0,r.useState)({}),A=async()=>{w(null),v(!1)},C=async e=>{if(console.log("inside handleEditSubmit:",e),l&&s&&n&&i){try{await (0,u.pf)(l,e,null),S.ZP.success("User ".concat(e.user_id," updated successfully"))}catch(e){console.error("There was an error updating the user",e)}c&&m(c.map(l=>l.user_id===e.user_id?e:l)),w(null),v(!1)}};return((0,r.useEffect)(()=>{if(!l||!s||!n||!i)return;let e=async()=>{try{let e=await (0,u.Br)(l,null,n,!0,j,25);console.log("user data response:",e),m(e);let s=await (0,u.lg)(l);I(s)}catch(e){console.error("There was an error fetching the model data",e)}};l&&s&&n&&i&&e()},[l,s,n,i,j]),c&&l&&s&&n&&i)?(0,a.jsx)("div",{style:{width:"100%"},children:(0,a.jsxs)(x.Z,{className:"gap-2 p-2 h-[90vh] w-full mt-8",children:[(0,a.jsx)(eR,{userID:i,accessToken:l,teams:o,possibleUIRoles:N}),(0,a.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[90vh] mb-4",children:[(0,a.jsx)("div",{className:"mb-4 mt-1"}),(0,a.jsx)(en.Z,{children:(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsxs)(D.Z,{className:"mt-5",children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"User ID"}),(0,a.jsx)(q.Z,{children:"User Email"}),(0,a.jsx)(q.Z,{children:"Role"}),(0,a.jsx)(q.Z,{children:"User Spend ($ USD)"}),(0,a.jsx)(q.Z,{children:"User Max Budget ($ USD)"}),(0,a.jsx)(q.Z,{children:"API Keys"}),(0,a.jsx)(q.Z,{})]})}),(0,a.jsx)(L.Z,{children:c.map(e=>{var l,s;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.user_id||"-"}),(0,a.jsx)(U.Z,{children:e.user_email||"-"}),(0,a.jsx)(U.Z,{children:(null==N?void 0:null===(l=N[null==e?void 0:e.user_role])||void 0===l?void 0:l.ui_label)||"-"}),(0,a.jsx)(U.Z,{children:e.spend?null===(s=e.spend)||void 0===s?void 0:s.toFixed(2):"-"}),(0,a.jsx)(U.Z,{children:e.max_budget?e.max_budget:"Unlimited"}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(x.Z,{numItems:2,children:e&&e.key_aliases&&e.key_aliases.filter(e=>null!==e).length>0?(0,a.jsxs)(R.Z,{size:"xs",color:"indigo",children:[e.key_aliases.filter(e=>null!==e).length,"\xa0Keys"]}):(0,a.jsx)(R.Z,{size:"xs",color:"gray",children:"No Keys"})})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(M.Z,{icon:E.Z,onClick:()=>{w(e),v(!0)},children:"View Keys"})})]},e.user_id)})})]})}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)("div",{className:"flex items-center",children:[(0,a.jsx)("div",{className:"flex-1"}),(0,a.jsx)("div",{className:"flex-1 flex justify-between items-center"})]})})]})}),(0,a.jsx)(eF,{visible:b,possibleUIRoles:N,onCancel:A,user:k,onSubmit:C})]}),function(){if(!c)return null;let e=Math.ceil(c.length/25);return(0,a.jsxs)("div",{className:"flex justify-between items-center",children:[(0,a.jsxs)("div",{children:["Showing Page ",j+1," of ",e]}),(0,a.jsxs)("div",{className:"flex",children:[(0,a.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-l focus:outline-none",disabled:0===j,onClick:()=>g(j-1),children:"← Prev"}),(0,a.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-r focus:outline-none",onClick:()=>{g(j+1)},children:"Next →"})]})]})}()]})}):(0,a.jsx)("div",{children:"Loading..."})},eD=e=>{let{teams:l,searchParams:s,accessToken:t,setTeams:n,userID:i,userRole:o}=e,[d]=k.Z.useForm(),[c]=k.Z.useForm(),{Title:m,Paragraph:g}=Q.default,[Z,f]=(0,r.useState)(""),[y,b]=(0,r.useState)(!1),[C,P]=(0,r.useState)(l?l[0]:null),[T,W]=(0,r.useState)(!1),[H,G]=(0,r.useState)(!1),[Y,J]=(0,r.useState)([]),[X,$]=(0,r.useState)(!1),[ee,el]=(0,r.useState)(null),[es,et]=(0,r.useState)({}),en=e=>{P(e),b(!0)},ea=async e=>{let s=e.team_id;if(console.log("handleEditSubmit:",e),null==t)return;let a=await (0,u.Gh)(t,e);l&&n(l.map(e=>e.team_id===s?a.data:e)),S.ZP.success("Team updated successfully"),b(!1),P(null)},er=async e=>{el(e),$(!0)},ei=async()=>{if(null!=ee&&null!=l&&null!=t){try{await (0,u.rs)(t,ee);let e=l.filter(e=>e.team_id!==ee);n(e)}catch(e){console.error("Error deleting the team:",e)}$(!1),el(null)}};(0,r.useEffect)(()=>{let e=async()=>{try{if(null===i||null===o||null===t||null===l)return;console.log("fetching team info:");let e={};for(let s=0;s<(null==l?void 0:l.length);s++){let n=l[s].team_id,a=await (0,u.Xm)(t,n);console.log("teamInfo response:",a),null!==a&&(e={...e,[n]:a})}et(e)}catch(e){console.error("Error fetching team info:",e)}};(async()=>{try{if(null===i||null===o)return;if(null!==t){let e=(await (0,u.So)(t,i,o)).data.map(e=>e.id);console.log("available_model_names:",e),J(e)}}catch(e){console.error("Error fetching user models:",e)}})(),e()},[t,i,o,l]);let eo=async e=>{try{if(null!=t){var s;let a=null==e?void 0:e.team_alias;if((null!==(s=null==l?void 0:l.map(e=>e.team_alias))&&void 0!==s?s:[]).includes(a))throw Error("Team alias ".concat(a," already exists, please pick another alias"));S.ZP.info("Creating Team");let r=await (0,u.hT)(t,e);null!==l?n([...l,r]):n([r]),console.log("response for team create call: ".concat(r)),S.ZP.success("Team created"),W(!1)}}catch(e){console.error("Error creating the team:",e),S.ZP.error("Error creating the team: "+e,20)}},ed=async e=>{try{if(null!=t&&null!=l){S.ZP.info("Adding Member");let s={role:"user",user_email:e.user_email,user_id:e.user_id},a=await (0,u.cu)(t,C.team_id,s);console.log("response for team create call: ".concat(a.data));let r=l.findIndex(e=>(console.log("team.team_id=".concat(e.team_id,"; response.data.team_id=").concat(a.data.team_id)),e.team_id===a.data.team_id));if(console.log("foundIndex: ".concat(r)),-1!==r){let e=[...l];e[r]=a.data,n(e),P(a.data)}G(!1)}}catch(e){console.error("Error creating the team:",e)}};return console.log("received teams ".concat(JSON.stringify(l))),(0,a.jsx)("div",{className:"w-full mx-4",children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 p-8 h-[75vh] w-full mt-2",children:[(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(m,{level:4,children:"All Teams"}),(0,a.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:[(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Team Name"}),(0,a.jsx)(q.Z,{children:"Spend (USD)"}),(0,a.jsx)(q.Z,{children:"Budget (USD)"}),(0,a.jsx)(q.Z,{children:"Models"}),(0,a.jsx)(q.Z,{children:"TPM / RPM Limits"}),(0,a.jsx)(q.Z,{children:"Info"})]})}),(0,a.jsx)(L.Z,{children:l&&l.length>0?l.map(e=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{style:{maxWidth:"4px",whiteSpace:"pre-wrap",overflow:"hidden"},children:e.team_alias}),(0,a.jsx)(U.Z,{style:{maxWidth:"4px",whiteSpace:"pre-wrap",overflow:"hidden"},children:e.spend}),(0,a.jsx)(U.Z,{style:{maxWidth:"4px",whiteSpace:"pre-wrap",overflow:"hidden"},children:null!==e.max_budget&&void 0!==e.max_budget?e.max_budget:"No limit"}),(0,a.jsx)(U.Z,{style:{maxWidth:"8-x",whiteSpace:"pre-wrap",overflow:"hidden"},children:Array.isArray(e.models)?(0,a.jsx)("div",{style:{display:"flex",flexDirection:"column"},children:0===e.models.length?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Proxy Models"})}):e.models.map((e,l)=>"all-proxy-models"===e?(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"red",children:(0,a.jsx)(_.Z,{children:"All Proxy Models"})},l):(0,a.jsx)(R.Z,{size:"xs",className:"mb-1",color:"blue",children:(0,a.jsx)(_.Z,{children:e.length>30?"".concat(e.slice(0,30),"..."):e})},l))}):null}),(0,a.jsx)(U.Z,{style:{maxWidth:"4px",whiteSpace:"pre-wrap",overflow:"hidden"},children:(0,a.jsxs)(_.Z,{children:["TPM: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,a.jsx)("br",{}),"RPM:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,a.jsxs)(U.Z,{children:[(0,a.jsxs)(_.Z,{children:[es&&e.team_id&&es[e.team_id]&&es[e.team_id].keys&&es[e.team_id].keys.length," ","Keys"]}),(0,a.jsxs)(_.Z,{children:[es&&e.team_id&&es[e.team_id]&&es[e.team_id].team_info&&es[e.team_id].team_info.members_with_roles&&es[e.team_id].team_info.members_with_roles.length," ","Members"]})]}),(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>en(e)}),(0,a.jsx)(M.Z,{onClick:()=>er(e.team_id),icon:O.Z,size:"sm"})]})]},e.team_id)):null})]}),X&&(0,a.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,a.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,a.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,a.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,a.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:""}),(0,a.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,a.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,a.jsx)("div",{className:"sm:flex sm:items-start",children:(0,a.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,a.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Team"}),(0,a.jsx)("div",{className:"mt-2",children:(0,a.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this team ?"})})]})})}),(0,a.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,a.jsx)(p.Z,{onClick:ei,color:"red",className:"ml-2",children:"Delete"}),(0,a.jsx)(p.Z,{onClick:()=>{$(!1),el(null)},children:"Cancel"})]})]})]})})]})]}),(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(p.Z,{className:"mx-auto",onClick:()=>W(!0),children:"+ Create New Team"}),(0,a.jsx)(w.Z,{title:"Create Team",visible:T,width:800,footer:null,onOk:()=>{W(!1),d.resetFields()},onCancel:()=>{W(!1),d.resetFields()},children:(0,a.jsxs)(k.Z,{form:d,onFinish:eo,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{label:"Team Name",name:"team_alias",rules:[{required:!0,message:"Please input a team name"}],children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(k.Z.Item,{label:"Models",name:"models",children:(0,a.jsxs)(v.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:[(0,a.jsx)(v.default.Option,{value:"all-proxy-models",children:"All Proxy Models"},"all-proxy-models"),Y.map(e=>(0,a.jsx)(v.default.Option,{value:e,children:e},e))]})}),(0,a.jsx)(k.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})}),(0,a.jsx)(k.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(k.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,a.jsx)(I.Z,{step:1,width:400})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Create Team"})})]})})]}),(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(m,{level:4,children:"Team Members"}),(0,a.jsx)(g,{children:"If you belong to multiple teams, this setting controls which teams members you see."}),l&&l.length>0?(0,a.jsx)(B.Z,{defaultValue:"0",children:l.map((e,l)=>(0,a.jsx)(K.Z,{value:String(l),onClick:()=>{P(e)},children:e.team_alias},l))}):(0,a.jsxs)(g,{children:["No team created. ",(0,a.jsx)("b",{children:"Defaulting to personal account."})]})]}),(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Member Name"}),(0,a.jsx)(q.Z,{children:"Role"})]})}),(0,a.jsx)(L.Z,{children:C?C.members_with_roles.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,a.jsx)(U.Z,{children:e.role})]},l)):null})]})}),C&&(0,a.jsx)(e=>{let{visible:l,onCancel:s,team:t,onSubmit:n}=e,[r]=k.Z.useForm();return(0,a.jsx)(w.Z,{title:"Edit Team",visible:l,width:800,footer:null,onOk:()=>{r.validateFields().then(e=>{n({...e,team_id:t.team_id}),r.resetFields()}).catch(e=>{console.error("Validation failed:",e)})},onCancel:s,children:(0,a.jsxs)(k.Z,{form:r,onFinish:ea,initialValues:t,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{label:"Team Name",name:"team_alias",rules:[{required:!0,message:"Please input a team name"}],children:(0,a.jsx)(j.Z,{})}),(0,a.jsx)(k.Z.Item,{label:"Models",name:"models",children:(0,a.jsxs)(v.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:[(0,a.jsx)(v.default.Option,{value:"all-proxy-models",children:"All Proxy Models"},"all-proxy-models"),Y&&Y.map(e=>(0,a.jsx)(v.default.Option,{value:e,children:e},e))]})}),(0,a.jsx)(k.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})}),(0,a.jsx)(k.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(k.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,a.jsx)(I.Z,{step:1,width:400})}),(0,a.jsx)(k.Z.Item,{label:"Requests per minute Limit (RPM)",name:"team_id",hidden:!0})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Edit Team"})})]})})},{visible:y,onCancel:()=>{b(!1),P(null)},team:C,onSubmit:ea})]}),(0,a.jsxs)(h.Z,{numColSpan:1,children:[(0,a.jsx)(p.Z,{className:"mx-auto mb-5",onClick:()=>G(!0),children:"+ Add member"}),(0,a.jsx)(w.Z,{title:"Add member",visible:H,width:800,footer:null,onOk:()=>{G(!1),c.resetFields()},onCancel:()=>{G(!1),c.resetFields()},children:(0,a.jsxs)(k.Z,{form:d,onFinish:ed,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,a.jsx)(N.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,a.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,a.jsx)(k.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,a.jsx)(N.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})})},eL=e=>{let l,{searchParams:s,accessToken:t,showSSOBanner:n,premiumUser:o}=e,[d]=k.Z.useForm(),[c]=k.Z.useForm(),{Title:m,Paragraph:j}=Q.default,[g,Z]=(0,r.useState)(""),[f,y]=(0,r.useState)(null),[b,v]=(0,r.useState)(null),[I,C]=(0,r.useState)(!1),[P,T]=(0,r.useState)(!1),[O,R]=(0,r.useState)(!1),[W,H]=(0,r.useState)(!1),[G,Y]=(0,r.useState)(!1),[J,X]=(0,r.useState)(!1),[$,ee]=(0,r.useState)(!1),[el,es]=(0,r.useState)(!1),[et,en]=(0,r.useState)(!1),[ea,er]=(0,r.useState)([]),[ei,eo]=(0,r.useState)(null),ed=(0,i.useRouter)(),[ec,em]=(0,r.useState)(null),[eu,eh]=(0,r.useState)(""),ex="All IP Addresses Allowed";try{l=window.location.origin}catch(e){l=""}l+="/fallback/login";let ep=async()=>{try{if(!0!==o){S.ZP.error("This feature is only available for premium users. Please upgrade your account.");return}if(t){let e=await (0,u.PT)(t);er(e&&e.length>0?e:[ex])}else er([ex])}catch(e){console.error("Error fetching allowed IPs:",e),S.ZP.error("Failed to fetch allowed IPs ".concat(e)),er([ex])}finally{!0===o&&ee(!0)}},ej=async e=>{try{if(t){await (0,u.eH)(t,e.ip);let l=await (0,u.PT)(t);er(l),S.ZP.success("IP address added successfully")}}catch(e){console.error("Error adding IP:",e),S.ZP.error("Failed to add IP address ".concat(e))}finally{es(!1)}},eg=async e=>{eo(e),en(!0)},eZ=async()=>{if(ei&&t)try{await (0,u.$I)(t,ei);let e=await (0,u.PT)(t);er(e.length>0?e:[ex]),S.ZP.success("IP address deleted successfully")}catch(e){console.error("Error deleting IP:",e),S.ZP.error("Failed to delete IP address ".concat(e))}finally{en(!1),eo(null)}},ef=()=>{X(!1)},e_=["proxy_admin","proxy_admin_viewer"];(0,r.useEffect)(()=>{if(ed){let{protocol:e,host:l}=window.location;eh("".concat(e,"//").concat(l))}},[ed]),(0,r.useEffect)(()=>{(async()=>{if(null!=t){let e=[],l=await (0,u.Xd)(t,"proxy_admin_viewer");l.forEach(l=>{e.push({user_role:l.user_role,user_id:l.user_id,user_email:l.user_email})}),console.log("proxy viewers: ".concat(l));let s=await (0,u.Xd)(t,"proxy_admin");s.forEach(l=>{e.push({user_role:l.user_role,user_id:l.user_id,user_email:l.user_email})}),console.log("proxy admins: ".concat(s)),console.log("combinedList: ".concat(e)),y(e),em(await (0,u.lg)(t))}})()},[t]);let ey=()=>{H(!1),c.resetFields(),d.resetFields()},ev=()=>{H(!1),c.resetFields(),d.resetFields()},ek=e=>(0,a.jsxs)(k.Z,{form:d,onFinish:e,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsx)(a.Fragment,{children:(0,a.jsx)(k.Z.Item,{label:"Email",name:"user_email",className:"mb-8 mt-4",children:(0,a.jsx)(N.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})})}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},className:"mt-4",children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add member"})})]}),eS=(e,l,s)=>(0,a.jsxs)(k.Z,{form:d,onFinish:e,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{rules:[{required:!0,message:"Required"}],label:"User Role",name:"user_role",labelCol:{span:10},labelAlign:"left",children:(0,a.jsx)(B.Z,{value:l,children:e_.map((e,l)=>(0,a.jsx)(K.Z,{value:e,children:e},l))})}),(0,a.jsx)(k.Z.Item,{label:"Team ID",name:"user_id",hidden:!0,initialValue:s,valuePropName:"user_id",className:"mt-8",children:(0,a.jsx)(N.Z,{value:s,disabled:!0})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Update role"})})]}),ew=async e=>{try{if(null!=t&&null!=f){S.ZP.info("Making API Call");let l=await (0,u.pf)(t,e,null);console.log("response for team create call: ".concat(l));let s=f.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(l.user_id)),e.user_id===l.user_id));console.log("foundIndex: ".concat(s)),-1==s&&(console.log("updates admin with new user"),f.push(l),y(f)),S.ZP.success("Refresh tab to see updated user role"),H(!1)}}catch(e){console.error("Error creating the key:",e)}},eN=async e=>{try{if(null!=t&&null!=f){var l;S.ZP.info("Making API Call");let s=await (0,u.pf)(t,e,"proxy_admin_viewer");console.log("response for team create call: ".concat(s));let n=(null===(l=s.data)||void 0===l?void 0:l.user_id)||s.user_id;(0,u.XO)(t,n).then(e=>{v(e),C(!0)});let a=f.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(s.user_id)),e.user_id===s.user_id));console.log("foundIndex: ".concat(a)),-1==a&&(console.log("updates admin with new user"),f.push(s),y(f)),d.resetFields(),T(!1)}}catch(e){console.error("Error creating the key:",e)}},eI=async e=>{try{if(null!=t&&null!=f){var l;S.ZP.info("Making API Call"),e.user_email,e.user_id;let s=await (0,u.pf)(t,e,"proxy_admin"),n=(null===(l=s.data)||void 0===l?void 0:l.user_id)||s.user_id;(0,u.XO)(t,n).then(e=>{v(e),C(!0)}),console.log("response for team create call: ".concat(s));let a=f.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(n)),e.user_id===s.user_id));console.log("foundIndex: ".concat(a)),-1==a&&(console.log("updates admin with new user"),f.push(s),y(f)),d.resetFields(),R(!1)}}catch(e){console.error("Error creating the key:",e)}},eA=async e=>{if(null==t)return;let l={environment_variables:{PROXY_BASE_URL:e.proxy_base_url,GOOGLE_CLIENT_ID:e.google_client_id,GOOGLE_CLIENT_SECRET:e.google_client_secret}};(0,u.K_)(t,l)};return console.log("admins: ".concat(null==f?void 0:f.length)),(0,a.jsxs)("div",{className:"w-full m-2 mt-2 p-8",children:[(0,a.jsx)(m,{level:4,children:"Admin Access "}),(0,a.jsxs)(j,{children:[n&&(0,a.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access",children:"Requires SSO Setup"}),(0,a.jsx)("br",{}),(0,a.jsx)("b",{children:"Proxy Admin: "})," Can create keys, teams, users, add models, etc."," ",(0,a.jsx)("br",{}),(0,a.jsx)("b",{children:"Proxy Admin Viewer: "}),"Can just view spend. They cannot create keys, teams or grant users access to new models."," "]}),(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 p-2 w-full",children:[(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Member Name"}),(0,a.jsx)(q.Z,{children:"Role"})]})}),(0,a.jsx)(L.Z,{children:f?f.map((e,l)=>{var s;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,a.jsxs)(U.Z,{children:[" ",(null==ec?void 0:null===(s=ec[null==e?void 0:e.user_role])||void 0===s?void 0:s.ui_label)||"-"]}),(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>H(!0)}),(0,a.jsx)(w.Z,{title:"Update role",visible:W,width:800,footer:null,onOk:ey,onCancel:ev,children:eS(ew,e.user_role,e.user_id)})]})]},l)}):null})]})})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)("div",{className:"flex justify-start",children:[(0,a.jsx)(p.Z,{className:"mr-4 mb-5",onClick:()=>R(!0),children:"+ Add admin"}),(0,a.jsx)(w.Z,{title:"Add admin",visible:O,width:800,footer:null,onOk:()=>{R(!1),c.resetFields(),d.resetFields()},onCancel:()=>{R(!1),C(!1),c.resetFields(),d.resetFields()},children:ek(eI)}),(0,a.jsx)(eE,{isInvitationLinkModalVisible:I,setIsInvitationLinkModalVisible:C,baseUrl:eu,invitationLinkData:b}),(0,a.jsx)(p.Z,{className:"mb-5",onClick:()=>T(!0),children:"+ Add viewer"}),(0,a.jsx)(w.Z,{title:"Add viewer",visible:P,width:800,footer:null,onOk:()=>{T(!1),c.resetFields(),d.resetFields()},onCancel:()=>{T(!1),c.resetFields(),d.resetFields()},children:ek(eN)})]})})]}),(0,a.jsxs)(x.Z,{children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(m,{level:4,children:" ✨ Security Settings"}),(0,a.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"1rem",marginTop:"1rem"},children:[(0,a.jsx)("div",{children:(0,a.jsx)(p.Z,{onClick:()=>!0===o?Y(!0):S.ZP.error("Only premium users can add SSO"),children:"Add SSO"})}),(0,a.jsx)("div",{children:(0,a.jsx)(p.Z,{onClick:ep,children:"Allowed IPs"})})]})]}),(0,a.jsxs)("div",{className:"flex justify-start mb-4",children:[(0,a.jsx)(w.Z,{title:"Add SSO",visible:G,width:800,footer:null,onOk:()=>{Y(!1),d.resetFields()},onCancel:()=>{Y(!1),d.resetFields()},children:(0,a.jsxs)(k.Z,{form:d,onFinish:e=>{eI(e),eA(e),Y(!1),X(!0)},labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{label:"Admin Email",name:"user_email",rules:[{required:!0,message:"Please enter the email of the proxy admin"}],children:(0,a.jsx)(N.Z,{})}),(0,a.jsx)(k.Z.Item,{label:"PROXY BASE URL",name:"proxy_base_url",rules:[{required:!0,message:"Please enter the proxy base url"}],children:(0,a.jsx)(N.Z,{})}),(0,a.jsx)(k.Z.Item,{label:"GOOGLE CLIENT ID",name:"google_client_id",rules:[{required:!0,message:"Please enter the google client id"}],children:(0,a.jsx)(N.Z.Password,{})}),(0,a.jsx)(k.Z.Item,{label:"GOOGLE CLIENT SECRET",name:"google_client_secret",rules:[{required:!0,message:"Please enter the google client secret"}],children:(0,a.jsx)(N.Z.Password,{})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})}),(0,a.jsxs)(w.Z,{title:"SSO Setup Instructions",visible:J,width:800,footer:null,onOk:ef,onCancel:()=>{X(!1)},children:[(0,a.jsx)("p",{children:"Follow these steps to complete the SSO setup:"}),(0,a.jsx)(_.Z,{className:"mt-2",children:"1. DO NOT Exit this TAB"}),(0,a.jsx)(_.Z,{className:"mt-2",children:"2. Open a new tab, visit your proxy base url"}),(0,a.jsx)(_.Z,{className:"mt-2",children:"3. Confirm your SSO is configured correctly and you can login on the new Tab"}),(0,a.jsx)(_.Z,{className:"mt-2",children:"4. If Step 3 is successful, you can close this tab"}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{onClick:ef,children:"Done"})})]}),(0,a.jsx)(w.Z,{title:"Manage Allowed IP Addresses",width:800,visible:$,onCancel:()=>ee(!1),footer:[(0,a.jsx)(p.Z,{className:"mx-1",onClick:()=>es(!0),children:"Add IP Address"},"add"),(0,a.jsx)(p.Z,{onClick:()=>ee(!1),children:"Close"},"close")],children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"IP Address"}),(0,a.jsx)(q.Z,{className:"text-right",children:"Action"})]})}),(0,a.jsx)(L.Z,{children:ea.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e}),(0,a.jsx)(U.Z,{className:"text-right",children:e!==ex&&(0,a.jsx)(p.Z,{onClick:()=>eg(e),color:"red",size:"xs",children:"Delete"})})]},l))})]})}),(0,a.jsx)(w.Z,{title:"Add Allowed IP Address",visible:el,onCancel:()=>es(!1),footer:null,children:(0,a.jsxs)(k.Z,{onFinish:ej,children:[(0,a.jsx)(k.Z.Item,{name:"ip",rules:[{required:!0,message:"Please enter an IP address"}],children:(0,a.jsx)(N.Z,{placeholder:"Enter IP address"})}),(0,a.jsx)(k.Z.Item,{children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add IP Address"})})]})}),(0,a.jsx)(w.Z,{title:"Confirm Delete",visible:et,onCancel:()=>en(!1),onOk:eZ,footer:[(0,a.jsx)(p.Z,{className:"mx-1",onClick:()=>eZ(),children:"Yes"},"delete"),(0,a.jsx)(p.Z,{onClick:()=>en(!1),children:"Close"},"close")],children:(0,a.jsxs)("p",{children:["Are you sure you want to delete the IP address: ",ei,"?"]})})]}),(0,a.jsxs)(eb.Z,{title:"Login without SSO",color:"teal",children:["If you need to login without sso, you can access"," ",(0,a.jsxs)("a",{href:l,target:"_blank",children:[(0,a.jsx)("b",{children:l})," "]})]})]})]})},eU=s(42556),eV=s(90252),eq=e=>{let{alertingSettings:l,handleInputChange:s,handleResetField:t,handleSubmit:n,premiumUser:r}=e,[i]=k.Z.useForm();return(0,a.jsxs)(k.Z,{form:i,onFinish:()=>{let e=i.getFieldsValue();Object.values(e).some(e=>""===e||null==e)?console.log("Some form fields are empty."):n(e)},labelAlign:"left",children:[l.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsxs)(U.Z,{align:"center",children:[(0,a.jsx)(_.Z,{children:e.field_name}),(0,a.jsx)("p",{style:{fontSize:"0.65rem",color:"#808080",fontStyle:"italic"},className:"mt-1",children:e.field_description})]}),e.premium_field?r?(0,a.jsx)(k.Z.Item,{name:e.field_name,children:(0,a.jsx)(U.Z,{children:"Integer"===e.field_type?(0,a.jsx)(I.Z,{step:1,value:e.field_value,onChange:l=>s(e.field_name,l)}):(0,a.jsx)(N.Z,{value:e.field_value,onChange:l=>s(e.field_name,l)})})}):(0,a.jsx)(U.Z,{children:(0,a.jsx)(p.Z,{className:"flex items-center justify-center",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"✨ Enterprise Feature"})})}):(0,a.jsx)(k.Z.Item,{name:e.field_name,className:"mb-0",children:(0,a.jsx)(U.Z,{children:"Integer"===e.field_type?(0,a.jsx)(I.Z,{step:1,value:e.field_value,onChange:l=>s(e.field_name,l),className:"p-0"}):(0,a.jsx)(N.Z,{value:e.field_value,onChange:l=>s(e.field_name,l)})})}),(0,a.jsx)(U.Z,{children:!0==e.stored_in_db?(0,a.jsx)(R.Z,{icon:eV.Z,className:"text-white",children:"In DB"}):!1==e.stored_in_db?(0,a.jsx)(R.Z,{className:"text-gray bg-white outline",children:"In Config"}):(0,a.jsx)(R.Z,{className:"text-gray bg-white outline",children:"Not Set"})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(M.Z,{icon:O.Z,color:"red",onClick:()=>t(e.field_name,l),children:"Reset"})})]},l)),(0,a.jsx)("div",{children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Update Settings"})})]})},ez=e=>{let{accessToken:l,premiumUser:s}=e,[t,n]=(0,r.useState)([]);return console.log("INSIDE ALERTING SETTINGS"),(0,r.useEffect)(()=>{l&&(0,u.RQ)(l).then(e=>{n(e)})},[l]),(0,a.jsx)(eq,{alertingSettings:t,handleInputChange:(e,l)=>{n(t.map(s=>s.field_name===e?{...s,field_value:l}:s))},handleResetField:(e,s)=>{if(l)try{let l=t.map(l=>l.field_name===e?{...l,stored_in_db:null,field_value:l.field_default_value}:l);console.log("INSIDE HANDLE RESET FIELD"),n(l)}catch(e){console.log("ERROR OCCURRED!")}},handleSubmit:e=>{if(!l||null==e||void 0==e)return;let s={};t.forEach(e=>{s[e.field_name]=e.field_value});let n={...e,...s};try{(0,u.jA)(l,"alerting_args",n),S.ZP.success("Wait 10s for proxy to update.")}catch(e){}},premiumUser:s})},eB=s(84406);let{Title:eK,Paragraph:eW}=Q.default;var eH=e=>{let{accessToken:l,userRole:s,userID:t,premiumUser:n}=e,[i,o]=(0,r.useState)([]),[d,c]=(0,r.useState)([]),[m,h]=(0,r.useState)(!1),[g]=k.Z.useForm(),[Z,f]=(0,r.useState)(null),[y,b]=(0,r.useState)([]),[N,I]=(0,r.useState)(""),[C,P]=(0,r.useState)({}),[T,O]=(0,r.useState)([]),[R,B]=(0,r.useState)(!1),[W,H]=(0,r.useState)([]),[G,Y]=(0,r.useState)(null),[J,X]=(0,r.useState)([]),[$,Q]=(0,r.useState)(!1),[ee,el]=(0,r.useState)(null),es=e=>{T.includes(e)?O(T.filter(l=>l!==e)):O([...T,e])},eo={llm_exceptions:"LLM Exceptions",llm_too_slow:"LLM Responses Too Slow",llm_requests_hanging:"LLM Requests Hanging",budget_alerts:"Budget Alerts (API Keys, Users)",db_exceptions:"Database Exceptions (Read/Write)",daily_reports:"Weekly/Monthly Spend Reports",outage_alerts:"Outage Alerts",region_outage_alerts:"Region Outage Alerts"};(0,r.useEffect)(()=>{l&&s&&t&&(0,u.BL)(l,t,s).then(e=>{console.log("callbacks",e),o(e.callbacks),H(e.available_callbacks);let l=e.alerts;if(console.log("alerts_data",l),l&&l.length>0){let e=l[0];console.log("_alert_info",e);let s=e.variables.SLACK_WEBHOOK_URL;console.log("catch_all_webhook",s),O(e.active_alerts),I(s),P(e.alerts_to_webhook)}c(l)})},[l,s,t]);let ed=e=>T&&T.includes(e),ec=()=>{if(!l)return;let e={};d.filter(e=>"email"===e.name).forEach(l=>{var s;Object.entries(null!==(s=l.variables)&&void 0!==s?s:{}).forEach(l=>{let[s,t]=l,n=document.querySelector('input[name="'.concat(s,'"]'));n&&n.value&&(e[s]=null==n?void 0:n.value)})}),console.log("updatedVariables",e);try{(0,u.K_)(l,{general_settings:{alerting:["email"]},environment_variables:e})}catch(e){S.ZP.error("Failed to update alerts: "+e,20)}S.ZP.success("Email settings updated successfully")},em=async e=>{if(!l)return;let s={};Object.entries(e).forEach(e=>{let[l,t]=e;"callback"!==l&&(s[l]=t)});try{await (0,u.K_)(l,{environment_variables:s}),S.ZP.success("Callback added successfully"),h(!1),g.resetFields(),f(null)}catch(e){S.ZP.error("Failed to add callback: "+e,20)}},eu=async e=>{if(!l)return;let s=null==e?void 0:e.callback,t={};Object.entries(e).forEach(e=>{let[l,s]=e;"callback"!==l&&(t[l]=s)});try{await (0,u.K_)(l,{environment_variables:t,litellm_settings:{success_callback:[s]}}),S.ZP.success("Callback ".concat(s," added successfully")),h(!1),g.resetFields(),f(null)}catch(e){S.ZP.error("Failed to add callback: "+e,20)}},eh=e=>{console.log("inside handleSelectedCallbackChange",e),f(e.litellm_callback_name),console.log("all callbacks",W),e&&e.litellm_callback_params?(X(e.litellm_callback_params),console.log("selectedCallbackParams",J)):X([])};return l?(console.log("callbacks: ".concat(i)),(0,a.jsxs)("div",{className:"w-full mx-4",children:[(0,a.jsx)(x.Z,{numItems:1,className:"gap-2 p-8 w-full mt-2",children:(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{variant:"line",defaultValue:"1",children:[(0,a.jsx)(et.Z,{value:"1",children:"Logging Callbacks"}),(0,a.jsx)(et.Z,{value:"2",children:"Alerting Types"}),(0,a.jsx)(et.Z,{value:"3",children:"Alerting Settings"}),(0,a.jsx)(et.Z,{value:"4",children:"Email Alerts"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsxs)(er.Z,{children:[(0,a.jsx)(eK,{level:4,children:"Active Logging Callbacks"}),(0,a.jsx)(x.Z,{numItems:2,children:(0,a.jsx)(F.Z,{className:"max-h-[50vh]",children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsx)(z.Z,{children:(0,a.jsx)(q.Z,{children:"Callback Name"})})}),(0,a.jsx)(L.Z,{children:i.map((e,s)=>(0,a.jsxs)(z.Z,{className:"flex justify-between",children:[(0,a.jsx)(U.Z,{children:(0,a.jsx)(_.Z,{children:e.name})}),(0,a.jsx)(U.Z,{children:(0,a.jsxs)(x.Z,{numItems:2,className:"flex justify-between",children:[(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>{el(e),Q(!0)}}),(0,a.jsx)(p.Z,{onClick:()=>(0,u.jE)(l,e.name),className:"ml-2",variant:"secondary",children:"Test Callback"})]})})]},s))})]})})}),(0,a.jsx)(p.Z,{className:"mt-2",onClick:()=>B(!0),children:"Add Callback"})]}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(_.Z,{className:"my-2",children:["Alerts are only supported for Slack Webhook URLs. Get your webhook urls from"," ",(0,a.jsx)("a",{href:"https://api.slack.com/messaging/webhooks",target:"_blank",style:{color:"blue"},children:"here"})]}),(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{}),(0,a.jsx)(q.Z,{}),(0,a.jsx)(q.Z,{children:"Slack Webhook URL"})]})}),(0,a.jsx)(L.Z,{children:Object.entries(eo).map((e,l)=>{let[s,t]=e;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:"region_outage_alerts"==s?n?(0,a.jsx)(eU.Z,{id:"switch",name:"switch",checked:ed(s),onChange:()=>es(s)}):(0,a.jsx)(p.Z,{className:"flex items-center justify-center",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"✨ Enterprise Feature"})}):(0,a.jsx)(eU.Z,{id:"switch",name:"switch",checked:ed(s),onChange:()=>es(s)})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(_.Z,{children:t})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(j.Z,{name:s,type:"password",defaultValue:C&&C[s]?C[s]:N})})]},l)})})]}),(0,a.jsx)(p.Z,{size:"xs",className:"mt-2",onClick:()=>{if(!l)return;let e={};Object.entries(eo).forEach(l=>{let[s,t]=l,n=document.querySelector('input[name="'.concat(s,'"]'));console.log("key",s),console.log("webhookInput",n);let a=(null==n?void 0:n.value)||"";console.log("newWebhookValue",a),e[s]=a}),console.log("updatedAlertToWebhooks",e);let s={general_settings:{alert_to_webhook_url:e,alert_types:T}};console.log("payload",s);try{(0,u.K_)(l,s)}catch(e){S.ZP.error("Failed to update alerts: "+e,20)}S.ZP.success("Alerts updated successfully")},children:"Save Changes"}),(0,a.jsx)(p.Z,{onClick:()=>(0,u.jE)(l,"slack"),className:"mx-2",children:"Test Alerts"})]})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ez,{accessToken:l,premiumUser:n})}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(eK,{level:4,children:"Email Settings"}),(0,a.jsxs)(_.Z,{children:[(0,a.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/email",target:"_blank",style:{color:"blue"},children:" LiteLLM Docs: email alerts"})," ",(0,a.jsx)("br",{})]}),(0,a.jsx)("div",{className:"flex w-full",children:d.filter(e=>"email"===e.name).map((e,l)=>{var s;return(0,a.jsx)(U.Z,{children:(0,a.jsx)("ul",{children:(0,a.jsx)(x.Z,{numItems:2,children:Object.entries(null!==(s=e.variables)&&void 0!==s?s:{}).map(e=>{let[l,s]=e;return(0,a.jsxs)("li",{className:"mx-2 my-2",children:[!0!=n&&("EMAIL_LOGO_URL"===l||"EMAIL_SUPPORT_CONTACT"===l)?(0,a.jsxs)("div",{children:[(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:(0,a.jsxs)(_.Z,{className:"mt-2",children:[" ","✨ ",l]})}),(0,a.jsx)(j.Z,{name:l,defaultValue:s,type:"password",disabled:!0,style:{width:"400px"}})]}):(0,a.jsxs)("div",{children:[(0,a.jsx)(_.Z,{className:"mt-2",children:l}),(0,a.jsx)(j.Z,{name:l,defaultValue:s,type:"password",style:{width:"400px"}})]}),(0,a.jsxs)("p",{style:{fontSize:"small",fontStyle:"italic"},children:["SMTP_HOST"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Enter the SMTP host address, e.g. `smtp.resend.com`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"SMTP_PORT"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Enter the SMTP port number, e.g. `587`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"SMTP_USERNAME"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Enter the SMTP username, e.g. `username`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"SMTP_PASSWORD"===l&&(0,a.jsx)("span",{style:{color:"red"},children:" Required * "}),"SMTP_SENDER_EMAIL"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Enter the sender email address, e.g. `sender@berri.ai`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"TEST_EMAIL_ADDRESS"===l&&(0,a.jsxs)("div",{style:{color:"gray"},children:["Email Address to send `Test Email Alert` to. example: `info@berri.ai`",(0,a.jsx)("span",{style:{color:"red"},children:" Required * "})]}),"EMAIL_LOGO_URL"===l&&(0,a.jsx)("div",{style:{color:"gray"},children:"(Optional) Customize the Logo that appears in the email, pass a url to your logo"}),"EMAIL_SUPPORT_CONTACT"===l&&(0,a.jsx)("div",{style:{color:"gray"},children:"(Optional) Customize the support email address that appears in the email. Default is support@berri.ai"})]})]},l)})})})},l)})}),(0,a.jsx)(p.Z,{className:"mt-2",onClick:()=>ec(),children:"Save Changes"}),(0,a.jsx)(p.Z,{onClick:()=>(0,u.jE)(l,"email"),className:"mx-2",children:"Test Email Alerts"})]})})]})]})}),(0,a.jsxs)(w.Z,{title:"Add Logging Callback",visible:R,width:800,onCancel:()=>B(!1),footer:null,children:[(0,a.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/logging",className:"mb-8 mt-4",target:"_blank",style:{color:"blue"},children:" LiteLLM Docs: Logging"}),(0,a.jsx)(k.Z,{form:g,onFinish:eu,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(eB.Z,{label:"Callback",name:"callback",rules:[{required:!0,message:"Please select a callback"}],children:(0,a.jsx)(v.default,{onChange:e=>{let l=W[e];l&&(console.log(l.ui_callback_name),eh(l))},children:W&&Object.values(W).map(e=>(0,a.jsx)(K.Z,{value:e.litellm_callback_name,children:e.ui_callback_name},e.litellm_callback_name))})}),J&&J.map(e=>(0,a.jsx)(eB.Z,{label:e,name:e,rules:[{required:!0,message:"Please enter the value for "+e}],children:(0,a.jsx)(j.Z,{type:"password"})},e)),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})})]}),(0,a.jsx)(w.Z,{visible:$,width:800,title:"Edit ".concat(null==ee?void 0:ee.name," Settings"),onCancel:()=>Q(!1),footer:null,children:(0,a.jsxs)(k.Z,{form:g,onFinish:em,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsx)(a.Fragment,{children:ee&&ee.variables&&Object.entries(ee.variables).map(e=>{let[l,s]=e;return(0,a.jsx)(eB.Z,{label:l,name:l,children:(0,a.jsx)(j.Z,{type:"password",defaultValue:s})},l)})}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Save"})})]})})]})):null};let{Option:eG}=v.default;var eY=e=>{let{models:l,accessToken:s,routerSettings:t,setRouterSettings:n}=e,[i]=k.Z.useForm(),[o,d]=(0,r.useState)(!1),[c,m]=(0,r.useState)("");return(0,a.jsxs)("div",{children:[(0,a.jsx)(p.Z,{className:"mx-auto",onClick:()=>d(!0),children:"+ Add Fallbacks"}),(0,a.jsx)(w.Z,{title:"Add Fallbacks",visible:o,width:800,footer:null,onOk:()=>{d(!1),i.resetFields()},onCancel:()=>{d(!1),i.resetFields()},children:(0,a.jsxs)(k.Z,{form:i,onFinish:e=>{console.log(e);let{model_name:l,models:a}=e,r=[...t.fallbacks||[],{[l]:a}],o={...t,fallbacks:r};console.log(o);try{(0,u.K_)(s,{router_settings:o}),n(o)}catch(e){S.ZP.error("Failed to update router settings: "+e,20)}S.ZP.success("router settings updated successfully"),d(!1),i.resetFields()},labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{label:"Public Model Name",name:"model_name",rules:[{required:!0,message:"Set the model to fallback for"}],help:"required",children:(0,a.jsx)(B.Z,{defaultValue:c,children:l&&l.map((e,l)=>(0,a.jsx)(K.Z,{value:e,onClick:()=>m(e),children:e},l))})}),(0,a.jsx)(k.Z.Item,{label:"Fallback Models",name:"models",rules:[{required:!0,message:"Please select a model"}],help:"required",children:(0,a.jsx)(eo.Z,{value:l,children:l&&l.filter(e=>e!=c).map(e=>(0,a.jsx)(ed.Z,{value:e,children:e},e))})})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Add Fallbacks"})})]})})]})},eJ=s(12968);async function eX(e,l){console.log("isLocal:",!1);let s=window.location.origin,t=new eJ.ZP.OpenAI({apiKey:l,baseURL:s,dangerouslyAllowBrowser:!0});try{let l=await t.chat.completions.create({model:e,messages:[{role:"user",content:"Hi, this is a test message"}],mock_testing_fallbacks:!0});S.ZP.success((0,a.jsxs)("span",{children:["Test model=",(0,a.jsx)("strong",{children:e}),", received model=",(0,a.jsx)("strong",{children:l.model}),". See"," ",(0,a.jsx)("a",{href:"#",onClick:()=>window.open("https://docs.litellm.ai/docs/proxy/reliability","_blank"),style:{textDecoration:"underline",color:"blue"},children:"curl"})]}))}catch(e){S.ZP.error("Error occurred while generating model response. Please try again. Error: ".concat(e),20)}}let e$={ttl:3600,lowest_latency_buffer:0},eQ=e=>{let{selectedStrategy:l,strategyArgs:s,paramExplanation:t}=e;return(0,a.jsxs)(g.Z,{children:[(0,a.jsx)(f.Z,{className:"text-sm font-medium text-tremor-content-strong dark:text-dark-tremor-content-strong",children:"Routing Strategy Specific Args"}),(0,a.jsx)(Z.Z,{children:"latency-based-routing"==l?(0,a.jsx)(F.Z,{children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Setting"}),(0,a.jsx)(q.Z,{children:"Value"})]})}),(0,a.jsx)(L.Z,{children:Object.entries(s).map(e=>{let[l,s]=e;return(0,a.jsxs)(z.Z,{children:[(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(_.Z,{children:l}),(0,a.jsx)("p",{style:{fontSize:"0.65rem",color:"#808080",fontStyle:"italic"},className:"mt-1",children:t[l]})]}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(j.Z,{name:l,defaultValue:"object"==typeof s?JSON.stringify(s,null,2):s.toString()})})]},l)})})]})}):(0,a.jsx)(_.Z,{children:"No specific settings"})})]})};var e0=e=>{let{accessToken:l,userRole:s,userID:t,modelData:n}=e,[i,o]=(0,r.useState)({}),[d,c]=(0,r.useState)({}),[m,g]=(0,r.useState)([]),[Z,f]=(0,r.useState)(!1),[b]=k.Z.useForm(),[v,w]=(0,r.useState)(null),[N,A]=(0,r.useState)(null),[C,P]=(0,r.useState)(null),T={routing_strategy_args:"(dict) Arguments to pass to the routing strategy",routing_strategy:"(string) Routing strategy to use",allowed_fails:"(int) Number of times a deployment can fail before being added to cooldown",cooldown_time:"(int) time in seconds to cooldown a deployment after failure",num_retries:"(int) Number of retries for failed requests. Defaults to 0.",timeout:"(float) Timeout for requests. Defaults to None.",retry_after:"(int) Minimum time to wait before retrying a failed request",ttl:"(int) Sliding window to look back over when calculating the average latency of a deployment. Default - 1 hour (in seconds).",lowest_latency_buffer:"(float) Shuffle between deployments within this % of the lowest latency. Default - 0 (i.e. always pick lowest latency)."};(0,r.useEffect)(()=>{l&&s&&t&&((0,u.BL)(l,t,s).then(e=>{console.log("callbacks",e);let l=e.router_settings;"model_group_retry_policy"in l&&delete l.model_group_retry_policy,o(l)}),(0,u.YU)(l).then(e=>{g(e)}))},[l,s,t]);let E=async e=>{if(l){console.log("received key: ".concat(e)),console.log("routerSettings['fallbacks']: ".concat(i.fallbacks)),i.fallbacks.map(l=>(e in l&&delete l[e],l));try{await (0,u.K_)(l,{router_settings:i}),o({...i}),A(i.routing_strategy),S.ZP.success("Router settings updated successfully")}catch(e){S.ZP.error("Failed to update router settings: "+e,20)}}},W=(e,l)=>{g(m.map(s=>s.field_name===e?{...s,field_value:l}:s))},H=(e,s)=>{if(!l)return;let t=m[s].field_value;if(null!=t&&void 0!=t)try{(0,u.jA)(l,e,t);let s=m.map(l=>l.field_name===e?{...l,stored_in_db:!0}:l);g(s)}catch(e){}},G=(e,s)=>{if(l)try{(0,u.ao)(l,e);let s=m.map(l=>l.field_name===e?{...l,stored_in_db:null,field_value:null}:l);g(s)}catch(e){}},Y=e=>{if(!l)return;console.log("router_settings",e);let s=Object.fromEntries(Object.entries(e).map(e=>{let[l,s]=e;if("routing_strategy_args"!==l&&"routing_strategy"!==l){var t;return[l,(null===(t=document.querySelector('input[name="'.concat(l,'"]')))||void 0===t?void 0:t.value)||s]}if("routing_strategy"==l)return[l,N];if("routing_strategy_args"==l&&"latency-based-routing"==N){let e={},l=document.querySelector('input[name="lowest_latency_buffer"]'),s=document.querySelector('input[name="ttl"]');return(null==l?void 0:l.value)&&(e.lowest_latency_buffer=Number(l.value)),(null==s?void 0:s.value)&&(e.ttl=Number(s.value)),console.log("setRoutingStrategyArgs: ".concat(e)),["routing_strategy_args",e]}return null}).filter(e=>null!=e));console.log("updatedVariables",s);try{(0,u.K_)(l,{router_settings:s})}catch(e){S.ZP.error("Failed to update router settings: "+e,20)}S.ZP.success("router settings updated successfully")};return l?(0,a.jsx)("div",{className:"w-full mx-4",children:(0,a.jsxs)(en.Z,{className:"gap-2 p-8 h-[75vh] w-full mt-2",children:[(0,a.jsxs)(ea.Z,{variant:"line",defaultValue:"1",children:[(0,a.jsx)(et.Z,{value:"1",children:"Loadbalancing"}),(0,a.jsx)(et.Z,{value:"2",children:"Fallbacks"}),(0,a.jsx)(et.Z,{value:"3",children:"General"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 p-8 w-full mt-2",children:[(0,a.jsx)(y.Z,{children:"Router Settings"}),(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Setting"}),(0,a.jsx)(q.Z,{children:"Value"})]})}),(0,a.jsx)(L.Z,{children:Object.entries(i).filter(e=>{let[l,s]=e;return"fallbacks"!=l&&"context_window_fallbacks"!=l&&"routing_strategy_args"!=l}).map(e=>{let[l,s]=e;return(0,a.jsxs)(z.Z,{children:[(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(_.Z,{children:l}),(0,a.jsx)("p",{style:{fontSize:"0.65rem",color:"#808080",fontStyle:"italic"},className:"mt-1",children:T[l]})]}),(0,a.jsx)(U.Z,{children:"routing_strategy"==l?(0,a.jsxs)(B.Z,{defaultValue:s,className:"w-full max-w-md",onValueChange:A,children:[(0,a.jsx)(K.Z,{value:"usage-based-routing",children:"usage-based-routing"}),(0,a.jsx)(K.Z,{value:"latency-based-routing",children:"latency-based-routing"}),(0,a.jsx)(K.Z,{value:"simple-shuffle",children:"simple-shuffle"})]}):(0,a.jsx)(j.Z,{name:l,defaultValue:"object"==typeof s?JSON.stringify(s,null,2):s.toString()})})]},l)})})]}),(0,a.jsx)(eQ,{selectedStrategy:N,strategyArgs:i&&i.routing_strategy_args&&Object.keys(i.routing_strategy_args).length>0?i.routing_strategy_args:e$,paramExplanation:T})]}),(0,a.jsx)(h.Z,{children:(0,a.jsx)(p.Z,{className:"mt-2",onClick:()=>Y(i),children:"Save Changes"})})]})}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Model Name"}),(0,a.jsx)(q.Z,{children:"Fallbacks"})]})}),(0,a.jsx)(L.Z,{children:i.fallbacks&&i.fallbacks.map((e,s)=>Object.entries(e).map(e=>{let[t,n]=e;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:t}),(0,a.jsx)(U.Z,{children:Array.isArray(n)?n.join(", "):n}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(p.Z,{onClick:()=>eX(t,l),children:"Test Fallback"})}),(0,a.jsx)(U.Z,{children:(0,a.jsx)(M.Z,{icon:O.Z,size:"sm",onClick:()=>E(t)})})]},s.toString()+t)}))})]}),(0,a.jsx)(eY,{models:(null==n?void 0:n.data)?n.data.map(e=>e.model_name):[],accessToken:l,routerSettings:i,setRouterSettings:o})]}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(F.Z,{children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Setting"}),(0,a.jsx)(q.Z,{children:"Value"}),(0,a.jsx)(q.Z,{children:"Status"}),(0,a.jsx)(q.Z,{children:"Action"})]})}),(0,a.jsx)(L.Z,{children:m.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(_.Z,{children:e.field_name}),(0,a.jsx)("p",{style:{fontSize:"0.65rem",color:"#808080",fontStyle:"italic"},className:"mt-1",children:e.field_description})]}),(0,a.jsx)(U.Z,{children:"Integer"==e.field_type?(0,a.jsx)(I.Z,{step:1,value:e.field_value,onChange:l=>W(e.field_name,l)}):null}),(0,a.jsx)(U.Z,{children:!0==e.stored_in_db?(0,a.jsx)(R.Z,{icon:eV.Z,className:"text-white",children:"In DB"}):!1==e.stored_in_db?(0,a.jsx)(R.Z,{className:"text-gray bg-white outline",children:"In Config"}):(0,a.jsx)(R.Z,{className:"text-gray bg-white outline",children:"Not Set"})}),(0,a.jsxs)(U.Z,{children:[(0,a.jsx)(p.Z,{onClick:()=>H(e.field_name,l),children:"Update"}),(0,a.jsx)(M.Z,{icon:O.Z,color:"red",onClick:()=>G(e.field_name,l),children:"Reset"})]})]},l))})]})})})]})]})}):null},e1=e=>{let{isModalVisible:l,accessToken:s,setIsModalVisible:t,setBudgetList:n}=e,[r]=k.Z.useForm(),i=async e=>{if(null!=s&&void 0!=s)try{S.ZP.info("Making API Call");let l=await (0,u.Zr)(s,e);console.log("key create Response:",l),n(e=>e?[...e,l]:[l]),S.ZP.success("API Key Created"),r.resetFields()}catch(e){console.error("Error creating the key:",e),S.ZP.error("Error creating the key: ".concat(e),20)}};return(0,a.jsx)(w.Z,{title:"Create Budget",visible:l,width:800,footer:null,onOk:()=>{t(!1),r.resetFields()},onCancel:()=>{t(!1),r.resetFields()},children:(0,a.jsxs)(k.Z,{form:r,onFinish:i,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{label:"Budget ID",name:"budget_id",rules:[{required:!0,message:"Please input a human-friendly name for the budget"}],help:"A human-friendly name for the budget",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(k.Z.Item,{label:"Max Tokens per minute",name:"tpm_limit",help:"Default is model limit.",children:(0,a.jsx)(I.Z,{step:1,precision:2,width:200})}),(0,a.jsx)(k.Z.Item,{label:"Max Requests per minute",name:"rpm_limit",help:"Default is model limit.",children:(0,a.jsx)(I.Z,{step:1,precision:2,width:200})}),(0,a.jsxs)(g.Z,{className:"mt-20 mb-8",children:[(0,a.jsx)(f.Z,{children:(0,a.jsx)("b",{children:"Optional Settings"})}),(0,a.jsxs)(Z.Z,{children:[(0,a.jsx)(k.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})})]})]})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Create Budget"})})]})})},e2=e=>{let{isModalVisible:l,accessToken:s,setIsModalVisible:t,setBudgetList:n,existingBudget:r}=e,[i]=k.Z.useForm(),o=async e=>{if(null!=s&&void 0!=s)try{S.ZP.info("Making API Call");let l=await (0,u.Zr)(s,e);console.log("key create Response:",l),n(e=>e?[...e,l]:[l]),S.ZP.success("API Key Created"),i.resetFields()}catch(e){console.error("Error creating the key:",e),S.ZP.error("Error creating the key: ".concat(e),20)}};return(0,a.jsx)(w.Z,{title:"Edit Budget",visible:l,width:800,footer:null,onOk:()=>{t(!1),i.resetFields()},onCancel:()=>{t(!1),i.resetFields()},children:(0,a.jsxs)(k.Z,{form:i,onFinish:o,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",initialValues:r,children:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(k.Z.Item,{label:"Budget ID",name:"budget_id",rules:[{required:!0,message:"Please input a human-friendly name for the budget"}],help:"A human-friendly name for the budget",children:(0,a.jsx)(j.Z,{placeholder:""})}),(0,a.jsx)(k.Z.Item,{label:"Max Tokens per minute",name:"tpm_limit",help:"Default is model limit.",children:(0,a.jsx)(I.Z,{step:1,precision:2,width:200})}),(0,a.jsx)(k.Z.Item,{label:"Max Requests per minute",name:"rpm_limit",help:"Default is model limit.",children:(0,a.jsx)(I.Z,{step:1,precision:2,width:200})}),(0,a.jsxs)(g.Z,{className:"mt-20 mb-8",children:[(0,a.jsx)(f.Z,{children:(0,a.jsx)("b",{children:"Optional Settings"})}),(0,a.jsxs)(Z.Z,{children:[(0,a.jsx)(k.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,a.jsx)(I.Z,{step:.01,precision:2,width:200})}),(0,a.jsx)(k.Z.Item,{className:"mt-8",label:"Reset Budget",name:"budget_duration",children:(0,a.jsxs)(v.default,{defaultValue:null,placeholder:"n/a",children:[(0,a.jsx)(v.default.Option,{value:"24h",children:"daily"}),(0,a.jsx)(v.default.Option,{value:"7d",children:"weekly"}),(0,a.jsx)(v.default.Option,{value:"30d",children:"monthly"})]})})]})]})]}),(0,a.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,a.jsx)(A.ZP,{htmlType:"submit",children:"Edit Budget"})})]})})},e4=e=>{let{accessToken:l}=e,[s,t]=(0,r.useState)(!1),[n,i]=(0,r.useState)(!1),[o,d]=(0,r.useState)(null),[c,m]=(0,r.useState)([]);(0,r.useEffect)(()=>{l&&(0,u.O3)(l).then(e=>{m(e)})},[l]);let h=async(e,s)=>{null!=l&&(d(c[s]),i(!0))},x=async(e,s)=>{if(null==l)return;S.ZP.info("Request made"),await (0,u.NV)(l,e);let t=[...c];t.splice(s,1),m(t),S.ZP.success("Budget Deleted.")};return(0,a.jsxs)("div",{className:"w-full mx-auto flex-auto overflow-y-auto m-8 p-2",children:[(0,a.jsx)(p.Z,{size:"sm",variant:"primary",className:"mb-2",onClick:()=>t(!0),children:"+ Create Budget"}),(0,a.jsx)(e1,{accessToken:l,isModalVisible:s,setIsModalVisible:t,setBudgetList:m}),o&&(0,a.jsx)(e2,{accessToken:l,isModalVisible:n,setIsModalVisible:i,setBudgetList:m,existingBudget:o}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(_.Z,{children:"Create a budget to assign to customers."}),(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Budget ID"}),(0,a.jsx)(q.Z,{children:"Max Budget"}),(0,a.jsx)(q.Z,{children:"TPM"}),(0,a.jsx)(q.Z,{children:"RPM"})]})}),(0,a.jsx)(L.Z,{children:c.map((e,l)=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.budget_id}),(0,a.jsx)(U.Z,{children:e.max_budget?e.max_budget:"n/a"}),(0,a.jsx)(U.Z,{children:e.tpm_limit?e.tpm_limit:"n/a"}),(0,a.jsx)(U.Z,{children:e.rpm_limit?e.rpm_limit:"n/a"}),(0,a.jsx)(M.Z,{icon:E.Z,size:"sm",onClick:()=>h(e.budget_id,l)}),(0,a.jsx)(M.Z,{icon:O.Z,size:"sm",onClick:()=>x(e.budget_id,l)})]},l))})]})]}),(0,a.jsxs)("div",{className:"mt-5",children:[(0,a.jsx)(_.Z,{className:"text-base",children:"How to use budget id"}),(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{children:[(0,a.jsx)(et.Z,{children:"Assign Budget to Customer"}),(0,a.jsx)(et.Z,{children:"Test it (Curl)"}),(0,a.jsx)(et.Z,{children:"Test it (OpenAI SDK)"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"bash",children:"\ncurl -X POST --location '/end_user/new' \n-H 'Authorization: Bearer ' \n-H 'Content-Type: application/json' \n-d '{\"user_id\": \"my-customer-id', \"budget_id\": \"\"}' # \uD83D\uDC48 KEY CHANGE\n\n "})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"bash",children:'\ncurl -X POST --location \'/chat/completions\' \n-H \'Authorization: Bearer \' \n-H \'Content-Type: application/json\' \n-d \'{\n "model": "gpt-3.5-turbo\', \n "messages":[{"role": "user", "content": "Hey, how\'s it going?"}],\n "user": "my-customer-id"\n}\' # \uD83D\uDC48 KEY CHANGE\n\n '})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"python",children:'from openai import OpenAI\nclient = OpenAI(\n base_url="",\n api_key=""\n)\n\ncompletion = client.chat.completions.create(\n model="gpt-3.5-turbo",\n messages=[\n {"role": "system", "content": "You are a helpful assistant."},\n {"role": "user", "content": "Hello!"}\n ],\n user="my-customer-id"\n)\n\nprint(completion.choices[0].message)'})})]})]})]})]})},e5=s(41134),e8=e=>{let{proxySettings:l}=e,s="";return l&&l.PROXY_BASE_URL&&void 0!==l.PROXY_BASE_URL&&(s=l.PROXY_BASE_URL),(0,a.jsx)(a.Fragment,{children:(0,a.jsx)(x.Z,{className:"gap-2 p-8 h-[80vh] w-full mt-2",children:(0,a.jsxs)("div",{className:"mb-5",children:[(0,a.jsx)("p",{className:"text-2xl text-tremor-content-strong dark:text-dark-tremor-content-strong font-semibold",children:"OpenAI Compatible Proxy: API Reference"}),(0,a.jsx)(_.Z,{className:"mt-2 mb-2",children:"LiteLLM is OpenAI Compatible. This means your API Key works with the OpenAI SDK. Just replace the base_url to point to your litellm proxy. Example Below "}),(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{children:[(0,a.jsx)(et.Z,{children:"OpenAI Python SDK"}),(0,a.jsx)(et.Z,{children:"LlamaIndex"}),(0,a.jsx)(et.Z,{children:"Langchain Py"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="'.concat(s,'" # LiteLLM Proxy is OpenAI compatible, Read More: https://docs.litellm.ai/docs/proxy/user_keys\n)\n\nresponse = client.chat.completions.create(\n model="gpt-3.5-turbo", # model to send to the proxy\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ]\n)\n\nprint(response)\n ')})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="azure-gpt-3.5", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="'.concat(s,'", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="').concat(s,'",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n ')})}),(0,a.jsx)(er.Z,{children:(0,a.jsx)(ew.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="'.concat(s,'",\n model = "gpt-3.5-turbo",\n temperature=0.1\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n ')})})]})]})]})})})};async function e3(e,l,s,t){console.log("isLocal:",!1);let n=window.location.origin,a=new eJ.ZP.OpenAI({apiKey:t,baseURL:n,dangerouslyAllowBrowser:!0});try{for await(let t of(await a.chat.completions.create({model:s,stream:!0,messages:[{role:"user",content:e}]})))console.log(t),t.choices[0].delta.content&&l(t.choices[0].delta.content)}catch(e){S.ZP.error("Error occurred while generating model response. Please try again. Error: ".concat(e),20)}}var e6=e=>{let{accessToken:l,token:s,userRole:t,userID:n}=e,[i,o]=(0,r.useState)(""),[d,c]=(0,r.useState)(""),[m,g]=(0,r.useState)([]),[Z,f]=(0,r.useState)(void 0),[y,b]=(0,r.useState)([]);(0,r.useEffect)(()=>{l&&s&&t&&n&&(async()=>{try{let e=await (0,u.So)(l,n,t);if(console.log("model_info:",e),(null==e?void 0:e.data.length)>0){let l=e.data.map(e=>({value:e.id,label:e.id}));if(console.log(l),l.length>0){let e=Array.from(new Set(l));console.log("Unique models:",e),e.sort((e,l)=>e.label.localeCompare(l.label)),console.log("Model info:",y),b(e)}f(e.data[0].id)}}catch(e){console.error("Error fetching model info:",e)}})()},[l,n,t]);let k=(e,l)=>{g(s=>{let t=s[s.length-1];return t&&t.role===e?[...s.slice(0,s.length-1),{role:e,content:t.content+l}]:[...s,{role:e,content:l}]})},S=async()=>{if(""!==d.trim()&&i&&s&&t&&n){g(e=>[...e,{role:"user",content:d}]);try{Z&&await e3(d,e=>k("assistant",e),Z,i)}catch(e){console.error("Error fetching model response",e),k("assistant","Error fetching model response")}c("")}};if(t&&"Admin Viewer"==t){let{Title:e,Paragraph:l}=Q.default;return(0,a.jsxs)("div",{children:[(0,a.jsx)(e,{level:1,children:"Access Denied"}),(0,a.jsx)(l,{children:"Ask your proxy admin for access to test models"})]})}return(0,a.jsx)("div",{style:{width:"100%",position:"relative"},children:(0,a.jsx)(x.Z,{className:"gap-2 p-8 h-[80vh] w-full mt-2",children:(0,a.jsx)(F.Z,{children:(0,a.jsxs)(en.Z,{children:[(0,a.jsx)(ea.Z,{children:(0,a.jsx)(et.Z,{children:"Chat"})}),(0,a.jsx)(ei.Z,{children:(0,a.jsxs)(er.Z,{children:[(0,a.jsx)("div",{className:"sm:max-w-2xl",children:(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsx)(_.Z,{children:"API Key"}),(0,a.jsx)(j.Z,{placeholder:"Type API Key here",type:"password",onValueChange:o,value:i})]}),(0,a.jsxs)(h.Z,{className:"mx-2",children:[(0,a.jsx)(_.Z,{children:"Select Model:"}),(0,a.jsx)(v.default,{placeholder:"Select a Model",onChange:e=>{console.log("selected ".concat(e)),f(e)},options:y,style:{width:"200px"}})]})]})}),(0,a.jsxs)(D.Z,{className:"mt-5",style:{display:"block",maxHeight:"60vh",overflowY:"auto"},children:[(0,a.jsx)(V.Z,{children:(0,a.jsx)(z.Z,{children:(0,a.jsx)(U.Z,{})})}),(0,a.jsx)(L.Z,{children:m.map((e,l)=>(0,a.jsx)(z.Z,{children:(0,a.jsx)(U.Z,{children:"".concat(e.role,": ").concat(e.content)})},l))})]}),(0,a.jsx)("div",{className:"mt-3",style:{position:"absolute",bottom:5,width:"95%"},children:(0,a.jsxs)("div",{className:"flex",children:[(0,a.jsx)(j.Z,{type:"text",value:d,onChange:e=>c(e.target.value),onKeyDown:e=>{"Enter"===e.key&&S()},placeholder:"Type your message..."}),(0,a.jsx)(p.Z,{onClick:S,className:"ml-2",children:"Send"})]})})]})})]})})})})},e9=s(33509),e7=s(95781);let{Sider:le}=e9.default;var ll=e=>{let{setPage:l,userRole:s,defaultSelectedKey:t}=e;return"Admin Viewer"==s?(0,a.jsx)(e9.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,a.jsx)(le,{width:120,children:(0,a.jsxs)(e7.Z,{mode:"inline",defaultSelectedKeys:t||["4"],style:{height:"100%",borderRight:0},children:[(0,a.jsx)(e7.Z.Item,{onClick:()=>l("usage"),children:"Usage"},"1"),(0,a.jsx)(e7.Z.Item,{onClick:()=>l("caching"),children:(0,a.jsx)(_.Z,{children:"Caching"})},"9")]})})}):(0,a.jsx)(e9.default,{style:{minHeight:"100vh",maxWidth:"145px"},children:(0,a.jsx)(le,{width:145,children:(0,a.jsxs)(e7.Z,{mode:"inline",defaultSelectedKeys:t||["1"],style:{height:"100%",borderRight:0},children:[(0,a.jsx)(e7.Z.Item,{onClick:()=>l("api-keys"),children:(0,a.jsx)(_.Z,{children:"Virtual Keys"})},"1"),(0,a.jsx)(e7.Z.Item,{onClick:()=>l("llm-playground"),children:(0,a.jsx)(_.Z,{children:"Test Key"})},"3"),"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("models"),children:(0,a.jsx)(_.Z,{children:"Models"})},"2"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("usage"),children:(0,a.jsx)(_.Z,{children:"Usage"})},"4"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("teams"),children:(0,a.jsx)(_.Z,{children:"Teams"})},"6"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("users"),children:(0,a.jsx)(_.Z,{children:"Internal Users"})},"5"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("settings"),children:(0,a.jsx)(_.Z,{children:"Logging & Alerts"})},"8"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("caching"),children:(0,a.jsx)(_.Z,{children:"Caching"})},"9"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("budgets"),children:(0,a.jsx)(_.Z,{children:"Budgets"})},"10"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("general-settings"),children:(0,a.jsx)(_.Z,{children:"Router Settings"})},"11"):null,"Admin"==s?(0,a.jsx)(e7.Z.Item,{onClick:()=>l("admin-panel"),children:(0,a.jsx)(_.Z,{children:"Admin Settings"})},"12"):null,(0,a.jsx)(e7.Z.Item,{onClick:()=>l("api_ref"),children:(0,a.jsx)(_.Z,{children:"API Reference"})},"13"),(0,a.jsx)(e7.Z.Item,{onClick:()=>l("model-hub"),children:(0,a.jsx)(_.Z,{children:"Model Hub"})},"15")]})})})},ls=s(67989),lt=s(52703),ln=e=>{let{accessToken:l,token:s,userRole:t,userID:n,keys:i,premiumUser:o}=e,d=new Date,[c,m]=(0,r.useState)([]),[j,g]=(0,r.useState)([]),[Z,f]=(0,r.useState)([]),[b,v]=(0,r.useState)([]),[k,S]=(0,r.useState)([]),[w,N]=(0,r.useState)([]),[I,A]=(0,r.useState)([]),[C,P]=(0,r.useState)([]),[T,E]=(0,r.useState)([]),[O,R]=(0,r.useState)([]),[M,W]=(0,r.useState)({}),[H,Y]=(0,r.useState)([]),[J,X]=(0,r.useState)(""),[$,Q]=(0,r.useState)(["all-tags"]),[ee,eu]=(0,r.useState)({from:new Date(Date.now()-6048e5),to:new Date}),eh=new Date(d.getFullYear(),d.getMonth(),1),ex=new Date(d.getFullYear(),d.getMonth()+1,0),ep=e_(eh),ej=e_(ex);function eg(e){return new Intl.NumberFormat("en-US",{maximumFractionDigits:0,notation:"compact",compactDisplay:"short"}).format(e)}console.log("keys in usage",i),console.log("premium user in usage",o),(0,r.useEffect)(()=>{ef(ee.from,ee.to)},[ee,$]);let eZ=async(e,s,t)=>{if(!e||!s||!l)return;s.setHours(23,59,59,999),e.setHours(0,0,0,0),console.log("uiSelectedKey",t);let n=await (0,u.b1)(l,t,e.toISOString(),s.toISOString());console.log("End user data updated successfully",n),v(n)},ef=async(e,s)=>{e&&s&&l&&(s.setHours(23,59,59,999),e.setHours(0,0,0,0),N((await (0,u.J$)(l,e.toISOString(),s.toISOString(),0===$.length?void 0:$)).spend_per_tag),console.log("Tag spend data updated successfully"))};function e_(e){let l=e.getFullYear(),s=e.getMonth()+1,t=e.getDate();return"".concat(l,"-").concat(s<10?"0"+s:s,"-").concat(t<10?"0"+t:t)}return console.log("Start date is ".concat(ep)),console.log("End date is ".concat(ej)),(0,r.useEffect)(()=>{l&&s&&t&&n&&(async()=>{try{if(console.log("user role: ".concat(t)),"Admin"==t||"Admin Viewer"==t){var e,a;let t=await (0,u.FC)(l);m(t);let n=await (0,u.OU)(l,s,ep,ej);console.log("provider_spend",n),R(n);let r=(await (0,u.tN)(l)).map(e=>({key:(e.key_alias||e.key_name||e.api_key).substring(0,10),spend:e.total_spend}));g(r);let i=(await (0,u.Au)(l)).map(e=>({key:e.model,spend:e.total_spend}));f(i);let o=await (0,u.mR)(l);console.log("teamSpend",o),S(o.daily_spend),P(o.teams);let d=o.total_spend_per_team;d=d.map(e=>(e.name=e.team_id||"",e.value=e.total_spend||0,e.value=e.value.toFixed(2),e)),E(d);let c=await (0,u.X)(l);A(c.tag_names);let h=await (0,u.J$)(l,null===(e=ee.from)||void 0===e?void 0:e.toISOString(),null===(a=ee.to)||void 0===a?void 0:a.toISOString(),void 0);N(h.spend_per_tag);let x=await (0,u.b1)(l,null,void 0,void 0);v(x),console.log("spend/user result",x);let p=await (0,u.wd)(l,ep,ej);W(p);let j=await (0,u.xA)(l,ep,ej);console.log("global activity per model",j),Y(j)}else"App Owner"==t&&await (0,u.HK)(l,s,t,n,ep,ej).then(async e=>{if(console.log("result from spend logs call",e),"daily_spend"in e){let l=e.daily_spend;console.log("daily spend",l),m(l);let s=e.top_api_keys;g(s)}else{let s=(await (0,u.e2)(l,function(e){let l=[];e.forEach(e=>{Object.entries(e).forEach(e=>{let[s,t]=e;"spend"!==s&&"startTime"!==s&&"models"!==s&&"users"!==s&&l.push({key:s,spend:t})})}),l.sort((e,l)=>Number(l.spend)-Number(e.spend));let s=l.slice(0,5).map(e=>e.key);return console.log("topKeys: ".concat(Object.keys(s[0]))),s}(e))).info.map(e=>({key:(e.key_name||e.key_alias).substring(0,10),spend:e.spend}));g(s),m(e)}})}catch(e){console.error("There was an error fetching the data",e)}})()},[l,s,t,n,ep,ej]),(0,a.jsx)("div",{style:{width:"100%"},className:"p-8",children:(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{className:"mt-2",children:[(0,a.jsx)(et.Z,{children:"All Up"}),(0,a.jsx)(et.Z,{children:"Team Based Usage"}),(0,a.jsx)(et.Z,{children:"Customer Usage"}),(0,a.jsx)(et.Z,{children:"Tag Based Usage"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsxs)(en.Z,{children:[(0,a.jsxs)(ea.Z,{variant:"solid",className:"mt-1",children:[(0,a.jsx)(et.Z,{children:"Cost"}),(0,a.jsx)(et.Z,{children:"Activity"})]}),(0,a.jsxs)(ei.Z,{children:[(0,a.jsx)(er.Z,{children:(0,a.jsxs)(x.Z,{numItems:2,className:"gap-2 h-[100vh] w-full",children:[(0,a.jsx)(G,{userID:n,userRole:t,accessToken:l,userSpend:null,selectedTeam:null}),(0,a.jsx)(h.Z,{numColSpan:2,children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Monthly Spend"}),(0,a.jsx)(em.Z,{data:c,index:"date",categories:["spend"],colors:["blue"],valueFormatter:e=>"$ ".concat(new Intl.NumberFormat("us").format(e).toString()),yAxisWidth:100,tickGap:5})]})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Top API Keys"}),(0,a.jsx)(em.Z,{className:"mt-4 h-40",data:j,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:80,tickGap:5,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Top Models"}),(0,a.jsx)(em.Z,{className:"mt-4 h-40",data:Z,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,a.jsx)(h.Z,{numColSpan:1}),(0,a.jsx)(h.Z,{numColSpan:2,children:(0,a.jsxs)(F.Z,{className:"mb-2",children:[(0,a.jsx)(y.Z,{children:"✨ Spend by Provider"}),o?(0,a.jsx)(a.Fragment,{children:(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsx)(lt.Z,{className:"mt-4 h-40",variant:"pie",data:O,index:"provider",category:"spend"})}),(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsxs)(D.Z,{children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Provider"}),(0,a.jsx)(q.Z,{children:"Spend"})]})}),(0,a.jsx)(L.Z,{children:O.map(e=>(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.provider}),(0,a.jsx)(U.Z,{children:1e-5>parseFloat(e.spend.toFixed(2))?"less than 0.00":e.spend.toFixed(2)})]},e.provider))})]})})]})}):(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"mb-2 text-gray-500 italic text-[12px]",children:"Upgrade to use this feature"}),(0,a.jsx)(p.Z,{variant:"primary",className:"mb-2",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get Free Trial"})})]})]})})]})}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(x.Z,{numItems:1,className:"gap-2 h-[75vh] w-full",children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"All Up"}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["API Requests ",eg(M.sum_api_requests)]}),(0,a.jsx)(ec.Z,{className:"h-40",data:M.daily_data,valueFormatter:eg,index:"date",colors:["cyan"],categories:["api_requests"],onValueChange:e=>console.log(e)})]}),(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Tokens ",eg(M.sum_total_tokens)]}),(0,a.jsx)(em.Z,{className:"h-40",data:M.daily_data,valueFormatter:eg,index:"date",colors:["cyan"],categories:["total_tokens"],onValueChange:e=>console.log(e)})]})]})]}),o?(0,a.jsx)(a.Fragment,{children:H.map((e,l)=>(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:e.model}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["API Requests ",eg(e.sum_api_requests)]}),(0,a.jsx)(ec.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["cyan"],categories:["api_requests"],valueFormatter:eg,onValueChange:e=>console.log(e)})]}),(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Tokens ",eg(e.sum_total_tokens)]}),(0,a.jsx)(em.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["cyan"],categories:["total_tokens"],valueFormatter:eg,onValueChange:e=>console.log(e)})]})]})]},l))}):(0,a.jsx)(a.Fragment,{children:H&&H.length>0&&H.slice(0,1).map((e,l)=>(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"✨ Activity by Model"}),(0,a.jsx)("p",{className:"mb-2 text-gray-500 italic text-[12px]",children:"Upgrade to see analytics for all models"}),(0,a.jsx)(p.Z,{variant:"primary",className:"mb-2",children:(0,a.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"Get Free Trial"})}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:e.model}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["API Requests ",eg(e.sum_api_requests)]}),(0,a.jsx)(ec.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["cyan"],categories:["api_requests"],valueFormatter:eg,onValueChange:e=>console.log(e)})]}),(0,a.jsxs)(h.Z,{children:[(0,a.jsxs)(el.Z,{style:{fontSize:"15px",fontWeight:"normal",color:"#535452"},children:["Tokens ",eg(e.sum_total_tokens)]}),(0,a.jsx)(em.Z,{className:"h-40",data:e.daily_data,index:"date",colors:["cyan"],valueFormatter:eg,categories:["total_tokens"],onValueChange:e=>console.log(e)})]})]})]})]},l))})]})})]})]})}),(0,a.jsx)(er.Z,{children:(0,a.jsxs)(x.Z,{numItems:2,className:"gap-2 h-[75vh] w-full",children:[(0,a.jsxs)(h.Z,{numColSpan:2,children:[(0,a.jsxs)(F.Z,{className:"mb-2",children:[(0,a.jsx)(y.Z,{children:"Total Spend Per Team"}),(0,a.jsx)(ls.Z,{data:T})]}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Daily Spend Per Team"}),(0,a.jsx)(em.Z,{className:"h-72",data:k,showLegend:!0,index:"date",categories:C,yAxisWidth:80,stack:!0})]})]}),(0,a.jsx)(h.Z,{numColSpan:2})]})}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)("p",{className:"mb-2 text-gray-500 italic text-[12px]",children:["Customers of your LLM API calls. Tracked when a `user` param is passed in your LLM calls ",(0,a.jsx)("a",{className:"text-blue-500",href:"https://docs.litellm.ai/docs/proxy/users",target:"_blank",children:"docs here"})]}),(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsxs)(h.Z,{children:[(0,a.jsx)(_.Z,{children:"Select Time Range"}),(0,a.jsx)(es.Z,{enableSelect:!0,value:ee,onValueChange:e=>{eu(e),eZ(e.from,e.to,null)}})]}),(0,a.jsxs)(h.Z,{children:[(0,a.jsx)(_.Z,{children:"Select Key"}),(0,a.jsxs)(B.Z,{defaultValue:"all-keys",children:[(0,a.jsx)(K.Z,{value:"all-keys",onClick:()=>{eZ(ee.from,ee.to,null)},children:"All Keys"},"all-keys"),null==i?void 0:i.map((e,l)=>e&&null!==e.key_alias&&e.key_alias.length>0?(0,a.jsx)(K.Z,{value:String(l),onClick:()=>{eZ(ee.from,ee.to,e.token)},children:e.key_alias},l):null)]})]})]}),(0,a.jsx)(F.Z,{className:"mt-4",children:(0,a.jsxs)(D.Z,{className:"max-h-[70vh] min-h-[500px]",children:[(0,a.jsx)(V.Z,{children:(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(q.Z,{children:"Customer"}),(0,a.jsx)(q.Z,{children:"Spend"}),(0,a.jsx)(q.Z,{children:"Total Events"})]})}),(0,a.jsx)(L.Z,{children:null==b?void 0:b.map((e,l)=>{var s;return(0,a.jsxs)(z.Z,{children:[(0,a.jsx)(U.Z,{children:e.end_user}),(0,a.jsx)(U.Z,{children:null===(s=e.total_spend)||void 0===s?void 0:s.toFixed(4)}),(0,a.jsx)(U.Z,{children:e.total_count})]},l)})})]})})]}),(0,a.jsxs)(er.Z,{children:[(0,a.jsxs)(x.Z,{numItems:2,children:[(0,a.jsx)(h.Z,{numColSpan:1,children:(0,a.jsx)(es.Z,{className:"mb-4",enableSelect:!0,value:ee,onValueChange:e=>{eu(e),ef(e.from,e.to)}})}),(0,a.jsx)(h.Z,{children:o?(0,a.jsx)("div",{children:(0,a.jsxs)(eo.Z,{value:$,onValueChange:e=>Q(e),children:[(0,a.jsx)(ed.Z,{value:"all-tags",onClick:()=>Q(["all-tags"]),children:"All Tags"},"all-tags"),I&&I.filter(e=>"all-tags"!==e).map((e,l)=>(0,a.jsx)(ed.Z,{value:String(e),children:e},e))]})}):(0,a.jsx)("div",{children:(0,a.jsxs)(eo.Z,{value:$,onValueChange:e=>Q(e),children:[(0,a.jsx)(ed.Z,{value:"all-tags",onClick:()=>Q(["all-tags"]),children:"All Tags"},"all-tags"),I&&I.filter(e=>"all-tags"!==e).map((e,l)=>(0,a.jsxs)(K.Z,{value:String(e),disabled:!0,children:["✨ ",e," (Enterprise only Feature)"]},e))]})})})]}),(0,a.jsxs)(x.Z,{numItems:2,className:"gap-2 h-[75vh] w-full mb-4",children:[(0,a.jsx)(h.Z,{numColSpan:2,children:(0,a.jsxs)(F.Z,{children:[(0,a.jsx)(y.Z,{children:"Spend Per Tag"}),(0,a.jsxs)(_.Z,{children:["Get Started Tracking cost per tag ",(0,a.jsx)("a",{className:"text-blue-500",href:"https://docs.litellm.ai/docs/proxy/cost_tracking",target:"_blank",children:"here"})]}),(0,a.jsx)(em.Z,{className:"h-72",data:w,index:"name",categories:["spend"],colors:["blue"]})]})}),(0,a.jsx)(h.Z,{numColSpan:2})]})]})]})]})})};let la=e=>{if(e)return e.toISOString().split("T")[0]};function lr(e){return new Intl.NumberFormat("en-US",{maximumFractionDigits:0,notation:"compact",compactDisplay:"short"}).format(e)}var li=e=>{let{accessToken:l,token:s,userRole:t,userID:n,premiumUser:i}=e,[o,d]=(0,r.useState)([]),[c,m]=(0,r.useState)([]),[p,j]=(0,r.useState)([]),[g,Z]=(0,r.useState)([]),[f,_]=(0,r.useState)("0"),[y,b]=(0,r.useState)("0"),[v,k]=(0,r.useState)("0"),[S,w]=(0,r.useState)({from:new Date(Date.now()-6048e5),to:new Date});(0,r.useEffect)(()=>{l&&S&&(async()=>{Z(await (0,u.zg)(l,la(S.from),la(S.to)))})()},[l]);let N=Array.from(new Set(g.map(e=>{var l;return null!==(l=null==e?void 0:e.api_key)&&void 0!==l?l:""}))),I=Array.from(new Set(g.map(e=>{var l;return null!==(l=null==e?void 0:e.model)&&void 0!==l?l:""})));Array.from(new Set(g.map(e=>{var l;return null!==(l=null==e?void 0:e.call_type)&&void 0!==l?l:""})));let A=async(e,s)=>{e&&s&&l&&(s.setHours(23,59,59,999),e.setHours(0,0,0,0),Z(await (0,u.zg)(l,la(e),la(s))))};return(0,r.useEffect)(()=>{console.log("DATA IN CACHE DASHBOARD",g);let e=g;c.length>0&&(e=e.filter(e=>c.includes(e.api_key))),p.length>0&&(e=e.filter(e=>p.includes(e.model))),console.log("before processed data in cache dashboard",e);let l=0,s=0,t=0,n=e.reduce((e,n)=>{console.log("Processing item:",n),n.call_type||(console.log("Item has no call_type:",n),n.call_type="Unknown"),l+=(n.total_rows||0)-(n.cache_hit_true_rows||0),s+=n.cache_hit_true_rows||0,t+=n.cached_completion_tokens||0;let a=e.find(e=>e.name===n.call_type);return a?(a["LLM API requests"]+=(n.total_rows||0)-(n.cache_hit_true_rows||0),a["Cache hit"]+=n.cache_hit_true_rows||0,a["Cached Completion Tokens"]+=n.cached_completion_tokens||0,a["Generated Completion Tokens"]+=n.generated_completion_tokens||0):e.push({name:n.call_type,"LLM API requests":(n.total_rows||0)-(n.cache_hit_true_rows||0),"Cache hit":n.cache_hit_true_rows||0,"Cached Completion Tokens":n.cached_completion_tokens||0,"Generated Completion Tokens":n.generated_completion_tokens||0}),e},[]);_(lr(s)),b(lr(t));let a=s+l;a>0?k((s/a*100).toFixed(2)):k("0"),d(n),console.log("PROCESSED DATA IN CACHE DASHBOARD",n)},[c,p,S,g]),(0,a.jsxs)(F.Z,{children:[(0,a.jsxs)(x.Z,{numItems:3,className:"gap-4 mt-4",children:[(0,a.jsx)(h.Z,{children:(0,a.jsx)(eo.Z,{placeholder:"Select API Keys",value:c,onValueChange:m,children:N.map(e=>(0,a.jsx)(ed.Z,{value:e,children:e},e))})}),(0,a.jsx)(h.Z,{children:(0,a.jsx)(eo.Z,{placeholder:"Select Models",value:p,onValueChange:j,children:I.map(e=>(0,a.jsx)(ed.Z,{value:e,children:e},e))})}),(0,a.jsx)(h.Z,{children:(0,a.jsx)(es.Z,{enableSelect:!0,value:S,onValueChange:e=>{w(e),A(e.from,e.to)},selectPlaceholder:"Select date range"})})]}),(0,a.jsxs)("div",{className:"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3 mt-4",children:[(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Cache Hit Ratio"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsxs)("p",{className:"text-tremor-metric font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:[v,"%"]})})]}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Cache Hits"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor-metric font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:f})})]}),(0,a.jsxs)(F.Z,{children:[(0,a.jsx)("p",{className:"text-tremor-default font-medium text-tremor-content dark:text-dark-tremor-content",children:"Cached Tokens"}),(0,a.jsx)("div",{className:"mt-2 flex items-baseline space-x-2.5",children:(0,a.jsx)("p",{className:"text-tremor-metric font-semibold text-tremor-content-strong dark:text-dark-tremor-content-strong",children:y})})]})]}),(0,a.jsx)(el.Z,{className:"mt-4",children:"Cache Hits vs API Requests"}),(0,a.jsx)(em.Z,{title:"Cache Hits vs API Requests",data:o,stack:!0,index:"name",valueFormatter:lr,categories:["LLM API requests","Cache hit"],colors:["sky","teal"],yAxisWidth:48}),(0,a.jsx)(el.Z,{className:"mt-4",children:"Cached Completion Tokens vs Generated Completion Tokens"}),(0,a.jsx)(em.Z,{className:"mt-6",data:o,stack:!0,index:"name",valueFormatter:lr,categories:["Generated Completion Tokens","Cached Completion Tokens"],colors:["sky","teal"],yAxisWidth:48})]})},lo=()=>{let{Title:e,Paragraph:l}=Q.default,[s,t]=(0,r.useState)(""),[n,o]=(0,r.useState)(!1),[d,c]=(0,r.useState)(null),[h,x]=(0,r.useState)(null),[p,j]=(0,r.useState)(null),[g,Z]=(0,r.useState)({PROXY_BASE_URL:"",PROXY_LOGOUT_URL:""}),[f,_]=(0,r.useState)(!0),y=(0,i.useSearchParams)(),[b,v]=(0,r.useState)({data:[]}),k=y.get("userID"),S=y.get("invitation_id"),w=function(e){console.log("COOKIES",document.cookie);let l=document.cookie.split("; ").find(l=>l.startsWith(e+"="));return l?l.split("=")[1]:null}("token"),[N,I]=(0,r.useState)("api-keys"),[A,C]=(0,r.useState)(null);return(0,r.useEffect)(()=>{if(w){let e=(0,$.o)(w);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),C(e.key),e.user_role){let l=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e.toLowerCase())),console.log("Received user role length: ".concat(e.toLowerCase().length)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"internal_user":return"Internal User";case"internal_viewer":return"Internal Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",l),t(l),"Admin Viewer"==l&&I("usage")}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e)),e.login_method?_("username_password"==e.login_method):console.log("User Email is not set ".concat(e)),e.premium_user&&o(e.premium_user),e.auth_header_name&&(0,u.K8)(e.auth_header_name)}}},[w]),(0,a.jsx)(r.Suspense,{fallback:(0,a.jsx)("div",{children:"Loading..."}),children:S?(0,a.jsx)(ee,{userID:k,userRole:s,teams:h,keys:p,setUserRole:t,userEmail:d,setUserEmail:c,setTeams:x,setKeys:j,setProxySettings:Z,proxySettings:g}):(0,a.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,a.jsx)(m,{userID:k,userRole:s,userEmail:d,showSSOBanner:f,premiumUser:n,setProxySettings:Z,proxySettings:g}),(0,a.jsxs)("div",{className:"flex flex-1 overflow-auto",children:[(0,a.jsx)("div",{className:"mt-8",children:(0,a.jsx)(ll,{setPage:I,userRole:s,defaultSelectedKey:null})}),"api-keys"==N?(0,a.jsx)(ee,{userID:k,userRole:s,teams:h,keys:p,setUserRole:t,userEmail:d,setUserEmail:c,setTeams:x,setKeys:j,setProxySettings:Z,proxySettings:g}):"models"==N?(0,a.jsx)(eT,{userID:k,userRole:s,token:w,keys:p,accessToken:A,modelData:b,setModelData:v,premiumUser:n}):"llm-playground"==N?(0,a.jsx)(e6,{userID:k,userRole:s,token:w,accessToken:A}):"users"==N?(0,a.jsx)(eM,{userID:k,userRole:s,token:w,keys:p,teams:h,accessToken:A,setKeys:j}):"teams"==N?(0,a.jsx)(eD,{teams:h,setTeams:x,searchParams:y,accessToken:A,userID:k,userRole:s}):"admin-panel"==N?(0,a.jsx)(eL,{setTeams:x,searchParams:y,accessToken:A,showSSOBanner:f,premiumUser:n}):"api_ref"==N?(0,a.jsx)(e8,{proxySettings:g}):"settings"==N?(0,a.jsx)(eH,{userID:k,userRole:s,accessToken:A,premiumUser:n}):"budgets"==N?(0,a.jsx)(e4,{accessToken:A}):"general-settings"==N?(0,a.jsx)(e0,{userID:k,userRole:s,accessToken:A,modelData:b}):"model-hub"==N?(0,a.jsx)(e5.Z,{accessToken:A,publicPage:!1,premiumUser:n}):"caching"==N?(0,a.jsx)(li,{userID:k,userRole:s,token:w,accessToken:A,premiumUser:n}):(0,a.jsx)(ln,{userID:k,userRole:s,token:w,accessToken:A,keys:p,premiumUser:n})]})]})})}},41134:function(e,l,s){"use strict";s.d(l,{Z:function(){return y}});var t=s(3827),n=s(64090),a=s(47907),r=s(777),i=s(16450),o=s(13810),d=s(92836),c=s(26734),m=s(41608),u=s(32126),h=s(23682),x=s(71801),p=s(42440),j=s(84174),g=s(50459),Z=s(6180),f=s(99129),_=s(67951),y=e=>{var l;let{accessToken:s,publicPage:y,premiumUser:b}=e,[v,k]=(0,n.useState)(!1),[S,w]=(0,n.useState)(null),[N,I]=(0,n.useState)(!1),[A,C]=(0,n.useState)(!1),[P,T]=(0,n.useState)(null),E=(0,a.useRouter)();(0,n.useEffect)(()=>{s&&(async()=>{try{let e=await (0,r.kn)(s);console.log("ModelHubData:",e),w(e.data),(0,r.E9)(s,"enable_public_model_hub").then(e=>{console.log("data: ".concat(JSON.stringify(e))),!0==e.field_value&&k(!0)}).catch(e=>{})}catch(e){console.error("There was an error fetching the model data",e)}})()},[s,y]);let O=e=>{T(e),I(!0)},R=async()=>{s&&(0,r.jA)(s,"enable_public_model_hub",!0).then(e=>{C(!0)})},F=()=>{I(!1),C(!1),T(null)},M=()=>{I(!1),C(!1),T(null)},D=e=>{navigator.clipboard.writeText(e)};return(0,t.jsxs)("div",{children:[y&&v||!1==y?(0,t.jsxs)("div",{className:"w-full m-2 mt-2 p-8",children:[(0,t.jsx)("div",{className:"relative w-full"}),(0,t.jsxs)("div",{className:"flex ".concat(y?"justify-between":"items-center"),children:[(0,t.jsx)(p.Z,{className:"ml-8 text-center ",children:"Model Hub"}),!1==y?b?(0,t.jsx)(i.Z,{className:"ml-4",onClick:()=>R(),children:"✨ Make Public"}):(0,t.jsx)(i.Z,{className:"ml-4",children:(0,t.jsx)("a",{href:"https://forms.gle/W3U4PZpJGFHWtHyA9",target:"_blank",children:"✨ Make Public"})}):(0,t.jsxs)("div",{className:"flex justify-between items-center",children:[(0,t.jsx)("p",{children:"Filter by key:"}),(0,t.jsx)(x.Z,{className:"bg-gray-200 pr-2 pl-2 pt-1 pb-1 text-center",children:"/ui/model_hub?key="})]})]}),(0,t.jsx)("div",{className:"grid grid-cols-2 gap-6 sm:grid-cols-3 lg:grid-cols-4 pr-8",children:S&&S.map(e=>(0,t.jsxs)(o.Z,{className:"mt-5 mx-8",children:[(0,t.jsxs)("pre",{className:"flex justify-between",children:[(0,t.jsx)(p.Z,{children:e.model_group}),(0,t.jsx)(Z.Z,{title:e.model_group,children:(0,t.jsx)(j.Z,{onClick:()=>D(e.model_group),style:{cursor:"pointer",marginRight:"10px"}})})]}),(0,t.jsxs)("div",{className:"my-5",children:[(0,t.jsxs)(x.Z,{children:["Mode: ",e.mode]}),(0,t.jsxs)(x.Z,{children:["Supports Function Calling:"," ",(null==e?void 0:e.supports_function_calling)==!0?"Yes":"No"]}),(0,t.jsxs)(x.Z,{children:["Supports Vision:"," ",(null==e?void 0:e.supports_vision)==!0?"Yes":"No"]}),(0,t.jsxs)(x.Z,{children:["Max Input Tokens:"," ",(null==e?void 0:e.max_input_tokens)?null==e?void 0:e.max_input_tokens:"N/A"]}),(0,t.jsxs)(x.Z,{children:["Max Output Tokens:"," ",(null==e?void 0:e.max_output_tokens)?null==e?void 0:e.max_output_tokens:"N/A"]})]}),(0,t.jsx)("div",{style:{marginTop:"auto",textAlign:"right"},children:(0,t.jsxs)("a",{href:"#",onClick:()=>O(e),style:{color:"#1890ff",fontSize:"smaller"},children:["View more ",(0,t.jsx)(g.Z,{})]})})]},e.model_group))})]}):(0,t.jsxs)(o.Z,{className:"mx-auto max-w-xl mt-10",children:[(0,t.jsx)(x.Z,{className:"text-xl text-center mb-2 text-black",children:"Public Model Hub not enabled."}),(0,t.jsx)("p",{className:"text-base text-center text-slate-800",children:"Ask your proxy admin to enable this on their Admin UI."})]}),(0,t.jsx)(f.Z,{title:"Public Model Hub",width:600,visible:A,footer:null,onOk:F,onCancel:M,children:(0,t.jsxs)("div",{className:"pt-5 pb-5",children:[(0,t.jsxs)("div",{className:"flex justify-between mb-4",children:[(0,t.jsx)(x.Z,{className:"text-base mr-2",children:"Shareable Link:"}),(0,t.jsx)(x.Z,{className:"max-w-sm ml-2 bg-gray-200 pr-2 pl-2 pt-1 pb-1 text-center rounded",children:"/ui/model_hub?key="})]}),(0,t.jsx)("div",{className:"flex justify-end",children:(0,t.jsx)(i.Z,{onClick:()=>{E.replace("/model_hub?key=".concat(s))},children:"See Page"})})]})}),(0,t.jsx)(f.Z,{title:P&&P.model_group?P.model_group:"Unknown Model",width:800,visible:N,footer:null,onOk:F,onCancel:M,children:P&&(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"mb-4",children:(0,t.jsx)("strong",{children:"Model Information & Usage"})}),(0,t.jsxs)(c.Z,{children:[(0,t.jsxs)(m.Z,{children:[(0,t.jsx)(d.Z,{children:"OpenAI Python SDK"}),(0,t.jsx)(d.Z,{children:"Supported OpenAI Params"}),(0,t.jsx)(d.Z,{children:"LlamaIndex"}),(0,t.jsx)(d.Z,{children:"Langchain Py"})]}),(0,t.jsxs)(h.Z,{children:[(0,t.jsx)(u.Z,{children:(0,t.jsx)(_.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="http://0.0.0.0:4000" # LiteLLM Proxy is OpenAI compatible, Read More: https://docs.litellm.ai/docs/proxy/user_keys\n)\n\nresponse = client.chat.completions.create(\n model="'.concat(P.model_group,'", # model to send to the proxy\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ]\n)\n\nprint(response)\n ')})}),(0,t.jsx)(u.Z,{children:(0,t.jsx)(_.Z,{language:"python",children:"".concat(null===(l=P.supported_openai_params)||void 0===l?void 0:l.map(e=>"".concat(e,"\n")).join(""))})}),(0,t.jsx)(u.Z,{children:(0,t.jsx)(_.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="'.concat(P.model_group,'", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="http://0.0.0.0:4000", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="http://0.0.0.0:4000",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n ')})}),(0,t.jsx)(u.Z,{children:(0,t.jsx)(_.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="http://0.0.0.0:4000",\n model = "'.concat(P.model_group,'",\n temperature=0.1\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n ')})})]})]})]})})]})}}},function(e){e.O(0,[665,936,294,131,684,759,777,971,69,744],function(){return e(e.s=20661)}),_N_E=e.O()}]);
\ No newline at end of file
diff --git a/ui/litellm-dashboard/out/_next/static/InOW9_FWGxjcBmhCsnjat/_buildManifest.js b/ui/litellm-dashboard/out/_next/static/pWVTV6soYeXDMn2RtKwTT/_buildManifest.js
similarity index 100%
rename from ui/litellm-dashboard/out/_next/static/InOW9_FWGxjcBmhCsnjat/_buildManifest.js
rename to ui/litellm-dashboard/out/_next/static/pWVTV6soYeXDMn2RtKwTT/_buildManifest.js
diff --git a/ui/litellm-dashboard/out/_next/static/InOW9_FWGxjcBmhCsnjat/_ssgManifest.js b/ui/litellm-dashboard/out/_next/static/pWVTV6soYeXDMn2RtKwTT/_ssgManifest.js
similarity index 100%
rename from ui/litellm-dashboard/out/_next/static/InOW9_FWGxjcBmhCsnjat/_ssgManifest.js
rename to ui/litellm-dashboard/out/_next/static/pWVTV6soYeXDMn2RtKwTT/_ssgManifest.js
diff --git a/ui/litellm-dashboard/out/index.html b/ui/litellm-dashboard/out/index.html
index f214bcaeb32..20872570c16 100644
--- a/ui/litellm-dashboard/out/index.html
+++ b/ui/litellm-dashboard/out/index.html
@@ -1 +1 @@
-LiteLLM Dashboard
\ No newline at end of file
+LiteLLM Dashboard
\ No newline at end of file
diff --git a/ui/litellm-dashboard/out/index.txt b/ui/litellm-dashboard/out/index.txt
index 3e48434895a..d2d9892f660 100644
--- a/ui/litellm-dashboard/out/index.txt
+++ b/ui/litellm-dashboard/out/index.txt
@@ -1,7 +1,7 @@
2:I[77831,[],""]
-3:I[48951,["665","static/chunks/3014691f-589a5f4865c3822f.js","936","static/chunks/2f6dbc85-052c4579f80d66ae.js","294","static/chunks/294-0e35509d5ca95267.js","131","static/chunks/131-6a03368053f9d26d.js","684","static/chunks/684-bb2d2f93d92acb0b.js","759","static/chunks/759-83a8bdddfe32b5d9.js","777","static/chunks/777-71e19aabdac85a01.js","931","static/chunks/app/page-cab98591303c1c5d.js"],""]
+3:I[48951,["665","static/chunks/3014691f-589a5f4865c3822f.js","936","static/chunks/2f6dbc85-052c4579f80d66ae.js","294","static/chunks/294-0e35509d5ca95267.js","131","static/chunks/131-6a03368053f9d26d.js","684","static/chunks/684-bb2d2f93d92acb0b.js","759","static/chunks/759-83a8bdddfe32b5d9.js","777","static/chunks/777-38cea0d1f2b563b1.js","931","static/chunks/app/page-b6860ddd56500b95.js"],""]
4:I[5613,[],""]
5:I[31778,[],""]
-0:["InOW9_FWGxjcBmhCsnjat",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_12bbc4","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/275ab6ee150b4fea.css","precedence":"next","crossOrigin":""}]],"$L6"]]]]
+0:["pWVTV6soYeXDMn2RtKwTT",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_12bbc4","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/275ab6ee150b4fea.css","precedence":"next","crossOrigin":""}]],"$L6"]]]]
6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"LiteLLM Dashboard"}],["$","meta","3",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","4",{"rel":"icon","href":"/ui/favicon.ico","type":"image/x-icon","sizes":"16x16"}],["$","meta","5",{"name":"next-size-adjust"}]]
1:null
diff --git a/ui/litellm-dashboard/out/model_hub.html b/ui/litellm-dashboard/out/model_hub.html
index 3b289bfa53f..b417efc8f2e 100644
--- a/ui/litellm-dashboard/out/model_hub.html
+++ b/ui/litellm-dashboard/out/model_hub.html
@@ -1 +1 @@
-LiteLLM Dashboard
\ No newline at end of file
+LiteLLM Dashboard
\ No newline at end of file
diff --git a/ui/litellm-dashboard/out/model_hub.txt b/ui/litellm-dashboard/out/model_hub.txt
index c61acddcd19..69980181308 100644
--- a/ui/litellm-dashboard/out/model_hub.txt
+++ b/ui/litellm-dashboard/out/model_hub.txt
@@ -1,7 +1,7 @@
2:I[77831,[],""]
-3:I[87494,["294","static/chunks/294-0e35509d5ca95267.js","131","static/chunks/131-6a03368053f9d26d.js","777","static/chunks/777-71e19aabdac85a01.js","418","static/chunks/app/model_hub/page-3c4dcad891da09b7.js"],""]
+3:I[87494,["294","static/chunks/294-0e35509d5ca95267.js","131","static/chunks/131-6a03368053f9d26d.js","777","static/chunks/777-38cea0d1f2b563b1.js","418","static/chunks/app/model_hub/page-3c4dcad891da09b7.js"],""]
4:I[5613,[],""]
5:I[31778,[],""]
-0:["InOW9_FWGxjcBmhCsnjat",[[["",{"children":["model_hub",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["model_hub",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","model_hub","children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","styles":null}]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_12bbc4","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/275ab6ee150b4fea.css","precedence":"next","crossOrigin":""}]],"$L6"]]]]
+0:["pWVTV6soYeXDMn2RtKwTT",[[["",{"children":["model_hub",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["model_hub",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","model_hub","children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","styles":null}]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_12bbc4","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/275ab6ee150b4fea.css","precedence":"next","crossOrigin":""}]],"$L6"]]]]
6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"LiteLLM Dashboard"}],["$","meta","3",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","4",{"rel":"icon","href":"/ui/favicon.ico","type":"image/x-icon","sizes":"16x16"}],["$","meta","5",{"name":"next-size-adjust"}]]
1:null
diff --git a/ui/litellm-dashboard/out/onboarding.html b/ui/litellm-dashboard/out/onboarding.html
index 1198e9d9db3..d719a1e757d 100644
--- a/ui/litellm-dashboard/out/onboarding.html
+++ b/ui/litellm-dashboard/out/onboarding.html
@@ -1 +1 @@
-LiteLLM Dashboard
\ No newline at end of file
+LiteLLM Dashboard
\ No newline at end of file
diff --git a/ui/litellm-dashboard/out/onboarding.txt b/ui/litellm-dashboard/out/onboarding.txt
index 559f80289ed..eb5140b1c92 100644
--- a/ui/litellm-dashboard/out/onboarding.txt
+++ b/ui/litellm-dashboard/out/onboarding.txt
@@ -1,7 +1,7 @@
2:I[77831,[],""]
-3:I[667,["665","static/chunks/3014691f-589a5f4865c3822f.js","294","static/chunks/294-0e35509d5ca95267.js","684","static/chunks/684-bb2d2f93d92acb0b.js","777","static/chunks/777-71e19aabdac85a01.js","461","static/chunks/app/onboarding/page-5e1163825ccf7b7a.js"],""]
+3:I[667,["665","static/chunks/3014691f-589a5f4865c3822f.js","294","static/chunks/294-0e35509d5ca95267.js","684","static/chunks/684-bb2d2f93d92acb0b.js","777","static/chunks/777-38cea0d1f2b563b1.js","461","static/chunks/app/onboarding/page-5e1163825ccf7b7a.js"],""]
4:I[5613,[],""]
5:I[31778,[],""]
-0:["InOW9_FWGxjcBmhCsnjat",[[["",{"children":["onboarding",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["onboarding",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","onboarding","children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","styles":null}]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_12bbc4","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/275ab6ee150b4fea.css","precedence":"next","crossOrigin":""}]],"$L6"]]]]
+0:["pWVTV6soYeXDMn2RtKwTT",[[["",{"children":["onboarding",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["onboarding",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","onboarding","children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","styles":null}]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_12bbc4","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/275ab6ee150b4fea.css","precedence":"next","crossOrigin":""}]],"$L6"]]]]
6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"LiteLLM Dashboard"}],["$","meta","3",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","4",{"rel":"icon","href":"/ui/favicon.ico","type":"image/x-icon","sizes":"16x16"}],["$","meta","5",{"name":"next-size-adjust"}]]
1:null
diff --git a/ui/litellm-dashboard/src/components/admins.tsx b/ui/litellm-dashboard/src/components/admins.tsx
index 94211868f45..5388393ba1e 100644
--- a/ui/litellm-dashboard/src/components/admins.tsx
+++ b/ui/litellm-dashboard/src/components/admins.tsx
@@ -91,6 +91,9 @@ const AdminPanel: React.FC = ({
>>(null);
const isLocal = process.env.NODE_ENV === "development";
+ if (isLocal != true) {
+ console.log = function() {};
+ }
const [baseUrl, setBaseUrl] = useState(
isLocal ? "http://localhost:4000" : ""
);
diff --git a/ui/litellm-dashboard/src/components/chat_ui.tsx b/ui/litellm-dashboard/src/components/chat_ui.tsx
index d96db60c48c..8764dbb8c4b 100644
--- a/ui/litellm-dashboard/src/components/chat_ui.tsx
+++ b/ui/litellm-dashboard/src/components/chat_ui.tsx
@@ -45,6 +45,9 @@ async function generateModelResponse(
) {
// base url should be the current base_url
const isLocal = process.env.NODE_ENV === "development";
+ if (isLocal != true) {
+ console.log = function() {};
+ }
console.log("isLocal:", isLocal);
const proxyBaseUrl = isLocal
? "http://localhost:4000"
diff --git a/ui/litellm-dashboard/src/components/create_user_button.tsx b/ui/litellm-dashboard/src/components/create_user_button.tsx
index 75908ac27db..dc8298d3801 100644
--- a/ui/litellm-dashboard/src/components/create_user_button.tsx
+++ b/ui/litellm-dashboard/src/components/create_user_button.tsx
@@ -43,6 +43,9 @@ const Createuser: React.FC = ({
useState(null);
const router = useRouter();
const isLocal = process.env.NODE_ENV === "development";
+ if (isLocal != true) {
+ console.log = function() {};
+ }
const [baseUrl, setBaseUrl] = useState(
isLocal ? "http://localhost:4000" : ""
);
diff --git a/ui/litellm-dashboard/src/components/general_settings.tsx b/ui/litellm-dashboard/src/components/general_settings.tsx
index 183236e223a..f80ca203bae 100644
--- a/ui/litellm-dashboard/src/components/general_settings.tsx
+++ b/ui/litellm-dashboard/src/components/general_settings.tsx
@@ -76,6 +76,9 @@ async function testFallbackModelResponse(
) {
// base url should be the current base_url
const isLocal = process.env.NODE_ENV === "development";
+ if (isLocal != true) {
+ console.log = function() {};
+ }
console.log("isLocal:", isLocal);
const proxyBaseUrl = isLocal
? "http://localhost:4000"
diff --git a/ui/litellm-dashboard/src/components/model_dashboard.tsx b/ui/litellm-dashboard/src/components/model_dashboard.tsx
index bf93e341634..f96916cfd41 100644
--- a/ui/litellm-dashboard/src/components/model_dashboard.tsx
+++ b/ui/litellm-dashboard/src/components/model_dashboard.tsx
@@ -1730,14 +1730,20 @@ const ModelDashboard: React.FC = ({
rules={[{ required: true, message: "Required" }]}
noStyle
>
-
- Custom Model Name (Enter below)
- {providerModels.map((model, index) => (
-
- {model}
-
- ))}
-
+ { (selectedProvider === Providers.Azure) || (selectedProvider === Providers.OpenAI_Compatible) || (selectedProvider === Providers.Ollama) ? (
+
+ ) : providerModels.length > 0 ? (
+
+ Custom Model Name (Enter below)
+ {providerModels.map((model, index) => (
+
+ {model}
+
+ ))}
+
+ ) : (
+
+ )}
= ({
// const userColors = require('./ui_colors.json') || {};
const isLocal = process.env.NODE_ENV === "development";
+ if (isLocal != true) {
+ console.log = function() {};
+ }
const proxyBaseUrl = isLocal ? "http://localhost:4000" : null;
const imageUrl = isLocal ? "http://localhost:4000/get_image" : "/get_image";
let logoutUrl = "";
diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx
index ee9ab07bb78..d85f73c3af8 100644
--- a/ui/litellm-dashboard/src/components/networking.tsx
+++ b/ui/litellm-dashboard/src/components/networking.tsx
@@ -5,6 +5,9 @@ import { message } from "antd";
const isLocal = process.env.NODE_ENV === "development";
const proxyBaseUrl = isLocal ? "http://localhost:4000" : null;
+if (isLocal != true) {
+ console.log = function() {};
+}
export interface Model {
model_name: string;
diff --git a/ui/litellm-dashboard/src/components/request_model_access.tsx b/ui/litellm-dashboard/src/components/request_model_access.tsx
index c884d03b2c6..22fcafa4e41 100644
--- a/ui/litellm-dashboard/src/components/request_model_access.tsx
+++ b/ui/litellm-dashboard/src/components/request_model_access.tsx
@@ -12,7 +12,11 @@ interface RequestAccessProps {
accessToken: string;
userID: string;
}
-
+const isLocal = process.env.NODE_ENV === "development";
+const proxyBaseUrl = isLocal ? "http://localhost:4000" : null;
+if (isLocal != true) {
+ console.log = function() {};
+}
function onRequestAccess(formData: Record): void {
// This function does nothing for now
}
diff --git a/ui/litellm-dashboard/src/components/settings.tsx b/ui/litellm-dashboard/src/components/settings.tsx
index fe2735d4aa1..482cfdd735d 100644
--- a/ui/litellm-dashboard/src/components/settings.tsx
+++ b/ui/litellm-dashboard/src/components/settings.tsx
@@ -34,6 +34,11 @@ import {
import { Modal, Typography, Form, Input, Select, Button as Button2, message } from "antd";
const { Title, Paragraph } = Typography;
+const isLocal = process.env.NODE_ENV === "development";
+const proxyBaseUrl = isLocal ? "http://localhost:4000" : null;
+if (isLocal != true) {
+ console.log = function() {};
+}
import {
getCallbacksCall,
setCallbacksCall,
diff --git a/ui/litellm-dashboard/src/components/teams.tsx b/ui/litellm-dashboard/src/components/teams.tsx
index 8b4b803b563..bd8a8d095f4 100644
--- a/ui/litellm-dashboard/src/components/teams.tsx
+++ b/ui/litellm-dashboard/src/components/teams.tsx
@@ -36,6 +36,11 @@ import {
Grid,
} from "@tremor/react";
import { CogIcon } from "@heroicons/react/outline";
+const isLocal = process.env.NODE_ENV === "development";
+const proxyBaseUrl = isLocal ? "http://localhost:4000" : null;
+if (isLocal != true) {
+ console.log = function() {};
+}
interface TeamProps {
teams: any[] | null;
searchParams: any;
diff --git a/ui/litellm-dashboard/src/components/usage.tsx b/ui/litellm-dashboard/src/components/usage.tsx
index 451eaefe674..15c991d80e1 100644
--- a/ui/litellm-dashboard/src/components/usage.tsx
+++ b/ui/litellm-dashboard/src/components/usage.tsx
@@ -37,6 +37,12 @@ import {
adminGlobalActivityPerModel,
} from "./networking";
import { start } from "repl";
+console.log("process.env.NODE_ENV", process.env.NODE_ENV);
+const isLocal = process.env.NODE_ENV === "development";
+const proxyBaseUrl = isLocal ? "http://localhost:4000" : null;
+if (isLocal !== true) {
+ console.log = function() {};
+}
interface UsagePageProps {
accessToken: string | null;
diff --git a/ui/litellm-dashboard/src/components/user_dashboard.tsx b/ui/litellm-dashboard/src/components/user_dashboard.tsx
index 386ad613a79..61ec058475a 100644
--- a/ui/litellm-dashboard/src/components/user_dashboard.tsx
+++ b/ui/litellm-dashboard/src/components/user_dashboard.tsx
@@ -17,6 +17,9 @@ import { useSearchParams, useRouter } from "next/navigation";
import { jwtDecode } from "jwt-decode";
import { Typography } from "antd";
const isLocal = process.env.NODE_ENV === "development";
+if (isLocal != true) {
+ console.log = function() {};
+}
console.log("isLocal:", isLocal);
const proxyBaseUrl = isLocal ? "http://localhost:4000" : null;
diff --git a/ui/litellm-dashboard/src/components/view_key_table.tsx b/ui/litellm-dashboard/src/components/view_key_table.tsx
index 3add65503b3..93395c7ff11 100644
--- a/ui/litellm-dashboard/src/components/view_key_table.tsx
+++ b/ui/litellm-dashboard/src/components/view_key_table.tsx
@@ -34,7 +34,11 @@ import {
} from "antd";
const { Option } = Select;
-
+const isLocal = process.env.NODE_ENV === "development";
+const proxyBaseUrl = isLocal ? "http://localhost:4000" : null;
+if (isLocal != true) {
+ console.log = function() {};
+}
interface EditKeyModalProps {
visible: boolean;
diff --git a/ui/litellm-dashboard/src/components/view_user_spend.tsx b/ui/litellm-dashboard/src/components/view_user_spend.tsx
index 326dedee958..7879dfdb570 100644
--- a/ui/litellm-dashboard/src/components/view_user_spend.tsx
+++ b/ui/litellm-dashboard/src/components/view_user_spend.tsx
@@ -23,7 +23,11 @@ import {
} from "@tremor/react";
import { Statistic } from "antd"
import { spendUsersCall, modelAvailableCall } from "./networking";
-
+const isLocal = process.env.NODE_ENV === "development";
+const proxyBaseUrl = isLocal ? "http://localhost:4000" : null;
+if (isLocal != true) {
+ console.log = function() {};
+}
// Define the props type
interface UserSpendData {
diff --git a/ui/litellm-dashboard/src/components/view_user_team.tsx b/ui/litellm-dashboard/src/components/view_user_team.tsx
index cbc58e5f709..483420ccc02 100644
--- a/ui/litellm-dashboard/src/components/view_user_team.tsx
+++ b/ui/litellm-dashboard/src/components/view_user_team.tsx
@@ -21,7 +21,11 @@ import {
} from "@tremor/react";
import { Statistic } from "antd"
import { modelAvailableCall } from "./networking";
-
+const isLocal = process.env.NODE_ENV === "development";
+const proxyBaseUrl = isLocal ? "http://localhost:4000" : null;
+if (isLocal != true) {
+ console.log = function() {};
+}
interface ViewUserTeamProps {
userID: string | null;
diff --git a/ui/litellm-dashboard/src/components/view_users.tsx b/ui/litellm-dashboard/src/components/view_users.tsx
index 6b1deee6efd..75d2b2656ae 100644
--- a/ui/litellm-dashboard/src/components/view_users.tsx
+++ b/ui/litellm-dashboard/src/components/view_users.tsx
@@ -52,6 +52,11 @@ interface ViewUserDashboardProps {
teams: any[] | null;
setKeys: React.Dispatch>;
}
+const isLocal = process.env.NODE_ENV === "development";
+const proxyBaseUrl = isLocal ? "http://localhost:4000" : null;
+if (isLocal != true) {
+ console.log = function() {};
+}
const ViewUserDashboard: React.FC = ({
accessToken,