export default function Config()

in spring-ai-alibaba-studio/ui/src/components/right_panel/config/index.tsx [43:270]


export default function Config(props: Props) {
  const { modelType, configFromAPI, onChangeConfig } = props;
  const [form] = Form.useForm<ChatOptions | ImageOptions>();

  const initialChatConfig: ChatOptions = {
    model: 'qwen-plus',
    temperature: 0.85,
    top_p: 0.8,
    seed: 1,
    enable_search: false,
    top_k: 0,
    stop: [],
    incremental_output: false,
    repetition_penalty: 1.1,
    tools: [],
  };
  const initialImgConfig: ImageOptions = {
    model: 'wanx-v1',
    responseFormat: '',
    n: 1,
    size: '1024*1024',
    style: '<auto>',
    seed: 0,
    ref_img: '',
    ref_strength: 0,
    ref_mode: '',
    negative_prompt: '',
  };

  const [modelOptions, setModelOptions] = useState<SelectProps['options']>([]);

  const tipLabel = (left, desc) => {
    return (
      <Tooltip title={desc} placement="topLeft">
        <Flex justify="space-between" style={{ width: 300 }}>
          <span>{left}</span>
        </Flex>
      </Tooltip>
    );
  };

  const reset = () => {
    form.resetFields();
  };

  useEffect(() => {
    const fetchData = async () => {
      const modelNameList = await chatModelsService.getModelNames(modelType);
      if (modelNameList.length > 0) {
        setModelOptions(
          modelNameList.map((modelName) => ({
            value: modelName,
            label: modelName,
          })),
        );
      }
    };
    fetchData();
    form.setFieldsValue(configFromAPI);
  }, [configFromAPI]);

  return (
    <>
      <Form
        layout="vertical"
        form={form}
        initialValues={modelType == ModelType.CHAT ? initialChatConfig : initialImgConfig}
        onValuesChange={(changedValues, allValues) => {
          console.log(changedValues, allValues);
          onChangeConfig(allValues);
        }}
      >
        <Form.Item label="Model" name="model">
          <Select style={{ width: 200 }} options={modelOptions} />
        </Form.Item>
        {modelType == ModelType.CHAT ? (
          <>
            <Form.Item
              label={tipLabel(
                'Temperature',
                '用于控制随机性和多样性的程度。具体来说,temperature值控制了生成文本时对每个候选词的概率分布进行平滑的程度。较高的temperature值会降低概率分布的峰值,使得更多的低概率词被选择,生成结果更加多样化;而较低的temperature值则会增强概率分布的峰值,使得高概率词更容易被选择,生成结果更加确定。',
              )}
              name="temperature"
            >
              <Slider max={2.0} min={0.0} step={0.1} />
            </Form.Item>
            <Form.Item
              label={tipLabel(
                'seed',
                '生成时使用的随机数种子,用户控制模型生成内容的随机性。seed支持无符号64位整数。在使用seed时,模型将尽可能生成相同或相似的结果,但目前不保证每次生成的结果完全相同。',
              )}
              name="seed"
            >
              <InputNumber min={0} max={Number.MAX_SAFE_INTEGER} />
            </Form.Item>
            <Form.Item
              label={tipLabel(
                'Top P',
                '生成时,核采样方法的概率阈值。例如,取值为0.8时,仅保留累计概率之和大于等于0.8的概率分布中的token,作为随机采样的候选集。取值范围为(0,1.0),取值越大,生成的随机性越高;取值越低,生成的随机性越低。默认值为0.8。',
              )}
              name="top_p"
            >
              <Slider max={1.0} min={0.0} step={0.1} />
            </Form.Item>
            <Form.Item
              label={tipLabel(
                'Top K',
                '生成时,采样候选集的大小。例如,取值为50时,仅将单次生成中得分最高的50个token组成随机采样的候选集。取值越大,生成的随机性越高;取值越小,生成的确定性越高。注意:如果top_k参数为空或者top_k的值大于100,表示不启用top_k策略,此时仅有top_p策略生效,默认是空。',
              )}
              name="top_k"
            >
              <Slider />
            </Form.Item>
            <Form.Item
              label={tipLabel(
                'enable_search',
                '模型内置了互联网搜索服务,该参数控制模型在生成文本时是否参考使用互联网搜索结果',
              )}
              name="enable_search"
              valuePropName="checked"
            >
              <Switch />
            </Form.Item>
            <Form.Item
              label={tipLabel(
                'repetition_penalty',
                '用于控制模型生成时的重复度。提高repetition_penalty时可以降低模型生成的重复度。1.0表示不做惩罚。默认为1.1。',
              )}
              name="repetition_penalty"
            >
              <InputNumber step={0.1} />
            </Form.Item>
          </>
        ) : modelType == ModelType.IMAGE ? (
          <>
            <Form.Item
              label={tipLabel('n', '要生成的图像数量。必须介于 1 和 4 之间')}
              name="n"
            >
              <InputNumber min={1} max={4} />
            </Form.Item>
            <Form.Item
              label={tipLabel('size_height', '输出图像的分辨率')}
              name="size"
            >
              <Select
                placeholder="输出图像的分辨率"
                allowClear
              >
                <Option value="1024*1024">1024*1024</Option>
                <Option value="720*1280">720*1280</Option>
                <Option value="768*1152">768*1152</Option>
                <Option value="1280*720">1280*720</Option>
              </Select>
            </Form.Item>
            <Form.Item label={tipLabel('style', '生成图片风格')} name="style">
              <Select placeholder="图片风格" allowClear>
                <Option value="<photography>">摄影</Option>
                <Option value="<portrait>">人像写真</Option>
                <Option value="<3d cartoon>">3D卡通</Option>
                <Option value="<anime>">动画</Option>
                <Option value="<oil painting>">油画</Option>
                <Option value="<watercolor>">水彩</Option>
                <Option value="<sketch>">素描</Option>
                <Option value="<chinese painting>">中国画</Option>
                <Option value="<flat illustration>">扁平插画</Option>
                <Option value="<auto>">默认值,由模型随机输出图像风格</Option>
              </Select>
            </Form.Item>
            <Form.Item
              label={tipLabel(
                'seed',
                '随机数种子,用于控制模型生成内容的随机性',
              )}
              name="seed"
            >
              <InputNumber min={0} max={4294967290} />
            </Form.Item>
            <Form.Item
              label={tipLabel(
                'ref_img',
                '参考图像(垫图)的URL地址,模型根据参考图像生成相似风格的图像,支持jpg、png、tiff、webp',
              )}
              name="ref_img"
            >
              <Input />
            </Form.Item>
            <Form.Item
              label={tipLabel(
                'ref_strength',
                '控制输出图像与垫图(参考图)的相似度。取值范围为[0.0, 1.0]。取值越大,代表生成的图像与参考图越相似。',
              )}
              name="ref_strength"
            >
              <Slider max={1.0} min={0.0} step={0.1} />
            </Form.Item>
            <Form.Item
              label={tipLabel('ref_mode', '基于垫图(参考图)生成图像的模式。')}
              name="ref_mode"
            >
              <Select
                placeholder="基于垫图(参考图)生成图像的模式"
                allowClear
              >
                <Option value="repaint">基于参考图的内容生成图像</Option>
                <Option value="refonly">基于参考图的风格生成图像</Option>
              </Select>
            </Form.Item>
            <Form.Item
              label={tipLabel(
                'negative_prompt',
                '反向提示词,用来描述不希望在画面中看到的内容,可以对画面进行限制。支持中英文,长度不超过500个字符,超过部分会自动截断。',
              )}
              name="negative_prompt"
            >
              <Input placeholder="反向提示词,对画面进行限制" />
            </Form.Item>
          </>
        ) : (
          <></>
        )}
      </Form>
      <Flex justify="center">
        <Button onClick={reset}>Reset</Button>
      </Flex>
    </>
  );
}