2 lines
13 KiB
JavaScript
2 lines
13 KiB
JavaScript
import{_ as ue}from"./BasicMainCard-33e38576.js";import{_ as ve}from"./BasicInput.vue_vue_type_style_index_0_lang-e6a4e582.js";import{_ as _e}from"./BaseSwitch.vue_vue_type_script_setup_true_lang-36a1ea6e.js";import{_ as pe}from"./button.vue_vue_type_style_index_0_lang-f90e25b2.js";import{I as S,d as me,i as _,j as I,x as be,o as l,c as d,e as b,w as k,b as s,t as h,f as T,F as $,q as M,n as O,J as ye,K as fe,L as ge,s as F,B as he,H as w,M as ke,N as we,A as Y}from"./index-1ba0f9ec.js";import{_ as xe,T as Ce}from"./index-f22a4554.js";import{M as Ae}from"./index-ec322234.js";import{_ as Se}from"./_plugin-vue_export-helper-31e07528.js";import"./Grid-660f1a55.js";import"./index-c136a321.js";import"./Col-f8806a10.js";import"./styleChecker-19ce40ea.js";import"./isPlainObject-e945bc1f.js";import"./vnode-c4e67237.js";import"./Icon-29e38d16.js";import"./usePrice-bc935b83.js";import"./index-aafc0fe2.js";import"./SearchOutlined-95278fe5.js";import"./omit-f5d28cd3.js";import"./FormItemContext-33ef1221.js";import"./index-8f2b7e91.js";import"./index-73cafb1e.js";import"./shallowequal-e0d9eafb.js";import"./index-3f6d5caa.js";import"./isSymbol-355a1404.js";import"./useState-dcd360f8.js";import"./useRefs-5e33302c.js";import"./_flatRest-7877cdf8.js";import"./isMobile-e2e89480.js";import"./DialogWrap-394d7eb0.js";import"./pickAttrs-0ddf9a54.js";async function Z(){return await S.get("/admin/ai/settings")}async function Ie(p){return(await S.put("/admin/ai/settings",p)).settings??await Z()}async function Te(){return await S.post("/admin/ai/test")}async function Be(){return(await S.get("/admin/ai/conversations")).conversations||[]}async function $e(p){return await S.get(`/admin/ai/conversations/${p}`)}async function De(p){return await S.delete(`/admin/ai/conversations/${p}`)}async function Ke(p){return await S.post("/admin/ai/chat",p,{timeout:12e4})}const f=p=>(ke("data-v-82db44cb"),p=p(),we(),p),Le={class:"ai-layout"},Me={class:"ai-sidebar"},Oe={class:"ai-sidebar-head"},Ue=f(()=>s("div",{class:"ai-sidebar-title"},"گفتگوهای قبلی",-1)),Ne={class:"ai-sidebar-sub"},Re={key:0,class:"ai-sidebar-empty"},Pe={key:1,class:"ai-sidebar-empty"},Ve={key:2,class:"ai-sidebar-list"},qe=["onClick"],ze={class:"ai-sidebar-item-main"},Fe={class:"ai-sidebar-item-title"},He={class:"ai-sidebar-item-date"},je=["onClick"],Ee={class:"ai-shell"},Ge={class:"ai-toolbar"},Je={class:"ai-title"},Qe=f(()=>s("div",{class:"ai-subtitle"}," گفتگوها در سرور ذخیره میشوند و میتوانید بعداً ادامه دهید. ",-1)),We={key:0,class:"ai-banner ai-banner--warn"},Xe={key:1,class:"ai-banner ai-banner--warn"},Ye={key:0,class:"ai-empty"},Ze={key:1,class:"ai-empty"},ea=f(()=>s("div",{class:"ai-empty-icon"},"✦",-1)),aa=f(()=>s("h3",null,"از من بپرس",-1)),ta=f(()=>s("p",null,"میتوانم وضعیت سفارش، موجودی محصول، اشتراک کاربر یا آمار کلی سیستم را از دیتابیس بخوانم.",-1)),sa={class:"ai-suggestions"},ia=["disabled","onClick"],na={class:"ai-bubble"},oa={class:"ai-bubble-label"},la={class:"ai-bubble-text"},da={key:0,class:"ai-tools"},ra={key:3,class:"ai-row is-assistant"},ca=f(()=>s("div",{class:"ai-bubble ai-bubble--pending"},[s("div",{class:"ai-bubble-label"},"دستیار ماچارتا"),s("div",{class:"ai-bubble-text"},"در حال بررسی دیتابیس و پاسخ...")],-1)),ua=[ca],va={class:"ai-composer"},_a=["disabled","onKeydown"],pa={class:"ai-settings"},ma=f(()=>s("p",{class:"ai-settings-help"}," کلید API مدل را اینجا ذخیره کنید. اتصال با استاندارد OpenAI Chat Completions است و با OpenAI، OpenRouter، Groq، DeepSeek و مدلهای سازگار کار میکند. ",-1)),ba={key:0,class:"py-8 text-center"},ya={class:"flex items-center gap-3 mb-4"},fa=f(()=>s("span",{class:"text-sm"},"فعال بودن دستیار هوش مصنوعی",-1)),ga={class:"mb-4"},ha=f(()=>s("div",{class:"mb-1 text-sm text-gray-600"},"کلید API",-1)),ka={class:"text-xs text-gray-500 mt-1"},wa={key:0},xa={class:"mb-4"},Ca=f(()=>s("div",{class:"mb-1 text-sm text-gray-600"},"Base URL",-1)),Aa={class:"mb-4"},Sa=f(()=>s("div",{class:"mb-1 text-sm text-gray-600"},"نام مدل",-1)),Ia={class:"flex gap-2"},Ta=me({__name:"index",setup(p){const H=["آمار کلی سیستم را بگو","پلنهای اشتراک فعال کداماند؟","آخرین سفارشهای فروشگاه را خلاصه کن"],j=_("chat"),U=_(!0),N=_(!1),R=_(!1),P=_(!1),V=_(!1),C=_(!1),A=_(""),E=_(null),x=_([]),r=_([]),y=_(null),u=_({enabled:!1,api_key_set:!1,api_key_masked:"",base_url:"https://api.openai.com/v1",model:"gpt-4o-mini"}),o=_({enabled:!1,api_key:"",base_url:"https://api.openai.com/v1",model:"gpt-4o-mini"}),G=I(()=>u.value.enabled&&u.value.api_key_set),J=I(()=>G.value&&!!A.value.trim()&&!C.value),ee=I(()=>{var a;return y.value?((a=r.value.find(i=>i.id===y.value))==null?void 0:a.title)||"گفتگو":"گفتگوی جدید"}),ae=I(()=>u.value.enabled&&(u.value.api_key_set||!!o.value.api_key.trim())),te=I(()=>o.value.enabled?!u.value.api_key_set&&!o.value.api_key.trim()?"کلید API وارد نشده است.":`آماده اتصال به مدل ${o.value.model||u.value.model}`:"دستیار غیرفعال است و در منوی گفتگو پاسخ نمیدهد."),se=I(()=>ae.value?"bg-green-50 border-green-200 text-green-800":"bg-amber-50 border-amber-200 text-amber-800");function ie(a){if(!a)return"";try{return new Date(a).toLocaleString("fa-IR")}catch{return a}}async function B(){await he();const a=E.value;a&&(a.scrollTop=a.scrollHeight)}function Q(a){u.value=a,o.value.enabled=a.enabled,o.value.base_url=a.base_url,o.value.model=a.model,o.value.api_key=""}async function ne(){var a,i;U.value=!0;try{Q(await Z())}catch(t){w.error(((i=(a=t==null?void 0:t.response)==null?void 0:a.data)==null?void 0:i.message)||(t==null?void 0:t.message)||"خطا در بارگذاری تنظیمات")}finally{U.value=!1}}async function W(a){var i,t,n;N.value=!0;try{r.value=await Be();const c=a||y.value||((i=r.value[0])==null?void 0:i.id)||null;c&&r.value.some(v=>v.id===c)?(y.value!==c||!x.value.length)&&await q(c):r.value.length||D(!1)}catch(c){w.error(((n=(t=c==null?void 0:c.response)==null?void 0:t.data)==null?void 0:n.message)||(c==null?void 0:c.message)||"خطا در دریافت گفتگوها")}finally{N.value=!1}}async function q(a){var i,t;R.value=!0,y.value=a;try{const n=await $e(a);x.value=(n.messages||[]).map(v=>({id:v.id,role:v.role,content:v.content,tools:v.tools_used||[],created_at:v.created_at}));const c=r.value.findIndex(v=>v.id===a);c>=0&&(r.value[c]=n.conversation),await B()}catch(n){w.error(((t=(i=n==null?void 0:n.response)==null?void 0:i.data)==null?void 0:t.message)||(n==null?void 0:n.message)||"خطا در باز کردن گفتگو")}finally{R.value=!1}}function D(a=!0){y.value=null,x.value=[],a&&(A.value="")}async function oe(a){Ae.confirm({title:"حذف گفتگو",content:"این گفتگو و تمام پیامهایش حذف میشود. ادامه میدهید؟",okText:"حذف",cancelText:"انصراف",okType:"danger",async onOk(){var i,t;try{await De(a),r.value=r.value.filter(n=>n.id!==a),y.value===a&&(r.value[0]?await q(r.value[0].id):D()),w.success("گفتگو حذف شد")}catch(n){w.error(((t=(i=n==null?void 0:n.response)==null?void 0:i.data)==null?void 0:t.message)||(n==null?void 0:n.message)||"خطا در حذف گفتگو")}}})}async function X(){var a,i;P.value=!0;try{const t=await Ie({enabled:o.value.enabled,base_url:o.value.base_url,model:o.value.model,api_key:o.value.api_key.trim()||void 0});Q(t),w.success("تنظیمات هوش مصنوعی ذخیره شد")}catch(t){w.error(((i=(a=t==null?void 0:t.response)==null?void 0:a.data)==null?void 0:i.message)||(t==null?void 0:t.message)||"خطا در ذخیره تنظیمات")}finally{P.value=!1}}async function le(){var a,i;V.value=!0;try{(o.value.api_key.trim()||o.value.base_url!==u.value.base_url||o.value.model!==u.value.model)&&await X();const t=await Te();w.success(t.reply||"اتصال برقرار شد")}catch(t){w.error(((i=(a=t==null?void 0:t.response)==null?void 0:a.data)==null?void 0:i.message)||(t==null?void 0:t.message)||"تست اتصال ناموفق بود")}finally{V.value=!1}}async function z(){var i,t,n,c,v,K,L;const a=A.value.trim();if(!(!a||!J.value)){x.value.push({role:"user",content:a}),A.value="",await B(),C.value=!0;try{const e=await Ke({conversation_id:y.value,message:a});y.value=e.conversation_id,x.value.push({role:"assistant",content:((i=e.message)==null?void 0:i.content)||"پاسخی دریافت نشد.",tools:e.tools_used||((t=e.message)==null?void 0:t.tools_used)||[],created_at:(n=e.message)==null?void 0:n.created_at});const m=r.value.find(g=>g.id===e.conversation_id);m?(m.title=e.title||m.title,m.updated_at=new Date().toISOString(),r.value=[m,...r.value.filter(g=>g.id!==m.id)]):r.value=[{id:e.conversation_id,admin_id:"",title:e.title||a.slice(0,60),created_at:new Date().toISOString(),updated_at:new Date().toISOString()},...r.value],await B()}catch(e){const m=((v=(c=e==null?void 0:e.response)==null?void 0:c.data)==null?void 0:v.message)||(e==null?void 0:e.message)||"خطا در دریافت پاسخ",g=(L=(K=e==null?void 0:e.response)==null?void 0:K.data)==null?void 0:L.conversation_id;g&&(y.value=g,await W(g)),x.value.push({role:"assistant",content:m})}finally{C.value=!1,await B()}}}function de(a){A.value=a,z()}return be(async()=>{await Promise.all([ne(),W()]),await B()}),(a,i)=>{const t=pe,n=xe,c=_e,v=ve,K=Ce,L=ue;return l(),d("div",null,[b(L,null,{default:k(()=>[b(K,{activeKey:j.value,"onUpdate:activeKey":i[5]||(i[5]=e=>j.value=e)},{default:k(()=>[b(n,{key:"chat",tab:"گفتگو"},{default:k(()=>[s("div",Le,[s("aside",Me,[s("div",Oe,[s("div",null,[Ue,s("div",Ne,h(r.value.length)+" گفتگو",1)]),b(t,{size:"small",type:"primary",onClick:D},{default:k(()=>[T("جدید")]),_:1})]),N.value?(l(),d("div",Re,"در حال بارگذاری...")):r.value.length?(l(),d("div",Ve,[(l(!0),d($,null,M(r.value,e=>(l(),d("button",{key:e.id,type:"button",class:F(["ai-sidebar-item",{"is-active":e.id===y.value}]),onClick:m=>q(e.id)},[s("div",ze,[s("div",Fe,h(e.title||"گفتگوی جدید"),1),s("div",He,h(ie(e.updated_at)),1)]),s("span",{class:"ai-sidebar-item-delete",title:"حذف گفتگو",onClick:Y(m=>oe(e.id),["stop"])}," × ",8,je)],10,qe))),128))])):(l(),d("div",Pe,"هنوز گفتگویی ذخیره نشده است."))]),s("div",Ee,[s("div",Ge,[s("div",null,[s("div",Je,h(ee.value),1),Qe]),b(t,{onClick:D},{default:k(()=>[T("گفتگوی جدید")]),_:1})]),u.value.enabled?u.value.api_key_set?O("",!0):(l(),d("div",Xe," کلید API هنوز ذخیره نشده. برای شروع گفتگو، از تب تنظیمات کلید مدل را وارد کنید. ")):(l(),d("div",We," هوش مصنوعی در تنظیمات غیرفعال است. از تب تنظیمات آن را فعال کنید. ")),s("div",{ref_key:"threadRef",ref:E,class:"ai-thread"},[R.value?(l(),d("div",Ye,"در حال بارگذاری گفتگو...")):x.value.length?(l(!0),d($,{key:2},M(x.value,(e,m)=>{var g;return l(),d("div",{key:e.id||m,class:F(["ai-row",`is-${e.role}`])},[s("div",na,[s("div",oa,h(e.role==="user"?"شما":"دستیار ماچارتا"),1),s("div",la,h(e.content),1),(g=e.tools)!=null&&g.length?(l(),d("div",da,[(l(!0),d($,null,M(e.tools,(re,ce)=>(l(),d("span",{key:ce},h(re.summary),1))),128))])):O("",!0)])],2)}),128)):(l(),d("div",Ze,[ea,aa,ta,s("div",sa,[(l(),d($,null,M(H,e=>s("button",{key:e,type:"button",class:"ai-chip",disabled:C.value,onClick:m=>de(e)},h(e),9,ia)),64))])])),C.value?(l(),d("div",ra,ua)):O("",!0)],512),s("div",va,[ye(s("textarea",{"onUpdate:modelValue":i[0]||(i[0]=e=>A.value=e),rows:"2",disabled:C.value||!G.value,placeholder:"مثلاً: آخرین سفارشهای شماره ۰۹۱۲... را بگو",onKeydown:ge(Y(z,["exact","prevent"]),["enter"])},null,40,_a),[[fe,A.value]]),b(t,{type:"primary",loading:C.value,disabled:!J.value,onClick:z},{default:k(()=>[T(" ارسال ")]),_:1},8,["loading","disabled"])])])])]),_:1}),b(n,{key:"settings",tab:"تنظیمات"},{default:k(()=>[s("div",pa,[ma,U.value?(l(),d("div",ba,"در حال بارگذاری...")):(l(),d($,{key:1},[s("div",ya,[b(c,{value:o.value.enabled,"onUpdate:value":i[1]||(i[1]=e=>o.value.enabled=e)},null,8,["value"]),fa]),s("div",ga,[ha,b(v,{value:o.value.api_key,"onUpdate:value":i[2]||(i[2]=e=>o.value.api_key=e),"is-password":"","place-holder":u.value.api_key_set?u.value.api_key_masked:"sk-..."},null,8,["value","place-holder"]),s("div",ka,[T(" اگر خالی بماند، کلید قبلی نگه داشته میشود. "),u.value.api_key_set?(l(),d("span",wa," کلید فعلی: "+h(u.value.api_key_masked),1)):O("",!0)])]),s("div",xa,[Ca,b(v,{value:o.value.base_url,"onUpdate:value":i[3]||(i[3]=e=>o.value.base_url=e),"place-holder":"https://api.openai.com/v1"},null,8,["value"])]),s("div",Aa,[Sa,b(v,{value:o.value.model,"onUpdate:value":i[4]||(i[4]=e=>o.value.model=e),"place-holder":"gpt-4o-mini"},null,8,["value"])]),s("div",{class:F(["rounded-lg border p-3 text-sm mb-4",se.value])},h(te.value),3),s("div",Ia,[b(t,{type:"primary",loading:P.value,onClick:X},{default:k(()=>[T("ذخیره تنظیمات")]),_:1},8,["loading"]),b(t,{loading:V.value,disabled:!u.value.api_key_set&&!o.value.api_key,onClick:le},{default:k(()=>[T(" تست اتصال ")]),_:1},8,["loading","disabled"])])],64))])]),_:1})]),_:1},8,["activeKey"])]),_:1})])}}});const ot=Se(Ta,[["__scopeId","data-v-82db44cb"]]);export{ot as default};
|