DevSpaces + Continue AI (Granite)

Red Hat OpenShift Dev Spaces provee espacios de trabajo cloud-native con Continue AI preconfigurado para usar IBM Granite 3.1 2B Instruct servido por OpenShift AI (KServe + llama.cpp). Los desarrolladores pueden generar rutas Apache Camel en YAML DSL usando generación de código asistida por IA directamente en el IDE.

Arquitectura

Componente Rol

DevSpaces

IDE cloud-native basado en Eclipse Che — corre en OpenShift con extensiones preinstaladas

Continue AI

Asistente de código IA open-source (extensión VS Code) — chat, autocompletado, edición inline

Granite 3.1 2B Instruct

LLM compacto de IBM (Q4_K_M GGUF) corriendo en llama.cpp vía KServe

OpenShift AI (KServe)

Plataforma de model serving — aloja el modelo Granite como InferenceService con API compatible OpenAI

Kaoto

Diseñador visual de rutas Apache Camel — editar YAML DSL mediante drag-and-drop

Configuración del Workspace

Devfile

Cada workspace se define con un devfile.yaml que configura el contenedor, extensiones y tareas de inicio:

schemaVersion: 2.2.2
metadata:
  name: my-camel-cdc-route
components:
  - name: tools
    container:
      image: registry.redhat.io/devspaces/udi-rhel9:latest
      memoryLimit: 2Gi
      cpuLimit: "1"
commands:
  - id: install-extensions
    exec:
      component: tools
      commandLine: |
        export LD_LIBRARY_PATH=/checode/checode-linux-libc/ubi9/ld_libs/openssl:/checode/checode-linux-libc/ubi9/ld_libs/core:/usr/lib64
        CHE_CODE=/checode/checode-linux-libc/ubi9/bin/che-code
        EXT_DIR=/checode/checode-linux-libc/ubi9/extensions
        $CHE_CODE --extensions-dir $EXT_DIR --install-extension redhat.vscode-kaoto --force
        $CHE_CODE --extensions-dir $EXT_DIR --install-extension redhat.vscode-apache-camel --force
        $CHE_CODE --extensions-dir $EXT_DIR --install-extension Continue.continue --force
        $CHE_CODE --extensions-dir $EXT_DIR --install-extension redhat.vscode-yaml --force
        $CHE_CODE --extensions-dir $EXT_DIR --install-extension redhat.java --force
        $CHE_CODE --extensions-dir $EXT_DIR --install-extension redhat.vscode-quarkus --force
  - id: setup-project
    exec:
      component: tools
      commandLine: |
        chmod +x /projects/my-camel-cdc-route/mvnw
        mkdir -p /home/user/.continue && cp /projects/my-camel-cdc-route/continue-config.json /home/user/.continue/config.json
events:
  postStart:
    - install-extensions
    - setup-project
El LD_LIBRARY_PATH debe referenciar los subdirectorios ubi9 (ld_libs/openssl y ld_libs/core). El directorio de extensiones es /checode/checode-linux-libc/ubi9/extensions. Usar paths incorrectos causa fallas silenciosas de instalación.

Extensiones Preinstaladas

Extensión Propósito

redhat.vscode-kaoto

Diseñador visual de rutas Camel

redhat.vscode-apache-camel

Soporte de lenguaje Camel YAML DSL

Continue.continue

Asistente de código con IA

redhat.vscode-yaml

Soporte de lenguaje YAML

redhat.java

Servidor de lenguaje Java

redhat.vscode-quarkus

Herramientas de desarrollo Quarkus

Configuración de Continue AI

El archivo continue-config.json conecta Continue con el modelo Granite servido por OpenShift AI:

{
  "models": [
    {
      "title": "Granite 3.1 2B (OpenShift AI)",
      "model": "granite-3.1-2b-instruct-Q4_K_M.gguf",
      "apiBase": "http://granite-llm-predictor.neuroface.svc.cluster.local:8080/v1",
      "provider": "openai",
      "apiKey": "no-key",
      "contextLength": 8192,
      "completionOptions": {
        "maxTokens": 1024
      }
    }
  ],
  "tabAutocompleteModel": {
    "title": "Granite 3.1 2B Autocomplete",
    "model": "granite-3.1-2b-instruct-Q4_K_M.gguf",
    "apiBase": "http://granite-llm-predictor.neuroface.svc.cluster.local:8080/v1",
    "provider": "openai",
    "apiKey": "no-key",
    "contextLength": 8192,
    "completionOptions": {
      "maxTokens": 128
    }
  },
  "allowAnonymousTelemetry": false
}

Model Serving — Granite en llama.cpp

El modelo Granite corre como un InferenceService de KServe con un ServingRuntime personalizado:

Parámetro Valor

Modelo

granite-3.1-2b-instruct-Q4_K_M.gguf

Runtime

ghcr.io/ggml-org/llama.cpp:server

Tamaño de contexto

8192 tokens

Threads

8

Slots paralelos

1

API

Compatible OpenAI (/v1/chat/completions)

Endpoint

http://granite-llm-predictor.neuroface.svc.cluster.local:8080

IDE DevSpaces con Continue AI

DevSpaces IDE con Continue AI y Kaoto

La captura muestra un workspace de DevSpaces con el panel de Continue AI abierto en el lado izquierdo. El asistente de IA usa el modelo Granite 3.1 2B servido por OpenShift AI para generar rutas Apache Camel.

Creando Rutas Camel con IA

Flujo de trabajo

  1. Crear un archivo nuevo: touch routes/mi-nueva-ruta.camel.yaml

  2. Abrir el archivo en el editor

  3. Presionar Ctrl+I para abrir la edición inline de Continue, o usar el panel de chat

  4. Escribir un prompt describiendo la ruta — usar @ para incluir contexto del proyecto

  5. Continue genera el código YAML DSL directamente en el archivo

  6. Abrir el archivo con Kaoto para visualizar y refinar la ruta

Usando el Contexto del Proyecto (Proveedores @)

Continue está preconfigurado con proveedores de contexto que le dan visibilidad a la IA sobre el proyecto. Escribir @ en el chat para ver las opciones disponibles:

Proveedor Qué hace

@File

Incluye un archivo específico como contexto (ej. la ruta CDC existente)

@Codebase

Busca snippets relevantes en todo el proyecto automáticamente

@Folder

Referencia todo el código de una carpeta específica (ej. routes/)

@CurrentFile

Incluye el archivo que tenés abierto en el editor

@Tree

Muestra la estructura completa de archivos del proyecto

@Problems

Incluye errores y warnings actuales del linter en el archivo activo

Usar @File routes/cdc-to-mail.camel.yaml antes de un prompt le da al modelo un ejemplo real de la estructura YAML DSL esperada y produce resultados mucho mejores.

Prompts para Trabajar con el Componente camel-kaoto

El proyecto tiene una ruta de ejemplo en routes/cdc-to-mail.camel.yaml. Usarla como referencia al pedir a la IA que genere nuevas rutas.

Básico — Generar rutas desde cero

Prompt Qué genera

@File routes/cdc-to-mail.camel.yaml + Create a new Camel YAML route that consumes from Kafka topic "inventory-events", unmarshals JSON, and logs the product name

Una ruta consumidora de Kafka siguiendo la misma estructura de la ruta CDC existente

@File routes/cdc-to-mail.camel.yaml + Create a route like this one but consuming from topic "audit-events" and POSTing to http://audit-service:8080/api/events

Una ruta Kafka-a-REST modelada a partir del template existente

Create a Camel YAML route: timer every 30s, GET http://localhost:8080/q/health, log the response body

Una ruta timer de health-check (sin dependencia de Kafka)

Intermedio — Enrutamiento basado en contenido y transformaciones

Prompt Qué genera

@File routes/cdc-to-mail.camel.yaml + Add a new when branch for op=d (delete) that logs a warning "Record deleted" and sends to http://alert-service:8080/api/alert

Extiende el patrón choice con un handler de operación de borrado

@Folder routes/ + Create a new route that consumes from Kafka "order-events", uses choice to split by ${body[payload][status]}: "pending" logs info, "failed" POSTs to http://retry-service:8080/retry, otherwise logs warning

Un enrutador multi-branch basado en contenido para procesamiento de órdenes

@File routes/cdc-to-mail.camel.yaml + Create a similar route but marshal the response as XML instead of JSON before sending

Ruta con marshalling XML en vez de JSON

Avanzado — Integraciones multi-paso

Prompt Qué genera

@Codebase + Create a Camel YAML route that: 1) consumes from Kafka "payment-events", 2) unmarshals JSON, 3) enriches with a GET to payload[after][customer_id]}, 4) marshals to JSON, 5) POSTs to http://notification-service:8080/api/notify

Un pipeline de enriquecimiento multi-paso: Kafka → unmarshal → REST enrich → marshal → REST notify

@File routes/cdc-to-mail.camel.yaml + Create a Camel YAML route with error handling: consume from Kafka "transaction-events", unmarshal JSON, try POSTing to http://ledger:8080/api/record, on failure log the error and send to Kafka topic "dead-letter-transactions"

Una ruta con manejo de errores try/catch y cola dead-letter

@File pom.xml + @File routes/cdc-to-mail.camel.yaml + Create a route that reads from Kafka "sensor-data", aggregates 10 messages by ${header.sensorId}, marshals to JSON, and POSTs the batch to http://analytics:8080/api/batch

Una ruta de agregación que agrupa mensajes Kafka antes de enviar

Contexto y Exploración

Prompt Qué hace

@Codebase + Explain the architecture of this Camel CDC project

Analiza la estructura del proyecto, rutas y configuración

@File routes/cdc-to-mail.camel.yaml + Explain step by step what this route does

Provee un recorrido detallado de cada paso de la ruta

@Tree + What Camel routes exist in this project and what do they do?

Lista y describe todas las rutas encontradas en el proyecto

@File src/main/resources/application.properties + What is the route discovery pattern configured?

Explica cómo Quarkus descubre y carga las rutas Camel

Mantener los prompts concisos. El modelo Granite 2B (8192 tokens de contexto) funciona mejor con instrucciones cortas y directas. Al incluir archivos vía @File, evitar agregar demasiados archivos grandes a la vez.

Integración con Developer Hub

El template de software en Developer Hub crea nuevos proyectos Camel CDC con:

  • devfile.yaml preconfigurado con todas las extensiones

  • continue-config.json apuntando al modelo Granite

  • Maven wrapper con Quarkus 3.15

  • Ruta CDC de ejemplo (cdc-to-mail.camel.yaml)

  • URL de factory de DevSpaces correcta para creación de workspace con un click

Acceder a Developer Hub: https://developer-hub.

Resolución de Problemas

Problema Solución

Extensiones no visibles después del inicio del workspace

Recargar el navegador con F5 — las extensiones se instalan en postStart y requieren recarga

./mvnw: Permission denied

Ejecutar chmod +x mvnw — el postStart del devfile hace esto automáticamente

Continue muestra "context size exceeded"

El --ctx-size o --parallel del modelo puede haber sido revertido — verificar los args del ServingRuntime en namespace neuroface

Workspace abre con "generateName: empty"

Usar la URL factory con el devfile raw: https://devspaces.DOMINIO/#https://gitea.DOMINIO/owner/repo/raw/branch/main/devfile.yaml