requests.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import type { ChatRequest, ChatReponse } from "./api/chat/typing";
  2. import { Message } from "./store";
  3. const makeRequestParam = (messages: Message[], stream = false): ChatRequest => {
  4. return {
  5. model: "gpt-3.5-turbo",
  6. messages: messages
  7. .map((v) => ({
  8. role: v.role,
  9. content: v.content,
  10. }))
  11. .filter((m) => m.role !== "assistant"),
  12. stream,
  13. };
  14. };
  15. export async function requestChat(messages: Message[]) {
  16. const req: ChatRequest = makeRequestParam(messages);
  17. const res = await fetch("/api/chat", {
  18. method: "POST",
  19. headers: {
  20. "Content-Type": "application/json",
  21. },
  22. body: JSON.stringify(req),
  23. });
  24. return (await res.json()) as ChatReponse;
  25. }
  26. export async function requestChatStream(
  27. messages: Message[],
  28. options?: {
  29. onMessage: (message: string, done: boolean) => void;
  30. }
  31. ) {
  32. const req = makeRequestParam(messages, true);
  33. const res = await fetch("/api/chat-stream", {
  34. method: "POST",
  35. headers: {
  36. "Content-Type": "application/json",
  37. },
  38. body: JSON.stringify(req),
  39. });
  40. let responseText = "";
  41. if (res.ok) {
  42. const reader = res.body?.getReader();
  43. const decoder = new TextDecoder();
  44. while (true) {
  45. const content = await reader?.read();
  46. const text = decoder.decode(content?.value);
  47. responseText += text;
  48. const done = !content || content.done;
  49. options?.onMessage(responseText, false);
  50. if (done) {
  51. break;
  52. }
  53. }
  54. options?.onMessage(responseText, true);
  55. }
  56. }
  57. export async function requestWithPrompt(messages: Message[], prompt: string) {
  58. messages = messages.concat([
  59. {
  60. role: "system",
  61. content: prompt,
  62. date: new Date().toLocaleString(),
  63. },
  64. ]);
  65. const res = await requestChat(messages);
  66. return res.choices.at(0)?.message?.content ?? "";
  67. }