config.ts 2.5 KB

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