@chenpu17/cc-gw 0.8.10 → 0.8.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -5
- package/src/web/dist/assets/{About-C_IouOGj.js → About-BXBR_bL5.js} +1 -1
- package/src/web/dist/assets/{ApiKeys-Dz-M_uW5.js → ApiKeys-Bc7INW0n.js} +1 -1
- package/src/web/dist/assets/{ConfirmDialog-COgrXiJw.js → ConfirmDialog-CPNJmevF.js} +1 -1
- package/src/web/dist/assets/Dashboard-DdisKH--.js +1 -0
- package/src/web/dist/assets/{DialogShell-blgQezT9.js → DialogShell-C0EfvzaN.js} +1 -1
- package/src/web/dist/assets/{Events-B1zBaQzl.js → Events-ChrSkBPR.js} +1 -1
- package/src/web/dist/assets/{Help-DM0vXHor.js → Help-CsahUtl5.js} +1 -1
- package/src/web/dist/assets/{Login-ygiPlEBP.js → Login-B-oy31QU.js} +1 -1
- package/src/web/dist/assets/{Logs-DKh46bsP.js → Logs-L88mrDoR.js} +1 -1
- package/src/web/dist/assets/{ModelManagement-71W1a6n9.js → ModelManagement-BEeket-Z.js} +1 -1
- package/src/web/dist/assets/{PageHeader-C01S2XTN.js → PageHeader-bDiw2pSJ.js} +1 -1
- package/src/web/dist/assets/{PageSection-CPPskzEi.js → PageSection-WDuhqLCi.js} +1 -1
- package/src/web/dist/assets/{PageState-Cntv0Sf4.js → PageState-KEq7s0Bk.js} +1 -1
- package/src/web/dist/assets/{Profiler-l9K8vLHs.js → Profiler--DIXdL38.js} +1 -1
- package/src/web/dist/assets/{RoutingManagement-CYdcFS8f.js → RoutingManagement-DgkHoHvd.js} +1 -1
- package/src/web/dist/assets/{Settings-DJp6w85X.js → Settings-B8oJpE9S.js} +1 -1
- package/src/web/dist/assets/{Skeleton-DgZEIS_E.js → Skeleton-BRLpX8rl.js} +1 -1
- package/src/web/dist/assets/{app-C09yoSxh.js → app-BxSHC5_o.js} +3 -3
- package/src/web/dist/assets/{card-BMPheH9g.js → card-7EdLPk_C.js} +1 -1
- package/src/web/dist/assets/{gateway-Bf1h2eFf.js → gateway-mlUZb7iD.js} +1 -1
- package/src/web/dist/assets/{global-DOpF330e.css → global-BOV4QSBB.css} +1 -1
- package/src/web/dist/assets/{input-1_zNDnlx.js → input-BjD2rjIj.js} +1 -1
- package/src/web/dist/assets/{label-B5W3eu-E.js → label-DPJWPvWM.js} +1 -1
- package/src/web/dist/assets/{landing-BF3DRAr3.js → landing-DV2hroBA.js} +1 -1
- package/src/web/dist/assets/package-CVSxn1pM.js +1 -0
- package/src/web/dist/assets/{popover-UGE5kTdI.js → popover-CMRfoAfg.js} +1 -1
- package/src/web/dist/assets/{queryKeys-DDTfNI_C.js → queryKeys-CsNzv19i.js} +1 -1
- package/src/web/dist/assets/{select-DJFQztdh.js → select-UI4HSm85.js} +1 -1
- package/src/web/dist/assets/{switch-BqheRBDw.js → switch-_3mhCfFY.js} +1 -1
- package/src/web/dist/assets/{table-C5nemz39.js → table-C1ufAZAv.js} +1 -1
- package/src/web/dist/assets/{useApiQuery-828HesQD.js → useApiQuery-Y63AiXYK.js} +1 -1
- package/src/web/dist/assets/{useAppMutation-Com8yWoS.js → useAppMutation-wWyqqlf8.js} +1 -1
- package/src/web/dist/assets/{useModelManagementState-DY72pEhZ.js → useModelManagementState-BroT3Cj7.js} +1 -1
- package/src/web/dist/index.html +3 -3
- package/src/web/dist/landing.html +4 -4
- package/src/web/dist/assets/Dashboard-81R9MI8r.js +0 -1
- package/src/web/dist/assets/package-anTRKkYU.js +0 -1
- /package/src/web/dist/assets/{global-B_AcmMvG.js → global-NDOUShP9.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as d}from"./vendor-LWJeAdU1.js";import{u as $t,a as Ft}from"./query-Cpxr1dul.js";import{g as A,b as K,u as jt,t as Ce,c as ne}from"./app-C09yoSxh.js";import{g as L}from"./gateway-Bf1h2eFf.js";import{q as B}from"./queryKeys-DDTfNI_C.js";import{u as Oe}from"./useAppMutation-Com8yWoS.js";import{u as It}from"./useApiQuery-828HesQD.js";import{u as Lt}from"./i18n-B3N4Df3E.js";const H={savePreset(s,i){return A(K.post(`/api/routing-presets/${s}`,{name:i}))},applyPreset(s,i){return A(K.post(`/api/routing-presets/${s}/apply`,{name:i}))},deletePreset(s,i){return A(K.delete(`/api/routing-presets/${s}/${encodeURIComponent(i)}`))},testProvider(s,i){return A(K.post(`/api/providers/${s}/test`,i))}},_t=["claude-sonnet-4-5-20250929","claude-sonnet-4-5-20250929-thinking","claude-sonnet-4-20250514","claude-opus-4-1-20250805","claude-opus-4-1-20250805-thinking","claude-haiku-4-5-20251001","claude-haiku-4-5-20251001-thinking","claude-3-5-haiku-20241022"],Jt=["gpt-4o-mini","gpt-4o","o4-mini","o4-large","gpt-5-codex"];function O(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():Math.random().toString(36).slice(2,10)}function ae(s,i){var f;return(f=s==null?void 0:s.customEndpoints)!=null&&f.length?s.customEndpoints:i}function oe(s){return s?Object.entries(s).map(([i,f])=>({id:O(),source:i,target:f})):[]}function re(s,i){var E,p,h;if(!s)return{};const f={},c=s.endpointRouting??{};f.anthropic=oe(((E=c.anthropic)==null?void 0:E.modelRoutes)??s.modelRoutes??{}),f.openai=oe(((p=c.openai)==null?void 0:p.modelRoutes)??{});for(const v of ae(s,i))(h=v.routing)!=null&&h.modelRoutes?f[v.id]=oe(v.routing.modelRoutes):f[v.id]=[];return f}function xe(s,i,f){var p,h,v;const c=ae(s,i).find($=>$.id===f);if(c)return((p=c.routing)==null?void 0:p.modelRoutes)??{};const E=s.endpointRouting??{};return f==="anthropic"?((h=E.anthropic)==null?void 0:h.modelRoutes)??s.modelRoutes??{}:f==="openai"?((v=E.openai)==null?void 0:v.modelRoutes)??{}:{}}function qt(s){const i={};for(const f of s){const c=f.source.trim(),E=f.target.trim();c&&E&&(i[c]=E)}return i}function Te(s,i){return JSON.stringify(qt(s))!==JSON.stringify(i)}function Wt(s,i){if(s==="anthropic")return!0;const f=i.find(c=>c.id===s);return f?f.paths&&f.paths.length>0?f.paths.some(c=>c.protocol==="anthropic"):f.protocol==="anthropic":!1}function Xt(s,i,f){var E,p,h;if(!i)return;if(s==="anthropic"||s==="openai")return(p=(E=i.endpointRouting)==null?void 0:E[s])==null?void 0:p.validation;const c=ae(i,f).find(v=>v.id===s);return(h=c==null?void 0:c.routing)==null?void 0:h.validation}function Bt(s,i){const f=[{key:"providers",label:s("modelManagement.tabs.providers"),description:s("modelManagement.tabs.providersDesc"),isSystem:!0,canDelete:!1},{key:"anthropic",label:s("modelManagement.tabs.anthropic"),description:s("modelManagement.tabs.anthropicDesc"),isSystem:!0,canDelete:!1,protocols:["anthropic"]},{key:"openai",label:s("modelManagement.tabs.openai"),description:s("modelManagement.tabs.openaiDesc"),isSystem:!0,canDelete:!1,protocols:["openai-auto","openai-chat","openai-responses"]}],c=i.map(E=>{let p=s("modelManagement.tabs.customEndpoint"),h=[];if(E.paths&&E.paths.length>0)p=`${s("modelManagement.tabs.customEndpoint")}: ${E.paths.map(v=>`${v.path} (${v.protocol})`).join(", ")}`,h=[...new Set(E.paths.map(v=>v.protocol))];else if(E.path){const v=E.protocol||"anthropic";p=`${s("modelManagement.tabs.customEndpoint")}: ${E.path} (${v})`,h=[v]}return{key:E.id,label:E.label||E.id,description:p,isSystem:!1,canDelete:E.deletable!==!1,protocols:h}});return[...f,...c]}function Nt(s){return s.label&&s.label.trim().length>0?`${s.label} (${s.id})`:s.id}function $e(s,i){var c,E,p;const f={anthropic:((c=s.routingPresets)==null?void 0:c.anthropic)??[],openai:((E=s.routingPresets)==null?void 0:E.openai)??[]};for(const h of i){const v=(p=s.customEndpoints)==null?void 0:p.find($=>$.id===h.id);f[h.id]=(v==null?void 0:v.routingPresets)??h.routingPresets??[]}return f}function Yt(){var ke;const{t:s}=Lt(),{pushToast:i}=jt(),f=$t(),c=It(B.config.full(),L.configRequest()),p=((ke=Ft({queryKey:B.customEndpoints.all(),queryFn:ne.list,refetchInterval:1e4}).data)==null?void 0:ke.endpoints)??[],h=d.useMemo(()=>Bt(s,p),[p,s]),[v,$]=d.useState("providers"),[u,D]=d.useState(null),[Fe,G]=d.useState(!1),[_,J]=d.useState("create"),[N,W]=d.useState(void 0),[je,X]=d.useState(void 0),[Ie,ie]=d.useState(null),[Le,Y]=d.useState(!1),[F,P]=d.useState({}),[qe,x]=d.useState({}),[Be,ue]=d.useState(null),[le,Z]=d.useState({}),[de,ce]=d.useState({}),[Ne,U]=d.useState({}),[Ue,me]=d.useState(null),[Ve,fe]=d.useState(null),[Qe,pe]=d.useState(null),[ze,ge]=d.useState(!1),[ee,he]=d.useState(null),[V,te]=d.useState(!0),[ve,ye]=d.useState({}),[Ae,Ee]=d.useState(!1),[Ke,He]=d.useState({}),[Ge,_e]=d.useState(null),[l,Re]=d.useState(null),[Je,be]=d.useState(!1),[se,We]=d.useState(""),[Q,Xe]=d.useState("all"),Ye=d.useMemo(()=>h.filter(e=>e.isSystem),[h]),Ze=d.useMemo(()=>h.filter(e=>!e.isSystem),[h]),et=d.useMemo(()=>h.find(e=>e.key===v)??h[0]??null,[v,h]),k=(u==null?void 0:u.providers)??[],tt=k.length,st=d.useMemo(()=>k.filter(e=>{var a;if(!(Q==="all"||(e.type??"custom")===Q))return!1;const t=se.trim().toLowerCase();return t?[e.id,e.label??"",e.baseUrl,e.defaultModel??"",...((a=e.models)==null?void 0:a.map(r=>r.id))??[]].join(" ").toLowerCase().includes(t):!0}),[se,Q,k]),q=d.useMemo(()=>[{key:"anthropic-beta",value:"claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14",label:s("providers.testDialog.options.beta.label"),description:s("providers.testDialog.options.beta.description")}],[s]);d.useEffect(()=>{if(!c.data)return;const e=c.data;D(e),P(n=>{const t=re(e,p);if(!n||Object.keys(n).length===0)return t;const o={...t};for(const[a,r]of Object.entries(n)){if(!(a in t))continue;const m=xe(e,p,a);Te(r,m)&&(o[a]=r)}return o}),x({}),Z($e(e,p))},[c.data,p]),d.useEffect(()=>{!c.isError||!c.error||i({title:s("providers.toast.loadFailure",{message:c.error.message}),variant:"error"})},[c.error,c.isError,i,s]),d.useEffect(()=>{h.some(e=>e.key===v)||$("providers")},[v,h]);const nt=d.useMemo(()=>{const e=new Map;for(const n of k){if(!n.defaultModel||!n.models)continue;const t=n.models.find(o=>o.id===n.defaultModel);t&&e.set(n.id,Nt(t))}return e},[k]),ot=d.useMemo(()=>{const e=[],n=new Set;for(const t of k){const o=t.label&&t.label!==t.id?`${t.label} (${t.id})`:t.id,a=t.models??[];if(a.length>0)for(const m of a){const R=`${t.id}:${m.id}`;n.has(R)||(n.add(R),e.push({value:R,label:`${o} · ${m.label??m.id}`}))}else if(t.defaultModel){const m=`${t.id}:${t.defaultModel}`;n.has(m)||(n.add(m),e.push({value:m,label:`${o} · ${t.defaultModel}`}))}const r=`${t.id}:*`;n.has(r)||(n.add(r),e.push({value:r,label:s("settings.routing.providerPassthroughOption",{provider:o})}))}for(const t of Object.values(F).flat()){const o=t.target.trim();o&&!n.has(o)&&(n.add(o),e.push({value:o,label:o}))}return e},[k,F,s]),rt=()=>{X(void 0),Y(!0)},at=e=>{X(e),Y(!0)},it=e=>u?xe(u,p,e):{},ut=d.useMemo(()=>{const e={};for(const n of h){if(n.key==="providers")continue;const t=F[n.key]||[];e[n.key]=Te(t,it(n.key))}return e},[u,p,F,h]),Se=(e,n)=>{Z(t=>({...t,[e]:n})),D(t=>{if(!t)return t;if(e==="anthropic"||e==="openai")return{...t,routingPresets:{...t.routingPresets,[e]:n}};const o=[...t.customEndpoints??[]],a=o.findIndex(r=>r.id===e);return a===-1?t:(o[a]={...o[a],routingPresets:n},{...t,customEndpoints:o})})},T=()=>u?!0:(i({title:s("settings.toast.missingConfig"),variant:"error"}),c.refetch(),!1),lt=(e,n)=>{ce(t=>({...t,[e]:n})),n.trim()&&U(t=>({...t,[e]:null}))},dt=async e=>{if(!T())return;const n=(de[e]??"").trim();if(!n){U(t=>({...t,[e]:s("modelManagement.validation.presetName")}));return}if((le[e]??[]).some(t=>t.name.toLowerCase()===n.toLowerCase())){U(t=>({...t,[e]:s("modelManagement.validation.presetDuplicate",{name:n})}));return}me(e);try{const o=(await H.savePreset(e,n)).presets??[];Se(e,o),ce(a=>({...a,[e]:""})),U(a=>({...a,[e]:null})),i({title:s("modelManagement.toast.presetSaved",{name:n}),variant:"success"})}catch(t){i({title:s("modelManagement.toast.presetSaveFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{me(null),c.refetch()}},ct=async(e,n)=>{if(T()){fe({endpoint:e,name:n.name});try{const o=(await H.applyPreset(e,n.name)).config;if(o)D(o),P(re(o,p)),Z($e(o,p));else{const a=n.modelRoutes??{};P(r=>({...r,[e]:Object.entries(a).map(([m,R])=>({id:O(),source:m,target:R}))})),D(r=>{var R,y,g,b;if(!r)return r;const m=(r.customEndpoints??[]).findIndex(S=>S.id===e);if(m!==-1){const S=[...r.customEndpoints??[]],C=S[m];return S[m]={...C,routing:{defaults:((R=C.routing)==null?void 0:R.defaults)??r.defaults,...C.routing??{},modelRoutes:a}},{...r,customEndpoints:S}}return e==="anthropic"||e==="openai"?{...r,endpointRouting:{...r.endpointRouting??{},[e]:{defaults:((g=(y=r.endpointRouting)==null?void 0:y[e])==null?void 0:g.defaults)??r.defaults,...((b=r.endpointRouting)==null?void 0:b[e])??{},modelRoutes:a}},modelRoutes:e==="anthropic"?a:r.modelRoutes??{}}:r})}e!=="anthropic"&&e!=="openai"&&await f.invalidateQueries({queryKey:B.customEndpoints.all()}),i({title:s("modelManagement.toast.presetApplySuccess",{name:n.name}),variant:"success"})}catch(t){i({title:s("modelManagement.toast.presetApplyFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{fe(null),c.refetch()}}},mt=async(e,n)=>{if(T()){pe({endpoint:e,name:n.name});try{const t=await H.deletePreset(e,n.name);Se(e,t.presets??[]),i({title:s("modelManagement.toast.presetDeleteSuccess",{name:n.name}),variant:"success"})}catch(t){i({title:s("modelManagement.toast.presetDeleteFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{pe(null),c.refetch()}}},ft=()=>{T()&&(J("create"),W(void 0),G(!0))},pt=e=>{T()&&(J("edit"),W(e),G(!0))},gt=async e=>{if(!u)throw new Error(s("settings.toast.missingConfig"));const n=_==="create"?[...k,e]:k.map(o=>N&&o.id===N.id?{...e,id:N.id}:o),t={...u,providers:n};await L.saveConfig(t),D(t),P(re(t,p)),c.refetch(),i({title:_==="create"?s("providers.toast.createSuccess",{name:e.label||e.id}):s("providers.toast.updateSuccess",{name:e.label||e.id}),variant:"success"})},ht=async e=>{const n=p.find(t=>t.id===e);if(!(!n||n.deletable===!1))try{await ne.delete(e),await f.invalidateQueries({queryKey:B.customEndpoints.all()}),i({title:s("modelManagement.deleteEndpointSuccess"),variant:"success"}),v===e&&$("providers")}catch(t){const o=Ce(t);i({title:s("modelManagement.deleteEndpointError",{error:o.message}),variant:"error"})}},Me=async(e,n)=>{ie(e.id);try{const t=n&&(n.headers||n.query)?{headers:n.headers&&Object.keys(n.headers).length>0?n.headers:void 0,query:n.query&&n.query.trim().length>0?n.query.trim():void 0}:void 0,o=await H.testProvider(e.id,t);if(o.ok){i({title:s("providers.toast.testSuccess"),description:s("providers.toast.testSuccessDesc",{status:o.status,duration:o.durationMs?`${o.durationMs} ms`:"—"}),variant:"success"});return}i({title:s("providers.toast.testFailure",{message:`${o.status} ${o.statusText}`}),variant:"error"})}catch(t){i({title:s("providers.toast.testFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{ie(null)}},vt=e=>{if(e.type!=="anthropic"){Me(e);return}const n=e.extraHeaders??{},t=new Map(q.map(r=>[r.key.toLowerCase(),r])),o={};let a=!0;for(const r of q){const m=Object.entries(n).find(([g])=>g.toLowerCase()===r.key.toLowerCase());if(!m)continue;const[R,y]=m;String(y??"")!==r.value&&(a=!1,o[R]=String(y??""))}for(const[r,m]of Object.entries(n))t.has(r.toLowerCase())||(o[r]=String(m??""));ye(o),te(a),he(e),ge(!0)},we=()=>{ge(!1),he(null),te(!0),ye({})},yt=async()=>{if(!ee)return;const e={};if(V)for(const o of q)e[o.key]=o.value;const n=new Map(q.map(o=>[o.key.toLowerCase(),o]));for(const[o,a]of Object.entries(ve))n.get(o.toLowerCase())&&V||(e[o]=a);const t=ee;we(),await Me(t,{headers:Object.keys(e).length>0?e:void 0,query:V?"beta=true":void 0})},Pe=async e=>{var y,g,b,S,C,z;if(!T())return;const n=k.filter(M=>M.id!==e.id),t=M=>{const w={};if(!M)return w;for(const[j,I]of Object.entries(M)){if(!I)continue;const[De]=I.split(":");De&&De===e.id||I===e.id||(w[j]=I)}return w},o=(u==null?void 0:u.endpointRouting)??{},a=t(((y=o.anthropic)==null?void 0:y.modelRoutes)??(u==null?void 0:u.modelRoutes)??{}),r=t(((g=o.openai)==null?void 0:g.modelRoutes)??{}),m=((u==null?void 0:u.customEndpoints)??p).map(M=>{const w=M.routing,j=w==null?void 0:w.modelRoutes;return j?{...M,routing:{...w,defaults:w.defaults??u.defaults,modelRoutes:t(j)}}:M}),R={...u,providers:n,modelRoutes:a,customEndpoints:m,endpointRouting:{anthropic:{defaults:((b=o.anthropic)==null?void 0:b.defaults)??u.defaults,modelRoutes:a,validation:(S=o.anthropic)==null?void 0:S.validation},openai:{defaults:((C=o.openai)==null?void 0:C.defaults)??u.defaults,modelRoutes:r,validation:(z=o.openai)==null?void 0:z.validation}}};try{await L.saveConfig(R),D(R),P({anthropic:Object.entries(a).map(([M,w])=>({id:O(),source:M,target:w})),openai:Object.entries(r).map(([M,w])=>({id:O(),source:M,target:w})),...Object.fromEntries(m.map(M=>{var w;return[M.id,Object.entries(((w=M.routing)==null?void 0:w.modelRoutes)??{}).map(([j,I])=>({id:O(),source:j,target:I}))]}))}),i({title:s("providers.toast.deleteSuccess",{name:e.label||e.id}),variant:"success"}),c.refetch()}catch(M){i({title:s("providers.toast.deleteFailure",{message:M instanceof Error?M.message:"unknown"}),variant:"error"})}},Et=async()=>{if(l){be(!0);try{l.kind==="provider"?await Pe(l.provider):l.kind==="preset"?await mt(l.endpoint,l.preset):await ht(l.endpoint.id),Re(null)}finally{be(!1)}}},Rt=e=>{P(n=>({...n,[e]:[...n[e]||[],{id:O(),source:"",target:""}]})),x(n=>({...n,[e]:null}))},bt=async(e,n)=>{var t,o;if(T()){Ee(!0);try{if(e==="anthropic"||e==="openai"){const a=e,r=u.endpointRouting?{...u.endpointRouting}:{},m=r[a]??{defaults:u.defaults,modelRoutes:(a==="anthropic"?u.modelRoutes:{})??{}},R={defaults:m.defaults??u.defaults,modelRoutes:m.modelRoutes??{}},y=n==="off"?void 0:{...m.validation??{},mode:n,allowExperimentalBlocks:((t=m.validation)==null?void 0:t.allowExperimentalBlocks)??!0},g={...u,endpointRouting:{...r,[a]:y?{...R,validation:y}:{...R}}};await L.saveConfig(g),D(g)}else{const a=[...u.customEndpoints??[]],r=a.findIndex(b=>b.id===e);if(r===-1)throw new Error(s("modelManagement.toast.endpointNotFound"));const m=a[r],R=m.routing??{defaults:u.defaults,modelRoutes:{}},y=n==="off"?void 0:{...R.validation??{},mode:n,allowExperimentalBlocks:((o=R.validation)==null?void 0:o.allowExperimentalBlocks)??!0};a[r]={...m,routing:y?{...R,validation:y}:{defaults:R.defaults,modelRoutes:R.modelRoutes}};const g={...u,customEndpoints:a};await L.saveConfig(g),D(g)}i({title:s("modelManagement.toast.validationModeSaved",{mode:s(`modelManagement.claudeValidation.options.${n}.label`)}),variant:"success"}),c.refetch()}catch(a){const r=Ce(a);i({title:s("modelManagement.toast.validationModeFailure",{message:r.message}),variant:"error"})}finally{Ee(!1)}}},St=(e,n)=>{P(t=>{const o=t[e]||[];return o.some(a=>a.source.trim()===n.trim())?t:{...t,[e]:[...o,{id:O(),source:n,target:""}]}}),x(t=>({...t,[e]:null}))},Mt=(e,n,t,o)=>{P(a=>({...a,[e]:(a[e]||[]).map(r=>r.id===n?{...r,[t]:o}:r)})),x(a=>({...a,[e]:null}))},wt=(e,n)=>{P(t=>({...t,[e]:(t[e]||[]).filter(o=>o.id!==n)})),x(t=>({...t,[e]:null}))},Pt=e=>{var t;if(!u)return;const n=(u.customEndpoints??p).find(o=>o.id===e);if(n)P(o=>{var a;return{...o,[e]:Object.entries(((a=n.routing)==null?void 0:a.modelRoutes)??{}).map(([r,m])=>({id:O(),source:r,target:m}))}});else{const o=u.endpointRouting??{},a=e,r=a==="anthropic"?u.modelRoutes??{}:{},m=((t=o[a])==null?void 0:t.modelRoutes)??r;P(R=>({...R,[e]:Object.entries(m).map(([y,g])=>({id:O(),source:y,target:g}))}))}x(o=>({...o,[e]:null}))},kt=Oe({mutationFn:async e=>(await L.saveConfig(e.nextConfig),e)}),Dt=Oe({mutationFn:async e=>(await ne.update(e.endpoint,{routing:e.routing}),e)}),Ct=async e=>{var o,a,r,m,R;if(!T())return;const n=F[e]||[],t={};for(const y of n){const g=y.source.trim(),b=y.target.trim();if(!(!g&&!b)){if(!g||!b){x(S=>({...S,[e]:s("settings.validation.routePair")}));return}if(t[g]){x(S=>({...S,[e]:s("settings.validation.routeDuplicate",{model:g})}));return}t[g]=b}}x(y=>({...y,[e]:null})),ue(e);try{const y=p.find(g=>g.id===e);if(y){const g={...y.routing??{},modelRoutes:t,defaults:((o=y.routing)==null?void 0:o.defaults)||u.defaults};await Dt.mutateAsync({endpoint:e,routing:g}),D(b=>{if(!b)return b;const S=[...b.customEndpoints??[]],C=S.findIndex(z=>z.id===e);return C===-1?b:(S[C]={...S[C],routing:g},{...b,customEndpoints:S})}),await f.invalidateQueries({queryKey:B.customEndpoints.all()})}else{const g={...u,endpointRouting:{...u.endpointRouting??{},[e]:{defaults:((r=(a=u.endpointRouting)==null?void 0:a[e])==null?void 0:r.defaults)??u.defaults,modelRoutes:t,validation:(R=(m=u.endpointRouting)==null?void 0:m[e])==null?void 0:R.validation}},modelRoutes:e==="anthropic"?t:u.modelRoutes??{}};await kt.mutateAsync({endpoint:e,nextConfig:g}),D(g)}P(g=>({...g,[e]:Object.entries(t).map(([b,S])=>({id:O(),source:b,target:S}))})),i({title:s("modelManagement.toast.routesSaved"),variant:"success"}),c.refetch()}catch(y){i({title:s("modelManagement.toast.routesSaveFailure",{message:y instanceof Error?y.message:"unknown"}),variant:"error"})}finally{ue(null)}},Ot=(l==null?void 0:l.kind)==="provider"?s("providers.actions.delete"):(l==null?void 0:l.kind)==="preset"?s("modelManagement.presets.delete"):(l==null?void 0:l.kind)==="endpoint"?s("common.delete"):"",xt=(l==null?void 0:l.kind)==="provider"?s("providers.confirm.delete",{name:l.provider.label||l.provider.id}):(l==null?void 0:l.kind)==="preset"?s("modelManagement.confirm.deletePreset",{name:l.preset.name}):(l==null?void 0:l.kind)==="endpoint"?s("modelManagement.deleteEndpointConfirm",{label:l.endpoint.label}):"",Tt=(l==null?void 0:l.kind)==="provider"?l.provider.label||l.provider.id:(l==null?void 0:l.kind)==="preset"?l.preset.name:(l==null?void 0:l.kind)==="endpoint"?l.endpoint.label:"";return{activeTab:v,activeTabInfo:et,anthropicTestHeaderOptions:q,applyingPreset:Ve,config:u,configQuery:c,confirmAction:l,confirmDialogDescription:xt,confirmDialogName:Tt,confirmDialogTitle:Ot,confirmingAction:Je,customEndpoints:p,customTabs:Ze,defaultLabels:nt,deletingPreset:Qe,drawerMode:_,drawerOpen:Fe,editingEndpoint:je,editingProvider:N,endpointDrawerOpen:Le,filteredProviders:st,handleAddRoute:Rt,handleAddSuggestion:St,handleApplyPreset:ct,handleConfirmDialog:Et,handleDeleteProvider:Pe,handleOpenCreate:ft,handleOpenCreateEndpoint:rt,handleOpenEditEndpoint:at,handleOpenEdit:pt,handlePresetNameChange:lt,handleProviderSubmit:gt,handleRemoveRoute:wt,handleResetRoutes:Pt,handleRouteChange:Mt,handleSavePreset:dt,handleSaveRoutes:Ct,handleValidationModeChange:bt,initiateTestConnection:vt,isDirtyByEndpoint:ut,presetDiffDialog:Ge,presetErrorByEndpoint:Ne,presetNameByEndpoint:de,presetsByEndpoint:le,presetsExpanded:Ke,providerCount:tt,providerModelOptions:ot,providerSearch:se,providerTypeFilter:Q,providers:k,pushToast:i,routeError:qe,routesByEndpoint:F,savingClaudeValidation:Ae,savingPresetFor:Ue,savingRouteFor:Be,setActiveTab:$,setConfirmAction:Re,setDrawerMode:J,setDrawerOpen:G,setEditingEndpoint:X,setEditingProvider:W,setEndpointDrawerOpen:Y,setPresetDiffDialog:_e,setPresetsExpanded:He,setProviderSearch:We,setProviderTypeFilter:Xe,setTestDialogUsePreset:te,systemTabs:Ye,tabs:h,testDialogOpen:ze,testDialogPreservedExtras:ve,testDialogProvider:ee,testDialogUsePreset:V,testingProviderId:Ie,closeTestDialog:we,confirmTestDialog:yt}}export{_t as C,Jt as O,Xt as g,Wt as i,Yt as u};
|
|
1
|
+
import{r as d}from"./vendor-LWJeAdU1.js";import{u as $t,a as Ft}from"./query-Cpxr1dul.js";import{g as A,b as K,u as jt,t as Ce,c as ne}from"./app-BxSHC5_o.js";import{g as L}from"./gateway-mlUZb7iD.js";import{q as B}from"./queryKeys-CsNzv19i.js";import{u as Oe}from"./useAppMutation-wWyqqlf8.js";import{u as It}from"./useApiQuery-Y63AiXYK.js";import{u as Lt}from"./i18n-B3N4Df3E.js";const H={savePreset(s,i){return A(K.post(`/api/routing-presets/${s}`,{name:i}))},applyPreset(s,i){return A(K.post(`/api/routing-presets/${s}/apply`,{name:i}))},deletePreset(s,i){return A(K.delete(`/api/routing-presets/${s}/${encodeURIComponent(i)}`))},testProvider(s,i){return A(K.post(`/api/providers/${s}/test`,i))}},_t=["claude-sonnet-4-5-20250929","claude-sonnet-4-5-20250929-thinking","claude-sonnet-4-20250514","claude-opus-4-1-20250805","claude-opus-4-1-20250805-thinking","claude-haiku-4-5-20251001","claude-haiku-4-5-20251001-thinking","claude-3-5-haiku-20241022"],Jt=["gpt-4o-mini","gpt-4o","o4-mini","o4-large","gpt-5-codex"];function O(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():Math.random().toString(36).slice(2,10)}function ae(s,i){var f;return(f=s==null?void 0:s.customEndpoints)!=null&&f.length?s.customEndpoints:i}function oe(s){return s?Object.entries(s).map(([i,f])=>({id:O(),source:i,target:f})):[]}function re(s,i){var E,p,h;if(!s)return{};const f={},c=s.endpointRouting??{};f.anthropic=oe(((E=c.anthropic)==null?void 0:E.modelRoutes)??s.modelRoutes??{}),f.openai=oe(((p=c.openai)==null?void 0:p.modelRoutes)??{});for(const v of ae(s,i))(h=v.routing)!=null&&h.modelRoutes?f[v.id]=oe(v.routing.modelRoutes):f[v.id]=[];return f}function xe(s,i,f){var p,h,v;const c=ae(s,i).find($=>$.id===f);if(c)return((p=c.routing)==null?void 0:p.modelRoutes)??{};const E=s.endpointRouting??{};return f==="anthropic"?((h=E.anthropic)==null?void 0:h.modelRoutes)??s.modelRoutes??{}:f==="openai"?((v=E.openai)==null?void 0:v.modelRoutes)??{}:{}}function qt(s){const i={};for(const f of s){const c=f.source.trim(),E=f.target.trim();c&&E&&(i[c]=E)}return i}function Te(s,i){return JSON.stringify(qt(s))!==JSON.stringify(i)}function Wt(s,i){if(s==="anthropic")return!0;const f=i.find(c=>c.id===s);return f?f.paths&&f.paths.length>0?f.paths.some(c=>c.protocol==="anthropic"):f.protocol==="anthropic":!1}function Xt(s,i,f){var E,p,h;if(!i)return;if(s==="anthropic"||s==="openai")return(p=(E=i.endpointRouting)==null?void 0:E[s])==null?void 0:p.validation;const c=ae(i,f).find(v=>v.id===s);return(h=c==null?void 0:c.routing)==null?void 0:h.validation}function Bt(s,i){const f=[{key:"providers",label:s("modelManagement.tabs.providers"),description:s("modelManagement.tabs.providersDesc"),isSystem:!0,canDelete:!1},{key:"anthropic",label:s("modelManagement.tabs.anthropic"),description:s("modelManagement.tabs.anthropicDesc"),isSystem:!0,canDelete:!1,protocols:["anthropic"]},{key:"openai",label:s("modelManagement.tabs.openai"),description:s("modelManagement.tabs.openaiDesc"),isSystem:!0,canDelete:!1,protocols:["openai-auto","openai-chat","openai-responses"]}],c=i.map(E=>{let p=s("modelManagement.tabs.customEndpoint"),h=[];if(E.paths&&E.paths.length>0)p=`${s("modelManagement.tabs.customEndpoint")}: ${E.paths.map(v=>`${v.path} (${v.protocol})`).join(", ")}`,h=[...new Set(E.paths.map(v=>v.protocol))];else if(E.path){const v=E.protocol||"anthropic";p=`${s("modelManagement.tabs.customEndpoint")}: ${E.path} (${v})`,h=[v]}return{key:E.id,label:E.label||E.id,description:p,isSystem:!1,canDelete:E.deletable!==!1,protocols:h}});return[...f,...c]}function Nt(s){return s.label&&s.label.trim().length>0?`${s.label} (${s.id})`:s.id}function $e(s,i){var c,E,p;const f={anthropic:((c=s.routingPresets)==null?void 0:c.anthropic)??[],openai:((E=s.routingPresets)==null?void 0:E.openai)??[]};for(const h of i){const v=(p=s.customEndpoints)==null?void 0:p.find($=>$.id===h.id);f[h.id]=(v==null?void 0:v.routingPresets)??h.routingPresets??[]}return f}function Yt(){var ke;const{t:s}=Lt(),{pushToast:i}=jt(),f=$t(),c=It(B.config.full(),L.configRequest()),p=((ke=Ft({queryKey:B.customEndpoints.all(),queryFn:ne.list,refetchInterval:1e4}).data)==null?void 0:ke.endpoints)??[],h=d.useMemo(()=>Bt(s,p),[p,s]),[v,$]=d.useState("providers"),[u,D]=d.useState(null),[Fe,G]=d.useState(!1),[_,J]=d.useState("create"),[N,W]=d.useState(void 0),[je,X]=d.useState(void 0),[Ie,ie]=d.useState(null),[Le,Y]=d.useState(!1),[F,P]=d.useState({}),[qe,x]=d.useState({}),[Be,ue]=d.useState(null),[le,Z]=d.useState({}),[de,ce]=d.useState({}),[Ne,U]=d.useState({}),[Ue,me]=d.useState(null),[Ve,fe]=d.useState(null),[Qe,pe]=d.useState(null),[ze,ge]=d.useState(!1),[ee,he]=d.useState(null),[V,te]=d.useState(!0),[ve,ye]=d.useState({}),[Ae,Ee]=d.useState(!1),[Ke,He]=d.useState({}),[Ge,_e]=d.useState(null),[l,Re]=d.useState(null),[Je,be]=d.useState(!1),[se,We]=d.useState(""),[Q,Xe]=d.useState("all"),Ye=d.useMemo(()=>h.filter(e=>e.isSystem),[h]),Ze=d.useMemo(()=>h.filter(e=>!e.isSystem),[h]),et=d.useMemo(()=>h.find(e=>e.key===v)??h[0]??null,[v,h]),k=(u==null?void 0:u.providers)??[],tt=k.length,st=d.useMemo(()=>k.filter(e=>{var a;if(!(Q==="all"||(e.type??"custom")===Q))return!1;const t=se.trim().toLowerCase();return t?[e.id,e.label??"",e.baseUrl,e.defaultModel??"",...((a=e.models)==null?void 0:a.map(r=>r.id))??[]].join(" ").toLowerCase().includes(t):!0}),[se,Q,k]),q=d.useMemo(()=>[{key:"anthropic-beta",value:"claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14",label:s("providers.testDialog.options.beta.label"),description:s("providers.testDialog.options.beta.description")}],[s]);d.useEffect(()=>{if(!c.data)return;const e=c.data;D(e),P(n=>{const t=re(e,p);if(!n||Object.keys(n).length===0)return t;const o={...t};for(const[a,r]of Object.entries(n)){if(!(a in t))continue;const m=xe(e,p,a);Te(r,m)&&(o[a]=r)}return o}),x({}),Z($e(e,p))},[c.data,p]),d.useEffect(()=>{!c.isError||!c.error||i({title:s("providers.toast.loadFailure",{message:c.error.message}),variant:"error"})},[c.error,c.isError,i,s]),d.useEffect(()=>{h.some(e=>e.key===v)||$("providers")},[v,h]);const nt=d.useMemo(()=>{const e=new Map;for(const n of k){if(!n.defaultModel||!n.models)continue;const t=n.models.find(o=>o.id===n.defaultModel);t&&e.set(n.id,Nt(t))}return e},[k]),ot=d.useMemo(()=>{const e=[],n=new Set;for(const t of k){const o=t.label&&t.label!==t.id?`${t.label} (${t.id})`:t.id,a=t.models??[];if(a.length>0)for(const m of a){const R=`${t.id}:${m.id}`;n.has(R)||(n.add(R),e.push({value:R,label:`${o} · ${m.label??m.id}`}))}else if(t.defaultModel){const m=`${t.id}:${t.defaultModel}`;n.has(m)||(n.add(m),e.push({value:m,label:`${o} · ${t.defaultModel}`}))}const r=`${t.id}:*`;n.has(r)||(n.add(r),e.push({value:r,label:s("settings.routing.providerPassthroughOption",{provider:o})}))}for(const t of Object.values(F).flat()){const o=t.target.trim();o&&!n.has(o)&&(n.add(o),e.push({value:o,label:o}))}return e},[k,F,s]),rt=()=>{X(void 0),Y(!0)},at=e=>{X(e),Y(!0)},it=e=>u?xe(u,p,e):{},ut=d.useMemo(()=>{const e={};for(const n of h){if(n.key==="providers")continue;const t=F[n.key]||[];e[n.key]=Te(t,it(n.key))}return e},[u,p,F,h]),Se=(e,n)=>{Z(t=>({...t,[e]:n})),D(t=>{if(!t)return t;if(e==="anthropic"||e==="openai")return{...t,routingPresets:{...t.routingPresets,[e]:n}};const o=[...t.customEndpoints??[]],a=o.findIndex(r=>r.id===e);return a===-1?t:(o[a]={...o[a],routingPresets:n},{...t,customEndpoints:o})})},T=()=>u?!0:(i({title:s("settings.toast.missingConfig"),variant:"error"}),c.refetch(),!1),lt=(e,n)=>{ce(t=>({...t,[e]:n})),n.trim()&&U(t=>({...t,[e]:null}))},dt=async e=>{if(!T())return;const n=(de[e]??"").trim();if(!n){U(t=>({...t,[e]:s("modelManagement.validation.presetName")}));return}if((le[e]??[]).some(t=>t.name.toLowerCase()===n.toLowerCase())){U(t=>({...t,[e]:s("modelManagement.validation.presetDuplicate",{name:n})}));return}me(e);try{const o=(await H.savePreset(e,n)).presets??[];Se(e,o),ce(a=>({...a,[e]:""})),U(a=>({...a,[e]:null})),i({title:s("modelManagement.toast.presetSaved",{name:n}),variant:"success"})}catch(t){i({title:s("modelManagement.toast.presetSaveFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{me(null),c.refetch()}},ct=async(e,n)=>{if(T()){fe({endpoint:e,name:n.name});try{const o=(await H.applyPreset(e,n.name)).config;if(o)D(o),P(re(o,p)),Z($e(o,p));else{const a=n.modelRoutes??{};P(r=>({...r,[e]:Object.entries(a).map(([m,R])=>({id:O(),source:m,target:R}))})),D(r=>{var R,y,g,b;if(!r)return r;const m=(r.customEndpoints??[]).findIndex(S=>S.id===e);if(m!==-1){const S=[...r.customEndpoints??[]],C=S[m];return S[m]={...C,routing:{defaults:((R=C.routing)==null?void 0:R.defaults)??r.defaults,...C.routing??{},modelRoutes:a}},{...r,customEndpoints:S}}return e==="anthropic"||e==="openai"?{...r,endpointRouting:{...r.endpointRouting??{},[e]:{defaults:((g=(y=r.endpointRouting)==null?void 0:y[e])==null?void 0:g.defaults)??r.defaults,...((b=r.endpointRouting)==null?void 0:b[e])??{},modelRoutes:a}},modelRoutes:e==="anthropic"?a:r.modelRoutes??{}}:r})}e!=="anthropic"&&e!=="openai"&&await f.invalidateQueries({queryKey:B.customEndpoints.all()}),i({title:s("modelManagement.toast.presetApplySuccess",{name:n.name}),variant:"success"})}catch(t){i({title:s("modelManagement.toast.presetApplyFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{fe(null),c.refetch()}}},mt=async(e,n)=>{if(T()){pe({endpoint:e,name:n.name});try{const t=await H.deletePreset(e,n.name);Se(e,t.presets??[]),i({title:s("modelManagement.toast.presetDeleteSuccess",{name:n.name}),variant:"success"})}catch(t){i({title:s("modelManagement.toast.presetDeleteFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{pe(null),c.refetch()}}},ft=()=>{T()&&(J("create"),W(void 0),G(!0))},pt=e=>{T()&&(J("edit"),W(e),G(!0))},gt=async e=>{if(!u)throw new Error(s("settings.toast.missingConfig"));const n=_==="create"?[...k,e]:k.map(o=>N&&o.id===N.id?{...e,id:N.id}:o),t={...u,providers:n};await L.saveConfig(t),D(t),P(re(t,p)),c.refetch(),i({title:_==="create"?s("providers.toast.createSuccess",{name:e.label||e.id}):s("providers.toast.updateSuccess",{name:e.label||e.id}),variant:"success"})},ht=async e=>{const n=p.find(t=>t.id===e);if(!(!n||n.deletable===!1))try{await ne.delete(e),await f.invalidateQueries({queryKey:B.customEndpoints.all()}),i({title:s("modelManagement.deleteEndpointSuccess"),variant:"success"}),v===e&&$("providers")}catch(t){const o=Ce(t);i({title:s("modelManagement.deleteEndpointError",{error:o.message}),variant:"error"})}},Me=async(e,n)=>{ie(e.id);try{const t=n&&(n.headers||n.query)?{headers:n.headers&&Object.keys(n.headers).length>0?n.headers:void 0,query:n.query&&n.query.trim().length>0?n.query.trim():void 0}:void 0,o=await H.testProvider(e.id,t);if(o.ok){i({title:s("providers.toast.testSuccess"),description:s("providers.toast.testSuccessDesc",{status:o.status,duration:o.durationMs?`${o.durationMs} ms`:"—"}),variant:"success"});return}i({title:s("providers.toast.testFailure",{message:`${o.status} ${o.statusText}`}),variant:"error"})}catch(t){i({title:s("providers.toast.testFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{ie(null)}},vt=e=>{if(e.type!=="anthropic"){Me(e);return}const n=e.extraHeaders??{},t=new Map(q.map(r=>[r.key.toLowerCase(),r])),o={};let a=!0;for(const r of q){const m=Object.entries(n).find(([g])=>g.toLowerCase()===r.key.toLowerCase());if(!m)continue;const[R,y]=m;String(y??"")!==r.value&&(a=!1,o[R]=String(y??""))}for(const[r,m]of Object.entries(n))t.has(r.toLowerCase())||(o[r]=String(m??""));ye(o),te(a),he(e),ge(!0)},we=()=>{ge(!1),he(null),te(!0),ye({})},yt=async()=>{if(!ee)return;const e={};if(V)for(const o of q)e[o.key]=o.value;const n=new Map(q.map(o=>[o.key.toLowerCase(),o]));for(const[o,a]of Object.entries(ve))n.get(o.toLowerCase())&&V||(e[o]=a);const t=ee;we(),await Me(t,{headers:Object.keys(e).length>0?e:void 0,query:V?"beta=true":void 0})},Pe=async e=>{var y,g,b,S,C,z;if(!T())return;const n=k.filter(M=>M.id!==e.id),t=M=>{const w={};if(!M)return w;for(const[j,I]of Object.entries(M)){if(!I)continue;const[De]=I.split(":");De&&De===e.id||I===e.id||(w[j]=I)}return w},o=(u==null?void 0:u.endpointRouting)??{},a=t(((y=o.anthropic)==null?void 0:y.modelRoutes)??(u==null?void 0:u.modelRoutes)??{}),r=t(((g=o.openai)==null?void 0:g.modelRoutes)??{}),m=((u==null?void 0:u.customEndpoints)??p).map(M=>{const w=M.routing,j=w==null?void 0:w.modelRoutes;return j?{...M,routing:{...w,defaults:w.defaults??u.defaults,modelRoutes:t(j)}}:M}),R={...u,providers:n,modelRoutes:a,customEndpoints:m,endpointRouting:{anthropic:{defaults:((b=o.anthropic)==null?void 0:b.defaults)??u.defaults,modelRoutes:a,validation:(S=o.anthropic)==null?void 0:S.validation},openai:{defaults:((C=o.openai)==null?void 0:C.defaults)??u.defaults,modelRoutes:r,validation:(z=o.openai)==null?void 0:z.validation}}};try{await L.saveConfig(R),D(R),P({anthropic:Object.entries(a).map(([M,w])=>({id:O(),source:M,target:w})),openai:Object.entries(r).map(([M,w])=>({id:O(),source:M,target:w})),...Object.fromEntries(m.map(M=>{var w;return[M.id,Object.entries(((w=M.routing)==null?void 0:w.modelRoutes)??{}).map(([j,I])=>({id:O(),source:j,target:I}))]}))}),i({title:s("providers.toast.deleteSuccess",{name:e.label||e.id}),variant:"success"}),c.refetch()}catch(M){i({title:s("providers.toast.deleteFailure",{message:M instanceof Error?M.message:"unknown"}),variant:"error"})}},Et=async()=>{if(l){be(!0);try{l.kind==="provider"?await Pe(l.provider):l.kind==="preset"?await mt(l.endpoint,l.preset):await ht(l.endpoint.id),Re(null)}finally{be(!1)}}},Rt=e=>{P(n=>({...n,[e]:[...n[e]||[],{id:O(),source:"",target:""}]})),x(n=>({...n,[e]:null}))},bt=async(e,n)=>{var t,o;if(T()){Ee(!0);try{if(e==="anthropic"||e==="openai"){const a=e,r=u.endpointRouting?{...u.endpointRouting}:{},m=r[a]??{defaults:u.defaults,modelRoutes:(a==="anthropic"?u.modelRoutes:{})??{}},R={defaults:m.defaults??u.defaults,modelRoutes:m.modelRoutes??{}},y=n==="off"?void 0:{...m.validation??{},mode:n,allowExperimentalBlocks:((t=m.validation)==null?void 0:t.allowExperimentalBlocks)??!0},g={...u,endpointRouting:{...r,[a]:y?{...R,validation:y}:{...R}}};await L.saveConfig(g),D(g)}else{const a=[...u.customEndpoints??[]],r=a.findIndex(b=>b.id===e);if(r===-1)throw new Error(s("modelManagement.toast.endpointNotFound"));const m=a[r],R=m.routing??{defaults:u.defaults,modelRoutes:{}},y=n==="off"?void 0:{...R.validation??{},mode:n,allowExperimentalBlocks:((o=R.validation)==null?void 0:o.allowExperimentalBlocks)??!0};a[r]={...m,routing:y?{...R,validation:y}:{defaults:R.defaults,modelRoutes:R.modelRoutes}};const g={...u,customEndpoints:a};await L.saveConfig(g),D(g)}i({title:s("modelManagement.toast.validationModeSaved",{mode:s(`modelManagement.claudeValidation.options.${n}.label`)}),variant:"success"}),c.refetch()}catch(a){const r=Ce(a);i({title:s("modelManagement.toast.validationModeFailure",{message:r.message}),variant:"error"})}finally{Ee(!1)}}},St=(e,n)=>{P(t=>{const o=t[e]||[];return o.some(a=>a.source.trim()===n.trim())?t:{...t,[e]:[...o,{id:O(),source:n,target:""}]}}),x(t=>({...t,[e]:null}))},Mt=(e,n,t,o)=>{P(a=>({...a,[e]:(a[e]||[]).map(r=>r.id===n?{...r,[t]:o}:r)})),x(a=>({...a,[e]:null}))},wt=(e,n)=>{P(t=>({...t,[e]:(t[e]||[]).filter(o=>o.id!==n)})),x(t=>({...t,[e]:null}))},Pt=e=>{var t;if(!u)return;const n=(u.customEndpoints??p).find(o=>o.id===e);if(n)P(o=>{var a;return{...o,[e]:Object.entries(((a=n.routing)==null?void 0:a.modelRoutes)??{}).map(([r,m])=>({id:O(),source:r,target:m}))}});else{const o=u.endpointRouting??{},a=e,r=a==="anthropic"?u.modelRoutes??{}:{},m=((t=o[a])==null?void 0:t.modelRoutes)??r;P(R=>({...R,[e]:Object.entries(m).map(([y,g])=>({id:O(),source:y,target:g}))}))}x(o=>({...o,[e]:null}))},kt=Oe({mutationFn:async e=>(await L.saveConfig(e.nextConfig),e)}),Dt=Oe({mutationFn:async e=>(await ne.update(e.endpoint,{routing:e.routing}),e)}),Ct=async e=>{var o,a,r,m,R;if(!T())return;const n=F[e]||[],t={};for(const y of n){const g=y.source.trim(),b=y.target.trim();if(!(!g&&!b)){if(!g||!b){x(S=>({...S,[e]:s("settings.validation.routePair")}));return}if(t[g]){x(S=>({...S,[e]:s("settings.validation.routeDuplicate",{model:g})}));return}t[g]=b}}x(y=>({...y,[e]:null})),ue(e);try{const y=p.find(g=>g.id===e);if(y){const g={...y.routing??{},modelRoutes:t,defaults:((o=y.routing)==null?void 0:o.defaults)||u.defaults};await Dt.mutateAsync({endpoint:e,routing:g}),D(b=>{if(!b)return b;const S=[...b.customEndpoints??[]],C=S.findIndex(z=>z.id===e);return C===-1?b:(S[C]={...S[C],routing:g},{...b,customEndpoints:S})}),await f.invalidateQueries({queryKey:B.customEndpoints.all()})}else{const g={...u,endpointRouting:{...u.endpointRouting??{},[e]:{defaults:((r=(a=u.endpointRouting)==null?void 0:a[e])==null?void 0:r.defaults)??u.defaults,modelRoutes:t,validation:(R=(m=u.endpointRouting)==null?void 0:m[e])==null?void 0:R.validation}},modelRoutes:e==="anthropic"?t:u.modelRoutes??{}};await kt.mutateAsync({endpoint:e,nextConfig:g}),D(g)}P(g=>({...g,[e]:Object.entries(t).map(([b,S])=>({id:O(),source:b,target:S}))})),i({title:s("modelManagement.toast.routesSaved"),variant:"success"}),c.refetch()}catch(y){i({title:s("modelManagement.toast.routesSaveFailure",{message:y instanceof Error?y.message:"unknown"}),variant:"error"})}finally{ue(null)}},Ot=(l==null?void 0:l.kind)==="provider"?s("providers.actions.delete"):(l==null?void 0:l.kind)==="preset"?s("modelManagement.presets.delete"):(l==null?void 0:l.kind)==="endpoint"?s("common.delete"):"",xt=(l==null?void 0:l.kind)==="provider"?s("providers.confirm.delete",{name:l.provider.label||l.provider.id}):(l==null?void 0:l.kind)==="preset"?s("modelManagement.confirm.deletePreset",{name:l.preset.name}):(l==null?void 0:l.kind)==="endpoint"?s("modelManagement.deleteEndpointConfirm",{label:l.endpoint.label}):"",Tt=(l==null?void 0:l.kind)==="provider"?l.provider.label||l.provider.id:(l==null?void 0:l.kind)==="preset"?l.preset.name:(l==null?void 0:l.kind)==="endpoint"?l.endpoint.label:"";return{activeTab:v,activeTabInfo:et,anthropicTestHeaderOptions:q,applyingPreset:Ve,config:u,configQuery:c,confirmAction:l,confirmDialogDescription:xt,confirmDialogName:Tt,confirmDialogTitle:Ot,confirmingAction:Je,customEndpoints:p,customTabs:Ze,defaultLabels:nt,deletingPreset:Qe,drawerMode:_,drawerOpen:Fe,editingEndpoint:je,editingProvider:N,endpointDrawerOpen:Le,filteredProviders:st,handleAddRoute:Rt,handleAddSuggestion:St,handleApplyPreset:ct,handleConfirmDialog:Et,handleDeleteProvider:Pe,handleOpenCreate:ft,handleOpenCreateEndpoint:rt,handleOpenEditEndpoint:at,handleOpenEdit:pt,handlePresetNameChange:lt,handleProviderSubmit:gt,handleRemoveRoute:wt,handleResetRoutes:Pt,handleRouteChange:Mt,handleSavePreset:dt,handleSaveRoutes:Ct,handleValidationModeChange:bt,initiateTestConnection:vt,isDirtyByEndpoint:ut,presetDiffDialog:Ge,presetErrorByEndpoint:Ne,presetNameByEndpoint:de,presetsByEndpoint:le,presetsExpanded:Ke,providerCount:tt,providerModelOptions:ot,providerSearch:se,providerTypeFilter:Q,providers:k,pushToast:i,routeError:qe,routesByEndpoint:F,savingClaudeValidation:Ae,savingPresetFor:Ue,savingRouteFor:Be,setActiveTab:$,setConfirmAction:Re,setDrawerMode:J,setDrawerOpen:G,setEditingEndpoint:X,setEditingProvider:W,setEndpointDrawerOpen:Y,setPresetDiffDialog:_e,setPresetsExpanded:He,setProviderSearch:We,setProviderTypeFilter:Xe,setTestDialogUsePreset:te,systemTabs:Ye,tabs:h,testDialogOpen:ze,testDialogPreservedExtras:ve,testDialogProvider:ee,testDialogUsePreset:V,testingProviderId:Ie,closeTestDialog:we,confirmTestDialog:yt}}export{_t as C,Jt as O,Xt as g,Wt as i,Yt as u};
|
package/src/web/dist/index.html
CHANGED
|
@@ -8,14 +8,14 @@
|
|
|
8
8
|
<link rel="apple-touch-icon" href="/cc-gw-mark.svg" />
|
|
9
9
|
<link rel="manifest" href="/site.webmanifest" />
|
|
10
10
|
<title>cc-gw 控制台</title>
|
|
11
|
-
<script type="module" crossorigin src="/assets/app-
|
|
11
|
+
<script type="module" crossorigin src="/assets/app-BxSHC5_o.js"></script>
|
|
12
12
|
<link rel="modulepreload" crossorigin href="/assets/vendor-LWJeAdU1.js">
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/global-
|
|
13
|
+
<link rel="modulepreload" crossorigin href="/assets/global-NDOUShP9.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="/assets/query-Cpxr1dul.js">
|
|
15
15
|
<link rel="modulepreload" crossorigin href="/assets/i18n-B3N4Df3E.js">
|
|
16
16
|
<link rel="modulepreload" crossorigin href="/assets/router-DspBTS8b.js">
|
|
17
17
|
<link rel="modulepreload" crossorigin href="/assets/radix-bG5h1Ymq.js">
|
|
18
|
-
<link rel="stylesheet" crossorigin href="/assets/global-
|
|
18
|
+
<link rel="stylesheet" crossorigin href="/assets/global-BOV4QSBB.css">
|
|
19
19
|
</head>
|
|
20
20
|
<body class="bg-slate-50 text-slate-900 dark:bg-slate-900 dark:text-slate-50">
|
|
21
21
|
<div id="root"></div>
|
|
@@ -42,12 +42,12 @@
|
|
|
42
42
|
}
|
|
43
43
|
</script>
|
|
44
44
|
<title>cc-gw | 别再让 AI 配置散落在每个项目里</title>
|
|
45
|
-
<script type="module" crossorigin src="/assets/landing-
|
|
45
|
+
<script type="module" crossorigin src="/assets/landing-DV2hroBA.js"></script>
|
|
46
46
|
<link rel="modulepreload" crossorigin href="/assets/vendor-LWJeAdU1.js">
|
|
47
|
-
<link rel="modulepreload" crossorigin href="/assets/global-
|
|
47
|
+
<link rel="modulepreload" crossorigin href="/assets/global-NDOUShP9.js">
|
|
48
48
|
<link rel="modulepreload" crossorigin href="/assets/clipboard-CALi6bTW.js">
|
|
49
|
-
<link rel="modulepreload" crossorigin href="/assets/package-
|
|
50
|
-
<link rel="stylesheet" crossorigin href="/assets/global-
|
|
49
|
+
<link rel="modulepreload" crossorigin href="/assets/package-CVSxn1pM.js">
|
|
50
|
+
<link rel="stylesheet" crossorigin href="/assets/global-BOV4QSBB.css">
|
|
51
51
|
</head>
|
|
52
52
|
<body class="bg-slate-50 text-slate-900">
|
|
53
53
|
<div id="landing-root"></div>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{j as e,aj as Re,ak as ke,W as Q,al as Pe,am as qe,an as Me,O as G,ao as Ae,ap as _e,aq as De,ar as ne,as as Be,r as u,at as Oe,U as Fe}from"./vendor-LWJeAdU1.js";import{P as $e}from"./PageHeader-C01S2XTN.js";import{P as V,a as z}from"./PageState-Cntv0Sf4.js";import{B,u as Ge,a as ze,b as He,t as Qe,s as Ue}from"./app-C09yoSxh.js";import{S as Ve,a as Ke,b as We,c as Ye,d as M}from"./select-DJFQztdh.js";import{c as R}from"./global-B_AcmMvG.js";import{L as Ze}from"./router-DspBTS8b.js";import{T as ie,a as le,b as O,c as j,d as de,e as y,E as Je}from"./table-C5nemz39.js";import{P as ce}from"./PageSection-CPPskzEi.js";import{S as Xe,C as et,T as tt}from"./Skeleton-DgZEIS_E.js";import{B as C,q as I}from"./queryKeys-DDTfNI_C.js";import{C as F,a as $}from"./card-BMPheH9g.js";import{g as ae}from"./utils-DSaa7c6v.js";import{u as w}from"./i18n-B3N4Df3E.js";import{e as st}from"./charts-core-D9OugzV_.js";import{u as L}from"./useApiQuery-828HesQD.js";import"./query-Cpxr1dul.js";import"./radix-bG5h1Ymq.js";import"./charts-react-BqhUp1x_.js";import"./charts-engine-DleyglMn.js";const A=15e3,H=6e4,T={requests:"#2563eb",input:"#059669",output:"#ea580c",cacheRead:"#7c3aed",cacheCreation:"#e11d48",latency:"#0891b2"};function k(s,t,a){return s==null?"-":`${s.toLocaleString(void 0,a)} ${t}`}function U(s){if(s==null)return"-";if(s<1024)return`${s} B`;const t=["KB","MB","GB","TB"];let a=s/1024,r=0;for(;a>=1024&&r<t.length-1;)a/=1024,r+=1;return`${a.toFixed(a>=100?0:a>=10?1:2)} ${t[r]}`}function re(s){if(s==null)return"-";const t=s<1?0:s;return t<1024?`${t.toLocaleString(void 0,{maximumFractionDigits:t>=100?0:t>=10?1:2})} B/s`:`${U(t)}/s`}function at(s){return s==null?"-":`${s.toLocaleString(void 0,{maximumFractionDigits:s>=10?0:1})}%`}function rt(){return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx("div",{className:"h-20 animate-pulse rounded-xl bg-card shadow-[var(--surface-shadow)]"}),e.jsx("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4",children:Array.from({length:12}).map((s,t)=>e.jsx(Xe,{},t))}),e.jsx("div",{className:"grid gap-6 lg:grid-cols-2",children:Array.from({length:4}).map((s,t)=>e.jsx(et,{},t))}),e.jsx("div",{className:"rounded-xl bg-card shadow-[var(--surface-shadow)]",children:e.jsx("table",{className:"w-full",children:e.jsx("tbody",{children:Array.from({length:5}).map((s,t)=>e.jsx(tt,{columns:6},t))})})})]})}function ot({selectedEndpointLabel:s,status:t,todayRequests:a}){const{t:r}=w();return e.jsxs("div",{className:"flex flex-col gap-4 rounded-xl bg-card p-6 shadow-[var(--surface-shadow)] sm:flex-row sm:items-center sm:justify-between",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("div",{className:"flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10",children:e.jsx(Re,{className:"h-5 w-5 text-primary","aria-hidden":"true"})}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{className:"text-lg font-semibold text-foreground",children:s}),e.jsx(C,{variant:"success",children:r("dashboard.status.listeningLabel")})]}),e.jsxs("p",{className:"mt-0.5 text-sm text-muted-foreground",children:[(t==null?void 0:t.host)??"0.0.0.0",":",(t==null?void 0:t.port)??"-",e.jsx("span",{className:"mx-2 text-border",children:"·"}),r("dashboard.labels.todayRequests"),": ",a.toLocaleString(),e.jsx("span",{className:"mx-2 text-border",children:"·"}),r("dashboard.labels.providers"),": ",((t==null?void 0:t.providers)??0).toLocaleString()]})]})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3 text-sm text-muted-foreground",children:[e.jsxs("span",{children:[r("dashboard.labels.activeClientAddresses"),": ",e.jsx("strong",{className:"text-foreground",children:((t==null?void 0:t.activeClientAddresses)??0).toLocaleString()})]}),e.jsx("span",{className:"text-border",children:"·"}),e.jsxs("span",{children:[r("dashboard.labels.activeClientSessions"),": ",e.jsx("strong",{className:"text-foreground",children:((t==null?void 0:t.activeClientSessions)??0).toLocaleString()})]})]})]})}function nt({dbSizeDisplay:s,memoryDisplay:t,overview:a,status:r}){const{t:o}=w(),c=[{icon:e.jsx(ke,{className:"h-4 w-4"}),label:o("dashboard.labels.activeRequests"),value:((r==null?void 0:r.activeRequests)??0).toLocaleString(),testId:"dashboard-spotlight-value-active"},{icon:e.jsx(Q,{className:"h-4 w-4"}),label:o("dashboard.labels.requestsPerMinute"),value:((r==null?void 0:r.requestsPerMinute)??0).toLocaleString(),testId:"dashboard-spotlight-value-rpm"},{icon:e.jsx(Pe,{className:"h-4 w-4"}),label:o("dashboard.labels.outputTokensPerMinute"),value:((r==null?void 0:r.outputTokensPerMinute)??0).toLocaleString(),testId:"dashboard-spotlight-value-tpm"},{icon:e.jsx(qe,{className:"h-4 w-4"}),label:o("dashboard.labels.cpu"),value:at(r==null?void 0:r.cpuUsagePercent),testId:"dashboard-spotlight-value-cpu"}],d=[{icon:e.jsx(Q,{className:"h-4 w-4"}),label:o("dashboard.cards.todayRequests"),value:((a==null?void 0:a.today.requests)??0).toLocaleString(),suffix:o("common.units.request")},{icon:e.jsx(Me,{className:"h-4 w-4"}),label:o("dashboard.cards.todayInput"),value:((a==null?void 0:a.today.inputTokens)??0).toLocaleString(),suffix:o("common.units.token")},{icon:e.jsx(G,{className:"h-4 w-4"}),label:o("dashboard.cards.todayOutput"),value:((a==null?void 0:a.today.outputTokens)??0).toLocaleString(),suffix:o("common.units.token")},{icon:e.jsx(Ae,{className:"h-4 w-4"}),label:o("dashboard.cards.avgLatency"),value:k((a==null?void 0:a.today.avgLatencyMs)??0,o("common.units.ms"))},{icon:e.jsx(_e,{className:"h-4 w-4"}),label:o("dashboard.labels.networkIngress"),value:re(r==null?void 0:r.networkIngressBytesPerSecond),testId:"dashboard-spotlight-value-ingress"},{icon:e.jsx(De,{className:"h-4 w-4"}),label:o("dashboard.labels.networkEgress"),value:re(r==null?void 0:r.networkEgressBytesPerSecond),testId:"dashboard-spotlight-value-egress"},{icon:e.jsx(ne,{className:"h-4 w-4"}),label:o("dashboard.labels.database"),value:s,testId:"dashboard-spotlight-value-database"},{icon:e.jsx(Be,{className:"h-4 w-4"}),label:o("dashboard.labels.memory"),value:t,testId:"dashboard-spotlight-value-memory"}];return e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"grid gap-3 md:grid-cols-2 xl:grid-cols-5",children:c.map((n,i)=>e.jsx(oe,{className:i===0?"md:col-span-2 xl:col-span-2":void 0,featured:i===0,icon:n.icon,label:n.label,value:n.value,valueTestId:n.testId},n.label))}),e.jsx("div",{className:"grid gap-2.5 sm:grid-cols-2 lg:grid-cols-4",children:d.map(n=>e.jsx(oe,{compact:!0,icon:n.icon,label:n.label,suffix:n.suffix,value:n.value,valueTestId:n.testId},n.label))})]})}function it({busiestDay:s,fastestTtftModel:t,topModel:a,totalRequestsInRange:r}){const{t:o}=w();return e.jsxs("div",{className:"grid gap-3 lg:grid-cols-[1.4fr_repeat(3,minmax(0,1fr))]",children:[e.jsx(_,{featured:!0,label:o("dashboard.insights.totalRequests"),value:r.toLocaleString(),hint:o("dashboard.insights.totalRequestsHint")}),e.jsx(_,{label:o("dashboard.insights.busiestDay"),value:s?s.date:"-",hint:s?o("dashboard.insights.busiestDayHint",{value:s.requestCount.toLocaleString()}):o("common.noData")}),e.jsx(_,{label:o("dashboard.insights.topModel"),value:a?`${a.provider}/${a.model}`:"-",hint:a?o("dashboard.insights.topModelHint",{value:a.requests.toLocaleString()}):o("common.noData")}),e.jsx(_,{label:o("dashboard.insights.fastestTtft"),value:t?`${t.provider}/${t.model}`:"-",hint:t?k(t.avgTtftMs,o("common.units.ms")):o("common.noData")})]})}function lt({endpointCount:s,providerCount:t,selectedEndpointLabel:a}){const r=[{title:"先配置 Provider",description:t>0?`当前已检测到 ${t} 个 Provider,可直接继续下一步。`:"先在模型供应商里接入至少 1 个上游模型服务。",href:"/models",cta:"去模型供应商",tone:"from-indigo-100 to-cyan-100"},{title:"确认默认路由入口",description:s>0?`当前已有 ${s} 个自定义端点,可继续检查默认映射是否合理。`:"把一个端点或默认路由配置清楚,后续客户端就能稳定接入。",href:"/routing",cta:"去路由管理",tone:"from-violet-100 to-fuchsia-100"},{title:"发起第一条真实请求",description:"创建 API Key,然后从常用客户端打进来一条请求,让日志、路由和延迟开始有数据。",href:"/api-keys",cta:"去 API 密钥",tone:"from-emerald-100 to-cyan-100"}];return e.jsxs("div",{className:"grid gap-4 xl:grid-cols-[minmax(0,1.2fr)_minmax(300px,0.8fr)]",children:[e.jsx(F,{className:"overflow-hidden border-white/80 bg-[linear-gradient(135deg,rgba(255,255,255,0.98),hsl(var(--primary)/0.08),rgba(236,253,245,0.8))] shadow-[0_22px_56px_-40px_rgba(15,23,42,0.24)]",children:e.jsxs($,{className:"space-y-5 pt-5",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"inline-flex items-center rounded-full bg-primary/10 px-3 py-1 text-[11px] font-semibold uppercase tracking-[0.16em] text-primary",children:"Cold Start Guide"}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold text-foreground",children:"当前还是冷启动状态,这是正常的"}),e.jsx("p",{className:"mt-1.5 text-sm leading-6 text-muted-foreground",children:"这个仪表盘会在第一条真实请求进来后明显更有价值。现在最适合做的是把 Provider、路由和 API Key 三件事顺次走通。"})]})]}),e.jsx("div",{className:"grid gap-3 lg:grid-cols-3",children:r.map((o,c)=>e.jsxs("div",{className:"rounded-[1.1rem] border border-white/70 bg-card/88 p-4 shadow-[0_16px_40px_-34px_rgba(15,23,42,0.18)]",children:[e.jsxs("div",{className:R("flex h-10 w-10 items-center justify-center rounded-2xl bg-gradient-to-br text-sm font-semibold text-primary",o.tone),children:["0",c+1]}),e.jsx("h4",{className:"mt-3 text-sm font-semibold text-foreground",children:o.title}),e.jsx("p",{className:"mt-1.5 text-xs leading-6 text-muted-foreground",children:o.description}),e.jsx(B,{asChild:!0,variant:"ghost",size:"sm",className:"mt-3 h-8 rounded-full px-0 text-primary hover:bg-transparent hover:text-primary/80",children:e.jsx(Ze,{to:o.href,children:o.cta})})]},o.title))})]})}),e.jsx(F,{className:"border-white/80 bg-card/96 shadow-[0_20px_48px_-40px_rgba(15,23,42,0.24)]",children:e.jsxs($,{className:"space-y-4 pt-5",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[11px] font-semibold uppercase tracking-[0.16em] text-muted-foreground/80",children:"Workspace Snapshot"}),e.jsx("h3",{className:"mt-2 text-base font-semibold text-foreground",children:a}),e.jsx("p",{className:"mt-1 text-xs leading-6 text-muted-foreground",children:"等第一批流量进来后,这里会逐步展示趋势、模型表现和最近请求。"})]}),e.jsx("div",{className:"grid gap-3 sm:grid-cols-3 xl:grid-cols-1",children:[{label:"已配置 Provider",value:String(t)},{label:"自定义端点",value:String(s)},{label:"建议下一步",value:"发起请求"}].map(o=>e.jsxs("div",{className:"rounded-[1rem] bg-secondary/45 px-4 py-3 ring-1 ring-white/70",children:[e.jsx("div",{className:"text-[11px] font-medium text-muted-foreground",children:o.label}),e.jsx("div",{className:"mt-1 text-lg font-semibold text-foreground",children:o.value})]},o.label))}),e.jsx("div",{className:"rounded-[1rem] border border-dashed border-border/45 bg-secondary/35 px-4 py-3",children:e.jsxs("p",{className:"text-xs leading-6 text-muted-foreground",children:["如果你还没确定从哪一步开始,优先去 ",e.jsx("span",{className:"font-medium text-foreground",children:"API 密钥"})," 创建一个客户端专用 key,再从常用工具发起一条最小请求。"]})})]})})]})}function dt({dailyEmpty:s,dailyOption:t,dailyPending:a,models:r,modelRequestsOption:o,modelUsagePending:c,ttftOption:d,tpotOption:n}){const{t:i}=w();return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[e.jsx(D,{title:i("dashboard.charts.requestsTitle"),description:i("dashboard.charts.requestsDesc"),loading:a,option:t,empty:s,emptyText:i("dashboard.charts.empty")}),e.jsx(D,{title:i("dashboard.charts.modelTitle"),description:i("dashboard.charts.modelDesc"),loading:c,option:o,empty:!r.length,emptyText:i("dashboard.charts.empty")})]}),e.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[e.jsx(D,{title:i("dashboard.charts.ttftTitle"),description:i("dashboard.charts.ttftDesc"),loading:c,option:d,empty:!r.some(m=>m.avgTtftMs!=null&&m.avgTtftMs>0),emptyText:i("dashboard.charts.ttftEmpty")}),e.jsx(D,{title:i("dashboard.charts.tpotTitle"),description:i("dashboard.charts.tpotDesc"),loading:c,option:n,empty:!r.some(m=>m.avgTpotMs!=null&&m.avgTpotMs>0),emptyText:i("dashboard.charts.tpotEmpty")})]})]})}function ct({models:s,loading:t}){const{t:a}=w();return e.jsx(ce,{title:a("dashboard.modelTable.title"),description:a("dashboard.modelTable.description"),children:t?e.jsx(V,{compact:!0,label:a("common.loadingShort")}):s.length===0?e.jsx(z,{compact:!0,icon:e.jsx(G,{className:"h-5 w-5","aria-hidden":"true"}),title:a("dashboard.modelTable.empty")}):e.jsx("div",{className:"overflow-auto",children:e.jsxs(ie,{children:[e.jsx(le,{children:e.jsxs(O,{children:[e.jsx(j,{children:a("dashboard.modelTable.columns.model")}),e.jsx(j,{className:"text-right",children:a("dashboard.modelTable.columns.requests")}),e.jsx(j,{className:"text-right",children:a("dashboard.modelTable.columns.latency")}),e.jsx(j,{className:"text-right",children:a("dashboard.modelTable.columns.ttft")}),e.jsx(j,{className:"text-right",children:a("dashboard.modelTable.columns.tpot")})]})}),e.jsx(de,{children:s.map(r=>e.jsxs(O,{children:[e.jsx(y,{children:e.jsxs("div",{className:"flex flex-col",children:[e.jsx("span",{className:"font-medium",children:r.provider}),e.jsx("span",{className:"text-xs text-muted-foreground",children:r.model})]})}),e.jsx(y,{className:"text-right font-medium",children:r.requests.toLocaleString()}),e.jsx(y,{className:"text-right",children:k(r.avgLatencyMs,a("common.units.ms"))}),e.jsx(y,{className:"text-right",children:k(r.avgTtftMs,a("common.units.ms"))}),e.jsx(y,{className:"text-right",children:k(r.avgTpotMs,a("common.units.msPerToken"),{maximumFractionDigits:2})})]},`${r.provider}/${r.model}`))})]})})})}function mt({records:s,loading:t}){const{t:a}=w(),r=s.map(n=>ae(n,a)),o=r.filter(n=>n.tone==="success").length,c=r.filter(n=>n.tone==="error").length,d=r.filter(n=>n.tone==="pending").length;return e.jsx(ce,{title:a("dashboard.recent.title"),description:a("dashboard.recent.subtitle",{count:5}),actions:s.length>0?e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(C,{variant:"secondary",children:s.length}),e.jsxs(C,{variant:"success",children:[a("common.status.success"),": ",o]}),e.jsxs(C,{variant:"outline",className:"border-destructive/30 bg-destructive/10 text-destructive",children:[a("common.status.error"),": ",c]}),d>0?e.jsxs(C,{variant:"warning",children:[a("common.status.pending"),": ",d]}):null]}):null,children:t?e.jsx(V,{compact:!0,label:a("dashboard.recent.loading")}):s.length===0?e.jsx(z,{compact:!0,icon:e.jsx(Q,{className:"h-5 w-5","aria-hidden":"true"}),title:a("dashboard.recent.empty")}):e.jsx("div",{className:"overflow-auto",children:e.jsxs(ie,{children:[e.jsx(le,{children:e.jsxs(O,{children:[e.jsx(j,{children:a("dashboard.recent.columns.time")}),e.jsx(j,{children:a("dashboard.recent.columns.endpoint")}),e.jsx(j,{children:a("dashboard.recent.columns.provider")}),e.jsx(j,{children:a("dashboard.recent.columns.route")}),e.jsx(j,{className:"text-right",children:a("dashboard.recent.columns.latency")}),e.jsx(j,{children:a("dashboard.recent.columns.status")})]})}),e.jsx(de,{children:s.map(n=>{const i=ae(n,a);return e.jsxs(O,{children:[e.jsx(y,{children:e.jsxs("div",{className:"flex flex-col",children:[e.jsx("span",{className:"text-xs font-medium",children:new Date(n.timestamp).toLocaleString()}),e.jsxs("span",{className:"text-[11px] text-muted-foreground",children:["#",n.id]})]})}),e.jsx(y,{children:e.jsx(C,{variant:"outline",className:"text-[11px]",children:n.endpoint==="anthropic"?a("logs.endpointAnthropic"):n.endpoint==="openai"?a("logs.endpointOpenAI"):n.endpoint})}),e.jsx(y,{children:e.jsxs("div",{className:"flex flex-col",children:[e.jsx("span",{className:"font-medium",children:n.provider}),e.jsx("span",{className:"text-[11px] text-muted-foreground",children:n.stream?"stream":"sync"})]})}),e.jsx(y,{children:e.jsxs("div",{className:"flex flex-col gap-1 text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1 text-muted-foreground",children:[e.jsx("span",{children:n.client_model??a("dashboard.recent.routePlaceholder")}),e.jsx("span",{children:"->"}),e.jsx("span",{className:"font-medium text-foreground",children:n.model})]}),n.error?e.jsx("span",{className:"truncate text-destructive",children:n.error}):null]})}),e.jsx(y,{className:"text-right font-medium",children:k(n.latency_ms,a("common.units.ms"))}),e.jsx(y,{children:e.jsx(C,{variant:i.variant,className:"min-w-14 justify-center",children:i.label})})]},n.id)})})]})})})}function oe({className:s,compact:t,featured:a,icon:r,label:o,value:c,suffix:d,valueTestId:n}){return e.jsxs("div",{className:R("group flex flex-col justify-between rounded-[1.15rem] border border-white/70 bg-card/95 shadow-[0_18px_42px_-36px_rgba(15,23,42,0.24)] transition-all hover:-translate-y-0.5 hover:shadow-[0_24px_48px_-38px_rgba(59,130,246,0.2)]",a?"bg-[linear-gradient(135deg,hsl(var(--primary)/0.1),rgba(255,255,255,0.95)_46%,rgba(236,253,245,0.74))] p-5":t?"p-3.5":"p-5",s),children:[e.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[e.jsx("span",{className:R("inline-flex h-7 w-7 items-center justify-center rounded-lg bg-primary/10 text-primary",t&&"h-6 w-6 rounded-md"),children:r}),e.jsx("span",{children:o})]}),e.jsxs("p",{className:R("metric-number mt-3 font-semibold tracking-tight text-foreground",a?"text-3xl":t?"text-lg":"text-2xl"),"data-testid":n,children:[c,d?e.jsx("span",{className:"ml-1 text-sm font-normal text-muted-foreground",children:d}):null]})]})}function _({featured:s,label:t,value:a,hint:r}){return e.jsx(F,{className:s?"overflow-hidden bg-[linear-gradient(135deg,rgba(255,255,255,0.98),hsl(var(--primary)/0.08))]":void 0,children:e.jsxs($,{className:R("pt-4",s&&"pb-4"),children:[e.jsx("p",{className:"text-[11px] font-medium uppercase tracking-wider text-muted-foreground",children:t}),e.jsx("p",{className:R("mt-2 line-clamp-1 font-semibold text-foreground",s?"metric-number text-2xl tracking-tight":"text-base"),children:a}),e.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:r})]})})}function D({description:s,empty:t,emptyText:a,loading:r,option:o,title:c}){const{t:d}=w();return e.jsx(F,{children:e.jsxs($,{className:"space-y-4 pt-5",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-semibold",children:c}),e.jsx("p",{className:"mt-0.5 text-xs text-muted-foreground/70",children:s})]}),r?e.jsx(V,{compact:!0,className:"min-h-[220px]",label:d("common.loadingShort")}):t?e.jsx(z,{compact:!0,className:"min-h-[188px] rounded-[1rem] border border-dashed border-border/45 bg-secondary/35",icon:e.jsx(G,{className:"h-5 w-5","aria-hidden":"true"}),title:a??d("dashboard.charts.empty"),description:s}):e.jsx("div",{className:"pt-2",children:e.jsx(Je,{echarts:st,option:o,className:"h-[40vh] min-h-[280px] max-h-[420px]",notMerge:!0,lazyUpdate:!0})})]})})}function ht(){var K,W,Y,Z,J,X,ee,te;const{t:s}=w(),{pushToast:t}=Ge(),[a,r]=ze(Ue.dashboard.endpointFilter,"all"),[o,c]=u.useState(!1),d=a==="all"?void 0:a,n=L(I.customEndpoints.all(),{url:"/api/custom-endpoints",method:"GET"},{refetchInterval:H,refetchIntervalInBackground:!0}),i=L(I.stats.overview(a),{url:"/api/stats/overview",method:"GET",params:d?{endpoint:d}:void 0},{refetchInterval:A,refetchIntervalInBackground:!0}),m=L(I.stats.daily(14,a),{url:"/api/stats/daily",method:"GET",params:{days:14,...d?{endpoint:d}:{}}},{refetchInterval:H,refetchIntervalInBackground:!0}),v=L(I.stats.model(7,6,a),{url:"/api/stats/model",method:"GET",params:{days:7,limit:6,...d?{endpoint:d}:{}}},{refetchInterval:H,refetchIntervalInBackground:!0}),g=L(I.status.byEndpoint(a),{url:"/api/status",method:"GET",params:d?{endpoint:d}:void 0},{refetchInterval:A,refetchIntervalInBackground:!0}),x=L(I.db.info(),{url:"/api/db/info",method:"GET"},{refetchInterval:A,refetchIntervalInBackground:!0}),N=L(I.logs.recent(a),{url:"/api/logs",method:"GET",params:{limit:5,...d?{endpoint:d}:{}}},{refetchInterval:A,refetchIntervalInBackground:!0});u.useEffect(()=>{i.isError&&i.error&&t({title:s("dashboard.toast.overviewError"),description:i.error.message,variant:"error"})},[i.error,i.isError,t,s]),u.useEffect(()=>{m.isError&&m.error&&t({title:s("dashboard.toast.dailyError"),description:m.error.message,variant:"error"})},[m.error,m.isError,t,s]),u.useEffect(()=>{v.isError&&v.error&&t({title:s("dashboard.toast.modelError"),description:v.error.message,variant:"error"})},[v.error,v.isError,t,s]),u.useEffect(()=>{g.isError&&g.error&&t({title:s("dashboard.toast.statusError"),description:g.error.message,variant:"error"})},[g.error,g.isError,t,s]),u.useEffect(()=>{x.isError&&x.error&&t({title:s("dashboard.toast.dbError"),description:x.error.message,variant:"error"})},[x.error,x.isError,t,s]),u.useEffect(()=>{N.isError&&N.error&&t({title:s("dashboard.toast.recentError"),description:N.error.message,variant:"error"})},[N.error,N.isError,t,s]);const me=u.useCallback(async()=>{await Promise.all([n.refetch(),i.refetch(),m.refetch(),v.refetch(),g.refetch(),x.refetch(),N.refetch()])},[n,x,m,N,v,i,g]),he=u.useCallback(async()=>{if(!o){c(!0);try{await He.post("/api/db/compact"),await x.refetch(),t({title:s("dashboard.toast.compactSuccess.title"),description:s("dashboard.toast.compactSuccess.desc"),variant:"success"})}catch(l){const h=Qe(l);t({title:s("dashboard.toast.compactError.title"),description:h.message,variant:"error"})}finally{c(!1)}}},[o,x,t,s]),pe=i.data,S=m.data??[],p=v.data??[],xe=g.data,E=x.data,ue=((K=N.data)==null?void 0:K.items)??[],ge=a==="all"?s("dashboard.filters.endpointAll"):a==="anthropic"?s("dashboard.filters.endpointAnthropic"):a==="openai"?s("dashboard.filters.endpointOpenAI"):((Z=(Y=(W=n.data)==null?void 0:W.endpoints)==null?void 0:Y.find(l=>l.id===a))==null?void 0:Z.label)||a,be=S.reduce((l,h)=>l+h.requestCount,0),fe=S.reduce((l,h)=>!l||h.requestCount>l.requestCount?h:l,null),je=p[0],ye=p.filter(l=>l.avgTtftMs!=null&&l.avgTtftMs>0).sort((l,h)=>(l.avgTtftMs??Number.POSITIVE_INFINITY)-(h.avgTtftMs??Number.POSITIVE_INFINITY))[0],ve=n.isFetching||i.isFetching||m.isFetching||v.isFetching||g.isFetching||x.isFetching||N.isFetching,Ne=i.isPending||g.isPending||x.isPending,Se=((J=i.error)==null?void 0:J.message)??((X=g.error)==null?void 0:X.message)??((ee=x.error)==null?void 0:ee.message)??null,Te=E?U(E.totalBytes??E.sizeBytes):"-",we=U(E==null?void 0:E.memoryRssBytes),Ee=u.useMemo(()=>{const l=S.map(f=>f.date),h=s("dashboard.charts.barRequests"),P=s("dashboard.charts.lineInput"),q=s("dashboard.charts.lineOutput"),b=s("dashboard.charts.lineCacheRead"),se=s("dashboard.charts.lineCacheCreation");return{tooltip:{trigger:"axis"},legend:{data:[h,P,q,b,se]},grid:{left:56,right:28,top:56,bottom:54},xAxis:{type:"category",data:l},yAxis:{type:"value"},series:[{name:h,type:"bar",data:S.map(f=>f.requestCount),itemStyle:{color:T.requests,borderRadius:[6,6,0,0]}},{name:P,type:"line",smooth:!0,data:S.map(f=>f.inputTokens),itemStyle:{color:T.input},lineStyle:{width:2}},{name:q,type:"line",smooth:!0,data:S.map(f=>f.outputTokens),itemStyle:{color:T.output},lineStyle:{width:2}},{name:b,type:"line",smooth:!0,data:S.map(f=>f.cacheReadTokens),itemStyle:{color:T.cacheRead},lineStyle:{width:2}},{name:se,type:"line",smooth:!0,data:S.map(f=>f.cacheCreationTokens),itemStyle:{color:T.cacheCreation},lineStyle:{width:2}}]}},[S,s]),Ie=u.useMemo(()=>{const l=p.map(b=>`${b.provider}/${b.model}`),h=s("dashboard.charts.barRequests"),P=s("dashboard.charts.lineInput"),q=s("dashboard.charts.lineOutput");return{tooltip:{trigger:"axis"},legend:{data:[h,P,q]},grid:{left:72,right:52,top:56,bottom:96},xAxis:{type:"category",data:l,axisLabel:{rotate:28}},yAxis:[{type:"value",name:h},{type:"value",name:s("dashboard.charts.axisTokens"),position:"right"}],series:[{name:h,type:"bar",data:p.map(b=>b.requests),itemStyle:{color:T.requests,borderRadius:[6,6,0,0]}},{name:P,type:"line",yAxisIndex:1,smooth:!0,data:p.map(b=>b.inputTokens??0),itemStyle:{color:T.input}},{name:q,type:"line",yAxisIndex:1,smooth:!0,data:p.map(b=>b.outputTokens??0),itemStyle:{color:T.output}}]}},[p,s]),Le=u.useMemo(()=>({tooltip:{trigger:"axis"},grid:{left:72,right:40,top:56,bottom:96},xAxis:{type:"category",data:p.map(l=>`${l.provider}/${l.model}`),axisLabel:{rotate:28}},yAxis:{type:"value",name:s("dashboard.charts.ttftAxis")},series:[{name:s("dashboard.charts.ttftLabel"),type:"bar",data:p.map(l=>l.avgTtftMs??0),itemStyle:{color:T.latency,borderRadius:[6,6,0,0]}}]}),[p,s]),Ce=u.useMemo(()=>({tooltip:{trigger:"axis"},grid:{left:72,right:40,top:56,bottom:96},xAxis:{type:"category",data:p.map(l=>`${l.provider}/${l.model}`),axisLabel:{rotate:28}},yAxis:{type:"value",name:s("dashboard.charts.tpotAxis")},series:[{name:s("dashboard.charts.tpotLabel"),type:"bar",data:p.map(l=>l.avgTpotMs??0),itemStyle:{color:T.output,borderRadius:[6,6,0,0]}}]}),[p,s]);return{compacting:o,customEndpoints:((te=n.data)==null?void 0:te.endpoints)??[],daily:S,dailyOption:Ee,dailyPending:m.isPending,dbInfo:E,dbSizeDisplay:Te,endpointFilter:a,fastestTtftModel:ye,handleCompact:he,handleRefresh:me,bootstrapError:Se,isBootstrapping:Ne,isRefreshing:ve,latestLogsPending:N.isPending,memoryDisplay:we,modelRequestsOption:Ie,modelUsagePending:v.isPending,models:p,overview:pe,recentLogs:ue,selectedEndpointLabel:ge,setEndpointFilter:r,status:xe,topModel:je,totalRequestsInRange:be,busiestDay:fe,ttftOption:Le,tpotOption:Ce}}function qt(){var r,o;const{t:s}=w(),t=ht(),a=t.recentLogs.length===0||t.models.length===0;return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx($e,{icon:e.jsx(G,{className:"h-5 w-5","aria-hidden":"true"}),title:s("nav.dashboard"),description:s("dashboard.description"),badge:t.selectedEndpointLabel,eyebrow:"Operations",breadcrumb:"Gateway / Dashboard",helper:s("dashboard.charts.requestsDesc"),actions:e.jsxs("div",{className:"flex w-full flex-col gap-2 sm:w-auto sm:flex-row sm:flex-wrap sm:items-center sm:justify-end",children:[e.jsxs("div",{className:"text-xs text-muted-foreground/60",children:[s("dashboard.filters.endpoint")," · ",t.selectedEndpointLabel]}),e.jsxs(Ve,{value:t.endpointFilter,onValueChange:t.setEndpointFilter,children:[e.jsx(Ke,{className:"w-full sm:w-[168px]",children:e.jsx(We,{})}),e.jsxs(Ye,{children:[e.jsx(M,{value:"all",children:s("dashboard.filters.endpointAll")}),e.jsx(M,{value:"anthropic",children:s("dashboard.filters.endpointAnthropic")}),e.jsx(M,{value:"openai",children:s("dashboard.filters.endpointOpenAI")}),t.customEndpoints.map(c=>e.jsx(M,{value:c.id,children:c.label||c.id},c.id))]})]}),e.jsxs(B,{variant:"outline",size:"sm",onClick:()=>void t.handleRefresh(),disabled:t.isRefreshing,className:"w-full sm:w-auto",children:[e.jsx(Oe,{className:R("mr-2 h-4 w-4",t.isRefreshing&&"animate-spin"),"aria-hidden":"true"}),t.isRefreshing?s("common.actions.refreshing"):s("common.actions.refresh")]}),e.jsxs(B,{variant:"outline",size:"sm",onClick:()=>void t.handleCompact(),disabled:t.compacting,className:"w-full sm:w-auto",children:[e.jsx(ne,{className:"mr-2 h-4 w-4","aria-hidden":"true"}),t.compacting?s("dashboard.actions.compacting"):s("dashboard.actions.compact")]})]})}),t.isBootstrapping?e.jsx(rt,{}):t.bootstrapError?e.jsx(z,{icon:e.jsx(Fe,{className:"h-5 w-5","aria-hidden":"true"}),tone:"danger",title:s("common.status.error"),description:t.bootstrapError,action:e.jsx(B,{variant:"outline",onClick:()=>void t.handleRefresh(),children:s("common.actions.refresh")})}):e.jsxs(e.Fragment,{children:[e.jsx(ot,{selectedEndpointLabel:t.selectedEndpointLabel,status:t.status,todayRequests:((r=t.overview)==null?void 0:r.today.requests)??0}),a?e.jsx(lt,{endpointCount:t.customEndpoints.length,providerCount:((o=t.status)==null?void 0:o.providers)??0,selectedEndpointLabel:t.selectedEndpointLabel}):null,e.jsx(nt,{dbSizeDisplay:t.dbSizeDisplay,memoryDisplay:t.memoryDisplay,overview:t.overview,status:t.status}),e.jsx(it,{busiestDay:t.busiestDay,fastestTtftModel:t.fastestTtftModel,topModel:t.topModel,totalRequestsInRange:t.totalRequestsInRange}),e.jsx(dt,{dailyEmpty:!t.daily.length,dailyOption:t.dailyOption,dailyPending:t.dailyPending,models:t.models,modelRequestsOption:t.modelRequestsOption,modelUsagePending:t.modelUsagePending,ttftOption:t.ttftOption,tpotOption:t.tpotOption}),e.jsx(ct,{models:t.models,loading:t.modelUsagePending}),e.jsx(mt,{records:t.recentLogs,loading:t.latestLogsPending})]})]})}export{qt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const o="0.8.10",s={version:o};export{s as p};
|
|
File without changes
|