add crofai pi model configuration

This commit is contained in:
Rasyidan Akbar F. 2026-06-19 15:10:12 +07:00
commit 6db85eef8b
5 changed files with 101 additions and 11 deletions

18
flake.lock generated
View file

@ -249,11 +249,11 @@
"treefmt-nix": "treefmt-nix" "treefmt-nix": "treefmt-nix"
}, },
"locked": { "locked": {
"lastModified": 1779687822, "lastModified": 1781849779,
"narHash": "sha256-WXKyZkAQqCXm+k+N5hIfnb7U67RD3S9eIwbOCiR3vCk=", "narHash": "sha256-Ihdla0v+oCO6dNN6iExgdGc9+JmKLmAnbiTneiJgZbE=",
"owner": "numtide", "owner": "numtide",
"repo": "llm-agents.nix", "repo": "llm-agents.nix",
"rev": "ce517fef69b04f27e24dc1278f02c00ac7860f36", "rev": "a1e67cc315b6bd924614d4232e09bab54df3ae39",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -355,11 +355,11 @@
}, },
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1778869304, "lastModified": 1781607440,
"narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=", "narHash": "sha256-rxO+uc/KFbSJp+pgyXRuAX6QlG9hJdnt0BXpEQRXY+U=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "d233902339c02a9c334e7e593de68855ad26c4cb", "rev": "3e41b24abd260e8f71dbe2f5737d24122f972158",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -493,11 +493,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1775636079, "lastModified": 1780220602,
"narHash": "sha256-pc20NRoMdiar8oPQceQT47UUZMBTiMdUuWrYu2obUP0=", "narHash": "sha256-eynAfOmbmxJnkp7YewvCEbShNnnYJ9gLLqkzsYtBPeM=",
"owner": "numtide", "owner": "numtide",
"repo": "treefmt-nix", "repo": "treefmt-nix",
"rev": "790751ff7fd3801feeaf96d7dc416a8d581265ba", "rev": "db947814a175b7ca6ded66e21383d938df01c227",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -3,6 +3,7 @@
lib, lib,
pkgs, pkgs,
inputs, inputs,
customPkgs,
... ...
}: }:
let let
@ -173,6 +174,24 @@ in
description = "Configuration for the Claude wrapper that targets the Kimi Code API."; description = "Configuration for the Claude wrapper that targets the Kimi Code API.";
}; };
piInstructions = mkOption {
type = types.submodule {
options = {
enable = mkEnableOption "Install the global pi AGENTS.md instructions file.";
source = mkOption {
type = types.path;
default = ../../../pi/AGENTS.md;
description = "Source file for global pi instructions.";
};
};
};
default = {
enable = true;
source = ../../../pi/AGENTS.md;
};
description = "Configuration for the global pi instructions file deployment.";
};
piExtensions = mkOption { piExtensions = mkOption {
type = types.submodule { type = types.submodule {
options = { options = {
@ -266,7 +285,34 @@ in
++ kimiWrapperPackages ++ kimiWrapperPackages
++ cfg.extraPackages; ++ cfg.extraPackages;
home.activation.installPiFff = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
if [ -x ${lib.getExe llmPkgs.pi} ]; then
export PI_SKIP_VERSION_CHECK=1
export PI_TELEMETRY=0
export PATH=${pkgs.nodejs}/bin:${pkgs.git}/bin:$PATH
settings_file="$HOME/.pi/agent/settings.json"
mkdir -p "$(dirname "$settings_file")"
${pkgs.nodejs}/bin/node -e "const fs=require('fs'); const path=process.env.HOME+'/.pi/agent/settings.json'; let settings={}; if (fs.existsSync(path)) settings=JSON.parse(fs.readFileSync(path,'utf8')); settings.theme='dark'; fs.writeFileSync(path, JSON.stringify(settings, null, 2)+String.fromCharCode(10));"
${lib.getExe llmPkgs.pi} list | ${pkgs.gnugrep}/bin/grep -q '@ff-labs/pi-fff' || \
${lib.getExe llmPkgs.pi} install npm:@ff-labs/pi-fff@0.9.4
${lib.getExe llmPkgs.pi} list | ${pkgs.gnugrep}/bin/grep -q '@juicesharp/rpiv-ask-user-question' || \
${lib.getExe llmPkgs.pi} install npm:@juicesharp/rpiv-ask-user-question@1.20.0
fi
'';
home.file = mkMerge [ home.file = mkMerge [
{
".pi/agent/models.json" = {
source = ../../../pi/models.json;
};
}
(mkIf cfg.piInstructions.enable {
".pi/agent/AGENTS.md" = {
source = cfg.piInstructions.source;
};
})
(mkIf cfg.piExtensions.enable { (mkIf cfg.piExtensions.enable {
".pi/agent/extensions" = { ".pi/agent/extensions" = {
source = cfg.piExtensions.source; source = cfg.piExtensions.source;

14
pi/AGENTS.md Normal file
View file

@ -0,0 +1,14 @@
# Global Pi Instructions
## Version Control
Prefer Jujutsu (`jj`) over Git for source-control operations.
- Use `jj status` instead of `git status`.
- Use `jj diff` instead of `git diff`.
- Use `jj log` instead of `git log`.
- Use `jj describe` for change descriptions.
- Use `jj new`, `jj split`, and `jj squash` for change management.
- Avoid `git add`, `git commit`, and direct index/staging workflows unless explicitly requested.
- Git commands are acceptable only for operations that `jj` cannot perform or when the user asks for Git specifically.
- When reporting changes, mention the active `jj` change/workspace state rather than Git staging state.

29
pi/models.json Normal file
View file

@ -0,0 +1,29 @@
{
"providers": {
"crofai": {
"baseUrl": "https://crof.ai/v1",
"api": "openai-completions",
"apiKey": "$CROF_API_KEY",
"authHeader": true,
"compat": {
"supportsDeveloperRole": false,
"supportsStore": false
},
"models": [
{
"id": "glm-5.2",
"name": "CrofAI GLM 5.2",
"reasoning": true,
"contextWindow": 1000000,
"maxTokens": 131072,
"cost": {
"input": 0.5,
"output": 2.2,
"cacheRead": 0.08,
"cacheWrite": 0
}
}
]
}
}
}

View file

@ -10,6 +10,7 @@ ANTHROPIC_API_KEY: ENC[AES256_GCM,data:aBgfgHQ8cyJ4TUq4O6y218flTgDWcAXatY0/xbaD3
OPENCODE_API_KEY: ENC[AES256_GCM,data:2aPaiODhpFObObRN+/HiEVsvMds1n6MhrmvQUWo2ozRzgRHQ1dGGZYFzOZoSbV4vpjmiqKW7VUFnVU5va1xlS8HrWg==,iv:DgCF9I+wT9xUjmenfUSDrDnKD5Ai4pJGw4qKmePpZOo=,tag:YD7nO4HbDKTa3zNbGtUCOg==,type:str] OPENCODE_API_KEY: ENC[AES256_GCM,data:2aPaiODhpFObObRN+/HiEVsvMds1n6MhrmvQUWo2ozRzgRHQ1dGGZYFzOZoSbV4vpjmiqKW7VUFnVU5va1xlS8HrWg==,iv:DgCF9I+wT9xUjmenfUSDrDnKD5Ai4pJGw4qKmePpZOo=,tag:YD7nO4HbDKTa3zNbGtUCOg==,type:str]
BRAVE_SEARCH_API_KEY: ENC[AES256_GCM,data:7Q+8sa2Xp4amEMkGzgEZzSLDCkstL71lu3sz1iGJdg==,iv:pY4NMgIUEEqwBUonAOAVoqP0EeqgON7h23221Yoa4aM=,tag:foyjDNIMsxrKvgYmu6FJNA==,type:str] BRAVE_SEARCH_API_KEY: ENC[AES256_GCM,data:7Q+8sa2Xp4amEMkGzgEZzSLDCkstL71lu3sz1iGJdg==,iv:pY4NMgIUEEqwBUonAOAVoqP0EeqgON7h23221Yoa4aM=,tag:foyjDNIMsxrKvgYmu6FJNA==,type:str]
KIMI_API_KEY: ENC[AES256_GCM,data:hkq/IY++1xGPmFMt5UMFlA/mVCOKDh+4V1Ip6Bv5ZSWTwdqwP1ghuL3HpF/r4Y+eO+PfzcZso1A8z+4SqVlXBjmiaORHIPut,iv:UWcdLW+ITk8jtc/UbprKz8zxI3mgAn1DP+tch0tse8M=,tag:brx5KyUzl1wg+fTagMUphQ==,type:str] KIMI_API_KEY: ENC[AES256_GCM,data:hkq/IY++1xGPmFMt5UMFlA/mVCOKDh+4V1Ip6Bv5ZSWTwdqwP1ghuL3HpF/r4Y+eO+PfzcZso1A8z+4SqVlXBjmiaORHIPut,iv:UWcdLW+ITk8jtc/UbprKz8zxI3mgAn1DP+tch0tse8M=,tag:brx5KyUzl1wg+fTagMUphQ==,type:str]
CROF_API_KEY: ENC[AES256_GCM,data:rCBZ3uDitVs6EVs9AOWGT7UZf0x6vQ4EU4fnyw==,iv:XwUxXgDxku8aAxMIMdxrVImhjNuuh+6kXoBo5RULhsc=,tag:WlIglF9cMOR33x4JbEmpnA==,type:str]
sops: sops:
age: age:
- recipient: age1qfgey5w87dresg99zed3d2yz62hv6c2c7u4gd5e880vjrngmx9ksgfv3sj - recipient: age1qfgey5w87dresg99zed3d2yz62hv6c2c7u4gd5e880vjrngmx9ksgfv3sj
@ -21,7 +22,7 @@ sops:
WHRrVWx2Y3FabWpBdjZ5VkpFY1BGeGsKSc4vxaHSj/6g7clPZDOPqCf3Zo+VGSRy WHRrVWx2Y3FabWpBdjZ5VkpFY1BGeGsKSc4vxaHSj/6g7clPZDOPqCf3Zo+VGSRy
HwLiHEohjk5/R3I5KWhFuO9aNQTNYYnUBwc6nOAcEhw+Mihq2gDtzg== HwLiHEohjk5/R3I5KWhFuO9aNQTNYYnUBwc6nOAcEhw+Mihq2gDtzg==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
lastmodified: "2026-02-03T07:35:18Z" lastmodified: "2026-06-19T08:19:30Z"
mac: ENC[AES256_GCM,data:MWrijOPL9whg++YKwmLWT1hFu98FIDuZgis7g77mXFCIPMHn2Lz9JV5wdkUJY4ZNAlFG/FwZDG2QZQDp3aD+syN0UGVdmJmRsNcn7JITyABvXWWwJIo3kyBJj5mJMpcFooJEZpTsNp4hYr4ozrBl8/v1QyIcnY7L5NeO5DdyaXw=,iv:dCoCan6mOwDDD3dpvdFJkUzNfOttVJo3hb6vLBWap68=,tag:dWGz6szFXp+IW8QgI7z2CA==,type:str] mac: ENC[AES256_GCM,data:FZ1W7dNanlxvkgn5Up3JzIQHyeXM+bAeEmBe3gd5+RlXMAOnUu2QvM5L5mHCbLGNmAefbGKYF9v5UDBk14SkgyL1lcDKaI/rgZ9cpc+fV+aHCK6y15zsA+Tyk17V21Kr0E3d23ZT87j7dLKVF9T50Mpd/xRSHsRilBZAQqM0oBE=,iv:aSW3Iv8cd+QaM+U9HI74QCgDU1ilTqCD8//GO2/jj5E=,tag:xqzpeYGO/m6ZRJFCkTPmSg==,type:str]
unencrypted_suffix: _unencrypted unencrypted_suffix: _unencrypted
version: 3.11.0 version: 3.11.0