当前位置:   article > 正文

ChatGPT中文版源码_chatgpt源码

chatgpt源码

ChatGPT最近很火爆大家都知道吧,今天废话不多说 直接给大家带来一个ChatGPT中文版的源码

先对整体进行一个介绍,这套源码界面很有科技感,其次是功能方面有专门的指令输入框,让你可以舒舒服服的玩转你手中的prompts

其次有黑夜和白天两个模式以及回到顶部功能

下面废话不多说 直接上代码

由于代码太多 我直接放前端页面的代码

代码是基于nodejs写的

下面是header文件

  1. ---
  2. import Logo from './Logo.astro'
  3. import Themetoggle from './Themetoggle.astro'
  4. ---
  5. <header>
  6. <div class="flex justify-between">
  7. <Logo />
  8. <Themetoggle />
  9. </div>
  10. <div class="flex items-center mt-2">
  11. <span class="text-2xl text-slate font-extrabold mr-1">CTGPT.</span>
  12. <span class="text-2xl text-transparent font-extrabold bg-clip-text bg-gradient-to-r from-sky-400 to-emerald-600">CN</span>
  13. </div>
  14. <p mt-1 text-slate op-60>基于 OpenAI API (gpt-3.5-turbo)开发.</p>
  15. </header>

下面是footer文件

  1. <footer>
  2. <p mt-8 text-xs op-30>
  3. <br>
  4. <a
  5. border-b border-slate border-none hover:border-dashed
  6. href="https://wwji.lanzouf.com/iVoeB0o7wrxe" target="_blank"
  7. >
  8. 安卓端下载
  9. <span px-1>|</span>
  10. </a>
  11. <a
  12. border-b border-slate border-none hover:border-dashed
  13. href="https://wwji.lanzouf.com/iYlRb0o7wryf" target="_blank"
  14. >
  15. 苹果端下载(safari打开安装需要去设置描述文件安装)
  16. </a>
  17. </p>
  18. <script charset="UTF-8" id="LA_COLLECT" src="//sdk.51.la/js-sdk-pro.min.js"></script>
  19. <script>LA.init({id:"Jzntbyt4gmLpmsXz",ck:"Jzntbyt4gmLpmsXz"})</script>
  20. <script>
  21. var _hmt = _hmt || [];
  22. (function() {
  23. var hm = document.createElement("script");
  24. hm.src = "https://hm.baidu.com/hm.js?5aff25b20308b19618d1ea0a4797216b";
  25. var s = document.getElementsByTagName("script")[0];
  26. s.parentNode.insertBefore(hm, s);
  27. })();
  28. </script>
  29. </p>
  30. </footer>

下面是问题框代码

  1. import type { ChatMessage } from '@/types'
  2. import { createSignal, Index, Show } from 'solid-js'
  3. import IconClear from './icons/Clear'
  4. import MessageItem from './MessageItem'
  5. import SystemRoleSettings from './SystemRoleSettings'
  6. import _ from 'lodash'
  7. import { generateSignature } from '@/utils/auth'
  8. export default () => {
  9. let inputRef: HTMLTextAreaElement
  10. const [currentSystemRoleSettings, setCurrentSystemRoleSettings] = createSignal('')
  11. const [systemRoleEditing, setSystemRoleEditing] = createSignal(false)
  12. const [messageList, setMessageList] = createSignal<ChatMessage[]>([])
  13. const [currentAssistantMessage, setCurrentAssistantMessage] = createSignal('')
  14. const [loading, setLoading] = createSignal(false)
  15. const [controller, setController] = createSignal<AbortController>(null)
  16. const handleButtonClick = async () => {
  17. const inputValue = inputRef.value
  18. if (!inputValue) {
  19. return
  20. }
  21. // @ts-ignore
  22. if (window?.umami) umami.trackEvent('chat_generate')
  23. inputRef.value = ''
  24. setMessageList([
  25. ...messageList(),
  26. {
  27. role: 'user',
  28. content: inputValue,
  29. },
  30. ])
  31. requestWithLatestMessage()
  32. }
  33. const throttle =_.throttle(function(){
  34. window.scrollTo({top: document.body.scrollHeight, behavior: 'smooth'})
  35. }, 300, {
  36. leading: true,
  37. trailing: false
  38. })
  39. const requestWithLatestMessage = async () => {
  40. setLoading(true)
  41. setCurrentAssistantMessage('')
  42. const storagePassword = localStorage.getItem('pass')
  43. try {
  44. const controller = new AbortController()
  45. setController(controller)
  46. const requestMessageList = [...messageList()]
  47. if (currentSystemRoleSettings()) {
  48. requestMessageList.unshift({
  49. role: 'system',
  50. content: currentSystemRoleSettings(),
  51. })
  52. }
  53. const timestamp = Date.now()
  54. const response = await fetch('/api/generate', {
  55. method: 'POST',
  56. body: JSON.stringify({
  57. messages: requestMessageList,
  58. time: timestamp,
  59. pass: storagePassword,
  60. sign: await generateSignature({
  61. t: timestamp,
  62. m: requestMessageList?.[requestMessageList.length - 1]?.content || '',
  63. }),
  64. }),
  65. signal: controller.signal,
  66. })
  67. if (!response.ok) {
  68. throw new Error(response.statusText)
  69. }
  70. const data = response.body
  71. if (!data) {
  72. throw new Error('No data')
  73. }
  74. const reader = data.getReader()
  75. const decoder = new TextDecoder('utf-8')
  76. let done = false
  77. while (!done) {
  78. const { value, done: readerDone } = await reader.read()
  79. if (value) {
  80. let char = decoder.decode(value)
  81. if (char === '\n' && currentAssistantMessage().endsWith('\n')) {
  82. continue
  83. }
  84. if (char) {
  85. setCurrentAssistantMessage(currentAssistantMessage() + char)
  86. }
  87. throttle()
  88. }
  89. done = readerDone
  90. }
  91. } catch (e) {
  92. console.error(e)
  93. setLoading(false)
  94. setController(null)
  95. return
  96. }
  97. archiveCurrentMessage()
  98. }
  99. const archiveCurrentMessage = () => {
  100. if (currentAssistantMessage()) {
  101. setMessageList([
  102. ...messageList(),
  103. {
  104. role: 'assistant',
  105. content: currentAssistantMessage(),
  106. },
  107. ])
  108. setCurrentAssistantMessage('')
  109. setLoading(false)
  110. setController(null)
  111. inputRef.focus()
  112. }
  113. }
  114. const clear = () => {
  115. inputRef.value = ''
  116. inputRef.style.height = 'auto';
  117. setMessageList([])
  118. setCurrentAssistantMessage('')
  119. setCurrentSystemRoleSettings('')
  120. }
  121. const stopStreamFetch = () => {
  122. if (controller()) {
  123. controller().abort()
  124. archiveCurrentMessage()
  125. }
  126. }
  127. const retryLastFetch = () => {
  128. if (messageList().length > 0) {
  129. const lastMessage = messageList()[messageList().length - 1]
  130. console.log(lastMessage)
  131. if (lastMessage.role === 'assistant') {
  132. setMessageList(messageList().slice(0, -1))
  133. requestWithLatestMessage()
  134. }
  135. }
  136. }
  137. const handleKeydown = (e: KeyboardEvent) => {
  138. if (e.isComposing || e.shiftKey) {
  139. return
  140. }
  141. if (e.key === 'Enter') {
  142. handleButtonClick()
  143. }
  144. }
  145. return (
  146. <div my-6>
  147. <SystemRoleSettings
  148. canEdit={() => messageList().length === 0}
  149. systemRoleEditing={systemRoleEditing}
  150. setSystemRoleEditing={setSystemRoleEditing}
  151. currentSystemRoleSettings={currentSystemRoleSettings}
  152. setCurrentSystemRoleSettings={setCurrentSystemRoleSettings}
  153. />
  154. <Index each={messageList()}>
  155. {(message, index) => (
  156. <MessageItem
  157. role={message().role}
  158. message={message().content}
  159. showRetry={() => (message().role === 'assistant' && index === messageList().length - 1)}
  160. onRetry={retryLastFetch}
  161. />
  162. )}
  163. </Index>
  164. {currentAssistantMessage() && (
  165. <MessageItem
  166. role="assistant"
  167. message={currentAssistantMessage}
  168. />
  169. )}
  170. <Show
  171. when={!loading()}
  172. fallback={() => (
  173. <div class="h-12 my-4 flex gap-4 items-center justify-center bg-slate bg-op-15 rounded-sm">
  174. <span>AI正在思考中...</span>
  175. <div class="px-2 py-0.5 border border-slate rounded-md text-sm op-70 cursor-pointer hover:bg-slate/10" onClick={stopStreamFetch}>停止</div>
  176. </div>
  177. )}
  178. >
  179. <div class="my-4 flex items-center gap-2 transition-opacity" class:op-50={systemRoleEditing()}>
  180. <textarea
  181. ref={inputRef!}
  182. disabled={systemRoleEditing()}
  183. onKeyDown={handleKeydown}
  184. placeholder="问些问题吧..."
  185. autocomplete="off"
  186. autofocus
  187. onInput={() => {
  188. inputRef.style.height = 'auto';
  189. inputRef.style.height = inputRef.scrollHeight + 'px';
  190. }}
  191. rows="1"
  192. w-full
  193. px-3 py-3
  194. min-h-12
  195. max-h-36
  196. rounded-sm
  197. bg-slate
  198. bg-op-15
  199. resize-none
  200. focus:bg-op-20
  201. focus:ring-0
  202. focus:outline-none
  203. placeholder:op-50
  204. dark="placeholder:op-30"
  205. scroll-pa-8px
  206. />
  207. <button onClick={handleButtonClick} disabled={systemRoleEditing()} h-12 px-4 py-2 bg-slate bg-op-15 hover:bg-op-20 rounded-sm>
  208. Send
  209. </button>
  210. <button title="Clear" onClick={clear} disabled={systemRoleEditing()} h-12 px-4 py-2 bg-slate bg-op-15 hover:bg-op-20 rounded-sm>
  211. <IconClear />
  212. </button>
  213. </div>
  214. </Show>
  215. </div>
  216. )
  217. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/238045
推荐阅读
相关标签
  

闽ICP备14008679号