After a supplier bot conversation completes, the system now extracts structured data — MOQ, price, lead time, customization options, sample terms, and more — into a normalised JSON schema. These per-supplier outcomes are then aggregated into a cross-supplier comparison table, giving Sourcy’s operations team an instant side-by-side view of what each supplier confirmed, what’s missing, and where to push harder.
This module bridges raw chat transcripts and actionable procurement intelligence. It works across product categories, handles both responsive and evasive suppliers, and flags gaps automatically.
Step 1 is the existing conversation engine — it already captures the full transcript. Step 2 is new: an LLM reads the transcript against the goal schema and extracts each confirmed data point with a confidence level and the turn number where it was confirmed. Step 3 is pure aggregation code that pivots supplier-level outcomes into a comparison table with per-dimension coverage counts.
The separation matters: Step 3 has zero LLM cost, zero latency, and can be re-run anytime as new suppliers complete conversations.
| Field | 晋江飞越 | 莆田恒泰 | 温州龙腾 |
|---|---|---|---|
| MOQ | 500双 | 200双起 (500双优惠) | 500双 |
| Price | ¥72–77/双 | ¥78–83/双 MED | ¥60–68/双 |
| Lead Time | 25天 | 20–25天 | 23–30天 |
| Customization | 丝印免费,侧面+¥3 | 热转印+压印 | 常规印,超尺寸+¥500 |
| Sample | ¥150/双,5–7天 | ¥200 (含运费),5–7天 | ¥180/双,7天 |
| Packing | 10双/箱,12kg | 8双/箱,10kg | 10双/箱,11kg |
| Tooling | ¥800 (一次性) | ¥800–1,200 | ¥500 (超尺寸) |
| Size Variant | 39–44码可混批 | 39–44码可混批 | — |
| Material | 透气网布+橡胶底 | 三层网布+发泡橡胶底 | 超纤鞋面+硢钉底 |
| Artwork | AI/PDF矢量 | AI/PDF/PNG 300dpi | 矢量文件 |
| Certification | — | — | — |
goalsRemaining so it is visible in the comparison table.
| Field | 广州美妆 | 深圳美包 |
|---|---|---|
| MOQ | 3,000 units | — |
| Price | ¥4.5/unit (+¥0.3 for logo) | — |
| Lead Time | 12–15 working days | — |
| Customization | Silk screen / pad printing, 1–2 colors | 支持定制,价格取决于复杂程度 |
| Sample | Logo ¥50, blank ¥30, 3–5天 | 可以打样,费用TBD MED |
| Packing | 72 units/箱,8.5kg | — |
| Material | HDPE (food-grade) + PP pump | HDPE (per listing) MED |
| Tooling | Free at 3,000 units | — |
| Artwork | AI/PDF vector + Pantone codes | AI/PDF高清即可 |
| Certification | — | — |
The full comparison for the shoes test case shows how the aggregation layer surfaces actionable procurement intelligence across all three suppliers:
| Supplier | MOQ | Price | Lead Time | Sample | Tooling | Goals |
|---|---|---|---|---|---|---|
| 晋江飞越 | 500双 | ¥72–77/双 | 25天 | ¥150, 5–7天 | ¥800 | 10/10 |
| 莆田恒泰 | 200双起 | ¥78–83/双 | 20–25天 | ¥200, 5–7天 | ¥800–1,200 | 10/10 |
| 温州龙腾 | 500双 | ¥60–68/双 | 23–30天 | ¥180, 7天 | ¥500* | 9/10 |
* 温州龙腾 tooling fee only applies for logos exceeding 5cm × 3cm.
When enabled, each bot will receive a summary of what other suppliers have confirmed before starting its conversation. This allows smarter questioning — skipping already-answered topics, pushing on gaps, and understanding the competitive landscape.
Explicitly deferred: Context injection changes bot behavior. We will validate it with a dedicated eval round after real supplier data is available.
If context injection were enabled, the bot talking to 温州市龙腾体育用品厂 (supplier #3) would receive this summary about the other two suppliers before starting:
This is a preview only — the injection module (buildInjection()) generates this text from the aggregated comparison data. No LLM is needed to build it.
The extraction and comparison layers above are standalone and production-ready. The next phase is making the bot act on the cross-supplier intelligence — adjusting its questioning and negotiation based on what other suppliers have already confirmed.
Real supplier conversations don’t complete simultaneously. Some respond in minutes, others take hours or days. Rather than injecting context in real-time (complex, diminishing returns), we use a round-based approach:
| Phase | What Happens | Duration |
|---|---|---|
| Round 1 | Bot contacts all suppliers. Conversations run independently, no cross-supplier context. Collect as much as possible from responsive suppliers. | Adjustable cutoff (e.g. 3–6 hours) |
| Extract + Compare | Run structured extraction on all completed conversations. Build comparison table. Identify gaps and competitive positions. | ~1 minute |
| Round 2+ | Re-engage remaining or partially-complete suppliers with context injected. Bot now knows: price ranges, who confirmed what, what’s still missing. Can negotiate, fill gaps, or push on specific topics. | Adjustable |
A new prompt version will add a {{CONTEXT}} placeholder (same pattern as the existing {{GOALS}} placeholder). When context is available, it gets injected; when empty, the bot behaves as it does today. Examples of context-aware behavior to tune and evaluate:
| Scenario | Bot Behavior Without Context | Bot Behavior With Context |
|---|---|---|
| Price already confirmed by 2 suppliers | Asks “什么价格?” (open-ended) | Knows range is ¥68–78. Can anchor or probe positioning. |
| Certification missing across all | May not reach it (Tier 2 priority) | Knows this is a gap — can prioritize asking earlier. |
| One supplier is evasive on lead time | Asks once, moves on | Knows other suppliers confirmed 20–30 days. Can push: “其他工厂说20天左右,你们大概什么时候?” |
Context injection changes bot behavior, so it requires a dedicated eval round before deployment:
| Step | What | Depends On |
|---|---|---|
| 1 | Build dyn-v2 prompt with {{CONTEXT}} placeholder |
Current report (this deliverable) |
| 2 | Side-by-side benchmark: same suppliers, with vs without context | dyn-v2 prompt |
| 3 | Check for regressions: E4 (hallucination — bot might confuse suppliers), E2 (discipline), E7 (naturalness) | Benchmark results |
| 4 | Tune prompt instructions for context-aware negotiation (S1 stretch goal) | Real supplier data preferred |
| Layer | Function | LLM? | Purpose |
|---|---|---|---|
| Extraction | extractOutcome() |
Yes (Kimi K2.5) | Conversation transcript → structured JSON with confidence + turn refs |
| Aggregation | summarizeProgress() |
No (pure code) | Per-supplier outcomes → cross-supplier comparison table + coverage stats |
| Injection | buildInjection() |
No (pure code) | Format aggregated data for bot prompt injection — Brain replaces later |
| Operation | Duration | Cost Driver |
|---|---|---|
| Extraction (per conversation) | ~18 seconds | Single Kimi K2.5 call |
| Aggregation (per product) | <1 ms | Pure JS — no API calls |
| Injection text build | <1 ms | Pure JS — string formatting |