everestapi 0.2.1__tar.gz → 0.2.4__tar.gz

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.
Files changed (26) hide show
  1. {everestapi-0.2.1 → everestapi-0.2.4}/LICENSE +1 -1
  2. {everestapi-0.2.1/src/everestapi.egg-info → everestapi-0.2.4}/PKG-INFO +39 -7
  3. {everestapi-0.2.1 → everestapi-0.2.4}/README.md +32 -2
  4. {everestapi-0.2.1 → everestapi-0.2.4}/pyproject.toml +7 -4
  5. {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi/__init__.py +2 -2
  6. {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi/cli.py +17 -10
  7. {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi/client.py +342 -101
  8. {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi/mcp/server.py +394 -49
  9. everestapi-0.2.4/src/everestapi/plots.py +70 -0
  10. {everestapi-0.2.1 → everestapi-0.2.4/src/everestapi.egg-info}/PKG-INFO +39 -7
  11. {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi.egg-info/SOURCES.txt +5 -1
  12. {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi.egg-info/requires.txt +3 -0
  13. {everestapi-0.2.1 → everestapi-0.2.4}/tests/test_client.py +3 -2
  14. everestapi-0.2.4/tests/test_diagnostics.py +162 -0
  15. everestapi-0.2.4/tests/test_json_or_raise.py +59 -0
  16. {everestapi-0.2.1 → everestapi-0.2.4}/tests/test_mcp_and_models.py +83 -11
  17. everestapi-0.2.4/tests/test_prediction_range.py +57 -0
  18. {everestapi-0.2.1 → everestapi-0.2.4}/setup.cfg +0 -0
  19. {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi/__main__.py +0 -0
  20. {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi/mcp/__init__.py +0 -0
  21. {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi/mcp/__main__.py +0 -0
  22. {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi/types.py +0 -0
  23. {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi.egg-info/dependency_links.txt +0 -0
  24. {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi.egg-info/entry_points.txt +0 -0
  25. {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi.egg-info/top_level.txt +0 -0
  26. {everestapi-0.2.1 → everestapi-0.2.4}/tests/test_cli.py +0 -0
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 EverestQuant
3
+ Copyright (c) 2026 Everesteer
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: everestapi
3
- Version: 0.2.1
4
- Summary: Python SDK for the EverestQuant prediction tournament platform
5
- Author-email: EverestQuant <engineering@everestquant.ai>
3
+ Version: 0.2.4
4
+ Summary: Python SDK for the Everesteer prediction tournament platform
5
+ Author-email: Everesteer <support@everesteer.ai>
6
6
  License-Expression: MIT
7
- Project-URL: Homepage, https://everestquant.ai
8
- Project-URL: Documentation, https://docs.everestquant.ai
7
+ Project-URL: Homepage, https://everesteer.ai
8
+ Project-URL: Documentation, https://docs.everesteer.ai
9
9
  Project-URL: Repository, https://github.com/everestquant/everestapi-public
10
10
  Keywords: quant,tournament,prediction,staking,machine-learning
11
11
  Classifier: Development Status :: 4 - Beta
@@ -26,11 +26,13 @@ Requires-Dist: pytest>=8.0; extra == "dev"
26
26
  Requires-Dist: pytest-httpx>=0.34.0; extra == "dev"
27
27
  Provides-Extra: mcp
28
28
  Requires-Dist: mcp>=1.0; extra == "mcp"
29
+ Provides-Extra: viz
30
+ Requires-Dist: plotnine>=0.13; extra == "viz"
29
31
  Dynamic: license-file
30
32
 
31
33
  # everestapi
32
34
 
33
- Python SDK for the [EverestQuant](https://everestquant.ai) prediction tournament platform.
35
+ Python SDK for the [Everesteer](https://everesteer.ai) prediction tournament platform.
34
36
 
35
37
  ```bash
36
38
  pip install everestapi
@@ -109,9 +111,39 @@ api.download_dataset(universe="futures", split="train")
109
111
  api.download_benchmark(universe="futures", split="validation")
110
112
  api.get_dataset_info(universe="futures")
111
113
  api.get_diagnostics(model_id="my-model")
114
+
115
+ # Validation diagnostics: eiq_validation_example_preds.parquet is the upload template
116
+ # (same `id` set, your own `prediction` column).
117
+ api.download_dataset(universe="futures", split="validation_example_preds")
112
118
  api.submit_validation_diagnostics(model_id="my-model", predictions=df)
113
119
  ```
114
120
 
121
+ ### Plotting (optional `viz` extra)
122
+
123
+ The `viz` extra installs [plotnine](https://plotnine.org/) (a grammar-of-graphics /
124
+ ggplot2 port). Use it to chart **anything** the SDK returns — scores, leaderboards,
125
+ per-exped series, validation panels. `everestapi.plots.plot_corr_curve` is just a
126
+ worked example; for any other chart, build it with plotnine directly.
127
+
128
+ ```bash
129
+ pip install 'everestapi[viz]'
130
+ ```
131
+
132
+ ```python
133
+ # Convenience helper — cumulative-CORR curve to a PNG:
134
+ from everestapi.plots import plot_corr_curve
135
+ corr = api.get_model_per_exped_breakdown(model_id="my-model")
136
+ plot_corr_curve(corr, output_path="corr_curve.png")
137
+
138
+ # Any other chart — plotnine on SDK data (matplotlib Agg backend, headless-safe):
139
+ import matplotlib; matplotlib.use("Agg")
140
+ import pandas as pd, plotnine as p9
141
+ lb = api.get_leaderboard(period="30d")
142
+ df = pd.DataFrame(lb["entries"])
143
+ (p9.ggplot(df, p9.aes("model_name", "total_payout")) + p9.geom_col()
144
+ + p9.coord_flip()).save("leaderboard.png", verbose=False)
145
+ ```
146
+
115
147
  ### Serverless compute
116
148
 
117
149
  ```python
@@ -178,7 +210,7 @@ with EverestAPI(api_key="...") as api:
178
210
 
179
211
  ## Disclaimers
180
212
 
181
- - **Not financial advice.** EverestQuant tournaments are prediction competitions. Nothing in this SDK or on the platform constitutes investment advice, a solicitation, or a recommendation to buy or sell any financial instrument.
213
+ - **Not financial advice.** Everesteer tournaments are prediction competitions. Nothing in this SDK or on the platform constitutes investment advice, a solicitation, or a recommendation to buy or sell any financial instrument.
182
214
  - **Testnet / beta.** The staking system and compute platform are in beta. Smart contract addresses, API endpoints, and payout mechanics may change without notice.
183
215
  - **API stability.** This SDK targets API v1. Breaking changes will be communicated via the platform changelog and will follow semver once the SDK reaches 1.0.
184
216
  - **Data is obfuscated.** All features and instrument identifiers served by the API are obfuscated. Attempting to reverse-engineer or de-obfuscate data violates the platform terms of service.
@@ -1,6 +1,6 @@
1
1
  # everestapi
2
2
 
3
- Python SDK for the [EverestQuant](https://everestquant.ai) prediction tournament platform.
3
+ Python SDK for the [Everesteer](https://everesteer.ai) prediction tournament platform.
4
4
 
5
5
  ```bash
6
6
  pip install everestapi
@@ -79,9 +79,39 @@ api.download_dataset(universe="futures", split="train")
79
79
  api.download_benchmark(universe="futures", split="validation")
80
80
  api.get_dataset_info(universe="futures")
81
81
  api.get_diagnostics(model_id="my-model")
82
+
83
+ # Validation diagnostics: eiq_validation_example_preds.parquet is the upload template
84
+ # (same `id` set, your own `prediction` column).
85
+ api.download_dataset(universe="futures", split="validation_example_preds")
82
86
  api.submit_validation_diagnostics(model_id="my-model", predictions=df)
83
87
  ```
84
88
 
89
+ ### Plotting (optional `viz` extra)
90
+
91
+ The `viz` extra installs [plotnine](https://plotnine.org/) (a grammar-of-graphics /
92
+ ggplot2 port). Use it to chart **anything** the SDK returns — scores, leaderboards,
93
+ per-exped series, validation panels. `everestapi.plots.plot_corr_curve` is just a
94
+ worked example; for any other chart, build it with plotnine directly.
95
+
96
+ ```bash
97
+ pip install 'everestapi[viz]'
98
+ ```
99
+
100
+ ```python
101
+ # Convenience helper — cumulative-CORR curve to a PNG:
102
+ from everestapi.plots import plot_corr_curve
103
+ corr = api.get_model_per_exped_breakdown(model_id="my-model")
104
+ plot_corr_curve(corr, output_path="corr_curve.png")
105
+
106
+ # Any other chart — plotnine on SDK data (matplotlib Agg backend, headless-safe):
107
+ import matplotlib; matplotlib.use("Agg")
108
+ import pandas as pd, plotnine as p9
109
+ lb = api.get_leaderboard(period="30d")
110
+ df = pd.DataFrame(lb["entries"])
111
+ (p9.ggplot(df, p9.aes("model_name", "total_payout")) + p9.geom_col()
112
+ + p9.coord_flip()).save("leaderboard.png", verbose=False)
113
+ ```
114
+
85
115
  ### Serverless compute
86
116
 
87
117
  ```python
@@ -148,7 +178,7 @@ with EverestAPI(api_key="...") as api:
148
178
 
149
179
  ## Disclaimers
150
180
 
151
- - **Not financial advice.** EverestQuant tournaments are prediction competitions. Nothing in this SDK or on the platform constitutes investment advice, a solicitation, or a recommendation to buy or sell any financial instrument.
181
+ - **Not financial advice.** Everesteer tournaments are prediction competitions. Nothing in this SDK or on the platform constitutes investment advice, a solicitation, or a recommendation to buy or sell any financial instrument.
152
182
  - **Testnet / beta.** The staking system and compute platform are in beta. Smart contract addresses, API endpoints, and payout mechanics may change without notice.
153
183
  - **API stability.** This SDK targets API v1. Breaking changes will be communicated via the platform changelog and will follow semver once the SDK reaches 1.0.
154
184
  - **Data is obfuscated.** All features and instrument identifiers served by the API are obfuscated. Attempting to reverse-engineer or de-obfuscate data violates the platform terms of service.
@@ -5,11 +5,11 @@ build-backend = "setuptools.build_meta"
5
5
  [project]
6
6
  name = "everestapi"
7
7
  dynamic = ["version"]
8
- description = "Python SDK for the EverestQuant prediction tournament platform"
8
+ description = "Python SDK for the Everesteer prediction tournament platform"
9
9
  readme = "README.md"
10
10
  license = "MIT"
11
11
  requires-python = ">=3.10"
12
- authors = [{ name = "EverestQuant", email = "engineering@everestquant.ai" }]
12
+ authors = [{ name = "Everesteer", email = "support@everesteer.ai" }]
13
13
  keywords = ["quant", "tournament", "prediction", "staking", "machine-learning"]
14
14
  classifiers = [
15
15
  "Development Status :: 4 - Beta",
@@ -31,13 +31,16 @@ dev = ["pytest>=8.0", "pytest-httpx>=0.34.0"]
31
31
  # MCP server (`python -m everestapi.mcp`). Optional — the server falls back to a
32
32
  # built-in JSON-RPC stdio loop when the official `mcp` SDK isn't installed.
33
33
  mcp = ["mcp>=1.0"]
34
+ # Plotting helpers (`everestapi.plots`). Heavy — pulls matplotlib/pandas/numpy/
35
+ # scipy/statsmodels/mizani. Optional: the SDK and MCP server never import it.
36
+ viz = ["plotnine>=0.13"]
34
37
 
35
38
  [project.scripts]
36
39
  everestapi = "everestapi.cli:cli"
37
40
 
38
41
  [project.urls]
39
- Homepage = "https://everestquant.ai"
40
- Documentation = "https://docs.everestquant.ai"
42
+ Homepage = "https://everesteer.ai"
43
+ Documentation = "https://docs.everesteer.ai"
41
44
  Repository = "https://github.com/everestquant/everestapi-public"
42
45
 
43
46
  [tool.setuptools.packages.find]
@@ -1,6 +1,6 @@
1
- """EverestAPI — Python SDK for the EverestQuant prediction tournament platform."""
1
+ """EverestAPI — Python SDK for the Everesteer prediction tournament platform."""
2
2
 
3
- __version__ = "0.2.1"
3
+ __version__ = "0.2.4"
4
4
 
5
5
  from everestapi.client import EverestAPI, EverestError
6
6
  from everestapi.types import (
@@ -1,4 +1,4 @@
1
- """EverestAPI CLI — command-line interface for the EverestQuant tournament platform.
1
+ """EverestAPI CLI — command-line interface for the Everesteer tournament platform.
2
2
 
3
3
  Usage:
4
4
  everestapi health
@@ -32,7 +32,7 @@ def _print_json(data: dict) -> None:
32
32
  @click.group()
33
33
  @click.version_option(__version__, prog_name="everestapi")
34
34
  def cli() -> None:
35
- """EverestQuant tournament CLI."""
35
+ """Everesteer tournament CLI."""
36
36
 
37
37
 
38
38
  @cli.command()
@@ -69,11 +69,15 @@ def download_data(universe: str, split: str, output: str | None, api_key: str |
69
69
  @click.option("--version", "-v", default="v0")
70
70
  @click.option("--output", "-o", default=None)
71
71
  @click.option("--api-key", envvar=["EIQ_API_KEY", "EVEREST_API_KEY"], default=None)
72
- def download_benchmark(universe: str, split: str, version: str, output: str | None, api_key: str | None) -> None:
72
+ def download_benchmark(
73
+ universe: str, split: str, version: str, output: str | None, api_key: str | None
74
+ ) -> None:
73
75
  """Download benchmark model predictions."""
74
76
  api = _get_api(api_key)
75
77
  try:
76
- path = api.download_benchmark(universe=universe, split=split, version=version, output_path=output)
78
+ path = api.download_benchmark(
79
+ universe=universe, split=split, version=version, output_path=output
80
+ )
77
81
  click.echo(f"Downloaded to {path}")
78
82
  except EverestError as e:
79
83
  click.echo(f"Error: {e}", err=True)
@@ -83,7 +87,9 @@ def download_benchmark(universe: str, split: str, version: str, output: str | No
83
87
  @cli.command()
84
88
  @click.option("--model", "-m", required=True, help="Model identifier")
85
89
  @click.option(
86
- "--file", "-f", "file_path",
90
+ "--file",
91
+ "-f",
92
+ "file_path",
87
93
  required=True,
88
94
  help="Predictions file (.parquet or .csv). Parquet recommended.",
89
95
  )
@@ -102,7 +108,9 @@ def submit(model: str, file_path: str, tournament: str, api_key: str | None) ->
102
108
  try:
103
109
  if ext == "parquet":
104
110
  result = api.submit_predictions_file(
105
- model_name=model, file_path=file_path, tournament=tournament,
111
+ model_name=model,
112
+ file_path=file_path,
113
+ tournament=tournament,
106
114
  )
107
115
  elif ext == "csv":
108
116
  import csv as _csv
@@ -115,8 +123,7 @@ def submit(model: str, file_path: str, tournament: str, api_key: str | None) ->
115
123
  result = api.submit_futures_predictions(model_id=model, predictions=preds)
116
124
  else:
117
125
  preds_list = [
118
- {"ticker": row["ticker"], "score": float(row["score"])}
119
- for row in rows
126
+ {"ticker": row["ticker"], "score": float(row["score"])} for row in rows
120
127
  ]
121
128
  result = api.submit_predictions(model_id=model, predictions=preds_list)
122
129
  else:
@@ -127,7 +134,7 @@ def submit(model: str, file_path: str, tournament: str, api_key: str | None) ->
127
134
  sys.exit(1)
128
135
 
129
136
  _print_json(result)
130
- except (EverestError, KeyError, FileNotFoundError) as e:
137
+ except (EverestError, KeyError, FileNotFoundError, ValueError) as e:
131
138
  click.echo(f"Error: {e}", err=True)
132
139
  sys.exit(1)
133
140
 
@@ -227,7 +234,7 @@ def register(name: str, email: str) -> None:
227
234
  click.echo("Registration successful!")
228
235
  click.echo(f" Agent ID: {result['agent_id']}")
229
236
  click.echo(f" API Key: {result['api_key']} (save this — shown once)")
230
- click.echo(f"\nSet your API key:")
237
+ click.echo("\nSet your API key:")
231
238
  click.echo(f" export EIQ_API_KEY={result['api_key']}")
232
239
  except EverestError as e:
233
240
  click.echo(f"Error: {e}", err=True)