1import{j as ne,a as ie,b as oe}from"./Cw-FQSC1.js";import{x as le,f as m,I as A,y as ae,A as o,Y as l,Z as e,_ as v,a9 as d,W as u,a2 as g,$ as p,ag as h,ah as c,a6 as a}from"./DDMDhr6N.js";const de={class:"admin-page image-providers-page"},re={class:"container"},ue={class:"header"},ce=["disabled"],me={class:"section-card"},pe={class:"section-header"},ve={class:"section-body"},ge={class:"provider-model-name"},_e=["title"],fe={key:1,class:"provider-model-chain",title:"ФакÑиÑеÑкий поÑÑдок пÑовайдеÑов Ð´Ð»Ñ ÑекÑÑей наÑÑÑойки"},be={key:2,class:"provider-chain-warn"},he={class:"provider-model-options"},ye=["disabled","onClick","title"],ke=["disabled","onClick","title"],Pe=["disabled","onClick"],$e=["disabled","onClick"],Ce={class:"section-footer"},Re={class:"provider-legend"},ze={class:"section-card"},Se={class:"section-header"},Te={key:0,class:"stats-loading-badge"},Me={key:0,class:"section-body stats-placeholder"},Oe={key:1,class:"section-body stats-placeholder"},Ge={class:"section-body"},Le={class:"stats-table-wrap"},Ne={class:"stats-table"},Ie={class:"num"},xe={class:"num"},Ue={class:"num"},Ae={class:"num"},Be={class:"num"},Fe={class:"section-body period-section"},De={class:"period-tabs"},je=["onClick"],Ee={key:0,class:"stats-empty-period"},Ve={key:1,class:"stats-table-wrap"},Je={class:"stats-table"},Ke={class:"num"},We={class:"num"},Ye={class:"num"},Ze={class:"num"},qe={key:0,class:"section-card"},He={class:"section-header"},Qe={key:0,class:"errors-count-badge"},Xe={key:0,class:"section-body stats-placeholder"},we={class:"section-body"},et={class:"stats-table-wrap"},tt={class:"stats-table"},st={class:"num"},nt={class:"error-count"},it={class:"num"},ot={key:0,class:"fallback-count"},lt={key:1,class:"muted"},at=["title"],dt={class:"num"},rt={key:0,class:"section-body period-section"},ut={class:"stats-table-wrap"},ct={class:"stats-table"},mt={class:"num"},pt={key:0,class:"provider-badge provider-badge--fallback"},vt={key:1,class:"muted"},gt=["title"],_t={class:"num"},ft=le({__name:"image-providers",setup(bt){const R=ne().public.API_BASE_URL,P=m([{id:"google/gemini-3.1-flash-image-preview",label:"Gemini 3.1 Flash"},{id:"google/gemini-3-pro-image-preview",label:"Gemini 3 Pro"},{id:"google/gemini-2.5-flash-image",label:"Gemini 2.5 Flash"},{id:"gpt-image-1.5-plus",label:"GPT Image 1.5 Plus"},{id:"gpt-image-2",label:"GPT Image 2",instances:[{id:"gpt-image-2",label:"GPT Image 2 Low"},{id:"gpt-image-2-medium",label:"GPT Image 2 Medium"},{id:"openai/gpt-image-2",label:"GPT Image 2 (OpenRouter)"}]}]),N=m([]),W=A(()=>N.value.filter(n=>n.name!=="gptproto"));function Y(n){return W.value.filter(t=>t.supportedModels.includes(n))}const Z={gptproto:"mdi:robot-outline",comet:"mdi:star-shooting-outline",ecco:"mdi:flash-outline",fal:"mdi:rocket-launch-outline",poyo:"mdi:fruit-cherries"};function q(n){return Z[n]??"mdi:server-outline"}const f=m({}),b=m(!1),z=m(!1),S=m(!1),y=m(!1),I=m([]),B=m({}),$=m([]),x=m([]),U=m("today"),H=[{key:"today",label:"СегоднÑ"},{key:"yesterday",label:"ÐÑеÑа"},{key:"week",label:"7 дней"},{key:"month",label:"30 дней"}],F=A(()=>B.value[U.value]??[]),Q=A(()=>$.value.reduce((n,t)=>n+Number(t.count||0),0));function D(n){return f.value[n]??"auto"}function j(n){return n.routing?.kind??"image"}function T(n){return n.routing?.effectiveSetting??D(n.id)}function M(n){if(!n)return"";const t=n.chain.map(i=>k(i));return n.openRouterFallback&&t.push("OpenRouter"),t.length?t.join(" â "):"Ð½ÐµÑ Ð´Ð¾ÑÑÑпнÑÑ
пÑовайдеÑов"}function X(n){const t=M(n.routing?.auto);return t?`ÐвÑо â ÑÐµÐºÐ¾Ð¼ÐµÐ½Ð´Ð¾Ð²Ð°Ð½Ð½Ð°Ñ ÑепоÑка: ${t}`:"Ð ÐµÐºÐ¾Ð¼ÐµÐ½Ð´Ð¾Ð²Ð°Ð½Ð½Ð°Ñ ÑепоÑка по ÑÐ¸Ð¿Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸"}function w(n){const t=n.routing;return!t||["auto","openrouter","new_clients_only"].includes(t.effectiveSetting)?!1:!t.effective.chain.includes(t.effectiveSetting)}function O(n){const t=P.value.find(i=>i.id===n);if(t&&(t.instances?.length??0)<=1)return t.label;for(const i of P.value){const s=i.instances?.find(r=>r.id===n);if(s)return s.label}return t?t.label:n}function _(n){if(n==null)return"â";const t=Number(n);return isNaN(t)?"â":t<1e3?`${Math.round(t)} мÑ`:`${(t/1e3).toFixed(1)} Ñ`}function E(n){if(!n)return"â";const t=n instanceof Date?n:new Date(n);if(isNaN(t.getTime()))return"â";const i=Date.now()-t.getTime();return i<6e4?"ÑолÑко ÑÑо":i<36e5?`${Math.floor(i/6e4)} мин назад`:i<864e5?`${Math.floor(i/36e5)} Ñ Ð½Ð°Ð·Ð°Ð´`:i<7*864e5?`${Math.floor(i/864e5)} дн назад`:t.toLocaleDateString("ru-RU",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"})}const V={gptproto:"GPTProto",ecco:"EccoAPI",ecco_videos:"Ðкко (видео)",openrouter:"OpenRouter",openrouter_images:"OpenRouter Images",comet:"Comet",comet_videos:"Comet (видео)",comet_music:"Comet (мÑзÑка)",unknown:"ÐеизвеÑÑно"};function k(n){if(!n)return V.unknown;const t=N.value.find(i=>i.name===n);return t?t.label:V[n]??n}const ee=["gptproto","ecco","openrouter","comet","fal","poyo"];function G(n){return n?ee.includes(n)?n:"other":"unknown"}async function J(){try{const n=await $fetch("/api/admin/image-providers/meta",{baseURL:R,credentials:"include"});n.providers?.length&&(N.value=n.providers),n.models?.length&&(P.value=n.models)}catch{}}async function te(){try{const n=await $fetch("/api/admin/settings",{baseURL:R,credentials:"include"});if(n.image_providers)try{f.value=JSON.parse(n.image_providers)}catch{f.value={}}}catch{}}async function se(){S.value=!0;try{const n=await $fetch("/api/admin/image-stats",{baseURL:R,credentials:"include"});
1I.value=n.overall??[],B.value=n.periods??{},$.value=n.errors?.summary??[],x.value=n.errors?.recent??[],y.value=!0}catch{y.value=!0}finally{S.value=!1}}async function L(n,t){if(!(D(n)===t||b.value)){b.value=!0;try{const i={...f.value,[n]:t},s=P.value.find(C=>C.id===n);for(const C of s?.instances??[])C.id!==n&&delete i[C.id];const r=await $fetch("/api/admin/settings",{method:"PUT",baseURL:R,credentials:"include",body:{key:"image_providers",value:JSON.stringify(i)}});if(r.image_providers)try{f.value=JSON.parse(r.image_providers)}catch{f.value=i}else f.value=i;await J()}catch{}finally{b.value=!1}}}async function K(){z.value=!0,await Promise.all([J(),te(),se()]),z.value=!1}return ae(()=>{K()}),(n,t)=>{const i=ie;return l(),o("div",de,[e("div",re,[e("div",ue,[t[0]||(t[0]=e("h1",{class:"gradient-text"},"ÐÑовайдеÑÑ Ð¸Ð·Ð¾Ð±Ñажений",-1)),e("button",{class:"refresh-btn",onClick:K,disabled:d(z),title:"ÐбновиÑÑ"},[u(i,{name:"mdi:refresh",size:"20",class:g({spinning:d(z)})},null,8,["class"])],8,ce)]),e("div",me,[e("div",pe,[u(i,{name:"mdi:tune-variant",size:"20"}),t[1]||(t[1]=e("span",null,"ÐаÑÑÑÑÑизаÑÐ¸Ñ Ð¿Ð¾ моделÑм",-1))]),e("div",ve,[(l(!0),o(p,null,h(d(P),s=>(l(),o("div",{key:s.id,class:"provider-model-row"},[e("div",ge,[e("code",null,a(s.label),1),(s.instances?.length??0)>1?(l(),o("div",{key:0,class:"provider-model-instances",title:s.instances.map(r=>r.id).join(", ")}," одна моделÑ, "+a(s.instances.length)+" инÑÑанÑа: "+a(s.instances.map(r=>r.label.replace(/^GPT Image 2\s*/,"")||"база").join(" · ")),9,_e)):v("",!0),s.routing?(l(),o("div",fe,[s.routing.newClients?(l(),o(p,{key:0},[c(" новÑм: "+a(M(s.routing.newClients))+" · оÑÑалÑнÑм: "+a(M(s.routing.effective)),1)],64)):(l(),o(p,{key:1},[c(a(M(s.routing.effective)),1)],64))])):v("",!0),w(s)?(l(),o("div",be,[u(i,{name:"mdi:alert-outline",size:"12"}),t[2]||(t[2]=c(" вÑбÑаннÑй пÑÐ¾Ð²Ð°Ð¹Ð´ÐµÑ Ð½Ðµ ÑÐ¼ÐµÐµÑ ÑÑÑ Ð¼Ð¾Ð´ÐµÐ»Ñ â ÑабоÑÐ°ÐµÑ ÑепоÑка по ÑмолÑÐ°Ð½Ð¸Ñ ",-1))])):v("",!0)]),e("div",he,[e("button",{class:g(["provider-pill",{active:T(s)==="auto"}]),disabled:d(b),onClick:r=>L(s.id,"auto"),title:X(s)},[u(i,{name:"mdi:autorenew",size:"14"}),t[3]||(t[3]=c(" ÐвÑо ",-1))],10,ye),(l(!0),o(p,null,h(Y(s.id),r=>(l(),o("button",{key:r.name,class:g(["provider-pill",{active:T(s)===r.name,unconfigured:!r.configured}]),disabled:d(b)||!r.configured,onClick:C=>L(s.id,r.name),title:r.configured?`${r.label} â пеÑвÑм в ÑепоÑке, далÑÑе ÑоллбÑки по ÑÐ¸Ð¿Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸`:`${r.label} â Ð½ÐµÑ API-клÑÑа, пÑÐ¾Ð²Ð°Ð¹Ð´ÐµÑ Ð½Ðµ ÑконÑигÑÑиÑован`},[u(i,{name:q(r.name),size:"14"},null,8,["name"]),c(" "+a(r.label),1)],10,ke))),128)),j(s)==="image"?(l(),o("button",{key:0,class:g(["provider-pill",{active:T(s)==="new_clients_only"}]),disabled:d(b),onClick:r=>L(s.id,"new_clients_only"),title:"GPTProto ÑолÑко Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñов Ñ 1 оплаÑой, оÑÑалÑнÑм OpenRouter"},[u(i,{name:"mdi:account-plus-outline",size:"14"}),t[4]||(t[4]=c(" ÐовÑе ",-1))],10,Pe)):v("",!0),j(s)==="image"?(l(),o("button",{key:1,class:g(["provider-pill",{active:T(s)==="openrouter"}]),disabled:d(b),onClick:r=>L(s.id,"openrouter"),title:"ÐапÑÑмÑÑ ÑеÑез OpenRouter"},[u(i,{name:"mdi:cloud-outline",size:"14"}),t[5]||(t[5]=c(" OpenRouter ",-1))],10,$e)):v("",!0)])]))),128))]),e("div",Ce,[e("div",Re,[e("span",null,[u(i,{name:"mdi:autorenew",size:"13"}),t[6]||(t[6]=c()),t[7]||(t[7]=e("b",null,"ÐвÑо",-1)),t[8]||(t[8]=c(" â ÑекомендованнÑй поÑÑдок по ÑÐ¸Ð¿Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸: каÑÑинки â GPTProto â OpenRouter; видео â Comet (видео) â GPTProto â Ðкко (видео); мÑзÑка â Comet (мÑзÑка). ÐÑовайдеÑ, не ÑмеÑÑий моделÑ, из ÑепоÑки вÑпадаеÑ.",-1))]),e("span",null,[u(i,{name:"mdi:server-outline",size:"13"}),t[9]||(t[9]=c()),t[10]||(t[10]=e("b",null,"ÐÑовайдеÑ",-1)),t[11]||(t[11]=c(" â вÑбÑаннÑй идÑÑ Ð¿ÐµÑвÑм, далÑÑе оÑÑалÑÐ½Ð°Ñ ÑепоÑка Ñипа; ÑеÑÑм под моделÑÑ â ÑакÑиÑеÑкий поÑÑдок Ð´Ð»Ñ ÑекÑÑей наÑÑÑойки.",-1))]),e("span",null,[u(i,{name:"mdi:account-plus-outline",size:"13"}),t[12]||(t[12]=c()),t[13]||(t[13]=e("b",null,"ÐовÑе",-1)),t[14]||(t[14]=c(" â ÑолÑко каÑÑинки: GPTProto клиенÑам Ñовно Ñ 1 оплаÑой, оÑÑалÑнÑм OpenRouter.",-1))]),e("span",null,[u(i,{name:"mdi:cloud-outline",size:"13"}
1),t[15]||(t[15]=c()),t[16]||(t[16]=e("b",null,"OpenRouter",-1)),t[17]||(t[17]=c(" â ÑолÑко каÑÑинки: напÑÑмÑÑ OpenRouter.",-1))])])])]),e("div",ze,[e("div",Se,[u(i,{name:"mdi:speedometer",size:"20"}),t[18]||(t[18]=e("span",null,"СкоÑоÑÑÑ Ð³ÐµÐ½ÐµÑаÑии",-1)),d(S)?(l(),o("span",Te,[u(i,{name:"eos-icons:loading",size:"14"})])):v("",!0)]),!d(y)&&d(S)?(l(),o("div",Me,[u(i,{name:"eos-icons:loading",size:"32",class:"loading-icon"}),t[19]||(t[19]=e("p",null,"ÐагÑÑзка ÑÑаÑиÑÑики...",-1))])):d(y)&&d(I).length===0?(l(),o("div",Oe,[u(i,{name:"mdi:chart-line-variant",size:"32"}),t[20]||(t[20]=e("p",null,"ÐÐµÑ Ð´Ð°Ð½Ð½ÑÑ
о ÑкоÑоÑÑи генеÑаÑии. СÑаÑиÑÑика поÑвиÑÑÑ Ð¿Ð¾Ñле генеÑаÑии изобÑажений.",-1))])):d(y)?(l(),o(p,{key:2},[e("div",Ge,[t[22]||(t[22]=e("div",{class:"stats-period-label"},"Ðа 30 дней (Ñводка)",-1)),e("div",Le,[e("table",Ne,[t[21]||(t[21]=e("thead",null,[e("tr",null,[e("th",null,"ÐоделÑ"),e("th",null,"ÐÑовайдеÑ"),e("th",{class:"num"},"Ðол-во"),e("th",{class:"num"},"СÑеднее"),e("th",{class:"num"},"Ðедиана"),e("th",{class:"num"},"Ðин"),e("th",{class:"num"},"ÐакÑ")])],-1)),e("tbody",null,[(l(!0),o(p,null,h(d(I),s=>(l(),o("tr",{key:`${s.model_code}|${s.provider}`},[e("td",null,[e("code",null,a(O(s.model_code)),1)]),e("td",null,[e("span",{class:g(["provider-badge",`provider-badge--${G(s.provider)}`])},a(k(s.provider)),3)]),e("td",Ie,a(s.count),1),e("td",xe,a(_(s.avg_ms)),1),e("td",Ue,a(_(s.median_ms)),1),e("td",Ae,a(_(s.min_ms)),1),e("td",Be,a(_(s.max_ms)),1)]))),128))])])])]),e("div",Fe,[e("div",De,[(l(),o(p,null,h(H,s=>e("button",{key:s.key,class:g(["period-tab",{active:d(U)===s.key}]),onClick:r=>U.value=s.key},a(s.label),11,je)),64))]),d(F).length===0?(l(),o("div",Ee," ÐÐµÑ Ð´Ð°Ð½Ð½ÑÑ
за ÑÑÐ¾Ñ Ð¿ÐµÑиод ")):(l(),o("div",Ve,[e("table",Je,[t[23]||(t[23]=e("thead",null,[e("tr",null,[e("th",null,"ÐоделÑ"),e("th",null,"ÐÑовайдеÑ"),e("th",{class:"num"},"Ðол-во"),e("th",{class:"num"},"СÑеднее"),e("th",{class:"num"},"Ðин"),e("th",{class:"num"},"ÐакÑ")])],-1)),e("tbody",null,[(l(!0),o(p,null,h(d(F),s=>(l(),o("tr",{key:`${s.model_code}|${s.provider}`},[e("td",null,[e("code",null,a(O(s.model_code)),1)]),e("td",null,[e("span",{class:g(["provider-badge",`provider-badge--${G(s.provider)}`])},a(k(s.provider)),3)]),e("td",Ke,a(s.count),1),e("td",We,a(_(s.avg_ms)),1),e("td",Ye,a(_(s.min_ms)),1),e("td",Ze,a(_(s.max_ms)),1)]))),128))])])]))])],64)):v("",!0)]),d(y)?(l(),o("div",qe,[e("div",He,[u(i,{name:"mdi:alert-circle-outline",size:"20"}),t[24]||(t[24]=e("span",null,"ÐÑибки и ÑоллбÑки",-1)),d($).length>0?(l(),o("span",Qe,a(d(Q))+" за 30 дн ",1)):v("",!0)]),d($).length===0?(l(),o("div",Xe,[u(i,{name:"mdi:check-circle-outline",size:"32",class:"ok-icon"}),t[25]||(t[25]=e("p",null,"Ðа поÑледние 30 дней оÑибок не заÑикÑиÑовано â вÑе пÑовайдеÑÑ Ð¾ÑвеÑаÑÑ ÑÑаÑно.",-1))])):(l(),o(p,{key:1},[e("div",we,[t[27]||(t[27]=e("div",{class:"stats-period-label"},"Сводка за 30 дней",-1)),e("div",et,[e("table",tt,[t[26]||(t[26]=e("thead",null,[e("tr",null,[e("th",null,"ÐоделÑ"),e("th",null,"ÐÑовайдеÑ"),e("th",{class:"num"},"ÐÑибок"),e("th",{class:"num"},"ФоллбÑков"),e("th",null,"ÐоÑледнÑÑ Ð¾Ñибка"),e("th",{class:"num"},"Ðогда")])],-1)),e("tbody",null,[(l(!0),o(p,null,h(d($),s=>(l(),o("tr",{key:`${s.model_code}|${s.provider}`},[e("td",null,[e("code",null,a(O(s.model_code)),1)]),e("td",null,[e("span",{class:g(["provider-badge",`provider-badge--${G(s.provider)}`])},a(k(s.provider)),3)]),e("td",st,[e("span",nt,a(s.count),1)]),e("td",it,[Number(s.fell_back_count)>0?(l(),o("span",ot,a(s.fell_back_count),1)):(l(),o("span",lt,"â"))]),e("td",{class:"error-message",title:s.last_error},a(s.last_error||"â"),9,at),e("td",dt,a(E(s.last_at)),1)]))),128))])])])]),d(x).length>0?(l(),o("div",rt,[t[29]||(t[29]=e("div",{class:"stats-period-label"},"ÐоÑледние оÑибки",-1)),e("div",ut,[e("table",ct,[t[28]||(t[28]=e("thead",null,[e("tr",null,[e("th",{class:"num"},"Ðогда"),e("th",null,"ÐоделÑ"),e("th",null,"ÐÑовайдеÑ"),e("th",null,"ФоллбÑÐ
1º"),e("th",null,"ÐÑибка"),e("th",{class:"num"},"ÐлиÑ.")])],-1)),e("tbody",null,[(l(!0),o(p,null,h(d(x),s=>(l(),o("tr",{key:s.id},[e("td",mt,a(E(s.created_at)),1),e("td",null,[e("code",null,a(O(s.model_code)),1)]),e("td",null,[e("span",{class:g(["provider-badge",`provider-badge--${G(s.provider)}`])},a(k(s.provider)),3)]),e("td",null,[s.fell_back&&s.fallback_provider?(l(),o("span",pt," â "+a(k(s.fallback_provider)),1)):(l(),o("span",vt,"â"))]),e("td",{class:"error-message",title:s.error_message},a(s.error_message),9,gt),e("td",_t,a(s.duration_ms?_(s.duration_ms):"â"),1)]))),128))])])])])):v("",!0)],64))])):v("",!0)])])}}}),Pt=oe(ft,[["__scopeId","data-v-5b3d863d"]]);export{Pt as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.