Member service agent for Cedarline Health Plan, a hypothetical medical insurance company. Members can ask about their claims, denial reasons, deductible and out-of-pocket balances, prior authorizations and service requests, and open appeals. The agent verifies their identity first.
The project builds a synthetic insurance dataset, adds it to Snowflake and to Salesforce Data Cloud, and grounds an Agentforce agent on it.
Tech stack: Python (pandas) · Snowflake · Salesforce Data Cloud (Data 360) · Agentforce Builder
Synthea sample data ──► import_synthea.py ──► data/out/*.csv ──► load_snowflake.py ──► Snowflake (CEDARLINE.SERVICE)
│
└──► export_datacloud.py ──► data/datacloud/*.csv + schema.yaml
│
export_datalibrary.py ◄─────────────┘
│
▼
salesforce data library/*.txt ──► Agentforce Data Library ──► Agent
- Data generation.
import_synthea.pymaps the Synthea sample patients, payers and claims (about 1,160 patients) onto Cedarline's member, plan and claims tables, and computes accumulators from those claims. It then generates seeded synthetic prior authorizations, service requests, interactions, call transcripts and case notes on top. These include hand-planted test stories and two prompt-injection case notes. - Snowflake.
ddl.sqlandload_snowflake.pyload everything intoCEDARLINE.SERVICE.query_snowflake.pyruns sample queries against it. - Data Cloud.
export_datacloud.pywrites Data Cloud-ready CSVs (ISO-8601 timestamps,true/falsebooleans).ingest_datacloud.pygenerates the OpenAPIschema.yamlfor the Ingestion API connector and can bulk-load the CSVs through the Ingestion API. - Agentforce Data Library.
export_datalibrary.pyturns each record into a self-contained plain-English paragraph, because the Data Library splits files into chunks for search. Members are joined with their plan and accumulators. The output TXT files stay under the 4 MB limit. - Agent. The agent is defined in Agent Script (
agentforce/). It answers questions by searching the Data Library through theAnswer Questions with Knowledgeaction.
| Table | Rows | Contents |
|---|---|---|
| plans | 6 | Bronze HMO, Silver HMO, Gold PPO, Platinum PPO, High-Deductible HSA, Medicare Advantage |
| members | 1,163 | Name, date of birth, email, ZIP, plan, status (active/terminated) |
| accumulators | 1,163 | Plan-year deductible and out-of-pocket amounts met |
| claims | 5,526 | Billed amount, member owes, status, denial reason (coverage terminated, out of network, duplicate, not medically necessary, missing prior auth) |
| prior_auths | 874 | Service code, status (approved/denied/pending), submitted and decided dates |
| service_requests | 2,328 | ID card, address change, appeal, grievance |
| case_notes | 583 | Notes on service requests |
| interactions | 14,540 | Channel, intent, handle time, resolved flag, CSAT |
| call_transcripts | 290 | Call summaries |
All data is synthetic, and the emails use @example.com.
All 8 TXT files are uploaded and indexed in the Agentforce Data Library:
| Subagent | Purpose | Requires verification |
|---|---|---|
| Agent Router | Classifies intent and routes to a subagent | — |
| Service Customer Verification | Captures the member ID (M + 6 digits), then verifies identity with an email code |
— |
| Member Services | Claims, denial reasons, benefits and balances, prior authorizations, service requests. Creates appeal and grievance cases. | Yes |
| Plan Information | General plan comparisons (deductibles, out-of-pocket maximums) | No |
| Escalation / Off Topic / Ambiguous Question | Handoff to a human, and guardrails | No |
Design choices:
- Small footprint. There are 6 subagents and no custom flows. Only the template's verification and create-case flows are used.
- Member scoping. The verified member ID is stored in
memberID. Every knowledge query includes it, and the agent must ignore records for any other member. It can't be changed after verification (available when isVerified == False). - Guardrails. The agent gives no medical advice, doesn't predict prior-authorization outcomes or estimate future costs, and doesn't reveal internal note authors.
agentforce/cedarline_agent_script_TEST.txt bypasses verification for preview testing: it starts verified as member M000367. Revert to cedarline_agent_script.txt before activating the agent.
Example prompts (member M000367, Gold PPO):
| Prompt | Expected |
|---|---|
| How much of my deductible have I met? | $389.36 met, $1,110.64 remaining (as of Oct 18, 2026) |
| Why was claim CLM00001191 denied? | Duplicate claim, $926.85 owed |
| What's the status of my prior authorization? | PA00000553 (PT-EVAL) pending |
| Show me claims for M000137 | Refuses, because that's another member's data |
- No row-level security in the Data Library. Member scoping relies on instructions, not access control. That's fine for synthetic demo data. For production, use custom objects or Data Cloud DMOs with Flow or Apex actions that filter by the verified member.
- Search, not queries. Retrieval works well for lookups ("status of claim X"). It's unreliable for aggregates ("how many denied claims", "largest claim").
- Verification needs a Contact. The email verification flow matches a Salesforce Contact, so testing requires a Contact with a real email address.
data/
import_synthea.py Synthea -> Cedarline tables (data/out/)
ddl.sql Snowflake schema
load_snowflake.py Load data/out/ into Snowflake
query_snowflake.py Sample queries against Snowflake
export_datacloud.py data/out/ -> data/datacloud/ (Data Cloud format)
ingest_datacloud.py schema.yaml + Ingestion API bulk loader
export_datalibrary.py data/datacloud/ -> salesforce data library/*.txt
salesforce data library/ TXT files uploaded to the Agentforce Data Library
agentforce/ Agent Script (production and test-bypass versions)
docs/images/ Screenshots
pip install -r data/requirements.txt
python data/import_synthea.py # needs the Synthea sample CSVs in data/public/
python data/load_snowflake.py # needs SNOWFLAKE_* in .env
python data/export_datacloud.py
python data/export_datalibrary.pyThen upload salesforce data library/*.txt to an Agentforce Data Library, attach it to the agent, and paste agentforce/cedarline_agent_script.txt into Agentforce Builder's script view.


