Módulo 4: Ollama - Introducción

API REST de Ollama

Descripción

Ollama incluye servidor API REST compatible con OpenAI. Aprenderás a usarlo para integrar con Python/JavaScript.

Tiempo: 25 minutos
Dificultad: Media


🎯 Objetivos

  • ✅ Iniciar servidor Ollama
  • ✅ Test con curl
  • ✅ Integrar con OpenAI SDK
  • ✅ Entender diferencias API

🚀 Iniciar Servidor

Background daemon (automático):

Ollama inicia servidor automáticamente al usar ollama run.

Verificar:

curl http://localhost:11434/api/tags

Manual start:

ollama serve

Output:

Ollama server running on http://localhost:11434

Puerto default: 11434 (vs 1234 de LM Studio)


✅ Test con Curl

List models:

curl http://localhost:11434/api/tags

Output:

{
  "models": [
    {
      "name": "mistral:latest",
      "size": 4108916224
    }
  ]
}

Generate (completion):

curl http://localhost:11434/api/generate -d '{
  "model": "mistral",
  "prompt": "¿Qué es Python?"
}'

Output (streaming):

{"model":"mistral","response":"Python"}
{"model":"mistral","response":" es"}
{"model":"mistral","response":" un"}
...
{"done":true}

Chat (conversational):

curl http://localhost:11434/api/chat -d '{
  "model": "mistral",
  "messages": [
    {"role": "user", "content": "Hola"}
  ]
}'

💻 Integración con Python (OpenAI SDK)

Código (compatible OpenAI):

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama"  # Required pero no valida
)

response = client.chat.completions.create(
    model="mistral",
    messages=[
        {"role": "user", "content": "Hola"}
    ]
)

print(response.choices[0].message.content)

Mismo código del Módulo 2, solo cambia base_url!


🔄 Migrar de LM Studio a Ollama

LM Studio:

client = OpenAI(
    base_url="http://localhost:1234/v1",
    api_key="not-needed"
)

Ollama:

client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama"
)

Único cambio: Puerto (1234 → 11434)


📊 Ollama API vs OpenAI API

FeatureOllamaOpenAI
Endpointlocalhost:11434api.openai.com
AuthNo requiredAPI key required
Streaming✅ Default✅ Opcional
ModelsLocal (mistral, llama2)Cloud (gpt-3.5, gpt-4)
Cost$0$$$

⚙️ API Endpoints

1. Generate (completion):

POST /api/generate
Body: {"model": "mistral", "prompt": "..."}

2. Chat (conversational):

POST /api/chat
Body: {"model": "mistral", "messages": [...]}

3. List models:

GET /api/tags

4. Pull model:

POST /api/pull
Body: {"name": "mistral"}

5. Delete model:

DELETE /api/delete
Body: {"name": "mistral"}

🧪 Test Script Completo

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama"
)

# Test 1: Simple chat
print("Test 1: Simple chat")
response = client.chat.completions.create(
    model="mistral",
    messages=[{"role": "user", "content": "Hola"}]
)
print(response.choices[0].message.content)

# Test 2: Conversación con contexto
print("\nTest 2: Con contexto")
messages = [
    {"role": "system", "content": "Eres un asistente útil."},
    {"role": "user", "content": "Me llamo Juan"},
    {"role": "assistant", "content": "Hola Juan"},
    {"role": "user", "content": "¿Cuál es mi nombre?"}
]
response = client.chat.completions.create(
    model="mistral",
    messages=messages
)
print(response.choices[0].message.content)  # "Tu nombre es Juan"

🐛 Troubleshooting

Error: Connection refused

Causa: Servidor no corriendo

Solución:

ollama serve
# O
ollama run mistral  # Auto-start server

Error: Model not found

Causa: Modelo no descargado

Solución:

ollama pull mistral
ollama list  # Verifica

✅ Resumen

  • Servidor API en localhost:11434
  • Compatible con OpenAI SDK (cambio mínimo)
  • Streaming por default
  • Sin API key necesaria
  • Reutiliza código Módulos 2-3

Siguiente: 05-integracion-python.md

Crearás chatbot completo con Ollama + Python.

Tiempo: 30 min