Metadata-Version: 2.5
Name: sentimove
Version: 1.0.0
Summary: Python client for SentiMove intelligence data - events, signals, and patterns from SentiChain.
Project-URL: Homepage, https://sentimove.com
Project-URL: Repository, https://github.com/Yototec/sentimove-sdk
Project-URL: Bug Tracker, https://github.com/Yototec/sentimove-sdk/issues
Author-email: Edward Chen <rchen@yototec.com>
License: MIT
License-File: LICENSE
Keywords: crypto,events,intelligence,patterns,sentichain,sentiment,sentimove,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

# SentiMove

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

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

This package was previously published as [`fundis`](https://pypi.org/project/fundis/). `FundisClient` and `FundisError` remain available as aliases, so switching is a one-line import change.

## Installation

```bash
pip install sentimove
```

## Quick Start

```python
from sentimove import SentiMoveClient

client = SentiMoveClient()

# 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 = SentiMoveClient(api_key="your-sentichain-api-key")
client_with_key.request_ticker("ADA")
```

Migrating from `fundis`: replace `from fundis import FundisClient` with `from sentimove import FundisClient` (or use `SentiMoveClient`). Methods, arguments and return types are unchanged.

## API Reference

### `SentiMoveClient(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 does not expose a public request-ticker form.

## Requirements

- Python 3.10+

## Release

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

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

Release verification 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

The legacy `fundis` package is maintained on the `fundis-1.x` branch.

## SentiMove Integration Notes

SentiMove combines two runtime data surfaces:

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

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

## Links

- [SentiMove](https://sentimove.com) - 3D consumer product
- [SentiChain](https://sentichain.com) - Blockchain platform and API keys
- [GitHub](https://github.com/Yototec/sentimove-sdk) - Source code
- [PyPI](https://pypi.org/project/sentimove/) - Package registry

## License

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