1- import os
2- import json
31import ast
2+ import json
3+ import logging
4+ import math
5+ import os
46import re
57from typing import List , Dict , Any
68
7- import math
8-
99from dotenv import load_dotenv
1010from langchain_core .messages import HumanMessage , SystemMessage
1111from langchain_openai import ChatOpenAI
1616from agents .application .prompts import Prompter
1717from agents .polymarket .polymarket import Polymarket
1818
19+ logger = logging .getLogger (__name__ )
20+
1921def retain_keys (data , keys_to_retain ):
2022 if isinstance (data , dict ):
2123 return {
@@ -129,9 +131,7 @@ def filter_events(self, events: "list[SimpleEvent]") -> str:
129131
130132 def filter_events_with_rag (self , events : "list[SimpleEvent]" ) -> str :
131133 prompt = self .prompter .filter_events ()
132- print ()
133- print ("... prompting ... " , prompt )
134- print ()
134+ logger .info ("... prompting ... %s" , prompt )
135135 return self .chroma .events (events , prompt )
136136
137137 def map_filtered_events_to_markets (
@@ -149,9 +149,7 @@ def map_filtered_events_to_markets(
149149
150150 def filter_markets (self , markets ) -> "list[tuple]" :
151151 prompt = self .prompter .filter_markets ()
152- print ()
153- print ("... prompting ... " , prompt )
154- print ()
152+ logger .info ("... prompting ... %s" , prompt )
155153 return self .chroma .markets (markets , prompt )
156154
157155 def source_best_trade (self , market_object ) -> str :
@@ -163,36 +161,55 @@ def source_best_trade(self, market_object) -> str:
163161 description = market_document ["page_content" ]
164162
165163 prompt = self .prompter .superforecaster (question , description , outcomes )
166- print ()
167- print ("... prompting ... " , prompt )
168- print ()
164+ logger .info ("... prompting superforecaster: %s" , prompt )
169165 result = self .llm .invoke (prompt )
170166 content = result .content
167+ logger .info ("Superforecaster result: %s" , content )
171168
172- print ("result: " , content )
173- print ()
174169 prompt = self .prompter .one_best_trade (content , outcomes , outcome_prices )
175- print ("... prompting ... " , prompt )
176- print ()
170+ logger .info ("... prompting trade: %s" , prompt )
177171 result = self .llm .invoke (prompt )
178172 content = result .content
179-
180- print ("result: " , content )
181- print ()
173+ logger .info ("Trade result: %s" , content )
182174 return content
183175
184176 def format_trade_prompt_for_execution (self , best_trade : str ) -> float :
177+ """Parse LLM trade output into a safe USDC amount.
178+
179+ Expected format: 'price:0.5, size:0.1, side:BUY,'
180+ Returns: size_fraction * usdc_balance
181+ """
185182 data = best_trade .split ("," )
186- # price = re.findall("\d+\.\d+", data[0])[0]
187- size = re .findall ("\d+\.\d+" , data [1 ])[0 ]
183+ if len (data ) < 2 :
184+ raise ValueError (
185+ f"Trade output has unexpected format (need >=2 comma-separated parts): { best_trade !r} "
186+ )
187+
188+ size_matches = re .findall (r"\d+\.?\d*" , data [1 ])
189+ if not size_matches :
190+ raise ValueError (
191+ f"Could not extract size from trade output: { data [1 ]!r} "
192+ )
193+
194+ size = float (size_matches [0 ])
195+ if not (0 < size <= 1 ):
196+ raise ValueError (
197+ f"Trade size { size } out of safe range (0, 1] — refusing to execute"
198+ )
199+
188200 usdc_balance = self .polymarket .get_usdc_balance ()
189- return float (size ) * usdc_balance
201+ amount = size * usdc_balance
202+ logger .info (
203+ "Trade size fraction: %.4f, USDC balance: %.2f, order amount: %.2f" ,
204+ size ,
205+ usdc_balance ,
206+ amount ,
207+ )
208+ return amount
190209
191210 def source_best_market_to_create (self , filtered_markets ) -> str :
192211 prompt = self .prompter .create_new_market (filtered_markets )
193- print ()
194- print ("... prompting ... " , prompt )
195- print ()
212+ logger .info ("... prompting market creation: %s" , prompt )
196213 result = self .llm .invoke (prompt )
197214 content = result .content
198215 return content
0 commit comments