refactor zed to use dynamic model config from models.dev
This commit is contained in:
@@ -3,10 +3,61 @@
|
|||||||
lib,
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
pkgs-unstable,
|
pkgs-unstable,
|
||||||
|
inputs,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
cfg = config.programs.zed-editor;
|
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 {
|
ameba-ls = pkgs.stdenv.mkDerivation rec {
|
||||||
pname = "ameba-ls";
|
pname = "ameba-ls";
|
||||||
version = "0.1.0";
|
version = "0.1.0";
|
||||||
@@ -81,8 +132,15 @@ in
|
|||||||
agent = {
|
agent = {
|
||||||
enabled = true;
|
enabled = true;
|
||||||
default_model = {
|
default_model = {
|
||||||
provider = "openai";
|
provider = "opencode-go";
|
||||||
model = "kimi-k2.5";
|
model = "glm-5";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
agent_servers = {
|
||||||
|
OpenCode = {
|
||||||
|
command = lib.getExe opencode-wrapped;
|
||||||
|
args = [ "acp" ];
|
||||||
|
type = "custom";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
auto_update = false;
|
auto_update = false;
|
||||||
@@ -204,7 +262,6 @@ in
|
|||||||
font_family = "IosevkaTerm Nerd Font";
|
font_family = "IosevkaTerm Nerd Font";
|
||||||
};
|
};
|
||||||
edit_predictions = {
|
edit_predictions = {
|
||||||
enabled = true;
|
|
||||||
mode = "eager";
|
mode = "eager";
|
||||||
provider = "copilot";
|
provider = "copilot";
|
||||||
};
|
};
|
||||||
@@ -219,173 +276,7 @@ in
|
|||||||
];
|
];
|
||||||
};
|
};
|
||||||
language_models = {
|
language_models = {
|
||||||
openai = {
|
openai_compatible = openaiCompatibleProviders;
|
||||||
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;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
userKeymaps = [
|
userKeymaps = [
|
||||||
@@ -453,7 +344,7 @@ in
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
label = "opencode";
|
label = "opencode";
|
||||||
command = lib.getExe pkgs-unstable.opencode;
|
command = lib.getExe opencode-wrapped;
|
||||||
reveal = "always";
|
reveal = "always";
|
||||||
allow_concurrent_runs = true;
|
allow_concurrent_runs = true;
|
||||||
use_new_terminal = false;
|
use_new_terminal = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user