Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

completion-params.ts 2.7KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import type { FormValue, ModelParameterRule } from '@/app/components/header/account-setting/model-provider-page/declarations'
  2. export const mergeValidCompletionParams = (
  3. oldParams: FormValue | undefined,
  4. rules: ModelParameterRule[],
  5. ): { params: FormValue; removedDetails: Record<string, string> } => {
  6. if (!oldParams || Object.keys(oldParams).length === 0)
  7. return { params: {}, removedDetails: {} }
  8. const acceptedKeys = new Set(rules.map(r => r.name))
  9. const ruleMap: Record<string, ModelParameterRule> = {}
  10. rules.forEach((r) => {
  11. ruleMap[r.name] = r
  12. })
  13. const nextParams: FormValue = {}
  14. const removedDetails: Record<string, string> = {}
  15. Object.entries(oldParams).forEach(([key, value]) => {
  16. if (!acceptedKeys.has(key)) {
  17. removedDetails[key] = 'unsupported'
  18. return
  19. }
  20. const rule = ruleMap[key]
  21. if (!rule) {
  22. removedDetails[key] = 'unsupported'
  23. return
  24. }
  25. switch (rule.type) {
  26. case 'int':
  27. case 'float': {
  28. if (typeof value !== 'number') {
  29. removedDetails[key] = 'invalid type'
  30. return
  31. }
  32. const min = rule.min ?? Number.NEGATIVE_INFINITY
  33. const max = rule.max ?? Number.POSITIVE_INFINITY
  34. if (value < min || value > max) {
  35. removedDetails[key] = `out of range (${min}-${max})`
  36. return
  37. }
  38. nextParams[key] = value
  39. return
  40. }
  41. case 'boolean': {
  42. if (typeof value !== 'boolean') {
  43. removedDetails[key] = 'invalid type'
  44. return
  45. }
  46. nextParams[key] = value
  47. return
  48. }
  49. case 'string':
  50. case 'text': {
  51. if (typeof value !== 'string') {
  52. removedDetails[key] = 'invalid type'
  53. return
  54. }
  55. if (Array.isArray(rule.options) && rule.options.length) {
  56. if (!(rule.options as string[]).includes(value)) {
  57. removedDetails[key] = 'unsupported option'
  58. return
  59. }
  60. }
  61. nextParams[key] = value
  62. return
  63. }
  64. default: {
  65. removedDetails[key] = `unsupported rule type: ${(rule as any)?.type ?? 'unknown'}`
  66. }
  67. }
  68. })
  69. return { params: nextParams, removedDetails }
  70. }
  71. export const fetchAndMergeValidCompletionParams = async (
  72. provider: string,
  73. modelId: string,
  74. oldParams: FormValue | undefined,
  75. ): Promise<{ params: FormValue; removedDetails: Record<string, string> }> => {
  76. const { fetchModelParameterRules } = await import('@/service/common')
  77. const url = `/workspaces/current/model-providers/${provider}/models/parameter-rules?model=${modelId}`
  78. const { data: parameterRules } = await fetchModelParameterRules(url)
  79. return mergeValidCompletionParams(oldParams, parameterRules ?? [])
  80. }