|
| 1 | +# hermes-pmxt |
| 2 | + |
| 3 | +Integración de mercados de predicción para [Hermes Agent](https://github.com/NousResearch/hermes-agent). |
| 4 | +Busque mercados, compare precios, detecte arbitrajes y opere en múltiples intercambios de mercados de predicción a través de [pmxt](https://github.com/pmxt-dev/pmxt) (>= 2.50.0). |
| 5 | + |
| 6 | +## Qué es esto |
| 7 | + |
| 8 | +Una habilidad de Hermes + un conjunto de herramientas de Python que otorga a cualquier agente de Hermes acceso en tiempo real a los mercados de predicción. En lugar de alucinar probabilidades, el agente verifica los precios reales del mercado. |
| 9 | + |
| 10 | +``` |
| 11 | +Usuario: "¿Ganará Trump en 2028?" |
| 12 | +Agente: *llama a pmxt_search + pmxt_quote* |
| 13 | +Agente: "El mercado implica una probabilidad del 1.9% (No: 98.1%). Polymarket está valorando esto muy bajo." |
| 14 | +``` |
| 15 | + |
| 16 | +## Instalación |
| 17 | + |
| 18 | +El paquete de PyPI ya está disponible. Para la mayoría de los usuarios, esta es la instalación completa: |
| 19 | + |
| 20 | +```bash |
| 21 | +pip install hermes-pmxt |
| 22 | +``` |
| 23 | + |
| 24 | +Verifique que funcione: |
| 25 | + |
| 26 | +```bash |
| 27 | +python3 -c "from hermes_pmxt import pmxt_runtime_status; print(pmxt_runtime_status())" |
| 28 | +``` |
| 29 | + |
| 30 | +### Configuración de la Habilidad de Hermes |
| 31 | + |
| 32 | +Instale el archivo de habilidad de Hermes para que su agente sepa cuándo utilizar el paquete: |
| 33 | + |
| 34 | +```bash |
| 35 | +mkdir -p ~/.hermes/skills/pmxt |
| 36 | +curl -fsSL https://raw.githubusercontent.com/0xharryriddle/hermes-pmxt/main/skill/SKILL.md \ |
| 37 | + -o ~/.hermes/skills/pmxt/SKILL.md |
| 38 | +``` |
| 39 | + |
| 40 | +Si su instalación de Hermes admite la instalación de habilidades/plugins respaldados por GitHub, use: |
| 41 | + |
| 42 | +```text |
| 43 | +https://github.com/0xharryriddle/hermes-pmxt |
| 44 | +``` |
| 45 | + |
| 46 | +### Actualización |
| 47 | + |
| 48 | +```bash |
| 49 | +pip install --upgrade hermes-pmxt |
| 50 | +``` |
| 51 | + |
| 52 | +### Instalación para Desarrollo |
| 53 | + |
| 54 | +Solo clone el repositorio si va a modificar hermes-pmxt: |
| 55 | + |
| 56 | +```bash |
| 57 | +git clone https://github.com/0xharryriddle/hermes-pmxt.git |
| 58 | +cd hermes-pmxt |
| 59 | +python3 -m venv .venv |
| 60 | +source .venv/bin/activate |
| 61 | +pip install -e ".[dev]" |
| 62 | +``` |
| 63 | + |
| 64 | +## Modos |
| 65 | + |
| 66 | +hermes-pmxt admite tres modos de ejecución: |
| 67 | + |
| 68 | +| Modo | Configuración | Comportamiento | |
| 69 | +|------|--------|----------| |
| 70 | +| **Hosted** | Establezca `PMXT_API_KEY` | Se comunica con `https://api.pmxt.dev`. Gestiona las conexiones a los intercambios, el almacenamiento en caché y los límites de tasa automáticamente. Recomendado para la mayoría de los usuarios. | |
| 71 | +| **Custom** | Establezca `PMXT_API_URL` o `PMXT_BASE_URL` | Apunta a cualquier servidor compatible con PMXT. | |
| 72 | +| **Local Sidecar** | Sin clave/URL de API configurada | Asume que el núcleo de PMXT se está ejecutando en `http://localhost:3847`. Para auto-hospedaje / desarrollo. | |
| 73 | + |
| 74 | +Verifique su modo actual: |
| 75 | +```python |
| 76 | +from hermes_pmxt import pmxt_runtime_status |
| 77 | +print(pmxt_runtime_status()) |
| 78 | +``` |
| 79 | + |
| 80 | +## Inicio Rápido |
| 81 | + |
| 82 | +```python |
| 83 | +from hermes_pmxt import pmxt_search, pmxt_quote, pmxt_runtime_status |
| 84 | + |
| 85 | +# Verificar estado |
| 86 | +print(pmxt_runtime_status()) |
| 87 | + |
| 88 | +# Buscar |
| 89 | +result = pmxt_search("bitcoin", exchange="polymarket", limit=5) |
| 90 | +for m in result["data"]: |
| 91 | + prices = m.get("outcomes", []) |
| 92 | + if prices: |
| 93 | + print(f"{m['title'][:60]}: YES={prices[0]['price']*100:.1f}%") |
| 94 | + |
| 95 | +# Cotización |
| 96 | +quote = pmxt_quote("bitcoin reach", exchange="polymarket") |
| 97 | +print(f"YES: {quote['data']['yes_pct']} NO: {quote['data']['no_pct']}") |
| 98 | +``` |
| 99 | + |
| 100 | +## Modelo de Datos |
| 101 | + |
| 102 | +``` |
| 103 | + Evento (tema amplio) |
| 104 | + └── Mercado (pregunta negociable) |
| 105 | + ├── Resultado "Yes" |
| 106 | + └── Resultado "No" |
| 107 | +``` |
| 108 | + |
| 109 | +Cuando los usuarios pregunten sobre un tema, comience con eventos (`pmxt_events`), luego profundice en mercados y resultados. |
| 110 | + |
| 111 | +## Herramientas |
| 112 | + |
| 113 | +### Descubrimiento e Investigación |
| 114 | + |
| 115 | +| Función | Auth | Descripción | |
| 116 | +|----------|------|-------------| |
| 117 | +| `pmxt_search(query, exchange?, limit?, sort?, search_in?, slug?)` | No* | Buscar mercados por palabra clave | |
| 118 | +| `pmxt_events(query, exchange?, limit?, sort?, search_in?, slug?)` | No* | Buscar grupos de eventos | |
| 119 | +| `pmxt_quote(identifier, exchange)` | No* | Obtener probabilidades YES/NO | |
| 120 | +| `pmxt_order_book(outcome_id, exchange, limit?)` | No* | Profundidad del libro de órdenes | |
| 121 | +| `pmxt_ohlcv(outcome_id, exchange, resolution?, limit?)` | No* | Velas de precio | |
| 122 | +| `pmxt_trades(outcome_id, exchange, limit?)` | No* | Operaciones recientes | |
| 123 | +| `pmxt_execution_price(outcome_id, exchange, side, amount)` | No* | Estimación de deslizamiento (slippage) | |
| 124 | + |
| 125 | +### Inter-Plataforma y Arbitraje |
| 126 | + |
| 127 | +| Función | Auth | Descripción | |
| 128 | +|----------|------|-------------| |
| 129 | +| `pmxt_compare_market(query, exchanges?, limit?)` | No* | Comparar precios entre intercambios | |
| 130 | +| `pmxt_arbitrage_scan(query, exchanges?, threshold?)` | No* | Detectar oportunidades de arbitraje | |
| 131 | +| `pmxt_call("compareMarketPrices", "router", ...)` | No* | Comparación nativa del enrutador | |
| 132 | +| `pmxt_call("fetchArbitrage", "router", ...)` | No* | Búsqueda de arbitraje nativa | |
| 133 | +| `pmxt_call("fetchHedges", "router", ...)` | No* | Oportunidades de cobertura (hedging) | |
| 134 | + |
| 135 | +### Portafolio y Cuenta |
| 136 | + |
| 137 | +| Función | Auth | Descripción | |
| 138 | +|----------|------|-------------| |
| 139 | +| `pmxt_balance(exchange)` | Yes | Balance de la cuenta | |
| 140 | +| `pmxt_positions(exchange)` | Yes | Posiciones abiertas | |
| 141 | +| `pmxt_portfolio(exchanges?)` | Yes | Portafolio multi-intercambio | |
| 142 | + |
| 143 | +### Trading (Todas destructivas -- Requieren Confirmación Explícita) |
| 144 | + |
| 145 | +| Función | Auth | Descripción | |
| 146 | +|----------|------|-------------| |
| 147 | +| `pmxt_build_order(...)` | Yes | Construir/firmar orden sin enviarla (SEGURO) | |
| 148 | +| `pmxt_submit_order(built, exchange, confirmed=True)` | Yes | Enviar una orden pre-construida | |
| 149 | +| `pmxt_cancel_order(order_id, exchange, confirmed=True)` | Yes | Cancelar una orden abierta | |
| 150 | +| `pmxt_order(...)` | Yes | Orden heredada de un solo paso (se prefiere build+submit) | |
| 151 | + |
| 152 | +### Llamada Genérica a la API |
| 153 | + |
| 154 | +| Función | Auth | Descripción | |
| 155 | +|----------|------|-------------| |
| 156 | +| `pmxt_call(method, exchange, ...)` | Varía | Llamada genérica a la API de PMXT con comprobaciones de seguridad | |
| 157 | + |
| 158 | +### Servidor y Diagnósticos |
| 159 | + |
| 160 | +| Función | Auth | Descripción | |
| 161 | +|----------|------|-------------| |
| 162 | +| `pmxt_runtime_status()` | No | Estado completo del tiempo de ejecución | |
| 163 | +| `pmxt_list_exchanges()` | No | Intercambios conocidos/disponibles | |
| 164 | +| `pmxt_server_status()` | No | Diagnósticos del sidecar | |
| 165 | +| `pmxt_server_start()` | No | Iniciar sidecar | |
| 166 | +| `pmxt_server_stop()` | No | Detener sidecar | |
| 167 | + |
| 168 | +\* Las herramientas de solo lectura funcionan sin credenciales en el modo sidecar local. El modo Hosted requiere `PMXT_API_KEY` para todas las operaciones. |
| 169 | + |
| 170 | +## Seguridad en el Trading |
| 171 | + |
| 172 | +**Las operaciones destructivas (crear, enviar, cancelar órdenes) requieren la confirmación explícita del usuario.** |
| 173 | + |
| 174 | +```python |
| 175 | +# SEGURO: Construir orden para previsualización (NO coloca ninguna orden) |
| 176 | +built = pmxt_build_order( |
| 177 | + market_id="market-uuid", |
| 178 | + outcome="yes", |
| 179 | + side="buy", |
| 180 | + order_type="limit", |
| 181 | + amount=10, |
| 182 | + price=0.55, |
| 183 | + exchange="polymarket", |
| 184 | +) |
| 185 | + |
| 186 | +# DESTRUCTIVO: El envío requiere confirmed=True |
| 187 | +result = pmxt_submit_order(built, "polymarket", confirmed=True) |
| 188 | + |
| 189 | +# Sin confirmed=True: |
| 190 | +result = pmxt_submit_order(built, "polymarket") |
| 191 | +# => {"success": False, "error": "Operation 'submit_order' is destructive..."} |
| 192 | +``` |
| 193 | + |
| 194 | +## Intercambios Compatibles |
| 195 | + |
| 196 | +hermes-pmxt conoce 17 plataformas, incluyendo: |
| 197 | + |
| 198 | +- `polymarket` / `polymarket_us` |
| 199 | +- `kalshi` / `kalshi-demo` |
| 200 | +- `limitless` |
| 201 | +- `probable` / `baozi` / `myriad` / `opinion` |
| 202 | +- `metaculus` / `smarkets` |
| 203 | +- `gemini-titan` / `hyperliquid` / `suibets` / `rain` |
| 204 | +- `mock` / `router` |
| 205 | + |
| 206 | +La disponibilidad real depende de la versión de `pmxt` instalada. Ejecute `pmxt_list_exchanges()` para verificarlo. |
| 207 | + |
| 208 | +## Variables de Entorno |
| 209 | + |
| 210 | +```bash |
| 211 | +# Modo Hosted (recomendado) |
| 212 | +export PMXT_API_KEY="pmxt_live_..." |
| 213 | +export PMXT_WALLET_ADDRESS="0x..." |
| 214 | +export PMXT_PRIVATE_KEY="0x..." |
| 215 | + |
| 216 | +# Servidor personalizado |
| 217 | +export PMXT_API_URL="https://your-server.com" |
| 218 | +# o |
| 219 | +export PMXT_BASE_URL="https://your-server.com" |
| 220 | + |
| 221 | +# Específicos de la plataforma (modo auto-hospedado) |
| 222 | +export POLYMARKET_PRIVATE_KEY="0x..." |
| 223 | +export POLYMARKET_PROXY_ADDRESS="0x..." # Opcional |
| 224 | +export KALSHI_API_KEY="..." |
| 225 | +export KALSHI_PRIVATE_KEY="..." |
| 226 | +export LIMITLESS_API_KEY="..." |
| 227 | +export LIMITLESS_PRIVATE_KEY="..." |
| 228 | +export POLYMARKET_US_API_KEY="..." |
| 229 | +export POLYMARKET_US_PRIVATE_KEY="..." |
| 230 | +``` |
| 231 | + |
| 232 | +## Estructura del Proyecto |
| 233 | + |
| 234 | +``` |
| 235 | +hermes-pmxt/ |
| 236 | +├── hermes_pmxt/ |
| 237 | +│ ├── __init__.py # Exportaciones de la API pública |
| 238 | +│ ├── config.py # Configuración de ejecución y detección de modo |
| 239 | +│ ├── exchanges.py # Inicialización + normalización de intercambios |
| 240 | +│ ├── registry.py # Registro de herramientas con anotaciones de seguridad |
| 241 | +│ ├── shaper.py # Moldeado de resultados para el contexto del LLM |
| 242 | +│ └── tools.py # Funciones principales de las herramientas |
| 243 | +├── skill/ |
| 244 | +│ └── SKILL.md # Instrucciones de la habilidad del agente Hermes |
| 245 | +├── examples/ |
| 246 | +│ └── demo.py # Demo interactiva |
| 247 | +├── tests/ |
| 248 | +│ ├── conftest.py # Configuración de rutas de prueba |
| 249 | +│ ├── test_exchanges.py # Pruebas unitarias de conexión de intercambios |
| 250 | +│ └── test_tools.py # Pruebas unitarias + de integración |
| 251 | +├── pyproject.toml |
| 252 | +└── README.md |
| 253 | +``` |
| 254 | + |
| 255 | +## Pruebas |
| 256 | + |
| 257 | +```bash |
| 258 | +# Pruebas unitarias (no requiere pmxt) |
| 259 | +python3 -m pytest -q -m unit |
| 260 | + |
| 261 | +# Todas las pruebas no destructivas |
| 262 | +python3 -m pytest -q -m "not trading" |
| 263 | + |
| 264 | +# Pruebas de integración (requiere pmxt + sidecar/API) |
| 265 | +python3 -m pytest -q -m integration |
| 266 | +``` |
| 267 | + |
| 268 | +## Licencia |
| 269 | + |
| 270 | +MIT |
0 commit comments