refactor zed to use dynamic model config from models.dev
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user