@topthink/chat 1.2.3 → 1.2.5
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 +82 -111
- package/package.json +4 -5
- package/types/components/message-box/index.d.ts +3 -0
- package/types/components/message-box/input-box/editable-input.d.ts +17 -0
- package/types/components/message-box/input-box/index.d.ts +11 -4
- package/types/components/message-box/input-box/toolbar/index.d.ts +2 -1
- package/types/components/message-box/input-box/use-chat.d.ts +2 -1
- package/types/index.d.ts +3 -1
- package/types/types.d.ts +0 -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 F,useCallback as q,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,14 +65,14 @@ 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(){const{setMessages:e,setSuggestions:t,setLoading:r,conversationId:n,setConversationId:i,request:o,handles:s,messages:a}=he(),d=F(null),u=F(n),m=()=>(d.current&&d.current.abort(),d.current=new AbortController,d.current.signal),{onComplete:h,onEvent:p}=s,g=q(t=>{if(t.data)if("[DONE]"!=t.data)try{const r=JSON.parse(t.data);r.conversation?(u.current=r.conversation,i(r.conversation)):r.event?p?.(r.event):e(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 e(e=>{e[e.length-1].loading=!1})},[s]),f=q(t=>{if(l(t))e(e=>{const t=e[e.length-1];t&&(t.loading=!1)});else{let r="未知错误";c(t)&&(r=401==t.response?.status?"未授权或授权已过期,请刷新页面后重试":"string"==typeof t.errors?t.errors:Object.values(t.errors).join("\n")),e(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})}},[]),b=q(async t=>{try{const n=m();r(!0),e(e=>{e[e.length-1].loading=!0,delete e[e.length-1].stats});let i={url:"message",method:"get",params:{id:t},onMessage:g,signal:n};await o(i)}catch(e){f(e)}finally{d.current=null}r(!1),h?.()},[o,s]),v=q(async(n,...i)=>{"string"==typeof n&&(n={query:n,...i});const{query:s,files:a=[],variables:l={},quote:c}=n;let p=null;if(s||a.length>0){const n=m();r(!0),t([]),e(e=>{e.push({query:s,quote:c,files:a,variables:l,chunks:[],loading:!0})});try{let e={method:"post",data:{query:s,quote:c,files:a,variables:l,conversation:u.current},onMessage:g,signal:n};p=(await o(e)).message??null}catch(e){f(e)}finally{d.current=null}p?await b(p.id):(r(!1),h?.())}},[o,s]),y=q(async t=>{try{const n=m();r(!0),e(e=>{e[e.length-1].loading=!0});let i={url:"resume",method:"post",data:{conversation:u.current,chunk:t.chunk,tool:t.tool,payload:t.payload},onMessage:g,signal:n};await o(i)}catch(e){f(e)}finally{d.current=null}r(!1),h?.()},[o,s]),x=q(async()=>{try{const e=m();let r={method:"post",url:"/suggestion",data:{conversation:u.current},signal:e};const n=await o(r);t(n)}catch{}finally{d.current=null}},[o]);return M(()=>{const e=a[a.length-1];return e&&0==e.chunks?.length&&!e.loading&&b(e.id),()=>{d.current&&d.current.abort()}},[]),M(()=>{if(n!=u.current){u.current=n,d.current&&d.current.abort();const e=a[a.length-1];e&&0==e.chunks?.length&&!e.loading&&b(e.id)}},[n]),{send:v,resume:y,suggest:x}}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.
|
|
74
|
+
width: 1.5rem;
|
|
75
|
+
height: 1.5rem;
|
|
76
76
|
border-radius: .5rem;
|
|
77
77
|
outline: none;
|
|
78
78
|
border: none;
|
|
@@ -88,12 +88,12 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
88
88
|
background-color: var(--bs-gray-200);
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
`;let
|
|
91
|
+
`;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=F(),[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
92
|
position: absolute;
|
|
93
93
|
--bs-spinner-width: .75rem;
|
|
94
94
|
--bs-spinner-height: .75rem;
|
|
95
95
|
--bs-spinner-border-width: 0.1em;
|
|
96
|
-
`,
|
|
96
|
+
`,Fe=R(({className:t,children:r,size:n,tooltip:i,placement:o,onClick:a,onMouseDown:l},c)=>{const d=e(qe,{ref:c,className:t,onClick:a,onMouseDown:l,$size:n,children:r});return i?e(s,{tooltip:i,placement:o,children:d}):d}),qe=n.div`
|
|
97
97
|
width: 2rem;
|
|
98
98
|
height: 2rem;
|
|
99
99
|
align-items: center;
|
|
@@ -117,10 +117,10 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
117
117
|
&:hover {
|
|
118
118
|
background-color: var(--bs-secondary-bg-subtle);
|
|
119
119
|
}
|
|
120
|
-
`;function
|
|
120
|
+
`;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(Fe,{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:Fe,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
121
|
padding: 0;
|
|
122
122
|
overflow: hidden;
|
|
123
|
-
`,
|
|
123
|
+
`,Ie=n.div`
|
|
124
124
|
gap: .5rem;
|
|
125
125
|
display: flex;
|
|
126
126
|
cursor: pointer;
|
|
@@ -139,40 +139,50 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
139
139
|
display: block;
|
|
140
140
|
}
|
|
141
141
|
}
|
|
142
|
-
`,
|
|
142
|
+
`,Ae=n(m)`
|
|
143
143
|
display: flex;
|
|
144
144
|
flex-direction: column;
|
|
145
145
|
padding: .5rem;
|
|
146
|
-
`,
|
|
146
|
+
`,De=n.div`
|
|
147
147
|
height: 100%;
|
|
148
148
|
overflow-y: auto;
|
|
149
|
-
`,
|
|
149
|
+
`,Le=n.div`
|
|
150
150
|
display: flex;
|
|
151
151
|
align-items: center;
|
|
152
152
|
justify-content: space-between;
|
|
153
153
|
gap: 0.5rem;
|
|
154
154
|
flex: 1;
|
|
155
155
|
margin-right: .5rem;
|
|
156
|
-
`,
|
|
156
|
+
`,Pe=n.div`
|
|
157
157
|
display: flex;
|
|
158
158
|
align-items: center;
|
|
159
159
|
gap: 0.5rem;
|
|
160
|
-
`;var
|
|
160
|
+
`;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(Fe,{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
161
|
display: flex;
|
|
162
162
|
gap: .25rem;
|
|
163
163
|
margin-left: auto;
|
|
164
|
-
`,
|
|
164
|
+
`,Qe=n.div`
|
|
165
165
|
margin-bottom: .5rem;
|
|
166
166
|
display: flex;
|
|
167
167
|
padding: 0 .125rem;
|
|
168
|
-
|
|
168
|
+
`;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=F(null),[m,h]=S(""),p=q(()=>{const e=u.current;if(!e)return;e.focus();const t=e.value.length;e.setSelectionRange(t,t)},[]),g=q(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)`
|
|
169
|
+
min-height: calc(1.5em + 1rem);
|
|
170
|
+
width: 100%;
|
|
171
|
+
padding: 0.5rem 0.5rem 0.5rem 0.75rem;
|
|
172
|
+
border: 0;
|
|
173
|
+
outline: none;
|
|
174
|
+
resize: none;
|
|
175
|
+
flex: 1;
|
|
176
|
+
line-height: 1.5;
|
|
177
|
+
background: transparent;
|
|
178
|
+
`;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发送",onEvent:y},x){const w=F(null),k=F(null),E=F(null),[N,j]=S(""),[C,$]=S(""),[R,A]=v([]),[D,P]=S(!1),T=n&&n.length>0?n:ke,{send:O,resume:B,suggest:U}=Ee(),H=z(()=>({onSuccess(){r&&U()},onComplete(){requestAnimationFrame(()=>{E.current?.focus()})},onEvent:y}),[r,y]),{messages:Q,loading:J,request:K,setInput:W}=he(H),[X,V]=S();M(()=>{const e=Q.filter(e=>!!e.query);V(e.at(-1)?.variables)},[Q]),M(()=>{!n&&R.length>0&&A([])},[n]),M(()=>{const e=o.current;if(e&&O){const t=e=>{if(e.target instanceof HTMLAnchorElement&&"#!question"===e.target.hash){e.preventDefault();const t={query:e.target.text};a&&(t.variables={...X,...a.values}),O(t)}};return e.addEventListener("click",t),()=>{e.removeEventListener("click",t)}}},[a,X]);const Y=q(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=>!(!T.includes("*")&&!T.includes(L.extname(e.name)))&&!(e.size>20971520)).slice(0,6-R.length);return 0!==t.length&&(A(e=>{e.push(...t.map(e=>({file:e})))}),t.forEach(async e=>{try{const t=new FormData;t.set("file",e);const r=await K({method:"POST",url:"/upload",data:t});A(t=>{const n=t.find(t=>t.file===e);n&&(n.path=r.path)})}catch(t){const r=c(t)?t.message:"unknown error";A(t=>{const n=t.find(t=>t.file===e);n&&(n.error=r)})}}),!0)},[R.length,T,K,A]),G=q(({target:e})=>{e.files&&Y(Array.from(e.files)),e.value=""},[Y]),Z=q(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&&Y(n)&&e.preventDefault()},[Y]),ee=R.flatMap(({file:e,path:t})=>t?[{name:e.name,size:e.size,path:t}]:[]),te=q(()=>{if(N||ee.length>0){const e={query:N,files:ee};a&&(e.variables={...X,...a.values}),C&&(e.quote=C),O(e),E.current?.setContent(""),$(""),A([]),k.current?.stop(!0)}},[N,ee,a,X,C]),re=z(()=>({setQuery(e){E.current?.setContent(e)},setQuote:$,send:O,resume:B,focus(){E.current?.focus()}}),[$,O,B]);if(M(()=>{W(re)},[re]),I(x,()=>re,[re]),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(X))return e(Ve,{children:e(Xe,{children:e(Ne,{values:X,variables:t,onSubmit:({formData:e})=>{if(r(e,!0))return V(e),!0}})})})}return t(nt,{children:[m&&e(_e,{actions:h,children:m}),t(rt,{$focused:D&&!J,children:[R.length>0&&e(Ge,{children:R.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:()=>{A(e=>{const r=e.findIndex(e=>e.file===t);-1!==r&&e.splice(r,1)})}},i)})}),!!C&&t(tt,{children:[e("i",{className:"bi bi-quote"}),e("p",{children:C}),e(_,{onClick:()=>$("")})]}),t(Ze,{children:[f?.({Component:Je,props:{ref:E,readonly:J||p,autoFocus:g,placeholder:b,minRows:l,maxRows:d,onSubmit:te,onFocusedChange:P,onQueryChange:j,onPaste:Z}})||e(Je,{ref:E,readonly:J||p,autoFocus:g,placeholder:b,minRows:l,maxRows:d,onSubmit:te,onFocusedChange:P,onQueryChange:j,onPaste:Z}),t(et,{children:[n&&e(s,{tooltip:"可上传不超过6个小于20MB的文件",placement:"top",children:t(je,{disabled:R.length>=6,onClick:()=>w.current?.click(),children:[e("input",{onChange:G,multiple:!0,accept:T.join(","),ref:w,type:"file",hidden:!0}),e("i",{className:"bi bi-file-earmark-arrow-up"})]})}),i&&e(Me,{ref:k,model:i.model,onResult:e=>{E.current?.setContent(t=>t+e+" ")}}),e(je,{className:"text-primary",disabled:!N&&0===ee.length,onClick:e=>{e.preventDefault(),te()},children:e("i",{className:"bi bi-send-fill"})})]})]})]})]})});const Xe=n.div`
|
|
169
179
|
border-radius: var(--bs-border-radius-lg);
|
|
170
180
|
box-shadow: var(--bs-box-shadow-sm);
|
|
171
181
|
margin: 1rem;
|
|
172
182
|
padding: 1rem;
|
|
173
183
|
width: 100%;
|
|
174
184
|
max-width: 500px;
|
|
175
|
-
`,
|
|
185
|
+
`,Ve=n.div`
|
|
176
186
|
position: absolute;
|
|
177
187
|
left: 0;
|
|
178
188
|
right: 0;
|
|
@@ -182,64 +192,25 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
182
192
|
display: flex;
|
|
183
193
|
justify-content: center;
|
|
184
194
|
align-items: center;
|
|
185
|
-
`,
|
|
195
|
+
`,Ye=n(be)`
|
|
186
196
|
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`
|
|
197
|
+
`,Ge=n.div`
|
|
232
198
|
display: flex;
|
|
233
199
|
flex-wrap: wrap;
|
|
234
200
|
padding: 0.75rem;
|
|
235
201
|
gap: 0.75rem;
|
|
236
202
|
border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color);
|
|
237
|
-
`,
|
|
203
|
+
`,Ze=n.div`
|
|
238
204
|
display: flex;
|
|
239
|
-
padding: 0.5rem 0.5rem 0.5rem 0.75rem;
|
|
240
205
|
gap: 0.25rem;
|
|
241
206
|
align-items: end;
|
|
242
|
-
|
|
207
|
+
flex-direction: row;
|
|
208
|
+
`,et=n.div`
|
|
209
|
+
display: flex;
|
|
210
|
+
flex-direction: row;
|
|
211
|
+
gap: 0.25rem;
|
|
212
|
+
padding: 0.5rem 0.5rem 0.5rem 0.5rem;
|
|
213
|
+
`,tt=n.div`
|
|
243
214
|
margin: 0.75rem 0.75rem 0 0.75rem;
|
|
244
215
|
padding: 4px 8px;
|
|
245
216
|
display: flex;
|
|
@@ -260,14 +231,14 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
260
231
|
-webkit-box-orient: vertical;
|
|
261
232
|
display: -webkit-box;
|
|
262
233
|
}
|
|
263
|
-
`,
|
|
234
|
+
`,rt=n.div`
|
|
264
235
|
background: #fff;
|
|
265
236
|
border: var(--bs-border-width) var(--bs-border-style) ${e=>e.$focused?"var(--bs-primary)":"var(--bs-border-color)"};
|
|
266
237
|
border-radius: var(--bs-border-radius-lg);
|
|
267
238
|
box-shadow: 0.125rem 0.25rem 0.5rem rgba(0, 0, 0, 0.1);
|
|
268
|
-
`,
|
|
239
|
+
`,nt=n.div`
|
|
269
240
|
margin: 0 1rem 1rem;
|
|
270
|
-
`;function
|
|
241
|
+
`;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}}))}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
242
|
cursor: pointer;
|
|
272
243
|
padding: 2px 10px;
|
|
273
244
|
background-color: #303030;
|
|
@@ -277,7 +248,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
277
248
|
font-size: 12px;
|
|
278
249
|
font-family: initial;
|
|
279
250
|
user-select: none;
|
|
280
|
-
`,
|
|
251
|
+
`,xt=n.div`
|
|
281
252
|
position: absolute;
|
|
282
253
|
right: 10px;
|
|
283
254
|
top: 1em;
|
|
@@ -291,17 +262,17 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
291
262
|
&:hover {
|
|
292
263
|
opacity: 1;
|
|
293
264
|
}
|
|
294
|
-
`,
|
|
265
|
+
`,wt=n.div`
|
|
295
266
|
position: relative;
|
|
296
267
|
|
|
297
268
|
&:hover {
|
|
298
|
-
${
|
|
269
|
+
${xt} {
|
|
299
270
|
pointer-events: all;
|
|
300
271
|
transform: translateX(0px);
|
|
301
272
|
opacity: 0.7;
|
|
302
273
|
}
|
|
303
274
|
}
|
|
304
|
-
`,
|
|
275
|
+
`,kt=n.div`
|
|
305
276
|
-ms-text-size-adjust: 100%;
|
|
306
277
|
-webkit-text-size-adjust: 100%;
|
|
307
278
|
line-height: 1.8;
|
|
@@ -571,7 +542,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
571
542
|
.hljs-strong {
|
|
572
543
|
font-weight: 700;
|
|
573
544
|
}
|
|
574
|
-
`;var
|
|
545
|
+
`;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
546
|
align-items: center;
|
|
576
547
|
justify-content: center;
|
|
577
548
|
border-radius: .375rem;
|
|
@@ -604,7 +575,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
604
575
|
`}
|
|
605
576
|
|
|
606
577
|
}
|
|
607
|
-
`,
|
|
578
|
+
`,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
579
|
margin-bottom: .5rem;
|
|
609
580
|
margin-top: .5rem;
|
|
610
581
|
border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color);
|
|
@@ -629,7 +600,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
629
600
|
max-height: 100%;
|
|
630
601
|
max-width: 100%;
|
|
631
602
|
}
|
|
632
|
-
`,
|
|
603
|
+
`,Ft=C(null);function qt(){const e=$(Ft);if(!e)throw new Error("useContext must be used within a Provider");return e}function Rt({children:t,...r}){return e(Ft.Provider,{value:r,children:t})}function zt({description:r,options:n}){const{resume:i,disabled:o,response:s}=qt(),[a,l]=S(s?.result),c=o||void 0!==a;return t(It,{children:[r&&e(At,{children:r}),n.map((t,r)=>e(Dt,{$selected:a===t,$disabled:c,onClick:()=>(e=>{c||(l(e),i(e))})(t),children:t},r))]})}const It=n.div`
|
|
633
604
|
display: flex;
|
|
634
605
|
flex-direction: column;
|
|
635
606
|
gap: 0.5rem;
|
|
@@ -642,10 +613,10 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
642
613
|
&:last-child {
|
|
643
614
|
margin-bottom: 0;
|
|
644
615
|
}
|
|
645
|
-
`,
|
|
616
|
+
`,At=n.div`
|
|
646
617
|
color: var(--bs-secondary);
|
|
647
618
|
line-height: 1.5;
|
|
648
|
-
`,
|
|
619
|
+
`,Dt=n.div`
|
|
649
620
|
padding: 0.375rem 0.75rem;
|
|
650
621
|
background-color: ${e=>e.$selected?"rgba(var(--bs-primary-rgb), 0.1)":"#FFFFFF"};
|
|
651
622
|
border: 1px solid ${e=>e.$selected?"rgba(var(--bs-primary-rgb), 0.3)":"var(--bs-border-color)"};
|
|
@@ -664,7 +635,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
664
635
|
&:active {
|
|
665
636
|
transform: ${e=>e.$disabled?"none":"scale(0.98)"};
|
|
666
637
|
}
|
|
667
|
-
`;function
|
|
638
|
+
`;function Lt({description:r,fields:n}){const{resume:i,disabled:o,response:s}=qt(),[a,l]=S(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(Tt,{className:"rounded bg-white shadow-sm",children:[r&&e(Ot,{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(Pt,{children:t})})]})}const Pt=n.div`
|
|
668
639
|
display: flex;
|
|
669
640
|
justify-content: flex-end;
|
|
670
641
|
border-top: 1px solid var(--bs-border-color);
|
|
@@ -672,7 +643,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
672
643
|
button {
|
|
673
644
|
padding: .25rem;
|
|
674
645
|
}
|
|
675
|
-
`,
|
|
646
|
+
`,Tt=n.div`
|
|
676
647
|
display: flex;
|
|
677
648
|
flex-direction: column;
|
|
678
649
|
gap: 0.5rem;
|
|
@@ -690,10 +661,10 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
690
661
|
&:last-child {
|
|
691
662
|
margin-bottom: 0;
|
|
692
663
|
}
|
|
693
|
-
`,
|
|
664
|
+
`,Ot=n.div`
|
|
694
665
|
color: var(--bs-secondary);
|
|
695
666
|
line-height: 1.5;
|
|
696
|
-
`;function
|
|
667
|
+
`;function Bt({content:r}){const{resume:n,disabled:i,response:o}=qt(),[s,a]=S(void 0!==o),l=i||s;return t(Ut,{className:"rounded bg-white shadow-sm",children:[r&&e(_t,{children:e(vt,{content:r})}),e(Ht,{children:e(k,{disabled:l,onClick:()=>{l||(a(!0),n("已确认"))},children:s?"已确认":"确认"})})]})}const Ut=n.div`
|
|
697
668
|
display: flex;
|
|
698
669
|
flex-direction: column;
|
|
699
670
|
gap: .5rem;
|
|
@@ -707,10 +678,10 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
707
678
|
&:last-child {
|
|
708
679
|
margin-bottom: 0;
|
|
709
680
|
}
|
|
710
|
-
`,
|
|
681
|
+
`,_t=n.div`
|
|
711
682
|
line-height: 1.6;
|
|
712
683
|
color: var(--bs-body-color);
|
|
713
|
-
`,
|
|
684
|
+
`,Ht=n.div`
|
|
714
685
|
display: flex;
|
|
715
686
|
justify-content: flex-end;
|
|
716
687
|
border-top: 1px solid var(--bs-border-color);
|
|
@@ -719,7 +690,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
719
690
|
button {
|
|
720
691
|
padding: .25rem 1.5rem;
|
|
721
692
|
}
|
|
722
|
-
`;function
|
|
693
|
+
`;function Qt({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=q(e=>{l({chunk:n,tool:o,payload:e})},[]);let d=null;switch(t.type){case"select":d=e(zt,{...t.select});break;case"form":d=e(Lt,{...t.form});break;case"confirm":d=e(Bt,{...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 Jt({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(Qt,{suspend:t.suspend}):null;return Array.isArray(t)?e(r,{children:t.map((t,r)=>e(A,{children:i(t)},r))}):i(t)}const Kt=({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"})]})})})},Wt=D(t=>{const{renderReasoning:r}=he();return r?r({Component:Kt,props:t}):e(Kt,{...t})});class Xt{#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 Vt=new Map;class Yt{#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?(Vt.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),Vt.delete(this)}start(e,t=!1){Vt.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=Vt.get(this);e&&(e.pause(),e.currentTime=0)}onPlaying(e){this.#t.on("playing",e)}onSpeaking(e){this.#t.on("speaking",e)}}function Gt({text:e,loading:t,loader:r}){const n=F(),[i,o]=S(!1),[s,a]=S(!1),l=F(t),c=async(i=!1)=>{n.current||(n.current=r?new Yt(r):new Xt,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 Zt({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}=Gt({loader:c,text:s,loading:o&&i});let p=null;return a.current&&(u&&(p=oe(e(er,{children:e(T,{size:"sm",variant:"light"})}),a.current)),d&&(p=oe(e(er,{children:e(tr,{className:"bi bi-volume-down-fill text-light"})}),a.current))),t(Et,{disabled:i&&!d,onClick:()=>{d?h():m()},children:[d?e(tr,{className:"bi bi-volume-down-fill"}):u?e(T,{size:"sm",variant:"primary"}):e(tr,{className:"bi bi-volume-down"}),p]})}const er=n.div`
|
|
723
694
|
position: absolute;
|
|
724
695
|
top: 0;
|
|
725
696
|
left: 0;
|
|
@@ -729,27 +700,27 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
729
700
|
align-items: center;
|
|
730
701
|
justify-content: center;
|
|
731
702
|
background-color: rgba(0, 0, 0, .3);
|
|
732
|
-
`,
|
|
703
|
+
`,tr=n.i`
|
|
733
704
|
|
|
734
705
|
&::before {
|
|
735
706
|
transform: scale(1.4)
|
|
736
707
|
}
|
|
737
|
-
`;function
|
|
708
|
+
`;function rr({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(ir,{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(ir,{className:"border-top p-2",children:r.response||"None"})]})]}),l=r.content&&e(Jt,{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(nr,{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 nr=n.div`
|
|
738
709
|
width: ${e=>e.$open?"auto":"fit-content"};
|
|
739
710
|
max-width: 100%;
|
|
740
711
|
overflow:hidden;
|
|
741
|
-
`,
|
|
712
|
+
`,ir=n.div`
|
|
742
713
|
white-space: pre-wrap;
|
|
743
714
|
overflow-y: auto;
|
|
744
715
|
overflow-x: hidden;
|
|
745
716
|
max-height: 150px;
|
|
746
|
-
`;function
|
|
717
|
+
`;function or({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(ar,{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(lr,{className:"me-2 text-truncate",children:r.title}),e("span",{className:"me-auto"}),!s&&e("span",{className:"text-nowrap text-muted",children:sr(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 sr=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`,ar=n.div`
|
|
747
718
|
svg {
|
|
748
719
|
flex-shrink: 0;
|
|
749
720
|
}
|
|
750
|
-
`,
|
|
721
|
+
`,lr=n.span`
|
|
751
722
|
display: inline-block;
|
|
752
|
-
`;function
|
|
723
|
+
`;function cr({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(or,{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 dr=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=F(null),k=F(null),N=F(null),j=z(()=>m?.flatMap(e=>e.node?[e.node]:[])||[],[m]),C=c||u.length>0;return t(r,{children:[C&&t(wr,{$reverse:!0,children:[g&&e(vr,{children:e("img",{src:g.avatar})}),e(yr,{}),t(xr,{ref:x,children:[c&&e(vt,{content:c}),d&&e(H,{trigger:"click",container:x,rootClose:!0,placement:"bottom",overlay:e(ur,{body:!0,children:d}),children:e(hr,{children:e(mr,{children:d})})}),u.length>0&&u.map(({name:t,size:r,path:n},i)=>E(n)?e(Mt,{src:`/uploads/${n}`},i):e(gr,{children:e(be,{name:t,url:`/uploads/${n}`,size:r})},i))]})]}),m&&t(wr,{children:[f&&e(vr,{ref:k,children:e("img",{src:f.avatar})}),e(yr,{}),t(xr,{children:[C&&!1!==i&&t(fr,{children:[e(w,{placement:"top",content:y,as:Et,tooltip:!0}),a&&e(Zt,{loading:n.loading,avatarRef:k,contentRef:N,...a}),i?.({Component:Et,message:n,content:y,setMessage:o,messages:v})]}),e(br,{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(pr,{ref:N,$deleted:!!h,children:["all"===b&&j.length>0&&e(cr,{loading:p,nodes:j}),m.map((r,n)=>t(A,{children:[r.reasoning&&["stats","all"].includes(b)&&e(Wt,{reasoning:r.reasoning,loading:!r.content&&0===(r.tools||[]).length}),r.content&&e(Ct,{value:{chunkIndex:n,chunk:r,isLastMessage:l},children:e(Jt,{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(rr,{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,{})]})]})]})}),ur=n(Q)`
|
|
753
724
|
max-width: calc(100% - .875rem * 2);
|
|
754
725
|
width: calc(100% - .875rem * 2);
|
|
755
726
|
font-size: 1rem;
|
|
@@ -758,25 +729,25 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
758
729
|
.popover-body {
|
|
759
730
|
padding: .5rem .75rem;
|
|
760
731
|
}
|
|
761
|
-
`,
|
|
732
|
+
`,mr=n.div`
|
|
762
733
|
overflow: hidden;
|
|
763
734
|
text-overflow: ellipsis;
|
|
764
735
|
word-break: break-all;
|
|
765
736
|
-webkit-line-clamp: 2;
|
|
766
737
|
-webkit-box-orient: vertical;
|
|
767
738
|
display: -webkit-box;
|
|
768
|
-
`,
|
|
739
|
+
`,hr=n.div`
|
|
769
740
|
padding: .5rem .75rem;
|
|
770
741
|
color: var(--bs-secondary);
|
|
771
742
|
border-radius: var(--bs-border-radius-lg);
|
|
772
743
|
background: #FFFFFF;
|
|
773
744
|
cursor: pointer;
|
|
774
|
-
|
|
745
|
+
`,pr=n.div`
|
|
775
746
|
${e=>e.$deleted&&i`
|
|
776
747
|
text-decoration-line: line-through;
|
|
777
748
|
color: var(--bs-secondary);
|
|
778
749
|
`}
|
|
779
|
-
`,
|
|
750
|
+
`,gr=n.div`
|
|
780
751
|
width: 100%;
|
|
781
752
|
margin-bottom: .5rem;
|
|
782
753
|
margin-top: .5rem;
|
|
@@ -788,7 +759,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
788
759
|
&:last-child {
|
|
789
760
|
margin-bottom: 0;
|
|
790
761
|
}
|
|
791
|
-
`,
|
|
762
|
+
`,fr=n.div`
|
|
792
763
|
position: absolute;
|
|
793
764
|
top: -1.1rem;
|
|
794
765
|
right: 0;
|
|
@@ -796,7 +767,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
796
767
|
gap: .5rem;
|
|
797
768
|
opacity: 0;
|
|
798
769
|
z-index: 1;
|
|
799
|
-
`,
|
|
770
|
+
`,br=n.div`
|
|
800
771
|
position: absolute;
|
|
801
772
|
bottom: -1.4rem;
|
|
802
773
|
left: 0;
|
|
@@ -809,7 +780,7 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
809
780
|
display: flex;
|
|
810
781
|
opacity: 0;
|
|
811
782
|
z-index: 1;
|
|
812
|
-
`,
|
|
783
|
+
`,vr=n.div`
|
|
813
784
|
width: 35px;
|
|
814
785
|
height: 35px;
|
|
815
786
|
border-radius: 50%;
|
|
@@ -820,14 +791,14 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
820
791
|
width: 100%;
|
|
821
792
|
height: 100%;
|
|
822
793
|
}
|
|
823
|
-
`,
|
|
794
|
+
`,yr=n.div`
|
|
824
795
|
width: 0;
|
|
825
796
|
height: 0;
|
|
826
797
|
content: "";
|
|
827
798
|
border: 5px solid transparent;
|
|
828
799
|
border-right-color: #f3f3f3;
|
|
829
800
|
transform: translateY(10px);
|
|
830
|
-
`,
|
|
801
|
+
`,xr=n.div`
|
|
831
802
|
padding: .875rem;
|
|
832
803
|
background-color: rgb(243, 243, 243);
|
|
833
804
|
border-radius: var(--bs-border-radius-lg);
|
|
@@ -835,31 +806,31 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
835
806
|
position: relative;
|
|
836
807
|
|
|
837
808
|
&:hover {
|
|
838
|
-
${
|
|
809
|
+
${br}, ${fr} {
|
|
839
810
|
opacity: 1;
|
|
840
811
|
}
|
|
841
812
|
}
|
|
842
|
-
`,
|
|
813
|
+
`,wr=n.div`
|
|
843
814
|
display: flex;
|
|
844
815
|
justify-content: flex-start;
|
|
845
816
|
padding: 1rem 0 1rem 0;
|
|
846
817
|
${e=>e.$reverse&&i`
|
|
847
818
|
flex-direction: row-reverse;
|
|
848
819
|
|
|
849
|
-
${
|
|
820
|
+
${yr} {
|
|
850
821
|
border-left-color: rgba(var(--bs-primary-rgb), 0.1);
|
|
851
822
|
border-right-color: transparent;
|
|
852
823
|
}
|
|
853
824
|
|
|
854
|
-
${
|
|
825
|
+
${xr} {
|
|
855
826
|
background: rgba(var(--bs-primary-rgb), 0.1);
|
|
856
827
|
}
|
|
857
828
|
`};
|
|
858
|
-
`;function
|
|
829
|
+
`;function kr(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=F(r.loaded),g=q(()=>{const e=l.current;e&&requestAnimationFrame(()=>{e.scrollTo({top:e.scrollHeight})})},[]),f=F(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(Er,{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:dr,props:n},r):e(dr,{...n},r)}),m.length>0&&e(Nr,{children:m.map((t,r)=>e("a",{href:"#!question",children:t},r))})]})}const Er=n.div`
|
|
859
830
|
display: flex;
|
|
860
831
|
flex-direction: column;
|
|
861
832
|
flex: 1;
|
|
862
|
-
`,
|
|
833
|
+
`,Nr=n.div`
|
|
863
834
|
display: flex;
|
|
864
835
|
flex-direction: column;
|
|
865
836
|
align-items: flex-start;
|
|
@@ -876,16 +847,16 @@ import{jsx as e,jsxs as t,Fragment as r}from"react/jsx-runtime";import{styled as
|
|
|
876
847
|
background: var(--bs-secondary-bg-subtle);
|
|
877
848
|
}
|
|
878
849
|
}
|
|
879
|
-
`,
|
|
850
|
+
`,jr=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 $=q(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=F(null),[U,_]=S([]),H=q(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($r,{className:r,children:t(x,{children:[e(Cr,{ref:B,children:e(kr,{placeholder:c,cite:h,actions:d,loaded:!o,speech:p,renderItem:g,scrollRef:B})}),o&&e(We,{...o,scrollRef:B})]})})})}),W),Cr=n.div`
|
|
880
851
|
display: flex;
|
|
881
852
|
flex-direction: column;
|
|
882
853
|
flex: 1;
|
|
883
854
|
overflow-y: auto;
|
|
884
855
|
padding: 0 1rem;
|
|
885
856
|
margin-bottom: .5rem;
|
|
886
|
-
|
|
857
|
+
`,$r=n.div`
|
|
887
858
|
display: flex;
|
|
888
859
|
flex-direction: column;
|
|
889
860
|
height: 100%;
|
|
890
861
|
position: relative;
|
|
891
|
-
`;async function
|
|
862
|
+
`;async function Mr(e){const t=await ae().use(ce).use(Z).use(ee).use(te).use(de).use(le).process(e);return String(t)}export{Fe as ActionButton,Je as EditableInput,be as FileItem,vt as Markdown,jr as MessageBox,Ne as VariableForm,ue as isToolMessage,Mr as md2html,ot as pickQuestions,he as useMessageContext,Gt 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.5",
|
|
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.4",
|
|
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": "5b926446ee583f2265247e1b937fc2fac53519a5",
|
|
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';
|
|
@@ -42,7 +43,9 @@ export interface MessageBoxProps {
|
|
|
42
43
|
minRows?: number;
|
|
43
44
|
suggestion?: boolean;
|
|
44
45
|
toolbar?: ReactNode;
|
|
46
|
+
toolbarActions?: ReactNode;
|
|
45
47
|
autoFocus?: boolean;
|
|
48
|
+
renderEditableInput?: RenderEditableInput;
|
|
46
49
|
placeholder?: string;
|
|
47
50
|
variables?: {
|
|
48
51
|
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,7 +1,12 @@
|
|
|
1
|
-
import { MutableRefObject, ReactNode } from 'react';
|
|
1
|
+
import { ForwardRefExoticComponent, MutableRefObject, RefAttributes, ReactNode } 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;
|
|
6
11
|
variables?: {
|
|
7
12
|
config: Variable[];
|
|
@@ -15,13 +20,15 @@ interface Props {
|
|
|
15
20
|
maxRows?: number;
|
|
16
21
|
scrollRef: MutableRefObject<HTMLDivElement | null>;
|
|
17
22
|
toolbar?: ReactNode | true;
|
|
23
|
+
toolbarActions?: ReactNode;
|
|
18
24
|
disabled?: boolean;
|
|
19
25
|
placeholder?: string;
|
|
20
26
|
autoFocus?: boolean;
|
|
27
|
+
renderEditableInput?: RenderEditableInput;
|
|
21
28
|
onEvent?: (event: {
|
|
22
29
|
type: string;
|
|
23
30
|
data?: any;
|
|
24
31
|
}) => void;
|
|
25
32
|
}
|
|
26
|
-
declare const _default:
|
|
33
|
+
declare const _default: ForwardRefExoticComponent<Props & RefAttributes<Input>>;
|
|
27
34
|
export default _default;
|
|
@@ -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,6 @@
|
|
|
1
|
+
import { Message } from '../../../types';
|
|
1
2
|
export default function useChat(): {
|
|
2
|
-
send: (params: string | import("../../..").SendParams, files?:
|
|
3
|
+
send: (params: string | import("../../..").SendParams, files?: Message["files"], variables?: Message["variables"]) => Promise<void>;
|
|
3
4
|
resume: (params: import("../../..").ResumeParams) => Promise<void>;
|
|
4
5
|
suggest: () => Promise<void>;
|
|
5
6
|
};
|
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;
|
|
@@ -153,7 +152,6 @@ export interface MessageBoxType {
|
|
|
153
152
|
reset(conversation?: Conversation): void;
|
|
154
153
|
}
|
|
155
154
|
export interface Input extends Chat {
|
|
156
|
-
editor: Editor;
|
|
157
155
|
setQuery(query: string): void;
|
|
158
156
|
setQuote(quote: string): void;
|
|
159
157
|
focus(): void;
|