model-config.tsx 7.3 KB

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