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.
- {everestapi-0.2.1 → everestapi-0.2.4}/LICENSE +1 -1
- {everestapi-0.2.1/src/everestapi.egg-info → everestapi-0.2.4}/PKG-INFO +39 -7
- {everestapi-0.2.1 → everestapi-0.2.4}/README.md +32 -2
- {everestapi-0.2.1 → everestapi-0.2.4}/pyproject.toml +7 -4
- {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi/__init__.py +2 -2
- {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi/cli.py +17 -10
- {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi/client.py +342 -101
- {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi/mcp/server.py +394 -49
- everestapi-0.2.4/src/everestapi/plots.py +70 -0
- {everestapi-0.2.1 → everestapi-0.2.4/src/everestapi.egg-info}/PKG-INFO +39 -7
- {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi.egg-info/SOURCES.txt +5 -1
- {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi.egg-info/requires.txt +3 -0
- {everestapi-0.2.1 → everestapi-0.2.4}/tests/test_client.py +3 -2
- everestapi-0.2.4/tests/test_diagnostics.py +162 -0
- everestapi-0.2.4/tests/test_json_or_raise.py +59 -0
- {everestapi-0.2.1 → everestapi-0.2.4}/tests/test_mcp_and_models.py +83 -11
- everestapi-0.2.4/tests/test_prediction_range.py +57 -0
- {everestapi-0.2.1 → everestapi-0.2.4}/setup.cfg +0 -0
- {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi/__main__.py +0 -0
- {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi/mcp/__init__.py +0 -0
- {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi/mcp/__main__.py +0 -0
- {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi/types.py +0 -0
- {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi.egg-info/dependency_links.txt +0 -0
- {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi.egg-info/entry_points.txt +0 -0
- {everestapi-0.2.1 → everestapi-0.2.4}/src/everestapi.egg-info/top_level.txt +0 -0
- {everestapi-0.2.1 → everestapi-0.2.4}/tests/test_cli.py +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: everestapi
|
|
3
|
-
Version: 0.2.
|
|
4
|
-
Summary: Python SDK for the
|
|
5
|
-
Author-email:
|
|
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://
|
|
8
|
-
Project-URL: Documentation, https://docs.
|
|
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 [
|
|
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.**
|
|
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 [
|
|
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.**
|
|
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
|
|
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 = "
|
|
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://
|
|
40
|
-
Documentation = "https://docs.
|
|
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
|
|
1
|
+
"""EverestAPI — Python SDK for the Everesteer prediction tournament platform."""
|
|
2
2
|
|
|
3
|
-
__version__ = "0.2.
|
|
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
|
|
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
|
-
"""
|
|
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(
|
|
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(
|
|
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",
|
|
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,
|
|
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(
|
|
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)
|