model-config.tsx 6.5 KB

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