Metadata-Version: 2.4
Name: sunset-core
Version: 0.1.0
Summary: 🌅 Reusable async services for AI applications — auth, LLM, RAG, storage, pub/sub, and more.
Project-URL: Homepage, https://github.com/RubenBSB/sunset-core
Project-URL: Repository, https://github.com/RubenBSB/sunset-core
Project-URL: Issues, https://github.com/RubenBSB/sunset-core/issues
Author-email: Ruben Bousbib <rbousbib@gmail.com>
License-Expression: Apache-2.0
License-File: LICENSE
Keywords: ai,async,auth,embeddings,fastapi,llm,rag,services
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Operating System :: MacOS
Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
Requires-Python: >=3.11
Requires-Dist: asyncpg>=0.29.0
Requires-Dist: docling-core[chunking]>=2.0.0
Requires-Dist: fastapi>=0.109.0
Requires-Dist: google-cloud-secret-manager>=2.18.0
Requires-Dist: httpx>=0.26.0
Requires-Dist: pgvector>=0.3.0
Provides-Extra: all
Requires-Dist: aioimaplib>=1.0.0; extra == 'all'
Requires-Dist: argon2-cffi>=23.1.0; extra == 'all'
Requires-Dist: authlib>=1.3.0; extra == 'all'
Requires-Dist: beautifulsoup4>=4.12.0; extra == 'all'
Requires-Dist: deepgram-sdk>=6.0.0; extra == 'all'
Requires-Dist: docling>=2.70.0; extra == 'all'
Requires-Dist: firecrawl-py>=2.0.0; extra == 'all'
Requires-Dist: google-cloud-discoveryengine>=0.13.0; extra == 'all'
Requires-Dist: google-cloud-monitoring>=2.18.0; extra == 'all'
Requires-Dist: google-cloud-pubsub>=2.20.0; extra == 'all'
Requires-Dist: google-cloud-storage>=2.14.0; extra == 'all'
Requires-Dist: google-genai>=1.0.0; extra == 'all'
Requires-Dist: markdownify>=0.13.0; extra == 'all'
Requires-Dist: mistralai<2.0.0,>=1.0.0; extra == 'all'
Requires-Dist: openai>=1.10.0; extra == 'all'
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.25.0; extra == 'all'
Requires-Dist: opentelemetry-instrumentation-asyncpg>=0.46b0; extra == 'all'
Requires-Dist: opentelemetry-instrumentation-fastapi>=0.46b0; extra == 'all'
Requires-Dist: opentelemetry-instrumentation-httpx>=0.46b0; extra == 'all'
Requires-Dist: opentelemetry-instrumentation-redis>=0.46b0; extra == 'all'
Requires-Dist: opentelemetry-sdk>=1.25.0; extra == 'all'
Requires-Dist: playwright>=1.40.0; extra == 'all'
Requires-Dist: posthog>=3.0.0; extra == 'all'
Requires-Dist: pymupdf>=1.24.0; extra == 'all'
Requires-Dist: pyotp>=2.9.0; extra == 'all'
Requires-Dist: python-jose[cryptography]>=3.3.0; extra == 'all'
Requires-Dist: redis>=5.0.0; extra == 'all'
Requires-Dist: resend>=2.0.0; extra == 'all'
Requires-Dist: sendgrid>=6.10.0; extra == 'all'
Requires-Dist: sentencepiece>=0.2.0; extra == 'all'
Requires-Dist: youtube-transcript-api>=1.0.0; extra == 'all'
Requires-Dist: yt-dlp>=2024.0.0; extra == 'all'
Provides-Extra: analytics
Requires-Dist: posthog>=3.0.0; extra == 'analytics'
Provides-Extra: asr
Requires-Dist: deepgram-sdk>=6.0.0; extra == 'asr'
Provides-Extra: auth
Requires-Dist: argon2-cffi>=23.1.0; extra == 'auth'
Requires-Dist: authlib>=1.3.0; extra == 'auth'
Requires-Dist: pyotp>=2.9.0; extra == 'auth'
Requires-Dist: python-jose[cryptography]>=3.3.0; extra == 'auth'
Provides-Extra: crawl
Requires-Dist: beautifulsoup4>=4.12.0; extra == 'crawl'
Requires-Dist: firecrawl-py>=2.0.0; extra == 'crawl'
Requires-Dist: markdownify>=0.13.0; extra == 'crawl'
Requires-Dist: playwright>=1.40.0; extra == 'crawl'
Requires-Dist: pymupdf>=1.24.0; extra == 'crawl'
Provides-Extra: dev
Requires-Dist: httpx>=0.26.0; extra == 'dev'
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
Requires-Dist: pytest-timeout>=2.2.0; extra == 'dev'
Requires-Dist: pytest>=8.0.0; extra == 'dev'
Provides-Extra: email
Requires-Dist: aioimaplib>=1.0.0; extra == 'email'
Requires-Dist: resend>=2.0.0; extra == 'email'
Requires-Dist: sendgrid>=6.10.0; extra == 'email'
Provides-Extra: gcp
Requires-Dist: google-cloud-monitoring>=2.18.0; extra == 'gcp'
Requires-Dist: google-cloud-pubsub>=2.20.0; extra == 'gcp'
Requires-Dist: google-cloud-storage>=2.14.0; extra == 'gcp'
Provides-Extra: llm
Requires-Dist: google-cloud-discoveryengine>=0.13.0; extra == 'llm'
Requires-Dist: google-genai>=1.0.0; extra == 'llm'
Requires-Dist: mistralai<2.0.0,>=1.0.0; extra == 'llm'
Requires-Dist: openai>=1.10.0; extra == 'llm'
Requires-Dist: sentencepiece>=0.2.0; extra == 'llm'
Provides-Extra: observability
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.25.0; extra == 'observability'
Requires-Dist: opentelemetry-instrumentation-asyncpg>=0.46b0; extra == 'observability'
Requires-Dist: opentelemetry-instrumentation-fastapi>=0.46b0; extra == 'observability'
Requires-Dist: opentelemetry-instrumentation-httpx>=0.46b0; extra == 'observability'
Requires-Dist: opentelemetry-instrumentation-redis>=0.46b0; extra == 'observability'
Requires-Dist: opentelemetry-sdk>=1.25.0; extra == 'observability'
Provides-Extra: redis
Requires-Dist: redis>=5.0.0; extra == 'redis'
Provides-Extra: retrieval
Requires-Dist: docling>=2.70.0; extra == 'retrieval'
Requires-Dist: google-genai>=1.0.0; extra == 'retrieval'
Provides-Extra: youtube
Requires-Dist: youtube-transcript-api>=1.0.0; extra == 'youtube'
Requires-Dist: yt-dlp>=2024.0.0; extra == 'youtube'
Description-Content-Type: text/markdown

# 🌅 sunset-core

Reusable **async** services for AI applications — auth, LLM routing, RAG, storage, pub/sub, and more — in one pip-installable package.

Every service is async-first (`asyncpg`, `aio` methods), lazy-loaded (you only import the heavy dependency you actually use), and provider-agnostic where it makes sense (LLM routing, multi-provider email, etc.).

## Install

```bash
pip install sunset-core              # base: auth-less, light footprint
pip install "sunset-core[llm]"       # add the LLM providers
pip install "sunset-core[all]"       # everything
```

Extras map to service groups: `auth`, `llm`, `retrieval`, `gcp`, `analytics`, `email`, `crawl`, `redis`, `asr`, `youtube`, `observability`.

## Usage

Services are imported from the `sunset.services` namespace:

```python
from sunset.services import LLMService, RetrievalService, AuthService

llm = LLMService(...)
response = await llm.chat(model="gemini-2.5-flash", messages=[...])
```

### RetrievalService (RAG)

```python
from sunset.services.retrieval import RetrievalService

svc = RetrievalService(dsn=DATABASE_URL, project=GCP_PROJECT)
await svc.connect()
chunks = await svc.ingest_document("report.pdf", describe_images=True)
results = await svc.query("What is the refund policy?", top_k=5)
await svc.close()
```

## Available services

| Service                 | What it does                                                        |
| ----------------------- | ------------------------------------------------------------------ |
| `AuthService`           | JWT with refresh rotation, OAuth (Google, Apple, Microsoft)        |
| `LLMService`            | Multi-provider LLM (OpenAI / Gemini), tool use, structured output  |
| `RetrievalService`      | RAG: Docling parsing, chunking, Vertex AI embeddings, pgvector     |
| `StorageService`        | GCS upload, signed URLs, deletion                                  |
| `PubSubService`         | Google Cloud Pub/Sub messaging                                     |
| `SecretsService`        | Google Secret Manager                                              |
| `EmailSendService`      | Transactional email (Resend / SendGrid)                            |
| `WhatsappService`       | WhatsApp Cloud API messaging + webhooks                            |
| `SlackService`          | Slack OAuth v2 + Web API                                           |
| `AnalyticsService`      | PostHog event tracking                                             |
| `MonitoringService`     | Google Cloud Monitoring                                            |
| `CrawlService`          | Web crawling (Playwright / Firecrawl)                             |
| `RedisService`          | Async Redis client                                                 |
| `ASRService`            | Speech-to-text (Deepgram)                                          |
| `init_observability`    | OpenTelemetry bootstrap: traces + metrics, LLM cost/token metrics  |

…plus `InstagramService`, `YouTubeService`, `ShopifyService`, `GoogleDriveService`, `HubspotService`, `SEOService`, `DuffelService`, `BookingService`, `ChatService`, `MultimodalEmbeddingService`.

Each service ships its own integration guide at `sunset/services/<name>/README.md`.

## License

[Apache-2.0](LICENSE)
