# TraderAI Local Ollama-powered chat for UEX marketplace workflows. ## What It Does - Searches active/current UEX marketplace listings through `GET /marketplace_listings/`. - Reads authenticated marketplace negotiations and negotiation messages when `UEX_SECRET_KEY` or `UEX_BEARER_TOKEN` is set. - Drafts negotiation messages and marketplace listings as pending actions. - Requires browser approval before sending authenticated write requests to UEX. - Maintains local SQLite memory with searchable recall for user facts, preferences, and prior chat context. - Can create one-time or recurring wake jobs that prompt the assistant later and surface the result in the UI. - Loads the configured UEX user profile from `GET /user` so the assistant knows the current account username, display name, timezone, language, and marketplace-relevant profile details. - Polls authenticated `GET /user_notifications` for unread UEX notifications and surfaces new pending alerts in the chat notification queue. ## Setup 1. Install Python 3.11+. 2. Install Ollama and pull a tool-capable model, for example: ```powershell ollama pull qwen3.5:9b ``` 3. Create `.env` from `.env.example` and set `UEX_SECRET_KEY` and/or `UEX_BEARER_TOKEN` if you want authenticated actions. 4. Install and run: ```powershell pip install -e . uvicorn traderai.server:app --reload ``` 5. Open `http://127.0.0.1:8000`. ## Notes Ollama runs locally at `http://localhost:11434` by default. This app talks to Ollama's native chat API with tool schemas, then executes approved UEX calls in the FastAPI backend. `OLLAMA_NUM_CTX` controls the per-request Ollama context window; `64000` is the default because Ollama recommends at least 64k tokens for agent-style workflows when hardware allows it. UEX marketplace posting and negotiation messages are guarded because they are account-affecting write actions. The model can draft them, but the UI approval button performs the final API call. The assistant gets runtime context on every chat: current date/time, authenticated UEX identity when credentials are configured, remembered user profile, last interaction time, relevant memories, and recent conversation excerpts. It is instructed to prefer open/current marketplace data, avoid historical sale information unless explicitly requested, and treat UEX prices as in-game aUEC/UEC credits rather than real-world dollars. Memory is stored locally at `TRADERAI_MEMORY_PATH`. Wake jobs can be created from chat, for example: ```text At 9 PM remind yourself to check my open Polaris Bit negotiations. ``` or: ```text Every day at 9 AM, wake up and check whether I have marketplace followups. ``` The scheduler accepts one-time ISO datetimes and five-field cron expressions through the `schedule_wake_job` tool. When a wake job fires, the assistant receives context like the current time and last interaction time, then places its response into the UI notification queue. UEX notifications are checked every `UEX_NOTIFICATION_POLL_SECONDS` seconds by default. New unread notifications are deduplicated locally, then displayed in the chat through the same notification queue used by wake jobs. ## Sources Used - UEX SwaggerHub OpenAPI v2.1: https://app.swaggerhub.com/apis-docs/dolejska-daniel/UEX-API/v2.1 - UEX marketplace listings docs: https://uexcorp.space/api/documentation/id/get_marketplace_listings/?is_kiosk=1 - UEX negotiation message docs: https://uexcorp.space/api/documentation/id/post_marketplace_negotiations_messages/?is_kiosk=1 - Ollama tool calling docs: https://docs.ollama.com/capabilities/tool-calling - Ollama API streaming/tool-call reference: https://github.com/ollama/ollama/blob/main/docs/api.md - Ollama context length docs: https://docs.ollama.com/context-length - SQLite FTS5 docs: https://www.sqlite.org/fts5.html - APScheduler AsyncIO scheduler docs: https://apscheduler.readthedocs.io/en/stable/modules/schedulers/asyncio.html - Letta/MemGPT memory hierarchy background: https://docs.letta.com/concepts/letta