prediction-market-agent-tooling 0.57.0__py3-none-any.whl → 0.57.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -188,14 +188,14 @@ class APIKeys(BaseSettings):
188
188
  return {
189
189
  k: v
190
190
  for k, v in self.model_dump().items()
191
- if APIKeys.model_fields[k].annotation not in SECRET_TYPES and v is not None
191
+ if self.model_fields[k].annotation not in SECRET_TYPES and v is not None
192
192
  }
193
193
 
194
194
  def model_dump_secrets(self) -> dict[str, t.Any]:
195
195
  return {
196
196
  k: v.get_secret_value() if isinstance(v, SecretStr) else v
197
197
  for k, v in self.model_dump().items()
198
- if APIKeys.model_fields[k].annotation in SECRET_TYPES and v is not None
198
+ if self.model_fields[k].annotation in SECRET_TYPES and v is not None
199
199
  }
200
200
 
201
201
  def check_if_is_safe_owner(self, ethereum_client: EthereumClient) -> bool:
@@ -797,9 +797,13 @@ class ContractPrediction(BaseModel):
797
797
  return Web3.to_checksum_address(self.publisher)
798
798
 
799
799
  @staticmethod
800
- def from_tuple(values: tuple[t.Any]) -> "ContractPrediction":
801
- data = {k: v for k, v in zip(ContractPrediction.model_fields.keys(), values)}
802
- return ContractPrediction.model_validate(data)
800
+ def from_tuple(values: tuple[t.Any, ...]) -> "ContractPrediction":
801
+ return ContractPrediction(
802
+ publisher=values[0],
803
+ ipfs_hash=values[1],
804
+ tx_hashes=values[2],
805
+ estimated_probability_bps=values[3],
806
+ )
803
807
 
804
808
 
805
809
  class IPFSAgentResult(BaseModel):
@@ -538,7 +538,7 @@ class OmenKlerosContract(ContractOnGnosisChain):
538
538
  address = "0xe40DD83a262da3f56976038F1554Fe541Fa75ecd"
539
539
 
540
540
  elif arbitrator == Arbitrator.KLEROS_31_JURORS_WITH_APPEAL:
541
- address = "0x29f39de98d750eb77b5fafb31b2837f079fce222"
541
+ address = "0x5562Ac605764DC4039fb6aB56a74f7321396Cdf2"
542
542
 
543
543
  else:
544
544
  raise ValueError(f"Unsupported arbitrator: {arbitrator=}")
@@ -223,7 +223,7 @@ def monitor_agent(agent: DeployedAgent) -> None:
223
223
  )
224
224
  .interactive()
225
225
  )
226
- st.altair_chart( # type: ignore # Doesn't expect `LayerChart`, but `Chart`, yet it works.
226
+ st.altair_chart(
227
227
  per_day_accuracy_chart.mark_line()
228
228
  + per_day_accuracy_chart.transform_loess("x-axis-day", "Is Correct").mark_line(
229
229
  color="red", strokeDash=[5, 5]
@@ -1,7 +1,7 @@
1
1
  import hashlib
2
2
  import inspect
3
3
  import json
4
- from datetime import date, timedelta
4
+ from datetime import timedelta
5
5
  from functools import wraps
6
6
  from typing import (
7
7
  Any,
@@ -17,11 +17,12 @@ from typing import (
17
17
  from pydantic import BaseModel
18
18
  from sqlalchemy import Column
19
19
  from sqlalchemy.dialects.postgresql import JSONB
20
- from sqlmodel import Field, Session, SQLModel, create_engine, desc, select
20
+ from sqlmodel import Field, SQLModel, desc, select
21
21
 
22
22
  from prediction_market_agent_tooling.config import APIKeys
23
23
  from prediction_market_agent_tooling.loggers import logger
24
24
  from prediction_market_agent_tooling.tools.datetime_utc import DatetimeUTC
25
+ from prediction_market_agent_tooling.tools.db.db_manager import DBManager
25
26
  from prediction_market_agent_tooling.tools.utils import utcnow
26
27
 
27
28
  FunctionT = TypeVar("FunctionT", bound=Callable[..., Any])
@@ -97,16 +98,7 @@ def db_cache(
97
98
  if not api_keys.ENABLE_CACHE:
98
99
  return func(*args, **kwargs)
99
100
 
100
- engine = create_engine(
101
- api_keys.sqlalchemy_db_url.get_secret_value(),
102
- # Use custom json serializer and deserializer, because otherwise, for example `datetime` serialization would fail.
103
- json_serializer=json_serializer,
104
- json_deserializer=json_deserializer,
105
- pool_size=1,
106
- )
107
-
108
- # Create table if it doesn't exist
109
- SQLModel.metadata.create_all(engine)
101
+ DBManager(api_keys).create_tables([FunctionCache])
110
102
 
111
103
  # Convert *args and **kwargs to a single dictionary, where we have names for arguments passed as args as well.
112
104
  signature = inspect.signature(func)
@@ -147,12 +139,11 @@ def db_cache(
147
139
 
148
140
  # Determine if the function returns or contains Pydantic BaseModel(s)
149
141
  return_type = func.__annotations__.get("return", None)
150
- is_pydantic_model = False
151
-
152
- if return_type is not None and contains_pydantic_model(return_type):
153
- is_pydantic_model = True
142
+ is_pydantic_model = return_type is not None and contains_pydantic_model(
143
+ return_type
144
+ )
154
145
 
155
- with Session(engine) as session:
146
+ with DBManager(api_keys).get_session() as session:
156
147
  # Try to get cached result
157
148
  statement = (
158
149
  select(FunctionCache)
@@ -205,12 +196,11 @@ def db_cache(
205
196
  result=computed_result,
206
197
  created_at=utcnow(),
207
198
  )
208
- with Session(engine) as session:
199
+ with DBManager(api_keys).get_session() as session:
209
200
  logger.info(f"Saving {cache_entry} into database.")
210
201
  session.add(cache_entry)
211
202
  session.commit()
212
203
 
213
- engine.dispose()
214
204
  return computed_result
215
205
 
216
206
  return cast(FunctionT, wrapper)
@@ -230,60 +220,6 @@ def contains_pydantic_model(return_type: Any) -> bool:
230
220
  return False
231
221
 
232
222
 
233
- def json_serializer_default_fn(
234
- y: DatetimeUTC | timedelta | date | BaseModel,
235
- ) -> str | dict[str, Any]:
236
- """
237
- Used to serialize objects that don't support it by default into a specific string that can be deserialized out later.
238
- If this function returns a dictionary, it will be called recursivelly.
239
- If you add something here, also add it to `replace_custom_stringified_objects` below.
240
- """
241
- if isinstance(y, DatetimeUTC):
242
- return f"DatetimeUTC::{y.isoformat()}"
243
- elif isinstance(y, timedelta):
244
- return f"timedelta::{y.total_seconds()}"
245
- elif isinstance(y, date):
246
- return f"date::{y.isoformat()}"
247
- elif isinstance(y, BaseModel):
248
- return y.model_dump()
249
- raise TypeError(
250
- f"Unsuported type for the default json serialize function, value is {y}."
251
- )
252
-
253
-
254
- def json_serializer(x: Any) -> str:
255
- return json.dumps(x, default=json_serializer_default_fn)
256
-
257
-
258
- def replace_custom_stringified_objects(obj: Any) -> Any:
259
- """
260
- Used to deserialize objects from `json_serializer_default_fn` into their proper form.
261
- """
262
- if isinstance(obj, str):
263
- if obj.startswith("DatetimeUTC::"):
264
- iso_str = obj[len("DatetimeUTC::") :]
265
- return DatetimeUTC.to_datetime_utc(iso_str)
266
- elif obj.startswith("timedelta::"):
267
- total_seconds_str = obj[len("timedelta::") :]
268
- return timedelta(seconds=float(total_seconds_str))
269
- elif obj.startswith("date::"):
270
- iso_str = obj[len("date::") :]
271
- return date.fromisoformat(iso_str)
272
- else:
273
- return obj
274
- elif isinstance(obj, dict):
275
- return {k: replace_custom_stringified_objects(v) for k, v in obj.items()}
276
- elif isinstance(obj, list):
277
- return [replace_custom_stringified_objects(item) for item in obj]
278
- else:
279
- return obj
280
-
281
-
282
- def json_deserializer(s: str) -> Any:
283
- data = json.loads(s)
284
- return replace_custom_stringified_objects(data)
285
-
286
-
287
223
  def convert_cached_output_to_pydantic(return_type: Any, data: Any) -> Any:
288
224
  """
289
225
  Used to initialize Pydantic models from anything cached that was originally a Pydantic model in the output. Including models in nested structures.
@@ -0,0 +1,61 @@
1
+ import json
2
+ import typing as t
3
+ from datetime import date, timedelta
4
+
5
+ from pydantic import BaseModel
6
+
7
+ from prediction_market_agent_tooling.tools.datetime_utc import DatetimeUTC
8
+
9
+
10
+ def json_serializer(x: t.Any) -> str:
11
+ return json.dumps(x, default=json_serializer_default_fn)
12
+
13
+
14
+ def json_serializer_default_fn(
15
+ y: DatetimeUTC | timedelta | date | BaseModel,
16
+ ) -> str | dict[str, t.Any]:
17
+ """
18
+ Used to serialize objects that don't support it by default into a specific string that can be deserialized out later.
19
+ If this function returns a dictionary, it will be called recursivelly.
20
+ If you add something here, also add it to `replace_custom_stringified_objects` below.
21
+ """
22
+ if isinstance(y, DatetimeUTC):
23
+ return f"DatetimeUTC::{y.isoformat()}"
24
+ elif isinstance(y, timedelta):
25
+ return f"timedelta::{y.total_seconds()}"
26
+ elif isinstance(y, date):
27
+ return f"date::{y.isoformat()}"
28
+ elif isinstance(y, BaseModel):
29
+ return y.model_dump()
30
+ raise TypeError(
31
+ f"Unsuported type for the default json serialize function, value is {y}."
32
+ )
33
+
34
+
35
+ def json_deserializer(s: str) -> t.Any:
36
+ data = json.loads(s)
37
+ return replace_custom_stringified_objects(data)
38
+
39
+
40
+ def replace_custom_stringified_objects(obj: t.Any) -> t.Any:
41
+ """
42
+ Used to deserialize objects from `json_serializer_default_fn` into their proper form.
43
+ """
44
+ if isinstance(obj, str):
45
+ if obj.startswith("DatetimeUTC::"):
46
+ iso_str = obj[len("DatetimeUTC::") :]
47
+ return DatetimeUTC.to_datetime_utc(iso_str)
48
+ elif obj.startswith("timedelta::"):
49
+ total_seconds_str = obj[len("timedelta::") :]
50
+ return timedelta(seconds=float(total_seconds_str))
51
+ elif obj.startswith("date::"):
52
+ iso_str = obj[len("date::") :]
53
+ return date.fromisoformat(iso_str)
54
+ else:
55
+ return obj
56
+ elif isinstance(obj, dict):
57
+ return {k: replace_custom_stringified_objects(v) for k, v in obj.items()}
58
+ elif isinstance(obj, list):
59
+ return [replace_custom_stringified_objects(item) for item in obj]
60
+ else:
61
+ return obj
@@ -0,0 +1,76 @@
1
+ import hashlib
2
+ from contextlib import contextmanager
3
+ from typing import Generator, Sequence
4
+
5
+ from sqlalchemy import Connection
6
+ from sqlmodel import Session, SQLModel, create_engine
7
+
8
+ from prediction_market_agent_tooling.config import APIKeys
9
+ from prediction_market_agent_tooling.tools.caches.serializers import (
10
+ json_deserializer,
11
+ json_serializer,
12
+ )
13
+
14
+
15
+ class DBManager:
16
+ _instances: dict[str, "DBManager"] = {}
17
+
18
+ def __new__(cls, api_keys: APIKeys | None = None) -> "DBManager":
19
+ sqlalchemy_db_url = (api_keys or APIKeys()).sqlalchemy_db_url
20
+ # Hash the secret value to not store secrets in plain text.
21
+ url_hash = hashlib.md5(
22
+ sqlalchemy_db_url.get_secret_value().encode()
23
+ ).hexdigest()
24
+ # Return singleton per database connection.
25
+ if url_hash not in cls._instances:
26
+ instance = super(DBManager, cls).__new__(cls)
27
+ cls._instances[url_hash] = instance
28
+ return cls._instances[url_hash]
29
+
30
+ def __init__(self, api_keys: APIKeys | None = None) -> None:
31
+ sqlalchemy_db_url = (api_keys or APIKeys()).sqlalchemy_db_url
32
+ self._engine = create_engine(
33
+ sqlalchemy_db_url.get_secret_value(),
34
+ json_serializer=json_serializer,
35
+ json_deserializer=json_deserializer,
36
+ pool_size=20,
37
+ pool_recycle=3600,
38
+ echo=True,
39
+ )
40
+ self.cache_table_initialized: dict[str, bool] = {}
41
+
42
+ @contextmanager
43
+ def get_session(self) -> Generator[Session, None, None]:
44
+ with Session(self._engine) as session:
45
+ yield session
46
+
47
+ @contextmanager
48
+ def get_connection(self) -> Generator[Connection, None, None]:
49
+ with self.get_session() as session:
50
+ yield session.connection()
51
+
52
+ def create_tables(
53
+ self, sqlmodel_tables: Sequence[type[SQLModel]] | None = None
54
+ ) -> None:
55
+ # Determine tables to create
56
+ if sqlmodel_tables is not None:
57
+ tables_to_create = []
58
+ for sqlmodel_table in sqlmodel_tables:
59
+ table_name = (
60
+ sqlmodel_table.__tablename__()
61
+ if callable(sqlmodel_table.__tablename__)
62
+ else sqlmodel_table.__tablename__
63
+ )
64
+ table = SQLModel.metadata.tables[table_name]
65
+ if not self.cache_table_initialized.get(table.name):
66
+ tables_to_create.append(table)
67
+ else:
68
+ tables_to_create = None
69
+
70
+ # Create tables in the database
71
+ SQLModel.metadata.create_all(self._engine, tables=tables_to_create)
72
+
73
+ # Update cache to mark tables as initialized
74
+ if tables_to_create:
75
+ for table in tables_to_create:
76
+ self.cache_table_initialized[table.name] = True
@@ -1,10 +1,11 @@
1
1
  from datetime import datetime, timedelta
2
2
 
3
3
  from pydantic import ValidationError
4
- from sqlmodel import Field, Session, SQLModel, create_engine, desc, select
4
+ from sqlmodel import Field, SQLModel, desc, select
5
5
 
6
6
  from prediction_market_agent_tooling.config import APIKeys
7
7
  from prediction_market_agent_tooling.loggers import logger
8
+ from prediction_market_agent_tooling.tools.db.db_manager import DBManager
8
9
  from prediction_market_agent_tooling.tools.relevant_news_analysis.data_models import (
9
10
  NoRelevantNews,
10
11
  RelevantNews,
@@ -23,33 +24,22 @@ class RelevantNewsCacheModel(SQLModel, table=True):
23
24
 
24
25
 
25
26
  class RelevantNewsResponseCache:
26
- def __init__(self, sqlalchemy_db_url: str | None = None):
27
- self.engine = create_engine(
28
- (
29
- sqlalchemy_db_url
30
- if sqlalchemy_db_url
31
- else APIKeys().sqlalchemy_db_url.get_secret_value()
32
- ),
33
- pool_size=1,
34
- )
27
+ def __init__(self, api_keys: APIKeys | None = None):
28
+ self.db_manager = DBManager(api_keys)
35
29
  self._initialize_db()
36
30
 
37
31
  def _initialize_db(self) -> None:
38
32
  """
39
33
  Creates the tables if they don't exist
40
34
  """
41
- with self.engine.connect() as conn:
42
- SQLModel.metadata.create_all(
43
- conn,
44
- tables=[SQLModel.metadata.tables[RelevantNewsCacheModel.__tablename__]],
45
- )
35
+ self.db_manager.create_tables([RelevantNewsCacheModel])
46
36
 
47
37
  def find(
48
38
  self,
49
39
  question: str,
50
40
  days_ago: int,
51
41
  ) -> RelevantNews | NoRelevantNews | None:
52
- with Session(self.engine) as session:
42
+ with self.db_manager.get_session() as session:
53
43
  query = (
54
44
  select(RelevantNewsCacheModel)
55
45
  .where(RelevantNewsCacheModel.question == question)
@@ -82,7 +72,7 @@ class RelevantNewsResponseCache:
82
72
  days_ago: int,
83
73
  relevant_news: RelevantNews | None,
84
74
  ) -> None:
85
- with Session(self.engine) as session:
75
+ with self.db_manager.get_session() as session:
86
76
  cached = RelevantNewsCacheModel(
87
77
  question=question,
88
78
  days_ago=days_ago,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prediction-market-agent-tooling
3
- Version: 0.57.0
3
+ Version: 0.57.1
4
4
  Summary: Tools to benchmark, deploy and monitor prediction market agents.
5
5
  Author: Gnosis
6
6
  Requires-Python: >=3.10,<3.12
@@ -16,7 +16,7 @@ prediction_market_agent_tooling/benchmark/__init__.py,sha256=47DEQpj8HBSa-_TImW-
16
16
  prediction_market_agent_tooling/benchmark/agents.py,sha256=B1-uWdyeN4GGKMWGK_-CcAFJg1m9Y_XuaeIHPB29QR8,3971
17
17
  prediction_market_agent_tooling/benchmark/benchmark.py,sha256=MqTiaaJ3cYiOLUVR7OyImLWxcEya3Rl5JyFYW-K0lwM,17097
18
18
  prediction_market_agent_tooling/benchmark/utils.py,sha256=D0MfUkVZllmvcU0VOurk9tcKT7JTtwwOp-63zuCBVuc,2880
19
- prediction_market_agent_tooling/config.py,sha256=13qhBE68CZTnHYVDUxGs4yj_d75WM8QqJVg0a-wAoWA,7559
19
+ prediction_market_agent_tooling/config.py,sha256=Ffb1ftRiguAxa5cS0nXvKK01HomdqzFDCsp8rFd5taM,7553
20
20
  prediction_market_agent_tooling/deploy/agent.py,sha256=58Ms6wFcRM3yhpdDVT-ohryZhHJNinn1Z4MdrmCMXvM,23627
21
21
  prediction_market_agent_tooling/deploy/agent_example.py,sha256=dIIdZashExWk9tOdyDjw87AuUcGyM7jYxNChYrVK2dM,1001
22
22
  prediction_market_agent_tooling/deploy/betting_strategy.py,sha256=kMrIE3wMv_IB6nJd_1DmDXDkEZhsXFOgyTd7JZ0gqHI,13068
@@ -45,9 +45,9 @@ prediction_market_agent_tooling/markets/metaculus/api.py,sha256=4TRPGytQQbSdf42D
45
45
  prediction_market_agent_tooling/markets/metaculus/data_models.py,sha256=Suxa7xELdYuFNKqvGvFh8qyfVtAg79E-vaQ6dqNZOtA,3261
46
46
  prediction_market_agent_tooling/markets/metaculus/metaculus.py,sha256=86TIx6cavEWc8Cv4KpZxSvwiSw9oFybXE3YB49pg-CA,4377
47
47
  prediction_market_agent_tooling/markets/omen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
- prediction_market_agent_tooling/markets/omen/data_models.py,sha256=RM5EigkxBArGRAyolgqqHsdIap-FT3FfbvtlWZJwo10,27711
48
+ prediction_market_agent_tooling/markets/omen/data_models.py,sha256=sUiv8xdccvw15ndgbHIavwz7O_eBxp4wGX2zuuZkd2g,27768
49
49
  prediction_market_agent_tooling/markets/omen/omen.py,sha256=6zo8iBBLdI9g9keJ1dw9PXs4rf4V4tCW8D4e08f3g0Q,51349
50
- prediction_market_agent_tooling/markets/omen/omen_contracts.py,sha256=Zq7SncCq-hvpgXKsVruGBGCn1OhKZTe7r1qLdCTrT2w,28297
50
+ prediction_market_agent_tooling/markets/omen/omen_contracts.py,sha256=baXJwk-jSI3-FV-k239oCNOA4oKz6LT47juX8AKpW3A,28297
51
51
  prediction_market_agent_tooling/markets/omen/omen_resolving.py,sha256=iDWdjICGkt968exwCjY-6nsnQyrrNAg3YjnDdP430GQ,9415
52
52
  prediction_market_agent_tooling/markets/omen/omen_subgraph_handler.py,sha256=lG-2hCmmkjKHX1Ca-SipLBeETnTheXpjg5Qfed0tqFo,36506
53
53
  prediction_market_agent_tooling/markets/polymarket/api.py,sha256=UZ4_TG8ceb9Y-qgsOKs8Qiv8zDt957QkT8IX2c83yqo,4800
@@ -62,7 +62,7 @@ prediction_market_agent_tooling/monitor/markets/manifold.py,sha256=TS4ERwTfQnot8
62
62
  prediction_market_agent_tooling/monitor/markets/metaculus.py,sha256=LOnyWWBFdg10-cTWdb76nOsNjDloO8OfMT85GBzRCFI,1455
63
63
  prediction_market_agent_tooling/monitor/markets/omen.py,sha256=EqiJYTvDbSu7fBpbrBmCuf3fc6GHr4MxWrBGa69MIyc,3305
64
64
  prediction_market_agent_tooling/monitor/markets/polymarket.py,sha256=wak8o4BYaGbLpshQD12OrsqNABdanyID6ql95lEG2io,1870
65
- prediction_market_agent_tooling/monitor/monitor.py,sha256=-82COVrQwabUN7N-c8DbotRut9MbYcpfRGo6Cks92d0,14309
65
+ prediction_market_agent_tooling/monitor/monitor.py,sha256=4kMev1iGHQiEFslEqt5bWiXAyM_Qxb4rdMVKx2H9e1U,14235
66
66
  prediction_market_agent_tooling/monitor/monitor_app.py,sha256=zNHSwH_KEiv8aOwvfo1JrNuSFMefpzXPWtellhnJpTI,4775
67
67
  prediction_market_agent_tooling/monitor/monitor_settings.py,sha256=Xiozs3AsufuJ04JOe1vjUri-IAMWHjjmc2ugGGiHNH4,947
68
68
  prediction_market_agent_tooling/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -72,12 +72,14 @@ prediction_market_agent_tooling/tools/betting_strategies/market_moving.py,sha256
72
72
  prediction_market_agent_tooling/tools/betting_strategies/minimum_bet_to_win.py,sha256=-FUSuQQgjcWSSnoFxnlAyTeilY6raJABJVM2QKkFqAY,438
73
73
  prediction_market_agent_tooling/tools/betting_strategies/stretch_bet_between.py,sha256=THMXwFlskvzbjnX_OiYtDSzI8XVFyULWfP2525_9UGc,429
74
74
  prediction_market_agent_tooling/tools/betting_strategies/utils.py,sha256=kpIb-ci67Vc1Yqqaa-_S4OUkbhWSIYog4_Iwp69HU_k,97
75
- prediction_market_agent_tooling/tools/caches/db_cache.py,sha256=yQ5sbccFf75jdj71zmlbJ8z5u2cfQzSRgY4haFG43I0,12712
75
+ prediction_market_agent_tooling/tools/caches/db_cache.py,sha256=rkA7somZZo5G6OZVvNrCuCVc4kn7TUoPxmOq4J6BZ54,10391
76
76
  prediction_market_agent_tooling/tools/caches/inmemory_cache.py,sha256=tGHHd9HCiE_hCCtPtloHZQdDfBuiow9YsqJNYi2Tx_0,499
77
+ prediction_market_agent_tooling/tools/caches/serializers.py,sha256=upSXN5__rmRlzJ6tv1h7FodKzJu9eCkFrN_zeuwroJM,2151
77
78
  prediction_market_agent_tooling/tools/contract.py,sha256=Um_nQlpYJRBy4MnNR1CPKESehVwx_w35LwYX6T6py_0,20837
78
79
  prediction_market_agent_tooling/tools/costs.py,sha256=EaAJ7v9laD4VEV3d8B44M4u3_oEO_H16jRVCdoZ93Uw,954
79
80
  prediction_market_agent_tooling/tools/custom_exceptions.py,sha256=Fh8z1fbwONvP4-j7AmV_PuEcoqb6-QXa9PJ9m7guMcM,93
80
81
  prediction_market_agent_tooling/tools/datetime_utc.py,sha256=2JSWF7AXQnv04_D_cu9Vmdkq0TWmGJ1QcK9AeqrA-U8,2765
82
+ prediction_market_agent_tooling/tools/db/db_manager.py,sha256=-WGYY-ZyqPveXb642gw4-Zh-RicMrBFgx7uqCB8TuDg,2801
81
83
  prediction_market_agent_tooling/tools/google_utils.py,sha256=t3_UEEvKX3L0biSIQ560GdRbllQ6eprhK_upE243A-0,3185
82
84
  prediction_market_agent_tooling/tools/hexbytes_custom.py,sha256=Bp94qgPjvjWf1Vb4lNzGFDXRdThw1rJ91vL6r2PWq5E,2096
83
85
  prediction_market_agent_tooling/tools/httpx_cached_client.py,sha256=0-N1r0zcGKlY9Rk-Ab8hbqwc54eMbsoa3jXL0_yCCiM,355
@@ -92,7 +94,7 @@ prediction_market_agent_tooling/tools/omen/reality_accuracy.py,sha256=M1SF7iSW1g
92
94
  prediction_market_agent_tooling/tools/parallelism.py,sha256=6Gou0hbjtMZrYvxjTDFUDZuxmE2nqZVbb6hkg1hF82A,1022
93
95
  prediction_market_agent_tooling/tools/relevant_news_analysis/data_models.py,sha256=95l84aztFaxcRLLcRQ46yKJbIlOEuDAbIGLouyliDzA,1316
94
96
  prediction_market_agent_tooling/tools/relevant_news_analysis/relevant_news_analysis.py,sha256=CddJem7tk15NAudJDwmuL8znTycbR-YI8kTNtd3LzG8,5474
95
- prediction_market_agent_tooling/tools/relevant_news_analysis/relevant_news_cache.py,sha256=Dcde74ZwoZuohhJ8gIO5GQkdAz1YrAKlvrM8CNgRqWw,3289
97
+ prediction_market_agent_tooling/tools/relevant_news_analysis/relevant_news_cache.py,sha256=ErLp284YlD7k_M8Si9OT86HuzfmSo1bPlLJtegXx1TA,3011
96
98
  prediction_market_agent_tooling/tools/safe.py,sha256=9vxGGLvSPnfy-sxUFDpBTe8omqpGXP7MzvGPp6bRxrU,5197
97
99
  prediction_market_agent_tooling/tools/singleton.py,sha256=CiIELUiI-OeS7U7eeHEt0rnVhtQGzwoUdAgn_7u_GBM,729
98
100
  prediction_market_agent_tooling/tools/streamlit_user_login.py,sha256=NXEqfjT9Lc9QtliwSGRASIz1opjQ7Btme43H4qJbzgE,3010
@@ -101,8 +103,8 @@ prediction_market_agent_tooling/tools/tavily/tavily_search.py,sha256=Kw2mXNkMTYT
101
103
  prediction_market_agent_tooling/tools/transaction_cache.py,sha256=C96OHkNqPJr_yDiHesSRgekeXIbX62qFl9qldArleuo,1800
102
104
  prediction_market_agent_tooling/tools/utils.py,sha256=WvuUCHgMCiMq8_wMm5PHNwvLhcdDk2zGKaAM8OUC-qY,6438
103
105
  prediction_market_agent_tooling/tools/web3_utils.py,sha256=hWDa7D-jP-iW647t0ATPyiUgKbAq25iH97KUnha25SQ,11944
104
- prediction_market_agent_tooling-0.57.0.dist-info/LICENSE,sha256=6or154nLLU6bELzjh0mCreFjt0m2v72zLi3yHE0QbeE,7650
105
- prediction_market_agent_tooling-0.57.0.dist-info/METADATA,sha256=yK4VmpYuw1CWWmbpu7cLSWEltKzm-6BMi5vbtI2PTfM,8106
106
- prediction_market_agent_tooling-0.57.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
107
- prediction_market_agent_tooling-0.57.0.dist-info/entry_points.txt,sha256=m8PukHbeH5g0IAAmOf_1Ahm-sGAMdhSSRQmwtpmi2s8,81
108
- prediction_market_agent_tooling-0.57.0.dist-info/RECORD,,
106
+ prediction_market_agent_tooling-0.57.1.dist-info/LICENSE,sha256=6or154nLLU6bELzjh0mCreFjt0m2v72zLi3yHE0QbeE,7650
107
+ prediction_market_agent_tooling-0.57.1.dist-info/METADATA,sha256=dOd_dooUIoLkSfsh7mHctHKfDM1W4fCmqu-Xgr_8gAY,8106
108
+ prediction_market_agent_tooling-0.57.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
109
+ prediction_market_agent_tooling-0.57.1.dist-info/entry_points.txt,sha256=m8PukHbeH5g0IAAmOf_1Ahm-sGAMdhSSRQmwtpmi2s8,81
110
+ prediction_market_agent_tooling-0.57.1.dist-info/RECORD,,