semvec/pypi-packages huggingface dataset:
wait-ci 0.1.1
CLI tool for waiting on CI pipeline completion
License: MIT
Requires Python: >=3.10

# wait-ci

CLI tool for waiting on CI pipeline completion.

## Installation

```bash
# Option 1: using `pipx`
pipx install wait-ci

# Option 2: using plain `pip`
python -m pip install --upgrade pip
python -m pip install wait-ci

# Option 3: using `uv`
uv pip install wait-ci
```

## Usage

```bash
wait-ci --help
```


## Contributing

See [.github/CONTRIBUTING.md](.github/CONTRIBUTING.md) for development setup and contribution guidelines.

## License

MIT
envsafe 0.1.1
Type-safe environment variables with automatic .env loading
License: MIT
Requires Python: <4.0,>=3.11

# Envsafe
Python package for type-safe environment variables — no boilerplate, no surprises.
A tiny Python package for type-safe environment variables with automatic `.env` loading.

## Install
```
pip install envsafe
```

## Usage
```python
from envsafe import env

API_KEY = env.str("API_KEY")
DEBUG   = env.bool("DEBUG", default=False)
PORT    = env.int("PORT", default=8000)
ALLOWED = env.list("ALLOWED_HOSTS")
CONFIG  = env.json("CONFIG")
```

## Why envsafe?
- No os.getenv boilerplate
- .env auto-loaded
- Clean errors
- Zero configuration
metorial-google 1.0.5
Google (Gemini) provider for Metorial
License: MIT
Requires Python: >=3.10
Keywords: ai, gemini, google, llm, metorial

# metorial-google

Google (Gemini) provider integration for Metorial.

## Installation

```bash
pip install metorial google-generativeai
```

## Quick Start

```python
import asyncio
from metorial import Metorial, MetorialGoogle
import google.generativeai as genai

metorial = Metorial(api_key="your-metorial-api-key")
genai.configure(api_key="your-google-api-key")

async def main():
    async def session_handler(session):
        model = genai.GenerativeModel(
            model_name="gemini-2.5-flash",
            tools=session["tools"]
        )

        response = await model.generate_content_async("What's the latest news?")

        # Handle function calls if present
        # ... tool call handling logic

        await session["closeSession"]()

    await metorial.with_provider_session(
        MetorialGoogle,
        {"serverDeployments": [{"serverDeploymentId": "your-server-deployment-id"}]},
        session_handler
    )

asyncio.run(main())
```

## Streaming

```python
import asyncio
from metorial import Metorial, MetorialGoogle
import google.generativeai as genai

metorial = Metorial(api_key="your-metorial-api-key")
genai.configure(api_key="your-google-api-key")

async def main():
    async def session_handler(session):
        model = genai.GenerativeModel(
            model_name="gemini-2.5-flash",
            tools=session["tools"]
        )

        response = await model.generate_content_async(
            "What's the latest news?",
            stream=True
        )

        async for chunk in response:
            print(chunk.text, end="", flush=True)

        await session["closeSession"]()

    await metorial.with_provider_session(
        MetorialGoogle,
        {
            "serverDeployments": [{"serverDeploymentId": "your-server-deployment-id"}],
            "streaming": True,  # Required for streaming with tool calls
        },
        session_handler
    )

asyncio.run(main())
```

## Supported Models

- `gemini-2.5-pro`: Most capable Gemini model
- `gemini-2.5-flash`: Fast Gemini model
- `gemini-pro`: Gemini Pro

## Session Object

```python
async def session_handler(session):
    tools = session["tools"]           # Tool definitions in Gemini format
    call_tools = session["callTools"]  # Execute tools and get responses
    close_session = session["closeSession"]  # Close the session when done
```

## Error Handling

```python
from metorial import MetorialAPIError

try:
    await metorial.with_provider_session(...)
except MetorialAPIError as e:
    print(f"API Error: {e.message} (Status: {e.status})")
except Exception as e:
    print(f"Unexpected error: {e}")
```

## License

MIT License - see [LICENSE](../../LICENSE) file for details.