aiModel.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { useXAgent, XStream } from "@ant-design/x";
  2. import { useRef, useState } from "react";
  3. type MessageItem = {
  4. answer: string;
  5. conversation_id: string;
  6. created_at: number;
  7. event: "message" | "message_end" | "message_error" | "ping";
  8. message_id: string;
  9. task_id: string;
  10. };
  11. type ChatParams = {
  12. // 应用名称
  13. app_name: string;
  14. // 会话内容
  15. chat_query: string;
  16. // 会话名称 第一次
  17. chat_name?: string;
  18. // 会话id 后续会话带入
  19. conversation_id?: string;
  20. };
  21. export default function aiModel() {
  22. const [loading, setLoading] = useState(false);
  23. const abortController = useRef<AbortController | null>(null);
  24. // 封装智能体
  25. const [agent] = useXAgent<MessageItem>({
  26. request: async (message, { onError, onSuccess, onUpdate }) => {
  27. abortController.current = new AbortController();
  28. const signal = abortController.current.signal;
  29. try {
  30. setLoading(true);
  31. const response = await fetch(
  32. "https://design.shalu.com/api/ai/chat-message",
  33. {
  34. method: "POST",
  35. body: JSON.stringify(message),
  36. headers: {
  37. Authorization: localStorage.getItem("token_a") || "",
  38. "Content-Type": "application/json",
  39. },
  40. signal
  41. }
  42. );
  43. if (response.body) {
  44. for await (const chunk of XStream({
  45. readableStream: response.body,
  46. })) {
  47. const data = JSON.parse(chunk.data);
  48. if (data?.event === "message") {
  49. onUpdate(data);
  50. }
  51. if (data?.event === "message_end") {
  52. onSuccess(data);
  53. }
  54. if (data?.event === "message_error") {
  55. onError(data);
  56. }
  57. if (data?.event === "ping") {
  58. console.log("start");
  59. }
  60. }
  61. }
  62. } catch (error) {
  63. // 判断是不是 abort 错误
  64. if (signal.aborted) {
  65. return;
  66. }
  67. onError(error as Error);
  68. } finally {
  69. setLoading(false);
  70. }
  71. },
  72. });
  73. // 停止对话
  74. const cancel = () => {
  75. abortController.current?.abort();
  76. };
  77. return {
  78. agent,
  79. loading,
  80. setLoading,
  81. cancel,
  82. };
  83. }