@topthink/chat 1.3.0 → 1.3.2
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 +67 -67
- package/package.json +3 -3
- package/types/components/chat-input/index.d.ts +34 -0
- package/types/components/message-box/context.d.ts +20 -12
- package/types/components/message-box/index.d.ts +3 -1
- package/types/components/message-box/input-box/index.d.ts +3 -1
- package/types/index.d.ts +2 -0
package/es/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as n,css as i,formatSize as o,Tooltip as s,useAsync 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}from"@topthink/components";import*as j from"react";import{createContext as C,useContext as $,useRef as
|
|
1
|
+
import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as n,css as i,formatSize as o,Tooltip as s,useAsync 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}from"@topthink/components";import*as j from"react";import{createContext as C,useContext as $,useRef as R,useCallback as S,useEffect as M,useState as q,forwardRef as F,useMemo as A,useImperativeHandle as z,Fragment as I,memo as L,Component as D}from"react";import*as P from"path";import T from"path";import{Spinner as O,Badge as B,Dropdown as U,FormControl as _,CloseButton as H,OverlayTrigger as Q,Popover as J}from"react-bootstrap";import K from"eventemitter3";import W from"react-textarea-autosize";import X from"lodash/isEqual";import{toString as V}from"hast-util-to-string";import Y from"react-markdown";import"katex/dist/katex.min.css";import G from"rehype-highlight";import Z from"rehype-katex";import ee from"remark-breaks";import te from"remark-gfm";import re from"remark-math";import{codes as ne,types as ie}from"micromark-util-symbol";import{markdownLineEnding as oe}from"micromark-util-character";import{createPortal as se}from"react-dom";import ae from"use-resize-observer";import{unified as le}from"unified";import ce from"rehype-stringify";import de from"remark-parse";import ue from"remark-rehype";function me(e,t){return e.name===t}const he=function({ext:e}){const{result:r}=a(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}},[e]);return r?t("img",{width:30,height:30,src:r}):null};function pe({className:r,name:n,size:i=0,loading:a,error:l,onRemove:c,onClick:d}){const u=T.extname(n).substring(1),m=e(ve,{className:r,$error:!!l,onClick:d,children:[e(be,{children:[t(he,{ext:u}),a&&t(O,{variant:"primary"})]}),e(fe,{children:[t("h4",{children:n}),i>0&&t("p",{children:o(i,1)})]}),c&&t(ge,{onClick:e=>{e.preventDefault(),c()},children:t("i",{className:"bi bi-trash3"})})]});return l?t(s,{placement:"top",tooltip:l,children:m}):m}const ge=n.div`
|
|
2
2
|
width: 1.75rem;
|
|
3
3
|
height: 1.75rem;
|
|
4
4
|
align-items: center;
|
|
@@ -65,7 +65,7 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
65
65
|
${e=>e.$error&&i`
|
|
66
66
|
border-color: var(--bs-danger) !important;
|
|
67
67
|
`}
|
|
68
|
-
`,ye=[".txt",".md",".pdf",".docx",".xlsx",".pptx",".png",".jpg"],xe=C(null);function we(){const e=$(xe);if(!e)throw new Error("useContext must be used within a Provider");return
|
|
68
|
+
`,ye=[".txt",".md",".pdf",".docx",".xlsx",".pptx",".png",".jpg"],xe=C(null),we=C(null);function ke(){const e=$(xe);if(!e)throw new Error("useChatContext must be used within a ChatProvider");return e}function Ee(){return $(we)}function Ne(){const e=$(xe),t=$(we);if(!e||!t)throw new Error("useContext must be used within a Provider");return{...e,...t}}function je({children:e,...r}){return t(xe.Provider,{value:r,children:e})}function Ce({children:e,...r}){const{request:n,loading:i,setLoading:o,...s}=r;return t(xe.Provider,{value:{request:n,loading:i,setLoading:o},children:t(we.Provider,{value:s,children:e})})}function $e({variables:e,values:r,onSubmit:n,onChange:i,children:o}){const s={},a=[],l={};return e.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)}),t(d,{schema:{type:"object",properties:s,required:a},formData:r,omitExtraData:!0,uiSchema:l,submitText:"开始对话",onSubmit:n,onChange:i,children:o})}const Re=n.button`
|
|
69
69
|
color: var(--bs-secondary);
|
|
70
70
|
cursor: pointer;
|
|
71
71
|
display: flex;
|
|
@@ -96,12 +96,12 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
96
96
|
}
|
|
97
97
|
`};
|
|
98
98
|
|
|
99
|
-
`;let
|
|
99
|
+
`;let Se=class{#e;#t;constructor(){this.#t=new K}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)}},Me=class{#t;#r;#n;#i;constructor(e){this.#r=e,this.#t=new K}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 qe=F(({onResult:r,model:n="builtin"},i)=>{const{request:o}=ke(),a=A(()=>{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=R(),[n,i]=q(!1),[o,s]=q(!1);return M(()=>()=>{r.current&&(r.current.stop(),r.current=void 0)},[]),{recording:n,transcribing:o,start:async()=>{r.current||(r.current=t?new Me(t):new Se,r.current.onRecording(i),r.current.onTranscribing(s),r.current.onResult(e)),r.current.start()},stop:()=>{r.current&&r.current.stop()}}}({onResult:r,loader:a});return z(i,()=>({start:l,stop:c}),[l,c]),t(s,{tooltip:d?"停止":"语音输入",placement:"top",children:e(Re,{onMouseDown:e=>{e.preventDefault(),d?c():l()},children:[u&&t(Fe,{animation:"border",variant:"primary",size:"sm"}),t("i",d?{className:"bi bi-mic-fill text-danger"}:{className:"bi bi-mic"})]})})}),Fe=n(O)`
|
|
100
100
|
position: absolute;
|
|
101
101
|
--bs-spinner-width: .75rem;
|
|
102
102
|
--bs-spinner-height: .75rem;
|
|
103
103
|
--bs-spinner-border-width: 0.1em;
|
|
104
|
-
`,
|
|
104
|
+
`,Ae=F(({className:e,children:r,size:n,tooltip:i,placement:o,onClick:a,onMouseDown:l},c)=>{const d=t(ze,{ref:c,className:e,onClick:a,onMouseDown:l,$size:n,children:r});return i?t(s,{tooltip:i,placement:o,children:d}):d}),ze=n.div`
|
|
105
105
|
width: 2rem;
|
|
106
106
|
height: 2rem;
|
|
107
107
|
align-items: center;
|
|
@@ -125,10 +125,10 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
125
125
|
&:hover {
|
|
126
126
|
background-color: var(--bs-secondary-bg-subtle);
|
|
127
127
|
}
|
|
128
|
-
`;function
|
|
128
|
+
`;function Ie(){const{request:n,reset:i,conversationId:o}=Ne(),[s,a]=q(!1),[l,c]=q(""),[d,u]=q(""),m=h(e=>{u(e)},500);return M(()=>{m(l)},[l]),e(r,{children:[t(Ae,{tooltip:"历史记录",placement:"top",onClick:()=>a(!0),children:t("i",{className:"bi bi-clock-history"})}),t(p,{show:s,onHide:()=>{a(!1)},placement:"end",headerAs:Oe,header:e(r,{children:[t("span",{children:"聊天历史记录"}),t(Be,{children:t(_,{type:"search",placeholder:"搜索聊天记录...",value:l,onChange:e=>c(e.target.value),autoFocus:!0})})]}),bodyAs:Le,children:s&&t(Te,{children:t(Pe,{useWindow:!1,source:e=>n({url:"/conversation",params:{...e,...d&&{keyword:d}}}),render:({data:s,loading:l,setData:c})=>s.length||l?e(r,{children:[s.map((s,l)=>{const d=o===s.id;return e(I,{children:[l>0&&t("hr",{className:"mx-2 my-2"}),e(De,{children:[d&&t(B,{bg:"secondary",children:"当前"}),t("span",{className:"overflow-hidden text-truncate flex-fill",onClick:()=>{i(s),a(!1)},children:s.title||"未命名对话"}),e(U,{align:"end",children:[t(U.Toggle,{size:"sm",className:"no-caret",as:Ae,children:t("i",{className:"bi bi-three-dots-vertical"})}),e(U.Menu,{children:[t(g,{buttonProps:{as:U.Item},text:e(r,{children:[t("i",{className:"bi bi-pencil me-2"}),"重命名"]}),modalProps:{header:"编辑对话名称"},schema:{type:"object",properties:{title:{type:"string"}}},uiSchema:{title:{"ui:label":!1,"ui:autofocus":!0}},formData:{title:s.title},onRequest:e=>n({url:`/conversation/${s.id}`,method:"PUT",data:e}),onSuccess:(e,t)=>{c(e=>{const r=e.findIndex(e=>e.id===s.id);-1!==r&&Object.assign(e[r],t)})}}),e(f,{as:U.Item,confirm:"确定要删除吗?",onRequest:()=>n({url:`/conversation/${s.id}`,method:"DELETE"}),onSuccess:()=>{c(e=>{const t=e.findIndex(e=>e.id===s.id);-1!==t&&e.splice(t,1)}),d&&i()},children:[t("i",{className:"bi bi-trash3 me-2"}),"删除"]})]})]})]})]},s.id)}),l&&t(b,{wrap:!0})]}):t("div",{className:"text-muted text-center py-5",children:d?"未找到匹配的聊天记录":"暂无对话记录"})},d)})})]})}const Le=n.div`
|
|
129
129
|
padding: 0;
|
|
130
130
|
overflow: hidden;
|
|
131
|
-
`,
|
|
131
|
+
`,De=n.div`
|
|
132
132
|
gap: .5rem;
|
|
133
133
|
display: flex;
|
|
134
134
|
cursor: pointer;
|
|
@@ -147,50 +147,49 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
147
147
|
display: block;
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
|
-
`,
|
|
150
|
+
`,Pe=n(m)`
|
|
151
151
|
display: flex;
|
|
152
152
|
flex-direction: column;
|
|
153
153
|
padding: .5rem;
|
|
154
|
-
`,
|
|
154
|
+
`,Te=n.div`
|
|
155
155
|
height: 100%;
|
|
156
156
|
overflow-y: auto;
|
|
157
|
-
`,
|
|
157
|
+
`,Oe=n.div`
|
|
158
158
|
display: flex;
|
|
159
159
|
align-items: center;
|
|
160
160
|
justify-content: space-between;
|
|
161
161
|
gap: 0.5rem;
|
|
162
162
|
flex: 1;
|
|
163
163
|
margin-right: .5rem;
|
|
164
|
-
`,
|
|
164
|
+
`,Be=n.div`
|
|
165
165
|
display: flex;
|
|
166
166
|
align-items: center;
|
|
167
167
|
gap: 0.5rem;
|
|
168
|
-
`;var
|
|
168
|
+
`;var Ue;function _e(){return _e=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},_e.apply(null,arguments)}const He=e=>j.createElement("svg",_e({width:"1em",height:"1em",fill:"currentColor",viewBox:"0 0 256 256"},e),Ue||(Ue=j.createElement("path",{fillRule:"evenodd",d:"M128 22C69.458 22 22 69.458 22 128v96c0 5.523 4.477 10 10 10h96c58.542 0 106-47.458 106-106S186.542 22 128 22m0 56c5.523 0 10 4.477 10 10v30h30c5.523 0 10 4.477 10 10s-4.477 10-10 10h-30v30c0 5.523-4.477 10-10 10s-10-4.477-10-10v-30H88c-5.523 0-10-4.477-10-10s4.477-10 10-10h30V88c0-5.523 4.477-10 10-10",clipRule:"evenodd","data-follow-fill":"#000"})));function Qe({onClick:e}){const{reset:r}=Ne();return t(Ae,{className:"text-primary",tooltip:"新会话",placement:"top",onClick:()=>e?.()??r(),children:t(He,{})})}function Je({children:n,actions:i}){const o=e(r,{children:[t(Ie,{}),t(Qe,{})]}),s="function"==typeof i?i({History:Ie,Reset:Qe}):e(r,{children:[i,o]});return e(We,{children:[n,t(Ke,{children:s})]})}const Ke=n.div`
|
|
169
169
|
display: flex;
|
|
170
170
|
gap: .25rem;
|
|
171
171
|
margin-left: auto;
|
|
172
|
-
`,
|
|
172
|
+
`,We=n.div`
|
|
173
173
|
margin-bottom: .5rem;
|
|
174
174
|
display: flex;
|
|
175
175
|
padding: 0 .125rem;
|
|
176
|
-
`;var
|
|
176
|
+
`;var Xe=F(function({readonly:e,autoFocus:r,placeholder:n,minRows:i,maxRows:o,onSubmit:s,onFocusedChange:a,onQueryChange:l,onPaste:c},d){const u=R(null),[m,h]=q(""),p=S(()=>{const e=u.current;if(!e)return;e.focus();const t=e.value.length;e.setSelectionRange(t,t)},[]),g=S(e=>{const t="string"==typeof e?e:e(m);h(t),l?.(t.trim()),requestAnimationFrame(()=>{p()})},[m,l,p]);return z(d,()=>({setContent:g,focus(){p()}}),[g,p]),t(Ve,{ref:u,value:m,minRows:i,maxRows:o,readOnly:e,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 Ve=n(W)`
|
|
177
177
|
min-height: calc(1.5em + 1rem);
|
|
178
178
|
width: 100%;
|
|
179
179
|
padding: 0.5rem 0.5rem 0.5rem 0.75rem;
|
|
180
180
|
border: 0;
|
|
181
181
|
outline: none;
|
|
182
182
|
resize: none;
|
|
183
|
-
flex: 1;
|
|
184
183
|
line-height: 1.5;
|
|
185
184
|
background: transparent;
|
|
186
|
-
`;var
|
|
185
|
+
`;var Ye=F(function({className:r,fileTypes:n,speech:i,scrollRef:o,variables:a,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=R(null),C=R(null),$=R(null),[F,I]=q(""),[L,D]=q(""),[T,O]=v([]),[B,U]=q(!1),_=n&&n.length>0?n:ye,Q=S(()=>{requestAnimationFrame(()=>{$.current?.focus()})},[]),{send:J,resume:K,stop:W}=function(e){const{setLoading:t,request:r}=ke(),n=Ee(),i=n?.setMessages,o=n?.setConversationId,s=n?.conversationId,a=n?.messages,d=!0===e?.supportStop,{onEvent:u,onNewConversation:m,onComplete:h}=e??{},p=R(null),g=R(),f=R(s),b=()=>(p.current&&p.current.abort(),p.current=new AbortController,p.current.signal),v=S(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=S(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=S(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=S(async(e,...o)=>{"string"==typeof e&&(e={query:e,...o});const{query:s,files:a=[],variables:l={},quote:c}=e;let d=null,u=null;if(s||a.length>0){const e=b();t(!0),n?.setSuggestions?.([]),i?.(e=>{e.push({query:s,quote:c,files:a,variables:l,chunks:[],loading:!0})});try{let t={method:"post",data:{query:s,quote:c,files:a,variables:l,conversation:f.current},onMessage:v,signal:e};const n=await r(t);d=n.message??null,u=n.conversation??null}catch(e){y(e)}finally{p.current=null}if(d){let e=!1;u&&!f.current&&(e=m?.(u)??!1),e||await x(d.id)}else t(!1),h?.()}},[r,u,m,h]),k=S(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=S(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 M(()=>(N(),()=>{p.current&&p.current.abort()}),[]),M(()=>{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:Q}),{loading:X,request:V}=ke(),Y=Ee(),[G,Z]=q();M(()=>{const e=(Y?.messages||[]).filter(e=>!!e.query);Z(e.at(-1)?.variables)},[Y?.messages]),M(()=>{!n&&T.length>0&&O([])},[n]),M(()=>{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};a&&(t.variables={...G,...a.values}),J(t)}};return e.addEventListener("click",t),()=>{e.removeEventListener("click",t)}}},[a,G]);const ee=S(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(P.extname(e.name)))&&!(e.size>20971520)).slice(0,6-T.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)},[T.length,_,V,O]),te=S(({target:e})=>{e.files&&ee(Array.from(e.files)),e.value=""},[ee]),re=S(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&&ee(n)&&e.preventDefault()},[ee]),ne=T.flatMap(({file:e,path:t})=>t?[{name:e.name,size:e.size,path:t}]:[]),ie=S(()=>{if(F||ne.length>0){const e={query:F,files:ne};a&&(e.variables={...G,...a.values}),L&&(e.quote=L),J(e),$.current?.setContent(""),D(""),O([]),C.current?.stop(!0)}},[F,ne,a,G,L]),oe=A(()=>({setQuery(e){$.current?.setContent(e)},setQuote:D,send:J,resume:K,focus(){$.current?.focus()}}),[D,J,K]);if(M(()=>{Y?.setInput?.(oe)},[oe]),z(N,()=>oe,[oe]),a){const e=a.config.filter(e=>!(e.key in(a.values||{}))),r=(t,r=!1)=>!!t&&e.every(e=>{const n=!e.required||t?.[e.key];return!n&&r&&u.error("请完善必填信息"),n});if(e.length>0&&!r(G))return t(Ze,{children:t(Ge,{children:t($e,{values:G,variables:e,onSubmit:({formData:e})=>{if(r(e,!0))return Z(e),!0}})})})}return e("div",{className:r,children:[h&&t(Je,{actions:p,children:h}),e(ot,{$focused:B&&!X,children:[T.length>0&&t(tt,{children:T.map(({file:e,error:r,path:n},i)=>{const o=void 0===r&&void 0===n;return t(et,{name:e.name,size:e.size,error:r,loading:o,onRemove:()=>{O(t=>{const r=t.findIndex(t=>t.file===e);-1!==r&&t.splice(r,1)})}},i)})}),!!L&&e(it,{children:[t("i",{className:"bi bi-quote"}),t("p",{children:L}),t(H,{onClick:()=>D("")})]}),e(rt,{$minRows:d,children:[y?.({Component:Xe,props:{ref:$,readonly:X||g,autoFocus:f,placeholder:x,minRows:d,maxRows:m,onSubmit:ie,onFocusedChange:U,onQueryChange:I,onPaste:re}})||t(Xe,{ref:$,readonly:X||g,autoFocus:f,placeholder:x,minRows:d,maxRows:m,onSubmit:ie,onFocusedChange:U,onQueryChange:I,onPaste:re}),e(nt,{children:[b,n&&t(s,{tooltip:"可上传不超过6个小于20MB的文件",placement:"top",children:e(Re,{disabled:T.length>=6,onClick:()=>j.current?.click(),children:[t("input",{onChange:te,multiple:!0,accept:_.join(","),ref:j,type:"file",hidden:!0}),t("i",{className:"bi bi-file-earmark-arrow-up"})]})}),i&&t(qe,{ref:C,model:i.model,onResult:e=>{$.current?.setContent(t=>t+e+" ")}}),t(Re,{$fill:X&&w,className:X&&w?"text-danger":"text-primary",disabled:!F&&0===ne.length&&!X||X&&!w,onClick:e=>{e.preventDefault(),X&&w?W():ie()},children:t("i",X&&w?{className:"bi bi-square-fill fs-7"}:{className:"bi bi-send-fill"})})]})]})]})]})});const Ge=n.div`
|
|
187
186
|
border-radius: var(--bs-border-radius-lg);
|
|
188
187
|
box-shadow: var(--bs-box-shadow-sm);
|
|
189
188
|
margin: 1rem;
|
|
190
189
|
padding: 1rem;
|
|
191
190
|
width: 100%;
|
|
192
191
|
max-width: 500px;
|
|
193
|
-
`,
|
|
192
|
+
`,Ze=n.div`
|
|
194
193
|
position: absolute;
|
|
195
194
|
left: 0;
|
|
196
195
|
right: 0;
|
|
@@ -200,25 +199,26 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
200
199
|
display: flex;
|
|
201
200
|
justify-content: center;
|
|
202
201
|
align-items: center;
|
|
203
|
-
`,
|
|
202
|
+
`,et=n(pe)`
|
|
204
203
|
width: calc((100% - 0.75rem) / 2);
|
|
205
|
-
`,
|
|
204
|
+
`,tt=n.div`
|
|
206
205
|
display: flex;
|
|
207
206
|
flex-wrap: wrap;
|
|
208
207
|
padding: 0.75rem;
|
|
209
208
|
gap: 0.75rem;
|
|
210
209
|
border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color);
|
|
211
|
-
`,
|
|
210
|
+
`,rt=n.div`
|
|
212
211
|
display: flex;
|
|
213
212
|
gap: 0.25rem;
|
|
214
|
-
align-items: end;
|
|
215
|
-
flex-direction: row;
|
|
216
|
-
`,
|
|
213
|
+
align-items: ${e=>e.$minRows&&e.$minRows>1?"stretch":"end"};
|
|
214
|
+
flex-direction: ${e=>e.$minRows&&e.$minRows>1?"column":"row"};
|
|
215
|
+
`,nt=n.div`
|
|
217
216
|
display: flex;
|
|
218
217
|
flex-direction: row;
|
|
218
|
+
justify-content: end;
|
|
219
219
|
gap: 0.25rem;
|
|
220
220
|
padding: 0.375rem 0.5rem 0.375rem 0.5rem;
|
|
221
|
-
`,
|
|
221
|
+
`,it=n.div`
|
|
222
222
|
margin: 0.75rem 0.75rem 0 0.75rem;
|
|
223
223
|
padding: 4px 8px;
|
|
224
224
|
display: flex;
|
|
@@ -239,14 +239,12 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
239
239
|
-webkit-box-orient: vertical;
|
|
240
240
|
display: -webkit-box;
|
|
241
241
|
}
|
|
242
|
-
`,
|
|
242
|
+
`,ot=n.div`
|
|
243
243
|
background: #fff;
|
|
244
244
|
border: var(--bs-border-width) var(--bs-border-style) ${e=>e.$focused?"var(--bs-primary)":"var(--bs-border-color)"};
|
|
245
245
|
border-radius: var(--bs-border-radius-lg);
|
|
246
246
|
box-shadow: 0.125rem 0.25rem 0.5rem rgba(0, 0, 0, 0.1);
|
|
247
|
-
|
|
248
|
-
margin: 0 1rem 1rem;
|
|
249
|
-
`;function nt(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,latency:e.latency},status:e.status??1}))}function it(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 ot,st,at;function lt(){return lt=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},lt.apply(null,arguments)}const ct=e=>j.createElement("svg",lt({xmlns:"http://www.w3.org/2000/svg",width:20,height:10,fill:"#fff",viewBox:"0 0 120 30"},e),ot||(ot=j.createElement("circle",{cx:15,cy:15,r:15,fill:"#3c60ff"},j.createElement("animate",{attributeName:"r",begin:"0s",calcMode:"linear",dur:"0.8s",from:15,repeatCount:"indefinite",to:15,values:"15;9;15"}),j.createElement("animate",{attributeName:"fill-opacity",begin:"0s",calcMode:"linear",dur:"0.8s",from:1,repeatCount:"indefinite",to:1,values:"1;.5;1"}))),st||(st=j.createElement("circle",{cx:60,cy:15,r:9,fill:"#3c60ff",fillOpacity:.3},j.createElement("animate",{attributeName:"r",begin:"0s",calcMode:"linear",dur:"0.8s",from:9,repeatCount:"indefinite",to:9,values:"9;15;9"}),j.createElement("animate",{attributeName:"fill-opacity",begin:"0s",calcMode:"linear",dur:"0.8s",from:.5,repeatCount:"indefinite",to:.5,values:".5;1;.5"}))),at||(at=j.createElement("circle",{cx:105,cy:15,r:15,fill:"#3c60ff"},j.createElement("animate",{attributeName:"r",begin:"0s",calcMode:"linear",dur:"0.8s",from:15,repeatCount:"indefinite",to:15,values:"15;9;15"}),j.createElement("animate",{attributeName:"fill-opacity",begin:"0s",calcMode:"linear",dur:"0.8s",from:1,repeatCount:"indefinite",to:1,values:"1;.5;1"}))));function dt(e){if(!e)return"";if("string"==typeof e)return e;if("image"===e.type){return`})`}return""}const ut=function(e,t,r){function n(t){return t!==ne.leftSquareBracket?(e.exit("citeMarker"),e.enter("citeData"),e.enter(ie.chunkString,{contentType:"string"}),i(t)):(e.consume(t),n)}function i(n){return n===ne.rightSquareBracket?(e.exit(ie.chunkString),e.exit("citeData"),e.enter("citeMarker"),function(n){if(n!==ne.rightSquareBracket)return r(n);return e.consume(n),e.exit("citeMarker"),e.exit("cite"),t(n)}(n)):oe(n)||n===ne.eof||n>57||n<48?r(n):(e.consume(n),i)}return function(t){return t!==ne.leftSquareBracket?r(t):(e.enter("cite"),e.enter("citeMarker"),n(t))}},mt=function(){const e=this.data();e.micromarkExtensions.push({text:{[ne.leftSquareBracket]:{tokenize:ut}}}),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}}})},ht=x.Image,pt={pre:({children:r,node:n})=>{if(!n)return null;const[i,o]=F(!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]);R(()=>{s&&o(s)},[s]);const a=z(()=>V(n),[n]);return e(xt,{children:[e(yt,{children:[!i&&t(w,{tooltip:!1,as:vt,content:a}),s&&i&&t(vt,{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&&t(vt,{onClick:()=>o(!i),children:i?"源码":"预览"})]}),s&&i?t("div",{dangerouslySetInnerHTML:{__html:a}}):t("pre",{children:r})]})},a:({node:e,href:r,...n})=>{const i=r?.startsWith("http")?"_blank":"_self";return t("a",{...n,href:r,target:i})},img:({node:e,...r})=>t(ht,{...r})},gt=[[re,{singleDollarTextMath:!1}],te,ee],ft=[Z,[G,{detect:!1,ignoreMissing:!0}]],bt=D(q(({content:e,components:r,cite:n},i)=>{e=e.replace(/\\\(\s(.+?)\s\\\)/g,"$$$$ $1 $$$$");const o=z(()=>{const e={...pt,...r};return n&&(e.cite=n),e},[r,n]),s=z(()=>n?[...gt,mt]:gt,[n]);return t(wt,{ref:i,children:t(Y,{remarkPlugins:s,rehypePlugins:ft,components:o,children:e})})}),X),vt=n.div`
|
|
247
|
+
`;function st(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,latency:e.latency},status:e.status??1}))}function at(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 lt,ct,dt;function ut(){return ut=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},ut.apply(null,arguments)}const mt=e=>j.createElement("svg",ut({xmlns:"http://www.w3.org/2000/svg",width:20,height:10,fill:"#fff",viewBox:"0 0 120 30"},e),lt||(lt=j.createElement("circle",{cx:15,cy:15,r:15,fill:"#3c60ff"},j.createElement("animate",{attributeName:"r",begin:"0s",calcMode:"linear",dur:"0.8s",from:15,repeatCount:"indefinite",to:15,values:"15;9;15"}),j.createElement("animate",{attributeName:"fill-opacity",begin:"0s",calcMode:"linear",dur:"0.8s",from:1,repeatCount:"indefinite",to:1,values:"1;.5;1"}))),ct||(ct=j.createElement("circle",{cx:60,cy:15,r:9,fill:"#3c60ff",fillOpacity:.3},j.createElement("animate",{attributeName:"r",begin:"0s",calcMode:"linear",dur:"0.8s",from:9,repeatCount:"indefinite",to:9,values:"9;15;9"}),j.createElement("animate",{attributeName:"fill-opacity",begin:"0s",calcMode:"linear",dur:"0.8s",from:.5,repeatCount:"indefinite",to:.5,values:".5;1;.5"}))),dt||(dt=j.createElement("circle",{cx:105,cy:15,r:15,fill:"#3c60ff"},j.createElement("animate",{attributeName:"r",begin:"0s",calcMode:"linear",dur:"0.8s",from:15,repeatCount:"indefinite",to:15,values:"15;9;15"}),j.createElement("animate",{attributeName:"fill-opacity",begin:"0s",calcMode:"linear",dur:"0.8s",from:1,repeatCount:"indefinite",to:1,values:"1;.5;1"}))));function ht(e){if(!e)return"";if("string"==typeof e)return e;if("image"===e.type){return`})`}return""}const pt=function(e,t,r){function n(t){return t!==ne.leftSquareBracket?(e.exit("citeMarker"),e.enter("citeData"),e.enter(ie.chunkString,{contentType:"string"}),i(t)):(e.consume(t),n)}function i(n){return n===ne.rightSquareBracket?(e.exit(ie.chunkString),e.exit("citeData"),e.enter("citeMarker"),function(n){if(n!==ne.rightSquareBracket)return r(n);return e.consume(n),e.exit("citeMarker"),e.exit("cite"),t(n)}(n)):oe(n)||n===ne.eof||n>57||n<48?r(n):(e.consume(n),i)}return function(t){return t!==ne.leftSquareBracket?r(t):(e.enter("cite"),e.enter("citeMarker"),n(t))}},gt=function(){const e=this.data();e.micromarkExtensions.push({text:{[ne.leftSquareBracket]:{tokenize:pt}}}),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}}})},ft=x.Image,bt={pre:({children:r,node:n})=>{if(!n)return null;const[i,o]=q(!1),s=A(()=>{const e=n.children[0];return"element"===(t=e).type&&"code"===t.tagName&&!!e.properties?.className?.includes("language-svg");var t},[n]);M(()=>{s&&o(s)},[s]);const a=A(()=>V(n),[n]);return e(Et,{children:[e(kt,{children:[!i&&t(w,{tooltip:!1,as:wt,content:a}),s&&i&&t(wt,{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&&t(wt,{onClick:()=>o(!i),children:i?"源码":"预览"})]}),s&&i?t("div",{dangerouslySetInnerHTML:{__html:a}}):t("pre",{children:r})]})},a:({node:e,href:r,...n})=>{const i=r?.startsWith("http")?"_blank":"_self";return t("a",{...n,href:r,target:i})},img:({node:e,...r})=>t(ft,{...r})},vt=[[re,{singleDollarTextMath:!1}],te,ee],yt=[Z,[G,{detect:!1,ignoreMissing:!0}]],xt=L(F(({content:e,components:r,cite:n},i)=>{e=e.replace(/\\\(\s(.+?)\s\\\)/g,"$$$$ $1 $$$$");const o=A(()=>{const e={...bt,...r};return n&&(e.cite=n),e},[r,n]),s=A(()=>n?[...vt,gt]:vt,[n]);return t(Nt,{ref:i,children:t(Y,{remarkPlugins:s,rehypePlugins:yt,components:o,children:e})})}),X),wt=n.div`
|
|
250
248
|
cursor: pointer;
|
|
251
249
|
padding: 2px 10px;
|
|
252
250
|
background-color: #303030;
|
|
@@ -256,7 +254,7 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
256
254
|
font-size: 12px;
|
|
257
255
|
font-family: initial;
|
|
258
256
|
user-select: none;
|
|
259
|
-
`,
|
|
257
|
+
`,kt=n.div`
|
|
260
258
|
position: absolute;
|
|
261
259
|
right: 10px;
|
|
262
260
|
top: 1em;
|
|
@@ -270,17 +268,17 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
270
268
|
&:hover {
|
|
271
269
|
opacity: 1;
|
|
272
270
|
}
|
|
273
|
-
`,
|
|
271
|
+
`,Et=n.div`
|
|
274
272
|
position: relative;
|
|
275
273
|
|
|
276
274
|
&:hover {
|
|
277
|
-
${
|
|
275
|
+
${kt} {
|
|
278
276
|
pointer-events: all;
|
|
279
277
|
transform: translateX(0px);
|
|
280
278
|
opacity: 0.7;
|
|
281
279
|
}
|
|
282
280
|
}
|
|
283
|
-
`,
|
|
281
|
+
`,Nt=n.div`
|
|
284
282
|
-ms-text-size-adjust: 100%;
|
|
285
283
|
-webkit-text-size-adjust: 100%;
|
|
286
284
|
line-height: 1.8;
|
|
@@ -550,7 +548,7 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
550
548
|
.hljs-strong {
|
|
551
549
|
font-weight: 700;
|
|
552
550
|
}
|
|
553
|
-
`;var
|
|
551
|
+
`;var jt=F(function({children:e,tooltip:r,onClick:n,disabled:i,...o},a){i&&(n=void 0);const l=t(Ct,{ref:a,onClick:n,$disabled:i,...o,children:e});return r?t(s,{tooltip:r,placement:"top",children:l}):l});const Ct=n.div`
|
|
554
552
|
align-items: center;
|
|
555
553
|
justify-content: center;
|
|
556
554
|
border-radius: .375rem;
|
|
@@ -583,7 +581,7 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
583
581
|
`}
|
|
584
582
|
|
|
585
583
|
}
|
|
586
|
-
|
|
584
|
+
`,$t=C(null);var Rt=$t.Provider;const St=x.Image;function Mt({src:e,...r}){const{imageResolver:n}=Ne();return n&&e&&(e=n(e)),t(qt,{children:t(St,{src:e,...r})},e)}const qt=n.div`
|
|
587
585
|
margin-bottom: .5rem;
|
|
588
586
|
margin-top: .5rem;
|
|
589
587
|
border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color);
|
|
@@ -608,7 +606,7 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
608
606
|
max-height: 100%;
|
|
609
607
|
max-width: 100%;
|
|
610
608
|
}
|
|
611
|
-
`,
|
|
609
|
+
`,Ft=C(null);function At(){const e=$(Ft);if(!e)throw new Error("useContext must be used within a Provider");return e}function zt({children:e,...r}){return t(Ft.Provider,{value:r,children:e})}function It(e){const[t,r]=q(e);return M(()=>{r(e)},[e]),[t,r]}function Lt({description:r,options:n}){const{resume:i,disabled:o,response:s}=At(),[a,l]=It(s?.result),c=o||void 0!==a;return e(Dt,{children:[r&&t(Pt,{children:r}),n.map((e,r)=>t(Tt,{$selected:a===e,$disabled:c,onClick:()=>(e=>{c||(l(e),i(e))})(e),children:e},r))]})}const Dt=n.div`
|
|
612
610
|
display: flex;
|
|
613
611
|
flex-direction: column;
|
|
614
612
|
gap: 0.5rem;
|
|
@@ -621,10 +619,10 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
621
619
|
&:last-child {
|
|
622
620
|
margin-bottom: 0;
|
|
623
621
|
}
|
|
624
|
-
`,
|
|
622
|
+
`,Pt=n.div`
|
|
625
623
|
color: var(--bs-secondary);
|
|
626
624
|
line-height: 1.5;
|
|
627
|
-
`,
|
|
625
|
+
`,Tt=n.div`
|
|
628
626
|
padding: 0.375rem 0.75rem;
|
|
629
627
|
background-color: ${e=>e.$selected?"rgba(var(--bs-primary-rgb), 0.1)":"#FFFFFF"};
|
|
630
628
|
border: 1px solid ${e=>e.$selected?"rgba(var(--bs-primary-rgb), 0.3)":"var(--bs-border-color)"};
|
|
@@ -643,7 +641,7 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
643
641
|
&:active {
|
|
644
642
|
transform: ${e=>e.$disabled?"none":"scale(0.98)"};
|
|
645
643
|
}
|
|
646
|
-
`;function
|
|
644
|
+
`;function Ot({description:r,fields:n}){const{resume:i,disabled:o,response:s}=At(),[a,l]=It(void 0!==s),c=o||a,{schema:u,uiSchema:m}=A(()=>{const e={},t=[],r={};for(const i of n)e[i.name]={type:"number"===i.type?"number":"string",title:i.label,default:i.default},i.placeholder&&(r[i.name]={"ui:placeholder":i.placeholder}),"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},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 e(Ut,{className:"rounded bg-white shadow-sm",children:[r&&t(_t,{children:r}),t(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:e})=>t(Bt,{children:e})})]})}const Bt=n.div`
|
|
647
645
|
display: flex;
|
|
648
646
|
justify-content: flex-end;
|
|
649
647
|
border-top: 1px solid var(--bs-border-color);
|
|
@@ -652,7 +650,7 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
652
650
|
button {
|
|
653
651
|
padding: .25rem;
|
|
654
652
|
}
|
|
655
|
-
`,
|
|
653
|
+
`,Ut=n.div`
|
|
656
654
|
display: flex;
|
|
657
655
|
flex-direction: column;
|
|
658
656
|
gap: 0.5rem;
|
|
@@ -670,10 +668,10 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
670
668
|
&:last-child {
|
|
671
669
|
margin-bottom: 0;
|
|
672
670
|
}
|
|
673
|
-
`,
|
|
671
|
+
`,_t=n.div`
|
|
674
672
|
color: var(--bs-secondary);
|
|
675
673
|
line-height: 1.5;
|
|
676
|
-
`;function
|
|
674
|
+
`;function Ht({content:r}){const{resume:n,disabled:i,response:o}=At(),[s,a]=It(void 0!==o),l=i||s;return e(Qt,{className:"rounded bg-white shadow-sm",children:[r&&t(Jt,{children:t(xt,{content:r})}),t(Kt,{children:t(k,{disabled:l,onClick:()=>{l||(a(!0),n("已确认"))},children:s?"已确认":"确认"})})]})}const Qt=n.div`
|
|
677
675
|
display: flex;
|
|
678
676
|
flex-direction: column;
|
|
679
677
|
gap: .5rem;
|
|
@@ -687,10 +685,10 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
687
685
|
&:last-child {
|
|
688
686
|
margin-bottom: 0;
|
|
689
687
|
}
|
|
690
|
-
`,
|
|
688
|
+
`,Jt=n.div`
|
|
691
689
|
line-height: 1.6;
|
|
692
690
|
color: var(--bs-body-color);
|
|
693
|
-
`,
|
|
691
|
+
`,Kt=n.div`
|
|
694
692
|
display: flex;
|
|
695
693
|
justify-content: flex-end;
|
|
696
694
|
border-top: 1px solid var(--bs-border-color);
|
|
@@ -699,27 +697,27 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
699
697
|
button {
|
|
700
698
|
padding: .25rem 1.5rem;
|
|
701
699
|
}
|
|
702
|
-
`;function
|
|
700
|
+
`;function Wt(e){return e instanceof Error&&e.message||String(e)}class Xt extends D{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 Vt({suspend:e}){const{readonly:r,input:n}=Ne(),{chunkIndex:i,chunk:o,toolIndex:s,tool:a,isLastMessage:l}=function(){const e=$($t);if(!e)throw new Error("useContext must be used within a Provider");return e}(),c=S(e=>{n?.resume({chunk:i,tool:s,payload:e})},[i,n,s]),d=S(e=>{c({error:Wt(e)})},[c]);let u=null;switch(e.type){case"select":u=t(Lt,{...e.select});break;case"form":u=t(Ot,{...e.form});break;case"confirm":u=t(Ht,{...e.confirm})}const m=a?.response||o.node?.output;return t(zt,{resume:c,disabled:r||!!o.error||!l,response:"(Empty)"===m?void 0:m,children:t(Xt,{onRenderError:d,children:u})})}function Yt({value:e,cite:n}){const i=e=>"string"==typeof e?t(xt,{content:e,cite:n}):"image"===e.type?t(Mt,{src:e.image}):"suspend"===e.type?t(Vt,{suspend:e.suspend}):null;return Array.isArray(e)?t(r,{children:e.map((e,r)=>t(I,{children:i(e)},r))}):i(e)}const Gt=({reasoning:r,loading:n})=>{const[i,o]=q(!1);return M(()=>{n||o(!1)},[n]),t(I,{children:t("div",{className:"mb-2",children:e("div",i?{className:"shadow-sm rounded bg-white fs-7",children:[e("div",{onClick:()=>o(!1),role:"button",className:"d-flex align-items-center p-1 px-2 gap-2",children:[n?t(O,{animation:"border",variant:"primary",size:"sm"}):t("i",{className:"bi bi-check-circle-fill text-success"}),t("span",{className:"text-muted",children:n?"思考中":"已思考"}),t("i",{className:"bi bi-caret-up-fill text-muted"})]}),t("div",{className:"border-top p-2 d-flex flex-column gap-2",children:t("div",{className:"border rounded bg-light p-2",children:t(xt,{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?t(O,{animation:"border",variant:"primary",size:"sm"}):t("i",{className:"bi bi-check-circle-fill text-success"}),t("span",{className:"text-muted",children:n?"思考中":"已思考"}),t("i",{className:"bi bi-caret-down-fill text-muted"})]})})})},Zt=L(e=>{const{renderReasoning:r}=Ne();return r?r({Component:Gt,props:e}):t(Gt,{...e})});function er({tool:r,loading:n}){const{logLevel:i="none",renderToolContent:o}=Ne(),s="response"in r,a=!s&&!n,{response:l,title:c,content:d,showStatus:u,defaultExpanded:m}=A(()=>{const i=(e=>{try{return JSON.parse(e.arguments)}catch(e){return null}})(r),a=t("span",{className:"text-truncate",children:r.title}),l=e("div",{className:"border-top p-2 d-flex flex-column gap-2",children:[e("div",{className:"border rounded bg-light",children:[t("div",{className:"d-flex align-items-center p-1 px-2 fs-7 gap-2",children:t("span",{className:"text-muted",children:"参数"})}),t(rr,{className:"border-top p-2",children:r.arguments})]}),s&&e("div",{className:"border rounded bg-light",children:[t("div",{className:"d-flex align-items-center p-1 px-2 fs-7 gap-2",children:t("span",{className:"text-muted",children:"响应"})}),t(rr,{className:"border-top p-2",children:r.response||"None"})]})]}),c=r.content&&t(Yt,{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 e(I,{children:[c&&t("div",{className:"mb-2",children:e(tr,{className:"shadow-sm rounded bg-white fs-7",$open:h,children:[e("div",{onClick:()=>p(g&&!h),role:"button",className:"d-flex align-items-center flex-nowrap p-1 px-2 gap-2",children:[a?t("i",{className:"bi bi-dash-circle-fill text-muted"}):s?r.error?t("i",{className:"bi bi-x-circle-fill text-danger"}):t("i",{className:"bi bi-check-circle-fill text-success"}):t(O,{animation:"border",variant:"primary",size:"sm"}),u&&t("span",{className:"text-muted",children:a?"已取消":s?"已使用":"正在使用"}),c,g&&t("i",h?{className:"bi bi-caret-up-fill text-muted"}:{className:"bi bi-caret-down-fill text-muted"})]}),h&&l]})}),d]})}const tr=n.div`
|
|
703
701
|
width: ${e=>e.$open?"auto":"fit-content"};
|
|
704
702
|
max-width: 100%;
|
|
705
703
|
overflow:hidden;
|
|
706
|
-
`,
|
|
704
|
+
`,rr=n.div`
|
|
707
705
|
white-space: pre-wrap;
|
|
708
706
|
overflow-y: auto;
|
|
709
707
|
overflow-x: hidden;
|
|
710
708
|
max-height: 150px;
|
|
711
|
-
`;function
|
|
709
|
+
`;function nr({node:r}){const[n,i]=q(!1),{nodeIconResolver:o}=Ne(),s=!("latency"in r),a=s?t(O,{animation:"border",variant:"primary",size:"sm"}):r.error?t("i",{className:"bi bi-x-circle-fill text-danger"}):t("i",{className:"bi bi-check-circle-fill text-success"});return e("div",{className:"shadow-sm rounded bg-white fs-7",children:[e(or,{onClick:()=>i(e=>!e),role:"button",className:"d-flex align-items-center p-1 px-2 gap-1",children:[t("i",{className:"bi bi-chevron-down text-muted"}),o?.(r.type),t(sr,{className:"me-2 text-truncate",children:r.title}),t("span",{className:"me-auto"}),!s&&t("span",{className:"text-nowrap text-muted",children:ir(r.latency)}),t("span",{children:a})]}),n&&e("div",{className:"border-top p-2 d-flex flex-column gap-2",children:[e("div",{className:"border rounded bg-light",children:[t("div",{className:"d-flex align-items-center p-1 px-2 fs-7 gap-2",children:t("span",{className:"text-muted",children:"输入"})}),t("div",{className:"border-top p-2 overflow-hidden text-pre-wrap",children:r.input?JSON.stringify(r.input,null,4):"None"})]}),e("div",{className:"border rounded bg-light",children:[t("div",{className:"d-flex align-items-center p-1 px-2 fs-7 gap-2",children:t("span",{className:"text-muted",children:"输出"})}),t("div",{className:"border-top p-2 overflow-hidden text-pre-wrap",children:r.output?JSON.stringify(r.output,null,4):"None"})]})]})]})}const ir=e=>e<1?`${(1e3*e).toFixed(3)} ms`:e>60?`${parseInt(Math.round(e/60).toString())} m ${(e%60).toFixed(3)} s`:`${e.toFixed(3)} s`,or=n.div`
|
|
712
710
|
svg {
|
|
713
711
|
flex-shrink: 0;
|
|
714
712
|
}
|
|
715
|
-
`,
|
|
713
|
+
`,sr=n.span`
|
|
716
714
|
display: inline-block;
|
|
717
|
-
`;function
|
|
715
|
+
`;function ar({nodes:r,loading:n}){const[i,o]=q(!1),s=r.some(e=>"error"in e),a=n?t(O,{animation:"border",variant:"primary",size:"sm"}):t("i",s?{className:"bi bi-x-circle-fill text-danger"}:{className:"bi bi-check-circle-fill text-success"});return t("div",{className:"mb-2",children:e("div",i?{className:"shadow-sm rounded bg-white fs-7",children:[e("div",{onClick:()=>o(!1),role:"button",className:"d-flex align-items-center p-1 px-2 gap-2",children:[a,t("span",{children:"工作流"}),t("i",{className:"bi bi-caret-up-fill text-muted"})]}),t("div",{className:"border-top p-2 d-flex flex-column gap-1 bg-light bg-opacity-50",children:r.map((e,r)=>t(nr,{node:e},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,t("span",{children:"工作流"}),t("i",{className:"bi bi-caret-down-fill text-muted"})]})})}const lr=L(F(({chunks:r,loading:n,cite:i,isLast:o=!1,deleted:s=!1},a)=>{const{logLevel:l="none"}=Ne(),c=A(()=>r.flatMap(e=>e.node?[e.node]:[]),[r]);return e(cr,{ref:a,$deleted:s,children:["all"===l&&c.length>0&&t(ar,{loading:n,nodes:c}),r.map((r,s)=>e(I,{children:[r.reasoning&&["stats","all"].includes(l)&&t(Zt,{reasoning:r.reasoning,loading:n&&!r.content&&0===(r.tools||[]).length}),r.content&&t(Rt,{value:{chunkIndex:s,chunk:r,isLastMessage:o},children:t(Yt,{cite:i,value:r.content})}),(r.tools||[]).map((e,i)=>t(Rt,{value:{chunkIndex:s,chunk:r,toolIndex:i,tool:e,isLastMessage:o},children:t(er,{tool:e,loading:n})},i)),r.error&&t(xt,{content:`[${r.error}]`})]},s))]})})),cr=n.div`
|
|
718
716
|
${e=>e.$deleted&&i`
|
|
719
717
|
text-decoration-line: line-through;
|
|
720
718
|
color: var(--bs-secondary);
|
|
721
719
|
`}
|
|
722
|
-
`;class
|
|
720
|
+
`;class dr{#t;#o=[];#s=0;constructor(){this.#t=new K}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 ur=new Map;class mr{#r;#t;#o=[];#a=new Map;#l=!1;#s=0;#c=!1;constructor(e){this.#r=e,this.#t=new K}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?(ur.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),ur.delete(this)}start(e,t=!1){ur.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=ur.get(this);e&&(e.pause(),e.currentTime=0)}onPlaying(e){this.#t.on("playing",e)}onSpeaking(e){this.#t.on("speaking",e)}}function hr({text:e,loading:t,loader:r}){const n=R(),[i,o]=q(!1),[s,a]=q(!1),l=R(t),c=async(i=!1)=>{n.current||(n.current=r?new mr(r):new dr,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 M(()=>{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]),M(()=>()=>{n.current&&(n.current.stop(),n.current=void 0)},[]),{playing:s,speaking:i,start:c,stop:()=>{n.current&&n.current.stop()}}}function pr({model:r="builtin",voice:n,loading:i,autoplay:o,contentRef:s,avatarRef:a}){const{request:l}=Ne(),c=A(()=>{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}=hr({loader:c,text:s,loading:o&&i});let p=null;return a.current&&(u&&(p=se(t(gr,{children:t(O,{size:"sm",variant:"light"})}),a.current)),d&&(p=se(t(gr,{children:t(fr,{className:"bi bi-volume-down-fill text-light"})}),a.current))),e(jt,{disabled:i&&!d,onClick:()=>{d?h():m()},children:[d?t(fr,{className:"bi bi-volume-down-fill"}):u?t(O,{size:"sm",variant:"primary"}):t(fr,{className:"bi bi-volume-down"}),p]})}const gr=n.div`
|
|
723
721
|
position: absolute;
|
|
724
722
|
top: 0;
|
|
725
723
|
left: 0;
|
|
@@ -729,12 +727,12 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
729
727
|
align-items: center;
|
|
730
728
|
justify-content: center;
|
|
731
729
|
background-color: rgba(0, 0, 0, .3);
|
|
732
|
-
`,
|
|
730
|
+
`,fr=n.i`
|
|
733
731
|
|
|
734
732
|
&::before {
|
|
735
733
|
transform: scale(1.4)
|
|
736
734
|
}
|
|
737
|
-
`,
|
|
735
|
+
`,br=L(({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}=Ne(),x=A(()=>m?m.reduce(function(e,t){const r=Array.isArray(t.content)?t.content.reduce((e,t)=>{const r=ht(t);return r?e+r+"\n":e},""):ht(t.content);return e+r+"\n"+(t.tools||[]).reduce((e,t)=>{if(t.content){const r=ht(t.content);if(r)return e+r+"\n"}return e},"")},""):"",[m]),k=R(null),N=R(null),j=R(null),C=c||u.length>0;return e(r,{children:[C&&e($r,{$reverse:!0,children:[g&&t(Nr,{children:t("img",{src:g.avatar})}),t(jr,{}),e(Cr,{ref:k,children:[c&&t(xt,{content:c}),d&&t(Q,{trigger:"click",container:k,rootClose:!0,placement:"bottom",overlay:t(vr,{body:!0,children:d}),children:t(xr,{children:t(yr,{children:d})})}),u.length>0&&u.map(({name:e,size:r,path:n},i)=>{if(E(n))return t(Mt,{src:`/uploads/${n}`},i);const o={name:e,url:`/uploads/${n}`,size:r};return t(wr,{children:y?y({Component:pe,props:o}):t(pe,{...o})},i)})]})]}),m&&e($r,{children:[f&&t(Nr,{ref:N,children:t("img",{src:f.avatar})}),t(jr,{}),e(Cr,{children:[C&&!1!==i&&e(kr,{children:[t(w,{placement:"top",content:x,as:jt,tooltip:!0}),a&&t(pr,{loading:n.loading,avatarRef:N,contentRef:j,...a}),i?.({Component:jt,message:n,content:x,setMessage:o,messages:v})]}),t(Er,{children:["stats","all"].includes(b)&&n.stats&&e(r,{children:[e("span",{children:["耗时 ",n.stats.latency/1e3," 秒"]}),e("span",{children:["花费 Token ",n.stats.usage]})]})}),t(lr,{ref:j,chunks:m,loading:p,isLast:l,cite:s,deleted:!!h}),h&&e("div",{children:[e("div",{className:"d-flex align-items-center",children:[t("span",{className:"fs-7 text-secondary me-2",children:"标注的答案"}),t("hr",{className:"flex-fill"})]}),t(xt,{content:h.answer})]}),n.loading&&t(mt,{})]})]})]})}),vr=n(J)`
|
|
738
736
|
max-width: calc(100% - .875rem * 2);
|
|
739
737
|
width: calc(100% - .875rem * 2);
|
|
740
738
|
font-size: 1rem;
|
|
@@ -743,20 +741,20 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
743
741
|
.popover-body {
|
|
744
742
|
padding: .5rem .75rem;
|
|
745
743
|
}
|
|
746
|
-
`,
|
|
744
|
+
`,yr=n.div`
|
|
747
745
|
overflow: hidden;
|
|
748
746
|
text-overflow: ellipsis;
|
|
749
747
|
word-break: break-all;
|
|
750
748
|
-webkit-line-clamp: 2;
|
|
751
749
|
-webkit-box-orient: vertical;
|
|
752
750
|
display: -webkit-box;
|
|
753
|
-
`,
|
|
751
|
+
`,xr=n.div`
|
|
754
752
|
padding: .5rem .75rem;
|
|
755
753
|
color: var(--bs-secondary);
|
|
756
754
|
border-radius: var(--bs-border-radius-lg);
|
|
757
755
|
background: #FFFFFF;
|
|
758
756
|
cursor: pointer;
|
|
759
|
-
`,
|
|
757
|
+
`,wr=n.div`
|
|
760
758
|
width: 100%;
|
|
761
759
|
margin-bottom: .5rem;
|
|
762
760
|
margin-top: .5rem;
|
|
@@ -768,7 +766,7 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
768
766
|
&:last-child {
|
|
769
767
|
margin-bottom: 0;
|
|
770
768
|
}
|
|
771
|
-
`,
|
|
769
|
+
`,kr=n.div`
|
|
772
770
|
position: absolute;
|
|
773
771
|
top: -1.1rem;
|
|
774
772
|
right: 0;
|
|
@@ -776,7 +774,7 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
776
774
|
gap: .5rem;
|
|
777
775
|
opacity: 0;
|
|
778
776
|
z-index: 1;
|
|
779
|
-
`,
|
|
777
|
+
`,Er=n.div`
|
|
780
778
|
position: absolute;
|
|
781
779
|
bottom: -1.4rem;
|
|
782
780
|
left: 0;
|
|
@@ -789,7 +787,7 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
789
787
|
display: flex;
|
|
790
788
|
opacity: 0;
|
|
791
789
|
z-index: 1;
|
|
792
|
-
`,
|
|
790
|
+
`,Nr=n.div`
|
|
793
791
|
width: 35px;
|
|
794
792
|
height: 35px;
|
|
795
793
|
border-radius: 50%;
|
|
@@ -800,14 +798,14 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
800
798
|
width: 100%;
|
|
801
799
|
height: 100%;
|
|
802
800
|
}
|
|
803
|
-
`,
|
|
801
|
+
`,jr=n.div`
|
|
804
802
|
width: 0;
|
|
805
803
|
height: 0;
|
|
806
804
|
content: "";
|
|
807
805
|
border: 5px solid transparent;
|
|
808
806
|
border-right-color: #f3f3f3;
|
|
809
807
|
transform: translateY(10px);
|
|
810
|
-
`,
|
|
808
|
+
`,Cr=n.div`
|
|
811
809
|
padding: .875rem;
|
|
812
810
|
background-color: rgb(243, 243, 243);
|
|
813
811
|
border-radius: var(--bs-border-radius-lg);
|
|
@@ -815,31 +813,31 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
815
813
|
position: relative;
|
|
816
814
|
|
|
817
815
|
&:hover {
|
|
818
|
-
${
|
|
816
|
+
${Er}, ${kr} {
|
|
819
817
|
opacity: 1;
|
|
820
818
|
}
|
|
821
819
|
}
|
|
822
|
-
|
|
820
|
+
`,$r=n.div`
|
|
823
821
|
display: flex;
|
|
824
822
|
justify-content: flex-start;
|
|
825
823
|
padding: 1rem 0 1rem 0;
|
|
826
824
|
${e=>e.$reverse&&i`
|
|
827
825
|
flex-direction: row-reverse;
|
|
828
826
|
|
|
829
|
-
${
|
|
827
|
+
${jr} {
|
|
830
828
|
border-left-color: rgba(var(--bs-primary-rgb), 0.1);
|
|
831
829
|
border-right-color: transparent;
|
|
832
830
|
}
|
|
833
831
|
|
|
834
|
-
${
|
|
832
|
+
${Cr} {
|
|
835
833
|
background: rgba(var(--bs-primary-rgb), 0.1);
|
|
836
834
|
}
|
|
837
835
|
`};
|
|
838
|
-
`;function
|
|
836
|
+
`;function Rr(r){const{placeholder:n,actions:i,cite:o,speech:s,renderItem:a,scrollRef:l}=r,{messages:c,setMessages:d,loading:u,suggestions:m,conversationId:h}=Ne(),p=R(r.loaded),g=S(()=>{const e=l.current;e&&requestAnimationFrame(()=>{e.scrollTo({top:e.scrollHeight})})},[]),f=R(null),{height:b}=ae({ref:f});M(()=>{(u||!p.current)&&c.length>0&&(u&&(p.current=!0),g())},[b,u,p,c]),M(()=>{m.length>0&&g()},[m]),M(()=>{p.current=r.loaded},[h]),M(()=>{const e=f.current;if(e){const t=()=>{p.current=!0};return e.addEventListener("click",t),()=>{e.removeEventListener("click",t)}}},[f]);const v=c.slice(-30);return e(Sr,{ref:f,children:[0===v.length&&n,v.map((e,r)=>{const n={actions:i,cite:o,speech:s,message:e,setMessage:t=>{d(r=>{const n=r.findIndex(t=>t.id===e.id);-1!==n&&t(r[n])})},isLast:r===v.length-1};return a?t(I,{children:a({Component:br,props:n})},r):t(br,{...n},r)}),m.length>0&&t(Mr,{children:m.map((e,r)=>t("a",{href:"#!question",children:e},r))})]})}const Sr=n.div`
|
|
839
837
|
display: flex;
|
|
840
838
|
flex-direction: column;
|
|
841
839
|
flex: 1;
|
|
842
|
-
|
|
840
|
+
`,Mr=n.div`
|
|
843
841
|
display: flex;
|
|
844
842
|
flex-direction: column;
|
|
845
843
|
align-items: flex-start;
|
|
@@ -856,16 +854,18 @@ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
856
854
|
background: var(--bs-secondary-bg-subtle);
|
|
857
855
|
}
|
|
858
856
|
}
|
|
859
|
-
`,
|
|
857
|
+
`,qr=L(F(({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=st},C)=>{const $=S(e=>{const t=[];if(u&&!1!==u.enable){const e=at(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]),[M,F]=q(m?.id),[I,L]=q(),[D,P]=v(()=>$(m)),[T,O]=q(!1),B=R(null),[U,_]=q([]),H=S(e=>{F(e?.id),P($(e)),_([]),O(!1),E?.(e)},[T,$,E]);return z(C,()=>({reset:H}),[H]),t(Ce,{request:A(()=>k?"string"==typeof k?N.create({baseURL:k}):k:N,[k]),bot:n,user:i,logLevel:s,imageResolver:a,nodeIconResolver:l,conversationId:M,setConversationId:F,input:I,setInput:L,messages:D,setMessages:P,suggestions:U,setSuggestions:_,loading:T,setLoading:O,renderFileItem:f,reset:H,readonly:!o,renderToolContent:b,renderReasoning:y,children:t(zr,{className:r,children:e(x,{children:[t(Ar,{ref:B,children:t(Rr,{placeholder:c,cite:h,actions:d,loaded:!o,speech:p,renderItem:g,scrollRef:B})}),o&&t(Fr,{...o,scrollRef:B})]})})})}),X),Fr=n(Ye)`
|
|
858
|
+
margin: 0 1rem 1rem;
|
|
859
|
+
`,Ar=n.div`
|
|
860
860
|
display: flex;
|
|
861
861
|
flex-direction: column;
|
|
862
862
|
flex: 1;
|
|
863
863
|
overflow-y: auto;
|
|
864
864
|
padding: 0 1rem;
|
|
865
865
|
margin-bottom: .5rem;
|
|
866
|
-
`,
|
|
866
|
+
`,zr=n.div`
|
|
867
867
|
display: flex;
|
|
868
868
|
flex-direction: column;
|
|
869
869
|
height: 100%;
|
|
870
870
|
position: relative;
|
|
871
|
-
|
|
871
|
+
`,Ir=L(F(({className:e,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);return t(je,{request:A(()=>r?"string"==typeof r?N.create({baseURL:r}):r:N,[r]),loading:y,setLoading:x,children:t(Ye,{ref:v,className:e,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})})}),X);async function Lr(e){const t=await le().use(de).use(ee).use(te).use(re).use(ue).use(ce).process(e);return String(t)}export{Ae as ActionButton,Ir as ChatInput,lr as Chunks,Xe as EditableInput,pe as FileItem,Re as InputButton,xt as Markdown,qr as MessageBox,$e as VariableForm,me as isToolMessage,Lr as md2html,at as pickQuestions,Ne as useMessageContext,hr 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.2",
|
|
4
4
|
"module": "es/index.js",
|
|
5
5
|
"types": "types/index.d.ts",
|
|
6
6
|
"files": [
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@babel/runtime": "^7.11.2",
|
|
13
13
|
"@breezystack/lamejs": "^1.2.7",
|
|
14
|
-
"@topthink/components": "1.2.
|
|
14
|
+
"@topthink/components": "1.2.6",
|
|
15
15
|
"@types/hast": "^3.0.4",
|
|
16
16
|
"@types/mdast": "^4.0.4",
|
|
17
17
|
"eventemitter3": "^5.0.1",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
},
|
|
64
64
|
"author": "yunwuxin <tzzhangyajun@qq.com> (https://github.com/yunwuxin)",
|
|
65
65
|
"license": "MIT",
|
|
66
|
-
"gitHead": "
|
|
66
|
+
"gitHead": "593741063bc7655410516b4a207c322bad79948f",
|
|
67
67
|
"scripts": {
|
|
68
68
|
"prebuild": "rimraf es types",
|
|
69
69
|
"build": "rollup -c --environment NODE_ENV:production",
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { RequestInstance } from '@topthink/components';
|
|
3
|
+
import { Conversation, Input, Variable } from '../../types';
|
|
4
|
+
import type { RenderEditableInput } from '../message-box/input-box';
|
|
5
|
+
import type { ToolbarActions } from '../message-box/input-box/toolbar';
|
|
6
|
+
export interface ChatInputProps {
|
|
7
|
+
className?: string;
|
|
8
|
+
request?: RequestInstance | string;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
supportStop?: boolean;
|
|
11
|
+
fileTypes?: string[];
|
|
12
|
+
speech?: {
|
|
13
|
+
model?: string;
|
|
14
|
+
};
|
|
15
|
+
minRows?: number;
|
|
16
|
+
maxRows?: number;
|
|
17
|
+
toolbar?: ReactNode;
|
|
18
|
+
toolbarActions?: ToolbarActions;
|
|
19
|
+
tools?: ReactNode;
|
|
20
|
+
autoFocus?: boolean;
|
|
21
|
+
renderEditableInput?: RenderEditableInput;
|
|
22
|
+
placeholder?: string;
|
|
23
|
+
variables?: {
|
|
24
|
+
config: Variable[];
|
|
25
|
+
values?: Record<string, string>;
|
|
26
|
+
};
|
|
27
|
+
onEvent?: (event: {
|
|
28
|
+
type: string;
|
|
29
|
+
data?: any;
|
|
30
|
+
}) => void;
|
|
31
|
+
onNewConversation?: (conversation: Conversation) => boolean;
|
|
32
|
+
}
|
|
33
|
+
declare const ChatInput: import("react").MemoExoticComponent<import("react").ForwardRefExoticComponent<ChatInputProps & import("react").RefAttributes<Input>>>;
|
|
34
|
+
export default ChatInput;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Dispatch, FC, 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';
|
|
@@ -22,7 +22,12 @@ export interface ToolRenderResult {
|
|
|
22
22
|
/** 是否默认展开详情 */
|
|
23
23
|
defaultExpanded?: boolean;
|
|
24
24
|
}
|
|
25
|
-
interface
|
|
25
|
+
interface ChatContextType {
|
|
26
|
+
request: RequestInstance;
|
|
27
|
+
loading: boolean;
|
|
28
|
+
setLoading: Dispatch<SetStateAction<boolean>>;
|
|
29
|
+
}
|
|
30
|
+
interface DisplayContextType {
|
|
26
31
|
bot?: {
|
|
27
32
|
name: string;
|
|
28
33
|
avatar: string;
|
|
@@ -31,33 +36,36 @@ interface ContextType {
|
|
|
31
36
|
name: string;
|
|
32
37
|
avatar: string;
|
|
33
38
|
};
|
|
34
|
-
request: RequestInstance;
|
|
35
|
-
imageResolver?: (url: string) => string;
|
|
36
39
|
logLevel?: LogLevel;
|
|
40
|
+
imageResolver?: (url: string) => string;
|
|
37
41
|
nodeIconResolver?: (type: string) => ReactNode;
|
|
38
|
-
|
|
39
|
-
|
|
42
|
+
reset: (conversation?: Conversation) => void;
|
|
43
|
+
readonly: boolean;
|
|
40
44
|
input?: Input;
|
|
41
45
|
setInput: Dispatch<SetStateAction<Input | undefined>>;
|
|
46
|
+
conversationId?: string;
|
|
47
|
+
setConversationId: Dispatch<SetStateAction<string | undefined>>;
|
|
42
48
|
messages: Message[];
|
|
43
49
|
setMessages: Updater<Message[]>;
|
|
44
50
|
suggestions: string[];
|
|
45
51
|
setSuggestions: Dispatch<SetStateAction<string[]>>;
|
|
46
|
-
loading: boolean;
|
|
47
|
-
setLoading: Dispatch<SetStateAction<boolean>>;
|
|
48
|
-
reset: (conversation?: Conversation) => void;
|
|
49
|
-
readonly: boolean;
|
|
50
52
|
renderFileItem?: (props: {
|
|
51
|
-
Component:
|
|
53
|
+
Component: FC<FileItemProps>;
|
|
52
54
|
props: FileItemProps;
|
|
53
55
|
}) => ReactElement;
|
|
54
56
|
renderReasoning?: (props: {
|
|
55
|
-
Component:
|
|
57
|
+
Component: FC<ReasoningProps>;
|
|
56
58
|
props: ReasoningProps;
|
|
57
59
|
}) => ReactElement;
|
|
58
60
|
/** 自定义工具渲染函数 */
|
|
59
61
|
renderToolContent?: (options: ToolRenderOptions) => ToolRenderResult | undefined;
|
|
60
62
|
}
|
|
63
|
+
interface ContextType extends ChatContextType, DisplayContextType {
|
|
64
|
+
}
|
|
65
|
+
export declare function useChatContext(): ChatContextType;
|
|
66
|
+
export declare function useDisplayContext(): DisplayContextType;
|
|
67
|
+
export declare function useOptionalDisplayContext(): DisplayContextType | null;
|
|
61
68
|
export declare function useContext(): ContextType;
|
|
69
|
+
export declare function ChatProvider({ children, ...props }: PropsWithChildren<ChatContextType>): import("react/jsx-runtime").JSX.Element;
|
|
62
70
|
export declare function Provider({ children, ...props }: PropsWithChildren<ContextType>): import("react/jsx-runtime").JSX.Element;
|
|
63
71
|
export {};
|
|
@@ -3,6 +3,7 @@ import { ComponentType, MutableRefObject, ReactElement, ReactNode } from 'react'
|
|
|
3
3
|
import { Conversation, ConversationMessage, Input, LogLevel, Message, MessageBoxType, Variable } from '../../types';
|
|
4
4
|
import { MessageActions, MessageItemProps } from './message-item';
|
|
5
5
|
import type { RenderEditableInput } from './input-box';
|
|
6
|
+
import type { ToolbarActions } from './input-box/toolbar';
|
|
6
7
|
import { ToolRenderOptions, ToolRenderResult } from './context';
|
|
7
8
|
import { Components } from 'react-markdown';
|
|
8
9
|
import { FileItemProps } from './file-item';
|
|
@@ -43,7 +44,8 @@ export interface MessageBoxProps {
|
|
|
43
44
|
};
|
|
44
45
|
minRows?: number;
|
|
45
46
|
toolbar?: ReactNode;
|
|
46
|
-
toolbarActions?:
|
|
47
|
+
toolbarActions?: ToolbarActions;
|
|
48
|
+
tools?: ReactNode;
|
|
47
49
|
autoFocus?: boolean;
|
|
48
50
|
renderEditableInput?: RenderEditableInput;
|
|
49
51
|
placeholder?: string;
|
|
@@ -8,6 +8,7 @@ export type RenderEditableInput = (options: {
|
|
|
8
8
|
props: EditableInputProps & RefAttributes<EditableInputRef>;
|
|
9
9
|
}) => ReactNode;
|
|
10
10
|
export interface Props {
|
|
11
|
+
className?: string;
|
|
11
12
|
supportStop?: boolean;
|
|
12
13
|
variables?: {
|
|
13
14
|
config: Variable[];
|
|
@@ -19,12 +20,13 @@ export interface Props {
|
|
|
19
20
|
};
|
|
20
21
|
minRows?: number;
|
|
21
22
|
maxRows?: number;
|
|
22
|
-
scrollRef
|
|
23
|
+
scrollRef?: MutableRefObject<HTMLDivElement | null>;
|
|
23
24
|
toolbar?: ReactNode | true;
|
|
24
25
|
toolbarActions?: ToolbarActions;
|
|
25
26
|
disabled?: boolean;
|
|
26
27
|
placeholder?: string;
|
|
27
28
|
autoFocus?: boolean;
|
|
29
|
+
tools?: ReactNode;
|
|
28
30
|
renderEditableInput?: RenderEditableInput;
|
|
29
31
|
onEvent?: (event: {
|
|
30
32
|
type: string;
|
package/types/index.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
export * from './types';
|
|
2
2
|
export { default as MessageBox, MessageBoxProps } from './components/message-box';
|
|
3
|
+
export { default as ChatInput, ChatInputProps } from './components/chat-input';
|
|
3
4
|
export { default as Chunks, ChunksProps } from './components/message-box/chunks';
|
|
4
5
|
export { useContext as useMessageContext, ToolRenderOptions, ToolRenderResult } from './components/message-box/context';
|
|
5
6
|
export { default as EditableInput } from './components/message-box/input-box/editable-input';
|
|
6
7
|
export type { EditableInputProps, EditableInputRef } from './components/message-box/input-box/editable-input';
|
|
7
8
|
export type { EditableInputComponent, RenderEditableInput } from './components/message-box/input-box';
|
|
9
|
+
export { default as InputButton } from './components/message-box/input-box/input-button';
|
|
8
10
|
export { default as ActionButton } from './components/action-button';
|
|
9
11
|
export { default as Markdown } from './components/markdown';
|
|
10
12
|
export { default as VariableForm } from './components/variable-form';
|