model-config.tsx 7.6 KB

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