From d1bbee572b1c24655e528e36ec62ba861c7b2f3d Mon Sep 17 00:00:00 2001 From: Joakim Repomaa Date: Sat, 14 Mar 2026 21:32:08 +0200 Subject: [PATCH] refactor zed to use dynamic model config from models.dev --- home/modules/zed/default.nix | 233 ++++++++++------------------------- 1 file changed, 62 insertions(+), 171 deletions(-) diff --git a/home/modules/zed/default.nix b/home/modules/zed/default.nix index e585161..5533185 100644 --- a/home/modules/zed/default.nix +++ b/home/modules/zed/default.nix @@ -3,10 +3,61 @@ lib, pkgs, pkgs-unstable, + inputs, ... }: let cfg = config.programs.zed-editor; + models-dev = inputs.models-dev; + + getModelsFromProvider = + provider: + let + providerPath = "${models-dev}/providers/${provider}"; + modelsPath = "${providerPath}/models"; + providerToml = builtins.fromTOML (builtins.readFile "${providerPath}/provider.toml"); + modelFiles = builtins.attrNames (builtins.readDir modelsPath); + modelEntries = map ( + file: + let + filePath = "${modelsPath}/${file}"; + parsed = builtins.fromTOML (builtins.readFile filePath); + modelName = builtins.substring 0 (builtins.stringLength file - 5) file; + in + { + name = modelName; + display_name = parsed.name; + max_tokens = parsed.limit.context or parsed.limit.output or 128000; + } + ) modelFiles; + in + { + api_url = providerToml.api; + available_models = builtins.sort (a: b: a.name < b.name) modelEntries; + name = providerToml.name; + }; + + opencodeProviders = map getModelsFromProvider [ + "opencode" + "opencode-go" + ]; + + openaiCompatibleProviders = builtins.listToAttrs ( + map (p: lib.nameValuePair p.name p) opencodeProviders + ); + + opencode-wrapped = pkgs.writeShellScriptBin "opencode" '' + set -a + + for file in .env .env.local; do + [ -e "$file" ] && source "$file" + done + + set +a + + ${lib.getExe pkgs-unstable.opencode} "$@" + ''; + ameba-ls = pkgs.stdenv.mkDerivation rec { pname = "ameba-ls"; version = "0.1.0"; @@ -81,8 +132,15 @@ in agent = { enabled = true; default_model = { - provider = "openai"; - model = "kimi-k2.5"; + provider = "opencode-go"; + model = "glm-5"; + }; + }; + agent_servers = { + OpenCode = { + command = lib.getExe opencode-wrapped; + args = [ "acp" ]; + type = "custom"; }; }; auto_update = false; @@ -204,7 +262,6 @@ in font_family = "IosevkaTerm Nerd Font"; }; edit_predictions = { - enabled = true; mode = "eager"; provider = "copilot"; }; @@ -219,173 +276,7 @@ in ]; }; language_models = { - openai = { - api_url = "https://opencode.ai/zen/v1"; - available_models = [ - # Claude models - { - name = "claude-opus-4-6"; - display_name = "OpenCode Zen - Claude Opus 4.6"; - max_tokens = 1048576; - } - { - name = "claude-opus-4-5"; - display_name = "OpenCode Zen - Claude Opus 4.5"; - max_tokens = 200000; - } - { - name = "claude-opus-4-1"; - display_name = "OpenCode Zen - Claude Opus 4.1"; - max_tokens = 200000; - } - { - name = "claude-sonnet-4"; - display_name = "OpenCode Zen - Claude Sonnet 4"; - max_tokens = 1048576; - } - { - name = "claude-sonnet-4-5"; - display_name = "OpenCode Zen - Claude Sonnet 4.5"; - max_tokens = 1048576; - } - { - name = "claude-3-5-haiku"; - display_name = "OpenCode Zen - Claude 3.5 Haiku"; - max_tokens = 200000; - } - { - name = "claude-haiku-4-5"; - display_name = "OpenCode Zen - Claude Haiku 4.5"; - max_tokens = 200000; - } - # GPT models - { - name = "gpt-5.2"; - display_name = "OpenCode Zen - GPT 5.2"; - max_tokens = 400000; - } - { - name = "gpt-5.2-codex"; - display_name = "OpenCode Zen - GPT 5.2 Codex"; - max_tokens = 400000; - } - { - name = "gpt-5.1"; - display_name = "OpenCode Zen - GPT 5.1"; - max_tokens = 400000; - } - { - name = "gpt-5.1-codex-max"; - display_name = "OpenCode Zen - GPT 5.1 Codex Max"; - max_tokens = 400000; - } - { - name = "gpt-5.1-codex"; - display_name = "OpenCode Zen - GPT 5.1 Codex"; - max_tokens = 400000; - } - { - name = "gpt-5.1-codex-mini"; - display_name = "OpenCode Zen - GPT 5.1 Codex Mini"; - max_tokens = 400000; - } - { - name = "gpt-5"; - display_name = "OpenCode Zen - GPT 5"; - max_tokens = 400000; - } - { - name = "gpt-5-codex"; - display_name = "OpenCode Zen - GPT 5 Codex"; - max_tokens = 400000; - } - { - name = "gpt-5-nano"; - display_name = "OpenCode Zen - GPT 5 Nano"; - max_tokens = 400000; - } - # Gemini models - { - name = "gemini-3-pro"; - display_name = "OpenCode Zen - Gemini 3 Pro"; - max_tokens = 1048576; - } - { - name = "gemini-3-flash"; - display_name = "OpenCode Zen - Gemini 3 Flash"; - max_tokens = 1048576; - } - # GLM models - { - name = "glm-4.7"; - display_name = "OpenCode Zen - GLM 4.7"; - max_tokens = 205000; - } - { - name = "glm-4.6"; - display_name = "OpenCode Zen - GLM 4.6"; - max_tokens = 205000; - } - { - name = "glm-4.7-free"; - display_name = "OpenCode Zen - GLM 4.7 Free"; - max_tokens = 205000; - } - # Kimi models - { - name = "kimi-k2.5"; - display_name = "OpenCode Zen - Kimi K2.5"; - max_tokens = 262000; - } - { - name = "kimi-k2.5-free"; - display_name = "OpenCode Zen - Kimi K2.5 Free"; - max_tokens = 262000; - } - { - name = "kimi-k2"; - display_name = "OpenCode Zen - Kimi K2"; - max_tokens = 262000; - } - { - name = "kimi-k2-thinking"; - display_name = "OpenCode Zen - Kimi K2 Thinking"; - max_tokens = 262000; - } - # MiniMax models - { - name = "minimax-m2.1"; - display_name = "OpenCode Zen - MiniMax M2.1"; - max_tokens = 205000; - } - { - name = "minimax-m2.5-free"; - display_name = "OpenCode Zen - MiniMax M2.5 Free"; - max_tokens = 205000; - } - { - name = "minimax-m2.1-free"; - display_name = "OpenCode Zen - MiniMax M2.1 Free"; - max_tokens = 205000; - } - # Other models - { - name = "trinity-large-preview-free"; - display_name = "OpenCode Zen - Trinity Large Preview Free"; - max_tokens = 131000; - } - { - name = "big-pickle"; - display_name = "OpenCode Zen - Big Pickle"; - max_tokens = 200000; - } - { - name = "alpha-g5"; - display_name = "OpenCode Zen - Alpha G5"; - max_tokens = 200000; - } - ]; - }; + openai_compatible = openaiCompatibleProviders; }; }; userKeymaps = [ @@ -453,7 +344,7 @@ in } { label = "opencode"; - command = lib.getExe pkgs-unstable.opencode; + command = lib.getExe opencode-wrapped; reveal = "always"; allow_concurrent_runs = true; use_new_terminal = false;