import { OPENAI_COMPATIBLE } from '@/config/settings'; import { AUDIO_SPEECH_TO_TEXT_API, AUDIO_TEXT_TO_SPEECH_API, CHAT_API, CREAT_IMAGE_API, EMBEDDING_API, MODEL_PROXY, RERANKER_API } from '@/pages/playground/apis'; import { AutoTooltip, CopyButton, IconFont, ScrollerModal } from '@gpustack/core-ui'; import { useIntl, useNavigate } from '@umijs/max'; import { Button, Flex, Tag } from 'antd'; import _ from 'lodash'; import { useEffect, useMemo } from 'react'; import styled from 'styled-components'; import { modelCategoriesMap } from '../config'; import { ListItem } from '../config/types'; import useGenericProxy from '../hooks/use-generic-proxy'; const API_MAP: Record = { [modelCategoriesMap.embedding]: { api: EMBEDDING_API }, [modelCategoriesMap.llm]: { api: CHAT_API }, [modelCategoriesMap.image]: { api: CREAT_IMAGE_API }, [modelCategoriesMap.text_to_speech]: { api: AUDIO_TEXT_TO_SPEECH_API }, [modelCategoriesMap.speech_to_text]: { api: AUDIO_SPEECH_TO_TEXT_API }, [modelCategoriesMap.reranker]: { api: RERANKER_API } }; const ApiAccessInfoWrapper = styled.div` display: grid; grid-template-columns: max-content 1fr max-content; gap: 8px 0px; justify-items: start; align-items: center; .label { font-weight: 500; } .value { margin-left: 20px; display: flex; align-items: center; color: var(--ant-color-text-secondary); } .copy-btn { margin-left: 8px; } `; const Tips = styled.div` color: var(--ant-color-text-secondary); font-size: var(--font-size-small); .tips { display: flex; align-items: flex-start; gap: 8px; } dd { margin-bottom: 0; } `; const APITAG = styled(Tag)` border-radius: 12px; margin: 0; width: fit-content; margin-left: 8px; `; const CreateButton = styled(Button)` padding-inline: 0; `; interface ApiAccessInfoProps { open: boolean; data: ListItem; onClose: () => void; } const ApiAccessInfo = ({ open, data, onClose }: ApiAccessInfoProps) => { const intl = useIntl(); const navigate = useNavigate(); const { GenericProxyCommandCode, openProxyModal } = useGenericProxy(); const endPoint = useMemo(() => { if (!data.generic_proxy) { return `${window.location.origin}/${OPENAI_COMPATIBLE}`; } return `${window.location.origin}${MODEL_PROXY}/${data.id}/`; }, [data]); const isRanker = useMemo(() => { return _.includes(data.categories, modelCategoriesMap.reranker); }, [data]); const isLLM = useMemo(() => { return _.includes(data.categories, modelCategoriesMap.llm); }, [data]); const handleClose = () => { onClose(); }; const renderTips = () => { return (
); }; useEffect(() => { if (open && data.generic_proxy) { openProxyModal(data); } }, [open, data, openProxyModal]); return ( {intl.formatMessage({ id: 'models.table.button.apiAccessInfo' })} } width={660} destroyOnHidden closable={true} mask={{ closable: false }} onOk={handleClose} onCancel={handleClose} footer={null} > {renderTips()} {intl.formatMessage({ id: 'models.table.apiAccessInfo.endpoint' })} {endPoint} {!data.generic_proxy && ( <> {isRanker ? intl.formatMessage({ id: 'models.table.apiAccessInfo.jinaCompatible' }) : intl.formatMessage({ id: 'models.table.apiAccessInfo.openaiCompatible' })} {isLLM && ( {intl.formatMessage({ id: 'models.table.apiAccessInfo.anthropicCompatible' })} )} )} {intl.formatMessage({ id: 'models.table.apiAccessInfo.modelName' })} {data.name} {intl.formatMessage({ id: 'models.table.apiAccessInfo.apikey' })} navigate('/access-control/api-keys')} > {intl.formatMessage({ id: 'models.table.apiAccessInfo.gotoCreate' })} {data.generic_proxy && (
{GenericProxyCommandCode}
)}
); }; export default ApiAccessInfo;