recommendation-engine-client


Namerecommendation-engine-client JSON
Version 1.0.1 PyPI version JSON
download
home_pageNone
SummaryPython client library for the GrooveShop Recommendation Engine
upload_time2025-10-23 16:52:00
maintainerNone
docs_urlNone
authorGrooveShop Team
requires_python>=3.13
licenseMIT
keywords recommendation recommendation-engine machine-learning collaborative-filtering content-based-filtering python httpx async
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Recommendation Engine Python Client

Official Python client library for the GrooveShop Recommendation Engine API.

## Features

-  Full type hints with comprehensive type definitions
-  Modern Python 3.14+ with latest features
-  Async/await support with httpx
-  Automatic error handling with custom exceptions
-  Support for all API endpoints
-  Authentication support (API key)
-  Multi-tenancy support
-  Batch operations support
-  Context manager support for resource cleanup
-  Fully tested with pytest (85%+ coverage)
-  Type-checked with mypy
-  Linted with ruff

## Installation

```bash
pip install recommendation-engine-client
```

Or with uv (recommended):

```bash
uv add recommendation-engine-client
```

## Quick Start

```python
from recommendation_engine_client import RecommendationClient

# Initialize the client
async with RecommendationClient(
    base_url="http://localhost:8080",
    api_key="your-api-key",  # Optional
    timeout=30.0,  # Optional, default: 30.0
) as client:
    # Get recommendations for a user
    recommendations = await client.get_user_recommendations(
        "user_123",
        {"algorithm": "hybrid", "count": 10}
    )

    print(recommendations["recommendations"])
```

## Usage

### Client Initialization

```python
from recommendation_engine_client import RecommendationClient

# Basic initialization
client = RecommendationClient(base_url="https://api.example.com")

# With API key authentication
client = RecommendationClient(
    base_url="https://api.example.com",
    api_key="your-secret-api-key",
)

# With custom configuration
client = RecommendationClient(
    base_url="https://api.example.com",
    api_key="your-secret-api-key",
    timeout=60.0,
    headers={
        "X-Custom-Header": "value",
    },
)

# Using as context manager (recommended)
async with RecommendationClient(base_url="https://api.example.com") as client:
    # Use client
    pass
```

### Entity Operations

#### Create an Entity

```python
entity = await client.create_entity({
    "entity_id": "product_1",
    "entity_type": "product",
    "attributes": {
        "name": "Wireless Headphones",
        "category": "Electronics",
        "price": 99.99,
        "brand": "TechPro",
        "in_stock": True,
        "tags": ["wireless", "audio", "bluetooth"],
    },
    "tenant_id": "tenant_a",  # Optional
})
```

#### Get an Entity

```python
entity = await client.get_entity("product_1", tenant_id="tenant_a")
print(entity["attributes"])
```

#### Update an Entity

```python
updated_entity = await client.update_entity(
    "product_1",
    {
        "attributes": {
            "price": 89.99,
            "in_stock": False,
        },
        "tenant_id": "tenant_a",
    },
)
```

#### Delete an Entity

```python
await client.delete_entity("product_1", tenant_id="tenant_a")
```

#### Bulk Import Entities

```python
result = await client.bulk_import_entities({
    "entities": [
        {
            "entity_id": "product_1",
            "entity_type": "product",
            "attributes": {
                "name": "Product 1",
                "price": 29.99,
            },
        },
        {
            "entity_id": "product_2",
            "entity_type": "product",
            "attributes": {
                "name": "Product 2",
                "price": 39.99,
            },
        },
    ],
    "tenant_id": "tenant_a",
})

print(f"Imported {result['successful']}/{result['total_records']} entities")
```

### Interaction Operations

#### Create an Interaction

```python
interaction = await client.create_interaction({
    "user_id": "user_123",
    "entity_id": "product_1",
    "entity_type": "product",
    "interaction_type": "purchase",
    "metadata": {
        "source": "web",
        "device": "desktop",
    },
    "tenant_id": "tenant_a",
})
```

#### Get User Interactions

```python
interactions = await client.get_user_interactions(
    "user_123",
    limit=50,
    offset=0,
    tenant_id="tenant_a",
)

for interaction in interactions:
    print(f"{interaction['user_id']} -> {interaction['entity_id']}: {interaction['interaction_type']}")
```

#### Bulk Import Interactions

```python
result = await client.bulk_import_interactions({
    "interactions": [
        {
            "user_id": "user_1",
            "entity_id": "product_1",
            "entity_type": "product",
            "interaction_type": "view",
        },
        {
            "user_id": "user_1",
            "entity_id": "product_2",
            "entity_type": "product",
            "interaction_type": "purchase",
        },
    ],
    "tenant_id": "tenant_a",
})
```

### Recommendation Operations

#### Get User Recommendations

```python
# Hybrid recommendations (default)
recommendations = await client.get_user_recommendations(
    "user_123",
    {
        "algorithm": "hybrid",
        "count": 10,
        "tenant_id": "tenant_a",
    },
)

# Collaborative filtering
collab_recs = await client.get_user_recommendations(
    "user_123",
    {"algorithm": "collaborative", "count": 20},
)

# Content-based filtering
content_recs = await client.get_user_recommendations(
    "user_123",
    {"algorithm": "content_based", "count": 15},
)

for rec in recommendations["recommendations"]:
    print(f"{rec['entity_id']}: score={rec['score']}, reason={rec.get('reason')}")

if recommendations["cold_start"]:
    print("User has few interactions, showing trending items")
```

#### Get Similar Entities

```python
similar = await client.get_similar_entities(
    "product_1",
    {
        "algorithm": "content_based",
        "count": 10,
        "entity_type": "product",
        "tenant_id": "tenant_a",
    },
)

for item in similar["recommendations"]:
    print(f"Similar to product_1: {item['entity_id']} (score: {item['score']})")
```

#### Get Trending Entities

```python
trending = await client.get_trending_entities({
    "entity_type": "product",
    "count": 20,
    "tenant_id": "tenant_a",
})

for index, item in enumerate(trending["trending"], 1):
    print(f"#{index}: {item['entity_id']} (score: {item['score']})")
```

### Health Checks

```python
# Check if API is healthy
is_healthy = await client.is_healthy()
print(f"API healthy: {is_healthy}")

# Check if API is ready (db + redis connected)
is_ready = await client.is_ready()
print(f"API ready: {is_ready}")
```

## Error Handling

The client provides custom exceptions for better error handling:

```python
from recommendation_engine_client import (
    RecommendationClient,
    RecommendationError,
    TimeoutError,
    NetworkError,
)

async with RecommendationClient(base_url="http://localhost:8080") as client:
    try:
        entity = await client.get_entity("non_existent_id")
    except RecommendationError as error:
        print(f"API Error [{error.code}]: {error.message}")
        if error.details:
            print(f"Details: {error.details}")
    except TimeoutError as error:
        print(f"Request timeout: {error}")
    except NetworkError as error:
        print(f"Network error: {error}")
```

## Type Hints

This library is fully typed and provides comprehensive type definitions:

```python
from recommendation_engine_client import (
    Entity,
    Interaction,
    RecommendationResponse,
    ScoredEntity,
    InteractionType,
)

def process_recommendations(response: RecommendationResponse) -> None:
    """Process recommendations with full type safety."""
    for item in response["recommendations"]:
        # item is fully typed as ScoredEntity
        print(item["entity_id"], item["score"])
```

## Multi-Tenancy

The client supports multi-tenancy. You can specify a `tenant_id` in most operations:

```python
# Create entity for tenant A
await client.create_entity({
    "entity_id": "product_1",
    "entity_type": "product",
    "attributes": {"name": "Product"},
    "tenant_id": "tenant_a",
})

# Get recommendations for tenant A
recs = await client.get_user_recommendations(
    "user_123",
    {"tenant_id": "tenant_a"},
)
```

## Batch Operations

For importing large amounts of data, use the bulk import methods:

```python
# Prepare data
entities = [
    {
        "entity_id": f"product_{i}",
        "entity_type": "product",
        "attributes": {
            "name": f"Product {i}",
            "price": i * 10.0,
        },
    }
    for i in range(1000)
]

# Import in batches
batch_size = 100
for i in range(0, len(entities), batch_size):
    batch = entities[i:i + batch_size]
    result = await client.bulk_import_entities({
        "entities": batch,
        "tenant_id": "tenant_a",
    })
    print(f"Batch {i // batch_size + 1}: {result['successful']}/{result['total_records']} successful")
```

## API Reference

### RecommendationClient Methods

#### Entity Operations
- `create_entity(request: CreateEntityRequest) -> Entity`
- `get_entity(entity_id: str, tenant_id: str | None = None) -> Entity`
- `update_entity(entity_id: str, request: UpdateEntityRequest) -> Entity`
- `delete_entity(entity_id: str, tenant_id: str | None = None) -> None`
- `bulk_import_entities(request: BulkImportEntitiesRequest) -> BulkImportResponse`

#### Interaction Operations
- `create_interaction(request: CreateInteractionRequest) -> Interaction`
- `get_user_interactions(user_id: str, *, limit: int | None = None, offset: int | None = None, tenant_id: str | None = None) -> list[Interaction]`
- `bulk_import_interactions(request: BulkImportInteractionsRequest) -> BulkImportResponse`

#### Recommendation Operations
- `get_user_recommendations(user_id: str, query: UserRecommendationsQuery | None = None) -> RecommendationResponse`
- `get_similar_entities(entity_id: str, query: EntityRecommendationsQuery | None = None) -> RecommendationResponse`
- `get_trending_entities(query: TrendingEntitiesQuery | None = None) -> TrendingEntitiesResponse`

#### Health & Status
- `is_healthy() -> bool`
- `is_ready() -> bool`

## Examples

See the `examples/` directory for complete examples:

- `examples/basic_usage.py` - Basic client usage
- `examples/e_commerce.py` - E-commerce recommendation flow
- `examples/content_platform.py` - Content recommendation flow
- `examples/bulk_import.py` - Bulk data import

## Requirements

- Python >= 3.14
- httpx >= 0.28.1
- typing-extensions >= 4.12.2

## Development

### Setup

```bash
# Clone the repository
git clone https://github.com/grooveshop/recommendation-engine
cd recommendation-engine/clients/python

# Install dependencies with uv
uv sync --dev
```

### Running Tests

```bash
# Run all tests
uv run pytest

# Run with coverage
uv run pytest --cov

# Run with verbose output
uv run pytest -v
```

### Linting and Formatting

```bash
# Check code with ruff
uv run ruff check src/

# Fix issues automatically
uv run ruff check --fix src/

# Format code
uv run ruff format src/
```

### Type Checking

```bash
# Type check with mypy
uv run mypy src/
```

## Modern Stack

This client uses a modern Python stack:

- **Python 3.14**: Latest Python with modern type hints
- **httpx**: Modern async HTTP client
- **uv**: Fast Python package installer and resolver
- **ruff**: Lightning-fast linter and formatter
- **pytest**: Modern testing framework
- **mypy**: Static type checker

## License

MIT

## Support

For issues and questions:
- GitHub Issues: https://github.com/grooveshop/recommendation-engine/issues
- Documentation: https://docs.grooveshop.com/recommendation-engine

## Contributing

Contributions are welcome! Please read our contributing guidelines before submitting PRs.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "recommendation-engine-client",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.13",
    "maintainer_email": null,
    "keywords": "recommendation, recommendation-engine, machine-learning, collaborative-filtering, content-based-filtering, python, httpx, async",
    "author": "GrooveShop Team",
    "author_email": "GrooveShop Team <support@grooveshop.com>",
    "download_url": "https://files.pythonhosted.org/packages/5f/60/a597bf25dee9bcb14887e3c9b6bfbe1ac10e6e1a5b4d294444fdf8f0978b/recommendation_engine_client-1.0.1.tar.gz",
    "platform": null,
    "description": "# Recommendation Engine Python Client\n\nOfficial Python client library for the GrooveShop Recommendation Engine API.\n\n## Features\n\n- \u0005 Full type hints with comprehensive type definitions\n- \u0005 Modern Python 3.14+ with latest features\n- \u0005 Async/await support with httpx\n- \u0005 Automatic error handling with custom exceptions\n- \u0005 Support for all API endpoints\n- \u0005 Authentication support (API key)\n- \u0005 Multi-tenancy support\n- \u0005 Batch operations support\n- \u0005 Context manager support for resource cleanup\n- \u0005 Fully tested with pytest (85%+ coverage)\n- \u0005 Type-checked with mypy\n- \u0005 Linted with ruff\n\n## Installation\n\n```bash\npip install recommendation-engine-client\n```\n\nOr with uv (recommended):\n\n```bash\nuv add recommendation-engine-client\n```\n\n## Quick Start\n\n```python\nfrom recommendation_engine_client import RecommendationClient\n\n# Initialize the client\nasync with RecommendationClient(\n    base_url=\"http://localhost:8080\",\n    api_key=\"your-api-key\",  # Optional\n    timeout=30.0,  # Optional, default: 30.0\n) as client:\n    # Get recommendations for a user\n    recommendations = await client.get_user_recommendations(\n        \"user_123\",\n        {\"algorithm\": \"hybrid\", \"count\": 10}\n    )\n\n    print(recommendations[\"recommendations\"])\n```\n\n## Usage\n\n### Client Initialization\n\n```python\nfrom recommendation_engine_client import RecommendationClient\n\n# Basic initialization\nclient = RecommendationClient(base_url=\"https://api.example.com\")\n\n# With API key authentication\nclient = RecommendationClient(\n    base_url=\"https://api.example.com\",\n    api_key=\"your-secret-api-key\",\n)\n\n# With custom configuration\nclient = RecommendationClient(\n    base_url=\"https://api.example.com\",\n    api_key=\"your-secret-api-key\",\n    timeout=60.0,\n    headers={\n        \"X-Custom-Header\": \"value\",\n    },\n)\n\n# Using as context manager (recommended)\nasync with RecommendationClient(base_url=\"https://api.example.com\") as client:\n    # Use client\n    pass\n```\n\n### Entity Operations\n\n#### Create an Entity\n\n```python\nentity = await client.create_entity({\n    \"entity_id\": \"product_1\",\n    \"entity_type\": \"product\",\n    \"attributes\": {\n        \"name\": \"Wireless Headphones\",\n        \"category\": \"Electronics\",\n        \"price\": 99.99,\n        \"brand\": \"TechPro\",\n        \"in_stock\": True,\n        \"tags\": [\"wireless\", \"audio\", \"bluetooth\"],\n    },\n    \"tenant_id\": \"tenant_a\",  # Optional\n})\n```\n\n#### Get an Entity\n\n```python\nentity = await client.get_entity(\"product_1\", tenant_id=\"tenant_a\")\nprint(entity[\"attributes\"])\n```\n\n#### Update an Entity\n\n```python\nupdated_entity = await client.update_entity(\n    \"product_1\",\n    {\n        \"attributes\": {\n            \"price\": 89.99,\n            \"in_stock\": False,\n        },\n        \"tenant_id\": \"tenant_a\",\n    },\n)\n```\n\n#### Delete an Entity\n\n```python\nawait client.delete_entity(\"product_1\", tenant_id=\"tenant_a\")\n```\n\n#### Bulk Import Entities\n\n```python\nresult = await client.bulk_import_entities({\n    \"entities\": [\n        {\n            \"entity_id\": \"product_1\",\n            \"entity_type\": \"product\",\n            \"attributes\": {\n                \"name\": \"Product 1\",\n                \"price\": 29.99,\n            },\n        },\n        {\n            \"entity_id\": \"product_2\",\n            \"entity_type\": \"product\",\n            \"attributes\": {\n                \"name\": \"Product 2\",\n                \"price\": 39.99,\n            },\n        },\n    ],\n    \"tenant_id\": \"tenant_a\",\n})\n\nprint(f\"Imported {result['successful']}/{result['total_records']} entities\")\n```\n\n### Interaction Operations\n\n#### Create an Interaction\n\n```python\ninteraction = await client.create_interaction({\n    \"user_id\": \"user_123\",\n    \"entity_id\": \"product_1\",\n    \"entity_type\": \"product\",\n    \"interaction_type\": \"purchase\",\n    \"metadata\": {\n        \"source\": \"web\",\n        \"device\": \"desktop\",\n    },\n    \"tenant_id\": \"tenant_a\",\n})\n```\n\n#### Get User Interactions\n\n```python\ninteractions = await client.get_user_interactions(\n    \"user_123\",\n    limit=50,\n    offset=0,\n    tenant_id=\"tenant_a\",\n)\n\nfor interaction in interactions:\n    print(f\"{interaction['user_id']} -> {interaction['entity_id']}: {interaction['interaction_type']}\")\n```\n\n#### Bulk Import Interactions\n\n```python\nresult = await client.bulk_import_interactions({\n    \"interactions\": [\n        {\n            \"user_id\": \"user_1\",\n            \"entity_id\": \"product_1\",\n            \"entity_type\": \"product\",\n            \"interaction_type\": \"view\",\n        },\n        {\n            \"user_id\": \"user_1\",\n            \"entity_id\": \"product_2\",\n            \"entity_type\": \"product\",\n            \"interaction_type\": \"purchase\",\n        },\n    ],\n    \"tenant_id\": \"tenant_a\",\n})\n```\n\n### Recommendation Operations\n\n#### Get User Recommendations\n\n```python\n# Hybrid recommendations (default)\nrecommendations = await client.get_user_recommendations(\n    \"user_123\",\n    {\n        \"algorithm\": \"hybrid\",\n        \"count\": 10,\n        \"tenant_id\": \"tenant_a\",\n    },\n)\n\n# Collaborative filtering\ncollab_recs = await client.get_user_recommendations(\n    \"user_123\",\n    {\"algorithm\": \"collaborative\", \"count\": 20},\n)\n\n# Content-based filtering\ncontent_recs = await client.get_user_recommendations(\n    \"user_123\",\n    {\"algorithm\": \"content_based\", \"count\": 15},\n)\n\nfor rec in recommendations[\"recommendations\"]:\n    print(f\"{rec['entity_id']}: score={rec['score']}, reason={rec.get('reason')}\")\n\nif recommendations[\"cold_start\"]:\n    print(\"User has few interactions, showing trending items\")\n```\n\n#### Get Similar Entities\n\n```python\nsimilar = await client.get_similar_entities(\n    \"product_1\",\n    {\n        \"algorithm\": \"content_based\",\n        \"count\": 10,\n        \"entity_type\": \"product\",\n        \"tenant_id\": \"tenant_a\",\n    },\n)\n\nfor item in similar[\"recommendations\"]:\n    print(f\"Similar to product_1: {item['entity_id']} (score: {item['score']})\")\n```\n\n#### Get Trending Entities\n\n```python\ntrending = await client.get_trending_entities({\n    \"entity_type\": \"product\",\n    \"count\": 20,\n    \"tenant_id\": \"tenant_a\",\n})\n\nfor index, item in enumerate(trending[\"trending\"], 1):\n    print(f\"#{index}: {item['entity_id']} (score: {item['score']})\")\n```\n\n### Health Checks\n\n```python\n# Check if API is healthy\nis_healthy = await client.is_healthy()\nprint(f\"API healthy: {is_healthy}\")\n\n# Check if API is ready (db + redis connected)\nis_ready = await client.is_ready()\nprint(f\"API ready: {is_ready}\")\n```\n\n## Error Handling\n\nThe client provides custom exceptions for better error handling:\n\n```python\nfrom recommendation_engine_client import (\n    RecommendationClient,\n    RecommendationError,\n    TimeoutError,\n    NetworkError,\n)\n\nasync with RecommendationClient(base_url=\"http://localhost:8080\") as client:\n    try:\n        entity = await client.get_entity(\"non_existent_id\")\n    except RecommendationError as error:\n        print(f\"API Error [{error.code}]: {error.message}\")\n        if error.details:\n            print(f\"Details: {error.details}\")\n    except TimeoutError as error:\n        print(f\"Request timeout: {error}\")\n    except NetworkError as error:\n        print(f\"Network error: {error}\")\n```\n\n## Type Hints\n\nThis library is fully typed and provides comprehensive type definitions:\n\n```python\nfrom recommendation_engine_client import (\n    Entity,\n    Interaction,\n    RecommendationResponse,\n    ScoredEntity,\n    InteractionType,\n)\n\ndef process_recommendations(response: RecommendationResponse) -> None:\n    \"\"\"Process recommendations with full type safety.\"\"\"\n    for item in response[\"recommendations\"]:\n        # item is fully typed as ScoredEntity\n        print(item[\"entity_id\"], item[\"score\"])\n```\n\n## Multi-Tenancy\n\nThe client supports multi-tenancy. You can specify a `tenant_id` in most operations:\n\n```python\n# Create entity for tenant A\nawait client.create_entity({\n    \"entity_id\": \"product_1\",\n    \"entity_type\": \"product\",\n    \"attributes\": {\"name\": \"Product\"},\n    \"tenant_id\": \"tenant_a\",\n})\n\n# Get recommendations for tenant A\nrecs = await client.get_user_recommendations(\n    \"user_123\",\n    {\"tenant_id\": \"tenant_a\"},\n)\n```\n\n## Batch Operations\n\nFor importing large amounts of data, use the bulk import methods:\n\n```python\n# Prepare data\nentities = [\n    {\n        \"entity_id\": f\"product_{i}\",\n        \"entity_type\": \"product\",\n        \"attributes\": {\n            \"name\": f\"Product {i}\",\n            \"price\": i * 10.0,\n        },\n    }\n    for i in range(1000)\n]\n\n# Import in batches\nbatch_size = 100\nfor i in range(0, len(entities), batch_size):\n    batch = entities[i:i + batch_size]\n    result = await client.bulk_import_entities({\n        \"entities\": batch,\n        \"tenant_id\": \"tenant_a\",\n    })\n    print(f\"Batch {i // batch_size + 1}: {result['successful']}/{result['total_records']} successful\")\n```\n\n## API Reference\n\n### RecommendationClient Methods\n\n#### Entity Operations\n- `create_entity(request: CreateEntityRequest) -> Entity`\n- `get_entity(entity_id: str, tenant_id: str | None = None) -> Entity`\n- `update_entity(entity_id: str, request: UpdateEntityRequest) -> Entity`\n- `delete_entity(entity_id: str, tenant_id: str | None = None) -> None`\n- `bulk_import_entities(request: BulkImportEntitiesRequest) -> BulkImportResponse`\n\n#### Interaction Operations\n- `create_interaction(request: CreateInteractionRequest) -> Interaction`\n- `get_user_interactions(user_id: str, *, limit: int | None = None, offset: int | None = None, tenant_id: str | None = None) -> list[Interaction]`\n- `bulk_import_interactions(request: BulkImportInteractionsRequest) -> BulkImportResponse`\n\n#### Recommendation Operations\n- `get_user_recommendations(user_id: str, query: UserRecommendationsQuery | None = None) -> RecommendationResponse`\n- `get_similar_entities(entity_id: str, query: EntityRecommendationsQuery | None = None) -> RecommendationResponse`\n- `get_trending_entities(query: TrendingEntitiesQuery | None = None) -> TrendingEntitiesResponse`\n\n#### Health & Status\n- `is_healthy() -> bool`\n- `is_ready() -> bool`\n\n## Examples\n\nSee the `examples/` directory for complete examples:\n\n- `examples/basic_usage.py` - Basic client usage\n- `examples/e_commerce.py` - E-commerce recommendation flow\n- `examples/content_platform.py` - Content recommendation flow\n- `examples/bulk_import.py` - Bulk data import\n\n## Requirements\n\n- Python >= 3.14\n- httpx >= 0.28.1\n- typing-extensions >= 4.12.2\n\n## Development\n\n### Setup\n\n```bash\n# Clone the repository\ngit clone https://github.com/grooveshop/recommendation-engine\ncd recommendation-engine/clients/python\n\n# Install dependencies with uv\nuv sync --dev\n```\n\n### Running Tests\n\n```bash\n# Run all tests\nuv run pytest\n\n# Run with coverage\nuv run pytest --cov\n\n# Run with verbose output\nuv run pytest -v\n```\n\n### Linting and Formatting\n\n```bash\n# Check code with ruff\nuv run ruff check src/\n\n# Fix issues automatically\nuv run ruff check --fix src/\n\n# Format code\nuv run ruff format src/\n```\n\n### Type Checking\n\n```bash\n# Type check with mypy\nuv run mypy src/\n```\n\n## Modern Stack\n\nThis client uses a modern Python stack:\n\n- **Python 3.14**: Latest Python with modern type hints\n- **httpx**: Modern async HTTP client\n- **uv**: Fast Python package installer and resolver\n- **ruff**: Lightning-fast linter and formatter\n- **pytest**: Modern testing framework\n- **mypy**: Static type checker\n\n## License\n\nMIT\n\n## Support\n\nFor issues and questions:\n- GitHub Issues: https://github.com/grooveshop/recommendation-engine/issues\n- Documentation: https://docs.grooveshop.com/recommendation-engine\n\n## Contributing\n\nContributions are welcome! Please read our contributing guidelines before submitting PRs.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Python client library for the GrooveShop Recommendation Engine",
    "version": "1.0.1",
    "project_urls": {
        "Documentation": "https://docs.grooveshop.com/recommendation-engine",
        "Homepage": "https://github.com/grooveshop/recommendation-engine",
        "Issues": "https://github.com/grooveshop/recommendation-engine/issues",
        "Repository": "https://github.com/grooveshop/recommendation-engine"
    },
    "split_keywords": [
        "recommendation",
        " recommendation-engine",
        " machine-learning",
        " collaborative-filtering",
        " content-based-filtering",
        " python",
        " httpx",
        " async"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "85fc8a29fdc1dcb120c00b8bb2de2286b78ab5113c00ee241357182d9e630274",
                "md5": "4f2f8b94e4598890a4bba840be50454c",
                "sha256": "acc70ef5a9730b185bba8f8a858e2b1fdd12fda176197fc55e2e858370a7c0b8"
            },
            "downloads": -1,
            "filename": "recommendation_engine_client-1.0.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "4f2f8b94e4598890a4bba840be50454c",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.13",
            "size": 10055,
            "upload_time": "2025-10-23T16:51:59",
            "upload_time_iso_8601": "2025-10-23T16:51:59.689079Z",
            "url": "https://files.pythonhosted.org/packages/85/fc/8a29fdc1dcb120c00b8bb2de2286b78ab5113c00ee241357182d9e630274/recommendation_engine_client-1.0.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5f60a597bf25dee9bcb14887e3c9b6bfbe1ac10e6e1a5b4d294444fdf8f0978b",
                "md5": "e2e832572bebd55135c6ff37c9c87351",
                "sha256": "db9483a39edaf787e6aa9c233aae1f195a59f3eead47fdd3f96aa62065c8b788"
            },
            "downloads": -1,
            "filename": "recommendation_engine_client-1.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "e2e832572bebd55135c6ff37c9c87351",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.13",
            "size": 8354,
            "upload_time": "2025-10-23T16:52:00",
            "upload_time_iso_8601": "2025-10-23T16:52:00.947568Z",
            "url": "https://files.pythonhosted.org/packages/5f/60/a597bf25dee9bcb14887e3c9b6bfbe1ac10e6e1a5b4d294444fdf8f0978b/recommendation_engine_client-1.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-23 16:52:00",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "grooveshop",
    "github_project": "recommendation-engine",
    "github_not_found": true,
    "lcname": "recommendation-engine-client"
}
        
Elapsed time: 1.69954s