Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Vehicle damage estimation platform for auto repair workshops. Built on top of the G-Fast shared analysis engine (@gfast/analysis-core).
Calls runAnalysisPipeline() from @gfast/analysis-core (wreck-vision shared module). This runs a 4-stage Gemini Vision analysis:
Cost: ~5 Gemini requests per analysis × image token cost (~$0.003 per analysis).
Located in server/index.js. Transforms raw pipeline output into workshop-ready format.
Important: To restart the backend without killing the frontend:檢視完整 README ↗Vehicle damage estimation platform for auto repair workshops. Built on top of the G-Fast shared analysis engine (@gfast/analysis-core).
Browser (React + Vite) Backend (Express) Shared Module
:3006 :3333 @gfast/analysis-core
│ │ │
│── POST /api/auth/login ───────►│ │
│── POST /api/analysis ──────────►── runAnalysisPipeline() ──►│
│ │◄── damages + hiddenDamage ──│
│ │── enrichAnalysisWithParts() │
│◄── damages + needs_check ─────│ │
│── POST /api/estimates ─────────►── Supabase DB │
│── GET /api/estimates/:id ─────►── Supabase DB │
| Layer | Tech |
|---|---|
| Frontend | React 18, Vite, TypeScript |
| Backend | Node.js, Express |
| Database | Supabase (PostgreSQL) |
| AI Analysis | Gemini Vision API via @gfast/analysis-core |
| Auth | JWT (8h expiry, auto-refresh) |
Calls runAnalysisPipeline() from @gfast/analysis-core (wreck-vision shared module). This runs a 4-stage Gemini Vision analysis:
| Stage | What it does |
|---|---|
| Stage 1 | Vehicle ID, photo quality, visible areas detection |
| Stage 2A | Damage pre-check (unbiased screener) |
| Stage 2B | Full damage scan — outputs damages + needs_check_parts |
| Stage 3 | Structural damage assessment (text-only) |
| Stage 4 | Hidden damage inference (AC condenser, radiator, etc.) |
Cost: 5 Gemini requests per analysis × image token cost ($0.003 per analysis).
Located in server/index.js. Transforms raw pipeline output into workshop-ready format.
runAnalysisPipeline() returns:
├── damages[] — all parts (confirmed + needs_check merged as recommendedDecision:'inspect')
├── needs_check_parts[] — explicit needs_check (if any)
└── hiddenDamageAssessment[] — Stage 4 hidden parts (radiator, AC condenser, etc.)
allParts = analysisData.damages
├── confirmedDamages = allParts WHERE recommendedDecision !== 'inspect'
└── needsCheckFromShared = allParts WHERE recommendedDecision === 'inspect'
hiddenDamageParts = hiddenDamageAssessment → mapped to needs_check format
allNeedsCheck = needsCheckFromShared + explicitNeedsCheck + hiddenDamageParts
lowercase → trim → replace special chars → snake_casePART_NAME_ALIASES (190+ aliases from @gfast/analysis-core) — e.g. front_bumper → upper_bumperPARTS_DATABASE (187 parts with EN/AR names, partId, category)Base rule: DAMAGE_TYPE_INDEX[damageType] < 4 → Repair
DAMAGE_TYPE_INDEX[damageType] >= 4 → Replace
Category overrides (highest priority):
airbags_safety, interior, mechanical, suspension → Always Replace
structural, chassis, chassis_structure → Always Repair
Any buckled damage → Always Repair
isUnmapped OR part_name_ar is null / قطعة غير معروفة{
"damages": [/* confirmed parts, mapped, enriched */],
"needs_check_parts": [/* uncertain + hidden parts, mapped, enriched */],
"vehicleInfo": { "year": 2020, "make": "Toyota", "model": "Camry" },
"timestamp": "2026-07-14T...",
"analysisSource": "@gfast/analysis-core (shared module)"
}
POST /api/auth/login with workshop_id + pinworkshops tablenode -e "import('bcrypt').then(b => b.default.hash('YOUR_PIN', 10).then(h => console.log(h)))"
INSERT INTO public.workshops (workshop_id, workshop_name, pin_hash, city, phone)
VALUES ('WS-001', 'اسم الورشة', '$2b$10$...hash...', 'المدينة', '05xxxxxxxx');
workshops
├── workshop_id TEXT PRIMARY KEY
├── workshop_name TEXT
├── pin_hash TEXT (bcrypt)
├── city TEXT
├── phone TEXT
└── is_active BOOLEAN
estimates
├── estimate_id UUID PRIMARY KEY
├── workshop_id TEXT → workshops
├── vehicle_year / make / model
├── status TEXT (draft | confirmed)
├── labors JSONB
└── confirmed_at TIMESTAMPTZ
estimate_parts
├── estimate_part_id UUID PRIMARY KEY
├── estimate_id UUID → estimates
├── part_name_en/ar TEXT
├── damage_type TEXT
├── confidence NUMERIC
├── severity_label TEXT (Repair | Replace)
└── price NUMERIC
estimate_audit_logs
├── log_id UUID PRIMARY KEY
├── estimate_id UUID → estimates
├── action_type TEXT
├── action_description_ar TEXT
├── field / old_value / new_value TEXT
└── created_at TIMESTAMPTZ
Damages section: Confirmed parts ≥ 70% confidence. User can:
Needs Check section: Parts < 70% confidence OR hidden damage from Stage 4. User can:
Labor section: 5 fixed labor types (ميكانيكا, سمكره, دهان, ايرباج, فك وتركيب) with price inputs. Repair-labeled damage parts auto-appear below as additional labor rows.
Total: إجمالي التكلفة = Replace parts cost + fixed labors + Repair parts cost
Add part manually: Arabic name + Repair/Replace + price
/report/:estimateId?public=true# Supabase
SUPABASE_URL=https://alyezrwvuzprmcaoirsb.supabase.co
SUPABASE_ANON_KEY=eyJ...
SUPABASE_SERVICE_KEY=eyJ... # Service role key — bypasses RLS, backend only
# Gemini API
WORKSHOP_GEMINI_API_KEY=... # Overrides GEMINI_API_KEY used by shared module
# Auth
JWT_SECRET=...
PORT=3333
NODE_ENV=production
# Install dependencies
npm install
# Start backend (port 3333)
npm run server
# Start frontend (port 3006)
npm run dev
Important: To restart the backend without killing the frontend:
pkill -f "node server/index.js" && npm run server
Never use pkill -9 node — it kills Vite too.
| Decision | Reason |
|---|---|
@gfast/analysis-core shared module | Single source of truth — same prompts, PARTS_DATABASE, confidence rules as wreck-vision |
| Filter unmapped parts | Only show parts with valid Arabic names — no قطعة غير معروفة |
Include hiddenDamageAssessment in needs_check | Stage 4 hidden damage (radiator, AC condenser) was missing without this |
| Category-based severity overrides | Airbags/mechanical always Replace, structural always Repair — matches wreck-vision |
| Supabase service key (not anon key) | Bypasses RLS — used backend only, never exposed to browser |
| Manual workshop onboarding | Early adopter phase — admin inserts directly into Supabase |
PART_NAME_ALIASES from shared module | 190+ aliases stay in sync with wreck-vision automatically |
| Prices always 0 from analysis | Workshop mechanic inputs real prices manually on estimate page |