model-config.tsx 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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. value={value}
  18. onChange={(e) => {
  19. const [model, providerName] = e.currentTarget.value.split("@");
  20. props.updateConfig((config) => {
  21. config.model = ModalConfigValidator.model(model);
  22. config.providerName = providerName as ServiceProvider;
  23. });
  24. }}
  25. >
  26. {allModels
  27. .filter((v) => v.available)
  28. .map((v, i) => (
  29. <option value={`${v.name}@${v.provider?.providerName}`} key={i}>
  30. {v.displayName}({v.provider?.providerName})
  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={1024}
  80. max={512000}
  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. {props.modelConfig?.providerName == ServiceProvider.Google ? null : (
  93. <>
  94. <ListItem
  95. title={Locale.Settings.PresencePenalty.Title}
  96. subTitle={Locale.Settings.PresencePenalty.SubTitle}
  97. >
  98. <InputRange
  99. value={props.modelConfig.presence_penalty?.toFixed(1)}
  100. min="-2"
  101. max="2"
  102. step="0.1"
  103. onChange={(e) => {
  104. props.updateConfig(
  105. (config) =>
  106. (config.presence_penalty =
  107. ModalConfigValidator.presence_penalty(
  108. e.currentTarget.valueAsNumber,
  109. )),
  110. );
  111. }}
  112. ></InputRange>
  113. </ListItem>
  114. <ListItem
  115. title={Locale.Settings.FrequencyPenalty.Title}
  116. subTitle={Locale.Settings.FrequencyPenalty.SubTitle}
  117. >
  118. <InputRange
  119. value={props.modelConfig.frequency_penalty?.toFixed(1)}
  120. min="-2"
  121. max="2"
  122. step="0.1"
  123. onChange={(e) => {
  124. props.updateConfig(
  125. (config) =>
  126. (config.frequency_penalty =
  127. ModalConfigValidator.frequency_penalty(
  128. e.currentTarget.valueAsNumber,
  129. )),
  130. );
  131. }}
  132. ></InputRange>
  133. </ListItem>
  134. <ListItem
  135. title={Locale.Settings.InjectSystemPrompts.Title}
  136. subTitle={Locale.Settings.InjectSystemPrompts.SubTitle}
  137. >
  138. <input
  139. type="checkbox"
  140. checked={props.modelConfig.enableInjectSystemPrompts}
  141. onChange={(e) =>
  142. props.updateConfig(
  143. (config) =>
  144. (config.enableInjectSystemPrompts =
  145. e.currentTarget.checked),
  146. )
  147. }
  148. ></input>
  149. </ListItem>
  150. <ListItem
  151. title={Locale.Settings.InputTemplate.Title}
  152. subTitle={Locale.Settings.InputTemplate.SubTitle}
  153. >
  154. <input
  155. type="text"
  156. value={props.modelConfig.template}
  157. onChange={(e) =>
  158. props.updateConfig(
  159. (config) => (config.template = e.currentTarget.value),
  160. )
  161. }
  162. ></input>
  163. </ListItem>
  164. </>
  165. )}
  166. <ListItem
  167. title={Locale.Settings.HistoryCount.Title}
  168. subTitle={Locale.Settings.HistoryCount.SubTitle}
  169. >
  170. <InputRange
  171. title={props.modelConfig.historyMessageCount.toString()}
  172. value={props.modelConfig.historyMessageCount}
  173. min="0"
  174. max="64"
  175. step="1"
  176. onChange={(e) =>
  177. props.updateConfig(
  178. (config) => (config.historyMessageCount = e.target.valueAsNumber),
  179. )
  180. }
  181. ></InputRange>
  182. </ListItem>
  183. <ListItem
  184. title={Locale.Settings.CompressThreshold.Title}
  185. subTitle={Locale.Settings.CompressThreshold.SubTitle}
  186. >
  187. <input
  188. type="number"
  189. min={500}
  190. max={4000}
  191. value={props.modelConfig.compressMessageLengthThreshold}
  192. onChange={(e) =>
  193. props.updateConfig(
  194. (config) =>
  195. (config.compressMessageLengthThreshold =
  196. e.currentTarget.valueAsNumber),
  197. )
  198. }
  199. ></input>
  200. </ListItem>
  201. <ListItem title={Locale.Memory.Title} subTitle={Locale.Memory.Send}>
  202. <input
  203. type="checkbox"
  204. checked={props.modelConfig.sendMemory}
  205. onChange={(e) =>
  206. props.updateConfig(
  207. (config) => (config.sendMemory = e.currentTarget.checked),
  208. )
  209. }
  210. ></input>
  211. </ListItem>
  212. </>
  213. );
  214. }