cmdrdata


Namecmdrdata JSON
Version 0.1.0 PyPI version JSON
download
home_pageNone
SummaryUniversal AI usage tracking SDK - works with any AI provider with arbitrary metadata support
upload_time2025-08-11 09:51:26
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseMIT License Copyright (c) 2025 CmdrData AI Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords ai tracking usage billing analytics metadata openai anthropic google gemini claude gpt llm sdk wrapper universal
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # CmdrData SDK - Universal AI Usage Tracking

**One SDK. Any AI Provider. Complete Usage Tracking.**

CmdrData SDK is a universal Python library that wraps ANY AI client (OpenAI, Anthropic, Google, Cohere, etc.) to automatically track usage for billing, analytics (including custom/ad-hoc metrics), and cost management - with zero code changes required.

This is the official Python SDK for [CmdrData](https://www.cmdrdata.ai), the Google Analytics of AI Usage Tracking.

## Installation

```bash
pip install cmdrdata
```

## Quick Start

```python
from cmdrdata import track_ai
from openai import OpenAI

# Wrap any AI client
client = track_ai(
    OpenAI(api_key="..."),
    cmdrdata_api_key="cmd-..."
)

# Use exactly like the original - tracking happens automatically
response = client.chat.completions.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "Hello!"}],
    customer_id="customer-123",  # Optional: Track by customer
    metadata={"feature": "chat"}  # Optional: Custom metadata
)
```

## Features

### Universal Compatibility
Works with ANY AI provider that returns usage information:
- OpenAI (GPT-4, GPT-3.5, DALL-E, Whisper)
- Anthropic (Claude 3, Claude 2)
- Google (Gemini Pro, PaLM)
- Cohere
- HuggingFace
- Replicate
- Together AI
- Perplexity
- Any custom AI client

### Zero Code Changes
Your existing code works exactly as before:

```python
# Before
from anthropic import Anthropic
client = Anthropic(api_key="...")

# After - Just wrap it!
from cmdrdata import track_ai
client = track_ai(Anthropic(api_key="..."), cmdrdata_api_key="cmd-...")

# All your existing code continues to work unchanged
response = client.messages.create(...)  # Automatically tracked!
```

### Automatic Provider Detection
CmdrData automatically detects the provider type:

```python
from cmdrdata import CmdrData

# Auto-detects as OpenAI
openai_client = CmdrData(client=OpenAI())

# Auto-detects as Anthropic  
anthropic_client = CmdrData(client=Anthropic())

# Auto-detects as Google
gemini_client = CmdrData(client=genai.GenerativeModel("gemini-pro"))
```

### Rich Metadata Support
Track usage by any dimension:

```python
response = client.chat.completions.create(
    model="gpt-4",
    messages=[...],
    customer_id="enterprise-customer",
    metadata={
        "feature": "customer-support",
        "department": "sales",
        "experiment": "prompt-v2",
        "user_tier": "premium",
        "session_id": "abc-123"
    }
)
```

### Thread-Safe Context Management
Perfect for multi-tenant applications:

```python
from cmdrdata import customer_context, metadata_context

# Set context for all API calls in a thread
with customer_context("customer-123"):
    with metadata_context({"feature": "bulk-processing"}):
        # All API calls here automatically include this context
        response1 = client.chat.completions.create(...)
        response2 = client.embeddings.create(...)
```

## Advanced Usage

### Creating Clients
Three ways to initialize:

```python
from cmdrdata import CmdrData, track_ai

# Method 1: Wrap existing client
client = track_ai(OpenAI(api_key="..."), cmdrdata_api_key="cmd-...")

# Method 2: Let CmdrData create the client
client = CmdrData(
    client_class=OpenAI,
    client_kwargs={"api_key": "..."},
    cmdrdata_api_key="cmd-..."
)

# Method 3: Full control
client = CmdrData(
    client=OpenAI(api_key="..."),
    cmdrdata_api_key="cmd-...",
    cmdrdata_url="https://your-instance.cmdrdata.com/api/events",
    provider="openai",  # Optional: manually specify
    customer_id="default-customer",  # Default for all requests
    metadata={"environment": "production"}  # Default metadata
)
```

### Environment Variables
Configure defaults via environment:

```bash
export CMDRDATA_API_KEY="cmd-..."
export CMDRDATA_URL="https://api.cmdrdata.com/api/events"
export CMDRDATA_CUSTOMER_ID="default-customer"
```

Then simply:
```python
from cmdrdata import track_ai
client = track_ai(OpenAI())  # Uses env vars automatically
```

### Error Handling
Tracking failures never break your application:

```python
# Even if CmdrData is unreachable, your AI calls continue working
response = client.chat.completions.create(...)  # Always succeeds

# Tracking errors are logged but not raised
# Check logs for tracking issues
```

### Async Support
Full async/await support:

```python
import asyncio
from openai import AsyncOpenAI
from cmdrdata import track_ai

async def main():
    client = track_ai(AsyncOpenAI(), cmdrdata_api_key="cmd-...")
    
    response = await client.chat.completions.create(
        model="gpt-4",
        messages=[{"role": "user", "content": "Hello!"}]
    )

asyncio.run(main())
```

## What Gets Tracked

CmdrData automatically extracts and tracks:
- **Token Usage**: Input, output, and total tokens
- **Model Information**: Which model was used
- **Provider**: OpenAI, Anthropic, Google, etc.
- **Customer ID**: For billing and analytics
- **Custom Metadata**: Any dimensions you specify
- **Timing**: Request duration
- **Errors**: Failed requests with error details

## Use Cases

### Usage-Based Billing
```python
# Track usage per customer for accurate billing
response = client.chat.completions.create(
    ...,
    customer_id="customer-123"
)
```

### Feature Analytics
```python
# Understand which features consume the most tokens
response = client.chat.completions.create(
    ...,
    metadata={"feature": "document-summary", "feature_version": "2.0"}
)
```

### Department Cost Allocation
```python
# Allocate AI costs to specific departments
response = client.chat.completions.create(
    ...,
    metadata={"department": "engineering", "team": "ml-platform"}
)
```

### A/B Testing
```python
# Track token usage across experiments
response = client.chat.completions.create(
    ...,
    metadata={"experiment": "prompt-optimization", "variant": "b"}
)
```

### Multi-Tenancy
```python
# Track usage in multi-tenant applications
with customer_context(tenant_id):
    response = client.chat.completions.create(...)
```

## Supported Providers

CmdrData works with any AI provider that returns usage information. Tested with:

- **OpenAI**: GPT-4, GPT-3.5, DALL-E, Whisper, Embeddings
- **Anthropic**: Claude 3 Opus/Sonnet/Haiku, Claude 2
- **Google**: Gemini Pro, Gemini Ultra, PaLM
- **Cohere**: Command, Embed, Rerank
- **HuggingFace**: Inference API, Transformers
- **Replicate**: Any model on Replicate
- **Together AI**: Llama, Mistral, and other models
- **Perplexity**: pplx-api models
- **Custom**: Any client that returns token usage

## Migration Guide

### From Individual SDKs
If you're using cmdrdata-openai, cmdrdata-anthropic, or cmdrdata-gemini:

```python
# Old way (provider-specific SDKs)
from cmdrdata_openai import TrackedOpenAI
from cmdrdata_anthropic import TrackedAnthropic

# New way (universal SDK)
from cmdrdata import track_ai
openai_client = track_ai(OpenAI())
anthropic_client = track_ai(Anthropic())
```

### From Direct Clients
Zero changes to your application code:

```python
# Your existing code
client = OpenAI(api_key="...")
response = client.chat.completions.create(...)

# Just wrap the client - everything else stays the same
from cmdrdata import track_ai
client = track_ai(OpenAI(api_key="..."), cmdrdata_api_key="cmd-...")
response = client.chat.completions.create(...)  # Now with tracking!
```

## Configuration

### API Endpoint
Default: `https://api.cmdrdata.com/api/events`

Custom endpoint:
```python
client = track_ai(
    OpenAI(),
    cmdrdata_api_key="cmd-...",
    cmdrdata_url="https://your-instance.cmdrdata.com/api/events"
)
```

### Disable Tracking
For testing or development:
```python
client = CmdrData(
    client=OpenAI(),
    disable_tracking=True  # AI calls work, no tracking occurs
)
```

## License

MIT

## Support

- GitHub Issues: [github.com/cmdrdata-ai/cmdrdata](https://github.com/cmdrdata-ai/cmdrdata)
- Documentation: [docs.cmdrdata.ai](https://docs.cmdrdata.ai)
- Email: support@cmdrdata.ai

---

Built with ❤️ for developers who need to track AI usage without the hassle.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "cmdrdata",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": "cmdrdata <terencenathan@gmail.com>",
    "keywords": "ai, tracking, usage, billing, analytics, metadata, openai, anthropic, google, gemini, claude, gpt, llm, sdk, wrapper, universal",
    "author": null,
    "author_email": "cmdrdata <terencenathan@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/05/89/6968cf99d875c18c9715374ca6d07593917ac9787828a1b7912bed2b0b2e/cmdrdata-0.1.0.tar.gz",
    "platform": null,
    "description": "# CmdrData SDK - Universal AI Usage Tracking\r\n\r\n**One SDK. Any AI Provider. Complete Usage Tracking.**\r\n\r\nCmdrData SDK is a universal Python library that wraps ANY AI client (OpenAI, Anthropic, Google, Cohere, etc.) to automatically track usage for billing, analytics (including custom/ad-hoc metrics), and cost management - with zero code changes required.\r\n\r\nThis is the official Python SDK for [CmdrData](https://www.cmdrdata.ai), the Google Analytics of AI Usage Tracking.\r\n\r\n## Installation\r\n\r\n```bash\r\npip install cmdrdata\r\n```\r\n\r\n## Quick Start\r\n\r\n```python\r\nfrom cmdrdata import track_ai\r\nfrom openai import OpenAI\r\n\r\n# Wrap any AI client\r\nclient = track_ai(\r\n    OpenAI(api_key=\"...\"),\r\n    cmdrdata_api_key=\"cmd-...\"\r\n)\r\n\r\n# Use exactly like the original - tracking happens automatically\r\nresponse = client.chat.completions.create(\r\n    model=\"gpt-4\",\r\n    messages=[{\"role\": \"user\", \"content\": \"Hello!\"}],\r\n    customer_id=\"customer-123\",  # Optional: Track by customer\r\n    metadata={\"feature\": \"chat\"}  # Optional: Custom metadata\r\n)\r\n```\r\n\r\n## Features\r\n\r\n### Universal Compatibility\r\nWorks with ANY AI provider that returns usage information:\r\n- OpenAI (GPT-4, GPT-3.5, DALL-E, Whisper)\r\n- Anthropic (Claude 3, Claude 2)\r\n- Google (Gemini Pro, PaLM)\r\n- Cohere\r\n- HuggingFace\r\n- Replicate\r\n- Together AI\r\n- Perplexity\r\n- Any custom AI client\r\n\r\n### Zero Code Changes\r\nYour existing code works exactly as before:\r\n\r\n```python\r\n# Before\r\nfrom anthropic import Anthropic\r\nclient = Anthropic(api_key=\"...\")\r\n\r\n# After - Just wrap it!\r\nfrom cmdrdata import track_ai\r\nclient = track_ai(Anthropic(api_key=\"...\"), cmdrdata_api_key=\"cmd-...\")\r\n\r\n# All your existing code continues to work unchanged\r\nresponse = client.messages.create(...)  # Automatically tracked!\r\n```\r\n\r\n### Automatic Provider Detection\r\nCmdrData automatically detects the provider type:\r\n\r\n```python\r\nfrom cmdrdata import CmdrData\r\n\r\n# Auto-detects as OpenAI\r\nopenai_client = CmdrData(client=OpenAI())\r\n\r\n# Auto-detects as Anthropic  \r\nanthropic_client = CmdrData(client=Anthropic())\r\n\r\n# Auto-detects as Google\r\ngemini_client = CmdrData(client=genai.GenerativeModel(\"gemini-pro\"))\r\n```\r\n\r\n### Rich Metadata Support\r\nTrack usage by any dimension:\r\n\r\n```python\r\nresponse = client.chat.completions.create(\r\n    model=\"gpt-4\",\r\n    messages=[...],\r\n    customer_id=\"enterprise-customer\",\r\n    metadata={\r\n        \"feature\": \"customer-support\",\r\n        \"department\": \"sales\",\r\n        \"experiment\": \"prompt-v2\",\r\n        \"user_tier\": \"premium\",\r\n        \"session_id\": \"abc-123\"\r\n    }\r\n)\r\n```\r\n\r\n### Thread-Safe Context Management\r\nPerfect for multi-tenant applications:\r\n\r\n```python\r\nfrom cmdrdata import customer_context, metadata_context\r\n\r\n# Set context for all API calls in a thread\r\nwith customer_context(\"customer-123\"):\r\n    with metadata_context({\"feature\": \"bulk-processing\"}):\r\n        # All API calls here automatically include this context\r\n        response1 = client.chat.completions.create(...)\r\n        response2 = client.embeddings.create(...)\r\n```\r\n\r\n## Advanced Usage\r\n\r\n### Creating Clients\r\nThree ways to initialize:\r\n\r\n```python\r\nfrom cmdrdata import CmdrData, track_ai\r\n\r\n# Method 1: Wrap existing client\r\nclient = track_ai(OpenAI(api_key=\"...\"), cmdrdata_api_key=\"cmd-...\")\r\n\r\n# Method 2: Let CmdrData create the client\r\nclient = CmdrData(\r\n    client_class=OpenAI,\r\n    client_kwargs={\"api_key\": \"...\"},\r\n    cmdrdata_api_key=\"cmd-...\"\r\n)\r\n\r\n# Method 3: Full control\r\nclient = CmdrData(\r\n    client=OpenAI(api_key=\"...\"),\r\n    cmdrdata_api_key=\"cmd-...\",\r\n    cmdrdata_url=\"https://your-instance.cmdrdata.com/api/events\",\r\n    provider=\"openai\",  # Optional: manually specify\r\n    customer_id=\"default-customer\",  # Default for all requests\r\n    metadata={\"environment\": \"production\"}  # Default metadata\r\n)\r\n```\r\n\r\n### Environment Variables\r\nConfigure defaults via environment:\r\n\r\n```bash\r\nexport CMDRDATA_API_KEY=\"cmd-...\"\r\nexport CMDRDATA_URL=\"https://api.cmdrdata.com/api/events\"\r\nexport CMDRDATA_CUSTOMER_ID=\"default-customer\"\r\n```\r\n\r\nThen simply:\r\n```python\r\nfrom cmdrdata import track_ai\r\nclient = track_ai(OpenAI())  # Uses env vars automatically\r\n```\r\n\r\n### Error Handling\r\nTracking failures never break your application:\r\n\r\n```python\r\n# Even if CmdrData is unreachable, your AI calls continue working\r\nresponse = client.chat.completions.create(...)  # Always succeeds\r\n\r\n# Tracking errors are logged but not raised\r\n# Check logs for tracking issues\r\n```\r\n\r\n### Async Support\r\nFull async/await support:\r\n\r\n```python\r\nimport asyncio\r\nfrom openai import AsyncOpenAI\r\nfrom cmdrdata import track_ai\r\n\r\nasync def main():\r\n    client = track_ai(AsyncOpenAI(), cmdrdata_api_key=\"cmd-...\")\r\n    \r\n    response = await client.chat.completions.create(\r\n        model=\"gpt-4\",\r\n        messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\r\n    )\r\n\r\nasyncio.run(main())\r\n```\r\n\r\n## What Gets Tracked\r\n\r\nCmdrData automatically extracts and tracks:\r\n- **Token Usage**: Input, output, and total tokens\r\n- **Model Information**: Which model was used\r\n- **Provider**: OpenAI, Anthropic, Google, etc.\r\n- **Customer ID**: For billing and analytics\r\n- **Custom Metadata**: Any dimensions you specify\r\n- **Timing**: Request duration\r\n- **Errors**: Failed requests with error details\r\n\r\n## Use Cases\r\n\r\n### Usage-Based Billing\r\n```python\r\n# Track usage per customer for accurate billing\r\nresponse = client.chat.completions.create(\r\n    ...,\r\n    customer_id=\"customer-123\"\r\n)\r\n```\r\n\r\n### Feature Analytics\r\n```python\r\n# Understand which features consume the most tokens\r\nresponse = client.chat.completions.create(\r\n    ...,\r\n    metadata={\"feature\": \"document-summary\", \"feature_version\": \"2.0\"}\r\n)\r\n```\r\n\r\n### Department Cost Allocation\r\n```python\r\n# Allocate AI costs to specific departments\r\nresponse = client.chat.completions.create(\r\n    ...,\r\n    metadata={\"department\": \"engineering\", \"team\": \"ml-platform\"}\r\n)\r\n```\r\n\r\n### A/B Testing\r\n```python\r\n# Track token usage across experiments\r\nresponse = client.chat.completions.create(\r\n    ...,\r\n    metadata={\"experiment\": \"prompt-optimization\", \"variant\": \"b\"}\r\n)\r\n```\r\n\r\n### Multi-Tenancy\r\n```python\r\n# Track usage in multi-tenant applications\r\nwith customer_context(tenant_id):\r\n    response = client.chat.completions.create(...)\r\n```\r\n\r\n## Supported Providers\r\n\r\nCmdrData works with any AI provider that returns usage information. Tested with:\r\n\r\n- **OpenAI**: GPT-4, GPT-3.5, DALL-E, Whisper, Embeddings\r\n- **Anthropic**: Claude 3 Opus/Sonnet/Haiku, Claude 2\r\n- **Google**: Gemini Pro, Gemini Ultra, PaLM\r\n- **Cohere**: Command, Embed, Rerank\r\n- **HuggingFace**: Inference API, Transformers\r\n- **Replicate**: Any model on Replicate\r\n- **Together AI**: Llama, Mistral, and other models\r\n- **Perplexity**: pplx-api models\r\n- **Custom**: Any client that returns token usage\r\n\r\n## Migration Guide\r\n\r\n### From Individual SDKs\r\nIf you're using cmdrdata-openai, cmdrdata-anthropic, or cmdrdata-gemini:\r\n\r\n```python\r\n# Old way (provider-specific SDKs)\r\nfrom cmdrdata_openai import TrackedOpenAI\r\nfrom cmdrdata_anthropic import TrackedAnthropic\r\n\r\n# New way (universal SDK)\r\nfrom cmdrdata import track_ai\r\nopenai_client = track_ai(OpenAI())\r\nanthropic_client = track_ai(Anthropic())\r\n```\r\n\r\n### From Direct Clients\r\nZero changes to your application code:\r\n\r\n```python\r\n# Your existing code\r\nclient = OpenAI(api_key=\"...\")\r\nresponse = client.chat.completions.create(...)\r\n\r\n# Just wrap the client - everything else stays the same\r\nfrom cmdrdata import track_ai\r\nclient = track_ai(OpenAI(api_key=\"...\"), cmdrdata_api_key=\"cmd-...\")\r\nresponse = client.chat.completions.create(...)  # Now with tracking!\r\n```\r\n\r\n## Configuration\r\n\r\n### API Endpoint\r\nDefault: `https://api.cmdrdata.com/api/events`\r\n\r\nCustom endpoint:\r\n```python\r\nclient = track_ai(\r\n    OpenAI(),\r\n    cmdrdata_api_key=\"cmd-...\",\r\n    cmdrdata_url=\"https://your-instance.cmdrdata.com/api/events\"\r\n)\r\n```\r\n\r\n### Disable Tracking\r\nFor testing or development:\r\n```python\r\nclient = CmdrData(\r\n    client=OpenAI(),\r\n    disable_tracking=True  # AI calls work, no tracking occurs\r\n)\r\n```\r\n\r\n## License\r\n\r\nMIT\r\n\r\n## Support\r\n\r\n- GitHub Issues: [github.com/cmdrdata-ai/cmdrdata](https://github.com/cmdrdata-ai/cmdrdata)\r\n- Documentation: [docs.cmdrdata.ai](https://docs.cmdrdata.ai)\r\n- Email: support@cmdrdata.ai\r\n\r\n---\r\n\r\nBuilt with \u2764\ufe0f for developers who need to track AI usage without the hassle.\r\n",
    "bugtrack_url": null,
    "license": "MIT License\r\n        \r\n        Copyright (c) 2025 CmdrData AI\r\n        \r\n        Permission is hereby granted, free of charge, to any person obtaining a copy\r\n        of this software and associated documentation files (the \"Software\"), to deal\r\n        in the Software without restriction, including without limitation the rights\r\n        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n        copies of the Software, and to permit persons to whom the Software is\r\n        furnished to do so, subject to the following conditions:\r\n        \r\n        The above copyright notice and this permission notice shall be included in all\r\n        copies or substantial portions of the Software.\r\n        \r\n        THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n        SOFTWARE.",
    "summary": "Universal AI usage tracking SDK - works with any AI provider with arbitrary metadata support",
    "version": "0.1.0",
    "project_urls": {
        "Changelog": "https://github.com/cmdrdata-ai/cmdrdata/releases",
        "Documentation": "https://github.com/cmdrdata-ai/cmdrdata#readme",
        "Homepage": "https://www.cmdrdata.ai",
        "Issues": "https://github.com/cmdrdata-ai/cmdrdata/issues",
        "Repository": "https://github.com/cmdrdata-ai/cmdrdata"
    },
    "split_keywords": [
        "ai",
        " tracking",
        " usage",
        " billing",
        " analytics",
        " metadata",
        " openai",
        " anthropic",
        " google",
        " gemini",
        " claude",
        " gpt",
        " llm",
        " sdk",
        " wrapper",
        " universal"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5c2b54698325e885dec854ce9fefcc6cd64772946391c4033638e92fd2ef24d2",
                "md5": "a6b020b40c94849ebe683c479933194d",
                "sha256": "8cba0029bfdb472aeeac4593735e99e032cfcd8a3b371b44ddf798da72f0776d"
            },
            "downloads": -1,
            "filename": "cmdrdata-0.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "a6b020b40c94849ebe683c479933194d",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 15442,
            "upload_time": "2025-08-11T09:51:24",
            "upload_time_iso_8601": "2025-08-11T09:51:24.886954Z",
            "url": "https://files.pythonhosted.org/packages/5c/2b/54698325e885dec854ce9fefcc6cd64772946391c4033638e92fd2ef24d2/cmdrdata-0.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "05896968cf99d875c18c9715374ca6d07593917ac9787828a1b7912bed2b0b2e",
                "md5": "6d606305f5da7e44d88b476c8e449d5b",
                "sha256": "1ccb1f353efc98773c4a951ca5a39651a300653dee5afdf21fe4103f1327502f"
            },
            "downloads": -1,
            "filename": "cmdrdata-0.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "6d606305f5da7e44d88b476c8e449d5b",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 32459,
            "upload_time": "2025-08-11T09:51:26",
            "upload_time_iso_8601": "2025-08-11T09:51:26.235007Z",
            "url": "https://files.pythonhosted.org/packages/05/89/6968cf99d875c18c9715374ca6d07593917ac9787828a1b7912bed2b0b2e/cmdrdata-0.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-11 09:51:26",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "cmdrdata-ai",
    "github_project": "cmdrdata",
    "github_not_found": true,
    "lcname": "cmdrdata"
}
        
Elapsed time: 1.44580s