@tombcato/ai-selector-vue 0.1.0 → 0.1.1

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.
@@ -0,0 +1,3 @@
1
+ (function($,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@tombcato/ai-selector-core")):typeof define=="function"&&define.amd?define(["exports","vue","@tombcato/ai-selector-core"],e):($=typeof globalThis<"u"?globalThis:$||self,e($.AISelectorVue={},$.Vue,$.AISelectorCore))})(this,(function($,e,z){"use strict";function q(t={}){var V,U,F,L,A;const s=e.ref(((V=t.initialConfig)==null?void 0:V.providerId)||""),r=e.ref(((U=t.initialConfig)==null?void 0:U.apiKey)||""),l=e.ref(((F=t.initialConfig)==null?void 0:F.model)||""),a=e.ref(((L=t.initialConfig)==null?void 0:L.modelName)||""),n=e.ref(((A=t.initialConfig)==null?void 0:A.baseUrl)||""),p=e.ref([]),d=e.ref("idle"),o=e.ref(null),h=e.ref(!1),u=e.ref(null),f=e.computed(()=>z.resolveProviderConfig(t.providerConfig)),c=e.computed(()=>f.value.providers),m=e.computed(()=>c.value.find(i=>i.id===s.value)||null),x=z.createConfigStorage(void 0,{serialize:t.onSerialize,deserialize:t.onDeserialize}),C=e.ref(!1);e.onMounted(()=>{const i=x.load();i&&i.providerId&&c.value.some(g=>g.id===i.providerId)&&(s.value=i.providerId,i.apiKey&&(r.value=i.apiKey),i.model&&(l.value=i.model),i.modelName&&(a.value=i.modelName),i.baseUrl&&(n.value=i.baseUrl)),setTimeout(()=>{C.value=!0},0)}),e.watch(s,()=>{C.value&&(r.value="",l.value="",a.value="",n.value="",d.value="idle",o.value=null)});let y=null;const E=new Map;e.watch([s,r,n],()=>{if(y&&clearTimeout(y),!s.value||!m.value){p.value=[],u.value=null,h.value=!1;return}const i=m.value.supportsModelsApi&&(!m.value.needsApiKey||!!r.value),g=n.value||m.value.baseUrl,v=`${s.value}|${g}|${r.value}`,D=E.get(v);if(D){p.value=D,u.value=null,h.value=!1;return}if(!i){const M=f.value.getModels(s.value);p.value=M,E.set(v,M),u.value=null,h.value=!1;return}h.value=!0,u.value=null,p.value.length===0&&(p.value=f.value.getModels(s.value)),y=setTimeout(async()=>{try{let M;t.modelFetcher?M=await t.modelFetcher({type:"fetchModels",providerId:m.value.id,baseUrl:g,apiKey:r.value}):M=await z.fetchModels({provider:m.value,apiKey:r.value,baseUrl:g,proxyUrl:t.proxyUrl,fallbackToStatic:!1}),p.value=M,E.set(v,M)}catch(M){console.warn("Model fetch failed:",M),u.value="fetchModelsFailed",p.value=f.value.getModels(s.value)}finally{h.value=!1}},500)},{immediate:!0}),e.watch([r,n],()=>{(d.value==="error"||d.value==="success")&&(d.value="idle",o.value=null)});async function k(){if(!m.value||m.value.needsApiKey&&!r.value)return;d.value="testing",o.value=null;let i;if(t.modelFetcher)try{const g=await t.modelFetcher({type:"checkConnection",providerId:m.value.id,baseUrl:n.value||m.value.baseUrl,apiKey:r.value,modelId:l.value});i={success:g.success,latencyMs:g.latency||g.latencyMs,message:g.message}}catch(g){i={success:!1,message:g.message||"Unknown error"}}else i=await z.testConnection({provider:m.value,apiKey:r.value,baseUrl:n.value,model:l.value,proxyUrl:t.proxyUrl});return o.value=i,d.value=i.success?"success":"error",setTimeout(()=>{d.value="idle"},2e3),i}function N(){const i=p.value.find(v=>v.id===l.value),g=(i==null?void 0:i.name)||a.value||l.value;i!=null&&i.name&&i.name!==a.value&&(a.value=i.name),x.save({providerId:s.value,apiKey:r.value,model:l.value,modelName:g,baseUrl:n.value})}function B(){x.clear(),s.value="",r.value="",l.value="",a.value="",n.value=""}function w(i,g){if(l.value=i,g)a.value=g;else{const v=p.value.find(D=>D.id===i);a.value=(v==null?void 0:v.name)||i}}const I=e.computed(()=>{var i;return!(!s.value||!l.value||(i=m.value)!=null&&i.needsApiKey&&!r.value)}),b=e.computed(()=>{var i;return{providerId:s.value,apiKey:r.value,model:l.value,modelName:a.value,baseUrl:n.value||((i=m.value)==null?void 0:i.baseUrl)||""}});return{providerId:s,apiKey:r,model:l,modelName:a,baseUrl:n,models:p,testStatus:d,testResult:o,isFetchingModels:h,fetchModelError:u,provider:m,providers:c,isValid:I,config:b,runTest:k,save:N,clear:B,selectModel:w}}var G=Object.defineProperty,Q=(t,s,r)=>s in t?G(t,s,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[s]=r,O=(t,s,r)=>Q(t,typeof s!="symbol"?s+"":s,r);const S="\0";class X{constructor(s){O(this,"numOriginalCharacters"),O(this,"characterList"),O(this,"characterIndicesMap");const r=[...s],l=r.length;this.numOriginalCharacters=l,this.characterIndicesMap=new Map;for(let a=0;a<l;a++)this.characterIndicesMap.set(r[a],a);this.characterList=new Array(l*2+1),this.characterList[0]=S;for(let a=0;a<l;a++)this.characterList[1+a]=r[a],this.characterList[1+l+a]=r[a]}getCharacterIndices(s,r,l){let a=this.getIndexOfChar(s),n=this.getIndexOfChar(r);if(a<0||n<0)return null;switch(l){case"DOWN":r===S?n=this.characterList.length:n<a&&(n+=this.numOriginalCharacters);break;case"UP":a<n&&(a+=this.numOriginalCharacters);break;case"ANY":if(s!==S&&r!==S){if(n<a){const p=a-n;this.numOriginalCharacters-a+n<p&&(n+=this.numOriginalCharacters)}else if(a<n){const p=n-a;this.numOriginalCharacters-n+a<p&&(a+=this.numOriginalCharacters)}}break}return{startIndex:a,endIndex:n}}getSupportedCharacters(){return new Set(this.characterIndicesMap.keys())}getCharacterList(){return this.characterList}getIndexOfChar(s){return s===S?0:this.characterIndicesMap.has(s)?this.characterIndicesMap.get(s)+1:-1}}const _=0,T=1,K=2;function Z(t,s,r){let l=0,a=0;const n=[];for(;;){const p=l===t.length,d=a===s.length;if(p&&d)break;if(p){for(;a<s.length;a++)n.push(T);break}if(d){for(;l<t.length;l++)n.push(K);break}const o=r.has(t[l]),h=r.has(s[a]);if(o&&h){let u=l+1,f=a+1;for(;u<t.length&&r.has(t[u]);)u++;for(;f<s.length&&r.has(s[f]);)f++;const c=u-l,m=f-a;if(c===m)for(let x=0;x<c;x++)n.push(_);else{const x=Array(c+1).fill(null).map(()=>Array(m+1).fill(0));for(let k=0;k<=c;k++)x[k][0]=k;for(let k=0;k<=m;k++)x[0][k]=k;for(let k=1;k<=c;k++)for(let N=1;N<=m;N++){const B=t[l+k-1]===s[a+N-1]?0:1;x[k][N]=Math.min(x[k-1][N]+1,x[k][N-1]+1,x[k-1][N-1]+B)}const C=[];let y=c,E=m;for(;y>0||E>0;)if(y===0)C.push(T),E--;else if(E===0)C.push(K),y--;else{const k=x[y][E-1],N=x[y-1][E],B=x[y-1][E-1];k<N&&k<B?(C.push(T),E--):N<B?(C.push(K),y--):(C.push(_),y--,E--)}for(let k=C.length-1;k>=0;k--)n.push(C[k])}l=u,a=f}else o?(n.push(T),a++):h?(n.push(K),l++):(n.push(_),l++,a++)}return n}function W(){return{currentChar:S,targetChar:S,charList:null,startIndex:0,endIndex:0,sourceWidth:0,currentWidth:0,targetWidth:0,directionAdj:1,prevDelta:0,currDelta:0}}function P(t,s,r,l){const a={...t};a.targetChar=s,a.sourceWidth=a.currentWidth,a.targetWidth=s===S?0:1;let n=!1;for(const p of r){const d=p.getCharacterIndices(a.currentChar,s,l);if(d){a.charList=p.getCharacterList(),a.startIndex=d.startIndex,a.endIndex=d.endIndex,n=!0;break}}return n||(a.charList=a.currentChar===s?[a.currentChar]:[a.currentChar,s],a.startIndex=0,a.endIndex=a.currentChar===s?0:1),a.directionAdj=a.endIndex>=a.startIndex?1:-1,a.prevDelta=a.currDelta,a.currDelta=0,a}function j(t,s,r=!1){const l={...t},a=Math.abs(l.endIndex-l.startIndex),n=s*a,p=n-Math.floor(n),d=l.prevDelta*(1-s),o=p*l.directionAdj+d,h=l.startIndex+Math.floor(n)*l.directionAdj;return s>=1?(l.currentChar=l.targetChar,l.currDelta=0,l.prevDelta=0):r&&l.charList&&h>=0&&h<l.charList.length&&(l.currentChar=l.charList[h],l.currDelta=o),l.currentWidth=l.sourceWidth+(l.targetWidth-l.sourceWidth)*s,{col:l,charIdx:h,delta:o}}const Y={linear:t=>t,easeIn:t=>t*t,easeOut:t=>1-(1-t)*(1-t),easeInOut:t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,bounce:t=>t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},R=1.2,ee=((t,s)=>{const r=t.__vccOpts||t;for(const[l,a]of s)r[l]=a;return r})(e.defineComponent({__name:"Ticker",props:{value:{type:String,required:!0},characterLists:{type:Array,default:()=>["0123456789"]},duration:{type:Number,default:500},direction:{type:String,default:"ANY"},easing:{type:String,default:"easeInOut"},className:{type:String,default:""},charWidth:{type:Number,default:1}},setup(t){const s=t,r=e.ref([]),l=e.ref(1);let a;const n=e.computed(()=>s.characterLists.map(o=>new X(o))),p=e.computed(()=>{const o=new Set;return n.value.forEach(h=>h.getSupportedCharacters().forEach(u=>o.add(u))),o});e.watch(()=>s.value,(o,h)=>{if(o===h)return;a&&(cancelAnimationFrame(a),a=void 0);let u=r.value;l.value<1&&l.value>0&&(u=u.map(b=>j(b,l.value,!0).col));const f=[...o],c=u.map(b=>b.currentChar),m=Z(c,f,p.value);let x=0,C=0;const y=[],E=u.filter(b=>b.currentWidth>0);for(const b of m)if(b===T)y.push(P(W(),f[C++],n.value,s.direction));else if(b===_){const V=E[x++]||W();y.push(P(V,f[C++],n.value,s.direction))}else{const V=E[x++]||W();y.push(P(V,S,n.value,s.direction))}r.value=y,l.value=0;const k=performance.now(),N=s.duration,B=Y[s.easing]||Y.linear;let w=0;const I=b=>{const V=Math.min((b-k)/N,1),U=B(V);if((b-w>=16||V>=1)&&(w=b,l.value=U),V<1)a=requestAnimationFrame(I);else{const L=r.value.map(A=>j(A,1).col).filter(A=>A.currentWidth>0);r.value=L,l.value=1,a=void 0}};a=requestAnimationFrame(I)},{immediate:!0}),e.onUnmounted(()=>{a&&cancelAnimationFrame(a)});const d=e.computed(()=>r.value.map(o=>{const{charIdx:h,delta:u}=j(o,l.value),f=o.sourceWidth+(o.targetWidth-o.sourceWidth)*l.value;if(f<=0)return{width:f,chars:[]};const c=[],m=o.charList||[],x=u*R,C=(b,V,U)=>{b>=0&&b<m.length&&c.push({key:`${U}-${b}`,char:m[b],offset:x+V})};C(h,0,"c"),C(h+1,-R,"n"),C(h-1,R,"p");const y=b=>b&&b.length>0&&b.charCodeAt(0)>255,E=b=>y(b)?1.25:.8,k=m[o.startIndex]||"",N=m[o.endIndex]||"",B=E(k),w=E(N),I=B+(w-B)*l.value;return{width:f,chars:c,baseW:I}}).filter(o=>o.width>0));return(o,h)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ticker",t.className])},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,(u,f)=>(e.openBlock(),e.createElementBlock("div",{key:f,class:"ticker-column",style:e.normalizeStyle({width:`${u.width*(u.baseW||.8)*t.charWidth}em`})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.chars,c=>(e.openBlock(),e.createElementBlock("div",{key:c.key,class:"ticker-char",style:e.normalizeStyle({transform:`translateY(${c.offset}em)`})},e.toDisplayString(c.char===e.unref(S)?" ":c.char),5))),128))],4))),128))],2))}}),[["__scopeId","data-v-7e47ac69"]]),H=e.defineComponent({__name:"SmartText",props:{text:{},className:{},placeholder:{}},setup(t){return(s,r)=>!t.text&&t.placeholder?(e.openBlock(),e.createElementBlock("span",{key:0,class:e.normalizeClass(["apmsu-placeholder",t.className])},e.toDisplayString(t.placeholder),3)):t.text?(e.openBlock(),e.createElementBlock("span",{key:1,class:e.normalizeClass(["inline-flex min-w-0",t.className])},[e.createVNode(e.unref(ee),{value:t.text,"char-width":.8,duration:300},null,8,["value"])],2)):e.createCommentVNode("",!0)}}),te={class:"apmsu-label"},ae={class:"relative"},le=["disabled"],ne={key:0,class:"flex items-center gap-2 min-w-0"},re=["src","alt"],se={key:1,class:"apmsu-placeholder"},oe=["onClick"],ie={class:"flex items-center gap-2 flex-shrink-0"},ce=["src","alt"],de={class:"font-medium whitespace-nowrap"},ue={class:"apmsu-hint-text ml-auto text-right truncate flex-1 min-w-0"},me=e.defineComponent({__name:"ProviderSelect",props:{providers:{},selectedProviderId:{},disabled:{type:Boolean,default:!1},language:{default:"zh"}},emits:["select"],setup(t,{emit:s}){const r=t,l=s,a=e.ref(!1),n=e.ref(null),p=e.computed(()=>z.I18N[r.language]),d=e.computed(()=>r.providers.find(u=>u.id===r.selectedProviderId));function o(u){n.value&&!n.value.contains(u.target)&&(a.value=!1)}e.onMounted(()=>{document.addEventListener("mousedown",o)}),e.onUnmounted(()=>{document.removeEventListener("mousedown",o)});function h(u){l("select",u),a.value=!1}return(u,f)=>(e.openBlock(),e.createElementBlock("div",{class:"apmsu-field",ref_key:"triggerRef",ref:n},[e.createElementVNode("label",te,e.toDisplayString(p.value.providerLabel),1),e.createElementVNode("div",ae,[e.createElementVNode("button",{type:"button",onClick:f[0]||(f[0]=c=>!t.disabled&&(a.value=!a.value)),disabled:t.disabled,class:"apmsu-select-trigger"},[d.value?(e.openBlock(),e.createElementBlock("div",ne,[e.createElementVNode("img",{src:d.value.icon,alt:d.value.name,class:"apmsu-provider-icon"},null,8,re),e.createVNode(H,{text:d.value.name},null,8,["text"])])):(e.openBlock(),e.createElementBlock("span",se,e.toDisplayString(p.value.selectProvider),1)),(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["apmsu-chevron",a.value?"rotate-180":""]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...f[1]||(f[1]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))],8,le),e.createElementVNode("div",{class:e.normalizeClass(["apmsu-dropdown max-h-[300px] overflow-auto p-1 origin-top",a.value?"apmsu-dropdown-open":""])},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.providers,c=>(e.openBlock(),e.createElementBlock("button",{key:c.id,type:"button",onClick:m=>h(c.id),class:e.normalizeClass(["apmsu-dropdown-item rounded-sm",t.selectedProviderId===c.id&&"apmsu-dropdown-item-active"])},[e.createElementVNode("div",ie,[e.createElementVNode("img",{src:c.icon,alt:c.name,class:"apmsu-provider-icon"},null,8,ce),e.createElementVNode("span",de,e.toDisplayString(c.name),1)]),e.createElementVNode("span",ue,e.toDisplayString(c.baseUrl.replace("https://","")),1)],10,oe))),128))],2)])],512))}}),pe={key:0,class:"apmsu-field"},fe={class:"apmsu-label"},he={class:"relative"},ge=["type","value","placeholder","disabled"],ye={class:"absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center"},ke={key:0,class:"w-4 h-4 text-gray-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},be={key:1,class:"w-4 h-4 text-gray-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},xe=e.defineComponent({__name:"AuthInput",props:{provider:{},apiKey:{},testStatus:{},disabled:{type:Boolean,default:!1},language:{default:"zh"}},emits:["update:apiKey"],setup(t,{emit:s}){const r=t,l=s,a=e.ref(!1),n=e.computed(()=>z.I18N[r.language]),p=e.computed(()=>r.testStatus==="success"?"apmsu-input apmsu-input-success":"apmsu-input apmsu-input-default");return(d,o)=>t.provider&&t.provider.needsApiKey?(e.openBlock(),e.createElementBlock("div",pe,[e.createElementVNode("label",fe,e.toDisplayString(n.value.apiKeyLabel),1),e.createElementVNode("div",he,[e.createElementVNode("input",{type:a.value?"text":"password",value:t.apiKey,onInput:o[0]||(o[0]=h=>l("update:apiKey",h.target.value)),onFocus:o[1]||(o[1]=h=>a.value=!0),onBlur:o[2]||(o[2]=h=>a.value=!1),placeholder:n.value.apiKeyPlaceholder,disabled:t.disabled,class:e.normalizeClass([p.value,"pr-10"])},null,42,ge),e.createElementVNode("span",ye,[a.value?(e.openBlock(),e.createElementBlock("svg",ke,[...o[3]||(o[3]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"},null,-1),e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"},null,-1)])])):(e.openBlock(),e.createElementBlock("svg",be,[...o[4]||(o[4]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"},null,-1)])]))])])])):e.createCommentVNode("",!0)}}),Ce={class:"apmsu-label flex items-center justify-between"},Ee={class:"relative"},Ne=["disabled"],we={class:"p-1.5 border-b border-gray-100 dark:border-zinc-800"},Be=["placeholder","autofocus"],Ve={class:"max-h-60 overflow-auto"},ve={class:"text-blue-500"},Me=["onClick"],Ie={key:1,class:"p-4 text-center apmsu-hint-text"},Se={key:0,class:"min-h-[20px] flex items-center"},$e={key:0,class:"apmsu-hint-text animate-pulse"},ze={key:1,class:"apmsu-hint-text dark:text-zinc-500"},Ue={key:2,class:"apmsu-hint-text"},Ae={key:3,class:"apmsu-hint-text"},De=e.defineComponent({__name:"ModelSelect",props:{provider:{},models:{},selectedModelId:{},hasApiKey:{type:Boolean},disabled:{type:Boolean,default:!1},language:{default:"zh"},isFetchingModels:{type:Boolean},fetchModelError:{},selectedModelName:{}},emits:["select"],setup(t,{emit:s}){const r=t,l=s,a=e.ref(!1),n=e.ref(""),p=e.ref(null),d=e.computed(()=>z.I18N[r.language]),o=e.computed(()=>r.models.filter(c=>c.name.toLowerCase().includes(n.value.toLowerCase())||c.id.toLowerCase().includes(n.value.toLowerCase()))),h=e.computed(()=>{var c;return((c=r.models.find(m=>m.id===r.selectedModelId))==null?void 0:c.name)||r.selectedModelName||r.selectedModelId});function u(c){p.value&&!p.value.contains(c.target)&&(a.value=!1,n.value="")}e.onMounted(()=>{document.addEventListener("mousedown",u)}),e.onUnmounted(()=>{document.removeEventListener("mousedown",u)});function f(c,m){l("select",c,m),a.value=!1,n.value=""}return(c,m)=>{var x,C;return e.openBlock(),e.createElementBlock("div",{class:"apmsu-field",ref_key:"triggerRef",ref:p},[e.createElementVNode("label",Ce,[e.createElementVNode("span",null,e.toDisplayString(d.value.modelLabel),1)]),e.createElementVNode("div",Ee,[e.createElementVNode("button",{type:"button",onClick:m[0]||(m[0]=y=>!t.disabled&&t.provider&&(a.value=!a.value)),disabled:t.disabled||!t.provider,class:"apmsu-select-trigger"},[e.createVNode(H,{text:h.value?h.value:"",placeholder:d.value.selectModel},null,8,["text","placeholder"]),(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["apmsu-chevron",a.value?"rotate-180":""]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...m[3]||(m[3]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))],8,Ne),e.createElementVNode("div",{class:e.normalizeClass(["apmsu-dropdown origin-top",a.value?"apmsu-dropdown-open":""])},[e.createElementVNode("div",we,[e.withDirectives(e.createElementVNode("input",{type:"text","onUpdate:modelValue":m[1]||(m[1]=y=>n.value=y),placeholder:d.value.searchModel,class:"apmsu-select-trigger",autofocus:a.value},null,8,Be),[[e.vModelText,n.value]])]),e.createElementVNode("div",Ve,[n.value&&!o.value.some(y=>y.id===n.value)?(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",onClick:m[2]||(m[2]=y=>f(n.value)),class:"apmsu-dropdown-item bg-blue-50 dark:bg-blue-900/20 border-b"},[e.createElementVNode("span",ve,e.toDisplayString(d.value.useCustom)+": "+e.toDisplayString(n.value),1)])):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.value,y=>(e.openBlock(),e.createElementBlock("button",{key:y.id,type:"button",onClick:E=>f(y.id,y.name),class:e.normalizeClass(["apmsu-dropdown-item",t.selectedModelId===y.id&&"apmsu-dropdown-item-active"])},[e.createElementVNode("span",null,e.toDisplayString(y.name),1)],10,Me))),128)),o.value.length===0&&!n.value?(e.openBlock(),e.createElementBlock("div",Ie,e.toDisplayString(d.value.noModels),1)):e.createCommentVNode("",!0)])],2)]),(x=t.provider)!=null&&x.supportsModelsApi?(e.openBlock(),e.createElementBlock("div",Se,[t.isFetchingModels?(e.openBlock(),e.createElementBlock("p",$e,e.toDisplayString(d.value.refreshingModels),1)):t.fetchModelError?(e.openBlock(),e.createElementBlock("p",ze,e.toDisplayString(d.value[t.fetchModelError]||t.fetchModelError),1)):(C=t.provider)!=null&&C.needsApiKey&&!t.hasApiKey?(e.openBlock(),e.createElementBlock("p",Ue,e.toDisplayString(d.value.apiKeyTip),1)):(e.openBlock(),e.createElementBlock("p",Ae,e.toDisplayString(d.value.modelListUpdated),1))])):e.createCommentVNode("",!0)],512)}}}),Le={class:"overflow-hidden"},Te=["value","placeholder","disabled"],Fe=e.defineComponent({__name:"BaseUrlInput",props:{provider:{},baseUrl:{},disabled:{type:Boolean,default:!1},language:{default:"zh"}},emits:["update:baseUrl"],setup(t,{emit:s}){const r=t,l=s,a=e.ref(!1),n=e.computed(()=>z.I18N[r.language]);return(p,d)=>t.provider?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createElementVNode("button",{type:"button",onClick:d[0]||(d[0]=o=>a.value=!a.value),class:"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 flex items-center gap-1 transition-colors"},[(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["w-3 h-3 transition-transform",a.value&&"rotate-90"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...d[2]||(d[2]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"},null,-1)])],2)),e.createTextVNode(" "+e.toDisplayString(n.value.customBaseUrl),1)]),e.createElementVNode("div",{class:"grid transition-all duration-200 ease-out",style:e.normalizeStyle({gridTemplateRows:a.value?"1fr":"0fr"})},[e.createElementVNode("div",Le,[e.createElementVNode("input",{type:"text",value:t.baseUrl,onInput:d[1]||(d[1]=o=>l("update:baseUrl",o.target.value)),placeholder:t.provider.baseUrl,disabled:t.disabled,class:"apmsu-input apmsu-input-default"},null,40,Te)])],4)],64)):e.createCommentVNode("",!0)}}),_e={class:"apmsu-card"},Ke={key:0,class:"text-lg font-semibold mb-4"},Oe={class:"space-y-3"},We={class:"space-y-4"},Pe={class:"pt-2 space-y-2"},je={class:"flex gap-2"},Re=["disabled"],qe={key:0,class:"flex items-center justify-center gap-2"},Ye={key:1,class:"flex items-center justify-center gap-2"},He={key:2,class:"flex items-center justify-center gap-2"},Je=["disabled"],Ge={key:0,class:"flex items-center justify-center gap-2"},Qe={class:"overflow-hidden"},Xe={class:"p-2 rounded-md bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800"},Ze={class:"text-xs text-red-600 dark:text-red-400 line-clamp-3 text-left"},et={key:1,class:"mt-6 border border-gray-200/50 dark:border-zinc-800 rounded-lg overflow-hidden"},tt={class:"text-xs font-medium text-gray-500 dark:text-zinc-500 uppercase tracking-wider"},at={class:"overflow-hidden"},lt={class:"text-xs text-gray-600 dark:text-zinc-400 font-mono overflow-x-auto leading-relaxed p-4 bg-zinc-50 dark:bg-zinc-900/50"},nt=e.defineComponent({__name:"AIConfigForm",props:{proxyUrl:{},config:{},initialConfig:{},title:{},showPreview:{type:Boolean,default:!1},saveButtonText:{},disabled:{type:Boolean,default:!1},onSerialize:{},onDeserialize:{},language:{default:"zh"},modelFetcher:{}},emits:["save","testResult","change"],setup(t,{emit:s}){const r=t,l=s,{providerId:a,apiKey:n,model:p,modelName:d,baseUrl:o,models:h,testStatus:u,testResult:f,provider:c,providers:m,isValid:x,config:C,runTest:y,save:E,selectModel:k,isFetchingModels:N,fetchModelError:B}=q({proxyUrl:r.proxyUrl,providerConfig:r.config,initialConfig:r.initialConfig,onSerialize:r.onSerialize,onDeserialize:r.onDeserialize,modelFetcher:r.modelFetcher}),w=e.computed(()=>z.I18N[r.language]),I=e.ref("idle"),b=e.ref(!1);e.watch([a,n,p,o],()=>{l("change",{providerId:a.value,apiKey:n.value,model:p.value,baseUrl:o.value})}),e.watch(f,i=>{i&&l("testResult",i)});function V(){E(),I.value="saved",l("save",C.value),setTimeout(()=>{I.value="idle"},2e3)}function U(i){a.value=i}function F(i){n.value=i}function L(i,g){k(i,g)}function A(i){o.value=i}return(i,g)=>{var v,D,M,J;return e.openBlock(),e.createElementBlock("div",_e,[t.title?(e.openBlock(),e.createElementBlock("h2",Ke,e.toDisplayString(t.title),1)):e.createCommentVNode("",!0),e.createElementVNode("div",Oe,[e.createVNode(me,{providers:e.unref(m),selectedProviderId:e.unref(a),onSelect:U,disabled:t.disabled,language:t.language},null,8,["providers","selectedProviderId","disabled","language"]),e.createVNode(Fe,{provider:e.unref(c),baseUrl:e.unref(o),"onUpdate:baseUrl":A,disabled:t.disabled,language:t.language},null,8,["provider","baseUrl","disabled","language"]),e.createElementVNode("div",{class:e.normalizeClass(["transition-all duration-500 ease-in-out",e.unref(a)?"max-h-[1000px] opacity-100 overflow-visible":"max-h-0 opacity-0 overflow-hidden"])},[e.createElementVNode("div",We,[e.createVNode(xe,{provider:e.unref(c),apiKey:e.unref(n),"onUpdate:apiKey":F,testStatus:e.unref(u),disabled:t.disabled,language:t.language,isFetchingModels:e.unref(N),fetchModelError:e.unref(B)},null,8,["provider","apiKey","testStatus","disabled","language","isFetchingModels","fetchModelError"]),e.createVNode(De,{provider:e.unref(c),models:e.unref(h),selectedModelId:e.unref(p),onSelect:L,hasApiKey:!!e.unref(n),disabled:t.disabled,language:t.language,isFetchingModels:e.unref(N),fetchModelError:e.unref(B),selectedModelName:e.unref(d)},null,8,["provider","models","selectedModelId","hasApiKey","disabled","language","isFetchingModels","fetchModelError","selectedModelName"])])],2),e.createElementVNode("div",Pe,[e.createElementVNode("div",je,[e.createElementVNode("button",{type:"button",onClick:g[0]||(g[0]=rt=>e.unref(y)()),disabled:!e.unref(a)||!e.unref(n)||!e.unref(p)||t.disabled||e.unref(u)==="testing",class:e.normalizeClass(["apmsu-btn flex-1",e.unref(u)==="success"?"apmsu-btn-success":e.unref(u)==="error"?"bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-900/40":"apmsu-btn-ghost border border-gray-200 dark:border-zinc-700"])},[e.unref(u)==="testing"?(e.openBlock(),e.createElementBlock("span",qe,[g[2]||(g[2]=e.createElementVNode("svg",{class:"apmsu-icon-spin",viewBox:"0 0 24 24",fill:"none"},[e.createElementVNode("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e.createElementVNode("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})],-1)),e.createTextVNode(" "+e.toDisplayString(w.value.testing),1)])):e.unref(u)==="success"?(e.openBlock(),e.createElementBlock("span",Ye,[g[3]||(g[3]=e.createElementVNode("svg",{class:"apmsu-icon-success",fill:"currentColor",viewBox:"0 0 24 24"},[e.createElementVNode("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"})],-1)),e.createTextVNode(" "+e.toDisplayString(w.value.testSuccess)+" "+e.toDisplayString((v=e.unref(f))!=null&&v.latencyMs?`${e.unref(f).latencyMs}ms`:""),1)])):e.unref(u)==="error"?(e.openBlock(),e.createElementBlock("span",He,[g[4]||(g[4]=e.createElementVNode("svg",{class:"apmsu-icon-error",fill:"currentColor",viewBox:"0 0 24 24"},[e.createElementVNode("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"})],-1)),e.createTextVNode(" "+e.toDisplayString(w.value.testFailed),1)])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:3},[e.createTextVNode(e.toDisplayString(w.value.testConnection),1)],64))],10,Re),e.createElementVNode("button",{onClick:V,disabled:!e.unref(x)||t.disabled,class:e.normalizeClass(["apmsu-btn flex-1",I.value==="saved"?"apmsu-btn-success":"apmsu-btn-primary"])},[I.value==="saved"?(e.openBlock(),e.createElementBlock("span",Ge,[g[5]||(g[5]=e.createElementVNode("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2.5",d:"M5 13l4 4L19 7"})],-1)),e.createTextVNode(" "+e.toDisplayString(w.value.saved),1)])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(e.toDisplayString(t.saveButtonText||w.value.save),1)],64))],10,Je)]),e.createElementVNode("div",{class:"grid transition-all duration-200 ease-out",style:e.normalizeStyle({gridTemplateRows:!((D=e.unref(f))!=null&&D.success)&&((M=e.unref(f))!=null&&M.message)&&e.unref(u)!=="testing"&&e.unref(u)!=="success"?"1fr":"0fr"})},[e.createElementVNode("div",Qe,[e.createElementVNode("div",Xe,[e.createElementVNode("p",Ze,e.toDisplayString((J=e.unref(f))==null?void 0:J.message),1)])])],4)])]),t.showPreview&&e.unref(c)?(e.openBlock(),e.createElementBlock("div",et,[e.createElementVNode("button",{type:"button",onClick:g[1]||(g[1]=rt=>b.value=!b.value),class:"w-full flex items-center justify-between px-4 py-3 bg-zinc-50 dark:bg-zinc-900/50 hover:bg-zinc-100 dark:hover:bg-zinc-800/50 transition-colors"},[e.createElementVNode("h3",tt,e.toDisplayString(w.value.preview),1),(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["w-4 h-4 text-gray-400 transition-transform duration-200",b.value?"rotate-180":""]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...g[6]||(g[6]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))]),e.createElementVNode("div",{class:"grid transition-all duration-200 ease-out",style:e.normalizeStyle({gridTemplateRows:b.value?"1fr":"0fr"})},[e.createElementVNode("div",at,[e.createElementVNode("pre",lt,""+e.toDisplayString(JSON.stringify({provider:e.unref(c).name,apiFormat:e.unref(c).apiFormat,baseUrl:e.unref(o)||e.unref(c).baseUrl,model:e.unref(p)||w.value.unselected,hasApiKey:!!e.unref(n)},null,2))+`
2
+ `,1)])],4)])):e.createCommentVNode("",!0)])}}});$.AIConfigForm=nt,$.useAIConfig=q,Object.defineProperty($,Symbol.toStringTag,{value:"Module"})}));
3
+ //# sourceMappingURL=index.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.umd.js","sources":["../src/useAIConfig.ts","../../../node_modules/.pnpm/@tombcato+smart-ticker@1.0._add73ef6986dd10d53023186e7f9a4fd/node_modules/@tombcato/smart-ticker/dist/TickerCore-C7Ejc9kB.js","../../../node_modules/.pnpm/@tombcato+smart-ticker@1.0._add73ef6986dd10d53023186e7f9a4fd/node_modules/@tombcato/smart-ticker/dist/vue.js","../src/SmartText.vue","../src/ProviderSelect.vue","../src/AuthInput.vue","../src/ModelSelect.vue","../src/BaseUrlInput.vue","../src/AIConfigForm.vue"],"sourcesContent":["import { ref, computed, watch, onMounted } from 'vue';\r\nimport {\r\n testConnection,\r\n createConfigStorage,\r\n resolveProviderConfig,\r\n type Model,\r\n type AIConfig,\r\n type TestConnectionResult,\r\n type ProviderConfig,\r\n fetchModels,\r\n type ModelFetcher,\r\n} from '@tombcato/ai-selector-core';\r\n\r\nexport interface UseAIConfigOptions {\r\n proxyUrl?: string;\r\n initialConfig?: Partial<AIConfig>;\r\n providerConfig?: ProviderConfig;\r\n onSerialize?: (data: any) => string;\r\n onDeserialize?: (data: string) => any;\r\n modelFetcher?: ModelFetcher;\r\n}\r\n\r\nexport function useAIConfig(options: UseAIConfigOptions = {}) {\r\n const providerId = ref(options.initialConfig?.providerId || '');\r\n const apiKey = ref(options.initialConfig?.apiKey || '');\r\n const model = ref(options.initialConfig?.model || '');\r\n const modelName = ref(options.initialConfig?.modelName || '');\r\n const baseUrl = ref(options.initialConfig?.baseUrl || '');\r\n\r\n const models = ref<Model[]>([]);\r\n const testStatus = ref<'idle' | 'testing' | 'success' | 'error'>('idle');\r\n const testResult = ref<TestConnectionResult | null>(null);\r\n const isFetchingModels = ref(false);\r\n const fetchModelError = ref<string | null>(null);\r\n\r\n // Resolve provider config\r\n const resolvedConfig = computed(() => resolveProviderConfig(options.providerConfig));\r\n const allProviders = computed(() => resolvedConfig.value.providers);\r\n\r\n const provider = computed(() =>\r\n allProviders.value.find(p => p.id === providerId.value) || null\r\n );\r\n\r\n const storage = createConfigStorage(undefined, {\r\n serialize: options.onSerialize,\r\n deserialize: options.onDeserialize\r\n });\r\n\r\n // Flag to prevent clearing data during initial load\r\n const isLoaded = ref(false);\r\n\r\n // Load config\r\n onMounted(() => {\r\n const saved = storage.load();\r\n if (saved) {\r\n // Only load if provider exists in current config\r\n if (saved.providerId && allProviders.value.some(p => p.id === saved.providerId)) {\r\n providerId.value = saved.providerId;\r\n if (saved.apiKey) apiKey.value = saved.apiKey;\r\n if (saved.model) model.value = saved.model;\r\n if (saved.modelName) modelName.value = saved.modelName;\r\n if (saved.baseUrl) baseUrl.value = saved.baseUrl;\r\n }\r\n }\r\n setTimeout(() => { isLoaded.value = true; }, 0);\r\n });\r\n\r\n // Watch for provider changes to reset fields\r\n watch(providerId, () => {\r\n if (!isLoaded.value) return;\r\n apiKey.value = '';\r\n model.value = '';\r\n modelName.value = '';\r\n baseUrl.value = '';\r\n testStatus.value = 'idle';\r\n testResult.value = null;\r\n });\r\n\r\n // Watch for provider/apikey/baseurl to update models (with caching)\r\n let fetchTimer: any = null;\r\n const modelCache = new Map<string, Model[]>();\r\n\r\n watch([providerId, apiKey, baseUrl], () => {\r\n if (fetchTimer) clearTimeout(fetchTimer);\r\n\r\n if (!providerId.value || !provider.value) {\r\n models.value = [];\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n const shouldFetch = provider.value.supportsModelsApi && (!provider.value.needsApiKey || !!apiKey.value);\r\n const actualBaseUrl = baseUrl.value || provider.value.baseUrl;\r\n const cacheKey = `${providerId.value}|${actualBaseUrl}|${apiKey.value}`;\r\n\r\n // Check cache first\r\n const cachedModels = modelCache.get(cacheKey);\r\n if (cachedModels) {\r\n models.value = cachedModels;\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n if (!shouldFetch) {\r\n const staticModels = resolvedConfig.value.getModels(providerId.value);\r\n models.value = staticModels;\r\n modelCache.set(cacheKey, staticModels);\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n // Set fetching immediately to fill debounce gap\r\n isFetchingModels.value = true;\r\n fetchModelError.value = null;\r\n\r\n // Pre-fill with static models if empty to avoid flicker\r\n if (models.value.length === 0) {\r\n models.value = resolvedConfig.value.getModels(providerId.value);\r\n }\r\n\r\n fetchTimer = setTimeout(async () => {\r\n try {\r\n let fetchedModels: Model[];\r\n\r\n if (options.modelFetcher) {\r\n fetchedModels = await options.modelFetcher({\r\n type: 'fetchModels',\r\n providerId: provider.value!.id,\r\n baseUrl: actualBaseUrl,\r\n apiKey: apiKey.value\r\n });\r\n } else {\r\n fetchedModels = await fetchModels({\r\n provider: provider.value!,\r\n apiKey: apiKey.value,\r\n baseUrl: actualBaseUrl,\r\n proxyUrl: options.proxyUrl,\r\n fallbackToStatic: false\r\n });\r\n }\r\n models.value = fetchedModels;\r\n modelCache.set(cacheKey, fetchedModels);\r\n } catch (e) {\r\n console.warn('Model fetch failed:', e);\r\n fetchModelError.value = 'fetchModelsFailed';\r\n models.value = resolvedConfig.value.getModels(providerId.value);\r\n // Don't cache failed results\r\n } finally {\r\n isFetchingModels.value = false;\r\n }\r\n }, 500);\r\n }, { immediate: true });\r\n\r\n // Reset test status when apiKey/baseUrl changes while in error/success state\r\n watch([apiKey, baseUrl], () => {\r\n if (testStatus.value === 'error' || testStatus.value === 'success') {\r\n testStatus.value = 'idle';\r\n testResult.value = null;\r\n }\r\n });\r\n\r\n // Actions\r\n async function runTest() {\r\n if (!provider.value) return;\r\n if (provider.value.needsApiKey && !apiKey.value) return;\r\n\r\n testStatus.value = 'testing';\r\n testResult.value = null;\r\n\r\n let result: TestConnectionResult;\r\n\r\n if (options.modelFetcher) {\r\n try {\r\n const fetcherResult = await options.modelFetcher({\r\n type: 'checkConnection',\r\n providerId: provider.value.id,\r\n baseUrl: baseUrl.value || provider.value.baseUrl,\r\n apiKey: apiKey.value,\r\n modelId: model.value\r\n });\r\n result = {\r\n success: fetcherResult.success,\r\n latencyMs: fetcherResult.latency || fetcherResult.latencyMs,\r\n message: fetcherResult.message\r\n };\r\n } catch (e: any) {\r\n result = { success: false, message: e.message || 'Unknown error' };\r\n }\r\n } else {\r\n result = await testConnection({\r\n provider: provider.value,\r\n apiKey: apiKey.value,\r\n baseUrl: baseUrl.value,\r\n model: model.value,\r\n proxyUrl: options.proxyUrl\r\n });\r\n }\r\n\r\n testResult.value = result;\r\n testStatus.value = result.success ? 'success' : 'error';\r\n\r\n // Auto-revert to idle (always 2s)\r\n setTimeout(() => {\r\n testStatus.value = 'idle';\r\n }, 2000);\r\n\r\n return result;\r\n }\r\n\r\n function save() {\r\n const foundModel = models.value.find(m => m.id === model.value);\r\n const nameToSave = foundModel?.name || modelName.value || model.value;\r\n\r\n if (foundModel?.name && foundModel.name !== modelName.value) {\r\n modelName.value = foundModel.name;\r\n }\r\n\r\n storage.save({\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n modelName: nameToSave,\r\n baseUrl: baseUrl.value\r\n });\r\n }\r\n\r\n function clear() {\r\n storage.clear();\r\n providerId.value = '';\r\n apiKey.value = '';\r\n model.value = '';\r\n modelName.value = '';\r\n baseUrl.value = '';\r\n }\r\n\r\n // Select a model (sets both id and name)\r\n function selectModel(modelId: string, name?: string) {\r\n model.value = modelId;\r\n // 如果提供了 name 就用,否则从 models 列表查找,最后用 id\r\n if (name) {\r\n modelName.value = name;\r\n } else {\r\n const found = models.value.find(m => m.id === modelId);\r\n modelName.value = found?.name || modelId;\r\n }\r\n }\r\n\r\n const isValid = computed(() => {\r\n if (!providerId.value || !model.value) return false;\r\n if (provider.value?.needsApiKey && !apiKey.value) return false;\r\n return true;\r\n });\r\n\r\n const currentConfig = computed<AIConfig>(() => ({\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n modelName: modelName.value,\r\n baseUrl: baseUrl.value || provider.value?.baseUrl || ''\r\n }));\r\n\r\n return {\r\n // State (Refs)\r\n providerId,\r\n apiKey,\r\n model,\r\n modelName,\r\n baseUrl,\r\n models,\r\n testStatus,\r\n testResult,\r\n isFetchingModels,\r\n fetchModelError,\r\n\r\n // Computed\r\n provider,\r\n providers: allProviders,\r\n isValid,\r\n config: currentConfig,\r\n\r\n // Actions\r\n runTest,\r\n save,\r\n clear,\r\n selectModel,\r\n };\r\n}\r\n","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nconst EMPTY_CHAR = \"\\0\";\nconst TickerUtils = {\n provideNumberList: () => \"0123456789\",\n provideAlphabeticalList: () => \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n};\nclass TickerCharacterList {\n constructor(characterList) {\n __publicField(this, \"numOriginalCharacters\");\n __publicField(this, \"characterList\");\n __publicField(this, \"characterIndicesMap\");\n const charsArray = [...characterList];\n const length = charsArray.length;\n this.numOriginalCharacters = length;\n this.characterIndicesMap = /* @__PURE__ */ new Map();\n for (let i = 0; i < length; i++) {\n this.characterIndicesMap.set(charsArray[i], i);\n }\n this.characterList = new Array(length * 2 + 1);\n this.characterList[0] = EMPTY_CHAR;\n for (let i = 0; i < length; i++) {\n this.characterList[1 + i] = charsArray[i];\n this.characterList[1 + length + i] = charsArray[i];\n }\n }\n getCharacterIndices(start, end, direction) {\n let startIndex = this.getIndexOfChar(start);\n let endIndex = this.getIndexOfChar(end);\n if (startIndex < 0 || endIndex < 0) return null;\n switch (direction) {\n case \"DOWN\":\n if (end === EMPTY_CHAR) {\n endIndex = this.characterList.length;\n } else if (endIndex < startIndex) {\n endIndex += this.numOriginalCharacters;\n }\n break;\n case \"UP\":\n if (startIndex < endIndex) {\n startIndex += this.numOriginalCharacters;\n }\n break;\n case \"ANY\":\n if (start !== EMPTY_CHAR && end !== EMPTY_CHAR) {\n if (endIndex < startIndex) {\n const nonWrap = startIndex - endIndex;\n const wrap = this.numOriginalCharacters - startIndex + endIndex;\n if (wrap < nonWrap) endIndex += this.numOriginalCharacters;\n } else if (startIndex < endIndex) {\n const nonWrap = endIndex - startIndex;\n const wrap = this.numOriginalCharacters - endIndex + startIndex;\n if (wrap < nonWrap) startIndex += this.numOriginalCharacters;\n }\n }\n break;\n }\n return { startIndex, endIndex };\n }\n getSupportedCharacters() {\n return new Set(this.characterIndicesMap.keys());\n }\n getCharacterList() {\n return this.characterList;\n }\n getIndexOfChar(c) {\n if (c === EMPTY_CHAR) return 0;\n if (this.characterIndicesMap.has(c)) return this.characterIndicesMap.get(c) + 1;\n return -1;\n }\n}\nconst ACTION_SAME = 0;\nconst ACTION_INSERT = 1;\nconst ACTION_DELETE = 2;\nfunction computeColumnActions(source, target, supported) {\n let si = 0, ti = 0;\n const actions = [];\n while (true) {\n const endS = si === source.length;\n const endT = ti === target.length;\n if (endS && endT) break;\n if (endS) {\n for (; ti < target.length; ti++) actions.push(ACTION_INSERT);\n break;\n }\n if (endT) {\n for (; si < source.length; si++) actions.push(ACTION_DELETE);\n break;\n }\n const sSupp = supported.has(source[si]);\n const tSupp = supported.has(target[ti]);\n if (sSupp && tSupp) {\n let se = si + 1, te = ti + 1;\n while (se < source.length && supported.has(source[se])) se++;\n while (te < target.length && supported.has(target[te])) te++;\n const sLen = se - si, tLen = te - ti;\n if (sLen === tLen) {\n for (let i = 0; i < sLen; i++) actions.push(ACTION_SAME);\n } else {\n const matrix = Array(sLen + 1).fill(null).map(() => Array(tLen + 1).fill(0));\n for (let i = 0; i <= sLen; i++) matrix[i][0] = i;\n for (let j = 0; j <= tLen; j++) matrix[0][j] = j;\n for (let r2 = 1; r2 <= sLen; r2++) {\n for (let c2 = 1; c2 <= tLen; c2++) {\n const cost = source[si + r2 - 1] === target[ti + c2 - 1] ? 0 : 1;\n matrix[r2][c2] = Math.min(matrix[r2 - 1][c2] + 1, matrix[r2][c2 - 1] + 1, matrix[r2 - 1][c2 - 1] + cost);\n }\n }\n const result = [];\n let r = sLen, c = tLen;\n while (r > 0 || c > 0) {\n if (r === 0) {\n result.push(ACTION_INSERT);\n c--;\n } else if (c === 0) {\n result.push(ACTION_DELETE);\n r--;\n } else {\n const ins = matrix[r][c - 1], del = matrix[r - 1][c], rep = matrix[r - 1][c - 1];\n if (ins < del && ins < rep) {\n result.push(ACTION_INSERT);\n c--;\n } else if (del < rep) {\n result.push(ACTION_DELETE);\n r--;\n } else {\n result.push(ACTION_SAME);\n r--;\n c--;\n }\n }\n }\n for (let i = result.length - 1; i >= 0; i--) actions.push(result[i]);\n }\n si = se;\n ti = te;\n } else if (sSupp) {\n actions.push(ACTION_INSERT);\n ti++;\n } else if (tSupp) {\n actions.push(ACTION_DELETE);\n si++;\n } else {\n actions.push(ACTION_SAME);\n si++;\n ti++;\n }\n }\n return actions;\n}\nfunction createColumn() {\n return {\n currentChar: EMPTY_CHAR,\n targetChar: EMPTY_CHAR,\n charList: null,\n startIndex: 0,\n endIndex: 0,\n sourceWidth: 0,\n currentWidth: 0,\n targetWidth: 0,\n directionAdj: 1,\n prevDelta: 0,\n currDelta: 0\n };\n}\nfunction setTarget(col, target, lists, dir) {\n const c = { ...col };\n c.targetChar = target;\n c.sourceWidth = c.currentWidth;\n c.targetWidth = target === EMPTY_CHAR ? 0 : 1;\n let found = false;\n for (const list of lists) {\n const indices = list.getCharacterIndices(c.currentChar, target, dir);\n if (indices) {\n c.charList = list.getCharacterList();\n c.startIndex = indices.startIndex;\n c.endIndex = indices.endIndex;\n found = true;\n break;\n }\n }\n if (!found) {\n c.charList = c.currentChar === target ? [c.currentChar] : [c.currentChar, target];\n c.startIndex = 0;\n c.endIndex = c.currentChar === target ? 0 : 1;\n }\n c.directionAdj = c.endIndex >= c.startIndex ? 1 : -1;\n c.prevDelta = c.currDelta;\n c.currDelta = 0;\n return c;\n}\nfunction applyProgress(col, progress, forceUpdate = false) {\n const c = { ...col };\n const total = Math.abs(c.endIndex - c.startIndex);\n const pos = progress * total;\n const offset = pos - Math.floor(pos);\n const additional = c.prevDelta * (1 - progress);\n const delta = offset * c.directionAdj + additional;\n const charIdx = c.startIndex + Math.floor(pos) * c.directionAdj;\n if (progress >= 1) {\n c.currentChar = c.targetChar;\n c.currDelta = 0;\n c.prevDelta = 0;\n } else if (forceUpdate && c.charList && charIdx >= 0 && charIdx < c.charList.length) {\n c.currentChar = c.charList[charIdx];\n c.currDelta = delta;\n }\n c.currentWidth = c.sourceWidth + (c.targetWidth - c.sourceWidth) * progress;\n return { col: c, charIdx, delta };\n}\nconst easingFunctions = {\n linear: (t) => t,\n easeIn: (t) => t * t,\n easeOut: (t) => 1 - (1 - t) * (1 - t),\n easeInOut: (t) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t) => {\n const n1 = 7.5625;\n const d1 = 2.75;\n if (t < 1 / d1) {\n return n1 * t * t;\n } else if (t < 2 / d1) {\n return n1 * (t -= 1.5 / d1) * t + 0.75;\n } else if (t < 2.5 / d1) {\n return n1 * (t -= 2.25 / d1) * t + 0.9375;\n } else {\n return n1 * (t -= 2.625 / d1) * t + 0.984375;\n }\n }\n};\nexport {\n ACTION_INSERT as A,\n EMPTY_CHAR as E,\n TickerUtils as T,\n TickerCharacterList as a,\n applyProgress as b,\n computeColumnActions as c,\n createColumn as d,\n ACTION_SAME as e,\n easingFunctions as f,\n ACTION_DELETE as g,\n setTarget as s\n};\n//# sourceMappingURL=TickerCore-C7Ejc9kB.js.map\n","import { defineComponent, ref, computed, watch, onUnmounted, createElementBlock, openBlock, normalizeClass, Fragment, renderList, normalizeStyle, toDisplayString, unref } from \"vue\";\nimport { a as TickerCharacterList, b as applyProgress, c as computeColumnActions, A as ACTION_INSERT, s as setTarget, d as createColumn, e as ACTION_SAME, E as EMPTY_CHAR, f as easingFunctions } from \"./TickerCore-C7Ejc9kB.js\";\nimport { g, T } from \"./TickerCore-C7Ejc9kB.js\";\nconst charHeight = 1.2;\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"Ticker\",\n props: {\n value: { type: String, required: true },\n characterLists: { type: Array, default: () => [\"0123456789\"] },\n duration: { type: Number, default: 500 },\n direction: { type: String, default: \"ANY\" },\n easing: { type: String, default: \"easeInOut\" },\n className: { type: String, default: \"\" },\n charWidth: { type: Number, default: 1 }\n },\n setup(__props) {\n const props = __props;\n const columns = ref([]);\n const progress = ref(1);\n let animId;\n const lists = computed(() => props.characterLists.map((s) => new TickerCharacterList(s)));\n const supported = computed(() => {\n const set = /* @__PURE__ */ new Set();\n lists.value.forEach((l) => l.getSupportedCharacters().forEach((c) => set.add(c)));\n return set;\n });\n watch(() => props.value, (newValue, oldValue) => {\n if (newValue === oldValue) return;\n if (animId) {\n cancelAnimationFrame(animId);\n animId = void 0;\n }\n let currentCols = columns.value;\n if (progress.value < 1 && progress.value > 0) {\n currentCols = currentCols.map((c) => applyProgress(c, progress.value, true).col);\n }\n const targetChars = [...newValue];\n const sourceChars = currentCols.map((c) => c.currentChar);\n const actions = computeColumnActions(sourceChars, targetChars, supported.value);\n let ci = 0, ti = 0;\n const result = [];\n const validCols = currentCols.filter((c) => c.currentWidth > 0);\n for (const action of actions) {\n if (action === ACTION_INSERT) {\n result.push(setTarget(createColumn(), targetChars[ti++], lists.value, props.direction));\n } else if (action === ACTION_SAME) {\n const existing = validCols[ci++] || createColumn();\n result.push(setTarget(existing, targetChars[ti++], lists.value, props.direction));\n } else {\n const existing = validCols[ci++] || createColumn();\n result.push(setTarget(existing, EMPTY_CHAR, lists.value, props.direction));\n }\n }\n columns.value = result;\n progress.value = 0;\n const start = performance.now();\n const dur = props.duration;\n const easeFn = easingFunctions[props.easing] || easingFunctions.linear;\n let lastUpdate = 0;\n const animate = (now) => {\n const linearP = Math.min((now - start) / dur, 1);\n const p = easeFn(linearP);\n const shouldUpdate = now - lastUpdate >= 16 || linearP >= 1;\n if (shouldUpdate) {\n lastUpdate = now;\n progress.value = p;\n }\n if (linearP < 1) {\n animId = requestAnimationFrame(animate);\n } else {\n const final = columns.value.map((c) => applyProgress(c, 1).col).filter((c) => c.currentWidth > 0);\n columns.value = final;\n progress.value = 1;\n animId = void 0;\n }\n };\n animId = requestAnimationFrame(animate);\n }, { immediate: true });\n onUnmounted(() => {\n if (animId) cancelAnimationFrame(animId);\n });\n const renderedColumns = computed(() => {\n return columns.value.map((col) => {\n const { charIdx, delta } = applyProgress(col, progress.value);\n const width = col.sourceWidth + (col.targetWidth - col.sourceWidth) * progress.value;\n if (width <= 0) return { width, chars: [] };\n const chars = [];\n const list = col.charList || [];\n const deltaEm = delta * charHeight;\n const add = (idx, offsetMod, keyPrefix) => {\n if (idx >= 0 && idx < list.length) {\n chars.push({\n key: `${keyPrefix}-${idx}`,\n char: list[idx],\n offset: deltaEm + offsetMod\n });\n }\n };\n add(charIdx, 0, \"c\");\n add(charIdx + 1, -charHeight, \"n\");\n add(charIdx - 1, charHeight, \"p\");\n const isFW = (c) => c && c.length > 0 && c.charCodeAt(0) > 255;\n const getW = (c) => isFW(c) ? 1.25 : 0.8;\n const startChar = list[col.startIndex] || \"\";\n const endChar = list[col.endIndex] || \"\";\n const w1 = getW(startChar);\n const w2 = getW(endChar);\n const baseW = w1 + (w2 - w1) * progress.value;\n return { width, chars, baseW };\n }).filter((c) => c.width > 0);\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\"ticker\", __props.className])\n }, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(renderedColumns.value, (col, i) => {\n return openBlock(), createElementBlock(\"div\", {\n key: i,\n class: \"ticker-column\",\n style: normalizeStyle({ width: `${col.width * (col.baseW || 0.8) * __props.charWidth}em` })\n }, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(col.chars, (charObj) => {\n return openBlock(), createElementBlock(\"div\", {\n key: charObj.key,\n class: \"ticker-char\",\n style: normalizeStyle({ transform: `translateY(${charObj.offset}em)` })\n }, toDisplayString(charObj.char === unref(EMPTY_CHAR) ? \" \" : charObj.char), 5);\n }), 128))\n ], 4);\n }), 128))\n ], 2);\n };\n }\n});\nconst _export_sfc = (sfc, props) => {\n const target = sfc.__vccOpts || sfc;\n for (const [key, val] of props) {\n target[key] = val;\n }\n return target;\n};\nconst Ticker = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__scopeId\", \"data-v-7e47ac69\"]]);\nexport {\n g as ACTION_DELETE,\n ACTION_INSERT,\n ACTION_SAME,\n EMPTY_CHAR,\n Ticker,\n TickerCharacterList,\n T as TickerUtils,\n applyProgress,\n computeColumnActions,\n createColumn,\n easingFunctions,\n setTarget\n};\n//# sourceMappingURL=vue.js.map\n","<script setup lang=\"ts\">\r\nimport { Ticker as SmartTicker } from '@tombcato/smart-ticker/vue';\r\nimport '@tombcato/smart-ticker/style.css';\r\n\r\nconst props = defineProps<{\r\n text?: string;\r\n className?: string;\r\n placeholder?: string;\r\n}>();\r\n</script>\r\n\r\n<template>\r\n <span v-if=\"!text && placeholder\" :class=\"['apmsu-placeholder', className]\">\r\n {{ placeholder }}\r\n </span>\r\n <span v-else-if=\"text\" :class=\"['inline-flex min-w-0', className]\">\r\n <SmartTicker :value=\"text\" :char-width=\"0.8\" :duration=\"300\" />\r\n </span>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted, onUnmounted } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\nimport SmartText from './SmartText.vue';\r\n\r\ninterface Props {\r\n providers: Provider[];\r\n selectedProviderId: string;\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n select: [providerId: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst triggerRef = ref<HTMLDivElement | null>(null);\r\nconst t = computed(() => I18N[props.language]);\r\nconst selectedProvider = computed(() => props.providers.find(p => p.id === props.selectedProviderId));\r\n\r\nfunction handleClickOutside(e: MouseEvent) {\r\n if (triggerRef.value && !triggerRef.value.contains(e.target as Node)) {\r\n isOpen.value = false;\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nonUnmounted(() => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nfunction handleSelect(id: string) {\r\n emit('select', id);\r\n isOpen.value = false;\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-field\" ref=\"triggerRef\">\r\n <label class=\"apmsu-label\">{{ t.providerLabel }}</label>\r\n <div class=\"relative\">\r\n <button\r\n type=\"button\"\r\n @click=\"!disabled && (isOpen = !isOpen)\"\r\n :disabled=\"disabled\"\r\n class=\"apmsu-select-trigger\"\r\n >\r\n <div v-if=\"selectedProvider\" class=\"flex items-center gap-2 min-w-0\">\r\n <img :src=\"selectedProvider.icon\" :alt=\"selectedProvider.name\" class=\"apmsu-provider-icon\" />\r\n <SmartText :text=\"selectedProvider.name\" />\r\n </div>\r\n <span v-else class=\"apmsu-placeholder\">{{ t.selectProvider }}</span>\r\n <svg \r\n :class=\"['apmsu-chevron', isOpen ? 'rotate-180' : '']\" \r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <div :class=\"['apmsu-dropdown max-h-[300px] overflow-auto p-1 origin-top', isOpen ? 'apmsu-dropdown-open' : '']\">\r\n <button\r\n v-for=\"p in providers\"\r\n :key=\"p.id\"\r\n type=\"button\"\r\n @click=\"handleSelect(p.id)\"\r\n :class=\"['apmsu-dropdown-item rounded-sm', selectedProviderId === p.id && 'apmsu-dropdown-item-active']\"\r\n >\r\n <div class=\"flex items-center gap-2 flex-shrink-0\">\r\n <img :src=\"p.icon\" :alt=\"p.name\" class=\"apmsu-provider-icon\" />\r\n <span class=\"font-medium whitespace-nowrap\">{{ p.name }}</span>\r\n </div>\r\n <span class=\"apmsu-hint-text ml-auto text-right truncate flex-1 min-w-0\">\r\n {{ p.baseUrl.replace('https://', '') }}\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n apiKey: string;\r\n testStatus: 'idle' | 'testing' | 'success' | 'error';\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n 'update:apiKey': [value: string];\r\n}>();\r\n\r\nconst isVisible = ref(false);\r\nconst t = computed(() => I18N[props.language]);\r\n\r\nconst inputClass = computed(() => {\r\n if (props.testStatus === 'success') return 'apmsu-input apmsu-input-success';\r\n return 'apmsu-input apmsu-input-default';\r\n});\r\n</script>\r\n\r\n<template>\r\n <div v-if=\"provider && provider.needsApiKey\" class=\"apmsu-field\">\r\n <label class=\"apmsu-label\">{{ t.apiKeyLabel }}</label>\r\n <div class=\"relative\">\r\n <input\r\n :type=\"isVisible ? 'text' : 'password'\"\r\n :value=\"apiKey\"\r\n @input=\"emit('update:apiKey', ($event.target as HTMLInputElement).value)\"\r\n @focus=\"isVisible = true\"\r\n @blur=\"isVisible = false\"\r\n :placeholder=\"t.apiKeyPlaceholder\"\r\n :disabled=\"disabled\"\r\n :class=\"[inputClass, 'pr-10']\"\r\n />\r\n <span class=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center\">\r\n <svg v-if=\"isVisible\" class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\r\n </svg>\r\n <svg v-else class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted, onUnmounted } from 'vue';\r\nimport { I18N, type Language, type Provider, type Model } from '@tombcato/ai-selector-core';\r\nimport SmartText from './SmartText.vue';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n models: Model[];\r\n selectedModelId: string;\r\n hasApiKey: boolean;\r\n disabled?: boolean;\r\n language?: Language;\r\n isFetchingModels?: boolean;\r\n fetchModelError?: string | null;\r\n selectedModelName?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n select: [modelId: string, modelName?: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst modelSearch = ref('');\r\nconst triggerRef = ref<HTMLDivElement | null>(null);\r\nconst t = computed(() => I18N[props.language]);\r\n\r\nconst filteredModels = computed(() =>\r\n props.models.filter(m =>\r\n m.name.toLowerCase().includes(modelSearch.value.toLowerCase()) ||\r\n m.id.toLowerCase().includes(modelSearch.value.toLowerCase())\r\n )\r\n);\r\n\r\nconst activeModelName = computed(() => \r\n props.models.find(m => m.id === props.selectedModelId)?.name || props.selectedModelName || props.selectedModelId\r\n);\r\n\r\nfunction handleClickOutside(e: MouseEvent) {\r\n if (triggerRef.value && !triggerRef.value.contains(e.target as Node)) {\r\n isOpen.value = false;\r\n modelSearch.value = '';\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nonUnmounted(() => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nfunction handleSelect(id: string, name?: string) {\r\n emit('select', id, name);\r\n isOpen.value = false;\r\n modelSearch.value = '';\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-field\" ref=\"triggerRef\">\r\n <label class=\"apmsu-label flex items-center justify-between\">\r\n <span>{{ t.modelLabel }}</span>\r\n </label>\r\n <div class=\"relative\">\r\n <button\r\n type=\"button\"\r\n @click=\"!disabled && provider && (isOpen = !isOpen)\"\r\n :disabled=\"disabled || !provider\"\r\n class=\"apmsu-select-trigger\"\r\n >\r\n <SmartText \r\n :text=\"activeModelName ? activeModelName : ''\"\r\n :placeholder=\"t.selectModel\"\r\n />\r\n <svg \r\n :class=\"['apmsu-chevron', isOpen ? 'rotate-180' : '']\" \r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <div :class=\"['apmsu-dropdown origin-top', isOpen ? 'apmsu-dropdown-open' : '']\">\r\n <div class=\"p-1.5 border-b border-gray-100 dark:border-zinc-800\">\r\n <input\r\n type=\"text\"\r\n v-model=\"modelSearch\"\r\n :placeholder=\"t.searchModel\"\r\n class=\"apmsu-select-trigger\"\r\n :autofocus=\"isOpen\"\r\n />\r\n </div>\r\n <div class=\"max-h-60 overflow-auto\">\r\n <button\r\n v-if=\"modelSearch && !filteredModels.some(m => m.id === modelSearch)\"\r\n type=\"button\"\r\n @click=\"handleSelect(modelSearch)\"\r\n class=\"apmsu-dropdown-item bg-blue-50 dark:bg-blue-900/20 border-b\"\r\n >\r\n <span class=\"text-blue-500\">{{ t.useCustom }}: {{ modelSearch }}</span>\r\n </button>\r\n <button\r\n v-for=\"m in filteredModels\"\r\n :key=\"m.id\"\r\n type=\"button\"\r\n @click=\"handleSelect(m.id, m.name)\"\r\n :class=\"['apmsu-dropdown-item', selectedModelId === m.id && 'apmsu-dropdown-item-active']\"\r\n >\r\n <span>{{ m.name }}</span>\r\n </button>\r\n <div v-if=\"filteredModels.length === 0 && !modelSearch\" class=\"p-4 text-center apmsu-hint-text\">\r\n {{ t.noModels }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Status Messages Container - only for supportsModelsApi providers -->\r\n <div v-if=\"provider?.supportsModelsApi\" class=\"min-h-[20px] flex items-center\">\r\n <p v-if=\"isFetchingModels\" class=\"apmsu-hint-text animate-pulse\">\r\n {{ t.refreshingModels }}\r\n </p>\r\n \r\n <p v-else-if=\"fetchModelError\" class=\"apmsu-hint-text dark:text-zinc-500\">\r\n {{ (t as any)[fetchModelError] || fetchModelError }}\r\n </p>\r\n\r\n <p v-else-if=\"provider?.needsApiKey && !hasApiKey\" class=\"apmsu-hint-text\">\r\n {{ t.apiKeyTip }}\r\n </p>\r\n\r\n <p v-else class=\"apmsu-hint-text\">\r\n {{ t.modelListUpdated }}\r\n </p>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n baseUrl: string;\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n 'update:baseUrl': [value: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst t = computed(() => I18N[props.language]);\r\n</script>\r\n\r\n<template>\r\n <template v-if=\"provider\">\r\n <button\r\n type=\"button\"\r\n @click=\"isOpen = !isOpen\"\r\n class=\"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 flex items-center gap-1 transition-colors\"\r\n >\r\n <svg \r\n :class=\"['w-3 h-3 transition-transform', isOpen && 'rotate-90']\" \r\n fill=\"none\" \r\n stroke=\"currentColor\" \r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\r\n </svg>\r\n {{ t.customBaseUrl }}\r\n </button>\r\n\r\n <div\r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: isOpen ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <input\r\n type=\"text\"\r\n :value=\"baseUrl\"\r\n @input=\"emit('update:baseUrl', ($event.target as HTMLInputElement).value)\"\r\n :placeholder=\"provider.baseUrl\"\r\n :disabled=\"disabled\"\r\n class=\"apmsu-input apmsu-input-default\"\r\n />\r\n </div>\r\n </div>\r\n </template>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, watch } from 'vue';\r\nimport { useAIConfig } from './useAIConfig';\r\n\r\nimport { I18N, type Language, type AIConfig, type ProviderConfig, type TestConnectionResult, type ModelFetcher } from '@tombcato/ai-selector-core';\r\n\r\n// Sub-components\r\nimport ProviderSelect from './ProviderSelect.vue';\r\nimport AuthInput from './AuthInput.vue';\r\nimport ModelSelect from './ModelSelect.vue';\r\nimport BaseUrlInput from './BaseUrlInput.vue';\r\n\r\ninterface Props {\r\n proxyUrl: string;\r\n config?: ProviderConfig;\r\n initialConfig?: Partial<AIConfig>;\r\n title?: string;\r\n showPreview?: boolean;\r\n saveButtonText?: string;\r\n disabled?: boolean;\r\n onSerialize?: (data: any) => string;\r\n onDeserialize?: (data: string) => any;\r\n language?: Language;\r\n modelFetcher?: ModelFetcher;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n showPreview: false,\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n save: [config: AIConfig];\r\n testResult: [result: TestConnectionResult];\r\n change: [config: Partial<AIConfig>];\r\n}>();\r\n\r\nconst {\r\n providerId,\r\n apiKey,\r\n model,\r\n modelName,\r\n baseUrl,\r\n models,\r\n testStatus,\r\n testResult,\r\n provider,\r\n providers,\r\n isValid,\r\n config: currentConfig,\r\n runTest,\r\n save,\r\n selectModel,\r\n isFetchingModels,\r\n fetchModelError,\r\n} = useAIConfig({\r\n proxyUrl: props.proxyUrl,\r\n providerConfig: props.config,\r\n initialConfig: props.initialConfig,\r\n onSerialize: props.onSerialize,\r\n onDeserialize: props.onDeserialize,\r\n modelFetcher: props.modelFetcher,\r\n});\r\n\r\nconst t = computed(() => I18N[props.language]);\r\nconst saveStatus = ref<'idle' | 'saved'>('idle');\r\nconst isPreviewOpen = ref(false);\r\n\r\n// Watch for changes\r\nwatch([providerId, apiKey, model, baseUrl], () => {\r\n emit('change', {\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n baseUrl: baseUrl.value,\r\n });\r\n});\r\n\r\n// Watch test result\r\nwatch(testResult, (result) => {\r\n if (result) emit('testResult', result);\r\n});\r\n\r\n// Handle save\r\nfunction handleSave() {\r\n save();\r\n saveStatus.value = 'saved';\r\n emit('save', currentConfig.value);\r\n setTimeout(() => { saveStatus.value = 'idle'; }, 2000);\r\n}\r\n\r\n// Handler wrappers for vue events\r\nfunction updateProvider(id: string) {\r\n providerId.value = id;\r\n}\r\n\r\nfunction updateApiKey(val: string) {\r\n apiKey.value = val;\r\n}\r\n\r\nfunction updateModel(id: string, name?: string) {\r\n selectModel(id, name);\r\n}\r\n\r\nfunction updateBaseUrl(val: string) {\r\n baseUrl.value = val;\r\n}\r\n\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-card\">\r\n <h2 v-if=\"title\" class=\"text-lg font-semibold mb-4\">{{ title }}</h2>\r\n\r\n <div class=\"space-y-3\">\r\n <ProviderSelect\r\n :providers=\"providers\"\r\n :selectedProviderId=\"providerId\"\r\n @select=\"updateProvider\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n />\r\n\r\n <BaseUrlInput\r\n :provider=\"provider\"\r\n :baseUrl=\"baseUrl\"\r\n @update:baseUrl=\"updateBaseUrl\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n />\r\n\r\n <!-- Auth & Model Collapsible Section -->\r\n <div :class=\"['transition-all duration-500 ease-in-out', providerId ? 'max-h-[1000px] opacity-100 overflow-visible' : 'max-h-0 opacity-0 overflow-hidden']\">\r\n <div class=\"space-y-4\">\r\n <AuthInput\r\n :provider=\"provider\"\r\n :apiKey=\"apiKey\"\r\n @update:apiKey=\"updateApiKey\"\r\n :testStatus=\"testStatus\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n :isFetchingModels=\"isFetchingModels\"\r\n :fetchModelError=\"fetchModelError\"\r\n />\r\n\r\n <ModelSelect\r\n :provider=\"provider\"\r\n :models=\"models\"\r\n :selectedModelId=\"model\"\r\n @select=\"updateModel\"\r\n :hasApiKey=\"!!apiKey\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n :isFetchingModels=\"isFetchingModels\"\r\n :fetchModelError=\"fetchModelError\"\r\n :selectedModelName=\"modelName\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"pt-2 space-y-2\">\r\n <div class=\"flex gap-2\">\r\n <button\r\n type=\"button\"\r\n @click=\"runTest()\"\r\n :disabled=\"!providerId || !apiKey || !model || disabled || testStatus === 'testing'\"\r\n :class=\"['apmsu-btn flex-1', \r\n testStatus === 'success' ? 'apmsu-btn-success' : \r\n testStatus === 'error' ? 'bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-900/40' : \r\n 'apmsu-btn-ghost border border-gray-200 dark:border-zinc-700'\r\n ]\"\r\n >\r\n <span v-if=\"testStatus === 'testing'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-spin\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" />\r\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\r\n </svg>\r\n {{ t.testing }}\r\n </span>\r\n <span v-else-if=\"testStatus === 'success'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-success\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />\r\n </svg>\r\n {{ t.testSuccess }} {{ testResult?.latencyMs ? `${testResult.latencyMs}ms` : '' }}\r\n </span>\r\n <span v-else-if=\"testStatus === 'error'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-error\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\" />\r\n </svg>\r\n {{ t.testFailed }}\r\n </span>\r\n <template v-else>{{ t.testConnection }}</template>\r\n </button>\r\n\r\n <button\r\n @click=\"handleSave\"\r\n :disabled=\"!isValid || disabled\"\r\n :class=\"['apmsu-btn flex-1', saveStatus === 'saved' ? 'apmsu-btn-success' : 'apmsu-btn-primary']\"\r\n >\r\n <span v-if=\"saveStatus === 'saved'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n {{ t.saved }}\r\n </span>\r\n <template v-else>{{ saveButtonText || t.save }}</template>\r\n </button>\r\n </div>\r\n\r\n <!-- Error Message -->\r\n <div\r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: (!testResult?.success && testResult?.message && testStatus !== 'testing' && testStatus !== 'success') ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <div class=\"p-2 rounded-md bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800\">\r\n <p class=\"text-xs text-red-600 dark:text-red-400 line-clamp-3 text-left\">{{ testResult?.message }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Config Preview - Collapsible -->\r\n <div v-if=\"showPreview && provider\" class=\"mt-6 border border-gray-200/50 dark:border-zinc-800 rounded-lg overflow-hidden\">\r\n <button\r\n type=\"button\"\r\n @click=\"isPreviewOpen = !isPreviewOpen\"\r\n class=\"w-full flex items-center justify-between px-4 py-3 bg-zinc-50 dark:bg-zinc-900/50 hover:bg-zinc-100 dark:hover:bg-zinc-800/50 transition-colors\"\r\n >\r\n <h3 class=\"text-xs font-medium text-gray-500 dark:text-zinc-500 uppercase tracking-wider\">{{ t.preview }}</h3>\r\n <svg \r\n :class=\"['w-4 h-4 text-gray-400 transition-transform duration-200', isPreviewOpen ? 'rotate-180' : '']\"\r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n <div \r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: isPreviewOpen ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <pre class=\"text-xs text-gray-600 dark:text-zinc-400 font-mono overflow-x-auto leading-relaxed p-4 bg-zinc-50 dark:bg-zinc-900/50\">\r\n{{ JSON.stringify({\r\n provider: provider.name,\r\n apiFormat: provider.apiFormat,\r\n baseUrl: baseUrl || provider.baseUrl,\r\n model: model || t.unselected,\r\n hasApiKey: !!apiKey\r\n}, null, 2) }}\r\n </pre>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n/* 样式已在 main.ts 中通过 style.css 导入 */\r\n</style>\r\n"],"names":["useAIConfig","options","providerId","ref","_a","apiKey","_b","model","_c","modelName","_d","baseUrl","_e","models","testStatus","testResult","isFetchingModels","fetchModelError","resolvedConfig","computed","resolveProviderConfig","allProviders","provider","p","storage","createConfigStorage","isLoaded","onMounted","saved","watch","fetchTimer","modelCache","shouldFetch","actualBaseUrl","cacheKey","cachedModels","staticModels","fetchedModels","fetchModels","e","runTest","result","fetcherResult","testConnection","save","foundModel","m","nameToSave","clear","selectModel","modelId","name","found","isValid","currentConfig","__defProp","__defNormalProp","obj","key","value","__publicField","EMPTY_CHAR","TickerCharacterList","characterList","charsArray","length","i","start","end","direction","startIndex","endIndex","nonWrap","c","ACTION_SAME","ACTION_INSERT","ACTION_DELETE","computeColumnActions","source","target","supported","si","ti","actions","endS","endT","sSupp","tSupp","se","te","sLen","tLen","matrix","j","r2","c2","cost","r","ins","del","rep","createColumn","setTarget","col","lists","dir","list","indices","applyProgress","progress","forceUpdate","total","pos","offset","additional","delta","charIdx","easingFunctions","charHeight","Ticker","sfc","props","val","defineComponent","__props","columns","animId","s","set","l","newValue","oldValue","currentCols","targetChars","sourceChars","ci","validCols","action","existing","dur","easeFn","lastUpdate","animate","now","linearP","final","onUnmounted","renderedColumns","width","chars","deltaEm","add","idx","offsetMod","keyPrefix","isFW","getW","startChar","endChar","w1","w2","baseW","_ctx","_cache","openBlock","createElementBlock","normalizeClass","Fragment","renderList","normalizeStyle","charObj","toDisplayString","unref","_createElementBlock","_createVNode","_unref","SmartTicker","emit","__emit","isOpen","triggerRef","t","I18N","selectedProvider","handleClickOutside","handleSelect","id","_createElementVNode","_hoisted_1","_toDisplayString","_hoisted_2","$event","_openBlock","_hoisted_4","SmartText","_hoisted_6","_Fragment","_renderList","_normalizeClass","_hoisted_8","_hoisted_10","_hoisted_11","isVisible","inputClass","_hoisted_3","_hoisted_5","_hoisted_7","modelSearch","filteredModels","activeModelName","_hoisted_9","_hoisted_12","_hoisted_13","_hoisted_14","providers","saveStatus","isPreviewOpen","handleSave","updateProvider","updateApiKey","updateModel","updateBaseUrl","ProviderSelect","BaseUrlInput","AuthInput","ModelSelect","_createTextVNode","_normalizeStyle","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19"],"mappings":"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","x_google_ignoreList":[1,2]}
package/package.json CHANGED
@@ -1,42 +1,42 @@
1
1
  {
2
- "name": "@tombcato/ai-selector-vue",
3
- "version": "0.1.0",
4
- "description": "Vue adapter for AI Provider Selector",
5
- "type": "module",
6
- "main": "./dist/index.js",
7
- "module": "./dist/index.js",
8
- "types": "./dist/index.d.ts",
9
- "peerDependencies": {
10
- "vue": "^3.0.0"
11
- },
12
- "dependencies": {
13
- "@tombcato/smart-ticker": "^1.0.4",
14
- "@tombcato/ai-selector-core": "0.1.0"
15
- },
16
- "exports": {
17
- ".": {
18
- "import": "./dist/index.js",
19
- "require": "./dist/index.umd.cjs",
20
- "types": "./dist/index.d.ts"
2
+ "name": "@tombcato/ai-selector-vue",
3
+ "version": "0.1.1",
4
+ "description": "Vue adapter for AI Provider Selector",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "peerDependencies": {
10
+ "vue": "^3.0.0"
21
11
  },
22
- "./style.css": "./dist/index.css"
23
- },
24
- "files": [
25
- "dist"
26
- ],
27
- "devDependencies": {
28
- "@vitejs/plugin-vue": "^6.0.3",
29
- "autoprefixer": "^10.4.23",
30
- "postcss": "^8.5.6",
31
- "tailwindcss": "^3.4.19",
32
- "typescript": "^5.3.0",
33
- "vite": "^6.4.1",
34
- "vue": "^3.3.0",
35
- "vue-tsc": "^3.2.1"
36
- },
37
- "scripts": {
38
- "build": "vite build && vue-tsc --emitDeclarationOnly --declaration",
39
- "build:demo": "vite build",
40
- "dev": "vite"
41
- }
12
+ "dependencies": {
13
+ "@tombcato/ai-selector-core": "workspace:*",
14
+ "@tombcato/smart-ticker": "^1.0.4"
15
+ },
16
+ "exports": {
17
+ ".": {
18
+ "import": "./dist/index.js",
19
+ "require": "./dist/index.umd.js",
20
+ "types": "./dist/index.d.ts"
21
+ },
22
+ "./style.css": "./dist/index.css"
23
+ },
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "devDependencies": {
28
+ "@vitejs/plugin-vue": "^6.0.3",
29
+ "autoprefixer": "^10.4.23",
30
+ "postcss": "^8.5.6",
31
+ "tailwindcss": "^3.4.19",
32
+ "typescript": "^5.3.0",
33
+ "vite": "^6.4.1",
34
+ "vue": "^3.3.0",
35
+ "vue-tsc": "^3.2.1"
36
+ },
37
+ "scripts": {
38
+ "build": "vite build && vue-tsc --emitDeclarationOnly --declaration",
39
+ "build:demo": "vite build -c vite.demo.config.ts",
40
+ "dev": "vite"
41
+ }
42
42
  }
@@ -1,3 +0,0 @@
1
- (function(V,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(V=typeof globalThis<"u"?globalThis:V||self,e(V.AISelectorVue={},V.Vue))})(this,(function(V,e){"use strict";const $={zh:{save:"保存配置",saved:"保存成功",providerLabel:"Provider",modelLabel:"Model",selectProvider:"选择 Provider...",customBaseUrl:"自定义 Base URL",apiKeyLabel:"API Key",apiKeyPlaceholder:"输入 API Key...",testConnection:"测试模型连接",testing:"测试中...",testSuccess:"连接成功",testFailed:"测试连通性失败",selectModel:"选择 Model...",searchModel:"搜索或自定义模型...",useCustom:"使用自定义",noModels:"暂无模型数据",apiKeyTip:"输入 API Key 后可获取完整模型列表",fetchModelsFailed:"拉取模型列表失败,已使用离线模型列表",refreshingModels:"列表刷新中...",modelListUpdated:"模型列表已刷新",preview:"配置预览",unselected:"(未选择)"},en:{save:"Save Config",saved:"Saved",providerLabel:"Provider",modelLabel:"Model",selectProvider:"Select Provider...",customBaseUrl:"Custom Base URL",apiKeyLabel:"API Key",apiKeyPlaceholder:"Enter API Key...",testConnection:"Test Model Connection",testing:"Testing...",testSuccess:"Connection Successful",testFailed:"Connection Failed",selectModel:"Select Model...",searchModel:"Search or custom models...",useCustom:"Use custom",noModels:"No models found",apiKeyTip:"Enter API Key to fetch full model list",fetchModelsFailed:"Failed to fetch model list, using offline models",refreshingModels:"Refreshing models...",modelListUpdated:"Model list updated",preview:"Config Preview",unselected:"(Unselected)"}},v="https://registry.npmmirror.com/@lobehub/icons-static-svg/1.77.0/files/icons",d={OPENAI:"openai",ANTHROPIC:"anthropic",GEMINI:"gemini",DEEPSEEK:"deepseek",OPENROUTER:"openrouter",GROQ:"groq",MISTRAL:"mistral",MOONSHOT:"moonshot",QWEN:"qwen",ZHIPU:"zhipu",SILICONFLOW:"siliconflow",XAI:"xai",TOGETHER:"together",FIREWORKS:"fireworks",DEEPINFRA:"deepinfra",PERPLEXITY:"perplexity",COHERE:"cohere",OLLAMA:"ollama",DOUBAO:"doubao",MINIMAX:"minimax"},X={[d.OPENAI]:{id:d.OPENAI,name:"OpenAI",baseUrl:"https://api.openai.com/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/openai.svg`},[d.ANTHROPIC]:{id:d.ANTHROPIC,name:"Anthropic (Claude)",baseUrl:"https://api.anthropic.com/v1",needsApiKey:!0,apiFormat:"anthropic",supportsModelsApi:!1,icon:`${v}/anthropic.svg`},[d.GEMINI]:{id:d.GEMINI,name:"Google Gemini",baseUrl:"https://generativelanguage.googleapis.com/v1beta",needsApiKey:!0,apiFormat:"gemini",supportsModelsApi:!0,icon:`${v}/gemini.svg`},[d.OPENROUTER]:{id:d.OPENROUTER,name:"OpenRouter",baseUrl:"https://openrouter.ai/api/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/openrouter.svg`},[d.DEEPSEEK]:{id:d.DEEPSEEK,name:"DeepSeek",baseUrl:"https://api.deepseek.com",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/deepseek.svg`},[d.MOONSHOT]:{id:d.MOONSHOT,name:"Moonshot (Kimi)",baseUrl:"https://api.moonshot.cn/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/moonshot.svg`},[d.QWEN]:{id:d.QWEN,name:"通义千问 (Qwen)",baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/qwen.svg`},[d.ZHIPU]:{id:d.ZHIPU,name:"智谱 AI (GLM)",baseUrl:"https://open.bigmodel.cn/api/paas/v4",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/zhipu.svg`},[d.SILICONFLOW]:{id:d.SILICONFLOW,name:"硅基流动 (siliconflow)",baseUrl:"https://api.siliconflow.cn/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/siliconcloud.svg`},[d.DOUBAO]:{id:d.DOUBAO,name:"火山方舟 (Doubao)",baseUrl:"https://ark.cn-beijing.volces.com/api/v3",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/doubao.svg`},[d.MINIMAX]:{id:d.MINIMAX,name:"MiniMax",baseUrl:"https://api.minimax.io/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!1,icon:`${v}/minimax.svg`},[d.XAI]:{id:d.XAI,name:"xAI (Grok)",baseUrl:"https://api.x.ai/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/grok.svg`},[d.GROQ]:{id:d.GROQ,name:"Groq",baseUrl:"https://api.groq.com/openai/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/groq.svg`},[d.MISTRAL]:{id:d.MISTRAL,name:"Mistral AI",baseUrl:"https://api.mistral.ai/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/mistral.svg`},[d.TOGETHER]:{id:d.TOGETHER,name:"Together AI",baseUrl:"https://api.together.xyz/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/together.svg`},[d.FIREWORKS]:{id:d.FIREWORKS,name:"Fireworks AI",baseUrl:"https://api.fireworks.ai/inference/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/fireworks.svg`},[d.DEEPINFRA]:{id:d.DEEPINFRA,name:"DeepInfra",baseUrl:"https://api.deepinfra.com/v1/openai",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/deepinfra.svg`},[d.PERPLEXITY]:{id:d.PERPLEXITY,name:"Perplexity",baseUrl:"https://api.perplexity.ai",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!1,icon:`${v}/perplexity.svg`},[d.COHERE]:{id:d.COHERE,name:"Cohere",baseUrl:"https://api.cohere.com/v2",needsApiKey:!0,apiFormat:"cohere",supportsModelsApi:!0,icon:`${v}/cohere.svg`},[d.OLLAMA]:{id:d.OLLAMA,name:"Ollama (Local)",baseUrl:"http://localhost:11434/v1",needsApiKey:!1,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/ollama.svg`}},ne={[d.OPENAI]:[{id:"gpt-5.2-pro",name:"GPT-5.2 Pro"},{id:"gpt-5.2",name:"GPT-5.2"},{id:"gpt-5",name:"GPT-5"},{id:"gpt-5-mini",name:"GPT-5 Mini"},{id:"gpt-5-nano",name:"GPT-5 Nano"},{id:"gpt-4.1",name:"GPT-4.1"}],[d.ANTHROPIC]:[{id:"claude-opus-4.5-20251101",name:"Claude Opus 4.5"},{id:"claude-opus-4.5-20251101-thinking",name:"Claude Opus 4.5 Thinking"},{id:"claude-sonnet-4.5-20250929",name:"Claude Sonnet 4.5"},{id:"claude-sonnet-4.5-20250929-thinking",name:"Claude Sonnet 4.5 Thinking"},{id:"claude-haiku-4.5-20251001",name:"Claude Haiku 4.5"},{id:"claude-haiku-4.5-20251001-thinking",name:"Claude Haiku 4.5 Thinking"},{id:"claude-opus-4.1-20250805",name:"Claude Opus 4.1"},{id:"claude-opus-4.1-20250805-thinking",name:"Claude Opus 4.1 Thinking"}],[d.GEMINI]:[{id:"gemini-3-flash-preview",name:"Gemini 3 Flash Preview"},{id:"gemini-3-pro-preview",name:"Gemini 3 Pro Preview"},{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash"},{id:"gemini-2.5-flash-lite",name:"Gemini 2.5 Flash-Lite"}],[d.DEEPSEEK]:[{id:"deepseek-chat",name:"Deepseek Chat"},{id:"deepseek-reasoner",name:"Deepseek Reasoner"}],[d.MISTRAL]:[{id:"mistral-large-latest",name:"Mistral Large"},{id:"mistral-medium-latest",name:"Mistral Medium"},{id:"mistral-small-latest",name:"Mistral Small"},{id:"codestral-latest",name:"Codestral"},{id:"devstral-latest",name:"Devstral"},{id:"magistral-medium-latest",name:"Magistral Medium"},{id:"pixtral-large-latest",name:"Pixtral Large"},{id:"pixtral-12b-latest",name:"Pixtral 12B"},{id:"ministral-8b-latest",name:"Ministral 8B"},{id:"ministral-3b-latest",name:"Ministral 3B"}],[d.GROQ]:[{id:"canopylabs/orpheus-v1-english",name:"Orpheus V1 English"},{id:"canopylabs/orpheus-arabic-saudi",name:"Orpheus Arabic Saudi"},{id:"moonshotai/kimi-k2-instruct",name:"Kimi K2 Instruct"},{id:"groq/compound-mini",name:"Compound Mini"},{id:"llama-3.3-70b-versatile",name:"Llama 3.3 70B Versatile"},{id:"openai/gpt-oss-120b",name:"Gpt Oss 120B"},{id:"qwen/qwen3-32b",name:"Qwen3 32B"},{id:"groq/compound",name:"Compound"},{id:"meta-llama/llama-4-maverick-17b-128e-instruct",name:"Llama 4 Maverick 17B 128E Instruct"}],[d.XAI]:[{id:"grok-4",name:"Grok 4"},{id:"grok-4-fast",name:"Grok 4 Fast"},{id:"grok-3-latest",name:"Grok 3"},{id:"grok-3-fast",name:"Grok 3 Fast"},{id:"grok-3-mini-latest",name:"Grok 3 Mini"},{id:"grok-3-mini-fast",name:"Grok 3 Mini Fast"},{id:"grok-vision-beta",name:"Grok Vision (Beta)"}],[d.TOGETHER]:[{id:"Qwen/Qwen2.5-72B-Instruct-Turbo",name:"Qwen2.5 72B Instruct Turbo"},{id:"Qwen/Qwen3-235B-A22B-Thinking-2507",name:"Qwen3 235B A22B Thinking 2507"},{id:"deepseek-ai/DeepSeek-R1",name:"Deepseek R1"},{id:"deepseek-ai/DeepSeek-V3.1",name:"Deepseek V3.1"},{id:"meta-llama/Llama-3.2-3B-Instruct-Turbo",name:"Llama 3.2 3B Instruct Turbo"},{id:"meta-llama/Llama-3.3-70B-Instruct-Turbo",name:"Llama 3.3 70B Instruct Turbo"},{id:"meta-llama/Llama-3.3-70B-Instruct-Turbo-Free",name:"Llama 3.3 70B Instruct Turbo Free"}],[d.FIREWORKS]:[{id:"accounts/fireworks/models/llama4-scout-instruct-basic",name:"Llama4 Scout Instruct Basic"},{id:"accounts/fireworks/models/qwen3-vl-235b-a22b-thinking",name:"Qwen3 Vl 235B A22B Thinking"},{id:"accounts/fireworks/models/deepseek-v3p2",name:"Deepseek V3P2"},{id:"accounts/fireworks/models/qwen3-vl-30b-a3b-thinking",name:"Qwen3 Vl 30B A3B Thinking"},{id:"accounts/fireworks/models/qwen3-8b",name:"Qwen3 8B"},{id:"accounts/fireworks/models/qwen3-vl-30b-a3b-instruct",name:"Qwen3 Vl 30B A3B Instruct"},{id:"accounts/fireworks/models/qwen2p5-vl-32b-instruct",name:"Qwen2P5 Vl 32B Instruct"},{id:"accounts/fireworks/models/llama4-maverick-instruct-basic",name:"Llama4 Maverick Instruct Basic"},{id:"accounts/fireworks/models/qwen3-235b-a22b-thinking-2507",name:"Qwen3 235B A22B Thinking 2507"},{id:"accounts/fireworks/models/qwen3-coder-480b-a35b-instruct",name:"Qwen3 Coder 480B A35B Instruct"}],[d.DEEPINFRA]:[{id:"meta-llama/Llama-3.2-11B-Vision-Instruct",name:"Llama 3.2 11B Vision Instruct"},{id:"Qwen/Qwen3-32B",name:"Qwen3 32B"},{id:"NousResearch/Hermes-3-Llama-3.1-70B",name:"Hermes 3 Llama 3.1 70B"},{id:"Qwen/Qwen2.5-72B-Instruct",name:"Qwen2.5 72B Instruct"},{id:"deepseek-ai/DeepSeek-V3-0324",name:"Deepseek V3 0324"},{id:"Qwen/Qwen3-VL-235B-A22B-Instruct",name:"Qwen3 Vl 235B A22B Instruct"},{id:"meta-llama/Llama-3.2-3B-Instruct",name:"Llama 3.2 3B Instruct"},{id:"Qwen/Qwen2.5-VL-32B-Instruct",name:"Qwen2.5 Vl 32B Instruct"},{id:"meta-llama/Meta-Llama-3.1-8B-Instruct",name:"Meta Llama 3.1 8B Instruct"},{id:"Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo",name:"Qwen3 Coder 480B A35B Instruct Turbo"}],[d.OPENROUTER]:[{id:"google/gemini-3-flash-preview",name:"Gemini 3 Flash Preview"},{id:"mistralai/mistral-small-creative",name:"Mistral Small Creative"},{id:"openai/gpt-5.2-chat",name:"Gpt 5.2 Chat"},{id:"openai/gpt-5.2-pro",name:"Gpt 5.2 Pro"},{id:"openai/gpt-5.2",name:"Gpt 5.2"},{id:"mistralai/devstral-2512",name:"Devstral 2512"},{id:"openai/gpt-5.1-codex-max",name:"Gpt 5.1 Codex Max"},{id:"mistralai/ministral-14b-2512",name:"Ministral 14B 2512"},{id:"mistralai/ministral-8b-2512",name:"Ministral 8B 2512"},{id:"mistralai/ministral-3b-2512",name:"Ministral 3B 2512"},{id:"mistralai/mistral-large-2512",name:"Mistral Large 2512"},{id:"deepseek/deepseek-v3.2-speciale",name:"Deepseek V3.2 Speciale"}],[d.PERPLEXITY]:[{id:"codellama-34b-instruct",name:"Codellama 34B Instruct"},{id:"codellama-70b-instruct",name:"Codellama 70B Instruct"},{id:"llama-2-70b-chat",name:"Llama 2 70B Chat"},{id:"llama-3.1-70b-instruct",name:"Llama 3.1 70B Instruct"},{id:"llama-3.1-8b-instruct",name:"Llama 3.1 8B Instruct"},{id:"llama-3.1-sonar-huge-128k-online",name:"Llama 3.1 Sonar Huge 128K Online"},{id:"llama-3.1-sonar-large-128k-chat",name:"Llama 3.1 Sonar Large 128K Chat"},{id:"llama-3.1-sonar-large-128k-online",name:"Llama 3.1 Sonar Large 128K Online"},{id:"llama-3.1-sonar-small-128k-chat",name:"Llama 3.1 Sonar Small 128K Chat"}],[d.COHERE]:[{id:"command-a-vision-07-2025",name:"Command A Vision 07 2025"},{id:"command-a-reasoning-08-2025",name:"Command A Reasoning 08 2025"},{id:"command-r-08-2024",name:"Command R 08 2024"},{id:"command-r7b-arabic-02-2025",name:"Command R7B Arabic 02 2025"},{id:"command-r7b-12-2024",name:"Command R7B 12 2024"}],[d.MOONSHOT]:[{id:"moonshot-v1-128k",name:"Moonshot 128K"},{id:"moonshot-v1-32k",name:"Moonshot 32K"},{id:"moonshot-v1-8k",name:"Moonshot 8K"},{id:"kimi-k2-0711-chat",name:"Kimi K2 Chat"},{id:"moonshot-v1-auto",name:"Moonshot Auto"}],[d.QWEN]:[{id:"qwen-flash",name:"Qwen Flash"},{id:"qwen3-vl-plus-2025-12-19",name:"Qwen3 Vl Plus 2025 12 19"},{id:"qwen3-tts-vd-realtime-2025-12-16",name:"Qwen3 Tts Vd Realtime 2025 12 16"},{id:"qwen-image-edit-plus-2025-12-15",name:"Qwen Image Edit Plus 2025 12 15"},{id:"qwen3-omni-flash-2025-12-01",name:"Qwen3 Omni Flash 2025 12 01"},{id:"qwen3-omni-flash-realtime-2025-12-01",name:"Qwen3 Omni Flash Realtime 2025 12 01"},{id:"qwen3-livetranslate-flash-2025-12-01",name:"Qwen3 Livetranslate Flash 2025 12 01"},{id:"qwen3-livetranslate-flash",name:"Qwen3 Livetranslate Flash"},{id:"qwen-plus-2025-12-01",name:"Qwen Plus 2025 12 01"},{id:"qwen3-tts-vc-realtime-2025-11-27",name:"Qwen3 Tts Vc Realtime 2025 11 27"}],[d.ZHIPU]:[{id:"glm-4.5",name:"Glm 4.5"},{id:"glm-4.5-air",name:"Glm 4.5 Air"},{id:"glm-4.6",name:"Glm 4.6"},{id:"glm-4.7",name:"Glm 4.7"}],[d.SILICONFLOW]:[{id:"deepseek-ai/DeepSeek-V3.2",name:"Deepseek V3.2"},{id:"deepseek-ai/DeepSeek-V3.1-Terminus",name:"Deepseek V3.1 Terminus"},{id:"deepseek-ai/DeepSeek-R1",name:"Deepseek R1"},{id:"deepseek-ai/DeepSeek-V3",name:"Deepseek V3"},{id:"zai-org/GLM-4.6V",name:"Glm 4.6V"},{id:"zai-org/GLM-4.6",name:"Glm 4.6"},{id:"Pro/zai-org/GLM-4.7",name:"Glm 4.7"},{id:"Qwen/Qwen3-VL-32B-Instruct",name:"Qwen3 Vl 32B Instruct"}],[d.OLLAMA]:[{id:"llama3.3",name:"Llama 3.3"},{id:"llama3.2",name:"Llama 3.2"},{id:"qwq",name:"QwQ (推理)"},{id:"qwen3:32b",name:"Qwen3 32B"},{id:"deepseek-r1:32b",name:"DeepSeek R1 32B"},{id:"deepseek-coder-v2",name:"DeepSeek Coder V2"},{id:"gemma3:27b",name:"Gemma 3 27B"},{id:"mistral:7b",name:"Mistral 7B"},{id:"phi4",name:"Phi 4"},{id:"codellama",name:"Code Llama"}],[d.DOUBAO]:[{id:"doubao-seed-1-8-251215",name:"Doubao 1.8"},{id:"doubao-seed-1-6-251015",name:"Doubao 1.6"},{id:"doubao-seed-1-6-lite-251015",name:"Doubao 1.6 Lite"},{id:"doubao-seed-1-6-flash-250828",name:"Doubao 1.6 Flash"},{id:"doubao-seed-1-6-thinking-250615",name:"Doubao 1.6 Thinking"}],[d.MINIMAX]:[{id:"MiniMax-M2.1",name:"MiniMax M2.1"},{id:"MiniMax-M2.1-lightning",name:"MiniMax M2.1 Lightning"},{id:"MiniMax-M2",name:"MiniMax M2"}]};function _(t){return ne[t]||[]}const se=t=>Array.isArray(t==null?void 0:t.data)?t.data.filter(n=>n.id).map(n=>{const s=n.name||(n.id.split("/").pop()??"").replace(/[-_]/g," ").replace(/\b\w/g,i=>i.toUpperCase());return{id:n.id,name:s,created:n.created||0}}).sort((n,s)=>(s.created||0)-(n.created||0)):[],Y={format:"openai",getModelsEndpoint:t=>`${t}/models`,getChatEndpoint:t=>`${t}/chat/completions`,buildHeaders:t=>({"Content-Type":"application/json",Authorization:`Bearer ${t}`}),buildChatPayload:(t,n,s)=>({model:t,messages:n,max_tokens:s}),parseChatResponse:t=>{var n,s,i;return((i=(s=(n=t.choices)==null?void 0:n[0])==null?void 0:s.message)==null?void 0:i.content)||""}},oe={openai:Y,anthropic:{format:"anthropic",getChatEndpoint:t=>`${t}/messages`,buildHeaders:t=>({"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"}),buildChatPayload:(t,n,s)=>({model:t,messages:n,max_tokens:s}),parseChatResponse:t=>{var n,s;return((s=(n=t.content)==null?void 0:n[0])==null?void 0:s.text)||""}},gemini:{format:"gemini",getModelsEndpoint:(t,n)=>`${t}/models?key=${n}`,getChatEndpoint:(t,n,s)=>`${t}/models/${s}:generateContent?key=${n}`,buildHeaders:()=>({"Content-Type":"application/json"}),buildChatPayload:(t,n,s)=>({contents:n.map(a=>({role:a.role==="assistant"?"model":"user",parts:[{text:a.content}]})),generationConfig:{maxOutputTokens:s}}),parseChatResponse:t=>{var n,s,i,a,o;return((o=(a=(i=(s=(n=t.candidates)==null?void 0:n[0])==null?void 0:s.content)==null?void 0:i.parts)==null?void 0:a[0])==null?void 0:o.text)||""},parseModelsResponse:t=>Array.isArray(t.models)?t.models.filter(n=>{var s;return(s=n.supportedGenerationMethods)==null?void 0:s.includes("generateContent")}).map(n=>({id:n.name.replace("models/",""),name:n.displayName||n.name.replace("models/",""),created:n.created||0})).sort((n,s)=>(s.created||0)-(n.created||0)):[]},cohere:{format:"cohere",getModelsEndpoint:t=>`${t}/models`,getChatEndpoint:t=>`${t}/chat`,buildHeaders:t=>({"Content-Type":"application/json",Authorization:`Bearer ${t}`}),buildChatPayload:(t,n,s)=>{const i=n[n.length-1],a=n.slice(0,-1).map(o=>({role:o.role==="assistant"?"CHATBOT":"USER",message:o.content}));return{model:t,message:i.content,chat_history:a,max_tokens:s}},parseChatResponse:t=>t.text||""}};function J(t){return oe[t]||Y}async function ie(t){const{provider:n,apiKey:s,model:i,baseUrl:a,proxyUrl:o}=t,h=a||n.baseUrl,l=Date.now();try{if(o){const k=await(await fetch(`${o}/test`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider_id:n.id,api_key:s,model:i||"",base_url:a||n.baseUrl,api_format:n.apiFormat})})).json();return{success:k.success,latencyMs:k.latency_ms||Date.now()-l,message:k.message}}const r=J(n.apiFormat),m=i||"";if(!m)return{success:!1,latencyMs:0,message:"请先选择模型 (Please select a model)"};const c=r.buildHeaders(s),g=r.buildChatPayload(m,[{role:"user",content:"Hi"}],5),u=r.getChatEndpoint(h,s,m),f=await fetch(u,{method:"POST",headers:c,body:JSON.stringify(g)}),M=Date.now()-l;if(f.ok)return{success:!0,latencyMs:M,message:"连接成功"};{const E=await f.text();return{success:!1,latencyMs:M,message:`HTTP ${f.status}: ${E.slice(0,200)}`}}}catch(r){return{success:!1,latencyMs:Date.now()-l,message:r instanceof Error?r.message:String(r)}}}async function re(t){var h;const{provider:n,apiKey:s,baseUrl:i,proxyUrl:a,fallbackToStatic:o=!0}=t;if(a)try{const r=await(await fetch(`${a}/models`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider_id:n.id,api_key:s||void 0,base_url:i||n.baseUrl})})).json();if(r.success&&((h=r.models)==null?void 0:h.length)>0)return r.models}catch(l){if(console.warn("Failed to fetch models via proxy:",l),!o)throw l}if(!a&&n.supportsModelsApi)try{const l=J(n.apiFormat);if(l.getModelsEndpoint){const r=l.getModelsEndpoint(i||n.baseUrl,s||""),m=l.buildHeaders(s||""),c=await fetch(r,{method:"GET",headers:m});if(c.ok){const g=await c.json();return(l.parseModelsResponse||se)(g)}else if(!o)throw new Error(`HTTP ${c.status}`)}}catch(l){if(console.warn("Failed to fetch models directly:",l),!o)throw l}if(!o&&n.supportsModelsApi)throw new Error("Failed to fetch models");return _(n.id)}const G="ai_provider_config",le={get:t=>typeof window>"u"?null:localStorage.getItem(t),set:(t,n)=>{typeof window>"u"||localStorage.setItem(t,n)},remove:t=>{typeof window>"u"||localStorage.removeItem(t)}};function de(t=le,n={}){const s=n.serialize||JSON.stringify,i=n.deserialize||JSON.parse;return{save(a){try{const o=s(a);t.set(G,o)}catch(o){console.error("Failed to save config:",o)}},load(){const a=t.get(G);if(!a)return null;try{return i(a)}catch(o){return console.error("Failed to load config:",o),null}},clear(){t.remove(G)}}}function ce(t){if(!t)return{providers:Object.values(X),getModels:r=>_(r)};const{mode:n,include:s,exclude:i,custom:a}=t;let o=[];if(n==="default"){let r=Object.values(X);s&&s.length>0&&(r=r.filter(m=>s.includes(m.id))),i&&i.length>0&&(r=r.filter(m=>!i.includes(m.id))),o=[...r]}const h={};if(a)for(const[r,m]of Object.entries(a)){const c={id:r,name:m.name,baseUrl:m.baseUrl,needsApiKey:m.needsApiKey,apiFormat:m.apiFormat,supportsModelsApi:m.supportsModelsApi??!1,icon:m.icon},g=o.findIndex(u=>u.id===r);g>=0?o[g]={...o[g],...c,icon:c.icon||o[g].icon}:o.push(c),m.models&&m.models.length>0&&(h[r]=m.models)}return{providers:o,getModels:r=>h[r]?h[r]:_(r)}}function Z(t={}){var A,O,K,U,P;const n=e.ref(((A=t.initialConfig)==null?void 0:A.providerId)||""),s=e.ref(((O=t.initialConfig)==null?void 0:O.apiKey)||""),i=e.ref(((K=t.initialConfig)==null?void 0:K.model)||""),a=e.ref(((U=t.initialConfig)==null?void 0:U.modelName)||""),o=e.ref(((P=t.initialConfig)==null?void 0:P.baseUrl)||""),h=e.ref([]),l=e.ref("idle"),r=e.ref(null),m=e.ref(!1),c=e.ref(null),g=e.computed(()=>ce(t.providerConfig)),u=e.computed(()=>g.value.providers),f=e.computed(()=>u.value.find(p=>p.id===n.value)||null),M=de(void 0,{serialize:t.onSerialize,deserialize:t.onDeserialize}),E=e.ref(!1);e.onMounted(()=>{const p=M.load();p&&p.providerId&&u.value.some(y=>y.id===p.providerId)&&(n.value=p.providerId,p.apiKey&&(s.value=p.apiKey),p.model&&(i.value=p.model),p.modelName&&(a.value=p.modelName),p.baseUrl&&(o.value=p.baseUrl)),setTimeout(()=>{E.value=!0},0)}),e.watch(n,()=>{E.value&&(s.value="",i.value="",a.value="",o.value="",l.value="idle",r.value=null)});let k=null;const C=new Map;e.watch([n,s,o],()=>{if(k&&clearTimeout(k),!n.value||!f.value){h.value=[],c.value=null,m.value=!1;return}const p=f.value.supportsModelsApi&&(!f.value.needsApiKey||!!s.value),y=o.value||f.value.baseUrl,N=`${n.value}|${y}|${s.value}`,F=C.get(N);if(F){h.value=F,c.value=null,m.value=!1;return}if(!p){const S=g.value.getModels(n.value);h.value=S,C.set(N,S),c.value=null,m.value=!1;return}m.value=!0,c.value=null,h.value.length===0&&(h.value=g.value.getModels(n.value)),k=setTimeout(async()=>{try{let S;t.modelFetcher?S=await t.modelFetcher({type:"fetchModels",providerId:f.value.id,baseUrl:y,apiKey:s.value}):S=await re({provider:f.value,apiKey:s.value,baseUrl:y,proxyUrl:t.proxyUrl,fallbackToStatic:!1}),h.value=S,C.set(N,S)}catch(S){console.warn("Model fetch failed:",S),c.value="fetchModelsFailed",h.value=g.value.getModels(n.value)}finally{m.value=!1}},500)},{immediate:!0}),e.watch([s,o],()=>{(l.value==="error"||l.value==="success")&&(l.value="idle",r.value=null)});async function b(){if(!f.value||f.value.needsApiKey&&!s.value)return;l.value="testing",r.value=null;let p;if(t.modelFetcher)try{const y=await t.modelFetcher({type:"checkConnection",providerId:f.value.id,baseUrl:o.value||f.value.baseUrl,apiKey:s.value,modelId:i.value});p={success:y.success,latencyMs:y.latency||y.latencyMs,message:y.message}}catch(y){p={success:!1,message:y.message||"Unknown error"}}else p=await ie({provider:f.value,apiKey:s.value,baseUrl:o.value,model:i.value,proxyUrl:t.proxyUrl});return r.value=p,l.value=p.success?"success":"error",setTimeout(()=>{l.value="idle"},2e3),p}function B(){const p=h.value.find(N=>N.id===i.value),y=(p==null?void 0:p.name)||a.value||i.value;p!=null&&p.name&&p.name!==a.value&&(a.value=p.name),M.save({providerId:n.value,apiKey:s.value,model:i.value,modelName:y,baseUrl:o.value})}function x(){M.clear(),n.value="",s.value="",i.value="",a.value="",o.value=""}function I(p,y){if(i.value=p,y)a.value=y;else{const N=h.value.find(F=>F.id===p);a.value=(N==null?void 0:N.name)||p}}const T=e.computed(()=>{var p;return!(!n.value||!i.value||(p=f.value)!=null&&p.needsApiKey&&!s.value)}),w=e.computed(()=>{var p;return{providerId:n.value,apiKey:s.value,model:i.value,modelName:a.value,baseUrl:o.value||((p=f.value)==null?void 0:p.baseUrl)||""}});return{providerId:n,apiKey:s,model:i,modelName:a,baseUrl:o,models:h,testStatus:l,testResult:r,isFetchingModels:m,fetchModelError:c,provider:f,providers:u,isValid:T,config:w,runTest:b,save:B,clear:x,selectModel:I}}var me=Object.defineProperty,pe=(t,n,s)=>n in t?me(t,n,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[n]=s,Q=(t,n,s)=>pe(t,typeof n!="symbol"?n+"":n,s);const L="\0";class ue{constructor(n){Q(this,"numOriginalCharacters"),Q(this,"characterList"),Q(this,"characterIndicesMap");const s=[...n],i=s.length;this.numOriginalCharacters=i,this.characterIndicesMap=new Map;for(let a=0;a<i;a++)this.characterIndicesMap.set(s[a],a);this.characterList=new Array(i*2+1),this.characterList[0]=L;for(let a=0;a<i;a++)this.characterList[1+a]=s[a],this.characterList[1+i+a]=s[a]}getCharacterIndices(n,s,i){let a=this.getIndexOfChar(n),o=this.getIndexOfChar(s);if(a<0||o<0)return null;switch(i){case"DOWN":s===L?o=this.characterList.length:o<a&&(o+=this.numOriginalCharacters);break;case"UP":a<o&&(a+=this.numOriginalCharacters);break;case"ANY":if(n!==L&&s!==L){if(o<a){const h=a-o;this.numOriginalCharacters-a+o<h&&(o+=this.numOriginalCharacters)}else if(a<o){const h=o-a;this.numOriginalCharacters-o+a<h&&(a+=this.numOriginalCharacters)}}break}return{startIndex:a,endIndex:o}}getSupportedCharacters(){return new Set(this.characterIndicesMap.keys())}getCharacterList(){return this.characterList}getIndexOfChar(n){return n===L?0:this.characterIndicesMap.has(n)?this.characterIndicesMap.get(n)+1:-1}}const R=0,D=1,z=2;function he(t,n,s){let i=0,a=0;const o=[];for(;;){const h=i===t.length,l=a===n.length;if(h&&l)break;if(h){for(;a<n.length;a++)o.push(D);break}if(l){for(;i<t.length;i++)o.push(z);break}const r=s.has(t[i]),m=s.has(n[a]);if(r&&m){let c=i+1,g=a+1;for(;c<t.length&&s.has(t[c]);)c++;for(;g<n.length&&s.has(n[g]);)g++;const u=c-i,f=g-a;if(u===f)for(let M=0;M<u;M++)o.push(R);else{const M=Array(u+1).fill(null).map(()=>Array(f+1).fill(0));for(let b=0;b<=u;b++)M[b][0]=b;for(let b=0;b<=f;b++)M[0][b]=b;for(let b=1;b<=u;b++)for(let B=1;B<=f;B++){const x=t[i+b-1]===n[a+B-1]?0:1;M[b][B]=Math.min(M[b-1][B]+1,M[b][B-1]+1,M[b-1][B-1]+x)}const E=[];let k=u,C=f;for(;k>0||C>0;)if(k===0)E.push(D),C--;else if(C===0)E.push(z),k--;else{const b=M[k][C-1],B=M[k-1][C],x=M[k-1][C-1];b<B&&b<x?(E.push(D),C--):B<x?(E.push(z),k--):(E.push(R),k--,C--)}for(let b=E.length-1;b>=0;b--)o.push(E[b])}i=c,a=g}else r?(o.push(D),a++):m?(o.push(z),i++):(o.push(R),i++,a++)}return o}function H(){return{currentChar:L,targetChar:L,charList:null,startIndex:0,endIndex:0,sourceWidth:0,currentWidth:0,targetWidth:0,directionAdj:1,prevDelta:0,currDelta:0}}function W(t,n,s,i){const a={...t};a.targetChar=n,a.sourceWidth=a.currentWidth,a.targetWidth=n===L?0:1;let o=!1;for(const h of s){const l=h.getCharacterIndices(a.currentChar,n,i);if(l){a.charList=h.getCharacterList(),a.startIndex=l.startIndex,a.endIndex=l.endIndex,o=!0;break}}return o||(a.charList=a.currentChar===n?[a.currentChar]:[a.currentChar,n],a.startIndex=0,a.endIndex=a.currentChar===n?0:1),a.directionAdj=a.endIndex>=a.startIndex?1:-1,a.prevDelta=a.currDelta,a.currDelta=0,a}function q(t,n,s=!1){const i={...t},a=Math.abs(i.endIndex-i.startIndex),o=n*a,h=o-Math.floor(o),l=i.prevDelta*(1-n),r=h*i.directionAdj+l,m=i.startIndex+Math.floor(o)*i.directionAdj;return n>=1?(i.currentChar=i.targetChar,i.currDelta=0,i.prevDelta=0):s&&i.charList&&m>=0&&m<i.charList.length&&(i.currentChar=i.charList[m],i.currDelta=r),i.currentWidth=i.sourceWidth+(i.targetWidth-i.sourceWidth)*n,{col:i,charIdx:m,delta:r}}const ee={linear:t=>t,easeIn:t=>t*t,easeOut:t=>1-(1-t)*(1-t),easeInOut:t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,bounce:t=>t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},j=1.2,fe=((t,n)=>{const s=t.__vccOpts||t;for(const[i,a]of n)s[i]=a;return s})(e.defineComponent({__name:"Ticker",props:{value:{type:String,required:!0},characterLists:{type:Array,default:()=>["0123456789"]},duration:{type:Number,default:500},direction:{type:String,default:"ANY"},easing:{type:String,default:"easeInOut"},className:{type:String,default:""},charWidth:{type:Number,default:1}},setup(t){const n=t,s=e.ref([]),i=e.ref(1);let a;const o=e.computed(()=>n.characterLists.map(r=>new ue(r))),h=e.computed(()=>{const r=new Set;return o.value.forEach(m=>m.getSupportedCharacters().forEach(c=>r.add(c))),r});e.watch(()=>n.value,(r,m)=>{if(r===m)return;a&&(cancelAnimationFrame(a),a=void 0);let c=s.value;i.value<1&&i.value>0&&(c=c.map(w=>q(w,i.value,!0).col));const g=[...r],u=c.map(w=>w.currentChar),f=he(u,g,h.value);let M=0,E=0;const k=[],C=c.filter(w=>w.currentWidth>0);for(const w of f)if(w===D)k.push(W(H(),g[E++],o.value,n.direction));else if(w===R){const A=C[M++]||H();k.push(W(A,g[E++],o.value,n.direction))}else{const A=C[M++]||H();k.push(W(A,L,o.value,n.direction))}s.value=k,i.value=0;const b=performance.now(),B=n.duration,x=ee[n.easing]||ee.linear;let I=0;const T=w=>{const A=Math.min((w-b)/B,1),O=x(A);if((w-I>=16||A>=1)&&(I=w,i.value=O),A<1)a=requestAnimationFrame(T);else{const U=s.value.map(P=>q(P,1).col).filter(P=>P.currentWidth>0);s.value=U,i.value=1,a=void 0}};a=requestAnimationFrame(T)},{immediate:!0}),e.onUnmounted(()=>{a&&cancelAnimationFrame(a)});const l=e.computed(()=>s.value.map(r=>{const{charIdx:m,delta:c}=q(r,i.value),g=r.sourceWidth+(r.targetWidth-r.sourceWidth)*i.value;if(g<=0)return{width:g,chars:[]};const u=[],f=r.charList||[],M=c*j,E=(w,A,O)=>{w>=0&&w<f.length&&u.push({key:`${O}-${w}`,char:f[w],offset:M+A})};E(m,0,"c"),E(m+1,-j,"n"),E(m-1,j,"p");const k=w=>w&&w.length>0&&w.charCodeAt(0)>255,C=w=>k(w)?1.25:.8,b=f[r.startIndex]||"",B=f[r.endIndex]||"",x=C(b),I=C(B),T=x+(I-x)*i.value;return{width:g,chars:u,baseW:T}}).filter(r=>r.width>0));return(r,m)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ticker",t.className])},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,(c,g)=>(e.openBlock(),e.createElementBlock("div",{key:g,class:"ticker-column",style:e.normalizeStyle({width:`${c.width*(c.baseW||.8)*t.charWidth}em`})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.chars,u=>(e.openBlock(),e.createElementBlock("div",{key:u.key,class:"ticker-char",style:e.normalizeStyle({transform:`translateY(${u.offset}em)`})},e.toDisplayString(u.char===e.unref(L)?" ":u.char),5))),128))],4))),128))],2))}}),[["__scopeId","data-v-7e47ac69"]]),te=e.defineComponent({__name:"SmartText",props:{text:{},className:{},placeholder:{}},setup(t){return(n,s)=>!t.text&&t.placeholder?(e.openBlock(),e.createElementBlock("span",{key:0,class:e.normalizeClass(["apmsu-placeholder",t.className])},e.toDisplayString(t.placeholder),3)):t.text?(e.openBlock(),e.createElementBlock("span",{key:1,class:e.normalizeClass(["inline-flex min-w-0",t.className])},[e.createVNode(e.unref(fe),{value:t.text,"char-width":.8,duration:300},null,8,["value"])],2)):e.createCommentVNode("",!0)}}),ge={class:"apmsu-label"},ke={class:"relative"},ye=["disabled"],be={key:0,class:"flex items-center gap-2 min-w-0"},we=["src","alt"],Me={key:1,class:"apmsu-placeholder"},Ee=["onClick"],Ce={class:"flex items-center gap-2 flex-shrink-0"},ve=["src","alt"],Be={class:"font-medium whitespace-nowrap"},Ie={class:"apmsu-hint-text ml-auto text-right truncate flex-1 min-w-0"},xe=e.defineComponent({__name:"ProviderSelect",props:{providers:{},selectedProviderId:{},disabled:{type:Boolean,default:!1},language:{default:"zh"}},emits:["select"],setup(t,{emit:n}){const s=t,i=n,a=e.ref(!1),o=e.ref(null),h=e.computed(()=>$[s.language]),l=e.computed(()=>s.providers.find(c=>c.id===s.selectedProviderId));function r(c){o.value&&!o.value.contains(c.target)&&(a.value=!1)}e.onMounted(()=>{document.addEventListener("mousedown",r)}),e.onUnmounted(()=>{document.removeEventListener("mousedown",r)});function m(c){i("select",c),a.value=!1}return(c,g)=>(e.openBlock(),e.createElementBlock("div",{class:"apmsu-field",ref_key:"triggerRef",ref:o},[e.createElementVNode("label",ge,e.toDisplayString(h.value.providerLabel),1),e.createElementVNode("div",ke,[e.createElementVNode("button",{type:"button",onClick:g[0]||(g[0]=u=>!t.disabled&&(a.value=!a.value)),disabled:t.disabled,class:"apmsu-select-trigger"},[l.value?(e.openBlock(),e.createElementBlock("div",be,[e.createElementVNode("img",{src:l.value.icon,alt:l.value.name,class:"apmsu-provider-icon"},null,8,we),e.createVNode(te,{text:l.value.name},null,8,["text"])])):(e.openBlock(),e.createElementBlock("span",Me,e.toDisplayString(h.value.selectProvider),1)),(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["apmsu-chevron",a.value?"rotate-180":""]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...g[1]||(g[1]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))],8,ye),e.createElementVNode("div",{class:e.normalizeClass(["apmsu-dropdown max-h-[300px] overflow-auto p-1 origin-top",a.value?"apmsu-dropdown-open":""])},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.providers,u=>(e.openBlock(),e.createElementBlock("button",{key:u.id,type:"button",onClick:f=>m(u.id),class:e.normalizeClass(["apmsu-dropdown-item rounded-sm",t.selectedProviderId===u.id&&"apmsu-dropdown-item-active"])},[e.createElementVNode("div",Ce,[e.createElementVNode("img",{src:u.icon,alt:u.name,class:"apmsu-provider-icon"},null,8,ve),e.createElementVNode("span",Be,e.toDisplayString(u.name),1)]),e.createElementVNode("span",Ie,e.toDisplayString(u.baseUrl.replace("https://","")),1)],10,Ee))),128))],2)])],512))}}),Ae={key:0,class:"apmsu-field"},Ne={class:"apmsu-label"},Se={class:"relative"},Te=["type","value","placeholder","disabled"],Le={class:"absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center"},Ve={key:0,class:"w-4 h-4 text-gray-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Oe={key:1,class:"w-4 h-4 text-gray-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Pe=e.defineComponent({__name:"AuthInput",props:{provider:{},apiKey:{},testStatus:{},disabled:{type:Boolean,default:!1},language:{default:"zh"}},emits:["update:apiKey"],setup(t,{emit:n}){const s=t,i=n,a=e.ref(!1),o=e.computed(()=>$[s.language]),h=e.computed(()=>s.testStatus==="success"?"apmsu-input apmsu-input-success":"apmsu-input apmsu-input-default");return(l,r)=>t.provider&&t.provider.needsApiKey?(e.openBlock(),e.createElementBlock("div",Ae,[e.createElementVNode("label",Ne,e.toDisplayString(o.value.apiKeyLabel),1),e.createElementVNode("div",Se,[e.createElementVNode("input",{type:a.value?"text":"password",value:t.apiKey,onInput:r[0]||(r[0]=m=>i("update:apiKey",m.target.value)),onFocus:r[1]||(r[1]=m=>a.value=!0),onBlur:r[2]||(r[2]=m=>a.value=!1),placeholder:o.value.apiKeyPlaceholder,disabled:t.disabled,class:e.normalizeClass([h.value,"pr-10"])},null,42,Te),e.createElementVNode("span",Le,[a.value?(e.openBlock(),e.createElementBlock("svg",Ve,[...r[3]||(r[3]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"},null,-1),e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"},null,-1)])])):(e.openBlock(),e.createElementBlock("svg",Oe,[...r[4]||(r[4]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"},null,-1)])]))])])])):e.createCommentVNode("",!0)}}),Fe={class:"apmsu-label flex items-center justify-between"},Ue={class:"relative"},$e=["disabled"],De={class:"p-1.5 border-b border-gray-100 dark:border-zinc-800"},Ke=["placeholder","autofocus"],Re={class:"max-h-60 overflow-auto"},ze={class:"text-blue-500"},_e=["onClick"],Ge={key:1,class:"p-4 text-center apmsu-hint-text"},Qe={key:0,class:"min-h-[20px] flex items-center"},He={key:0,class:"apmsu-hint-text animate-pulse"},We={key:1,class:"apmsu-hint-text dark:text-zinc-500"},qe={key:2,class:"apmsu-hint-text"},je={key:3,class:"apmsu-hint-text"},Xe=e.defineComponent({__name:"ModelSelect",props:{provider:{},models:{},selectedModelId:{},hasApiKey:{type:Boolean},disabled:{type:Boolean,default:!1},language:{default:"zh"},isFetchingModels:{type:Boolean},fetchModelError:{},selectedModelName:{}},emits:["select"],setup(t,{emit:n}){const s=t,i=n,a=e.ref(!1),o=e.ref(""),h=e.ref(null),l=e.computed(()=>$[s.language]),r=e.computed(()=>s.models.filter(u=>u.name.toLowerCase().includes(o.value.toLowerCase())||u.id.toLowerCase().includes(o.value.toLowerCase()))),m=e.computed(()=>{var u;return((u=s.models.find(f=>f.id===s.selectedModelId))==null?void 0:u.name)||s.selectedModelName||s.selectedModelId});function c(u){h.value&&!h.value.contains(u.target)&&(a.value=!1,o.value="")}e.onMounted(()=>{document.addEventListener("mousedown",c)}),e.onUnmounted(()=>{document.removeEventListener("mousedown",c)});function g(u,f){i("select",u,f),a.value=!1,o.value=""}return(u,f)=>{var M,E;return e.openBlock(),e.createElementBlock("div",{class:"apmsu-field",ref_key:"triggerRef",ref:h},[e.createElementVNode("label",Fe,[e.createElementVNode("span",null,e.toDisplayString(l.value.modelLabel),1)]),e.createElementVNode("div",Ue,[e.createElementVNode("button",{type:"button",onClick:f[0]||(f[0]=k=>!t.disabled&&t.provider&&(a.value=!a.value)),disabled:t.disabled||!t.provider,class:"apmsu-select-trigger"},[e.createVNode(te,{text:m.value?m.value:"",placeholder:l.value.selectModel},null,8,["text","placeholder"]),(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["apmsu-chevron",a.value?"rotate-180":""]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...f[3]||(f[3]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))],8,$e),e.createElementVNode("div",{class:e.normalizeClass(["apmsu-dropdown origin-top",a.value?"apmsu-dropdown-open":""])},[e.createElementVNode("div",De,[e.withDirectives(e.createElementVNode("input",{type:"text","onUpdate:modelValue":f[1]||(f[1]=k=>o.value=k),placeholder:l.value.searchModel,class:"apmsu-select-trigger",autofocus:a.value},null,8,Ke),[[e.vModelText,o.value]])]),e.createElementVNode("div",Re,[o.value&&!r.value.some(k=>k.id===o.value)?(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",onClick:f[2]||(f[2]=k=>g(o.value)),class:"apmsu-dropdown-item bg-blue-50 dark:bg-blue-900/20 border-b"},[e.createElementVNode("span",ze,e.toDisplayString(l.value.useCustom)+": "+e.toDisplayString(o.value),1)])):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,k=>(e.openBlock(),e.createElementBlock("button",{key:k.id,type:"button",onClick:C=>g(k.id,k.name),class:e.normalizeClass(["apmsu-dropdown-item",t.selectedModelId===k.id&&"apmsu-dropdown-item-active"])},[e.createElementVNode("span",null,e.toDisplayString(k.name),1)],10,_e))),128)),r.value.length===0&&!o.value?(e.openBlock(),e.createElementBlock("div",Ge,e.toDisplayString(l.value.noModels),1)):e.createCommentVNode("",!0)])],2)]),(M=t.provider)!=null&&M.supportsModelsApi?(e.openBlock(),e.createElementBlock("div",Qe,[t.isFetchingModels?(e.openBlock(),e.createElementBlock("p",He,e.toDisplayString(l.value.refreshingModels),1)):t.fetchModelError?(e.openBlock(),e.createElementBlock("p",We,e.toDisplayString(l.value[t.fetchModelError]||t.fetchModelError),1)):(E=t.provider)!=null&&E.needsApiKey&&!t.hasApiKey?(e.openBlock(),e.createElementBlock("p",qe,e.toDisplayString(l.value.apiKeyTip),1)):(e.openBlock(),e.createElementBlock("p",je,e.toDisplayString(l.value.modelListUpdated),1))])):e.createCommentVNode("",!0)],512)}}}),Ye={class:"overflow-hidden"},Je=["value","placeholder","disabled"],Ze=e.defineComponent({__name:"BaseUrlInput",props:{provider:{},baseUrl:{},disabled:{type:Boolean,default:!1},language:{default:"zh"}},emits:["update:baseUrl"],setup(t,{emit:n}){const s=t,i=n,a=e.ref(!1),o=e.computed(()=>$[s.language]);return(h,l)=>t.provider?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createElementVNode("button",{type:"button",onClick:l[0]||(l[0]=r=>a.value=!a.value),class:"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 flex items-center gap-1 transition-colors"},[(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["w-3 h-3 transition-transform",a.value&&"rotate-90"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...l[2]||(l[2]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"},null,-1)])],2)),e.createTextVNode(" "+e.toDisplayString(o.value.customBaseUrl),1)]),e.createElementVNode("div",{class:"grid transition-all duration-200 ease-out",style:e.normalizeStyle({gridTemplateRows:a.value?"1fr":"0fr"})},[e.createElementVNode("div",Ye,[e.createElementVNode("input",{type:"text",value:t.baseUrl,onInput:l[1]||(l[1]=r=>i("update:baseUrl",r.target.value)),placeholder:t.provider.baseUrl,disabled:t.disabled,class:"apmsu-input apmsu-input-default"},null,40,Je)])],4)],64)):e.createCommentVNode("",!0)}}),et={class:"apmsu-card"},tt={key:0,class:"text-lg font-semibold mb-4"},at={class:"space-y-3"},nt={class:"space-y-4"},st={class:"pt-2 space-y-2"},ot={class:"flex gap-2"},it=["disabled"],rt={key:0,class:"flex items-center justify-center gap-2"},lt={key:1,class:"flex items-center justify-center gap-2"},dt={key:2,class:"flex items-center justify-center gap-2"},ct=["disabled"],mt={key:0,class:"flex items-center justify-center gap-2"},pt={class:"overflow-hidden"},ut={class:"p-2 rounded-md bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800"},ht={class:"text-xs text-red-600 dark:text-red-400 line-clamp-3 text-left"},ft={key:1,class:"mt-6 border border-gray-200/50 dark:border-zinc-800 rounded-lg overflow-hidden"},gt={class:"text-xs font-medium text-gray-500 dark:text-zinc-500 uppercase tracking-wider"},kt={class:"overflow-hidden"},yt={class:"text-xs text-gray-600 dark:text-zinc-400 font-mono overflow-x-auto leading-relaxed p-4 bg-zinc-50 dark:bg-zinc-900/50"},bt=e.defineComponent({__name:"AIConfigForm",props:{proxyUrl:{},config:{},initialConfig:{},title:{},showPreview:{type:Boolean,default:!1},saveButtonText:{},disabled:{type:Boolean,default:!1},onSerialize:{},onDeserialize:{},language:{default:"zh"},modelFetcher:{}},emits:["save","testResult","change"],setup(t,{emit:n}){const s=t,i=n,{providerId:a,apiKey:o,model:h,modelName:l,baseUrl:r,models:m,testStatus:c,testResult:g,provider:u,providers:f,isValid:M,config:E,runTest:k,save:C,selectModel:b,isFetchingModels:B,fetchModelError:x}=Z({proxyUrl:s.proxyUrl,providerConfig:s.config,initialConfig:s.initialConfig,onSerialize:s.onSerialize,onDeserialize:s.onDeserialize,modelFetcher:s.modelFetcher}),I=e.computed(()=>$[s.language]),T=e.ref("idle"),w=e.ref(!1);e.watch([a,o,h,r],()=>{i("change",{providerId:a.value,apiKey:o.value,model:h.value,baseUrl:r.value})}),e.watch(g,p=>{p&&i("testResult",p)});function A(){C(),T.value="saved",i("save",E.value),setTimeout(()=>{T.value="idle"},2e3)}function O(p){a.value=p}function K(p){o.value=p}function U(p,y){b(p,y)}function P(p){r.value=p}return(p,y)=>{var N,F,S,ae;return e.openBlock(),e.createElementBlock("div",et,[t.title?(e.openBlock(),e.createElementBlock("h2",tt,e.toDisplayString(t.title),1)):e.createCommentVNode("",!0),e.createElementVNode("div",at,[e.createVNode(xe,{providers:e.unref(f),selectedProviderId:e.unref(a),onSelect:O,disabled:t.disabled,language:t.language},null,8,["providers","selectedProviderId","disabled","language"]),e.createVNode(Ze,{provider:e.unref(u),baseUrl:e.unref(r),"onUpdate:baseUrl":P,disabled:t.disabled,language:t.language},null,8,["provider","baseUrl","disabled","language"]),e.createElementVNode("div",{class:e.normalizeClass(["transition-all duration-500 ease-in-out",e.unref(a)?"max-h-[1000px] opacity-100 overflow-visible":"max-h-0 opacity-0 overflow-hidden"])},[e.createElementVNode("div",nt,[e.createVNode(Pe,{provider:e.unref(u),apiKey:e.unref(o),"onUpdate:apiKey":K,testStatus:e.unref(c),disabled:t.disabled,language:t.language,isFetchingModels:e.unref(B),fetchModelError:e.unref(x)},null,8,["provider","apiKey","testStatus","disabled","language","isFetchingModels","fetchModelError"]),e.createVNode(Xe,{provider:e.unref(u),models:e.unref(m),selectedModelId:e.unref(h),onSelect:U,hasApiKey:!!e.unref(o),disabled:t.disabled,language:t.language,isFetchingModels:e.unref(B),fetchModelError:e.unref(x),selectedModelName:e.unref(l)},null,8,["provider","models","selectedModelId","hasApiKey","disabled","language","isFetchingModels","fetchModelError","selectedModelName"])])],2),e.createElementVNode("div",st,[e.createElementVNode("div",ot,[e.createElementVNode("button",{type:"button",onClick:y[0]||(y[0]=wt=>e.unref(k)()),disabled:!e.unref(a)||!e.unref(o)||!e.unref(h)||t.disabled||e.unref(c)==="testing",class:e.normalizeClass(["apmsu-btn flex-1",e.unref(c)==="success"?"apmsu-btn-success":e.unref(c)==="error"?"bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-900/40":"apmsu-btn-ghost border border-gray-200 dark:border-zinc-700"])},[e.unref(c)==="testing"?(e.openBlock(),e.createElementBlock("span",rt,[y[2]||(y[2]=e.createElementVNode("svg",{class:"apmsu-icon-spin",viewBox:"0 0 24 24",fill:"none"},[e.createElementVNode("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e.createElementVNode("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})],-1)),e.createTextVNode(" "+e.toDisplayString(I.value.testing),1)])):e.unref(c)==="success"?(e.openBlock(),e.createElementBlock("span",lt,[y[3]||(y[3]=e.createElementVNode("svg",{class:"apmsu-icon-success",fill:"currentColor",viewBox:"0 0 24 24"},[e.createElementVNode("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"})],-1)),e.createTextVNode(" "+e.toDisplayString(I.value.testSuccess)+" "+e.toDisplayString((N=e.unref(g))!=null&&N.latencyMs?`${e.unref(g).latencyMs}ms`:""),1)])):e.unref(c)==="error"?(e.openBlock(),e.createElementBlock("span",dt,[y[4]||(y[4]=e.createElementVNode("svg",{class:"apmsu-icon-error",fill:"currentColor",viewBox:"0 0 24 24"},[e.createElementVNode("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"})],-1)),e.createTextVNode(" "+e.toDisplayString(I.value.testFailed),1)])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:3},[e.createTextVNode(e.toDisplayString(I.value.testConnection),1)],64))],10,it),e.createElementVNode("button",{onClick:A,disabled:!e.unref(M)||t.disabled,class:e.normalizeClass(["apmsu-btn flex-1",T.value==="saved"?"apmsu-btn-success":"apmsu-btn-primary"])},[T.value==="saved"?(e.openBlock(),e.createElementBlock("span",mt,[y[5]||(y[5]=e.createElementVNode("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2.5",d:"M5 13l4 4L19 7"})],-1)),e.createTextVNode(" "+e.toDisplayString(I.value.saved),1)])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(e.toDisplayString(t.saveButtonText||I.value.save),1)],64))],10,ct)]),e.createElementVNode("div",{class:"grid transition-all duration-200 ease-out",style:e.normalizeStyle({gridTemplateRows:!((F=e.unref(g))!=null&&F.success)&&((S=e.unref(g))!=null&&S.message)&&e.unref(c)!=="testing"&&e.unref(c)!=="success"?"1fr":"0fr"})},[e.createElementVNode("div",pt,[e.createElementVNode("div",ut,[e.createElementVNode("p",ht,e.toDisplayString((ae=e.unref(g))==null?void 0:ae.message),1)])])],4)])]),t.showPreview&&e.unref(u)?(e.openBlock(),e.createElementBlock("div",ft,[e.createElementVNode("button",{type:"button",onClick:y[1]||(y[1]=wt=>w.value=!w.value),class:"w-full flex items-center justify-between px-4 py-3 bg-zinc-50 dark:bg-zinc-900/50 hover:bg-zinc-100 dark:hover:bg-zinc-800/50 transition-colors"},[e.createElementVNode("h3",gt,e.toDisplayString(I.value.preview),1),(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["w-4 h-4 text-gray-400 transition-transform duration-200",w.value?"rotate-180":""]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...y[6]||(y[6]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))]),e.createElementVNode("div",{class:"grid transition-all duration-200 ease-out",style:e.normalizeStyle({gridTemplateRows:w.value?"1fr":"0fr"})},[e.createElementVNode("div",kt,[e.createElementVNode("pre",yt,""+e.toDisplayString(JSON.stringify({provider:e.unref(u).name,apiFormat:e.unref(u).apiFormat,baseUrl:e.unref(r)||e.unref(u).baseUrl,model:e.unref(h)||I.value.unselected,hasApiKey:!!e.unref(o)},null,2))+`
2
- `,1)])],4)])):e.createCommentVNode("",!0)])}}});V.AIConfigForm=bt,V.useAIConfig=Z,Object.defineProperty(V,Symbol.toStringTag,{value:"Module"})}));
3
- //# sourceMappingURL=index.umd.cjs.map