initial commit

This commit is contained in:
ipu 2025-07-25 14:01:16 +03:00
commit aaba8753ef
36 changed files with 3682 additions and 0 deletions

11
.gitignore vendored Normal file
View file

@ -0,0 +1,11 @@
# Python-generated files
__pycache__/
*.py[oc]
build/
dist/
wheels/
*.egg-info
# Virtual environments
.venv
.env

1
.python-version Normal file
View file

@ -0,0 +1 @@
3.13

22
Dockerfile Normal file
View file

@ -0,0 +1,22 @@
FROM ghcr.io/astral-sh/uv:python3.13-bookworm-slim
WORKDIR /app
ENV UV_COMPILE_BYTECODE=1
ENV UV_LINK_MODE=copy
RUN --mount=type=cache,target=/root/.cache/uv \
--mount=type=bind,source=uv.lock,target=uv.lock \
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
uv sync --locked --no-install-project --no-dev
COPY . /app
RUN --mount=type=cache,target=/root/.cache/uv \
uv sync --locked --no-dev
ENV PATH="/app/.venv/bin:$PATH"
ENTRYPOINT []
CMD ["fastapi", "run", "src.main:app", "--host", "0.0.0.0", "--port", "8000"]

244
README.md Normal file
View file

@ -0,0 +1,244 @@
# Lolly AI
A FastAPI-based insurance AI assistant that integrates with talestorm-ai for chat capabilities and provides insurance estimation services.
## Features
- **Insurance Chat**: AI-powered chat interface for insurance-related questions
- **Insurance Estimation**: Comprehensive underwriting and pricing estimation
- **Integration**: Seamless integration with talestorm-ai API
- **Modern API**: Built with FastAPI for high performance and automatic documentation
## Quick Start with Docker Compose
The easiest way to run lolly-ai is using Docker Compose, which will set up both lolly-ai and its dependency talestorm-ai.
### Prerequisites
- Docker and Docker Compose installed
- talestorm-ai repository cloned in the same parent directory as lolly-ai
### Setup
1. Clone both repositories:
```bash
git clone <talestorm-ai-repo-url> ../talestorm-ai
git clone <lolly-ai-repo-url> lolly-ai
cd lolly-ai
```
2. Create a `.env` file with your configuration:
```bash
# Database Configuration (for talestorm-ai)
POSTGRES_USER=postgres
POSTGRES_PASSWORD=password
POSTGRES_DB=talestorm
PUBLIC_POSTGRES_PORT=5432
# talestorm-ai Configuration
PUBLIC_TALESTORM_PORT=8000
ADMIN_API_KEY=changeme-admin-key
OPENAI_API_KEY=your-openai-api-key-here
# lolly-ai Configuration
PUBLIC_LOLLY_PORT=7310
TALESTORM_API_KEY=your-talestorm-api-key-here
TALESTORM_AGENT_ID=your-talestorm-agent-id-here
INSURANCE_API_BASE_URL=https://apilolly.cyberpug.ru
# Server Configuration
HOST=0.0.0.0
PORT=7310
DEBUG=false
# CORS Configuration
CORS_ORIGINS=*
# Logging
LOG_LEVEL=INFO
```
3. Start the services:
```bash
docker compose up -d
```
4. Access the services:
- **lolly-ai API**: http://localhost:7310
- **talestorm-ai API**: http://localhost:8000
- **lolly-ai docs**: http://localhost:7310/docs
- **talestorm-ai docs**: http://localhost:8000/docs
### Development with Docker Compose
For development, you can mount the source code:
```bash
docker compose up -d
```
The source code is automatically mounted, so changes will be reflected immediately.
### Stopping the services
```bash
docker compose down
```
To remove volumes as well:
```bash
docker compose down -v
```
## API Endpoints
All API endpoints are versioned under `/api/v1/`:
### `/api/v1/sessions` (POST)
Create a new chat session.
**Query Parameters:**
- `agent_id` (optional): Specific agent ID to use for the session
**Response:**
```json
{
"session_id": "session-uuid"
}
```
### `/api/v1/sessions` (GET)
List all available sessions.
**Response:**
```json
{
"sessions": [
{
"id": "session-uuid",
"organization_id": "org-uuid",
"agent_id": "agent-uuid",
"created_at": "2024-01-01T00:00:00Z"
}
]
}
```
### `/api/v1/sessions/{session_id}` (GET)
Get details of a specific session.
**Response:**
```json
{
"id": "session-uuid",
"organization_id": "org-uuid",
"agent_id": "agent-uuid",
"created_at": "2024-01-01T00:00:00Z"
}
```
### `/api/v1/agents` (GET)
List available AI agents.
**Response:**
```json
{
"agents": [
{
"id": "agent-uuid",
"name": "Insurance Assistant",
"model_name": "gpt-3.5-turbo",
"model_provider": "openai",
"enable_rag_search": true,
"instructions": "You are an insurance expert..."
}
]
}
```
### `/api/v1/insurance_chat` (POST)
Handles insurance-related chat requests.
**Request Body:**
```json
{
"message": "What does my health insurance cover?",
"session_id": "optional-session-id"
}
```
**Response:**
```json
{
"session_id": "session-uuid",
"answer": "Your health insurance covers...",
"sources": [
{
"plan_name": "Cigna 1000 Classic",
"chunk_number": 0,
"content_chunk": "This plan covers preventive care, doctor visits, and prescription drugs..."
}
],
"history": [
{
"role": "user",
"message": "What does my health insurance cover?"
},
{
"role": "assistant",
"message": "Your health insurance covers..."
}
]
}
```
### `/api/v1/estimation` (POST)
Handles insurance estimation and underwriting requests.
**Request Body:**
```json
{
"uid": "application-id",
"applicants": [
{
"firstName": "John",
"dob": "15/03/1985",
"weight": 70,
"heightFt": 5,
"heightIn": 10,
"applicant": 1
}
],
"plans": [
{
"coverage": 1
}
],
"phq": {
"effectiveDate": "01/01/2024",
"medications": [],
"conditions": [],
"issues": []
},
"income": 50000,
"address": {}
}
```
**Response:**
```json
{
"uid": "application-id",
"status": "submitted",
"data": {
"results": [...],
"combined": {
"tier": 2.0,
"total_price": 243,
"dtq": false,
"message": "Final assigned tier is 2.0"
}
},
"external": {...}
}
```

10
compose.yaml Normal file
View file

@ -0,0 +1,10 @@
services:
lolly-api:
build: .
command: uv run fastapi run src/main.py --host 0.0.0.0 --port 8000
env_file:
- .env
ports:
- "${PUBLIC_API_PORT:-7311}:8000"
volumes:
- ./src:/app/src

42
pyproject.toml Normal file
View file

@ -0,0 +1,42 @@
[project]
name = "lolly-ai"
version = "0.1.0"
description = "Insurance AI assistant with chat and estimation capabilities"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
"fastapi[standard]>=0.116.1",
"httpx>=0.28.1",
"pydantic>=2.11.7",
"pydantic-settings>=2.0.0",
]
[project.optional-dependencies]
dev = [
"pytest>=7.4.0",
"pytest-asyncio>=0.21.0",
"black>=23.0.0",
"isort>=5.12.0",
"mypy>=1.7.0"
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.black]
line-length = 88
target-version = ['py313']
[tool.isort]
profile = "black"
line_length = 88
[tool.mypy]
python_version = "3.13"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true
[tool.hatch.build.targets.wheel]
packages = ["src"]

View file

@ -0,0 +1,96 @@
PLAN: Cigna 1000 Classic
UID: Cigna 1000 Classic
Category: Major Medical
Type: PPO
Marketing Name: Cigna-1,000 Classic
Average Price: $1278.66
Short Description: The Cigna 1000 Classic PPO is a low-deductible PPO that makes routine care affordable with low copays and full preventive coverage.
Long Description: The Cigna 1000 Classic Plan keeps things simple with just a $1,000 deductible. Youll pay only $20 to see your doctor and $40 for specialists. Preventive care is always free. Its a great option if you like knowing what to expect with your healthcare costs.
PRICING:
Coverage 4: $1946.85
Coverage 3: $1183.21
Coverage 2: $1310.48
Coverage 1: $674.13
DETAILS:
COVERAGE:
Notes: Yes.
If your plan doesn't meet the Minimum Value Standards, you may be eligible for a premium tax credit to help you pay for a plan through the Marketplace.
Coverage Tier: All
Emergency Room: You pay the full cost until your deductible is met, then 20% of the covered amount.
Monthly Premium: None
Lifetime Maximum: No Maximum
Professoinal Fees: You pay the full cost until your deductible is met, then 20% of the covered amount.
Referral Required: No
Urgent Care Copay: 40
Employee Contribution: TBD by Group
Employer Contribution: TBD by Group
Inpatient Hospital Stay: You pay the full cost until your deductible is met, then 20% of the covered amount.
Habilitation - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Included no cost services: 40
Prescription Drug Deductible: You just pay low copays for medications right away—no deductible needs to be met.
Habilitation - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Home heslth care - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Hospice services - In Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Specialist Copay - In Network: 40
Emergency Medical Transporation: You pay the full cost until your deductible is met, then 20% of the covered amount.
Primary Care Copay - In Network: 20
Your Rights to Continue Coverage: There are agencies that can help if you have a complaint against your plan for a denial of a claim. This complaint is called a grievance or appeal. For more information about your rights, look at the explaination of benefits you will receivefor that medical claim. Your plan documents also provide complete information to submit a claim, appeal, or a grievance for any reason to your plan.For more information about your rights, this notice, or assistance, contact: Acuity at 1-866-872-6356 or Department of Labor's Employee Benefits Security Administration at 1-866-444-EBSA (3272) or www.dol.gov/ebsa/healthreform.
Deductible (Family) - In Network: 2000
Home heslth care - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Hospice services - Out of Network: There are agencies that can help if you want to continue your coverage after it ends. The contact information for those agencies is :Department of Labor's Employee Benefits Security Administration at 1-866-444-EBSA (3272) or www.dol.gov/ebsa/healthreform. Other coverage options may be available to you too, including buying individual insurance coverage through the Health Insurance Marketplace. For more information about the Marketplace, visit www.HealthCare.gov or call 1-800-318-2596.
Skilled nursing care - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Specialist Copay - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount.
Your Grievance and Appeals Rights: Yes.
If you don't have Minimum Essential Coverage for a month, you'll have to make a payment when you file your tax return unless you qualify for an exemption from the requirement that you have health coverage for that month.
Specialty Drugs - Network Provider: 50% coinsurance
Primary Care Copay - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount.
Chiropractic Care Copay - In Network: 20
Deductible (Family) - Out of Network: 4000
Deductible (Individual) - In Netwok: 1000
Pregnancy office visits - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Rehabilitation Services - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Skilled nursing care - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Durable medical equipment - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Chiropractic Care Copay - Out of Network: NA
Deductible (individual) - Out of Netwok: 2000
Pregnancy office visits - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Rehabilitation Services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Specialty Drugs - Out of Network Provider: Not covered
Durable medical equipment - Out of Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Out of Pocket Maximum (Family) - In Network: 10000
Routine Preventive Services (Non-Diagnostic): No Member Cost Sharing - Deductible Waived
Out of Pocket Maximum (family) - Out of Network: 20000
Does this plan meet the Minimum Value Standards?: None
Out of Pockert Maximum (Individual) - In Network: 5000
Cildbirth/delivery facility services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Coinsurance % (Plan pays/Member Pays) - In Network: 80% / 20%%
Does This Plan provide Minimum Essential Coverage?: For more information about limitations and exceptions, see the plan or policy document at https://www.acuity-grp.com
Out of Pocket Maximum (Individual) - Out of Network: 10000
Blood test to help diagnose a condition - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount.
Cildbirth/delivery facility services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Free Standing Lab & Diagnostic Services (Lab & x-ray): You pay the full cost until your deductible is met, then 0% of the covered amount.
Preventative Care/Screening/Immunization - In Network: 0% Coinsurance
Childbirth/delivery professional services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Coinsurance % (Plan pays/Member Pays) - Out of Network: 60% / 40%
Blood test to help diagnose a condition - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Preventative Care/Screening/Immunization - Out of Network: Not Covered
Childbirth/delivery professional services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Imaging tests like X-Rays, CT/PET Scans, or MRI's - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Out Patient Services, Surgical Services (Procedure & Anesthesia): You pay the full cost until your deductible is met, then 20% of the covered amount.
Imaging tests like X-Rays, CT/PET Scans, or MRI's - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Generic medication (30-day supply) from a pharmacy in your plans network: $15 copay
Generic medication (31-90-day supply) from a pharmacy in your plans network: $45 copayemnt
Inpatient mental/ behavioral health, and substance abuse services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Complex Diagnositc Services (CT, MRI, Ultra Sound, PET, Nuclear Med.) (Network): You pay the full cost until your deductible is met, then 20% of the covered amount.
Outpatient mental/ behavioral health, and substance abuse services - In Network: $20 copay
Inpatient mental/ behavioral health, and substance abuse services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Outpatient mental/ behavioral health, and substance abuse services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Brand-name medication thats on your plans preferred list (30-day supply from an in-network pharmacy): $45 copay
Brand-name medication thats on your plans preferred list (31-90-day supply) from an in-network pharmacy): $90 copayemnt
Brand-name medication thats not on your plans preferred list (30-day supply) from an in-network pharmacy): $85 copay
Brand-name medication thats not on your plans preferred list (31-90-day supply) from an in-network pharmacy): $150 copayemnt

View file

@ -0,0 +1,96 @@
PLAN: Cigna 1500 Classic
UID: Cigna 1500 Classic
Category: Major Medical
Type: PPO
Marketing Name: Cigna - 1,500 Plan
Average Price: $1195.99
Short Description: A well-balanced PPO plan with manageable costs, ideal for those who use healthcare a few times a year.
Long Description: The Cigna 1500 Plan strikes a nice balance between premium and out-of-pocket costs. You get predictable copays ($30 for doctors, $60 for specialists) and solid coverage after your $1,500 deductible. Its perfect for individuals or families who go to the doctor a few times a year.
PRICING:
Coverage 4: $1820.46
Coverage 3: $1106.79
Coverage 2: $1225.73
Coverage 1: $631.01
DETAILS:
COVERAGE:
Notes: Yes.
If your plan doesn't meet the Minimum Value Standards, you may be eligible for a premium tax credit to help you pay for a plan through the Marketplace.
Coverage Tier: All
Emergency Room: You pay the full cost until your deductible is met, then 20% of the covered amount.
Monthly Premium: None
Lifetime Maximum: No Maximum
Professoinal Fees: You pay the full cost until your deductible is met, then 20% of the covered amount.
Referral Required: No
Urgent Care Copay: 80
Employee Contribution: TBD by Group
Employer Contribution: TBD by Group
Inpatient Hospital Stay: You pay the full cost until your deductible is met, then 20% of the covered amount.
Habilitation - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Included no cost services: 0% Copay Telemedicine, Virtual Primary Care, Advocay Services
Prescription Drug Deductible: You just pay low copays for medications right away—no deductible needs to be met.
Habilitation - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Home heslth care - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Hospice services - In Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Specialist Copay - In Network: 60
Emergency Medical Transporation: You pay the full cost until your deductible is met, then 20% of the covered amount.
Primary Care Copay - In Network: 30
Your Rights to Continue Coverage: There are agencies that can help if you have a complaint against your plan for a denial of a claim. This complaint is called a grievance or appeal. For more information about your rights, look at the explaination of benefits you will receivefor that medical claim. Your plan documents also provide complete information to submit a claim, appeal, or a grievance for any reason to your plan.For more information about your rights, this notice, or assistance, contact: Acuity at 1-866-872-6356 or Department of Labor's Employee Benefits Security Administration at 1-866-444-EBSA (3272) or www.dol.gov/ebsa/healthreform.
Deductible (Family) - In Network: 3000
Home heslth care - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Hospice services - Out of Network: There are agencies that can help if you want to continue your coverage after it ends. The contact information for those agencies is :Department of Labor's Employee Benefits Security Administration at 1-866-444-EBSA (3272) or www.dol.gov/ebsa/healthreform. Other coverage options may be available to you too, including buying individual insurance coverage through the Health Insurance Marketplace. For more information about the Marketplace, visit www.HealthCare.gov or call 1-800-318-2596.
Skilled nursing care - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Specialist Copay - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount.
Your Grievance and Appeals Rights: Yes.
If you don't have Minimum Essential Coverage for a month, you'll have to make a payment when you file your tax return unless you qualify for an exemption from the requirement that you have health coverage for that month.
Specialty Drugs - Network Provider: 50% coinsurance
Primary Care Copay - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount.
Chiropractic Care Copay - In Network: 20
Deductible (Family) - Out of Network: 6000
Deductible (Individual) - In Netwok: 1500
Pregnancy office visits - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Rehabilitation Services - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Skilled nursing care - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Durable medical equipment - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Chiropractic Care Copay - Out of Network: NA
Deductible (individual) - Out of Netwok: 3000
Pregnancy office visits - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Rehabilitation Services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Specialty Drugs - Out of Network Provider: Not covered
Durable medical equipment - Out of Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Out of Pocket Maximum (Family) - In Network: 14700
Routine Preventive Services (Non-Diagnostic): No Member Cost Sharing - Deductible Waived
Out of Pocket Maximum (family) - Out of Network: 29400
Does this plan meet the Minimum Value Standards?: None
Out of Pockert Maximum (Individual) - In Network: 7350
Cildbirth/delivery facility services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Coinsurance % (Plan pays/Member Pays) - In Network: 80% / 20%%
Does This Plan provide Minimum Essential Coverage?: For more information about limitations and exceptions, see the plan or policy document at https://www.acuity-grp.com
Out of Pocket Maximum (Individual) - Out of Network: 14700
Blood test to help diagnose a condition - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount.
Cildbirth/delivery facility services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Free Standing Lab & Diagnostic Services (Lab & x-ray): You pay the full cost until your deductible is met, then 0% of the covered amount.
Preventative Care/Screening/Immunization - In Network: 0% Coinsurance
Childbirth/delivery professional services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Coinsurance % (Plan pays/Member Pays) - Out of Network: 60% / 40%
Blood test to help diagnose a condition - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Preventative Care/Screening/Immunization - Out of Network: Not Covered
Childbirth/delivery professional services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Imaging tests like X-Rays, CT/PET Scans, or MRI's - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Out Patient Services, Surgical Services (Procedure & Anesthesia): You pay the full cost until your deductible is met, then 20% of the covered amount.
Imaging tests like X-Rays, CT/PET Scans, or MRI's - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Generic medication (30-day supply) from a pharmacy in your plans network: $15 copay
Generic medication (31-90-day supply) from a pharmacy in your plans network: $45 copayemnt
Inpatient mental/ behavioral health, and substance abuse services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Complex Diagnositc Services (CT, MRI, Ultra Sound, PET, Nuclear Med.) (Network): You pay the full cost until your deductible is met, then 20% of the covered amount.
Outpatient mental/ behavioral health, and substance abuse services - In Network: $30 copay
Inpatient mental/ behavioral health, and substance abuse services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Outpatient mental/ behavioral health, and substance abuse services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Brand-name medication thats on your plans preferred list (30-day supply from an in-network pharmacy): $45 copay
Brand-name medication thats on your plans preferred list (31-90-day supply) from an in-network pharmacy): $90 copayemnt
Brand-name medication thats not on your plans preferred list (30-day supply) from an in-network pharmacy): $85 copay
Brand-name medication thats not on your plans preferred list (31-90-day supply) from an in-network pharmacy): $150 copayemnt

View file

@ -0,0 +1,96 @@
PLAN: Cigna 2500 Classic
UID: Cigna 2500 Classic
Category: Major Medical
Type: PPO
Marketing Name: Cigna - 2,500 Plan
Average Price: $1118.73
Short Description: A dependable PPO with a moderate deductible and consistent copays that make budgeting easier.
Long Description: The Cigna 2500 Plan is built for people who want reliable coverage with manageable costs. Youll pay $30 for primary care and $60 for specialists, with preventive care fully covered. Its a good middle-ground plan that works well for most people.
PRICING:
Coverage 4: $1702.35
Coverage 3: $1035.36
Coverage 2: $1146.52
Coverage 1: $590.71
DETAILS:
COVERAGE:
Notes: Yes.
If your plan doesn't meet the Minimum Value Standards, you may be eligible for a premium tax credit to help you pay for a plan through the Marketplace.
Coverage Tier: All
Emergency Room: You pay the full cost until your deductible is met, then 20% of the covered amount.
Monthly Premium: None
Lifetime Maximum: No Maximum
Professoinal Fees: You pay the full cost until your deductible is met, then 20% of the covered amount.
Referral Required: No
Urgent Care Copay: 80
Employee Contribution: TBD by Group
Employer Contribution: TBD by Group
Inpatient Hospital Stay: You pay the full cost until your deductible is met, then 20% of the covered amount.
Habilitation - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Included no cost services: 0% Copay Telemedicine, Virtual Primary Care, Advocay Services
Prescription Drug Deductible: You just pay low copays for medications right away—no deductible needs to be met.
Habilitation - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Home heslth care - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Hospice services - In Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Specialist Copay - In Network: 60
Emergency Medical Transporation: You pay the full cost until your deductible is met, then 20% of the covered amount.
Primary Care Copay - In Network: 30
Your Rights to Continue Coverage: There are agencies that can help if you have a complaint against your plan for a denial of a claim. This complaint is called a grievance or appeal. For more information about your rights, look at the explaination of benefits you will receivefor that medical claim. Your plan documents also provide complete information to submit a claim, appeal, or a grievance for any reason to your plan.For more information about your rights, this notice, or assistance, contact: Acuity at 1-866-872-6356 or Department of Labor's Employee Benefits Security Administration at 1-866-444-EBSA (3272) or www.dol.gov/ebsa/healthreform.
Deductible (Family) - In Network: 5000
Home heslth care - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Hospice services - Out of Network: There are agencies that can help if you want to continue your coverage after it ends. The contact information for those agencies is :Department of Labor's Employee Benefits Security Administration at 1-866-444-EBSA (3272) or www.dol.gov/ebsa/healthreform. Other coverage options may be available to you too, including buying individual insurance coverage through the Health Insurance Marketplace. For more information about the Marketplace, visit www.HealthCare.gov or call 1-800-318-2596.
Skilled nursing care - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Specialist Copay - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount.
Your Grievance and Appeals Rights: Yes.
If you don't have Minimum Essential Coverage for a month, you'll have to make a payment when you file your tax return unless you qualify for an exemption from the requirement that you have health coverage for that month.
Specialty Drugs - Network Provider: 50% coinsurance
Primary Care Copay - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount.
Chiropractic Care Copay - In Network: 20
Deductible (Family) - Out of Network: 10000
Deductible (Individual) - In Netwok: 2500
Pregnancy office visits - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Rehabilitation Services - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Skilled nursing care - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Durable medical equipment - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Chiropractic Care Copay - Out of Network: NA
Deductible (individual) - Out of Netwok: 5000
Pregnancy office visits - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Rehabilitation Services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Specialty Drugs - Out of Network Provider: Not covered
Durable medical equipment - Out of Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Out of Pocket Maximum (Family) - In Network: 14700
Routine Preventive Services (Non-Diagnostic): No Member Cost Sharing - Deductible Waived
Out of Pocket Maximum (family) - Out of Network: 29400
Does this plan meet the Minimum Value Standards?: None
Out of Pockert Maximum (Individual) - In Network: 7350
Cildbirth/delivery facility services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Coinsurance % (Plan pays/Member Pays) - In Network: 80% / 20%%
Does This Plan provide Minimum Essential Coverage?: For more information about limitations and exceptions, see the plan or policy document at https://www.acuity-grp.com
Out of Pocket Maximum (Individual) - Out of Network: 14700
Blood test to help diagnose a condition - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount.
Cildbirth/delivery facility services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Free Standing Lab & Diagnostic Services (Lab & x-ray): You pay the full cost until your deductible is met, then 0% of the covered amount.
Preventative Care/Screening/Immunization - In Network: 0% Coinsurance
Childbirth/delivery professional services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Coinsurance % (Plan pays/Member Pays) - Out of Network: 60% / 40%
Blood test to help diagnose a condition - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Preventative Care/Screening/Immunization - Out of Network: Not Covered
Childbirth/delivery professional services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Imaging tests like X-Rays, CT/PET Scans, or MRI's - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Out Patient Services, Surgical Services (Procedure & Anesthesia): You pay the full cost until your deductible is met, then 20% of the covered amount.
Imaging tests like X-Rays, CT/PET Scans, or MRI's - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Generic medication (30-day supply) from a pharmacy in your plans network: $15 copay
Generic medication (31-90-day supply) from a pharmacy in your plans network: $45 copayemnt
Inpatient mental/ behavioral health, and substance abuse services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Complex Diagnositc Services (CT, MRI, Ultra Sound, PET, Nuclear Med.) (Network): You pay the full cost until your deductible is met, then 20% of the covered amount.
Outpatient mental/ behavioral health, and substance abuse services - In Network: $30 copay
Inpatient mental/ behavioral health, and substance abuse services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Outpatient mental/ behavioral health, and substance abuse services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Brand-name medication thats on your plans preferred list (30-day supply from an in-network pharmacy): $45 copay
Brand-name medication thats on your plans preferred list (31-90-day supply) from an in-network pharmacy): $90 copayemnt
Brand-name medication thats not on your plans preferred list (30-day supply) from an in-network pharmacy): $85 copay
Brand-name medication thats not on your plans preferred list (31-90-day supply) from an in-network pharmacy): $150 copayemnt

View file

@ -0,0 +1,96 @@
PLAN: Cigna 3500 Classic
UID: Cigna 3500 Classic
Category: Major Medical
Type: PPO
Marketing Name: Cigna- 3,500 Plan
Average Price: $1046.52
Short Description: A cost-conscious PPO plan offering solid coverage and access to care with lower monthly premiums.
Long Description: .The Cigna 3500 Plan is a budget-friendly PPO that still gives you access to great care. Primary care visits are just $45, specialists are $90, and preventive care is free. Its a smart choice if youre healthy but want solid protection just in case.
PRICING:
Coverage 4: $1591.96
Coverage 3: $968.61
Coverage 2: $1072.50
Coverage 1: $553.04
DETAILS:
COVERAGE:
Notes: Yes.
If your plan doesn't meet the Minimum Value Standards, you may be eligible for a premium tax credit to help you pay for a plan through the Marketplace.
Coverage Tier: All
Emergency Room: You pay the full cost until your deductible is met, then 20% of the covered amount.
Monthly Premium: None
Lifetime Maximum: No Maximum
Professoinal Fees: You pay the full cost until your deductible is met, then 20% of the covered amount.
Referral Required: No
Urgent Care Copay: 90
Employee Contribution: TBD by Group
Employer Contribution: TBD by Group
Inpatient Hospital Stay: You pay the full cost until your deductible is met, then 20% of the covered amount.
Habilitation - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Included no cost services: 0% Copay Telemedicine, Virtual Primary Care, Advocay Services
Prescription Drug Deductible: You just pay low copays for medications right away—no deductible needs to be met.
Habilitation - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Home heslth care - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Hospice services - In Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Specialist Copay - In Network: 90
Emergency Medical Transporation: You pay the full cost until your deductible is met, then 20% of the covered amount.
Primary Care Copay - In Network: 45
Your Rights to Continue Coverage: There are agencies that can help if you have a complaint against your plan for a denial of a claim. This complaint is called a grievance or appeal. For more information about your rights, look at the explaination of benefits you will receivefor that medical claim. Your plan documents also provide complete information to submit a claim, appeal, or a grievance for any reason to your plan.For more information about your rights, this notice, or assistance, contact: Acuity at 1-866-872-6356 or Department of Labor's Employee Benefits Security Administration at 1-866-444-EBSA (3272) or www.dol.gov/ebsa/healthreform.
Deductible (Family) - In Network: 7000
Home heslth care - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Hospice services - Out of Network: There are agencies that can help if you want to continue your coverage after it ends. The contact information for those agencies is :Department of Labor's Employee Benefits Security Administration at 1-866-444-EBSA (3272) or www.dol.gov/ebsa/healthreform. Other coverage options may be available to you too, including buying individual insurance coverage through the Health Insurance Marketplace. For more information about the Marketplace, visit www.HealthCare.gov or call 1-800-318-2596.
Skilled nursing care - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Specialist Copay - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount.
Your Grievance and Appeals Rights: Yes.
If you don't have Minimum Essential Coverage for a month, you'll have to make a payment when you file your tax return unless you qualify for an exemption from the requirement that you have health coverage for that month.
Specialty Drugs - Network Provider: 50% coinsurance
Primary Care Copay - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount.
Chiropractic Care Copay - In Network: 20
Deductible (Family) - Out of Network: 14000
Deductible (Individual) - In Netwok: 3500
Pregnancy office visits - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Rehabilitation Services - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Skilled nursing care - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Durable medical equipment - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Chiropractic Care Copay - Out of Network: NA
Deductible (individual) - Out of Netwok: 7000
Pregnancy office visits - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Rehabilitation Services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Specialty Drugs - Out of Network Provider: Not covered
Durable medical equipment - Out of Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Out of Pocket Maximum (Family) - In Network: 14700
Routine Preventive Services (Non-Diagnostic): No Member Cost Sharing - Deductible Waived
Out of Pocket Maximum (family) - Out of Network: 29400
Does this plan meet the Minimum Value Standards?: None
Out of Pockert Maximum (Individual) - In Network: 7350
Cildbirth/delivery facility services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Coinsurance % (Plan pays/Member Pays) - In Network: 80% / 20%%
Does This Plan provide Minimum Essential Coverage?: For more information about limitations and exceptions, see the plan or policy document at https://www.acuity-grp.com
Out of Pocket Maximum (Individual) - Out of Network: 14700
Blood test to help diagnose a condition - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount.
Cildbirth/delivery facility services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Free Standing Lab & Diagnostic Services (Lab & x-ray): You pay the full cost until your deductible is met, then 0% of the covered amount.
Preventative Care/Screening/Immunization - In Network: 0% Coinsurance
Childbirth/delivery professional services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Coinsurance % (Plan pays/Member Pays) - Out of Network: 60% / 40%
Blood test to help diagnose a condition - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Preventative Care/Screening/Immunization - Out of Network: Not Covered
Childbirth/delivery professional services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Imaging tests like X-Rays, CT/PET Scans, or MRI's - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Out Patient Services, Surgical Services (Procedure & Anesthesia): You pay the full cost until your deductible is met, then 20% of the covered amount.
Imaging tests like X-Rays, CT/PET Scans, or MRI's - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Generic medication (30-day supply) from a pharmacy in your plans network: $15 copay
Generic medication (31-90-day supply) from a pharmacy in your plans network: $45 copayemnt
Inpatient mental/ behavioral health, and substance abuse services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Complex Diagnositc Services (CT, MRI, Ultra Sound, PET, Nuclear Med.) (Network): You pay the full cost until your deductible is met, then 20% of the covered amount.
Outpatient mental/ behavioral health, and substance abuse services - In Network: $45 copay
Inpatient mental/ behavioral health, and substance abuse services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Outpatient mental/ behavioral health, and substance abuse services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Brand-name medication thats on your plans preferred list (30-day supply from an in-network pharmacy): $65 copay
Brand-name medication thats on your plans preferred list (31-90-day supply) from an in-network pharmacy): $90 copayemnt
Brand-name medication thats not on your plans preferred list (30-day supply) from an in-network pharmacy): $100 copay
Brand-name medication thats not on your plans preferred list (31-90-day supply) from an in-network pharmacy): $150 copayemnt

96
rag/cigna_3500_hsa.txt Normal file
View file

@ -0,0 +1,96 @@
PLAN: Cigna 3500 HSA
UID: Cigna 3500 HSA
Category: Major Medical
Type: PPO
Marketing Name: Cigna - 3,500 HSA Plan
Average Price: $933.13
Short Description: An HSA-compatible PPO that helps you save on taxes while offering flexible access to care.
Long Description: The Cigna 3500 HSA Plan lets you save money in a Health Savings Account while staying protected. Youll pay 20% after your deductible, and preventive care is 100% covered. If you want to take control of your health spending and save on taxes, this plan is a great fit
PRICING:
Coverage 4: $1418.62
Coverage 3: $863.78
Coverage 2: $956.25
Coverage 1: $493.90
DETAILS:
COVERAGE:
Notes: Yes.
If your plan doesn't meet the Minimum Value Standards, you may be eligible for a premium tax credit to help you pay for a plan through the Marketplace.
Coverage Tier: All
Emergency Room: You pay the full cost until your deductible is met, then 20% of the covered amount.
Monthly Premium: None
Lifetime Maximum: No Maximum
Professoinal Fees: You pay the full cost until your deductible is met, then 20% of the covered amount.
Referral Required: No
Urgent Care Copay: You pay the full cost until your deductible is met, then 20% of the covered amount.
Employee Contribution: TBD by Group
Employer Contribution: TBD by Group
Inpatient Hospital Stay: You pay the full cost until your deductible is met, then 20% of the covered amount.
Habilitation - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Included no cost services: 0% Copay Telemedicine, Virtual Primary Care, Advocay Services
Prescription Drug Deductible: You pay full price for prescriptions until your medical deductible is met.
Habilitation - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Home heslth care - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Hospice services - In Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Specialist Copay - In Network: 20% after deductable met
Emergency Medical Transporation: You pay the full cost until your deductible is met, then 20% of the covered amount.
Primary Care Copay - In Network: 20% after deductable met
Your Rights to Continue Coverage: There are agencies that can help if you have a complaint against your plan for a denial of a claim. This complaint is called a grievance or appeal. For more information about your rights, look at the explaination of benefits you will receivefor that medical claim. Your plan documents also provide complete information to submit a claim, appeal, or a grievance for any reason to your plan.For more information about your rights, this notice, or assistance, contact: Acuity at 1-866-872-6356 or Department of Labor's Employee Benefits Security Administration at 1-866-444-EBSA (3272) or www.dol.gov/ebsa/healthreform.
Deductible (Family) - In Network: 7000
Home heslth care - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Hospice services - Out of Network: There are agencies that can help if you want to continue your coverage after it ends. The contact information for those agencies is :Department of Labor's Employee Benefits Security Administration at 1-866-444-EBSA (3272) or www.dol.gov/ebsa/healthreform. Other coverage options may be available to you too, including buying individual insurance coverage through the Health Insurance Marketplace. For more information about the Marketplace, visit www.HealthCare.gov or call 1-800-318-2596.
Skilled nursing care - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Specialist Copay - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount.
Your Grievance and Appeals Rights: Yes.
If you don't have Minimum Essential Coverage for a month, you'll have to make a payment when you file your tax return unless you qualify for an exemption from the requirement that you have health coverage for that month.
Specialty Drugs - Network Provider: 50% coinsurance after deductable met
Primary Care Copay - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount.
Chiropractic Care Copay - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount.
Deductible (Family) - Out of Network: 14000
Deductible (Individual) - In Netwok: 3500
Pregnancy office visits - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Rehabilitation Services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Skilled nursing care - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Durable medical equipment - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Chiropractic Care Copay - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Deductible (individual) - Out of Netwok: 7000
Pregnancy office visits - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Rehabilitation Services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Specialty Drugs - Out of Network Provider: Not covered
Durable medical equipment - Out of Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Out of Pocket Maximum (Family) - In Network: 13100
Routine Preventive Services (Non-Diagnostic): No Member Cost Sharing - Deductible Waived
Out of Pocket Maximum (family) - Out of Network: 26200
Does this plan meet the Minimum Value Standards?: None
Out of Pockert Maximum (Individual) - In Network: 6650
Cildbirth/delivery facility services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Coinsurance % (Plan pays/Member Pays) - In Network: 80% / 20%%
Does This Plan provide Minimum Essential Coverage?: For more information about limitations and exceptions, see the plan or policy document at https://www.acuity-grp.com
Out of Pocket Maximum (Individual) - Out of Network: 13100
Blood test to help diagnose a condition - In Network: You pay the full cost until of facility and professional service fees until your deductible is met, then 20% of the covered amount.
Cildbirth/delivery facility services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Free Standing Lab & Diagnostic Services (Lab & x-ray): You pay the full cost until your deductible is met, then 0% of the covered amount.
Preventative Care/Screening/Immunization - In Network: 0% Coinsurance
Childbirth/delivery professional services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Coinsurance % (Plan pays/Member Pays) - Out of Network: 60% / 40%
Blood test to help diagnose a condition - Out of Network: You pay the full cost facility and professional service fees until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Preventative Care/Screening/Immunization - Out of Network: Not Covered
Childbirth/delivery professional services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Imaging tests like X-Rays, CT/PET Scans, or MRI's - In Network: You pay the full cost until of facility and professional service fees until your deductible is met, then 20% of the covered amount.
Out Patient Services, Surgical Services (Procedure & Anesthesia): You pay the full cost until your deductible is met, then 20% of the covered amount.
Imaging tests like X-Rays, CT/PET Scans, or MRI's - Out of Network: You pay the full cost facility and professional service fees until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Generic medication (30-day supply) from a pharmacy in your plans network: $15 copay
Generic medication (31-90-day supply) from a pharmacy in your plans network: $45 copayemnt
Inpatient mental/ behavioral health, and substance abuse services - In Network: You pay the full cost until of facility and professional service fees until your deductible is met, then 20% of the covered amount.
Complex Diagnositc Services (CT, MRI, Ultra Sound, PET, Nuclear Med.) (Network): You pay the full cost until your deductible is met, then 20% of the covered amount.
Outpatient mental/ behavioral health, and substance abuse services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Inpatient mental/ behavioral health, and substance abuse services - Out of Network: You pay the full cost facility and professional service fees until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Outpatient mental/ behavioral health, and substance abuse services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Brand-name medication thats on your plans preferred list (30-day supply from an in-network pharmacy): $65 copay
Brand-name medication thats on your plans preferred list (31-90-day supply) from an in-network pharmacy): $90 copayemnt
Brand-name medication thats not on your plans preferred list (30-day supply) from an in-network pharmacy): $100 copay
Brand-name medication thats not on your plans preferred list (31-90-day supply) from an in-network pharmacy): $150 copayemnt

View file

@ -0,0 +1,96 @@
PLAN: Cigna 5000 Classic
UID: Cigna 5000 Classic
Category: Major Medical
Type: PPO
Marketing Name: Cigna - 5000 Plan
Average Price: $979.04
Short Description: A high-deductible PPO plan with clear cost-sharing and strong coverage for major medical needs.
Long Description: With a $5,000 deductible and copays starting at $45, the Cigna 5000 Plan gives you strong protection at a lower monthly cost. Its perfect if youre looking for a PPO that covers the big stuff but doesnt overcharge for the basics.
PRICING:
Coverage 4: $1488.80
Coverage 3: $906.22
Coverage 2: $1003.32
Coverage 1: $517.85
DETAILS:
COVERAGE:
Notes: Yes.
If your plan doesn't meet the Minimum Value Standards, you may be eligible for a premium tax credit to help you pay for a plan through the Marketplace.
Coverage Tier: All
Emergency Room: You pay the full cost until your deductible is met, then 20% of the covered amount.
Monthly Premium: None
Lifetime Maximum: No Maximum
Professoinal Fees: You pay the full cost until your deductible is met, then 20% of the covered amount.
Referral Required: No
Urgent Care Copay: 90
Employee Contribution: TBD by Group
Employer Contribution: TBD by Group
Inpatient Hospital Stay: You pay the full cost until your deductible is met, then 20% of the covered amount.
Habilitation - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Included no cost services: 0% Copay Telemedicine, Virtual Primary Care, Advocay Services
Prescription Drug Deductible: You just pay low copays for medications right away—no deductible needs to be met.
Habilitation - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Home heslth care - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Hospice services - In Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Specialist Copay - In Network: 20% after deductable met
Emergency Medical Transporation: You pay the full cost until your deductible is met, then 20% of the covered amount.
Primary Care Copay - In Network: 45
Your Rights to Continue Coverage: There are agencies that can help if you have a complaint against your plan for a denial of a claim. This complaint is called a grievance or appeal. For more information about your rights, look at the explaination of benefits you will receivefor that medical claim. Your plan documents also provide complete information to submit a claim, appeal, or a grievance for any reason to your plan.For more information about your rights, this notice, or assistance, contact: Acuity at 1-866-872-6356 or Department of Labor's Employee Benefits Security Administration at 1-866-444-EBSA (3272) or www.dol.gov/ebsa/healthreform.
Deductible (Family) - In Network: 10000
Home heslth care - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Hospice services - Out of Network: There are agencies that can help if you want to continue your coverage after it ends. The contact information for those agencies is :Department of Labor's Employee Benefits Security Administration at 1-866-444-EBSA (3272) or www.dol.gov/ebsa/healthreform. Other coverage options may be available to you too, including buying individual insurance coverage through the Health Insurance Marketplace. For more information about the Marketplace, visit www.HealthCare.gov or call 1-800-318-2596.
Skilled nursing care - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Specialist Copay - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount.
Your Grievance and Appeals Rights: Yes.
If you don't have Minimum Essential Coverage for a month, you'll have to make a payment when you file your tax return unless you qualify for an exemption from the requirement that you have health coverage for that month.
Specialty Drugs - Network Provider: 50% coinsurance
Primary Care Copay - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount.
Chiropractic Care Copay - In Network: 20
Deductible (Family) - Out of Network: 14000
Deductible (Individual) - In Netwok: 5000
Pregnancy office visits - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Rehabilitation Services - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Skilled nursing care - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Durable medical equipment - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Chiropractic Care Copay - Out of Network: NA
Deductible (individual) - Out of Netwok: 7000
Pregnancy office visits - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Rehabilitation Services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Specialty Drugs - Out of Network Provider: Not covered
Durable medical equipment - Out of Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Out of Pocket Maximum (Family) - In Network: 14700
Routine Preventive Services (Non-Diagnostic): No Member Cost Sharing - Deductible Waived
Out of Pocket Maximum (family) - Out of Network: 29400
Does this plan meet the Minimum Value Standards?: None
Out of Pockert Maximum (Individual) - In Network: 7350
Cildbirth/delivery facility services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Coinsurance % (Plan pays/Member Pays) - In Network: 80% / 20%%
Does This Plan provide Minimum Essential Coverage?: For more information about limitations and exceptions, see the plan or policy document at https://www.acuity-grp.com
Out of Pocket Maximum (Individual) - Out of Network: 14700
Blood test to help diagnose a condition - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount.
Cildbirth/delivery facility services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Free Standing Lab & Diagnostic Services (Lab & x-ray): You pay the full cost until your deductible is met, then 0% of the covered amount.
Preventative Care/Screening/Immunization - In Network: 0% Coinsurance
Childbirth/delivery professional services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Coinsurance % (Plan pays/Member Pays) - Out of Network: 60% / 40%
Blood test to help diagnose a condition - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Preventative Care/Screening/Immunization - Out of Network: Not Covered
Childbirth/delivery professional services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Imaging tests like X-Rays, CT/PET Scans, or MRI's - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Out Patient Services, Surgical Services (Procedure & Anesthesia): You pay the full cost until your deductible is met, then 20% of the covered amount.
Imaging tests like X-Rays, CT/PET Scans, or MRI's - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Generic medication (30-day supply) from a pharmacy in your plans network: $15 copay
Generic medication (31-90-day supply) from a pharmacy in your plans network: $45 copayemnt
Inpatient mental/ behavioral health, and substance abuse services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Complex Diagnositc Services (CT, MRI, Ultra Sound, PET, Nuclear Med.) (Network): You pay the full cost until your deductible is met, then 20% of the covered amount.
Outpatient mental/ behavioral health, and substance abuse services - In Network: $45 copay
Inpatient mental/ behavioral health, and substance abuse services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Outpatient mental/ behavioral health, and substance abuse services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Brand-name medication thats on your plans preferred list (30-day supply from an in-network pharmacy): $65 copay
Brand-name medication thats on your plans preferred list (31-90-day supply) from an in-network pharmacy): $90 copayemnt
Brand-name medication thats not on your plans preferred list (30-day supply) from an in-network pharmacy): $100 copay
Brand-name medication thats not on your plans preferred list (31-90-day supply) from an in-network pharmacy): $150 copayemnt

96
rag/cigna_5000_hsa.txt Normal file
View file

@ -0,0 +1,96 @@
PLAN: Cigna 5000 HSA
UID: Cigna 5000 HSA
Category: Major Medical
Type: PPO
Marketing Name: Cigna- 5000 HSA Plan
Average Price: $889.41
Short Description: An HSA-qualified plan with maximum flexibility and tax-saving benefits for healthcare expenses.
Long Description: The Cigna 5000 HSA Plan is all about flexibility and smart saving. It pairs a $5,000 deductible with access to a Health Savings Account, where you can use pre-tax dollars to cover your care. Ideal for folks who like to plan ahead and take control of their health budget.
PRICING:
Coverage 4: $1351.78
Coverage 3: $823.36
Coverage 2: $911.43
Coverage 1: $471.10
DETAILS:
COVERAGE:
Notes: Yes.
If your plan doesn't meet the Minimum Value Standards, you may be eligible for a premium tax credit to help you pay for a plan through the Marketplace.
Coverage Tier: All
Emergency Room: You pay the full cost until your deductible is met, then 20% of the covered amount.
Monthly Premium: None
Lifetime Maximum: No Maximum
Professoinal Fees: You pay the full cost until your deductible is met, then 20% of the covered amount.
Referral Required: No
Urgent Care Copay: You pay the full cost until your deductible is met, then 20% of the covered amount.
Employee Contribution: TBD by Group
Employer Contribution: TBD by Group
Inpatient Hospital Stay: You pay the full cost until your deductible is met, then 20% of the covered amount.
Habilitation - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Included no cost services: 0% Copay Telemedicine, Virtual Primary Care, Advocay Services
Prescription Drug Deductible: You pay full price for prescriptions until your medical deductible is met.
Habilitation - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Home heslth care - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Hospice services - In Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Specialist Copay - In Network: 20% after deductable met
Emergency Medical Transporation: You pay the full cost until your deductible is met, then 20% of the covered amount.
Primary Care Copay - In Network: 20% after deductable met
Your Rights to Continue Coverage: There are agencies that can help if you have a complaint against your plan for a denial of a claim. This complaint is called a grievance or appeal. For more information about your rights, look at the explaination of benefits you will receivefor that medical claim. Your plan documents also provide complete information to submit a claim, appeal, or a grievance for any reason to your plan.For more information about your rights, this notice, or assistance, contact: Acuity at 1-866-872-6356 or Department of Labor's Employee Benefits Security Administration at 1-866-444-EBSA (3272) or www.dol.gov/ebsa/healthreform.
Deductible (Family) - In Network: None
Home heslth care - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Hospice services - Out of Network: There are agencies that can help if you want to continue your coverage after it ends. The contact information for those agencies is :Department of Labor's Employee Benefits Security Administration at 1-866-444-EBSA (3272) or www.dol.gov/ebsa/healthreform. Other coverage options may be available to you too, including buying individual insurance coverage through the Health Insurance Marketplace. For more information about the Marketplace, visit www.HealthCare.gov or call 1-800-318-2596.
Skilled nursing care - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Specialist Copay - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount.
Your Grievance and Appeals Rights: Yes.
If you don't have Minimum Essential Coverage for a month, you'll have to make a payment when you file your tax return unless you qualify for an exemption from the requirement that you have health coverage for that month.
Specialty Drugs - Network Provider: You pay full price for prescriptions until your medical deductible is met.
Primary Care Copay - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount.
Chiropractic Care Copay - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount.
Deductible (Family) - Out of Network: 20000
Deductible (Individual) - In Netwok: 5000
Pregnancy office visits - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Rehabilitation Services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Skilled nursing care - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Durable medical equipment - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Chiropractic Care Copay - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Deductible (individual) - Out of Netwok: 10000
Pregnancy office visits - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Rehabilitation Services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Specialty Drugs - Out of Network Provider: Not covered
Durable medical equipment - Out of Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Out of Pocket Maximum (Family) - In Network: 14700
Routine Preventive Services (Non-Diagnostic): No Member Cost Sharing - Deductible Waived
Out of Pocket Maximum (family) - Out of Network: 29400
Does this plan meet the Minimum Value Standards?: None
Out of Pockert Maximum (Individual) - In Network: 7350
Cildbirth/delivery facility services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Coinsurance % (Plan pays/Member Pays) - In Network: 80% / 20%%
Does This Plan provide Minimum Essential Coverage?: For more information about limitations and exceptions, see the plan or policy document at https://www.acuity-grp.com
Out of Pocket Maximum (Individual) - Out of Network: 14700
Blood test to help diagnose a condition - In Network: You pay the full cost until of facility and professional service fees until your deductible is met, then 20% of the covered amount.
Cildbirth/delivery facility services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Free Standing Lab & Diagnostic Services (Lab & x-ray): You pay the full cost until your deductible is met, then 0% of the covered amount.
Preventative Care/Screening/Immunization - In Network: 0% Coinsurance
Childbirth/delivery professional services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Coinsurance % (Plan pays/Member Pays) - Out of Network: 60% / 40%
Blood test to help diagnose a condition - Out of Network: You pay the full cost facility and professional service fees until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Preventative Care/Screening/Immunization - Out of Network: Not Covered
Childbirth/delivery professional services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Imaging tests like X-Rays, CT/PET Scans, or MRI's - In Network: You pay the full cost until of facility and professional service fees until your deductible is met, then 20% of the covered amount.
Out Patient Services, Surgical Services (Procedure & Anesthesia): You pay the full cost until your deductible is met, then 20% of the covered amount.
Imaging tests like X-Rays, CT/PET Scans, or MRI's - Out of Network: You pay the full cost facility and professional service fees until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Generic medication (30-day supply) from a pharmacy in your plans network: $15 copay
Generic medication (31-90-day supply) from a pharmacy in your plans network: $30 copayemnt
Inpatient mental/ behavioral health, and substance abuse services - In Network: You pay the full cost until of facility and professional service fees until your deductible is met, then 20% of the covered amount.
Complex Diagnositc Services (CT, MRI, Ultra Sound, PET, Nuclear Med.) (Network): You pay the full cost until your deductible is met, then 20% of the covered amount.
Outpatient mental/ behavioral health, and substance abuse services - In Network: You pay the full cost until your deductible is met, then 20% of the covered amount subject to plan's allowable fee.
Inpatient mental/ behavioral health, and substance abuse services - Out of Network: You pay the full cost facility and professional service fees until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Outpatient mental/ behavioral health, and substance abuse services - Out of Network: You pay the full cost until your deductible is met, then 40% of the covered amount subject to plan's allowable fee.
Brand-name medication thats on your plans preferred list (30-day supply from an in-network pharmacy): $65 copay
Brand-name medication thats on your plans preferred list (31-90-day supply) from an in-network pharmacy): $130 copayemnt
Brand-name medication thats not on your plans preferred list (30-day supply) from an in-network pharmacy): $100 copay
Brand-name medication thats not on your plans preferred list (31-90-day supply) from an in-network pharmacy): $200 copayemnt

94
rag/cigna_7350_value.txt Normal file
View file

@ -0,0 +1,94 @@
PLAN: Cigna 7350 Value
UID: Cigna 7350 Value
Category: Major Medical
Type: PPO
Marketing Name: Cigna - 7350 Value Plan
Average Price: $847.77
Short Description: Our lowest-cost PPO plan, ideal for healthy individuals who want essential protection and peace of mind.
Long Description: The Cigna 7350 Value Plan offers the lowest premium of all. It comes with a $7,350 deductible and matching out-of-pocket max, plus $50 copays for doctors and $100 for specialists. Preventive care is free. Its a great fit for those who dont go to the doctor often but want peace of mind just in case.
PRICING:
Coverage 4: $1288.12
Coverage 3: $784.87
Coverage 2: $868.74
Coverage 1: $449.38
DETAILS:
COVERAGE:
Notes: Yes.
If your plan doesn't meet the Minimum Value Standards, you may be eligible for a premium tax credit to help you pay for a plan through the Marketplace.
Coverage Tier: All
Emergency Room: You pay the full cost until your deductible is met, then 0% of the covered amount.
Monthly Premium: None
Lifetime Maximum: No Maximum
Professoinal Fees: You pay the full cost until your deductible is met, then 0% of the covered amount.
Referral Required: No
Urgent Care Copay: 100
Employee Contribution: TBD by Group
Employer Contribution: TBD by Group
Inpatient Hospital Stay: You pay the full cost until your deductible is met, then 0% of the covered amount.
Habilitation - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Included no cost services: 0% Copay Telemedicine, Virtual Primary Care, Advocay Services
Prescription Drug Deductible: You just pay low copays for medications right away—no deductible needs to be met.
Habilitation - Out of Network: You pay in full until deductible met ; after that, the plan covers 100% subject to plan's allowable fee.
Home heslth care - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Hospice services - In Network: You pay in full until deductible met ; after that, the plan covers 100% subject to plan's allowable fee.
Specialist Copay - In Network: 100
Emergency Medical Transporation: You pay the full cost until your deductible is met, then 0% of the covered amount.
Primary Care Copay - In Network: 50
Your Rights to Continue Coverage: There are agencies that can help if you have a complaint against your plan for a denial of a claim. This complaint is called a grievance or appeal. For more information about your rights, look at the explaination of benefits you will receivefor that medical claim. Your plan documents also provide complete information to submit a claim, appeal, or a grievance for any reason to your plan.For more information about your rights, this notice, or assistance, contact: Acuity at 1-866-872-6356 or Department of Labor's Employee Benefits Security Administration at 1-866-444-EBSA (3272) or www.dol.gov/ebsa/healthreform.
Deductible (Family) - In Network: 14700
Home heslth care - Out of Network: You pay in full until deductible met ; after that, the plan covers 100% subject to plan's allowable fee.
Hospice services - Out of Network: There are agencies that can help if you want to continue your coverage after it ends. The contact information for those agencies is :Department of Labor's Employee Benefits Security Administration at 1-866-444-EBSA (3272) or www.dol.gov/ebsa/healthreform. Other coverage options may be available to you too, including buying individual insurance coverage through the Health Insurance Marketplace. For more information about the Marketplace, visit www.HealthCare.gov or call 1-800-318-2596.
Skilled nursing care - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Specialist Copay - Out of Network: You pay the full cost until your deductible is met, then 50% of the covered amount.
Your Grievance and Appeals Rights: Yes.
If you don't have Minimum Essential Coverage for a month, you'll have to make a payment when you file your tax return unless you qualify for an exemption from the requirement that you have health coverage for that month.
Specialty Drugs - Network Provider: 50% coinsurance
Primary Care Copay - Out of Network: You pay the full cost until your deductible is met, then 0% of the covered amount.
Chiropractic Care Copay - In Network: 20
Deductible (Family) - Out of Network: 29400
Deductible (Individual) - In Netwok: 7350
Pregnancy office visits - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Rehabilitation Services - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Skilled nursing care - Out of Network: You pay in full until deductible met ; after that, the plan covers 100% subject to plan's allowable fee.
Durable medical equipment - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Chiropractic Care Copay - Out of Network: NA
Deductible (individual) - Out of Netwok: 14700
Pregnancy office visits - Out of Network: You pay in full until deductible met ; after that, the plan covers 100% subject to plan's allowable fee.
Rehabilitation Services - Out of Network: You pay in full until deductible met ; after that, the plan covers 100% subject to plan's allowable fee.
Specialty Drugs - Out of Network Provider: Not Covered
Durable medical equipment - Out of Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Out of Pocket Maximum (Family) - In Network: 14700
Routine Preventive Services (Non-Diagnostic): No Member Cost Sharing - Deductible Waived
Out of Pocket Maximum (family) - Out of Network: 29400
Does this plan meet the Minimum Value Standards?: None
Out of Pockert Maximum (Individual) - In Network: 7350
Cildbirth/delivery facility services - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Coinsurance % (Plan pays/Member Pays) - In Network: Plan pays 100%
Does This Plan provide Minimum Essential Coverage?: For more information about limitations and exceptions, see the plan or policy document at https://www.acuity-grp.com
Out of Pocket Maximum (Individual) - Out of Network: 14700
Blood test to help diagnose a condition - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount.
Cildbirth/delivery facility services - Out of Network: You pay in full until deductible met ; after that, the plan covers 100% subject to plan's allowable fee.
Free Standing Lab & Diagnostic Services (Lab & x-ray): You pay the full cost until your deductible is met, then 0% of the covered amount.
Preventative Care/Screening/Immunization - In Network: 0% Coinsurance
Childbirth/delivery professional services - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Coinsurance % (Plan pays/Member Pays) - Out of Network: 50%/50%
Blood test to help diagnose a condition - Out of Network: You pay in full until deductible met ; after that, the plan covers 100% subject to plan's allowable fee.
Preventative Care/Screening/Immunization - Out of Network: Not Covered
Childbirth/delivery professional services - Out of Network: You pay in full until deductible met ; after that, the plan covers 100% subject to plan's allowable fee.
Imaging tests like X-Rays, CT/PET Scans, or MRI's - In Network: You pay in full until deductible met ; after that, the plan covers 100% subject to plan's allowable fee.
Out Patient Services, Surgical Services (Procedure & Anesthesia): You pay the full cost until your deductible is met, then 0% of the covered amount.
Imaging tests like X-Rays, CT/PET Scans, or MRI's - Out of Network: You pay in full until deductible met ; after that, the plan covers 100% subject to plan's allowable fee.
Generic medication (30-day supply) from a pharmacy in your plans network: $15 copay
Generic medication (31-90-day supply) from a pharmacy in your plans network: $45 copayemnt
Inpatient mental/ behavioral health, and substance abuse services - In Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Complex Diagnositc Services (CT, MRI, Ultra Sound, PET, Nuclear Med.) (Network): You pay the full cost until your deductible is met, then 0% of the covered amount.
Outpatient mental/ behavioral health, and substance abuse services - In Network: $50 copay
Inpatient mental/ behavioral health, and substance abuse services - Out of Network: You pay in full until deductible met ; after that, the plan covers 100% subject to plan's allowable fee.
Outpatient mental/ behavioral health, and substance abuse services - Out of Network: You pay the full cost until your deductible is met, then 0% of the covered amount subject to plan's allowable fee.
Brand-name medication thats on your plans preferred list (30-day supply from an in-network pharmacy): $65 copay
Brand-name medication thats on your plans preferred list (31-90-day supply) from an in-network pharmacy): $90 copayemnt
Brand-name medication thats not on your plans preferred list (30-day supply) from an in-network pharmacy): $100 copay
Brand-name medication thats not on your plans preferred list (31-90-day supply) from an in-network pharmacy): $150 copayemnt

View file

@ -0,0 +1,296 @@
PLAN: Equitable Accident Insurance Plan
UID: Equitable Accident Plan
Category: Accident
Type: None
Marketing Name: Equitable Accedent lan
Average Price: $43.02
Short Description: This accident plan provides cash benefits for a wide range of injuries — from fractures and dislocations to hospital stays and emergency care — helping cover out-of-pocket costs for both minor and major accidents.
Long Description: The Equitable Accident Insurance Plan offers financial protection for unexpected injuries by paying cash benefits directly to you. Coverage includes a broad range of injuries such as fractures, dislocations, burns, lacerations, and even paralysis. Benefits also cover medical treatments like X-rays, physical therapy, and hospital stays. The money can be used however you need — whether for medical bills, daily expenses, or lost income — giving you peace of mind after an accident.
PRICING:
Coverage 4: $63.74
Coverage 3: $46.37
Coverage 2: $39.69
Coverage 1: $22.28
DETAILS:
BURNS:
Skin graft - Child: Pays 50% of the full burn benefit.
Skin graft - Spouse: Pays 50% of the full burn benefit.
Skin graft - Employee: Pays 50% of the full burn benefit.
2140 sq. cm third degree - Child: 1000
4165 sq. cm third degree - Child: 2000
2140 sq. cm second degree - Child: 400
2140 sq. cm third degree - Spouse: 1000
4165 sq. cm second degree - Child: 800
4165 sq. cm third degree - Spouse: 2000
66160 sq. cm third degree - Child: 6000
161225 sq. cm third degree - Child: 14000
2140 sq. cm second degree - Spouse: 400
4165 sq. cm second degree - Spouse: 800
66160 sq. cm second degree - Child: 1200
66160 sq. cm third degree - Spouse: 6000
161225 sq. cm second degree - Child: 1600
161225 sq. cm third degree - Spouse: 14000
2140 sq. cm third degree - Employee: 1000
4165 sq. cm third degree - Employee: 2000
66160 sq. cm second degree - Spouse: 1200
161225 sq. cm second degree - Spouse: 1600
2140 sq. cm second degree - Employee: 400
4165 sq. cm second degree - Employee: 800
66160 sq. cm third degree - Employee: 6000
161225 sq. cm third degree - Employee: 14000
66160 sq. cm second degree - Employee: 1200
161225 sq. cm second degree - Employee: 1600
More than 225 sq. cm third degree - Child: 20000
More than 225 sq. cm second degree - Child: 2000
More than 225 sq. cm third degree - Spouse: 20000
More than 225 sq. cm second degree - Spouse: 2000
More than 225 sq. cm third degree - Employee: 20000
More than 225 sq. cm second degree - Employee: 2000
SURGERY:
Open surgery - Child: 3000
Open surgery - Spouse: 3000
Open surgery - Employee: 3000
Torn knee cartilage - Child: 1500
Torn knee cartilage - Spouse: 1500
Torn knee cartilage - Employee: 1500
Ruptured/herniated disc - Child: 1500
Ruptured/herniated disc - Spouse: 1500
Ruptured/herniated disc - Employee: 1500
Tendon/Ligament/Rotator cuff tear - Child: 1500
Exploratory surgery or debridement - Child: 800
Tendon/Ligament/Rotator cuff tear - Spouse: 1500
Exploratory surgery or debridement - Spouse: 800
Tendon/Ligament/Rotator cuff tear - Employee: 1500
Exploratory surgery or debridement - Employee: 800
Laparoscopic surgery or hernia repair - Child: 1000
Laparoscopic surgery or hernia repair - Spouse: 1000
Laparoscopic surgery or hernia repair - Employee: 1000
Miscellaneous surgery requiring general anesthesia not otherwise listed (once per 24-hour period, even though multiple surgical procedures may be performed) - Child: 1000
Miscellaneous surgery requiring general anesthesia not otherwise listed (once per 24-hour period, even though multiple surgical procedures may be performed) - Spouse: 1000
Miscellaneous surgery requiring general anesthesia not otherwise listed (once per 24-hour period, even though multiple surgical procedures may be performed) - Employee: 1000
HOSPITAL:
Ambulance (Air) - Child: 2000
Ambulance (Air) - Spouse: 2000
Ambulance (Air) - Employee: 2000
Ambulance (Ground) - Child: 400
Ambulance (Ground) - Spouse: 400
Ambulance (Ground) - Employee: 400
ER admission or urgent care facility - Child: 200
ER admission or urgent care facility - Spouse: 200
ER admission or urgent care facility - Employee: 200
Hospital admission (once per benefit year) - Child: 2000
Hospital admission (once per benefit year) - Spouse: 2000
Hospital admission (once per benefit year) - Employee: 2000
Rehabilitation unit (per day, up to 30 days per covered accident) - Child: 100
Hospital confinement (per day up to 365 days per covered accident) - Child: 400
Rehabilitation unit (per day, up to 30 days per covered accident) - Spouse: 100
Hospital confinement (per day up to 365 days per covered accident) - Spouse: 400
Rehabilitation unit (per day, up to 30 days per covered accident) - Employee: 100
Hospital confinement (per day up to 365 days per covered accident) - Employee: 400
Transportation (100 or more miles up to three times per covered accident) - Child: 500
Transportation (100 or more miles up to three times per covered accident) - Spouse: 500
Transportation (100 or more miles up to three times per covered accident) - Employee: 500
Family Lodging Maximum Lodging night stays: one benefit per day, 30 days per benefit year - Child: 100
Family Lodging Maximum Lodging night stays: one benefit per day, 30 days per benefit year - Spouse: 100
Family Lodging Maximum Lodging night stays: one benefit per day, 30 days per benefit year - Employee: 100
Intensive care unit confinement (per day up to 15 days; payable in addition to any hospital confinement benefit) - Child: 500
Intensive care unit confinement (per day up to 15 days; payable in addition to any hospital confinement benefit) - Spouse: 500
Intensive care unit confinement (per day up to 15 days; payable in addition to any hospital confinement benefit) - Employee: 500
Intensive care unit admission (once per benefit year; payable instead of hospital admission benefit if confined immediately to ICU) - Child: 400
Intensive care unit admission (once per benefit year; payable instead of hospital admission benefit if confined immediately to ICU) - Spouse: 3000
Intensive care unit admission (once per benefit year; payable instead of hospital admission benefit if confined immediately to ICU) - Employee: 3000
FRACTURES:
Foot - Child: $1,500 / $750
Hand - Child: $1,500 / $750
Heel - Child: $1,500 / $750
Ankle - Child: $1,500 / $750
Elbow - Child: $1,500 / $750
Foot - Spouse: $1,500 / $750
Hand - Spouse: $1,500 / $750
Heel - Spouse: $1,500 / $750
Wrist - Child: $1,500 / $750
Ankle - Spouse: $1,500 / $750
Elbow - Spouse: $1,500 / $750
Wrist - Spouse: $1,500 / $750
Foot - Employee: $1,500 / $750
Forearm - Child: $1,500 / $750
Hand - Employee: $1,500 / $750
Heel - Employee: $1,500 / $750
Ankle - Employee: $1,500 / $750
Elbow - Employee: $1,500 / $750
Forearm - Spouse: $1,500 / $750
Knee cap - Child: $1,500 / $750
Shoulder - Child: $1,500 / $750
Wrist - Employee: $1,500 / $750
Knee cap - Spouse: $1,500 / $750
Lower jaw - Child: $1,500 / $750
Shoulder - Spouse: $1,500 / $750
Collarbone - Child: $1,500 / $750
Forearm - Employee: $1,500 / $750
Lower jaw - Spouse: $1,500 / $750
Collarbone - Spouse: $1,500 / $750
Knee cap - Employee: $1,500 / $750
Shoulder - Employee: $1,500 / $750
Lower jaw - Employee: $1,500 / $750
Collarbone - Employee: $1,500 / $750
Hip or thigh - Child: $10,000 / $5,000
Hip or thigh - Spouse: $10,000 / $5,000
Multiple ribs - Child: $2,000 / $1,000
Multiple ribs - Spouse: $2,000 / $1,000
Skull (simple) - Child: $7,000 / $3,500
Hip or thigh - Employee: $10,000 / $5,000
Skull (simple) - Spouse: $7,000 / $3,500
Multiple ribs - Employee: $2,000 / $1,000
Skull (depressed) - Child: $12,000 / $6,000
Skull (simple) - Employee: $7,000 / $3,500
Vertebral process - Child: $2,000 / $1,000
Skull (depressed) - Spouse: $12,000 / $6,000
Vertebral process - Spouse: $2,000 / $1,000
Skull (depressed) - Employee: $12,000 / $6,000
Vertebral process - Employee: $2,000 / $1,000
Bones of face or nose - Child: $2,000 / $1,000
Leg (tibia or fibula) - Child: $6,000 / $3,000
Bones of face or nose - Spouse: $2,000 / $1,000
Leg (tibia or fibula) - Spouse: $6,000 / $3,000
Upper jaw or upper arm - Child: $2,000 / $1,000
Upper jaw or upper arm - Spouse: $2,000 / $1,000
Bones of face or nose - Employee: $2,000 / $1,000
Leg (tibia or fibula) - Employee: $6,000 / $3,000
Pelvis (excluding coccyx) - Child: $8,000 / $4,000
Upper jaw or upper arm - Employee: $2,000 / $1,000
Pelvis (excluding coccyx) - Spouse: $8,000 / $4,000
Rib, finger, toe or coccyx - Child: $1,500 / $750
Rib, finger, toe or coccyx - Spouse: $1,500 / $750
Pelvis (excluding coccyx) - Employee: $8,000 / $4,000
Rib, finger, toe or coccyx - Employee: $1,500 / $750
Vertebrae (body of) or sternum - Child: $5,000 / $2,500
Vertebrae (body of) or sternum - Spouse: $5,000 / $2,500
Vertebrae (body of) or sternum - Employee: $5,000 / $2,500
Chip fractures and other fractures not reduced (not treated by a doctor) - Child: Pays 25% of the full amount if the bone is treated, with or without surgery.
Chip fractures and other fractures not reduced (not treated by a doctor) - Spouse: Pays 25% of the full amount if the bone is treated, with or without surgery.
Chip fractures and other fractures not reduced (not treated by a doctor) - Employee: Pays 25% of the full amount if the bone is treated, with or without surgery.
LACERATIONS:
Single laceration under 5 cm with suture - Child: 65
Single laceration under 5 cm with suture - Spouse: 65
Single laceration under 5 cm with suture - Employee: 65
Laceration(s) with no sutures and treated by a physician - Child: 35
Laceration(s) with no sutures and treated by a physician - Spouse: 35
Laceration(s) with no sutures and treated by a physician - Employee: 35
Lacerations 515 cm with sutures (total of all lacerations) - Child: 250
Lacerations 515 cm with sutures (total of all lacerations) - Spouse: 250
Lacerations 515 cm with sutures (total of all lacerations) - Employee: 250
Lacerations greater than 15 cm with sutures (total of all lacerations) - Child: 500
Lacerations greater than 15 cm with sutures (total of all lacerations) - Spouse: 500
Lacerations greater than 15 cm with sutures (total of all lacerations) - Employee: 500
DISLOCATIONS:
Shoulder - Child: $3,000 / $1,500
Lower jaw - Child: $1,500 / $750
Shoulder - Spouse: $3,000 / $1,500
Lower jaw - Spouse: $1,500 / $750
Shoulder - Employee: $3,000 / $1,500
Lower jaw - Employee: $1,500 / $750
Elbow or wrist - Child: $1,500 / $700
Elbow or wrist - Spouse: $1,500 / $700
Elbow or wrist - Employee: $1,500 / $700
Finger(s) or toe(s) - Child: $1,000 / $500
Finger(s) or toe(s) - Spouse: $1,000 / $500
Finger(s) or toe(s) - Employee: $1,000 / $500
Incomplete dislocation - Child: 25% of the applicable non -surgical procedure
Incomplete dislocation - Spouse: 25% of the applicable non -surgical procedure
Incomplete dislocation - Employee: 25% of the applicable non -surgical procedure
Collarbone or bones of the hand - Child: $4,000 / $2,000
Collarbone or bones of the hand - Spouse: $4,000 / $2,000
Knee, ankle or bones of the foot - Child: $5,000 / $2,500
Knee, ankle or bones of the foot - Spouse: $5,000 / $2,500
Collarbone or bones of the hand - Employee: $4,000 / $2,000
Knee, ankle or bones of the foot - Employee: $5,000 / $2,500
Hip (surgery required /no surgery required) - Child: $10,000 / $5,000
Hip (surgery required /no surgery required) - Spouse: $10,000 / $5,000
Hip (surgery required /no surgery required) - Employee: $10,000 / $5,000
EMERGENCYDENTAL:
Emergency dental crown - Child: 200
Emergency dental crown - Spouse: 200
Emergency dental crown - Employee: 200
Emergency dental extraction) - Child: 65
Emergency dental extraction) - Spouse: 65
Emergency dental extraction) - Employee: 65
Wellness screening benefit (once per benefit year) - Child: 50
Wellness screening benefit (once per benefit year) - Spouse: 50
Wellness screening benefit (once per benefit year) - Employee: 50
MEDICALSERVICES:
Anesthesia - Child: 100
Anesthesia - Spouse: 100
Anesthesia - Employee: 100
Medical devices - Child: 500
Medical devices - Spouse: 500
Prosthesis (one) - Child: 750
Prosthesis (two) - Child: 1500
Prescription drug - Child: 50
Prosthesis (one) - Spouse: 750
Prosthesis (two) - Spouse: 1500
Medical devices - Employee: 500
Prescription drug - Spouse: 50
Prosthesis (one) - Employee: 750
Prosthesis (two) - Employee: 1500
Prescription drug - Employee: 50
Blood, plasma or platelet transfusion - Child: 200
Blood, plasma or platelet transfusion - Spouse: 200
Blood, plasma or platelet transfusion - Employee: 200
Epidural pain management (up to 2 times per covered accident) - Child: 100
Epidural pain management (up to 2 times per covered accident) - Spouse: 100
Epidural pain management (up to 2 times per covered accident) - Employee: 100
Diagnostic exam (one-time per benefit year): X-ray (once per covered accident) - Child: 100
Diagnostic exam (one-time per benefit year): X-ray (once per covered accident) - Spouse: 100
Diagnostic exam (one-time per benefit year): X-ray (once per covered accident) - Employee: 100
Physical and occupational therapy (per visit, up to 10 times per covered accident) - Child: 100
Physical and occupational therapy (per visit, up to 10 times per covered accident) - Spouse: 100
Physical and occupational therapy (per visit, up to 10 times per covered accident) - Employee: 100
Diagnostic exam (one-time per benefit year): Arteriogram, angiogram, CT, CAT, EKG, EEG or MRI - Child: 200
Diagnostic exam (one-time per benefit year): Arteriogram, angiogram, CT, CAT, EKG, EEG or MRI - Spouse: 200
Physicians follow-up treatment office visit (per visit, up to 10 times per covered accident) - Child: 75
Diagnostic exam (one-time per benefit year): Arteriogram, angiogram, CT, CAT, EKG, EEG or MRI - Employee: 200
Physicians follow-up treatment office visit (per visit, up to 10 times per covered accident) - Spouse: 75
Accident emergency treatment (non-ER or non-urgent care facility) (one time per covered accident) - Child: 150
Accident emergency treatment (non-ER or non-urgent care facility) (one time per covered accident) - Spouse: 150
Physicians follow-up treatment office visit (per visit, up to 10 times per covered accident) - Employee: 75
Accident emergency treatment (non-ER or non-urgent care facility) (one time per covered accident) - Employee: 150
WELLNESSBENEFIT:
ACCIDENTALDISMEMBERMENT:
Loss of sight or loss of an eye — one eye - Child: 5000
Loss of sight or loss of an eye — one eye - Spouse: 10000
Loss of hearing or loss of an ear — one ear - Child: 5000
Loss of hearing or loss of an ear — one ear - Spouse: 10000
Loss of sight or loss of an eye — one eye - Employee: 10000
Loss of hearing or loss of an ear — one ear - Employee: 10000
Loss of a finger or loss of a toe — one finger or one toe - Child: 500
Loss of a finger or loss of a toe — one finger or one toe - Spouse: 1000
Loss of a finger or loss of a toe — one finger or one toe - Employee: 1000
Loss of a finger or loss of a toe — two or more fingers or toes - Child: 1500
Loss of a finger or loss of a toe — two or more fingers or toes - Spouse: 3000
Loss of a finger or loss of a toe — two or more fingers or toes - Employee: 3000
Loss of hand — one hand, Loss of foot — one foot, Loss of leg — one leg or loss of arm — one arm - Child: 10000
Loss of hand — one hand, Loss of foot — one foot, Loss of leg — one leg or loss of arm — one arm - Spouse: 10000
Loss of hand — one hand, Loss of foot — one foot, Loss of leg — one leg or loss of arm — one arm - Employee: 10000
LIFEANDDISMEMBERMENTLOSSES:
Accidental Death - Child: 25000
Accidental Death - Spouse: 50000
Accidental Death - Employee: 50000
Accidental Death Common Carrier (If a person wo is covered dies in an accident while riding a commercial vehicle, like a plane, train, bus, ferry, or subway, the insurance pays a larger benefit than a standard accidental death) - Child: 100000
Accidental Death Common Carrier (If a person wo is covered dies in an accident while riding a commercial vehicle, like a plane, train, bus, ferry, or subway, the insurance pays a larger benefit than a standard accidental death) -Spouse: 200000
Accidental Death Common Carrier (If a person wo is covered dies in an accident while riding a commercial vehicle, like a plane, train, bus, ferry, or subway, the insurance pays a larger benefit than a standard accidental death) - Employee: 200000
Catastrophic loss: loss of arm or loss of hand — both arms or both hands, loss of leg or loss of foot — both legs or both feet, loss of hand and loss of foot or loss of arm and loss of leg — one hand and one foot or one arm and one leg, loss of an ear — both ears, irrecoverable loss of hearing — both ears, loss of an eye — both eyes, irrecoverable loss of sight — both eyes, irrecoverable loss of speech or ability to speak, or any combination equaling two or more losses from: loss of arm, loss of hand, loss of leg, loss of foot, loss of an ear or loss of an eye - Child: 25000
Catastrophic loss: loss of arm or loss of hand — both arms or both hands, loss of leg or loss of foot — both legs or both feet, loss of hand and loss of foot or loss of arm and loss of leg — one hand and one foot or one arm and one leg, loss of an ear — both ears, irrecoverable loss of hearing — both ears, loss of an eye — both eyes, irrecoverable loss of sight — both eyes, irrecoverable loss of speech or ability to speak, or any combination equaling two or more losses from: loss of arm, loss of hand, loss of leg, loss of foot, loss of an ear or loss of an eye - Spouse: 25000
Catastrophic loss: loss of arm or loss of hand — both arms or both hands, loss of leg or loss of foot — both legs or both feet, loss of hand and loss of foot or loss of arm and loss of leg — one hand and one foot or one arm and one leg, loss of an ear — both ears, irrecoverable loss of hearing — both ears, loss of an eye — both eyes, irrecoverable loss of sight — both eyes, irrecoverable loss of speech or ability to speak, or any combination equaling two or more losses from: loss of arm, loss of hand, loss of leg, loss of foot, loss of an ear or loss of an eye - Employee: 25000

View file

@ -0,0 +1,92 @@
PLAN: Equitable Critical Illness Insurance Plan
UID: Equitable Critical Illness Plan
Category: Critical Illness
Type: None
Marketing Name: Equitable Critical Illness Plan
Average Price: $43.02
Short Description: This plan pays a lump sum cash benefit if you're diagnosed with a covered critical illness, like cancer, heart attack, or stroke — helping you handle medical bills, lost income, or everyday expenses.
Long Description: The Equitable Critical Illness plan provides a one-time cash payment when youre diagnosed with a serious condition such as cancer, heart attack, stroke, or organ failure. Benefits range from $10,000 to $40,000 for employees and their families and are paid directly to you — not to doctors or hospitals — so you can use them however you need: for medical bills, rent, groceries, or recovery time. The plan also includes recurrence benefits for repeat diagnoses and a wellness screening benefit that pays $50 annually when you complete eligible health screenings.
PRICING:
Coverage 4: $63.74
Coverage 3: $46.37
Coverage 2: $39.69
Coverage 1: $22.28
DETAILS:
BENEFITS:
Benefit Amount - Child: $5,000 minimum in $5,000 increments to a maximum of $20,000 Not to exceed 50% of the Employee Benefit
Benefit Amount - Spouse: $10,000 minimum in $10,000 increments to a maximum of $40,000 Not to exceed 100% of the Employee Benefit
Benefit Amount - Employee: $10,000 minimum to a maximum of $40,000 in $10,000 increments
COVERAGE:
Coma - Benefit Percentages: 100%
Stroke - Benefit Percentages: 100%
Blindness - Benefit Percentages: 100%
Paralysis - Benefit Percentages: 100%
Angioplasty - Benefit Percentages: 5%
Skin Cancer - Benefit Percentages: 5%
Severe Burns - Benefit Percentages: 100%
Hearrt Attack - Benefit Percentages: 100%
Cancer in Situ - Benefit Percentages: 25%
Loss of Speech - Benefit Percentages: 100%
Coma - Recurrence Benefit Percentages: 100%
Invasive Cancer - Benefit Percentages: 100%
Stroke - Recurrence Benefit Percentages: 100%
Benign Brain Tumor - Benefit Percentages: 100%
Major organ failure - Benefit Percentages: 100%
Blindness - Recurrence Benefit Percentages: N/A
Paralysis - Recurrence Benefit Percentages: 100%
Angioplasty - Recurrence Benefit Percentages: 5%
Coronary Artery Bypass - Benefit Percentages: 25%
Skin Cancer - Recurrence Benefit Percentages: 5%
End-stage heart failure - Benefit Percentages: 100%
Heart Attack - Recurrence Benefit Percentages: 100%
Severe Burns - Recurrence Benefit Percentages: 100%
Complete Loss of Hearing - Benefit Percentages: 100%
End-stage kidney disease - Benefit Percentages: 100%
Cancer in Situ - Recurrence Benefit Percentages: 25%
Loss of Speech - Recurrence Benefit Percentages: N/A
Invasive Cancer - Recurrence Benefit Percentages: 100%
Advanced Alzheimer's Disease- Benefit Percentages: 100%
Advanced Parkinson's Disease - Benefit Percentages: 100%
Benign Brain Tumor- Recurrence Benefit Percentages: 100%
Major organ failure - Recurrence Benefit Percentages: 100%
Occupational infectious disease - Benefit Percentages: 100%
Coronary Artery Bypass - Recurrence Benefit Percentages: 25%
End-stage heart failure - Recurrence Benefit Percentages: 100%
Advanced ALS/Lou Gehrigs Disease - Benefit Percentages: 100%
Complete Loss of Hearing - Recurrence Benefit Percentages: N/A
End-stage kidney disease - Recurrence Benefit Percentages: 100%
Advanced Alzheimer's Disease - Recurrence Benefit Percentages: N/A
Advanced Parkinson's Disease - Recurrence Benefit Percentages: N/A
Occupational infectious disease - Recurrence Benefit Percentages: N/A
Advanced ALS/Lou Gehrigs Disease - Recurrence Benefit Percentages: N/A
CHILDHOODSPECIFICDISEASES:
Lower jaw - Child: $1,500 / $750
Lower jaw - Spouse: $1,500 / $750
Lower jaw - Employee: $1,500 / $750
Finger(s) or toe(s) - Child: $1,000 / $500
Finger(s) or toe(s) - Spouse: $1,000 / $500
Incomplete dislocation - Child: 25% of the applicable non -surgical procedure
Incomplete dislocation - Spouse: 25% of the applicable non -surgical procedure
Incomplete dislocation - Employee: 25% of the applicable non -surgical procedure
Spina Bifida - Benefit Percentages: 100%
Down Syndrome - Benefit Percentages: 100%
Cerebral Palsy - Benefit Percentages: 100%
Cystic Fibrosis - Benefit Percentages: 100%
Cleft Lip/Palate - Benefit Percentages: 100%
Muscular Dystrophy - Benefit Percentages: 100%
Spina Bifida - Recurrence Benefit Percentages: N/A
Down Syndrome - Recurrence Benefit Percentages: N/A
Type 1 Diabetes Mellitus - Benefit Percentages: 100%
Cerebral Palsy - Recurrence Benefit Percentages: N/A
Cystic Fibrosis - Recurrence Benefit Percentages: N/A
Cleft Lip/Palate - Recurrence Benefit Percentages: N/A
Muscular Dystrophy - Recurrence Benefit Percentages: N/A
Complex Congenital Heart Disease - Benefit Percentages: 100%
Type 1 Diabetes Mellitus - Recurrence Benefit Percentages: N/A
Complex Congenital Heart Disease - Recurrence Benefit Percentages: N/A

View file

@ -0,0 +1,72 @@
PLAN: Equitable Dental Plan
UID: Equitable Dental Plan
Category: Dental
Type: None
Marketing Name: Equitable Dental
Average Price: $65.64
Short Description: A flexible PPO dental plan with coverage for preventive, basic, and major services, plus child orthodontia in higher tiers. Choose any dentist, with the best savings in-network.
Long Description: The Equitable Dental PPO Plan offers comprehensive dental coverage with access to both in-network and out-of-network providers. Preventive care is covered at 100% across all tiers, while basic and major services are covered at varying coinsurance levels depending on the plan tier (Low, Mid, or High). Annual benefit maximums range from $1,000 to $3,000, and child orthodontia is included in the Mid and High plans. In-network providers offer significant savings through discounted contracted rates, giving members flexibility and value.
PRICING:
Coverage 4: $103.18
Coverage 3: $75.62
Coverage 2: $55.68
Coverage 1: $28.11
DETAILS:
COVERAGE:
Coinsurance - In Network: 100% Preventive care (like cleanings, exams, and X-rays).80% Basic care (like fillings and simple extractions).50% Major care (like crowns, dentures, and root canals).
Coinsurance - Out of Network: 100% Preventive care (like cleanings, exams, and X-rays).80% Basic care (like fillings and simple extractions).50% Major care (like crowns, dentures, and root canals).
Missing Tooth Clause - In Network: Pre-existing missing teeth not covered
Missing Tooth Clause - Out ofNetwork: Pre-existing missing teeth not covered
Annual Individual Maxium Benefit - In Network: 1000
Annual Individual Maxium Benefit - Out of Network: 1000
Annual Individual / Family Deductible - In Network: $50 deductible per person For a family, you only have to pay it for 3 people max (so $150 total), even if more are covered and preventive services are free.
Annual Individual / Family Deductible - Out of Network: $50 deductible per person For a family, you only have to pay it for 3 people max (so $150 total), even if more are covered and preventive services are free.
Reimbursement (how much the insurance company pays thef or care) - In Network: Agreed Rate
Reimbursement (how much the insurance company pays thef or care) - Out of Network: Fixed Coverage Amount
Alternative Benefit (If two treatments would fix the problem, the plan pays for the less expensive one) - In Network: Included
Alternative Benefit (If two treatments would fix the problem, the plan pays for the less expensive one) - Out of Network: Included
BASICSERVICES:
Simple Extractions - In Network: 80%
Simple Extractions - Out of Network: 80%
Periodontal Maintenance - In Network: 80%
Periodontal Maintenance - Out of Network: 80%
Emergency Palliative Treatment - In Network: 80%
Complete Series/ Panoramic X-Rays - In Network: 80%
Emergency Palliative Treatment - Out of Network: 80%
Complete Series/ Panoramic X-Rays - Out of Network: 80%
Basic Restorative Services (amalgam, composite resin, acrylic, synthetic or plastic fillings) - In Network: 80%
Basic Restorative Services (amalgam, composite resin, acrylic, synthetic or plastic fillings) - Out of Network: 80%
MAJORSERVICES:
Bridges - In Network: 50%
Bridges - Out of Network: 50%
Oral Surgery - In Network: 50%
Bitewing X-Rays - In Network: 50%
Oral Surgery - Out of Network: 50%
Bitewing X-Rays - Out of Network: 50%
Periodontal Surgery - In Network: 50%
Inlays/Onlays/Crowns - In Network: 50%
Surgical Endodontics - In Network: 50%
Periodontal Surgery - Out of Network: 50%
Inlays/Onlays/Crowns - Out of Network: 50%
Non-Surgical Endodontics - In Network: 50%
Non-Surgical Periodontal - In Network: 50%
Surgical Endodontics - Out of Network: 50%
Non-Surgical Endodontics - Out of Network: 50%
Non-Surgical Periodontal - Out of Network: 50%
Surgical Extractions and Removal of Impacted Teeth - In Network: 80%
Surgical Extractions and Removal of Impacted Teeth - Out of Network: 50%
Dentures complete, partial, overdenture (upper and lower) - In Network: 50%
Dentures complete, partial, overdenture (upper and lower) - Out of Network: 50%
PREVENTIVESERVICES:
Periodic Oral Evaluation - In Network: 100%
Periodic Oral Evaluation - Out of Network: 100%
Comprehensive Oral Evaluation - In Network: 100%
Comprehensive Oral Evaluation - Out of Network: 100%
Limited Oral Evaluation (problem focused) - In Network: 100%
Limited Oral Evaluation (problem focused) - Out of Network: 100%

View file

@ -0,0 +1,31 @@
PLAN: Equitable Hospital Indemnity Insurance
UID: Equitable Hospital Indemnity
Category: Hospital Indemnity
Type: None
Marketing Name: Equitable Hospital Indemnity Benefit Plan
Average Price: $46.06
Short Description: This plan pays you cash for hospital stays and related treatments — helping with expenses like deductibles, rent, or groceries while you recover.
Long Description: The Equitable Hospital Indemnity plan provides a fixed cash benefit when youre admitted to the hospital, ICU, rehab unit, or emergency room. It pays set amounts per day or per event, regardless of what your medical bills cost. You can use the money however you need — for medical bills, housing, transportation, or everyday expenses. The plan also includes wellness screening rewards and coverage for family care, lodging, and travel. Its a simple way to add financial protection during unexpected hospitalizations.
PRICING:
Coverage 4: $68.69
Coverage 3: $41.62
Coverage 2: $51.51
Coverage 1: $22.44
DETAILS:
BENEFITS:
Daily Lodging - Benefit Amount: $100, up to 5 days per year
Daily Family Care - Benefit Amount: $100, up to 5 days per year
First Day Hospital - Benefit Amount: $1,000, once a per year
Daily Transportation - Benefit Amount: $100, up to 5 days per year
Annual Wellness Screening - Benefit Amount: $50, once per year per insured
Daily Hospital Confinement - Benefit Amount: $200, up to 31 days per year
Daily Hospital ICU Confinement - Benefit Amount: $400, up to 10 days per year
Daily Hospital Rehabilitation Unit - Benefit Amount: $50, up to 60 days per year
Daily Well Baby Nursery Confinement - Benefit Amount: $50, up to 60 days per year
Emergency Room Treatment (accident only) - Benefit Amount: 100
First Day Hospital Intensive Care Unit (ICU) Confinement - Benefit Amount: $2,000, once a per year

View file

@ -0,0 +1,88 @@
PLAN: Guardian Vision Full Feature Insurance Plan
UID: Guardian Vision Plan
Category: Vision
Type: None
Marketing Name: Guardian Full Feature Vision Plan
Average Price: $24.30
Short Description: A comprehensive vision plan that covers annual eye exams, glasses or contact lenses, and offers big savings when you visit in-network providers.
Long Description: The Guardian Vision Plan helps keep your eyes healthy and your vision clear with coverage for routine eye exams, prescription lenses, frames, and contacts. You'll save the most when using in-network providers, with fixed copays and generous allowances. Whether you wear glasses or contacts, the plan supports both comfort and affordability — with optional discounts on LASIK and other services.
PRICING:
Coverage 4: $36.83
Coverage 3: $25.35
Coverage 2: $23.50
Coverage 1: $11.53
DETAILS:
COVERAGE:
Exams Copay: 10
Frames - In Network: You pay 80% of the cost of the frames over $150*
Frames - Out of Network: You pay (after your copay) any amount over $46
Lenticular - In Network: 0
Lenticular - Out of Network: You pay (after your copay) any amount over $64
Cosmetic Extras - In Network: You'll save an average of 20-25% off the retail price
Eye Exam Covereage - In Network: 0
Cosmetic Extras - Out of Network: No out of network discounts
Lined Bifocal Lenses - In Network: 0
Lined Trifocal Lenses - In Network: 0
Single Vision Lenses - In Network: 0
Eye Exam Covereage - Out of Network: Amount over $39
Contact Lense (elective) - In Network: You pay (after your copay) any amount over $150
Lined Bifocal Lenses - Out of Network: You pay (after your copay) any amount over $23
Single Vision Lenses - Out of Network: You pay (after your copay) any amount over $39
Lined Trifocal Lenses - Out of Network: You pay (after your copay) any amount over $37
Contact Lenses (elective) - Out of Network: You pay (after your copay) any amount over $100
Materials Copay (waived for contact lenses): 10
Laser Correction Surgery Discount - In Network: You'll save up to 15% off the usual charge or 5% off a promotional price
Contact Lenses (medically necessary) - In Network: 0
Laser Correction Surgery Discount - Out of Network: No out of network discounts
Contact Lenses (evaluation and fitting) - In Network: The plan will pay up to $60
Contact Lenses (medically necessary) - Out of Network: You pay (after your copay) any amount over $210
Contact Lenses (evaluation and fitting) - Out of Network: Not Applicable
Costco, Walmart, and Sam's Club Frame Allowance- In Network: You pay (after your copay) any amount over $80
Glasses (additional pari of frames and lenses) - In Network: You'll save 20% off the retail price**
Glasses (additional pari of frames and lenses) - Out of Network: No out of network discounts
BASICSERVICES:
Simple Extractions - In Network: 80%
Simple Extractions - Out of Network: 80%
Periodontal Maintenance - In Network: 80%
Periodontal Maintenance - Out of Network: 80%
Emergency Palliative Treatment - In Network: 80%
Complete Series/ Panoramic X-Rays - In Network: 80%
Emergency Palliative Treatment - Out of Network: 80%
Complete Series/ Panoramic X-Rays - Out of Network: 80%
Basic Restorative Services (amalgam, composite resin, acrylic, synthetic or plastic fillings) - In Network: 80%
Basic Restorative Services (amalgam, composite resin, acrylic, synthetic or plastic fillings) - Out of Network: 80%
MAJORSERVICES:
Bridges - In Network: 50%
Bridges - Out of Network: 50%
Oral Surgery - In Network: 50%
Bitewing X-Rays - In Network: 50%
Oral Surgery - Out of Network: 50%
Bitewing X-Rays - Out of Network: 50%
Periodontal Surgery - In Network: 50%
Inlays/Onlays/Crowns - In Network: 50%
Surgical Endodontics - In Network: 50%
Periodontal Surgery - Out of Network: 50%
Inlays/Onlays/Crowns - Out of Network: 50%
Non-Surgical Endodontics - In Network: 50%
Non-Surgical Periodontal - In Network: 50%
Surgical Endodontics - Out of Network: 50%
Non-Surgical Endodontics - Out of Network: 50%
Non-Surgical Periodontal - Out of Network: 50%
Surgical Extractions and Removal of Impacted Teeth - In Network: 50%
Surgical Extractions and Removal of Impacted Teeth - Out of Network: 50%
Dentures complete, partial, overdenture (upper and lower) - In Network: 50%
Dentures complete, partial, overdenture (upper and lower) - Out of Network: 50%
SERVICEFREQUENCIES:
Exams: Every calendar year
Frames: Every calendar year
Lenses (for glasses or contact lenses)***: Every calendar year
Comprehensive Oral Evaluation - In Network: No limit with 12 months of exam
Comprehensive Oral Evaluation - Out of Network: 100%
Network Discounts (glasses and contact lens professional service): Every calendar year

1
src/__init__.py Normal file
View file

@ -0,0 +1 @@
# Lolly AI - Insurance AI Assistant

5
src/api/__init__.py Normal file
View file

@ -0,0 +1,5 @@
from fastapi import APIRouter
from .v1.router import router as v1_router
api_router = APIRouter()
api_router.include_router(v1_router)

5
src/api/v1/__init__.py Normal file
View file

@ -0,0 +1,5 @@
from fastapi import APIRouter
from .router import router
api_router = APIRouter()
api_router.include_router(router)

56
src/api/v1/models.py Normal file
View file

@ -0,0 +1,56 @@
from pydantic import BaseModel, Field
from typing import Optional, List, Dict, Any
class InsuranceChatRequest(BaseModel):
message: str = Field(..., description="User message")
session_id: Optional[str] = Field(None, description="Chat session ID")
class Source(BaseModel):
plan_name: str
chunk_number: int
content_chunk: str
class HistoryItem(BaseModel):
role: str
message: str
class InsuranceChatResponse(BaseModel):
session_id: str
answer: str
sources: List[Source] = []
history: List[HistoryItem] = []
class EstimationRequest(BaseModel):
uid: str = Field(..., description="Application unique identifier")
applicants: List[Dict[str, Any]] = Field(..., description="List of applicants")
plans: List[Dict[str, Any]] = Field(..., description="List of insurance plans")
phq: Dict[str, Any] = Field(..., description="Personal Health Questionnaire data")
income: Optional[float] = Field(0, description="Annual income")
address: Optional[Dict[str, Any]] = Field({}, description="Address information")
class EstimationResponse(BaseModel):
uid: str
status: str
data: Dict[str, Any]
external: Optional[Dict[str, Any]] = None
class SessionCreateResponse(BaseModel):
session_id: str
class SessionResponse(BaseModel):
id: str
organization_id: Optional[str] = None
agent_id: Optional[str] = None
created_at: Optional[str] = None
class SessionsListResponse(BaseModel):
sessions: List[SessionResponse]
class AgentsListResponse(BaseModel):
agents: List[Dict[str, Any]]
class HealthResponse(BaseModel):
status: str
service: str
version: str
dependencies: Dict[str, str]

104
src/api/v1/router.py Normal file
View file

@ -0,0 +1,104 @@
from fastapi import APIRouter, HTTPException
from typing import Dict, Any
import httpx
from . import models
from ...services.chat_service import chat_service
from ...services.estimation_service import run_underwriting
from ...config import settings
router = APIRouter(prefix="/v1", tags=["v1"])
@router.post("/insurance_chat", response_model=models.InsuranceChatResponse)
async def insurance_chat(request: models.InsuranceChatRequest):
"""Handle insurance chat requests"""
try:
result = await chat_service.process_insurance_chat(
message=request.message,
session_id=request.session_id
)
return models.InsuranceChatResponse(
session_id=result["session_id"],
answer=result["answer"],
sources=result["sources"],
history=result["history"]
)
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error processing chat request: {str(e)}")
@router.post("/estimation", response_model=models.EstimationResponse)
async def estimate(request: models.EstimationRequest):
"""Handle insurance estimation requests"""
try:
# Validate required fields
if not request.applicants or not request.plans:
raise HTTPException(
status_code=400,
detail="Missing required applicants or plans"
)
# Step 1: Run estimation
underwriting_result = run_underwriting(request.applicants, request.phq, request.plans)
# Step 2: If DTQ → reject application
if underwriting_result["combined"].get("dtq"):
reject_response = await reject_application(request.uid)
return models.EstimationResponse(
uid=request.uid,
status="rejected",
data=underwriting_result,
external=reject_response
)
# Step 3: Else → assign tier and submit
final_tier = underwriting_result["combined"]["tier"]
plans = request.plans.copy()
if plans:
plans[0]["tier"] = f"tier_{str(final_tier).replace('.', '_')}"
# Assemble external payload
submission_payload = {
"applicants": request.applicants,
"plans": plans,
"phq": request.phq,
"income": request.income,
"address": request.address
}
submit_response = await submit_application(submission_payload)
return models.EstimationResponse(
uid=request.uid,
status="submitted",
data=underwriting_result,
external=submit_response
)
except HTTPException:
raise
except Exception as e:
raise HTTPException(
status_code=500,
detail=f"Server error: {str(e)}"
)
async def reject_application(uid: str) -> Dict[str, Any]:
"""Reject application via external API"""
async with httpx.AsyncClient() as client:
response = await client.post(
f"{settings.INSURANCE_API_BASE_URL}/applications/reject",
json={"applicationId": uid}
)
return response.json() if response.status_code == 200 else {"error": "Failed to reject application"}
async def submit_application(application_payload: Dict[str, Any]) -> Dict[str, Any]:
"""Submit application via external API"""
async with httpx.AsyncClient() as client:
response = await client.post(
f"{settings.INSURANCE_API_BASE_URL}/applications/submit",
json=application_payload
)
return response.json() if response.status_code == 200 else {"error": "Failed to submit application"}

19
src/config.py Normal file
View file

@ -0,0 +1,19 @@
from pathlib import Path
from typing import Optional
from pydantic_settings import BaseSettings, SettingsConfigDict
env_path = (Path(__file__).parent.parent / '.env').absolute()
class Settings(BaseSettings):
model_config = SettingsConfigDict(extra='ignore', env_file=env_path, env_file_encoding='utf-8')
INSURANCE_API_BASE_URL: str
TALESTORM_API_BASE_URL: str = ""
TALESTORM_API_KEY: str
TALESTORM_AGENT_ID: str
# Global settings instance
settings = Settings(_env_file=env_path, _env_file_encoding='utf-8')

1
src/examples/__init__.py Normal file
View file

@ -0,0 +1 @@
# Examples package

View file

@ -0,0 +1,178 @@
#!/usr/bin/env python3
"""
Example usage of the Lolly AI API
"""
import httpx
import asyncio
from typing import Dict, Any
from src.config import settings
# Configuration
API_BASE_URL = "http://localhost:7310"
async def test_session_creation():
"""Test session creation with configured agent"""
print("Testing Session Creation...")
print(f"Using configured agent ID: {settings.TALESTORM_AGENT_ID}")
async with httpx.AsyncClient() as client:
try:
response = await client.post(f"{API_BASE_URL}/api/v1/sessions")
if response.status_code == 200:
data = response.json()
session_id = data.get("session_id")
print(f"✅ Session created: {session_id}")
return session_id
else:
print(f"❌ Failed to create session: {response.status_code}")
return None
except Exception as e:
print(f"❌ Error creating session: {e}")
return None
async def test_insurance_chat():
"""Test the insurance chat endpoint with new format"""
print("Testing Insurance Chat...")
async with httpx.AsyncClient() as client:
# First create a session
session_id = await test_session_creation()
payload = {
"message": "What does health insurance typically cover?",
"session_id": session_id
}
try:
response = await client.post(f"{API_BASE_URL}/api/v1/insurance_chat", json=payload)
if response.status_code == 200:
data = response.json()
print(f"✅ Chat successful!")
print(f"Session ID: {data['session_id']}")
print(f"Answer: {data['answer']}")
# Show sources if any
if data['sources']:
print(f"Sources found: {len(data['sources'])}")
for i, source in enumerate(data['sources']):
print(f" Source {i+1}:")
print(f" Plan: {source['plan_name']}")
print(f" Chunk: {source['chunk_number']}")
print(f" Content: {source['content_chunk'][:100]}...")
else:
print("No sources found (RAG not implemented yet)")
# Show history in detail
print(f"\nHistory entries: {len(data['history'])}")
for i, history_item in enumerate(data['history']):
role_emoji = "👤" if history_item['role'] == "user" else "🤖"
print(f" {role_emoji} {history_item['role'].upper()}: {history_item['message'][:80]}...")
# Show full message if it's short
if len(history_item['message']) <= 80:
print(f" Full message: {history_item['message']}")
else:
print(f"❌ Chat failed with status {response.status_code}")
print(f"Error: {response.text}")
except Exception as e:
print(f"❌ Error testing chat: {e}")
async def test_multiple_messages():
"""Test sending multiple messages to the same session"""
print("\nTesting Multiple Messages...")
async with httpx.AsyncClient() as client:
# Create a session
session_id = await test_session_creation()
if not session_id:
print("❌ Could not create session for multiple message test")
return
# Send multiple messages
messages = [
"What is health insurance?",
"What types of coverage are available?",
"How much does insurance typically cost?"
]
for i, message in enumerate(messages, 1):
print(f"\nMessage {i}: {message}")
payload = {
"message": message,
"session_id": session_id
}
try:
response = await client.post(f"{API_BASE_URL}/api/v1/insurance_chat", json=payload)
if response.status_code == 200:
data = response.json()
print(f" ✅ Response: {data['answer'][:60]}...")
print(f" 📝 History entries: {len(data['history'])}")
# Show the last few history items
recent_history = data['history'][-4:] # Show last 4 items
for item in recent_history:
role_emoji = "👤" if item['role'] == "user" else "🤖"
print(f" {role_emoji} {item['role']}: {item['message'][:40]}...")
else:
print(f" ❌ Failed: {response.status_code}")
except Exception as e:
print(f" ❌ Error: {e}")
async def test_estimation():
"""Test the estimation endpoint"""
print("Testing Insurance Estimation...")
payload = {
"uid": "test-application-123",
"applicants": [
{
"firstName": "John",
"dob": "15/03/1985",
"weight": 70,
"heightFt": 5,
"heightIn": 10,
"applicant": 1
}
],
"plans": [{"coverage": 1}],
"phq": {
"effectiveDate": "01/01/2024",
"medications": [],
"conditions": [],
"issues": []
},
"income": 50000,
"address": {}
}
async with httpx.AsyncClient() as client:
try:
response = await client.post(f"{API_BASE_URL}/api/v1/estimation", json=payload)
if response.status_code == 200:
data = response.json()
print(f"✅ Estimation successful!")
print(f"Application ID: {data['uid']}")
print(f"Status: {data['status']}")
else:
print(f"❌ Estimation failed with status {response.status_code}")
print(f"Error: {response.text}")
except Exception as e:
print(f"❌ Error testing estimation: {e}")
async def main():
"""Run all tests"""
print("🚀 Starting Lolly AI API Tests")
print("=" * 50)
await test_insurance_chat()
print("\n" + "=" * 50)
await test_multiple_messages()
print("\n" + "=" * 50)
await test_estimation()
print("\n✅ All tests completed!")
if __name__ == "__main__":
asyncio.run(main())

View file

@ -0,0 +1,149 @@
#!/usr/bin/env python3
"""
Example of session management with Lolly AI
"""
import httpx
import asyncio
from typing import Dict, Any
# Configuration
API_BASE_URL = "http://localhost:7310"
async def demonstrate_session_management():
"""Demonstrate session management functionality"""
print("🔄 Session Management Demo")
print("=" * 50)
async with httpx.AsyncClient() as client:
try:
# Step 1: List available agents
print("1. Listing available agents...")
response = await client.get(f"{API_BASE_URL}/api/v1/agents")
if response.status_code == 200:
agents = response.json()["agents"]
print(f" ✅ Found {len(agents)} agents")
for agent in agents:
print(f" - {agent.get('name', 'Unknown')} ({agent.get('model_name', 'Unknown')})")
else:
print(f" ❌ Failed to list agents: {response.status_code}")
# Step 2: Create a new session
print("\n2. Creating a new session...")
response = await client.post(f"{API_BASE_URL}/api/v1/sessions")
if response.status_code == 200:
session_data = response.json()
session_id = session_data["session_id"]
print(f" ✅ Session created: {session_id}")
else:
print(f" ❌ Failed to create session: {response.status_code}")
return
# Step 3: Get session details
print(f"\n3. Getting session details for {session_id}...")
response = await client.get(f"{API_BASE_URL}/api/v1/sessions/{session_id}")
if response.status_code == 200:
session_details = response.json()
print(f" ✅ Session details retrieved")
print(f" - Agent ID: {session_details.get('agent_id', 'Unknown')}")
print(f" - Created: {session_details.get('created_at', 'Unknown')}")
else:
print(f" ❌ Failed to get session details: {response.status_code}")
# Step 4: Send a chat message using the session
print(f"\n4. Sending chat message using session {session_id}...")
chat_payload = {
"message": "Hello! I have a question about health insurance coverage.",
"session_id": session_id
}
response = await client.post(f"{API_BASE_URL}/api/v1/insurance_chat", json=chat_payload)
if response.status_code == 200:
chat_response = response.json()
print(f" ✅ Chat message sent successfully")
print(f" - Response: {chat_response['answer'][:100]}...")
else:
print(f" ❌ Failed to send chat message: {response.status_code}")
# Step 5: List all sessions
print(f"\n5. Listing all sessions...")
response = await client.get(f"{API_BASE_URL}/api/v1/sessions")
if response.status_code == 200:
sessions = response.json()["sessions"]
print(f" ✅ Found {len(sessions)} sessions")
for session in sessions:
print(f" - Session {session.get('id', 'Unknown')} (Agent: {session.get('agent_id', 'Unknown')})")
else:
print(f" ❌ Failed to list sessions: {response.status_code}")
# Step 6: Send another message to the same session
print(f"\n6. Sending follow-up message to session {session_id}...")
follow_up_payload = {
"message": "Can you tell me more about dental coverage?",
"session_id": session_id
}
response = await client.post(f"{API_BASE_URL}/api/v1/insurance_chat", json=follow_up_payload)
if response.status_code == 200:
chat_response = response.json()
print(f" ✅ Follow-up message sent successfully")
print(f" - Response: {chat_response['answer'][:100]}...")
print(f" - History length: {len(chat_response['history'])}")
else:
print(f" ❌ Failed to send follow-up message: {response.status_code}")
except Exception as e:
print(f"❌ Error during session management demo: {e}")
async def demonstrate_session_persistence():
"""Demonstrate session persistence across multiple requests"""
print("\n🔄 Session Persistence Demo")
print("=" * 50)
async with httpx.AsyncClient() as client:
try:
# Create a session
response = await client.post(f"{API_BASE_URL}/api/v1/sessions")
if response.status_code != 200:
print("❌ Failed to create session for persistence demo")
return
session_id = response.json()["session_id"]
print(f"Created session: {session_id}")
# Send multiple messages to the same session
messages = [
"What is health insurance?",
"What types of coverage are available?",
"How much does insurance typically cost?",
"What is a deductible?"
]
for i, message in enumerate(messages, 1):
print(f"\nMessage {i}: {message}")
payload = {
"message": message,
"session_id": session_id
}
response = await client.post(f"{API_BASE_URL}/api/v1/insurance_chat", json=payload)
if response.status_code == 200:
chat_response = response.json()
print(f" Response: {chat_response['answer'][:80]}...")
print(f" History entries: {len(chat_response['history'])}")
else:
print(f" ❌ Failed to send message: {response.status_code}")
print(f"\n✅ Session persistence demo completed for session: {session_id}")
except Exception as e:
print(f"❌ Error during session persistence demo: {e}")
async def main():
"""Run session management demonstrations"""
await demonstrate_session_management()
await demonstrate_session_persistence()
print("\n" + "=" * 50)
print("✅ Session management demonstrations completed!")
if __name__ == "__main__":
asyncio.run(main())

View file

@ -0,0 +1,80 @@
#!/usr/bin/env python3
"""
Test script to verify TALESTORM_AGENT_ID usage
"""
import asyncio
from src.services.session_service import session_service
from src.config import settings
async def test_agent_id_usage():
"""Test that the configured agent ID is being used"""
print("Testing TALESTORM_AGENT_ID Usage...")
print("=" * 50)
print(f"Configured Agent ID: {settings.TALESTORM_AGENT_ID}")
print(f"Session Service Agent ID: {session_service.agent_id}")
# Test session creation
print("\nCreating session with configured agent...")
session_id = await session_service.create_session()
if session_id:
print(f"✅ Session created: {session_id}")
# Get session details to verify agent
session_details = await session_service.get_session(session_id)
if session_details:
print(f"Session Agent ID: {session_details.get('agent_id')}")
print(f"Session Organization ID: {session_details.get('organization_id')}")
else:
print("⚠️ Could not retrieve session details")
else:
print("❌ Failed to create session")
# Test listing agents
print("\nListing available agents...")
agents = await session_service.list_agents()
if agents:
print(f"✅ Found {len(agents)} agents:")
for i, agent in enumerate(agents, 1):
print(f" {i}. {agent.get('name', 'Unknown')} (ID: {agent.get('id')})")
# Highlight the configured agent
if str(agent.get('id')) == settings.TALESTORM_AGENT_ID:
print(f" ⭐ This is the configured agent!")
else:
print("❌ No agents found")
print("\n✅ Agent ID test completed!")
async def test_agent_validation():
"""Test that the configured agent exists and is accessible"""
print("\nTesting Agent Validation...")
print("=" * 50)
if not settings.TALESTORM_AGENT_ID:
print("❌ TALESTORM_AGENT_ID not configured")
return
# Try to get the configured agent
agent = await session_service.get_default_agent()
if agent:
print(f"✅ Configured agent found:")
print(f" Name: {agent.get('name', 'Unknown')}")
print(f" ID: {agent.get('id')}")
print(f" Model: {agent.get('model_name', 'Unknown')}")
print(f" Provider: {agent.get('model_provider', 'Unknown')}")
print(f" RAG Enabled: {agent.get('enable_rag_search', False)}")
else:
print("❌ Configured agent not found or not accessible")
print("\n✅ Agent validation completed!")
async def main():
"""Run all tests"""
await test_agent_id_usage()
await test_agent_validation()
if __name__ == "__main__":
asyncio.run(main())

View file

@ -0,0 +1,124 @@
#!/usr/bin/env python3
"""
Test script to verify chat history parsing with actual talestorm-ai format
"""
from src.services.chat_service import ChatService
from src.api.v1.models import HistoryItem
# Sample data from talestorm-ai
sample_history = [
{
"id": "45d3e5f0-21cf-47b3-8c24-0d273107ab7f",
"chat_session_id": "f250bb60-d619-4802-914f-0594d2a52bfa",
"content": [
{
"parts": [
{
"content": "hi",
"timestamp": "2025-07-25T09:49:29.412466Z",
"part_kind": "user-prompt"
}
],
"instructions": "You are an expert insurance assistant. You may only answer questions about insurance plans, coverage, benefits, and related terms. If asked anything outside that domain, reply: 'I'm sorry, I can only answer insurance-related questions.'",
"kind": "request"
},
{
"parts": [
{
"content": "Hello! How can I assist you with your insurance questions today?",
"part_kind": "text"
}
],
"usage": {
"requests": 1,
"request_tokens": 137,
"response_tokens": 14,
"total_tokens": 151,
"details": {
"accepted_prediction_tokens": 0,
"audio_tokens": 0,
"reasoning_tokens": 0,
"rejected_prediction_tokens": 0,
"cached_tokens": 0
}
},
"model_name": "gpt-4.1-mini-2025-04-14",
"timestamp": "2025-07-25T09:49:30Z",
"kind": "response",
"vendor_details": None,
"vendor_id": "chatcmpl-Bx9LOZPgBbHOblSUd6LcuV3qIYEwz"
}
],
"created_at": "2025-07-25T09:40:20.797430"
}
]
def parse_history_manually(messages):
"""Manually parse the history to test our logic"""
history = []
for message in messages:
content = message.get("content", [])
for item in content:
if not isinstance(item, dict):
continue
kind = item.get("kind", "")
# Handle request messages (user input)
if kind == "request":
parts = item.get("parts", [])
for part in parts:
if part.get("part_kind") == "user-prompt":
history.append(HistoryItem(
role="user",
message=part.get("content", "")
))
# Handle response messages (assistant output)
elif kind == "response":
parts = item.get("parts", [])
for part in parts:
if part.get("part_kind") == "text":
history.append(HistoryItem(
role="assistant",
message=part.get("content", "")
))
return history
def test_history_parsing():
"""Test the history parsing logic"""
print("Testing History Parsing...")
print("=" * 50)
# Parse the sample history
history = parse_history_manually(sample_history)
print(f"Found {len(history)} history items:")
for i, item in enumerate(history, 1):
print(f" {i}. {item.role}: {item.message}")
# Verify the expected results
expected_user_message = "hi"
expected_assistant_message = "Hello! How can I assist you with your insurance questions today?"
if len(history) == 2:
if history[0].role == "user" and history[0].message == expected_user_message:
print("✅ User message parsed correctly")
else:
print("❌ User message parsing failed")
if history[1].role == "assistant" and history[1].message == expected_assistant_message:
print("✅ Assistant message parsed correctly")
else:
print("❌ Assistant message parsing failed")
else:
print(f"❌ Expected 2 history items, got {len(history)}")
print("\n✅ History parsing test completed!")
if __name__ == "__main__":
test_history_parsing()

20
src/main.py Normal file
View file

@ -0,0 +1,20 @@
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from src.api import api_router as v1_router
app = FastAPI()
app.include_router(v1_router, prefix="/api")
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
async def root():
return {"status": "ok"}

1
src/services/__init__.py Normal file
View file

@ -0,0 +1 @@
# Services package

View file

@ -0,0 +1,137 @@
import httpx
from typing import Dict, Any, List, Optional
from ..config import settings
from .session_service import session_service
from ..api.v1.models import Source, HistoryItem
class ChatService:
"""Service for handling chat functionality with talestorm-ai"""
def __init__(self):
self.base_url = settings.TALESTORM_API_BASE_URL
self.api_key = settings.TALESTORM_API_KEY
async def get_client(self) -> httpx.AsyncClient:
"""Get HTTP client for talestorm-ai API"""
headers = {}
if self.api_key:
headers["X-API-Key"] = self.api_key
return httpx.AsyncClient(
headers=headers
)
async def send_message(self, session_id: str, message: str) -> Dict[str, Any]:
"""Send a message to talestorm-ai and get response"""
async with await self.get_client() as client:
try:
response = await client.post(self.base_url + "/chat/", json={
"chat_session_id": session_id,
"user_message": message
})
if response.status_code == 200:
return response.json()
else:
print(response.url)
print(response.status_code)
print(response.json())
raise Exception(f"Error sending message to talestorm-ai: {response.status_code} {response.json()}")
except Exception as e:
return {
"chat_session_id": session_id,
"message": f"I'm sorry, I'm experiencing technical difficulties. Please try again later. Error: {str(e)}"
}
async def get_chat_history(self, session_id: str) -> List[HistoryItem]:
"""Get chat history for a session and format it properly"""
async with await self.get_client() as client:
try:
response = await client.get(self.base_url + "/chat/", params={"chat_session_id": session_id})
if response.status_code == 200:
messages = response.json()
history = []
for message in messages:
content = message.get("content", [])
for item in content:
if not isinstance(item, dict):
continue
kind = item.get("kind", "")
# Handle request messages (user input)
if kind == "request":
parts = item.get("parts", [])
for part in parts:
if part.get("part_kind") == "user-prompt":
history.append(HistoryItem(
role="user",
message=part.get("content", "")
))
# Handle response messages (assistant output)
elif kind == "response":
parts = item.get("parts", [])
for part in parts:
if part.get("part_kind") == "text":
history.append(HistoryItem(
role="assistant",
message=part.get("content", "")
))
return history
return []
except Exception as e:
print(f"Error getting chat history: {e}")
return []
def _extract_sources_from_response(self, response_text: str) -> List[Source]:
"""Extract sources from RAG search results if available"""
# This is a placeholder - in a real implementation, you would:
# 1. Check if the response contains RAG search results
# 2. Parse the results to extract plan names, chunk numbers, and content
# 3. Return properly formatted Source objects
# For now, return empty list - this would be populated when RAG is implemented
return []
async def process_insurance_chat(self, message: str, session_id: Optional[str] = None) -> Dict[str, Any]:
"""Process an insurance chat request"""
try:
# Create session if not provided
if not session_id:
session_id = await session_service.create_session()
# Validate session if provided
elif not await session_service.validate_session(session_id):
# Create new session if invalid
session_id = await session_service.create_session()
# Send message to talestorm-ai
chat_response = await self.send_message(session_id, message)
# Get chat history
history = await self.get_chat_history(session_id)
# Extract sources from the response (placeholder for RAG implementation)
sources = self._extract_sources_from_response(chat_response.get("message", ""))
return {
"session_id": session_id,
"answer": chat_response.get("message", "No response received"),
"sources": sources,
"history": history
}
except Exception as e:
return {
"session_id": session_id or "fallback-session",
"answer": f"I'm sorry, I'm experiencing technical difficulties. Please try again later. Error: {str(e)}",
"sources": [],
"history": []
}
# Global chat service instance
chat_service = ChatService()

View file

@ -0,0 +1,225 @@
from datetime import datetime
import json
from typing import List, Dict, Any, Optional
# ---------------- Constants ---------------- #
DECLINABLE_CONDITIONS = {
"aids", "organ_transplant", "multiple_sclerosis", "alzheimer_disease",
"heart_attack", "congestive_heart_failure", "bipolar", "seizures"
}
DECLINABLE_ISSUE_KEYS = {"heart_attack", "congestive_heart_failure", "bipolar", "seizures"}
HIGH_RISK_FLAGS = {"50_units", "treat_diabetes"}
PRICING_TABLE = {
1: [122, 243, 219, 365],
1.5: [127, 253, 228, 379],
2: [133, 265, 239, 397],
2.5: [139, 277, 249, 415],
3: [145, 290, 261, 435],
3.5: [151, 302, 272, 452],
4: [158, 315, 283, 472],
4.5: [164, 327, 295, 491],
5: [172, 343, 309, 514],
5.5: [182, 364, 327, 545],
6: [196, 390, 351, 585],
6.5: [209, 417, 376, 626],
7: [222, 444, 400, 666]
}
# Simplified drug price map (in a real implementation, you'd load this from a file)
DRUG_PRICE_MAP = {
"metformin": 15.0,
"insulin": 45.0,
"aspirin": 8.0,
"atorvastatin": 25.0,
"lisinopril": 12.0,
"amlodipine": 18.0,
"omeprazole": 22.0,
"simvastatin": 20.0,
"hydrochlorothiazide": 10.0,
"losartan": 30.0
}
# ---------------- Helper Functions ---------------- #
def calculate_age(dob_str: str, effective_date_str: str) -> Optional[int]:
"""Calculate age from date of birth and effective date"""
try:
dob = datetime.strptime(dob_str, "%d/%m/%Y")
ref = datetime.strptime(effective_date_str, "%d/%m/%Y")
return (ref - dob).days // 365
except (ValueError, TypeError):
return None
def calculate_bmi(weight: float, ft: int, inch: int) -> Optional[float]:
"""Calculate BMI from weight and height"""
try:
inches = ft * 12 + inch
return (weight / (inches ** 2)) * 703
except (ValueError, TypeError, ZeroDivisionError):
return None
def check_declinable(phq: Dict[str, Any]) -> bool:
"""Check if application should be declined based on PHQ data"""
if phq.get("treatment") or phq.get("invalid"):
return True
for cond in phq.get("conditions", []):
if cond.get("key") in DECLINABLE_CONDITIONS:
return True
for issue in phq.get("issues", []):
for detail in issue.get("details", []):
if detail.get("key") in DECLINABLE_ISSUE_KEYS:
return True
return False
def base_tier(age: Optional[int]) -> float:
"""Calculate base tier based on age"""
if age is None:
return 4.0
if age <= 30:
return 1.0
elif age <= 40:
return 2.0
elif age <= 50:
return 3.0
elif age <= 60:
return 3.5
else:
return 4.0
def adjust_tier(tier: float, bmi: Optional[float], meds: List[Dict[str, Any]],
issues: List[Dict[str, Any]], applicant_index: int) -> float:
"""Adjust tier based on health factors"""
if bmi is not None and (bmi < 16 or bmi > 40):
tier += 1.0
personal_meds = [m for m in meds if m.get("applicant") == applicant_index]
if len(personal_meds) >= 3:
tier += 0.5
for issue in issues:
for detail in issue.get("details", []):
if detail.get("key") in HIGH_RISK_FLAGS:
tier += 0.5
return round(min(tier, 7.0) * 2) / 2
def calculate_rx_spend(medications: List[Dict[str, Any]], applicant_index: int) -> float:
"""Calculate total prescription spend for an applicant"""
total = 0.0
for med in medications:
if med.get("applicant") != applicant_index:
continue
drug = med.get("name", "").lower().strip()
if drug in DRUG_PRICE_MAP:
total += DRUG_PRICE_MAP[drug]
return round(total, 2)
def get_rx_price(tier: float, coverage_type: int) -> float:
"""Get prescription price based on tier and coverage type"""
tier = round(tier * 2) / 2
coverage_index = {
1: 0, 2: 1, 3: 2, 4: 3
}.get(coverage_type, 0)
return PRICING_TABLE.get(tier, PRICING_TABLE[5])[coverage_index]
# ---------------- Main Underwriting Logic ---------------- #
def run_underwriting(applicants: List[Dict[str, Any]], phq: Dict[str, Any],
plans: List[Dict[str, Any]]) -> Dict[str, Any]:
"""Run comprehensive underwriting analysis"""
results = []
max_tier = 0
dtq_found = False
ages = []
# Calculate ages for all applicants
for applicant in applicants:
age = calculate_age(applicant.get("dob"), phq.get("effectiveDate"))
if age is not None:
ages.append(age)
oldest_age = max(ages) if ages else None
base = base_tier(oldest_age) if oldest_age else None
coverage = plans[0]["coverage"] if plans else 1
coverage_index = {1: 0, 2: 1, 3: 2, 4: 3}.get(coverage, 0)
for idx, applicant in enumerate(applicants):
try:
age = calculate_age(applicant.get("dob"), phq.get("effectiveDate"))
bmi = calculate_bmi(
applicant.get("weight"),
applicant.get("heightFt"),
applicant.get("heightIn")
)
name = applicant.get("firstName", "Unknown")
applicant_type = {
1: "Primary",
2: "Spouse",
3: "Dependent"
}.get(applicant.get("applicant"), "Unknown")
is_dtq = check_declinable(phq)
rx_spend = calculate_rx_spend(phq.get("medications", []), idx)
if is_dtq:
tier = 5.0
dtq_found = True
message = "Declined due to high-risk conditions (DTQ triggered)."
elif age is None or bmi is None or base is None:
tier = 4.5
message = "Assigned fallback Tier 4.5 due to missing age or BMI."
else:
tier = base
tier = adjust_tier(tier, bmi, phq.get("medications", []),
phq.get("issues", []), idx)
tier_price = PRICING_TABLE.get(tier, PRICING_TABLE[5])[coverage_index]
max_price = PRICING_TABLE[7][coverage_index]
if rx_spend > max_price:
tier = 5.0
message = f"Declined due to high Rx spend (${rx_spend} > ${max_price})"
elif rx_spend > tier_price:
for t in sorted(PRICING_TABLE.keys()):
if PRICING_TABLE[t][coverage_index] >= rx_spend:
tier = t
break
message = f"Rx spend ${rx_spend} increased tier to {tier}."
else:
message = f"Tier {tier} assigned with Rx spend ${rx_spend} within allowed limits."
except Exception as e:
tier = 4.5
rx_spend = 0.0
message = f"Fallback Tier 4.5 due to system error: {str(e)}"
max_tier = max(max_tier, tier)
results.append({
"name": name,
"applicant_type": applicant_type,
"age": age,
"bmi": round(bmi, 2) if bmi else None,
"tier": tier,
"rx_spend": rx_spend,
"message": message
})
total_price = get_rx_price(max_tier, coverage)
return {
"results": results,
"combined": {
"tier": max_tier,
"total_price": total_price,
"dtq": dtq_found,
"message": f"Final assigned tier is {max_tier} based on age, health, Rx cost, or fallback logic."
}
}

View file

@ -0,0 +1,111 @@
import httpx
import uuid
from typing import Optional, Dict, Any, List
from ..config import settings
class SessionService:
"""Service for managing chat sessions with talestorm-ai"""
def __init__(self):
self.base_url = settings.TALESTORM_API_BASE_URL
self.api_key = settings.TALESTORM_API_KEY
self.agent_id = settings.TALESTORM_AGENT_ID
async def get_client(self) -> httpx.AsyncClient:
"""Get HTTP client for talestorm-ai API"""
headers = {}
if self.api_key:
headers["X-API-Key"] = self.api_key
return httpx.AsyncClient(
base_url=self.base_url,
headers=headers
)
async def list_agents(self) -> List[Dict[str, Any]]:
"""List available agents from talestorm-ai"""
async with await self.get_client() as client:
try:
response = await client.get("/agents/")
if response.status_code == 200:
return response.json()
else:
return []
except Exception:
return []
async def get_default_agent(self) -> Optional[Dict[str, Any]]:
"""Get the configured agent or the first available agent"""
# First try to get the configured agent
if self.agent_id:
async with await self.get_client() as client:
try:
response = await client.get(f"/agents/{self.agent_id}")
if response.status_code == 200:
return response.json()
except Exception:
pass
# Fallback to first available agent
agents = await self.list_agents()
if agents:
return agents[0]
return None
async def create_session(self, agent_id: Optional[str] = None) -> Optional[str]:
"""Create a new chat session in talestorm-ai"""
async with await self.get_client() as client:
try:
# Use provided agent_id, then configured agent_id, then fallback to default
if not agent_id:
if self.agent_id:
agent_id = self.agent_id
else:
default_agent = await self.get_default_agent()
if not default_agent:
# Create a simple session ID for now
return str(uuid.uuid4())
agent_id = str(default_agent["id"])
# Create session with talestorm-ai
response = await client.post("/sessions/", params={"agent_id": agent_id})
if response.status_code == 200:
session_data = response.json()
return str(session_data["id"])
else:
# Fallback to local session ID
return str(uuid.uuid4())
except Exception:
# Fallback to local session ID
return str(uuid.uuid4())
async def get_session(self, session_id: str) -> Optional[Dict[str, Any]]:
"""Get session details from talestorm-ai"""
async with await self.get_client() as client:
try:
response = await client.get(f"/sessions/{session_id}")
if response.status_code == 200:
return response.json()
return None
except Exception:
return None
async def list_sessions(self) -> List[Dict[str, Any]]:
"""List all sessions from talestorm-ai"""
async with await self.get_client() as client:
try:
response = await client.get("/sessions/")
if response.status_code == 200:
return response.json()
return []
except Exception:
return []
async def validate_session(self, session_id: str) -> bool:
"""Validate if a session exists and is accessible"""
session = await self.get_session(session_id)
return session is not None
# Global session service instance
session_service = SessionService()

791
uv.lock generated Normal file
View file

@ -0,0 +1,791 @@
version = 1
revision = 2
requires-python = ">=3.13"
[[package]]
name = "annotated-types"
version = "0.7.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" },
]
[[package]]
name = "anyio"
version = "4.9.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "idna" },
{ name = "sniffio" },
]
sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload-time = "2025-03-17T00:02:54.77Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload-time = "2025-03-17T00:02:52.713Z" },
]
[[package]]
name = "black"
version = "25.1.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click" },
{ name = "mypy-extensions" },
{ name = "packaging" },
{ name = "pathspec" },
{ name = "platformdirs" },
]
sdist = { url = "https://files.pythonhosted.org/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size = 649449, upload-time = "2025-01-29T04:15:40.373Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/98/87/0edf98916640efa5d0696e1abb0a8357b52e69e82322628f25bf14d263d1/black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", size = 1650673, upload-time = "2025-01-29T05:37:20.574Z" },
{ url = "https://files.pythonhosted.org/packages/52/e5/f7bf17207cf87fa6e9b676576749c6b6ed0d70f179a3d812c997870291c3/black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", size = 1453190, upload-time = "2025-01-29T05:37:22.106Z" },
{ url = "https://files.pythonhosted.org/packages/e3/ee/adda3d46d4a9120772fae6de454c8495603c37c4c3b9c60f25b1ab6401fe/black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", size = 1782926, upload-time = "2025-01-29T04:18:58.564Z" },
{ url = "https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", size = 1442613, upload-time = "2025-01-29T04:19:27.63Z" },
{ url = "https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646, upload-time = "2025-01-29T04:15:38.082Z" },
]
[[package]]
name = "certifi"
version = "2025.7.14"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/b3/76/52c535bcebe74590f296d6c77c86dabf761c41980e1347a2422e4aa2ae41/certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995", size = 163981, upload-time = "2025-07-14T03:29:28.449Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/4f/52/34c6cf5bb9285074dc3531c437b3919e825d976fde097a7a73f79e726d03/certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2", size = 162722, upload-time = "2025-07-14T03:29:26.863Z" },
]
[[package]]
name = "click"
version = "8.2.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" },
]
[[package]]
name = "colorama"
version = "0.4.6"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
]
[[package]]
name = "dnspython"
version = "2.7.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197, upload-time = "2024-10-05T20:14:59.362Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632, upload-time = "2024-10-05T20:14:57.687Z" },
]
[[package]]
name = "email-validator"
version = "2.2.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "dnspython" },
{ name = "idna" },
]
sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967, upload-time = "2024-06-20T11:30:30.034Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521, upload-time = "2024-06-20T11:30:28.248Z" },
]
[[package]]
name = "fastapi"
version = "0.116.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pydantic" },
{ name = "starlette" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/78/d7/6c8b3bfe33eeffa208183ec037fee0cce9f7f024089ab1c5d12ef04bd27c/fastapi-0.116.1.tar.gz", hash = "sha256:ed52cbf946abfd70c5a0dccb24673f0670deeb517a88b3544d03c2a6bf283143", size = 296485, upload-time = "2025-07-11T16:22:32.057Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e5/47/d63c60f59a59467fda0f93f46335c9d18526d7071f025cb5b89d5353ea42/fastapi-0.116.1-py3-none-any.whl", hash = "sha256:c46ac7c312df840f0c9e220f7964bada936781bc4e2e6eb71f1c4d7553786565", size = 95631, upload-time = "2025-07-11T16:22:30.485Z" },
]
[package.optional-dependencies]
standard = [
{ name = "email-validator" },
{ name = "fastapi-cli", extra = ["standard"] },
{ name = "httpx" },
{ name = "jinja2" },
{ name = "python-multipart" },
{ name = "uvicorn", extra = ["standard"] },
]
[[package]]
name = "fastapi-cli"
version = "0.0.8"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "rich-toolkit" },
{ name = "typer" },
{ name = "uvicorn", extra = ["standard"] },
]
sdist = { url = "https://files.pythonhosted.org/packages/c6/94/3ef75d9c7c32936ecb539b9750ccbdc3d2568efd73b1cb913278375f4533/fastapi_cli-0.0.8.tar.gz", hash = "sha256:2360f2989b1ab4a3d7fc8b3a0b20e8288680d8af2e31de7c38309934d7f8a0ee", size = 16884, upload-time = "2025-07-07T14:44:09.326Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e0/3f/6ad3103c5f59208baf4c798526daea6a74085bb35d1c161c501863470476/fastapi_cli-0.0.8-py3-none-any.whl", hash = "sha256:0ea95d882c85b9219a75a65ab27e8da17dac02873e456850fa0a726e96e985eb", size = 10770, upload-time = "2025-07-07T14:44:08.255Z" },
]
[package.optional-dependencies]
standard = [
{ name = "fastapi-cloud-cli" },
{ name = "uvicorn", extra = ["standard"] },
]
[[package]]
name = "fastapi-cloud-cli"
version = "0.1.4"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "httpx" },
{ name = "pydantic", extra = ["email"] },
{ name = "rich-toolkit" },
{ name = "rignore" },
{ name = "sentry-sdk" },
{ name = "typer" },
{ name = "uvicorn", extra = ["standard"] },
]
sdist = { url = "https://files.pythonhosted.org/packages/06/d7/4a987c3d73ddae4a7c93f5d2982ea5b1dd58d4cc1044568bb180227bd0f7/fastapi_cloud_cli-0.1.4.tar.gz", hash = "sha256:a0ab7633d71d864b4041896b3fe2f462de61546db7c52eb13e963f4d40af0eba", size = 22712, upload-time = "2025-07-11T14:15:25.667Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/42/cf/8635cd778b7d89714325b967a28c05865a2b6cab4c0b4b30561df4704f24/fastapi_cloud_cli-0.1.4-py3-none-any.whl", hash = "sha256:1db1ba757aa46a16a5e5dacf7cddc137ca0a3c42f65dba2b1cc6a8f24c41be42", size = 18957, upload-time = "2025-07-11T14:15:24.451Z" },
]
[[package]]
name = "h11"
version = "0.16.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" },
]
[[package]]
name = "httpcore"
version = "1.0.9"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "certifi" },
{ name = "h11" },
]
sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" },
]
[[package]]
name = "httptools"
version = "0.6.4"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639, upload-time = "2024-10-16T19:45:08.902Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214, upload-time = "2024-10-16T19:44:38.738Z" },
{ url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431, upload-time = "2024-10-16T19:44:39.818Z" },
{ url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121, upload-time = "2024-10-16T19:44:41.189Z" },
{ url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805, upload-time = "2024-10-16T19:44:42.384Z" },
{ url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858, upload-time = "2024-10-16T19:44:43.959Z" },
{ url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042, upload-time = "2024-10-16T19:44:45.071Z" },
{ url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682, upload-time = "2024-10-16T19:44:46.46Z" },
]
[[package]]
name = "httpx"
version = "0.28.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
{ name = "certifi" },
{ name = "httpcore" },
{ name = "idna" },
]
sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
]
[[package]]
name = "idna"
version = "3.10"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" },
]
[[package]]
name = "iniconfig"
version = "2.1.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" },
]
[[package]]
name = "isort"
version = "6.0.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/b8/21/1e2a441f74a653a144224d7d21afe8f4169e6c7c20bb13aec3a2dc3815e0/isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450", size = 821955, upload-time = "2025-02-26T21:13:16.955Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c1/11/114d0a5f4dabbdcedc1125dee0888514c3c3b16d3e9facad87ed96fad97c/isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615", size = 94186, upload-time = "2025-02-26T21:13:14.911Z" },
]
[[package]]
name = "jinja2"
version = "3.1.6"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "markupsafe" },
]
sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" },
]
[[package]]
name = "lolly-ai"
version = "0.1.0"
source = { editable = "." }
dependencies = [
{ name = "fastapi", extra = ["standard"] },
{ name = "httpx" },
{ name = "pydantic" },
{ name = "pydantic-settings" },
]
[package.optional-dependencies]
dev = [
{ name = "black" },
{ name = "isort" },
{ name = "mypy" },
{ name = "pytest" },
{ name = "pytest-asyncio" },
]
[package.metadata]
requires-dist = [
{ name = "black", marker = "extra == 'dev'", specifier = ">=23.0.0" },
{ name = "fastapi", extras = ["standard"], specifier = ">=0.116.1" },
{ name = "httpx", specifier = ">=0.28.1" },
{ name = "isort", marker = "extra == 'dev'", specifier = ">=5.12.0" },
{ name = "mypy", marker = "extra == 'dev'", specifier = ">=1.7.0" },
{ name = "pydantic", specifier = ">=2.11.7" },
{ name = "pydantic-settings", specifier = ">=2.0.0" },
{ name = "pytest", marker = "extra == 'dev'", specifier = ">=7.4.0" },
{ name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.21.0" },
]
provides-extras = ["dev"]
[[package]]
name = "markdown-it-py"
version = "3.0.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "mdurl" },
]
sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" },
]
[[package]]
name = "markupsafe"
version = "3.0.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" },
{ url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" },
{ url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" },
{ url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" },
{ url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" },
{ url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" },
{ url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" },
{ url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" },
{ url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" },
{ url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" },
{ url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" },
{ url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" },
{ url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" },
{ url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" },
{ url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" },
{ url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" },
{ url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" },
{ url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" },
{ url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" },
{ url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" },
]
[[package]]
name = "mdurl"
version = "0.1.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
]
[[package]]
name = "mypy"
version = "1.17.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "mypy-extensions" },
{ name = "pathspec" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/1e/e3/034322d5a779685218ed69286c32faa505247f1f096251ef66c8fd203b08/mypy-1.17.0.tar.gz", hash = "sha256:e5d7ccc08ba089c06e2f5629c660388ef1fee708444f1dee0b9203fa031dee03", size = 3352114, upload-time = "2025-07-14T20:34:30.181Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/be/7b/5f8ab461369b9e62157072156935cec9d272196556bdc7c2ff5f4c7c0f9b/mypy-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c41aa59211e49d717d92b3bb1238c06d387c9325d3122085113c79118bebb06", size = 11070019, upload-time = "2025-07-14T20:32:07.99Z" },
{ url = "https://files.pythonhosted.org/packages/9c/f8/c49c9e5a2ac0badcc54beb24e774d2499748302c9568f7f09e8730e953fa/mypy-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e69db1fb65b3114f98c753e3930a00514f5b68794ba80590eb02090d54a5d4a", size = 10114457, upload-time = "2025-07-14T20:33:47.285Z" },
{ url = "https://files.pythonhosted.org/packages/89/0c/fb3f9c939ad9beed3e328008b3fb90b20fda2cddc0f7e4c20dbefefc3b33/mypy-1.17.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:03ba330b76710f83d6ac500053f7727270b6b8553b0423348ffb3af6f2f7b889", size = 11857838, upload-time = "2025-07-14T20:33:14.462Z" },
{ url = "https://files.pythonhosted.org/packages/4c/66/85607ab5137d65e4f54d9797b77d5a038ef34f714929cf8ad30b03f628df/mypy-1.17.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:037bc0f0b124ce46bfde955c647f3e395c6174476a968c0f22c95a8d2f589bba", size = 12731358, upload-time = "2025-07-14T20:32:25.579Z" },
{ url = "https://files.pythonhosted.org/packages/73/d0/341dbbfb35ce53d01f8f2969facbb66486cee9804048bf6c01b048127501/mypy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c38876106cb6132259683632b287238858bd58de267d80defb6f418e9ee50658", size = 12917480, upload-time = "2025-07-14T20:34:21.868Z" },
{ url = "https://files.pythonhosted.org/packages/64/63/70c8b7dbfc520089ac48d01367a97e8acd734f65bd07813081f508a8c94c/mypy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:d30ba01c0f151998f367506fab31c2ac4527e6a7b2690107c7a7f9e3cb419a9c", size = 9589666, upload-time = "2025-07-14T20:34:16.841Z" },
{ url = "https://files.pythonhosted.org/packages/e3/fc/ee058cc4316f219078464555873e99d170bde1d9569abd833300dbeb484a/mypy-1.17.0-py3-none-any.whl", hash = "sha256:15d9d0018237ab058e5de3d8fce61b6fa72cc59cc78fd91f1b474bce12abf496", size = 2283195, upload-time = "2025-07-14T20:31:54.753Z" },
]
[[package]]
name = "mypy-extensions"
version = "1.1.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" },
]
[[package]]
name = "packaging"
version = "25.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
]
[[package]]
name = "pathspec"
version = "0.12.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" },
]
[[package]]
name = "platformdirs"
version = "4.3.8"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" },
]
[[package]]
name = "pluggy"
version = "1.6.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
]
[[package]]
name = "pydantic"
version = "2.11.7"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "annotated-types" },
{ name = "pydantic-core" },
{ name = "typing-extensions" },
{ name = "typing-inspection" },
]
sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload-time = "2025-06-14T08:33:17.137Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782, upload-time = "2025-06-14T08:33:14.905Z" },
]
[package.optional-dependencies]
email = [
{ name = "email-validator" },
]
[[package]]
name = "pydantic-core"
version = "2.33.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload-time = "2025-04-23T18:31:53.175Z" },
{ url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload-time = "2025-04-23T18:31:54.79Z" },
{ url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload-time = "2025-04-23T18:31:57.393Z" },
{ url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload-time = "2025-04-23T18:31:59.065Z" },
{ url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload-time = "2025-04-23T18:32:00.78Z" },
{ url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload-time = "2025-04-23T18:32:02.418Z" },
{ url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload-time = "2025-04-23T18:32:04.152Z" },
{ url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload-time = "2025-04-23T18:32:06.129Z" },
{ url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload-time = "2025-04-23T18:32:08.178Z" },
{ url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload-time = "2025-04-23T18:32:10.242Z" },
{ url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload-time = "2025-04-23T18:32:12.382Z" },
{ url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload-time = "2025-04-23T18:32:14.034Z" },
{ url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload-time = "2025-04-23T18:32:15.783Z" },
{ url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload-time = "2025-04-23T18:32:18.473Z" },
{ url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" },
{ url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" },
{ url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" },
]
[[package]]
name = "pydantic-settings"
version = "2.10.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pydantic" },
{ name = "python-dotenv" },
{ name = "typing-inspection" },
]
sdist = { url = "https://files.pythonhosted.org/packages/68/85/1ea668bbab3c50071ca613c6ab30047fb36ab0da1b92fa8f17bbc38fd36c/pydantic_settings-2.10.1.tar.gz", hash = "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee", size = 172583, upload-time = "2025-06-24T13:26:46.841Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/58/f0/427018098906416f580e3cf1366d3b1abfb408a0652e9f31600c24a1903c/pydantic_settings-2.10.1-py3-none-any.whl", hash = "sha256:a60952460b99cf661dc25c29c0ef171721f98bfcb52ef8d9ea4c943d7c8cc796", size = 45235, upload-time = "2025-06-24T13:26:45.485Z" },
]
[[package]]
name = "pygments"
version = "2.19.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
]
[[package]]
name = "pytest"
version = "8.4.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
{ name = "iniconfig" },
{ name = "packaging" },
{ name = "pluggy" },
{ name = "pygments" },
]
sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714, upload-time = "2025-06-18T05:48:06.109Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474, upload-time = "2025-06-18T05:48:03.955Z" },
]
[[package]]
name = "pytest-asyncio"
version = "1.1.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pytest" },
]
sdist = { url = "https://files.pythonhosted.org/packages/4e/51/f8794af39eeb870e87a8c8068642fc07bce0c854d6865d7dd0f2a9d338c2/pytest_asyncio-1.1.0.tar.gz", hash = "sha256:796aa822981e01b68c12e4827b8697108f7205020f24b5793b3c41555dab68ea", size = 46652, upload-time = "2025-07-16T04:29:26.393Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c7/9d/bf86eddabf8c6c9cb1ea9a869d6873b46f105a5d292d3a6f7071f5b07935/pytest_asyncio-1.1.0-py3-none-any.whl", hash = "sha256:5fe2d69607b0bd75c656d1211f969cadba035030156745ee09e7d71740e58ecf", size = 15157, upload-time = "2025-07-16T04:29:24.929Z" },
]
[[package]]
name = "python-dotenv"
version = "1.1.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978, upload-time = "2025-06-24T04:21:07.341Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" },
]
[[package]]
name = "python-multipart"
version = "0.0.20"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158, upload-time = "2024-12-16T19:45:46.972Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" },
]
[[package]]
name = "pyyaml"
version = "6.0.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" },
{ url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" },
{ url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" },
{ url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" },
{ url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" },
{ url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" },
{ url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" },
{ url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" },
{ url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" },
]
[[package]]
name = "rich"
version = "14.0.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "markdown-it-py" },
{ name = "pygments" },
]
sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload-time = "2025-03-30T14:15:14.23Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229, upload-time = "2025-03-30T14:15:12.283Z" },
]
[[package]]
name = "rich-toolkit"
version = "0.14.8"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click" },
{ name = "rich" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/1b/de/d3d329d670bb271ee82e7bbc2946f985b2782f4cae2857138ed94be1335b/rich_toolkit-0.14.8.tar.gz", hash = "sha256:1f77b32e6c25d9e3644c1efbce00d8d90daf2457b3abdb4699e263c03b9ca6cf", size = 110926, upload-time = "2025-06-30T22:05:53.663Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/78/39/c0fd75955aa963a15c642dfe6fb2acdd1fd2114028ec5ff2e2fd26218ad7/rich_toolkit-0.14.8-py3-none-any.whl", hash = "sha256:c54bda82b93145a79bbae04c3e15352e6711787c470728ff41fdfa0c2f0c11ae", size = 24975, upload-time = "2025-06-30T22:05:52.153Z" },
]
[[package]]
name = "rignore"
version = "0.6.4"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/73/46/05a94dc55ac03cf931d18e43b86ecee5ee054cb88b7853fffd741e35009c/rignore-0.6.4.tar.gz", hash = "sha256:e893fdd2d7fdcfa9407d0b7600ef2c2e2df97f55e1c45d4a8f54364829ddb0ab", size = 11633, upload-time = "2025-07-19T19:24:46.219Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/db/a3/edd7d0d5cc0720de132b6651cef95ee080ce5fca11c77d8a47db848e5f90/rignore-0.6.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2b3b1e266ce45189240d14dfa1057f8013ea34b9bc8b3b44125ec8d25fdb3985", size = 885304, upload-time = "2025-07-19T19:23:54.268Z" },
{ url = "https://files.pythonhosted.org/packages/93/a1/d8d2fb97a6548307507d049b7e93885d4a0dfa1c907af5983fd9f9362a21/rignore-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45fe803628cc14714df10e8d6cdc23950a47eb9eb37dfea9a4779f4c672d2aa0", size = 818799, upload-time = "2025-07-19T19:23:47.544Z" },
{ url = "https://files.pythonhosted.org/packages/b1/cd/949981fcc180ad5ba7b31c52e78b74b2dea6b7bf744ad4c0c4b212f6da78/rignore-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e439f034277a947a4126e2da79dbb43e33d73d7c09d3d72a927e02f8a16f59aa", size = 892024, upload-time = "2025-07-19T19:22:36.18Z" },
{ url = "https://files.pythonhosted.org/packages/b0/d3/9042d701a8062d9c88f87760bbc2695ee2c23b3f002d34486b72a85f8efe/rignore-0.6.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84b5121650ae24621154c7bdba8b8970b0739d8146505c9f38e0cda9385d1004", size = 871430, upload-time = "2025-07-19T19:22:49.62Z" },
{ url = "https://files.pythonhosted.org/packages/eb/50/3370249b984212b7355f3d9241aa6d02e706067c6d194a2614dfbc0f5b27/rignore-0.6.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52b0957b585ab48a445cf8ac1dbc33a272ab060835e583b4f95aa8c67c23fb2b", size = 1160559, upload-time = "2025-07-19T19:23:01.629Z" },
{ url = "https://files.pythonhosted.org/packages/6c/6f/2ad7f925838091d065524f30a8abda846d1813eee93328febf262b5cda21/rignore-0.6.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50359e0d5287b5e2743bd2f2fbf05df619c8282fd3af12f6628ff97b9675551d", size = 939947, upload-time = "2025-07-19T19:23:14.608Z" },
{ url = "https://files.pythonhosted.org/packages/1f/01/626ec94d62475ae7ef8b00ef98cea61cbea52a389a666703c97c4673d406/rignore-0.6.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe18096dcb1596757dfe0b412aab6d32564473ae7ee58dea0a8b4be5b1a2e3b", size = 949471, upload-time = "2025-07-19T19:23:37.521Z" },
{ url = "https://files.pythonhosted.org/packages/e8/c3/699c4f03b3c46f4b5c02f17a0a339225da65aad547daa5b03001e7c6a382/rignore-0.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b79c212d9990a273ad91e8d9765e1766ef6ecedd3be65375d786a252762ba385", size = 974912, upload-time = "2025-07-19T19:23:27.13Z" },
{ url = "https://files.pythonhosted.org/packages/cd/35/04626c12f9f92a9fc789afc2be32838a5d9b23b6fa8b2ad4a8625638d15b/rignore-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6ffa7f2a8894c65aa5dc4e8ac8bbdf39a326c0c6589efd27686cfbb48f0197d", size = 1067281, upload-time = "2025-07-19T19:24:01.016Z" },
{ url = "https://files.pythonhosted.org/packages/fe/9c/8f17baf3b984afea151cb9094716f6f1fb8e8737db97fc6eb6d494bd0780/rignore-0.6.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a63f5720dffc8d8fb0a4d02fafb8370a4031ebf3f99a4e79f334a91e905b7349", size = 1134414, upload-time = "2025-07-19T19:24:13.534Z" },
{ url = "https://files.pythonhosted.org/packages/10/88/ef84ffa916a96437c12cefcc39d474122da9626d75e3a2ebe09ec5d32f1b/rignore-0.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ce33982da47ac5dc09d19b04fa8d7c9aa6292fc0bd1ecf33076989faa8886094", size = 1109330, upload-time = "2025-07-19T19:24:25.303Z" },
{ url = "https://files.pythonhosted.org/packages/27/43/2ada5a2ec03b82e903610a1c483f516f78e47700ee6db9823f739e08b3af/rignore-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d899621867aa266824fbd9150e298f19d25b93903ef0133c09f70c65a3416eca", size = 1120381, upload-time = "2025-07-19T19:24:37.798Z" },
{ url = "https://files.pythonhosted.org/packages/3b/99/e7bcc643085131cb14dbea772def72bf1f6fe9037171ebe177c4f228abc8/rignore-0.6.4-cp313-cp313-win32.whl", hash = "sha256:d0615a6bf4890ec5a90b5fb83666822088fbd4e8fcd740c386fcce51e2f6feea", size = 641761, upload-time = "2025-07-19T19:24:58.096Z" },
{ url = "https://files.pythonhosted.org/packages/d9/25/7798908044f27dea1a8abdc75c14523e33770137651e5f775a15143f4218/rignore-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:145177f0e32716dc2f220b07b3cde2385b994b7ea28d5c96fbec32639e9eac6f", size = 719876, upload-time = "2025-07-19T19:24:51.125Z" },
{ url = "https://files.pythonhosted.org/packages/b4/e3/ae1e30b045bf004ad77bbd1679b9afff2be8edb166520921c6f29420516a/rignore-0.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e55bf8f9bbd186f58ab646b4a08718c77131d28a9004e477612b0cbbd5202db2", size = 891776, upload-time = "2025-07-19T19:22:37.78Z" },
{ url = "https://files.pythonhosted.org/packages/45/a9/1193e3bc23ca0e6eb4f17cf4b99971237f97cfa6f241d98366dff90a6d09/rignore-0.6.4-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2521f7bf3ee1f2ab22a100a3a4eed39a97b025804e5afe4323528e9ce8f084a5", size = 871442, upload-time = "2025-07-19T19:22:50.972Z" },
{ url = "https://files.pythonhosted.org/packages/20/83/4c52ae429a0b2e1ce667e35b480e9a6846f9468c443baeaed5d775af9485/rignore-0.6.4-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cc35773a8a9c119359ef974d0856988d4601d4daa6f532c05f66b4587cf35bc", size = 1159844, upload-time = "2025-07-19T19:23:02.751Z" },
{ url = "https://files.pythonhosted.org/packages/c1/2f/c740f5751f464c937bfe252dc15a024ae081352cfe80d94aa16d6a617482/rignore-0.6.4-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b665b1ea14457d7b49e834baabc635a3b8c10cfb5cca5c21161fabdbfc2b850e", size = 939456, upload-time = "2025-07-19T19:23:15.72Z" },
{ url = "https://files.pythonhosted.org/packages/fc/dd/68dbb08ac0edabf44dd144ff546a3fb0253c5af708e066847df39fc9188f/rignore-0.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c7fd339f344a8548724f289495b835bed7b81174a0bc1c28c6497854bd8855db", size = 1067070, upload-time = "2025-07-19T19:24:02.803Z" },
{ url = "https://files.pythonhosted.org/packages/3b/3a/7e7ea6f0d31d3f5beb0f2cf2c4c362672f5f7f125714458673fc579e2bed/rignore-0.6.4-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:91dc94b1cc5af8d6d25ce6edd29e7351830f19b0a03b75cb3adf1f76d00f3007", size = 1134598, upload-time = "2025-07-19T19:24:15.039Z" },
{ url = "https://files.pythonhosted.org/packages/7e/06/1b3307f6437d29bede5a95738aa89e6d910ba68d4054175c9f60d8e2c6b1/rignore-0.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4d1918221a249e5342b60fd5fa513bf3d6bf272a8738e66023799f0c82ecd788", size = 1108862, upload-time = "2025-07-19T19:24:26.765Z" },
{ url = "https://files.pythonhosted.org/packages/b0/d5/b37c82519f335f2c472a63fc6215c6f4c51063ecf3166e3acf508011afbd/rignore-0.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:240777332b859dc89dcba59ab6e3f1e062bc8e862ffa3e5f456e93f7fd5cb415", size = 1120002, upload-time = "2025-07-19T19:24:38.952Z" },
{ url = "https://files.pythonhosted.org/packages/ac/72/2f05559ed5e69bdfdb56ea3982b48e6c0017c59f7241f7e1c5cae992b347/rignore-0.6.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b0e548753e55cc648f1e7b02d9f74285fe48bb49cec93643d31e563773ab3f", size = 949454, upload-time = "2025-07-19T19:23:38.664Z" },
{ url = "https://files.pythonhosted.org/packages/0b/92/186693c8f838d670510ac1dfb35afbe964320fbffb343ba18f3d24441941/rignore-0.6.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6971ac9fdd5a0bd299a181096f091c4f3fd286643adceba98eccc03c688a6637", size = 974663, upload-time = "2025-07-19T19:23:28.24Z" },
]
[[package]]
name = "sentry-sdk"
version = "2.33.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "certifi" },
{ name = "urllib3" },
]
sdist = { url = "https://files.pythonhosted.org/packages/b0/82/dfe4a91fd38e048fbb55ca6c072710408e8802015aa27cde18e8684bb1e9/sentry_sdk-2.33.2.tar.gz", hash = "sha256:e85002234b7b8efac9b74c2d91dbd4f8f3970dc28da8798e39530e65cb740f94", size = 335804, upload-time = "2025-07-22T10:41:18.578Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c2/dc/4d825d5eb6e924dfcc6a91c8185578a7b0a5c41fd2416a6f49c8226d6ef9/sentry_sdk-2.33.2-py2.py3-none-any.whl", hash = "sha256:8d57a3b4861b243aa9d558fda75509ad487db14f488cbdb6c78c614979d77632", size = 356692, upload-time = "2025-07-22T10:41:16.531Z" },
]
[[package]]
name = "shellingham"
version = "1.5.4"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
]
[[package]]
name = "sniffio"
version = "1.3.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" },
]
[[package]]
name = "starlette"
version = "0.47.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
]
sdist = { url = "https://files.pythonhosted.org/packages/04/57/d062573f391d062710d4088fa1369428c38d51460ab6fedff920efef932e/starlette-0.47.2.tar.gz", hash = "sha256:6ae9aa5db235e4846decc1e7b79c4f346adf41e9777aebeb49dfd09bbd7023d8", size = 2583948, upload-time = "2025-07-20T17:31:58.522Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f7/1f/b876b1f83aef204198a42dc101613fefccb32258e5428b5f9259677864b4/starlette-0.47.2-py3-none-any.whl", hash = "sha256:c5847e96134e5c5371ee9fac6fdf1a67336d5815e09eb2a01fdb57a351ef915b", size = 72984, upload-time = "2025-07-20T17:31:56.738Z" },
]
[[package]]
name = "typer"
version = "0.16.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click" },
{ name = "rich" },
{ name = "shellingham" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/c5/8c/7d682431efca5fd290017663ea4588bf6f2c6aad085c7f108c5dbc316e70/typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b", size = 102625, upload-time = "2025-05-26T14:30:31.824Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317, upload-time = "2025-05-26T14:30:30.523Z" },
]
[[package]]
name = "typing-extensions"
version = "4.14.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" },
]
[[package]]
name = "typing-inspection"
version = "0.4.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" },
]
[[package]]
name = "urllib3"
version = "2.5.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" },
]
[[package]]
name = "uvicorn"
version = "0.35.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click" },
{ name = "h11" },
]
sdist = { url = "https://files.pythonhosted.org/packages/5e/42/e0e305207bb88c6b8d3061399c6a961ffe5fbb7e2aa63c9234df7259e9cd/uvicorn-0.35.0.tar.gz", hash = "sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01", size = 78473, upload-time = "2025-06-28T16:15:46.058Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d2/e2/dc81b1bd1dcfe91735810265e9d26bc8ec5da45b4c0f6237e286819194c3/uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a", size = 66406, upload-time = "2025-06-28T16:15:44.816Z" },
]
[package.optional-dependencies]
standard = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
{ name = "httptools" },
{ name = "python-dotenv" },
{ name = "pyyaml" },
{ name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" },
{ name = "watchfiles" },
{ name = "websockets" },
]
[[package]]
name = "uvloop"
version = "0.21.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741, upload-time = "2024-10-14T23:38:35.489Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123, upload-time = "2024-10-14T23:38:00.688Z" },
{ url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325, upload-time = "2024-10-14T23:38:02.309Z" },
{ url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806, upload-time = "2024-10-14T23:38:04.711Z" },
{ url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068, upload-time = "2024-10-14T23:38:06.385Z" },
{ url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428, upload-time = "2024-10-14T23:38:08.416Z" },
{ url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018, upload-time = "2024-10-14T23:38:10.888Z" },
]
[[package]]
name = "watchfiles"
version = "1.1.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
]
sdist = { url = "https://files.pythonhosted.org/packages/2a/9a/d451fcc97d029f5812e898fd30a53fd8c15c7bbd058fd75cfc6beb9bd761/watchfiles-1.1.0.tar.gz", hash = "sha256:693ed7ec72cbfcee399e92c895362b6e66d63dac6b91e2c11ae03d10d503e575", size = 94406, upload-time = "2025-06-15T19:06:59.42Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d3/42/fae874df96595556a9089ade83be34a2e04f0f11eb53a8dbf8a8a5e562b4/watchfiles-1.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5007f860c7f1f8df471e4e04aaa8c43673429047d63205d1630880f7637bca30", size = 402004, upload-time = "2025-06-15T19:05:38.499Z" },
{ url = "https://files.pythonhosted.org/packages/fa/55/a77e533e59c3003d9803c09c44c3651224067cbe7fb5d574ddbaa31e11ca/watchfiles-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:20ecc8abbd957046f1fe9562757903f5eaf57c3bce70929fda6c7711bb58074a", size = 393671, upload-time = "2025-06-15T19:05:39.52Z" },
{ url = "https://files.pythonhosted.org/packages/05/68/b0afb3f79c8e832e6571022611adbdc36e35a44e14f129ba09709aa4bb7a/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2f0498b7d2a3c072766dba3274fe22a183dbea1f99d188f1c6c72209a1063dc", size = 449772, upload-time = "2025-06-15T19:05:40.897Z" },
{ url = "https://files.pythonhosted.org/packages/ff/05/46dd1f6879bc40e1e74c6c39a1b9ab9e790bf1f5a2fe6c08b463d9a807f4/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:239736577e848678e13b201bba14e89718f5c2133dfd6b1f7846fa1b58a8532b", size = 456789, upload-time = "2025-06-15T19:05:42.045Z" },
{ url = "https://files.pythonhosted.org/packages/8b/ca/0eeb2c06227ca7f12e50a47a3679df0cd1ba487ea19cf844a905920f8e95/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eff4b8d89f444f7e49136dc695599a591ff769300734446c0a86cba2eb2f9895", size = 482551, upload-time = "2025-06-15T19:05:43.781Z" },
{ url = "https://files.pythonhosted.org/packages/31/47/2cecbd8694095647406645f822781008cc524320466ea393f55fe70eed3b/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12b0a02a91762c08f7264e2e79542f76870c3040bbc847fb67410ab81474932a", size = 597420, upload-time = "2025-06-15T19:05:45.244Z" },
{ url = "https://files.pythonhosted.org/packages/d9/7e/82abc4240e0806846548559d70f0b1a6dfdca75c1b4f9fa62b504ae9b083/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29e7bc2eee15cbb339c68445959108803dc14ee0c7b4eea556400131a8de462b", size = 477950, upload-time = "2025-06-15T19:05:46.332Z" },
{ url = "https://files.pythonhosted.org/packages/25/0d/4d564798a49bf5482a4fa9416dea6b6c0733a3b5700cb8a5a503c4b15853/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9481174d3ed982e269c090f780122fb59cee6c3796f74efe74e70f7780ed94c", size = 451706, upload-time = "2025-06-15T19:05:47.459Z" },
{ url = "https://files.pythonhosted.org/packages/81/b5/5516cf46b033192d544102ea07c65b6f770f10ed1d0a6d388f5d3874f6e4/watchfiles-1.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:80f811146831c8c86ab17b640801c25dc0a88c630e855e2bef3568f30434d52b", size = 625814, upload-time = "2025-06-15T19:05:48.654Z" },
{ url = "https://files.pythonhosted.org/packages/0c/dd/7c1331f902f30669ac3e754680b6edb9a0dd06dea5438e61128111fadd2c/watchfiles-1.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:60022527e71d1d1fda67a33150ee42869042bce3d0fcc9cc49be009a9cded3fb", size = 622820, upload-time = "2025-06-15T19:05:50.088Z" },
{ url = "https://files.pythonhosted.org/packages/1b/14/36d7a8e27cd128d7b1009e7715a7c02f6c131be9d4ce1e5c3b73d0e342d8/watchfiles-1.1.0-cp313-cp313-win32.whl", hash = "sha256:32d6d4e583593cb8576e129879ea0991660b935177c0f93c6681359b3654bfa9", size = 279194, upload-time = "2025-06-15T19:05:51.186Z" },
{ url = "https://files.pythonhosted.org/packages/25/41/2dd88054b849aa546dbeef5696019c58f8e0774f4d1c42123273304cdb2e/watchfiles-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:f21af781a4a6fbad54f03c598ab620e3a77032c5878f3d780448421a6e1818c7", size = 292349, upload-time = "2025-06-15T19:05:52.201Z" },
{ url = "https://files.pythonhosted.org/packages/c8/cf/421d659de88285eb13941cf11a81f875c176f76a6d99342599be88e08d03/watchfiles-1.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:5366164391873ed76bfdf618818c82084c9db7fac82b64a20c44d335eec9ced5", size = 283836, upload-time = "2025-06-15T19:05:53.265Z" },
{ url = "https://files.pythonhosted.org/packages/45/10/6faf6858d527e3599cc50ec9fcae73590fbddc1420bd4fdccfebffeedbc6/watchfiles-1.1.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:17ab167cca6339c2b830b744eaf10803d2a5b6683be4d79d8475d88b4a8a4be1", size = 400343, upload-time = "2025-06-15T19:05:54.252Z" },
{ url = "https://files.pythonhosted.org/packages/03/20/5cb7d3966f5e8c718006d0e97dfe379a82f16fecd3caa7810f634412047a/watchfiles-1.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:328dbc9bff7205c215a7807da7c18dce37da7da718e798356212d22696404339", size = 392916, upload-time = "2025-06-15T19:05:55.264Z" },
{ url = "https://files.pythonhosted.org/packages/8c/07/d8f1176328fa9e9581b6f120b017e286d2a2d22ae3f554efd9515c8e1b49/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7208ab6e009c627b7557ce55c465c98967e8caa8b11833531fdf95799372633", size = 449582, upload-time = "2025-06-15T19:05:56.317Z" },
{ url = "https://files.pythonhosted.org/packages/66/e8/80a14a453cf6038e81d072a86c05276692a1826471fef91df7537dba8b46/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a8f6f72974a19efead54195bc9bed4d850fc047bb7aa971268fd9a8387c89011", size = 456752, upload-time = "2025-06-15T19:05:57.359Z" },
{ url = "https://files.pythonhosted.org/packages/5a/25/0853b3fe0e3c2f5af9ea60eb2e781eade939760239a72c2d38fc4cc335f6/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d181ef50923c29cf0450c3cd47e2f0557b62218c50b2ab8ce2ecaa02bd97e670", size = 481436, upload-time = "2025-06-15T19:05:58.447Z" },
{ url = "https://files.pythonhosted.org/packages/fe/9e/4af0056c258b861fbb29dcb36258de1e2b857be4a9509e6298abcf31e5c9/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adb4167043d3a78280d5d05ce0ba22055c266cf8655ce942f2fb881262ff3cdf", size = 596016, upload-time = "2025-06-15T19:05:59.59Z" },
{ url = "https://files.pythonhosted.org/packages/c5/fa/95d604b58aa375e781daf350897aaaa089cff59d84147e9ccff2447c8294/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5701dc474b041e2934a26d31d39f90fac8a3dee2322b39f7729867f932b1d4", size = 476727, upload-time = "2025-06-15T19:06:01.086Z" },
{ url = "https://files.pythonhosted.org/packages/65/95/fe479b2664f19be4cf5ceeb21be05afd491d95f142e72d26a42f41b7c4f8/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b067915e3c3936966a8607f6fe5487df0c9c4afb85226613b520890049deea20", size = 451864, upload-time = "2025-06-15T19:06:02.144Z" },
{ url = "https://files.pythonhosted.org/packages/d3/8a/3c4af14b93a15ce55901cd7a92e1a4701910f1768c78fb30f61d2b79785b/watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:9c733cda03b6d636b4219625a4acb5c6ffb10803338e437fb614fef9516825ef", size = 625626, upload-time = "2025-06-15T19:06:03.578Z" },
{ url = "https://files.pythonhosted.org/packages/da/f5/cf6aa047d4d9e128f4b7cde615236a915673775ef171ff85971d698f3c2c/watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:cc08ef8b90d78bfac66f0def80240b0197008e4852c9f285907377b2947ffdcb", size = 622744, upload-time = "2025-06-15T19:06:05.066Z" },
{ url = "https://files.pythonhosted.org/packages/2c/00/70f75c47f05dea6fd30df90f047765f6fc2d6eb8b5a3921379b0b04defa2/watchfiles-1.1.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:9974d2f7dc561cce3bb88dfa8eb309dab64c729de85fba32e98d75cf24b66297", size = 402114, upload-time = "2025-06-15T19:06:06.186Z" },
{ url = "https://files.pythonhosted.org/packages/53/03/acd69c48db4a1ed1de26b349d94077cca2238ff98fd64393f3e97484cae6/watchfiles-1.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c68e9f1fcb4d43798ad8814c4c1b61547b014b667216cb754e606bfade587018", size = 393879, upload-time = "2025-06-15T19:06:07.369Z" },
{ url = "https://files.pythonhosted.org/packages/2f/c8/a9a2a6f9c8baa4eceae5887fecd421e1b7ce86802bcfc8b6a942e2add834/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95ab1594377effac17110e1352989bdd7bdfca9ff0e5eeccd8c69c5389b826d0", size = 450026, upload-time = "2025-06-15T19:06:08.476Z" },
{ url = "https://files.pythonhosted.org/packages/fe/51/d572260d98388e6e2b967425c985e07d47ee6f62e6455cefb46a6e06eda5/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fba9b62da882c1be1280a7584ec4515d0a6006a94d6e5819730ec2eab60ffe12", size = 457917, upload-time = "2025-06-15T19:06:09.988Z" },
{ url = "https://files.pythonhosted.org/packages/c6/2d/4258e52917bf9f12909b6ec314ff9636276f3542f9d3807d143f27309104/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3434e401f3ce0ed6b42569128b3d1e3af773d7ec18751b918b89cd49c14eaafb", size = 483602, upload-time = "2025-06-15T19:06:11.088Z" },
{ url = "https://files.pythonhosted.org/packages/84/99/bee17a5f341a4345fe7b7972a475809af9e528deba056f8963d61ea49f75/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa257a4d0d21fcbca5b5fcba9dca5a78011cb93c0323fb8855c6d2dfbc76eb77", size = 596758, upload-time = "2025-06-15T19:06:12.197Z" },
{ url = "https://files.pythonhosted.org/packages/40/76/e4bec1d59b25b89d2b0716b41b461ed655a9a53c60dc78ad5771fda5b3e6/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fd1b3879a578a8ec2076c7961076df540b9af317123f84569f5a9ddee64ce92", size = 477601, upload-time = "2025-06-15T19:06:13.391Z" },
{ url = "https://files.pythonhosted.org/packages/1f/fa/a514292956f4a9ce3c567ec0c13cce427c158e9f272062685a8a727d08fc/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62cc7a30eeb0e20ecc5f4bd113cd69dcdb745a07c68c0370cea919f373f65d9e", size = 451936, upload-time = "2025-06-15T19:06:14.656Z" },
{ url = "https://files.pythonhosted.org/packages/32/5d/c3bf927ec3bbeb4566984eba8dd7a8eb69569400f5509904545576741f88/watchfiles-1.1.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:891c69e027748b4a73847335d208e374ce54ca3c335907d381fde4e41661b13b", size = 626243, upload-time = "2025-06-15T19:06:16.232Z" },
{ url = "https://files.pythonhosted.org/packages/e6/65/6e12c042f1a68c556802a84d54bb06d35577c81e29fba14019562479159c/watchfiles-1.1.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:12fe8eaffaf0faa7906895b4f8bb88264035b3f0243275e0bf24af0436b27259", size = 623073, upload-time = "2025-06-15T19:06:17.457Z" },
{ url = "https://files.pythonhosted.org/packages/89/ab/7f79d9bf57329e7cbb0a6fd4c7bd7d0cee1e4a8ef0041459f5409da3506c/watchfiles-1.1.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:bfe3c517c283e484843cb2e357dd57ba009cff351edf45fb455b5fbd1f45b15f", size = 400872, upload-time = "2025-06-15T19:06:18.57Z" },
{ url = "https://files.pythonhosted.org/packages/df/d5/3f7bf9912798e9e6c516094db6b8932df53b223660c781ee37607030b6d3/watchfiles-1.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a9ccbf1f129480ed3044f540c0fdbc4ee556f7175e5ab40fe077ff6baf286d4e", size = 392877, upload-time = "2025-06-15T19:06:19.55Z" },
{ url = "https://files.pythonhosted.org/packages/0d/c5/54ec7601a2798604e01c75294770dbee8150e81c6e471445d7601610b495/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba0e3255b0396cac3cc7bbace76404dd72b5438bf0d8e7cefa2f79a7f3649caa", size = 449645, upload-time = "2025-06-15T19:06:20.66Z" },
{ url = "https://files.pythonhosted.org/packages/0a/04/c2f44afc3b2fce21ca0b7802cbd37ed90a29874f96069ed30a36dfe57c2b/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4281cd9fce9fc0a9dbf0fc1217f39bf9cf2b4d315d9626ef1d4e87b84699e7e8", size = 457424, upload-time = "2025-06-15T19:06:21.712Z" },
{ url = "https://files.pythonhosted.org/packages/9f/b0/eec32cb6c14d248095261a04f290636da3df3119d4040ef91a4a50b29fa5/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d2404af8db1329f9a3c9b79ff63e0ae7131986446901582067d9304ae8aaf7f", size = 481584, upload-time = "2025-06-15T19:06:22.777Z" },
{ url = "https://files.pythonhosted.org/packages/d1/e2/ca4bb71c68a937d7145aa25709e4f5d68eb7698a25ce266e84b55d591bbd/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e78b6ed8165996013165eeabd875c5dfc19d41b54f94b40e9fff0eb3193e5e8e", size = 596675, upload-time = "2025-06-15T19:06:24.226Z" },
{ url = "https://files.pythonhosted.org/packages/a1/dd/b0e4b7fb5acf783816bc950180a6cd7c6c1d2cf7e9372c0ea634e722712b/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:249590eb75ccc117f488e2fabd1bfa33c580e24b96f00658ad88e38844a040bb", size = 477363, upload-time = "2025-06-15T19:06:25.42Z" },
{ url = "https://files.pythonhosted.org/packages/69/c4/088825b75489cb5b6a761a4542645718893d395d8c530b38734f19da44d2/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d05686b5487cfa2e2c28ff1aa370ea3e6c5accfe6435944ddea1e10d93872147", size = 452240, upload-time = "2025-06-15T19:06:26.552Z" },
{ url = "https://files.pythonhosted.org/packages/10/8c/22b074814970eeef43b7c44df98c3e9667c1f7bf5b83e0ff0201b0bd43f9/watchfiles-1.1.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:d0e10e6f8f6dc5762adee7dece33b722282e1f59aa6a55da5d493a97282fedd8", size = 625607, upload-time = "2025-06-15T19:06:27.606Z" },
{ url = "https://files.pythonhosted.org/packages/32/fa/a4f5c2046385492b2273213ef815bf71a0d4c1943b784fb904e184e30201/watchfiles-1.1.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:af06c863f152005c7592df1d6a7009c836a247c9d8adb78fef8575a5a98699db", size = 623315, upload-time = "2025-06-15T19:06:29.076Z" },
]
[[package]]
name = "websockets"
version = "15.0.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" },
{ url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" },
{ url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" },
{ url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" },
{ url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" },
{ url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" },
{ url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" },
{ url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" },
{ url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" },
{ url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" },
{ url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" },
{ url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" },
]