model-config.tsx 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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.models.map((v) => (
  25. <option value={v.name} key={v.name} 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.temperature = 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.InputTemplate.Title}
  130. subTitle={Locale.Settings.InputTemplate.SubTitle}
  131. >
  132. <input
  133. type="text"
  134. value={props.modelConfig.template}
  135. onChange={(e) =>
  136. props.updateConfig(
  137. (config) => (config.template = e.currentTarget.value),
  138. )
  139. }
  140. ></input>
  141. </ListItem>
  142. <ListItem
  143. title={Locale.Settings.HistoryCount.Title}
  144. subTitle={Locale.Settings.HistoryCount.SubTitle}
  145. >
  146. <InputRange
  147. title={props.modelConfig.historyMessageCount.toString()}
  148. value={props.modelConfig.historyMessageCount}
  149. min="0"
  150. max="32"
  151. step="1"
  152. onChange={(e) =>
  153. props.updateConfig(
  154. (config) => (config.historyMessageCount = e.target.valueAsNumber),
  155. )
  156. }
  157. ></InputRange>
  158. </ListItem>
  159. <ListItem
  160. title={Locale.Settings.CompressThreshold.Title}
  161. subTitle={Locale.Settings.CompressThreshold.SubTitle}
  162. >
  163. <input
  164. type="number"
  165. min={500}
  166. max={4000}
  167. value={props.modelConfig.compressMessageLengthThreshold}
  168. onChange={(e) =>
  169. props.updateConfig(
  170. (config) =>
  171. (config.compressMessageLengthThreshold =
  172. e.currentTarget.valueAsNumber),
  173. )
  174. }
  175. ></input>
  176. </ListItem>
  177. <ListItem title={Locale.Memory.Title} subTitle={Locale.Memory.Send}>
  178. <input
  179. type="checkbox"
  180. checked={props.modelConfig.sendMemory}
  181. onChange={(e) =>
  182. props.updateConfig(
  183. (config) => (config.sendMemory = e.currentTarget.checked),
  184. )
  185. }
  186. ></input>
  187. </ListItem>
  188. </>
  189. );
  190. }