meridian-sdk


Namemeridian-sdk JSON
Version 2.0.2 PyPI version JSON
download
home_pageNone
SummaryPython SDK for Meridian AI Search API - Enterprise search across connected data sources
upload_time2025-10-12 00:55:06
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT
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"
}
        
Elapsed time: 1.65776s