Message.svelte 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <script lang="ts">
  2. import { toast } from 'svelte-sonner';
  3. import { tick, getContext, onMount, createEventDispatcher } from 'svelte';
  4. const dispatch = createEventDispatcher();
  5. const i18n = getContext('i18n');
  6. import { settings } from '$lib/stores';
  7. import { copyToClipboard } from '$lib/utils';
  8. import MultiResponseMessages from './MultiResponseMessages.svelte';
  9. import ResponseMessage from './ResponseMessage.svelte';
  10. import UserMessage from './UserMessage.svelte';
  11. export let chatId;
  12. export let idx = 0;
  13. export let history;
  14. export let messageId;
  15. export let user;
  16. export let showPreviousMessage;
  17. export let showNextMessage;
  18. export let editMessage;
  19. export let deleteMessage;
  20. export let rateMessage;
  21. export let regenerateResponse;
  22. export let continueResponse;
  23. // MultiResponseMessages
  24. export let mergeResponses;
  25. export let autoScroll = false;
  26. export let readOnly = false;
  27. onMount(() => {
  28. // console.log('message', idx);
  29. });
  30. </script>
  31. <div
  32. class="flex flex-col justify-between px-5 mb-3 w-full {($settings?.widescreenMode ?? null)
  33. ? 'max-w-full'
  34. : 'max-w-5xl'} mx-auto rounded-lg group"
  35. >
  36. {#if history.messages[messageId]}
  37. {#if history.messages[messageId].role === 'user'}
  38. <UserMessage
  39. {user}
  40. {history}
  41. {messageId}
  42. isFirstMessage={idx === 0}
  43. siblings={history.messages[messageId].parentId !== null
  44. ? (history.messages[history.messages[messageId].parentId]?.childrenIds ?? [])
  45. : (Object.values(history.messages)
  46. .filter((message) => message.parentId === null)
  47. .map((message) => message.id) ?? [])}
  48. {showPreviousMessage}
  49. {showNextMessage}
  50. {editMessage}
  51. on:delete={() => deleteMessage(messageId)}
  52. {readOnly}
  53. />
  54. {:else if (history.messages[history.messages[messageId].parentId]?.models?.length ?? 1) === 1}
  55. <ResponseMessage
  56. {chatId}
  57. {history}
  58. {messageId}
  59. isLastMessage={messageId === history.currentId}
  60. siblings={history.messages[history.messages[messageId].parentId]?.childrenIds ?? []}
  61. {showPreviousMessage}
  62. {showNextMessage}
  63. {editMessage}
  64. {rateMessage}
  65. {continueResponse}
  66. {regenerateResponse}
  67. on:submit={async (e) => {
  68. dispatch('submit', e.detail);
  69. }}
  70. on:action={async (e) => {
  71. dispatch('action', e.detail);
  72. }}
  73. on:update={async (e) => {
  74. dispatch('update');
  75. }}
  76. on:save={async (e) => {
  77. console.log('save', e);
  78. const message = e.detail;
  79. if (message) {
  80. history.messages[message.id] = message;
  81. dispatch('update');
  82. } else {
  83. dispatch('update');
  84. }
  85. }}
  86. {readOnly}
  87. />
  88. {:else}
  89. <MultiResponseMessages
  90. bind:history
  91. {chatId}
  92. {messageId}
  93. isLastMessage={messageId === history?.currentId}
  94. {rateMessage}
  95. {editMessage}
  96. {continueResponse}
  97. {regenerateResponse}
  98. {mergeResponses}
  99. on:submit={async (e) => {
  100. dispatch('submit', e.detail);
  101. }}
  102. on:action={async (e) => {
  103. dispatch('action', e.detail);
  104. }}
  105. on:update={async (e) => {
  106. dispatch('update');
  107. }}
  108. on:save={async (e) => {
  109. console.log('save', e);
  110. const message = e.detail;
  111. if (message) {
  112. history.messages[message.id] = message;
  113. dispatch('update');
  114. } else {
  115. dispatch('update');
  116. }
  117. }}
  118. on:change={async () => {
  119. await tick();
  120. dispatch('update');
  121. dispatch('scroll');
  122. }}
  123. {readOnly}
  124. />
  125. {/if}
  126. {/if}
  127. </div>