Introdução geral
Sem front-end, configuração pura do arquivo de configuração do canal de API. Basta escrever um arquivo para executar uma estação de API própria, o documento tem um guia de configuração detalhado, de fácil compreensão.
O uni-api é um projeto para unificar o gerenciamento de APIs de modelos grandes, permitindo que vários serviços de back-end sejam chamados por meio de uma única interface de API unificada para o formato OpenAI com suporte a balanceamento de carga. O projeto é particularmente adequado para usuários individuais que não precisam de uma interface de front-end complexa e oferece suporte a uma ampla variedade de modelos e provedores de serviços, incluindo OpenAI, Anthropic, Gemini, Vertex e outros.
Lista de funções
- Interface API unificadaChamada de vários serviços de back-end por meio de uma única interface de API unificada.
- conversão de formatoConverta APIs de diferentes provedores de serviços para o formato OpenAI.
- balanceamento de cargaSuporte a uma variedade de estratégias de balanceamento de carga, incluindo polling, polling ponderado e assim por diante.
- Suporte a vários serviçosSuporte para OpenAI, Anthropic, Gemini, Vertex e muitos outros provedores de serviços.
- Gerenciamento de arquivos de configuraçãoGerencie canais e modelos de API por meio de arquivos de configuração.
- repetição automáticaTentativa automática de tentar novamente o próximo canal quando uma solicitação de API falha.
- controle de privilégiosSuporte a controle de privilégio refinado e configurações de limitação de fluxo.
Usando a Ajuda
Implementação leve
Depois de clicar no botão de implantação com um clique acima, defina as variáveis de ambiente CONFIG_URL
para a cadeia direta de perfis. DISABLE_DATABASE
para true e clique em Create para criar o projeto.
2.serv00 Implementação remota
Primeiro, faça login no painel, clique na guia Run your own applications (Executar seus próprios aplicativos) em Additional services (Serviços adicionais) para permitir a execução de seus próprios aplicativos e, em seguida, acesse o painel Port reservation (Reserva de porta) para abrir uma porta aleatória.
Se você não tiver seu próprio nome de domínio, vá para o painel Sites da WWW e exclua o nome de domínio fornecido por padrão e, em seguida, crie um novo nome de domínio Domínio para o nome de domínio que acabou de excluir, clique em Configurações avançadas e defina o Tipo de site como Nome de domínio proxy, a Porta proxy apontando para a porta que você acabou de abrir e não marque Usar HTTPS.
ssh Faça login no servidor serv00 e execute o seguinte comando:
git clone --depth 1 -b main --quiet https://github.com/yym68686/uni-api.git cd uni-api python -m venv uni-api tmux new -s uni-api source uni-api/bin/activate export CFLAGS="-I/usr/local/include" export CXXFLAGS="-I/usr/local/include" exportar CC=gcc export CXX=g++ export MAX_CONCURRENCY=1 exportar CPUCOUNT=1 export MAKEFLAGS="-j1" CMAKE_BUILD_PARALLEL_LEVEL=1 cpuset -l 0 pip install -vv -r requirements.txt cpuset -l 0 pip install -r -vv requirements.txt
ctrl+b d Sair do tmux Aguarde algumas horas até que a instalação seja concluída e, quando isso acontecer, execute o seguinte comando:
tmux attach -t uni-api source uni-api/bin/activate export CONFIG_URL=http://file_url/api.yaml export DISABLE_DATABASE=true # Modifique a porta, xxx é a porta, altere-a você mesmo, ela corresponde à porta que você acabou de abrir no painel Reserva de porta. sed -i '' 's/port=8000/port=xxx/' main.py sed -i '' 's/reload=True/reload=False/' main.py python main.py
Use ctrl+b d para sair do tmux e deixar o aplicativo em execução em segundo plano. Neste ponto, você pode usar o uni-api em outros clientes de bate-papo. script de teste curl:
curl -X POST https://xxx.serv00.net/v1/chat/completions \\ -H 'Content-Type: application/json' \\\ -H 'Authorization: Bearer sk-xxx' \\ -d '{"model": "gpt-4o", "messages": [{"role": "user", "content": "hello"}]}'
3. implantação local do Docker
Lançamento de contêineres
docker run --user root -p 8001:8000 --name uni-api -dit \ -e CONFIG_URL=http://file_url/api.yaml \ # Se você já tiver montado o arquivo de configuração local, não precisará definir CONFIG_URL -v . /api.yaml:/home/api.yaml \ # Se você já tiver definido CONFIG_URL, não precisará montar o arquivo de configuração -v . /uniapi_db:/home/data \ # Se você não quiser salvar estatísticas, não precisará montar a pasta yym68686/uni-api:latest
Ou, se você quiser usar o Docker Compose, aqui está um exemplo de docker-compose.yml:
serviços: uni-api. uni-api. nome do contêiner: uni-api imagem: yym68686/uni-api:latest ambiente: uni-api:latest - CONFIG_URL=http://file_url/api.yaml # Se você já tiver montado o arquivo de configuração local, não precisará definir o CONFIG_URL. portas. - 8001:8000 ports: 8001:8000 volumes. - . /api.yaml:/home/api.yaml # Se você já tiver definido CONFIG_URL, não precisará montar o arquivo de configuração - . /uniapi_db:/home/data # Se você não quiser salvar estatísticas, não precisará montar essa pasta
CONFIG_URL é o arquivo de configuração que pode ser baixado automaticamente de um local remoto. Por exemplo, se você não tiver a conveniência de modificar o arquivo de configuração em uma determinada plataforma, poderá passar o arquivo de configuração para um determinado serviço de hospedagem, que pode fornecer um link direto para o download do uni-api, e CONFIG_URL é esse link direto. Se você usar arquivos de configuração montados localmente, não precisará definir CONFIG_URL. CONFIG_URL é usado quando não é conveniente montar arquivos de configuração.
Execução do contêiner do Docker Compose em segundo plano
docker-compose pull docker-compose up -d
Compilação do Docker
docker build --no-cache -t uni-api:latest -f Dockerfile --platform linux/amd64 . docker tag uni-api:latest yym68686/uni-api:latest docker push yym68686/uni-api:latest
Reiniciar uma imagem do Docker com um único clique
set -eu docker pull yym68686/uni-api:latest docker rm -f uni-api docker run --user root -p 8001:8000 -dit --name uni-api \ -e CONFIG_URL=http://file_url/api.yaml \ -v . /api.yaml:/home/api.yaml \ -v . /uniapi_db:/home/data \ yym68686/uni-api:latest Registros do docker -f uni-api
Teste RESTful curl
curl -X POST http://127.0.0.1:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${API}" \ -d '{"model": "gpt-4o", "messages": [{"role": "user", "content": "Hello"}], "stream": true}'
Processo de instalação
- Preparando o arquivo de configuraçãoCriar um arquivo chamado
api.yaml
arquivo de configuração, preenchendo as informações do provedor de serviços, o endereço da API e a chave da API. - Carregamento de arquivos de configuraçãoCarregue o arquivo de configuração em uma unidade de nuvem para obter um link direto para o arquivo.
- Iniciando um contêiner do Docker::
- fazer uso de
CONFIG_URL
A variável de ambiente define o URL do arquivo de configuração. - configurar
DISABLE_DATABASE
por causa deverdadeiro
. - Inicie o contêiner usando o comando Docker:
docker run -d --name uni-api -e CONFIG_URL=http://file_url/api.yaml -e DISABLE_DATABASE=true yym68686/uni-api:latest
- fazer uso de
- Configurar a portaAbra uma porta aleatória no painel e aponte-a para o contêiner do Docker.
Processo de uso
- Chamando a APIChamada de serviços back-end usando uma interface API unificada, com suporte a vários modelos e provedores de serviços.
- balanceamento de cargaAtribui automaticamente solicitações a diferentes canais com base na política de balanceamento de carga no arquivo de configuração.
- controle de privilégiosLimitação de fluxo: controla o escopo do uso da chave de API e a limitação de fluxo com base nas definições de permissão no arquivo de configuração.
- repetição automáticaGarantia de alta disponibilidade ao tentar novamente o próximo canal disponível quando uma solicitação falha.
Etapas detalhadas
- Exemplo de arquivo de configuração::
provedor: nome_do_provedor - provider: provider_name # Nome do provedor de serviços, como openai, anthropic, gemini, openrouter, deepbricks, qualquer outro, obrigatório base_url: https://api.your.com/v1/chat/completions # Endereço da API do serviço de backend, obrigatório. api: sk-YgS6GTi0b4bEabc4C # Chave de API do provedor, obrigatório model: # Opcional, se nenhum modelo for configurado, todos os modelos disponíveis serão obtidos automaticamente por meio de base_url e api por meio do endpoint /v1/models. - gpt-4o # O nome do modelo que pode ser usado, obrigatório. - claude-3-5-sonnet-20240620: claude-3-5-sonnet # Renomeie o modelo, claude-3-5-sonnet-20240620 é o nome do modelo do provedor de serviços, claude-3-5-sonnet é o nome renomeado, você pode usar um nome conciso. nome complexo original, opcional - dall-e-3 - provedor. antrópico base_url: https://api.anthropic.com/v1/messages api: o # é compatível com várias chaves de API; várias chaves permitem automaticamente o balanceamento de carga das rodadas de treinamento; é necessária pelo menos uma chave - sk-ant-api03-bNnAOJyA-xQw_twAA - sk-ant-api02-bNnxxxx modelo: claude-3-5-sonnet - claude-3-5-sonnet-20240620: claude-3-5-sonnet # Renomeie o modelo, claude-3-5-sonnet-20240620 é o nome do modelo do provedor de serviços e claude-3-5-sonnet é o nome renomeado, que pode ser substituído por um nome conciso. nome complexo original, opcional tools: true # se deve oferecer suporte a ferramentas, como geração de código, geração de documentos etc., o padrão é true, opcional. - provedor. gêmeos base_url: https://generativelanguage.googleapis.com/v1beta # base_url support v1beta/v1, somente para modelos Gemini, obrigatório api: AIzaSyAN2k6IRdgw api: AIzaSyAN2k6IRdgw - gemini-1.5-pro - gemini-1.5-flash-exp-0827: gemini-1.5-flash # Depois de renomear, o nome original do modelo gemini-1.5-flash-exp-0827 não pode ser usado. Se quiser usar o nome original, você pode adicionar o nome original ao modelo adicionando a seguinte linha O nome original agora pode ser usado. - gemini-1.5-flash-exp-0827 # Com essa linha, tanto o gemini-1.5-flash-exp-0827 quanto o gemini-1.5-flash podem ser solicitados. tools: true - provedor: vertex project_id: gen-lang-client-xxxxxxxxxxxxxxxxxxx # Descrição: seu ID de projeto do Google Cloud. formato: cadeia de caracteres, geralmente composta de letras minúsculas, números e hífens. Como obtê-lo: o ID do seu projeto pode ser encontrado no seletor de projetos no Console do Google Cloud. private_key: "-----BEGIN PRIVATE KEY-----\nxxxxx\n-----END PRIVATE" # DESCRIÇÃO: a chave privada da conta de serviço do Google Cloud Vertex AI. Formato: uma cadeia de caracteres no formato JSON que contém as informações da chave privada da conta de serviço. Como obtê-la: crie uma conta de serviço no Google Cloud Console, gere um arquivo de chave no formato JSON e defina seu conteúdo como o valor dessa variável de ambiente. client_email: xxxxxxxxxx@xxxxxxx.gserviceaccount.com # Descrição: o endereço de e-mail da conta de serviço do Google Cloud Vertex AI. Formato: geralmente uma cadeia de caracteres como "service-account-name@project-id.iam.gserviceaccount.com". Como obtê-lo: gerado ao criar a conta de serviço, ou você pode obtê-lo visualizando os detalhes da conta de serviço na seção IAM & Management do Google Cloud Console. Modelo. - gemini-1.5-pro - gemini-1.5-flash - claude-3-5-sonnet@20240620: claude-3-5-sonnet - claude-3-opus@20240229: claude-3-opus - claude-3-sonnet@20240229: claude-3-sonnet - claude-3-haiku@20240307: claude-3-haiku ferramentas: true notas: https://xxxxx.com/ # pode colocar a URL do provedor de serviços, informações de notas, documentação oficial, opcionalmente - provedor: cloudflare api: f42b3xxxxxxxxxxxxq4aoGAh # Cloudflare API Key, obrigatório cf_account_id: 8ec0xxxxxxxxxxxxxxxxxxxxxxe721 # ID da conta da Cloudflare, obrigatório model. - '@cf/meta/llama-3.1-8b-instruct': llama-3.1-8b # Modelo renomeado, @cf/meta/llama-3.1-8b-instruct é o nome do modelo original do provedor de serviços, você deve colocar o nome do modelo entre aspas ou então o erro de sintaxe yaml, llama- 3.1-8b é o nome renomeado, você pode usar um nome conciso em vez do nome complexo original, opcional - '@cf/meta/llama-3.1-8b-instruct' # deve usar aspas para envolver o nome do modelo, caso contrário, haverá um erro de sintaxe do yaml - provedor: other-provider base_url: https://api.xxx.com/v1/messages api: sk-bNnAOJyA-xQw_twAA modelo: sk-bNNAOJyA-xQw_twAA - causallm-35b-beta2ep-q6k: causallm-35b - anthropic/claude-3-5-sonnet ferramentas: false ferramentas: false roteador aberto # força o uso de um determinado formato de mensagem, atualmente compatível com gpt, claude, gemini, formato nativo do openrouter, opcional chaves_da_api: api: sk-KjjI60Yf0JFWW - api: sk-KjjI60Yf0JFWxfgRmXqFWyGtWUd9GZnmi3KlvowmRWpWpQRo Chave de API do #, o usuário precisa de uma chave de API para usar esse serviço, obrigatório. model: # O modelo em que essa chave de API pode ser usada, obrigatório. Por padrão, o balanceamento de carga de sondagem em nível de canal está ativado, e os modelos são solicitados na ordem configurada pelo modelo para cada solicitação. Isso não tem nada a ver com a ordem original do canal nos provedores. Portanto, você pode definir cada chave de API para ser solicitada em uma ordem diferente. - Os nomes dos modelos que podem ser usados pelo gpt-4o # e todos os modelos gpt-4o fornecidos pelo provedor podem ser usados - claude-3-5-sonnet # Nome do modelo que pode ser usado, pode usar o modelo claude-3-5-sonnet de todos os provedores. - gemini/* Nomes de modelos que podem ser usados pelo #, somente todos os modelos fornecidos por um provedor chamado gemini podem ser usados, em que gemini é o nome do provedor e * representa todos os modelos função: admin - api: sk-pkhf60Yf0JGyJxgRmXqFQyTgWUd9GZnmi3KlvowmRWpWqrhy modelo. - anthropic/claude-3-5-sonnet # O nome do modelo que pode ser usado; somente os modelos claude-3-5-sonnet fornecidos por provedores denominados anthropic podem ser usados. Os modelos claude-3-5-sonnet de outros provedores não podem ser usados. Esta gravação não corresponderá a um modelo denominado anthropic/claude-3-5-sonnet fornecido por outro provedor. - # Ao colocar colchetes pontiagudos em ambos os lados do nome do modelo, isso não vai para o canal chamado anthropic para encontrar o modelo claude-3-5-sonnet, mas usa todo o anthropic/claude-3-5-sonnet como o nome do modelo nome. Essa gravação corresponderá aos modelos fornecidos por outro provedor chamado anthropic/claude-3-5-sonnet. Ele não corresponderá ao modelo claude-3-5-sonnet em anthropic. - openai-test/text-moderation-latest # Quando a censura moral de mensagens está ativada, o modelo text-moderation-latest no canal chamado openai-test pode ser usado para censura moral. preferências. SCHEDULING_ALGORITHM: fixed_priority # Quando SCHEDULING_ALGORITHM for fixed_priority, use o agendamento de prioridade fixa para executar sempre o primeiro canal que tiver o modelo solicitado. Habilitado por padrão, SCHEDULING_ALGORITHM tem como padrão fixed_priority. Os valores opcionais de SCHEDULING_ALGORITHM são: fixed_priority, round_robin, weighted_round_robin, lottery e random. # Quando SCHEDULING_ALGORITHM for random, o balanceamento de carga round robin aleatório será usado para solicitar aleatoriamente canais que possuam o modelo solicitado. # Quando SCHEDULING_ALGORITHM for round_robin, use o balanceamento de carga round-training para solicitar os canais do modelo usado pelo usuário em ordem. AUTO_RETRY: true # Se deve tentar automaticamente, tentar novamente o próximo provedor, true para tentar automaticamente, false para não tentar automaticamente, o padrão é true RATE_LIMIT: 2/min O # suporta limitação de fluxo, número máximo de solicitações por minuto, pode ser definido como um número inteiro, como 2/min, 2 vezes por minuto, 5/hora, 5 vezes por hora, 10/dia, 10 vezes por dia, 10/mês, 10 vezes por mês, 10/ano, 10 vezes por ano. Padrão: 60/min, opcional ENABLE_MODERATION: true # Se deve ativar a censura moral de mensagens; true está ativado, false não está ativado; o padrão é false; quando ativado, as mensagens do usuário serão censuradas moralmente e, se forem encontradas mensagens inadequadas, será retornada uma mensagem de erro. Exemplo de configuração de balanceamento de carga ponderado em nível de canal # - api: sk-KjjI60Yd0JFWtxxxxxxxxxxxxxxxxxxxxxxxxxwmRWpWpQRo modelo: gcp1/*: 5 - gcp1/*: 5 # Os pesos vêm após os dois pontos e somente números inteiros positivos são aceitos. - gcp2/*: 3 # O tamanho do número representa o peso; quanto maior o número, maior a probabilidade da solicitação. - gcp3/*: 2 # Neste exemplo, há 10 pesos para todos os canais combinados e, das 10 solicitações, 5 solicitações solicitarão o modelo gcp1/*, 2 solicitações solicitarão o modelo gcp2/* e 3 solicitações solicitarão o modelo gcp3/*. preferências. SCHEDULING_ALGORITHM: weighted_round_robin # As solicitações serão feitas em ordem ponderada somente se SCHEDULING_ALGORITHM for weighted_round_robin e os canais acima tiverem pesos. Use o balanceamento de carga round robin ponderado para solicitar canais que tenham o modelo solicitado em ordem ponderada. Quando SCHEDULING_ALGORITHM for lottery, use o balanceamento de carga round robin lottery para solicitar aleatoriamente os canais que possuem o modelo solicitado de acordo com seus pesos. Os canais que não têm um peso definido voltam automaticamente para o balanceamento de carga round_robin round robin. AUTO_RETRY: verdadeiro preferências: configuração global do # model_timeout: tempo limite do modelo # em segundos, padrão 100 segundos, opcional gpt-4o: 10 O tempo limite do modelo gpt-4o do # é de 10 segundos; gpt-4o é o nome do modelo; ao solicitar um modelo como gpt-4o-2024-08-06, o tempo limite também é de 10 segundos. claude-3-5-sonnet: 10 modelos # O tempo limite do claude-3-5-sonnet é de 10 segundos; ao solicitar modelos como claude-3-5-sonnet-20240620, o tempo limite também é de 10 segundos. default: 10 Os modelos # não têm um tempo limite definido, o tempo limite padrão é de 10 segundos; ao solicitar um modelo que não esteja em model_timeout, o tempo limite padrão é de 10 segundos; se default não estiver definido, o uni-api usará o tempo limite padrão definido pela variável de ambiente TIMEOUT, o tempo limite padrão é de 100 segundos. o1-mini: 30 # O tempo limite para o modelo o1-mini é de 30 segundos; ao solicitar um modelo cujo nome começa com o1-mini, o tempo limite é de 30 segundos. o1-preview: 100 # O tempo limite para o modelo o1-preview é de 100 segundos quando se solicita um modelo cujo nome começa com o1-preview. cooldown_period: 300 # Tempo de resfriamento do canal em segundos, padrão 300 segundos, opcional. Quando a solicitação do modelo falhar, o canal será automaticamente excluído do resfriamento por um período de tempo e não será solicitado novamente. Após o término do tempo de resfriamento, o modelo será restaurado automaticamente até que a solicitação falhe novamente e ele seja resfriado novamente. Quando cooldown_period é definido como 0, o mecanismo de resfriamento não é ativado.
- Lançamento de contêineres::
docker run -d --name uni-api -e CONFIG_URL=http://file_url/api.yaml -e DISABLE_DATABASE=true yym68686/uni-api:latest
- Chamando a API::
curl -X POST https://api.your.com/v1/chat/completions -H "Authorisation: Bearer sk-Pkj60Yf8JFWxfgRmXQFWyGtWUddGZnmi3KlvowmRWpWpQxx" -d '{" model": "gpt-4o", "messages": [{"role": "user", "content": "Hello!"}]}'