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="roy_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="roy_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/projects/{owner_slug}/{project_slug}/chats
Authorization: Bearer roy_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á-las de volta devolve message_count e um updated_at durável por chat.
message_count é calculado pelo plano de controle, e updated_at muda quando o
chat, suas tags ou suas mensagens são editados. Não existe campo source:
upload, API e editor são caminhos de ingestão, não proveniência persistida, e um
campo que informasse um deles estaria adivinhando.
GET /api/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
otimizador, e os limites que a API impõe são publicados por
GET /api/base-models.
POST /api/projects/{owner_slug}/{project_slug}/training-jobs
Authorization: Bearer roy_sua_chave_de_api
Content-Type: application/json
{
"dataset_tags": ["suporte"],
"model_name": "unsloth/Qwen3.5-9B",
"max_seq_length": 2048,
"num_train_epochs": 3
}
Acompanhe, e interrompa se quiser:
GET /api/projects/{owner_slug}/{project_slug}/training-jobs/{job_id}
POST /api/projects/{owner_slug}/{project_slug}/training-jobs/{job_id}/cancel
Um job passa por queued → preparing → training → finalizing → terminal. O cancelamento é atendido no próximo ponto seguro, e não imediatamente, e você paga pelos minutos de GPU consumidos até ali e nada além.
Não existe etapa de avaliação nem de deploy. O job relata o que de fato fez — os exemplos em que treinou, a revisão do base que resolveu e o hardware em que rodou — e uma etapa que não existe seria uma resposta pior do que nenhuma. Veja Jobs de treino para a tabela de estados completa.
05 · Sirva o modelo
Um job que produziu um artefato é hospedado sob um nome estável que você
escolhe, e daí em diante ele é apenas 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: um fine-tune concluído pode ser baixado e executado em qualquer lugar, e nada aqui depende de você ficar.
Para onde ir depois
- Autenticação — o manejo de chaves por inteiro.
- 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.