index.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <template>
  2. <CommonRoot>
  3. <FlexCol :innerStyle="{
  4. backgroundImage: 'url(https://xy.wenlvti.net/app_static/images/dig/TopBanner.png)',
  5. backgroundSize: '100% auto',
  6. backgroundRepeat: 'no-repeat',
  7. backgroundPosition: 'top center',
  8. minHeight: '100vh',
  9. }">
  10. <StatusBarSpace />
  11. <FlexCol v-if="showSessionSidebar" position="relative" width="100%" height="100%">
  12. <NavBar
  13. title="历史会话"
  14. leftButton="close-bold"
  15. @leftButtonPressed="showSessionSidebar=false"
  16. />
  17. <ChatSessionSidebar :sessionManager="sessionManager" @close="showSessionSidebar = false" />
  18. </FlexCol>
  19. <ChatMessageContainer
  20. v-else
  21. :chatManager="chatManager"
  22. :sessionManager="sessionManager"
  23. :historyItemsPagerManager="historyItemsPagerManager"
  24. :chatInterfaceManager="interfaceManager"
  25. height="77vh"
  26. @intoSelectMode="intoSelectMode"
  27. >
  28. <template #header>
  29. <NavBar
  30. title="AI助手"
  31. leftButton="back"
  32. >
  33. <template #left-custom>
  34. <FlexRow align="center">
  35. <IconButton icon="menu" shape="square-full" @click="showSessionSidebar = true" />
  36. </FlexRow>
  37. </template>
  38. </NavBar>
  39. </template>
  40. <template #footer>
  41. <ChatFooter
  42. :chatManager="chatManager"
  43. :chatInterfaceManager="interfaceManager"
  44. >
  45. <template #mulitSelectMode>
  46. <ChatMulitSelectBar
  47. :selectedCount="selectedCount"
  48. :messages="messages"
  49. :sessionManager="sessionManager"
  50. @cancel="exitSelectMode"
  51. />
  52. </template>
  53. <template #header>
  54. </template>
  55. </ChatFooter>
  56. </template>
  57. </ChatMessageContainer>
  58. </FlexCol>
  59. </CommonRoot>
  60. </template>
  61. <script setup lang="ts">
  62. import { onMounted, ref, type Ref } from 'vue';
  63. import { useChatSession } from '@/pages/chat/composables/useChatSession';
  64. import { useChat, type ChatInterfaceManager } from '@/pages/chat/core/Chat';
  65. import { useChatHistoryItemsPager } from '@/pages/chat/composables/useChatHistoryItemsPager';
  66. import { useChatSelection } from '@/pages/chat/composables/useChatSelection';
  67. import { ChatMessage as ChatMessageModel } from '@/pages/chat/model/Message';
  68. import ChatFooter from './components/ChatFooter.vue';
  69. import ChatMessageContainer from './components/ChatMessageContainer.vue';
  70. import NavBar from '@/components/nav/NavBar.vue';
  71. import ChatSessionSidebar from '@/pages/chat/components/Session/ChatSessionSidebar.vue';
  72. import FlexCol from '@/components/layout/FlexCol.vue';
  73. import ChatMulitSelectBar from '@/pages/chat/components/Footer/ChatMulitSelectBar.vue';
  74. import StatusBarSpace from '@/components/layout/space/StatusBarSpace.vue';
  75. import CommonRoot from '@/components/dialog/CommonRoot.vue';
  76. import IconButton from '@/components/basic/IconButton.vue';
  77. import FlexRow from '@/components/layout/FlexRow.vue';
  78. const messages = ref<ChatMessageModel[]>([]) as Ref<ChatMessageModel[]>;
  79. const interfaceManager: ChatInterfaceManager = {
  80. messages,
  81. getAttachmentList: async () => {
  82. return [];
  83. },
  84. };
  85. const showSessionSidebar = ref(false);
  86. const sessionManager = useChatSession({
  87. messages,
  88. enableSession: true,
  89. onStop: () => chatManager.stop(),
  90. onScrollToBottom: () => interfaceManager.scrollToBottom?.(),
  91. });
  92. const historyItemsPagerManager = useChatHistoryItemsPager({
  93. messages,
  94. sessionManager,
  95. });
  96. const chatManager = useChat({
  97. interfaceManager,
  98. sessionManager,
  99. config: {
  100. onGetSendOptions: () => ({
  101. enableThinking: false,
  102. enableSearch: false,
  103. modelInfo: {
  104. name: 'hunyuan-2.0-thinking-20251109',
  105. value: 'hunyuan-2.0-thinking-20251109',
  106. max_tokens: 10000,
  107. },
  108. model: 'hunyuan-2.0-thinking-20251109',
  109. chatOptions: {
  110. temperature: 0.5,
  111. top_p: 1,
  112. top_k: 40,
  113. presence_penalty: 0,
  114. },
  115. customSystemPrompt: '',
  116. }),
  117. defaultSystemPrompt: `你是一个“乡村文化挖掘”智能知识助理,负责与用户聊天,回答用户问题。请尽量使用简洁明了的语言,避免使用专业术语。`,
  118. onBuildWelcome: () => {
  119. return {
  120. welcomeMessage: '你好!欢迎使用亮乡源AI助手。可以与我讨论乡村文化挖掘相关的问题。',
  121. welcomeActions: [
  122. '乡源情怀是什么',
  123. '乡源文化的传承与发展',
  124. '乡源文化的保护与利用',
  125. '乡村振兴的现状与未来',
  126. ],
  127. }
  128. },
  129. }
  130. });
  131. const {
  132. intoSelectMode,
  133. exitSelectMode,
  134. selectedCount,
  135. isSelectMode,
  136. } = useChatSelection();
  137. onMounted(() => {
  138. interfaceManager.scrollToBottom?.();
  139. });
  140. </script>