Metadata-Version: 2.5
Name: fundis
Version: 1.2.0
Summary: Python client for Fundis intelligence data - events, signals, and patterns from SentiChain.
Project-URL: Homepage, https://fundis.ai
Project-URL: Repository, https://github.com/Yototec/fundis
Project-URL: Bug Tracker, https://github.com/Yototec/fundis/issues
Author-email: Edward Chen <rchen@yototec.com>
License: MIT
License-File: LICENSE
Keywords: crypto,events,fundis,intelligence,patterns,sentichain,sentiment,signals
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.10
Requires-Dist: requests<3.0.0,>=2.32.0
Description-Content-Type: text/markdown

# Fundis

> **Deprecated.** `fundis` is now [`sentimove`](https://pypi.org/project/sentimove/): `pip install sentimove` and use
> `SentiMoveClient` (a drop-in replacement; `FundisClient` is kept as an alias). Version 1.2.0 only changes the default
> API URL to `https://api.sentimove.com` and warns on use; `https://api.fundis.ai` keeps working.

Python client for Fundis intelligence data: events, signals, and patterns from [SentiChain](https://sentichain.com).

Fundis is the intelligence engine behind [SentiMove](https://sentimove.com). This package provides programmatic access to the same structured output that now powers both the SentiMove live map view and its terminal mode.

## Installation

```bash
pip install fundis
```

## Quick Start

```python
from fundis import FundisClient

client = FundisClient()

# Get classified events for an asset
events = client.get_events("BTC")
for event in events:
    print(f"[{event.type}] {event.sentiment}: {event.summary}")

# Get a directional signal with rationale
signal = client.get_signal("BTC")
if signal:
    print(f"Direction: {signal.direction}, Confidence: {signal.confidence}")
    print(f"Rationale: {signal.rationale}")
    for cat, summary in signal.categories.items():
        if summary:
            print(f"  {cat}: {summary}")

# List active tickers (fetched from the live API)
tickers = client.list_tickers()
print(tickers)

# Request a new ticker (requires API key)
client_with_key = FundisClient(api_key="sc_...")
client_with_key.request_ticker("ADA")
```

## API Reference

### `FundisClient(api_key="", base_url="https://api.sentimove.com", timeout=30.0)`

Create a client instance. Intelligence data is publicly available. An API key is only needed for ticker requests and billing-related operations on SentiChain.

### `client.get_events(ticker) -> list[Event]`

Fetch the latest classified events for a ticker. Each event contains:

| Field | Type | Description |
|-------|------|-------------|
| `timestamp` | `str` | ISO 8601 timestamp |
| `type` | `str` | Event category: `macro`, `industry`, `price`, or `asset` |
| `sentiment` | `str` | `bullish`, `bearish`, or `neutral` |
| `summary` | `str` | One-sentence event description |

### `client.get_signal(ticker) -> Signal | None`

Fetch the latest directional signal for a ticker. Returns None if no signal data exists. Otherwise returns:

| Field | Type | Description |
|-------|------|-------------|
| `direction` | `str` | `LONG`, `SHORT`, or `FLAT` |
| `confidence` | `float` | 0.0 to 1.0 |
| `rationale` | `str` | 1-2 sentence explanation of the call |
| `categories` | `dict` | One-sentence summaries for `macro`, `industry`, `price`, `asset` |
| `patterns` | `list[Pattern]` | Detected event patterns with keywords and descriptions |

The SDK preserves the backend signal enum values (`LONG`, `SHORT`, `FLAT`). The SentiMove frontend maps those values to the softer UI wording `Bullish`, `Bearish`, and `Neutral`.

### `client.list_tickers() -> list[str]`

Return the list of active ticker symbols from the live API.

### `client.request_ticker(ticker) -> bool`

Request a new ticker to be added to the pipeline. Requires an API key. Returns True if the request was submitted (pending admin approval), False if the ticker already exists.

This endpoint is still available at the SDK/API layer even though the current SentiMove web UI no longer exposes a public request-ticker form.

## Requirements

- Python 3.10+

## Deployment

`fundis` is distributed as a client package rather than a long-running EC2 service.

| Item | Value |
|------|-------|
| Distribution | PyPI package (`fundis`) |
| Source Repo | `https://github.com/Yototec/fundis.git` |
| Primary Runtime Target | `https://api.fundis.ai` |
| Registration / billing dependency | `https://api.sentichain.com` |
| Server deploy required | No |

Release verification for this repo is package-oriented:

1. Install the package in a clean Python environment
2. Call `get_events()`, `get_signal()`, and `list_tickers()` against the live API
3. Publish a new PyPI release only after those calls succeed

## SentiMove Integration Notes

SentiMove now combines two runtime data surfaces:

- live asset-header USD prices come client-side from Hyperliquid
- structured market intelligence still comes from Fundis via `api.fundis.ai`
- both the SentiMove 3D map and terminal mode consume the same Fundis intelligence surface

This SDK only exposes the Fundis intelligence surface. It is not the source of the public live price header shown on `sentimove.com`.

## Links

- [Fundis.ai](https://fundis.ai) - Intelligence engine landing page
- [SentiMove](https://sentimove.com) - 3D consumer product powered by Fundis
- [SentiChain](https://sentichain.com) - Blockchain platform and API keys
- [GitHub](https://github.com/Yototec/fundis) - Source code
- [PyPI](https://pypi.org/project/fundis/) - Package registry

## License

MIT License. See [LICENSE](LICENSE) for details.
