Solo comandos. Orden: proxy primero, Hermes después.


1. FreeDeepseekAPI

git clone https://github.com/dekrezz/FreeDeepseekAPI
cd FreeDeepseekAPI

# Login en DeepSeek Web (solo la primera vez)
CHROME_PATH="$(command -v chromium)" npm run auth

# Proxy + panel: dejar esta terminal abierta
npm run dashboard
# alternativa sin panel: npm start   (no correr los dos)

Otra terminal:

cd FreeDeepseekAPI

npm run doctor

curl -i http://127.0.0.1:9655/readyz
curl -s http://127.0.0.1:9655/v1/models | jq -r '.data[].id'

Esperado:

HTTP/1.1 200 OK
{"ready":true,"ready_accounts":1,"total_accounts":1}
deepseek-v4-flash
deepseek-v4-flash-thinking
deepseek-v4-flash-nosearch
deepseek-v4-flash-thinking-nosearch

Panel: http://127.0.0.1:9655/dashboard

Smoke test sin agente:

curl -sS http://127.0.0.1:9655/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer local' \
  -d '{"model":"deepseek-v4-flash","messages":[{"role":"user","content":"Responde solo: OK"}],"max_tokens":20}'

Generar config para Hermes:

npm run setup:agents -- --target hermes
cat ~/.hermes/freedeepseek.yaml
model:
  default: deepseek-v4-flash
  provider: custom
  base_url: http://127.0.0.1:9655/v1
  api_key: local
  api_mode: chat_completions

Hermes NO carga ese archivo solo: hay que copiarlo a un perfil (paso 4).


2. Instalar Hermes

curl -fsSL https://hermes-agent.nousresearch.com/install.sh -o /tmp/hermes-install.sh
less /tmp/hermes-install.sh

bash /tmp/hermes-install.sh \
  --skip-setup \
  --skip-browser \
  --skip-computer-use \
  --non-interactive

hermes --version

Actualizar:

hermes update --check
hermes update

3. PATH

# Bash/Zsh
export PATH="$HOME/.local/bin:$PATH"
# Fish
fish_add_path "$HOME/.local/bin"
command -v hermes
hermes --version

4. Perfil aislado

hermes profile create deepseek-web
hermes profile list

mkdir -p ~/.hermes/profiles/deepseek-web
cp ~/.hermes/freedeepseek.yaml ~/.hermes/profiles/deepseek-web/config.yaml

O con la CLI:

hermes -p deepseek-web config set model.provider custom
hermes -p deepseek-web config set model.default deepseek-v4-flash
hermes -p deepseek-web config set model.base_url http://127.0.0.1:9655/v1
hermes -p deepseek-web config set model.api_key local
hermes -p deepseek-web config set model.api_mode chat_completions

Verificar:

hermes -p deepseek-web config get model
hermes -p deepseek-web config path

5. Diagnóstico

hermes -p deepseek-web config check
hermes -p deepseek-web doctor
hermes -p deepseek-web doctor --fix   # opcional

Avisos de otros providers y vulnerabilidades npm: ignorar.


6. Prueba 1 (one-shot)

mkdir -p /tmp/hermes-deepseek-test
cd /tmp/hermes-deepseek-test

cat > prompt.txt <<'EOF'
Necesito que realices una tarea, no que me expliques cómo hacerla.
1. Utilizá write_file para crear prueba.txt.
2. Escribí exactamente: HERMES DEEPSEEK FUNCIONA
3. Utilizá read_file para leerlo.
4. Utilizá terminal para ejecutar: cat prueba.txt && sha256sum prueba.txt
5. Comprobá que el contenido sea correcto.
Informame qué herramientas ejecutaste y sus resultados.
EOF

timeout 540 hermes -p deepseek-web chat \
  -t "file,terminal" \
  --query-file prompt.txt \
  --oneshot --max-turns 15 --run-budget 420 -Q

Verificar afuera:

cat prueba.txt
sha256sum prueba.txt
HERMES DEEPSEEK FUNCIONA
9145dd1e754ce9333d41b7d8c2e2c73f8ffa7bf1622d9e6e3a377285700a1c0b  prueba.txt

7. Prueba 2 (multi-paso)

mkdir -p /tmp/hermes-deepseek-test/ciclo2
cd /tmp/hermes-deepseek-test/ciclo2

cat > prompt.txt <<'EOF'
Tarea real, ejecutá las herramientas. No expliques de antemano.
1. write_file: creá suma_cuadrados.py que imprima la suma de los cuadrados del 1 al 10.
2. terminal: ejecutá `python3 suma_cuadrados.py`.
3. write_file: creá resultado.txt con la línea `resultado=<valor>`.
4. read_file: leé resultado.txt.
5. terminal: ejecutá `ls -l && cat resultado.txt && python3 -c "print(sum(i*i for i in range(1,11)))"`.
Al final informá: valor esperado, valor obtenido, y si coinciden.
EOF

timeout 540 hermes -p deepseek-web chat \
  -t "file,terminal" \
  --query-file prompt.txt \
  --oneshot --max-turns 20 --run-budget 420 -Q

python3 suma_cuadrados.py
cat resultado.txt

Resultado: 385 y resultado=385.


8. Aprobaciones

python3 -c se bloquea en one-shot. Diagnosticar:

hermes -p deepseek-web approvals test "python3 -c 'print(1)'"
hermes -p deepseek-web approvals test "python3 suma_cuadrados.py"
verdict : ask-approval  (script execution via -e/-c flag)
verdict : allow

Permitir:

hermes -p deepseek-web approvals suggest
# ~/.hermes/profiles/deepseek-web/config.yaml
command_allowlist:
  - "python3 -c *"

O en interactivo: aprobar una vez. --yolo desactiva todo (no recomendado).


9. Verificar que usa el proxy

sqlite3 -line ~/.hermes/profiles/deepseek-web/state.db \
  "select model, billing_provider, billing_base_url, api_call_count, estimated_cost_usd
     from session_model_usage order by rowid desc limit 2;"
model: deepseek-v4-flash
billing_provider: custom
billing_base_url: http://127.0.0.1:9655/v1
api_call_count: 3
estimated_cost_usd: 0.0

10. Uso diario

hermes -p deepseek-web chat -t "file,terminal"
deepseek-web chat -t "file,terminal"      # alias
hermes chat                               # perfil habitual

hermes -p deepseek-web config set model.default deepseek-v4-flash-thinking
hermes -p deepseek-web model
hermes -p deepseek-web chat --reasoning high

hermes -p deepseek-web chat --continue
hermes -p deepseek-web chat --resume latest

hermes gateway status
hermes -p deepseek-web gateway status

11. Errores

# hermes: command not found
export PATH="$HOME/.local/bin:$PATH"

# connection refused :9655
cd FreeDeepseekAPI && npm run dashboard

# ready:false -> volver a loguear
CHROME_PATH="$(command -v chromium)" npm run auth

# 401
hermes -p deepseek-web config set model.api_key local   # o tu PROXY_API_KEY

# modelo inexistente
curl -s http://127.0.0.1:9655/v1/models | jq -r '.data[].id'

# config vieja
hermes -p deepseek-web config migrate

# aprobación denegada en one-shot
hermes -p deepseek-web approvals suggest

12. Seguridad

# probar siempre en /tmp
mkdir -p /tmp/hermes-deepseek-test && cd /tmp/hermes-deepseek-test

El perfil no es sandbox: terminal corre con tus permisos. --yolo solo en entornos descartables.