Uma sessão combina um Agent (configuração) e um Environment (infraestrutura) em um contexto de execução com estado. Você envia mensagens para uma sessão e ela retorna um fluxo de eventos.
O novo site de documentação do Qoder CN já está disponível. O conteúdo deste site pode não refletir os recursos e as alterações mais recentes do product. Acesse docs.qoder.cn para ver a documentação mais recente do product.
Ciclo de vida da sessão
-
Criar → idle
Uma nova sessão entra no estado
idlee aguarda entradas. -
idle → processing
Ao enviar um evento
user.message, o status muda paraprocessing. -
processing → idle
Quando o turno atual termina, a sessão retorna ao estado
idle, pronta para o próximo turno. -
processing → canceling → idle
Quando você cancela uma sessão em execução, o status dela passa para
cancelingantes de retornar aidle. A sessão continua disponível para uso. -
archived (estado terminal)
O status archived é um estado terminal. Não é possível restaurar uma sessão arquivada.
Uma sessão é uma máquina de estados com os seguintes status principais:
|
Status |
Descrição |
Transições para |
|
|
Ocioso; aguarda uma mensagem do usuário. |
|
|
|
Em processamento; o Agent está em execução. |
|
|
|
Cancelamento solicitado; aguarda a interrupção da tarefa em execução. |
|
|
|
Arquivado. |
— (estado terminal) |
Campos
|
Parâmetro |
Tipo |
Descrição |
|
|
string |
Gerado pelo sistema, com o prefixo |
|
|
string |
Valor fixo: |
|
|
string/object |
O Agent vinculado. Use uma string (ID do Agent) para a versão mais recente ou um objeto |
|
|
string |
O ID do Agent vinculado. A API retorna este campo apenas na resposta e o mantém para compatibilidade com versões anteriores. |
|
|
string |
O ID do Environment vinculado. |
|
|
string |
O status atual: |
|
|
string |
O status do turno atual: |
|
|
string |
O título da sessão. O padrão é |
|
|
array |
Uma lista de IDs de Memory Store associados. O padrão é |
|
|
array |
Uma lista de IDs de Vault associados. O padrão é |
|
|
array |
Recursos, como arquivos, anexados à sessão. O padrão é |
|
|
string |
O momento de criação da sessão. |
|
|
string |
O momento da última atualização da sessão. |
A resposta da API REST não inclui dados de uso de tokens (usage). Esses dados aparecem apenas no evento Server-Sent Events (SSE) session.status_idle no final de cada turno.
Crie uma sessão
Para criar uma sessão, especifique um agent e um environment_id.
Usar um ID de Agent (string)
Vincula a sessão à versão mais recente do Agent.
# Create a Session using an Agent ID
curl -s -X POST https://api.qoder.com.cn/api/v1/cloud/sessions \
-H "Authorization: Bearer $QODER_PAT" \
-H "Content-Type: application/json" \
-d '{
"agent": "agent_019e5ce0bf307a1a8f952eb814aea3d5",
"environment_id": "env_019e44eb66bb748cabcd1489f6fa4428"
}' | jq .
Usar um objeto Agent (especifique a versão)
Vincula a sessão a uma versão específica do Agent para garantir um comportamento consistente.
# Create a Session by specifying an Agent version
curl -s -X POST https://api.qoder.com.cn/api/v1/cloud/sessions \
-H "Authorization: Bearer $QODER_PAT" \
-H "Content-Type: application/json" \
-d '{
"agent": {
"id": "agent_019e5ce0bf307a1a8f952eb814aea3d5",
"version": 2
},
"environment_id": "env_019e44eb66bb748cabcd1489f6fa4428"
}' | jq .
Uma requisição bem-sucedida retorna uma resposta 201 Created:
{
"id": "sess_019e5ce0bf9074b69c3481e93771a522",
"agent": {
"created_at": "2026-05-18T10:00:00Z",
"default_environment": "",
"description": "",
"id": "agent_019e5ce0bf307a1a8f952eb814aea3d5",
"instructions": "You are a code review expert.",
"mcp_servers": [],
"model": "ultimate",
"name": "code-reviewer",
"system": "You are a code review expert.",
"tools": [
{
"type": "agent_toolset_20260401",
"enabled_tools": ["Bash", "Read", "Write"]
}
],
"type": "agent",
"updated_at": "2026-05-18T10:00:00Z",
"version": 2
},
"agent_id": "agent_019e5ce0bf307a1a8f952eb814aea3d5",
"environment_id": "env_019e44eb66bb748cabcd1489f6fa4428",
"status": "idle",
"title": "",
"turn_status": "idle",
"memory_store_ids": [],
"resources": [],
"vault_ids": [],
"type": "session",
"created_at": "2026-05-18T12:00:00Z",
"updated_at": "2026-05-18T12:00:00Z"
}
Em produção, especifique uma versão para evitar mudanças inesperadas de comportamento e atualize o Agent com segurança.
Formato do campo Agent
|
Formato |
Exemplo |
Comportamento |
|
string |
|
Usa a versão mais recente do Agent. |
|
object |
|
Fixa a sessão na versão especificada. |
Transições de estado
Formato do corpo da requisição de evento
O corpo da requisição para POST /sessions/{id}/events deve ser um objeto contendo um array events. Cada evento no array inclui um campo content com um array de blocos de conteúdo.
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
|
array |
Sim |
Um array de eventos. Uma única requisição pode conter um ou mais eventos. |
|
|
string |
Sim |
O tipo de evento, como |
|
|
array |
Sim |
Um array de blocos de conteúdo. |
|
|
string |
Sim |
O tipo de bloco de conteúdo, como |
|
|
string |
Sim |
O conteúdo de texto. |
idle → processing
Ao enviar um evento user.message para uma sessão, o status dela muda de idle para processing.
# Send a message to trigger processing
curl -s -X POST "https://api.qoder.com.cn/api/v1/cloud/sessions/sess_019e5ce0bf9074b69c3481e93771a522/events" \
-H "Authorization: Bearer $QODER_PAT" \
-H "Content-Type: application/json" \
-d '{
"events": [{
"type": "user.message",
"content": [{"type": "text", "text": "Analyze the code complexity of all Python files in the current directory."}]
}]
}' | jq .
processing → idle
Quando o processamento termina, a sessão retorna automaticamente para idle. Você recebe um evento session.status_idle por meio do fluxo de eventos.
Cancele uma sessão
É possível interromper uma sessão em execução.
# Cancel a Session
curl -s -X POST "https://api.qoder.com.cn/api/v1/cloud/sessions/sess_019e5ce0bf9074b69c3481e93771a522/cancel" \
-H "Authorization: Bearer $QODER_PAT"
Uma requisição de cancelamento só interrompe a execução se a sessão estiver no status processing. O status primeiro passa para canceling e depois retorna a idle quando a interrupção termina. É possível reutilizar a sessão; basta enviar o próximo user.message para continuar. Tentar cancelar uma sessão que já está idle não tem efeito. Ela retorna uma resposta 200 OK sem alterar o status idle.
Recuperar sessões
# Retrieve a single Session
curl -s "https://api.qoder.com.cn/api/v1/cloud/sessions/sess_019e5ce0bf9074b69c3481e93771a522" \
-H "Authorization: Bearer $QODER_PAT"
# List all Sessions (with pagination)
curl -s "https://api.qoder.com.cn/api/v1/cloud/sessions?limit=10" \
-H "Authorization: Bearer $QODER_PAT"
Exemplo de resposta paginada:
{
"data": [
{
"id": "sess_019e5ce0bf9074b69c3481e93771a522",
"type": "session",
"agent_id": "agent_019e5ce0bf307a1a8f952eb814aea3d5",
"environment_id": "env_019e44eb66bb748cabcd1489f6fa4428",
"status": "idle",
"turn_status": "idle",
"title": "",
"memory_store_ids": [],
"vault_ids": [],
"resources": [],
"created_at": "2026-05-18T12:00:00Z",
"updated_at": "2026-05-18T12:30:00Z"
}
],
"first_id": "sess_019e5ce0bf9074b69c3481e93771a522",
"last_id": "sess_019e5ce0bf9074b69c3481e93771a522",
"has_more": false
}
Uso de tokens
A API REST não retorna o uso de tokens por turno. Em vez disso, escute o evento SSE session.status_idle no final de cada turno. O campo usage desse evento contém a contagem de tokens desse turno.
|
Parâmetro |
Descrição |
|
|
O número de tokens de entrada consumidos neste turno. |
|
|
O número de tokens de saída gerados neste turno. |
|
|
O número de tokens de entrada servidos do cache. |
|
|
O número de tokens de entrada gravados no cache. |
Exemplo de payload SSE session.status_idle:
{
"type": "session.status_idle",
"usage": {
"input_tokens": 3840,
"output_tokens": 2156,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0
}
}
Vinculação de versão da sessão e do Agent
Uma sessão captura um snapshot da configuração do Agent no momento da criação.
Use o formato de string
"agent": "agent_xxx"para vincular à versão mais recente do Agent no momento da criação.Use o formato de objeto
"agent": {"id": "agent_xxx", "version": N}para vincular a uma versão específica.Após a criação da sessão, modificar o Agent não afeta essa sessão.
Para usar uma nova versão de um Agent, crie uma nova sessão.
|
Sessão A — Vinculada ao Agent v1 Criada antes da atualização. A Sessão A continua usando a configuração v1 mesmo após o Agent ser atualizado para v2. |
Sessão B — Vinculada ao Agent v2 Criada após a atualização. Ela usa a nova configuração v2. |
Conversa de múltiplos turnos
As sessões suportam conversas de múltiplos turnos. Após enviar uma mensagem, aguarde o evento session.status_idle antes de enviar a próxima mensagem.
#!/bin/bash
# Multi-turn conversation example
BASE_URL="https://api.qoder.com.cn/api/v1/cloud"
SESSION_ID="sess_019e5ce0bf9074b69c3481e93771a522"
HEADERS=(
-H "Authorization: Bearer $QODER_PAT"
)
# Turn 1: Make the initial request
curl -s -X POST "$BASE_URL/sessions/$SESSION_ID/events" \
"${HEADERS[@]}" \
-H "Content-Type: application/json" \
-d '{"events": [{"type": "user.message", "content": [{"type": "text", "text": "Create a Python Flask project scaffold."}]}]}'
# Wait for processing to complete... (poll or listen for SSE)
sleep 30
# Turn 2: Add a follow-up requirement
curl -s -X POST "$BASE_URL/sessions/$SESSION_ID/events" \
"${HEADERS[@]}" \
-H "Content-Type: application/json" \
-d '{"events": [{"type": "user.message", "content": [{"type": "text", "text": "Add unit tests and a CI configuration to the project."}]}]}'
Códigos de erro relacionados ao status
Erros comuns ao enviar eventos para uma sessão:
|
HTTP |
Tipo |
Condição de gatilho |
|
409 |
|
Envio de uma mensagem para uma sessão no status |
|
404 |
|
A sessão não existe ou foi excluída. |
Exemplo de resposta de erro 409:
{
"type": "error",
"error": {
"type": "conflict_error",
"message": "Session is currently processing a turn. Cancel the current turn or wait for completion."
}
}
Melhores práticas
Fixação de versão — Em ambientes de produção, crie sempre sessões usando o formato
{"id": ..., "version": ...}.Cancelamento oportuno — Cancele sessões desnecessárias para liberar recursos.
Monitoramento de uso — Verifique regularmente o campo
usagepara evitar custos inesperados.Tags com metadados — Use o campo
metadatapara registrar o contexto do negócio, como IDs de tarefas ou fontes de gatilho.
Perguntas frequentes
P: As sessões têm um mecanismo de tempo limite?
R: Uma sessão idle permanece retida por um período de tempo. O sistema pode arquivar automaticamente sessões inativas por um período prolongado. Crie sessões sob demanda e cancele-as após a conclusão das tarefas.
P: O que acontece se eu enviar uma mensagem para uma sessão com o status processing?
R: A API retorna um HTTP 409 conflict_error. Cancele o turno atual ou aguarde a sessão retornar a idle antes de enviar uma nova mensagem.
P: Qual é o número máximo de turnos que uma sessão suporta?
R: Não há um limite rígido, mas o tamanho da janela de contexto do modelo impõe um limite prático. À medida que a conversa cresce, o modelo pode truncar o conteúdo anterior.
P: Como obtenho o histórico completo da conversa de uma sessão?
R: Chame a operação GET /sessions/{id}/events para recuperar todos os eventos da sessão, incluindo mensagens do usuário e respostas do Agent.
P: Uma sessão cancelada pode ser reutilizada?
R: Sim. Após cancelar uma sessão, o status dela passa automaticamente de canceling de volta para idle, e a sessão continua disponível. Envie o próximo user.message para continuar a conversa. Apenas o status archived é um estado terminal. Não é possível restaurar uma sessão arquivada.