{ pkgs, lib, config, ... }: let
hermes-agent = import ./package.nix;
in {
imports = [
./container-service
];
home.packages = [
hermes-agent
];
home.shellAliases.hermes-tui = "hermes --tui";
yq-merge.".hermes/config.yaml" = {
generator = builtins.toJSON;
yqExtraArgs = "-P";
expr = {
model = {
default = "kimi-for-coding";
provider = "kimi-coding";
base_url = config.ai.kimi.api_endpoint;
};
# the avaliable fields see: <hermes-agent>/hermes_cli/config.py: _normalize_custom_provider_entry
providers = {
jw-claude = {
name = "JW Claude";
api = config.ai.jw-claude.api_endpoint;
api_key = config.ai.jw-claude.api_key;
transport = "anthropic_messages";
};
jw-codex = {
name = "JW Codex";
api = config.ai.jw-codex.api_endpoint;
api_key = config.ai.jw-codex.api_key;
transport = "codex_responses";
models."gpt-5.5".context_length = 256 * 1000; # yes, jw gpt-5.5 is 256k
models."gpt-5.4".context_length = 1000 * 1000;
};
};
web = {
backend = "tavily";
search_backend = "tavily";
extract_backend = "tavily";
};
display = {
show_reasoning = true;
tool_progress = "all";
tool_preview_length = 0; # unlimited
streaming = true;
};
mcp_servers = {
ddgs = {
command = ''${
pkgs.pkgsu.python3Packages.ddgs.overridePythonAttrs (old: {
dependencies = old.dependencies
++ old.optional-dependencies.mcp
++ old.optional-dependencies.api;
})
}/bin/ddgs'';
args = ["mcp"];
};
github = {
command = ''${pkgs.github-mcp-server}/bin/github-mcp-server'';
args = ["stdio"];
env = { GITHUB_PERSONAL_ACCESS_TOKEN = lib.trim (builtins.readFile "${config.home.homeDirectory}/Gist/Vault/AI/github-mcp-server-minimal.txt");};
};
xiaohongshu = {
url = "http://localhost:18060/mcp";
enabled = false;
timeout = 300;
connect_timeout = 30;
};
};
};
};
yq-merge.".hermes/.env" = {
generator = lib.generators.toKeyValue {};
yqExtraArgs = "-p=props -o=props --properties-separator='='";
yqLoadFunc = "load_props";
expr = {
KIMI_API_KEY = config.ai.kimi.api_key;
MINIMAX_CN_API_KEY = config.ai.minimax-china.api_key;
TAVILY_API_KEY = config.ai.tavily.api_key;
};
};
# zsh completion via fpath (not eval, which breaks _arguments)
# https://github.com/NousResearch/hermes-agent/issues/6122
home.file."zsh-completions/_hermes" = {
target = ".zsh/completions/_hermes";
source = pkgs.runCommand "hermes-zsh-completion" {} ''
${hermes-agent}/bin/hermes completion zsh > $out
'';
};
programs.zsh.initContent = lib.mkBefore ''
fpath+=("$HOME/.zsh/completions")
'';
home.file.".hermes/memories/USER.md".source = config.lib.file.mkOutOfStoreSymlink ~/Gist/Data/hermes/memories/USER.md;
home.file.".hermes/memories/MEMORY.md".source = config.lib.file.mkOutOfStoreSymlink ~/Gist/Data/hermes/memories/MEMORY.md;
home.file.".hermes/skills".source = config.lib.file.mkOutOfStoreSymlink ~/Gist/Data/hermes/skills;
}