Aprendizagem pessoal com IA
e orientação prática

uni-api: API de modelo grande e leve convertida para a interface OpenAI, arquivo YAML para configurar o canal da API

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

1. Implantação da Vercel

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

  1. Preparando o arquivo de configuraçãoCriar um arquivo chamadoapi.yamlarquivo de configuração, preenchendo as informações do provedor de serviços, o endereço da API e a chave da API.
  2. Carregamento de arquivos de configuraçãoCarregue o arquivo de configuração em uma unidade de nuvem para obter um link direto para o arquivo.
  3. Iniciando um contêiner do Docker::
    • fazer uso deCONFIG_URLA variável de ambiente define o URL do arquivo de configuração.
    • configurarDISABLE_DATABASEpor 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
  4. Configurar a portaAbra uma porta aleatória no painel e aponte-a para o contêiner do Docker.

Processo de uso

  1. Chamando a APIChamada de serviços back-end usando uma interface API unificada, com suporte a vários modelos e provedores de serviços.
  2. balanceamento de cargaAtribui automaticamente solicitações a diferentes canais com base na política de balanceamento de carga no arquivo de configuração.
  3. 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.
  4. repetição automáticaGarantia de alta disponibilidade ao tentar novamente o próximo canal disponível quando uma solicitação falha.

Etapas detalhadas

  1. 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.
    
  2. 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
    
  3. 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!"}]}'
    
Aprendizagem fácil com IA

O guia do leigo para começar a usar a IA

Ajuda você a aprender a utilizar as ferramentas de IA com baixo custo e a partir de uma base zero.A IA, assim como o software de escritório, é uma habilidade essencial para todos. Dominar a IA lhe dará uma vantagem em sua busca de emprego e metade do esforço em seu trabalho e estudos futuros.

Ver detalhes>
Não pode ser reproduzido sem permissão:Chefe do Círculo de Compartilhamento de IA " uni-api: API de modelo grande e leve convertida para a interface OpenAI, arquivo YAML para configurar o canal da API

Chefe do Círculo de Compartilhamento de IA

O Chief AI Sharing Circle se concentra no aprendizado de IA, fornecendo conteúdo abrangente de aprendizado de IA, ferramentas de IA e orientação prática. Nosso objetivo é ajudar os usuários a dominar a tecnologia de IA e explorar juntos o potencial ilimitado da IA por meio de conteúdo de alta qualidade e compartilhamento de experiências práticas. Seja você um iniciante em IA ou um especialista sênior, este é o lugar ideal para adquirir conhecimento, aprimorar suas habilidades e realizar inovações.

Entre em contato conosco
pt_BRPortuguês do Brasil