Files
2026-10-20 16:52:05 +03:30

2 lines
13 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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};