@topthink/chat 1.2.4 → 1.2.6
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 +92 -113
- package/package.json +4 -5
- package/types/components/message-box/index.d.ts +4 -0
- package/types/components/message-box/input-box/editable-input.d.ts +17 -0
- package/types/components/message-box/input-box/index.d.ts +12 -4
- package/types/components/message-box/input-box/input-button.d.ts +4 -1
- package/types/components/message-box/input-box/toolbar/index.d.ts +2 -1
- package/types/components/message-box/input-box/use-chat.d.ts +6 -1
- package/types/components/message-box/suspend/context.d.ts +1 -0
- package/types/index.d.ts +3 -1
- package/types/types.d.ts +2 -2
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,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,
|
|
1
|
+
import{jsx as e,jsxs 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 $,useEffect as M,useState as S,useRef as q,useCallback as F,forwardRef as R,useMemo as z,useImperativeHandle as I,Fragment as A,memo as D}from"react";import*as L from"path";import P from"path";import{Spinner as T,Badge as O,Dropdown as B,FormControl as U,CloseButton as _,OverlayTrigger as H,Popover as Q}from"react-bootstrap";import J from"eventemitter3";import K from"react-textarea-autosize";import W from"lodash/isEqual";import{toString as X}from"hast-util-to-string";import V from"react-markdown";import"katex/dist/katex.min.css";import Y from"rehype-highlight";import G from"rehype-katex";import Z from"remark-breaks";import ee from"remark-gfm";import te from"remark-math";import{codes as re,types as ne}from"micromark-util-symbol";import{markdownLineEnding as ie}from"micromark-util-character";import{createPortal as oe}from"react-dom";import se from"use-resize-observer";import{unified as ae}from"unified";import le from"rehype-stringify";import ce from"remark-parse";import de from"remark-rehype";function ue(e,t){return e.name===t}const me=C(null);function he(e){const t=$(me);if(!t)throw new Error("useContext must be used within a Provider");const{setHandles:r}=t;return M(()=>{if(e)return r(e),()=>{r({})}},[e]),t}function pe({children:t,...r}){const[n,i]=S({});return e(me.Provider,{value:{...r,handles:n,setHandles:i},children:t})}const ge=function({ext:t}){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}},[t]);return r?e("img",{width:30,height:30,src:r}):null},fe=function({className:r,name:n,size:i=0,loading:a,error:l,onRemove:c,onClick:d}){const u=P.extname(n).substring(1),m=t(we,{className:r,$error:!!l,onClick:d,children:[t(xe,{children:[e(ge,{ext:u}),a&&e(T,{variant:"primary"})]}),t(ye,{children:[e("h4",{children:n}),i>0&&e("p",{children:o(i,1)})]}),c&&e(ve,{onClick:e=>{e.preventDefault(),c()},children:e("i",{className:"bi bi-trash3"})})]});return l?e(s,{placement:"top",tooltip:l,children:m}):m};function be(t){const{renderFileItem:r}=he();return r?r({Component:fe,props:t}):e(fe,{...t})}const ve=n.div`
|
|
2
2
|
width: 1.75rem;
|
|
3
3
|
height: 1.75rem;
|
|
4
4
|
align-items: center;
|
|
@@ -13,7 +13,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
13
13
|
color: var(--bs-danger);
|
|
14
14
|
background-color: var(--bs-danger-bg-subtle);
|
|
15
15
|
}
|
|
16
|
-
`,
|
|
16
|
+
`,ye=n.div`
|
|
17
17
|
flex: 1;
|
|
18
18
|
overflow: hidden;
|
|
19
19
|
|
|
@@ -34,7 +34,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
34
34
|
line-height: 20px;
|
|
35
35
|
margin-bottom: 0;
|
|
36
36
|
}
|
|
37
|
-
`,
|
|
37
|
+
`,xe=n.div`
|
|
38
38
|
position: relative;
|
|
39
39
|
width: 3rem;
|
|
40
40
|
height: 3rem;
|
|
@@ -48,7 +48,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
48
48
|
position: absolute;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
`,
|
|
51
|
+
`,we=n.div`
|
|
52
52
|
display: flex;
|
|
53
53
|
gap: .5rem;
|
|
54
54
|
padding: .5rem;
|
|
@@ -65,15 +65,15 @@ import{jsx as e,jsxs 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
|
-
`,
|
|
68
|
+
`,ke=[".txt",".md",".pdf",".docx",".xlsx",".pptx",".png",".jpg"];function Ee(e){const{setMessages:t,setSuggestions:r,setLoading:n,conversationId:i,setConversationId:o,request:s,handles:a,messages:d}=he(),u=!0===e?.supportStop,m=q(null),h=q(),p=q(i),g=()=>(m.current&&m.current.abort(),m.current=new AbortController,m.current.signal),{onComplete:f,onEvent:b}=a,v=F(e=>{if(e.data)if("[DONE]"!=e.data)try{const r=JSON.parse(e.data);r.conversation?(p.current=r.conversation,o(r.conversation)):r.event?b?.(r.event):t(e=>{const t=e[e.length-1];if(r.chunks){if(t.chunks){const e=r.chunks.index;if(t.chunks[e]||(t.chunks[e]={content:"",reasoning:"",tools:[]}),r.chunks.error)t.chunks[e].error=r.chunks.error;else if(r.chunks.tools){t.chunks[e].tools||(t.chunks[e].tools=[]);const n=r.chunks.tools.index;delete r.chunks.tools.index,t.chunks[e].tools[n]&&"arguments"in r.chunks.tools?t.chunks[e].tools[n].arguments+=r.chunks.tools.arguments:t.chunks[e].tools[n]={...t.chunks[e].tools[n],...r.chunks.tools}}else if(r.chunks.reasoning)t.chunks[e].reasoning+=r.chunks.reasoning;else if(r.chunks.content)if("object"==typeof r.chunks.content){Array.isArray(t.chunks[e].content)||(t.chunks[e].content=[]);const n=r.chunks.content.index,i=r.chunks.content.value;"string"==typeof i?(t.chunks[e].content[n]||(t.chunks[e].content[n]=""),t.chunks[e].content[n]+=i):t.chunks[e].content[n]=i}else t.chunks[e].content+=r.chunks.content;else r.chunks.node&&(t.chunks[e].node={...t.chunks[e].node,...r.chunks.node})}}else r.stats?t.stats=r.stats:r.id&&(t.id=r.id)})}catch(e){console.error(e)}else t(e=>{e[e.length-1].loading=!1})},[a]),y=F(e=>{if(l(e))t(e=>{const t=e[e.length-1];t&&(t.loading=!1)});else{let r="未知错误";c(e)&&(r=401==e.response?.status?"未授权或授权已过期,请刷新页面后重试":"string"==typeof e.errors?e.errors:Object.values(e.errors).join("\n")),t(e=>{const t=e[e.length-1];t.chunks&&(0===t.chunks.length?t.chunks=[{error:r}]:t.chunks[t.chunks.length-1].error=r),t.loading=!1})}},[]),x=F(async e=>{h.current=e;try{const r=g();n(!0),t(e=>{e[e.length-1].loading=!0,delete e[e.length-1].stats});let i={url:"message",method:"get",params:{id:e},onMessage:v,signal:r};await s(i)}catch(e){y(e)}finally{m.current=null,h.current=void 0}n(!1),f?.()},[s,a]),w=F(async(e,...i)=>{"string"==typeof e&&(e={query:e,...i});const{query:o,files:a=[],variables:l={},quote:c}=e;let d=null;if(o||a.length>0){const e=g();n(!0),r([]),t(e=>{e.push({query:o,quote:c,files:a,variables:l,chunks:[],loading:!0})});try{let t={method:"post",data:{query:o,quote:c,files:a,variables:l,conversation:p.current},onMessage:v,signal:e};d=(await s(t)).message??null}catch(e){y(e)}finally{m.current=null}d?await x(d.id):(n(!1),f?.())}},[s,a]),k=F(async e=>{let r=null;try{const i=g();n(!0),t(e=>{e[e.length-1].loading=!0});let o={url:"resume",method:"post",data:{conversation:p.current,chunk:e.chunk,tool:e.tool,payload:e.payload},onMessage:v,signal:i};r=(await s(o)).message??null}catch(e){y(e)}finally{m.current=null}r?await x(r.id):(n(!1),f?.())},[s,a]),E=F(async()=>{try{const e=g();let t={method:"post",url:"/suggestion",data:{conversation:p.current},signal:e};const n=await s(t);r(n)}catch{}finally{m.current=null}},[s]),N=F(async()=>{if(u)if(h.current)try{await s({url:"stop",method:"post",data:{id:h.current}})}catch{}else m.current?.abort()},[s,u]),j=()=>{const e=d[d.length-1];e&&e.id&&2===e.status&&x(e.id)};return M(()=>(j(),()=>{m.current&&m.current.abort()}),[]),M(()=>{i!=p.current&&(p.current=i,m.current&&m.current.abort(),j())},[i]),{send:w,resume:k,suggest:E,stop:N}}function Ne({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 je=n.button`
|
|
69
69
|
color: var(--bs-secondary);
|
|
70
70
|
cursor: pointer;
|
|
71
71
|
display: flex;
|
|
72
72
|
align-items: center;
|
|
73
73
|
justify-content: center;
|
|
74
|
-
width: 1.
|
|
75
|
-
height: 1.
|
|
76
|
-
border-radius: .
|
|
74
|
+
width: 1.75rem;
|
|
75
|
+
height: 1.75rem;
|
|
76
|
+
border-radius: .25rem;
|
|
77
77
|
outline: none;
|
|
78
78
|
border: none;
|
|
79
79
|
background: transparent;
|
|
@@ -84,16 +84,24 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
84
84
|
color: var(--bs-gray-400) !important;
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
&:hover
|
|
87
|
+
&:hover:not(:disabled) {
|
|
88
88
|
background-color: var(--bs-gray-200);
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
|
|
91
|
+
${({$fill:e})=>e&&i`
|
|
92
|
+
background-color: var(--bs-gray-200);
|
|
93
|
+
|
|
94
|
+
&:hover:not(:disabled) {
|
|
95
|
+
background-color: var(--bs-gray-300);
|
|
96
|
+
}
|
|
97
|
+
`};
|
|
98
|
+
|
|
99
|
+
`;let Ce=class{#e;#t;constructor(){this.#t=new J}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)}},$e=class{#t;#r;#n;#i;constructor(e){this.#r=e,this.#t=new J}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 Me=R(({onResult:r,model:n="builtin"},i)=>{const{request:o}=he(),a=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=q(),[n,i]=S(!1),[o,s]=S(!1);return M(()=>()=>{r.current&&(r.current.stop(),r.current=void 0)},[]),{recording:n,transcribing:o,start:async()=>{r.current||(r.current=t?new $e(t):new Ce,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 I(i,()=>({start:l,stop:c}),[l,c]),e(s,{tooltip:d?"停止":"语音输入",placement:"top",children:t(je,{onMouseDown:e=>{e.preventDefault(),d?c():l()},children:[u&&e(Se,{animation:"border",variant:"primary",size:"sm"}),e("i",d?{className:"bi bi-mic-fill text-danger"}:{className:"bi bi-mic"})]})})}),Se=n(T)`
|
|
92
100
|
position: absolute;
|
|
93
101
|
--bs-spinner-width: .75rem;
|
|
94
102
|
--bs-spinner-height: .75rem;
|
|
95
103
|
--bs-spinner-border-width: 0.1em;
|
|
96
|
-
`,
|
|
104
|
+
`,qe=R(({className:t,children:r,size:n,tooltip:i,placement:o,onClick:a,onMouseDown:l},c)=>{const d=e(Fe,{ref:c,className:t,onClick:a,onMouseDown:l,$size:n,children:r});return i?e(s,{tooltip:i,placement:o,children:d}):d}),Fe=n.div`
|
|
97
105
|
width: 2rem;
|
|
98
106
|
height: 2rem;
|
|
99
107
|
align-items: center;
|
|
@@ -117,10 +125,10 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
117
125
|
&:hover {
|
|
118
126
|
background-color: var(--bs-secondary-bg-subtle);
|
|
119
127
|
}
|
|
120
|
-
`;function
|
|
128
|
+
`;function Re(){const{request:n,reset:i,conversationId:o}=he(),[s,a]=S(!1),[l,c]=S(""),[d,u]=S(""),m=h(e=>{u(e)},500);return M(()=>{m(l)},[l]),t(r,{children:[e(qe,{tooltip:"历史记录",placement:"top",onClick:()=>a(!0),children:e("i",{className:"bi bi-clock-history"})}),e(p,{show:s,onHide:()=>{a(!1)},placement:"end",headerAs:Le,header:t(r,{children:[e("span",{children:"聊天历史记录"}),e(Pe,{children:e(U,{type:"search",placeholder:"搜索聊天记录...",value:l,onChange:e=>c(e.target.value),autoFocus:!0})})]}),bodyAs:ze,children:s&&e(De,{children:e(Ae,{useWindow:!1,source:e=>n({url:"/conversation",params:{...e,...d&&{keyword:d}}}),render:({data:s,loading:l,setData:c})=>s.length||l?t(r,{children:[s.map((s,l)=>t(A,{children:[l>0&&e("hr",{className:"mx-2 my-2"}),t(Ie,{children:[o===s.id&&e(O,{bg:"secondary",children:"当前"}),e("span",{className:"overflow-hidden text-truncate flex-fill",onClick:()=>{i(s),a(!1)},children:s.title||"未命名对话"}),t(B,{align:"end",children:[e(B.Toggle,{size:"sm",className:"no-caret",as:qe,children:e("i",{className:"bi bi-three-dots-vertical"})}),t(B.Menu,{children:[e(g,{buttonProps:{as:B.Item},text:t(r,{children:[e("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)})}}),t(f,{as:B.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)})},children:[e("i",{className:"bi bi-trash3 me-2"}),"删除"]})]})]})]})]},s.id)),l&&e(b,{wrap:!0})]}):e("div",{className:"text-muted text-center py-5",children:d?"未找到匹配的聊天记录":"暂无对话记录"})},d)})})]})}const ze=n.div`
|
|
121
129
|
padding: 0;
|
|
122
130
|
overflow: hidden;
|
|
123
|
-
`,
|
|
131
|
+
`,Ie=n.div`
|
|
124
132
|
gap: .5rem;
|
|
125
133
|
display: flex;
|
|
126
134
|
cursor: pointer;
|
|
@@ -139,40 +147,50 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
139
147
|
display: block;
|
|
140
148
|
}
|
|
141
149
|
}
|
|
142
|
-
`,
|
|
150
|
+
`,Ae=n(m)`
|
|
143
151
|
display: flex;
|
|
144
152
|
flex-direction: column;
|
|
145
153
|
padding: .5rem;
|
|
146
|
-
`,
|
|
154
|
+
`,De=n.div`
|
|
147
155
|
height: 100%;
|
|
148
156
|
overflow-y: auto;
|
|
149
|
-
`,
|
|
157
|
+
`,Le=n.div`
|
|
150
158
|
display: flex;
|
|
151
159
|
align-items: center;
|
|
152
160
|
justify-content: space-between;
|
|
153
161
|
gap: 0.5rem;
|
|
154
162
|
flex: 1;
|
|
155
163
|
margin-right: .5rem;
|
|
156
|
-
`,
|
|
164
|
+
`,Pe=n.div`
|
|
157
165
|
display: flex;
|
|
158
166
|
align-items: center;
|
|
159
167
|
gap: 0.5rem;
|
|
160
|
-
`;var
|
|
168
|
+
`;var Te;function Oe(){return Oe=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},Oe.apply(null,arguments)}const Be=e=>j.createElement("svg",Oe({width:"1em",height:"1em",fill:"currentColor",viewBox:"0 0 256 256"},e),Te||(Te=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 Ue(){const{reset:t}=he();return e(qe,{className:"text-primary",tooltip:"新会话",placement:"top",onClick:t,children:e(Be,{})})}function _e({children:r,actions:n}){return t(Qe,{children:[r,t(He,{children:[n,e(Re,{}),e(Ue,{})]})]})}const He=n.div`
|
|
161
169
|
display: flex;
|
|
162
170
|
gap: .25rem;
|
|
163
171
|
margin-left: auto;
|
|
164
|
-
`,
|
|
172
|
+
`,Qe=n.div`
|
|
165
173
|
margin-bottom: .5rem;
|
|
166
174
|
display: flex;
|
|
167
175
|
padding: 0 .125rem;
|
|
168
|
-
|
|
176
|
+
`;var Je=R(function({readonly:t,autoFocus:r,placeholder:n,minRows:i,maxRows:o,onSubmit:s,onFocusedChange:a,onQueryChange:l,onPaste:c},d){const u=q(null),[m,h]=S(""),p=F(()=>{const e=u.current;if(!e)return;e.focus();const t=e.value.length;e.setSelectionRange(t,t)},[]),g=F(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(Ke,{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 Ke=n(K)`
|
|
177
|
+
min-height: calc(1.5em + 1rem);
|
|
178
|
+
width: 100%;
|
|
179
|
+
padding: 0.5rem 0.5rem 0.5rem 0.75rem;
|
|
180
|
+
border: 0;
|
|
181
|
+
outline: none;
|
|
182
|
+
resize: none;
|
|
183
|
+
flex: 1;
|
|
184
|
+
line-height: 1.5;
|
|
185
|
+
background: transparent;
|
|
186
|
+
`;var We=R(function({suggestion:r,fileTypes:n,speech:i,scrollRef:o,variables:a,minRows:l=1,maxRows:d=5,toolbar:m,toolbarActions:h,disabled:p,autoFocus:g,renderEditableInput:f,placeholder:b="请输入你的问题, Enter+Shift换行, Enter发送",supportStop:y=!1,onEvent:x},w){const k=q(null),E=q(null),N=q(null),[j,C]=S(""),[$,R]=S(""),[A,D]=v([]),[P,T]=S(!1),O=n&&n.length>0?n:ke,{send:B,resume:U,stop:H,suggest:Q}=Ee({supportStop:y}),J=z(()=>({onSuccess(){r&&Q()},onComplete(){requestAnimationFrame(()=>{N.current?.focus()})},onEvent:x}),[r,x]),{messages:K,loading:W,request:X,setInput:V}=he(J),[Y,G]=S();M(()=>{const e=K.filter(e=>!!e.query);G(e.at(-1)?.variables)},[K]),M(()=>{!n&&A.length>0&&D([])},[n]),M(()=>{const e=o.current;if(e&&B){const t=e=>{if(e.target instanceof HTMLAnchorElement&&"#!question"===e.target.hash){e.preventDefault();const t={query:e.target.text};a&&(t.variables={...Y,...a.values}),B(t)}};return e.addEventListener("click",t),()=>{e.removeEventListener("click",t)}}},[a,Y]);const Z=F(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=>!(!O.includes("*")&&!O.includes(L.extname(e.name)))&&!(e.size>20971520)).slice(0,6-A.length);return 0!==t.length&&(D(e=>{e.push(...t.map(e=>({file:e})))}),t.forEach(async e=>{try{const t=new FormData;t.set("file",e);const r=await X({method:"POST",url:"/upload",data:t});D(t=>{const n=t.find(t=>t.file===e);n&&(n.path=r.path)})}catch(t){const r=c(t)?t.message:"unknown error";D(t=>{const n=t.find(t=>t.file===e);n&&(n.error=r)})}}),!0)},[A.length,O,X,D]),ee=F(({target:e})=>{e.files&&Z(Array.from(e.files)),e.value=""},[Z]),te=F(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&&Z(n)&&e.preventDefault()},[Z]),re=A.flatMap(({file:e,path:t})=>t?[{name:e.name,size:e.size,path:t}]:[]),ne=F(()=>{if(j||re.length>0){const e={query:j,files:re};a&&(e.variables={...Y,...a.values}),$&&(e.quote=$),B(e),N.current?.setContent(""),R(""),D([]),E.current?.stop(!0)}},[j,re,a,Y,$]),ie=z(()=>({setQuery(e){N.current?.setContent(e)},setQuote:R,send:B,resume:U,focus(){N.current?.focus()}}),[R,B,U]);if(M(()=>{V(ie)},[ie]),I(w,()=>ie,[ie]),a){const t=a.config.filter(e=>!(e.key in(a.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(Y))return e(Ve,{children:e(Xe,{children:e(Ne,{values:Y,variables:t,onSubmit:({formData:e})=>{if(r(e,!0))return G(e),!0}})})})}return t(nt,{children:[m&&e(_e,{actions:h,children:m}),t(rt,{$focused:P&&!W,children:[A.length>0&&e(Ge,{children:A.map(({file:t,error:r,path:n},i)=>{const o=void 0===r&&void 0===n;return e(Ye,{name:t.name,size:t.size,error:r,loading:o,onRemove:()=>{D(e=>{const r=e.findIndex(e=>e.file===t);-1!==r&&e.splice(r,1)})}},i)})}),!!$&&t(tt,{children:[e("i",{className:"bi bi-quote"}),e("p",{children:$}),e(_,{onClick:()=>R("")})]}),t(Ze,{children:[f?.({Component:Je,props:{ref:N,readonly:W||p,autoFocus:g,placeholder:b,minRows:l,maxRows:d,onSubmit:ne,onFocusedChange:T,onQueryChange:C,onPaste:te}})||e(Je,{ref:N,readonly:W||p,autoFocus:g,placeholder:b,minRows:l,maxRows:d,onSubmit:ne,onFocusedChange:T,onQueryChange:C,onPaste:te}),t(et,{children:[n&&e(s,{tooltip:"可上传不超过6个小于20MB的文件",placement:"top",children:t(je,{disabled:A.length>=6,onClick:()=>k.current?.click(),children:[e("input",{onChange:ee,multiple:!0,accept:O.join(","),ref:k,type:"file",hidden:!0}),e("i",{className:"bi bi-file-earmark-arrow-up"})]})}),i&&e(Me,{ref:E,model:i.model,onResult:e=>{N.current?.setContent(t=>t+e+" ")}}),e(je,{$fill:W&&y,className:W&&y?"text-danger":"text-primary",disabled:!j&&0===re.length&&!W||W&&!y,onClick:e=>{e.preventDefault(),W&&y?H():ne()},children:e("i",W&&y?{className:"bi bi-square-fill fs-7"}:{className:"bi bi-send-fill"})})]})]})]})]})});const Xe=n.div`
|
|
169
187
|
border-radius: var(--bs-border-radius-lg);
|
|
170
188
|
box-shadow: var(--bs-box-shadow-sm);
|
|
171
189
|
margin: 1rem;
|
|
172
190
|
padding: 1rem;
|
|
173
191
|
width: 100%;
|
|
174
192
|
max-width: 500px;
|
|
175
|
-
`,
|
|
193
|
+
`,Ve=n.div`
|
|
176
194
|
position: absolute;
|
|
177
195
|
left: 0;
|
|
178
196
|
right: 0;
|
|
@@ -182,64 +200,25 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
182
200
|
display: flex;
|
|
183
201
|
justify-content: center;
|
|
184
202
|
align-items: center;
|
|
185
|
-
`,
|
|
203
|
+
`,Ye=n(be)`
|
|
186
204
|
width: calc((100% - 0.75rem) / 2);
|
|
187
|
-
`,
|
|
188
|
-
.editable-selector-options {
|
|
189
|
-
border-radius: var(--bs-border-radius) !important;
|
|
190
|
-
border: none !important;
|
|
191
|
-
box-shadow: var(--bs-box-shadow-sm) !important;
|
|
192
|
-
padding: 0.25rem 0 !important;
|
|
193
|
-
|
|
194
|
-
& > div {
|
|
195
|
-
padding: 0.4rem 1rem !important;
|
|
196
|
-
|
|
197
|
-
&:hover {
|
|
198
|
-
background-color: var(--bs-tertiary-bg) !important;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
&.editable-selector-option-selected {
|
|
202
|
-
color: var(--bs-primary) !important;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
`,dt=n(ie)`
|
|
207
|
-
min-height: calc(${e=>1.5*e.$minRows}em + 1rem);
|
|
208
|
-
max-height: calc(${e=>1.5*e.$maxRows}em + 1rem);
|
|
209
|
-
overflow-y: auto;
|
|
210
|
-
margin: -0.5rem;
|
|
211
|
-
padding: 0.5rem;
|
|
212
|
-
flex: 1;
|
|
213
|
-
|
|
214
|
-
.editable-skill-container {
|
|
215
|
-
color: var(--bs-primary);
|
|
216
|
-
background: rgba(0, 102, 255, 0.06);
|
|
217
|
-
|
|
218
|
-
&:first-child {
|
|
219
|
-
margin-left: 0;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
.editable-selector {
|
|
224
|
-
display: inline-flex;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
.editable-vars > .block-kit-editable-text,
|
|
228
|
-
.editable-selector {
|
|
229
|
-
color: var(--bs-primary);
|
|
230
|
-
}
|
|
231
|
-
`,ut=n.div`
|
|
205
|
+
`,Ge=n.div`
|
|
232
206
|
display: flex;
|
|
233
207
|
flex-wrap: wrap;
|
|
234
208
|
padding: 0.75rem;
|
|
235
209
|
gap: 0.75rem;
|
|
236
210
|
border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color);
|
|
237
|
-
`,
|
|
211
|
+
`,Ze=n.div`
|
|
238
212
|
display: flex;
|
|
239
|
-
padding: 0.5rem 0.5rem 0.5rem 0.75rem;
|
|
240
213
|
gap: 0.25rem;
|
|
241
214
|
align-items: end;
|
|
242
|
-
|
|
215
|
+
flex-direction: row;
|
|
216
|
+
`,et=n.div`
|
|
217
|
+
display: flex;
|
|
218
|
+
flex-direction: row;
|
|
219
|
+
gap: 0.25rem;
|
|
220
|
+
padding: 0.375rem 0.5rem 0.375rem 0.5rem;
|
|
221
|
+
`,tt=n.div`
|
|
243
222
|
margin: 0.75rem 0.75rem 0 0.75rem;
|
|
244
223
|
padding: 4px 8px;
|
|
245
224
|
display: flex;
|
|
@@ -260,14 +239,14 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
260
239
|
-webkit-box-orient: vertical;
|
|
261
240
|
display: -webkit-box;
|
|
262
241
|
}
|
|
263
|
-
`,
|
|
242
|
+
`,rt=n.div`
|
|
264
243
|
background: #fff;
|
|
265
244
|
border: var(--bs-border-width) var(--bs-border-style) ${e=>e.$focused?"var(--bs-primary)":"var(--bs-border-color)"};
|
|
266
245
|
border-radius: var(--bs-border-radius-lg);
|
|
267
246
|
box-shadow: 0.125rem 0.25rem 0.5rem rgba(0, 0, 0, 0.1);
|
|
268
|
-
`,
|
|
247
|
+
`,nt=n.div`
|
|
269
248
|
margin: 0 1rem 1rem;
|
|
270
|
-
`;function
|
|
249
|
+
`;function it(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 ot(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 st,at,lt;function ct(){return ct=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},ct.apply(null,arguments)}const dt=e=>j.createElement("svg",ct({xmlns:"http://www.w3.org/2000/svg",width:20,height:10,fill:"#fff",viewBox:"0 0 120 30"},e),st||(st=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"}))),at||(at=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"}))),lt||(lt=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 ut(e){if(!e)return"";if("string"==typeof e)return e;if("image"===e.type){return`})`}return""}const mt=function(e,t,r){function n(t){return t!==re.leftSquareBracket?(e.exit("citeMarker"),e.enter("citeData"),e.enter(ne.chunkString,{contentType:"string"}),i(t)):(e.consume(t),n)}function i(n){return n===re.rightSquareBracket?(e.exit(ne.chunkString),e.exit("citeData"),e.enter("citeMarker"),function(n){if(n!==re.rightSquareBracket)return r(n);return e.consume(n),e.exit("citeMarker"),e.exit("cite"),t(n)}(n)):ie(n)||n===re.eof||n>57||n<48?r(n):(e.consume(n),i)}return function(t){return t!==re.leftSquareBracket?r(t):(e.enter("cite"),e.enter("citeMarker"),n(t))}},ht=function(){const e=this.data();e.micromarkExtensions.push({text:{[re.leftSquareBracket]:{tokenize:mt}}}),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}}})},pt=x.Image,gt={pre:({children:r,node:n})=>{if(!n)return null;const[i,o]=S(!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]);M(()=>{s&&o(s)},[s]);const a=z(()=>X(n),[n]);return t(wt,{children:[t(xt,{children:[!i&&e(w,{tooltip:!1,as:yt,content:a}),s&&i&&e(yt,{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(yt,{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(pt,{...r})},ft=[[te,{singleDollarTextMath:!1}],ee,Z],bt=[G,[Y,{detect:!1,ignoreMissing:!0}]],vt=D(R(({content:t,components:r,cite:n},i)=>{t=t.replace(/\\\(\s(.+?)\s\\\)/g,"$$$$ $1 $$$$");const o=z(()=>{const e={...gt,...r};return n&&(e.cite=n),e},[r,n]),s=z(()=>n?[...ft,ht]:ft,[n]);return e(kt,{ref:i,children:e(V,{remarkPlugins:s,rehypePlugins:bt,components:o,children:t})})}),W),yt=n.div`
|
|
271
250
|
cursor: pointer;
|
|
272
251
|
padding: 2px 10px;
|
|
273
252
|
background-color: #303030;
|
|
@@ -277,7 +256,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
277
256
|
font-size: 12px;
|
|
278
257
|
font-family: initial;
|
|
279
258
|
user-select: none;
|
|
280
|
-
`,
|
|
259
|
+
`,xt=n.div`
|
|
281
260
|
position: absolute;
|
|
282
261
|
right: 10px;
|
|
283
262
|
top: 1em;
|
|
@@ -291,17 +270,17 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
291
270
|
&:hover {
|
|
292
271
|
opacity: 1;
|
|
293
272
|
}
|
|
294
|
-
`,
|
|
273
|
+
`,wt=n.div`
|
|
295
274
|
position: relative;
|
|
296
275
|
|
|
297
276
|
&:hover {
|
|
298
|
-
${
|
|
277
|
+
${xt} {
|
|
299
278
|
pointer-events: all;
|
|
300
279
|
transform: translateX(0px);
|
|
301
280
|
opacity: 0.7;
|
|
302
281
|
}
|
|
303
282
|
}
|
|
304
|
-
`,
|
|
283
|
+
`,kt=n.div`
|
|
305
284
|
-ms-text-size-adjust: 100%;
|
|
306
285
|
-webkit-text-size-adjust: 100%;
|
|
307
286
|
line-height: 1.8;
|
|
@@ -571,7 +550,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
571
550
|
.hljs-strong {
|
|
572
551
|
font-weight: 700;
|
|
573
552
|
}
|
|
574
|
-
`;var
|
|
553
|
+
`;var Et=R(function({children:t,tooltip:r,onClick:n,disabled:i,...o},a){i&&(n=void 0);const l=e(Nt,{ref:a,onClick:n,$disabled:i,...o,children:t});return r?e(s,{tooltip:r,placement:"top",children:l}):l});const Nt=n.div`
|
|
575
554
|
align-items: center;
|
|
576
555
|
justify-content: center;
|
|
577
556
|
border-radius: .375rem;
|
|
@@ -604,7 +583,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
604
583
|
`}
|
|
605
584
|
|
|
606
585
|
}
|
|
607
|
-
`,
|
|
586
|
+
`,jt=C(null);var Ct=jt.Provider;const $t=x.Image;function Mt({src:t,...r}){const{imageResolver:n}=he();return n&&t&&(t=n(t)),e(St,{children:e($t,{src:t,...r})},t)}const St=n.div`
|
|
608
587
|
margin-bottom: .5rem;
|
|
609
588
|
margin-top: .5rem;
|
|
610
589
|
border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color);
|
|
@@ -629,7 +608,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
629
608
|
max-height: 100%;
|
|
630
609
|
max-width: 100%;
|
|
631
610
|
}
|
|
632
|
-
`,
|
|
611
|
+
`,qt=C(null);function Ft(){const e=$(qt);if(!e)throw new Error("useContext must be used within a Provider");return e}function Rt({children:t,...r}){return e(qt.Provider,{value:r,children:t})}function zt(e){const[t,r]=S(e);return M(()=>{r(e)},[e]),[t,r]}function It({description:r,options:n}){const{resume:i,disabled:o,response:s}=Ft(),[a,l]=zt(s?.result),c=o||void 0!==a;return t(At,{children:[r&&e(Dt,{children:r}),n.map((t,r)=>e(Lt,{$selected:a===t,$disabled:c,onClick:()=>(e=>{c||(l(e),i(e))})(t),children:t},r))]})}const At=n.div`
|
|
633
612
|
display: flex;
|
|
634
613
|
flex-direction: column;
|
|
635
614
|
gap: 0.5rem;
|
|
@@ -642,10 +621,10 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
642
621
|
&:last-child {
|
|
643
622
|
margin-bottom: 0;
|
|
644
623
|
}
|
|
645
|
-
`,
|
|
624
|
+
`,Dt=n.div`
|
|
646
625
|
color: var(--bs-secondary);
|
|
647
626
|
line-height: 1.5;
|
|
648
|
-
`,
|
|
627
|
+
`,Lt=n.div`
|
|
649
628
|
padding: 0.375rem 0.75rem;
|
|
650
629
|
background-color: ${e=>e.$selected?"rgba(var(--bs-primary-rgb), 0.1)":"#FFFFFF"};
|
|
651
630
|
border: 1px solid ${e=>e.$selected?"rgba(var(--bs-primary-rgb), 0.3)":"var(--bs-border-color)"};
|
|
@@ -664,7 +643,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
664
643
|
&:active {
|
|
665
644
|
transform: ${e=>e.$disabled?"none":"scale(0.98)"};
|
|
666
645
|
}
|
|
667
|
-
`;function
|
|
646
|
+
`;function Pt({description:r,fields:n}){const{resume:i,disabled:o,response:s}=Ft(),[a,l]=zt(void 0!==s),c=o||a,{schema:u,uiSchema:m}=z(()=>{const e={},t=[],r={};for(const i of n)e[i.name]={type:"number"===i.type?"number":"string",title:i.label},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 t(Ot,{className:"rounded bg-white shadow-sm",children:[r&&e(Bt,{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(Tt,{children:t})})]})}const Tt=n.div`
|
|
668
647
|
display: flex;
|
|
669
648
|
justify-content: flex-end;
|
|
670
649
|
border-top: 1px solid var(--bs-border-color);
|
|
@@ -672,7 +651,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
672
651
|
button {
|
|
673
652
|
padding: .25rem;
|
|
674
653
|
}
|
|
675
|
-
`,
|
|
654
|
+
`,Ot=n.div`
|
|
676
655
|
display: flex;
|
|
677
656
|
flex-direction: column;
|
|
678
657
|
gap: 0.5rem;
|
|
@@ -690,10 +669,10 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
690
669
|
&:last-child {
|
|
691
670
|
margin-bottom: 0;
|
|
692
671
|
}
|
|
693
|
-
`,
|
|
672
|
+
`,Bt=n.div`
|
|
694
673
|
color: var(--bs-secondary);
|
|
695
674
|
line-height: 1.5;
|
|
696
|
-
`;function
|
|
675
|
+
`;function Ut({content:r}){const{resume:n,disabled:i,response:o}=Ft(),[s,a]=zt(void 0!==o),l=i||s;return t(_t,{className:"rounded bg-white shadow-sm",children:[r&&e(Ht,{children:e(vt,{content:r})}),e(Qt,{children:e(k,{disabled:l,onClick:()=>{l||(a(!0),n("已确认"))},children:s?"已确认":"确认"})})]})}const _t=n.div`
|
|
697
676
|
display: flex;
|
|
698
677
|
flex-direction: column;
|
|
699
678
|
gap: .5rem;
|
|
@@ -707,10 +686,10 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
707
686
|
&:last-child {
|
|
708
687
|
margin-bottom: 0;
|
|
709
688
|
}
|
|
710
|
-
`,
|
|
689
|
+
`,Ht=n.div`
|
|
711
690
|
line-height: 1.6;
|
|
712
691
|
color: var(--bs-body-color);
|
|
713
|
-
`,
|
|
692
|
+
`,Qt=n.div`
|
|
714
693
|
display: flex;
|
|
715
694
|
justify-content: flex-end;
|
|
716
695
|
border-top: 1px solid var(--bs-border-color);
|
|
@@ -719,7 +698,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
719
698
|
button {
|
|
720
699
|
padding: .25rem 1.5rem;
|
|
721
700
|
}
|
|
722
|
-
`;function
|
|
701
|
+
`;function Jt({suspend:t}){const{readonly:r}=he(),{chunkIndex:n,chunk:i,toolIndex:o,tool:s,isLastMessage:a}=function(){const e=$(jt);if(!e)throw new Error("useContext must be used within a Provider");return e}(),{resume:l}=Ee(),c=F(e=>{l({chunk:n,tool:o,payload:e})},[]);let d=null;switch(t.type){case"select":d=e(It,{...t.select});break;case"form":d=e(Pt,{...t.form});break;case"confirm":d=e(Ut,{...t.confirm})}const u=s?.response||i.node?.output;return e(Rt,{resume:c,disabled:r||!!i.error||!a,response:"(Empty)"===u?void 0:u,children:d})}function Kt({value:t,cite:n}){const i=t=>"string"==typeof t?e(vt,{content:t,cite:n}):"image"===t.type?e(Mt,{src:t.image}):"suspend"===t.type?e(Jt,{suspend:t.suspend}):null;return Array.isArray(t)?e(r,{children:t.map((t,r)=>e(A,{children:i(t)},r))}):i(t)}const Wt=({reasoning:r,loading:n})=>{const[i,o]=S(!1);return M(()=>{n||o(!1)},[n]),e(A,{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(T,{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(vt,{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(T,{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"})]})})})},Xt=D(t=>{const{renderReasoning:r}=he();return r?r({Component:Wt,props:t}):e(Wt,{...t})});class Vt{#t;#o=[];#s=0;constructor(){this.#t=new J}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 Yt=new Map;class Gt{#r;#t;#o=[];#a=new Map;#l=!1;#s=0;#c=!1;constructor(e){this.#r=e,this.#t=new J}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?(Yt.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),Yt.delete(this)}start(e,t=!1){Yt.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=Yt.get(this);e&&(e.pause(),e.currentTime=0)}onPlaying(e){this.#t.on("playing",e)}onSpeaking(e){this.#t.on("speaking",e)}}function Zt({text:e,loading:t,loader:r}){const n=q(),[i,o]=S(!1),[s,a]=S(!1),l=q(t),c=async(i=!1)=>{n.current||(n.current=r?new Gt(r):new Vt,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 er({model:r="builtin",voice:n,loading:i,autoplay:o,contentRef:s,avatarRef:a}){const{request:l}=he(),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}=Zt({loader:c,text:s,loading:o&&i});let p=null;return a.current&&(u&&(p=oe(e(tr,{children:e(T,{size:"sm",variant:"light"})}),a.current)),d&&(p=oe(e(tr,{children:e(rr,{className:"bi bi-volume-down-fill text-light"})}),a.current))),t(Et,{disabled:i&&!d,onClick:()=>{d?h():m()},children:[d?e(rr,{className:"bi bi-volume-down-fill"}):u?e(T,{size:"sm",variant:"primary"}):e(rr,{className:"bi bi-volume-down"}),p]})}const tr=n.div`
|
|
723
702
|
position: absolute;
|
|
724
703
|
top: 0;
|
|
725
704
|
left: 0;
|
|
@@ -729,27 +708,27 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
729
708
|
align-items: center;
|
|
730
709
|
justify-content: center;
|
|
731
710
|
background-color: rgba(0, 0, 0, .3);
|
|
732
|
-
`,
|
|
711
|
+
`,rr=n.i`
|
|
733
712
|
|
|
734
713
|
&::before {
|
|
735
714
|
transform: scale(1.4)
|
|
736
715
|
}
|
|
737
|
-
`;function
|
|
716
|
+
`;function nr({tool:r,loading:n}){const{logLevel:i="none",renderToolContent:o}=he(),s="response"in r,a=!s&&!n,{response:l,title:c,content:d,showStatus:u,defaultExpanded:m}=z(()=>{const n=(e=>{try{return JSON.parse(e.arguments)}catch(e){return null}})(r),i=e("span",{className:"text-truncate",children:r.title}),a=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(or,{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(or,{className:"border-top p-2",children:r.response||"None"})]})]}),l=r.content&&e(Kt,{value:r.content});if(o){const e=o({tool:r,args:n});if(e)return{title:null===e.title?null:e.title??i,response:null===e.response?null:e.response??a,content:null===e.content?null:e.content??l,showStatus:e.showStatus??!0,defaultExpanded:e.defaultExpanded??!1}}return{title:i,response:a,content:l,showStatus:!0,defaultExpanded:!1}},[r,o]),[h,p]=S(m),g="all"==i&&null!==l;return t(A,{children:[c&&e("div",{className:"mb-2",children:t(ir,{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(T,{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 ir=n.div`
|
|
738
717
|
width: ${e=>e.$open?"auto":"fit-content"};
|
|
739
718
|
max-width: 100%;
|
|
740
719
|
overflow:hidden;
|
|
741
|
-
`,
|
|
720
|
+
`,or=n.div`
|
|
742
721
|
white-space: pre-wrap;
|
|
743
722
|
overflow-y: auto;
|
|
744
723
|
overflow-x: hidden;
|
|
745
724
|
max-height: 150px;
|
|
746
|
-
`;function
|
|
725
|
+
`;function sr({node:r}){const[n,i]=S(!1),{nodeIconResolver:o}=he(),s=!("latency"in r),a=s?e(T,{animation:"border",variant:"primary",size:"sm"}):r.error?e("i",{className:"bi bi-x-circle-fill text-danger"}):e("i",{className:"bi bi-check-circle-fill text-success"});return t("div",{className:"shadow-sm rounded bg-white fs-7",children:[t(lr,{onClick:()=>i(e=>!e),role:"button",className:"d-flex align-items-center p-1 px-2 gap-1",children:[e("i",{className:"bi bi-chevron-down text-muted"}),o?.(r.type),e(cr,{className:"me-2 text-truncate",children:r.title}),e("span",{className:"me-auto"}),!s&&e("span",{className:"text-nowrap text-muted",children:ar(r.latency)}),e("span",{children:a})]}),n&&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("div",{className:"border-top p-2 overflow-hidden text-pre-wrap",children:r.input?JSON.stringify(r.input,null,4):"None"})]}),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("div",{className:"border-top p-2 overflow-hidden text-pre-wrap",children:r.output?JSON.stringify(r.output,null,4):"None"})]})]})]})}const ar=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`,lr=n.div`
|
|
747
726
|
svg {
|
|
748
727
|
flex-shrink: 0;
|
|
749
728
|
}
|
|
750
|
-
`,
|
|
729
|
+
`,cr=n.span`
|
|
751
730
|
display: inline-block;
|
|
752
|
-
`;function
|
|
731
|
+
`;function dr({nodes:r,loading:n}){const[i,o]=S(!1),s=r.some(e=>"error"in e),a=n?e(T,{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(sr,{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 ur=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}=he(),y=z(()=>m?m.reduce(function(e,t){const r=Array.isArray(t.content)?t.content.reduce((e,t)=>{const r=ut(t);return r?e+r+"\n":e},""):ut(t.content);return e+r+"\n"+(t.tools||[]).reduce((e,t)=>{if(t.content){const r=ut(t.content);if(r)return e+r+"\n"}return e},"")},""):"",[m]),x=q(null),k=q(null),N=q(null),j=z(()=>m?.flatMap(e=>e.node?[e.node]:[])||[],[m]),C=c||u.length>0;return t(r,{children:[C&&t(kr,{$reverse:!0,children:[g&&e(yr,{children:e("img",{src:g.avatar})}),e(xr,{}),t(wr,{ref:x,children:[c&&e(vt,{content:c}),d&&e(H,{trigger:"click",container:x,rootClose:!0,placement:"bottom",overlay:e(mr,{body:!0,children:d}),children:e(pr,{children:e(hr,{children:d})})}),u.length>0&&u.map(({name:t,size:r,path:n},i)=>E(n)?e(Mt,{src:`/uploads/${n}`},i):e(fr,{children:e(be,{name:t,url:`/uploads/${n}`,size:r})},i))]})]}),m&&t(kr,{children:[f&&e(yr,{ref:k,children:e("img",{src:f.avatar})}),e(xr,{}),t(wr,{children:[C&&!1!==i&&t(br,{children:[e(w,{placement:"top",content:y,as:Et,tooltip:!0}),a&&e(er,{loading:n.loading,avatarRef:k,contentRef:N,...a}),i?.({Component:Et,message:n,content:y,setMessage:o,messages:v})]}),e(vr,{children:["stats","all"].includes(b)&&n.stats&&t(r,{children:[t("span",{children:["耗时 ",n.stats.latency/1e3," 秒"]}),t("span",{children:["花费 Token ",n.stats.usage]})]})}),t(gr,{ref:N,$deleted:!!h,children:["all"===b&&j.length>0&&e(dr,{loading:p,nodes:j}),m.map((r,n)=>t(A,{children:[r.reasoning&&["stats","all"].includes(b)&&e(Xt,{reasoning:r.reasoning,loading:!r.content&&0===(r.tools||[]).length}),r.content&&e(Ct,{value:{chunkIndex:n,chunk:r,isLastMessage:l},children:e(Kt,{cite:s,value:r.content})}),(r.tools||[]).map((t,i)=>e(Ct,{value:{chunkIndex:n,chunk:r,toolIndex:i,tool:t,isLastMessage:l},children:e(nr,{tool:t,loading:p})},i)),r.error&&e(vt,{content:`[${r.error}]`})]},n))]}),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(vt,{content:h.answer})]}),n.loading&&e(dt,{})]})]})]})}),mr=n(Q)`
|
|
753
732
|
max-width: calc(100% - .875rem * 2);
|
|
754
733
|
width: calc(100% - .875rem * 2);
|
|
755
734
|
font-size: 1rem;
|
|
@@ -758,25 +737,25 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
758
737
|
.popover-body {
|
|
759
738
|
padding: .5rem .75rem;
|
|
760
739
|
}
|
|
761
|
-
`,
|
|
740
|
+
`,hr=n.div`
|
|
762
741
|
overflow: hidden;
|
|
763
742
|
text-overflow: ellipsis;
|
|
764
743
|
word-break: break-all;
|
|
765
744
|
-webkit-line-clamp: 2;
|
|
766
745
|
-webkit-box-orient: vertical;
|
|
767
746
|
display: -webkit-box;
|
|
768
|
-
`,
|
|
747
|
+
`,pr=n.div`
|
|
769
748
|
padding: .5rem .75rem;
|
|
770
749
|
color: var(--bs-secondary);
|
|
771
750
|
border-radius: var(--bs-border-radius-lg);
|
|
772
751
|
background: #FFFFFF;
|
|
773
752
|
cursor: pointer;
|
|
774
|
-
|
|
753
|
+
`,gr=n.div`
|
|
775
754
|
${e=>e.$deleted&&i`
|
|
776
755
|
text-decoration-line: line-through;
|
|
777
756
|
color: var(--bs-secondary);
|
|
778
757
|
`}
|
|
779
|
-
`,
|
|
758
|
+
`,fr=n.div`
|
|
780
759
|
width: 100%;
|
|
781
760
|
margin-bottom: .5rem;
|
|
782
761
|
margin-top: .5rem;
|
|
@@ -788,7 +767,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
788
767
|
&:last-child {
|
|
789
768
|
margin-bottom: 0;
|
|
790
769
|
}
|
|
791
|
-
`,
|
|
770
|
+
`,br=n.div`
|
|
792
771
|
position: absolute;
|
|
793
772
|
top: -1.1rem;
|
|
794
773
|
right: 0;
|
|
@@ -796,7 +775,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
796
775
|
gap: .5rem;
|
|
797
776
|
opacity: 0;
|
|
798
777
|
z-index: 1;
|
|
799
|
-
`,
|
|
778
|
+
`,vr=n.div`
|
|
800
779
|
position: absolute;
|
|
801
780
|
bottom: -1.4rem;
|
|
802
781
|
left: 0;
|
|
@@ -809,7 +788,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
809
788
|
display: flex;
|
|
810
789
|
opacity: 0;
|
|
811
790
|
z-index: 1;
|
|
812
|
-
`,
|
|
791
|
+
`,yr=n.div`
|
|
813
792
|
width: 35px;
|
|
814
793
|
height: 35px;
|
|
815
794
|
border-radius: 50%;
|
|
@@ -820,14 +799,14 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
820
799
|
width: 100%;
|
|
821
800
|
height: 100%;
|
|
822
801
|
}
|
|
823
|
-
`,
|
|
802
|
+
`,xr=n.div`
|
|
824
803
|
width: 0;
|
|
825
804
|
height: 0;
|
|
826
805
|
content: "";
|
|
827
806
|
border: 5px solid transparent;
|
|
828
807
|
border-right-color: #f3f3f3;
|
|
829
808
|
transform: translateY(10px);
|
|
830
|
-
`,
|
|
809
|
+
`,wr=n.div`
|
|
831
810
|
padding: .875rem;
|
|
832
811
|
background-color: rgb(243, 243, 243);
|
|
833
812
|
border-radius: var(--bs-border-radius-lg);
|
|
@@ -835,31 +814,31 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
835
814
|
position: relative;
|
|
836
815
|
|
|
837
816
|
&:hover {
|
|
838
|
-
${
|
|
817
|
+
${vr}, ${br} {
|
|
839
818
|
opacity: 1;
|
|
840
819
|
}
|
|
841
820
|
}
|
|
842
|
-
`,
|
|
821
|
+
`,kr=n.div`
|
|
843
822
|
display: flex;
|
|
844
823
|
justify-content: flex-start;
|
|
845
824
|
padding: 1rem 0 1rem 0;
|
|
846
825
|
${e=>e.$reverse&&i`
|
|
847
826
|
flex-direction: row-reverse;
|
|
848
827
|
|
|
849
|
-
${
|
|
828
|
+
${xr} {
|
|
850
829
|
border-left-color: rgba(var(--bs-primary-rgb), 0.1);
|
|
851
830
|
border-right-color: transparent;
|
|
852
831
|
}
|
|
853
832
|
|
|
854
|
-
${
|
|
833
|
+
${wr} {
|
|
855
834
|
background: rgba(var(--bs-primary-rgb), 0.1);
|
|
856
835
|
}
|
|
857
836
|
`};
|
|
858
|
-
`;function
|
|
837
|
+
`;function Er(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}=he(),p=q(r.loaded),g=F(()=>{const e=l.current;e&&requestAnimationFrame(()=>{e.scrollTo({top:e.scrollHeight})})},[]),f=q(null),{height:b}=se({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 t(Nr,{ref:f,children:[0===v.length&&n,v.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===v.length-1};return a?a({Component:ur,props:n},r):e(ur,{...n},r)}),m.length>0&&e(jr,{children:m.map((t,r)=>e("a",{href:"#!question",children:t},r))})]})}const Nr=n.div`
|
|
859
838
|
display: flex;
|
|
860
839
|
flex-direction: column;
|
|
861
840
|
flex: 1;
|
|
862
|
-
`,
|
|
841
|
+
`,jr=n.div`
|
|
863
842
|
display: flex;
|
|
864
843
|
flex-direction: column;
|
|
865
844
|
align-items: flex-start;
|
|
@@ -876,16 +855,16 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
876
855
|
background: var(--bs-secondary-bg-subtle);
|
|
877
856
|
}
|
|
878
857
|
}
|
|
879
|
-
`,
|
|
858
|
+
`,Cr=D(R(({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=it},C)=>{const $=F(e=>{const t=[];if(u&&!1!==u.enable){const e=ot(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,R]=S(m?.id),[A,D]=S(),[L,P]=v(()=>$(m)),[T,O]=S(!1),B=q(null),[U,_]=S([]),H=F(e=>{R(e?.id),P($(e)),_([]),O(!1),E?.(e)},[T,$,E]);return I(C,()=>({reset:H}),[H]),e(pe,{request:z(()=>k?"string"==typeof k?N.create({baseURL:k}):k:N,[k]),bot:n,user:i,logLevel:s,imageResolver:a,nodeIconResolver:l,conversationId:M,setConversationId:R,input:A,setInput:D,messages:L,setMessages:P,suggestions:U,setSuggestions:_,loading:T,setLoading:O,renderFileItem:f,reset:H,readonly:!o,renderToolContent:b,renderReasoning:y,children:e(Mr,{className:r,children:t(x,{children:[e($r,{ref:B,children:e(Er,{placeholder:c,cite:h,actions:d,loaded:!o,speech:p,renderItem:g,scrollRef:B})}),o&&e(We,{...o,scrollRef:B})]})})})}),W),$r=n.div`
|
|
880
859
|
display: flex;
|
|
881
860
|
flex-direction: column;
|
|
882
861
|
flex: 1;
|
|
883
862
|
overflow-y: auto;
|
|
884
863
|
padding: 0 1rem;
|
|
885
864
|
margin-bottom: .5rem;
|
|
886
|
-
`,
|
|
865
|
+
`,Mr=n.div`
|
|
887
866
|
display: flex;
|
|
888
867
|
flex-direction: column;
|
|
889
868
|
height: 100%;
|
|
890
869
|
position: relative;
|
|
891
|
-
`;async function
|
|
870
|
+
`;async function Sr(e){const t=await ae().use(ce).use(Z).use(ee).use(te).use(de).use(le).process(e);return String(t)}export{qe as ActionButton,Je as EditableInput,be as FileItem,vt as Markdown,Cr as MessageBox,Ne as VariableForm,ue as isToolMessage,Sr as md2html,ot as pickQuestions,he as useMessageContext,Zt as useSynthesis};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@topthink/chat",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.6",
|
|
4
4
|
"module": "es/index.js",
|
|
5
5
|
"types": "types/index.d.ts",
|
|
6
6
|
"files": [
|
|
@@ -10,10 +10,8 @@
|
|
|
10
10
|
],
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@babel/runtime": "^7.11.2",
|
|
13
|
-
"@block-kit/core": "^1.0.22",
|
|
14
|
-
"@block-kit/variable": "^1.0.21",
|
|
15
13
|
"@breezystack/lamejs": "^1.2.7",
|
|
16
|
-
"@topthink/components": "1.2.
|
|
14
|
+
"@topthink/components": "1.2.5",
|
|
17
15
|
"@types/hast": "^3.0.4",
|
|
18
16
|
"@types/mdast": "^4.0.4",
|
|
19
17
|
"eventemitter3": "^5.0.1",
|
|
@@ -24,6 +22,7 @@
|
|
|
24
22
|
"micromark-util-symbol": "^2.0.1",
|
|
25
23
|
"micromark-util-types": "^2.0.2",
|
|
26
24
|
"react-markdown": "^10.1.0",
|
|
25
|
+
"react-textarea-autosize": "^8.5.9",
|
|
27
26
|
"rehype-highlight": "^7.0.2",
|
|
28
27
|
"rehype-katex": "^7.0.1",
|
|
29
28
|
"rehype-stringify": "^10.0.1",
|
|
@@ -64,7 +63,7 @@
|
|
|
64
63
|
},
|
|
65
64
|
"author": "yunwuxin <tzzhangyajun@qq.com> (https://github.com/yunwuxin)",
|
|
66
65
|
"license": "MIT",
|
|
67
|
-
"gitHead": "
|
|
66
|
+
"gitHead": "c8c80da8dec40f09bdd752b134019370e81ce5c9",
|
|
68
67
|
"scripts": {
|
|
69
68
|
"prebuild": "rimraf es types",
|
|
70
69
|
"build": "rollup -c --environment NODE_ENV:production",
|
|
@@ -2,6 +2,7 @@ import { RequestInstance } from '@topthink/components';
|
|
|
2
2
|
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
|
+
import type { RenderEditableInput } from './input-box';
|
|
5
6
|
import { ToolRenderOptions, ToolRenderResult } from './context';
|
|
6
7
|
import { Components } from 'react-markdown';
|
|
7
8
|
import { FileItemProps } from './file-item';
|
|
@@ -35,6 +36,7 @@ export interface MessageBoxProps {
|
|
|
35
36
|
nodeIconResolver?: (type: string) => ReactNode;
|
|
36
37
|
input?: {
|
|
37
38
|
disabled?: boolean;
|
|
39
|
+
supportStop?: boolean;
|
|
38
40
|
fileTypes?: string[];
|
|
39
41
|
speech?: {
|
|
40
42
|
model?: string;
|
|
@@ -42,7 +44,9 @@ export interface MessageBoxProps {
|
|
|
42
44
|
minRows?: number;
|
|
43
45
|
suggestion?: boolean;
|
|
44
46
|
toolbar?: ReactNode;
|
|
47
|
+
toolbarActions?: ReactNode;
|
|
45
48
|
autoFocus?: boolean;
|
|
49
|
+
renderEditableInput?: RenderEditableInput;
|
|
46
50
|
placeholder?: string;
|
|
47
51
|
variables?: {
|
|
48
52
|
config: Variable[];
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface EditableInputProps {
|
|
2
|
+
readonly?: boolean;
|
|
3
|
+
autoFocus?: boolean;
|
|
4
|
+
placeholder?: string;
|
|
5
|
+
minRows: number;
|
|
6
|
+
maxRows: number;
|
|
7
|
+
onSubmit?: () => void;
|
|
8
|
+
onFocusedChange?: (focused: boolean) => void;
|
|
9
|
+
onQueryChange?: (query: string) => void;
|
|
10
|
+
onPaste?: (e: ClipboardEvent) => void;
|
|
11
|
+
}
|
|
12
|
+
export interface EditableInputRef {
|
|
13
|
+
setContent: (fn: string | ((query: string) => string)) => void;
|
|
14
|
+
focus: () => void;
|
|
15
|
+
}
|
|
16
|
+
declare const _default: import("react").ForwardRefExoticComponent<EditableInputProps & import("react").RefAttributes<EditableInputRef>>;
|
|
17
|
+
export default _default;
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
import { MutableRefObject, ReactNode } from 'react';
|
|
1
|
+
import { ForwardRefExoticComponent, MutableRefObject, ReactNode, RefAttributes } from 'react';
|
|
2
2
|
import { Input, Variable } from '../../../types';
|
|
3
|
-
import '
|
|
4
|
-
|
|
3
|
+
import { EditableInputProps, EditableInputRef } from './editable-input';
|
|
4
|
+
export type EditableInputComponent = ForwardRefExoticComponent<EditableInputProps & RefAttributes<EditableInputRef>>;
|
|
5
|
+
export type RenderEditableInput = (options: {
|
|
6
|
+
Component: EditableInputComponent;
|
|
7
|
+
props: EditableInputProps & RefAttributes<EditableInputRef>;
|
|
8
|
+
}) => ReactNode;
|
|
9
|
+
export interface Props {
|
|
5
10
|
suggestion?: boolean;
|
|
11
|
+
supportStop?: boolean;
|
|
6
12
|
variables?: {
|
|
7
13
|
config: Variable[];
|
|
8
14
|
values?: Record<string, string>;
|
|
@@ -15,13 +21,15 @@ interface Props {
|
|
|
15
21
|
maxRows?: number;
|
|
16
22
|
scrollRef: MutableRefObject<HTMLDivElement | null>;
|
|
17
23
|
toolbar?: ReactNode | true;
|
|
24
|
+
toolbarActions?: ReactNode;
|
|
18
25
|
disabled?: boolean;
|
|
19
26
|
placeholder?: string;
|
|
20
27
|
autoFocus?: boolean;
|
|
28
|
+
renderEditableInput?: RenderEditableInput;
|
|
21
29
|
onEvent?: (event: {
|
|
22
30
|
type: string;
|
|
23
31
|
data?: any;
|
|
24
32
|
}) => void;
|
|
25
33
|
}
|
|
26
|
-
declare const _default:
|
|
34
|
+
declare const _default: ForwardRefExoticComponent<Props & RefAttributes<Input>>;
|
|
27
35
|
export default _default;
|
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
import { ButtonHTMLAttributes, ComponentType, DetailedHTMLProps } from 'react';
|
|
2
|
-
|
|
2
|
+
type InputButtonProps = DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement> & {
|
|
3
|
+
$fill?: boolean;
|
|
4
|
+
};
|
|
5
|
+
declare const InputButton: ComponentType<InputButtonProps>;
|
|
3
6
|
export default InputButton;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
2
|
interface Props {
|
|
3
3
|
children?: ReactNode;
|
|
4
|
+
actions?: ReactNode;
|
|
4
5
|
}
|
|
5
|
-
export default function Toolbar({ children }: Props): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export default function Toolbar({ children, actions }: Props): import("react/jsx-runtime").JSX.Element;
|
|
6
7
|
export {};
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
interface UseChatOptions {
|
|
2
|
+
supportStop?: boolean;
|
|
3
|
+
}
|
|
4
|
+
export default function useChat(options?: UseChatOptions): {
|
|
2
5
|
send: (params: string | import("../../..").SendParams, files?: import("../../..").Message["files"], variables?: import("../../..").Message["variables"]) => Promise<void>;
|
|
3
6
|
resume: (params: import("../../..").ResumeParams) => Promise<void>;
|
|
4
7
|
suggest: () => Promise<void>;
|
|
8
|
+
stop: () => Promise<void>;
|
|
5
9
|
};
|
|
10
|
+
export {};
|
|
@@ -6,4 +6,5 @@ interface ContextType {
|
|
|
6
6
|
}
|
|
7
7
|
export declare function useSuspend(): ContextType;
|
|
8
8
|
export declare function Provider({ children, ...props }: PropsWithChildren<ContextType>): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export declare function useSyncedState<T>(value: T): readonly [T, import("react").Dispatch<import("react").SetStateAction<T>>];
|
|
9
10
|
export {};
|
package/types/index.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
export * from './types';
|
|
2
2
|
export { default as MessageBox, MessageBoxProps } from './components/message-box';
|
|
3
3
|
export { useContext as useMessageContext, ToolRenderOptions, ToolRenderResult } from './components/message-box/context';
|
|
4
|
+
export { default as EditableInput } from './components/message-box/input-box/editable-input';
|
|
5
|
+
export type { EditableInputProps, EditableInputRef } from './components/message-box/input-box/editable-input';
|
|
6
|
+
export type { EditableInputComponent, RenderEditableInput } from './components/message-box/input-box';
|
|
4
7
|
export { default as ActionButton } from './components/action-button';
|
|
5
8
|
export { default as Markdown } from './components/markdown';
|
|
6
9
|
export { default as VariableForm } from './components/variable-form';
|
|
7
10
|
export { default as FileItem } from './components/message-box/file-item';
|
|
8
11
|
export { default as pickQuestions } from './utils/pick-questions';
|
|
9
12
|
export { default as useSynthesis } from './speech/use-synthesis';
|
|
10
|
-
export { ContentChangeEvent } from '@block-kit/core';
|
|
11
13
|
export { default as md2html } from './utils/md2html';
|
package/types/types.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Editor } from '@block-kit/variable';
|
|
2
1
|
export interface FormField {
|
|
3
2
|
name: string;
|
|
4
3
|
label: string;
|
|
@@ -99,6 +98,7 @@ export interface Message {
|
|
|
99
98
|
question: string;
|
|
100
99
|
answer: string;
|
|
101
100
|
};
|
|
101
|
+
status?: number;
|
|
102
102
|
}
|
|
103
103
|
export interface Variable {
|
|
104
104
|
key: string;
|
|
@@ -132,6 +132,7 @@ export interface ConversationMessage {
|
|
|
132
132
|
question: string;
|
|
133
133
|
answer: string;
|
|
134
134
|
};
|
|
135
|
+
status?: number;
|
|
135
136
|
[key: string]: any;
|
|
136
137
|
}
|
|
137
138
|
export interface SendParams {
|
|
@@ -153,7 +154,6 @@ export interface MessageBoxType {
|
|
|
153
154
|
reset(conversation?: Conversation): void;
|
|
154
155
|
}
|
|
155
156
|
export interface Input extends Chat {
|
|
156
|
-
editor: Editor;
|
|
157
157
|
setQuery(query: string): void;
|
|
158
158
|
setQuote(quote: string): void;
|
|
159
159
|
focus(): void;
|