agent.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <template>
  2. <ChatMessageContainer
  3. :chatManager="chatManager"
  4. :sessionManager="sessionManager"
  5. :historyItemsPagerManager="historyItemsPagerManager"
  6. :chatInterfaceManager="interfaceManager"
  7. @intoSelectMode="intoSelectMode"
  8. >
  9. <template #header>
  10. <NavBar title="AI伴写" leftButton="menu" @leftButtonPressed="" />
  11. </template>
  12. <template #footer>
  13. <ChatFooter
  14. :chatManager="chatManager"
  15. />
  16. </template>
  17. </ChatMessageContainer>
  18. </template>
  19. <script setup lang="ts">
  20. import { onMounted, ref, type Ref } from 'vue';
  21. import { useChatSession } from '@/pages/chat/composables/useChatSession';
  22. import { useChat, type ChatInterfaceManager } from '@/pages/chat/core/Chat';
  23. import { useChatHistoryItemsPager } from '@/pages/chat/composables/useChatHistoryItemsPager';
  24. import { ChatMessage as ChatMessageModel } from '@/pages/chat/model/Message';
  25. import { ChatGroups } from '@/pages/chat/core/Groups';
  26. import ChatFooter from '../../chat/components/ChatFooter.vue';
  27. import ChatMessageContainer from '../../chat/components/ChatMessageContainer.vue';
  28. import FlexCol from '@/components/layout/FlexCol.vue';
  29. import NavBar from '@/components/nav/NavBar.vue';
  30. import { useChatSelection } from '@/pages/chat/composables/useChatSelection';
  31. const messages = ref<ChatMessageModel[]>([]) as Ref<ChatMessageModel[]>;
  32. const interfaceManager: ChatInterfaceManager = {
  33. messages,
  34. getAttachmentList: async () => {
  35. return [];
  36. },
  37. };
  38. const sessionManager = useChatSession({
  39. messages,
  40. enableSession: true,
  41. groupId: ChatGroups.NOTE_EDITOR,
  42. onStop: () => chatManager.stop(),
  43. onScrollToBottom: () => interfaceManager.scrollToBottom?.(),
  44. });
  45. const historyItemsPagerManager = useChatHistoryItemsPager({
  46. messages,
  47. sessionManager,
  48. });
  49. const chatManager = useChat({
  50. interfaceManager,
  51. sessionManager,
  52. config: {
  53. onGetSendOptions: () => ({
  54. enableThinking: false,
  55. enableSearch: true,
  56. modelInfo: {
  57. name: 'hunyuan-2.0-instruct-20251111',
  58. value: 'hunyuan-2.0-instruct-20251111',
  59. max_tokens: 10000,
  60. },
  61. model: 'hunyuan-2.0-instruct-20251111',
  62. chatOptions: {
  63. temperature: 0.5,
  64. top_p: 1,
  65. top_k: 40,
  66. presence_penalty: 0,
  67. },
  68. customSystemPrompt: '',
  69. }),
  70. defaultSystemPrompt: `你是一个“笔记/文章写作与改稿助手”,工作在一个笔记编辑器里。你需要在与用户对话的同时,能直接读取并修改当前文章(标题与正文)。
  71. ## 工作目标
  72. - 帮用户写作:构思、列提纲、扩写、续写、改写、润色、降重、统一文风、改错别字与语病。
  73. - 帮用户改稿:在不改变事实/观点的前提下,提高表达清晰度、逻辑性与可读性;必要时提出修改建议并给出可直接应用的改稿。
  74. ## 强制规则(很重要)
  75. - 当用户的需求涉及“基于现有文章内容”进行判断/总结/改写/润色/纠错/扩写时:你必须先调用工具读取文章(至少读取标题或正文)再开始。
  76. - 当需要改动文章时:优先使用“片段替换/插入/删除”等精确编辑工具;只有在大改(重写/大幅重排)时才使用整篇覆盖写入。
  77. - 任何工具写入后,都要简短说明你改了什么(1-3 条),避免长篇复述全文。
  78. - 如果用户只是在聊天,不需要动文章,就不要调用写入工具。
  79. ## 输出偏好
  80. - 先给结论/方案,再给要点;结构清晰,使用小标题与列表。
  81. - 涉及改稿时,优先给“可直接应用”的修改结果(通过工具写入完成),必要时补充原因。`,
  82. onBuildWelcome: () => {
  83. return {
  84. welcomeMessage: '你好!欢迎使用梦鱼的写作助手。可以与我讨论写作灵感、写作计划、交代我写作任务等。',
  85. welcomeActions: [
  86. '为我生成一个写作计划',
  87. '为我总结一下这篇笔记主要内容',
  88. '帮我修正这篇笔记的语法错误',
  89. ],
  90. }
  91. },
  92. onInitTools: (toolsManager) => {
  93. },
  94. }
  95. });
  96. const {
  97. intoSelectMode,
  98. exitSelectMode,
  99. selectedCount,
  100. isSelectMode,
  101. } = useChatSelection();
  102. onMounted(() => {
  103. interfaceManager.scrollToBottom?.();
  104. });
  105. </script>