short-generator.page.ts 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. import { Component, OnInit } from '@angular/core';
  2. import { IonicModule, LoadingController } from '@ionic/angular';
  3. import { FormsModule } from '@angular/forms';
  4. import { Router } from '@angular/router';
  5. import { FmodeChatCompletion, MarkdownPreviewModule } from 'fmode-ng';
  6. import { CompWordEntryComponent } from '../comp-word-entry/comp-word-entry.component';
  7. import { CloudObject, CloudQuery, CloudUser } from '../lib/ncloud';
  8. import { IonHeader, IonToolbar, IonTitle, IonContent, IonButton,IonIcon, ModalController, IonTextarea, IonInput, IonCard, IonCardHeader, IonCardTitle, IonThumbnail, IonCardContent, IonCardSubtitle, IonItem, IonList, IonLabel, IonAvatar, IonSelect, IonSelectOption, AlertController, IonButtons, IonProgressBar, IonText } from '@ionic/angular/standalone';
  9. import { CommonModule } from '@angular/common';
  10. import { AvatarModule, ChatPanelOptions, DalleOptions, FmodeChat, FmodeChatMessage, ImagineWork, openChatPanelModal } from 'fmode-ng';
  11. @Component({
  12. selector: 'app-short-generator',
  13. templateUrl: './short-generator.page.html',
  14. styleUrls: ['./short-generator.page.scss'],
  15. standalone: true,
  16. imports: [
  17. IonicModule,
  18. FormsModule,
  19. MarkdownPreviewModule,
  20. CompWordEntryComponent,
  21. // IonHeader,
  22. // IonToolbar,
  23. // IonTitle,
  24. // IonContent,
  25. // IonButton,
  26. // IonTextarea,
  27. // IonInput,
  28. IonIcon,
  29. IonCard,
  30. IonCardHeader,
  31. IonCardTitle,
  32. IonCardSubtitle,
  33. IonCardContent,
  34. IonThumbnail,
  35. IonItem,
  36. IonList,
  37. CommonModule,
  38. IonLabel,
  39. IonAvatar,
  40. IonSelect,
  41. IonSelectOption,
  42. // IonButtons,
  43. IonProgressBar,
  44. IonText,MarkdownPreviewModule
  45. ],
  46. })
  47. export class ShortGeneratorPage implements OnInit {
  48. constructor(private router: Router) {
  49. this.currentUser = new CloudUser();
  50. }
  51. ngOnInit() { }
  52. navigateToContentGenerator() {
  53. this.router.navigate(['/content-generator'], { queryParams: { outline: this.generatedOutline } });
  54. }
  55. // 用户输入提示词
  56. titlel: string = "";
  57. titleInput(ev: any) {
  58. console.log(ev.detail.value);
  59. this.titlel = ev.detail.value;
  60. }
  61. style: string = "";
  62. styleInput(ev: any) {
  63. this.style = ev.detail.value;
  64. }
  65. currentUser: CloudUser;
  66. // 人物词条
  67. entryList: Array<any> = []
  68. list: any = [];
  69. entry: string = '';
  70. onEntryListChange(ev: any) {
  71. this.entryList = ev;
  72. let list =JSON.stringify(this.entryList) ;
  73. console.log(list);
  74. this.entry = JSON.stringify(this.entryList); // 将 entryList 转换为字符串并存储在 entry 中
  75. console.log(this.entry); // 输出 entry 的值
  76. }
  77. showEntryList() {
  78. console.log(JSON.stringify(this.entryList))
  79. }
  80. // 生成的小说大纲
  81. generatedOutline: string = "";
  82. // 生成的小说内容
  83. generatedContent: string = "";
  84. // 属性:组件内用于展示消息内容的变量
  85. responseMsg: any = "";
  86. // 方法:实例化completion对象,传入消息数组,并订阅生成的可观察对象。
  87. isComplete: boolean = false; // 定义完成状态属性,用来标记是否补全完成
  88. sendMessage() {
  89. console.log("create");
  90. console.log(JSON.stringify(this.entryList));
  91. console.log(this.titlel);
  92. this.entry = JSON.stringify(this.entryList); // 将 entryList 转换为字符串并存储在 entry 中
  93. console.log(this.entry)
  94. let PromptTemplate = `
  95. 请你作为一名专业的小说创作者,请您根据用户提供的标题${this.titlel},用户的要求要求${this.style},根据这个词条${JSON.stringify(this.entryList)}的内容,给出短篇小说大纲,大纲需要清晰的主题:大纲应明确小说的主题和中心思想,能够引导整个故事的发展。
  96. 完整的情节结构:大纲需要包含故事的主要情节,包括开端、发展、高潮和结局,确保情节的连贯性和逻辑性。
  97. 角色发展:大纲中应明确主要角色的性格特点、动机和成长轨迹,展示他们在故事中的变化和发展。
  98. 冲突与张力:描述主要冲突和障碍,这些冲突是推动情节发展的关键因素,能够增加故事的紧张感和吸引力。
  99. 场景设置:大纲应包括主要场景和背景信息,帮助读者理解故事发生的环境和氛围。
  100. 时间线:提供一个清晰的时间线,说明故事的时间进程,包括重要事件的发生顺序。
  101. 关键事件:标出故事中的关键事件和转折点,这些事件通常是推动情节发展的重要节点。
  102. 叙述视角:确定故事的叙述视角(第一人称、第三人称等),并在大纲中保持一致性。
  103. 节奏与结构:考虑故事的节奏,安排好各个部分的长度和强度,使整体结构合理平衡。
  104. 开放性与灵活性:虽然大纲需要有一定的框架,但也应留有空间以便在创作过程中进行调整和修改,保持灵活性。
  105. `;
  106. console.log(PromptTemplate);
  107. let completion = new FmodeChatCompletion([
  108. { role: "system", content: "" },
  109. { role: "user", content: PromptTemplate }
  110. ]);
  111. completion.sendCompletion().subscribe((message: any) => {
  112. // 打印消息体
  113. console.log(message.content);
  114. // 赋值消息内容给组件内属性
  115. this.responseMsg = message.content;
  116. if (message?.complete) { // 判断message为完成状态,则设置isComplete为完成
  117. this.isComplete = true;
  118. // 将生成的小说大纲放入文本框中
  119. this.generatedOutline = this.responseMsg;
  120. }
  121. });
  122. }
  123. sendOutline() {
  124. console.log("create");
  125. let PromptTemplate = `
  126. 根据短篇小说大纲${this.generatedOutline},生成一个短篇小说。要求做到引人入胜的情节:情节要紧凑、有吸引力,能够吸引读者的注意力并保持他们的兴趣。高潮和冲突的设计尤为重要。
  127. 深刻的人物塑造:角色要有鲜明的个性和发展,读者能够与他们产生共鸣。复杂的人物关系和内心冲突能够增加故事的深度。
  128. 生动的描写:通过细腻的描写,营造出丰富的场景和氛围,使读者能够身临其境,感受到故事的情感和张力。
  129. 主题与思想:小说应有深刻的主题和思想,能够引发读者的思考,传达某种价值观或人生哲理。
  130. 流畅的语言:语言要优美流畅,适合故事的风格和情境,能够增强阅读体验。
  131. 独特的视角:采用独特的叙述视角或创新的结构,使作品在众多小说中脱颖而出,给读者带来新鲜感。
  132. 情感共鸣:能够引发读者的情感共鸣,使他们在阅读过程中产生共情,感受到角色的喜怒哀乐。
  133. 合理的逻辑性:情节发展和人物行为要合乎逻辑,避免出现不合理的情节反转或角色行为。
  134. `;
  135. let completion = new FmodeChatCompletion([
  136. { role: "system", content: "" },
  137. { role: "user", content: PromptTemplate }
  138. ]);
  139. completion.sendCompletion().subscribe((message: any) => {
  140. // 打印消息体
  141. console.log(message.content);
  142. // 赋值消息内容给组件内属性
  143. this.responseMsg = message.content;
  144. if (message?.complete) { // 判断message为完成状态,则设置isComplete为完成
  145. this.isComplete = true;
  146. // 将生成的小说内容放入文本框中
  147. this.generatedContent = this.responseMsg;
  148. }
  149. });
  150. }
  151. saveNovel() {
  152. let consult = new CloudObject("NovelAriticle")
  153. let now = new Date();
  154. let dateStr = `${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()}`
  155. // 对象权限的精确指定
  156. let completion = new FmodeChatCompletion([
  157. {role:"system",content:""},
  158. ])
  159. completion.sendCompletion().subscribe((message:any)=>{
  160. // 打印消息体
  161. console.log(message.content)
  162. // 赋值消息内容给组件内属性
  163. if (message?.complete ) {
  164. consult.set({
  165. user: this.currentUser.toPointer(),
  166. username: this.currentUser.data["username"],
  167. title: `${this.titlel}`,
  168. required: `${this.style}`,
  169. content2: `${this.generatedContent}`,
  170. entry: `${this.entry}`,
  171. outline: `${this.generatedOutline}`,
  172. date: dateStr,
  173. category: `短篇小说`
  174. });
  175. consult.save();
  176. console.log(consult);
  177. }
  178. })
  179. }
  180. }