model-config.tsx 6.0 KB

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