Skip to main content

Librería Python simple y poderosa para acceder a múltiples modelos de inteligencia artificial de forma unificada

Project description

iamex

Librería Python simple y poderosa para acceder a múltiples modelos de inteligencia artificial de forma unificada.

PyPI version Python 3.7+ License: MIT

🚀 Instalación

pip install iamex

🔑 Clave de API (requerida)

Necesitas una API key para usar el SDK.

  • Dónde obtenerla: dev.iamex.io
  • Cómo configurarla (elige 1):
    • Variable de entorno
      • Windows PowerShell: $env:IAMEX_API_KEY="TU_API_KEY"
      • Linux/macOS: export IAMEX_API_KEY="TU_API_KEY"
    • Archivo .env
      IAMEX_API_KEY=TU_API_KEY
      
    • Pasarla directo en el código
      from iamex import IAMEX
      client = IAMEX(api_key="TU_API_KEY")
      

Hello World (stream)

from iamex import IAMEX

client = IAMEX()  # usa IAMEX_API_KEY del entorno
for chunk in client.chat.completions.create(
    model="IAM-advanced",
    messages=[{"role": "user", "content": "Di hola en 3 palabras."}],
    stream=True,
):
    piece = (chunk.get("choices") or [{}])[0].get("delta", {}).get("content") or ""
    if piece:
        print(piece, end="", flush=True)

Async (nuevo)

import asyncio
from iamex import AsyncIAMEX

async def main():
    async with AsyncIAMEX() as client:  # usa IAMEX_API_KEY del entorno
        buffer = []
        async for chunk in client.chat.completions.create(
            model="IAM-advanced",
            messages=[{"role": "user", "content": "Di hola en 3 palabras."}],
            stream=True,
        ):
            try:
                choice = (chunk.get("choices") or [])[0]
                delta = choice.get("delta") or {}
                piece = delta.get("content")
                if piece:
                    buffer.append(piece)
                    print(piece, end="", flush=True)
            except Exception:
                pass
        print("\n\nFinal:\n" + "".join(buffer))

asyncio.run(main())

Dependencias para async

Para usar el cliente asíncrono instala httpx:

pip install httpx

✅ Compatibilidad estilo OpenAI (Nuevo en v0.0.5)

Ahora puedes usar iamex en proyectos pensados para el SDK de OpenAI sin reescribir tu app. Solo instala el paquete y cambia el import. Así de fácil.

Migración en 1 línea

# Antes (OpenAI):
# from openai import OpenAI

# Ahora (iamex con interfaz OpenAI):
from iamex import IAMEX

client = IAMEX(api_key="tu_api_key")

Responses API (estilo v1)

from iamex import IAMEX

client = IAMEX(api_key="tu_api_key")

response = client.responses.create(
    model="IAM-advanced",
    input="Dime un haiku sobre Python"
)

print(response.output_text)

Chat Completions

from iamex import IAMEX

client = IAMEX(api_key="tu_api_key")

chat = client.chat.completions.create(
    model="IAM-advanced",
    messages=[
        {"role": "system", "content": "Eres un asistente útil"},
        {"role": "user", "content": "Explica la recursión en una frase"}
    ]
)

print(chat["choices"][0]["message"]["content"])

Text Completions

from iamex import IAMEX

client = IAMEX(api_key="tu_api_key")

comp = client.completions.create(
    model="IAM-advanced",
    prompt="Crea una lista de 3 ideas de apps"
)

print(comp["choices"][0]["text"])  # si el proveedor devuelve 'text'

Listado de modelos

from iamex import IAMEX

client = IAMEX(api_key="tu_api_key")
models = client.models.list()
print(models)

🤖 Modelos Disponibles

  • iam-adv-mex - Modelo avanzado en español
  • IAM-lite - Modelo ligero en español
  • IAM-advanced - Modelo avanzado en español (recomendado)
  • iam-lite-mex - Modelo ligero en español

📝 Uso Rápido

Estilo compatible (recomendado)

from iamex import IAMEX

client = IAMEX(api_key="tu_api_key")

# Responses API
resp = client.responses.create(model="IAM-advanced", input="¿Qué es Python?")
print(resp.output_text)

# Chat Completions
chat = client.chat.completions.create(
    model="IAM-advanced",
    messages=[{"role": "user", "content": "Explica una función lambda"}]
)
print(chat["choices"][0]["message"]["content"])

Listar modelos

models = client.models.list()
print(models)

⚡ Streaming (Nuevo en v0.0.5)

Soportamos respuestas en streaming con stream=True en chat.completions.create, completions.create y responses.create.

  • Formato de stream: líneas data: { ... } y cierre data: [DONE].
  • Los chunks intermedios traen el texto parcial; finish_reason llega al final.
  • Métricas usage normalmente no vienen dentro del stream.

Ejemplo: Chat Completions (stream)

from iamex import IAMEX

client = IAMEX(api_key="tu_api_key")

buffer = []
for chunk in client.chat.completions.create(
    model="IAM-advanced",
    messages=[{"role": "user", "content": "Escribe un haiku sobre Python"}],
    stream=True,
):
    try:
        choice = (chunk.get("choices") or [])[0]
        delta = choice.get("delta") or {}
        piece = delta.get("content")
        if piece:
            buffer.append(piece)
            print(piece, end="", flush=True)
    except Exception:
        pass

print("\n\nFinal:\n" + "".join(buffer))

Chunk típico (simplificado):

data: {"id":"chatcmpl_x","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"role":"assistant","content":"Hola"},"finish_reason":null}]}
data: {"id":"chatcmpl_x","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":", mundo"},"finish_reason":null}]}
data: {"id":"chatcmpl_x","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: [DONE]

Ejemplo: Text Completions (stream)

buffer = []
for chunk in client.completions.create(
    model="IAM-advanced",
    prompt="Di hola en 3 palabras.",
    stream=True,
):
    try:
        choice = (chunk.get("choices") or [])[0]
        piece = choice.get("text") or (choice.get("delta") or {}).get("content")
        if piece:
            buffer.append(piece)
            print(piece, end="", flush=True)
    except Exception:
        pass

print("\n\nFinal:\n" + "".join(buffer))

Chunk típico (simplificado):

data: {"id":"cmpl_x","object":"text_completion.chunk","choices":[{"index":0,"text":"Hola","finish_reason":null}]}
data: {"id":"cmpl_x","object":"text_completion.chunk","choices":[{"index":0,"text":", mundo","finish_reason":null}]}
data: {"id":"cmpl_x","object":"text_completion.chunk","choices":[{"index":0,"text":"","finish_reason":"stop"}]}
data: [DONE]

Ejemplo: Responses (stream)

for chunk in client.responses.create(
    model="IAM-advanced",
    input="Escribe un haiku de Python.",
    stream=True,
):
    # Si el chunk trae texto directo
    if isinstance(chunk, dict) and chunk.get("output_text"):
        print(chunk["output_text"], end="", flush=True)
        continue
    # Fallback: mostrar chunk crudo para debugging
    print(chunk)

Notas rápidas:

  • Imprime texto a medida que llegan los chunks; al final, llega finish_reason con "stop" o similar.
  • Si tu app necesita el texto completo, acumúlalo en un buffer y únelo al final.

🔧 Funcionalidades Principales

1. Solo Contenido vs Respuesta Completa (v0.0.4)

Por defecto, iamex devuelve solo el texto de la respuesta. Si necesitas metadatos adicionales, usa full_response=True:

# Solo contenido (default)
content = send_prompt("Hola", api_key, "IAM-advanced")
print(content)  # "¡Hola! ¿En qué puedo ayudarte?"

# Respuesta completa con metadatos
full_response = send_prompt("Hola", api_key, "IAM-advanced", full_response=True)
print(full_response)  # {"choices": [...], "usage": {"tokens": 25}, ...}

2. Parámetros de Control

# Con límite de tokens
response = send_prompt(
    prompt="Explica la IA en detalle",
    api_key="tu_api_key",
    model="IAM-advanced",
    max_tokens=100  # Limitar respuesta
)

# Con mensaje del sistema
response = send_prompt(
    prompt="¿Cómo funciona un bucle for?",
    api_key="tu_api_key",
    model="IAM-advanced",
    system_prompt="Eres un tutor de programación para principiantes"
)

3. Conversaciones Avanzadas (v0.0.4)

# Conversación multi-turno
messages = [
    {"role": "system", "content": "Eres un asistente de cocina"},
    {"role": "user", "content": "¿Cómo hago pasta?"},
    {"role": "assistant", "content": "Para hacer pasta necesitas..."},
    {"role": "user", "content": "¿Y qué salsa me recomiendas?"}
]

response = send_messages(messages, api_key, "IAM-advanced")

🛠️ Uso Avanzado

Cliente Personalizado

from iamex import PromptClient

# Inicializar el cliente con tu API key
client = PromptClient(api_key="tu_api_key_aqui")

# Enviar un prompt (usa modelo por defecto 'IAM-advanced')
response = client.send_prompt(
    prompt="Explica qué es la inteligencia artificial"
)
print(response)

# Con respuesta completa
full_response = client.send_prompt("¿Qué es la IA?", full_response=True)
print(full_response['usage']['total_tokens'])  # Ver tokens usados

Parámetros Avanzados

El método send_prompt y PromptClient aceptan parámetros adicionales para control fino:

response = client.send_prompt(
    prompt="Tu prompt aquí",
    model="IAM-advanced",
    temperature=0.5,        # Controla la creatividad (0.0 - 1.0)
    max_tokens=1000,        # Máximo número de tokens en la respuesta
    top_p=0.9,             # Controla la diversidad de la respuesta
    top_k=50,              # Limita las opciones de tokens
    repetition_penalty=1.1, # Evita repeticiones
    presence_penalty=0.1,   # Penaliza tokens ya presentes
    frequency_penalty=0.1,  # Penaliza tokens frecuentes
    stream=False            # Respuesta en streaming
)

Parámetros por Defecto

Si no especificas parámetros, se usan estos valores optimizados:

  • model: "IAM-advanced"
  • temperature: 0.3
  • max_tokens: 12000
  • top_p: 0.9
  • top_k: 50
  • repetition_penalty: 1.1
  • presence_penalty: 0.1
  • frequency_penalty: 0.1
  • stream: False

📊 Estructura de Datos

Estructura del Payload

La función send_prompt envía automáticamente este payload a la API:

{
  "apikey": "tu_api_key_aqui",
  "model": "tu_modelo",
  "prompt": "tu_prompt"
}

Para send_messages:

{
  "apikey": "tu_api_key_aqui",
  "model": "tu_modelo",
  "messages": [
    {"role": "system", "content": "..."},
    {"role": "user", "content": "..."}
  ]
}

Parámetros obligatorios:

  • apikey: Tu clave de API para autenticación
  • model: El modelo de IA a usar
  • prompt o messages: Tu consulta o conversación

Parámetros opcionales:

  • system_prompt: Instrucciones del sistema (solo con send_prompt)
  • max_tokens: Límite de tokens en la respuesta
  • temperature, top_p, top_k: Parámetros de generación
  • full_response: Control del tipo de respuesta (v0.0.4)

📚 Funciones Disponibles

send_prompt()

send_prompt(
    prompt: str,           # Tu pregunta o instrucción
    api_key: str,          # Clave de API (obtén en dev.iamex.io)
    model: str,            # Modelo a usar
    full_response: bool = False,  # Respuesta completa o solo contenido
    max_tokens: int = None,       # Límite de tokens (opcional)
    system_prompt: str = None,    # Mensaje del sistema (opcional)
    **kwargs                      # Parámetros adicionales
)

send_messages() (Nuevo en v0.0.4)

send_messages(
    messages: list,        # Lista de mensajes de conversación
    api_key: str,          # Clave de API
    model: str,            # Modelo a usar
    full_response: bool = False,  # Respuesta completa o solo contenido
    max_tokens: int = None,       # Límite de tokens (opcional)
    **kwargs                      # Parámetros adicionales
)

PromptClient

client = PromptClient(api_key="tu_api_key")
client.send_prompt(prompt, model="IAM-advanced", **kwargs)
client.send_messages(messages, model="IAM-advanced", **kwargs)
client.get_models()  # Obtener modelos disponibles

🔐 Obtener API Key

  1. Visita dev.iamex.io
  2. Regístrate o inicia sesión
  3. Obtén tu API key
  4. Adquiere tokens según tus necesidades

⚠️ Manejo de Errores

try:
    response = send_prompt("Test", "api_key_invalida", "IAM-advanced")
    print(response)
except Exception as e:
    print(f"Error: {e}")
    # Salida: Error 401: API Key inválida o no encontrada

Errores Comunes

  • 401: API Key inválida o no encontrada
  • 400: Parámetros incorrectos
  • 500: Error interno del servidor
  • 502: Servidor temporalmente no disponible

📚 Ejemplos Completos

Chat Básico

from iamex import send_messages

def chat_simple():
    api_key = "tu_api_key_aqui"
    model = "IAM-advanced"
    
    messages = [
        {"role": "system", "content": "Eres un asistente útil y amigable"}
    ]
    
    while True:
        user_input = input("Tú: ")
        if user_input.lower() == 'salir':
            break
            
        messages.append({"role": "user", "content": user_input})
        
        try:
            response = send_messages(messages, api_key, model)
            print(f"IA: {response}")
            messages.append({"role": "assistant", "content": response})
        except Exception as e:
            print(f"Error: {e}")

chat_simple()

Análisis de Texto

from iamex import send_prompt

def analizar_sentimiento(texto, api_key):
    prompt = f"Analiza el sentimiento del siguiente texto: '{texto}'"
    
    response = send_prompt(
        prompt=prompt,
        api_key=api_key,
        model="IAM-advanced",
        system_prompt="Eres un experto en análisis de sentimientos. Responde solo: Positivo, Negativo o Neutral."
    )
    
    return response

# Uso
sentimiento = analizar_sentimiento("¡Me encanta este producto!", "tu_api_key")
print(sentimiento)  # "Positivo"

Uso con Métricas (v0.0.4)

from iamex import send_prompt

# Para obtener información de uso
response = send_prompt(
    "Explica brevemente qué es Python",
    api_key="tu_api_key",
    model="IAM-advanced",
    full_response=True
)

# Extraer métricas
if isinstance(response, dict):
    usage = response.get('data', {}).get('response', {}).get('usage', {})
    print(f"Tokens usados: {usage.get('total_tokens', 'N/A')}")
    print(f"Costo estimado: ${usage.get('total_tokens', 0) * 0.001:.4f}")

🏗️ Desarrollo

Instalación para Desarrollo

git clone https://github.com/IA-Mexico/iamex.git
cd iamex
pip install -e ".[dev]"

Ejecutar Tests

pytest tests/

Formatear Código

black src/ tests/

📄 Licencia

Este proyecto está bajo la Licencia MIT. Ver LICENSE para más detalles.

🆘 Soporte

📋 Changelog

v0.0.5 (Actual)

  • NUEVO: Compatibilidad estilo OpenAI SDK v1 (Responses y Completions)
  • NUEVO: Streaming en chat.completions, completions y responses con stream=True
  • NUEVO: Migración en 1 línea: usa la clase IAMEX (interfaz estilo OpenAI)
  • MEJORADO: Documentación para usar responses.create, chat.completions.create y completions.create
  • NOTA: No es necesario cambiar endpoints en tu código

v0.0.4

  • NUEVO: Parámetro full_response para controlar el tipo de respuesta
  • NUEVO: Función send_messages para conversaciones con formato de mensajes
  • NUEVO: Soporte para conversaciones multi-turno
  • MEJORADO: Extracción inteligente de contenido de respuestas
  • MEJORADO: Compatibilidad hacia atrás mantenida
  • DOCUMENTACIÓN: Guías completas y ejemplos prácticos

v0.0.3

  • NUEVO: Parámetro opcional max_tokens en función send_prompt
  • MEJORADO: Control de longitud de respuestas del modelo
  • MEJORADO: Endpoint real de iam-hub implementado
  • OPTIMIZADO: Estructura de payload exacta para la API
  • DOCUMENTACIÓN: Guías de uso para max_tokens

v0.0.2

  • NUEVO: Función simple send_prompt(prompt, api_key, model)
  • NUEVO: Soporte completo para autenticación con API key
  • NUEVO: Conexión directa al endpoint real de iam-hub
  • MEJORADO: Estructura de payload exacta que espera la API

v0.0.1

  • Versión inicial con cliente básico PromptClient
  • Soporte para múltiples modelos de inferencia
  • Modelo por defecto: IAM-advanced
  • Parámetros optimizados según la API

¡Desarrollado con ❤️ por Inteligencia Artificial México!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

iamex-0.0.6.tar.gz (25.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

iamex-0.0.6-py3-none-any.whl (23.1 kB view details)

Uploaded Python 3

File details

Details for the file iamex-0.0.6.tar.gz.

File metadata

  • Download URL: iamex-0.0.6.tar.gz
  • Upload date:
  • Size: 25.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for iamex-0.0.6.tar.gz
Algorithm Hash digest
SHA256 a2bda2329de0231026e02fc5feee369e79295f9a403cb4ca1fcfe51e88d655a9
MD5 5633f7218390cf1e0af1a30d54f247a4
BLAKE2b-256 950d6db99ef6989ae8f55718d87b672f839e217fe42e603210961025f379d8ab

See more details on using hashes here.

File details

Details for the file iamex-0.0.6-py3-none-any.whl.

File metadata

  • Download URL: iamex-0.0.6-py3-none-any.whl
  • Upload date:
  • Size: 23.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for iamex-0.0.6-py3-none-any.whl
Algorithm Hash digest
SHA256 f9031687ba844eb05207becf494e5e43206742bac6b93c5bf4af6c497d95969c
MD5 01b0169c3b32991db1af27d6c2b605d7
BLAKE2b-256 b5d79617871cab9987e5197e1d4c948abac78602520b7f57100bab0698eec982

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page