尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證AI 原型用於車輛損傷評估、維修費用估算與理賠路由
AI 翻譯
AI prototype for vehicle damage assessment, repair cost estimation, and claims routing
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
A customer takes a photo of their damaged car. The AI reads the make, model, color and damage, and gives a rough repair-cost range. Written rules then recommend the next step, and a reviewer makes the call: approve the estimate, ask the customer for better photos, or send the claim to an adjuster.
• Live prototype: https://vehicle-damage-claims-ai.vercel.app
• Evaluation: the Evaluation page in the app, and eval/README.md
How it works for a claims team檢視完整 README ↗A customer takes a photo of their damaged car. The AI reads the make, model, color and damage, and gives a rough repair-cost range. Written rules then recommend the next step, and a reviewer makes the call: approve the estimate, ask the customer for better photos, or send the claim to an adjuster.
eval/README.md| You asked for | Where to find it |
|---|---|
| Accept a photo by upload or URL | + Add photos: a photo, a folder per claim, or a link |
| Make, model and color | Top of the assessment card. If it can't tell, it says so instead of guessing |
| Damage summary | Assessment card, e.g. "Left rear door dent with scraping" |
| A rough repair estimate | Assessment card: a likely range, the hours and parts behind it, and possible extras listed separately |
| Setup, architecture, tools, next steps | Setup, Architecture, Why these tools, Next steps |
| Evaluation | Evaluation |
The tool supports the first decision a reviewer makes on a claim. Getting that right means simple claims move faster, customers are asked for the right photos the first time, and serious claims reach an adjuster earlier.
| Route | What happens |
|---|---|
| Ready to approve | The reviewer, a desk appraiser, approves the repair estimate if it's within their approval limit. Payment and booking a repair follow, and the shop can send a supplement if it finds more damage |
| Request more evidence | The reviewer texts or emails the customer which photos to retake, with an upload link. The claim waits until they reply |
| Adjuster / total loss | The claim goes to a field adjuster or the total loss unit, plus the fraud team (SIU) if a photo matches a past claim |
The prototype is live at https://vehicle-damage-claims-ai.vercel.app. Click Load demo queue, or drag in the demo-images/ folder (each subfolder is one claim).
To run it locally (Node 22 or later):
npm install
cp .env.example .env.local # add ANTHROPIC_API_KEY
npm run dev # http://localhost:3000
npm test # routing rules and URL safety; no API key needed
npm run eval # re-run the labelled set; needs a key and costs money
To deploy your own copy, import the repo into Vercel and add ANTHROPIC_API_KEY. Optional settings are in .env.example.
flowchart LR
rev(["Reviewer"])
subgraph BR["Browser"]
ui["Worklist and assessment<br/>state lives in the tab"]
end
subgraph VC["Vercel function · nothing stored"]
direction LR
prep["① Prepare photos<br/>rotate, resize"]
checks["② Photo checks<br/>brightness, sharpness,<br/>reused photo"]
rules["④ Routing protocol<br/>locked rules,<br/>configurable limits"]
end
ai["③ Claude<br/>one call per claim<br/>sees photos only"]
rev --> ui
ui -- "photos" --> prep --> checks --> ai --> rules
checks -. "check results" .-> rules
ui -. "claim and policy details" .-> rules
rules == "route, reasons, estimate" ==> ui
classDef person fill:#e0e7ff,stroke:#4f46e5,color:#1e1b4b,stroke-width:1.5px
classDef screen fill:#f1f5f9,stroke:#475569,color:#0f172a,stroke-width:1.5px
classDef code fill:#dcfce7,stroke:#16a34a,color:#052e16,stroke-width:1.5px
classDef model fill:#ffedd5,stroke:#ea580c,color:#431407,stroke-width:1.5px
class rev person
class ui screen
class prep,checks,rules code
class ai model
style BR fill:#f8fafc,stroke:#94a3b8,color:#334155
style VC fill:#f8fafc,stroke:#94a3b8,color:#334155
Color key: green is plain code, orange is the AI, purple is people.
Key design choices
lib/policy/protocol.ts pick the route, and each rule has a test.The routing rules. Some are locked, such as injury, structural damage, deployed airbags, a reused photo, or a vehicle that isn't a normal road car. Others are settings the carrier can change within limits, like the $2,500 approval limit and the total-loss line. The total-loss line follows the claim's state, found from its ZIP code: a fixed share of the car's value in some states, a formula (repair plus salvage reaching the car's value) in others, and the carrier's 60% setting where neither applies. The state rules are from a secondary source and still need checking against each state's law. Changing a setting re-routes the worklist straight away, because only the rules re-run. Test against labelled cases shows what a change would do before it's published: lowering the approval limit to $750, for example, sends all 10 serious test claims to an adjuster, but 3 simple ones too.
The Routing protocol page in the app shows all of this on one page: a diagram from the claim and photos, to what the AI describes, to the rules, to the reviewer, with what sends a claim to each route (the open claim's route and the rules it set off are highlighted). Below it are the six rule groups (what each catches, where it sends the claim, whether it's locked), the three settings that matter most, and how prices are set, with a worked example.
The repair estimate. The AI describes each repair; an estimating guide (how long each repair takes, and what parts cost) and the carrier's labor rates price it. We found the AI was consistent about what was damaged but not about what it cost: the same Civic photo got totals from $750–$1,800 to $1,000–$2,600 across calls. So code turns each described repair into labor and paint hours and a part, then prices them for this car and this place:
The same photo now prices at $950 to $1,300 (Columbus) on every call.
Under each estimate, three short lines show where its inputs came from: From the photos (the AI's reading: each damaged part, how badly, repair or replace), From the claim (the ZIP and its labor market, the car on the policy and its value, which set the parts level), and From the estimating guide (labor hours per repair, at the carrier's labor and paint rates). The AI only supplies the first.
Each line shows its working: what the AI saw in the photo, the hours and rates ("4.5 h body x $65 + 3.5 h paint x $110 = $678"), and the repair cost against the replacement cost, with the one priced marked. If repairing a part would cost more than replacing it, it's priced as a replacement.
The range covers what the photos show, 15% either side of the most likely cost (a setting).
What the photos can't show is listed separately as possible extras: damage behind the panels, parts the AI flagged for inspection, sensor recalibration. The routing rules use the figure with them included, so a claim isn't approved on the assumption that nothing else turns up.
The AI's own price is kept as a cross-check, and used for parts the estimating guide doesn't cover and for vehicles that aren't road cars.
Every hour, rate and market is a placeholder. In production:
The protocol owner can change the base rates in the app, and Edit details can change a claim's ZIP to see the price move.
When a claim can't be priced reliably yet, the range is marked Provisional and doesn't affect the route.
The same steps, inside the carrier's own cloud account and connected to their claims system. Claude runs on AWS (Bedrock) and Google Cloud (Vertex AI), so photos can stay in the carrier's account.
flowchart TB
cust(["Customer"])
subgraph IN["1 · Intake"]
direction LR
app["Photo capture app<br/>guided views"] --> store[("Photo store<br/>encrypted, retention rules")] --> queue[["Queue<br/>absorbs storm surges"]]
end
subgraph AS["2 · Assessment, in the carrier's cloud account"]
direction LR
svc["Assessment service<br/>photo checks"] <--> ai["Claude<br/>via Bedrock or Vertex AI"]
svc --> rules["Routing protocol<br/>versioned, owner-approved"]
gate["Release gate<br/>changes scored on<br/>labelled claims"] -. "releases" .-> rules
end
subgraph RC["3 · Decision and review"]
direction LR
log[("Decision log<br/>every route and reason")] --> rev(["Reviewer<br/>decision written back<br/>to the claims system"])
log -.-> mon["Monitoring<br/>overrides, cost, drift"]
end
cms[("Claims system<br/>policy and claim details")]
cust --> IN
IN -- "one message per claim" --> AS
cms -- "policy facts" --> AS
AS -- "route and reasons" --> RC
classDef person fill:#e0e7ff,stroke:#4f46e5,color:#1e1b4b,stroke-width:1.5px
classDef code fill:#dcfce7,stroke:#16a34a,color:#052e16,stroke-width:1.5px
classDef model fill:#ffedd5,stroke:#ea580c,color:#431407,stroke-width:1.5px
classDef data fill:#e0f2fe,stroke:#0284c7,color:#082f49,stroke-width:1.5px
classDef ops fill:#f1f5f9,stroke:#475569,color:#0f172a,stroke-width:1.5px
class cust,rev person
class app,svc,rules code
class ai model
class store,queue,log,cms data
class gate,mon ops
style IN fill:#f8fafc,stroke:#94a3b8,color:#334155
style AS fill:#f8fafc,stroke:#94a3b8,color:#334155
style RC fill:#f8fafc,stroke:#94a3b8,color:#334155
Color key: green is plain code, orange is the AI, blue is stored data, purple is people.
| Prototype | Production |
|---|---|
| Worklist lives in the browser | Connected to the claims system (for example Guidewire), with decisions written back to the claim file |
| No image storage | Photos in the carrier's storage, with retention rules |
| One request per claim | A queue with retries and rate limits, so a spike in claims doesn't cause timeouts |
| Decision record you can download | An audit log of every decision, with monitoring on speed, cost, failures and overrides |
| Versions shown on each result | Each prompt, model or rule change tested against the labelled set before release |
| Mock roles | Single sign-on, role-based access, two-person approval for rule changes |
| Checks against one demo past-claim photo | Duplicate search across all past photos, plus a check for edited images |
| A placeholder estimating guide | Labor times from an estimating platform, the carrier's own rates, and calibration on its paid claims |
| A person approves each claim | Gradual automation for narrow, low-risk cases (see Path to production) |
| Option | Good at | Why we didn't start there |
|---|---|---|
| Claude (what we used) | Reads photos well, fills in a fixed format reliably, runs on AWS and Google Cloud | Still needs testing on your claims |
| GPT or Gemini | Similar capability | Not tested here. Switching would be a settings change plus a test run |
| Estimating vendors (Tractable, CCC, Mitchell) | Pricing, based on large volumes of paid claims | Their reasoning isn't visible. Our routing could use their price in production |
| A custom vision model | Locating damage, at low cost per photo | Needs many labelled photos and an ML team, and doesn't give make, model or price |
| Open-source models | Photos stay in your environment | Generally less accurate today, and more to run |
Because the output format is fixed and the labelled set checks the results, the model can be swapped without changing the rules or the screen.
Measured on the 26 labelled cases, end to end:
| Opus 5.5 (default) | Sonnet 5.5 | |
|---|---|---|
| Typical time per claim | 9.7 s | 7.0 s |
| Slowest 1 in 10 | 13.0 s | 8.9 s |
| Estimated cost per claim | $0.039 | $0.019 |
| Failed calls | 0 of 26 | 0 of 26 |
The short answer. On 26 test claims, it sent all 10 serious claims to an adjuster and none of the 16 simple ones. When it was unsure, it asked for another photo rather than guess. That's a good start, not proof: proof needs the carrier's own claims. The evaluation page shows the same results, with every test claim and its photo.
| Serious claims that went to an adjuster | 10 of 10 (with so few, the real rate could be as low as 72%) |
| Simple claims sent to an adjuster they didn't need | 0 of 16 |
| Same route as our expert | 23 of 26 |
| Time and cost | About 10 seconds and 4 cents a claim |
eval/README.md lists them.Mistakes don't cost the same here, so we don't lead with overall accuracy. We read two numbers together:
We also check the basics: the right make, model and colour, or left blank when it can't tell (it didn't guess on 17 of 17), and how consistent, fast and cheap it is. Once it's live, reviewers' corrections (the Completed tab) keep measuring the same things, and each one can be downloaded as a new test case. The carrier decides what counts as good enough.
The 3 claims it didn't get exactly right, most serious first. None was a serious claim approved from photos.
The mistakes we'd watch most closely on live claims:
Scale can do the expert labelling.
We can't tell yet. That needs their paid claims, and the app says so on every estimate. Once we have them, we'd check how often the final paid amount falls inside our range, and how wide the range is. A very wide range will usually contain the paid amount but isn't much help, so we keep the range to what the photos show and list the possible extras separately. The range width is a setting we'd calibrate on their paid claims.
What matters most is which side of the $2,500 approval limit the estimate lands on. If it's close, the claim is flagged for a price check. If it could run well over, it goes to an adjuster. If an approved estimate turns out too low, the body shop files a supplement, the same as today, and it's reviewed.
| Opus 5.5, prompt v1 | Opus 5.5, prompt v2 | Sonnet 5.5, prompt v2 | |
|---|---|---|---|
| Serious claims that went to an adjuster | 10 of 10 | 10 of 10 | 10 of 10 |
| Same route as our expert (or one the label also accepts) | 22 (23) of 26 | 23 (25) of 26 | 23 (25) of 26 |
| Simple claims sent to an adjuster they didn't need | 1 of 16 | 0 of 16 | 0 of 16 |
| Didn't guess when it couldn't tell | 17 of 17 | 17 of 17 | 16 of 17 |
| Same route on all 4 runs | not measured | 25 of 26 (with AI pricing) | not measured |
| Failure | How likely | What the prototype does |
|---|---|---|
| Serious claim approved from photos | Low, but high impact | Locked safety rules, the more serious route takes priority, measured in the evaluation |
| Wrong vehicle named with confidence | Medium | Make and model left blank without a badge or distinctive shape; policy mismatch flagged |
| Damage missed or made up | Medium | "No damage visible" asks for photos; the reviewer approves each estimate |
| Estimate on the wrong side of a limit | Likely near the limit | Ranges close to the limit are flagged, very wide ones go to an adjuster |
| AI error or timeout | Occasional | One retry, then manual triage |
| Reused or edited photo | Becoming more common | Reused photos are caught and sent to SIU; edited photos aren't detected yet |
| Instructions written into a photo | Rare | The AI doesn't pick the route, so the likely worst case is a wrong fact the reviewer can see |
A person approves each claim today. That's the right place to start. We'd reduce review gradually, one narrow, low-risk slice at a time, with evidence first and checks still running afterwards.
| Stage | The AI | People | To move on |
|---|---|---|---|
| 1. Live comparison | Recommends routes in the background; nobody acts on them | Work claims as today | Its routes compared with adjusters' decisions for 4 to 6 weeks |
| 2. Limited pilot (this prototype) | Recommends a route for one claim segment | Approve every route | Agreed results on the carrier's own claims |
| 3. One automatic slice | Sends photo requests, later small photo estimates, without a reviewer | Review a random sample and anything flagged | Sampled reviews keep agreeing; supplements and complaints don't rise |
| 4. Expand | One more segment at a time | Sample and monitor | Each segment passes the same checks |
What stays with a person: total loss, injury, fraud referrals, denials, reduced payments, and anything the tool couldn't assess. The rules already work this way, and it matches where regulation is heading (the NAIC's 2023 model bulletin on insurers' use of AI expects controls in proportion to the potential harm).
How we'd know a slice is ready, agreed with the claims and risk owners up front:
How often reviewers disagree with the recommendation is a direct way to measure accuracy on live claims. Each decision records the recommended route and team, the reviewer's route and who they sent it to, the estimate and any amount the reviewer changed it to, the reason, and the rules that fired. In the prototype, Completed shows "Kept the recommendation on X of Y decisions", with route changes, amount changes and hand-offs to a different team counted separately (sending a total loss to a field adjuster on the right route still counts as a different decision), and the log downloads as a CSV. Each claim's Decision record shows everything behind it, and any correction can be downloaded as a labelled test case for the evaluation set. In production it would feed an override dashboard, and each correction would become a bug fix or a new test case.
app/ Pages and API routes
components/ Worklist, assessment panel, photo viewer, intake
demo-images/ Demo claims, one folder per claim
eval/ Labelled cases, test images, saved results
lib/extraction/ The Claude call, prompt and output format
lib/policy/ Routing rules, estimate and rule engine, with tests
lib/image/ Photo checks
lib/net/ Safe link fetching, with tests
lib/eval/ Evaluation runner and scoring
lib/client/ Browser-side worklist, customer contact and review log