import { ValidatedStatus } from '../key-validator/declarations' import type { CredentialFormSchemaRadio, CredentialFormSchemaTextInput, FormValue, ModelLoadBalancingConfig, } from './declarations' import { ConfigurationMethodEnum, FormTypeEnum, MODEL_TYPE_TEXT, ModelTypeEnum, } from './declarations' import { deleteModelProvider, setModelProvider, validateModelLoadBalancingCredentials, validateModelProvider, } from '@/service/common' export const MODEL_PROVIDER_QUOTA_GET_PAID = ['anthropic', 'openai', 'azure_openai'] export const DEFAULT_BACKGROUND_COLOR = '#F3F4F6' export const isNullOrUndefined = (value: any) => { return value === undefined || value === null } export const validateCredentials = async (predefined: boolean, provider: string, v: FormValue) => { let body, url if (predefined) { body = { credentials: v, } url = `/workspaces/current/model-providers/${provider}/credentials/validate` } else { const { __model_name, __model_type, ...credentials } = v body = { model: __model_name, model_type: __model_type, credentials, } url = `/workspaces/current/model-providers/${provider}/models/credentials/validate` } try { const res = await validateModelProvider({ url, body }) if (res.result === 'success') return Promise.resolve({ status: ValidatedStatus.Success }) else return Promise.resolve({ status: ValidatedStatus.Error, message: res.error || 'error' }) } catch (e: any) { return Promise.resolve({ status: ValidatedStatus.Error, message: e.message }) } } export const validateLoadBalancingCredentials = async (predefined: boolean, provider: string, v: FormValue, id?: string): Promise<{ status: ValidatedStatus message?: string }> => { const { __model_name, __model_type, ...credentials } = v try { const res = await validateModelLoadBalancingCredentials({ url: `/workspaces/current/model-providers/${provider}/models/load-balancing-configs/${id ? `${id}/` : ''}credentials-validate`, body: { model: __model_name, model_type: __model_type, credentials, }, }) if (res.result === 'success') return Promise.resolve({ status: ValidatedStatus.Success }) else return Promise.resolve({ status: ValidatedStatus.Error, message: res.error || 'error' }) } catch (e: any) { return Promise.resolve({ status: ValidatedStatus.Error, message: e.message }) } } export const saveCredentials = async (predefined: boolean, provider: string, v: FormValue, loadBalancing?: ModelLoadBalancingConfig) => { let body, url if (predefined) { body = { config_from: ConfigurationMethodEnum.predefinedModel, credentials: v, load_balancing: loadBalancing, } url = `/workspaces/current/model-providers/${provider}` } else { const { __model_name, __model_type, ...credentials } = v body = { model: __model_name, model_type: __model_type, credentials, load_balancing: loadBalancing, } url = `/workspaces/current/model-providers/${provider}/models` } return setModelProvider({ url, body }) } export const savePredefinedLoadBalancingConfig = async (provider: string, v: FormValue, loadBalancing?: ModelLoadBalancingConfig) => { const { __model_name, __model_type, ...credentials } = v const body = { config_from: ConfigurationMethodEnum.predefinedModel, model: __model_name, model_type: __model_type, credentials, load_balancing: loadBalancing, } const url = `/workspaces/current/model-providers/${provider}/models` return setModelProvider({ url, body }) } export const removeCredentials = async (predefined: boolean, provider: string, v: FormValue) => { let url = '' let body if (predefined) { url = `/workspaces/current/model-providers/${provider}` } else { if (v) { const { __model_name, __model_type } = v body = { model: __model_name, model_type: __model_type, } url = `/workspaces/current/model-providers/${provider}/models` } } return deleteModelProvider({ url, body }) } export const sizeFormat = (size: number) => { const remainder = Math.floor(size / 1000) if (remainder < 1) return `${size}` else return `${remainder}K` } export const modelTypeFormat = (modelType: ModelTypeEnum) => { if (modelType === ModelTypeEnum.textEmbedding) return 'TEXT EMBEDDING' return modelType.toLocaleUpperCase() } export const genModelTypeFormSchema = (modelTypes: ModelTypeEnum[]) => { return { type: FormTypeEnum.radio, label: { zh_Hans: '模型类型', en_US: 'Model Type', }, variable: '__model_type', default: modelTypes[0], required: true, show_on: [], options: modelTypes.map((modelType: ModelTypeEnum) => { return { value: modelType, label: { zh_Hans: MODEL_TYPE_TEXT[modelType], en_US: MODEL_TYPE_TEXT[modelType], }, show_on: [], } }), } as CredentialFormSchemaRadio } export const genModelNameFormSchema = (model?: Pick) => { return { type: FormTypeEnum.textInput, label: model?.label || { zh_Hans: '模型名称', en_US: 'Model Name', }, variable: '__model_name', required: true, show_on: [], placeholder: model?.placeholder || { zh_Hans: '请输入模型名称', en_US: 'Please enter model name', }, } as CredentialFormSchemaTextInput }