Add multimodel context to market opportunities

This commit is contained in:
2569718930@qq.com
2026-07-04 01:59:48 +08:00
parent 9d76e90a28
commit 1a8713f927
5 changed files with 235 additions and 13 deletions
@@ -0,0 +1,82 @@
# Ops Market Multimodel Context Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Make Ops market opportunities evaluate and display full multi-model context instead of relying mainly on DEB and median.
**Architecture:** Keep the existing Ops opportunities API and page. Extend each opportunity row with multi-model source values and bucket-relative counts, then use those counts in the late NO filter so high/low multi-model consensus is preserved for manual review.
**Tech Stack:** Python FastAPI service code, pytest, Next.js React TypeScript, business state tests.
---
### Task 1: Backend Multi-Model Signals
**Files:**
- Modify: `web/services/ops/market_opportunities.py`
- Test: `tests/test_ops_market_opportunities.py`
- [ ] **Step 1: Add tests**
Add tests asserting opportunities include `model_cluster_sources`, `model_min`, `model_max`, `models_in_bucket`, `models_above_bucket`, `models_below_bucket`, and `models_above_deb`.
- [ ] **Step 2: Implement source extraction**
Create helper functions to parse `row["model_cluster_sources"]`, classify model values against a market option, and return counts plus min/max.
- [ ] **Step 3: Return fields on opportunity rows**
Include the new fields in every row produced by `build_market_opportunity_rows`.
- [ ] **Step 4: Verify**
Run `python -m pytest tests/test_ops_market_opportunities.py -q`.
### Task 2: Conservative Late NO Filtering
**Files:**
- Modify: `web/services/ops/market_opportunities.py`
- Test: `tests/test_ops_market_opportunities.py`
- [ ] **Step 1: Update tests**
Change the late NO tests so rows are filtered only when multi-model consensus is inside the target bucket, and preserved when models mostly sit above or below the target bucket.
- [ ] **Step 2: Implement filtering**
Pass model relation counts into `_is_late_priced_no_noise`; return `False` when outside-bucket model count is greater than inside-bucket count.
- [ ] **Step 3: Verify**
Run `python -m pytest tests/test_ops_market_opportunities.py -q`.
### Task 3: Frontend Display
**Files:**
- Modify: `frontend/components/ops/market-opportunities/MarketOpportunitiesPageClient.tsx`
- Test: `frontend/components/ops/__tests__/opsMarketOpportunities.test.ts`
- [ ] **Step 1: Add frontend assertions**
Assert the Ops market opportunities page includes `多模型`, `models_above_bucket`, and `model_cluster_sources`.
- [ ] **Step 2: Display compact context**
Add a `多模型` column showing min/max range, in/high/low bucket counts, and compact source values.
- [ ] **Step 3: Verify**
Run `cd frontend && npm run test:business` and `cd frontend && npm run typecheck`.
### Task 4: Final Validation and Deploy
**Files:**
- No new source files.
- [ ] **Step 1: Run full checks**
Run `python -m ruff check .`, `python -m pytest`, `cd frontend && npm run test:business`, and `cd frontend && npm run typecheck`.
- [ ] **Step 2: Commit and push**
Commit the backend and frontend changes, push `main`, monitor GitHub Actions, and smoke check production.