diff --git a/frontend/src/components/ui/autocomplete.tsx b/frontend/src/components/ui/autocomplete.tsx index 7ca1623..1440754 100644 --- a/frontend/src/components/ui/autocomplete.tsx +++ b/frontend/src/components/ui/autocomplete.tsx @@ -13,6 +13,7 @@ type AutoCompleteProps = Omit, 'valu value: string onChange: (value: string) => void options: AutoCompleteOption[] + maxOptions?: number emptyText?: string dropdownClassName?: string inputClassName?: string @@ -41,6 +42,7 @@ export const AutoCompleteInput = React.forwardRef { return options.findIndex((candidate) => candidate.value === option.value) === index }) - const filteredOptions = dedupedOptions.filter((option) => matchesOption(option, query)).slice(0, 12) + const matchedOptions = dedupedOptions.filter((option) => matchesOption(option, query)) + const filteredOptions = typeof maxOptions === 'number' ? matchedOptions.slice(0, maxOptions) : matchedOptions const handleSelect = (selectedValue: string) => { onChange(selectedValue) diff --git a/frontend/src/pages/ApiTest.tsx b/frontend/src/pages/ApiTest.tsx index 56e1ee8..ec8851d 100644 --- a/frontend/src/pages/ApiTest.tsx +++ b/frontend/src/pages/ApiTest.tsx @@ -114,33 +114,10 @@ export function ApiTest() { [apiToken, tokens, channels] ) - useEffect(() => { - if (availableModels.length === 0) { - return - } - - if (modelValue) { - return - } - - const nextModel = availableModels[0] - setModelValue(nextModel) - setRequestBody((currentBody) => { - try { - const parsedBody = JSON.parse(currentBody) - parsedBody.model = nextModel - return JSON.stringify(parsedBody, null, 2) - } catch { - return buildRequestBody(endpoint, nextModel) - } - }) - }, [availableModels]) - const handleEndpointChange = (newEndpoint: string) => { setEndpoint(newEndpoint) - const nextModel = availableModels[0] || '' - setModelValue(nextModel) - setRequestBody(buildRequestBody(newEndpoint, nextModel)) + setModelValue('') + setRequestBody(buildRequestBody(newEndpoint)) } const handleCopyResponse = async () => { @@ -167,7 +144,11 @@ export function ApiTest() { try { const parsedBody = JSON.parse(requestBody) - parsedBody.model = nextModel + if (nextModel) { + parsedBody.model = nextModel + } else { + delete parsedBody.model + } setRequestBody(JSON.stringify(parsedBody, null, 2)) } catch { setRequestBody(buildRequestBody(endpoint, nextModel)) @@ -181,6 +162,8 @@ export function ApiTest() { const parsedBody = JSON.parse(value) if (typeof parsedBody?.model === 'string') { setModelValue(parsedBody.model) + } else { + setModelValue('') } } catch { // Keep the current model selection while the JSON is temporarily invalid. @@ -289,6 +272,7 @@ export function ApiTest() { placeholder="选择或输入模型名称" inputClassName="font-mono" options={modelOptions} + maxOptions={availableModels.length} emptyText="没有匹配的模型" />