{"slug": "show-hn-promptshark-mitm-proxy-c-loop-detector-and-replay-for-ai-agents", "title": "Show HN: PromptShark – MitM proxy, C++ loop detector and replay for AI agents", "summary": "PromptShark, a transparent local proxy for AI agents, was released on Hacker News. The tool intercepts API calls between agents and OpenAI, detects infinite loops with a C++ engine, and enables replay of past steps. It requires no code changes and offers a real-time dashboard for debugging.", "body_md": "**MITM proxy debugger & loop detector for AI Agents**\n\n*Intercept every prompt. Catch every loop. Replay any step.*\n\nPromptShark is a **transparent local proxy** that sits between your AI agent and the OpenAI API. It captures, logs, and visualizes every single request/response pair in a beautiful real-time dashboard — and automatically detects when your agent gets stuck in an infinite tool-calling loop.\n\nOne line to integrate. Zero code changes to your agent.\n\nJust swap`base_url`\n\n→`http://localhost:8080/v1`\n\n|\nEvery API call flows through PromptShark. View structured request/response pairs, collapse raw JSON payloads, and track token usage with per-step |\nA dedicated C++ engine runs via IPC alongside the Go proxy. It hashes every tool call and flags repeating patterns instantly — before they burn through your API balance. |\n|\nClick on any past step, edit the JSON payload in the built-in editor, preview your changes with an |\nDark-themed glassmorphism UI with WebSocket-powered live streaming. Auto-switching sessions, instant step search, Markdown export, and session management — all in a single embedded HTML page. |\n\n| Category | Feature | Details |\n|---|---|---|\nProxy |\nDrop-in integration | Change one URL, keep your existing OpenAI SDK |\nProxy |\nStreaming + non-streaming | Full support for `stream: true` and `stream: false` |\nProxy |\nToken tracking | Per-step `prompt_tokens` / `completion_tokens` split |\nProxy |\nUSD Cost Tracker | Real-time per-step and per-session cost in dollars |\nProxy |\nLatency measurement | Time-to-first-token (TTFT) displayed on each step |\nDetection |\nC++ Loop Detector | IPC-connected engine with configurable threshold |\nDetection |\nConfigurable sensitivity | `loop_config.txt` — threshold & argument-ignoring |\nDebug |\nTime-Travel Replay | Edit & re-run from any step using cached responses |\nDebug |\nInteractive Diff View | Side-by-side diff of original vs. edited payload |\nDebug |\nRaw JSON Viewer | Collapsible request/response payloads per step |\nTesting |\nChaos Mode | Toggle to inject fake 429 Rate Limit errors from UI |\nUI |\nReal-time WebSockets | Tokens stream live into the dashboard |\nUI |\nSession search & filter | Instant full-text search across all steps |\nUI |\nAuto-switching sessions | Dashboard follows the active agent run |\nExport |\nMarkdown reports | One-click export of entire debug sessions |\nExport |\nSession management | Create, switch, and delete sessions from sidebar |\n\nThere are three ways to run PromptShark:\n\n```\ndocker-compose up -d\n```\n\nDownload the latest `.zip`\n\nor `.tar.gz`\n\nfor your OS (Windows, macOS, Linux) from the [GitHub Releases](/apvcode/PromptShark/releases) page. Extract and run `agent_supervisor`\n\n(or `agent_supervisor.exe`\n\n).\n\n**1 · Build the C++ Core**\n\n```\nmkdir -p build && cd build\ncmake .. && make\n```\n\n**2 · Run the Proxy**\n\n```\ncd proxy\ngo build -o ../build/agent_supervisor .\n../build/agent_supervisor\n```\n\nYou will see:\n\n```\n    ____                       __  _____ __               __  \n   / __ \\_________  ____ ___  / /_/ ___// /_  ____ ______/ /__\n  / /_/ / ___/ __ \\/ __ '__ \\/ __ \\__ \\/ __ \\/ __ '/ ___/ //_/\n / ____/ /  / /_/ / / / / / / /_/ /__/ / / / / /_/ / /  / ,<   \n/_/   /_/   \\____/_/ /_/ /_/ .___/____/_/ /_/\\__,_/_/  /_/|_|  \n                          /_/                                   \n  ──────────────────────────────────────────────────\n  🦈 Version     : 0.1.0\n  🌐 Dashboard   : http://localhost:8080\n  📦 Database    : ../db/promptshark.db\n  🎯 Target API  : https://api.openai.com\n  🔗 Proxy URL   : http://localhost:8080/v1\n  ──────────────────────────────────────────────────\n\n  Point your OpenAI SDK base_url to the Proxy URL above.\n  Press Ctrl+C to stop.\n```\n\nOpen ** http://localhost:8080** — the dashboard is ready.\n\n**Python**\n\n``` python\nfrom openai import OpenAI\n\nclient = OpenAI(\n    base_url=\"http://localhost:8080/v1\",\n    api_key=\"sk-...\"  # forwarded transparently to OpenAI\n)\n\nresponse = client.chat.completions.create(\n    model=\"gpt-4o\",\n    messages=[{\"role\": \"user\", \"content\": \"Hello!\"}],\n    stream=True\n)\n```\n\n**Node.js**\n\n``` js\nconst OpenAI = require(\"openai\");\nconst client = new OpenAI({\n  baseURL: \"http://localhost:8080/v1\",\n  apiKey: \"sk-...\"\n});\n\nconst stream = await client.chat.completions.create({\n  model: \"gpt-4o\",\n  messages: [{ role: \"user\", content: \"Hello!\" }],\n  stream: true,\n});\n```\n\nEdit `loop_config.txt`\n\nin the project root:\n\n```\n# Consecutive identical calls before triggering alert\nTHRESHOLD=3\n\n# Ignore arguments — match function name only\nIGNORE_ARGS=false\n```\n\n| Parameter | Default | Effect |\n|---|---|---|\n`THRESHOLD` |\n`3` |\nNumber of identical consecutive tool calls that trigger a loop alarm |\n`IGNORE_ARGS` |\n`false` |\nWhen `true` , only function names are compared (arguments are stripped) |\n\n| Flag | Default | Description |\n|---|---|---|\n`--port` |\n`8080` |\nHTTP server port |\n`--db` |\n`../db/promptshark.db` |\nPath to SQLite database file |\n`--schema` |\n`../db/schema.sql` |\nPath to schema.sql file |\n`--target` |\n`https://api.openai.com` |\nUpstream LLM API URL |\n\nEnvironment variables `PORT`\n\nand `DB_PATH`\n\nare also supported (flags take priority).\n\nThe server handles **graceful shutdown**: press `Ctrl+C`\n\nand it will finish in-flight requests, close the database, and exit cleanly.\n\n| Layer | Technology | Role |\n|---|---|---|\n| Proxy Server | Go 1.22+ |\nHTTP reverse proxy, WebSocket hub, REST API, CLI |\n| Loop Engine | C++ 17 |\nReal-time tool-call hashing & pattern detection via stdin/stdout IPC |\n| Storage | SQLite (WAL) |\nEmbedded session & step persistence, zero-config |\n| Dashboard | HTML + Tailwind + JS |\nSingle-file embedded UI served by Go via `go:embed` |\n| Diff Engine | jsdiff |\nClient-side line-by-line diff rendering for Time-Travel |\n\n- Configurable loop rules via YAML (regex patterns, token budgets)\n- Ollama / Anthropic Claude API support\n- Multi-agent message flow visualizer (network graph)\n\nPromptShark — это **прозрачный локальный прокси**, который встает между вашим ИИ-агентом и API OpenAI. Он перехватывает, логирует и визуализирует каждую пару запрос/ответ в красивом дашборде в реальном времени — и автоматически обнаруживает, если агент попал в бесконечный цикл вызова инструментов.\n\nОдна строка для интеграции. Ноль изменений в коде агента.\n\nПросто замените`base_url`\n\n→`http://localhost:8080/v1`\n\n|\nКаждый API-вызов проходит через PromptShark. Смотрите структурированные пары запрос/ответ, раскрывайте сырой JSON и отслеживайте использование токенов с разбивкой |\nВыделенное C++ ядро работает через IPC параллельно с Go прокси. Оно хэширует каждый вызов инструмента и мгновенно фиксирует повторяющиеся паттерны — до того, как они сожгут ваш бюджет API. |\n|\nКликните на любой предыдущий шаг, отредактируйте JSON в встроенном редакторе, проверьте изменения в |\nТемная тема с эффектом стекла, стриминг по WebSocket, авто-переключение между сессиями, мгновенный поиск по шагам, экспорт в Markdown и управление сессиями — всё в одном встроенном HTML-файле. |\n\n| Категория | Функция | Подробности |\n|---|---|---|\nПрокси |\nDrop-in интеграция | Измените один URL, оставьте текущий OpenAI SDK |\nПрокси |\nСтриминг + обычные запросы | Полная поддержка `stream: true` и `stream: false` |\nПрокси |\nТрекинг токенов | Разбивка `prompt_tokens` / `completion_tokens` на каждый шаг |\nПрокси |\nКалькулятор стоимости | Цена каждого шага и всей сессии в долларах в реальном времени |\nПрокси |\nЗамер задержки | Время ответа API (TTFT) на каждом шаге |\nДетекция |\nC++ Loop Detector | Движок через IPC с настраиваемым порогом |\nДетекция |\nГибкая настройка | `loop_config.txt` — порог срабатывания и игнорирование аргументов |\nОтладка |\nTime-Travel Replay | Редактируй и перезапускай с любого шага через кэш |\nОтладка |\nИнтерактивный Diff | Визуальное сравнение оригинала и отредактированного промпта |\nОтладка |\nRaw JSON Viewer | Сворачиваемые JSON запроса/ответа для каждого шага |\nТестирование |\nChaos Mode | Тумблер для инъекции фейковых 429 Rate Limit ошибок из UI |\nUI |\nWebSocket реалтайм | Токены стримятся в дашборд в реальном времени |\nUI |\nПоиск и фильтрация | Мгновенный полнотекстовый поиск по всем шагам |\nUI |\nАвто-переключение | Дашборд следует за активным запуском агента |\nЭкспорт |\nMarkdown отчёты | Экспорт всей сессии одним кликом |\nЭкспорт |\nУправление сессиями | Создание, переключение и удаление из сайдбара |\n\nЕсть три способа запустить PromptShark:\n\n```\ndocker-compose up -d\n```\n\nСкачайте актуальный `.zip`\n\nили `.tar.gz`\n\nдля вашей ОС (Windows, macOS, Linux) со страницы [GitHub Releases](/apvcode/PromptShark/releases). Распакуйте и запустите `agent_supervisor`\n\n(или `agent_supervisor.exe`\n\n).\n\n**1 · Сборка C++ ядра**\n\n```\nmkdir -p build && cd build\ncmake .. && make\n```\n\n**2 · Запуск прокси**\n\n```\ncd proxy\ngo build -o ../build/agent_supervisor .\n../build/agent_supervisor\n```\n\nВы увидите:\n\n```\n    ____                       __  _____ __               __  \n   / __ \\_________  ____ ___  / /_/ ___// /_  ____ ______/ /__\n  / /_/ / ___/ __ \\/ __ '__ \\/ __ \\__ \\/ __ \\/ __ '/ ___/ //_/\n / ____/ /  / /_/ / / / / / / /_/ /__/ / / / / /_/ / /  / ,<   \n/_/   /_/   \\____/_/ /_/ /_/ .___/____/_/ /_/\\__,_/_/  /_/|_|  \n                          /_/                                   \n  ──────────────────────────────────────────────────\n  🦈 Version     : 0.1.0\n  🌐 Dashboard   : http://localhost:8080\n  📦 Database    : ../db/promptshark.db\n  🎯 Target API  : https://api.openai.com\n  🔗 Proxy URL   : http://localhost:8080/v1\n  ──────────────────────────────────────────────────\n\n  Point your OpenAI SDK base_url to the Proxy URL above.\n  Press Ctrl+C to stop.\n```\n\nОткройте ** http://localhost:8080** — дашборд готов к работе.\n\n**Python**\n\n``` python\nfrom openai import OpenAI\n\nclient = OpenAI(\n    base_url=\"http://localhost:8080/v1\",\n    api_key=\"sk-...\"  # прозрачно перенаправляется в OpenAI\n)\n\nresponse = client.chat.completions.create(\n    model=\"gpt-4o\",\n    messages=[{\"role\": \"user\", \"content\": \"Привет!\"}],\n    stream=True\n)\n```\n\n**Node.js**\n\n``` js\nconst OpenAI = require(\"openai\");\nconst client = new OpenAI({\n  baseURL: \"http://localhost:8080/v1\",\n  apiKey: \"sk-...\"\n});\n\nconst stream = await client.chat.completions.create({\n  model: \"gpt-4o\",\n  messages: [{ role: \"user\", content: \"Привет!\" }],\n  stream: true,\n});\n```\n\nОтредактируйте `loop_config.txt`\n\nв корне проекта:\n\n```\n# Количество идентичных вызовов подряд до срабатывания тревоги\nTHRESHOLD=3\n\n# Игнорировать аргументы — сравнивать только имя функции\nIGNORE_ARGS=false\n```\n\n| Параметр | По умолчанию | Эффект |\n|---|---|---|\n`THRESHOLD` |\n`3` |\nСколько одинаковых последовательных вызовов считать зацикливанием |\n`IGNORE_ARGS` |\n`false` |\nЕсли `true` , сравниваются только имена функций (аргументы игнорируются) |\n\n| Флаг | По умолчанию | Описание |\n|---|---|---|\n`--port` |\n`8080` |\nПорт HTTP-сервера |\n`--db` |\n`../db/promptshark.db` |\nПуть к файлу базы данных SQLite |\n`--schema` |\n`../db/schema.sql` |\nПуть к файлу схемы |\n`--target` |\n`https://api.openai.com` |\nURL upstream LLM API |\n\nТакже поддерживаются переменные окружения `PORT`\n\nи `DB_PATH`\n\n(флаги имеют приоритет).\n\nСервер поддерживает **Graceful Shutdown**: нажмите `Ctrl+C`\n\n, и он корректно завершит текущие запросы, закроет базу данных и выведет `✅ Goodbye!`\n\n.\n\n| Слой | Технология | Роль |\n|---|---|---|\n| Proxy Server | Go 1.22+ |\nHTTP reverse proxy, WebSocket хаб, REST API, CLI |\n| Loop Engine | C++ 17 |\nХэширование и детекция паттернов через stdin/stdout IPC |\n| Хранилище | SQLite (WAL) |\nВстроенная база сессий и шагов, без настройки |\n| Дашборд | HTML + Tailwind + JS |\nЕдиный встроенный UI через `go:embed` |\n| Diff Engine | jsdiff |\nКлиентский построчный diff для Time-Travel |\n\n- Конфигурация правил детектора через YAML (regex паттерны, бюджеты токенов)\n- Поддержка Ollama / Anthropic Claude API\n- Визуализатор потоков мультиагентных систем (граф сети)\n\n[MIT License](LICENSE) — use it, fork it, ship it.", "url": "https://wpnews.pro/news/show-hn-promptshark-mitm-proxy-c-loop-detector-and-replay-for-ai-agents", "canonical_source": "https://github.com/apvcode/PromptShark", "published_at": "2026-06-16 21:56:26+00:00", "updated_at": "2026-06-16 22:31:10.441311+00:00", "lang": "en", "topics": ["ai-agents", "developer-tools", "ai-tools", "ai-infrastructure"], "entities": ["PromptShark", "OpenAI", "GitHub"], "alternates": {"html": "https://wpnews.pro/news/show-hn-promptshark-mitm-proxy-c-loop-detector-and-replay-for-ai-agents", "markdown": "https://wpnews.pro/news/show-hn-promptshark-mitm-proxy-c-loop-detector-and-replay-for-ai-agents.md", "text": "https://wpnews.pro/news/show-hn-promptshark-mitm-proxy-c-loop-detector-and-replay-for-ai-agents.txt", "jsonld": "https://wpnews.pro/news/show-hn-promptshark-mitm-proxy-c-loop-detector-and-replay-for-ai-agents.jsonld"}}