visionA/docs/autoflow/02-prd/features/feature-model-management.md
jim800121chen fb7da5d180 chore(autoflow): migrate .autoflow/ 共享層文件至 docs/autoflow/
依 autoflow-agent workspace v2 設計把 PRD / 設計 / 架構 / 交付類
共享文件從個人層 .autoflow/(ignored)搬到 docs/autoflow/(進 git),
讓團隊可共享產品與架構文件,個人層只留 progress / review / testing 等
per-branch 筆記。

- 02-prd/        21 個檔(PRD、features、market-analysis 等)
- 03-design/     18 個檔(design-spec、wireframes、flows 等)
- 04-architecture/ 31 個檔(TDD、design-doc、ADR×14、API 規格等)
- 07-delivery/   3 個檔(project-summary、phase-0.6-handover、stage-deployment-setup)

合計 73 檔。原檔已從 .autoflow/ 移除(migration 工具執行 git mv,
但因 .autoflow/ 在 .gitignore 中、git 將此操作視為新增、無 rename history)。
2026-05-04 16:55:55 +08:00

146 lines
5.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Feature模型管理P0
> 父文件:[PRD.md](../PRD.md) | 對應 User StoriesUS-08、US-09、US-23
---
## 概述
使用者能瀏覽系統預設的 7 個 Kneron `.nef` 模型,上傳自己的模型,管理模型庫。
對比 local-tool
- local-tool 的模型存在使用者電腦 `~/Library/Application Support/visiona-local/custom-models/`
- visionA Cloud 的模型**存在雲端**Phase 0 用 local filesystem 實作 ObjectStorage 介面Phase 1 換 S3/MinIO
---
## 使用者行為
### 模型庫頁(`/models`
UI 沿用 local-tool但資料來源改為 visionA-backend。
**三個區塊**
1. **預設模型**(系統共用,所有使用者都能用)
- 7 個預置模型KL520 × 4 + KL720 × 3
- Phase 0seed 到 backend 的 local fs
- Phase 1seed 到 S3 的 `public/` prefix
2. **我的模型**(使用者上傳的)
- 空狀態顯示 CTA「上傳模型」
- 每個模型顯示:名稱、大小、上傳時間、支援硬體、上傳者
3. **組織模型**Phase 2留介面
- 如果使用者在團隊 workspace能看到團隊共享模型
**篩選**按任務類型classification / object_detection、硬體KL520 / KL720、關鍵字。
### 上傳模型
1. 點「上傳模型」→ 拖拽 or 選檔
2. 檔案類型:`.nef`
3. 檔案大小限制:**Phase 0 上限 100MBPhase 1 上限 500MB後續依付費方案調整**
- 此限制必須落在 configenv var 或 config file**不可硬編碼**,方便跨 Phase 調整
- 建議 config key`MODEL_UPLOAD_MAX_SIZE_MB`(預設 100
- 前端與後端都要同步使用這個值(前端顯示錯誤提示、後端做實際拒絕)
4. 上傳進度 bar
5. 後端儲存到 ObjectStorage 介面實作
6. 上傳完成後解析 metadata檔案 header
7. Phase 0metadata 存 in-memory mapPhase 1存 DB
### 模型詳細頁(`/models/[id]`
- 基本資訊名稱、ID、大小、MD5
- 支援硬體KL520 / KL720
- Metadata輸入尺寸、任務類型
- 效能數據(推論 FPS、延遲— Phase 0 預設模型有,自上傳的沒有
- 下載按鈕(重新下載到本機)
- 刪除按鈕(只對自上傳模型)
---
## 技術細節(給 Architect 參考)
### ObjectStorage 介面(重點)
Phase 0 要定義清楚介面,讓 Phase 1 可直接換 S3/MinIO 不動業務邏輯。
```go
// internal/storage/storage.go
type ObjectStorage interface {
Upload(ctx context.Context, key string, reader io.Reader, size int64) error
Download(ctx context.Context, key string) (io.ReadCloser, error)
Delete(ctx context.Context, key string) error
List(ctx context.Context, prefix string) ([]ObjectInfo, error)
// Phase 1presigned URL
GetDownloadURL(ctx context.Context, key string, expiresIn time.Duration) (string, error)
GetUploadURL(ctx context.Context, key string, expiresIn time.Duration) (string, error)
}
type ObjectInfo struct {
Key string
Size int64
LastModified time.Time
ETag string
}
```
**Phase 0 實作:`LocalFSStorage`**
- 存在 `./data/models/{user_id}/{model_id}.nef`
- `GetDownloadURL` 回傳 `/api/models/{id}/download`(走 api-server 串流)
**Phase 1 實作:`S3Storage`**
- 用 AWS SDK 或 minio-go
- `GetDownloadURL` / `GetUploadURL` 回傳真的 presigned URL
### 上傳大檔案策略
- Phase 0Multipart form upload 直接進 api-serverapi-server 再寫進 local fs
- 限制100MB 以下
- api-server 的記憶體與磁碟 I/O 壓力
- Phase 1前端直接用 presigned URL 上傳到 S3不過 api-server
- 需要 CORS 設定
- 上傳完成後通知 api-server 更新 metadata
### 預設模型 seed
Phase 0backend 啟動時,檢查 `data/models/system/` 是否有預設模型,沒有就從 bundled resources 複製過去。
Phase 1預設模型在 `s3://visiona-models/system/` 共享給所有 user。
---
## 驗收條件Phase 0
- [ ] `/models` 頁面顯示 7 個預設模型
- [ ] 不同使用者看到自己的「我的模型」,互相隔離
- [ ] 上傳 `.nef` 檔成功,出現在列表
- [ ] 上傳進度 bar 顯示正確
- [ ] 上傳 > 100MB 被拒絕回傳明確錯誤Phase 0 限制值)
- [ ] 上傳大小限制從 config`MODEL_UPLOAD_MAX_SIZE_MB`,預設 100讀取非硬編碼
- [ ] 前端顯示的大小限制與後端實際拒絕的值一致
- [ ] 上傳非 `.nef` 檔被拒絕
- [ ] 能下載已上傳的模型
- [ ] 能刪除自上傳的模型,不能刪預設模型
- [ ] ObjectStorage 介面定義完整(有 interface + LocalFSStorage 實作)
- [ ] 介面層面預留 S3 實作的 hook切換時不動業務邏輯
---
## Phase 0 的 TODO
- **TODO 1**presigned URL 上傳Phase 1
- **TODO 2**模型版本管理Phase 2
- **TODO 3**:模型標籤 / 搜尋增強Phase 2
- **TODO 4**團隊共享模型Phase 2
- **TODO 5**模型來源追蹤是轉檔來的還是使用者上傳的Phase 2
- **TODO 6**:效能數據收集(推論時自動紀錄 FPS / 延遲Phase 1
---
## 連結
- 回:[PRD 索引](../PRD.md)
- 相關:[介面契約 — ObjectStorage](../interface-contracts.md)、[轉檔整合](feature-converter-integration.md)