You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

completion-params.ts 2.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. isAdvancedMode: boolean = false,
  6. ): { params: FormValue; removedDetails: Record<string, string> } => {
  7. if (!oldParams || Object.keys(oldParams).length === 0)
  8. return { params: {}, removedDetails: {} }
  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 (key === 'stop' && isAdvancedMode) {
  17. // keep stop in advanced mode
  18. nextParams[key] = value
  19. return
  20. }
  21. const rule = ruleMap[key]
  22. if (!rule) {
  23. removedDetails[key] = 'unsupported'
  24. return
  25. }
  26. switch (rule.type) {
  27. case 'int':
  28. case 'float': {
  29. if (typeof value !== 'number') {
  30. removedDetails[key] = 'invalid type'
  31. return
  32. }
  33. const min = rule.min ?? Number.NEGATIVE_INFINITY
  34. const max = rule.max ?? Number.POSITIVE_INFINITY
  35. if (value < min || value > max) {
  36. removedDetails[key] = `out of range (${min}-${max})`
  37. return
  38. }
  39. nextParams[key] = value
  40. return
  41. }
  42. case 'boolean': {
  43. if (typeof value !== 'boolean') {
  44. removedDetails[key] = 'invalid type'
  45. return
  46. }
  47. nextParams[key] = value
  48. return
  49. }
  50. case 'string':
  51. case 'text': {
  52. if (typeof value !== 'string') {
  53. removedDetails[key] = 'invalid type'
  54. return
  55. }
  56. if (Array.isArray(rule.options) && rule.options.length) {
  57. if (!(rule.options as string[]).includes(value)) {
  58. removedDetails[key] = 'unsupported option'
  59. return
  60. }
  61. }
  62. nextParams[key] = value
  63. return
  64. }
  65. default: {
  66. removedDetails[key] = `unsupported rule type: ${(rule as any)?.type ?? 'unknown'}`
  67. }
  68. }
  69. })
  70. return { params: nextParams, removedDetails }
  71. }
  72. export const fetchAndMergeValidCompletionParams = async (
  73. provider: string,
  74. modelId: string,
  75. oldParams: FormValue | undefined,
  76. isAdvancedMode: boolean = false,
  77. ): Promise<{ params: FormValue; removedDetails: Record<string, string> }> => {
  78. const { fetchModelParameterRules } = await import('@/service/common')
  79. const url = `/workspaces/current/model-providers/${provider}/models/parameter-rules?model=${modelId}`
  80. const { data: parameterRules } = await fetchModelParameterRules(url)
  81. return mergeValidCompletionParams(oldParams, parameterRules ?? [], isAdvancedMode)
  82. }