class-chat-completion.ts 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. export interface TestChatMessage{
  2. role:string
  3. content:string
  4. }
  5. export class TestChatCompletion{
  6. messageList:Array<TestChatMessage>
  7. constructor(messageList:Array<TestChatMessage>){
  8. this.messageList = messageList
  9. }
  10. async createCompletionByStream() {
  11. let token = localStorage.getItem("token");
  12. let bodyJson = {
  13. "token": `Bearer ${token}`,
  14. "messages": this.messageList,
  15. "model": "fmode-4.5-128k",
  16. "temperature": 0.5,
  17. "presence_penalty": 0,
  18. "frequency_penalty": 0,
  19. "top_p": 1,
  20. "stream":true
  21. };
  22. let response = await fetch("https://test.fmode.cn/api/apig/aigc/gpt/v1/chat/completions", {
  23. "headers": {
  24. "accept": "text/event-stream",
  25. "sec-fetch-dest": "empty",
  26. "sec-fetch-mode": "cors",
  27. "sec-fetch-site": "same-site"
  28. },
  29. "referrer": "https://ai.fmode.cn/",
  30. "body": JSON.stringify(bodyJson),
  31. "method": "POST",
  32. "mode": "cors",
  33. "credentials": "omit"
  34. });
  35. let messageAiReply = ""
  36. let messageIndex = this.messageList.length
  37. let reader = response.body?.getReader();
  38. if (!reader) {
  39. throw new Error("Failed to get the response reader.");
  40. }
  41. let decoder = new TextDecoder();
  42. let buffer = "";
  43. while (true) {
  44. let { done, value } = await reader.read();
  45. if (done) {
  46. break;
  47. }
  48. buffer += decoder.decode(value);
  49. // Split the buffer by newlines to get individual messages
  50. let messages = buffer.split("\n");
  51. // Process each message
  52. for (let i = 0; i < messages.length - 1; i++) {
  53. let message = messages[i];
  54. // Process the message as needed
  55. /**
  56. * data: {"id":"chatcmpl-y2PLKqPDnwAFJIj2L5aqdH5TWK9Yv","object":"chat.completion.chunk","created":1696770162,"model":"fmode-4.5-128k","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
  57. * data: {"id":"chatcmpl-y2PLKqPDnwAFJIj2L5aqdH5TWK9Yv","object":"chat.completion.chunk","created":1696770162,"model":"fmode-4.5-128k","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
  58. * data: [DONE]
  59. */
  60. let dataText = message.replace("data:\ ","")
  61. if(dataText.startsWith("{")){
  62. try{
  63. let dataJson = JSON.parse(dataText)
  64. console.log(dataJson)
  65. messageAiReply += dataJson?.choices?.[0]?.delta?.content || ""
  66. this.messageList[messageIndex] = {
  67. role:"assistant",
  68. content:messageAiReply
  69. }
  70. }catch(err){}
  71. }
  72. if(dataText.startsWith("[")){
  73. console.log(message)
  74. console.log("完成")
  75. this.messageList[messageIndex] = {
  76. role:"assistant",
  77. content:messageAiReply
  78. }
  79. messageAiReply = ""
  80. }
  81. // Parse the message as JSON
  82. // let data = JSON.parse(message);
  83. // Clear the processed message from the buffer
  84. buffer = buffer.slice(message.length + 1);
  85. }
  86. }
  87. }
  88. }