Name | meridian-sdk JSON |
Version |
2.0.2
JSON |
| download |
home_page | None |
Summary | Python SDK for Meridian AI Search API - Enterprise search across connected data sources |
upload_time | 2025-10-12 00:55:06 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.8 |
license | MIT |
keywords |
meridian
api
sdk
search
ai
enterprise
rag
|
VCS |
 |
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# Meridian SDK for Python
Official Python SDK for the [Meridian AI Search API](https://www.trymeridian.dev) - Enterprise search across connected data sources.
## Features
- **AI-Powered Search** - Natural language search across SharePoint, Google Drive, Gmail, Outlook, Slack, GitHub, and more
- **Multiple Output Formats** - JSON, CSV, strings array, or markdown
- **Async/Await Support** - Built for high-performance applications
- **Automatic Retries** - Exponential backoff for failed requests
- **Usage Tracking** - Monitor API usage and costs
- **Type Hints** - Complete type annotations for better IDE support
- **Rate Limit Handling** - Automatic retry on rate limits
## Installation
```bash
pip install meridian-sdk
```
## Quick Start
```python
import asyncio
from meridian_sdk import MeridianAPI
async def main():
# Initialize client
async with MeridianAPI(api_key="kt_your_api_key_here") as client:
# Search
response = await client.search("What are our Q4 sales numbers?")
# Print results
for result in response.results:
print(f" {result.title}")
print(f" {result.snippet}")
print(f" Relevance: {result.relevance_score:.2%}\n")
asyncio.run(main())
```
## Authentication
Get your API key from the [Meridian Dashboard](https://dashboard.trymeridian.dev) and set it as an environment variable:
```bash
export MERIDIAN_API_KEY="kt_your_api_key_here"
```
Then use it in your code:
```python
import os
from meridian_sdk import MeridianAPI
api_key = os.getenv("MERIDIAN_API_KEY")
client = MeridianAPI(api_key=api_key)
```
## Core Features
### Standard Search
Search across all your connected data sources with natural language:
```python
from meridian_sdk import MeridianAPI, SearchFilters, SearchOptions
async with MeridianAPI(api_key=api_key) as client:
# Simple search
response = await client.search("project Apollo status")
# Search with filters
filters = SearchFilters(
sources=["google_drive", "sharepoint"],
file_types=["PDF", "DOCUMENT"],
date_range=(30, 0) # Past 30 days
)
options = SearchOptions(
max_results=20,
include_sources=True,
use_entity_filtering=True # AI-powered entity filtering
)
response = await client.search(
query="Q4 financial reports",
filters=filters,
options=options
)
print(f"Found {len(response.results)} results from {response.sources_count} sources")
```
### Summaries Search
Search pre-generated daily summaries for emails, messages, or document changes:
```python
# Get email summaries about a specific topic
response = await client.search_summaries(
query="Deloitte project communications",
summary_type="EMAIL_SUMMARIES",
date_range=(7, 0), # Past week
use_semantic_search=True
)
for summary in response.summaries:
print(f"📧 {summary.generated_at}")
print(f" {summary.summary_text}")
print(f" References {len(summary.referenced_ids)} emails\n")
# Get all message summaries chronologically
response = await client.search_summaries(
query="",
summary_type="MESSAGE_SUMMARIES",
date_range=(7, 0),
use_semantic_search=False # Chronological mode
)
```
### Full Document Context
Retrieve complete document text after finding relevant chunks:
```python
# First search for relevant documents
search_response = await client.search("API documentation")
# Get full context for the first result
if search_response.results:
content_id = search_response.results[0].content_id
context = await client.get_context(content_id, max_chars=50000)
print(f" {context.title}")
print(f" Size: {context.size_chars:,} characters")
print(f" Truncated: {context.was_truncated}")
print(f"\n{context.full_text}")
```
### Output Formats
Get results in different formats for various use cases:
```python
# JSON (default) - structured data
response = await client.search("revenue", output_format="json")
# CSV - for spreadsheets
csv_data = await client.search("revenue", output_format="csv")
with open("results.csv", "w") as f:
f.write(csv_data)
# Strings Array - simple list of snippets
snippets = await client.search("revenue", output_format="strings")
for snippet in snippets:
print(snippet)
# Markdown - formatted with citations
markdown = await client.search("revenue", output_format="markdown")
print(markdown)
```
### Usage & Analytics
Monitor API usage and costs:
```python
# Get monthly usage
usage = await client.get_usage(period="month")
print(f"Total requests: {usage.total_requests}")
print(f"Total cost: ${usage.total_cost:.4f}")
print(f"Current tier: {usage.current_tier}")
# Daily breakdown
for day in usage.daily_breakdown:
print(f"{day.date}: {day.requests} requests, ${day.cost:.4f}")
# Check rate limits
limits = await client.get_limits()
print(f"Remaining today: {limits.remaining_day}/{limits.requests_per_day}")
print(f"Remaining this minute: {limits.remaining_minute}/{limits.requests_per_minute}")
```
### Data Sources
List connected data sources:
```python
sources = await client.list_sources()
print(f"Connected sources: {sources.total_connected}")
for source in sources.sources:
status = "✅" if source.is_connected else "❌"
print(f"{status} {source.name} ({source.type})")
```
### Health Check
Check API status:
```python
health = await client.health_check()
print(f"API Status: {health.status}")
print(f"Version: {health.version}")
for service_name, service in health.services.items():
print(f" {service_name}: {service.status}")
```
## Advanced Examples
### Batch Processing
Process multiple searches efficiently:
```python
queries = [
"Q4 sales report",
"Employee handbook",
"Product roadmap"
]
async with MeridianAPI(api_key=api_key) as client:
tasks = [client.search(query) for query in queries]
responses = await asyncio.gather(*tasks)
for query, response in zip(queries, responses):
print(f"Query: {query}")
print(f"Results: {len(response.results)}\n")
```
### Error Handling
Handle errors gracefully:
```python
from meridian_sdk import (
MeridianAPI, AuthenticationError, RateLimitError,
ValidationError, ServerError
)
async with MeridianAPI(api_key=api_key) as client:
try:
response = await client.search("test query")
except AuthenticationError:
print("Invalid API key")
except RateLimitError as e:
print(f"Rate limit exceeded. Retry after {e.retry_after}s")
except ValidationError as e:
print(f"Validation error: {e.message}")
except ServerError as e:
print(f"Server error: {e.status_code}")
```
### Context Manager vs Manual Management
```python
# Recommended: Use context manager (auto cleanup)
async with MeridianAPI(api_key=api_key) as client:
response = await client.search("query")
# Manual management (if needed)
client = MeridianAPI(api_key=api_key)
await client.__aenter__()
try:
response = await client.search("query")
finally:
await client.__aexit__(None, None, None)
```
## Configuration
### Environment Variables
```bash
# API Key (required)
export MERIDIAN_API_KEY="kt_your_api_key_here"
# Base URL (optional, defaults to production)
export MERIDIAN_BASE_URL="https://dashboard.trymeridian.dev"
```
### Client Options
```python
client = MeridianAPI(
api_key="kt_...",
base_url="https://dashboard.trymeridian.dev", # Custom endpoint
timeout=60.0, # Request timeout in seconds
max_retries=3 # Maximum retry attempts
)
```
## API Reference
### MeridianAPI
Main client class for interacting with the API.
**Methods:**
- `search(query, output_format, filters, options)` - Execute search
- `search_summaries(query, summary_type, date_range, use_semantic_search, output_format)` - Search summaries
- `get_context(content_id, max_chars)` - Get full document
- `get_usage(period, start_date, end_date)` - Get usage stats
- `get_limits()` - Get rate limits
- `health_check()` - Check API health
- `list_sources()` - List data sources
### Models
**SearchFilters:**
- `sources` - List of source names
- `file_types` - List of file types
- `date_range` - (days_back, days_forward) tuple
- `entities` - List of entity names
**SearchOptions:**
- `max_results` - Maximum results (1-100)
- `include_sources` - Include source documents
- `use_entity_filtering` - Enable AI entity filtering
- `search_type` - "standard" or "summaries"
See full API documentation at [trymeridian.dev/docs/api](https://www.trymeridian.dev/docs/api)
## Support
- **Email:** kn@trymeridian.dev
- **Documentation:** [trymeridian.dev/docs/api](https://www.trymeridian.dev/docs/api)
## License
MIT License - see LICENSE file for details
## Built by Meridian
Enterprise AI search that actually works.
[Website](https://www.trymeridian.dev) | [Dashboard](https://dashboard.trymeridian.dev) | [Docs](https://www.trymeridian.dev/docs/api)
Raw data
{
"_id": null,
"home_page": null,
"name": "meridian-sdk",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "meridian, api, sdk, search, ai, enterprise, rag",
"author": null,
"author_email": "Meridian Team <kn@trymeridian.dev>",
"download_url": "https://files.pythonhosted.org/packages/08/51/2711e25deb14cba32bdbb815355822e6cb9dac45b844016aa8ec2929525f/meridian_sdk-2.0.2.tar.gz",
"platform": null,
"description": "# Meridian SDK for Python\n\nOfficial Python SDK for the [Meridian AI Search API](https://www.trymeridian.dev) - Enterprise search across connected data sources.\n\n## Features\n\n- **AI-Powered Search** - Natural language search across SharePoint, Google Drive, Gmail, Outlook, Slack, GitHub, and more\n- **Multiple Output Formats** - JSON, CSV, strings array, or markdown\n- **Async/Await Support** - Built for high-performance applications\n- **Automatic Retries** - Exponential backoff for failed requests\n- **Usage Tracking** - Monitor API usage and costs\n- **Type Hints** - Complete type annotations for better IDE support\n- **Rate Limit Handling** - Automatic retry on rate limits\n\n## Installation\n\n```bash\npip install meridian-sdk\n```\n\n## Quick Start\n\n```python\nimport asyncio\nfrom meridian_sdk import MeridianAPI\n\nasync def main():\n # Initialize client\n async with MeridianAPI(api_key=\"kt_your_api_key_here\") as client:\n\n # Search\n response = await client.search(\"What are our Q4 sales numbers?\")\n\n # Print results\n for result in response.results:\n print(f\" {result.title}\")\n print(f\" {result.snippet}\")\n print(f\" Relevance: {result.relevance_score:.2%}\\n\")\n\nasyncio.run(main())\n```\n\n## Authentication\n\nGet your API key from the [Meridian Dashboard](https://dashboard.trymeridian.dev) and set it as an environment variable:\n\n```bash\nexport MERIDIAN_API_KEY=\"kt_your_api_key_here\"\n```\n\nThen use it in your code:\n\n```python\nimport os\nfrom meridian_sdk import MeridianAPI\n\napi_key = os.getenv(\"MERIDIAN_API_KEY\")\nclient = MeridianAPI(api_key=api_key)\n```\n\n## Core Features\n\n### Standard Search\n\nSearch across all your connected data sources with natural language:\n\n```python\nfrom meridian_sdk import MeridianAPI, SearchFilters, SearchOptions\n\nasync with MeridianAPI(api_key=api_key) as client:\n # Simple search\n response = await client.search(\"project Apollo status\")\n\n # Search with filters\n filters = SearchFilters(\n sources=[\"google_drive\", \"sharepoint\"],\n file_types=[\"PDF\", \"DOCUMENT\"],\n date_range=(30, 0) # Past 30 days\n )\n\n options = SearchOptions(\n max_results=20,\n include_sources=True,\n use_entity_filtering=True # AI-powered entity filtering\n )\n\n response = await client.search(\n query=\"Q4 financial reports\",\n filters=filters,\n options=options\n )\n\n print(f\"Found {len(response.results)} results from {response.sources_count} sources\")\n```\n\n### Summaries Search\n\nSearch pre-generated daily summaries for emails, messages, or document changes:\n\n```python\n# Get email summaries about a specific topic\nresponse = await client.search_summaries(\n query=\"Deloitte project communications\",\n summary_type=\"EMAIL_SUMMARIES\",\n date_range=(7, 0), # Past week\n use_semantic_search=True\n)\n\nfor summary in response.summaries:\n print(f\"\ud83d\udce7 {summary.generated_at}\")\n print(f\" {summary.summary_text}\")\n print(f\" References {len(summary.referenced_ids)} emails\\n\")\n\n# Get all message summaries chronologically\nresponse = await client.search_summaries(\n query=\"\",\n summary_type=\"MESSAGE_SUMMARIES\",\n date_range=(7, 0),\n use_semantic_search=False # Chronological mode\n)\n```\n\n### Full Document Context\n\nRetrieve complete document text after finding relevant chunks:\n\n```python\n# First search for relevant documents\nsearch_response = await client.search(\"API documentation\")\n\n# Get full context for the first result\nif search_response.results:\n content_id = search_response.results[0].content_id\n context = await client.get_context(content_id, max_chars=50000)\n\n print(f\" {context.title}\")\n print(f\" Size: {context.size_chars:,} characters\")\n print(f\" Truncated: {context.was_truncated}\")\n print(f\"\\n{context.full_text}\")\n```\n\n### Output Formats\n\nGet results in different formats for various use cases:\n\n```python\n# JSON (default) - structured data\nresponse = await client.search(\"revenue\", output_format=\"json\")\n\n# CSV - for spreadsheets\ncsv_data = await client.search(\"revenue\", output_format=\"csv\")\nwith open(\"results.csv\", \"w\") as f:\n f.write(csv_data)\n\n# Strings Array - simple list of snippets\nsnippets = await client.search(\"revenue\", output_format=\"strings\")\nfor snippet in snippets:\n print(snippet)\n\n# Markdown - formatted with citations\nmarkdown = await client.search(\"revenue\", output_format=\"markdown\")\nprint(markdown)\n```\n\n### Usage & Analytics\n\nMonitor API usage and costs:\n\n```python\n# Get monthly usage\nusage = await client.get_usage(period=\"month\")\nprint(f\"Total requests: {usage.total_requests}\")\nprint(f\"Total cost: ${usage.total_cost:.4f}\")\nprint(f\"Current tier: {usage.current_tier}\")\n\n# Daily breakdown\nfor day in usage.daily_breakdown:\n print(f\"{day.date}: {day.requests} requests, ${day.cost:.4f}\")\n\n# Check rate limits\nlimits = await client.get_limits()\nprint(f\"Remaining today: {limits.remaining_day}/{limits.requests_per_day}\")\nprint(f\"Remaining this minute: {limits.remaining_minute}/{limits.requests_per_minute}\")\n```\n\n### Data Sources\n\nList connected data sources:\n\n```python\nsources = await client.list_sources()\nprint(f\"Connected sources: {sources.total_connected}\")\n\nfor source in sources.sources:\n status = \"\u2705\" if source.is_connected else \"\u274c\"\n print(f\"{status} {source.name} ({source.type})\")\n```\n\n### Health Check\n\nCheck API status:\n\n```python\nhealth = await client.health_check()\nprint(f\"API Status: {health.status}\")\nprint(f\"Version: {health.version}\")\n\nfor service_name, service in health.services.items():\n print(f\" {service_name}: {service.status}\")\n```\n\n## Advanced Examples\n\n### Batch Processing\n\nProcess multiple searches efficiently:\n\n```python\nqueries = [\n \"Q4 sales report\",\n \"Employee handbook\",\n \"Product roadmap\"\n]\n\nasync with MeridianAPI(api_key=api_key) as client:\n tasks = [client.search(query) for query in queries]\n responses = await asyncio.gather(*tasks)\n\n for query, response in zip(queries, responses):\n print(f\"Query: {query}\")\n print(f\"Results: {len(response.results)}\\n\")\n```\n\n### Error Handling\n\nHandle errors gracefully:\n\n```python\nfrom meridian_sdk import (\n MeridianAPI, AuthenticationError, RateLimitError,\n ValidationError, ServerError\n)\n\nasync with MeridianAPI(api_key=api_key) as client:\n try:\n response = await client.search(\"test query\")\n except AuthenticationError:\n print(\"Invalid API key\")\n except RateLimitError as e:\n print(f\"Rate limit exceeded. Retry after {e.retry_after}s\")\n except ValidationError as e:\n print(f\"Validation error: {e.message}\")\n except ServerError as e:\n print(f\"Server error: {e.status_code}\")\n```\n\n### Context Manager vs Manual Management\n\n```python\n# Recommended: Use context manager (auto cleanup)\nasync with MeridianAPI(api_key=api_key) as client:\n response = await client.search(\"query\")\n\n# Manual management (if needed)\nclient = MeridianAPI(api_key=api_key)\nawait client.__aenter__()\ntry:\n response = await client.search(\"query\")\nfinally:\n await client.__aexit__(None, None, None)\n```\n\n## Configuration\n\n### Environment Variables\n\n```bash\n# API Key (required)\nexport MERIDIAN_API_KEY=\"kt_your_api_key_here\"\n\n# Base URL (optional, defaults to production)\nexport MERIDIAN_BASE_URL=\"https://dashboard.trymeridian.dev\"\n```\n\n### Client Options\n\n```python\nclient = MeridianAPI(\n api_key=\"kt_...\",\n base_url=\"https://dashboard.trymeridian.dev\", # Custom endpoint\n timeout=60.0, # Request timeout in seconds\n max_retries=3 # Maximum retry attempts\n)\n```\n\n## API Reference\n\n### MeridianAPI\n\nMain client class for interacting with the API.\n\n**Methods:**\n- `search(query, output_format, filters, options)` - Execute search\n- `search_summaries(query, summary_type, date_range, use_semantic_search, output_format)` - Search summaries\n- `get_context(content_id, max_chars)` - Get full document\n- `get_usage(period, start_date, end_date)` - Get usage stats\n- `get_limits()` - Get rate limits\n- `health_check()` - Check API health\n- `list_sources()` - List data sources\n\n### Models\n\n**SearchFilters:**\n- `sources` - List of source names\n- `file_types` - List of file types\n- `date_range` - (days_back, days_forward) tuple\n- `entities` - List of entity names\n\n**SearchOptions:**\n- `max_results` - Maximum results (1-100)\n- `include_sources` - Include source documents\n- `use_entity_filtering` - Enable AI entity filtering\n- `search_type` - \"standard\" or \"summaries\"\n\nSee full API documentation at [trymeridian.dev/docs/api](https://www.trymeridian.dev/docs/api)\n\n## Support\n\n- **Email:** kn@trymeridian.dev\n- **Documentation:** [trymeridian.dev/docs/api](https://www.trymeridian.dev/docs/api)\n\n## License\n\nMIT License - see LICENSE file for details\n\n## Built by Meridian\n\nEnterprise AI search that actually works.\n\n[Website](https://www.trymeridian.dev) | [Dashboard](https://dashboard.trymeridian.dev) | [Docs](https://www.trymeridian.dev/docs/api)\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Python SDK for Meridian AI Search API - Enterprise search across connected data sources",
"version": "2.0.2",
"project_urls": {
"Documentation": "https://www.trymeridian.dev/docs",
"Homepage": "https://www.trymeridian.dev",
"Issues": "https://github.com/trymeridian/meridian-sdk/issues",
"Repository": "https://github.com/trymeridian/meridian-sdk"
},
"split_keywords": [
"meridian",
" api",
" sdk",
" search",
" ai",
" enterprise",
" rag"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "f9b7aa71e960c5fdb7ae7c723f9d394239b0c9c346819e9c6c8ade566b672b67",
"md5": "ee8a778b417d6ff86e84e97580c7e7f1",
"sha256": "96120a58604d400d12e69fd5d1e960cb88e363928b51c3bd8fbc739341e80a83"
},
"downloads": -1,
"filename": "meridian_sdk-2.0.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "ee8a778b417d6ff86e84e97580c7e7f1",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 11537,
"upload_time": "2025-10-12T00:55:05",
"upload_time_iso_8601": "2025-10-12T00:55:05.140924Z",
"url": "https://files.pythonhosted.org/packages/f9/b7/aa71e960c5fdb7ae7c723f9d394239b0c9c346819e9c6c8ade566b672b67/meridian_sdk-2.0.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "08512711e25deb14cba32bdbb815355822e6cb9dac45b844016aa8ec2929525f",
"md5": "08d0c98c24b4a32e44f0b70df0353994",
"sha256": "2a61a07afa81a851864a72e124d911fa4ccebdd7647c29d5ed9e95940c1e8903"
},
"downloads": -1,
"filename": "meridian_sdk-2.0.2.tar.gz",
"has_sig": false,
"md5_digest": "08d0c98c24b4a32e44f0b70df0353994",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 13065,
"upload_time": "2025-10-12T00:55:06",
"upload_time_iso_8601": "2025-10-12T00:55:06.577714Z",
"url": "https://files.pythonhosted.org/packages/08/51/2711e25deb14cba32bdbb815355822e6cb9dac45b844016aa8ec2929525f/meridian_sdk-2.0.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-12 00:55:06",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "trymeridian",
"github_project": "meridian-sdk",
"github_not_found": true,
"lcname": "meridian-sdk"
}