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.
| Elemento | Valor |
|---|---|
| Base URL | https://api.hop-base.com/v1 |
| Variable de entorno de la clave | HOPBASE_OPENAI_API_KEY |
| Modelos | GPT, Gemini, chat de GLM y otros modelos compatibles con OpenAI |
| ID del modelo | Utilice 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 openaiEnví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.
- 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ámetro | Obligatorio | Tipo y límites | Predeterminado | Descripción |
|---|---|---|---|---|
model | Obligatorio | string, 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 |
messages | Obligatorio en Chat Completions | array, al menos 1 elemento | — | Si falta devuelve 400 missing messages field; un array vacío devuelve 400 messages must not be an empty array |
input | Obligatorio en Responses | string o array | — | Una cadena se envuelve en un único mensaje de usuario |
max_tokens / max_completion_tokens / max_output_tokens | Opcional | integer; el gateway no lo recorta ni lo reescribe | Predeterminado del modelo | El máximo es el límite oficial del modelo; por encima, el modelo devuelve un error |
stream | Opcional | boolean | false | true devuelve SSE |
stream_options.include_usage | Opcional | boolean | false | En 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_choice | Opcional | formato de function tools de OpenAI | — | Se reenvían sin cambios |
service_tier | Opcional | solo 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) | false | Las 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.
- No admite
service_tier: "priority"(incluidofast): la solicitud se procesa en el nivel estándar y se factura a precio estándar. - El campo
modelde 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 comprueberesponse.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 encabezadosLlamadas 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
- Para generar imágenes, consulte la API de imágenes
- Para el chat de Gemini, consulte Chat de Gemini
- Para los modelos Claude, use el SDK de Anthropic
- Si algo falla, revise Solución de problemas