MITM proxy debugger & loop detector for AI Agents
Intercept every prompt. Catch every loop. Replay any step.
PromptShark 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.
One line to integrate. Zero code changes to your agent.
Just swapbase_url
→http://localhost:8080/v1
| Every API call flows through PromptShark. View structured request/response pairs, collapse raw JSON payloads, and track token usage with per-step | A 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. | | Click on any past step, edit the JSON payload in the built-in editor, preview your changes with an | Dark-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. |
| Category | Feature | Details |
|---|---|---|
| Proxy | ||
| Drop-in integration | Change one URL, keep your existing OpenAI SDK | |
| Proxy | ||
| Streaming + non-streaming | Full support for stream: true and stream: false |
|
| Proxy | ||
| Token tracking | Per-step prompt_tokens / completion_tokens split |
|
| Proxy | ||
| USD Cost Tracker | Real-time per-step and per-session cost in dollars | |
| Proxy | ||
| Latency measurement | Time-to-first-token (TTFT) displayed on each step | |
| Detection | ||
| C++ Loop Detector | IPC-connected engine with configurable threshold | |
| Detection | ||
| Configurable sensitivity | loop_config.txt — threshold & argument-ignoring |
|
| Debug | ||
| Time-Travel Replay | Edit & re-run from any step using cached responses | |
| Debug | ||
| Interactive Diff View | Side-by-side diff of original vs. edited payload | |
| Debug | ||
| Raw JSON Viewer | Collapsible request/response payloads per step | |
| Testing | ||
| Chaos Mode | Toggle to inject fake 429 Rate Limit errors from UI | |
| UI | ||
| Real-time WebSockets | Tokens stream live into the dashboard | |
| UI | ||
| Session search & filter | Instant full-text search across all steps | |
| UI | ||
| Auto-switching sessions | Dashboard follows the active agent run | |
| Export | ||
| Markdown reports | One-click export of entire debug sessions | |
| Export | ||
| Session management | Create, switch, and delete sessions from sidebar |
There are three ways to run PromptShark:
docker-compose up -d
Download the latest .zip
or .tar.gz
for your OS (Windows, macOS, Linux) from the GitHub Releases page. Extract and run agent_supervisor
(or agent_supervisor.exe
).
1 · Build the C++ Core
mkdir -p build && cd build
cmake .. && make
2 · Run the Proxy
cd proxy
go build -o ../build/agent_supervisor .
../build/agent_supervisor
You will see:
____ __ _____ __ __
/ __ \_________ ____ ___ / /_/ ___// /_ ____ ______/ /__
/ /_/ / ___/ __ \/ __ '__ \/ __ \__ \/ __ \/ __ '/ ___/ //_/
/ ____/ / / /_/ / / / / / / /_/ /__/ / / / / /_/ / / / ,<
/_/ /_/ \____/_/ /_/ /_/ .___/____/_/ /_/\__,_/_/ /_/|_|
/_/
──────────────────────────────────────────────────
🦈 Version : 0.1.0
🌐 Dashboard : http://localhost:8080
📦 Database : ../db/promptshark.db
🎯 Target API : https://api.openai.com
🔗 Proxy URL : http://localhost:8080/v1
──────────────────────────────────────────────────
Point your OpenAI SDK base_url to the Proxy URL above.
Press Ctrl+C to stop.
Open ** http://localhost:8080** — the dashboard is ready.
Python
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8080/v1",
api_key="sk-..." # forwarded transparently to OpenAI
)
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Hello!"}],
stream=True
)
Node.js
const OpenAI = require("openai");
const client = new OpenAI({
baseURL: "http://localhost:8080/v1",
apiKey: "sk-..."
});
const stream = await client.chat.completions.create({
model: "gpt-4o",
messages: [{ role: "user", content: "Hello!" }],
stream: true,
});
Edit loop_config.txt
in the project root:
THRESHOLD=3
IGNORE_ARGS=false
| Parameter | Default | Effect |
|---|---|---|
THRESHOLD |
||
3 |
||
| Number of identical consecutive tool calls that trigger a loop alarm | ||
IGNORE_ARGS |
||
false |
||
When true , only function names are compared (arguments are stripped) |
| Flag | Default | Description |
|---|---|---|
--port |
||
8080 |
||
| HTTP server port | ||
--db |
||
../db/promptshark.db |
||
| Path to SQLite database file | ||
--schema |
||
../db/schema.sql |
||
| Path to schema.sql file | ||
--target |
||
https://api.openai.com |
||
| Upstream LLM API URL |
Environment variables PORT
and DB_PATH
are also supported (flags take priority).
The server handles graceful shutdown: press Ctrl+C
and it will finish in-flight requests, close the database, and exit cleanly.
| Layer | Technology | Role |
|---|---|---|
| Proxy Server | Go 1.22+ | |
| HTTP reverse proxy, WebSocket hub, REST API, CLI | ||
| Loop Engine | C++ 17 | |
| Real-time tool-call hashing & pattern detection via stdin/stdout IPC | ||
| Storage | SQLite (WAL) | |
| Embedded session & step persistence, zero-config | ||
| Dashboard | HTML + Tailwind + JS | |
Single-file embedded UI served by Go via go:embed |
||
| Diff Engine | jsdiff | |
| Client-side line-by-line diff rendering for Time-Travel |
- Configurable loop rules via YAML (regex patterns, token budgets)
- Ollama / Anthropic Claude API support
- Multi-agent message flow visualizer (network graph)
PromptShark — это прозрачный локальный прокси, который встает между вашим ИИ-агентом и API OpenAI. Он перехватывает, логирует и визуализирует каждую пару запрос/ответ в красивом дашборде в реальном времени — и автоматически обнаруживает, если агент попал в бесконечный цикл вызова инструментов.
Одна строка для интеграции. Ноль изменений в коде агента.
Просто заменитеbase_url
→http://localhost:8080/v1
| Каждый API-вызов проходит через PromptShark. Смотрите структурированные пары запрос/ответ, раскрывайте сырой JSON и отслеживайте использование токенов с разбивкой | Выделенное C++ ядро работает через IPC параллельно с Go прокси. Оно хэширует каждый вызов инструмента и мгновенно фиксирует повторяющиеся паттерны — до того, как они сожгут ваш бюджет API. | | Кликните на любой предыдущий шаг, отредактируйте JSON в встроенном редакторе, проверьте изменения в | Темная тема с эффектом стекла, стриминг по WebSocket, авто-переключение между сессиями, мгновенный поиск по шагам, экспорт в Markdown и управление сессиями — всё в одном встроенном HTML-файле. |
| Категория | Функция | Подробности |
|---|---|---|
| Прокси | ||
| Drop-in интеграция | Измените один URL, оставьте текущий OpenAI SDK | |
| Прокси | ||
| Стриминг + обычные запросы | Полная поддержка stream: true и stream: false |
|
| Прокси | ||
| Трекинг токенов | Разбивка prompt_tokens / completion_tokens на каждый шаг |
|
| Прокси | ||
| Калькулятор стоимости | Цена каждого шага и всей сессии в долларах в реальном времени | |
| Прокси | ||
| Замер задержки | Время ответа API (TTFT) на каждом шаге | |
| Детекция | ||
| C++ Loop Detector | Движок через IPC с настраиваемым порогом | |
| Детекция | ||
| Гибкая настройка | loop_config.txt — порог срабатывания и игнорирование аргументов |
|
| Отладка | ||
| Time-Travel Replay | Редактируй и перезапускай с любого шага через кэш | |
| Отладка | ||
| Интерактивный Diff | Визуальное сравнение оригинала и отредактированного промпта | |
| Отладка | ||
| Raw JSON Viewer | Сворачиваемые JSON запроса/ответа для каждого шага | |
| Тестирование | ||
| Chaos Mode | Тумблер для инъекции фейковых 429 Rate Limit ошибок из UI | |
| UI | ||
| WebSocket реалтайм | Токены стримятся в дашборд в реальном времени | |
| UI | ||
| Поиск и фильтрация | Мгновенный полнотекстовый поиск по всем шагам | |
| UI | ||
| Авто-переключение | Дашборд следует за активным запуском агента | |
| Экспорт | ||
| Markdown отчёты | Экспорт всей сессии одним кликом | |
| Экспорт | ||
| Управление сессиями | Создание, переключение и удаление из сайдбара |
Есть три способа запустить PromptShark:
docker-compose up -d
Скачайте актуальный .zip
или .tar.gz
для вашей ОС (Windows, macOS, Linux) со страницы GitHub Releases. Распакуйте и запустите agent_supervisor
(или agent_supervisor.exe
).
1 · Сборка C++ ядра
mkdir -p build && cd build
cmake .. && make
2 · Запуск прокси
cd proxy
go build -o ../build/agent_supervisor .
../build/agent_supervisor
Вы увидите:
____ __ _____ __ __
/ __ \_________ ____ ___ / /_/ ___// /_ ____ ______/ /__
/ /_/ / ___/ __ \/ __ '__ \/ __ \__ \/ __ \/ __ '/ ___/ //_/
/ ____/ / / /_/ / / / / / / /_/ /__/ / / / / /_/ / / / ,<
/_/ /_/ \____/_/ /_/ /_/ .___/____/_/ /_/\__,_/_/ /_/|_|
/_/
──────────────────────────────────────────────────
🦈 Version : 0.1.0
🌐 Dashboard : http://localhost:8080
📦 Database : ../db/promptshark.db
🎯 Target API : https://api.openai.com
🔗 Proxy URL : http://localhost:8080/v1
──────────────────────────────────────────────────
Point your OpenAI SDK base_url to the Proxy URL above.
Press Ctrl+C to stop.
Откройте ** http://localhost:8080** — дашборд готов к работе.
Python
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8080/v1",
api_key="sk-..." # прозрачно перенаправляется в OpenAI
)
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Привет!"}],
stream=True
)
Node.js
const OpenAI = require("openai");
const client = new OpenAI({
baseURL: "http://localhost:8080/v1",
apiKey: "sk-..."
});
const stream = await client.chat.completions.create({
model: "gpt-4o",
messages: [{ role: "user", content: "Привет!" }],
stream: true,
});
Отредактируйте loop_config.txt
в корне проекта:
THRESHOLD=3
IGNORE_ARGS=false
| Параметр | По умолчанию | Эффект |
|---|---|---|
THRESHOLD |
||
3 |
||
| Сколько одинаковых последовательных вызовов считать зацикливанием | ||
IGNORE_ARGS |
||
false |
||
Если true , сравниваются только имена функций (аргументы игнорируются) |
| Флаг | По умолчанию | Описание |
|---|---|---|
--port |
||
8080 |
||
| Порт HTTP-сервера | ||
--db |
||
../db/promptshark.db |
||
| Путь к файлу базы данных SQLite | ||
--schema |
||
../db/schema.sql |
||
| Путь к файлу схемы | ||
--target |
||
https://api.openai.com |
||
| URL upstream LLM API |
Также поддерживаются переменные окружения PORT
и DB_PATH
(флаги имеют приоритет).
Сервер поддерживает Graceful Shutdown: нажмите Ctrl+C
, и он корректно завершит текущие запросы, закроет базу данных и выведет ✅ Goodbye!
.
| Слой | Технология | Роль |
|---|---|---|
| Proxy Server | Go 1.22+ | |
| HTTP reverse proxy, WebSocket хаб, REST API, CLI | ||
| Loop Engine | C++ 17 | |
| Хэширование и детекция паттернов через stdin/stdout IPC | ||
| Хранилище | SQLite (WAL) | |
| Встроенная база сессий и шагов, без настройки | ||
| Дашборд | HTML + Tailwind + JS | |
Единый встроенный UI через go:embed |
||
| Diff Engine | jsdiff | |
| Клиентский построчный diff для Time-Travel |
- Конфигурация правил детектора через YAML (regex паттерны, бюджеты токенов)
- Поддержка Ollama / Anthropic Claude API
- Визуализатор потоков мультиагентных систем (граф сети)
MIT License — use it, fork it, ship it.