apala-api


Nameapala-api JSON
Version 1.0.2 PyPI version JSON
download
home_pageNone
SummaryPython SDK for Phoenix Message Analysis Services - Loan/Financial AI API Client
upload_time2025-10-23 01:47:14
maintainerNone
docs_urlNone
authorApala Cap
requires_python>=3.9
licenseNone
keywords ai api financial loans messaging phoenix
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Apala API - Python SDK

[![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
[![Type Hints](https://img.shields.io/badge/type--hints-yes-brightgreen)](https://docs.python.org/3/library/typing.html)


## ๐Ÿš€ Quick Start

### Installation

```bash
# Install the package
pip install apala-api

# Or install from source with development tools
git clone <repository-url>
cd apala_api
pip install -e ".[dev]"
```

### Basic Usage

```python
from apala_client import ApalaClient, Message, MessageFeedback

# Initialize client
client = ApalaClient(
    api_key="your-api-key", 
    base_url="https://your-server.com"
)

# Authenticate (automatic JWT token management)
client.authenticate()

# Create customer message history
messages = [
    Message(content="Hi, I need help with my loan application.", channel="EMAIL"),
    Message(content="What are the current interest rates?", channel="SMS"),
    Message(content="When will I hear back about approval?", channel="EMAIL")
]

# Create your candidate response
candidate = Message(
    content="Thank you for your inquiry! Our current rates start at 3.5% APR for qualified borrowers. We'll review your application and respond within 2 business days.",
    channel="EMAIL"
)

# Process messages through the AI system
response = client.message_process(
    message_history=messages,
    candidate_message=candidate,
    customer_id="550e8400-e29b-41d4-a716-446655440000",
    zip_code="90210",
    company_guid="550e8400-e29b-41d4-a716-446655440001"
)

print(f"Processed message ID: {response['candidate_message']['message_id']}")

# Submit feedback after customer interaction
feedback = MessageFeedback(
    original_message_id=response["candidate_message"]["message_id"],
    sent_message_content=response["candidate_message"]["content"],
    customer_responded=True,
    quality_score=85,
    time_to_respond_ms=1800000  # 30 minutes
)

feedback_result = client.submit_single_feedback(feedback)
print(f"Feedback submitted: {feedback_result['feedback_id']}")
```

## ๐ŸŽฏ Core Features

### โœ… **Type-Safe API**
- Full **TypedDict** responses with IDE autocomplete
- **mypy** integration catches errors at development time
- **No runtime surprises** - all response fields are typed

### โœ… **Complete Functionality**
- **Message Processing**: Analyze customer conversations and candidate responses
- **Message Optimization**: Enhance messages for maximum engagement
- **Feedback Tracking**: Monitor message performance and customer responses
- **Authentication**: Automatic JWT token management with refresh

### โœ… **Production Ready**
- **Multi-Python Support**: Python 3.9, 3.10, 3.11, 3.12
- **Comprehensive Testing**: Unit tests, integration tests, type checking
- **Error Handling**: Uses standard `requests` exceptions (no custom exceptions)
- **Validation**: Client-side validation of UUIDs, zip codes, channels

### โœ… **Developer Experience**
- **Interactive Demo**: Marimo notebook with complete workflow
- **Documentation**: Full Sphinx docs with examples
- **Code Quality**: Ruff formatting, mypy type checking, tox multi-version testing

## ๐Ÿ“– Documentation

### Authentication

The SDK uses a secure two-tier authentication system:

1. **API Key**: Your long-lived company credentials
2. **JWT Tokens**: Short-lived session tokens for API calls (auto-managed)

```python
# Authentication is automatic - just provide your API key
client = ApalaClient(api_key="your-api-key")
auth_response = client.authenticate()

# JWT tokens are automatically refreshed when needed
# No manual token management required!
```

### Message Processing Workflow

```python
# 1. Create message objects with validation
customer_messages = [
    Message(
        content="I'm interested in a home loan",
        channel="EMAIL",
        reply_or_not=False
    ),
    Message(
        content="What documents do I need?", 
        channel="SMS",
        reply_or_not=False
    )
]

# 2. Define your candidate response
candidate_response = Message(
    content="Great! For a home loan, you'll need: income verification, credit report, and bank statements. We offer competitive rates starting at 3.2% APR.",
    channel="EMAIL"
)

# 3. Process through AI system
result = client.message_process(
    message_history=customer_messages,
    candidate_message=candidate_response,
    customer_id="customer-uuid-here",
    zip_code="12345",
    company_guid="company-uuid-here"
)

# 4. Get typed response with IDE completion
message_id = result["candidate_message"]["message_id"]  # Type: str
company = result["company"]  # Type: str
customer = result["customer_id"]  # Type: str
```

### Message Optimization

Enhance your messages for better customer engagement:

```python
# Optimize your message for maximum engagement
optimization = client.optimize_message(
    message_history=customer_messages,
    candidate_message=candidate_response,
    customer_id="customer-uuid",
    zip_code="12345", 
    company_guid="company-uuid"
)

print(f"Original: {optimization['original_message']}")
print(f"Optimized: {optimization['optimized_message']}")
print(f"Recommended channel: {optimization['recommended_channel']}")
```

### Feedback Tracking

Monitor message performance and learn from customer interactions:

```python
# Track how customers respond to your messages
feedback = MessageFeedback(
    original_message_id="message-id-from-processing",
    sent_message_content="The actual message you sent",
    customer_responded=True,
    quality_score=88,  # 0-100 quality rating
    time_to_respond_ms=1200000  # 20 minutes in milliseconds
)

result = client.submit_single_feedback(feedback)
print(f"Feedback recorded with ID: {result['feedback_id']}")

# Or submit multiple feedback items at once
feedback_list = [(message1, feedback1), (message2, feedback2)]
results = client.message_feedback(feedback_list)
```

## ๐Ÿ”ง Configuration

### Environment Variables

Set these for production deployment:

```bash
# Required
export APALA_API_KEY="your-production-api-key"
export APALA_BASE_URL="https://your-phoenix-server.com"
export APALA_COMPANY_GUID="your-company-uuid"

# Optional
export APALA_CUSTOMER_ID="default-customer-uuid"  # For testing
```

### Client Configuration

```python
# Basic configuration
client = ApalaClient(
    api_key="your-key",
    base_url="https://api.yourcompany.com"
)

# Advanced usage with custom session
import requests
session = requests.Session()
session.timeout = 30  # Custom timeout
client = ApalaClient(api_key="your-key")
client._session = session
```

## ๐Ÿงช Testing & Development

### Setup

```bash
# Clone and install in development mode with uv
git clone <repository-url>
cd apala_api
uv sync --group dev
```

### Running Tests

```bash
# Run unit tests
uv run pytest tests/test_models.py tests/test_client.py -v

# Run with coverage
uv run pytest --cov=apala_client --cov-report=html

# Run integration tests (requires running server)
# In Fish shell:
env RUN_INTEGRATION_TESTS=1 APALA_API_KEY=test-key APALA_COMPANY_GUID=test-company-uuid uv run pytest tests/test_integration.py

# In Bash/Zsh:
export RUN_INTEGRATION_TESTS=1 APALA_API_KEY=test-key APALA_COMPANY_GUID=test-company-uuid
uv run pytest tests/test_integration.py
```

### Code Quality

```bash
# Static type checking
uv run mypy .

# Linting
uv run ruff check .

# Code formatting
uv run ruff format .
```

### Documentation

```bash
# Build HTML documentation
uv run sphinx-build -b html docs docs/_build/html

# Build with live reload (auto-refreshes on changes)
uv run sphinx-autobuild docs docs/_build/html --port 8001

# Clean build directory
uv run python -c "import shutil; shutil.rmtree('docs/_build', ignore_errors=True)"

# Check for broken links
uv run sphinx-build -b linkcheck docs docs/_build/linkcheck
```

### Multi-Python Testing

```bash
# Test across Python versions
uv run tox

# Test specific version
uv run tox -e py311
```

## ๐Ÿ“Š Interactive Demo

Try the complete workflow in an interactive notebook:

```bash
# Install notebook dependencies
pip install -e ".[notebook]"

# Run the interactive demo
cd notebooks
marimo run apala_demo.py
```

The demo covers:
- ๐Ÿ” Authentication setup
- ๐Ÿ“ค Message processing workflow  
- ๐ŸŽฏ Message optimization
- ๐Ÿ“Š Feedback submission
- โšก Error handling examples

## ๐Ÿ›ก๏ธ Error Handling

The SDK uses standard Python exceptions - no custom error types to learn:

```python
import requests
from apala_client import ApalaClient

client = ApalaClient(api_key="your-key")

try:
    # All SDK methods may raise requests exceptions
    response = client.message_process(...)
    
except requests.HTTPError as e:
    # HTTP errors (4xx, 5xx responses)
    print(f"HTTP {e.response.status_code}: {e}")
    
except requests.ConnectionError as e:
    # Network connectivity issues
    print(f"Connection failed: {e}")
    
except requests.Timeout as e:
    # Request timeout
    print(f"Request timed out: {e}")
    
except requests.RequestException as e:
    # Any other requests-related error
    print(f"Request error: {e}")
    
except ValueError as e:
    # Data validation errors (invalid UUIDs, etc.)
    print(f"Invalid data: {e}")
```

## ๐Ÿ” API Reference

### ApalaClient

Main client class for all API interactions.

#### Constructor
```python
ApalaClient(api_key: str, base_url: str = "http://localhost:4000")
```

#### Methods

| Method | Return Type | Description |
|--------|-------------|-------------|
| `authenticate()` | `AuthResponse` | Exchange API key for JWT tokens |
| `refresh_access_token()` | `RefreshResponse` | Refresh access token |
| `message_process(...)` | `MessageProcessingResponse` | Process customer messages |
| `optimize_message(...)` | `MessageOptimizationResponse` | Optimize message content |
| `submit_single_feedback(...)` | `FeedbackResponse` | Submit single feedback |
| `message_feedback(...)` | `List[FeedbackResponse]` | Submit multiple feedback items |
| `close()` | `None` | Close HTTP session |

### Data Models

#### Message
Customer or candidate message with validation.

```python
@dataclass
class Message:
    content: str  # Message text
    channel: str  # "SMS", "EMAIL", "OTHER"
    message_id: Optional[str] = None  # Auto-generated if None
    send_timestamp: Optional[str] = None  # Auto-generated if None  
    reply_or_not: bool = False  # Whether this is a reply
```

#### MessageFeedback
Performance feedback for processed messages.

```python
@dataclass
class MessageFeedback:
    original_message_id: str  # ID from message processing
    sent_message_content: str  # Actual message sent to customer
    customer_responded: bool  # Did customer respond?
    quality_score: int  # Quality rating 0-100
    time_to_respond_ms: Optional[int] = None  # Response time in milliseconds
```

### Response Types

All API responses are fully typed with TypedDict:

#### AuthResponse
```python
class AuthResponse(TypedDict):
    access_token: str
    refresh_token: str
    token_type: str
    expires_in: int
    company_id: str
    company_name: str
```

#### MessageProcessingResponse
```python
class MessageProcessingResponse(TypedDict):
    company: str
    customer_id: str
    candidate_message: CandidateMessageResponse

class CandidateMessageResponse(TypedDict):
    content: str
    channel: str
    message_id: str
```

*See full API documentation for complete type definitions.*

## ๐Ÿค Contributing

We welcome contributions! Please see our contributing guidelines:

1. **Fork** the repository
2. **Create** a feature branch (`git checkout -b feature/amazing-feature`)
3. **Add tests** for new functionality
4. **Run the test suite** (`pytest` and `mypy apala_client`)
5. **Commit** your changes (`git commit -m 'Add amazing feature'`)
6. **Push** to your branch (`git push origin feature/amazing-feature`)
7. **Create** a Pull Request

### Development Setup

```bash
git clone <your-fork>
cd apala_api
pip install -e ".[dev]"

# Run all checks before submitting
pytest                    # Unit tests
mypy apala_client        # Type checking  
ruff check apala_client  # Linting
ruff format apala_client # Formatting
tox                      # Multi-Python testing
```

## ๐Ÿ“„ License

Copyright (c) 2025 Apala Cap. All rights reserved.

This software is proprietary and confidential. Unauthorized copying, distribution, or use of this software, via any medium, is strictly prohibited.

## ๐Ÿ”— Links

- **Documentation**: [Full API Documentation](docs/)
- **Source Code**: [GitHub Repository](#)
- **Issue Tracker**: [GitHub Issues](#)
- **PyPI Package**: [apala-api](#)

## ๐Ÿ’ฌ Support

- **GitHub Issues**: For bugs and feature requests
- **Documentation**: Complete API reference and guides
- **Type Safety**: Full mypy support for development-time error catching

---

*Apala API - Proprietary Software by Apala Cap*

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "apala-api",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "ai, api, financial, loans, messaging, phoenix",
    "author": "Apala Cap",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/49/d9/7f8c71b7813b83899f6adc2ec3fbb2c48b71def59698bcb5fa2e2e62a4ba/apala_api-1.0.2.tar.gz",
    "platform": null,
    "description": "# Apala API - Python SDK\n\n[![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)\n[![Type Hints](https://img.shields.io/badge/type--hints-yes-brightgreen)](https://docs.python.org/3/library/typing.html)\n\n\n## \ud83d\ude80 Quick Start\n\n### Installation\n\n```bash\n# Install the package\npip install apala-api\n\n# Or install from source with development tools\ngit clone <repository-url>\ncd apala_api\npip install -e \".[dev]\"\n```\n\n### Basic Usage\n\n```python\nfrom apala_client import ApalaClient, Message, MessageFeedback\n\n# Initialize client\nclient = ApalaClient(\n    api_key=\"your-api-key\", \n    base_url=\"https://your-server.com\"\n)\n\n# Authenticate (automatic JWT token management)\nclient.authenticate()\n\n# Create customer message history\nmessages = [\n    Message(content=\"Hi, I need help with my loan application.\", channel=\"EMAIL\"),\n    Message(content=\"What are the current interest rates?\", channel=\"SMS\"),\n    Message(content=\"When will I hear back about approval?\", channel=\"EMAIL\")\n]\n\n# Create your candidate response\ncandidate = Message(\n    content=\"Thank you for your inquiry! Our current rates start at 3.5% APR for qualified borrowers. We'll review your application and respond within 2 business days.\",\n    channel=\"EMAIL\"\n)\n\n# Process messages through the AI system\nresponse = client.message_process(\n    message_history=messages,\n    candidate_message=candidate,\n    customer_id=\"550e8400-e29b-41d4-a716-446655440000\",\n    zip_code=\"90210\",\n    company_guid=\"550e8400-e29b-41d4-a716-446655440001\"\n)\n\nprint(f\"Processed message ID: {response['candidate_message']['message_id']}\")\n\n# Submit feedback after customer interaction\nfeedback = MessageFeedback(\n    original_message_id=response[\"candidate_message\"][\"message_id\"],\n    sent_message_content=response[\"candidate_message\"][\"content\"],\n    customer_responded=True,\n    quality_score=85,\n    time_to_respond_ms=1800000  # 30 minutes\n)\n\nfeedback_result = client.submit_single_feedback(feedback)\nprint(f\"Feedback submitted: {feedback_result['feedback_id']}\")\n```\n\n## \ud83c\udfaf Core Features\n\n### \u2705 **Type-Safe API**\n- Full **TypedDict** responses with IDE autocomplete\n- **mypy** integration catches errors at development time\n- **No runtime surprises** - all response fields are typed\n\n### \u2705 **Complete Functionality**\n- **Message Processing**: Analyze customer conversations and candidate responses\n- **Message Optimization**: Enhance messages for maximum engagement\n- **Feedback Tracking**: Monitor message performance and customer responses\n- **Authentication**: Automatic JWT token management with refresh\n\n### \u2705 **Production Ready**\n- **Multi-Python Support**: Python 3.9, 3.10, 3.11, 3.12\n- **Comprehensive Testing**: Unit tests, integration tests, type checking\n- **Error Handling**: Uses standard `requests` exceptions (no custom exceptions)\n- **Validation**: Client-side validation of UUIDs, zip codes, channels\n\n### \u2705 **Developer Experience**\n- **Interactive Demo**: Marimo notebook with complete workflow\n- **Documentation**: Full Sphinx docs with examples\n- **Code Quality**: Ruff formatting, mypy type checking, tox multi-version testing\n\n## \ud83d\udcd6 Documentation\n\n### Authentication\n\nThe SDK uses a secure two-tier authentication system:\n\n1. **API Key**: Your long-lived company credentials\n2. **JWT Tokens**: Short-lived session tokens for API calls (auto-managed)\n\n```python\n# Authentication is automatic - just provide your API key\nclient = ApalaClient(api_key=\"your-api-key\")\nauth_response = client.authenticate()\n\n# JWT tokens are automatically refreshed when needed\n# No manual token management required!\n```\n\n### Message Processing Workflow\n\n```python\n# 1. Create message objects with validation\ncustomer_messages = [\n    Message(\n        content=\"I'm interested in a home loan\",\n        channel=\"EMAIL\",\n        reply_or_not=False\n    ),\n    Message(\n        content=\"What documents do I need?\", \n        channel=\"SMS\",\n        reply_or_not=False\n    )\n]\n\n# 2. Define your candidate response\ncandidate_response = Message(\n    content=\"Great! For a home loan, you'll need: income verification, credit report, and bank statements. We offer competitive rates starting at 3.2% APR.\",\n    channel=\"EMAIL\"\n)\n\n# 3. Process through AI system\nresult = client.message_process(\n    message_history=customer_messages,\n    candidate_message=candidate_response,\n    customer_id=\"customer-uuid-here\",\n    zip_code=\"12345\",\n    company_guid=\"company-uuid-here\"\n)\n\n# 4. Get typed response with IDE completion\nmessage_id = result[\"candidate_message\"][\"message_id\"]  # Type: str\ncompany = result[\"company\"]  # Type: str\ncustomer = result[\"customer_id\"]  # Type: str\n```\n\n### Message Optimization\n\nEnhance your messages for better customer engagement:\n\n```python\n# Optimize your message for maximum engagement\noptimization = client.optimize_message(\n    message_history=customer_messages,\n    candidate_message=candidate_response,\n    customer_id=\"customer-uuid\",\n    zip_code=\"12345\", \n    company_guid=\"company-uuid\"\n)\n\nprint(f\"Original: {optimization['original_message']}\")\nprint(f\"Optimized: {optimization['optimized_message']}\")\nprint(f\"Recommended channel: {optimization['recommended_channel']}\")\n```\n\n### Feedback Tracking\n\nMonitor message performance and learn from customer interactions:\n\n```python\n# Track how customers respond to your messages\nfeedback = MessageFeedback(\n    original_message_id=\"message-id-from-processing\",\n    sent_message_content=\"The actual message you sent\",\n    customer_responded=True,\n    quality_score=88,  # 0-100 quality rating\n    time_to_respond_ms=1200000  # 20 minutes in milliseconds\n)\n\nresult = client.submit_single_feedback(feedback)\nprint(f\"Feedback recorded with ID: {result['feedback_id']}\")\n\n# Or submit multiple feedback items at once\nfeedback_list = [(message1, feedback1), (message2, feedback2)]\nresults = client.message_feedback(feedback_list)\n```\n\n## \ud83d\udd27 Configuration\n\n### Environment Variables\n\nSet these for production deployment:\n\n```bash\n# Required\nexport APALA_API_KEY=\"your-production-api-key\"\nexport APALA_BASE_URL=\"https://your-phoenix-server.com\"\nexport APALA_COMPANY_GUID=\"your-company-uuid\"\n\n# Optional\nexport APALA_CUSTOMER_ID=\"default-customer-uuid\"  # For testing\n```\n\n### Client Configuration\n\n```python\n# Basic configuration\nclient = ApalaClient(\n    api_key=\"your-key\",\n    base_url=\"https://api.yourcompany.com\"\n)\n\n# Advanced usage with custom session\nimport requests\nsession = requests.Session()\nsession.timeout = 30  # Custom timeout\nclient = ApalaClient(api_key=\"your-key\")\nclient._session = session\n```\n\n## \ud83e\uddea Testing & Development\n\n### Setup\n\n```bash\n# Clone and install in development mode with uv\ngit clone <repository-url>\ncd apala_api\nuv sync --group dev\n```\n\n### Running Tests\n\n```bash\n# Run unit tests\nuv run pytest tests/test_models.py tests/test_client.py -v\n\n# Run with coverage\nuv run pytest --cov=apala_client --cov-report=html\n\n# Run integration tests (requires running server)\n# In Fish shell:\nenv RUN_INTEGRATION_TESTS=1 APALA_API_KEY=test-key APALA_COMPANY_GUID=test-company-uuid uv run pytest tests/test_integration.py\n\n# In Bash/Zsh:\nexport RUN_INTEGRATION_TESTS=1 APALA_API_KEY=test-key APALA_COMPANY_GUID=test-company-uuid\nuv run pytest tests/test_integration.py\n```\n\n### Code Quality\n\n```bash\n# Static type checking\nuv run mypy .\n\n# Linting\nuv run ruff check .\n\n# Code formatting\nuv run ruff format .\n```\n\n### Documentation\n\n```bash\n# Build HTML documentation\nuv run sphinx-build -b html docs docs/_build/html\n\n# Build with live reload (auto-refreshes on changes)\nuv run sphinx-autobuild docs docs/_build/html --port 8001\n\n# Clean build directory\nuv run python -c \"import shutil; shutil.rmtree('docs/_build', ignore_errors=True)\"\n\n# Check for broken links\nuv run sphinx-build -b linkcheck docs docs/_build/linkcheck\n```\n\n### Multi-Python Testing\n\n```bash\n# Test across Python versions\nuv run tox\n\n# Test specific version\nuv run tox -e py311\n```\n\n## \ud83d\udcca Interactive Demo\n\nTry the complete workflow in an interactive notebook:\n\n```bash\n# Install notebook dependencies\npip install -e \".[notebook]\"\n\n# Run the interactive demo\ncd notebooks\nmarimo run apala_demo.py\n```\n\nThe demo covers:\n- \ud83d\udd10 Authentication setup\n- \ud83d\udce4 Message processing workflow  \n- \ud83c\udfaf Message optimization\n- \ud83d\udcca Feedback submission\n- \u26a1 Error handling examples\n\n## \ud83d\udee1\ufe0f Error Handling\n\nThe SDK uses standard Python exceptions - no custom error types to learn:\n\n```python\nimport requests\nfrom apala_client import ApalaClient\n\nclient = ApalaClient(api_key=\"your-key\")\n\ntry:\n    # All SDK methods may raise requests exceptions\n    response = client.message_process(...)\n    \nexcept requests.HTTPError as e:\n    # HTTP errors (4xx, 5xx responses)\n    print(f\"HTTP {e.response.status_code}: {e}\")\n    \nexcept requests.ConnectionError as e:\n    # Network connectivity issues\n    print(f\"Connection failed: {e}\")\n    \nexcept requests.Timeout as e:\n    # Request timeout\n    print(f\"Request timed out: {e}\")\n    \nexcept requests.RequestException as e:\n    # Any other requests-related error\n    print(f\"Request error: {e}\")\n    \nexcept ValueError as e:\n    # Data validation errors (invalid UUIDs, etc.)\n    print(f\"Invalid data: {e}\")\n```\n\n## \ud83d\udd0d API Reference\n\n### ApalaClient\n\nMain client class for all API interactions.\n\n#### Constructor\n```python\nApalaClient(api_key: str, base_url: str = \"http://localhost:4000\")\n```\n\n#### Methods\n\n| Method | Return Type | Description |\n|--------|-------------|-------------|\n| `authenticate()` | `AuthResponse` | Exchange API key for JWT tokens |\n| `refresh_access_token()` | `RefreshResponse` | Refresh access token |\n| `message_process(...)` | `MessageProcessingResponse` | Process customer messages |\n| `optimize_message(...)` | `MessageOptimizationResponse` | Optimize message content |\n| `submit_single_feedback(...)` | `FeedbackResponse` | Submit single feedback |\n| `message_feedback(...)` | `List[FeedbackResponse]` | Submit multiple feedback items |\n| `close()` | `None` | Close HTTP session |\n\n### Data Models\n\n#### Message\nCustomer or candidate message with validation.\n\n```python\n@dataclass\nclass Message:\n    content: str  # Message text\n    channel: str  # \"SMS\", \"EMAIL\", \"OTHER\"\n    message_id: Optional[str] = None  # Auto-generated if None\n    send_timestamp: Optional[str] = None  # Auto-generated if None  \n    reply_or_not: bool = False  # Whether this is a reply\n```\n\n#### MessageFeedback\nPerformance feedback for processed messages.\n\n```python\n@dataclass\nclass MessageFeedback:\n    original_message_id: str  # ID from message processing\n    sent_message_content: str  # Actual message sent to customer\n    customer_responded: bool  # Did customer respond?\n    quality_score: int  # Quality rating 0-100\n    time_to_respond_ms: Optional[int] = None  # Response time in milliseconds\n```\n\n### Response Types\n\nAll API responses are fully typed with TypedDict:\n\n#### AuthResponse\n```python\nclass AuthResponse(TypedDict):\n    access_token: str\n    refresh_token: str\n    token_type: str\n    expires_in: int\n    company_id: str\n    company_name: str\n```\n\n#### MessageProcessingResponse\n```python\nclass MessageProcessingResponse(TypedDict):\n    company: str\n    customer_id: str\n    candidate_message: CandidateMessageResponse\n\nclass CandidateMessageResponse(TypedDict):\n    content: str\n    channel: str\n    message_id: str\n```\n\n*See full API documentation for complete type definitions.*\n\n## \ud83e\udd1d Contributing\n\nWe welcome contributions! Please see our contributing guidelines:\n\n1. **Fork** the repository\n2. **Create** a feature branch (`git checkout -b feature/amazing-feature`)\n3. **Add tests** for new functionality\n4. **Run the test suite** (`pytest` and `mypy apala_client`)\n5. **Commit** your changes (`git commit -m 'Add amazing feature'`)\n6. **Push** to your branch (`git push origin feature/amazing-feature`)\n7. **Create** a Pull Request\n\n### Development Setup\n\n```bash\ngit clone <your-fork>\ncd apala_api\npip install -e \".[dev]\"\n\n# Run all checks before submitting\npytest                    # Unit tests\nmypy apala_client        # Type checking  \nruff check apala_client  # Linting\nruff format apala_client # Formatting\ntox                      # Multi-Python testing\n```\n\n## \ud83d\udcc4 License\n\nCopyright (c) 2025 Apala Cap. All rights reserved.\n\nThis software is proprietary and confidential. Unauthorized copying, distribution, or use of this software, via any medium, is strictly prohibited.\n\n## \ud83d\udd17 Links\n\n- **Documentation**: [Full API Documentation](docs/)\n- **Source Code**: [GitHub Repository](#)\n- **Issue Tracker**: [GitHub Issues](#)\n- **PyPI Package**: [apala-api](#)\n\n## \ud83d\udcac Support\n\n- **GitHub Issues**: For bugs and feature requests\n- **Documentation**: Complete API reference and guides\n- **Type Safety**: Full mypy support for development-time error catching\n\n---\n\n*Apala API - Proprietary Software by Apala Cap*\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Python SDK for Phoenix Message Analysis Services - Loan/Financial AI API Client",
    "version": "1.0.2",
    "project_urls": null,
    "split_keywords": [
        "ai",
        " api",
        " financial",
        " loans",
        " messaging",
        " phoenix"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8ba321132b093c6601e9013c5a59e6fddad1ea241500d9359d14aaa060d93e73",
                "md5": "3498f999711d4cf9bd90198b57f56a82",
                "sha256": "7e67e540ca901df50916615b60fe6ebd1f1ada993156c37363c584fa40de2f67"
            },
            "downloads": -1,
            "filename": "apala_api-1.0.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "3498f999711d4cf9bd90198b57f56a82",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 12488,
            "upload_time": "2025-10-23T01:47:12",
            "upload_time_iso_8601": "2025-10-23T01:47:12.481300Z",
            "url": "https://files.pythonhosted.org/packages/8b/a3/21132b093c6601e9013c5a59e6fddad1ea241500d9359d14aaa060d93e73/apala_api-1.0.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "49d97f8c71b7813b83899f6adc2ec3fbb2c48b71def59698bcb5fa2e2e62a4ba",
                "md5": "3c599b510b63f14ae2df538fac6a983f",
                "sha256": "5d905f9c9b33396a1dd73a8e1de5e6829a8365d14bd7857de1c82084355ab38e"
            },
            "downloads": -1,
            "filename": "apala_api-1.0.2.tar.gz",
            "has_sig": false,
            "md5_digest": "3c599b510b63f14ae2df538fac6a983f",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 8427068,
            "upload_time": "2025-10-23T01:47:14",
            "upload_time_iso_8601": "2025-10-23T01:47:14.058963Z",
            "url": "https://files.pythonhosted.org/packages/49/d9/7f8c71b7813b83899f6adc2ec3fbb2c48b71def59698bcb5fa2e2e62a4ba/apala_api-1.0.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-23 01:47:14",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "apala-api"
}
        
Elapsed time: 1.11871s