model-config.tsx 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. import { ServiceProvider } from "@/app/constant";
  2. import { ModalConfigValidator, ModelConfig } from "../store";
  3. import Locale from "../locales";
  4. import { InputRange } from "./input-range";
  5. import { ListItem, Select } from "./ui-lib";
  6. import { useAllModels } from "../utils/hooks";
  7. export function ModelConfigList(props: {
  8. modelConfig: ModelConfig;
  9. updateConfig: (updater: (config: ModelConfig) => void) => void;
  10. }) {
  11. const allModels = useAllModels();
  12. const value = `${props.modelConfig.model}@${props.modelConfig?.providerName}`;
  13. const compressModelValue = `${props.modelConfig.compressModel}@${props.modelConfig?.compressProviderName}`;
  14. return (
  15. <>
  16. <ListItem title={Locale.Settings.Model}>
  17. <Select
  18. aria-label={Locale.Settings.Model}
  19. value={value}
  20. onChange={(e) => {
  21. const [model, providerName] = e.currentTarget.value.split("@");
  22. props.updateConfig((config) => {
  23. config.model = ModalConfigValidator.model(model);
  24. config.providerName = providerName as ServiceProvider;
  25. });
  26. }}
  27. >
  28. {allModels
  29. .filter((v) => v.available)
  30. .map((v, i) => (
  31. <option value={`${v.name}@${v.provider?.providerName}`} key={i}>
  32. {v.displayName}({v.provider?.providerName})
  33. </option>
  34. ))}
  35. </Select>
  36. </ListItem>
  37. <ListItem
  38. title={Locale.Settings.Temperature.Title}
  39. subTitle={Locale.Settings.Temperature.SubTitle}
  40. >
  41. <InputRange
  42. aria={Locale.Settings.Temperature.Title}
  43. value={props.modelConfig.temperature?.toFixed(1)}
  44. min="0"
  45. max="1" // lets limit it to 0-1
  46. step="0.1"
  47. onChange={(e) => {
  48. props.updateConfig(
  49. (config) =>
  50. (config.temperature = ModalConfigValidator.temperature(
  51. e.currentTarget.valueAsNumber,
  52. )),
  53. );
  54. }}
  55. ></InputRange>
  56. </ListItem>
  57. <ListItem
  58. title={Locale.Settings.TopP.Title}
  59. subTitle={Locale.Settings.TopP.SubTitle}
  60. >
  61. <InputRange
  62. aria={Locale.Settings.TopP.Title}
  63. value={(props.modelConfig.top_p ?? 1).toFixed(1)}
  64. min="0"
  65. max="1"
  66. step="0.1"
  67. onChange={(e) => {
  68. props.updateConfig(
  69. (config) =>
  70. (config.top_p = ModalConfigValidator.top_p(
  71. e.currentTarget.valueAsNumber,
  72. )),
  73. );
  74. }}
  75. ></InputRange>
  76. </ListItem>
  77. <ListItem
  78. title={Locale.Settings.MaxTokens.Title}
  79. subTitle={Locale.Settings.MaxTokens.SubTitle}
  80. >
  81. <input
  82. aria-label={Locale.Settings.MaxTokens.Title}
  83. type="number"
  84. min={1024}
  85. max={512000}
  86. value={props.modelConfig.max_tokens}
  87. onChange={(e) =>
  88. props.updateConfig(
  89. (config) =>
  90. (config.max_tokens = ModalConfigValidator.max_tokens(
  91. e.currentTarget.valueAsNumber,
  92. )),
  93. )
  94. }
  95. ></input>
  96. </ListItem>
  97. {props.modelConfig?.providerName == ServiceProvider.Google ? null : (
  98. <>
  99. <ListItem
  100. title={Locale.Settings.PresencePenalty.Title}
  101. subTitle={Locale.Settings.PresencePenalty.SubTitle}
  102. >
  103. <InputRange
  104. aria={Locale.Settings.PresencePenalty.Title}
  105. value={props.modelConfig.presence_penalty?.toFixed(1)}
  106. min="-2"
  107. max="2"
  108. step="0.1"
  109. onChange={(e) => {
  110. props.updateConfig(
  111. (config) =>
  112. (config.presence_penalty =
  113. ModalConfigValidator.presence_penalty(
  114. e.currentTarget.valueAsNumber,
  115. )),
  116. );
  117. }}
  118. ></InputRange>
  119. </ListItem>
  120. <ListItem
  121. title={Locale.Settings.FrequencyPenalty.Title}
  122. subTitle={Locale.Settings.FrequencyPenalty.SubTitle}
  123. >
  124. <InputRange
  125. aria={Locale.Settings.FrequencyPenalty.Title}
  126. value={props.modelConfig.frequency_penalty?.toFixed(1)}
  127. min="-2"
  128. max="2"
  129. step="0.1"
  130. onChange={(e) => {
  131. props.updateConfig(
  132. (config) =>
  133. (config.frequency_penalty =
  134. ModalConfigValidator.frequency_penalty(
  135. e.currentTarget.valueAsNumber,
  136. )),
  137. );
  138. }}
  139. ></InputRange>
  140. </ListItem>
  141. <ListItem
  142. title={Locale.Settings.InjectSystemPrompts.Title}
  143. subTitle={Locale.Settings.InjectSystemPrompts.SubTitle}
  144. >
  145. <input
  146. aria-label={Locale.Settings.InjectSystemPrompts.Title}
  147. type="checkbox"
  148. checked={props.modelConfig.enableInjectSystemPrompts}
  149. onChange={(e) =>
  150. props.updateConfig(
  151. (config) =>
  152. (config.enableInjectSystemPrompts =
  153. e.currentTarget.checked),
  154. )
  155. }
  156. ></input>
  157. </ListItem>
  158. <ListItem
  159. title={Locale.Settings.InputTemplate.Title}
  160. subTitle={Locale.Settings.InputTemplate.SubTitle}
  161. >
  162. <input
  163. aria-label={Locale.Settings.InputTemplate.Title}
  164. type="text"
  165. value={props.modelConfig.template}
  166. onChange={(e) =>
  167. props.updateConfig(
  168. (config) => (config.template = e.currentTarget.value),
  169. )
  170. }
  171. ></input>
  172. </ListItem>
  173. </>
  174. )}
  175. <ListItem
  176. title={Locale.Settings.HistoryCount.Title}
  177. subTitle={Locale.Settings.HistoryCount.SubTitle}
  178. >
  179. <InputRange
  180. aria={Locale.Settings.HistoryCount.Title}
  181. title={props.modelConfig.historyMessageCount.toString()}
  182. value={props.modelConfig.historyMessageCount}
  183. min="0"
  184. max="64"
  185. step="1"
  186. onChange={(e) =>
  187. props.updateConfig(
  188. (config) => (config.historyMessageCount = e.target.valueAsNumber),
  189. )
  190. }
  191. ></InputRange>
  192. </ListItem>
  193. <ListItem
  194. title={Locale.Settings.CompressThreshold.Title}
  195. subTitle={Locale.Settings.CompressThreshold.SubTitle}
  196. >
  197. <input
  198. aria-label={Locale.Settings.CompressThreshold.Title}
  199. type="number"
  200. min={500}
  201. max={4000}
  202. value={props.modelConfig.compressMessageLengthThreshold}
  203. onChange={(e) =>
  204. props.updateConfig(
  205. (config) =>
  206. (config.compressMessageLengthThreshold =
  207. e.currentTarget.valueAsNumber),
  208. )
  209. }
  210. ></input>
  211. </ListItem>
  212. <ListItem title={Locale.Memory.Title} subTitle={Locale.Memory.Send}>
  213. <input
  214. aria-label={Locale.Memory.Title}
  215. type="checkbox"
  216. checked={props.modelConfig.sendMemory}
  217. onChange={(e) =>
  218. props.updateConfig(
  219. (config) => (config.sendMemory = e.currentTarget.checked),
  220. )
  221. }
  222. ></input>
  223. </ListItem>
  224. <ListItem
  225. title={Locale.Settings.CompressModel.Title}
  226. subTitle={Locale.Settings.CompressModel.SubTitle}
  227. >
  228. <Select
  229. aria-label={Locale.Settings.CompressModel.Title}
  230. value={compressModelValue}
  231. onChange={(e) => {
  232. const [model, providerName] = e.currentTarget.value.split("@");
  233. props.updateConfig((config) => {
  234. config.compressModel = ModalConfigValidator.model(model);
  235. config.compressProviderName = providerName as ServiceProvider;
  236. });
  237. }}
  238. >
  239. {allModels
  240. .filter((v) => v.available)
  241. .map((v, i) => (
  242. <option value={`${v.name}@${v.provider?.providerName}`} key={i}>
  243. {v.displayName}({v.provider?.providerName})
  244. </option>
  245. ))}
  246. </Select>
  247. </ListItem>
  248. </>
  249. );
  250. }