mirror of
https://github.com/danswer-ai/danswer.git
synced 2025-06-10 22:40:54 +02:00
* add proper default temperature + overrides * remove unclear commment * ammend defaults + include internet serach
293 lines
8.6 KiB
TypeScript
293 lines
8.6 KiB
TypeScript
import {
|
|
ConnectorIndexingStatus,
|
|
DocumentBoostStatus,
|
|
Tag,
|
|
UserGroup,
|
|
} from "@/lib/types";
|
|
import useSWR, { mutate, useSWRConfig } from "swr";
|
|
import { errorHandlingFetcher } from "./fetcher";
|
|
import { useEffect, useState } from "react";
|
|
import { DateRangePickerValue } from "@tremor/react";
|
|
import { SourceMetadata } from "./search/interfaces";
|
|
import { destructureValue } from "./llm/utils";
|
|
import { ChatSession } from "@/app/chat/interfaces";
|
|
import { UsersResponse } from "./users/interfaces";
|
|
import { usePaidEnterpriseFeaturesEnabled } from "@/components/settings/usePaidEnterpriseFeaturesEnabled";
|
|
import { Credential } from "./connectors/credentials";
|
|
|
|
const CREDENTIAL_URL = "/api/manage/admin/credential";
|
|
|
|
export const usePublicCredentials = () => {
|
|
const { mutate } = useSWRConfig();
|
|
const swrResponse = useSWR<Credential<any>[]>(
|
|
CREDENTIAL_URL,
|
|
errorHandlingFetcher
|
|
);
|
|
|
|
return {
|
|
...swrResponse,
|
|
refreshCredentials: () => mutate(CREDENTIAL_URL),
|
|
};
|
|
};
|
|
|
|
const buildReactedDocsUrl = (ascending: boolean, limit: number) => {
|
|
return `/api/manage/admin/doc-boosts?ascending=${ascending}&limit=${limit}`;
|
|
};
|
|
|
|
export const useMostReactedToDocuments = (
|
|
ascending: boolean,
|
|
limit: number
|
|
) => {
|
|
const url = buildReactedDocsUrl(ascending, limit);
|
|
const swrResponse = useSWR<DocumentBoostStatus[]>(url, errorHandlingFetcher);
|
|
|
|
return {
|
|
...swrResponse,
|
|
refreshDocs: () => mutate(url),
|
|
};
|
|
};
|
|
|
|
export const useObjectState = <T>(
|
|
initialValue: T
|
|
): [T, (update: Partial<T>) => void] => {
|
|
const [state, setState] = useState<T>(initialValue);
|
|
const set = (update: Partial<T>) => {
|
|
setState((prevState) => {
|
|
return {
|
|
...prevState,
|
|
...update,
|
|
};
|
|
});
|
|
};
|
|
return [state, set];
|
|
};
|
|
|
|
const INDEXING_STATUS_URL = "/api/manage/admin/connector/indexing-status";
|
|
|
|
export const useConnectorCredentialIndexingStatus = (
|
|
refreshInterval = 30000 // 30 seconds
|
|
) => {
|
|
const { mutate } = useSWRConfig();
|
|
const swrResponse = useSWR<ConnectorIndexingStatus<any, any>[]>(
|
|
INDEXING_STATUS_URL,
|
|
errorHandlingFetcher,
|
|
{ refreshInterval: refreshInterval }
|
|
);
|
|
|
|
return {
|
|
...swrResponse,
|
|
refreshIndexingStatus: () => mutate(INDEXING_STATUS_URL),
|
|
};
|
|
};
|
|
|
|
export const useTimeRange = (initialValue?: DateRangePickerValue) => {
|
|
return useState<DateRangePickerValue | null>(null);
|
|
};
|
|
|
|
export interface FilterManager {
|
|
timeRange: DateRangePickerValue | null;
|
|
setTimeRange: React.Dispatch<
|
|
React.SetStateAction<DateRangePickerValue | null>
|
|
>;
|
|
selectedSources: SourceMetadata[];
|
|
setSelectedSources: React.Dispatch<React.SetStateAction<SourceMetadata[]>>;
|
|
selectedDocumentSets: string[];
|
|
setSelectedDocumentSets: React.Dispatch<React.SetStateAction<string[]>>;
|
|
selectedTags: Tag[];
|
|
setSelectedTags: React.Dispatch<React.SetStateAction<Tag[]>>;
|
|
}
|
|
|
|
export function useFilters(): FilterManager {
|
|
const [timeRange, setTimeRange] = useTimeRange();
|
|
const [selectedSources, setSelectedSources] = useState<SourceMetadata[]>([]);
|
|
const [selectedDocumentSets, setSelectedDocumentSets] = useState<string[]>(
|
|
[]
|
|
);
|
|
const [selectedTags, setSelectedTags] = useState<Tag[]>([]);
|
|
|
|
return {
|
|
timeRange,
|
|
setTimeRange,
|
|
selectedSources,
|
|
setSelectedSources,
|
|
selectedDocumentSets,
|
|
setSelectedDocumentSets,
|
|
selectedTags,
|
|
setSelectedTags,
|
|
};
|
|
}
|
|
|
|
export const useUsers = () => {
|
|
const url = "/api/manage/users";
|
|
|
|
const swrResponse = useSWR<UsersResponse>(url, errorHandlingFetcher);
|
|
|
|
return {
|
|
...swrResponse,
|
|
refreshIndexingStatus: () => mutate(url),
|
|
};
|
|
};
|
|
|
|
export interface LlmOverride {
|
|
name: string;
|
|
provider: string;
|
|
modelName: string;
|
|
}
|
|
|
|
export interface LlmOverrideManager {
|
|
llmOverride: LlmOverride;
|
|
setLlmOverride: React.Dispatch<React.SetStateAction<LlmOverride>>;
|
|
temperature: number | null;
|
|
setTemperature: React.Dispatch<React.SetStateAction<number | null>>;
|
|
updateModelOverrideForChatSession: (chatSession?: ChatSession) => void;
|
|
}
|
|
|
|
export function useLlmOverride(
|
|
currentChatSession?: ChatSession,
|
|
defaultTemperature?: number
|
|
): LlmOverrideManager {
|
|
const [llmOverride, setLlmOverride] = useState<LlmOverride>(
|
|
currentChatSession && currentChatSession.current_alternate_model
|
|
? destructureValue(currentChatSession.current_alternate_model)
|
|
: {
|
|
name: "",
|
|
provider: "",
|
|
modelName: "",
|
|
}
|
|
);
|
|
|
|
const updateModelOverrideForChatSession = (chatSession?: ChatSession) => {
|
|
setLlmOverride(
|
|
chatSession && chatSession.current_alternate_model
|
|
? destructureValue(chatSession.current_alternate_model)
|
|
: {
|
|
name: "",
|
|
provider: "",
|
|
modelName: "",
|
|
}
|
|
);
|
|
};
|
|
|
|
const [temperature, setTemperature] = useState<number | null>(
|
|
defaultTemperature != undefined ? defaultTemperature : 0
|
|
);
|
|
|
|
useEffect(() => {
|
|
setTemperature(defaultTemperature !== undefined ? defaultTemperature : 0);
|
|
}, [defaultTemperature]);
|
|
|
|
return {
|
|
updateModelOverrideForChatSession,
|
|
llmOverride,
|
|
setLlmOverride,
|
|
temperature,
|
|
setTemperature,
|
|
};
|
|
}
|
|
|
|
/*
|
|
EE Only APIs
|
|
*/
|
|
|
|
const USER_GROUP_URL = "/api/manage/admin/user-group";
|
|
|
|
export const useUserGroups = (): {
|
|
data: UserGroup[] | undefined;
|
|
isLoading: boolean;
|
|
error: string;
|
|
refreshUserGroups: () => void;
|
|
} => {
|
|
const swrResponse = useSWR<UserGroup[]>(USER_GROUP_URL, errorHandlingFetcher);
|
|
const isPaidEnterpriseFeaturesEnabled = usePaidEnterpriseFeaturesEnabled();
|
|
|
|
if (!isPaidEnterpriseFeaturesEnabled) {
|
|
return {
|
|
...{
|
|
data: [],
|
|
isLoading: false,
|
|
error: "",
|
|
},
|
|
refreshUserGroups: () => {},
|
|
};
|
|
}
|
|
|
|
return {
|
|
...swrResponse,
|
|
refreshUserGroups: () => mutate(USER_GROUP_URL),
|
|
};
|
|
};
|
|
|
|
const MODEL_DISPLAY_NAMES: { [key: string]: string } = {
|
|
// OpenAI models
|
|
"gpt-4": "GPT 4",
|
|
"gpt-4o": "GPT 4o",
|
|
"gpt-4o-mini": "GPT 4o Mini",
|
|
"gpt-4-0314": "GPT 4 (March 2023)",
|
|
"gpt-4-0613": "GPT 4 (June 2023)",
|
|
"gpt-4-32k-0314": "GPT 4 32k (March 2023)",
|
|
"gpt-4-turbo": "GPT 4 Turbo",
|
|
"gpt-4-turbo-preview": "GPT 4 Turbo (Preview)",
|
|
"gpt-4-1106-preview": "GPT 4 Turbo (November 2023)",
|
|
"gpt-4-vision-preview": "GPT 4 Vision (Preview)",
|
|
"gpt-3.5-turbo": "GPT 3.5 Turbo",
|
|
"gpt-3.5-turbo-0125": "GPT 3.5 Turbo (January 2024)",
|
|
"gpt-3.5-turbo-1106": "GPT 3.5 Turbo (November 2023)",
|
|
"gpt-3.5-turbo-16k": "GPT 3.5 Turbo 16k",
|
|
"gpt-3.5-turbo-0613": "GPT 3.5 Turbo (June 2023)",
|
|
"gpt-3.5-turbo-16k-0613": "GPT 3.5 Turbo 16k (June 2023)",
|
|
"gpt-3.5-turbo-0301": "GPT 3.5 Turbo (March 2023)",
|
|
|
|
// Anthropic models
|
|
"claude-3-opus-20240229": "Claude 3 Opus",
|
|
"claude-3-sonnet-20240229": "Claude 3 Sonnet",
|
|
"claude-3-haiku-20240307": "Claude 3 Haiku",
|
|
"claude-2.1": "Claude 2.1",
|
|
"claude-2.0": "Claude 2.0",
|
|
"claude-instant-1.2": "Claude Instant 1.2",
|
|
"claude-3-5-sonnet-20240620": "Claude 3.5 Sonnet",
|
|
|
|
// Bedrock models
|
|
"meta.llama3-1-70b-instruct-v1:0": "Llama 3.1 70B",
|
|
"meta.llama3-1-8b-instruct-v1:0": "Llama 3.1 8B",
|
|
"meta.llama3-70b-instruct-v1:0": "Llama 3 70B",
|
|
"meta.llama3-8b-instruct-v1:0": "Llama 3 8B",
|
|
"meta.llama2-70b-chat-v1": "Llama 2 70B",
|
|
"meta.llama2-13b-chat-v1": "Llama 2 13B",
|
|
"cohere.command-r-v1:0": "Command R",
|
|
"cohere.command-r-plus-v1:0": "Command R Plus",
|
|
"cohere.command-light-text-v14": "Command Light Text",
|
|
"cohere.command-text-v14": "Command Text",
|
|
"anthropic.claude-instant-v1": "Claude Instant",
|
|
"anthropic.claude-v2:1": "Claude v2.1",
|
|
"anthropic.claude-v2": "Claude v2",
|
|
"anthropic.claude-v1": "Claude v1",
|
|
"anthropic.claude-3-opus-20240229-v1:0": "Claude 3 Opus",
|
|
"anthropic.claude-3-haiku-20240307-v1:0": "Claude 3 Haiku",
|
|
"anthropic.claude-3-5-sonnet-20240620-v1:0": "Claude 3.5 Sonnet",
|
|
"anthropic.claude-3-sonnet-20240229-v1:0": "Claude 3 Sonnet",
|
|
"mistral.mistral-large-2402-v1:0": "Mistral Large",
|
|
"mistral.mixtral-8x7b-instruct-v0:1": "Mixtral 8x7B Instruct",
|
|
"mistral.mistral-7b-instruct-v0:2": "Mistral 7B Instruct",
|
|
"amazon.titan-text-express-v1": "Titan Text Express",
|
|
"amazon.titan-text-lite-v1": "Titan Text Lite",
|
|
"ai21.jamba-instruct-v1:0": "Jamba Instruct",
|
|
"ai21.j2-ultra-v1": "J2 Ultra",
|
|
"ai21.j2-mid-v1": "J2 Mid",
|
|
};
|
|
|
|
export function getDisplayNameForModel(modelName: string): string {
|
|
return MODEL_DISPLAY_NAMES[modelName] || modelName;
|
|
}
|
|
|
|
export const defaultModelsByProvider: { [name: string]: string[] } = {
|
|
openai: ["gpt-4", "gpt-4o", "gpt-4o-mini"],
|
|
bedrock: [
|
|
"meta.llama3-1-70b-instruct-v1:0",
|
|
"meta.llama3-1-8b-instruct-v1:0",
|
|
"anthropic.claude-3-opus-20240229-v1:0",
|
|
"mistral.mistral-large-2402-v1:0",
|
|
"anthropic.claude-3-5-sonnet-20240620-v1:0",
|
|
],
|
|
anthropic: ["claude-3-opus-20240229", "claude-3-5-sonnet-20240620"],
|
|
};
|