prediction-market-agent-tooling 0.55.2__py3-none-any.whl → 0.55.2.dev120__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.
@@ -519,7 +519,6 @@ class DeployableTraderAgent(DeployablePredictionAgent):
519
519
  def initialize_langfuse(self) -> None:
520
520
  super().initialize_langfuse()
521
521
  # Auto-observe all the methods where it makes sense, so that subclassses don't need to do it manually.
522
- self.get_betting_strategy = observe()(self.get_betting_strategy) # type: ignore[method-assign]
523
522
  self.build_trades = observe()(self.build_trades) # type: ignore[method-assign]
524
523
 
525
524
  def check_min_required_balance_to_trade(self, market: AgentMarket) -> None:
@@ -0,0 +1,51 @@
1
+ import typing as t
2
+
3
+ import tenacity
4
+ from pydantic import BaseModel
5
+ from subgrounds import FieldPath, Subgrounds
6
+
7
+ from prediction_market_agent_tooling.config import APIKeys
8
+ from prediction_market_agent_tooling.loggers import logger
9
+ from prediction_market_agent_tooling.tools.singleton import SingletonMeta
10
+
11
+ T = t.TypeVar("T", bound=BaseModel)
12
+
13
+
14
+ class BaseSubgraphHandler(metaclass=SingletonMeta):
15
+ def __init__(self) -> None:
16
+ self.sg = Subgrounds()
17
+ # Patch methods to retry on failure.
18
+ self.sg.query_json = tenacity.retry(
19
+ stop=tenacity.stop_after_attempt(3),
20
+ wait=tenacity.wait_fixed(1),
21
+ after=lambda x: logger.debug(f"query_json failed, {x.attempt_number=}."),
22
+ )(self.sg.query_json)
23
+ self.sg.load_subgraph = tenacity.retry(
24
+ stop=tenacity.stop_after_attempt(3),
25
+ wait=tenacity.wait_fixed(1),
26
+ after=lambda x: logger.debug(f"load_subgraph failed, {x.attempt_number=}."),
27
+ )(self.sg.load_subgraph)
28
+
29
+ self.keys = APIKeys()
30
+
31
+ def _parse_items_from_json(
32
+ self, result: list[dict[str, t.Any]]
33
+ ) -> list[dict[str, t.Any]]:
34
+ """subgrounds return a weird key as a dict key"""
35
+ items = []
36
+ for result_chunk in result:
37
+ for k, v in result_chunk.items():
38
+ # subgrounds might pack all items as a list, indexed by a key, or pack it as a dictionary (if one single element)
39
+ if v is None:
40
+ continue
41
+ elif isinstance(v, dict):
42
+ items.extend([v])
43
+ else:
44
+ items.extend(v)
45
+ return items
46
+
47
+ def do_query(self, fields: list[FieldPath], pydantic_model: t.Type[T]) -> list[T]:
48
+ result = self.sg.query_json(fields)
49
+ items = self._parse_items_from_json(result)
50
+ models = [pydantic_model.model_validate(i) for i in items]
51
+ return models
@@ -2,12 +2,10 @@ import sys
2
2
  import typing as t
3
3
 
4
4
  import requests
5
- import tenacity
6
5
  from PIL import Image
7
6
  from PIL.Image import Image as ImageType
8
- from subgrounds import FieldPath, Subgrounds
7
+ from subgrounds import FieldPath
9
8
 
10
- from prediction_market_agent_tooling.config import APIKeys
11
9
  from prediction_market_agent_tooling.gtypes import (
12
10
  ChecksumAddress,
13
11
  HexAddress,
@@ -15,8 +13,10 @@ from prediction_market_agent_tooling.gtypes import (
15
13
  Wei,
16
14
  wei_type,
17
15
  )
18
- from prediction_market_agent_tooling.loggers import logger
19
16
  from prediction_market_agent_tooling.markets.agent_market import FilterBy, SortBy
17
+ from prediction_market_agent_tooling.markets.base_subgraph_handler import (
18
+ BaseSubgraphHandler,
19
+ )
20
20
  from prediction_market_agent_tooling.markets.omen.data_models import (
21
21
  OMEN_BINARY_MARKET_OUTCOMES,
22
22
  ContractPrediction,
@@ -33,7 +33,6 @@ from prediction_market_agent_tooling.markets.omen.omen_contracts import (
33
33
  WrappedxDaiContract,
34
34
  sDaiContract,
35
35
  )
36
- from prediction_market_agent_tooling.tools.singleton import SingletonMeta
37
36
  from prediction_market_agent_tooling.tools.utils import (
38
37
  DatetimeUTC,
39
38
  to_int_timestamp,
@@ -51,7 +50,7 @@ SAFE_COLLATERAL_TOKEN_MARKETS = (
51
50
  )
52
51
 
53
52
 
54
- class OmenSubgraphHandler(metaclass=SingletonMeta):
53
+ class OmenSubgraphHandler(BaseSubgraphHandler):
55
54
  """
56
55
  Class responsible for handling interactions with Omen subgraphs (trades, conditionalTokens).
57
56
  """
@@ -64,52 +63,38 @@ class OmenSubgraphHandler(metaclass=SingletonMeta):
64
63
 
65
64
  OMEN_IMAGE_MAPPING_GRAPH_URL = "https://gateway-arbitrum.network.thegraph.com/api/{graph_api_key}/subgraphs/id/EWN14ciGK53PpUiKSm7kMWQ6G4iz3tDrRLyZ1iXMQEdu"
66
65
 
67
- OMEN_AGENT_RESULT_MAPPING_GRAPH_URL = "https://gateway-arbitrum.network.thegraph.com/api/{graph_api_key}/subgraphs/id/GoE3UFyc8Gg9xzv92oinonyhRCphpGu62qB2Eh2XvJ8F"
66
+ OMEN_AGENT_RESULT_MAPPING_GRAPH_URL = "https://gateway-arbitrum.network.thegraph.com/api/{graph_api_key}/subgraphs/id/J6bJEnbqJpAvNyQE8i58M9mKF4zqo33BEJRdnXmqa6Kn"
68
67
 
69
68
  INVALID_ANSWER = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
70
69
 
71
70
  def __init__(self) -> None:
72
- self.sg = Subgrounds()
73
-
74
- # Patch methods to retry on failure.
75
- self.sg.query_json = tenacity.retry(
76
- stop=tenacity.stop_after_attempt(3),
77
- wait=tenacity.wait_fixed(1),
78
- after=lambda x: logger.debug(f"query_json failed, {x.attempt_number=}."),
79
- )(self.sg.query_json)
80
- self.sg.load_subgraph = tenacity.retry(
81
- stop=tenacity.stop_after_attempt(3),
82
- wait=tenacity.wait_fixed(1),
83
- after=lambda x: logger.debug(f"load_subgraph failed, {x.attempt_number=}."),
84
- )(self.sg.load_subgraph)
85
-
86
- keys = APIKeys()
71
+ super().__init__()
87
72
 
88
73
  # Load the subgraph
89
74
  self.trades_subgraph = self.sg.load_subgraph(
90
75
  self.OMEN_TRADES_SUBGRAPH.format(
91
- graph_api_key=keys.graph_api_key.get_secret_value()
76
+ graph_api_key=self.keys.graph_api_key.get_secret_value()
92
77
  )
93
78
  )
94
79
  self.conditional_tokens_subgraph = self.sg.load_subgraph(
95
80
  self.CONDITIONAL_TOKENS_SUBGRAPH.format(
96
- graph_api_key=keys.graph_api_key.get_secret_value()
81
+ graph_api_key=self.keys.graph_api_key.get_secret_value()
97
82
  )
98
83
  )
99
84
  self.realityeth_subgraph = self.sg.load_subgraph(
100
85
  self.REALITYETH_GRAPH_URL.format(
101
- graph_api_key=keys.graph_api_key.get_secret_value()
86
+ graph_api_key=self.keys.graph_api_key.get_secret_value()
102
87
  )
103
88
  )
104
89
  self.omen_image_mapping_subgraph = self.sg.load_subgraph(
105
90
  self.OMEN_IMAGE_MAPPING_GRAPH_URL.format(
106
- graph_api_key=keys.graph_api_key.get_secret_value()
91
+ graph_api_key=self.keys.graph_api_key.get_secret_value()
107
92
  )
108
93
  )
109
94
 
110
95
  self.omen_agent_result_mapping_subgraph = self.sg.load_subgraph(
111
96
  self.OMEN_AGENT_RESULT_MAPPING_GRAPH_URL.format(
112
- graph_api_key=keys.graph_api_key.get_secret_value()
97
+ graph_api_key=self.keys.graph_api_key.get_secret_value()
113
98
  )
114
99
  )
115
100
 
@@ -446,14 +431,8 @@ class OmenSubgraphHandler(metaclass=SingletonMeta):
446
431
  **optional_params,
447
432
  )
448
433
 
449
- omen_markets = self.do_markets_query(markets)
450
- return omen_markets
451
-
452
- def do_markets_query(self, markets: FieldPath) -> list[OmenMarket]:
453
434
  fields = self._get_fields_for_markets(markets)
454
- result = self.sg.query_json(fields)
455
- items = self._parse_items_from_json(result)
456
- omen_markets = [OmenMarket.model_validate(i) for i in items]
435
+ omen_markets = self.do_query(fields=fields, pydantic_model=OmenMarket)
457
436
  return omen_markets
458
437
 
459
438
  def get_omen_market_by_market_id(self, market_id: HexAddress) -> OmenMarket:
@@ -461,7 +440,8 @@ class OmenSubgraphHandler(metaclass=SingletonMeta):
461
440
  id=market_id.lower()
462
441
  )
463
442
 
464
- omen_markets = self.do_markets_query(markets)
443
+ fields = self._get_fields_for_markets(markets)
444
+ omen_markets = self.do_query(fields=fields, pydantic_model=OmenMarket)
465
445
 
466
446
  if len(omen_markets) != 1:
467
447
  raise ValueError(
@@ -470,22 +450,6 @@ class OmenSubgraphHandler(metaclass=SingletonMeta):
470
450
 
471
451
  return omen_markets[0]
472
452
 
473
- def _parse_items_from_json(
474
- self, result: list[dict[str, t.Any]]
475
- ) -> list[dict[str, t.Any]]:
476
- """subgrounds return a weird key as a dict key"""
477
- items = []
478
- for result_chunk in result:
479
- for k, v in result_chunk.items():
480
- # subgrounds might pack all items as a list, indexed by a key, or pack it as a dictionary (if one single element)
481
- if v is None:
482
- continue
483
- elif isinstance(v, dict):
484
- items.extend([v])
485
- else:
486
- items.extend(v)
487
- return items
488
-
489
453
  def _get_fields_for_user_positions(
490
454
  self, user_positions: FieldPath
491
455
  ) -> list[FieldPath]:
@@ -0,0 +1,27 @@
1
+ from pydantic import BaseModel, ConfigDict, Field
2
+
3
+ from prediction_market_agent_tooling.gtypes import HexBytes
4
+
5
+
6
+ class SeerMarket(BaseModel):
7
+ model_config = ConfigDict(populate_by_name=True)
8
+
9
+ id: HexBytes
10
+ title: str = Field(alias="marketName")
11
+ outcomes: list[str]
12
+ parent_market: HexBytes = Field(alias="parentMarket")
13
+ wrapped_tokens: list[HexBytes] = Field(alias="wrappedTokens")
14
+
15
+
16
+ class SeerToken(BaseModel):
17
+ id: HexBytes
18
+ name: str
19
+ symbol: str
20
+
21
+
22
+ class SeerPool(BaseModel):
23
+ model_config = ConfigDict(populate_by_name=True)
24
+ id: HexBytes
25
+ liquidity: int
26
+ token0: SeerToken
27
+ token1: SeerToken
@@ -0,0 +1,142 @@
1
+ from typing import Any
2
+
3
+ from subgrounds import FieldPath
4
+ from web3.constants import ADDRESS_ZERO
5
+
6
+ from prediction_market_agent_tooling.markets.base_subgraph_handler import (
7
+ BaseSubgraphHandler,
8
+ )
9
+ from prediction_market_agent_tooling.markets.seer.data_models import (
10
+ SeerMarket,
11
+ SeerPool,
12
+ )
13
+ from prediction_market_agent_tooling.tools.hexbytes_custom import HexBytes
14
+
15
+ INVALID_OUTCOME = "Invalid result"
16
+
17
+
18
+ class SeerSubgraphHandler(BaseSubgraphHandler):
19
+ """
20
+ Class responsible for handling interactions with Seer subgraphs.
21
+ """
22
+
23
+ SEER_SUBGRAPH = "https://gateway-arbitrum.network.thegraph.com/api/{graph_api_key}/subgraphs/id/B4vyRqJaSHD8dRDb3BFRoAzuBK18c1QQcXq94JbxDxWH"
24
+
25
+ SWAPR_ALGEBRA_SUBGRAPH = "https://gateway-arbitrum.network.thegraph.com/api/{graph_api_key}/subgraphs/id/AAA1vYjxwFHzbt6qKwLHNcDSASyr1J1xVViDH8gTMFMR"
26
+
27
+ INVALID_ANSWER = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
28
+
29
+ def __init__(self) -> None:
30
+ super().__init__()
31
+
32
+ self.seer_subgraph = self.sg.load_subgraph(
33
+ self.SEER_SUBGRAPH.format(
34
+ graph_api_key=self.keys.graph_api_key.get_secret_value()
35
+ )
36
+ )
37
+ self.swapr_algebra_subgraph = self.sg.load_subgraph(
38
+ self.SWAPR_ALGEBRA_SUBGRAPH.format(
39
+ graph_api_key=self.keys.graph_api_key.get_secret_value()
40
+ )
41
+ )
42
+
43
+ def _get_fields_for_markets(self, markets_field: FieldPath) -> list[FieldPath]:
44
+ fields = [
45
+ markets_field.id,
46
+ markets_field.factory,
47
+ markets_field.creator,
48
+ markets_field.marketName,
49
+ markets_field.outcomes,
50
+ markets_field.parentMarket,
51
+ markets_field.finalizeTs,
52
+ markets_field.wrappedTokens,
53
+ ]
54
+ return fields
55
+
56
+ @staticmethod
57
+ def filter_bicategorical_markets(markets: list[SeerMarket]) -> list[SeerMarket]:
58
+ # We do an extra check for the invalid outcome for safety.
59
+ return [
60
+ m for m in markets if len(m.outcomes) == 3 and INVALID_OUTCOME in m.outcomes
61
+ ]
62
+
63
+ @staticmethod
64
+ def filter_binary_markets(markets: list[SeerMarket]) -> list[SeerMarket]:
65
+ return [
66
+ market
67
+ for market in markets
68
+ if {"yes", "no"}.issubset({o.lower() for o in market.outcomes})
69
+ ]
70
+
71
+ @staticmethod
72
+ def build_filter_for_conditional_markets(
73
+ include_conditional_markets: bool = True,
74
+ ) -> dict[Any, Any]:
75
+ return (
76
+ {}
77
+ if include_conditional_markets
78
+ else {"parentMarket": ADDRESS_ZERO.lower()}
79
+ )
80
+
81
+ def get_bicategorical_markets(
82
+ self, include_conditional_markets: bool = True
83
+ ) -> list[SeerMarket]:
84
+ """Returns markets that contain 2 categories plus an invalid outcome."""
85
+ # Binary markets on Seer contain 3 outcomes: OutcomeA, outcomeB and an Invalid option.
86
+ query_filter = self.build_filter_for_conditional_markets(
87
+ include_conditional_markets
88
+ )
89
+ query_filter["outcomes_contains"] = [INVALID_OUTCOME]
90
+ markets_field = self.seer_subgraph.Query.markets(where=query_filter)
91
+ fields = self._get_fields_for_markets(markets_field)
92
+ markets = self.do_query(fields=fields, pydantic_model=SeerMarket)
93
+ two_category_markets = self.filter_bicategorical_markets(markets)
94
+ return two_category_markets
95
+
96
+ def get_binary_markets(
97
+ self, include_conditional_markets: bool = True
98
+ ) -> list[SeerMarket]:
99
+ two_category_markets = self.get_bicategorical_markets(
100
+ include_conditional_markets=include_conditional_markets
101
+ )
102
+ # Now we additionally filter markets based on YES/NO being the only outcomes.
103
+ binary_markets = self.filter_binary_markets(two_category_markets)
104
+ return binary_markets
105
+
106
+ def get_market_by_id(self, market_id: HexBytes) -> SeerMarket:
107
+ markets_field = self.seer_subgraph.Query.market(id=market_id.hex().lower())
108
+ fields = self._get_fields_for_markets(markets_field)
109
+ markets = self.do_query(fields=fields, pydantic_model=SeerMarket)
110
+ if len(markets) != 1:
111
+ raise ValueError(
112
+ f"Fetched wrong number of markets. Expected 1 but got {len(markets)}"
113
+ )
114
+ return markets[0]
115
+
116
+ def _get_fields_for_pools(self, pools_field: FieldPath) -> list[FieldPath]:
117
+ fields = [
118
+ pools_field.id,
119
+ pools_field.liquidity,
120
+ pools_field.token0.id,
121
+ pools_field.token0.name,
122
+ pools_field.token0.symbol,
123
+ pools_field.token1.id,
124
+ pools_field.token1.name,
125
+ pools_field.token1.symbol,
126
+ ]
127
+ return fields
128
+
129
+ def get_pools_for_market(self, market: SeerMarket) -> list[SeerPool]:
130
+ # We iterate through the wrapped tokens and put them in a where clause so that we hit the subgraph endpoint just once.
131
+ wheres = []
132
+ for wrapped_token in market.wrapped_tokens:
133
+ wheres.extend(
134
+ [
135
+ {"token0": wrapped_token.hex().lower()},
136
+ {"token1": wrapped_token.hex().lower()},
137
+ ]
138
+ )
139
+ pools_field = self.swapr_algebra_subgraph.Query.pools(where={"or": wheres})
140
+ fields = self._get_fields_for_pools(pools_field)
141
+ pools = self.do_query(fields=fields, pydantic_model=SeerPool)
142
+ return pools
@@ -34,9 +34,10 @@ QUESTION_IS_INVALID_PROMPT = """Main signs about an invalid question (sometimes
34
34
  - Which could give an incentive only to specific participants to commit an immoral violent action, but are in practice unlikely.
35
35
  - Valid: Will the US be engaged in a military conflict with a UN member state in 2021? (It’s unlikely for the US to declare war in order to win a bet on this market).
36
36
  - Valid: Will Derek Chauvin go to jail for the murder of George Flyod? (It’s unlikely that the jurors would collude to make a wrong verdict in order to win this market).
37
- - Questions with relative dates will resolve as invalid. Dates must be stated in absolute terms, not relative depending on the current time.
37
+ - Questions with relative dates will resolve as invalid. Dates must be stated in absolute terms, not relative depending on the current time. But they can be relative to the event specified in the question itself.
38
38
  - Invalid: Who will be the president of the United States in 6 months? ("in 6 months depends on the current time").
39
39
  - Invalid: In the next 14 days, will Gnosis Chain gain another 1M users? ("in the next 14 days depends on the current time").
40
+ - Valid: Will GNO price go up 10 days after Gnosis Pay cashback program is annouced? ("10 days after" is relative to the event in the question, so we can determine absolute value).
40
41
  - Questions about moral values and not facts will be resolved as invalid.
41
42
  - Invalid: "Is it ethical to eat meat?".
42
43
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prediction-market-agent-tooling
3
- Version: 0.55.2
3
+ Version: 0.55.2.dev120
4
4
  Summary: Tools to benchmark, deploy and monitor prediction market agents.
5
5
  Author: Gnosis
6
6
  Requires-Python: >=3.10,<3.12
@@ -17,7 +17,7 @@ prediction_market_agent_tooling/benchmark/agents.py,sha256=B1-uWdyeN4GGKMWGK_-Cc
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
19
  prediction_market_agent_tooling/config.py,sha256=114f3V9abaok27p5jX3UVr5b5gRUiSxBIYn8Snid34I,6731
20
- prediction_market_agent_tooling/deploy/agent.py,sha256=5jIZ_Wqj9XALGINCkFp2bkNV33bAnUQ_r9oNGrNgDmA,22654
20
+ prediction_market_agent_tooling/deploy/agent.py,sha256=2IbMDMSXT_2r3rgIc9CHrd65DoPhbcvTTrNoat1iP5w,22550
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
23
23
  prediction_market_agent_tooling/deploy/constants.py,sha256=M5ty8URipYMGe_G-RzxRydK3AFL6CyvmqCraJUrLBnE,82
@@ -32,6 +32,7 @@ prediction_market_agent_tooling/jobs/jobs_models.py,sha256=I5uBTHJ2S1Wi3H4jDxxU7
32
32
  prediction_market_agent_tooling/jobs/omen/omen_jobs.py,sha256=I2_vGrEJj1reSI8M377ab5QCsYNp_l4l4QeYEmDBkFM,3989
33
33
  prediction_market_agent_tooling/loggers.py,sha256=Am6HHXRNO545BO3l7Ue9Wb2TkYE1OK8KKhGbI3XypVU,3751
34
34
  prediction_market_agent_tooling/markets/agent_market.py,sha256=OgB6bvDGfTAxbh6cDGD3XFO0iy0MAaOQvXEP6nw8xW8,12817
35
+ prediction_market_agent_tooling/markets/base_subgraph_handler.py,sha256=IxDTwX4tej9j5olNkXcLIE0RCF1Nh2icZQUT2ERMmZo,1937
35
36
  prediction_market_agent_tooling/markets/categorize.py,sha256=jsoHWvZk9pU6n17oWSCcCxNNYVwlb_NXsZxKRI7vmsk,1301
36
37
  prediction_market_agent_tooling/markets/data_models.py,sha256=jMqrSFO_w2z-5N3PFVgZqTHdVdkzSDhhzky2lHsGGKA,3621
37
38
  prediction_market_agent_tooling/markets/manifold/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -49,12 +50,14 @@ prediction_market_agent_tooling/markets/omen/data_models.py,sha256=nCjsc-ylIzQOC
49
50
  prediction_market_agent_tooling/markets/omen/omen.py,sha256=LqNZjngo6LoktKecfYmGmJJ9D5rj-s0Poy4x4_GZfp0,51116
50
51
  prediction_market_agent_tooling/markets/omen/omen_contracts.py,sha256=Zq7SncCq-hvpgXKsVruGBGCn1OhKZTe7r1qLdCTrT2w,28297
51
52
  prediction_market_agent_tooling/markets/omen/omen_resolving.py,sha256=iDWdjICGkt968exwCjY-6nsnQyrrNAg3YjnDdP430GQ,9415
52
- prediction_market_agent_tooling/markets/omen/omen_subgraph_handler.py,sha256=zQH3iu0SVH1RmE-W3NMEpcKVMILXJYxMhL6w1wh5RUo,37348
53
+ prediction_market_agent_tooling/markets/omen/omen_subgraph_handler.py,sha256=UjKZir1z8wsr493kYm5kswC4kGFpR9H8tsq9DOgaaT4,35886
53
54
  prediction_market_agent_tooling/markets/polymarket/api.py,sha256=UZ4_TG8ceb9Y-qgsOKs8Qiv8zDt957QkT8IX2c83yqo,4800
54
55
  prediction_market_agent_tooling/markets/polymarket/data_models.py,sha256=Fd5PI5y3mJM8VHExBhWFWEnuuIKxQmIAXgBuoPDvNjw,4341
55
56
  prediction_market_agent_tooling/markets/polymarket/data_models_web.py,sha256=VZhVccTApygSKMmy6Au2G02JCJOKJnR_oVeKlaesuSg,12548
56
57
  prediction_market_agent_tooling/markets/polymarket/polymarket.py,sha256=NRoZK71PtH8kkangMqme7twcAXhRJSSabbmOir-UnAI,3418
57
58
  prediction_market_agent_tooling/markets/polymarket/utils.py,sha256=m4JG6WULh5epCJt4XBMHg0ae5NoVhqlOvAl0A7DR9iM,2023
59
+ prediction_market_agent_tooling/markets/seer/data_models.py,sha256=2f6DOXhGerYbTSk5vUvw_y87TcUxOtSfca8-Et7imtU,643
60
+ prediction_market_agent_tooling/markets/seer/seer_subgraph_handler.py,sha256=Jola8AxmNDljBCzl6Gvjb9qH75Y7D5dAwbdZl_jndN8,5478
58
61
  prediction_market_agent_tooling/monitor/markets/manifold.py,sha256=TS4ERwTfQnot8dhekNyVNhJYf5ysYsjF-9v5_kM3aVI,3334
59
62
  prediction_market_agent_tooling/monitor/markets/metaculus.py,sha256=LOnyWWBFdg10-cTWdb76nOsNjDloO8OfMT85GBzRCFI,1455
60
63
  prediction_market_agent_tooling/monitor/markets/omen.py,sha256=EqiJYTvDbSu7fBpbrBmCuf3fc6GHr4MxWrBGa69MIyc,3305
@@ -80,7 +83,7 @@ prediction_market_agent_tooling/tools/httpx_cached_client.py,sha256=0-N1r0zcGKlY
80
83
  prediction_market_agent_tooling/tools/image_gen/image_gen.py,sha256=HzRwBx62hOXBOmrtpkXaP9Qq1Ku03uUGdREocyjLQ_k,1266
81
84
  prediction_market_agent_tooling/tools/image_gen/market_thumbnail_gen.py,sha256=8A3U2uxsCsOfLjru-6R_PPIAuiKY4qFkWp_GSBPV6-s,1280
82
85
  prediction_market_agent_tooling/tools/ipfs/ipfs_handler.py,sha256=CTTMfTvs_8PH4kAtlQby2aeEKwgpmxtuGbd4oYIdJ2A,1201
83
- prediction_market_agent_tooling/tools/is_invalid.py,sha256=VjjOCrkt6S8ytOg_0s2gUL8IKX2muWq1QLIZX0MPMxY,5094
86
+ prediction_market_agent_tooling/tools/is_invalid.py,sha256=Tg5XZC3i3qNHmAjFvCZbuYsSCopEjUsbosbFgSbC_1E,5347
84
87
  prediction_market_agent_tooling/tools/is_predictable.py,sha256=NIoR2bTNMmADcyNY2aKNMWkiDw7Z_9kZMcFXEdyewy4,6771
85
88
  prediction_market_agent_tooling/tools/langfuse_.py,sha256=jI_4ROxqo41CCnWGS1vN_AeDVhRzLMaQLxH3kxDu3L8,1153
86
89
  prediction_market_agent_tooling/tools/langfuse_client_utils.py,sha256=B0PhAQyviFnVbtOCYMxYmcCn66cu9nbqAOIAZcdgiRI,5771
@@ -97,8 +100,8 @@ prediction_market_agent_tooling/tools/tavily/tavily_search.py,sha256=UPSp0S5Sql5
97
100
  prediction_market_agent_tooling/tools/tavily/tavily_storage.py,sha256=t-tZzbCzBBdFedRZDuVBn3A3mIDX8Z5wza6SxWswu_E,4093
98
101
  prediction_market_agent_tooling/tools/utils.py,sha256=W-9SqeCKd51BYMRhDjYPQ7lfNO_zE9EvYpmu2r5WXGA,7163
99
102
  prediction_market_agent_tooling/tools/web3_utils.py,sha256=44W8siSLNQxeib98bbwAe7V5C609NHNlUuxwuWIRDiY,11838
100
- prediction_market_agent_tooling-0.55.2.dist-info/LICENSE,sha256=6or154nLLU6bELzjh0mCreFjt0m2v72zLi3yHE0QbeE,7650
101
- prediction_market_agent_tooling-0.55.2.dist-info/METADATA,sha256=tAJbigulcfY4hneC_qC8UDo2k8XPd938uKxIxC07PwM,8056
102
- prediction_market_agent_tooling-0.55.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
103
- prediction_market_agent_tooling-0.55.2.dist-info/entry_points.txt,sha256=m8PukHbeH5g0IAAmOf_1Ahm-sGAMdhSSRQmwtpmi2s8,81
104
- prediction_market_agent_tooling-0.55.2.dist-info/RECORD,,
103
+ prediction_market_agent_tooling-0.55.2.dev120.dist-info/LICENSE,sha256=6or154nLLU6bELzjh0mCreFjt0m2v72zLi3yHE0QbeE,7650
104
+ prediction_market_agent_tooling-0.55.2.dev120.dist-info/METADATA,sha256=xUQyruFo82CnvirDLBDHfpEj3SjUzsL-nwrK8BOzTUc,8063
105
+ prediction_market_agent_tooling-0.55.2.dev120.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
106
+ prediction_market_agent_tooling-0.55.2.dev120.dist-info/entry_points.txt,sha256=m8PukHbeH5g0IAAmOf_1Ahm-sGAMdhSSRQmwtpmi2s8,81
107
+ prediction_market_agent_tooling-0.55.2.dev120.dist-info/RECORD,,