# 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"
}