@topthink/chat 1.0.7 → 1.0.9

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.
Files changed (2) hide show
  1. package/es/index.js +2 -2
  2. package/package.json +3 -3
package/es/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import*as e from"react";import{useCallback as r,useState as t,useImperativeHandle as o,memo as n,useRef as i,Fragment as s,useEffect as a}from"react";import{useImmer as l,request as c,isRequestError as d,Lightbox as m,styled as h,Clipboard as p,css as u,formatSize as g,Tooltip as f,useAsync as b,isImageUrl as v,getAbsoluteUrl as x}from"@topthink/components";import{jsx as y,jsxs as k,Fragment as w}from"react/jsx-runtime";import j from"react-markdown";import"katex/dist/katex.min.css";import N from"remark-math";import z from"remark-breaks";import M from"remark-gfm";import E from"rehype-katex";import $ from"rehype-highlight";import{Spinner as q}from"react-bootstrap";import*as C from"path";import F from"path";import P from"react-textarea-autosize";function R(e){let{url:n,transformRequest:i,onboarding:s,onSuccess:a,ref:m,...h}=e;const p=r((e=>{const r=[];if(s){let e=s.questions.filter((e=>!!e.trim()));if(e.length>3){const r=[...e];let t=e.length-3;for(;t--;){let e=Math.floor(Math.random()*r.length);r.splice(e,1)}e=r}r.push({chunks:[{content:[s.prologue,...e.map((e=>`[${e}](#!question)`))].join("\n"),tools:[]}]})}return e?r.concat(e.messages):r}),[s]),[u,g]=l((()=>p(h.conversation))),[f,b]=t(!1),[v,x]=t(h.conversation?.id),y=r((async function(e){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];if(e||r.length>0){b(!0),g((t=>{t.push({query:e,files:r,chunks:[],loading:!0})}));let t=0,o="";try{await c({method:"post",url:n,data:{query:e,files:r,conversation:v},transformRequest:i,onDownloadProgress:e=>{const r=e.target,{responseText:n}=r;for(;t<e.loaded;){const e=n.substring(t,++t);if(o+=e,"\n"===e){const e=o.match(/^data:(?<data>.*)/);if(e){const r=e.groups.data.trim();if("[DONE]"!=r)try{const e=JSON.parse(r);e.conversation?x(e.conversation):g((r=>{const t=r[r.length-1];if(t.chunks)if(e.chunks){const r=e.chunks.index;if(t.chunks[r]||(t.chunks[r]={content:"",tools:[]}),e.chunks.error)t.chunks[r].error=e.chunks.error;else if(e.chunks.tools){const o=e.chunks.tools.index;"response"in e.chunks.tools?(t.chunks[r].tools[o].response=e.chunks.tools.response,t.chunks[r].tools[o].error=e.chunks.tools.error):"content"in e.chunks.tools?t.chunks[r].tools[o].content=e.chunks.tools.content:t.chunks[r].tools[o]={name:e.chunks.tools.name,title:e.chunks.tools.title,arguments:e.chunks.tools.arguments}}else e.chunks.content&&(t.chunks[r].content+=e.chunks.content)}else e.stats&&(t.stats=e.stats)}))}catch(e){console.error(e)}else g((e=>{e[e.length-1].loading=!1}))}o=""}}}})}catch(e){let r="未知错误";d(e)&&(r=401==e.response?.status?"未授权或授权已过期,请刷新页面后重试":"string"==typeof e.errors?e.errors:Object.values(e.errors).join("\n")),g((e=>{const t=e[e.length-1];t.chunks&&(0===t.chunks.length?t.chunks=[{content:`[${r}]`,tools:[]}]:t.chunks[t.chunks.length-1].content=`[${r}]`),t.loading=!1}))}b(!1),a?.()}}),[i,v]),k=r((e=>{f||(x(e?.id),g(p(e)))}),[f,p]);return o(m,(()=>({reset:k,send:y}))),{messages:u,loading:f,send:y,reset:k}}const T=m.Image,_=n((e=>{let{content:r,components:t}=e;return y(A,{remarkPlugins:[[N,{singleDollarTextMath:!1}],M,z],rehypePlugins:[E,[$,{detect:!1,ignoreMissing:!0}]],components:{pre:e=>{let{children:r}=e;const t=i(null);return k(O,{ref:t,children:[y(D,{tooltip:!1,content:()=>{const e=t.current?.getElementsByTagName("code");return e?.[0]?.innerText||""}}),r]})},a:e=>{let{node:r,href:t,...o}=e;const n=t?.startsWith("http")?"_blank":"_self";return y("a",{...o,href:t,target:n})},img:e=>{let{node:r,...t}=e;return y(T,{...t})},...t},children:r})})),D=h(p)`
1
+ import*as e from"react";import{useCallback as r,useState as t,useImperativeHandle as o,memo as n,useRef as i,Fragment as s,useEffect as a}from"react";import{useImmer as l,request as c,isRequestError as d,Lightbox as m,styled as h,Clipboard as p,css as u,formatSize as g,Tooltip as f,useAsync as b,isImageUrl as v,getAbsoluteUrl as x}from"@topthink/components";import{jsx as y,jsxs as k,Fragment as w}from"react/jsx-runtime";import j from"react-markdown";import"katex/dist/katex.min.css";import N from"remark-math";import z from"remark-breaks";import $ from"remark-gfm";import M from"rehype-katex";import E from"rehype-highlight";import{Spinner as q}from"react-bootstrap";import*as C from"path";import F from"path";import P from"react-textarea-autosize";function R(e){let{url:n,transformRequest:i,onboarding:s,onSuccess:a,ref:m,...h}=e;const p=r((e=>{const r=[];if(s){let e=s.questions.filter((e=>!!e.trim()));if(e.length>3){const r=[...e];let t=e.length-3;for(;t--;){let e=Math.floor(Math.random()*r.length);r.splice(e,1)}e=r}r.push({chunks:[{content:[s.prologue,...e.map((e=>`[${e}](#!question)`))].join("\n"),tools:[]}]})}return e?r.concat(e.messages):r}),[s]),[u,g]=l((()=>p(h.conversation))),[f,b]=t(!1),[v,x]=t(h.conversation?.id),y=r((async function(e){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];if(e||r.length>0){b(!0),g((t=>{t.push({query:e,files:r,chunks:[],loading:!0})}));let t=0,o="";try{await c({method:"post",url:n,data:{query:e,files:r,conversation:v},transformRequest:i,onDownloadProgress:e=>{const r=e.target,{responseText:n}=r;for(;t<e.loaded;){const e=n.substring(t,++t);if(o+=e,"\n"===e){const e=o.match(/^data:(?<data>.*)/);if(e){const r=e.groups.data.trim();if("[DONE]"!=r)try{const e=JSON.parse(r);e.conversation?x(e.conversation):g((r=>{const t=r[r.length-1];if(t.chunks)if(e.chunks){const r=e.chunks.index;if(t.chunks[r]||(t.chunks[r]={content:"",tools:[]}),e.chunks.error)t.chunks[r].error=e.chunks.error;else if(e.chunks.tools){const o=e.chunks.tools.index;"response"in e.chunks.tools?(t.chunks[r].tools[o].response=e.chunks.tools.response,t.chunks[r].tools[o].error=e.chunks.tools.error):"content"in e.chunks.tools?t.chunks[r].tools[o].content=e.chunks.tools.content:t.chunks[r].tools[o]={name:e.chunks.tools.name,title:e.chunks.tools.title,arguments:e.chunks.tools.arguments}}else e.chunks.content&&(t.chunks[r].content+=e.chunks.content)}else e.stats&&(t.stats=e.stats)}))}catch(e){console.error(e)}else g((e=>{e[e.length-1].loading=!1}))}o=""}}}})}catch(e){let r="未知错误";d(e)&&(r=401==e.response?.status?"未授权或授权已过期,请刷新页面后重试":"string"==typeof e.errors?e.errors:Object.values(e.errors).join("\n")),g((e=>{const t=e[e.length-1];t.chunks&&(0===t.chunks.length?t.chunks=[{content:`[${r}]`,tools:[]}]:t.chunks[t.chunks.length-1].content=`[${r}]`),t.loading=!1}))}b(!1),a?.()}}),[i,v]),k=r((e=>{f||(x(e?.id),g(p(e)))}),[f,p]);return o(m,(()=>({reset:k,send:y}))),{messages:u,loading:f,send:y,reset:k}}const T=m.Image,_=n((e=>{let{content:r,components:t}=e;return r=r.replace(/\\\(\s(.+?)\s\\\)/g,"$$$$ $1 $$$$"),y(A,{remarkPlugins:[[N,{singleDollarTextMath:!1}],$,z],rehypePlugins:[M,[E,{detect:!1,ignoreMissing:!0}]],components:{pre:e=>{let{children:r}=e;const t=i(null);return k(O,{ref:t,children:[y(D,{tooltip:!1,content:()=>{const e=t.current?.getElementsByTagName("code");return e?.[0]?.innerText||""}}),r]})},a:e=>{let{node:r,href:t,...o}=e;const n=t?.startsWith("http")?"_blank":"_self";return y("a",{...o,href:t,target:n})},img:e=>{let{node:r,...t}=e;return y(T,{...t})},...t},children:r})})),D=h(p)`
2
2
  position: absolute;
3
3
  right: 10px;
4
4
  top: 1em;
@@ -504,7 +504,7 @@ import*as e from"react";import{useCallback as r,useState as t,useImperativeHandl
504
504
  }
505
505
  }
506
506
  `};
507
- `,ce=[".txt",".md",".pdf",".docx",".xlsx",".pptx",".png",".jpg"];function de(e){let{chat:o,fileTypes:n,scrollRef:s,onMessages:m,minRows:h,toolbar:p}=e;const u=i(null),g=i(null),[b,v]=t(""),[x,w]=l([]),[j,N]=t(!1),z=n&&n.length>0?n:ce,{loading:M,messages:E,send:$}=R({...o,onSuccess(){requestAnimationFrame((()=>{u.current?.focus()})),o.onSuccess?.()}});a((()=>{m(E)}),[E]),a((()=>{const e=s.current;if(e&&$){const r=e=>{e.target instanceof HTMLAnchorElement&&"#!question"===e.target.hash&&(e.preventDefault(),$(e.target.text))};return e.addEventListener("click",r),()=>{e.removeEventListener("click",r)}}}),[s,$]);const q=r((e=>{let{target:r}=e;if(r.files){const e=Array.from(r.files).filter((e=>!!z.includes(C.extname(e.name))&&(!(e.size>20971520)&&e))).slice(0,6-x.length);w((r=>{r.push(...e.map((e=>({file:e}))))})),e.forEach((async e=>{try{const r=new FormData;r.set("file",e);const t=await c({method:"POST",url:`${o.url}/upload`,transformRequest:o.transformRequest,data:r});w((r=>{const o=r.find((r=>r.file===e));o&&(o.path=t.path)}))}catch(r){const t=d(r)?r.message:"unknown error";w((r=>{const o=r.find((r=>r.file===e));o&&(o.error=t)}))}}))}r.value=""}),[x,z]),F=x.flatMap((e=>{let{file:r,path:t}=e;return t?[{name:r.name,size:r.size,path:t}]:[]})),T=()=>{(b||F.length>0)&&($(b,F),v(""),w([]))};return k(fe,{children:[p,k(ge,{$focused:j,children:[x.length>0&&y(he,{children:x.map(((e,r)=>{let{file:t,error:o,path:n}=e;const i=void 0===o&&void 0===n;return y(me,{name:t.name,size:t.size,error:o,loading:i,onRemove:()=>{w((e=>{const r=e.findIndex((e=>e.file===t));-1!==r&&e.splice(r,1)}))}},r)}))}),k(ue,{children:[y(P,{disabled:M,ref:u,placeholder:"请输入你的问题, Enter+Shift换行, Enter发送",minRows:h,maxRows:5,value:b,onChange:e=>v(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),T())},onFocus:()=>N(!0),onBlur:()=>N(!1)}),n&&y(f,{tooltip:"可上传不超过6个小于20MB的文件",placement:"top",children:k(pe,{disabled:x.length>=6,onClick:()=>g.current?.click(),children:[y("input",{onChange:q,multiple:!0,accept:z.join(","),ref:g,type:"file",hidden:!0}),y("i",{className:"bi bi-file-earmark-arrow-up"})]})}),y(pe,{className:"text-primary",disabled:!b&&0===F.length,onClick:e=>{e.preventDefault(),T()},children:y("i",{className:"bi bi-send-fill"})})]})]})]})}const me=h(Q)`
507
+ `,ce=[".txt",".md",".pdf",".docx",".xlsx",".pptx",".png",".jpg"];function de(e){let{chat:o,fileTypes:n,scrollRef:s,onMessages:m,minRows:h,toolbar:p}=e;const u=i(null),g=i(null),[b,v]=t(""),[x,w]=l([]),[j,N]=t(!1),z=n&&n.length>0?n:ce,{loading:$,messages:M,send:E}=R({...o,onSuccess(){requestAnimationFrame((()=>{u.current?.focus()})),o.onSuccess?.()}});a((()=>{m(M)}),[M]),a((()=>{const e=s.current;if(e&&E){const r=e=>{e.target instanceof HTMLAnchorElement&&"#!question"===e.target.hash&&(e.preventDefault(),E(e.target.text))};return e.addEventListener("click",r),()=>{e.removeEventListener("click",r)}}}),[s,E]);const q=r((e=>{let{target:r}=e;if(r.files){const e=Array.from(r.files).filter((e=>!!z.includes(C.extname(e.name))&&(!(e.size>20971520)&&e))).slice(0,6-x.length);w((r=>{r.push(...e.map((e=>({file:e}))))})),e.forEach((async e=>{try{const r=new FormData;r.set("file",e);const t=await c({method:"POST",url:`${o.url}/upload`,transformRequest:o.transformRequest,data:r});w((r=>{const o=r.find((r=>r.file===e));o&&(o.path=t.path)}))}catch(r){const t=d(r)?r.message:"unknown error";w((r=>{const o=r.find((r=>r.file===e));o&&(o.error=t)}))}}))}r.value=""}),[x,z]),F=x.flatMap((e=>{let{file:r,path:t}=e;return t?[{name:r.name,size:r.size,path:t}]:[]})),T=()=>{(b||F.length>0)&&(E(b,F),v(""),w([]))};return k(fe,{children:[p,k(ge,{$focused:j,children:[x.length>0&&y(he,{children:x.map(((e,r)=>{let{file:t,error:o,path:n}=e;const i=void 0===o&&void 0===n;return y(me,{name:t.name,size:t.size,error:o,loading:i,onRemove:()=>{w((e=>{const r=e.findIndex((e=>e.file===t));-1!==r&&e.splice(r,1)}))}},r)}))}),k(ue,{children:[y(P,{disabled:$,ref:u,placeholder:"请输入你的问题, Enter+Shift换行, Enter发送",minRows:h,maxRows:5,value:b,onChange:e=>v(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),T())},onFocus:()=>N(!0),onBlur:()=>N(!1)}),n&&y(f,{tooltip:"可上传不超过6个小于20MB的文件",placement:"top",children:k(pe,{disabled:x.length>=6,onClick:()=>g.current?.click(),children:[y("input",{onChange:q,multiple:!0,accept:z.join(","),ref:g,type:"file",hidden:!0}),y("i",{className:"bi bi-file-earmark-arrow-up"})]})}),y(pe,{className:"text-primary",disabled:!b&&0===F.length,onClick:e=>{e.preventDefault(),T()},children:y("i",{className:"bi bi-send-fill"})})]})]})]})}const me=h(Q)`
508
508
  width: calc((100% - .75rem) / 2);
509
509
  `,he=h.div`
510
510
  display: flex;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topthink/chat",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "scripts": {
5
5
  "prebuild": "rimraf es types",
6
6
  "build": "rollup -c --environment NODE_ENV:production",
@@ -17,7 +17,7 @@
17
17
  ],
18
18
  "dependencies": {
19
19
  "@babel/runtime": "^7.11.2",
20
- "@topthink/components": "^1.0.82",
20
+ "@topthink/components": "^1.0.83",
21
21
  "katex": "^0.16.9",
22
22
  "react-markdown": "^8.0.7",
23
23
  "react-textarea-autosize": "^8.5.3",
@@ -55,5 +55,5 @@
55
55
  },
56
56
  "author": "yunwuxin <tzzhangyajun@qq.com> (https://github.com/yunwuxin)",
57
57
  "license": "MIT",
58
- "gitHead": "7a8e0fec1fc3f71f9cc2a2286b915fd5cffea89c"
58
+ "gitHead": "567a500d32580507a46a6283934c18962bca4a0f"
59
59
  }