Instructions to use SpeciesFileGroup/ento-model-parse 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 SpeciesFileGroup/ento-model-parse 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 SpeciesFileGroup/ento-model-parse:Q4_K_M # Run inference directly in the terminal: llama cli -hf SpeciesFileGroup/ento-model-parse:Q4_K_M
Install from WinGet (Windows)
winget install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama serve -hf SpeciesFileGroup/ento-model-parse:Q4_K_M # Run inference directly in the terminal: llama cli -hf SpeciesFileGroup/ento-model-parse: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 SpeciesFileGroup/ento-model-parse:Q4_K_M # Run inference directly in the terminal: ./llama-cli -hf SpeciesFileGroup/ento-model-parse: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 SpeciesFileGroup/ento-model-parse:Q4_K_M # Run inference directly in the terminal: ./build/bin/llama-cli -hf SpeciesFileGroup/ento-model-parse:Q4_K_M
Use Docker
docker model run hf.co/SpeciesFileGroup/ento-model-parse:Q4_K_M
- LM Studio
- Jan
- Ollama
How to use SpeciesFileGroup/ento-model-parse with Ollama:
ollama run hf.co/SpeciesFileGroup/ento-model-parse:Q4_K_M
- Unsloth Studio
How to use SpeciesFileGroup/ento-model-parse with Unsloth Studio:
Install Unsloth Studio (macOS, Linux, WSL)
curl -fsSL https://unsloth.ai/install.sh | sh # Run unsloth studio unsloth studio -H 0.0.0.0 -p 8888 # Then open http://localhost:8888 in your browser # Search for SpeciesFileGroup/ento-model-parse to start chatting
Install Unsloth Studio (Windows)
irm https://unsloth.ai/install.ps1 | iex # Run unsloth studio unsloth studio -H 0.0.0.0 -p 8888 # Then open http://localhost:8888 in your browser # Search for SpeciesFileGroup/ento-model-parse to start chatting
Using HuggingFace Spaces for Unsloth
# No setup required # Open https://huggingface.co/spaces/unsloth/studio in your browser # Search for SpeciesFileGroup/ento-model-parse to start chatting
- Pi
How to use SpeciesFileGroup/ento-model-parse with Pi:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf SpeciesFileGroup/ento-model-parse:Q4_K_M
Configure the model in Pi
# Install Pi: npm install -g @mariozechner/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "llama-cpp": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "SpeciesFileGroup/ento-model-parse:Q4_K_M" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Hermes Agent new
How to use SpeciesFileGroup/ento-model-parse with Hermes Agent:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf SpeciesFileGroup/ento-model-parse: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 SpeciesFileGroup/ento-model-parse:Q4_K_M
Run Hermes
hermes
- Atomic Chat new
- OpenClaw new
How to use SpeciesFileGroup/ento-model-parse with OpenClaw:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf SpeciesFileGroup/ento-model-parse: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 "SpeciesFileGroup/ento-model-parse: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"
- Docker Model Runner
How to use SpeciesFileGroup/ento-model-parse with Docker Model Runner:
docker model run hf.co/SpeciesFileGroup/ento-model-parse:Q4_K_M
- Lemonade
How to use SpeciesFileGroup/ento-model-parse with Lemonade:
Pull the model
# Download Lemonade from https://lemonade-server.ai/ lemonade pull SpeciesFileGroup/ento-model-parse:Q4_K_M
Run and chat with the model
lemonade run user.ento-model-parse-Q4_K_M
List all available models
lemonade list
| package main | |
| import ( | |
| "bytes" | |
| "encoding/json" | |
| "fmt" | |
| "io" | |
| "log" | |
| "net/http" | |
| "strings" | |
| ) | |
| const ollamaURL = "http://localhost:11434/api/chat" | |
| const model = "ento-label-parser" | |
| type ollamaRequest struct { | |
| Model string `json:"model"` | |
| Stream bool `json:"stream"` | |
| Messages []ollamaMessage `json:"messages"` | |
| } | |
| type ollamaMessage struct { | |
| Role string `json:"role"` | |
| Content string `json:"content"` | |
| } | |
| type ollamaResponse struct { | |
| Message struct { | |
| Content string `json:"content"` | |
| } `json:"message"` | |
| } | |
| type labelResult struct { | |
| Verbatim string `json:"verbatim"` | |
| Parsed json.RawMessage `json:"parsed,omitempty"` | |
| Error string `json:"error,omitempty"` | |
| } | |
| func parseLabel(label string) labelResult { | |
| result := labelResult{Verbatim: label} | |
| reqBody, _ := json.Marshal(ollamaRequest{ | |
| Model: model, | |
| Stream: false, | |
| Messages: []ollamaMessage{ | |
| {Role: "user", Content: label}, | |
| }, | |
| }) | |
| resp, err := http.Post(ollamaURL, "application/json", bytes.NewReader(reqBody)) | |
| if err != nil { | |
| result.Error = fmt.Sprintf("failed to call ollama: %v", err) | |
| return result | |
| } | |
| defer resp.Body.Close() | |
| body, err := io.ReadAll(resp.Body) | |
| if err != nil { | |
| result.Error = fmt.Sprintf("failed to read response: %v", err) | |
| return result | |
| } | |
| var ollamaResp ollamaResponse | |
| if err := json.Unmarshal(body, &ollamaResp); err != nil { | |
| result.Error = fmt.Sprintf("failed to parse ollama response: %v", err) | |
| return result | |
| } | |
| content := strings.TrimSpace(ollamaResp.Message.Content) | |
| var parsed json.RawMessage | |
| if err := json.Unmarshal([]byte(content), &parsed); err != nil { | |
| result.Error = fmt.Sprintf("model returned invalid JSON: %v\nraw content: %s", err, content) | |
| return result | |
| } | |
| result.Parsed = parsed | |
| return result | |
| } | |
| func handleParse(w http.ResponseWriter, r *http.Request) { | |
| if r.Method != http.MethodPost { | |
| http.Error(w, "method not allowed", http.StatusMethodNotAllowed) | |
| return | |
| } | |
| if err := r.ParseForm(); err != nil { | |
| http.Error(w, "bad request", http.StatusBadRequest) | |
| return | |
| } | |
| raw := r.FormValue("labels") | |
| lines := strings.Split(raw, "\n") | |
| var results []labelResult | |
| for _, line := range lines { | |
| line = strings.TrimSpace(line) | |
| if line == "" { | |
| continue | |
| } | |
| results = append(results, parseLabel(line)) | |
| } | |
| w.Header().Set("Content-Type", "application/json") | |
| enc := json.NewEncoder(w) | |
| enc.SetIndent("", " ") | |
| enc.Encode(results) | |
| } | |
| const indexHTML = `<!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Label Parser</title> | |
| <style> | |
| body { font-family: sans-serif; max-width: 900px; margin: 2rem auto; padding: 0 1rem; background: #f5f5f5; } | |
| h1 { color: #333; } | |
| textarea { width: 100%; height: 180px; font-family: monospace; font-size: 14px; padding: 0.5rem; box-sizing: border-box; border: 1px solid #ccc; border-radius: 4px; } | |
| button { margin-top: 0.75rem; padding: 0.5rem 1.5rem; font-size: 15px; background: #2563eb; color: white; border: none; border-radius: 4px; cursor: pointer; } | |
| button:hover { background: #1d4ed8; } | |
| button:disabled { background: #93c5fd; cursor: default; } | |
| #progress { margin-top: 0.75rem; font-size: 13px; color: #555; min-height: 1.2em; } | |
| #meta { margin-top: 0.75rem; display: none; background: #fff; border: 1px solid #ddd; border-radius: 6px; padding: 0.6rem 1rem; font-size: 13px; } | |
| #meta table { border-collapse: collapse; } | |
| #meta td { padding: 2px 1.2rem 2px 0; } | |
| #meta td:first-child { color: #888; } | |
| #meta td.ok { color: #16a34a; font-weight: bold; } | |
| #meta td.fail { color: #dc2626; font-weight: bold; } | |
| #output { margin-top: 1rem; background: #1e1e1e; color: #d4d4d4; padding: 1rem; border-radius: 6px; font-family: monospace; font-size: 13px; white-space: pre-wrap; word-break: break-all; min-height: 3rem; } | |
| label { font-weight: bold; display: block; margin-bottom: 0.4rem; } | |
| p.hint { color: #666; font-size: 13px; margin-top: 0.25rem; } | |
| </style> | |
| </head> | |
| <body> | |
| <h1>Entomology Label Parser</h1> | |
| <form id="form"> | |
| <label for="labels">Labels (one per line):</label> | |
| <textarea id="labels" name="labels" placeholder="Kazakhstan, Akmola Region: Kokshetau Mountains near Terisakkan River, 23.VI-12.VIII.1957, Emeljanov"></textarea> | |
| <p class="hint">Each non-empty line is sent separately to the model.</p> | |
| <button type="submit" id="btn">Parse</button> | |
| </form> | |
| <div id="progress"></div> | |
| <div id="meta"></div> | |
| <div id="output">Results will appear here.</div> | |
| <script> | |
| function fmt(ms) { | |
| if (ms < 1000) return ms.toFixed(0) + ' ms'; | |
| return (ms / 1000).toFixed(2) + ' s'; | |
| } | |
| function avg(arr) { | |
| return arr.length ? arr.reduce((a,b) => a+b, 0) / arr.length : null; | |
| } | |
| function renderMeta(total, successes, failures, okTimes, failTimes, totalMs, done) { | |
| const meta = document.getElementById('meta'); | |
| meta.style.display = 'block'; | |
| const avgOk = avg(okTimes); | |
| const avgFail = avg(failTimes); | |
| meta.innerHTML = | |
| '<table>' + | |
| '<tr><td>labels</td><td>' + total + '</td></tr>' + | |
| '<tr><td>successes</td><td class="ok">' + successes + '</td></tr>' + | |
| '<tr><td>failures</td><td class="' + (failures ? 'fail' : 'ok') + '">' + failures + '</td></tr>' + | |
| (avgOk !== null ? '<tr><td>avg time (success)</td><td>' + fmt(avgOk) + '</td></tr>' : '') + | |
| (avgFail !== null ? '<tr><td>avg time (failure)</td><td>' + fmt(avgFail) + '</td></tr>' : '') + | |
| (done ? '<tr><td>total time</td><td>' + fmt(totalMs) + '</td></tr>' : '') + | |
| '</table>'; | |
| } | |
| document.getElementById('form').addEventListener('submit', async e => { | |
| e.preventDefault(); | |
| const btn = document.getElementById('btn'); | |
| const out = document.getElementById('output'); | |
| const prog = document.getElementById('progress'); | |
| const meta = document.getElementById('meta'); | |
| btn.disabled = true; | |
| out.textContent = ''; | |
| prog.textContent = ''; | |
| meta.style.display = 'none'; | |
| const lines = document.getElementById('labels').value | |
| .split('\n').map(l => l.trim()).filter(l => l !== ''); | |
| const total = lines.length; | |
| if (total === 0) { | |
| prog.textContent = 'No labels entered.'; | |
| btn.disabled = false; | |
| return; | |
| } | |
| const results = []; | |
| const okTimes = [], failTimes = []; | |
| let successes = 0, failures = 0; | |
| const globalStart = performance.now(); | |
| try { | |
| for (let i = 0; i < total; i++) { | |
| prog.textContent = 'Parsing ' + (i + 1) + ' of ' + total + '\u2026'; | |
| const fd = new URLSearchParams(); | |
| fd.append('labels', lines[i]); | |
| const t0 = performance.now(); | |
| const resp = await fetch('/parse', { method: 'POST', body: fd }); | |
| const json = await resp.json(); | |
| const elapsed = performance.now() - t0; | |
| for (const r of json) { | |
| results.push(r); | |
| if (r.error) { failures++; failTimes.push(elapsed); } | |
| else { successes++; okTimes.push(elapsed); } | |
| } | |
| out.textContent = JSON.stringify(results, null, 2); | |
| renderMeta(total, successes, failures, okTimes, failTimes, performance.now() - globalStart, false); | |
| } | |
| prog.textContent = 'Done \u2014 ' + total + ' label' + (total !== 1 ? 's' : '') + ' parsed.'; | |
| renderMeta(total, successes, failures, okTimes, failTimes, performance.now() - globalStart, true); | |
| } catch (err) { | |
| prog.textContent = 'Error: ' + err; | |
| } finally { | |
| btn.disabled = false; | |
| } | |
| }); | |
| </script> | |
| </body> | |
| </html>` | |
| func handleIndex(w http.ResponseWriter, r *http.Request) { | |
| w.Header().Set("Content-Type", "text/html; charset=utf-8") | |
| fmt.Fprint(w, indexHTML) | |
| } | |
| func main() { | |
| http.HandleFunc("/", handleIndex) | |
| http.HandleFunc("/parse", handleParse) | |
| log.Println("listening on http://localhost:8080") | |
| log.Fatal(http.ListenAndServe(":8080", nil)) | |
| } | |