Forráskód Böngészése

update: 更新了简单一点的acgi

xukang 4 hónapja
szülő
commit
1d91acabf2

+ 7 - 0
newwisefitnessapp/src/app/test-page/test-page.component.html

@@ -94,7 +94,14 @@
           <ion-card-title>健身计划内容</ion-card-title>
           <ion-card-title>健身计划内容</ion-card-title>
         </ion-card-header>
         </ion-card-header>
         <ion-card-content>
         <ion-card-content>
+          @if(isGenerating)
+          {
           <p>{{ generatedPlan }}</p>
           <p>{{ generatedPlan }}</p>
+          }
+          @if(!isGenerating)
+          {
+          <fm-markdown-preview class="content-style" [content]="generatedPlan"></fm-markdown-preview>
+          }
         </ion-card-content>
         </ion-card-content>
       </ion-card>
       </ion-card>
     </div>
     </div>

+ 80 - 69
newwisefitnessapp/src/app/test-page/test-page.component.ts

@@ -1,17 +1,20 @@
 import { Component, OnInit } from '@angular/core';
 import { Component, OnInit } from '@angular/core';
 import { IonicModule } from '@ionic/angular';
 import { IonicModule } from '@ionic/angular';
 import { FormsModule } from '@angular/forms';
 import { FormsModule } from '@angular/forms';
-import { CommonModule } from '@angular/common';  // 导入 CommonModule
+import { CommonModule } from '@angular/common';
 import { TagInputComponent } from '../tag-input/tag-input.component';
 import { TagInputComponent } from '../tag-input/tag-input.component';
 import { addIcons } from 'ionicons';
 import { addIcons } from 'ionicons';
 import { barbellOutline, personOutline, square, alarmOutline } from 'ionicons/icons';
 import { barbellOutline, personOutline, square, alarmOutline } from 'ionicons/icons';
+import { FmodeChatCompletion, MarkdownPreviewModule } from 'fmode-ng';
 
 
 @Component({
 @Component({
   selector: 'app-test-page',
   selector: 'app-test-page',
   templateUrl: './test-page.component.html',
   templateUrl: './test-page.component.html',
   styleUrls: ['./test-page.component.scss'],
   styleUrls: ['./test-page.component.scss'],
   standalone: true,
   standalone: true,
-  imports: [IonicModule, FormsModule, CommonModule, TagInputComponent]  // 添加 CommonModule
+  imports: [IonicModule, FormsModule, CommonModule, TagInputComponent,
+    // 引入fm-markdown-preview组件模块
+    MarkdownPreviewModule]  // 添加 CommonModule
 })
 })
 export class TestPageComponent implements OnInit {
 export class TestPageComponent implements OnInit {
   selectedTags: string[] = [];
   selectedTags: string[] = [];
@@ -61,10 +64,10 @@ export class TestPageComponent implements OnInit {
   }
   }
 
 
   async generatePlan() {
   async generatePlan() {
-    this.isGenerating = true;  // 开始生成计划时禁用按钮
+
     this.generatedPlan = '';  // 清空之前的结果
     this.generatedPlan = '';  // 清空之前的结果
     this.messageList = [];  // 清空旧的消息列表,避免重复内容
     this.messageList = [];  // 清空旧的消息列表,避免重复内容
-
+    this.isGenerating = true;
     console.log('生成健身计划', {
     console.log('生成健身计划', {
       tags: this.selectedTags,
       tags: this.selectedTags,
       exercisePreference: this.exercisePreference,
       exercisePreference: this.exercisePreference,
@@ -78,72 +81,80 @@ export class TestPageComponent implements OnInit {
     let prompt = `您作为一名专业的健身计划定制大师,请帮我根据以下情况制定健身计划(健身计划请给每天的运动标上序号)。关键词:${this.selectedTags.join(",")},目标描述:${this.goalDescription},运动偏好:${this.exercisePreference},
     let prompt = `您作为一名专业的健身计划定制大师,请帮我根据以下情况制定健身计划(健身计划请给每天的运动标上序号)。关键词:${this.selectedTags.join(",")},目标描述:${this.goalDescription},运动偏好:${this.exercisePreference},
     健身频率一周:${this.workoutFrequency},身高:${this.height}cm,体重:${this.weight}kg,年龄:${this.age}`;
     健身频率一周:${this.workoutFrequency},身高:${this.height}cm,体重:${this.weight}kg,年龄:${this.age}`;
 
 
-    let TOKEN = `r:E4KpGvTEto-131588121831732778669`;
-    localStorage.setItem("token", TOKEN);
+    // let TOKEN = `r:E4KpGvTEto-131588121831732778669`;
+    // localStorage.setItem("token", TOKEN);
 
 
-    let messageList: any = [
-      { role: "system", content: `开始生成健身计划:${new Date().toDateString()}` },
+    let messageList = new FmodeChatCompletion([
+      { role: "system", content: '' },
       { role: "user", content: prompt }
       { role: "user", content: prompt }
-    ];
-
-    let bodyJson = {
-      "token": `Bearer ${TOKEN}`,
-      "messages": messageList,
-      "model": "fmode-4.5-128k",
-      "temperature": 0.5,
-      "presence_penalty": 0,
-      "frequency_penalty": 0,
-      "top_p": 1,
-      "stream": true
-    };
-
-    let response = await fetch("https://test.fmode.cn/api/apig/aigc/gpt/v1/chat/completions", {
-      "headers": {
-        "accept": "text/event-stream",
-        "sec-fetch-dest": "empty",
-        "sec-fetch-mode": "cors",
-        "sec-fetch-site": "same-site"
-      },
-      "body": JSON.stringify(bodyJson),
-      "method": "POST",
-      "mode": "cors",
-      "credentials": "omit"
-    });
-
-    let reader = response.body?.getReader();
-    if (!reader) {
-      throw new Error("Failed to get the response reader.");
-    }
-
-    let buffer = "";
-    const decoder = new TextDecoder();  // 定义 TextDecoder
-    while (true) {
-      let { done, value } = await reader.read();
-      if (done) break;
-
-      let data = decoder.decode(value);
-      buffer += data;  // 保留数据流中的内容
-
-      let messages = buffer.split("\n");
-      buffer = messages.pop() || "";  // 保留未处理的部分
-
-      messages.forEach(message => {
-        let dataText: string = message.split("data: ")[1];
-        if (dataText && dataText.startsWith("{")) {
-          try {
-            let json = JSON.parse(dataText);
-            let content = json?.choices?.[0]?.delta?.content;
-            if (content) {
-              console.log(content);
-              this.generatedPlan += content;  // 追加内容
-            }
-          } catch (err) {
-            console.error('生成计划失败:', err);
-          }
-        }
-      });
-    }
-
-    this.isGenerating = false;  // 生成结束后恢复按钮
+    ]);
+    messageList.sendCompletion().subscribe((message: any) => {
+      // 打印消息体
+      console.log(message.content)
+      // 赋值消息内容给组件内属性
+      this.generatedPlan = message.content
+      if (message?.complete) { // 判断message为完成状态,则设置isComplete为完成
+        this.isGenerating = false
+      }
+    })
+    // let bodyJson = {
+    //   "token": `Bearer ${TOKEN}`,
+    //   "messages": messageList,
+    //   "model": "fmode-4.5-128k",
+    //   "temperature": 0.5,
+    //   "presence_penalty": 0,
+    //   "frequency_penalty": 0,
+    //   "top_p": 1,
+    //   "stream": true
+    // };
+
+    // let response = await fetch("https://test.fmode.cn/api/apig/aigc/gpt/v1/chat/completions", {
+    //   "headers": {
+    //     "accept": "text/event-stream",
+    //     "sec-fetch-dest": "empty",
+    //     "sec-fetch-mode": "cors",
+    //     "sec-fetch-site": "same-site"
+    //   },
+    //   "body": JSON.stringify(bodyJson),
+    //   "method": "POST",
+    //   "mode": "cors",
+    //   "credentials": "omit"
+    // });
+
+    // let reader = response.body?.getReader();
+    // if (!reader) {
+    //   throw new Error("Failed to get the response reader.");
+    // }
+
+    // let buffer = "";
+    // const decoder = new TextDecoder();  // 定义 TextDecoder
+    // while (true) {
+    //   let { done, value } = await reader.read();
+    //   if (done) break;
+
+    //   let data = decoder.decode(value);
+    //   buffer += data;  // 保留数据流中的内容
+
+    //   let messages = buffer.split("\n");
+    //   buffer = messages.pop() || "";  // 保留未处理的部分
+
+    //   messages.forEach(message => {
+    //     let dataText: string = message.split("data: ")[1];
+    //     if (dataText && dataText.startsWith("{")) {
+    //       try {
+    //         let json = JSON.parse(dataText);
+    //         let content = json?.choices?.[0]?.delta?.content;
+    //         if (content) {
+    //           console.log(content);
+    //           this.generatedPlan += content;
+    //         }
+    //       } catch (err) {
+    //         console.error('生成计划失败:', err);
+    //       }
+    //     }
+    //   });
+    // }
+
+    // this.isGenerating = false;  // 生成结束后恢复按钮
   }
   }
 }
 }

+ 9 - 1
newwisefitnessapp/src/main.ts

@@ -1,9 +1,11 @@
 import { bootstrapApplication } from '@angular/platform-browser';
 import { bootstrapApplication } from '@angular/platform-browser';
 import { RouteReuseStrategy, provideRouter, withPreloading, PreloadAllModules } from '@angular/router';
 import { RouteReuseStrategy, provideRouter, withPreloading, PreloadAllModules } from '@angular/router';
 import { IonicRouteStrategy, provideIonicAngular } from '@ionic/angular/standalone';
 import { IonicRouteStrategy, provideIonicAngular } from '@ionic/angular/standalone';
-
 import { routes } from './app/app.routes';
 import { routes } from './app/app.routes';
 import { AppComponent } from './app/app.component';
 import { AppComponent } from './app/app.component';
+import { provideHttpClient } from '@angular/common/http';
+// 引用移动端授权检测供应器
+import { Diagnostic } from '@awesome-cordova-plugins/diagnostic/ngx';
 import Parse from "parse";
 import Parse from "parse";
 Parse.initialize("ncloudmaster");
 Parse.initialize("ncloudmaster");
 Parse.serverURL = "https://server.fmode.cn/parse";
 Parse.serverURL = "https://server.fmode.cn/parse";
@@ -14,5 +16,11 @@ bootstrapApplication(AppComponent, {
     { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
     { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
     provideIonicAngular(),
     provideIonicAngular(),
     provideRouter(routes, withPreloading(PreloadAllModules)),
     provideRouter(routes, withPreloading(PreloadAllModules)),
+    // ...
+    // 添加HttpClient供应器
+    provideHttpClient(),
+    // 添加Diagnostic
+    Diagnostic,
+    // ...
   ],
   ],
 });
 });