api.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import { fetchEventSource } from "@microsoft/fetch-event-source";
  2. import { ACCESS_CODE_PREFIX } from "../constant";
  3. import { ModelType, useAccessStore } from "../store";
  4. import { ChatGPTApi } from "./platforms/openai";
  5. export enum MessageRole {
  6. System = "system",
  7. User = "user",
  8. Assistant = "assistant",
  9. }
  10. export const Models = ["gpt-3.5-turbo", "gpt-4"] as const;
  11. export type ChatModel = ModelType;
  12. export interface Message {
  13. role: MessageRole;
  14. content: string;
  15. }
  16. export interface LLMConfig {
  17. temperature?: number;
  18. topP?: number;
  19. stream?: boolean;
  20. presencePenalty?: number;
  21. frequencyPenalty?: number;
  22. }
  23. export interface ChatOptions {
  24. messages: Message[];
  25. model: ChatModel;
  26. config: LLMConfig;
  27. onUpdate: (message: string, chunk: string) => void;
  28. onFinish: (message: string) => void;
  29. onError: (err: Error) => void;
  30. onUnAuth: () => void;
  31. }
  32. export interface LLMUsage {
  33. used: number;
  34. total: number;
  35. }
  36. export abstract class LLMApi {
  37. abstract chat(options: ChatOptions): Promise<void>;
  38. abstract usage(): Promise<LLMUsage>;
  39. }
  40. export class ClientApi {
  41. public llm: LLMApi;
  42. constructor() {
  43. this.llm = new ChatGPTApi();
  44. }
  45. headers() {
  46. const accessStore = useAccessStore.getState();
  47. let headers: Record<string, string> = {};
  48. const makeBearer = (token: string) => `Bearer ${token.trim()}`;
  49. const validString = (x: string) => x && x.length > 0;
  50. // use user's api key first
  51. if (validString(accessStore.token)) {
  52. headers.Authorization = makeBearer(accessStore.token);
  53. } else if (
  54. accessStore.enabledAccessControl() &&
  55. validString(accessStore.accessCode)
  56. ) {
  57. headers.Authorization = makeBearer(
  58. ACCESS_CODE_PREFIX + accessStore.accessCode,
  59. );
  60. }
  61. return headers;
  62. }
  63. config() {}
  64. prompts() {}
  65. masks() {}
  66. }
  67. export const api = new ClientApi();
  68. export function getHeaders() {
  69. const accessStore = useAccessStore.getState();
  70. let headers: Record<string, string> = {
  71. "Content-Type": "application/json",
  72. };
  73. const makeBearer = (token: string) => `Bearer ${token.trim()}`;
  74. const validString = (x: string) => x && x.length > 0;
  75. // use user's api key first
  76. if (validString(accessStore.token)) {
  77. headers.Authorization = makeBearer(accessStore.token);
  78. } else if (
  79. accessStore.enabledAccessControl() &&
  80. validString(accessStore.accessCode)
  81. ) {
  82. headers.Authorization = makeBearer(
  83. ACCESS_CODE_PREFIX + accessStore.accessCode,
  84. );
  85. }
  86. return headers;
  87. }