sovant


Namesovant JSON
Version 1.0.0 PyPI version JSON
download
home_pageNone
SummaryOfficial Python SDK for Sovant Memory API
upload_time2025-07-31 02:25:20
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT License Copyright (c) 2024 Sovant 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 sovant memory api ai sdk
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Sovant Python SDK

Official Python SDK for the Sovant Memory API. Build AI applications with persistent memory, semantic search, and intelligent context management.

> **Note: Coming Soon!** This SDK is currently in development and will be available on PyPI soon. In the meantime, you can use our REST API directly.

## Installation

```bash
# Coming soon
pip install sovant
```

For async support:

```bash
# Coming soon
pip install sovant[async]
```

## Quick Start

```python
from sovant import SovantClient

# Initialize the client
client = SovantClient(api_key="YOUR_API_KEY")

# Create a memory
memory = client.memories.create({
    "content": "User prefers Python for data science projects",
    "type": "preference",
    "metadata": {
        "confidence": 0.95,
        "context": "programming_languages"
    }
})

print(f"Created memory: {memory.id}")

# Search memories
results = client.memories.search({
    "query": "What programming languages does the user prefer?",
    "limit": 5
})

for result in results:
    print(f"- {result.content} (relevance: {result.relevance_score:.2f})")
```

## Features

- ๐Ÿ **Full Type Hints** - Complete type annotations for better IDE support
- ๐Ÿ”„ **Async/Await Support** - Built for modern Python applications
- ๐Ÿ” **Automatic Retries** - Configurable retry logic with exponential backoff
- ๐Ÿ“ฆ **Batch Operations** - Efficient bulk create/delete operations
- ๐ŸŽฏ **Smart Search** - Semantic, keyword, and hybrid search modes
- ๐Ÿงต **Thread Management** - Organize memories into contextual threads
- ๐Ÿ“Š **Analytics** - Built-in insights and statistics
- ๐Ÿ›ก๏ธ **Comprehensive Error Handling** - Typed exceptions for all error cases

## Configuration

```python
from sovant import SovantClient, Config

# Using configuration object
config = Config(
    api_key="YOUR_API_KEY",
    base_url="https://api.sovant.ai/v1",  # Optional
    timeout=30,  # Request timeout in seconds
    max_retries=3,  # Number of retries for failed requests
    retry_delay=1.0  # Initial delay between retries
)

client = SovantClient(config)
```

You can also use environment variables:

```bash
export SOVANT_API_KEY="YOUR_API_KEY"
```

```python
from sovant import SovantClient

# Automatically reads from SOVANT_API_KEY env var
client = SovantClient()
```

## Memory Operations

### Create a Memory

```python
from sovant import MemoryType, EmotionType

memory = client.memories.create({
    "content": "User completed the onboarding tutorial",
    "type": MemoryType.EVENT,
    "importance": 0.8,
    "metadata": {
        "step_completed": "tutorial",
        "duration_seconds": 180
    },
    "tags": ["onboarding", "milestone"],
    "emotion": {
        "type": EmotionType.POSITIVE,
        "intensity": 0.7
    },
    "action_items": ["Send welcome email", "Unlock advanced features"]
})
```

### Update a Memory

```python
updated = client.memories.update(memory.id, {
    "importance": 0.9,
    "follow_up_required": True,
    "follow_up_due": "2024-12-31T23:59:59Z"
})
```

### Search Memories

```python
# Semantic search
semantic_results = client.memories.search({
    "query": "user achievements and milestones",
    "search_type": "semantic",
    "limit": 10
})

# Filtered search
from sovant import MemoryType

filtered_results = client.memories.search({
    "query": "preferences",
    "type": [MemoryType.PREFERENCE, MemoryType.DECISION],
    "tags": ["important"],
    "created_after": "2024-01-01",
    "sort_by": "importance",
    "sort_order": "desc"
})
```

### Batch Operations

```python
# Batch create
memories_data = [
    {"content": "User is a data scientist", "type": "observation"},
    {"content": "User works with ML models", "type": "learning"},
    {"content": "User prefers Jupyter notebooks", "type": "preference"}
]

batch_result = client.memories.create_batch(memories_data)
print(f"Created {batch_result.success_count} memories")
print(f"Failed {batch_result.failed_count} memories")

# Batch delete
result = client.memories.delete_batch(["mem_123", "mem_456", "mem_789"])
print(f"Deleted {result['deleted']} memories")
```

## Thread Management

### Create a Thread

```python
thread = client.threads.create({
    "name": "Customer Support Chat",
    "description": "Tracking customer issues and resolutions",
    "tags": ["support", "customer", "priority"]
})
```

### Add Memories to Thread

```python
# Add existing memories
client.threads.add_memories(thread.id, [memory1.id, memory2.id])

# Create and add in one operation
new_memory = client.memories.create({
    "content": "Customer reported login issue",
    "type": "conversation",
    "thread_ids": [thread.id]
})
```

### Get Thread with Memories

```python
# Get thread with all memories included
thread_with_memories = client.threads.get(thread.id, include_memories=True)

print(f"Thread: {thread_with_memories.name}")
print(f"Total memories: {len(thread_with_memories.memories)}")

for memory in thread_with_memories.memories:
    print(f"- {memory.content}")
```

### Thread Analytics

```python
stats = client.threads.get_stats(thread.id)

print(f"Total memories: {stats.memory_count}")
print(f"Average importance: {stats.avg_importance:.2f}")
print(f"Decisions made: {stats.total_decisions}")
print(f"Open questions: {stats.total_questions}")
print(f"Action items: {stats.total_action_items}")
```

## Async Support

```python
import asyncio
from sovant import AsyncSovantClient

async def main():
    # Use async client for better performance
    async with AsyncSovantClient(api_key="YOUR_API_KEY") as client:
        # Create multiple memories concurrently
        memories = await asyncio.gather(
            client.memories.create({"content": "Memory 1"}),
            client.memories.create({"content": "Memory 2"}),
            client.memories.create({"content": "Memory 3"})
        )

        print(f"Created {len(memories)} memories")

        # Async search
        results = await client.memories.search({
            "query": "user preferences",
            "search_type": "semantic"
        })

        for result in results:
            print(f"- {result.content}")

asyncio.run(main())
```

## Error Handling

The SDK provides typed exceptions for different error scenarios:

```python
from sovant import (
    AuthenticationError,
    RateLimitError,
    ValidationError,
    NotFoundError,
    NetworkError
)

try:
    memory = client.memories.get("invalid_id")
except NotFoundError:
    print("Memory not found")
except RateLimitError as e:
    print(f"Rate limited. Retry after {e.retry_after} seconds")
except ValidationError as e:
    print(f"Validation errors: {e.errors}")
except AuthenticationError:
    print("Invalid API key")
except NetworkError:
    print("Network error occurred")
```

## Advanced Usage

### Memory Insights

```python
insights = client.memories.get_insights(
    time_range="last_30_days",
    group_by="type"
)

print(f"Total memories: {insights['total_count']}")
print(f"Type distribution: {insights['type_distribution']}")
print(f"Emotion distribution: {insights['emotion_distribution']}")
print(f"Average importance: {insights['importance_stats']['avg']}")
print(f"Growth rate: {insights['growth_rate']}%")
```

### Related Memories

```python
# Find memories related to a specific memory
related = client.memories.get_related(
    memory_id=memory.id,
    limit=5,
    threshold=0.7  # Minimum similarity score
)

for r in related:
    print(f"- {r.content} (similarity: {r.relevance_score:.2f})")
```

### Thread Operations

```python
# Archive a thread
archived = client.threads.archive(thread.id)

# Search threads
threads = client.threads.search(
    query="customer support",
    status="active",
    tags=["priority"]
)

# Merge threads
merged = client.threads.merge(
    target_id=main_thread.id,
    source_ids=[thread2.id, thread3.id]
)

# Clone a thread
cloned = client.threads.clone(
    thread_id=thread.id,
    name="Cloned Thread",
    include_memories=True
)
```

### Pagination

```python
# List memories with pagination
page1 = client.memories.list(limit=20, offset=0)
print(f"Total memories: {page1.total}")
print(f"Has more: {page1.has_more}")

# Get next page
if page1.has_more:
    page2 = client.memories.list(limit=20, offset=20)
```

## Type Safety

The SDK uses Pydantic for data validation and provides enums for better type safety:

```python
from sovant import MemoryType, EmotionType, ThreadStatus

# Using enums ensures valid values
memory = client.memories.create({
    "content": "Important decision made",
    "type": MemoryType.DECISION,  # Type-safe enum
    "emotion": {
        "type": EmotionType.NEUTRAL,  # Type-safe enum
        "intensity": 0.5
    }
})

# IDE will provide autocompletion for all fields
thread = client.threads.create({
    "name": "Project Planning",
    "status": ThreadStatus.ACTIVE  # Type-safe enum
})
```

## Best Practices

1. **Use batch operations for bulk actions**

   ```python
   # Good - single API call
   batch_result = client.memories.create_batch(memories_list)

   # Avoid - multiple API calls
   for memory_data in memories_list:
       client.memories.create(memory_data)
   ```

2. **Use async client for concurrent operations**

   ```python
   async with AsyncSovantClient() as client:
       results = await asyncio.gather(*tasks)
   ```

3. **Handle errors gracefully**

   ```python
   try:
       result = client.memories.search({"query": "test"})
   except RateLimitError as e:
       await asyncio.sleep(e.retry_after)
       # Retry the request
   ```

4. **Use type hints for better IDE support**

   ```python
   from sovant import Memory, SearchResult

   def process_memory(memory: Memory) -> None:
       print(f"Processing {memory.id}")

   def handle_results(results: list[SearchResult]) -> None:
       for result in results:
           print(f"Score: {result.relevance_score}")
   ```

## Examples

Check out the [examples directory](https://github.com/sovant-ai/python-sdk/tree/main/examples) for complete working examples:

- Basic CRUD operations
- Advanced search techniques
- Thread management workflows
- Async patterns
- Error handling
- Data analysis with pandas integration

## Support

- ๐Ÿ“š [Documentation](https://docs.sovant.ai)
- ๐Ÿ’ฌ [Discord Community](https://discord.gg/sovant)
- ๐Ÿ› [Issue Tracker](https://github.com/sovant-ai/python-sdk/issues)
- ๐Ÿ“ง [Email Support](mailto:support@sovant.ai)

## License

MIT ยฉ Sovant AI

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "sovant",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "sovant, memory, api, ai, sdk",
    "author": null,
    "author_email": "Sovant AI <support@sovant.ai>",
    "download_url": "https://files.pythonhosted.org/packages/72/d8/4b4540d354e9234264aff88f90470ba1201010be1dd7a636bc4ee7e6f682/sovant-1.0.0.tar.gz",
    "platform": null,
    "description": "# Sovant Python SDK\n\nOfficial Python SDK for the Sovant Memory API. Build AI applications with persistent memory, semantic search, and intelligent context management.\n\n> **Note: Coming Soon!** This SDK is currently in development and will be available on PyPI soon. In the meantime, you can use our REST API directly.\n\n## Installation\n\n```bash\n# Coming soon\npip install sovant\n```\n\nFor async support:\n\n```bash\n# Coming soon\npip install sovant[async]\n```\n\n## Quick Start\n\n```python\nfrom sovant import SovantClient\n\n# Initialize the client\nclient = SovantClient(api_key=\"YOUR_API_KEY\")\n\n# Create a memory\nmemory = client.memories.create({\n    \"content\": \"User prefers Python for data science projects\",\n    \"type\": \"preference\",\n    \"metadata\": {\n        \"confidence\": 0.95,\n        \"context\": \"programming_languages\"\n    }\n})\n\nprint(f\"Created memory: {memory.id}\")\n\n# Search memories\nresults = client.memories.search({\n    \"query\": \"What programming languages does the user prefer?\",\n    \"limit\": 5\n})\n\nfor result in results:\n    print(f\"- {result.content} (relevance: {result.relevance_score:.2f})\")\n```\n\n## Features\n\n- \ud83d\udc0d **Full Type Hints** - Complete type annotations for better IDE support\n- \ud83d\udd04 **Async/Await Support** - Built for modern Python applications\n- \ud83d\udd01 **Automatic Retries** - Configurable retry logic with exponential backoff\n- \ud83d\udce6 **Batch Operations** - Efficient bulk create/delete operations\n- \ud83c\udfaf **Smart Search** - Semantic, keyword, and hybrid search modes\n- \ud83e\uddf5 **Thread Management** - Organize memories into contextual threads\n- \ud83d\udcca **Analytics** - Built-in insights and statistics\n- \ud83d\udee1\ufe0f **Comprehensive Error Handling** - Typed exceptions for all error cases\n\n## Configuration\n\n```python\nfrom sovant import SovantClient, Config\n\n# Using configuration object\nconfig = Config(\n    api_key=\"YOUR_API_KEY\",\n    base_url=\"https://api.sovant.ai/v1\",  # Optional\n    timeout=30,  # Request timeout in seconds\n    max_retries=3,  # Number of retries for failed requests\n    retry_delay=1.0  # Initial delay between retries\n)\n\nclient = SovantClient(config)\n```\n\nYou can also use environment variables:\n\n```bash\nexport SOVANT_API_KEY=\"YOUR_API_KEY\"\n```\n\n```python\nfrom sovant import SovantClient\n\n# Automatically reads from SOVANT_API_KEY env var\nclient = SovantClient()\n```\n\n## Memory Operations\n\n### Create a Memory\n\n```python\nfrom sovant import MemoryType, EmotionType\n\nmemory = client.memories.create({\n    \"content\": \"User completed the onboarding tutorial\",\n    \"type\": MemoryType.EVENT,\n    \"importance\": 0.8,\n    \"metadata\": {\n        \"step_completed\": \"tutorial\",\n        \"duration_seconds\": 180\n    },\n    \"tags\": [\"onboarding\", \"milestone\"],\n    \"emotion\": {\n        \"type\": EmotionType.POSITIVE,\n        \"intensity\": 0.7\n    },\n    \"action_items\": [\"Send welcome email\", \"Unlock advanced features\"]\n})\n```\n\n### Update a Memory\n\n```python\nupdated = client.memories.update(memory.id, {\n    \"importance\": 0.9,\n    \"follow_up_required\": True,\n    \"follow_up_due\": \"2024-12-31T23:59:59Z\"\n})\n```\n\n### Search Memories\n\n```python\n# Semantic search\nsemantic_results = client.memories.search({\n    \"query\": \"user achievements and milestones\",\n    \"search_type\": \"semantic\",\n    \"limit\": 10\n})\n\n# Filtered search\nfrom sovant import MemoryType\n\nfiltered_results = client.memories.search({\n    \"query\": \"preferences\",\n    \"type\": [MemoryType.PREFERENCE, MemoryType.DECISION],\n    \"tags\": [\"important\"],\n    \"created_after\": \"2024-01-01\",\n    \"sort_by\": \"importance\",\n    \"sort_order\": \"desc\"\n})\n```\n\n### Batch Operations\n\n```python\n# Batch create\nmemories_data = [\n    {\"content\": \"User is a data scientist\", \"type\": \"observation\"},\n    {\"content\": \"User works with ML models\", \"type\": \"learning\"},\n    {\"content\": \"User prefers Jupyter notebooks\", \"type\": \"preference\"}\n]\n\nbatch_result = client.memories.create_batch(memories_data)\nprint(f\"Created {batch_result.success_count} memories\")\nprint(f\"Failed {batch_result.failed_count} memories\")\n\n# Batch delete\nresult = client.memories.delete_batch([\"mem_123\", \"mem_456\", \"mem_789\"])\nprint(f\"Deleted {result['deleted']} memories\")\n```\n\n## Thread Management\n\n### Create a Thread\n\n```python\nthread = client.threads.create({\n    \"name\": \"Customer Support Chat\",\n    \"description\": \"Tracking customer issues and resolutions\",\n    \"tags\": [\"support\", \"customer\", \"priority\"]\n})\n```\n\n### Add Memories to Thread\n\n```python\n# Add existing memories\nclient.threads.add_memories(thread.id, [memory1.id, memory2.id])\n\n# Create and add in one operation\nnew_memory = client.memories.create({\n    \"content\": \"Customer reported login issue\",\n    \"type\": \"conversation\",\n    \"thread_ids\": [thread.id]\n})\n```\n\n### Get Thread with Memories\n\n```python\n# Get thread with all memories included\nthread_with_memories = client.threads.get(thread.id, include_memories=True)\n\nprint(f\"Thread: {thread_with_memories.name}\")\nprint(f\"Total memories: {len(thread_with_memories.memories)}\")\n\nfor memory in thread_with_memories.memories:\n    print(f\"- {memory.content}\")\n```\n\n### Thread Analytics\n\n```python\nstats = client.threads.get_stats(thread.id)\n\nprint(f\"Total memories: {stats.memory_count}\")\nprint(f\"Average importance: {stats.avg_importance:.2f}\")\nprint(f\"Decisions made: {stats.total_decisions}\")\nprint(f\"Open questions: {stats.total_questions}\")\nprint(f\"Action items: {stats.total_action_items}\")\n```\n\n## Async Support\n\n```python\nimport asyncio\nfrom sovant import AsyncSovantClient\n\nasync def main():\n    # Use async client for better performance\n    async with AsyncSovantClient(api_key=\"YOUR_API_KEY\") as client:\n        # Create multiple memories concurrently\n        memories = await asyncio.gather(\n            client.memories.create({\"content\": \"Memory 1\"}),\n            client.memories.create({\"content\": \"Memory 2\"}),\n            client.memories.create({\"content\": \"Memory 3\"})\n        )\n\n        print(f\"Created {len(memories)} memories\")\n\n        # Async search\n        results = await client.memories.search({\n            \"query\": \"user preferences\",\n            \"search_type\": \"semantic\"\n        })\n\n        for result in results:\n            print(f\"- {result.content}\")\n\nasyncio.run(main())\n```\n\n## Error Handling\n\nThe SDK provides typed exceptions for different error scenarios:\n\n```python\nfrom sovant import (\n    AuthenticationError,\n    RateLimitError,\n    ValidationError,\n    NotFoundError,\n    NetworkError\n)\n\ntry:\n    memory = client.memories.get(\"invalid_id\")\nexcept NotFoundError:\n    print(\"Memory not found\")\nexcept RateLimitError as e:\n    print(f\"Rate limited. Retry after {e.retry_after} seconds\")\nexcept ValidationError as e:\n    print(f\"Validation errors: {e.errors}\")\nexcept AuthenticationError:\n    print(\"Invalid API key\")\nexcept NetworkError:\n    print(\"Network error occurred\")\n```\n\n## Advanced Usage\n\n### Memory Insights\n\n```python\ninsights = client.memories.get_insights(\n    time_range=\"last_30_days\",\n    group_by=\"type\"\n)\n\nprint(f\"Total memories: {insights['total_count']}\")\nprint(f\"Type distribution: {insights['type_distribution']}\")\nprint(f\"Emotion distribution: {insights['emotion_distribution']}\")\nprint(f\"Average importance: {insights['importance_stats']['avg']}\")\nprint(f\"Growth rate: {insights['growth_rate']}%\")\n```\n\n### Related Memories\n\n```python\n# Find memories related to a specific memory\nrelated = client.memories.get_related(\n    memory_id=memory.id,\n    limit=5,\n    threshold=0.7  # Minimum similarity score\n)\n\nfor r in related:\n    print(f\"- {r.content} (similarity: {r.relevance_score:.2f})\")\n```\n\n### Thread Operations\n\n```python\n# Archive a thread\narchived = client.threads.archive(thread.id)\n\n# Search threads\nthreads = client.threads.search(\n    query=\"customer support\",\n    status=\"active\",\n    tags=[\"priority\"]\n)\n\n# Merge threads\nmerged = client.threads.merge(\n    target_id=main_thread.id,\n    source_ids=[thread2.id, thread3.id]\n)\n\n# Clone a thread\ncloned = client.threads.clone(\n    thread_id=thread.id,\n    name=\"Cloned Thread\",\n    include_memories=True\n)\n```\n\n### Pagination\n\n```python\n# List memories with pagination\npage1 = client.memories.list(limit=20, offset=0)\nprint(f\"Total memories: {page1.total}\")\nprint(f\"Has more: {page1.has_more}\")\n\n# Get next page\nif page1.has_more:\n    page2 = client.memories.list(limit=20, offset=20)\n```\n\n## Type Safety\n\nThe SDK uses Pydantic for data validation and provides enums for better type safety:\n\n```python\nfrom sovant import MemoryType, EmotionType, ThreadStatus\n\n# Using enums ensures valid values\nmemory = client.memories.create({\n    \"content\": \"Important decision made\",\n    \"type\": MemoryType.DECISION,  # Type-safe enum\n    \"emotion\": {\n        \"type\": EmotionType.NEUTRAL,  # Type-safe enum\n        \"intensity\": 0.5\n    }\n})\n\n# IDE will provide autocompletion for all fields\nthread = client.threads.create({\n    \"name\": \"Project Planning\",\n    \"status\": ThreadStatus.ACTIVE  # Type-safe enum\n})\n```\n\n## Best Practices\n\n1. **Use batch operations for bulk actions**\n\n   ```python\n   # Good - single API call\n   batch_result = client.memories.create_batch(memories_list)\n\n   # Avoid - multiple API calls\n   for memory_data in memories_list:\n       client.memories.create(memory_data)\n   ```\n\n2. **Use async client for concurrent operations**\n\n   ```python\n   async with AsyncSovantClient() as client:\n       results = await asyncio.gather(*tasks)\n   ```\n\n3. **Handle errors gracefully**\n\n   ```python\n   try:\n       result = client.memories.search({\"query\": \"test\"})\n   except RateLimitError as e:\n       await asyncio.sleep(e.retry_after)\n       # Retry the request\n   ```\n\n4. **Use type hints for better IDE support**\n\n   ```python\n   from sovant import Memory, SearchResult\n\n   def process_memory(memory: Memory) -> None:\n       print(f\"Processing {memory.id}\")\n\n   def handle_results(results: list[SearchResult]) -> None:\n       for result in results:\n           print(f\"Score: {result.relevance_score}\")\n   ```\n\n## Examples\n\nCheck out the [examples directory](https://github.com/sovant-ai/python-sdk/tree/main/examples) for complete working examples:\n\n- Basic CRUD operations\n- Advanced search techniques\n- Thread management workflows\n- Async patterns\n- Error handling\n- Data analysis with pandas integration\n\n## Support\n\n- \ud83d\udcda [Documentation](https://docs.sovant.ai)\n- \ud83d\udcac [Discord Community](https://discord.gg/sovant)\n- \ud83d\udc1b [Issue Tracker](https://github.com/sovant-ai/python-sdk/issues)\n- \ud83d\udce7 [Email Support](mailto:support@sovant.ai)\n\n## License\n\nMIT \u00a9 Sovant AI\n",
    "bugtrack_url": null,
    "license": "MIT License\n        \n        Copyright (c) 2024 Sovant AI\n        \n        Permission is hereby granted, free of charge, to any person obtaining a copy\n        of this software and associated documentation files (the \"Software\"), to deal\n        in the Software without restriction, including without limitation the rights\n        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n        copies of the Software, and to permit persons to whom the Software is\n        furnished to do so, subject to the following conditions:\n        \n        The above copyright notice and this permission notice shall be included in all\n        copies or substantial portions of the Software.\n        \n        THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n        SOFTWARE.",
    "summary": "Official Python SDK for Sovant Memory API",
    "version": "1.0.0",
    "project_urls": {
        "Documentation": "https://docs.sovant.ai",
        "Homepage": "https://sovant.ai",
        "Issues": "https://github.com/sovant-ai/python-sdk/issues",
        "Repository": "https://github.com/sovant-ai/python-sdk"
    },
    "split_keywords": [
        "sovant",
        " memory",
        " api",
        " ai",
        " sdk"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0360e5761a828e7dc523e33e40979399fffe210eba3e33ce389369f953ffa931",
                "md5": "32240519c09d80a17d08f8521f1bdd74",
                "sha256": "b6ca2f1366852269496383ec3ac14d847ccdaf3cfd815f3bcbac41516a03871b"
            },
            "downloads": -1,
            "filename": "sovant-1.0.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "32240519c09d80a17d08f8521f1bdd74",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 15678,
            "upload_time": "2025-07-31T02:25:19",
            "upload_time_iso_8601": "2025-07-31T02:25:19.551336Z",
            "url": "https://files.pythonhosted.org/packages/03/60/e5761a828e7dc523e33e40979399fffe210eba3e33ce389369f953ffa931/sovant-1.0.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "72d84b4540d354e9234264aff88f90470ba1201010be1dd7a636bc4ee7e6f682",
                "md5": "57583672c4c06df8abb9cf49605c3896",
                "sha256": "60cca374375e15f85a6a533d28acac3ef6f315e5e2ebff0c27bc2d8b545ed7a1"
            },
            "downloads": -1,
            "filename": "sovant-1.0.0.tar.gz",
            "has_sig": false,
            "md5_digest": "57583672c4c06df8abb9cf49605c3896",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 17532,
            "upload_time": "2025-07-31T02:25:20",
            "upload_time_iso_8601": "2025-07-31T02:25:20.871592Z",
            "url": "https://files.pythonhosted.org/packages/72/d8/4b4540d354e9234264aff88f90470ba1201010be1dd7a636bc4ee7e6f682/sovant-1.0.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-31 02:25:20",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "sovant-ai",
    "github_project": "python-sdk",
    "github_not_found": true,
    "lcname": "sovant"
}
        
Elapsed time: 1.09988s