Início rápido
Cinco passos de um projeto vazio até um modelo ajustado respondendo por um endpoint compatível com a OpenAI. Cada passo é a requisição que de fato o executa, então esta página serve também como a integração mais curta possível.
Todo caminho abaixo é escopado a um projeto: {owner_slug} é o slug da sua
conta e {project_slug} é o do projeto. Os dois aparecem na URL de qualquer
tela de projeto.
01 · Obtenha uma chave
Crie e revogue chaves pelo menu de perfil, em Chaves de API. Uma chave é exibida uma única vez, na resposta que a cria: ela é guardada como digest, então nenhuma listagem consegue devolvê-la e ninguém consegue recuperá-la para você. Se você a perder, revogue e crie outra.
Envie-a como bearer token e mantenha-a fora do controle de versão.
export REOPENLY_API_KEY="fnf_sua_chave_de_api"
02 · Aponte o SDK para o seu projeto
Todo projeto expõe uma superfície compatível com a OpenAI. A única mudança no código existente é a base URL.
pip install openai
from openai import OpenAI
client = OpenAI(
base_url="https://reopenly.com/api/projects/{owner_slug}/{project_slug}/openai/v1",
api_key="fnf_sua_chave_de_api",
)
Você pode parar por aqui. Um projeto sem dataset e sem fine-tune ainda serve os modelos base do catálogo por esse cliente.
03 · Adicione exemplos
Os chats são os dados de treino. Adicione-os a partir do seu próprio pipeline usando a mesma API que o editor usa, para que o que você curou à mão e o que você importou terminem no mesmo lugar.
POST /api/v1/projects/{owner_slug}/{project_slug}/chats
Authorization: Bearer fnf_sua_chave_de_api
Content-Type: application/json
{
"name": "trocas-faq-01",
"tags": ["suporte"],
"messages": [
{"role": "user", "text": "Como funcionam as trocas?"},
{"role": "assistant", "text": "Trocas são gratuitas em até 30 dias."}
]
}
As tags são como um fine-tune seleciona seus dados, então vale escolhê-las deliberadamente, e não depois do fato.
Listá-los de volta devolve message_count, um updated_at durável e um
source anulável por chat. message_count é calculado pelo servidor,
e updated_at muda quando o chat, suas tags ou suas mensagens são editados.
source é csv, api, editor ou playground; chats antigos, criados antes
do registro de proveniência, podem retornar null. O servidor decide esse
valor, portanto uma chave de API não pode declarar outro caminho de ingestão.
GET /api/v1/projects/{owner_slug}/{project_slug}/chats
04 · Faça o fine-tune
Um job é criado a partir de tags do dataset e de um modelo base, e é medido
em steps em vez de épocas: o treinador roda um número fixo de steps do
treinamento, e os limites que a API impõe são publicados por
GET /api/v1/base-models.
POST /api/v1/projects/{owner_slug}/{project_slug}/training-jobs
Authorization: Bearer fnf_sua_chave_de_api
Content-Type: application/json
{
"dataset_tags": ["suporte"],
"model_name": "<catalog-model-id>",
"max_seq_length": 2048,
"num_train_epochs": 3
}
Acompanhe, e interrompa se quiser:
GET /api/v1/projects/{owner_slug}/{project_slug}/training-jobs/{job_id}
POST /api/v1/projects/{owner_slug}/{project_slug}/training-jobs/{job_id}/cancel
Primeiro, a ReOpenly congela os chats selecionados, para que edições posteriores não mudem a execução. Carregar o modelo, ler e tokenizar seus dados acontecem antes de o treino começar, e publicar o modelo depois que ele termina: somente o laço de treino é cobrado. Uma execução que nunca chega ao primeiro passo de treinamento não é cobrada.
Cancelar e parar são duas operações. POST .../cancel vale enquanto o job está
na fila ou preparando, onde nada foi aprendido e nada é cobrado. Depois que o
treino começou, POST .../pause é o controle: a execução continua até o próximo
checkpoint de recuperação e assenta como paused, de onde pode ser retomada ou
concluída. Nenhum dos dois vale depois que o job entra em pós-processamento ou
finalização.
Não existe um estado público separado de evaluation ou deployment. Runs
elegíveis avaliam durante o loop de treino, enviam melhorias estritas de perda
como candidatos de adaptador e promovem o candidato verificado com menor perda
durante a finalização. Veja Jobs de treino para os estados,
a política de avaliação e os limites de cobrança.
05 · Sirva o modelo
Um job que produziu um artefato pode ser publicado sob um nome estável que você escolhe. Primeiro crie o alias:
POST /api/v1/projects/{owner_slug}/{project_slug}/models
Authorization: Bearer fnf_sua_chave_de_api
Content-Type: application/json
{
"name": "Bot de suporte",
"slug": "bot-suporte",
"training_job_id": 87
}
Daí em diante o slug é mais um valor de model para o mesmo cliente do passo
02.
response = client.chat.completions.create(
model="bot-suporte",
messages=[{"role": "user", "content": "Como funcionam as trocas?"}],
temperature=0.7,
max_tokens=1024,
stream=True,
)
for chunk in response:
print(chunk.choices[0].delta.content or "", end="")
Os pesos são seus. Baixe um adaptador LoRA promovido com
GET /api/v1/projects/{owner_slug}/{project_slug}/training-jobs/{job_id}/download?format=lora
e execute-o onde quiser.
Para onde ir depois
- Autenticação — o manejo de chaves por inteiro.
- Projetos e datasets — ciclo de vida, CRUD de chats, filtros e importações.
- Inferência compatível com a OpenAI — modelos, streaming, limites de contexto.
- Erros e retentativas — quais falhas vale a pena repetir, e quais nunca.
- Jobs de treino — as tabelas reais de estado e de tentativas.
- Preços e créditos — estimativas, saldo, extrato e checkout.