model-config.tsx 5.7 KB

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