Skip to content

(feat) improve agent mode, fix minor issues, adapt multi server management#32

Merged
rapcmia merged 34 commits intomainfrom
feat/add_tui
Mar 9, 2026
Merged

(feat) improve agent mode, fix minor issues, adapt multi server management#32
rapcmia merged 34 commits intomainfrom
feat/add_tui

Conversation

@cardosofede
Copy link
Copy Markdown
Contributor

@cardosofede cardosofede commented Feb 18, 2026

Condor Bot - Feature Summary & QA Test Plan

What Was Built

Condor is a Telegram bot for monitoring and trading with Hummingbot via the Backend API. It provides portfolio tracking, bot monitoring, CEX/DEX trading, and configuration management through an interactive Telegram interface.


Feature Summary

1. User Registration & Access Control

  • New users auto-registered as Pending when they send /start
  • Admin gets notified of new pending users
  • Admin can Approve / Reject / Block / Unblock users via /admin
  • Role-based: Admin, User, Pending, Blocked
  • Server-level RBAC: Owner, Trader, Viewer permissions
  • Audit log (capped at 500 entries) tracks security events

2. Server Management (/servers)

  • Add / Edit / Delete Hummingbot API servers (host, port, credentials)
  • Share servers with other users at Owner / Trader / Viewer level
  • Revoke shared access
  • Auto-set default server if only 1 exists
  • Per-chat default server selection

3. API Keys (/keys)

  • Configure exchange API credentials (Binance, Bybit, Hyperliquid, etc.)
  • Per-connector key management through Backend API

4. Gateway Deployment & Config (/gateway)

  • Start / Stop / Restart Gateway Docker container
  • View Gateway logs
  • Custom Docker image support
  • Wallets: Add/delete blockchain wallets (Solana, Ethereum) via private key
  • Connectors: Configure DEX connectors (Meteora, Raydium, Uniswap, Jupiter, etc.)
  • Networks: Per-chain network configuration
  • Pools: Add/manage liquidity pools
  • Tokens: Add/delete tokens per network

5. Portfolio Dashboard (/portfolio)

  • Fetches balances across all connected CEX/DEX exchanges
  • Total portfolio value with per-account/connector breakdown
  • Drill-down into individual connector token balances (% of total)
  • Gateway network filtering by user preference
  • Refresh button to force exchange cache bypass

6. CEX Trading (/trade)

  • Spot: Market & Limit Buy/Sell orders on any CEX connector
  • Perpetuals: Leverage setting (1-125x), position mode (HEDGE / ONE-WAY), open/close positions
  • Order book snapshot display (bid/ask spread)
  • Order history search: ALL / FILLED / CANCELLED with pagination
  • Cancel individual orders with confirmation
  • Open positions viewer with close action
  • Remembers last-used parameters (connector, pair, side, amount)

7. DEX Swaps (/swap)

  • Quote + Execute via Jupiter (Solana), Uniswap/0x (EVM)
  • Swap history: Paginated with status/date filters

8. DEX Liquidity (/lp)

  • View LP positions: Active CLMM positions across Meteora, Raydium, Uniswap V3
  • Add LP Position: Select pool -> price range -> token amounts -> open
  • Close LP Position: With confirmation
  • Collect Fees: From CLMM positions
  • LP History: Closed positions with PnL
  • Pool Explorer: GeckoTerminal integration with OHLCV candlestick charts
  • Visualizations: Plotly-based liquidity distribution and candlestick charts (sent as images)

9. Unified Trade (/trade)

  • Routes to CEX or DEX based on user's last-used connector
  • Connector selector on first use showing CEX + DEX networks from portfolio
  • Remembers preference across sessions

10. Bot Management (/bots, /new_bot)

  • Active Bots: List with status, PnL, volume; per-bot detail drill-down
  • Controller management: Start/stop individual controllers, edit config fields inline
  • Controller Config Wizards: Grid Strike, PMM Mister, PMM V1 (step-by-step flows)
  • Deploy flow: Multi-select configs -> instance name -> credentials -> image -> confirm
  • Custom config upload (JSON file)
  • Clone / Delete configs
  • Archived Bots: Browse archived databases, performance charts (equity curve, OHLCV), text reports
  • Bot Logs: Per-bot log viewer

11. Executors (/executors)

  • Direct executor deployment without full bot/controller stack
  • Grid Executor: Wizard (connector -> pair -> amount/ranges/interval -> deploy)
  • Position Executor: Wizard (connector -> pair -> entry price -> config -> deploy)
  • Running executors list with PnL
  • Stop executors with confirmation
  • Chart visualization via Plotly

12. Routines (/routines)

  • Auto-discovered Python scripts from routines/ folder
  • One-shot: Run once, returns result; can be scheduled (30s, 1m, 5m, 15m, 30m, 1h, or daily at HH:MM)
  • Continuous: Internal while True loop, runs as asyncio task until stopped
  • Text-based config editing (key=value messages)
  • Auto-restore scheduled jobs on bot restart
  • Built-in routines:
    • hello_world.py - Greeting (one-shot, for testing)
    • arb_check.py - CEX/DEX arbitrage checker (one-shot)
    • price_monitor.py - Live price alerts (continuous)
    • lp_monitor.py - LP out-of-range alerts with rebalance suggestions (continuous)
    • lp_tpsl.py - LP take-profit/stop-loss with runtime editing (continuous)

13. AI Agent Sessions (/agent)

  • Choose between Claude Code or Gemini CLI agents
  • Full chat session with streaming responses (edited-in-place Telegram messages)
  • Trade confirmation: Dangerous tool calls (place_order, swap execute, LP open/close) trigger Approve/Reject inline buttons
  • Widget integration: Agent can send interactive Telegram buttons via MCP condor-widgets tools
  • Session management: create, stop, new session, compact context
  • Context compaction: Auto or Custom summary
  • RBAC enforced: Viewer-level servers block trading tool calls
  • Initial context injection with server access levels

14. MCP Integration

  • mcp-hummingbot: Full Hummingbot Backend API exposed to agents (portfolio, orders, bots, candles, funding rates, order book, controllers, Gateway)
  • condor-widgets: Telegram UI tools (send_buttons, ask_user_choice, send_notification)
  • Dynamic MCP server config built per agent session using user's active server credentials

15. Infrastructure

  • SafePicklePersistence: Atomic writes, backup rotation, crash recovery, ephemeral key filtering
  • DataManager: Context-aware TTL caching (10s active, 120s idle), rate limiter (5/s, 100/min), background cache warming, graceful stale-data degradation
  • ConfigManager: YAML-backed singleton for servers, users, permissions, audit log
  • ACP Client: JSON-RPC 2.0 over stdio for agent subprocess communication
  • Widget Bridge: TCP async server bridging MCP agent tools to Telegram inline keyboards
  • Auto-reload: watchfiles-based handler hot-reload during development

QA Test Plan

T1. User Registration & Access Control

# Test Steps Expected
1.1 New user registration New Telegram user sends /start User registered as Pending, admin notified
1.2 Pending user access Pending user tries /portfolio Blocked with "awaiting approval" message
1.3 Admin approves user Admin opens /admin -> Pending -> Approve User role becomes User, user gets Telegram notification
1.4 Admin rejects user Admin -> Pending -> Reject User removed, access denied on next command
1.5 Admin blocks user Admin -> All Users -> select user -> Block User role becomes Blocked, all commands denied
1.6 Admin unblocks user Admin -> Blocked user -> Unblock User role restored to User
1.7 Audit log Perform approve/block actions Events appear in Admin -> Audit Log

T2. Server Management

# Test Steps Expected
2.1 Add server /servers -> Add -> enter host, port, user, pass Server added, connectivity test passes
2.2 Edit server Select server -> Edit -> change host Updated config saved
2.3 Delete server Select server -> Delete -> Confirm Server removed from config
2.4 Share server (Trader) Owner shares server with another user at Trader level Recipient can trade on that server
2.5 Share server (Viewer) Share at Viewer level Recipient can view but NOT trade
2.6 Revoke access Owner revokes shared access Recipient loses server access
2.7 Auto-default User with 1 server Auto-set as default without prompt
2.8 Server offline Server goes offline @hummingbot_api_required shows error before handler runs

T3. API Keys

# Test Steps Expected
3.1 Add API key /keys -> select connector -> enter key + secret Credentials stored via Backend API
3.2 Update API key Re-enter credentials for existing connector Overwritten successfully

T4. Gateway

# Test Steps Expected
4.1 Start Gateway /gateway -> Start -> enter passphrase Docker container starts, status shows running
4.2 Stop Gateway -> Stop Container stopped
4.3 Restart Gateway -> Restart Container restarted
4.4 View logs -> Logs Last N log lines displayed
4.5 Add wallet -> Wallets -> Add -> select chain -> enter private key Wallet registered
4.6 Delete wallet -> Wallets -> select wallet -> Delete Wallet removed
4.7 Configure connector -> Connectors -> select DEX Config displayed/editable
4.8 Add token -> Tokens -> select network -> Add -> enter address/symbol/decimals Token registered
4.9 Add pool -> Pools -> select connector/network -> Add -> enter address/tokens Pool registered
4.10 Gateway not running Try /swap without Gateway running @gateway_required shows error

T5. Portfolio

# Test Steps Expected
5.1 View portfolio /portfolio Shows total value, per-connector breakdown with buttons
5.2 Connector drill-down Click a connector button Shows token balances with % of total
5.3 Back to overview Click Back Returns to overview
5.4 Refresh Click Refresh Forces exchange refresh, updated data shown
5.5 Gateway filtering Set enabled wallet networks in prefs Only those networks shown in portfolio

T6. CEX Trading

# Test Steps Expected
6.1 Market buy (spot) /trade -> select CEX -> pair -> BUY -> MARKET -> amount -> confirm Order placed, confirmation shown
6.2 Limit sell (spot) SELL -> LIMIT -> set price -> confirm Limit order placed
6.3 Perp trade with leverage Select perp connector -> set leverage -> HEDGE mode -> open long Position opened
6.4 Close perp position Positions -> select -> Close Position closed with PnL shown
6.5 Order book view During trade setup Bid/ask spread displayed
6.6 Order history Trade menu -> Orders -> ALL/FILLED/CANCELLED Paginated order list
6.7 Cancel order Orders -> select active order -> Cancel Order cancelled
6.8 Quick re-trade Start new trade Last-used params (connector, pair, side) pre-filled

T7. DEX Swaps

# Test Steps Expected
7.1 Get swap quote /swap -> select network -> pair -> amount Quote shown with price, fees, slippage
7.2 Execute swap Quote -> Execute Swap executed, tx hash shown
7.3 Swap history Swap menu -> History Paginated list with status
7.4 Filter swap history Apply status/date filters Filtered results

T8. DEX Liquidity (LP)

# Test Steps Expected
8.1 View LP positions /lp -> Positions Active CLMM positions listed
8.2 Open LP position Select pool -> set price range -> set amounts -> Open Position created, tx confirmed
8.3 Close LP position Select position -> Close -> Confirm Position closed, tokens returned
8.4 Collect fees Select position -> Collect Fees Fees collected
8.5 LP history -> History Closed positions with PnL
8.6 Pool explorer -> Explore pools GeckoTerminal data with charts
8.7 Liquidity chart View pool -> chart Plotly chart image sent

T9. Unified Trade

# Test Steps Expected
9.1 First-time connector select /trade (new user) Shows CEX + DEX connector selector
9.2 CEX routing Select a CEX connector Routed to CEX trade flow
9.3 DEX routing Select a DEX network Routed to DEX swap flow
9.4 Remembered preference /trade again Goes directly to last-used connector type

T10. Bot Management

# Test Steps Expected
10.1 View active bots /bots List of bots with status, PnL
10.2 Bot detail Click a bot Controllers list, unrealized/realized PnL
10.3 Stop controller Select controller -> Stop -> Confirm Controller stopped (manual_kill_switch)
10.4 Start controller Select stopped controller -> Start Controller resumed
10.5 Edit controller config Select controller -> Edit -> change field Config updated in running bot
10.6 View bot logs Bot detail -> Logs Recent log entries displayed
10.7 Stop bot Bot detail -> Stop Bot -> Confirm Bot archived, container stopped
10.8 Grid Strike wizard /new_bot -> Grid Strike -> follow steps Config created with all params
10.9 PMM wizard /new_bot -> PMM Mister or V1 -> follow steps Config created
10.10 Deploy bot Select configs -> Deploy -> set name/image Bot container launched
10.11 Multi-config deploy Select multiple configs -> Deploy Bot with multiple controllers
10.12 Upload custom config Upload JSON file Config parsed and saved
10.13 Clone config Select config -> Clone Duplicate config created
10.14 Delete config Select config -> Delete Config removed
10.15 Archived bots View archived bots -> charts/report Performance data displayed

T11. Executors

# Test Steps Expected
11.1 Grid executor /executors -> Grid -> follow wizard Grid executor deployed
11.2 Position executor -> Position -> follow wizard Position executor deployed
11.3 View running List running executors PnL and status shown
11.4 Stop executor Select -> Stop -> Confirm Executor stopped

T12. Routines

# Test Steps Expected
12.1 List routines /routines All discovered routines with type icons
12.2 Run one-shot Select hello_world -> Run Result returned immediately
12.3 Edit config Send trading_pair=ETH-USDT while editing Config updated
12.4 Schedule interval Select one-shot -> Schedule -> 5m Job runs every 5 minutes, results sent
12.5 Schedule daily Schedule -> Daily -> select time Job runs at specified time
12.6 Start continuous Select price_monitor -> Start Runs until stopped, sends updates
12.7 Stop continuous -> Stop Task cancelled, "Stopped" message
12.8 Restore on restart Restart bot Scheduled and continuous routines auto-resume
12.9 Invalid config key Send nonexistent_key=value Error message shown
12.10 LP monitor Start lp_monitor Out-of-range alerts with rebalance suggestions
12.11 LP TP/SL Start lp_tpsl TP/SL monitoring with interactive buttons
12.12 Arb check Run arb_check CEX vs DEX price comparison result

T13. AI Agent Sessions

# Test Steps Expected
13.1 Start Claude agent /agent -> Claude Code Session created, streaming response
13.2 Start Gemini agent /agent -> Gemini Session created
13.3 Chat with agent Send text messages Agent responds with streaming edits
13.4 Trade confirmation Ask agent to place an order Approve/Reject buttons appear
13.5 Approve trade Click Approve Order executed via agent
13.6 Reject trade Click Reject Order cancelled, agent notified
13.7 Widget buttons Agent uses send_buttons Interactive Telegram keyboard appears
13.8 Viewer restriction User with Viewer-only server asks agent to trade Trading tool calls blocked
13.9 New session -> New Session Context reset, fresh conversation
13.10 Compact context -> Compact -> Auto Summary generated, context shortened
13.11 Stop session -> Stop Agent subprocess terminated

T14. Cross-Cutting Concerns

# Test Steps Expected
14.1 State isolation Run /trade, then /portfolio, then /bots No state pollution between features (clear_all_input_states)
14.2 MarkdownV2 escaping Data with special chars (., -, (, )) Properly escaped, no parse errors
14.3 Error handling Trigger API error (wrong server, timeout) User-friendly error message via format_error_message()
14.4 Persistence crash safety Kill bot during operation Restart recovers from .bak file if needed
14.5 Cache TTL Fetch data, wait > TTL, fetch again Fresh data fetched (not stale cache)
14.6 Rate limiting Rapid-fire commands Rate limiter prevents API flooding
14.7 Multiple chats Same user in different chats Per-chat default server, shared user prefs
14.8 Concurrent users Multiple users simultaneously No data leaks between user sessions
14.9 Hot reload Modify handler file while bot running Handler auto-reloaded via watchfiles
14.10 Unit tests pass Run uv run pytest All tests in tests/test_data_manager.py pass

Priority for QA

P0 - Critical Path (test first)

  • T1 - User registration + access control
  • T2 - Server management
  • T5 - Portfolio
  • T6 - CEX trading (orders, positions)
  • T7 - DEX swaps
  • T13.4-13.6 - Agent trade confirmations (safety-critical)

P1 - Core Features

  • T8 - LP positions
  • T10 - Bot management + deployment
  • T12 - Routines
  • T14.1, 14.2, 14.3 - State isolation, escaping, error handling

P2 - Supporting Features

  • T3, T4 - API keys, Gateway config
  • T9 - Unified trade routing
  • T11 - Executors
  • T13 - Full agent testing
  • T14.4-14.10 - Infrastructure

@rapcmia
Copy link
Copy Markdown
Contributor

rapcmia commented Feb 19, 2026

Commit 64c3f6b
image

  • Entry price is updated ✅
    • Current is last traded price
    • The values indicated when 2%, 1%, -1% and 2% selected are correct
    • MARKET works as expected
  • Tested all entry price values and deployed successfully ✅
    • Placed limit and market order successfully
    • Opened and closed position executor in favor of take profit ok

When we click any of the default spreads thats already assigned to the entry_price, it returned error refreshing position step

2026-02-19 06:13:05,247 - handlers.executors.position - ERROR - Error refreshing position step 2: Message is not modified: specified new message content and reply markup are exactly the same as a current content and reply markup of the message
Traceback (most recent call last):
  File "/app/handlers/executors/position.py", line 665, in _refresh_step_2
    await context.bot.edit_message_text(
  File "/usr/local/lib/python3.12/site-packages/telegram/ext/_extbot.py", line 1732, in edit_message_text
    return await super().edit_message_text(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/telegram/_bot.py", line 4543, in edit_message_text
    return await self._send_message(
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/telegram/ext/_extbot.py", line 629, in _send_message
    result = await super()._send_message(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/telegram/_bot.py", line 819, in _send_message
    result = await self._post(
             ^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/telegram/_bot.py", line 703, in _post
    return await self._do_post(
           ^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/telegram/ext/_extbot.py", line 369, in _do_post
    return await super()._do_post(
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/telegram/_bot.py", line 732, in _do_post
    result = await request.post(
             ^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/telegram/request/_baserequest.py", line 198, in post
    result = await self._request_wrapper(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/telegram/request/_baserequest.py", line 375, in _request_wrapper
    raise exception
telegram.error.BadRequest: Message is not modified: specified new message content and reply markup are exactly the same as a current content and reply markup of the message
  • The error does not impact the config or execution and is observed only in the Condor logs
  • Steps to reproduce:
    • On position executor config window, select any of the default spreads 2%, 1%, -1% and -2%
    • After it updated the entry_price, click the same spread % again and observe the error on logs

@rapcmia
Copy link
Copy Markdown
Contributor

rapcmia commented Feb 20, 2026

Commit 4595024

  • grid executor
    • Compare config with main branch ✅
      • Added open_order_type, take_profit_order_type and keep_position
  • Setup a grid executor config then cancelled it. Tried to check the grid config again and observed changes i made are still recognized ✅
    • Successfully deployed and stop the executor
    • Checked again the grid executor setup, same config is still pr-selected/used again
  • Open position executor, tap each entry button (Market, Current, -1%, +1%, etc..), verify entry_price updates ✅
    • Same as grid above, it retain the same config after we deployed or cancel the config window
  • It does not seem to acknowledge the active orders from my running grid and position executors ❌
  • When checking admin then click stats, im getting AttributeError

@cardosofede
Copy link
Copy Markdown
Contributor Author

@rapcmia the portfolio was reduced only to show the balances

@rapcmia
Copy link
Copy Markdown
Contributor

rapcmia commented Mar 2, 2026

Commit 867dfc2

  • Dev added /agent feature on condor
  • Updated my gemini CLI to the latest version ok
  • Setup this PR with docker using make setup; make deploy

Test Gemini CLI session

  • First run gemini --experimental-acp on local, nothing occurs which i assume expected
  • Then started /agent, observed stuck on starting gemini cli session ❌
    image
    • Check AI investigate and found:
      • On Dockerfile:
        • Found nodejs and npm not added, so added to the list
              ...
              RUN apt-get update && apt-get install -y --no-install-recommends \
              nodejs \
              npm \
              chromium \
              chromium-driver \
              fonts-liberation \
              ....
          
        • Also need to install gemini inside docker using RUN npm install -g @google/gemini-cli
        • Added GEMINI_API_KEY generated from google AI into .env
          image
          • No prompt on make setup for setting up apikey, user have to manually add ❗
        • Successfully build docker image and start condor again ok
          image

@rapcmia
Copy link
Copy Markdown
Contributor

rapcmia commented Mar 4, 2026

Commit 766a52d

  • Im not able to start from source getting error moduleNotFound
    image
    (base) eddga :: hummingbot/condor/32 ‹feat/add_tui*› » make run
    conda run --no-capture-output -n condor python main.py
    /home/eddga/hummingbot/condor/32/handlers/agents/__init__.py:173: SyntaxWarning: invalid escape sequence '\.'
      "\u23f3 Still working on the previous request\.\.\.\n"
    /home/eddga/hummingbot/condor/32/handlers/agents/__init__.py:174: SyntaxWarning: invalid escape sequence '\.'
      "Your message will be queued — or wait for it to finish\.",
    Traceback (most recent call last):
      File "/home/eddga/hummingbot/condor/32/main.py", line 599, in <module>
        main()
      File "/home/eddga/hummingbot/condor/32/main.py", line 586, in main
        register_handlers(application)
      File "/home/eddga/hummingbot/condor/32/main.py", line 240, in register_handlers
        from handlers.agents import agent_callback_handler, agent_command
      File "/home/eddga/hummingbot/condor/32/handlers/agents/__init__.py", line 16, in <module>
        from .sub_agents import (
    ModuleNotFoundError: No module named 'handlers.agents.sub_agents'
    

Steps to reproduce:

  • Run make setup; make install; make run

@cardosofede cardosofede changed the title (feat) add entry price (feat) improve agent mode, fix minor issues, adapt multi server management Mar 4, 2026
@cardosofede
Copy link
Copy Markdown
Contributor Author

@david-hummingbot we will need to adapt the CI now we are moving to uv

@rapcmia
Copy link
Copy Markdown
Contributor

rapcmia commented Mar 5, 2026

Commit ba2600a

  • Setup with hummingbot-api:latest docker using make setup; make deploy
  • Successfully start on source using make setup; make install; make run
    • Observed error on start task exception was never retrieved ❌
      (base) eddga :: hummingbot/condor/32 ‹feat/add_tui*› » make run
      uv run python main.py
      2026-03-05 16:39:03,575 - __main__ - INFO - Handlers registered successfully
      2026-03-05 16:39:04,376 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8590178974:AAEdKrJV8ssHaiScNHnvdFahKRAC57jNMjg/getMe "HTTP/1.1 200 OK"
      2026-03-05 16:39:04,378 - config_manager - INFO - Loaded config from config.yml
      2026-03-05 16:39:04,378 - __main__ - INFO - Synced server permissions
      2026-03-05 16:39:04,805 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8590178974:AAEdKrJV8ssHaiScNHnvdFahKRAC57jNMjg/setMyCommands "HTTP/1.1 200 OK"
      2026-03-05 16:39:05,246 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8590178974:AAEdKrJV8ssHaiScNHnvdFahKRAC57jNMjg/setMyCommands "HTTP/1.1 200 OK"
      2026-03-05 16:39:05,247 - condor.data_manager - INFO - DataManager: registered default CEX fetch functions
      2026-03-05 16:39:05,247 - condor.data_manager - INFO - DataManager background refresh started
      2026-03-05 16:39:05,247 - condor.widget_bridge - INFO - Widget bridge listening on 127.0.0.1:46269
      2026-03-05 16:39:05,249 - __main__ - INFO - 👀 Watching for changes in: /home/eddga/hummingbot/condor/32/handlers, /home/eddga/hummingbot/condor/32/routines
      2026-03-05 16:39:05,249 - asyncio - ERROR - Task exception was never retrieved
      future: <Task finished name='Task-7' coro=<watch_and_reload() done, defined at /home/eddga/hummingbot/condor/32/main.py:392> exception=OSError('OS file watch limit reached. about ["/home/eddga/hummingbot/condor/32/handlers/bots/controllers/pmm_v1"] (Error { kind: MaxFilesWatch, paths: ["/home/eddga/hummingbot/condor/32/handlers/bots/controllers/pmm_v1"] })')>
      Traceback (most recent call last):
        File "/home/eddga/hummingbot/condor/32/main.py", line 406, in watch_and_reload
          async for changes in awatch(handlers_path, routines_path):
          ...<6 lines>...
                  logger.error(f"❌ Auto-reload failed: {e}", exc_info=True)
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/watchfiles/main.py", line 256, in awatch
          with RustNotify(
               ~~~~~~~~~~^
              [str(p) for p in paths], debug, force_polling, poll_delay_ms, recursive, ignore_permission_denied
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          ) as watcher:
          ^
      OSError: OS file watch limit reached. about ["/home/eddga/hummingbot/condor/32/handlers/bots/controllers/pmm_v1"] (Error { kind: MaxFilesWatch, paths: ["/home/eddga/hummingbot/condor/32/handlers/bots/controllers/pmm_v1"] })
      
  • When checking servers, no server registered, user have to setup local or remote ❗

T1 User Registration & Access Control ❌

  • New user registration after i shared my condor app ✅
    image
    • Admin has to share the link of condor to new user
  • New user access portfolio, returns Your access request is pending admin approval. You will be notified when approved.
  • Go to admin → pending_requests, then admin approved ✅
    • New user received Your access request has been approved. Use /start to begin.
    • New user now added to config.yml along wit telegram ID with other details e.g created, approved and role
  • Admin decided to reject, New user did not received any response ❌
    • New user access portfolio, then sends request again to admin
    • Admin rejects, still no response. Do same access to portfolio and same results
    • New user is not removed nor access denied
  • Admin decided to blocked, New user receives Access denied
  • Admin decided to unblock, condor requests approve / reject ✅
    • Admin approved, new user receives notif access granted
  • Audit log display list of activities of admin x new user ✅
  • Stats button returns Exception while handling an update:
    2026-03-05 21:39:05,616 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8590178974:AAEdKrJV8ssHaiScNHnvdFahKRAC57jNMjg/answerCallbackQuery "HTTP/1.1 200 OK"
    2026-03-05 21:39:05,617 - __main__ - ERROR - Exception while handling an update:
    Traceback (most recent call last):
      File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/telegram/ext/_application.py", line 1315, in process_update
        await coroutine
      File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/telegram/ext/_handlers/basehandler.py", line 159, in handle_update
        return await self.callback(update, context)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/eddga/hummingbot/condor/32/utils/auth.py", line 126, in wrapped
        return await func(update, context, *args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/eddga/hummingbot/condor/32/handlers/admin/__init__.py", line 109, in admin_callback_handler
        await _show_stats(query, context)
      File "/home/eddga/hummingbot/condor/32/handlers/admin/__init__.py", line 490, in _show_stats
        f"  Entries: {len(cm.cm.get('audit_log', []))}\n"
                          ^^^^^
    AttributeError: 'ConfigManager' object has no attribute 'cm'
    

T2 Server Management ❌

  • Add, edit and delete server ✅
  • Share server via trader and viewer access
    Server Shared With You
    
    You now have <trader/viewer> access to server:
    local
    
    This server has been set as your default.
    
    Use /config > API Servers to access it.
    
    • New user receives notif about access roles
    • However /config > APi servers is not available on the list ❌
      • Same with admin and new user
    • Trader access enables new user to trade (tested on solana-mainnet-beta) ✅
    • Viewer access enabled but new user still can trade ❌
      image
    • Admin decides to revoke access, New user receives “Access revoked” ✅
  • Auto-default ok
  • Server offline (hummingbot-api or incorrect credentials) ok

T3 API keys ✅

  • Add, update and delete ok {binance perpetual and kucoin}

T4 gateway using latest/development images ❌

  • Start, restart and stop ok
  • View logs ok
  • Add and delete wallet ok
  • Add pool
    • Getting TypeError GatewayRouter.add_pool() got an unexpected keyword argument 'base_address' ❌
      image
      2026-03-05 18:38:06,206 - handlers.config.gateway._shared - INFO - Adding pool: connector=meteora, network=mainnet-beta, pool_type=CLMM, base=SOL, quote=USDC, address=HTvjzsfX3yU6BUodCjZ5vZkUrAxMDTrBs3CJaq43ashR, base_address=So11111111111111111111111111111111111111112, quote_address=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
      2026-03-05 18:38:06,206 - handlers.config.gateway._shared - ERROR - Error adding pool: GatewayRouter.add_pool() got an unexpected keyword argument 'base_address'
      Traceback (most recent call last):
        File "/home/eddga/hummingbot/condor/32/handlers/config/gateway/pools.py", line 734, in handle_pool_input
          await client.gateway.add_pool(
                ~~~~~~~~~~~~~~~~~~~~~~~^
              connector_name=connector_name,
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          ...<6 lines>...
              quote_address=quote_address,
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          )
          ^
      TypeError: GatewayRouter.add_pool() got an unexpected keyword argument 'base_address'
      
      • I was trying to overwrite my current SOL-USDC using CLMM,SOL,USDC,HTvjzsfX3yU6BUodCjZ5vZkUrAxMDTrBs3CJaq43ashR
      • I tried to add PYUSD-USDC but still failed ❌
        image
        • I added PYUSD on the token list and restart gateway ✅
        • Added pool address using CLMM,PYUSD,USDC,AJZFPpLZRXAFHDRUy6nPHnFom6RxhW3jJ797femR6mS8
  • Swap without gateway running
    • /swap command is same as /trade
    • When solana-mainnet-beta is clicked, it goes to selecting CEX connectors ✅
      image
      • I tried to execute while gateway is offline and got a response error instead of @gateway_required shows error ❌
        image

T5 portfolio ❌

  • Portfolio does not generate any graphs no more
    image
  • When connected to gateway with ethereum wallet, portfolio is stuck loading balances and eventually shows failed to fetch balance on condor logs then returned total: $0.00 ❌
    image
    image
  • Connector display total balances with % ✅
  • Back to overview works ✅
  • Refresh ✅
  • While gateway is offline, it still managed to get the last balance fetched (solana) ✅

T6 CEX Trading on kucoin and binance perpetual ✅

  • market buy on works ok
  • limit buy and eventually filled ok
  • limi maker and market placed on perpetual, opened position ok
  • Successfully fetched open then close position using positions button ok
  • Active orders displayed on Orders are properly canceled
  • Order history display all orders submitted and filled
  • Quick retrade works as expected, displays last used parameters

T7 DEX Swaps

  • /swap command responds as /trade window
  • execute swap failed due to transaction timeout (helius) but condor returns swap executed ✅
    image
    • When returning to the swap window, returns recent execute which also let users know the status of the txn ✅
      image
      image
  • Swap history displays all our tested executions ✅
  • Filter swap history does not work ❌
    image
    • Filtered FAILED on ORE-USDC and still shows all my swap history

T8 DEX Liquidity

  • The /lp → Positions button is not available, I assume its not showing because no active LP position yet ❗

  • Open LP position via pool list
    image

    • meteora
    • Also there are instances of condor logs response handlers.dex.pool_data - ERROR - Error fetching OHLCV
      2026-03-05 20:54:11,479 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8590178974:AAEdKrJV8ssHaiScNHnvdFahKRAC57jNMjg/deleteMessage "HTTP/1.1 200 OK"                                                       20:54:15 [25/1771]
      2026-03-05 20:54:16,496 - handlers.dex.pool_data - ERROR - Error fetching OHLCV:
      Traceback (most recent call last):
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/httpx/_transports/default.py", line 101, in map_httpcore_exceptions
          yield
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/httpx/_transports/default.py", line 394, in handle_async_request
          resp = await self._pool.handle_async_request(req)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/httpcore/_async/connection_pool.py", line 256, in handle_async_request
          raise exc from None
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/httpcore/_async/connection_pool.py", line 236, in handle_async_request
          response = await connection.handle_async_request(
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
              pool_request.request
              ^^^^^^^^^^^^^^^^^^^^
          )
          ^
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/httpcore/_async/connection.py", line 101, in handle_async_request
          raise exc
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/httpcore/_async/connection.py", line 78, in handle_async_request
          stream = await self._connect(request)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/httpcore/_async/connection.py", line 124, in _connect
          stream = await self._network_backend.connect_tcp(**kwargs)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/httpcore/_backends/auto.py", line 31, in connect_tcp
          return await self._backend.connect_tcp(
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          ...<5 lines>...
          )
          ^
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/httpcore/_backends/anyio.py", line 113, in connect_tcp
          with map_exceptions(exc_map):
               ~~~~~~~~~~~~~~^^^^^^^^^
        File "/home/eddga/anaconda3/lib/python3.13/contextlib.py", line 162, in __exit__
          self.gen.throw(value)
          ~~~~~~~~~~~~~~^^^^^^^
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/httpcore/_exceptions.py", line 14, in map_exceptions
          raise to_exc(exc) from exc
      httpcore.ConnectTimeout
      
      The above exception was the direct cause of the following exception:
      
      Traceback (most recent call last):
        File "/home/eddga/hummingbot/condor/32/handlers/dex/pool_data.py", line 152, in fetch_ohlcv
          result = await client.get_ohlcv(
                   ^^^^^^^^^^^^^^^^^^^^^^^
          ...<6 lines>...
          )
          ^
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/geckoterminal_py/clients/async_client.py", line 102, in get_ohlcv
          response = await self.api_request("GET",
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                            CONSTANTS.GET_OHLCV_DATA_PATH.format(network_id, pool_address, timeframe),
                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                            params=params)
                                            ^^^^^^^^^^^^^^
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/geckoterminal_py/clients/async_client.py", line 20, in api_request
          response = await self.client.request(method, url, params=params)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/httpx/_client.py", line 1540, in request
          return await self.send(request, auth=auth, follow_redirects=follow_redirects)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/httpx/_client.py", line 1629, in send
          response = await self._send_handling_auth(
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          ...<4 lines>...
          )
          ^
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/httpx/_client.py", line 1657, in _send_handling_auth
          response = await self._send_handling_redirects(
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          ...<3 lines>...
          )
          ^
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects
          response = await self._send_single_request(request)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/httpx/_client.py", line 1730, in _send_single_request
          response = await transport.handle_async_request(request)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/httpx/_transports/default.py", line 393, in handle_async_request
          with map_httpcore_exceptions():
               ~~~~~~~~~~~~~~~~~~~~~~~^^
        File "/home/eddga/anaconda3/lib/python3.13/contextlib.py", line 162, in __exit__
          self.gen.throw(value)
          ~~~~~~~~~~~~~~^^^^^^^
        File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/httpx/_transports/default.py", line 118, in map_httpcore_exceptions
          raise mapped_exc(message) from exc
      httpx.ConnectTimeout
      2026-03-05 20:54:16,498 - handlers.dex.pools - WARNING - Failed to fetch OHLCV: Failed to fetch OHLCV:
      2026-03-05 20:54:16,502 - handlers.dex.visualizations - WARNING - No OHLCV data for combined chart
      
      • I refreshed and display OHLCV data, no errors on condor ✅
        image
  • Tried to Add to Gateway nothing happened see recording below blocked

    lp.-.add.to.gateway.does.not.work.mov
  • In progress


I relayed the remaining test T9 onwards to @nikspz to speed up

  • I will catch up with him after the issues reported are reviewed by dev

Copy link
Copy Markdown
Contributor

@nikspz nikspz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • commit b12bb26
    • set up with hummingbot API
      • Test performed:
        • local setup test
          • git clone -b feat/add_tui https://github.com/hummingbot/condor.git condor
            • cd condor
              • docker build -t hummingbot/condor:latest -f Dockerfile .
              • make setup
              • make deploy
              • docker compose up -d
            • Container condor-bot Started
            • no hummingbot-api ran
            • set up hummingbot-api
          • review in condor UI
            • /start
            • review not all commands listed in the welcome message
            • Image
            • set up server localhost. review issue on commands:
              • 409 Conflict
                2026-03-05 17:14:44,112 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8TELEGRAM_TOKEN/getUpdates "HTTP/1.1 409 Conflict"
                2026-03-05 17:14:44,114 - main - ERROR - Exception while handling an update:
                Traceback (most recent call last):
                File "/app/.venv/lib/python3.12/site-packages/telegram/ext/_utils/networkloop.py", line 161, in network_retry_loop
                await do_action()
                File "/app/.venv/lib/python3.12/site-packages/telegram/ext/_utils/networkloop.py", line 154, in do_action
                action_cb_task.result()
                File "/app/.venv/lib/python3.12/site-packages/telegram/ext/_updater.py", line 340, in polling_action_cb
                updates = await self.bot.get_updates(
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^
                File "/app/.venv/lib/python3.12/site-packages/telegram/ext/_extbot.py", line 671, in get_updates
                updates = await super().get_updates(
                ^^^^^^^^^^^^^^^^^^^^^^^^^^
                File "/app/.venv/lib/python3.12/site-packages/telegram/_bot.py", line 4860, in get_updates
                await self._post(
                File "/app/.venv/lib/python3.12/site-packages/telegram/_bot.py", line 703, in _post
                return await self._do_post(
                ^^^^^^^^^^^^^^^^^^^^
                File "/app/.venv/lib/python3.12/site-packages/telegram/ext/_extbot.py", line 369, in _do_post
                return await super()._do_post(
                ^^^^^^^^^^^^^^^^^^^^^^^
                File "/app/.venv/lib/python3.12/site-packages/telegram/_bot.py", line 732, in _do_post
                result = await request.post(
                ^^^^^^^^^^^^^^^^^^^
                File "/app/.venv/lib/python3.12/site-packages/telegram/request/_baserequest.py", line 198, in post
                result = await self._request_wrapper(
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                File "/app/.venv/lib/python3.12/site-packages/telegram/request/_baserequest.py", line 375, in _request_wrapper
                raise exception
                telegram.error.Conflict: Conflict: terminated by other getUpdates request; make sure that only one bot instance is running
              • restarted condor with
                • docker compose down
                • docker compose up -d
            • T3 API keys
              • removed old API key ✅
              • add new ✅
              • spot
                • hyperliquid spot ✅
                  • added successfully ✅
                  • checked balance: reviewed USDC balance showed and HYPE and other tokens not showing (since rate oracle is binance) ❌
                • hyperliquid_perpetual
                  • added successfully
            • T9 /trade
              • bot using jupiter solana-mainnet-beta even if not connected
              • hummingbot-api logs showing
                • 2026-03-05 18:09:02,599 - hummingbot.connector.time_synchronizer - WARNING - Could not refresh server time. Check network connection.
                  2026-03-05 18:09:02,884 - hummingbot.core.rate_oracle.sources.rate_source_base - ERROR - Unexpected error while retrieving rates from Binance. Check the log file for more info.
                  Traceback (most recent call last):
                  File "/opt/conda/envs/hummingbot-api/lib/python3.12/site-packages/hummingbot/core/rate_oracle/sources/binance_rate_source.py", line 54, in _get_binance_prices
                  pairs_prices = await exchange.get_all_pairs_prices()
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/opt/conda/envs/hummingbot-api/lib/python3.12/site-packages/hummingbot/connector/exchange/binance/binance_exchange.py", line 118, in get_all_pairs_prices
                  pairs_prices = await self._api_get(path_url=CONSTANTS.TICKER_BOOK_PATH_URL)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/opt/conda/envs/hummingbot-api/lib/python3.12/site-packages/hummingbot/connector/exchange_py_base.py", line 894, in _api_get
                  return await self._api_request(*args, **kwargs)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/opt/conda/envs/hummingbot-api/lib/python3.12/site-packages/hummingbot/connector/exchange_py_base.py", line 937, in _api_request
                  request_result = await rest_assistant.execute_request(
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/opt/conda/envs/hummingbot-api/lib/python3.12/site-packages/hummingbot/core/web_assistant/rest_assistant.py", line 48, in execute_request
                  response = await self.execute_request_and_get_response(
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/opt/conda/envs/hummingbot-api/lib/python3.12/site-packages/hummingbot/core/web_assistant/rest_assistant.py", line 101, in execute_request_and_get_response
                  raise IOError(f"Error executing request {method.name} {url}. HTTP status is {response.status}. "
                  OSError: Error executing request GET https://api.binance.com/api/v3/ticker/bookTicker. HTTP status is 451. Error: {
                  "code": 0,
                  "msg": "Service unavailable from a restricted location according to 'b. Eligibility' in https://www.binance.com/en/terms. Please contact customer service if you believe you received this message in error."
        • Created new bot on TG (for remote server) ✅
          • condor
          • hummingbot-api
          • set up cloud IP in condor
          • review new bot now responsive and server is set up
          • portfolio
            • added hyperliquid_perpetual successfully
            • checked portfolio from admin account successfully
          • T1. User Registration & Access Control
            • Use /start > Admin Panel to approve or reject.
              • there’s no Admin panel on start command ❌
                • it’s under /admin command
              • Block user: no option to block user ❌ only reject
            • Approve request
              • request approved ✅

              • check from approved account if it could check portfolio → No ❌

                • Hummingbot API server is not reachable ❌
                • /servers is not configured (let’s try)
                  • a server name hummingbot already exists
                  • however server is not available in servers list from another user ❌
                  • added same IP under another name (for the same bot), used same Username password
                    • /portfolio after added same IP server with another server name ✅ successfully checked
                  • after added server with another name it added to admin servers also
                    • so now I have hummingbot and another server with same IP
              • T1 User Registration & Access Control

                # Test Steps Actual
                1.1 New user registration New Telegram user sends /start User registered as Pending, admin notified ✅
                1.2 Pending user access Pending user tries /portfolio Blocked with "awaiting approval" message ✅
                1.3 Admin approves user Admin opens /admin -> Pending -> Approve User role becomes User, user gets Telegram notification ✅
                1.4 Admin rejects user Admin -> Pending -> Reject User removed, access denied on next command ✅
                1.5 Admin blocks user Admin -> All Users -> select user -> Block Block user: no option to block user ❌ only reject
                1.6 Admin unblocks user Admin -> Blocked user -> Unblock Block user: no option to block user ❌ only reject
                1.7 Audit log Perform approve/block actions Events appear in Admin -> Audit Log ✅
              • T2. Server Management

                # Test Steps Actual
                2.1 Add server /servers -> Add -> enter host, port, user, pass Server added, connectivity test passes ✅
                2.2 Edit server Select server -> Edit -> change host Updated config saved ✅
                2.3 Delete server Select server -> Delete -> Confirm Server removed from config ✅
                2.4 Share server (Trader) Owner shares server with another user at Trader level Recipient can trade on that server ❌ no trader / viewer status
                2.5 Share server (Viewer) Share at Viewer level Recipient can view but NOT trade ❌ no trader / viewer status
                2.6 Revoke access Owner revokes shared access Recipient loses server access: could remove server
                2.7 Auto-default User with 1 server Auto-set as default without prompt
                2.8 Server offline Server goes offline @hummingbot_api_required shows error before handler runs
              • T3

                • Add, update and delete API keys: ok
              • T4

                • gateway
                • deploy from condor
                  • set up passphrase: ok
                  • Deploying gateway
                    • Please wait, this may take a moment.

                    • ❌ Deployment Failed

                    • 2026-03-05 20:20:08,319 - handlers.config.gateway._shared - ERROR - Error deploying gateway:
                      Traceback (most recent call last):
                      File "/app/.venv/lib/python3.12/site-packages/aiohttp/client_reqrep.py", line 539, in start
                      message, payload = await protocol.read() # type: ignore[union-attr]
                      ^^^^^^^^^^^^^^^^^^^^^
                      File "/app/.venv/lib/python3.12/site-packages/aiohttp/streams.py", line 703, in read
                      await self._waiter
                      asyncio.exceptions.CancelledError
                    • The above exception was the direct cause of the following exception:

                      Traceback (most recent call last):
                      File "/app/handlers/config/gateway/deployment.py", line 158, in execute_gateway_deploy
                      response = await client.gateway.start(config)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                      File "/app/.venv/lib/python3.12/site-packages/hummingbot_api_client/routers/gateway.py", line 26, in start
                      return await self._post("/gateway/start", json=config)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                      File "/app/.venv/lib/python3.12/site-packages/hummingbot_api_client/routers/base.py", line 63, in _post
                      async with self.session.post(url, json=json, params=params) as response:
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                      File "/app/.venv/lib/python3.12/site-packages/aiohttp/client.py", line 1510, in aenter
                      self._resp: _RetType = await self._coro
                      ^^^^^^^^^^^^^^^^
                      File "/app/.venv/lib/python3.12/site-packages/aiohttp/client.py", line 779, in _request
                      resp = await handler(req)
                      ^^^^^^^^^^^^^^^^^^
                      File "/app/.venv/lib/python3.12/site-packages/aiohttp/client.py", line 757, in _connect_and_send_request
                      await resp.start(conn)
                      File "/app/.venv/lib/python3.12/site-packages/aiohttp/client_reqrep.py", line 534, in start
                      with self._timer:
                      ^^^^^^^^^^^
                      File "/app/.venv/lib/python3.12/site-packages/aiohttp/helpers.py", line 713, in exit
                      raise asyncio.TimeoutError from exc_val
                      TimeoutError

                  • check /gateway command again
                  • review deployed successfully ✅
                • add wallet: ok ✅
                • configure nodeURL: ok ✅
              • T9

                • /trade
                  • since gateway added and nodeURL changed now showing balance for SOL ✅
                  • changed order amount SOL-USDC ✅
                  • BUY: successfully ✅
                  • SELL: successfully ✅
                  • history: ok ✅
                  • quote: ok ✅
                  • changed connector to hyperliquid_perpetual: ok
                  • changed
                    • leverage: ok
                    • amount: ok
                    • price: ok
                    • ordertype: ok
                    • review that after error /trade command is not refreshed (so stuck on below) ❌
                    • Image
                    • after going with /trade review amounts not saved
                    • Image

@rapcmia rapcmia linked an issue Mar 6, 2026 that may be closed by this pull request
@rapcmia
Copy link
Copy Markdown
Contributor

rapcmia commented Mar 6, 2026

Commit b12bb26

  • Run make install; make run on source

T9 Unified trade ❌

  • When selecting connector, shows both CEX and DEX ✅
    image
    • User have to be connected to gateway in order DEX to be available on the list
  • CEX and DEX routing for trade works ✅
  • Remember preference whenever we changed window, returns on the last page we left
    • However for dex connector (solana), the order amount reverts back to default 1.0 ❌
      image

T10 Bot management ❌

  • Grid Strike setup
    • grid strike - back button returns error after trading pair typo #35
    • Successfully created grid config ✅
    • Successfully deployed hummingbot container ✅
    • However failed to start controller due to Failed to start strategy v2_with_controllers: 1 validation error for GridStrikeConfig: coerce_tp_to_step
      image
      2026-03-06 03:52:21,604 - 17 - hummingbot.core.trading_core - ERROR - Failed to start strategy v2_with_controllers: 1 validation error for GridStrikeConfig
      coerce_tp_to_step
        Extra inputs are not permitted [type=extra_forbidden, input_value=False, input_type=bool]
          For further information visit https://errors.pydantic.dev/2.12/v/extra_forbidden
      2026-03-06 03:52:21,614 - 17 - hummingbot.core.gateway.gateway_http_client - INFO - Gateway Service is ONLINE.
      2026-03-06 03:52:22,578 - 17 - hummingbot.client.hummingbot_application - INFO - MQTT Bridge connected with success.
      
  • PMM (pmm_mister or v1) Setup
  • Deploy bot
    • Start and stop controller ✅
      image
  • When updating controller, i observed that the format of updating parameters are different from where it was created
    • When creating:
      image
    • When updating existing controller config
      image
      • Stop bot and succesfully archived ✅
  • View bot logs ✅
    • User have to refresh in order to get the latest updates
  • Mutli-config deploy ✅
    • Deployed pmm_mister + pmm_v1
    • Also returns archive bot data successfully
      image
  • Upload custom config
    • Uploaded pmm_mister ✅
      image
    • Uploaded lp_rebalancer ✅
      image
    • While we can upload other controller-config, i see that i cannot deploy them on the list of controllers ✅
      image
  • Clone, delete and archive bots
  • Not able to clone a controller-config from a active bot ❌
    image
  • No clone command available for pmm_v1 ❌
    image
  • On archive bots list, im getting error when the bot does not have any trades, returning could not fetch bot data ❗
    image
    • Works ok when I have trade activity on the controller we successfully archived
    • My prev archived bots are also registered and able to fetch the bot data ✅

Test in progress for T11, T12 and T13

@rapcmia
Copy link
Copy Markdown
Contributor

rapcmia commented Mar 6, 2026

Commit 86b37b0

  • Started with gateway enabled and getting this error after using make run on source ❌
    2026-03-06 21:25:00,354 - handlers.agents.session - INFO - Agent health monitor started
    2026-03-06 21:25:00,356 - __main__ - INFO - 👀 Watching for changes in: /home/eddga/hummingbot/condor/32/handlers, /home/eddga/hummingbot/condor/32/routines
    2026-03-06 21:25:00,357 - asyncio - ERROR - Task exception was never retrieved
    future: <Task finished name='Task-8' coro=<watch_and_reload() done, defined at /home/eddga/hummingbot/condor/32/main.py:397> exception=OSError('OS file watch limit reached. about ["/home/eddga/hummingbot/condor/32/handlers/config/gateway"] (Error { kind: MaxFilesWatch, paths: ["/home/eddga/hummingbot/condor/32/handlers/config/gateway"] })')>
    Traceback (most recent call last):
      File "/home/eddga/hummingbot/condor/32/main.py", line 411, in watch_and_reload
        async for changes in awatch(handlers_path, routines_path):
        ...<6 lines>...
                logger.error(f"❌ Auto-reload failed: {e}", exc_info=True)
      File "/home/eddga/hummingbot/condor/32/.venv/lib/python3.13/site-packages/watchfiles/main.py", line 256, in awatch
        with RustNotify(
             ~~~~~~~~~~^
            [str(p) for p in paths], debug, force_polling, poll_delay_ms, recursive, ignore_permission_denied
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        ) as watcher:
        ^
    OSError: OS file watch limit reached. about ["/home/eddga/hummingbot/condor/32/handlers/config/gateway"] (Error { kind: MaxFilesWatch, paths: ["/home/eddga/hummingbot/condor/32/handlers/config/gateway"] })
    2026-03-06 21:25:00,611 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8590178974:AAEY_lj2YFkv_9tyiF9_NR5qo8eLOC0or3E/deleteWebhook "HTTP/1.1 200 OK"
    2026-03-06 21:25:00,613 - apscheduler.scheduler - INFO - Scheduler started
    2026-03-06 21:25:00,613 - telegram.ext.Application - INFO - Application started
    
        with RustNotify(
             ~~~~~~~~~~^
            [str(p) for p in paths], debug, force_polling, poll_delay_ms, recursive, ignore_permission_denied
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        ) as watcher:
        ^
    OSError: OS file watch limit reached. about ["/home/eddga/hummingbot/condor/32/handlers/config/gateway"] (Error { kind: MaxFilesWatch, paths: ["/home/eddga/hummingbot/condor/32/handlers/config/gateway"] })
    
    • Condor still works as expected, looks like related to being rate limited ✅
    • This error only occurred on startup
  • Build local docker image and deployed successfully using make deploy
    image

T11 Executors

  • Tested grid and position executor ✅
  • View and stop ✅

T12 Routines

  • List routines (one-shot and continuous) ✅
  • Run one-shot hello world
  • Edit config price monitor ✅
  • Schedule interval using hello word every 30s interval ✅
  • Schedule daily using hello word and setup daily at HH:MM format ✅
  • Start continous using price_monitor
    image
  • Invalid config by sending ralph=1 ✅
    image
  • Arb check ✅
  • lp_monitor and lp_tp/sl
    • opened lp position on meteora/clmm
    • Found routines are working on the background
      2026-03-06 12:43:22,096 - routines.lp_tpsl - INFO - LP TP/SL check #40: tracking 0 positions
      2026-03-06 12:43:22,799 - routines.lp_monitor - INFO - LP Monitor #50: 1 positions, 0 alerts
      
    • No alerts so far while routines are running on background
  • Restarted condor and observed same condor logs where routines are being checked ✅

T13 AI Agent Sessions

  • Does not start gemini due to Failed to start agent session
    image
    2026-03-06 13:09:31,568 - handlers.agents - ERROR - Failed to start agent session
    Traceback (most recent call last):
      File "/app/handlers/agents/__init__.py", line 111, in _handle_select
        await get_or_create_session(
      File "/app/handlers/agents/session.py", line 128, in get_or_create_session
        await client.start()
      File "/app/condor/acp/client.py", line 139, in start
        await self._start_gemini()
      File "/app/condor/acp/client.py", line 164, in _start_gemini
        await self._peer.send_request(
      File "/app/condor/acp/jsonrpc.py", line 55, in send_request
        return await future
               ^^^^^^^^^^^^
    condor.acp.jsonrpc.JSONRPCError: [-32603] Internal error
    

Copy link
Copy Markdown
Contributor

@nikspz nikspz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • commit a43a2c3
    • condor
    • hummingbot-api
    • added server to admin account successfully
    • added account ✅
      • could see for admin account successsfully ✅
    • New user registration: ok ✅
      • user need permission to check portfolio ✅
      • /start send reuqest to admin ✅
      • approved request - User could see portfolio now ✅
        • Role: User
      • Blocked user from Admin panel
        • Access denied for user now ✅
    • Grid executor fix ✅
      • deployed successfully ✅
      • review orders placed / filled on the exchange ✅
      • Image

@rapcmia
Copy link
Copy Markdown
Contributor

rapcmia commented Mar 9, 2026

Commit a43a2c3

  • Tested on both source and docker build for comparison ✅
    • When creating controllers, i see changes on the formatting of controllers ❗
      image
      image
    • Compare with Fede’s condor app and its different
      image

T2 Server management

  • View roles has been removed from the list ✅
    image

T8 DEX Liquidity

T10 bot management

However failed to start controller due to Failed to start strategy v2_with_controllers: 1 validation error for GridStrikeConfig: coerce_tp_to_step ❌

  • Successfully deployed and issue fixed ✅
    image

T13 AI Agent Session

  • Im still not able to start gemini
    2026-03-09 11:43:02,840 - handlers.agents - ERROR - Failed to start agent session
    Traceback (most recent call last):
      File "/home/eddga/hummingbot/condor/32/handlers/agents/__init__.py", line 125, in _handle_select
        await get_or_create_session(
        ...<4 lines>...
        )
      File "/home/eddga/hummingbot/condor/32/handlers/agents/session.py", line 128, in get_or_create_session
        await client.start()
      File "/home/eddga/hummingbot/condor/32/condor/acp/client.py", line 139, in start
        await self._start_gemini()
      File "/home/eddga/hummingbot/condor/32/condor/acp/client.py", line 164, in _start_gemini
        await self._peer.send_request(
        ...<3 lines>...
        )
      File "/home/eddga/hummingbot/condor/32/condor/acp/jsonrpc.py", line 55, in send_request
        return await future
               ^^^^^^^^^^^^
    condor.acp.jsonrpc.JSONRPCError: [-32603] Internal error
    
    • Added GEMINI_API_KEY and GOOGLE_API_KEY on .env file
    • Run on source and docker build, same error occurred ❌

@rapcmia rapcmia merged commit f06b30a into main Mar 9, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Deploy - Failed to start controller pmm_mister

3 participants