"""Octen Python SDK

A Python SDK for accessing the Octen API, providing search, embedding,
and LLM chat capabilities.

Basic usage::

    from octen import Octen

    with Octen(api_key="your-api-key") as client:
        # Search
        response = client.search.search("Python", count=5)
        for result in response.results:
            print(result['title'])

        # Embedding
        embedding = client.embedding.create("Hello")
        vector = embedding.get_first_embedding()

        # Chat
        from octen import ChatMessage
        response = client.chat.create(
            model="openai/gpt-5.4",
            messages=[ChatMessage(role="user", content="Hello!")],
        )
        print(response.text)
"""

from .version import __version__, __author__, __license__
from .client import Octen
from .async_client import AsyncOcten

# Core exceptions
from .core.exceptions import (
    OctenError,
    OctenAPIError,
    OctenTimeoutError,
    OctenConnectionError,
    OctenValidationError,
    OctenRateLimitError,
    OctenAuthenticationError,
    OctenStreamError,
)

# Search & embedding models
from .models.search import (
    HighlightOptions,
    FullContentOptions,
    SearchRequest,
    SearchResponse,
)
from .models.embedding import (
    EmbeddingRequest,
    EmbeddingResponse,
)

# Chat models
from .models.chat import (
    ChatMessage,
    WebSearchOptions,
    ChatCompletion,
    StreamEvent,
    Usage,
)

__all__ = [
    # Version info
    "__version__",
    "__author__",
    "__license__",
    # Clients
    "Octen",
    "AsyncOcten",
    # Exceptions
    "OctenError",
    "OctenAPIError",
    "OctenTimeoutError",
    "OctenConnectionError",
    "OctenValidationError",
    "OctenRateLimitError",
    "OctenAuthenticationError",
    "OctenStreamError",
    # Search & embedding models
    "HighlightOptions",
    "FullContentOptions",
    "SearchRequest",
    "SearchResponse",
    "EmbeddingRequest",
    "EmbeddingResponse",
    # Chat models
    "ChatMessage",
    "WebSearchOptions",
    "ChatCompletion",
    "StreamEvent",
    "Usage",
]
