diff --git a/backend/ai.py b/backend/ai.py index 845b264..7401cba 100644 --- a/backend/ai.py +++ b/backend/ai.py @@ -13,7 +13,7 @@ from typing import Optional, Literal logger = logging.getLogger("obsigate.ai") -ProviderName = Literal["deepseek", "openrouter", "gemini"] +ProviderName = Literal["deepseek", "openrouter", "gemini", "ollama"] # Provider configurations — keys loaded from file or .env AI_KEYS_FILE = Path("data/api_keys.json") @@ -54,6 +54,12 @@ def _load_provider_keys(): "model": os.getenv("GEMINI_MODEL", "gemini-2.0-flash"), "auth_header": None, }, + "ollama": { + "api_key": "ollama", + "base_url": os.getenv("OLLAMA_BASE_URL", "http://ollama:11434/v1"), + "model": os.getenv("OLLAMA_MODEL", "qwen2.5-coder:1.5b"), + "auth_header": "Bearer {api_key}", + }, } PROVIDERS = _load_provider_keys() diff --git a/docker-compose.podman.yml b/docker-compose.podman.yml index da61798..4c23524 100644 --- a/docker-compose.podman.yml +++ b/docker-compose.podman.yml @@ -20,3 +20,25 @@ services: - OBSIGATE_AUTH_ENABLED=false - OBSIGATE_ADMIN_USER=admin - OBSIGATE_ADMIN_PASSWORD=test123 + - AI_DEFAULT_PROVIDER=deepseek + - OLLAMA_BASE_URL=http://ollama:11434/v1 + - OLLAMA_MODEL=qwen2.5-coder:1.5b + + ollama: + image: ollama/ollama:latest + container_name: obsigate-ollama + restart: unless-stopped + ports: + - "11434:11434" + volumes: + - ollama_data:/root/.ollama + entrypoint: ["/bin/sh", "-c"] + command: + - | + ollama serve & + sleep 5 + ollama pull qwen2.5-coder:1.5b + wait + +volumes: + ollama_data: diff --git a/docker-compose.test.yml b/docker-compose.test.yml index 1bd8182..5676884 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -20,3 +20,25 @@ services: - OBSIGATE_AUTH_ENABLED=false - OBSIGATE_ADMIN_USER=admin - OBSIGATE_ADMIN_PASSWORD=test123 + - AI_DEFAULT_PROVIDER=deepseek + - OLLAMA_BASE_URL=http://ollama:11434/v1 + - OLLAMA_MODEL=qwen2.5-coder:1.5b + + ollama: + image: ollama/ollama:latest + container_name: obsigate-ollama + restart: unless-stopped + ports: + - "11434:11434" + volumes: + - ollama_data:/root/.ollama + entrypoint: ["/bin/sh", "-c"] + command: + - | + ollama serve & + sleep 5 + ollama pull qwen2.5-coder:1.5b + wait + +volumes: + ollama_data: diff --git a/frontend/editor-poc.html b/frontend/editor-poc.html index 54c4c35..0ea40b6 100644 --- a/frontend/editor-poc.html +++ b/frontend/editor-poc.html @@ -233,6 +233,18 @@ body { font-family: var(--sans); background: var(--bg); color: var(--text); heig .ac-item-label { font-family: var(--mono); font-weight: 500; white-space: nowrap; } .ac-item-detail { font-size: 10.5px; color: var(--text3); margin-left: auto; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 160px; } .ac-item-context { font-size: 9px; color: var(--accent); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 4px; padding: 2px 10px 4px; } +/* Ghost text overlay */ +.ghost-overlay { + position: absolute; top: 0; left: 0; right: 0; bottom: 0; + pointer-events: none; z-index: 1; + padding: 24px 16px 24px 12px; + font-family: var(--mono); font-size: 13.5px; line-height: 1.75; + white-space: pre-wrap; word-wrap: break-word; + overflow: hidden; color: transparent; +} +.ghost-prediction { + color: var(--text3); opacity: 0.5; +}
@@ -276,6 +288,7 @@ body { font-family: var(--sans); background: var(--bg); color: var(--text); heig