From 228fb048148924bb337b1cc7c507741fd741cdc1 Mon Sep 17 00:00:00 2001 From: Martin Pander Date: Fri, 13 Feb 2026 17:24:58 +0100 Subject: [PATCH] Add personal opencode config --- hosts/home/common.nix | 2 + modules/home/opencode.nix | 95 +++++++++++++++++++++++---------------- 2 files changed, 58 insertions(+), 39 deletions(-) diff --git a/hosts/home/common.nix b/hosts/home/common.nix index d0a39bf..681de0b 100644 --- a/hosts/home/common.nix +++ b/hosts/home/common.nix @@ -18,5 +18,7 @@ dot.llm = { enable = true; gemini-cli.enable = true; + opencode.enable = true; + opencode.enableConfig = true; }; } diff --git a/modules/home/opencode.nix b/modules/home/opencode.nix index a28181b..6d13b7a 100644 --- a/modules/home/opencode.nix +++ b/modules/home/opencode.nix @@ -10,6 +10,8 @@ in default = false; description = "Enable managed OpenCode configuration"; }; + + workMode = lib.mkEnableOption "work-specific opencode configuration"; }; config = lib.mkIf cfg.enableConfig { @@ -20,50 +22,65 @@ in # Create the OpenCode config.json template with secret substitution sops.templates."opencode/opencode.json" = { - content = builtins.toJSON { - "$schema" = "https://opencode.ai/config.json"; - model = "anthropic/claude-sonnet-4-5-20250929"; - small_model = "anthropic/claude-haiku-4-5-20251001"; - default_agent = "plan"; - enabled_providers = [ "anthropic" "langdock-openai" "ollama" ]; - provider = { - langdock-openai = { - npm = "@ai-sdk/openai-compatible"; - name = "Langdock OpenAI"; - options = { - baseURL = "https://api.langdock.com/openai/eu/v1"; - apiKey = config.sops.placeholder.langdock_api_key; + content = builtins.toJSON (let + baseConfig = { + "$schema" = "https://opencode.ai/config.json"; + default_agent = "plan"; + }; + + workConfig = { + enabled_providers = [ "anthropic" "langdock-openai" "ollama" ]; + model = "anthropic/claude-opus-4-6-default"; + small_model = "anthropic/claude-haiku-4-5-20251001"; + provider = { + langdock-openai = { + npm = "@ai-sdk/openai-compatible"; + name = "Langdock OpenAI"; + options = { + baseURL = "https://api.langdock.com/openai/eu/v1"; + apiKey = config.sops.placeholder.langdock_api_key; + }; + models = { + "gpt-5.2" = { name = "GPT-5.2"; }; + "gpt-5-mini" = { name = "GPT-5 mini"; }; + }; }; - models = { - "gpt-5.2" = { name = "GPT-5.2"; }; - "gpt-5-mini" = { name = "GPT-5 mini"; }; + anthropic = { + options = { + baseURL = "https://api.langdock.com/anthropic/eu/v1"; + apiKey = config.sops.placeholder.langdock_api_key; + }; + models = { + "claude-opus-4-6-default" = { name = "Opus 4.6"; }; + "claude-sonnet-4-5-20250929" = { name = "Sonnet 4.5"; }; + "claude-haiku-4-5-20251001" = { name = "Haiku 4.5"; }; + }; + whitelist = [ "claude-opus-4-6-default" "claude-sonnet-4-5-20250929" "claude-haiku-4-5-20251001"]; }; - }; - anthropic = { - options = { - baseURL = "https://api.langdock.com/anthropic/eu/v1"; - apiKey = config.sops.placeholder.langdock_api_key; - }; - models = { - "claude-opus-4-6-default" = { name = "Opus 4.6"; }; - "claude-sonnet-4-5-20250929" = { name = "Sonnet 4.5"; }; - "claude-haiku-4-5-20251001" = { name = "Haiku 4.5"; }; - }; - whitelist = [ "claude-opus-4-6-default" "claude-sonnet-4-5-20250929" "claude-haiku-4-5-20251001"]; - }; - ollama = { - npm = "@ai-sdk/openai-compatible"; - name = "Ollama (Local)"; - options = { - baseURL = "http://192.168.11.23:11434/v1"; - }; - models = { - "qwen3-coder:30b" = { name = "Qwen 3 Coder 30B"; }; - "codellama:34b-instruct" = { name = "CodeLlama 34B Instruct"; }; + ollama = { + npm = "@ai-sdk/openai-compatible"; + name = "Ollama (Local)"; + options = { + baseURL = "http://192.168.11.23:11434/v1"; + }; + models = { + "qwen3-coder:30b" = { name = "Qwen 3 Coder 30B"; }; + "codellama:34b-instruct" = { name = "CodeLlama 34B Instruct"; }; + }; }; }; }; - }; + + personalConfig = { + plugin = [ "opencode-gemini-auth@latest" ]; + model = "google/gemini-3-pro-preview"; + small_model = "google/gemini-3-flash-preview"; + enabled_providers = [ "google" ]; + }; + in + # Merge base config with the selected mode config + baseConfig // (if cfg.workMode then workConfig else personalConfig) + ); }; # Link the generated config to the expected location