model-config.tsx 6.1 KB

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