@topthink/chat 1.3.17 → 1.3.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/es/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as n,useAsync as i,css as o,formatSize as s,Tooltip as a,isCancel as l,isRequestError as c,Form as d,Toast as u,InfiniteScroller as m,useDebounce as h,Offcanvas as p,ModalForm as g,RequestButton as f,Loader as b,useImmer as v,getAbsoluteUrl as y,Lightbox as x,Clipboard as w,Button as k,isImageUrl as E,request as N,SimpleBar as j}from"@topthink/components";import*as C from"react";import{createContext as $,useContext as
|
|
1
|
+
import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as n,useAsync as i,css as o,formatSize as s,Tooltip as a,isCancel as l,isRequestError as c,Form as d,Toast as u,InfiniteScroller as m,useDebounce as h,Offcanvas as p,ModalForm as g,RequestButton as f,Loader as b,useImmer as v,getAbsoluteUrl as y,Lightbox as x,Clipboard as w,Button as k,isImageUrl as E,request as N,SimpleBar as j}from"@topthink/components";import*as C from"react";import{createContext as $,useContext as R,useRef as S,useCallback as M,useEffect as F,useState as q,forwardRef as A,useMemo as z,useImperativeHandle as I,Fragment as L,memo as D,Component as P}from"react";import*as T from"path";import O from"path";import{Spinner as B,Badge as U,Dropdown as _,FormControl as H,CloseButton as J,OverlayTrigger as Q,Popover as K}from"react-bootstrap";import W from"eventemitter3";import X from"react-textarea-autosize";import V from"lodash/isEqual";import{toString as Y}from"hast-util-to-string";import G from"react-markdown";import"katex/dist/katex.min.css";import Z from"rehype-highlight";import ee from"rehype-katex";import te from"rehype-raw";import re from"remark-breaks";import ne from"remark-gfm";import ie from"remark-math";import{codes as oe,types as se}from"micromark-util-symbol";import{markdownLineEnding as ae}from"micromark-util-character";import{createPortal as le}from"react-dom";import ce from"use-resize-observer";import{unified as de}from"unified";import ue from"rehype-stringify";import me from"remark-parse";import he from"remark-rehype";function pe(e,t){return e.name===t}function ge({name:t,className:r}){const n=O.extname(t).substring(1),{result:o}=i(async e=>{try{return(await function(e){switch(e){case"../../images/file/docx.svg":return import("./docx-2LwnwWwv.js");case"../../images/file/html.svg":return import("./html-BSKTzJZQ.js");case"../../images/file/jpg.svg":return import("./jpg-muicsKjX.js");case"../../images/file/md.svg":return import("./md-DRS7QmE8.js");case"../../images/file/mp3.svg":return import("./mp3-HhP1Gk4B.js");case"../../images/file/mp4.svg":return import("./mp4-CWxSyjdn.js");case"../../images/file/pdf.svg":return import("./pdf-CWBi2u4Z.js");case"../../images/file/png.svg":return import("./png-DNwbFeJk.js");case"../../images/file/pptx.svg":return import("./pptx-Bv4V_F_3.js");case"../../images/file/py.svg":return import("./py-D30pRTJN.js");case"../../images/file/txt.svg":return import("./txt-CsqmEKjF.js");case"../../images/file/unknown.svg":return import("./unknown-DW8znerP.js");case"../../images/file/xlsx.svg":return import("./xlsx-CmkshfKZ.js");default:return new Promise(function(t,r){("function"==typeof queueMicrotask?queueMicrotask:setTimeout)(r.bind(null,new Error("Unknown variable dynamic import: "+e)))})}}(`../../images/file/${e}.svg`)).default}catch{return(await import("./unknown-DW8znerP.js")).default}},[n]);return o?e(fe,{src:o,className:r}):null}const fe=n.img`
|
|
2
2
|
width: 30px;
|
|
3
3
|
height: 30px;
|
|
4
4
|
`;function be({className:r,name:n,size:i=0,loading:o,error:l,onRemove:c,onClick:d}){const u=t(we,{className:r,$error:!!l,onClick:d,children:[t(xe,{children:[e(ge,{name:n}),o&&e(B,{variant:"primary"})]}),t(ye,{children:[e("h4",{children:n}),i>0&&e("p",{children:s(i,1)})]}),c&&e(ve,{onClick:e=>{e.preventDefault(),c()},children:e("i",{className:"bi bi-trash3"})})]});return l?e(a,{placement:"top",tooltip:l,children:u}):u}const ve=n.div`
|
|
@@ -68,7 +68,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
68
68
|
${e=>e.$error&&o`
|
|
69
69
|
border-color: var(--bs-danger) !important;
|
|
70
70
|
`}
|
|
71
|
-
`,ke=[".txt",".md",".pdf",".docx",".xlsx",".pptx",".png",".jpg"],Ee=$(null),Ne=$(null);function je(){const e=
|
|
71
|
+
`,ke=[".txt",".md",".pdf",".docx",".xlsx",".pptx",".png",".jpg"],Ee=$(null),Ne=$(null);function je(){const e=R(Ee);if(!e)throw new Error("useChatContext must be used within a ChatProvider");return e}function Ce(){return R(Ne)}function $e(){const e=R(Ee),t=R(Ne);if(!e||!t)throw new Error("useContext must be used within a Provider");return{...e,...t}}function Re({children:t,...r}){return e(Ee.Provider,{value:r,children:t})}function Se({children:t,...r}){const{request:n,loading:i,setLoading:o,inputRef:s,...a}=r;return e(Ee.Provider,{value:{request:n,loading:i,setLoading:o,inputRef:s},children:e(Ne.Provider,{value:a,children:t})})}function Me({variables:t,values:r,onSubmit:n,onChange:i,children:o}){const s={},a=[],l={};return t.forEach(e=>{s[e.key]={type:"string",title:e.label},"textarea"===e.type?l[e.key]={"ui:widget":"textarea"}:"select"===e.type&&e.options&&(s[e.key].enum=e.options,s[e.key].enumNames=e.options,e.options.length>0&&(s[e.key].default=e.options[0])),e.required&&a.push(e.key)}),e(d,{schema:{type:"object",properties:s,required:a},formData:r,omitExtraData:!0,uiSchema:l,submitText:"开始对话",onSubmit:n,onChange:i,children:o})}const Fe=n.button`
|
|
72
72
|
color: var(--bs-secondary);
|
|
73
73
|
cursor: pointer;
|
|
74
74
|
display: flex;
|
|
@@ -99,12 +99,12 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
99
99
|
}
|
|
100
100
|
`};
|
|
101
101
|
|
|
102
|
-
`;let qe=class{#e;#t;constructor(){this.#t=new W}onResult(e){this.#t.on("result",e)}onRecording(e){this.#t.on("recording",e)}onTranscribing(e){this.#t.on("transcribing",e)}start(){if(!this.#e){const e=window.SpeechRecognition||window.webkitSpeechRecognition;if(!e)return void u.error("浏览器不支持语音识别");const t=new e;t.continuous=!0,t.lang=navigator.language,t.onresult=e=>{const t=Array.from(e.results).at(-1)?.item(0).transcript;t&&this.#t.emit("result",t)},t.onspeechend=()=>{this.#t.emit("recording",!1)},t.onerror=e=>{this.#t.emit("recording",!1),u.error(e.error)},this.#e=t}this.#t.emit("recording",!0),this.#e.start()}stop(){this.#e?.stop(),this.#t.emit("recording",!1)}},
|
|
102
|
+
`;let qe=class{#e;#t;constructor(){this.#t=new W}onResult(e){this.#t.on("result",e)}onRecording(e){this.#t.on("recording",e)}onTranscribing(e){this.#t.on("transcribing",e)}start(){if(!this.#e){const e=window.SpeechRecognition||window.webkitSpeechRecognition;if(!e)return void u.error("浏览器不支持语音识别");const t=new e;t.continuous=!0,t.lang=navigator.language,t.onresult=e=>{const t=Array.from(e.results).at(-1)?.item(0).transcript;t&&this.#t.emit("result",t)},t.onspeechend=()=>{this.#t.emit("recording",!1)},t.onerror=e=>{this.#t.emit("recording",!1),u.error(e.error)},this.#e=t}this.#t.emit("recording",!0),this.#e.start()}stop(){this.#e?.stop(),this.#t.emit("recording",!1)}},Ae=class{#t;#r;#n;#i;constructor(e){this.#r=e,this.#t=new W}async start(){try{this.#n=await navigator.mediaDevices.getUserMedia({audio:!0}),this.#i=new AudioContext;const e=this.#i.createScriptProcessor(0,1,1);this.#i.createMediaStreamSource(this.#n).connect(e),e.connect(this.#i.destination);let t=[],r=0;const n=.01,i=1;e.onaudioprocess=e=>{const o=e.playbackTime,s=e.inputBuffer.getChannelData(0);let a=!0;for(let e=0;e<s.length;e++)if(Math.abs(s[e])>n){a=!1;break}if(a){const e=o-r;e>i&&(t.length>1&&(this.save(t),t=[]),e>10&&this.stop())}else t.push(new Float32Array(s)),r=o},this.#t.emit("recording",!0)}catch(e){u.error(e.message)}}convertBuffer(e){const t=new Float32Array(e),r=new Int16Array(e.length);for(let e=0;e<t.length;e++){const n=Math.max(-1,Math.min(1,t[e]));r[e]=n<0?32768*n:32767*n}return r}async encodeMP3(e){const{Mp3Encoder:t}=await import("@breezystack/lamejs"),r=new t(1,44100,128),n=[];for(const t of e){const e=this.convertBuffer(t),i=1152;let o=e.length;for(let t=0;o>=0;t+=i){const s=e.subarray(t,t+i),a=r.encodeBuffer(s);n.push(new Int8Array(a)),o-=i}}return n.push(r.flush()),new Blob(n,{type:"audio/mp3"})}async save(e){const t=await this.encodeMP3(e);try{this.#t.emit("transcribing",!0);const e=await this.#r(t);e&&this.#t.emit("result",e)}catch(e){}finally{this.#t.emit("transcribing",!1)}}stop(){this.#n&&(this.#n.getTracks().forEach(e=>e.stop()),this.#n=void 0),this.#i&&(this.#i.close(),this.#i=void 0),this.#t.emit("recording",!1)}onResult(e){this.#t.on("result",e)}onRecording(e){this.#t.on("recording",e)}onTranscribing(e){this.#t.on("transcribing",e)}};const ze=A(({onResult:r,model:n="builtin"},i)=>{const{request:o}=je(),s=z(()=>{if("builtin"!==n)return async e=>{const t=new FormData;t.append("file",e,"audio.mp3"),t.append("model",n);return(await o({url:"/transcriptions",method:"post",data:t})).text}},[n]),{start:l,stop:c,recording:d,transcribing:u}=function({onResult:e,loader:t}){const r=S(),[n,i]=q(!1),[o,s]=q(!1);return F(()=>()=>{r.current&&(r.current.stop(),r.current=void 0)},[]),{recording:n,transcribing:o,start:async()=>{r.current||(r.current=t?new Ae(t):new qe,r.current.onRecording(i),r.current.onTranscribing(s),r.current.onResult(e)),r.current.start()},stop:()=>{r.current&&r.current.stop()}}}({onResult:r,loader:s});return I(i,()=>({start:l,stop:c}),[l,c]),e(a,{tooltip:d?"停止":"语音输入",placement:"top",children:t(Fe,{onMouseDown:e=>{e.preventDefault(),d?c():l()},children:[u&&e(Ie,{animation:"border",variant:"primary",size:"sm"}),e("i",d?{className:"bi bi-mic-fill text-danger"}:{className:"bi bi-mic"})]})})}),Ie=n(B)`
|
|
103
103
|
position: absolute;
|
|
104
104
|
--bs-spinner-width: .75rem;
|
|
105
105
|
--bs-spinner-height: .75rem;
|
|
106
106
|
--bs-spinner-border-width: 0.1em;
|
|
107
|
-
`,Le=
|
|
107
|
+
`,Le=A(({className:t,children:r,size:n,tooltip:i,placement:o,onClick:s,onMouseDown:l},c)=>{const d=e(De,{ref:c,className:t,onClick:s,onMouseDown:l,$size:n,children:r});return i?e(a,{tooltip:i,placement:o,children:d}):d}),De=n.div`
|
|
108
108
|
width: 2rem;
|
|
109
109
|
height: 2rem;
|
|
110
110
|
align-items: center;
|
|
@@ -176,7 +176,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
176
176
|
margin-bottom: .5rem;
|
|
177
177
|
display: flex;
|
|
178
178
|
padding: 0 .125rem;
|
|
179
|
-
`;var Ge=
|
|
179
|
+
`;var Ge=A(function({readonly:t,autoFocus:r,placeholder:n,minRows:i,maxRows:o,onSubmit:s,onFocusedChange:a,onQueryChange:l,onPaste:c},d){const u=S(null),[m,h]=q(""),p=M(()=>{const e=u.current;if(!e)return;e.focus();const t=e.value.length;e.setSelectionRange(t,t)},[]),g=M(e=>{const t="string"==typeof e?e:e(m);h(t),l?.(t.trim()),requestAnimationFrame(()=>{p()})},[m,l,p]);return I(d,()=>({setContent:g,focus(){p()}}),[g,p]),e(Ze,{ref:u,value:m,minRows:i,maxRows:o,readOnly:t,autoFocus:r,placeholder:n,onFocus:()=>a?.(!0),onBlur:()=>a?.(!1),onChange:e=>{h(e.target.value),l?.(e.target.value.trim())},onPaste:e=>{c?.(e.nativeEvent)},onKeyDown:e=>{e.nativeEvent.isComposing||"Enter"!==e.key||e.shiftKey||(e.preventDefault(),e.stopPropagation(),s?.())}})});const Ze=n(X)`
|
|
180
180
|
min-height: calc(1.5em + 1rem);
|
|
181
181
|
width: 100%;
|
|
182
182
|
padding: 0.5rem 0.5rem 0.5rem 0.75rem;
|
|
@@ -185,7 +185,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
185
185
|
resize: none;
|
|
186
186
|
line-height: 1.5;
|
|
187
187
|
background: transparent;
|
|
188
|
-
`;var et=
|
|
188
|
+
`;var et=A(function({className:r,fileTypes:n,speech:i,scrollRef:o,variables:s,minRows:d=1,maxRows:m=5,toolbar:h,toolbarActions:p,disabled:g,autoFocus:f,tools:b,renderEditableInput:y,placeholder:x="请输入你的问题, Enter+Shift换行, Enter发送",supportStop:w=!1,onEvent:k,onNewConversation:E},N){const j=S(null),C=S(null),$=S(null),[R,A]=q(""),[L,D]=q(""),[P,O]=v([]),[B,U]=q(!1),_=n&&n.length>0?n:ke,H=M(()=>{requestAnimationFrame(()=>{$.current?.focus()})},[]),{send:Q,resume:K,stop:W}=function(e){const{setLoading:t,request:r}=je(),n=Ce(),i=n?.setMessages,o=n?.setConversationId,s=n?.conversationId,a=n?.messages,d=!0===e?.supportStop,{onEvent:u,onNewConversation:m,onComplete:h}=e??{},p=S(null),g=S(),f=S(s),b=()=>(p.current&&p.current.abort(),p.current=new AbortController,p.current.signal),v=M(e=>{const t=(e,r)=>{Object.entries(r).forEach(([r,n])=>{if("string"!=typeof n)if(!n||"object"!=typeof n||Array.isArray(n))e[r]=n;else if("index"in n){const{index:i,...o}=n;Array.isArray(e[r])||(e[r]=[]),e[r][i]||(e[r][i]={}),t(e[r][i],o)}else e[r]=n;else e[r]="string"==typeof e[r]?e[r]+n:n})};if(e.data)if("[DONE]"!=e.data)try{const r=JSON.parse(e.data);r.conversation?(f.current=r.conversation,o?.(r.conversation)):r.event?u?.(r.event):i?.(e=>{const n=e[e.length-1];if(r.chunks){if(n.chunks){const e=r.chunks.index;if(n.chunks[e]||(n.chunks[e]={content:"",reasoning:"",tools:[]}),r.chunks.error)n.chunks[e].error=r.chunks.error;else if(r.chunks.tools){n.chunks[e].tools||(n.chunks[e].tools=[]);const{index:i,...o}=r.chunks.tools;n.chunks[e].tools[i]||(n.chunks[e].tools[i]={name:"",title:"",arguments:""}),t(n.chunks[e].tools[i],o)}else if(r.chunks.reasoning)n.chunks[e].reasoning+=r.chunks.reasoning;else if(r.chunks.content)if("object"==typeof r.chunks.content){Array.isArray(n.chunks[e].content)||(n.chunks[e].content=[]);const t=r.chunks.content.index,i=r.chunks.content.value;"string"==typeof i?(n.chunks[e].content[t]||(n.chunks[e].content[t]=""),n.chunks[e].content[t]+=i):n.chunks[e].content[t]=i}else n.chunks[e].content+=r.chunks.content;else r.chunks.node&&(n.chunks[e].node={...n.chunks[e].node,...r.chunks.node})}}else r.stats?n.stats=r.stats:r.id&&(n.id=r.id)})}catch(e){console.error(e)}else i?.(e=>{e[e.length-1].loading=!1})},[u]),y=M(e=>{if(l(e))i?.(e=>{const t=e[e.length-1];t&&(t.loading=!1)});else{let t="未知错误";c(e)&&(t=401==e.response?.status?"未授权或授权已过期,请刷新页面后重试":"string"==typeof e.errors?e.errors:Object.values(e.errors).join("\n")),i?.(e=>{const r=e[e.length-1];r.chunks&&(0===r.chunks.length?r.chunks=[{error:t}]:r.chunks[r.chunks.length-1].error=t),r.loading=!1})}},[]),x=M(async e=>{g.current=e;try{const n=b();t(!0),i?.(e=>{e[e.length-1].loading=!0,delete e[e.length-1].stats});let o={url:"message",method:"get",params:{id:e},onMessage:v,signal:n};await r(o)}catch(e){y(e)}finally{p.current=null,g.current=void 0}t(!1),h?.()},[r,u,m,h]),w=M(async(e,...o)=>{"string"==typeof e&&(e={query:e,...o});const{query:s,files:a=[],variables:l={},extra:c={},quote:d}=e;let u=null,g=null;if(s||a.length>0){const e=b();t(!0),n?.setSuggestions?.([]),i?.(e=>{e.push({query:s,quote:d,files:a,variables:l,chunks:[],loading:!0})});try{let t={method:"post",data:{query:s,quote:d,files:a,variables:l,extra:c,conversation:f.current},onMessage:v,signal:e};const n=await r(t);u=n.message??null,g=n.conversation??null}catch(e){y(e)}finally{p.current=null}if(u){let e=!1;g&&!f.current&&(e=m?.(g)??!1),e||await x(u.id)}else t(!1),h?.()}},[r,u,m,h]),k=M(async e=>{let n=null;try{const o=b();t(!0),i?.(e=>{e[e.length-1].loading=!0});let s={url:"resume",method:"post",data:{conversation:f.current,chunk:e.chunk,tool:e.tool,payload:e.payload},onMessage:v,signal:o};n=(await r(s)).message??null}catch(e){y(e)}finally{p.current=null}n?await x(n.id):(t(!1),h?.())},[r,u,m,h]),E=M(async()=>{if(d)if(g.current)try{await r({url:"stop",method:"post",data:{id:g.current}})}catch{}else p.current?.abort()},[r,d]),N=()=>{const e=a?.[a.length-1];e&&e.id&&2===e.status&&x(e.id)};return F(()=>(N(),()=>{p.current&&p.current.abort()}),[]),F(()=>{s!=f.current&&(f.current=s,p.current&&p.current.abort(),N())},[s]),{send:w,resume:k,stop:E}}({supportStop:w,onEvent:k,onNewConversation:E,onComplete:H}),{loading:X,request:V,inputRef:Y}=je(),G=Ce(),[Z,ee]=q(),[te,re]=v({});F(()=>{const e=(G?.messages||[]).filter(e=>!!e.query);ee(e.at(-1)?.variables)},[G?.messages]),F(()=>{!n&&P.length>0&&O([])},[n]),F(()=>{const e=o?.current;if(e){const t=e=>{if(e.target instanceof HTMLAnchorElement&&"#!question"===e.target.hash){e.preventDefault();const t={query:e.target.text};s&&(t.variables={...Z,...s.values}),Q(t)}};return e.addEventListener("click",t),()=>{e.removeEventListener("click",t)}}},[s,Z]);const ne=M(e=>{const t=e.map((e,t)=>{if(e.name)return e;const r=e.type.split("/")[1]||"png";return new File([e],`screenshot-${Date.now()}-${t}.${r}`,{type:e.type})}).filter(e=>!(!_.includes("*")&&!_.includes(T.extname(e.name)))&&!(e.size>20971520)).slice(0,6-P.length);return 0!==t.length&&(O(e=>{e.push(...t.map(e=>({file:e})))}),t.forEach(async e=>{try{const t=new FormData;t.set("file",e);const r=await V({method:"POST",url:"/upload",data:t});O(t=>{const n=t.find(t=>t.file===e);n&&(n.path=r.path)})}catch(t){const r=c(t)?t.message:"unknown error";O(t=>{const n=t.find(t=>t.file===e);n&&(n.error=r)})}}),!0)},[P.length,_,V,O]),ie=M(({target:e})=>{e.files&&ne(Array.from(e.files)),e.value=""},[ne]),oe=M(e=>{const t=Array.from(e.clipboardData?.files||[]),r=Array.from(e.clipboardData?.items||[]).filter(e=>"file"===e.kind).map(e=>e.getAsFile()).filter(e=>!!e),n=t.length>0?t:r;0!==n.length&&ne(n)&&e.preventDefault()},[ne]),se=P.flatMap(({file:e,path:t})=>t?[{name:e.name,size:e.size,path:t}]:[]),ae=M(()=>{if(R||se.length>0){const e={query:R,files:se,extra:te};s&&(e.variables={...Z,...s.values}),L&&(e.quote=L),Q(e),$.current?.setContent(""),D(""),O([]),C.current?.stop(!0)}},[R,se,s,Z,te,L]),le=z(()=>{const e={setQuery(e){$.current?.setContent(e)},setQuote:D,setExtra:re,send:Q,resume:K,focus(){$.current?.focus()}};return Y.current=e,e},[D,re,Q,K]);if(I(N,()=>le,[le]),s){const t=s.config.filter(e=>!(e.key in(s.values||{}))),r=(e,r=!1)=>!!e&&t.every(t=>{const n=!t.required||e?.[t.key];return!n&&r&&u.error("请完善必填信息"),n});if(t.length>0&&!r(Z))return e(rt,{children:e(tt,{children:e(Me,{values:Z,variables:t,onSubmit:({formData:e})=>{if(r(e,!0))return ee(e),!0}})})})}return t("div",{className:r,children:[h&&e(Xe,{actions:p,children:h}),t(lt,{$focused:B&&!X,children:[P.length>0&&e(it,{children:P.map(({file:t,error:r,path:n},i)=>{const o=void 0===r&&void 0===n;return e(nt,{name:t.name,size:t.size,error:r,loading:o,onRemove:()=>{O(e=>{const r=e.findIndex(e=>e.file===t);-1!==r&&e.splice(r,1)})}},i)})}),!!L&&t(at,{children:[e("i",{className:"bi bi-quote"}),e("p",{children:L}),e(J,{onClick:()=>D("")})]}),t(ot,{$minRows:d,children:[y?.({Component:Ge,props:{ref:$,readonly:X||g,autoFocus:f,placeholder:x,minRows:d,maxRows:m,onSubmit:ae,onFocusedChange:U,onQueryChange:A,onPaste:oe}})||e(Ge,{ref:$,readonly:X||g,autoFocus:f,placeholder:x,minRows:d,maxRows:m,onSubmit:ae,onFocusedChange:U,onQueryChange:A,onPaste:oe}),t(st,{children:[b,n&&e(a,{tooltip:"可上传不超过6个小于20MB的文件",placement:"top",children:t(Fe,{disabled:P.length>=6,onClick:()=>j.current?.click(),children:[e("input",{onChange:ie,multiple:!0,accept:_.join(","),ref:j,type:"file",hidden:!0}),e("i",{className:"bi bi-file-earmark-arrow-up"})]})}),i&&e(ze,{ref:C,model:i.model,onResult:e=>{$.current?.setContent(t=>t+e+" ")}}),e(Fe,{$fill:X&&w,className:X&&w?"text-danger":"text-primary",disabled:!R&&0===se.length&&!X||X&&!w,onClick:e=>{e.preventDefault(),X&&w?W():ae()},children:e("i",X&&w?{className:"bi bi-square-fill fs-7"}:{className:"bi bi-send-fill"})})]})]})]})]})});const tt=n.div`
|
|
189
189
|
border-radius: var(--bs-border-radius-lg);
|
|
190
190
|
box-shadow: var(--bs-box-shadow-sm);
|
|
191
191
|
margin: 1rem;
|
|
@@ -247,7 +247,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
247
247
|
border: var(--bs-border-width) var(--bs-border-style) ${e=>e.$focused?"var(--bs-primary)":"var(--bs-border-color)"};
|
|
248
248
|
border-radius: var(--bs-border-radius-lg);
|
|
249
249
|
box-shadow: 0.125rem 0.25rem 0.5rem rgba(0, 0, 0, 0.1);
|
|
250
|
-
`;function ct(e){return e.map(e=>({id:e.id,query:e.query,quote:e.quote||void 0,files:e.files||void 0,variables:e.variables,chunks:e.chunks.map(({content:e="",node:t,error:r,tools:n=[],reasoning:i})=>({content:e,reasoning:i,error:r,tools:n,node:t})),annotation:e.annotation,stats:{usage:e.usage,context:e.context,latency:e.latency},status:e.status??1}))}function dt(e){if((e=e.filter(e=>!!e.trim())).length>3){const t=[...e];let r=e.length-3;for(;r--;){let e=Math.floor(Math.random()*t.length);t.splice(e,1)}e=t}return e}var ut,mt,ht;function pt(){return pt=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},pt.apply(null,arguments)}const gt=e=>C.createElement("svg",pt({xmlns:"http://www.w3.org/2000/svg",width:20,height:10,fill:"#fff",viewBox:"0 0 120 30"},e),ut||(ut=C.createElement("circle",{cx:15,cy:15,r:15,fill:"#3c60ff"},C.createElement("animate",{attributeName:"r",begin:"0s",calcMode:"linear",dur:"0.8s",from:15,repeatCount:"indefinite",to:15,values:"15;9;15"}),C.createElement("animate",{attributeName:"fill-opacity",begin:"0s",calcMode:"linear",dur:"0.8s",from:1,repeatCount:"indefinite",to:1,values:"1;.5;1"}))),mt||(mt=C.createElement("circle",{cx:60,cy:15,r:9,fill:"#3c60ff",fillOpacity:.3},C.createElement("animate",{attributeName:"r",begin:"0s",calcMode:"linear",dur:"0.8s",from:9,repeatCount:"indefinite",to:9,values:"9;15;9"}),C.createElement("animate",{attributeName:"fill-opacity",begin:"0s",calcMode:"linear",dur:"0.8s",from:.5,repeatCount:"indefinite",to:.5,values:".5;1;.5"}))),ht||(ht=C.createElement("circle",{cx:105,cy:15,r:15,fill:"#3c60ff"},C.createElement("animate",{attributeName:"r",begin:"0s",calcMode:"linear",dur:"0.8s",from:15,repeatCount:"indefinite",to:15,values:"15;9;15"}),C.createElement("animate",{attributeName:"fill-opacity",begin:"0s",calcMode:"linear",dur:"0.8s",from:1,repeatCount:"indefinite",to:1,values:"1;.5;1"}))));function ft(e){if(!e)return"";if("string"==typeof e)return e;if("image"===e.type){return`})`}return""}const bt=function(e,t,r){function n(t){return t!==oe.leftSquareBracket?(e.exit("citeMarker"),e.enter("citeData"),e.enter(se.chunkString,{contentType:"string"}),i(t)):(e.consume(t),n)}function i(n){return n===oe.rightSquareBracket?(e.exit(se.chunkString),e.exit("citeData"),e.enter("citeMarker"),function(n){if(n!==oe.rightSquareBracket)return r(n);return e.consume(n),e.exit("citeMarker"),e.exit("cite"),t(n)}(n)):ae(n)||n===oe.eof||n>57||n<48?r(n):(e.consume(n),i)}return function(t){return t!==oe.leftSquareBracket?r(t):(e.enter("cite"),e.enter("citeMarker"),n(t))}},vt=function(){const e=this.data();e.micromarkExtensions.push({text:{[oe.leftSquareBracket]:{tokenize:bt}}}),e.fromMarkdownExtensions.push({enter:{cite:function(e){this.enter({type:"cite",data:{hName:"cite",hChildren:[{type:"text",value:""}]}},e)},citeData:function(){this.buffer()}},exit:{cite:function(e){this.exit(e)},citeData:function(){const e=this.resume();this.stack[this.stack.length-1].data.hChildren[0].value=e}}})},yt=x.Image,xt={pre:({children:r,node:n})=>{if(!n)return null;const[i,o]=q(!1),s=
|
|
250
|
+
`;function ct(e){return e.map(e=>({id:e.id,query:e.query,quote:e.quote||void 0,files:e.files||void 0,variables:e.variables,chunks:e.chunks.map(({content:e="",node:t,error:r,tools:n=[],reasoning:i})=>({content:e,reasoning:i,error:r,tools:n,node:t})),annotation:e.annotation,stats:{usage:e.usage,context:e.context,latency:e.latency},status:e.status??1}))}function dt(e){if((e=e.filter(e=>!!e.trim())).length>3){const t=[...e];let r=e.length-3;for(;r--;){let e=Math.floor(Math.random()*t.length);t.splice(e,1)}e=t}return e}var ut,mt,ht;function pt(){return pt=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},pt.apply(null,arguments)}const gt=e=>C.createElement("svg",pt({xmlns:"http://www.w3.org/2000/svg",width:20,height:10,fill:"#fff",viewBox:"0 0 120 30"},e),ut||(ut=C.createElement("circle",{cx:15,cy:15,r:15,fill:"#3c60ff"},C.createElement("animate",{attributeName:"r",begin:"0s",calcMode:"linear",dur:"0.8s",from:15,repeatCount:"indefinite",to:15,values:"15;9;15"}),C.createElement("animate",{attributeName:"fill-opacity",begin:"0s",calcMode:"linear",dur:"0.8s",from:1,repeatCount:"indefinite",to:1,values:"1;.5;1"}))),mt||(mt=C.createElement("circle",{cx:60,cy:15,r:9,fill:"#3c60ff",fillOpacity:.3},C.createElement("animate",{attributeName:"r",begin:"0s",calcMode:"linear",dur:"0.8s",from:9,repeatCount:"indefinite",to:9,values:"9;15;9"}),C.createElement("animate",{attributeName:"fill-opacity",begin:"0s",calcMode:"linear",dur:"0.8s",from:.5,repeatCount:"indefinite",to:.5,values:".5;1;.5"}))),ht||(ht=C.createElement("circle",{cx:105,cy:15,r:15,fill:"#3c60ff"},C.createElement("animate",{attributeName:"r",begin:"0s",calcMode:"linear",dur:"0.8s",from:15,repeatCount:"indefinite",to:15,values:"15;9;15"}),C.createElement("animate",{attributeName:"fill-opacity",begin:"0s",calcMode:"linear",dur:"0.8s",from:1,repeatCount:"indefinite",to:1,values:"1;.5;1"}))));function ft(e){if(!e)return"";if("string"==typeof e)return e;if("image"===e.type){return`})`}return""}const bt=function(e,t,r){function n(t){return t!==oe.leftSquareBracket?(e.exit("citeMarker"),e.enter("citeData"),e.enter(se.chunkString,{contentType:"string"}),i(t)):(e.consume(t),n)}function i(n){return n===oe.rightSquareBracket?(e.exit(se.chunkString),e.exit("citeData"),e.enter("citeMarker"),function(n){if(n!==oe.rightSquareBracket)return r(n);return e.consume(n),e.exit("citeMarker"),e.exit("cite"),t(n)}(n)):ae(n)||n===oe.eof||n>57||n<48?r(n):(e.consume(n),i)}return function(t){return t!==oe.leftSquareBracket?r(t):(e.enter("cite"),e.enter("citeMarker"),n(t))}},vt=function(){const e=this.data();e.micromarkExtensions.push({text:{[oe.leftSquareBracket]:{tokenize:bt}}}),e.fromMarkdownExtensions.push({enter:{cite:function(e){this.enter({type:"cite",data:{hName:"cite",hChildren:[{type:"text",value:""}]}},e)},citeData:function(){this.buffer()}},exit:{cite:function(e){this.exit(e)},citeData:function(){const e=this.resume();this.stack[this.stack.length-1].data.hChildren[0].value=e}}})},yt=x.Image,xt={pre:({children:r,node:n})=>{if(!n)return null;const[i,o]=q(!1),s=z(()=>{const e=n.children[0];return"element"===(t=e).type&&"code"===t.tagName&&!!e.properties?.className?.includes("language-svg");var t},[n]);F(()=>{s&&o(s)},[s]);const a=z(()=>Y(n),[n]);return t(Ct,{children:[t(jt,{children:[!i&&e(w,{tooltip:!1,as:Nt,content:a}),s&&i&&e(Nt,{onClick:()=>{const e=new Blob([a],{type:"image/svg+xml"}),t=URL.createObjectURL(e),r=document.createElement("a");r.href=t,r.download="image.svg",r.click(),URL.revokeObjectURL(t)},children:"下载"}),s&&e(Nt,{onClick:()=>o(!i),children:i?"源码":"预览"})]}),s&&i?e("div",{dangerouslySetInnerHTML:{__html:a}}):e("pre",{children:r})]})},a:({node:t,href:r,...n})=>{const i=r?.startsWith("http")?"_blank":"_self";return e("a",{...n,href:r,target:i})},img:({node:t,...r})=>e(yt,{...r})},wt=[[ie,{singleDollarTextMath:!1}],ne,re],kt=[[te,{tagfilter:!0}],ee,[Z,{detect:!1,ignoreMissing:!0}]],Et=D(A(({content:t,components:r,cite:n},i)=>{t=t.replace(/\\\(\s(.+?)\s\\\)/g,"$$$$ $1 $$$$");const o=z(()=>{const e={...xt,...r};return n&&(e.cite=n),e},[r,n]),s=z(()=>n?[...wt,vt]:wt,[n]);return e($t,{ref:i,children:e(G,{remarkPlugins:s,rehypePlugins:kt,components:o,children:t})})}),V),Nt=n.div`
|
|
251
251
|
cursor: pointer;
|
|
252
252
|
padding: 2px 10px;
|
|
253
253
|
background-color: #303030;
|
|
@@ -551,7 +551,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
551
551
|
.hljs-strong {
|
|
552
552
|
font-weight: 700;
|
|
553
553
|
}
|
|
554
|
-
`;var
|
|
554
|
+
`;var Rt=A(function({children:t,tooltip:r,onClick:n,disabled:i,...o},s){i&&(n=void 0);const l=e(St,{ref:s,onClick:n,$disabled:i,...o,children:t});return r?e(a,{tooltip:r,placement:"top",children:l}):l});const St=n.div`
|
|
555
555
|
align-items: center;
|
|
556
556
|
justify-content: center;
|
|
557
557
|
border-radius: .375rem;
|
|
@@ -584,7 +584,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
584
584
|
`}
|
|
585
585
|
|
|
586
586
|
}
|
|
587
|
-
`,Mt=$(null);var Ft=Mt.Provider;const qt=x.Image;function
|
|
587
|
+
`,Mt=$(null);var Ft=Mt.Provider;const qt=x.Image;function At({src:t,...r}){const{imageResolver:n}=$e();return n&&t&&(t=n(t)),e(zt,{children:e(qt,{src:t,...r})},t)}const zt=n.div`
|
|
588
588
|
margin-bottom: .5rem;
|
|
589
589
|
margin-top: .5rem;
|
|
590
590
|
border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color);
|
|
@@ -609,7 +609,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
609
609
|
max-height: 100%;
|
|
610
610
|
max-width: 100%;
|
|
611
611
|
}
|
|
612
|
-
`,
|
|
612
|
+
`,It=$(null);function Lt(){const e=R(It);if(!e)throw new Error("useContext must be used within a Provider");return e}function Dt({children:t,...r}){return e(It.Provider,{value:r,children:t})}function Pt(e){const[t,r]=q(e);return F(()=>{r(e)},[e]),[t,r]}function Tt({description:r,options:n}){const{resume:i,disabled:o,response:s}=Lt(),[a,l]=Pt(s?.result),c=o||void 0!==a;return t(Ot,{children:[r&&e(Bt,{children:r}),n.map((t,r)=>e(Ut,{$selected:a===t,$disabled:c,onClick:()=>(e=>{c||(l(e),i(e))})(t),children:t},r))]})}const Ot=n.div`
|
|
613
613
|
display: flex;
|
|
614
614
|
flex-direction: column;
|
|
615
615
|
gap: 0.5rem;
|
|
@@ -644,7 +644,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
644
644
|
&:active {
|
|
645
645
|
transform: ${e=>e.$disabled?"none":"scale(0.98)"};
|
|
646
646
|
}
|
|
647
|
-
`;function _t({description:r,fields:n}){const{resume:i,disabled:o,response:s}=Lt(),[a,l]=Pt(void 0!==s),c=o||a,{schema:u,uiSchema:m}=
|
|
647
|
+
`;function _t({description:r,fields:n}){const{resume:i,disabled:o,response:s}=Lt(),[a,l]=Pt(void 0!==s),c=o||a,{schema:u,uiSchema:m}=z(()=>{const e={},t=[],r={};for(const i of n)e[i.name]={type:"string",title:i.label,default:i.default},i.placeholder&&(r[i.name]={"ui:placeholder":i.placeholder}),"number"===i.type?(e[i.name].type="number",void 0!==i.default&&(e[i.name].default=Number(i.default))):"textarea"===i.type?r[i.name]={...r[i.name],"ui:widget":"textarea"}:"select"!==i.type&&"radio"!==i.type||!i.options?"checkbox"===i.type&&i.options?(e[i.name].type="array",e[i.name].uniqueItems=!0,e[i.name].items={type:"string",enum:i.options},"string"==typeof i.default&&(e[i.name].default=i.default.split(",")),r[i.name]={...r[i.name],"ui:widget":"checkboxes","ui:enumNames":i.options,"ui:inline":!0}):"email"===i.type?e[i.name].format="email":"date"===i.type?e[i.name].format="date":"tel"===i.type&&(r[i.name]={...r[i.name],"ui:options":{inputType:"tel"}}):(r[i.name]={...r[i.name],"ui:widget":i.type},e[i.name].enum=i.options,e[i.name].enumNames=i.options),i.required&&t.push(i.name);return{schema:{type:"object",properties:e,required:t},uiSchema:r}},[n]);return t(Jt,{className:"rounded bg-white shadow-sm",children:[r&&e(Qt,{children:r}),e(d,{schema:u,uiSchema:m,formData:s,onSubmit:({formData:e})=>{c||(l(!0),i(e))},disabled:c,validate:!0,showErrorList:!1,submitText:a?"已提交":"提交",omitExtraData:!0,children:({submit:t})=>e(Ht,{children:t})})]})}const Ht=n.div`
|
|
648
648
|
display: flex;
|
|
649
649
|
justify-content: flex-end;
|
|
650
650
|
border-top: 1px solid var(--bs-border-color);
|
|
@@ -700,7 +700,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
700
700
|
button {
|
|
701
701
|
padding: .25rem 1.5rem;
|
|
702
702
|
}
|
|
703
|
-
`;function Yt(e){return e instanceof Error&&e.message||String(e)}class Gt extends P{state={hasError:!1};static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(e,t){this.props.onRenderError(e)}render(){return this.state.hasError?null:this.props.children}}function Zt({suspend:t}){const{readonly:r,
|
|
703
|
+
`;function Yt(e){return e instanceof Error&&e.message||String(e)}class Gt extends P{state={hasError:!1};static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(e,t){this.props.onRenderError(e)}render(){return this.state.hasError?null:this.props.children}}function Zt({suspend:t}){const{readonly:r,inputRef:n}=$e(),{chunkIndex:i,chunk:o,toolIndex:s,tool:a,isLastMessage:l}=function(){const e=R(Mt);if(!e)throw new Error("useContext must be used within a Provider");return e}(),c=M(e=>{n.current?.resume({chunk:i,tool:s,payload:e})},[i,s]),d=M(e=>{c({error:Yt(e)})},[c]);let u=null;switch(t.type){case"select":u=e(Tt,{...t.select});break;case"form":u=e(_t,{...t.form});break;case"confirm":u=e(Kt,{...t.confirm})}const m=a?.response||o.node?.output;return e(Dt,{resume:c,disabled:r||!!o.error||!l,response:"(Empty)"===m?void 0:m,children:e(Gt,{onRenderError:d,children:u})})}function er({value:t,cite:n}){const i=t=>"string"==typeof t?e(Et,{content:t,cite:n}):"image"===t.type?e(At,{src:t.image}):"suspend"===t.type?e(Zt,{suspend:t.suspend}):null;return Array.isArray(t)?e(r,{children:t.map((t,r)=>e(L,{children:i(t)},r))}):i(t)}const tr=({reasoning:r,loading:n})=>{const[i,o]=q(!1);return F(()=>{n||o(!1)},[n]),e(L,{children:e("div",{className:"mb-2",children:t("div",i?{className:"shadow-sm rounded bg-white fs-7",children:[t("div",{onClick:()=>o(!1),role:"button",className:"d-flex align-items-center p-1 px-2 gap-2",children:[n?e(B,{animation:"border",variant:"primary",size:"sm"}):e("i",{className:"bi bi-check-circle-fill text-success"}),e("span",{className:"text-muted",children:n?"思考中":"已思考"}),e("i",{className:"bi bi-caret-up-fill text-muted"})]}),e("div",{className:"border-top p-2 d-flex flex-column gap-2",children:e("div",{className:"border rounded bg-light p-2",children:e(Et,{content:r})})})]}:{onClick:()=>o(!0),role:"button",className:"d-inline-flex align-items-center shadow-sm rounded bg-white p-1 px-2 fs-7 gap-2",children:[n?e(B,{animation:"border",variant:"primary",size:"sm"}):e("i",{className:"bi bi-check-circle-fill text-success"}),e("span",{className:"text-muted",children:n?"思考中":"已思考"}),e("i",{className:"bi bi-caret-down-fill text-muted"})]})})})},rr=D(t=>{const{renderReasoning:r}=$e();return r?r({Component:tr,props:t}):e(tr,{...t})}),nr=e=>null==e?"None":"object"==typeof e?JSON.stringify(e,null,2):e;function ir({tool:r,loading:n}){const{logLevel:i="none",renderToolContent:o}=$e(),s="response"in r,a=!s&&!n,{response:l,title:c,content:d,showStatus:u,defaultExpanded:m}=z(()=>{const i=(e=>{try{return JSON.parse(e.arguments)}catch(e){return null}})(r),a=e("span",{className:"text-truncate",children:r.title}),l=t("div",{className:"border-top p-2 d-flex flex-column gap-2",children:[t("div",{className:"border rounded bg-light",children:[e("div",{className:"d-flex align-items-center p-1 px-2 fs-7 gap-2",children:e("span",{className:"text-muted",children:"参数"})}),e(sr,{className:"border-top p-2",children:r.arguments})]}),s&&t("div",{className:"border rounded bg-light",children:[e("div",{className:"d-flex align-items-center p-1 px-2 fs-7 gap-2",children:e("span",{className:"text-muted",children:"响应"})}),e(sr,{className:"border-top p-2",children:nr(r.response)})]})]}),c=r.content&&e(er,{value:r.content});if(o){const e=o({tool:r,args:i,loading:n});if(e)return{title:null===e.title?null:e.title??a,response:null===e.response?null:e.response??l,content:null===e.content?null:e.content??c,showStatus:e.showStatus??!0,defaultExpanded:e.defaultExpanded??!1}}return{title:a,response:l,content:c,showStatus:!0,defaultExpanded:!1}},[r,o]),[h,p]=q(m),g="all"==i&&null!==l;return t(L,{children:[c&&e("div",{className:"mb-2",children:t(or,{className:"shadow-sm rounded bg-white fs-7",$open:h,children:[t("div",{onClick:()=>p(g&&!h),role:"button",className:"d-flex align-items-center flex-nowrap p-1 px-2 gap-2",children:[a?e("i",{className:"bi bi-dash-circle-fill text-muted"}):s?r.error?e("i",{className:"bi bi-x-circle-fill text-danger"}):e("i",{className:"bi bi-check-circle-fill text-success"}):e(B,{animation:"border",variant:"primary",size:"sm"}),u&&e("span",{className:"text-muted",children:a?"已取消":s?"已使用":"正在使用"}),c,g&&e("i",h?{className:"bi bi-caret-up-fill text-muted"}:{className:"bi bi-caret-down-fill text-muted"})]}),h&&l]})}),d]})}const or=n.div`
|
|
704
704
|
width: ${e=>e.$open?"auto":"fit-content"};
|
|
705
705
|
max-width: 100%;
|
|
706
706
|
overflow: hidden;
|
|
@@ -715,12 +715,12 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
715
715
|
}
|
|
716
716
|
`,dr=n.span`
|
|
717
717
|
display: inline-block;
|
|
718
|
-
`;function ur({nodes:r,loading:n}){const[i,o]=q(!1),s=r.some(e=>"error"in e),a=n?e(B,{animation:"border",variant:"primary",size:"sm"}):e("i",s?{className:"bi bi-x-circle-fill text-danger"}:{className:"bi bi-check-circle-fill text-success"});return e("div",{className:"mb-2",children:t("div",i?{className:"shadow-sm rounded bg-white fs-7",children:[t("div",{onClick:()=>o(!1),role:"button",className:"d-flex align-items-center p-1 px-2 gap-2",children:[a,e("span",{children:"工作流"}),e("i",{className:"bi bi-caret-up-fill text-muted"})]}),e("div",{className:"border-top p-2 d-flex flex-column gap-1 bg-light bg-opacity-50",children:r.map((t,r)=>e(ar,{node:t},r))})]}:{onClick:()=>o(!0),role:"button",className:"d-inline-flex align-items-center shadow-sm rounded bg-white p-1 px-2 fs-7 gap-2",children:[a,e("span",{children:"工作流"}),e("i",{className:"bi bi-caret-down-fill text-muted"})]})})}const mr=D(
|
|
718
|
+
`;function ur({nodes:r,loading:n}){const[i,o]=q(!1),s=r.some(e=>"error"in e),a=n?e(B,{animation:"border",variant:"primary",size:"sm"}):e("i",s?{className:"bi bi-x-circle-fill text-danger"}:{className:"bi bi-check-circle-fill text-success"});return e("div",{className:"mb-2",children:t("div",i?{className:"shadow-sm rounded bg-white fs-7",children:[t("div",{onClick:()=>o(!1),role:"button",className:"d-flex align-items-center p-1 px-2 gap-2",children:[a,e("span",{children:"工作流"}),e("i",{className:"bi bi-caret-up-fill text-muted"})]}),e("div",{className:"border-top p-2 d-flex flex-column gap-1 bg-light bg-opacity-50",children:r.map((t,r)=>e(ar,{node:t},r))})]}:{onClick:()=>o(!0),role:"button",className:"d-inline-flex align-items-center shadow-sm rounded bg-white p-1 px-2 fs-7 gap-2",children:[a,e("span",{children:"工作流"}),e("i",{className:"bi bi-caret-down-fill text-muted"})]})})}const mr=D(A(({chunks:r,loading:n,cite:i,isLast:o=!1,deleted:s=!1},a)=>{const{logLevel:l="none"}=$e(),c=z(()=>r.flatMap(e=>e.node?[e.node]:[]),[r]);return t(hr,{ref:a,$deleted:s,children:["all"===l&&c.length>0&&e(ur,{loading:n,nodes:c}),r.map((r,s)=>t(L,{children:[r.reasoning&&["stats","all"].includes(l)&&e(rr,{reasoning:r.reasoning,loading:n&&!r.content&&0===(r.tools||[]).length}),r.content&&e(Ft,{value:{chunkIndex:s,chunk:r,isLastMessage:o},children:e(er,{cite:i,value:r.content})}),(r.tools||[]).map((t,i)=>e(Ft,{value:{chunkIndex:s,chunk:r,toolIndex:i,tool:t,isLastMessage:o},children:e(ir,{tool:t,loading:n})},i)),r.error&&e(Et,{content:`[${r.error}]`})]},s))]})})),hr=n.div`
|
|
719
719
|
${e=>e.$deleted&&o`
|
|
720
720
|
text-decoration-line: line-through;
|
|
721
721
|
color: var(--bs-secondary);
|
|
722
722
|
`}
|
|
723
|
-
`;class pr{#t;#o=[];#s=0;constructor(){this.#t=new W}speak(){for(this.#t.emit("playing",!0);this.#s<this.#o.length;){const e=this.#o[this.#s],t=new SpeechSynthesisUtterance(e),r=++this.#s;t.onend=()=>{r>=this.#o.length&&this.clear()},t.onerror=()=>{this.clear()},window.speechSynthesis.speak(t)}}clear(){this.#t.emit("playing",!1)}start(e,t=!1){this.#o=Array.isArray(e)?e:[e],t||(window.speechSynthesis.cancel(),this.#s=0),this.speak()}stop(){window.speechSynthesis.cancel(),this.clear()}onPlaying(e){this.#t.on("playing",e)}onSpeaking(e){this.#t.on("speaking",e)}}const gr=new Map;class fr{#r;#t;#o=[];#a=new Map;#l=!1;#s=0;#c=!1;constructor(e){this.#r=e,this.#t=new W}createLoader(e){const t=new Promise(async t=>{try{const{type:r,data:n}=await this.#r(e),i=new Audio(`data:${r};base64,${n}`);this.#a.set(e,i),t(i)}catch{this.#a.delete(e),t(void 0)}});return this.#a.set(e,t),t}async loadAudioData(){this.#c=!0,this.#t.emit("speaking",!0);let e=0;for(;e<this.#o.length;){const t=this.#o[e];!this.#a.has(t)&&this.#c&&await this.createLoader(t),e++}this.#t.emit("speaking",!1),this.#c=!1}waitForAudioLoaded(e){const t=this.#a.get(e);return t instanceof Promise?t:Promise.resolve(t)}async playAudio(e=0){this.#l=!0;const t=await this.waitForAudioLoaded(this.#o[e]);this.#t.emit("playing",!0),t?(gr.set(this,t),t.onpause=async()=>{t.ended?(this.#s++,this.#s<this.#o.length?await this.playAudio(this.#s):this.clear()):this.clear()},await t.play()):this.clear()}clear(){this.#l=!1,this.#c=!1,this.#t.emit("playing",!1),this.#t.emit("speaking",!1),gr.delete(this)}start(e,t=!1){gr.forEach((e,t)=>{t!==this&&(e.pause(),e.currentTime=0)}),this.#o=Array.isArray(e)?e:[e],t||(this.#s=0),this.#c||this.loadAudioData(),this.#l||this.playAudio()}update(e){this.#o=Array.isArray(e)?e:[e]}stop(){const e=gr.get(this);e&&(e.pause(),e.currentTime=0)}onPlaying(e){this.#t.on("playing",e)}onSpeaking(e){this.#t.on("speaking",e)}}function br({text:e,loading:t,loader:r}){const n=
|
|
723
|
+
`;class pr{#t;#o=[];#s=0;constructor(){this.#t=new W}speak(){for(this.#t.emit("playing",!0);this.#s<this.#o.length;){const e=this.#o[this.#s],t=new SpeechSynthesisUtterance(e),r=++this.#s;t.onend=()=>{r>=this.#o.length&&this.clear()},t.onerror=()=>{this.clear()},window.speechSynthesis.speak(t)}}clear(){this.#t.emit("playing",!1)}start(e,t=!1){this.#o=Array.isArray(e)?e:[e],t||(window.speechSynthesis.cancel(),this.#s=0),this.speak()}stop(){window.speechSynthesis.cancel(),this.clear()}onPlaying(e){this.#t.on("playing",e)}onSpeaking(e){this.#t.on("speaking",e)}}const gr=new Map;class fr{#r;#t;#o=[];#a=new Map;#l=!1;#s=0;#c=!1;constructor(e){this.#r=e,this.#t=new W}createLoader(e){const t=new Promise(async t=>{try{const{type:r,data:n}=await this.#r(e),i=new Audio(`data:${r};base64,${n}`);this.#a.set(e,i),t(i)}catch{this.#a.delete(e),t(void 0)}});return this.#a.set(e,t),t}async loadAudioData(){this.#c=!0,this.#t.emit("speaking",!0);let e=0;for(;e<this.#o.length;){const t=this.#o[e];!this.#a.has(t)&&this.#c&&await this.createLoader(t),e++}this.#t.emit("speaking",!1),this.#c=!1}waitForAudioLoaded(e){const t=this.#a.get(e);return t instanceof Promise?t:Promise.resolve(t)}async playAudio(e=0){this.#l=!0;const t=await this.waitForAudioLoaded(this.#o[e]);this.#t.emit("playing",!0),t?(gr.set(this,t),t.onpause=async()=>{t.ended?(this.#s++,this.#s<this.#o.length?await this.playAudio(this.#s):this.clear()):this.clear()},await t.play()):this.clear()}clear(){this.#l=!1,this.#c=!1,this.#t.emit("playing",!1),this.#t.emit("speaking",!1),gr.delete(this)}start(e,t=!1){gr.forEach((e,t)=>{t!==this&&(e.pause(),e.currentTime=0)}),this.#o=Array.isArray(e)?e:[e],t||(this.#s=0),this.#c||this.loadAudioData(),this.#l||this.playAudio()}update(e){this.#o=Array.isArray(e)?e:[e]}stop(){const e=gr.get(this);e&&(e.pause(),e.currentTime=0)}onPlaying(e){this.#t.on("playing",e)}onSpeaking(e){this.#t.on("speaking",e)}}function br({text:e,loading:t,loader:r}){const n=S(),[i,o]=q(!1),[s,a]=q(!1),l=S(t),c=async(i=!1)=>{n.current||(n.current=r?new fr(r):new pr,n.current.onSpeaking(o),n.current.onPlaying(a));let s="";"string"==typeof e?s=e:e.current&&(s=function(e){const t=e.querySelectorAll("p, h1, h2, h3, h4, h5, h6, li:not(:has(p,h1, h2, h3, h4, h5, h6))");return Array.from(t).flatMap(e=>e.textContent?[e.textContent]:[])}(e.current),t&&s.pop()),s&&0!==s.length&&n.current.start(s,i)};return F(()=>{if(l.current&&"string"!=typeof e&&e.current){if(t){const t={childList:!0,subtree:!0},r=new MutationObserver(function(){c(!0)});return r.observe(e.current,t),c(),()=>{r.disconnect()}}c(!0)}},[t]),F(()=>()=>{n.current&&(n.current.stop(),n.current=void 0)},[]),{playing:s,speaking:i,start:c,stop:()=>{n.current&&n.current.stop()}}}function vr({model:r="builtin",voice:n,loading:i,autoplay:o,contentRef:s,avatarRef:a}){const{request:l}=$e(),c=z(()=>{if("builtin"!==r)return async e=>(await l({url:"/speech",method:"post",data:{model:r,voice:n,input:e}})).audio},[r,n]),{playing:d,speaking:u,start:m,stop:h}=br({loader:c,text:s,loading:o&&i});let p=null;return a.current&&(u&&(p=le(e(yr,{children:e(B,{size:"sm",variant:"light"})}),a.current)),d&&(p=le(e(yr,{children:e(xr,{className:"bi bi-volume-down-fill text-light"})}),a.current))),t(Rt,{disabled:i&&!d,onClick:()=>{d?h():m()},children:[d?e(xr,{className:"bi bi-volume-down-fill"}):u?e(B,{size:"sm",variant:"primary"}):e(xr,{className:"bi bi-volume-down"}),p]})}const yr=n.div`
|
|
724
724
|
position: absolute;
|
|
725
725
|
top: 0;
|
|
726
726
|
left: 0;
|
|
@@ -735,7 +735,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
735
735
|
&::before {
|
|
736
736
|
transform: scale(1.4)
|
|
737
737
|
}
|
|
738
|
-
`,wr=D(({message:n,actions:i,setMessage:o,cite:s,speech:a,isLast:l})=>{const{query:c,quote:d,files:u=[],chunks:m,annotation:h,loading:p}=n,{user:g,bot:f,logLevel:b="none",messages:v,renderFileItem:y}=$e(),x=
|
|
738
|
+
`,wr=D(({message:n,actions:i,setMessage:o,cite:s,speech:a,isLast:l})=>{const{query:c,quote:d,files:u=[],chunks:m,annotation:h,loading:p}=n,{user:g,bot:f,logLevel:b="none",messages:v,renderFileItem:y}=$e(),x=z(()=>m?m.reduce(function(e,t){const r=Array.isArray(t.content)?t.content.reduce((e,t)=>{const r=ft(t);return r?e+r+"\n":e},""):ft(t.content);return e+r+"\n"+(t.tools||[]).reduce((e,t)=>{if(t.content){const r=ft(t.content);if(r)return e+r+"\n"}return e},"")},""):"",[m]),k=S(null),N=S(null),j=S(null),C=c||u.length>0;return t(r,{children:[C&&t(Fr,{$reverse:!0,children:[g&&t(r,{children:[e(Rr,{children:e("img",{src:g.avatar})}),e(Sr,{})]}),t(Mr,{ref:k,children:[c&&e(Et,{content:c}),d&&e(Q,{trigger:"click",container:k,rootClose:!0,placement:"bottom",overlay:e(kr,{body:!0,children:d}),children:e(Nr,{children:e(Er,{children:d})})}),u.length>0&&u.map(({name:t,size:r,path:n},i)=>{if(E(n))return e(At,{src:`/uploads/${n}`},i);const o={name:t,url:`/uploads/${n}`,size:r};return e(jr,{children:y?y({Component:be,props:o}):e(be,{...o})},i)})]})]}),m&&t(Fr,{children:[f&&t(r,{children:[e(Rr,{ref:N,children:e("img",{src:f.avatar})}),e(Sr,{})]}),t(Mr,{children:[C&&!1!==i&&t(Cr,{children:[e(w,{placement:"top",content:x,as:Rt,tooltip:!0}),a&&e(vr,{loading:n.loading,avatarRef:N,contentRef:j,...a}),i?.({Component:Rt,message:n,content:x,setMessage:o,messages:v})]}),e($r,{children:["stats","all"].includes(b)&&n.stats&&t(r,{children:[t("span",{children:["耗时 ",n.stats.latency/1e3," 秒"]}),t("span",{children:["花费 Token ",n.stats.usage]})]})}),e(mr,{ref:j,chunks:m,loading:p,isLast:l,cite:s,deleted:!!h}),h&&t("div",{children:[t("div",{className:"d-flex align-items-center",children:[e("span",{className:"fs-7 text-secondary me-2",children:"标注的答案"}),e("hr",{className:"flex-fill"})]}),e(Et,{content:h.answer})]}),n.loading&&e(gt,{})]})]})]})}),kr=n(K)`
|
|
739
739
|
max-width: calc(100% - .875rem * 2);
|
|
740
740
|
width: calc(100% - .875rem * 2);
|
|
741
741
|
font-size: 1rem;
|
|
@@ -790,7 +790,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
790
790
|
display: flex;
|
|
791
791
|
opacity: 0;
|
|
792
792
|
z-index: 1;
|
|
793
|
-
`,
|
|
793
|
+
`,Rr=n.div`
|
|
794
794
|
width: 35px;
|
|
795
795
|
height: 35px;
|
|
796
796
|
border-radius: 50%;
|
|
@@ -801,7 +801,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
801
801
|
width: 100%;
|
|
802
802
|
height: 100%;
|
|
803
803
|
}
|
|
804
|
-
`,
|
|
804
|
+
`,Sr=n.div`
|
|
805
805
|
width: 0;
|
|
806
806
|
height: 0;
|
|
807
807
|
content: "";
|
|
@@ -827,7 +827,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
827
827
|
${e=>e.$reverse&&o`
|
|
828
828
|
flex-direction: row-reverse;
|
|
829
829
|
|
|
830
|
-
${
|
|
830
|
+
${Sr} {
|
|
831
831
|
border-left-color: rgba(var(--bs-primary-rgb), 0.1);
|
|
832
832
|
border-right-color: transparent;
|
|
833
833
|
}
|
|
@@ -836,12 +836,12 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
836
836
|
background: rgba(var(--bs-primary-rgb), 0.1);
|
|
837
837
|
}
|
|
838
838
|
`};
|
|
839
|
-
`;function qr(r){const{placeholder:n,actions:i,cite:o,speech:s,renderItem:a,scrollRef:l}=r,{messages:c,setMessages:d,loading:u,suggestions:m,conversationId:p}=$e(),g=
|
|
839
|
+
`;function qr(r){const{placeholder:n,actions:i,cite:o,speech:s,renderItem:a,scrollRef:l}=r,{messages:c,setMessages:d,loading:u,suggestions:m,conversationId:p}=$e(),g=S(r.loaded),f=S(!0),b=S(!1);F(()=>{const e=l.current;if(!e)return;const t=()=>{b.current=!0},r=()=>{if(!b.current)return;const t=e.scrollHeight-e.scrollTop-e.clientHeight<50;f.current=t,t&&(b.current=!1)};return e.addEventListener("wheel",t,{passive:!0}),e.addEventListener("touchstart",t,{passive:!0}),e.addEventListener("scroll",r,{passive:!0}),()=>{e.removeEventListener("wheel",t),e.removeEventListener("touchstart",t),e.removeEventListener("scroll",r)}},[l]);const v=h(()=>{if(!f.current)return;const e=l.current;e&&requestAnimationFrame(()=>{e.scrollTo({top:e.scrollHeight})})},200),y=S(null),{height:x}=ce({ref:y});F(()=>{(u||!g.current)&&c.length>0&&(u&&(g.current=!0),v())},[x,u,g,c]),F(()=>{m.length>0&&v()},[m]),F(()=>{g.current=r.loaded},[p]),F(()=>{const e=y.current;if(e){const t=()=>{g.current=!0};return e.addEventListener("click",t),()=>{e.removeEventListener("click",t)}}},[y]);const w=c.slice(-30);return t(Ar,{ref:y,children:[0===w.length&&n,w.map((t,r)=>{const n={actions:i,cite:o,speech:s,message:t,setMessage:e=>{d(r=>{const n=r.findIndex(e=>e.id===t.id);-1!==n&&e(r[n])})},isLast:r===w.length-1};return a?e(L,{children:a({Component:wr,props:n})},r):e(wr,{...n},r)}),m.length>0&&e(zr,{children:m.map((t,r)=>e("a",{href:"#!question",children:t},r))})]})}const Ar=n.div`
|
|
840
840
|
display: flex;
|
|
841
841
|
flex-direction: column;
|
|
842
842
|
flex: 1;
|
|
843
843
|
margin-bottom: .5rem;
|
|
844
|
-
`,
|
|
844
|
+
`,zr=n.div`
|
|
845
845
|
display: flex;
|
|
846
846
|
flex-direction: column;
|
|
847
847
|
align-items: flex-start;
|
|
@@ -858,7 +858,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
858
858
|
background: var(--bs-secondary-bg-subtle);
|
|
859
859
|
}
|
|
860
860
|
}
|
|
861
|
-
`,
|
|
861
|
+
`,Ir=D(A(({className:r,bot:n,user:i,input:o,logLevel:s,imageResolver:a,nodeIconResolver:l,placeholder:c,actions:d,onboarding:u,conversation:m,cite:h,speech:p,renderItem:g,renderFileItem:f,renderToolContent:b,renderReasoning:y,messages:w,request:k,onReset:E,transformMessages:j=ct},C)=>{const $=M(e=>{const t=[];if(u&&!1!==u.enable){const e=dt(u.questions||[]);t.push({chunks:[{content:[u.prologue,...e.map(e=>`[${e}](#!question)`)].join("\n"),tools:[]}],loading:u.loading})}return e?t.concat(j(e.messages||[])):w?t.concat(j(w)):t},[u]),[R,F]=q(m?.id),A=S(),[L,D]=v(()=>$(m)),P=z(()=>k?"string"==typeof k?N.create({baseURL:k}):k:N,[k]),[T,O]=q(!1),B=S(),[U,_]=q("0px"),[H,J]=q([]),Q=M(e=>{"suggestion"==e.type&&J(e.data),o?.onEvent?.(e)},[o?.onEvent]),K=M(e=>{F(e?.id),D($(e)),J([]),O(!1),E?.(e)},[T,$,E]);return I(C,()=>({reset:K}),[K]),e(Se,{request:P,bot:n,user:i,logLevel:s,imageResolver:a,nodeIconResolver:l,conversationId:R,setConversationId:F,inputRef:A,messages:L,setMessages:D,suggestions:H,setSuggestions:J,loading:T,setLoading:O,renderFileItem:f,reset:K,readonly:!o,renderToolContent:b,renderReasoning:y,children:e(x,{children:e(Pr,{className:r,scrollableNodeProps:{ref:M(e=>{B.current=e;const t=e?.firstElementChild;t&&requestAnimationFrame(()=>{const e=window.getComputedStyle(t);_(e.paddingBottom)})},[])},children:t(Dr,{children:[e(qr,{placeholder:c,cite:h,actions:d,loaded:!o,speech:p,renderItem:g,scrollRef:B}),o&&e(Lr,{$bottom:U,...o,onEvent:Q,scrollRef:B})]})})})})}),V),Lr=n(et)`
|
|
862
862
|
position: sticky;
|
|
863
863
|
bottom: 0;
|
|
864
864
|
z-index: 1;
|
|
@@ -881,4 +881,4 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
881
881
|
display: flex;
|
|
882
882
|
flex-direction: column;
|
|
883
883
|
}
|
|
884
|
-
`,Tr=D(
|
|
884
|
+
`,Tr=D(A(({className:t,request:r,disabled:n,supportStop:i,fileTypes:o,speech:s,minRows:a,maxRows:l,toolbar:c,toolbarActions:d,tools:u,autoFocus:m,renderEditableInput:h,placeholder:p,variables:g,onEvent:f,onNewConversation:b},v)=>{const[y,x]=q(!1),w=S(),k=z(()=>r?"string"==typeof r?N.create({baseURL:r}):r:N,[r]);return e(Re,{request:k,loading:y,setLoading:x,inputRef:w,children:e(et,{ref:v,className:t,fileTypes:o,speech:s,variables:g,minRows:a,maxRows:l,toolbar:c,toolbarActions:d,tools:u,disabled:n,autoFocus:m,renderEditableInput:h,placeholder:p,supportStop:i,onEvent:f,onNewConversation:b})})}),V);async function Or(e){const t=await de().use(me).use(re).use(ne).use(ie).use(he).use(ue).process(e);return String(t)}export{Le as ActionButton,Tr as ChatInput,mr as Chunks,Ge as EditableInput,ge as FileIcon,be as FileItem,Fe as InputButton,Et as Markdown,Ir as MessageBox,Me as VariableForm,pe as isToolMessage,Or as md2html,dt as pickQuestions,je as useChatContext,$e as useMessageContext,br as useSynthesis};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@topthink/chat",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.19",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"prebuild": "rimraf es types",
|
|
6
6
|
"build": "rollup -c --environment NODE_ENV:production",
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
},
|
|
72
72
|
"author": "yunwuxin <tzzhangyajun@qq.com> (https://github.com/yunwuxin)",
|
|
73
73
|
"license": "MIT",
|
|
74
|
-
"gitHead": "
|
|
74
|
+
"gitHead": "9094047eed9568328140d6a99e7dd79189220b75"
|
|
75
75
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Dispatch, FC, PropsWithChildren, ReactElement, ReactNode, SetStateAction } from 'react';
|
|
1
|
+
import { Dispatch, FC, MutableRefObject, PropsWithChildren, ReactElement, ReactNode, SetStateAction } from 'react';
|
|
2
2
|
import { Conversation, Input, LogLevel, Message, ToolMessage } from '../../types';
|
|
3
3
|
import { Updater } from '@topthink/components/types/hooks/use-immer';
|
|
4
4
|
import { RequestInstance } from '@topthink/components';
|
|
@@ -26,8 +26,7 @@ interface ChatContextType {
|
|
|
26
26
|
request: RequestInstance;
|
|
27
27
|
loading: boolean;
|
|
28
28
|
setLoading: Dispatch<SetStateAction<boolean>>;
|
|
29
|
-
|
|
30
|
-
setInput: Dispatch<SetStateAction<Input | undefined>>;
|
|
29
|
+
inputRef: MutableRefObject<Input | undefined>;
|
|
31
30
|
}
|
|
32
31
|
interface DisplayContextType {
|
|
33
32
|
bot?: {
|
|
@@ -8,8 +8,6 @@ import { ToolRenderOptions, ToolRenderResult } from './context';
|
|
|
8
8
|
import { Components } from 'react-markdown';
|
|
9
9
|
import { FileItemProps } from './file-item';
|
|
10
10
|
import { ReasoningProps } from './reasoning';
|
|
11
|
-
export { default as FileIcon } from './file-icon';
|
|
12
|
-
export type { FileIconProps } from './file-icon';
|
|
13
11
|
export interface MessageBoxProps {
|
|
14
12
|
className?: string;
|
|
15
13
|
bot?: {
|
package/types/types.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Updater } from '@topthink/components';
|
|
1
2
|
export interface FormField {
|
|
2
3
|
name: string;
|
|
3
4
|
label: string;
|
|
@@ -145,6 +146,7 @@ export interface SendParams {
|
|
|
145
146
|
quote?: string;
|
|
146
147
|
files?: Message['files'];
|
|
147
148
|
variables?: Record<string, string>;
|
|
149
|
+
extra?: Record<string, any>;
|
|
148
150
|
}
|
|
149
151
|
export interface ResumeParams {
|
|
150
152
|
chunk: number;
|
|
@@ -159,6 +161,7 @@ export interface MessageBoxType {
|
|
|
159
161
|
reset(conversation?: Conversation): void;
|
|
160
162
|
}
|
|
161
163
|
export interface Input extends Chat {
|
|
164
|
+
setExtra: Updater<Record<string, any>>;
|
|
162
165
|
setQuery(query: string): void;
|
|
163
166
|
setQuote(quote: string): void;
|
|
164
167
|
focus(): void;
|