Pular para o conteúdo principal

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.

observação

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