config.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import { create } from "zustand";
  2. import { persist } from "zustand/middleware";
  3. export enum SubmitKey {
  4. Enter = "Enter",
  5. CtrlEnter = "Ctrl + Enter",
  6. ShiftEnter = "Shift + Enter",
  7. AltEnter = "Alt + Enter",
  8. MetaEnter = "Meta + Enter",
  9. }
  10. export enum Theme {
  11. Auto = "auto",
  12. Dark = "dark",
  13. Light = "light",
  14. }
  15. const DEFAULT_CONFIG = {
  16. sendBotMessages: true as boolean,
  17. submitKey: SubmitKey.CtrlEnter as SubmitKey,
  18. avatar: "1f603",
  19. fontSize: 14,
  20. theme: Theme.Auto as Theme,
  21. tightBorder: false,
  22. sendPreviewBubble: true,
  23. sidebarWidth: 300,
  24. disablePromptHint: false,
  25. modelConfig: {
  26. model: "gpt-3.5-turbo" as ModelType,
  27. temperature: 1,
  28. max_tokens: 2000,
  29. presence_penalty: 0,
  30. sendMemory: true,
  31. historyMessageCount: 4,
  32. compressMessageLengthThreshold: 1000,
  33. },
  34. };
  35. export type ChatConfig = typeof DEFAULT_CONFIG;
  36. export type ChatConfigStore = ChatConfig & {
  37. reset: () => void;
  38. update: (updater: (config: ChatConfig) => void) => void;
  39. };
  40. export type ModelConfig = ChatConfig["modelConfig"];
  41. const ENABLE_GPT4 = true;
  42. export const ALL_MODELS = [
  43. {
  44. name: "gpt-4",
  45. available: ENABLE_GPT4,
  46. },
  47. {
  48. name: "gpt-4-0314",
  49. available: ENABLE_GPT4,
  50. },
  51. {
  52. name: "gpt-4-32k",
  53. available: ENABLE_GPT4,
  54. },
  55. {
  56. name: "gpt-4-32k-0314",
  57. available: ENABLE_GPT4,
  58. },
  59. {
  60. name: "gpt-3.5-turbo",
  61. available: true,
  62. },
  63. {
  64. name: "gpt-3.5-turbo-0301",
  65. available: true,
  66. },
  67. ] as const;
  68. export type ModelType = (typeof ALL_MODELS)[number]["name"];
  69. export function limitNumber(
  70. x: number,
  71. min: number,
  72. max: number,
  73. defaultValue: number,
  74. ) {
  75. if (typeof x !== "number" || isNaN(x)) {
  76. return defaultValue;
  77. }
  78. return Math.min(max, Math.max(min, x));
  79. }
  80. export function limitModel(name: string) {
  81. return ALL_MODELS.some((m) => m.name === name && m.available)
  82. ? name
  83. : ALL_MODELS[4].name;
  84. }
  85. export const ModalConfigValidator = {
  86. model(x: string) {
  87. return limitModel(x) as ModelType;
  88. },
  89. max_tokens(x: number) {
  90. return limitNumber(x, 0, 32000, 2000);
  91. },
  92. presence_penalty(x: number) {
  93. return limitNumber(x, -2, 2, 0);
  94. },
  95. temperature(x: number) {
  96. return limitNumber(x, 0, 2, 1);
  97. },
  98. };
  99. const CONFIG_KEY = "app-config";
  100. export const useAppConfig = create<ChatConfigStore>()(
  101. persist(
  102. (set, get) => ({
  103. ...DEFAULT_CONFIG,
  104. reset() {
  105. set(() => ({ ...DEFAULT_CONFIG }));
  106. },
  107. update(updater) {
  108. const config = { ...get() };
  109. updater(config);
  110. set(() => config);
  111. },
  112. }),
  113. {
  114. name: CONFIG_KEY,
  115. },
  116. ),
  117. );