# 🧠 ODAM V4 Python SDK
[](https://badge.fury.io/py/odam-sdk)
[](https://www.python.org/downloads/)
[](https://opensource.org/licenses/MIT)
[](https://docs.odam.dev)
Офіційний Python SDK для інтеграції з **ODAM V4** - революційною системою штучного інтелекту з людською пам'яттю.
## 🌟 Особливості
- **🧠 Розумні чат-відповіді** з контекстуальною пам'яттю
- **💾 Система людської пам'яті** - запам'ятовує кожного користувача назавжди
- **🏥 Медичні NLP сутності** з точністю 90%+
- **🌐 Багатомовність** - підтримка 15+ мов з автоматичним визначенням
- **🕸️ Граф знань** - складні взаємозв'язки між сутностями
- **🎨 Персоналізація** - унікальний досвід для кожного користувача
- **⚡ Real-time обробка** - відповідь за < 100мс
- **🚀 Enterprise V7** - 98-100% персоналізація з Memory Enforcement
- **🛡️ Medical Safety** - гарантована медична безпека
## 📦 Встановлення
```bash
# Встановлення з PyPI
pip install odam-sdk
# Або з GitHub
pip install git+https://github.com/odam-ai/odam-sdk-python.git
```
## 🚀 Швидкий старт
### Базовий приклад
```python
from odam_sdk import ODAMClient
# Створення клієнта
client = ODAMClient(api_key="your_api_key")
# Відправка повідомлення
response = client.chat(
message="Привіт! Як справи?",
user_id="user_123"
)
print(response.response)
print(f"Сутності: {response.entities}")
print(f"Пам'ять оновлена: {response.memory_stats.memories_created}")
```
### Розширений приклад
```python
from odam_sdk import ODAMClient, Language, MemoryType
# Створення клієнта з налаштуваннями
client = ODAMClient(
api_key="your_api_key",
base_url="https://api.odam.dev",
timeout=30,
enable_logging=True
)
# Відправка повідомлення з усіма опціями
response = client.chat(
message="Я хочу записатися до лікаря на наступний тиждень",
user_id="user_maria_456",
session_id="session_789",
language=Language.UKRAINIAN,
use_memory=True,
use_medical_nlp=True,
use_graph_search=True,
enterprise_v7=True,
medical_safety=True,
context={
"source": "mobile_app",
"location": "kyiv",
"user_type": "patient"
}
)
# Аналіз відповіді
print(f"Відповідь: {response.response}")
print(f"Мова: {response.language_info.language}")
print(f"Сутності: {len(response.entities)} знайдено")
print(f"Пам'ять: {response.memory_stats.memories_found} спогадів знайдено")
print(f"Персоналізація: {response.personalization_score:.2%}")
# Отримання пам'яті користувача
memories = client.get_memory(
user_id="user_maria_456",
memory_type=MemoryType.EPISODIC,
limit=10
)
print(f"Спогади користувача: {len(memories.memories)}")
```
## 📚 Основні методи
### 💬 Чат
```python
# Простий чат
response = client.chat("Привіт!", "user_123")
# Чат з контекстом
response = client.chat(
message="Нагадай мені про зустріч",
user_id="user_123",
context={"app": "calendar", "priority": "high"}
)
# Batch обробка
messages = [
{"message": "Привіт!", "user_id": "user_1"},
{"message": "Як справи?", "user_id": "user_2"}
]
batch_response = client.chat_batch(messages)
```
### 🧠 Пам'ять
```python
# Отримання всіх спогадів
memories = client.get_memory("user_123")
# Отримання конкретного типу пам'яті
episodic_memories = client.get_memory(
user_id="user_123",
memory_type=MemoryType.EPISODIC,
limit=20
)
# Отримання пам'яті за період
recent_memories = client.get_memory(
user_id="user_123",
start_date=datetime(2024, 1, 1),
end_date=datetime(2024, 12, 31)
)
```
### 🏥 Сутності
```python
# Витягування сутностей
entities = client.extract_entities(
text="Доктор Петренко призначив аспірин 500мг 2 рази на день",
medical_mode=True
)
print(f"Знайдено сутностей: {len(entities.entities)}")
for entity in entities.entities:
print(f"- {entity.text} ({entity.type})")
```
### 🕸️ Граф знань
```python
# Пошук в графі знань
graph_results = client.search_graph(
query="лікарі в Києві",
user_id="user_123",
depth=3,
limit=50
)
print(f"Знайдено вузлів: {len(graph_results.nodes)}")
print(f"Знайдено зв'язків: {len(graph_results.relationships)}")
```
### 📊 Аналітика
```python
# Отримання аналітики
analytics = client.get_analytics(
user_id="user_123",
start_date=datetime(2024, 1, 1),
metrics=["conversations", "entities", "memory_usage"]
)
print(f"Аналітика: {analytics}")
```
## ⚙️ Конфігурація
### Environment Variables
```bash
# .env файл
ODAM_API_KEY=your_api_key_here
ODAM_BASE_URL=https://api.odam.dev
ODAM_TIMEOUT=30
ODAM_LOG_LEVEL=INFO
ODAM_ENABLE_CACHE=true
```
### Програмна конфігурація
```python
from odam_sdk import ODAMClient, ODAMConfig
# Створення конфігурації
config = ODAMConfig(
api_key="your_api_key",
base_url="https://api.odam.dev",
timeout=30,
max_retries=3,
enable_logging=True,
enable_cache=True,
enterprise_v7_enabled=True,
medical_safety_enabled=True
)
# Створення клієнта з конфігурацією
client = ODAMClient(config=config)
```
## 🔧 Розширені можливості
### Context Manager
```python
# Автоматичне закриття ресурсів
with ODAMClient(api_key="your_key") as client:
response = client.chat("Привіт!", "user_123")
print(response.response)
```
### Retry логіка
```python
# Автоматичні повторні спроби при помилках
@retry_on_failure(max_retries=5, delay=2.0)
def send_message(client, message, user_id):
return client.chat(message, user_id)
```
### Кешування
```python
# Отримання статистики кешу
cache_stats = client.get_cache_stats()
print(f"Розмір кешу: {cache_stats['cache_size']}")
# Очищення кешу
client.clear_cache()
```
### Логування
```python
import logging
# Налаштування логування
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("odam_sdk")
# Логування запитів та відповідей
client = ODAMClient(
api_key="your_key",
log_requests=True,
log_responses=True
)
```
## 🏥 Медичні можливості
### Медичні сутності
```python
# Автоматичне витягування медичних сутностей
medical_text = """
Пацієнт: Іван Петренко, 45 років
Діагноз: Гіпертонія
Лікування: Еналаприл 10мг 1 раз на день
Алергії: Пеніцилін
"""
entities = client.extract_entities(
text=medical_text,
medical_mode=True
)
for entity in entities.entities:
if entity.type in ["Person", "Medication", "Condition"]:
print(f"Медична сутність: {entity.text} ({entity.type})")
```
### Medical Safety
```python
# Безпечна медична обробка
response = client.chat(
message="У мене біль у грудях",
user_id="patient_123",
medical_safety=True,
enterprise_v7=True
)
# Система автоматично додасть медичні попередження
print(response.response)
```
## 🌐 Багатомовність
### Автоматичне визначення мови
```python
# Автоматичне визначення мови
response = client.chat(
message="Hello, how are you?", # Англійська
user_id="user_123"
)
print(f"Визначена мова: {response.language_info.language}")
response = client.chat(
message="Привіт, як справи?", # Українська
user_id="user_123"
)
print(f"Визначена мова: {response.language_info.language}")
```
### Явне вказання мови
```python
from odam_sdk import Language
response = client.chat(
message="Bonjour, comment allez-vous?",
user_id="user_123",
language=Language.FRENCH
)
```
## 🚀 Enterprise V7
### Memory Enforcement
```python
# Примусова персоналізація
response = client.chat(
message="Нагадай мені про мої уподобання",
user_id="user_123",
memory_enforcement=True,
enterprise_v7=True
)
print(f"Використання пам'яті: {response.v7_metrics.memory_utilization_score:.2%}")
```
### Senior Fallback
```python
# Примусова конвертація сутностей
response = client.chat(
message="Я бачу лікаря",
user_id="user_123",
fallback_enabled=True,
enterprise_v7=True
)
print(f"Використано fallback: {response.v7_metrics.fallback_used}")
```
## 📊 Моніторинг та метрики
### Health Check
```python
# Перевірка здоров'я системи
health = client.health_check()
print(f"Статус: {health.status}")
print(f"Версія: {health.version}")
print(f"Uptime: {health.uptime:.2f} секунд")
```
### Метрики продуктивності
```python
response = client.chat("Привіт!", "user_123")
print(f"Час обробки: {response.processing_time:.3f}с")
print(f"Персоналізація: {response.personalization_score:.2%}")
print(f"Результати пошуку: {response.search_results}")
```
## 🔒 Безпека
### Валідація API ключа
```python
from odam_sdk import validate_api_key
# Перевірка API ключа
if validate_api_key("your_api_key"):
print("API ключ валідний")
else:
print("API ключ невалідний")
```
### Безпечне зберігання
```python
import os
# Рекомендований спосіб зберігання API ключа
api_key = os.getenv("ODAM_API_KEY")
client = ODAMClient(api_key=api_key)
```
## 🧪 Тестування
### Unit тести
```python
import pytest
from unittest.mock import Mock
from odam_sdk import ODAMClient
def test_chat_response():
# Мок відповіді
mock_response = {
"response": "Привіт! Як справи?",
"user_id": "user_123",
"processing_time": 0.1,
"language_info": {"language": "uk", "confidence": 0.99},
"entities": [],
"memory_stats": {"memories_found": 0, "memories_created": 1},
"search_results": {"vector_results": 0, "bm25_results": 0, "graph_results": 0},
"personalization_score": 0.5,
"timestamp": "2024-01-01T00:00:00Z"
}
# Тестування
client = ODAMClient(api_key="test_key")
client._make_request = Mock(return_value=mock_response)
response = client.chat("Привіт!", "user_123")
assert response.response == "Привіт! Як справи?"
assert response.user_id == "user_123"
```
## 📖 Повна документація
- 📚 [API Reference](https://docs.odam.dev/api)
- 🚀 [Quick Start Guide](https://docs.odam.dev/quickstart)
- 🏥 [Medical NLP Guide](https://docs.odam.dev/medical)
- 🌐 [Multilingual Support](https://docs.odam.dev/multilingual)
- 🚀 [Enterprise V7 Features](https://docs.odam.dev/enterprise)
- 🔧 [Configuration Guide](https://docs.odam.dev/configuration)
- 🧪 [Testing Guide](https://docs.odam.dev/testing)
- 📊 [Analytics & Monitoring](https://docs.odam.dev/analytics)
## 🤝 Підтримка
- 📧 Email: support@odam.dev
- 💬 Discord: [ODAM Community](https://discord.gg/odam)
- 📖 Documentation: [docs.odam.dev](https://docs.odam.dev)
- 🐛 Issues: [GitHub Issues](https://github.com/odam-ai/odam-sdk-python/issues)
- 💡 Discussions: [GitHub Discussions](https://github.com/odam-ai/odam-sdk-python/discussions)
## 📄 Ліцензія
Цей проект ліцензовано під MIT License - дивіться файл [LICENSE](LICENSE) для деталей.
## 🙏 Подяки
Дякуємо всім спільноті ODAM за внесок у розвиток цього SDK!
---
**🧠 ODAM V4 - Майбутнє штучного інтелекту вже тут!**
Raw data
{
"_id": null,
"home_page": "https://api.odam.dev",
"name": "odam-sdk",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "ai, artificial-intelligence, chatbot, nlp, natural-language-processing, memory, conversation, chat, api, sdk, machine-learning, deep-learning, neural-networks, language-model, text-generation, entity-extraction, knowledge-graph, semantic-search, vector-search, embeddings, medical-nlp, healthcare, multilingual, ukrainian, enterprise, saas, cloud, rest-api, fastapi, python, typescript, javascript, java, dotnet",
"author": "ODAM Technologies",
"author_email": "support@odam.dev",
"download_url": "https://files.pythonhosted.org/packages/2c/9d/f1892bf93bc05b58056792218714d88a803fd6621c421e2ebc488f663a7e/odam_sdk-2.0.0.tar.gz",
"platform": "any",
"description": "# \ud83e\udde0 ODAM V4 Python SDK\n\n[](https://badge.fury.io/py/odam-sdk)\n[](https://www.python.org/downloads/)\n[](https://opensource.org/licenses/MIT)\n[](https://docs.odam.dev)\n\n\u041e\u0444\u0456\u0446\u0456\u0439\u043d\u0438\u0439 Python SDK \u0434\u043b\u044f \u0456\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0456\u0457 \u0437 **ODAM V4** - \u0440\u0435\u0432\u043e\u043b\u044e\u0446\u0456\u0439\u043d\u043e\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u044e \u0448\u0442\u0443\u0447\u043d\u043e\u0433\u043e \u0456\u043d\u0442\u0435\u043b\u0435\u043a\u0442\u0443 \u0437 \u043b\u044e\u0434\u0441\u044c\u043a\u043e\u044e \u043f\u0430\u043c'\u044f\u0442\u0442\u044e.\n\n## \ud83c\udf1f \u041e\u0441\u043e\u0431\u043b\u0438\u0432\u043e\u0441\u0442\u0456\n\n- **\ud83e\udde0 \u0420\u043e\u0437\u0443\u043c\u043d\u0456 \u0447\u0430\u0442-\u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u0456** \u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u044e \u043f\u0430\u043c'\u044f\u0442\u0442\u044e\n- **\ud83d\udcbe \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043b\u044e\u0434\u0441\u044c\u043a\u043e\u0457 \u043f\u0430\u043c'\u044f\u0442\u0456** - \u0437\u0430\u043f\u0430\u043c'\u044f\u0442\u043e\u0432\u0443\u0454 \u043a\u043e\u0436\u043d\u043e\u0433\u043e \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430 \u043d\u0430\u0437\u0430\u0432\u0436\u0434\u0438\n- **\ud83c\udfe5 \u041c\u0435\u0434\u0438\u0447\u043d\u0456 NLP \u0441\u0443\u0442\u043d\u043e\u0441\u0442\u0456** \u0437 \u0442\u043e\u0447\u043d\u0456\u0441\u0442\u044e 90%+\n- **\ud83c\udf10 \u0411\u0430\u0433\u0430\u0442\u043e\u043c\u043e\u0432\u043d\u0456\u0441\u0442\u044c** - \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u043a\u0430 15+ \u043c\u043e\u0432 \u0437 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0438\u043c \u0432\u0438\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f\u043c\n- **\ud83d\udd78\ufe0f \u0413\u0440\u0430\u0444 \u0437\u043d\u0430\u043d\u044c** - \u0441\u043a\u043b\u0430\u0434\u043d\u0456 \u0432\u0437\u0430\u0454\u043c\u043e\u0437\u0432'\u044f\u0437\u043a\u0438 \u043c\u0456\u0436 \u0441\u0443\u0442\u043d\u043e\u0441\u0442\u044f\u043c\u0438\n- **\ud83c\udfa8 \u041f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u0456\u0437\u0430\u0446\u0456\u044f** - \u0443\u043d\u0456\u043a\u0430\u043b\u044c\u043d\u0438\u0439 \u0434\u043e\u0441\u0432\u0456\u0434 \u0434\u043b\u044f \u043a\u043e\u0436\u043d\u043e\u0433\u043e \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\n- **\u26a1 Real-time \u043e\u0431\u0440\u043e\u0431\u043a\u0430** - \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u044c \u0437\u0430 < 100\u043c\u0441\n- **\ud83d\ude80 Enterprise V7** - 98-100% \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u0456\u0437\u0430\u0446\u0456\u044f \u0437 Memory Enforcement\n- **\ud83d\udee1\ufe0f Medical Safety** - \u0433\u0430\u0440\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0430 \u043c\u0435\u0434\u0438\u0447\u043d\u0430 \u0431\u0435\u0437\u043f\u0435\u043a\u0430\n\n## \ud83d\udce6 \u0412\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044f\n\n```bash\n# \u0412\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044f \u0437 PyPI\npip install odam-sdk\n\n# \u0410\u0431\u043e \u0437 GitHub\npip install git+https://github.com/odam-ai/odam-sdk-python.git\n```\n\n## \ud83d\ude80 \u0428\u0432\u0438\u0434\u043a\u0438\u0439 \u0441\u0442\u0430\u0440\u0442\n\n### \u0411\u0430\u0437\u043e\u0432\u0438\u0439 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\n\n```python\nfrom odam_sdk import ODAMClient\n\n# \u0421\u0442\u0432\u043e\u0440\u0435\u043d\u043d\u044f \u043a\u043b\u0456\u0454\u043d\u0442\u0430\nclient = ODAMClient(api_key=\"your_api_key\")\n\n# \u0412\u0456\u0434\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u043b\u0435\u043d\u043d\u044f\nresponse = client.chat(\n message=\"\u041f\u0440\u0438\u0432\u0456\u0442! \u042f\u043a \u0441\u043f\u0440\u0430\u0432\u0438?\",\n user_id=\"user_123\"\n)\n\nprint(response.response)\nprint(f\"\u0421\u0443\u0442\u043d\u043e\u0441\u0442\u0456: {response.entities}\")\nprint(f\"\u041f\u0430\u043c'\u044f\u0442\u044c \u043e\u043d\u043e\u0432\u043b\u0435\u043d\u0430: {response.memory_stats.memories_created}\")\n```\n\n### \u0420\u043e\u0437\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\n\n```python\nfrom odam_sdk import ODAMClient, Language, MemoryType\n\n# \u0421\u0442\u0432\u043e\u0440\u0435\u043d\u043d\u044f \u043a\u043b\u0456\u0454\u043d\u0442\u0430 \u0437 \u043d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f\u043c\u0438\nclient = ODAMClient(\n api_key=\"your_api_key\",\n base_url=\"https://api.odam.dev\",\n timeout=30,\n enable_logging=True\n)\n\n# \u0412\u0456\u0434\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u043b\u0435\u043d\u043d\u044f \u0437 \u0443\u0441\u0456\u043c\u0430 \u043e\u043f\u0446\u0456\u044f\u043c\u0438\nresponse = client.chat(\n message=\"\u042f \u0445\u043e\u0447\u0443 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u0438\u0441\u044f \u0434\u043e \u043b\u0456\u043a\u0430\u0440\u044f \u043d\u0430 \u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0438\u0439 \u0442\u0438\u0436\u0434\u0435\u043d\u044c\",\n user_id=\"user_maria_456\",\n session_id=\"session_789\",\n language=Language.UKRAINIAN,\n use_memory=True,\n use_medical_nlp=True,\n use_graph_search=True,\n enterprise_v7=True,\n medical_safety=True,\n context={\n \"source\": \"mobile_app\",\n \"location\": \"kyiv\",\n \"user_type\": \"patient\"\n }\n)\n\n# \u0410\u043d\u0430\u043b\u0456\u0437 \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u0456\nprint(f\"\u0412\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u044c: {response.response}\")\nprint(f\"\u041c\u043e\u0432\u0430: {response.language_info.language}\")\nprint(f\"\u0421\u0443\u0442\u043d\u043e\u0441\u0442\u0456: {len(response.entities)} \u0437\u043d\u0430\u0439\u0434\u0435\u043d\u043e\")\nprint(f\"\u041f\u0430\u043c'\u044f\u0442\u044c: {response.memory_stats.memories_found} \u0441\u043f\u043e\u0433\u0430\u0434\u0456\u0432 \u0437\u043d\u0430\u0439\u0434\u0435\u043d\u043e\")\nprint(f\"\u041f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u0456\u0437\u0430\u0446\u0456\u044f: {response.personalization_score:.2%}\")\n\n# \u041e\u0442\u0440\u0438\u043c\u0430\u043d\u043d\u044f \u043f\u0430\u043c'\u044f\u0442\u0456 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\nmemories = client.get_memory(\n user_id=\"user_maria_456\",\n memory_type=MemoryType.EPISODIC,\n limit=10\n)\n\nprint(f\"\u0421\u043f\u043e\u0433\u0430\u0434\u0438 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430: {len(memories.memories)}\")\n```\n\n## \ud83d\udcda \u041e\u0441\u043d\u043e\u0432\u043d\u0456 \u043c\u0435\u0442\u043e\u0434\u0438\n\n### \ud83d\udcac \u0427\u0430\u0442\n\n```python\n# \u041f\u0440\u043e\u0441\u0442\u0438\u0439 \u0447\u0430\u0442\nresponse = client.chat(\"\u041f\u0440\u0438\u0432\u0456\u0442!\", \"user_123\")\n\n# \u0427\u0430\u0442 \u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c\nresponse = client.chat(\n message=\"\u041d\u0430\u0433\u0430\u0434\u0430\u0439 \u043c\u0435\u043d\u0456 \u043f\u0440\u043e \u0437\u0443\u0441\u0442\u0440\u0456\u0447\",\n user_id=\"user_123\",\n context={\"app\": \"calendar\", \"priority\": \"high\"}\n)\n\n# Batch \u043e\u0431\u0440\u043e\u0431\u043a\u0430\nmessages = [\n {\"message\": \"\u041f\u0440\u0438\u0432\u0456\u0442!\", \"user_id\": \"user_1\"},\n {\"message\": \"\u042f\u043a \u0441\u043f\u0440\u0430\u0432\u0438?\", \"user_id\": \"user_2\"}\n]\nbatch_response = client.chat_batch(messages)\n```\n\n### \ud83e\udde0 \u041f\u0430\u043c'\u044f\u0442\u044c\n\n```python\n# \u041e\u0442\u0440\u0438\u043c\u0430\u043d\u043d\u044f \u0432\u0441\u0456\u0445 \u0441\u043f\u043e\u0433\u0430\u0434\u0456\u0432\nmemories = client.get_memory(\"user_123\")\n\n# \u041e\u0442\u0440\u0438\u043c\u0430\u043d\u043d\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0443 \u043f\u0430\u043c'\u044f\u0442\u0456\nepisodic_memories = client.get_memory(\n user_id=\"user_123\",\n memory_type=MemoryType.EPISODIC,\n limit=20\n)\n\n# \u041e\u0442\u0440\u0438\u043c\u0430\u043d\u043d\u044f \u043f\u0430\u043c'\u044f\u0442\u0456 \u0437\u0430 \u043f\u0435\u0440\u0456\u043e\u0434\nrecent_memories = client.get_memory(\n user_id=\"user_123\",\n start_date=datetime(2024, 1, 1),\n end_date=datetime(2024, 12, 31)\n)\n```\n\n### \ud83c\udfe5 \u0421\u0443\u0442\u043d\u043e\u0441\u0442\u0456\n\n```python\n# \u0412\u0438\u0442\u044f\u0433\u0443\u0432\u0430\u043d\u043d\u044f \u0441\u0443\u0442\u043d\u043e\u0441\u0442\u0435\u0439\nentities = client.extract_entities(\n text=\"\u0414\u043e\u043a\u0442\u043e\u0440 \u041f\u0435\u0442\u0440\u0435\u043d\u043a\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u0447\u0438\u0432 \u0430\u0441\u043f\u0456\u0440\u0438\u043d 500\u043c\u0433 2 \u0440\u0430\u0437\u0438 \u043d\u0430 \u0434\u0435\u043d\u044c\",\n medical_mode=True\n)\n\nprint(f\"\u0417\u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0441\u0443\u0442\u043d\u043e\u0441\u0442\u0435\u0439: {len(entities.entities)}\")\nfor entity in entities.entities:\n print(f\"- {entity.text} ({entity.type})\")\n```\n\n### \ud83d\udd78\ufe0f \u0413\u0440\u0430\u0444 \u0437\u043d\u0430\u043d\u044c\n\n```python\n# \u041f\u043e\u0448\u0443\u043a \u0432 \u0433\u0440\u0430\u0444\u0456 \u0437\u043d\u0430\u043d\u044c\ngraph_results = client.search_graph(\n query=\"\u043b\u0456\u043a\u0430\u0440\u0456 \u0432 \u041a\u0438\u0454\u0432\u0456\",\n user_id=\"user_123\",\n depth=3,\n limit=50\n)\n\nprint(f\"\u0417\u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0432\u0443\u0437\u043b\u0456\u0432: {len(graph_results.nodes)}\")\nprint(f\"\u0417\u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0437\u0432'\u044f\u0437\u043a\u0456\u0432: {len(graph_results.relationships)}\")\n```\n\n### \ud83d\udcca \u0410\u043d\u0430\u043b\u0456\u0442\u0438\u043a\u0430\n\n```python\n# \u041e\u0442\u0440\u0438\u043c\u0430\u043d\u043d\u044f \u0430\u043d\u0430\u043b\u0456\u0442\u0438\u043a\u0438\nanalytics = client.get_analytics(\n user_id=\"user_123\",\n start_date=datetime(2024, 1, 1),\n metrics=[\"conversations\", \"entities\", \"memory_usage\"]\n)\n\nprint(f\"\u0410\u043d\u0430\u043b\u0456\u0442\u0438\u043a\u0430: {analytics}\")\n```\n\n## \u2699\ufe0f \u041a\u043e\u043d\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u044f\n\n### Environment Variables\n\n```bash\n# .env \u0444\u0430\u0439\u043b\nODAM_API_KEY=your_api_key_here\nODAM_BASE_URL=https://api.odam.dev\nODAM_TIMEOUT=30\nODAM_LOG_LEVEL=INFO\nODAM_ENABLE_CACHE=true\n```\n\n### \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043d\u0430 \u043a\u043e\u043d\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u044f\n\n```python\nfrom odam_sdk import ODAMClient, ODAMConfig\n\n# \u0421\u0442\u0432\u043e\u0440\u0435\u043d\u043d\u044f \u043a\u043e\u043d\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u0457\nconfig = ODAMConfig(\n api_key=\"your_api_key\",\n base_url=\"https://api.odam.dev\",\n timeout=30,\n max_retries=3,\n enable_logging=True,\n enable_cache=True,\n enterprise_v7_enabled=True,\n medical_safety_enabled=True\n)\n\n# \u0421\u0442\u0432\u043e\u0440\u0435\u043d\u043d\u044f \u043a\u043b\u0456\u0454\u043d\u0442\u0430 \u0437 \u043a\u043e\u043d\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u0454\u044e\nclient = ODAMClient(config=config)\n```\n\n## \ud83d\udd27 \u0420\u043e\u0437\u0448\u0438\u0440\u0435\u043d\u0456 \u043c\u043e\u0436\u043b\u0438\u0432\u043e\u0441\u0442\u0456\n\n### Context Manager\n\n```python\n# \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0435 \u0437\u0430\u043a\u0440\u0438\u0442\u0442\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u0456\u0432\nwith ODAMClient(api_key=\"your_key\") as client:\n response = client.chat(\"\u041f\u0440\u0438\u0432\u0456\u0442!\", \"user_123\")\n print(response.response)\n```\n\n### Retry \u043b\u043e\u0433\u0456\u043a\u0430\n\n```python\n# \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0456 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0456 \u0441\u043f\u0440\u043e\u0431\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u0438\u043b\u043a\u0430\u0445\n@retry_on_failure(max_retries=5, delay=2.0)\ndef send_message(client, message, user_id):\n return client.chat(message, user_id)\n```\n\n### \u041a\u0435\u0448\u0443\u0432\u0430\u043d\u043d\u044f\n\n```python\n# \u041e\u0442\u0440\u0438\u043c\u0430\u043d\u043d\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u043a\u0435\u0448\u0443\ncache_stats = client.get_cache_stats()\nprint(f\"\u0420\u043e\u0437\u043c\u0456\u0440 \u043a\u0435\u0448\u0443: {cache_stats['cache_size']}\")\n\n# \u041e\u0447\u0438\u0449\u0435\u043d\u043d\u044f \u043a\u0435\u0448\u0443\nclient.clear_cache()\n```\n\n### \u041b\u043e\u0433\u0443\u0432\u0430\u043d\u043d\u044f\n\n```python\nimport logging\n\n# \u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u043b\u043e\u0433\u0443\u0432\u0430\u043d\u043d\u044f\nlogging.basicConfig(level=logging.INFO)\nlogger = logging.getLogger(\"odam_sdk\")\n\n# \u041b\u043e\u0433\u0443\u0432\u0430\u043d\u043d\u044f \u0437\u0430\u043f\u0438\u0442\u0456\u0432 \u0442\u0430 \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u0435\u0439\nclient = ODAMClient(\n api_key=\"your_key\",\n log_requests=True,\n log_responses=True\n)\n```\n\n## \ud83c\udfe5 \u041c\u0435\u0434\u0438\u0447\u043d\u0456 \u043c\u043e\u0436\u043b\u0438\u0432\u043e\u0441\u0442\u0456\n\n### \u041c\u0435\u0434\u0438\u0447\u043d\u0456 \u0441\u0443\u0442\u043d\u043e\u0441\u0442\u0456\n\n```python\n# \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0435 \u0432\u0438\u0442\u044f\u0433\u0443\u0432\u0430\u043d\u043d\u044f \u043c\u0435\u0434\u0438\u0447\u043d\u0438\u0445 \u0441\u0443\u0442\u043d\u043e\u0441\u0442\u0435\u0439\nmedical_text = \"\"\"\n\u041f\u0430\u0446\u0456\u0454\u043d\u0442: \u0406\u0432\u0430\u043d \u041f\u0435\u0442\u0440\u0435\u043d\u043a\u043e, 45 \u0440\u043e\u043a\u0456\u0432\n\u0414\u0456\u0430\u0433\u043d\u043e\u0437: \u0413\u0456\u043f\u0435\u0440\u0442\u043e\u043d\u0456\u044f\n\u041b\u0456\u043a\u0443\u0432\u0430\u043d\u043d\u044f: \u0415\u043d\u0430\u043b\u0430\u043f\u0440\u0438\u043b 10\u043c\u0433 1 \u0440\u0430\u0437 \u043d\u0430 \u0434\u0435\u043d\u044c\n\u0410\u043b\u0435\u0440\u0433\u0456\u0457: \u041f\u0435\u043d\u0456\u0446\u0438\u043b\u0456\u043d\n\"\"\"\n\nentities = client.extract_entities(\n text=medical_text,\n medical_mode=True\n)\n\nfor entity in entities.entities:\n if entity.type in [\"Person\", \"Medication\", \"Condition\"]:\n print(f\"\u041c\u0435\u0434\u0438\u0447\u043d\u0430 \u0441\u0443\u0442\u043d\u0456\u0441\u0442\u044c: {entity.text} ({entity.type})\")\n```\n\n### Medical Safety\n\n```python\n# \u0411\u0435\u0437\u043f\u0435\u0447\u043d\u0430 \u043c\u0435\u0434\u0438\u0447\u043d\u0430 \u043e\u0431\u0440\u043e\u0431\u043a\u0430\nresponse = client.chat(\n message=\"\u0423 \u043c\u0435\u043d\u0435 \u0431\u0456\u043b\u044c \u0443 \u0433\u0440\u0443\u0434\u044f\u0445\",\n user_id=\"patient_123\",\n medical_safety=True,\n enterprise_v7=True\n)\n\n# \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u0434\u043e\u0434\u0430\u0441\u0442\u044c \u043c\u0435\u0434\u0438\u0447\u043d\u0456 \u043f\u043e\u043f\u0435\u0440\u0435\u0434\u0436\u0435\u043d\u043d\u044f\nprint(response.response)\n```\n\n## \ud83c\udf10 \u0411\u0430\u0433\u0430\u0442\u043e\u043c\u043e\u0432\u043d\u0456\u0441\u0442\u044c\n\n### \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0435 \u0432\u0438\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u043c\u043e\u0432\u0438\n\n```python\n# \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0435 \u0432\u0438\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u043c\u043e\u0432\u0438\nresponse = client.chat(\n message=\"Hello, how are you?\", # \u0410\u043d\u0433\u043b\u0456\u0439\u0441\u044c\u043a\u0430\n user_id=\"user_123\"\n)\nprint(f\"\u0412\u0438\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u043c\u043e\u0432\u0430: {response.language_info.language}\")\n\nresponse = client.chat(\n message=\"\u041f\u0440\u0438\u0432\u0456\u0442, \u044f\u043a \u0441\u043f\u0440\u0430\u0432\u0438?\", # \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430\n user_id=\"user_123\"\n)\nprint(f\"\u0412\u0438\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u043c\u043e\u0432\u0430: {response.language_info.language}\")\n```\n\n### \u042f\u0432\u043d\u0435 \u0432\u043a\u0430\u0437\u0430\u043d\u043d\u044f \u043c\u043e\u0432\u0438\n\n```python\nfrom odam_sdk import Language\n\nresponse = client.chat(\n message=\"Bonjour, comment allez-vous?\",\n user_id=\"user_123\",\n language=Language.FRENCH\n)\n```\n\n## \ud83d\ude80 Enterprise V7\n\n### Memory Enforcement\n\n```python\n# \u041f\u0440\u0438\u043c\u0443\u0441\u043e\u0432\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u0456\u0437\u0430\u0446\u0456\u044f\nresponse = client.chat(\n message=\"\u041d\u0430\u0433\u0430\u0434\u0430\u0439 \u043c\u0435\u043d\u0456 \u043f\u0440\u043e \u043c\u043e\u0457 \u0443\u043f\u043e\u0434\u043e\u0431\u0430\u043d\u043d\u044f\",\n user_id=\"user_123\",\n memory_enforcement=True,\n enterprise_v7=True\n)\n\nprint(f\"\u0412\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u043d\u044f \u043f\u0430\u043c'\u044f\u0442\u0456: {response.v7_metrics.memory_utilization_score:.2%}\")\n```\n\n### Senior Fallback\n\n```python\n# \u041f\u0440\u0438\u043c\u0443\u0441\u043e\u0432\u0430 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0456\u044f \u0441\u0443\u0442\u043d\u043e\u0441\u0442\u0435\u0439\nresponse = client.chat(\n message=\"\u042f \u0431\u0430\u0447\u0443 \u043b\u0456\u043a\u0430\u0440\u044f\",\n user_id=\"user_123\",\n fallback_enabled=True,\n enterprise_v7=True\n)\n\nprint(f\"\u0412\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u043e fallback: {response.v7_metrics.fallback_used}\")\n```\n\n## \ud83d\udcca \u041c\u043e\u043d\u0456\u0442\u043e\u0440\u0438\u043d\u0433 \u0442\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u0438\n\n### Health Check\n\n```python\n# \u041f\u0435\u0440\u0435\u0432\u0456\u0440\u043a\u0430 \u0437\u0434\u043e\u0440\u043e\u0432'\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0438\nhealth = client.health_check()\nprint(f\"\u0421\u0442\u0430\u0442\u0443\u0441: {health.status}\")\nprint(f\"\u0412\u0435\u0440\u0441\u0456\u044f: {health.version}\")\nprint(f\"Uptime: {health.uptime:.2f} \u0441\u0435\u043a\u0443\u043d\u0434\")\n```\n\n### \u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0456\n\n```python\nresponse = client.chat(\"\u041f\u0440\u0438\u0432\u0456\u0442!\", \"user_123\")\n\nprint(f\"\u0427\u0430\u0441 \u043e\u0431\u0440\u043e\u0431\u043a\u0438: {response.processing_time:.3f}\u0441\")\nprint(f\"\u041f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u0456\u0437\u0430\u0446\u0456\u044f: {response.personalization_score:.2%}\")\nprint(f\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0438 \u043f\u043e\u0448\u0443\u043a\u0443: {response.search_results}\")\n```\n\n## \ud83d\udd12 \u0411\u0435\u0437\u043f\u0435\u043a\u0430\n\n### \u0412\u0430\u043b\u0456\u0434\u0430\u0446\u0456\u044f API \u043a\u043b\u044e\u0447\u0430\n\n```python\nfrom odam_sdk import validate_api_key\n\n# \u041f\u0435\u0440\u0435\u0432\u0456\u0440\u043a\u0430 API \u043a\u043b\u044e\u0447\u0430\nif validate_api_key(\"your_api_key\"):\n print(\"API \u043a\u043b\u044e\u0447 \u0432\u0430\u043b\u0456\u0434\u043d\u0438\u0439\")\nelse:\n print(\"API \u043a\u043b\u044e\u0447 \u043d\u0435\u0432\u0430\u043b\u0456\u0434\u043d\u0438\u0439\")\n```\n\n### \u0411\u0435\u0437\u043f\u0435\u0447\u043d\u0435 \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u043d\u043d\u044f\n\n```python\nimport os\n\n# \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u0438\u0439 \u0441\u043f\u043e\u0441\u0456\u0431 \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u043d\u043d\u044f API \u043a\u043b\u044e\u0447\u0430\napi_key = os.getenv(\"ODAM_API_KEY\")\nclient = ODAMClient(api_key=api_key)\n```\n\n## \ud83e\uddea \u0422\u0435\u0441\u0442\u0443\u0432\u0430\u043d\u043d\u044f\n\n### Unit \u0442\u0435\u0441\u0442\u0438\n\n```python\nimport pytest\nfrom unittest.mock import Mock\nfrom odam_sdk import ODAMClient\n\ndef test_chat_response():\n # \u041c\u043e\u043a \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u0456\n mock_response = {\n \"response\": \"\u041f\u0440\u0438\u0432\u0456\u0442! \u042f\u043a \u0441\u043f\u0440\u0430\u0432\u0438?\",\n \"user_id\": \"user_123\",\n \"processing_time\": 0.1,\n \"language_info\": {\"language\": \"uk\", \"confidence\": 0.99},\n \"entities\": [],\n \"memory_stats\": {\"memories_found\": 0, \"memories_created\": 1},\n \"search_results\": {\"vector_results\": 0, \"bm25_results\": 0, \"graph_results\": 0},\n \"personalization_score\": 0.5,\n \"timestamp\": \"2024-01-01T00:00:00Z\"\n }\n \n # \u0422\u0435\u0441\u0442\u0443\u0432\u0430\u043d\u043d\u044f\n client = ODAMClient(api_key=\"test_key\")\n client._make_request = Mock(return_value=mock_response)\n \n response = client.chat(\"\u041f\u0440\u0438\u0432\u0456\u0442!\", \"user_123\")\n assert response.response == \"\u041f\u0440\u0438\u0432\u0456\u0442! \u042f\u043a \u0441\u043f\u0440\u0430\u0432\u0438?\"\n assert response.user_id == \"user_123\"\n```\n\n## \ud83d\udcd6 \u041f\u043e\u0432\u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0456\u044f\n\n- \ud83d\udcda [API Reference](https://docs.odam.dev/api)\n- \ud83d\ude80 [Quick Start Guide](https://docs.odam.dev/quickstart)\n- \ud83c\udfe5 [Medical NLP Guide](https://docs.odam.dev/medical)\n- \ud83c\udf10 [Multilingual Support](https://docs.odam.dev/multilingual)\n- \ud83d\ude80 [Enterprise V7 Features](https://docs.odam.dev/enterprise)\n- \ud83d\udd27 [Configuration Guide](https://docs.odam.dev/configuration)\n- \ud83e\uddea [Testing Guide](https://docs.odam.dev/testing)\n- \ud83d\udcca [Analytics & Monitoring](https://docs.odam.dev/analytics)\n\n## \ud83e\udd1d \u041f\u0456\u0434\u0442\u0440\u0438\u043c\u043a\u0430\n\n- \ud83d\udce7 Email: support@odam.dev\n- \ud83d\udcac Discord: [ODAM Community](https://discord.gg/odam)\n- \ud83d\udcd6 Documentation: [docs.odam.dev](https://docs.odam.dev)\n- \ud83d\udc1b Issues: [GitHub Issues](https://github.com/odam-ai/odam-sdk-python/issues)\n- \ud83d\udca1 Discussions: [GitHub Discussions](https://github.com/odam-ai/odam-sdk-python/discussions)\n\n## \ud83d\udcc4 \u041b\u0456\u0446\u0435\u043d\u0437\u0456\u044f\n\n\u0426\u0435\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043b\u0456\u0446\u0435\u043d\u0437\u043e\u0432\u0430\u043d\u043e \u043f\u0456\u0434 MIT License - \u0434\u0438\u0432\u0456\u0442\u044c\u0441\u044f \u0444\u0430\u0439\u043b [LICENSE](LICENSE) \u0434\u043b\u044f \u0434\u0435\u0442\u0430\u043b\u0435\u0439.\n\n## \ud83d\ude4f \u041f\u043e\u0434\u044f\u043a\u0438\n\n\u0414\u044f\u043a\u0443\u0454\u043c\u043e \u0432\u0441\u0456\u043c \u0441\u043f\u0456\u043b\u044c\u043d\u043e\u0442\u0456 ODAM \u0437\u0430 \u0432\u043d\u0435\u0441\u043e\u043a \u0443 \u0440\u043e\u0437\u0432\u0438\u0442\u043e\u043a \u0446\u044c\u043e\u0433\u043e SDK!\n\n---\n\n**\ud83e\udde0 ODAM V4 - \u041c\u0430\u0439\u0431\u0443\u0442\u043d\u0454 \u0448\u0442\u0443\u0447\u043d\u043e\u0433\u043e \u0456\u043d\u0442\u0435\u043b\u0435\u043a\u0442\u0443 \u0432\u0436\u0435 \u0442\u0443\u0442!** \n",
"bugtrack_url": null,
"license": "MIT",
"summary": "\u041e\u0444\u0456\u0446\u0456\u0439\u043d\u0438\u0439 Python SDK \u0434\u043b\u044f \u0456\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0456\u0457 \u0437 ODAM V4 - \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u044e \u0448\u0442\u0443\u0447\u043d\u043e\u0433\u043e \u0456\u043d\u0442\u0435\u043b\u0435\u043a\u0442\u0443 \u0437 \u043b\u044e\u0434\u0441\u044c\u043a\u043e\u044e \u043f\u0430\u043c'\u044f\u0442\u0442\u044e",
"version": "2.0.0",
"project_urls": {
"Bug Tracker": "https://api.odam.dev/issues",
"Documentation": "https://docs.odam.dev",
"Homepage": "https://api.odam.dev",
"Source Code": "https://api.odam.dev",
"Website": "https://odam.dev"
},
"split_keywords": [
"ai",
" artificial-intelligence",
" chatbot",
" nlp",
" natural-language-processing",
" memory",
" conversation",
" chat",
" api",
" sdk",
" machine-learning",
" deep-learning",
" neural-networks",
" language-model",
" text-generation",
" entity-extraction",
" knowledge-graph",
" semantic-search",
" vector-search",
" embeddings",
" medical-nlp",
" healthcare",
" multilingual",
" ukrainian",
" enterprise",
" saas",
" cloud",
" rest-api",
" fastapi",
" python",
" typescript",
" javascript",
" java",
" dotnet"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "6c9e8454cf9a92a1428d46cb4ebaa50673da56f5d7b4f5176d7421aa9f22c639",
"md5": "f014dfb7a42eedb9f775deab06be8d3e",
"sha256": "59a2bc189c221b40bc4dde7b55ae93aa8f135ab6c588258e17ff076b38585326"
},
"downloads": -1,
"filename": "odam_sdk-2.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "f014dfb7a42eedb9f775deab06be8d3e",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 28910,
"upload_time": "2025-08-06T21:34:18",
"upload_time_iso_8601": "2025-08-06T21:34:18.015521Z",
"url": "https://files.pythonhosted.org/packages/6c/9e/8454cf9a92a1428d46cb4ebaa50673da56f5d7b4f5176d7421aa9f22c639/odam_sdk-2.0.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2c9df1892bf93bc05b58056792218714d88a803fd6621c421e2ebc488f663a7e",
"md5": "3ce3bd2e76e2c17ce9f4dcaa681be525",
"sha256": "bd4a7cd1a6ed16ad681619c4f33adbc6039bf1463e6a86d31e82888a422180e7"
},
"downloads": -1,
"filename": "odam_sdk-2.0.0.tar.gz",
"has_sig": false,
"md5_digest": "3ce3bd2e76e2c17ce9f4dcaa681be525",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 33486,
"upload_time": "2025-08-06T21:34:19",
"upload_time_iso_8601": "2025-08-06T21:34:19.808883Z",
"url": "https://files.pythonhosted.org/packages/2c/9d/f1892bf93bc05b58056792218714d88a803fd6621c421e2ebc488f663a7e/odam_sdk-2.0.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-06 21:34:19",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "odam-sdk"
}