prediction-market-agent-tooling 0.41.1__py3-none-any.whl → 0.42.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.
@@ -3,9 +3,14 @@ import typing as t
3
3
  from gnosis.eth import EthereumClient
4
4
  from gnosis.safe import Safe
5
5
  from pydantic.types import SecretStr
6
+ from pydantic.v1.types import SecretStr as SecretStrV1
6
7
  from pydantic_settings import BaseSettings, SettingsConfigDict
7
8
 
8
- from prediction_market_agent_tooling.gtypes import ChecksumAddress, PrivateKey
9
+ from prediction_market_agent_tooling.gtypes import (
10
+ ChecksumAddress,
11
+ PrivateKey,
12
+ secretstr_to_v1_secretstr,
13
+ )
9
14
  from prediction_market_agent_tooling.markets.manifold.api import get_authenticated_user
10
15
  from prediction_market_agent_tooling.tools.utils import check_not_none
11
16
  from prediction_market_agent_tooling.tools.web3_utils import private_key_to_public_key
@@ -87,6 +92,10 @@ class APIKeys(BaseSettings):
87
92
  self.OPENAI_API_KEY, "OPENAI_API_KEY missing in the environment."
88
93
  )
89
94
 
95
+ @property
96
+ def openai_api_key_secretstr_v1(self) -> SecretStrV1:
97
+ return secretstr_to_v1_secretstr(self.openai_api_key)
98
+
90
99
  @property
91
100
  def graph_api_key(self) -> SecretStr:
92
101
  return check_not_none(
@@ -13,6 +13,7 @@ from prediction_market_agent_tooling.markets.data_models import (
13
13
  Currency,
14
14
  Position,
15
15
  Resolution,
16
+ ResolvedBet,
16
17
  TokenAmount,
17
18
  )
18
19
  from prediction_market_agent_tooling.tools.utils import (
@@ -163,6 +164,12 @@ class AgentMarket(BaseModel):
163
164
  ) -> list[Bet]:
164
165
  raise NotImplementedError("Subclasses must implement this method")
165
166
 
167
+ @staticmethod
168
+ def get_resolved_bets_made_since(
169
+ better_address: ChecksumAddress, start_time: datetime, end_time: datetime | None
170
+ ) -> list[ResolvedBet]:
171
+ raise NotImplementedError("Subclasses must implement this method")
172
+
166
173
  def is_closed(self) -> bool:
167
174
  return self.close_time is not None and self.close_time <= utcnow()
168
175
 
@@ -21,7 +21,7 @@ Write only the category itself, nothing else.
21
21
  prompt
22
22
  | ChatOpenAI(
23
23
  model=model,
24
- api_key=APIKeys().openai_api_key.get_secret_value(),
24
+ api_key=APIKeys().openai_api_key_secretstr_v1,
25
25
  )
26
26
  | StrOutputParser()
27
27
  )
@@ -24,6 +24,9 @@ class TokenAmount(BaseModel):
24
24
  amount: float
25
25
  currency: Currency
26
26
 
27
+ def __str__(self) -> str:
28
+ return f"Amount {self.amount} currency {self.currency}"
29
+
27
30
 
28
31
  BetAmount: TypeAlias = TokenAmount
29
32
  ProfitAmount: TypeAlias = TokenAmount
@@ -34,6 +37,10 @@ class Bet(BaseModel):
34
37
  outcome: bool
35
38
  created_time: datetime
36
39
  market_question: str
40
+ market_id: str
41
+
42
+ def __str__(self) -> str:
43
+ return f"Bet for market {self.market_id} for question {self.market_question} created at {self.created_time}: {self.amount} on {self.outcome}"
37
44
 
38
45
 
39
46
  class ResolvedBet(Bet):
@@ -46,6 +53,9 @@ class ResolvedBet(Bet):
46
53
  def is_correct(self) -> bool:
47
54
  return self.outcome == self.market_outcome
48
55
 
56
+ def __str__(self) -> str:
57
+ return f"Resolved bet for market {self.market_id} for question {self.market_question} created at {self.created_time}: {self.amount} on {self.outcome}. Bet was resolved at {self.resolved_time} and was {'correct' if self.is_correct else 'incorrect'}. Profit was {self.profit}"
58
+
49
59
 
50
60
  class Position(BaseModel):
51
61
  market_id: str
@@ -12,13 +12,17 @@ from prediction_market_agent_tooling.markets.data_models import (
12
12
  ResolvedBet,
13
13
  )
14
14
  from prediction_market_agent_tooling.markets.manifold.data_models import (
15
+ FullManifoldMarket,
15
16
  ManifoldBet,
16
17
  ManifoldContractMetric,
17
18
  ManifoldMarket,
18
19
  ManifoldUser,
19
20
  )
20
21
  from prediction_market_agent_tooling.tools.parallelism import par_map
21
- from prediction_market_agent_tooling.tools.utils import response_list_to_model
22
+ from prediction_market_agent_tooling.tools.utils import (
23
+ response_list_to_model,
24
+ response_to_model,
25
+ )
22
26
 
23
27
  """
24
28
  Python API for Manifold Markets
@@ -65,9 +69,7 @@ def get_manifold_binary_markets(
65
69
  while True:
66
70
  params["offset"] = offset
67
71
  response = requests.get(url, params=params)
68
- response.raise_for_status()
69
- data = response.json()
70
- markets = [ManifoldMarket.model_validate(x) for x in data]
72
+ markets = response_list_to_model(response, ManifoldMarket)
71
73
 
72
74
  if not markets:
73
75
  break
@@ -152,11 +154,9 @@ def get_authenticated_user(api_key: str) -> ManifoldUser:
152
154
  wait=tenacity.wait_fixed(1),
153
155
  after=lambda x: logger.debug(f"get_manifold_market failed, {x.attempt_number=}."),
154
156
  )
155
- def get_manifold_market(market_id: str) -> ManifoldMarket:
157
+ def get_manifold_market(market_id: str) -> FullManifoldMarket:
156
158
  url = f"{MANIFOLD_API_BASE_URL}/v0/market/{market_id}"
157
- response = requests.get(url)
158
- response.raise_for_status()
159
- return ManifoldMarket.model_validate(response.json())
159
+ return response_to_model(requests.get(url), FullManifoldMarket)
160
160
 
161
161
 
162
162
  @tenacity.retry(
@@ -213,6 +213,7 @@ def manifold_to_generic_resolved_bet(
213
213
  outcome=bet.get_resolved_boolean_outcome(),
214
214
  created_time=bet.createdTime,
215
215
  market_question=market.question,
216
+ market_id=market.id,
216
217
  market_outcome=market_outcome,
217
218
  resolved_time=market.resolutionTime,
218
219
  profit=bet.get_profit(market_outcome=market_outcome),
@@ -222,6 +223,6 @@ def manifold_to_generic_resolved_bet(
222
223
  def get_market_positions(market_id: str, user_id: str) -> list[ManifoldContractMetric]:
223
224
  url = f"{MANIFOLD_API_BASE_URL}/v0/market/{market_id}/positions"
224
225
  params = {"userId": user_id}
225
- response = requests.get(url, params=params)
226
- response.raise_for_status()
227
- return [ManifoldContractMetric.model_validate(x) for x in response.json()]
226
+ return response_list_to_model(
227
+ requests.get(url, params=params), ManifoldContractMetric
228
+ )
@@ -1,5 +1,6 @@
1
1
  import typing as t
2
2
  from datetime import datetime, timedelta
3
+ from enum import Enum
3
4
 
4
5
  from pydantic import BaseModel, field_validator
5
6
 
@@ -19,6 +20,25 @@ class ManifoldPool(BaseModel):
19
20
  YES: float
20
21
 
21
22
 
23
+ class ManifoldAnswersMode(str, Enum):
24
+ ANYONE = "ANYONE"
25
+ ONLY_CREATOR = "ONLY_CREATOR"
26
+ DISABLED = "DISABLED"
27
+
28
+
29
+ class ManifoldAnswer(BaseModel):
30
+ createdTime: datetime
31
+ avatarUrl: str
32
+ id: str
33
+ username: str
34
+ number: int
35
+ name: str
36
+ contractId: str
37
+ text: str
38
+ userId: str
39
+ probability: float
40
+
41
+
22
42
  class ManifoldMarket(BaseModel):
23
43
  """
24
44
  https://docs.manifold.markets/api#get-v0markets
@@ -84,6 +104,20 @@ class ManifoldMarket(BaseModel):
84
104
  return datetime.fromtimestamp(value)
85
105
 
86
106
 
107
+ class FullManifoldMarket(ManifoldMarket):
108
+ # Some of these fields are available only in specific cases, see https://docs.manifold.markets/api#get-v0marketmarketid.
109
+ answers: list[ManifoldAnswer] | None = None
110
+ shouldAnswersSumToOne: bool | None = None
111
+ addAnswersMode: ManifoldAnswersMode | None = None
112
+ options: dict[str, int | str] | None = None
113
+ totalBounty: float | None = None
114
+ bountyLeft: float | None = None
115
+ description: str | dict[str, t.Any]
116
+ textDescription: str
117
+ coverImageUrl: str | None = None
118
+ groupSlugs: list[str] | None = None
119
+
120
+
87
121
  class ProfitCached(BaseModel):
88
122
  daily: Mana
89
123
  weekly: Mana
@@ -386,6 +386,7 @@ class OmenBet(BaseModel):
386
386
  outcome=self.boolean_outcome,
387
387
  created_time=self.creation_datetime,
388
388
  market_question=self.title,
389
+ market_id=self.fpmm.id,
389
390
  )
390
391
 
391
392
  def to_generic_resolved_bet(self) -> ResolvedBet:
@@ -399,6 +400,7 @@ class OmenBet(BaseModel):
399
400
  outcome=self.boolean_outcome,
400
401
  created_time=self.creation_datetime,
401
402
  market_question=self.title,
403
+ market_id=self.fpmm.id,
402
404
  market_outcome=self.fpmm.boolean_outcome,
403
405
  resolved_time=datetime.fromtimestamp(
404
406
  check_not_none(self.fpmm.answerFinalizedTimestamp)
@@ -28,6 +28,7 @@ from prediction_market_agent_tooling.markets.data_models import (
28
28
  BetAmount,
29
29
  Currency,
30
30
  Position,
31
+ ResolvedBet,
31
32
  TokenAmount,
32
33
  )
33
34
  from prediction_market_agent_tooling.markets.omen.data_models import (
@@ -336,6 +337,20 @@ class OmenAgentMarket(AgentMarket):
336
337
  bets.sort(key=lambda x: x.creation_datetime)
337
338
  return [b.to_bet() for b in bets]
338
339
 
340
+ @staticmethod
341
+ def get_resolved_bets_made_since(
342
+ better_address: ChecksumAddress, start_time: datetime, end_time: datetime | None
343
+ ) -> list[ResolvedBet]:
344
+ subgraph_handler = OmenSubgraphHandler()
345
+ bets = subgraph_handler.get_resolved_bets_with_valid_answer(
346
+ better_address=better_address,
347
+ start_time=start_time,
348
+ end_time=end_time,
349
+ market_id=None,
350
+ )
351
+ generic_bets = [b.to_generic_resolved_bet() for b in bets]
352
+ return generic_bets
353
+
339
354
  def get_contract(
340
355
  self,
341
356
  ) -> OmenFixedProductMarketMakerContract:
@@ -14,7 +14,7 @@ def rewrite_question_into_image_generation_prompt(question: str) -> str:
14
14
  llm = ChatOpenAI(
15
15
  model="gpt-4-turbo",
16
16
  temperature=0.0,
17
- api_key=APIKeys().openai_api_key.get_secret_value(),
17
+ api_key=APIKeys().openai_api_key_secretstr_v1,
18
18
  )
19
19
  rewritten = str(
20
20
  llm.invoke(
@@ -48,7 +48,7 @@ def is_predictable_binary(
48
48
  llm = ChatOpenAI(
49
49
  model=engine,
50
50
  temperature=0.0,
51
- api_key=APIKeys().openai_api_key.get_secret_value(),
51
+ api_key=APIKeys().openai_api_key_secretstr_v1,
52
52
  )
53
53
 
54
54
  prompt = ChatPromptTemplate.from_template(template=prompt_template)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prediction-market-agent-tooling
3
- Version: 0.41.1
3
+ Version: 0.42.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
@@ -21,9 +21,9 @@ Requires-Dist: google-cloud-functions (>=1.16.0,<2.0.0)
21
21
  Requires-Dist: google-cloud-resource-manager (>=1.12.0,<2.0.0)
22
22
  Requires-Dist: google-cloud-secret-manager (>=2.18.2,<3.0.0)
23
23
  Requires-Dist: isort (>=5.13.2,<6.0.0)
24
- Requires-Dist: langchain (>=0.1.9,<0.2.0) ; extra == "langchain"
24
+ Requires-Dist: langchain (>=0.2.6,<0.3.0) ; extra == "langchain"
25
25
  Requires-Dist: langchain-community (>=0.0.19)
26
- Requires-Dist: langchain-openai (>=0.0.5,<0.0.6) ; extra == "langchain"
26
+ Requires-Dist: langchain-openai (>=0.1.0,<0.2.0) ; extra == "langchain"
27
27
  Requires-Dist: langfuse (>=2.27.1,<3.0.0)
28
28
  Requires-Dist: loguru (>=0.7.2,<0.8.0)
29
29
  Requires-Dist: numpy (>=1.26.4,<2.0.0)
@@ -12,7 +12,7 @@ prediction_market_agent_tooling/benchmark/__init__.py,sha256=47DEQpj8HBSa-_TImW-
12
12
  prediction_market_agent_tooling/benchmark/agents.py,sha256=HPIFJvackW110ch3UkktbxhU48gMRVo4gQse84Klhdc,4000
13
13
  prediction_market_agent_tooling/benchmark/benchmark.py,sha256=xiHKzZx5GHSsDerFHMZ9j_LXAXnSaITSvv67iPe3MEU,21095
14
14
  prediction_market_agent_tooling/benchmark/utils.py,sha256=iS1BzyXcCMfMm1Rx--1QCH0pHvBTblTndcDQFbTUJ2s,2897
15
- prediction_market_agent_tooling/config.py,sha256=beNwFgOpe30lIFIvwyXKzH86jNzkvqKARosKkrl_mmg,5026
15
+ prediction_market_agent_tooling/config.py,sha256=3j1iMiJWntSkqQv5HllJgihgqf9I2_0e0LPncVFRi7g,5260
16
16
  prediction_market_agent_tooling/deploy/agent.py,sha256=TXuQ0L2-dG0tIrJ7srxD3Hbabe_2gILfdBQI-tkl9Og,10522
17
17
  prediction_market_agent_tooling/deploy/agent_example.py,sha256=tqXVA2HSFK3pdZ49tMmta8aKdJFT8JN8WeJ1akjrpBk,909
18
18
  prediction_market_agent_tooling/deploy/constants.py,sha256=M5ty8URipYMGe_G-RzxRydK3AFL6CyvmqCraJUrLBnE,82
@@ -21,12 +21,12 @@ prediction_market_agent_tooling/deploy/gcp/kubernetes_models.py,sha256=qYIHRxQLa
21
21
  prediction_market_agent_tooling/deploy/gcp/utils.py,sha256=oyW0jgrUT2Tr49c7GlpcMsYNQjoCSOcWis3q-MmVAhU,6089
22
22
  prediction_market_agent_tooling/gtypes.py,sha256=lbV2nsPyhMIRI9olx0_6A06jwTWKYBPGMxyiGVFysag,2467
23
23
  prediction_market_agent_tooling/loggers.py,sha256=ua9rynYmsbOJZjxPIFxRBooomeN08zuLSJ7lxZMDS7w,3133
24
- prediction_market_agent_tooling/markets/agent_market.py,sha256=ZpBpNLqY2QXTAdmkCr8-L3yjN70H_y-KiCptx3OFQgM,8099
25
- prediction_market_agent_tooling/markets/categorize.py,sha256=yTd-lDMPW4ESDSzmxeLLBuzLX0FggOF7Vbswh7295o0,941
26
- prediction_market_agent_tooling/markets/data_models.py,sha256=IYI8fne-OA18ZP1lcXySEo9rcJHYv3wZrUvJziSaHew,1476
24
+ prediction_market_agent_tooling/markets/agent_market.py,sha256=zUxDOR-fx1roQKdUCN3FsBfnziIL6POTNK1NsMOgLFw,8365
25
+ prediction_market_agent_tooling/markets/categorize.py,sha256=HyKSFHXPL7Hfe90ahbF7xszamYREUVrPkLcpifw1V9Y,935
26
+ prediction_market_agent_tooling/markets/data_models.py,sha256=qD0LyFkzimaMkDVE0QO2a4I9fQ8qpO2qPmVzb-0JBik,2085
27
27
  prediction_market_agent_tooling/markets/manifold/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- prediction_market_agent_tooling/markets/manifold/api.py,sha256=m6qOzDiyQfxj62Eo_SzzQLkX4ijpi8KtQKGd4CpKAsk,7307
29
- prediction_market_agent_tooling/markets/manifold/data_models.py,sha256=xoCqxk9cO6MZ_px_SEGYZ8hHyhGh-X6QDC8dDhyF3rk,5302
28
+ prediction_market_agent_tooling/markets/manifold/api.py,sha256=AC2zmkzpBU3P4kyybs7CgPbDg4hLAx3GY5mjgDi7qDo,7221
29
+ prediction_market_agent_tooling/markets/manifold/data_models.py,sha256=jHqOzOiN21wYvDNyh4VtbGtj4adWr6vA4liOQmh24cc,6239
30
30
  prediction_market_agent_tooling/markets/manifold/manifold.py,sha256=EwRL06E2Y_ZAzr8efwS5yD6p6rnykrcBhqmNDUGZ8Aw,4075
31
31
  prediction_market_agent_tooling/markets/manifold/utils.py,sha256=cPPFWXm3vCYH1jy7_ctJZuQH9ZDaPL4_AgAYzGWkoow,513
32
32
  prediction_market_agent_tooling/markets/markets.py,sha256=Hz3E7LJ5HIjCHQtdU5_Bymav2dYT0dDxKOL0i8mV0mg,3142
@@ -34,8 +34,8 @@ prediction_market_agent_tooling/markets/metaculus/api.py,sha256=gvPQVAM5NlCyWzEM
34
34
  prediction_market_agent_tooling/markets/metaculus/data_models.py,sha256=6TBy17xntdLBR61QCE5wddwTa_k2D0D8ZgK6p7sGUuc,2448
35
35
  prediction_market_agent_tooling/markets/metaculus/metaculus.py,sha256=KMWksTNFCKxqjeMiuRh5yNarPSv7sH0aDkgeC3fm3Dg,3293
36
36
  prediction_market_agent_tooling/markets/omen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- prediction_market_agent_tooling/markets/omen/data_models.py,sha256=EXtjmcujx68Xu50BVkYXvLuf_Asx5o65RvFS3ZS6HGs,14405
38
- prediction_market_agent_tooling/markets/omen/omen.py,sha256=0ua3bv8gc2aRHMg1UnuvqS-i7YE-QVzMJs07XgiR1n8,38445
37
+ prediction_market_agent_tooling/markets/omen/data_models.py,sha256=oY-5wvFR4lXaTsmXVKrqrAQ8TWd-mAHLaxI1ETatLOc,14477
38
+ prediction_market_agent_tooling/markets/omen/omen.py,sha256=VHZmO5_5i3ydzBvvjSas-8AfkmnQ87pMFStYUETQW2Y,38996
39
39
  prediction_market_agent_tooling/markets/omen/omen_contracts.py,sha256=JGXCO9MIVr-DGyoH2sxReAw7ZDTC_ev0UxDpq1QBv5Q,21854
40
40
  prediction_market_agent_tooling/markets/omen/omen_resolving.py,sha256=g77QsQ5WnSI2rzBlX87L_EhWMwobkyXyfRhHQmpAdzo,9012
41
41
  prediction_market_agent_tooling/markets/omen/omen_subgraph_handler.py,sha256=kDbeZ8ImLtBSFz0GoGdCqeC1Xd3_eGMAxvmLFT8kp8Y,25222
@@ -65,16 +65,16 @@ prediction_market_agent_tooling/tools/gnosis_rpc.py,sha256=_MYSoyOR2MgAJkop1ERf8
65
65
  prediction_market_agent_tooling/tools/google.py,sha256=SfVDxb3oEOUK8mpd0l3mTX9ybrdrTPNM6HjfJ7kfNjA,1794
66
66
  prediction_market_agent_tooling/tools/hexbytes_custom.py,sha256=Bp94qgPjvjWf1Vb4lNzGFDXRdThw1rJ91vL6r2PWq5E,2096
67
67
  prediction_market_agent_tooling/tools/image_gen/image_gen.py,sha256=HzRwBx62hOXBOmrtpkXaP9Qq1Ku03uUGdREocyjLQ_k,1266
68
- prediction_market_agent_tooling/tools/image_gen/market_thumbnail_gen.py,sha256=svEu-oJNVuqpPpA7JjPEz3s1yM1_DgVf4M6gu90YKMQ,1110
69
- prediction_market_agent_tooling/tools/is_predictable.py,sha256=yRSkmu4lZqrSje9QGpnyWTFmdCnRvClfaFDHE2Zf9G4,2936
68
+ prediction_market_agent_tooling/tools/image_gen/market_thumbnail_gen.py,sha256=g-2BWS11CS7K6QRNbZRMTX_Xo2xOwjyCdhnwaQygX1Y,1104
69
+ prediction_market_agent_tooling/tools/is_predictable.py,sha256=radTwyxfUGfE1HCKWlvKl05Cpv_HD7E1d6A_Wm1K5ek,2930
70
70
  prediction_market_agent_tooling/tools/parallelism.py,sha256=8mgkF5sBwFGS5GMvlpzam82Y3p2swPYuNsywpQuy-a4,1508
71
71
  prediction_market_agent_tooling/tools/safe.py,sha256=h0xOO0eNtitClf0fPkn-0oTc6A_bflDTee98V_aiV-A,5195
72
72
  prediction_market_agent_tooling/tools/singleton.py,sha256=CiIELUiI-OeS7U7eeHEt0rnVhtQGzwoUdAgn_7u_GBM,729
73
73
  prediction_market_agent_tooling/tools/streamlit_user_login.py,sha256=NXEqfjT9Lc9QtliwSGRASIz1opjQ7Btme43H4qJbzgE,3010
74
74
  prediction_market_agent_tooling/tools/utils.py,sha256=-G22UEbCRm59bm1RWFdeF55hRsaxgwZVAHvK32-Ye1g,6190
75
75
  prediction_market_agent_tooling/tools/web3_utils.py,sha256=nKRHmdLnWSKd3wpo-cysXGvhhrJ2Yf69sN2FFQfSt6s,10578
76
- prediction_market_agent_tooling-0.41.1.dist-info/LICENSE,sha256=6or154nLLU6bELzjh0mCreFjt0m2v72zLi3yHE0QbeE,7650
77
- prediction_market_agent_tooling-0.41.1.dist-info/METADATA,sha256=1zVYGk0omz_f1M8jk4ECidTv9zS8yoHjSA4d967-bmk,7634
78
- prediction_market_agent_tooling-0.41.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
79
- prediction_market_agent_tooling-0.41.1.dist-info/entry_points.txt,sha256=m8PukHbeH5g0IAAmOf_1Ahm-sGAMdhSSRQmwtpmi2s8,81
80
- prediction_market_agent_tooling-0.41.1.dist-info/RECORD,,
76
+ prediction_market_agent_tooling-0.42.1.dist-info/LICENSE,sha256=6or154nLLU6bELzjh0mCreFjt0m2v72zLi3yHE0QbeE,7650
77
+ prediction_market_agent_tooling-0.42.1.dist-info/METADATA,sha256=2sleEbYjQ1DxF34LiETR16iXB1HukqtLjeMVKJYRqNQ,7634
78
+ prediction_market_agent_tooling-0.42.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
79
+ prediction_market_agent_tooling-0.42.1.dist-info/entry_points.txt,sha256=m8PukHbeH5g0IAAmOf_1Ahm-sGAMdhSSRQmwtpmi2s8,81
80
+ prediction_market_agent_tooling-0.42.1.dist-info/RECORD,,