allow users to deselect reranking (#2243)

This commit is contained in:
pablodanswer 2024-08-30 15:40:54 -07:00 committed by GitHub
parent 4181124e7a
commit df31cac1f1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 224 additions and 201 deletions

View File

@ -25,7 +25,6 @@ const AdvancedFormPage = forwardRef<FormikProps<any>, AdvancedFormPageProps>(
<Form> <Form>
<div key="prune_freq"> <div key="prune_freq">
<NumberInput <NumberInput
showNeverIfZero
description={` description={`
Checks all documents against the source to delete those that no longer exist. Checks all documents against the source to delete those that no longer exist.
Note: This process checks every document, so be cautious when increasing frequency. Note: This process checks every document, so be cautious when increasing frequency.
@ -42,7 +41,6 @@ const AdvancedFormPage = forwardRef<FormikProps<any>, AdvancedFormPageProps>(
<NumberInput <NumberInput
description="This is how frequently we pull new documents from the source (in minutes). If you input 0, we will never pull new documents for this connector." description="This is how frequently we pull new documents from the source (in minutes). If you input 0, we will never pull new documents for this connector."
value={refreshFreq} value={refreshFreq}
showNeverIfZero
label="Refresh Frequency (minutes)" label="Refresh Frequency (minutes)"
name="refreshFreq" name="refreshFreq"
/> />

View File

@ -86,7 +86,6 @@ const DynamicConnectionForm: FC<DynamicConnectionFormProps> = ({
optional={field.optional} optional={field.optional}
description={field.description} description={field.description}
name={field.name} name={field.name}
showNeverIfZero
/> />
) : field.type === "checkbox" ? ( ) : field.type === "checkbox" ? (
<AdminBooleanFormField <AdminBooleanFormField

View File

@ -37,211 +37,237 @@ const RerankingDetailsForm = forwardRef<
const [isApiKeyModalOpen, setIsApiKeyModalOpen] = useState(false); const [isApiKeyModalOpen, setIsApiKeyModalOpen] = useState(false);
return ( return (
<div className="p-2 rounded-lg max-w-4xl mx-auto"> <Formik
<h2 className="text-2xl font-bold mb-4 text-text-800"> innerRef={ref}
Post-processing initialValues={currentRerankingDetails}
</h2> validationSchema={Yup.object().shape({
<div className="text-sm mr-auto mb-6 divide-x-2 flex"> rerank_model_name: Yup.string().nullable(),
{originalRerankingDetails.rerank_model_name && ( rerank_provider_type: Yup.mixed<RerankerProvider>()
<button .nullable()
onClick={() => setModelTab(null)} .oneOf(Object.values(RerankerProvider))
className={`mx-2 p-2 font-bold ${ .optional(),
!modelTab api_key: Yup.string().nullable(),
? "rounded bg-background-900 text-text-100 underline" num_rerank: Yup.number().min(1, "Must be at least 1"),
: " hover:underline bg-background-100" })}
}`} onSubmit={async (_, { setSubmitting }) => {
> setSubmitting(false);
Current }}
</button> enableReinitialize={true}
)} >
<div {({ values, setFieldValue }) => {
className={`${originalRerankingDetails.rerank_model_name && "px-2 ml-2"}`} const resetRerankingValues = () => {
> setRerankingDetails({
<button ...values,
onClick={() => setModelTab("cloud")} rerank_provider_type: null!,
className={`mr-2 p-2 font-bold ${ rerank_model_name: null,
modelTab == "cloud" });
? "rounded bg-background-900 text-text-100 underline" setFieldValue("rerank_provider_type", null);
: " hover:underline bg-background-100" setFieldValue("rerank_model_name", null);
}`} setFieldValue("rerank_api_key", null);
> };
Cloud-based
</button>
</div>
<div className="px-2"> return (
<button <div className="p-2 rounded-lg max-w-4xl mx-auto">
onClick={() => setModelTab("open")} <h2 className="text-2xl font-bold mb-4 text-text-800">
className={` mx-2 p-2 font-bold ${ Post-processing
modelTab == "open" </h2>
? "rounded bg-background-900 text-text-100 underline" <div className="text-sm mr-auto mb-6 divide-x-2 flex">
: "hover:underline bg-background-100" {originalRerankingDetails.rerank_model_name && (
}`} <button
> onClick={() => setModelTab(null)}
Self-hosted className={`mx-2 p-2 font-bold ${
</button> !modelTab
</div> ? "rounded bg-background-900 text-text-100 underline"
</div> : " hover:underline bg-background-100"
}`}
>
Current
</button>
)}
<div
className={`${originalRerankingDetails.rerank_model_name && "px-2 ml-2"}`}
>
<button
onClick={() => setModelTab("cloud")}
className={`mr-2 p-2 font-bold ${
modelTab == "cloud"
? "rounded bg-background-900 text-text-100 underline"
: " hover:underline bg-background-100"
}`}
>
Cloud-based
</button>
</div>
<Formik <div className="px-2">
innerRef={ref} <button
initialValues={currentRerankingDetails} onClick={() => setModelTab("open")}
validationSchema={Yup.object().shape({ className={` mx-2 p-2 font-bold ${
rerank_model_name: Yup.string().nullable(), modelTab == "open"
provider_type: Yup.mixed<RerankerProvider>() ? "rounded bg-background-900 text-text-100 underline"
.nullable() : "hover:underline bg-background-100"
.oneOf(Object.values(RerankerProvider)) }`}
.optional(), >
rerank_api_key: Yup.string().nullable(), Self-hosted
num_rerank: Yup.number().min(1, "Must be at least 1"), </button>
})} </div>
onSubmit={async (_, { setSubmitting }) => { {values.rerank_model_name && (
setSubmitting(false); <div className="px-2">
}} <button
enableReinitialize={true} onClick={() => resetRerankingValues()}
> className="mx-2 p-2 font-bold rounded bg-background-100 text-text-900 hover:underline"
{({ values, setFieldValue }) => (
<Form>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
{(modelTab
? rerankingModels.filter(
(model) => model.cloud == (modelTab == "cloud")
)
: rerankingModels.filter(
(modelCard) =>
modelCard.modelName ==
originalRerankingDetails.rerank_model_name
)
).map((card) => {
const isSelected =
values.rerank_provider_type === card.rerank_provider_type &&
values.rerank_model_name === card.modelName;
return (
<div
key={`${card.rerank_provider_type}-${card.modelName}`}
className={`p-4 border rounded-lg cursor-pointer transition-all duration-200 ${
isSelected
? "border-blue-500 bg-blue-50 shadow-md"
: "border-gray-200 hover:border-blue-300 hover:shadow-sm"
}`}
onClick={() => {
if (card.rerank_provider_type) {
setIsApiKeyModalOpen(true);
}
setRerankingDetails({
...values,
rerank_provider_type: card.rerank_provider_type!,
rerank_model_name: card.modelName,
rerank_api_key: null,
});
setFieldValue(
"rerank_provider_type",
card.rerank_provider_type
);
setFieldValue("rerank_model_name", card.modelName);
}}
> >
<div className="flex items-center justify-between mb-3"> Remove Reranking
<div className="flex items-center"> </button>
{card.rerank_provider_type === </div>
RerankerProvider.COHERE ? ( )}
<CohereIcon size={24} className="mr-2" />
) : (
<MixedBreadIcon size={24} className="mr-2" />
)}
<h3 className="font-bold text-lg">
{card.displayName}
</h3>
</div>
{card.link && (
<a
href={card.link}
target="_blank"
rel="noopener noreferrer"
onClick={(e) => e.stopPropagation()}
className="text-blue-500 hover:text-blue-700 transition-colors duration-200"
>
<FiExternalLink size={18} />
</a>
)}
</div>
<p className="text-sm text-gray-600 mb-2">
{card.description}
</p>
<div className="text-xs text-gray-500">
{card.cloud ? "Cloud-based" : "Self-hosted"}
</div>
</div>
);
})}
</div> </div>
{isApiKeyModalOpen && ( <Form>
<Modal <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
onOutsideClick={() => { {(modelTab
Object.keys(originalRerankingDetails).forEach((key) => { ? rerankingModels.filter(
setFieldValue( (model) => model.cloud == (modelTab == "cloud")
key, )
originalRerankingDetails[key as keyof RerankingDetails] : rerankingModels.filter(
); (modelCard) =>
}); modelCard.modelName ==
originalRerankingDetails.rerank_model_name
setIsApiKeyModalOpen(false); )
}} ).map((card) => {
width="w-[800px]" const isSelected =
title="API Key Configuration" values.rerank_provider_type ===
> card.rerank_provider_type &&
<div className="w-full px-4"> values.rerank_model_name === card.modelName;
<TextFormField return (
placeholder={values.rerank_api_key || undefined} <div
onChange={(e: React.ChangeEvent<HTMLInputElement>) => { key={`${card.rerank_provider_type}-${card.modelName}`}
const value = e.target.value; className={`p-4 border rounded-lg cursor-pointer transition-all duration-200 ${
setRerankingDetails({ isSelected
...values, ? "border-blue-500 bg-blue-50 shadow-md"
rerank_api_key: value, : "border-gray-200 hover:border-blue-300 hover:shadow-sm"
}); }`}
setFieldValue("rerank_api_key", value);
}}
type="password"
label="Cohere API Key"
name="rerank_api_key"
/>
<div className="mt-4 flex justify-between">
<Button
onClick={() => { onClick={() => {
Object.keys(originalRerankingDetails).forEach( if (card.rerank_provider_type) {
(key) => { setIsApiKeyModalOpen(true);
setFieldValue( }
key, setRerankingDetails({
originalRerankingDetails[ ...values,
key as keyof RerankingDetails rerank_provider_type: card.rerank_provider_type!,
] rerank_model_name: card.modelName,
); rerank_api_key: null,
} });
setFieldValue(
"rerank_provider_type",
card.rerank_provider_type
); );
setFieldValue("rerank_model_name", card.modelName);
setIsApiKeyModalOpen(false);
}} }}
color="red"
size="xs"
> >
Abandon <div className="flex items-center justify-between mb-3">
</Button> <div className="flex items-center">
<Button {card.rerank_provider_type ===
onClick={() => setIsApiKeyModalOpen(false)} RerankerProvider.COHERE ? (
color="blue" <CohereIcon size={24} className="mr-2" />
size="xs" ) : (
> <MixedBreadIcon size={24} className="mr-2" />
Update )}
</Button> <h3 className="font-bold text-lg">
{card.displayName}
</h3>
</div>
{card.link && (
<a
href={card.link}
target="_blank"
rel="noopener noreferrer"
onClick={(e) => e.stopPropagation()}
className="text-blue-500 hover:text-blue-700 transition-colors duration-200"
>
<FiExternalLink size={18} />
</a>
)}
</div>
<p className="text-sm text-gray-600 mb-2">
{card.description}
</p>
<div className="text-xs text-gray-500">
{card.cloud ? "Cloud-based" : "Self-hosted"}
</div>
</div>
);
})}
</div>
{isApiKeyModalOpen && (
<Modal
onOutsideClick={() => {
Object.keys(originalRerankingDetails).forEach((key) => {
setFieldValue(
key,
originalRerankingDetails[
key as keyof RerankingDetails
]
);
});
setIsApiKeyModalOpen(false);
}}
width="w-[800px]"
title="API Key Configuration"
>
<div className="w-full px-4">
<TextFormField
placeholder={values.rerank_api_key || undefined}
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
const value = e.target.value;
setRerankingDetails({
...values,
rerank_api_key: value,
});
setFieldValue("api_key", value);
}}
type="password"
label="Cohere API Key"
name="api_key"
/>
<div className="mt-4 flex justify-between">
<Button
onClick={() => {
Object.keys(originalRerankingDetails).forEach(
(key) => {
setFieldValue(
key,
originalRerankingDetails[
key as keyof RerankingDetails
]
);
}
);
setIsApiKeyModalOpen(false);
}}
color="red"
size="xs"
>
Abandon
</Button>
<Button
onClick={() => setIsApiKeyModalOpen(false)}
color="blue"
size="xs"
>
Update
</Button>
</div>
</div> </div>
</div> </Modal>
</Modal> )}
)} </Form>
</Form> </div>
)} );
</Formik> }}
</div> </Formik>
); );
} }
); );

View File

@ -173,7 +173,7 @@ export function ProviderCreationModal({
</a> </a>
</Text> </Text>
<div className="flex flex-col gap-y-2"> <div className="flex w-full flex-col gap-y-2">
{useFileUpload ? ( {useFileUpload ? (
<> <>
<Label>Upload JSON File</Label> <Label>Upload JSON File</Label>

View File

@ -415,10 +415,10 @@ export default function EmbeddingForm() {
<> <>
<Card> <Card>
<AdvancedEmbeddingFormPage <AdvancedEmbeddingFormPage
updateNumRerank={(value: number) => updateNumRerank={(newNumRerank: number) =>
setRerankingDetails({ setRerankingDetails({
...rerankingDetails, ...rerankingDetails,
num_rerank: value, num_rerank: newNumRerank,
}) })
} }
numRerank={rerankingDetails.num_rerank} numRerank={rerankingDetails.num_rerank}