Apexnova Consulting

Responses

POST/v1/responses

Endpoint del protocolo Responses de OpenAI, para clientes como Codex que solo hablan la Responses API. El base_url es idéntico al de Chat Completions, y las claves API y los nombres de modelo son los mismos: solo cambias de endpoint. Se factura por tokens de entrada y salida exactamente igual que Chat Completions.

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
modelstringModelo a usar, como Public Model Name de la plataforma (p. ej. glm-4.6).
inputstring or arrayLa entrada. Puede ser texto simple o un array de mensajes y elementos de herramienta (message / function_call / function_call_output).
instructionsstringNoInstrucciones de nivel sistema, equivalentes a un mensaje system colocado al principio.
streambooleanNoSi es true, la respuesta se entrega como un flujo de eventos semánticos (SSE). Por defecto: false.
max_output_tokensintegerNoNúmero máximo de tokens de salida a generar.
temperaturenumberNoTemperatura de muestreo; cuanto más alta, más aleatorio.
top_pnumberNoUmbral de nucleus sampling; ajusta este o temperature, no ambos.
toolsarrayNoHerramientas que el modelo puede llamar. Solo se admite type function (forma plana: name / description / parameters directamente en el objeto).
tool_choicestring or objectNoSelección de herramienta: auto / none / required, o { type: 'function', name: '...' } para forzar una concreta.
textobjectNoControl del formato de salida, p. ej. { format: { type: 'json_schema', name, schema } } para forzar JSON estructurado.
reasoningobjectNoConfiguración de razonamiento para modelos de pensamiento; se admite effort (p. ej. low / medium / high).
parallel_tool_callsbooleanNoSi el modelo puede emitir varias llamadas a herramientas en paralelo dentro de un mismo turno.

Ejemplo de solicitud

bash
curl https://api.apexnova-consulting.com/v1/responses \
  -H "Authorization: Bearer sk-xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "glm-4.6",
    "input": "Hello",
    "max_output_tokens": 1024
  }'
python
from openai import OpenAI

# Same base_url as Chat Completions — you only switch the method
client = OpenAI(
    base_url="https://api.apexnova-consulting.com/v1",
    api_key="sk-xxxxxxxx",
)

resp = client.responses.create(
    model="glm-4.6",
    input="Hello",
    max_output_tokens=1024,
)
print(resp.output_text)

Ejemplo de respuesta

json
{
  "id": "resp_abc123",
  "object": "response",
  "created_at": 1786703735,
  "status": "completed",
  "model": "glm-4.6",
  "output": [
    {
      "type": "message",
      "id": "msg_abc123",
      "status": "completed",
      "role": "assistant",
      "content": [
        { "type": "output_text", "text": "Hello! How can I help you today?", "annotations": [] }
      ]
    }
  ],
  "usage": {
    "input_tokens": 8,
    "input_tokens_details": { "cached_tokens": 0 },
    "output_tokens": 12,
    "output_tokens_details": { "reasoning_tokens": 0 },
    "total_tokens": 20
  },
  "error": null,
  "incomplete_details": null,
  "store": false,
  "previous_response_id": null
}

Sin estado: envía el contexto completo en cada turno

Este endpoint no guarda la conversación en el servidor y no admite previous_response_id ni conversation. Incluye el contexto completo en input en cada petición y devuelve los resultados de las herramientas como function_call_output en el siguiente turno.

python
# Stateless: send the full context in input every turn (no previous_response_id)
resp = client.responses.create(
    model="glm-4.6",
    input=[
        {"role": "user", "content": "What is the weather in Madrid? Use the tool."},
        {"type": "function_call", "call_id": "call_x1", "name": "get_weather",
         "arguments": '{"city":"Madrid"}'},
        {"type": "function_call_output", "call_id": "call_x1", "output": "22C sunny"},
    ],
    tools=[{
        "type": "function",
        "name": "get_weather",
        "parameters": {
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"],
        },
    }],
)
print(resp.output_text)

Avanzado: herramientas y streaming

Las tools de Responses son planas: name / description / parameters van directamente en el objeto de la herramienta, sin la envoltura function que usa Chat Completions. El streaming devuelve eventos semánticos, cada uno con type y sequence_number.

bash
curl https://api.apexnova-consulting.com/v1/responses \
  -H "Authorization: Bearer sk-xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "glm-4.6",
    "input": "What is the weather in Madrid? Use the tool.",
    "tools": [{
      "type": "function",
      "name": "get_weather",
      "description": "Get current weather for a city",
      "parameters": {
        "type": "object",
        "properties": { "city": { "type": "string" } },
        "required": ["city"]
      }
    }],
    "max_output_tokens": 1024
  }'
python
# Streaming: semantic event stream (response.output_text.delta, ...)
with client.responses.stream(
    model="glm-4.6",
    input="Count to 5.",
    max_output_tokens=256,
) as stream:
    for event in stream:
        if event.type == "response.output_text.delta":
            print(event.delta, end="", flush=True)

Uso con Codex

Codex solo habla la Responses API: pon wire_api en responses, apúntalo a este endpoint y usa un Public Model Name en model. La configuración de abajo está verificada. Codex puede avisar de que no encuentra los metadatos del modelo (no reconoce los nombres de modelo de la plataforma y usa valores por defecto); es inofensivo.

toml
# ~/.codex/config.toml — point Codex at Apexnova AI Hub
model_provider = "apexnova"
model = "glm-4.6"                # a Public Model Name on this platform

[model_providers.apexnova]
name = "Apexnova AI Hub"
base_url = "https://api.apexnova-consulting.com/v1"
env_key = "APEXNOVA_API_KEY"     # holds the sk-... key from your console
wire_api = "responses"

# Then set the environment variable and run:
#   export APEXNOVA_API_KEY=sk-xxxxxxxx
#   codex

Parámetros no admitidos

Para que los clientes existentes funcionen sin ajustes, hay dos tratamientos distintos: se rechaza todo lo que te daría un resultado incorrecto de forma silenciosa, y se ignora lo que solo afecta a optimizaciones o metadatos.

  • Se rechazan con 400 unsupported_parameter: previous_response_id, conversation, background y las peticiones que envían tools sin que ninguna sea de tipo function.
  • Herramientas: solo se reenvían al modelo las de tipo function. Las herramientas integradas del servidor (web_search / file_search / code_interpreter / computer_use / mcp) y las de espacio de nombres del cliente se descartan, mientras que el resto de herramientas function de la misma petición siguen funcionando. Codex envía una entrada declarativa de web_search en cada turno: justamente por eso se descartan en vez de rechazarse.
  • Se ignoran en silencio (sin error y sin efecto): store, metadata, include, truncation, service_tier, prompt_cache_key, top_logprobs. La respuesta devuelve explícitamente store: false.

Notas

  • El base_url es el mismo que el de /v1/chat/completions (https://api.tu-dominio/v1), con la misma clave API y los mismos nombres de modelo; en el SDK de OpenAI basta con cambiar client.chat.completions.create() por client.responses.create().
  • Con stream en true recibes un flujo de eventos semánticos: response.created → output_item.added → output_text.delta → output_item.done → response.completed, con el recuento de tokens en response.usage del último evento.
  • En los modelos de razonamiento, el proceso aparece como un item reasoning dentro del array output (response.reasoning_text.delta en streaming). reasoning_tokens es un desglose de output_tokens, no un cargo adicional.
  • La facturación coincide exactamente con Chat Completions: el mismo modelo con la misma entrada y salida cuesta lo mismo en ambos endpoints; usage se expresa como input_tokens / output_tokens.
  • model debe ser un modelo chat preciado y habilitado en la plataforma; un modelo desconocido o una modalidad que no coincide devuelve 404 model_not_found.
  • Los modelos BYOK (prefijo byok/) no están disponibles en este endpoint: usa /v1/chat/completions.
Responses · Documentación de Apexnova AI Hub