crewai-liquidvision 0.1.0__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.
@@ -0,0 +1,59 @@
1
+ Metadata-Version: 2.4
2
+ Name: crewai-liquidvision
3
+ Version: 0.1.0
4
+ Summary: CrewAI tools for LiquidVision.app crypto derivatives data: open interest, funding and liquidations on 13 venues, liquidation cascades, positioning regime, measured Hyperliquid liquidation maps, funding dispersion, tokenized stocks. Read-only, no key needed.
5
+ License: MIT
6
+ Project-URL: Homepage, https://liquidvision.app
7
+ Project-URL: Documentation, https://liquidvision.app/llms.txt
8
+ Project-URL: Source, https://github.com/lv-analytics/liquidvision-mcp/tree/main/integrations/crewai
9
+ Keywords: crewai,crew,tools,crypto,derivatives,liquidations,open interest,funding rate,hyperliquid,trading,ai agent
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Topic :: Office/Business :: Financial
13
+ Classifier: Intended Audience :: Developers
14
+ Requires-Python: >=3.10
15
+ Description-Content-Type: text/markdown
16
+ Requires-Dist: crewai>=0.100
17
+
18
+ # crewai-liquidvision
19
+
20
+ Crypto derivatives tools for CrewAI agents, from [LiquidVision.app](https://liquidvision.app).
21
+ Read-only, no key needed.
22
+
23
+ ```bash
24
+ pip install crewai-liquidvision
25
+ ```
26
+
27
+ ```python
28
+ from crewai import Agent, Crew, Task
29
+ from crewai_liquidvision import liquidvision_tools
30
+
31
+ analyst = Agent(
32
+ role="Crypto derivatives analyst",
33
+ goal="Tell whether leverage is building or unwinding and where it would break",
34
+ backstory="Reads open interest, funding and liquidations across 13 exchanges.",
35
+ tools=liquidvision_tools(),
36
+ )
37
+ task = Task(description="Is the current ETH move new longs or short covering? Where are the nearest liquidation levels?",
38
+ expected_output="Three short paragraphs with numbers", agent=analyst)
39
+ print(Crew(agents=[analyst], tasks=[task]).kickoff())
40
+ ```
41
+
42
+ | Tool class | Answers |
43
+ |---|---|
44
+ | `DerivativesBriefTool` | One coin: price, open interest by venue, liquidations by side, funding per exchange, nearest liquidation zones |
45
+ | `PositioningRegimeTool` | New longs, short covering, new shorts or long flush: price change crossed with OI change |
46
+ | `LiquidationCascadesTool` | Liquidation cascades as events: size, multiple of the coin's normal minute, price impact, reversion |
47
+ | `LiquidationMapTool` | Measured Hyperliquid liquidation levels below and above price (exchange-reported, not modeled) |
48
+ | `FundingDispersionTool` | Cheapest venue to be long, richest to be short, across 13 exchanges |
49
+ | `TokenizedStocksTool` | Tokenized stocks, indices, commodities and FX perps on DEXs |
50
+
51
+ Each tool returns compact JSON. Errors come back as `{"error": ...}` so the crew keeps going.
52
+
53
+ **Limits.** 60 requests a minute per IP without a key. Set `LIQUIDVISION_API_KEY` (or
54
+ `liquidvision_tools(api_key=...)`) with a Pro/Bot key for 600/1,200 a minute.
55
+
56
+ **More.** Raw rows, history and Parquet: the [`liquidvision`](https://pypi.org/project/liquidvision/) client.
57
+ MCP: `https://liquidvision.app/mcp/lite`. Docs: https://liquidvision.app/llms.txt
58
+
59
+ Data, not financial advice.
@@ -0,0 +1,42 @@
1
+ # crewai-liquidvision
2
+
3
+ Crypto derivatives tools for CrewAI agents, from [LiquidVision.app](https://liquidvision.app).
4
+ Read-only, no key needed.
5
+
6
+ ```bash
7
+ pip install crewai-liquidvision
8
+ ```
9
+
10
+ ```python
11
+ from crewai import Agent, Crew, Task
12
+ from crewai_liquidvision import liquidvision_tools
13
+
14
+ analyst = Agent(
15
+ role="Crypto derivatives analyst",
16
+ goal="Tell whether leverage is building or unwinding and where it would break",
17
+ backstory="Reads open interest, funding and liquidations across 13 exchanges.",
18
+ tools=liquidvision_tools(),
19
+ )
20
+ task = Task(description="Is the current ETH move new longs or short covering? Where are the nearest liquidation levels?",
21
+ expected_output="Three short paragraphs with numbers", agent=analyst)
22
+ print(Crew(agents=[analyst], tasks=[task]).kickoff())
23
+ ```
24
+
25
+ | Tool class | Answers |
26
+ |---|---|
27
+ | `DerivativesBriefTool` | One coin: price, open interest by venue, liquidations by side, funding per exchange, nearest liquidation zones |
28
+ | `PositioningRegimeTool` | New longs, short covering, new shorts or long flush: price change crossed with OI change |
29
+ | `LiquidationCascadesTool` | Liquidation cascades as events: size, multiple of the coin's normal minute, price impact, reversion |
30
+ | `LiquidationMapTool` | Measured Hyperliquid liquidation levels below and above price (exchange-reported, not modeled) |
31
+ | `FundingDispersionTool` | Cheapest venue to be long, richest to be short, across 13 exchanges |
32
+ | `TokenizedStocksTool` | Tokenized stocks, indices, commodities and FX perps on DEXs |
33
+
34
+ Each tool returns compact JSON. Errors come back as `{"error": ...}` so the crew keeps going.
35
+
36
+ **Limits.** 60 requests a minute per IP without a key. Set `LIQUIDVISION_API_KEY` (or
37
+ `liquidvision_tools(api_key=...)`) with a Pro/Bot key for 600/1,200 a minute.
38
+
39
+ **More.** Raw rows, history and Parquet: the [`liquidvision`](https://pypi.org/project/liquidvision/) client.
40
+ MCP: `https://liquidvision.app/mcp/lite`. Docs: https://liquidvision.app/llms.txt
41
+
42
+ Data, not financial advice.
@@ -0,0 +1,96 @@
1
+ """
2
+ crewai-liquidvision: crypto derivatives tools for CrewAI agents.
3
+
4
+ from crewai_liquidvision import liquidvision_tools
5
+ analyst = Agent(role="Derivatives analyst", tools=liquidvision_tools(), ...)
6
+
7
+ Data from LiquidVision.app: open interest, funding and liquidations on 13
8
+ venues, liquidation cascades, positioning regime, measured Hyperliquid
9
+ liquidation maps, funding dispersion, tokenized stocks on DEXs. Read-only,
10
+ no key needed.
11
+ """
12
+ from __future__ import annotations
13
+
14
+ from typing import Any, ClassVar, List, Optional, Type
15
+
16
+ from crewai.tools import BaseTool
17
+ from pydantic import BaseModel, Field, PrivateAttr
18
+
19
+ from ._api import TOOL_SPECS, LiquidVisionAPI, __version__, norm_symbol, run
20
+
21
+ __all__ = [
22
+ "liquidvision_tools", "LiquidVisionAPI", "norm_symbol", "__version__",
23
+ "DerivativesBriefTool", "PositioningRegimeTool", "LiquidationCascadesTool",
24
+ "LiquidationMapTool", "FundingDispersionTool", "TokenizedStocksTool",
25
+ ]
26
+ _SPEC = {m: (n, d) for n, m, d in TOOL_SPECS}
27
+
28
+
29
+ class _Symbol(BaseModel):
30
+ symbol: str = Field("BTCUSDT", description="Coin, e.g. BTC, ETH, SOLUSDT")
31
+
32
+
33
+ class _OptSymbol(BaseModel):
34
+ symbol: Optional[str] = Field(None, description="Coin, e.g. BTC or ETHUSDT; omit for the whole market")
35
+
36
+
37
+ class _Regime(_OptSymbol):
38
+ minutes: int = Field(240, description="Look-back window in minutes (15-1440)")
39
+
40
+
41
+ class _Cascades(_OptSymbol):
42
+ hours: int = Field(24, description="Look-back window in hours (1-72)")
43
+
44
+
45
+ class _Tokenized(BaseModel):
46
+ limit: int = Field(15, description="How many of the largest markets to return")
47
+
48
+
49
+ class _LVTool(BaseTool):
50
+ lv_method: ClassVar[str] = ""
51
+ _api: LiquidVisionAPI = PrivateAttr(default=None)
52
+
53
+ def __init__(self, api_key: Optional[str] = None, base_url: Optional[str] = None, **kw: Any):
54
+ name, description = _SPEC[self.lv_method]
55
+ super().__init__(name=name, description=description, **kw)
56
+ self._api = LiquidVisionAPI(api_key=api_key, base_url=base_url)
57
+
58
+ def _run(self, **kwargs: Any) -> str:
59
+ return run(self._api, self.lv_method, **kwargs)
60
+
61
+
62
+ class DerivativesBriefTool(_LVTool):
63
+ lv_method: ClassVar[str] = "brief"
64
+ args_schema: Type[BaseModel] = _Symbol
65
+
66
+
67
+ class PositioningRegimeTool(_LVTool):
68
+ lv_method: ClassVar[str] = "positioning_regime"
69
+ args_schema: Type[BaseModel] = _Regime
70
+
71
+
72
+ class LiquidationCascadesTool(_LVTool):
73
+ lv_method: ClassVar[str] = "liquidation_cascades"
74
+ args_schema: Type[BaseModel] = _Cascades
75
+
76
+
77
+ class LiquidationMapTool(_LVTool):
78
+ lv_method: ClassVar[str] = "liquidation_map"
79
+ args_schema: Type[BaseModel] = _Symbol
80
+
81
+
82
+ class FundingDispersionTool(_LVTool):
83
+ lv_method: ClassVar[str] = "funding_dispersion"
84
+ args_schema: Type[BaseModel] = _OptSymbol
85
+
86
+
87
+ class TokenizedStocksTool(_LVTool):
88
+ lv_method: ClassVar[str] = "tokenized_stocks"
89
+ args_schema: Type[BaseModel] = _Tokenized
90
+
91
+
92
+ def liquidvision_tools(api_key: Optional[str] = None, base_url: Optional[str] = None) -> List[BaseTool]:
93
+ """All six tools. api_key is optional (raises the rate limit from 60 to 600/1,200 a minute)."""
94
+ return [cls(api_key=api_key, base_url=base_url) for cls in (
95
+ DerivativesBriefTool, PositioningRegimeTool, LiquidationCascadesTool,
96
+ LiquidationMapTool, FundingDispersionTool, TokenizedStocksTool)]
@@ -0,0 +1,187 @@
1
+ """
2
+ Shared core for the LiquidVision.app agent-framework wrappers.
3
+
4
+ Six read-only questions an agent asks about crypto derivatives, each answered
5
+ from LiquidVision.app's free "conclusion" endpoints and trimmed to a compact
6
+ JSON answer an LLM can read in one pass. No key needed (60 requests a minute
7
+ per IP); LIQUIDVISION_API_KEY raises the limit. Standard library only.
8
+ """
9
+ from __future__ import annotations
10
+
11
+ import json
12
+ import os
13
+ import re
14
+ import urllib.error
15
+ import urllib.parse
16
+ import urllib.request
17
+ from typing import Any, Dict, Optional
18
+
19
+ __version__ = "0.1.0"
20
+ DEFAULT_BASE = "https://liquidvision.app/api/v1"
21
+
22
+
23
+ def norm_symbol(symbol: Optional[str]) -> Optional[str]:
24
+ """'btc', 'BTC/USDT', 'BTC-USDT-SWAP', '$BTC' -> 'BTCUSDT'."""
25
+ if not symbol:
26
+ return None
27
+ s = re.sub(r"[^A-Za-z0-9]", "", symbol.upper().replace("SWAP", ""))
28
+ if s.endswith("USDC"):
29
+ s = s[:-4]
30
+ return s if s.endswith("USDT") else s + "USDT"
31
+
32
+
33
+ class LiquidVisionAPI:
34
+ def __init__(self, api_key: Optional[str] = None, base_url: Optional[str] = None, timeout: float = 15.0):
35
+ self.api_key = api_key or os.environ.get("LIQUIDVISION_API_KEY")
36
+ self.base = (base_url or os.environ.get("LIQUIDVISION_BASE_URL") or DEFAULT_BASE).rstrip("/")
37
+ self.timeout = timeout
38
+
39
+ def get(self, path: str, **params: Any) -> Any:
40
+ q = {k: v for k, v in params.items() if v is not None}
41
+ url = self.base + path + ("?" + urllib.parse.urlencode(q) if q else "")
42
+ headers = {"User-Agent": f"liquidvision-agent-tools/{__version__}", "Accept": "application/json"}
43
+ if self.api_key:
44
+ headers["X-API-Key"] = self.api_key
45
+ req = urllib.request.Request(url, headers=headers)
46
+ try:
47
+ with urllib.request.urlopen(req, timeout=self.timeout) as r:
48
+ return json.loads(r.read())
49
+ except urllib.error.HTTPError as e:
50
+ if e.code == 429:
51
+ raise RuntimeError("LiquidVision rate limit reached (60/min without a key); retry in a minute") from None
52
+ raise RuntimeError(f"LiquidVision returned HTTP {e.code} for {path}") from None
53
+
54
+ # ------------------------------------------------------------ the six tools
55
+
56
+ def brief(self, symbol: str = "BTCUSDT") -> Dict[str, Any]:
57
+ b = self.get(f"/brief/{norm_symbol(symbol) or 'BTCUSDT'}")
58
+ liq = b.get("liquidations") or {}
59
+ return {
60
+ "symbol": b.get("symbol"),
61
+ "asset": b.get("asset"),
62
+ "liquidations_this_symbol_24h": liq.get("this_symbol_24h"),
63
+ "liquidations_market_wide_usd": liq.get("windows_usd"),
64
+ "funding_pct_by_exchange": (b.get("funding") or {}).get("current_pct_by_exchange"),
65
+ "open_interest_by_venue": b.get("open_interest_by_venue"),
66
+ "position_flows_usd": b.get("position_flows_usd"),
67
+ "next_risk_zones": b.get("next_risk_zones"),
68
+ "top_traders_positioning": b.get("top_traders_positioning"),
69
+ "data_age_s": b.get("age_s"),
70
+ }
71
+
72
+ def positioning_regime(self, symbol: Optional[str] = None, minutes: int = 240, limit: int = 15) -> Dict[str, Any]:
73
+ r = self.get("/oi/regime", minutes=minutes)
74
+ rows = r.get("rows") or []
75
+ sym = norm_symbol(symbol)
76
+ if sym:
77
+ rows = [x for x in rows if x.get("symbol") == sym]
78
+ else:
79
+ rows = sorted(rows, key=lambda x: abs(x.get("oi_delta_usd") or 0), reverse=True)[:limit]
80
+ return {
81
+ "window_minutes": r.get("minutes"),
82
+ "meaning": "price up + OI up = new longs; price up + OI down = short covering; "
83
+ "price down + OI up = new shorts; price down + OI down = long flush",
84
+ "market_summary": r.get("summary"),
85
+ "coins": rows,
86
+ }
87
+
88
+ def liquidation_cascades(self, symbol: Optional[str] = None, hours: int = 24, limit: int = 10) -> Dict[str, Any]:
89
+ c = self.get("/liquidations/cascades", hours=hours, limit=200)
90
+ ev = c.get("events") or []
91
+ sym = norm_symbol(symbol)
92
+ if sym:
93
+ ev = [e for e in ev if e.get("symbol") == sym]
94
+ ev = sorted(ev, key=lambda e: e.get("usd") or 0, reverse=True)[:limit]
95
+ keep = ("symbol", "side", "start", "minutes", "usd", "peak_usd", "x_normal", "impact_pct", "reversion_pct")
96
+ return {
97
+ "hours": c.get("hours"),
98
+ "events_total": c.get("events_total"),
99
+ "market_wide_minutes": len(c.get("market_wide") or []),
100
+ "largest": [{k: e.get(k) for k in keep} for e in ev],
101
+ "notes": "side = which side was liquidated; x_normal = multiples of the coin's own normal minute; "
102
+ "start is epoch ms; reversion_pct = how much of the move came back in the next hour. "
103
+ + ((c.get("detector") or {}).get("caveat") or ""),
104
+ }
105
+
106
+ def liquidation_map(self, symbol: str = "BTCUSDT", top: int = 5) -> Dict[str, Any]:
107
+ m = self.get(f"/liqmap/hl/{norm_symbol(symbol) or 'BTCUSDT'}", range="1d")
108
+ px = m.get("current_price") or 0
109
+ bins, lo, sh = m.get("bins") or [], m.get("long") or [], m.get("short") or []
110
+ below = sorted(((b, v) for b, v in zip(bins, lo) if b < px and v > 0), key=lambda t: -t[1])[:top]
111
+ above = sorted(((b, v) for b, v in zip(bins, sh) if b > px and v > 0), key=lambda t: -t[1])[:top]
112
+ fmt = lambda t: {"price": round(t[0], 6), "usd": round(t[1]), "dist_pct": round((t[0] / px - 1) * 100, 2) if px else None}
113
+ return {
114
+ "symbol": m.get("symbol"),
115
+ "source": "measured Hyperliquid positions, binned by the liquidation price the exchange reports (not a model)",
116
+ "current_price": px,
117
+ "long_liquidations_below": [fmt(t) for t in sorted(below, key=lambda t: -t[0])],
118
+ "short_liquidations_above": [fmt(t) for t in sorted(above, key=lambda t: t[0])],
119
+ "total_long_below_usd": m.get("total_long_below"),
120
+ "total_short_above_usd": m.get("total_short_above"),
121
+ "coverage": m.get("coverage"),
122
+ "positions": m.get("positions"),
123
+ }
124
+
125
+ def funding_dispersion(self, symbol: Optional[str] = None, limit: int = 10) -> Dict[str, Any]:
126
+ sym = norm_symbol(symbol)
127
+ d = self.get("/funding/dispersion", limit=200 if sym else None)
128
+ rows = d.get("rows") or []
129
+ if sym:
130
+ rows = [r for r in rows if r.get("symbol") == sym]
131
+ out = []
132
+ for r in rows[:limit]:
133
+ x = {k: r.get(k) for k in ("symbol", "venues", "spread_apr", "long_venue", "long_apr",
134
+ "short_venue", "short_apr", "median_apr")}
135
+ if sym:
136
+ x["legs"] = [{k: l.get(k) for k in ("exchange", "apr", "funding_hours")} for l in r.get("legs") or []]
137
+ out.append(x)
138
+ return {
139
+ "window_minutes": d.get("window_minutes"),
140
+ "meaning": "APR in percent, each leg annualized on its own settlement cycle. long_venue is the cheapest "
141
+ "place to hold a long, short_venue the richest place to hold a short.",
142
+ "coins": out,
143
+ }
144
+
145
+ def tokenized_stocks(self, limit: int = 15) -> Dict[str, Any]:
146
+ t = self.get("/stocks/tokenized")
147
+ rows = sorted(t.get("rows") or [], key=lambda r: r.get("oi_usd") or 0, reverse=True)[:limit]
148
+ keep = ("id", "name", "class_label", "venues", "oi_usd", "volume_24h_usd", "change_24h_pct", "mark")
149
+ return {
150
+ "what": "tokenized stocks, indices, commodities and FX traded as perps on DEXs",
151
+ "underlyings": t.get("underlyings"),
152
+ "total_oi_usd": t.get("total_oi_usd"),
153
+ "total_volume_24h_usd": t.get("total_volume_24h_usd"),
154
+ "by_class": t.get("by_class"),
155
+ "largest": [{k: r.get(k) for k in keep} for r in rows],
156
+ }
157
+
158
+
159
+ TOOL_SPECS = [
160
+ ("liquidvision_derivatives_brief", "brief",
161
+ "One-coin crypto derivatives snapshot: price, open interest by venue, liquidations by side, funding per "
162
+ "exchange, nearest liquidation zones, top-trader positioning. Input: symbol like BTC or ETHUSDT."),
163
+ ("liquidvision_positioning_regime", "positioning_regime",
164
+ "Is a move new money or positions closing? Per coin: price change crossed with open-interest change "
165
+ "(new longs, short covering, new shorts, long flush). Optional symbol; without it, the biggest OI movers."),
166
+ ("liquidvision_liquidation_cascades", "liquidation_cascades",
167
+ "Liquidation cascades as events over the last hours: coin, side liquidated, size, multiple of normal, "
168
+ "price impact and what price did after. Optional symbol."),
169
+ ("liquidvision_liquidation_map", "liquidation_map",
170
+ "Where leverage would break: measured Hyperliquid positions by exchange-reported liquidation price, the "
171
+ "densest long-liquidation levels below price and short-liquidation levels above. Input: symbol."),
172
+ ("liquidvision_funding_dispersion", "funding_dispersion",
173
+ "Where the same coin pays very different funding across 13 exchanges: cheapest venue to be long, richest "
174
+ "to be short, spread in APR. Optional symbol for per-venue legs."),
175
+ ("liquidvision_tokenized_stocks", "tokenized_stocks",
176
+ "Tokenized stocks, indices, commodities and FX traded as perps on DEXs (Hyperliquid, Lighter, Ostium, "
177
+ "gTrade): open interest, volume, 24h change, largest markets."),
178
+ ]
179
+
180
+
181
+ def run(api: LiquidVisionAPI, method: str, **kwargs: Any) -> str:
182
+ """Call a tool and return JSON text; errors come back as text so the agent can carry on."""
183
+ try:
184
+ return json.dumps(getattr(api, method)(**{k: v for k, v in kwargs.items() if v is not None}),
185
+ separators=(",", ":"), default=str)
186
+ except Exception as e: # noqa: BLE001
187
+ return json.dumps({"error": str(e)})
@@ -0,0 +1,59 @@
1
+ Metadata-Version: 2.4
2
+ Name: crewai-liquidvision
3
+ Version: 0.1.0
4
+ Summary: CrewAI tools for LiquidVision.app crypto derivatives data: open interest, funding and liquidations on 13 venues, liquidation cascades, positioning regime, measured Hyperliquid liquidation maps, funding dispersion, tokenized stocks. Read-only, no key needed.
5
+ License: MIT
6
+ Project-URL: Homepage, https://liquidvision.app
7
+ Project-URL: Documentation, https://liquidvision.app/llms.txt
8
+ Project-URL: Source, https://github.com/lv-analytics/liquidvision-mcp/tree/main/integrations/crewai
9
+ Keywords: crewai,crew,tools,crypto,derivatives,liquidations,open interest,funding rate,hyperliquid,trading,ai agent
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Topic :: Office/Business :: Financial
13
+ Classifier: Intended Audience :: Developers
14
+ Requires-Python: >=3.10
15
+ Description-Content-Type: text/markdown
16
+ Requires-Dist: crewai>=0.100
17
+
18
+ # crewai-liquidvision
19
+
20
+ Crypto derivatives tools for CrewAI agents, from [LiquidVision.app](https://liquidvision.app).
21
+ Read-only, no key needed.
22
+
23
+ ```bash
24
+ pip install crewai-liquidvision
25
+ ```
26
+
27
+ ```python
28
+ from crewai import Agent, Crew, Task
29
+ from crewai_liquidvision import liquidvision_tools
30
+
31
+ analyst = Agent(
32
+ role="Crypto derivatives analyst",
33
+ goal="Tell whether leverage is building or unwinding and where it would break",
34
+ backstory="Reads open interest, funding and liquidations across 13 exchanges.",
35
+ tools=liquidvision_tools(),
36
+ )
37
+ task = Task(description="Is the current ETH move new longs or short covering? Where are the nearest liquidation levels?",
38
+ expected_output="Three short paragraphs with numbers", agent=analyst)
39
+ print(Crew(agents=[analyst], tasks=[task]).kickoff())
40
+ ```
41
+
42
+ | Tool class | Answers |
43
+ |---|---|
44
+ | `DerivativesBriefTool` | One coin: price, open interest by venue, liquidations by side, funding per exchange, nearest liquidation zones |
45
+ | `PositioningRegimeTool` | New longs, short covering, new shorts or long flush: price change crossed with OI change |
46
+ | `LiquidationCascadesTool` | Liquidation cascades as events: size, multiple of the coin's normal minute, price impact, reversion |
47
+ | `LiquidationMapTool` | Measured Hyperliquid liquidation levels below and above price (exchange-reported, not modeled) |
48
+ | `FundingDispersionTool` | Cheapest venue to be long, richest to be short, across 13 exchanges |
49
+ | `TokenizedStocksTool` | Tokenized stocks, indices, commodities and FX perps on DEXs |
50
+
51
+ Each tool returns compact JSON. Errors come back as `{"error": ...}` so the crew keeps going.
52
+
53
+ **Limits.** 60 requests a minute per IP without a key. Set `LIQUIDVISION_API_KEY` (or
54
+ `liquidvision_tools(api_key=...)`) with a Pro/Bot key for 600/1,200 a minute.
55
+
56
+ **More.** Raw rows, history and Parquet: the [`liquidvision`](https://pypi.org/project/liquidvision/) client.
57
+ MCP: `https://liquidvision.app/mcp/lite`. Docs: https://liquidvision.app/llms.txt
58
+
59
+ Data, not financial advice.
@@ -0,0 +1,9 @@
1
+ README.md
2
+ pyproject.toml
3
+ crewai_liquidvision/__init__.py
4
+ crewai_liquidvision/_api.py
5
+ crewai_liquidvision.egg-info/PKG-INFO
6
+ crewai_liquidvision.egg-info/SOURCES.txt
7
+ crewai_liquidvision.egg-info/dependency_links.txt
8
+ crewai_liquidvision.egg-info/requires.txt
9
+ crewai_liquidvision.egg-info/top_level.txt
@@ -0,0 +1 @@
1
+ crewai_liquidvision
@@ -0,0 +1,27 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "crewai-liquidvision"
7
+ version = "0.1.0"
8
+ description = "CrewAI tools for LiquidVision.app crypto derivatives data: open interest, funding and liquidations on 13 venues, liquidation cascades, positioning regime, measured Hyperliquid liquidation maps, funding dispersion, tokenized stocks. Read-only, no key needed."
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ license = { text = "MIT" }
12
+ dependencies = ["crewai>=0.100"]
13
+ keywords = ["crewai", "crew", "tools", "crypto", "derivatives", "liquidations", "open interest", "funding rate", "hyperliquid", "trading", "ai agent"]
14
+ classifiers = [
15
+ "Programming Language :: Python :: 3",
16
+ "License :: OSI Approved :: MIT License",
17
+ "Topic :: Office/Business :: Financial",
18
+ "Intended Audience :: Developers",
19
+ ]
20
+
21
+ [project.urls]
22
+ Homepage = "https://liquidvision.app"
23
+ Documentation = "https://liquidvision.app/llms.txt"
24
+ Source = "https://github.com/lv-analytics/liquidvision-mcp/tree/main/integrations/crewai"
25
+
26
+ [tool.setuptools]
27
+ packages = ["crewai_liquidvision"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+