123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- import { Observable, from, of } from 'rxjs';
- import { switchMap, map, catchError, finalize } from 'rxjs/operators';
- import { ResultsPage } from '../../study/results/results.page';
- import{ParseObject} from'../../study/results/results-post'
- import Parse from "parse"
- Parse.initialize("dev");
- Parse.serverURL="http://web2023.fmode.cn:9999/parse";
- export interface TestRxjsChatMessage {
- role: string;
- content: string;
- }
- export class TestRxjsChatCompletion {
- messageList: Array<TestRxjsChatMessage>;
- messageAiReply = "";
- lastCompletionContent:string = ""; // 新增属性以保存最后的对话结果
- async SaveMessage()
- {
- let savemessage = new ResultsPage();
- let chatResult=this.lastCompletionContent;
- console.log(this.lastCompletionContent)
- console.log("savemessage.currentObjectId",ResultsPage.currentObjectId)
- async function SaveChatResult()
- {
- let YCX:any = new ParseObject("MagicMirror")
- YCX = await YCX.get(ResultsPage.currentObjectId)
- YCX.set(
- {
- result:chatResult,
- } )
- YCX.saveChat(ResultsPage.currentObjectId);
- // console.log(YCX);
- }
- SaveChatResult();
- }
- constructor(messageList: Array<TestRxjsChatMessage>) {
- this.messageList = messageList;
- }
- createCompletionByStream(options?:{
- model?:string
- }): Observable<{ content: string, cumulativeContent: string, done: boolean }> {
- const token = localStorage.getItem("token");
- const bodyJson = {
- "token": `Bearer ${token}`,
- "messages": this.messageList,
- "model": options?.model || "fmode-3.6-16k",
- "temperature": 0.5,
- "presence_penalty": 0,
- "frequency_penalty": 0,
- "top_p": 1,
- "stream": true
- };
- return from(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"
- },
- "referrer": "https://ai.fmode.cn/",
- "referrerPolicy": "strict-origin-when-cross-origin",
- "body": JSON.stringify(bodyJson),
- "method": "POST",
- "mode": "cors",
- "credentials": "omit"
- })).pipe(
- switchMap(response => {
- const reader = response.body?.getReader();
- if (!reader) {
- throw new Error("Failed to get the response reader.");
- }
- const decoder = new TextDecoder();
- let buffer = "";
- let messageAiReply = "";
- let messageIndex = this.messageList.length;
- return new Observable<{ content: string, cumulativeContent: string, done: boolean }>(observer => {
- const read = () => {
- reader.read().then(({ done, value }) => {
- if (done) {
- observer.next({ content: "", cumulativeContent: messageAiReply, done: true });
- observer.complete();
- return;
- }
- buffer += decoder.decode(value);
- let messages = buffer.split("\n");
- for (let i = 0; i < messages.length - 1; i++) {
- let message = messages[i];
- let dataText = message.replace("data: ", "");
- if (dataText.startsWith("{")) {
- try {
- let dataJson = JSON.parse(dataText);
- let content = dataJson?.choices?.[0]?.delta?.content || "";
- messageAiReply += content;
- this.lastCompletionContent = messageAiReply;
- this.messageList[messageIndex] = {
- role: "assistant",
- content: messageAiReply
- };
- observer.next({ content, cumulativeContent: messageAiReply, done: false });
- } catch (err) { }
- }
- if (dataText.startsWith("[")) {
- this.messageList[messageIndex] = {
- role: "assistant",
- content: messageAiReply
- };
- observer.next({ content: "", cumulativeContent: messageAiReply, done: true });
- }
- buffer = buffer.slice(message.length + 1);
- }
- read();
- }).catch(err => observer.error(err));
- };
- read();
- });
- }),
- catchError(err => {
- console.error(err);
- return of({ content: "", cumulativeContent: "", done: true });
- }),
- finalize(() => {
-
- console.log("Stream completed");
- console.log(this.lastCompletionContent)
- this.SaveMessage()
-
-
- })
-
- );
- }
-
- }
|