Metadata-Version: 2.4
Name: strands-pack
Version: 0.1.0
Summary: Custom tool library for Strands Agents
Project-URL: Homepage, https://github.com/labeveryday/strands-pack
Project-URL: Repository, https://github.com/labeveryday/strands-pack
Project-URL: Documentation, https://github.com/labeveryday/strands-pack#readme
Author-email: Du'An Lightfoot <29664932+labeveryday@users.noreply.github.com>
License: MIT
License-File: LICENSE
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
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 :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.10
Requires-Dist: python-dotenv>=1.0.0
Requires-Dist: requests>=2.28.0
Requires-Dist: strands-agents>=0.1.0
Provides-Extra: all
Requires-Dist: boto3>=1.26.0; extra == 'all'
Requires-Dist: chromadb>=0.4.0; extra == 'all'
Requires-Dist: google-api-python-client>=2.0.0; extra == 'all'
Requires-Dist: google-auth-oauthlib>=1.0.0; extra == 'all'
Requires-Dist: google-auth>=2.0.0; extra == 'all'
Requires-Dist: google-genai>=1.0.0; extra == 'all'
Requires-Dist: notion-client>=2.0.0; extra == 'all'
Requires-Dist: openai>=1.0.0; extra == 'all'
Requires-Dist: openpyxl>=3.1.0; extra == 'all'
Requires-Dist: phue>=1.1; extra == 'all'
Requires-Dist: pillow>=10.0.0; extra == 'all'
Requires-Dist: playwright>=1.42.0; extra == 'all'
Requires-Dist: pydub>=0.25.0; extra == 'all'
Requires-Dist: pymupdf4llm>=0.0.10; extra == 'all'
Requires-Dist: pymupdf>=1.23.0; extra == 'all'
Requires-Dist: python-dotenv>=1.0.0; extra == 'all'
Requires-Dist: pyzbar>=0.1.9; extra == 'all'
Requires-Dist: qrcode>=7.4.0; extra == 'all'
Requires-Dist: rank-bm25>=0.2.2; extra == 'all'
Requires-Dist: requests>=2.28.0; extra == 'all'
Requires-Dist: sentence-transformers>=2.2.0; extra == 'all'
Requires-Dist: youtube-transcript-api>=0.6.2; extra == 'all'
Provides-Extra: audio
Requires-Dist: pydub>=0.25.0; extra == 'audio'
Provides-Extra: aws
Requires-Dist: boto3>=1.26.0; extra == 'aws'
Provides-Extra: calendar
Requires-Dist: google-api-python-client>=2.0.0; extra == 'calendar'
Requires-Dist: google-auth-oauthlib>=1.0.0; extra == 'calendar'
Requires-Dist: google-auth>=2.0.0; extra == 'calendar'
Provides-Extra: calendly
Requires-Dist: requests>=2.28.0; extra == 'calendly'
Provides-Extra: carbon
Requires-Dist: playwright>=1.42.0; extra == 'carbon'
Provides-Extra: chromadb
Requires-Dist: chromadb>=0.4.0; extra == 'chromadb'
Provides-Extra: dev
Requires-Dist: bandit>=1.7.0; extra == 'dev'
Requires-Dist: google-auth-oauthlib>=1.0.0; extra == 'dev'
Requires-Dist: google-auth>=2.0.0; extra == 'dev'
Requires-Dist: mypy>=1.0.0; extra == 'dev'
Requires-Dist: openai>=1.0.0; extra == 'dev'
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
Requires-Dist: pytest>=8.0.0; extra == 'dev'
Requires-Dist: python-dotenv>=1.0.0; extra == 'dev'
Requires-Dist: requests>=2.28.0; extra == 'dev'
Requires-Dist: ruff>=0.1.0; extra == 'dev'
Provides-Extra: discord
Requires-Dist: requests>=2.28.0; extra == 'discord'
Provides-Extra: docs
Requires-Dist: google-api-python-client>=2.0.0; extra == 'docs'
Requires-Dist: google-auth-oauthlib>=1.0.0; extra == 'docs'
Requires-Dist: google-auth>=2.0.0; extra == 'docs'
Provides-Extra: dotenv
Requires-Dist: python-dotenv>=1.0.0; extra == 'dotenv'
Provides-Extra: drive
Requires-Dist: google-api-python-client>=2.0.0; extra == 'drive'
Requires-Dist: google-auth-oauthlib>=1.0.0; extra == 'drive'
Requires-Dist: google-auth>=2.0.0; extra == 'drive'
Provides-Extra: excel
Requires-Dist: openpyxl>=3.1.0; extra == 'excel'
Provides-Extra: forms
Requires-Dist: google-api-python-client>=2.0.0; extra == 'forms'
Requires-Dist: google-auth-oauthlib>=1.0.0; extra == 'forms'
Requires-Dist: google-auth>=2.0.0; extra == 'forms'
Provides-Extra: gemini
Requires-Dist: google-genai>=1.0.0; extra == 'gemini'
Provides-Extra: github
Requires-Dist: requests>=2.28.0; extra == 'github'
Provides-Extra: gmail
Requires-Dist: google-api-python-client>=2.0.0; extra == 'gmail'
Requires-Dist: google-auth-oauthlib>=1.0.0; extra == 'gmail'
Requires-Dist: google-auth>=2.0.0; extra == 'gmail'
Provides-Extra: google-auth
Requires-Dist: google-auth-oauthlib>=1.0.0; extra == 'google-auth'
Requires-Dist: google-auth>=2.0.0; extra == 'google-auth'
Provides-Extra: hue
Requires-Dist: phue>=1.1; extra == 'hue'
Provides-Extra: image
Requires-Dist: pillow>=10.0.0; extra == 'image'
Provides-Extra: keyword-search
Requires-Dist: rank-bm25>=0.2.2; extra == 'keyword-search'
Provides-Extra: linkedin
Requires-Dist: requests>=2.28.0; extra == 'linkedin'
Provides-Extra: local-embeddings
Requires-Dist: sentence-transformers>=2.2.0; extra == 'local-embeddings'
Provides-Extra: notion
Requires-Dist: notion-client>=2.0.0; extra == 'notion'
Provides-Extra: openai
Requires-Dist: openai>=1.0.0; extra == 'openai'
Provides-Extra: openai-embeddings
Requires-Dist: openai>=1.0.0; extra == 'openai-embeddings'
Provides-Extra: pdf
Requires-Dist: pymupdf>=1.23.0; extra == 'pdf'
Provides-Extra: pdf-to-markdown
Requires-Dist: pymupdf4llm>=0.0.10; extra == 'pdf-to-markdown'
Provides-Extra: playwright
Requires-Dist: playwright>=1.42.0; extra == 'playwright'
Provides-Extra: qrcode
Requires-Dist: pillow>=10.0.0; extra == 'qrcode'
Requires-Dist: pyzbar>=0.1.9; extra == 'qrcode'
Requires-Dist: qrcode>=7.4.0; extra == 'qrcode'
Provides-Extra: sheets
Requires-Dist: google-api-python-client>=2.0.0; extra == 'sheets'
Requires-Dist: google-auth-oauthlib>=1.0.0; extra == 'sheets'
Requires-Dist: google-auth>=2.0.0; extra == 'sheets'
Provides-Extra: tasks
Requires-Dist: google-api-python-client>=2.0.0; extra == 'tasks'
Requires-Dist: google-auth-oauthlib>=1.0.0; extra == 'tasks'
Requires-Dist: google-auth>=2.0.0; extra == 'tasks'
Provides-Extra: twilio
Requires-Dist: requests>=2.28.0; extra == 'twilio'
Provides-Extra: x
Requires-Dist: requests>=2.28.0; extra == 'x'
Provides-Extra: youtube
Requires-Dist: google-api-python-client>=2.0.0; extra == 'youtube'
Requires-Dist: google-auth-oauthlib>=1.0.0; extra == 'youtube'
Requires-Dist: google-auth>=2.0.0; extra == 'youtube'
Provides-Extra: youtube-transcript
Requires-Dist: youtube-transcript-api>=0.6.2; extra == 'youtube-transcript'
Description-Content-Type: text/markdown

# strands-pack

[![PyPI version](https://badge.fury.io/py/strands-pack.svg)](https://badge.fury.io/py/strands-pack)
[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Tests](https://img.shields.io/badge/tests-856%20passed-brightgreen.svg)](https://github.com/labeveryday/strands-pack)

**53 ready-to-use tools for [Strands Agents](https://github.com/strands-agents/sdk-python)**

AI media generation, AWS services, Google Workspace, social platforms, smart home, and more.

---

## Installation

```bash
pip install strands-pack                    # lightweight core
pip install strands-pack[aws]               # add AWS tools (boto3)
pip install strands-pack[gmail,youtube]     # add specific tools
pip install strands-pack[all]               # install everything
```

Install only the extras you need. Each tool's dependencies are listed in the optional groups below.

---

## Quick Start

```python
from strands import Agent
from strands_pack import gemini_image, gmail, discord, sqlite

agent = Agent(tools=[gemini_image, gmail, discord, sqlite])

agent("Generate an image of a mountain sunset")
agent("Send an email to team@company.com about the project update")
agent("Post 'Hello World!' to the announcements channel")
agent("Create a tasks table and add 'Review PR' as a new task")
```

---

## Tools

### AI & Media

| Tool | Description |
|------|-------------|
| `gemini_image` | Image generation/editing (Google Gemini) |
| `gemini_video` | Video generation (Google Veo) |
| `gemini_music` | Music generation (Google Lyria) |
| `openai_image` | Image generation/editing/analysis (OpenAI) |
| `openai_video` | Video generation (OpenAI Sora) |
| `carbon` | Code screenshots |
| `ffmpeg` | Video/audio processing |

### AWS

| Tool | Description |
|------|-------------|
| `s3` | Bucket and object operations |
| `dynamodb` | NoSQL database operations |
| `lambda_tool` | Function management and invocation |
| `sqs` | Message queue operations |
| `sns` | Pub/sub notifications |
| `eventbridge_scheduler` | Scheduled tasks |
| `apigateway_http_api` | HTTP APIs with Lambda |
| `apigateway_rest_api` | REST APIs with API keys |
| `secrets_manager` | Secrets access (safe-by-default) |
| `list_managed_resources` | Inventory of strands-pack managed resources |

### Google Workspace

| Tool | Description |
|------|-------------|
| `gmail` | Send/read emails, attachments |
| `google_calendar` | Events and scheduling |
| `google_drive` | File management |
| `google_sheets` | Spreadsheet operations |
| `google_docs` | Document editing |
| `google_tasks` | Task lists |
| `google_forms` | Forms and responses |

### YouTube

| Tool | Description |
|------|-------------|
| `youtube_read` | Search, metadata, playlists |
| `youtube_write` | Update videos, manage playlists |
| `youtube_analytics` | Channel statistics |
| `youtube_transcript` | Get video transcripts |

- **Auth model**
  - **`youtube_read`**: API key only (`YOUTUBE_API_KEY`)
  - **`youtube_write` / `youtube_analytics`**: OAuth required
  - **`youtube_transcript`**: no auth (public videos)

### Social & Communication

| Tool | Description |
|------|-------------|
| `discord` | Messages, channels, threads (13 actions) |
| `github` | Repos, issues, PRs (21 actions) |
| `linkedin` | Posts and profile |
| `x` | Twitter/X (read-only) |
| `twilio_tool` | SMS, voice, WhatsApp |

### Productivity

| Tool | Description |
|------|-------------|
| `notion` | Pages and databases |
| `calendly` | Scheduling |
| `excel` | Excel file manipulation |
| `pdf` | PDF operations |
| `pdf_to_markdown` | PDF to markdown conversion (LLM-ready) |
| `image` | Image processing |
| `audio` | Audio processing |
| `qrcode_tool` | QR code generation/reading |

### Data & Storage

| Tool | Description |
|------|-------------|
| `sqlite` | Local SQL database |
| `chromadb_tool` | Vector database |
| `local_queue` | SQLite-backed queue (SQS-like) |
| `local_scheduler` | SQLite-backed scheduler |
| `local_embeddings` | Local embeddings (SentenceTransformers) |
| `openai_embeddings` | OpenAI embeddings API |
| `keyword_search` | BM25 keyword search for hybrid retrieval |

### Developer & Utilities

| Tool | Description |
|------|-------------|
| `playwright_browser` | Browser automation |
| `grab_code` | Read source code with line numbers |
| `skills` | Reusable multi-tool workflows |
| `notify` | Local sound notifications |
| `hue` | Philips Hue smart lighting (23 actions) |

---

## Environment Variables

Set the variables for the tools you use:

```bash
# AI Services
GOOGLE_API_KEY=           # Gemini tools
OPENAI_API_KEY=           # OpenAI tools

# AWS
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=

# Google Workspace (OAuth token path)
GOOGLE_AUTHORIZED_USER_FILE=secrets/token.json

# YouTube (read-only public data via API key)
YOUTUBE_API_KEY=
# Optional defaults (so you can omit IDs in prompts)
YOUTUBE_CHANNEL_ID=
YOUTUBE_UPLOADS_PLAYLIST_ID=

# Social
DISCORD_BOT_TOKEN=
GITHUB_TOKEN=
NOTION_TOKEN=

# See env.example for all options
```

---

## Google Workspace Authentication

Google tools use OAuth, not API keys. Generate a token:

```bash
# 1. Create OAuth Desktop app in Google Cloud Console
# 2. Download client_secret.json
# 3. Run:
python examples/google_oauth_token.py \
  --client-secrets client_secret.json \
  --preset gmail \
  --out secrets/token.json
```

Or use the `google_auth` tool interactively:

```python
from strands_pack import google_auth

result = google_auth(action="setup", preset="gmail", token_output_path="secrets/token.json")
print(result["auth_url"])  # Open this URL, approve access
```

---

## Examples

```python
# Generate an image
from strands_pack import gemini_image
result = gemini_image(action="generate", prompt="A cat in space", output_filename="cat.png")

# Send a Discord message
from strands_pack import discord
discord(action="send_message", channel_id="123456", content="Hello!")

# Query a database
from strands_pack import sqlite
sqlite(action="query", db_path="app.db", sql="SELECT * FROM users")

# Control smart lights
from strands_pack import hue
hue(action="set_light", light_id=1, on=True, brightness=200, hue=10000)
```

Check each tool's docstring for all available actions:

```python
from strands_pack import discord
help(discord)
```

---

## Development

```bash
git clone https://github.com/labeveryday/strands-pack.git
cd strands-pack
pip install -e ".[dev]"
pytest
```

---

## License

MIT License

---

Created by **Du'An Lightfoot** ([@labeveryday](https://github.com/labeveryday))
