| Name | apala-api JSON |
| Version |
1.0.2
JSON |
| download |
| home_page | None |
| Summary | Python SDK for Phoenix Message Analysis Services - Loan/Financial AI API Client |
| upload_time | 2025-10-23 01:47:14 |
| maintainer | None |
| docs_url | None |
| author | Apala Cap |
| requires_python | >=3.9 |
| license | None |
| 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
[](https://www.python.org/downloads/)
[](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[](https://www.python.org/downloads/)\n[](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"
}