Saltar al contenido

OpenAI SDK

Llame a HopBase con el SDK de OpenAI para Python o Node.js.

Las aplicaciones que ya usan el SDK de OpenAI solo necesitan cambiar el Base URL, la clave del plan y el ID del modelo. Mantenga el framework y el manejo de errores actuales de la aplicación.

ElementoValor
Base URLhttps://api.hop-base.com/v1
Variable de entorno de la claveHOPBASE_OPENAI_API_KEY
ModelosGPT, Gemini, chat de GLM y otros modelos compatibles con OpenAI
ID del modeloUtilice un ID devuelto por GET /v1/models para la clave seleccionada

Instale y envíe una solicitud mínima

Instale el SDK:

python -m pip install openai

Envíe una solicitud:

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.hop-base.com/v1",
    api_key=os.environ["HOPBASE_OPENAI_API_KEY"],
)

resp = client.chat.completions.create(
    model="gpt-5.6-sol",
    messages=[{"role": "user", "content": "Hola"}],
)
print(resp.choices[0].message.content)

Comience con el prompt "Responda únicamente con ok." Agregue stream: true solo cuando la aplicación realmente use streaming, y luego verifique que los eventos SSE lleguen de forma incremental.

El chat y la generación de imágenes están en grupos distintos.
  • Chat de GPT y Responses: el grupo Codex Plus, Codex Pro o GPT oficial directo (Azure). Gemini, GLM y otros modelos de chat están en sus propios grupos.
  • Generación de imágenes (gpt-image-*): el grupo GPT Image (todos los modelos). Una clave sin este grupo no llega a los modelos de imagen (404). Consulte la API de imágenes.
  • Si una misma aplicación usa ambos, añada los dos grupos a una sola clave, o use dos claves en variables de entorno distintas (por ejemplo, añada HOPBASE_IMAGE_API_KEY), como hacen los ejemplos anteriores.

Nunca incluya una clave real en el código fuente. Inyecte HOPBASE_OPENAI_API_KEY mediante su plataforma de despliegue, un archivo .env local o el entorno del sistema, y nunca incluya .env en un commit de Git.

Parámetros de solicitud admitidos

Esta tabla solo incluye los campos que el gateway comprueba, reescribe o rechaza en POST /v1/chat/completions y POST /v1/responses. Los demás campos de OpenAI se reenvían sin cambios y siguen los límites oficiales del modelo. Los límites de contexto y salida de cada modelo están en la lista de modelos; las diferencias entre grupos de Gemini están en Chat de Gemini.

ParámetroObligatorioTipo y límitesPredeterminadoDescripción
modelObligatoriostring, un ID de modelo del grupo de la clave actual—Un modelo fuera del grupo devuelve 404 model_not_found; los modelos de imagen como gpt-image-* devuelven 400 image models do not support Chat Completions, please use the Images API en los endpoints de chat
messagesObligatorio en Chat Completionsarray, al menos 1 elemento—Si falta devuelve 400 missing messages field; un array vacío devuelve 400 messages must not be an empty array
inputObligatorio en Responsesstring o array—Una cadena se envuelve en un único mensaje de usuario
max_tokens / max_completion_tokens / max_output_tokensOpcionalinteger; el gateway no lo recorta ni lo reescribePredeterminado del modeloEl máximo es el límite oficial del modelo; por encima, el modelo devuelve un error
streamOpcionalbooleanfalsetrue devuelve SSE
stream_options.include_usageOpcionalbooleanfalseEn streaming, envíe true para recibir el evento final que solo contiene usage; sin él, ese evento no se envía (la facturación no cambia)
tools / tool_choiceOpcionalformato de function tools de OpenAI—Se reenvían sin cambios
service_tierOpcionalsolo se conservan priority / flex; fast se trata como priority—Los demás valores se eliminan antes de reenviar, sin error. Fast (priority) solo se aplica, y solo se factura con la tarifa Fast, cuando su grupo lo admite; en caso contrario, la solicitud se procesa y se factura en el nivel estándar
previous_response_id—No admitido (Responses)—El gateway elimina este campo, así que no se continúa el turno anterior; envíe el historial completo en input para conversaciones de varios turnos
store—Siempre false (Responses)falseLas respuestas no se guardan en el servidor y no se pueden recuperar por ID después

El cuerpo completo de la solicitud tiene un límite de 60 MB; si lo supera, devuelve 413.

Diferencias del grupo GPT oficial directo (Azure).
  • No admite service_tier: "priority" (incluido fast): la solicitud se procesa en el nivel estándar y se factura a precio estándar.
  • El campo model de la respuesta puede ser un nombre de snapshot con fecha (por ejemplo, gpt-5.5-2026-04-24), igual que en la API oficial de OpenAI. Se factura por el ID de modelo solicitado; la sección Uso de la consola también puede mostrar el nombre del snapshot. No compruebe response.model == request.model.

Transmita la salida y obtenga el consumo

Al pasar stream_options.include_usage, el último evento trae choices vacío y su campo usage contiene el consumo de tokens de la solicitud.

stream = client.chat.completions.create(
    model="gpt-5.6-sol",
    messages=[{"role": "user", "content": "Descríbete en tres frases"}],
    stream=True,
    stream_options={"include_usage": True},
)
for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)
    if chunk.usage:  # Último evento: choices vacío, solo trae usage
        print()
        print(chunk.usage)

Leer el cargo de una solicitud

Una solicitud facturada sin streaming devuelve en el encabezado de respuesta X-HopBase-Cost-USD el importe en USD que se descuenta realmente de su saldo, en X-HopBase-Cost el mismo cargo en CNY y en X-HopBase-Currency la moneda de X-HopBase-Cost (siempre CNY). La respuesta JSON también incluye los mismos cost, cost_usd y currency en usage, y el SDK los conserva como campos adicionales. Las respuestas en streaming no llevan ninguno; consulte el cargo en Uso de la consola. Las reglas completas están en Cargos.

raw = client.chat.completions.with_raw_response.create(
    model="gpt-5.6-sol",
    messages=[{"role": "user", "content": "Responde solo con ok"}],
)
print(raw.headers.get("x-hopbase-cost"), raw.headers.get("x-hopbase-cost-usd"), raw.headers.get("x-hopbase-currency"))
resp = raw.parse()  # Mismo valor que sin with_raw_response
print(resp.usage.cost, resp.usage.cost_usd, resp.usage.currency)  # Campos adicionales, mismos valores que los encabezados

Llamadas a herramientas

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Consultar el clima de una ciudad",
        "parameters": {
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"],
        },
    },
}]
messages = [{"role": "user", "content": "¿Cómo está el clima hoy en Shanghái?"}]

resp = client.chat.completions.create(model="gpt-5.6-sol", messages=messages, tools=tools)
msg = resp.choices[0].message
if msg.tool_calls:
    call = msg.tool_calls[0]
    print(call.function.name, call.function.arguments)
    # Ejecute la herramienta y devuelva el resultado; tool_call_id debe coincidir con el call.id anterior
    messages += [msg, {"role": "tool", "tool_call_id": call.id, "content": "Soleado, 26°C"}]
    resp = client.chat.completions.create(model="gpt-5.6-sol", messages=messages, tools=tools)
print(resp.choices[0].message.content)

Tiempos de espera y reintentos

openai-python y openai-node usan por defecto un tiempo de espera de lectura de 600 segundos y 2 reintentos automáticos. Use streaming para salidas largas; los límites de concurrencia y tiempos de espera están en Concurrencia, tiempos de espera y facturación.

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.hop-base.com/v1",
    api_key=os.environ["HOPBASE_OPENAI_API_KEY"],
    timeout=600,    # segundos; para salidas largas prefiera streaming
    max_retries=2,  # reintentos automáticos ante errores de conexión, 429 y 5xx
)

Próximos pasos