initial commit
This commit is contained in:
commit
aaba8753ef
36 changed files with 3682 additions and 0 deletions
11
.gitignore
vendored
Normal file
11
.gitignore
vendored
Normal 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
1
.python-version
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
3.13
|
||||||
22
Dockerfile
Normal file
22
Dockerfile
Normal 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
244
README.md
Normal 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
10
compose.yaml
Normal 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
42
pyproject.toml
Normal 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"]
|
||||||
96
rag/cigna_1000_classic.txt
Normal file
96
rag/cigna_1000_classic.txt
Normal 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. You’ll pay only $20 to see your doctor and $40 for specialists. Preventive care is always free. It’s 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 plan’s network: $15 copay
|
||||||
|
Generic medication (31-90-day supply) from a pharmacy in your plan’s 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 that’s on your plan’s preferred list (30-day supply from an in-network pharmacy): $45 copay
|
||||||
|
Brand-name medication that’s on your plan’s preferred list (31-90-day supply) from an in-network pharmacy): $90 copayemnt
|
||||||
|
Brand-name medication that’s not on your plan’s preferred list (30-day supply) from an in-network pharmacy): $85 copay
|
||||||
|
Brand-name medication that’s not on your plan’s preferred list (31-90-day supply) from an in-network pharmacy): $150 copayemnt
|
||||||
96
rag/cigna_1500_classic.txt
Normal file
96
rag/cigna_1500_classic.txt
Normal 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. It’s 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 plan’s network: $15 copay
|
||||||
|
Generic medication (31-90-day supply) from a pharmacy in your plan’s 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 that’s on your plan’s preferred list (30-day supply from an in-network pharmacy): $45 copay
|
||||||
|
Brand-name medication that’s on your plan’s preferred list (31-90-day supply) from an in-network pharmacy): $90 copayemnt
|
||||||
|
Brand-name medication that’s not on your plan’s preferred list (30-day supply) from an in-network pharmacy): $85 copay
|
||||||
|
Brand-name medication that’s not on your plan’s preferred list (31-90-day supply) from an in-network pharmacy): $150 copayemnt
|
||||||
96
rag/cigna_2500_classic.txt
Normal file
96
rag/cigna_2500_classic.txt
Normal 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. You’ll pay $30 for primary care and $60 for specialists, with preventive care fully covered. It’s 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 plan’s network: $15 copay
|
||||||
|
Generic medication (31-90-day supply) from a pharmacy in your plan’s 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 that’s on your plan’s preferred list (30-day supply from an in-network pharmacy): $45 copay
|
||||||
|
Brand-name medication that’s on your plan’s preferred list (31-90-day supply) from an in-network pharmacy): $90 copayemnt
|
||||||
|
Brand-name medication that’s not on your plan’s preferred list (30-day supply) from an in-network pharmacy): $85 copay
|
||||||
|
Brand-name medication that’s not on your plan’s preferred list (31-90-day supply) from an in-network pharmacy): $150 copayemnt
|
||||||
96
rag/cigna_3500_classic.txt
Normal file
96
rag/cigna_3500_classic.txt
Normal 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. It’s a smart choice if you’re 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 plan’s network: $15 copay
|
||||||
|
Generic medication (31-90-day supply) from a pharmacy in your plan’s 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 that’s on your plan’s preferred list (30-day supply from an in-network pharmacy): $65 copay
|
||||||
|
Brand-name medication that’s on your plan’s preferred list (31-90-day supply) from an in-network pharmacy): $90 copayemnt
|
||||||
|
Brand-name medication that’s not on your plan’s preferred list (30-day supply) from an in-network pharmacy): $100 copay
|
||||||
|
Brand-name medication that’s not on your plan’s preferred list (31-90-day supply) from an in-network pharmacy): $150 copayemnt
|
||||||
96
rag/cigna_3500_hsa.txt
Normal file
96
rag/cigna_3500_hsa.txt
Normal 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. You’ll 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 plan’s network: $15 copay
|
||||||
|
Generic medication (31-90-day supply) from a pharmacy in your plan’s 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 that’s on your plan’s preferred list (30-day supply from an in-network pharmacy): $65 copay
|
||||||
|
Brand-name medication that’s on your plan’s preferred list (31-90-day supply) from an in-network pharmacy): $90 copayemnt
|
||||||
|
Brand-name medication that’s not on your plan’s preferred list (30-day supply) from an in-network pharmacy): $100 copay
|
||||||
|
Brand-name medication that’s not on your plan’s preferred list (31-90-day supply) from an in-network pharmacy): $150 copayemnt
|
||||||
96
rag/cigna_5000_classic.txt
Normal file
96
rag/cigna_5000_classic.txt
Normal 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. It’s perfect if you’re looking for a PPO that covers the big stuff but doesn’t 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 plan’s network: $15 copay
|
||||||
|
Generic medication (31-90-day supply) from a pharmacy in your plan’s 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 that’s on your plan’s preferred list (30-day supply from an in-network pharmacy): $65 copay
|
||||||
|
Brand-name medication that’s on your plan’s preferred list (31-90-day supply) from an in-network pharmacy): $90 copayemnt
|
||||||
|
Brand-name medication that’s not on your plan’s preferred list (30-day supply) from an in-network pharmacy): $100 copay
|
||||||
|
Brand-name medication that’s not on your plan’s preferred list (31-90-day supply) from an in-network pharmacy): $150 copayemnt
|
||||||
96
rag/cigna_5000_hsa.txt
Normal file
96
rag/cigna_5000_hsa.txt
Normal 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 plan’s network: $15 copay
|
||||||
|
Generic medication (31-90-day supply) from a pharmacy in your plan’s 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 that’s on your plan’s preferred list (30-day supply from an in-network pharmacy): $65 copay
|
||||||
|
Brand-name medication that’s on your plan’s preferred list (31-90-day supply) from an in-network pharmacy): $130 copayemnt
|
||||||
|
Brand-name medication that’s not on your plan’s preferred list (30-day supply) from an in-network pharmacy): $100 copay
|
||||||
|
Brand-name medication that’s not on your plan’s preferred list (31-90-day supply) from an in-network pharmacy): $200 copayemnt
|
||||||
94
rag/cigna_7350_value.txt
Normal file
94
rag/cigna_7350_value.txt
Normal 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. It’s a great fit for those who don’t 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 plan’s network: $15 copay
|
||||||
|
Generic medication (31-90-day supply) from a pharmacy in your plan’s 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 that’s on your plan’s preferred list (30-day supply from an in-network pharmacy): $65 copay
|
||||||
|
Brand-name medication that’s on your plan’s preferred list (31-90-day supply) from an in-network pharmacy): $90 copayemnt
|
||||||
|
Brand-name medication that’s not on your plan’s preferred list (30-day supply) from an in-network pharmacy): $100 copay
|
||||||
|
Brand-name medication that’s not on your plan’s preferred list (31-90-day supply) from an in-network pharmacy): $150 copayemnt
|
||||||
296
rag/equitable_accident_insurance_plan.txt
Normal file
296
rag/equitable_accident_insurance_plan.txt
Normal 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.
|
||||||
|
21–40 sq. cm third degree - Child: 1000
|
||||||
|
41–65 sq. cm third degree - Child: 2000
|
||||||
|
21–40 sq. cm second degree - Child: 400
|
||||||
|
21–40 sq. cm third degree - Spouse: 1000
|
||||||
|
41–65 sq. cm second degree - Child: 800
|
||||||
|
41–65 sq. cm third degree - Spouse: 2000
|
||||||
|
66–160 sq. cm third degree - Child: 6000
|
||||||
|
161–225 sq. cm third degree - Child: 14000
|
||||||
|
21–40 sq. cm second degree - Spouse: 400
|
||||||
|
41–65 sq. cm second degree - Spouse: 800
|
||||||
|
66–160 sq. cm second degree - Child: 1200
|
||||||
|
66–160 sq. cm third degree - Spouse: 6000
|
||||||
|
161–225 sq. cm second degree - Child: 1600
|
||||||
|
161–225 sq. cm third degree - Spouse: 14000
|
||||||
|
21–40 sq. cm third degree - Employee: 1000
|
||||||
|
41–65 sq. cm third degree - Employee: 2000
|
||||||
|
66–160 sq. cm second degree - Spouse: 1200
|
||||||
|
161–225 sq. cm second degree - Spouse: 1600
|
||||||
|
21–40 sq. cm second degree - Employee: 400
|
||||||
|
41–65 sq. cm second degree - Employee: 800
|
||||||
|
66–160 sq. cm third degree - Employee: 6000
|
||||||
|
161–225 sq. cm third degree - Employee: 14000
|
||||||
|
66–160 sq. cm second degree - Employee: 1200
|
||||||
|
161–225 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 5–15 cm with sutures (total of all lacerations) - Child: 250
|
||||||
|
Lacerations 5–15 cm with sutures (total of all lacerations) - Spouse: 250
|
||||||
|
Lacerations 5–15 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
|
||||||
|
Physician’s 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
|
||||||
|
Physician’s 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
|
||||||
|
Physician’s 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
|
||||||
92
rag/equitable_critical_illness_insurance_plan.txt
Normal file
92
rag/equitable_critical_illness_insurance_plan.txt
Normal 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 you’re 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 Gehrig’s 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 Gehrig’s 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
|
||||||
72
rag/equitable_dental_plan.txt
Normal file
72
rag/equitable_dental_plan.txt
Normal 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%
|
||||||
31
rag/equitable_hospital_indemnity_insurance.txt
Normal file
31
rag/equitable_hospital_indemnity_insurance.txt
Normal 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 you’re 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. It’s 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
|
||||||
88
rag/guardian_vision_full_feature_insurance_plan.txt
Normal file
88
rag/guardian_vision_full_feature_insurance_plan.txt
Normal 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
1
src/__init__.py
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
# Lolly AI - Insurance AI Assistant
|
||||||
5
src/api/__init__.py
Normal file
5
src/api/__init__.py
Normal 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
5
src/api/v1/__init__.py
Normal 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
56
src/api/v1/models.py
Normal 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
104
src/api/v1/router.py
Normal 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
19
src/config.py
Normal 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
1
src/examples/__init__.py
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
# Examples package
|
||||||
178
src/examples/example_usage.py
Normal file
178
src/examples/example_usage.py
Normal 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())
|
||||||
149
src/examples/session_example.py
Normal file
149
src/examples/session_example.py
Normal 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())
|
||||||
80
src/examples/test_agent_id.py
Normal file
80
src/examples/test_agent_id.py
Normal 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())
|
||||||
124
src/examples/test_history_parsing.py
Normal file
124
src/examples/test_history_parsing.py
Normal 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
20
src/main.py
Normal 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
1
src/services/__init__.py
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
# Services package
|
||||||
137
src/services/chat_service.py
Normal file
137
src/services/chat_service.py
Normal 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()
|
||||||
225
src/services/estimation_service.py
Normal file
225
src/services/estimation_service.py
Normal 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."
|
||||||
|
}
|
||||||
|
}
|
||||||
111
src/services/session_service.py
Normal file
111
src/services/session_service.py
Normal 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
791
uv.lock
generated
Normal 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" },
|
||||||
|
]
|
||||||
Loading…
Add table
Add a link
Reference in a new issue