import React from 'react'; import { useSelector } from 'react-redux'; import Dropdown from '../components/Dropdown'; import { Doc, CreateAPIKeyModalProps, SaveAPIKeyModalProps, } from '../models/misc'; import { selectSourceDocs } from '../preferences/preferenceSlice'; import Exit from '../assets/exit.svg'; import Trash from '../assets/trash.svg'; const apiHost = import.meta.env.VITE_API_HOST || 'https://docsapi.arc53.com'; const embeddingsName = import.meta.env.VITE_EMBEDDINGS_NAME || 'huggingface_sentence-transformers/all-mpnet-base-v2'; const APIKeys: React.FC = () => { const [isCreateModalOpen, setCreateModal] = React.useState(false); const [isSaveKeyModalOpen, setSaveKeyModal] = React.useState(false); const [newKey, setNewKey] = React.useState(''); const [apiKeys, setApiKeys] = React.useState< { name: string; key: string; source: string; id: string }[] >([]); const handleDeleteKey = (id: string) => { fetch(`${apiHost}/api/delete_api_key`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ id }), }) .then((response) => { if (!response.ok) { throw new Error('Failed to delete API Key'); } return response.json(); }) .then((data) => { data.status === 'ok' && setApiKeys((previous) => previous.filter((elem) => elem.id !== id)); }) .catch((error) => { console.error(error); }); }; React.useEffect(() => { fetchAPIKeys(); }, []); const fetchAPIKeys = async () => { try { const response = await fetch(`${apiHost}/api/get_api_keys`); if (!response.ok) { throw new Error('Failed to fetch API Keys'); } const apiKeys = await response.json(); setApiKeys(apiKeys); } catch (error) { console.log(error); } }; const createAPIKey = (payload: { name: string; source: string; prompt_id: string; chunks: string; }) => { fetch(`${apiHost}/api/create_api_key`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(payload), }) .then((response) => { if (!response.ok) { throw new Error('Failed to create API Key'); } return response.json(); }) .then((data) => { setApiKeys([...apiKeys, data]); setCreateModal(false); setNewKey(data.key); setSaveKeyModal(true); fetchAPIKeys(); }) .catch((error) => { console.error(error); }); }; return (
{isCreateModalOpen && ( setCreateModal(false)} createAPIKey={createAPIKey} /> )} {isSaveKeyModalOpen && ( setSaveKeyModal(false)} /> )}
{apiKeys?.map((element, index) => ( ))}
Name Source document API Key
{element.name} {element.source} {element.key} Delete handleDeleteKey(element.id)} />
); }; const CreateAPIKeyModal: React.FC = ({ close, createAPIKey, }) => { const [APIKeyName, setAPIKeyName] = React.useState(''); const [sourcePath, setSourcePath] = React.useState<{ label: string; value: string; } | null>(null); const chunkOptions = ['0', '2', '4', '6', '8', '10']; const [chunk, setChunk] = React.useState('2'); const [activePrompts, setActivePrompts] = React.useState< { name: string; id: string; type: string }[] >([]); const [prompt, setPrompt] = React.useState<{ name: string; id: string; type: string; } | null>(null); const docs = useSelector(selectSourceDocs); React.useEffect(() => { const fetchPrompts = async () => { try { const response = await fetch(`${apiHost}/api/get_prompts`); if (!response.ok) { throw new Error('Failed to fetch prompts'); } const promptsData = await response.json(); setActivePrompts(promptsData); } catch (error) { console.error(error); } }; fetchPrompts(); }, []); const extractDocPaths = () => docs ? docs .filter((doc) => doc.model === embeddingsName) .map((doc: Doc) => { let namePath = doc.name; if (doc.language === namePath) { namePath = '.project'; } let docPath = 'default'; if (doc.location === 'local') { docPath = 'local' + '/' + doc.name + '/'; } else if (doc.location === 'remote') { docPath = doc.language + '/' + namePath + '/' + doc.version + '/' + doc.model + '/'; } return { label: doc.name, value: docPath, }; }) : []; return (
Create New API Key
API Key Name setAPIKeyName(e.target.value)} />
setSourcePath(selection) } options={extractDocPaths()} size="w-full" rounded="xl" />
setPrompt(value) } size="w-full" />

Chunks processed per query

setChunk(value)} size="w-full" />
); }; const SaveAPIKeyModal: React.FC = ({ apiKey, close }) => { const [isCopied, setIsCopied] = React.useState(false); const handleCopyKey = () => { navigator.clipboard.writeText(apiKey); setIsCopied(true); }; return (

Please save your Key

This is the only time your key will be shown.

API Key

{apiKey}
); }; export default APIKeys;