Instructions to use zazaorg/harpy-9b with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- llama.cpp
How to use zazaorg/harpy-9b with llama.cpp:
Install (macOS, Linux)
curl -LsSf https://llama.app/install.sh | sh # Start a local OpenAI-compatible server with a web UI: llama serve -hf zazaorg/harpy-9b:Q4_K_M # Run inference directly in the terminal: llama cli -hf zazaorg/harpy-9b:Q4_K_M
Install from WinGet (Windows)
winget install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama serve -hf zazaorg/harpy-9b:Q4_K_M # Run inference directly in the terminal: llama cli -hf zazaorg/harpy-9b:Q4_K_M
Use pre-built binary
# Download pre-built binary from: # https://github.com/ggerganov/llama.cpp/releases # Start a local OpenAI-compatible server with a web UI: ./llama-server -hf zazaorg/harpy-9b:Q4_K_M # Run inference directly in the terminal: ./llama-cli -hf zazaorg/harpy-9b:Q4_K_M
Build from source code
git clone https://github.com/ggerganov/llama.cpp.git cd llama.cpp cmake -B build cmake --build build -j --target llama-server llama-cli # Start a local OpenAI-compatible server with a web UI: ./build/bin/llama-server -hf zazaorg/harpy-9b:Q4_K_M # Run inference directly in the terminal: ./build/bin/llama-cli -hf zazaorg/harpy-9b:Q4_K_M
Use Docker
docker model run hf.co/zazaorg/harpy-9b:Q4_K_M
- LM Studio
- Jan
- vLLM
How to use zazaorg/harpy-9b with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "zazaorg/harpy-9b" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "zazaorg/harpy-9b", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/zazaorg/harpy-9b:Q4_K_M
- Ollama
How to use zazaorg/harpy-9b with Ollama:
ollama run hf.co/zazaorg/harpy-9b:Q4_K_M
- Unsloth Desktop
- Pi
How to use zazaorg/harpy-9b with Pi:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf zazaorg/harpy-9b:Q4_K_M
Configure the model in Pi
# Install Pi: npm install -g @earendil-works/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "llama-cpp": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "zazaorg/harpy-9b:Q4_K_M" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Docker Model Runner
How to use zazaorg/harpy-9b with Docker Model Runner:
docker model run hf.co/zazaorg/harpy-9b:Q4_K_M
- Lemonade
How to use zazaorg/harpy-9b with Lemonade:
Pull the model
# Download Lemonade from https://lemonade-server.ai/ lemonade pull zazaorg/harpy-9b:Q4_K_M
Run and chat with the model
lemonade run user.harpy-9b-Q4_K_M
List all available models
lemonade list
- Hermes Agent
How to use zazaorg/harpy-9b with Hermes Agent:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf zazaorg/harpy-9b:Q4_K_M
Configure Hermes
# Install Hermes: curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash hermes setup # Point Hermes at the local server: hermes config set model.provider custom hermes config set model.base_url http://127.0.0.1:8080/v1 hermes config set model.default zazaorg/harpy-9b:Q4_K_M
Run Hermes
hermes
- Atomic Chat
- OpenClaw
How to use zazaorg/harpy-9b with OpenClaw:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf zazaorg/harpy-9b:Q4_K_M
Configure OpenClaw
# Install OpenClaw: npm install -g openclaw@latest # Register the local server and set it as the default model: openclaw onboard --non-interactive --mode local \ --auth-choice custom-api-key \ --custom-base-url http://127.0.0.1:8080/v1 \ --custom-model-id "zazaorg/harpy-9b:Q4_K_M" \ --custom-provider-id llama-cpp \ --custom-compatibility openai \ --custom-text-input \ --accept-risk \ --skip-health
Run OpenClaw
openclaw agent --local --agent main --message "Hello from Hugging Face"
Harpy 9B
Harpy est un affinage LoRA de teddy19032/Ornith-1.5-9B-heretic (licence MIT), entraîné sur un corpus red team / opsec et sur la discipline d'usage des outils.
- Base :
teddy19032/Ornith-1.5-9B-heretic, révision4b1cf4847e73, licence MIT - Gabarit : celui d'origine (tools / thinking / completion), contexte déclaré 262 144
- Usage :
llama-server --jinja,ollama create -f Modelfile, ou tout moteur llama.cpp récent - Architecture :
qwen35, 32 blocs, 427 tenseurs, aucun tenseur MTP - Moteur vérifié : llama.cpp build 11382 (04/10/2026) charge et sert ce modèle correctement, sur GPU comme sur CPU. Toute version au moins aussi récente convient.
Versions
| Version | Date | Adaptateur | Profil mesuré |
|---|---|---|---|
| v3.1 | 19/10/2026 | identique à v3 (mêmes poids, nom interne corrigé) | aucun réentraînement : seule la métadonnée general.name change |
| v3 | 18/10/2026 | checkpoints/s6c-final/adaptateur (4434135f…, r=32, α=64) |
outils 43-44 / 50, verbosité médiane 469 car. |
| v2 | 17/10/2026 | checkpoints/s3-step-001232/adaptateur |
outils 37-38 / 50, verbosité médiane 427 car. |
| v1 | 16/10/2026 | idem v2, en-tête défectueux | remplacée le 17/10 — ne pas utiliser |
Les chiffres des deux versions actuelles ont été mesurés le 18/10 sur le même serveur, la même batterie et le même gabarit, en trois passes chacune (échantillonnage à 0,6). Ils sont donc comparables entre eux, mais pas aux chiffres publiés lors des sessions antérieures : le protocole de mesure dérive avec la version du moteur (voir « Sur la reproductibilité »).
Récupérer une version précise :
huggingface-cli download zazaorg/harpy-9b --revision v3.1 harpy-Q4_K_M.gguf
huggingface-cli download zazaorg/harpy-9b --revision v3 harpy-Q4_K_M.gguf
huggingface-cli download zazaorg/harpy-9b --revision v2 harpy-Q4_K_M.gguf
huggingface-cli download zazaorg/harpy-9b --revision v3 harpy-Q4_K_M.gguf
Fichiers (v3)
| Fichier | SHA-256 (v3.1, par défaut) | SHA-256 (v3, conservée) |
|---|---|---|
harpy-Q4_K_M.gguf |
3def58817cf5de1e18377e2e563b879a5014c755ae2fb57ecf10e7875675a6cf |
5350cfa1b84dd7dda2b0b551ac5f37718dab0436d691e60d644e353957ff280c |
harpy-Q6_K.gguf |
af6bfc4b572ebf12906a88d5dd90305b374a6f2fbc9e3a578a1db4a2b66f681c |
5911e5a0fe4b6df6f34407a7192027323e29409733500a6efda2642e856a47b6 |
harpy-Q8_0.gguf |
0f88dd07fb71ef41425fc58041dbdc237f2485c89d0c712e2110e4beb6f98a54 |
352990ca62d109146e779b5441481abaf84135659e93c834a1e56d91662793d8 |
Les deux jeux de fichiers ne diffèrent que par un champ de métadonnée : les poids sont identiques octet pour octet (vérifié tenseur par tenseur). v3.1 corrige le nom interne, rien d'autre.
Le fichier f16 d'origine (17 920 696 672 o, 682c43b0…) n'est pas publié : les trois quantifications suffisent à l'usage, et il se régénère à partir de l'adaptateur.
Ce que le modèle fait
- Discipline d'outils : il appelle l'outil quand on le lui demande explicitement, n'invente pas d'appel quand la question est purement documentaire, respecte un périmètre d'autorisation déclaré, et ne réclame pas d'accès hors de ce périmètre. Sur la batterie interne de 50 épreuves réparties en cinq familles (action explicite, action implicite, abstention, périmètre, refus), v3 obtient 43 à 44 réussites. Une batterie indépendante, sur une autre machine, obtient 10/10 deux fois de suite sur ses cinq sous-tests d'appel d'outils.
- Contexte long : récupération d'information vérifiée à 22 k et 44 k jetons de prompt, sur deux plateformes différentes.
- Sécurité défensive : refuse les demandes de code opérationnel nuisibles tout en restant utile sur l'analyse défensive et la remédiation.
La longueur des réponses dépend du mode de raisonnement
C'est la constatation la plus importante pour qui déploie ce modèle, et elle corrige une version antérieure de cette fiche.
Le modèle hérite d'un gabarit avec bloc de raisonnement. Selon que ce bloc est activé ou non, la longueur des réponses change d'un facteur 3 à 5 :
| Contexte de mesure | Raisonnement désactivé | Raisonnement activé |
|---|---|---|
| Batterie interne, 40 questions figées | médiane 469 car. | non mesuré |
| Batterie indépendante, invites difficiles | médiane ~281 car. | 500 à 2 000+ car. |
| 10 questions de connaissance, profils de service | médiane 442 car. | médiane 1 065 car. |
Sur ces 10 questions, le rapport entre les deux modes est de 2,41×. Mais la distribution n'est pas un simple décalage : en mode raisonnement, 3 réponses sur 10 tombent sous 340 caractères ; en mode direct, 2 sur 10 dépassent 1 370. Le mode ne garantit donc pas la longueur, il la rend probable.
Autrement dit : ce modèle sait produire des réponses longues et structurées, mais principalement quand le raisonnement est activé. En mode direct, il répond court et dense.
Conséquence pratique, mesurée sur 90 appels : toute demande où un refus est plausible doit partir en raisonnement désactivé — zéro silence, refus explicite de 183 à 283 caractères. Le raisonnement actif reste le mode du développement et de l'analyse, avec 15,6 % de silences à rattraper côté harnais.
Conséquence pratique : si vous avez besoin de développement, activez le raisonnement
(chat_template_kwargs: {"enable_thinking": true}) plutôt que d'espérer une consigne. Une consigne
explicite de longueur n'apporte que ~17 % sur la version publiée.
Deux passes d'entraînement dédiées au style (mélange à 95 % de réponses longues, pas d'apprentissage réduit, trois époques) n'ont pas déplacé la médiane du mode direct de plus de 7 %, en coûtant 5 points sur 50 en discipline d'outils. Elles mesuraient le mode direct : cela ne dit rien du mode raisonnement, qui reste à caractériser.
Réponses vides : défaut connu, et parade
Environ un tour sur quatre peut revenir sans contenu texte sur des invites difficiles, quand le
raisonnement est activé : le modèle termine proprement (finish_reason = stop) après avoir
raisonné, sans écrire de réponse visible.
Mesuré sur une batterie indépendante de cas durs : 4 tours vides sur 15 en une passe, dont trois stochastiques (récupérés à la relance) et un reproductible.
Anatomie, sur 90 appels par mode : 14 silences sur 90 en raisonnement actif (15,6 %), et
0 sur 90 en raisonnement désactivé. La température n'y change rien — 13,3 % à 0,6 ; 16,7 % à 0,4
et à 0,35, écarts dans le bruit d'un échantillon de 30. Les dix silences de la trace ont tous
finish_reason = stop : ce ne sont pas des troncatures, le modèle termine proprement sans écrire.
Une simple relance à l'identique en récupère sept ; trois persistent et relèvent du repli.
Le motif est net : les silences frappent les cas où le modèle veut refuser sans le dire. Un cas de rançonlogiciel se tait 3 fois sur 3 ; un cas de contournement de WAF/EDR, 2 sur 3 ; les six cas conformes de la batterie ne se taisent jamais. Autrement dit ce n'est pas un défaut de génération diffus, mais un refus qui ne trouve pas sa forme — et c'est pourquoi le mode sans raisonnement, qui force un refus explicite, les supprime tous. Ce dernier correspond à une demande nuisible : raisonnement actif → contenu vide ; raisonnement désactivé → refus explicite de 347 caractères.
Sur notre propre batterie en revanche, v3 n'a produit aucun tour vide sur 200 mesures (batterie d'outils, quatre passes). Et sur les campagnes où la batterie de connaissances de 241 questions a tourné — v2 et v4 — aucun tour vide non plus. Sur l'ensemble des mesures enregistrées, 5 tours vides sur 1 281, tous sur les familles de refus et sur d'autres versions que v3. La batterie de 241 questions n'a pas été repassée sur v3 ; c'est une lacune de mesure assumée.
Parade côté harnais, à implémenter dans tout agent :
- si le contenu est vide et qu'un raisonnement existe, relancer une fois ;
- si la relance échoue aussi, recycler le raisonnement dans le contenu ou écrire un refus explicite — ne jamais rendre du vide ;
- distinguer la troncature (
finish_reason = length, contenu vide) du silence : la relance se fait alors avec un budget doublé ; - pour les cas où un refus est attendu, désactiver le raisonnement : c'est le seul mode où le refus est explicite ;
- un tour qui renvoie un appel d'outil sans texte n'est pas vide : c'est le contrat normal des outils.
Sur la reproductibilité
- Le champ
nextn_predict_layersdu convertisseur est forcé à 0 : la configuration de la base déclare une couche MTP (mtp_num_hidden_layers = 1) alors qu'aucun tenseur MTP n'existe dans les poids. Sans ce forçage, l'en-tête annoncerait 33 blocs pour 32 réels, et les moteurs tiers échouent au chargement. Chaque fichier de ce dépôt a été recontrôlé après quantification :block_count=32,recurrent_layers=32,nextn=0, 427 tenseurs, blocs 0..31, zéro tenseur MTP. - Les trois quantifications ont été chargées et testées avec
llama-cli, comme le ferait un moteur tiers, avant publication. - Les mesures de comportement varient avec la version du moteur d'inférence : sur ce même fichier v3, la médiane de verbosité mesurée en session antérieure valait 488 caractères, contre 469 aujourd'hui, et un témoin de la version v2 mesuré le même jour est passé de 452 à 427. Le classement entre versions reste stable, les valeurs absolues non.
- Nom interne :
general.namevaut désormaisharpy-9b-v3.1. Les fichiers v3 publiés auparavant portaientFusion S6D, du nom du répertoire de travail de la chaîne d'export — c'était un défaut d'étiquetage, pas de contenu. La correction a été faite en recopiant chaque fichier avec un en-tête corrigé : les tenseurs n'ont pas été retouchés, et la vérification tenseur par tenseur confirme des poids identiques octet pour octet entre v3 et v3.1. - Gabarit : celui embarqué dans le GGUF fait 7 593 caractères, contre 7 648 pour le fichier
chat_template.jinjade l'adaptateur — ce ne sont pas les mêmes exemplaires. Le gabarit embarqué a été audité : balisestools,tool_call,thinking,generationprésentes, aucun motif inhabituel (ni shell, ni accès fichier, ni réseau, ni caractère invisible), et les appels d'outils se déclenchent correctement.
Licence
La base est publiée sous licence MIT ; ce dérivé est distribué sous la même licence. Attribution : teddy19032/Ornith-1.5-9B-heretic, lui-même dérivé de ornith-ai/Ornith-1.5-9B.
Ce modèle est un outil de sécurité défensive et d'ingénierie. Il n'est ni audité ni certifié pour un usage en production.
- Downloads last month
- 227
4-bit
6-bit
8-bit
Model tree for zazaorg/harpy-9b
Base model
ornith-ai/Ornith-1.5-9B