|
@@ -33,19 +33,19 @@ const FIELD_PROFILE_KEYS = Object.freeze({
|
|
|
|
|
|
|
|
const SUCCESS_STATUS = /^(?:ok|success|succeeded|complete|completed|done|accepted|created|booked|scheduled|sent|delivered)$/i;
|
|
const SUCCESS_STATUS = /^(?:ok|success|succeeded|complete|completed|done|accepted|created|booked|scheduled|sent|delivered)$/i;
|
|
|
const FAILURE_STATUS = /^(?:fail|failed|failure|error|errored|rejected|cancelled|canceled|timeout|timed_out)$/i;
|
|
const FAILURE_STATUS = /^(?:fail|failed|failure|error|errored|rejected|cancelled|canceled|timeout|timed_out)$/i;
|
|
|
-const VIEWING_REQUEST = /(?:想|要|准备|打算|约|安排|周[末六日]|今天|明天|后天)[^。!?]{0,14}(?:看房|看这套|去看|带看|还能?看|可以看)|(?:看房|带看|还能?看)[^。!?]{0,12}(?:时间|安排|方便|吗|么)|(?:什么时候|哪天|几点)[^。!?]{0,10}(?:来?看|看房)/;
|
|
|
|
|
-const DEFINITE_VIEWING_AVAILABILITY = /^(?:好的?[,,。!!\s]*|可以的?[,,。!!\s]*|没问题[,,。!!\s]*|能安排[,,。!!\s]*|看房没问题)|(?:今天|明天|后天|周[一二三四五六日天末]).{0,18}(?:可以的?(?:[,,。!!]|$)|能安排|可以安排|有空|有时间|时间没问题|能看|可以看)/;
|
|
|
|
|
-const SCOPED_VIEWING_BOUNDARY = /(?:具体|实际).{0,10}(?:时间|时段|安排).{0,16}(?:还要|需要|得).{0,12}(?:确认|对上|协调)|(?:先作为意向|先定想看的房子)|(?:业主|房源).{0,10}(?:时间|档期).{0,10}(?:确认|对上|协调)/;
|
|
|
|
|
-const TENTATIVE_VIEWING_PROPOSAL = /(?:今天|明天|后天|周[一二三四五六日天末])?(?:可以)?先作为(?:看房)?意向|先定(?:下)?想看的房子和(?:大概)?时段|具体(?:房源和)?(?:时间|时段|安排).{0,12}(?:还要|需要|得).{0,10}(?:确认|对上|协调)/;
|
|
|
|
|
|
|
+const VIEWING_REQUEST = /(?:想|要|准备|打算|约|安排|周[末六日]|今天|明天|后天)[^。!?]{0,14}(?:看房|看这套|去看|带看|预约|到店|上门|还能?看|可以看)|(?:看房|带看|预约|到店|上门)[^。!?]{0,12}(?:时间|安排|方便|吗|么)|(?:什么时候|哪天|几点)[^。!?]{0,10}(?:来?看|看房|到店|上门|过来)/;
|
|
|
|
|
+const DEFINITE_VIEWING_AVAILABILITY = /^(?:好的?[,,。!!\s]*|可以的?[,,。!!\s]*|没问题[,,。!!\s]*|能安排[,,。!!\s]*|看房没问题|预约没问题)|(?:今天|明天|后天|周[一二三四五六日天末]).{0,18}(?:可以的?(?:[,,。!!]|$)|能安排|可以安排|有空|有时间|时间没问题|能看|可以看)/;
|
|
|
|
|
+const SCOPED_VIEWING_BOUNDARY = /(?:具体|实际).{0,10}(?:时间|时段|安排).{0,16}(?:还要|需要|得).{0,12}(?:确认|对上|协调)|(?:先作为意向|先定想看的房子|先记意向)|(?:业主|房源|档期|双方).{0,10}(?:时间|档期).{0,10}(?:确认|对上|协调)/;
|
|
|
|
|
+const TENTATIVE_VIEWING_PROPOSAL = /(?:今天|明天|后天|周[一二三四五六日天末])?(?:可以)?先作为(?:看房|预约)?意向|先定(?:下)?想看的房子和(?:大概)?时段|具体(?:房源和)?(?:时间|时段|安排).{0,12}(?:还要|需要|得).{0,10}(?:确认|对上|协调)/;
|
|
|
const PERSONAL_SCHEDULE_CONFIRMATION = /(?:我|我这边|这边).{0,6}(?:倒是|其实|目前|明天|今天|后天)?\s*(?:有空|有时间|时间没问题)|(?:今天|明天|后天).{0,10}(?:我|我这边|这边).{0,6}(?:有空|有时间|时间没问题)/;
|
|
const PERSONAL_SCHEDULE_CONFIRMATION = /(?:我|我这边|这边).{0,6}(?:倒是|其实|目前|明天|今天|后天)?\s*(?:有空|有时间|时间没问题)|(?:今天|明天|后天).{0,10}(?:我|我这边|这边).{0,6}(?:有空|有时间|时间没问题)/;
|
|
|
-const FIRST_PERSON_CAPABILITY = /(?:我|我们|我这边|这边).{0,10}(?:都能看到|能看到|看得到|能查到|查得到|能调到|调得到|能找到|找得到|可以查|可以调).{0,18}(?:房源|房子|挂牌|成交|户型图|平面图|图片|照片|视频|媒体|资料)|(?:房源|房子|挂牌|成交|户型图|平面图|图片|照片|视频|媒体|资料).{0,10}(?:我|我们|我这边|这边).{0,10}(?:都能看到|能看到|看得到|能查到|查得到|能调到|调得到|能找到|找得到|可以查|可以调)/;
|
|
|
|
|
|
|
+const FIRST_PERSON_CAPABILITY = /(?:我|我们|我这边|这边).{0,10}(?:都能看到|能看到|看得到|能查到|查得到|能调到|调得到|能找到|找得到|可以查|可以调).{0,18}(?:房源|房子|挂牌|成交|户型图|平面图|图片|照片|视频|媒体|资料|方案|库存|名额)|(?:房源|房子|挂牌|成交|户型图|平面图|图片|照片|视频|媒体|资料|方案|库存|名额).{0,10}(?:我|我们|我这边|这边).{0,10}(?:都能看到|能看到|看得到|能查到|查得到|能调到|调得到|能找到|找得到|可以查|可以调)/;
|
|
|
const MARKET_DISTRIBUTION = /(?:这个|该)?(?:总价段|预算(?:里|下|范围)).{0,24}(?:三房|两房|户型|面积).{0,24}(?:通常|一般|多在|多落在|大多|普遍|偏紧凑|偏实用)|(?:三房|两房|户型|面积).{0,24}(?:在这个|该)(?:总价段|预算(?:里|下|范围)).{0,24}(?:通常|一般|多在|多落在|大多|普遍|偏紧凑|偏实用)|(?:通常|一般|大多|普遍|多在|多落在).{0,28}(?:\d{2,4}\s*(?:平|㎡)|三房|两房).{0,18}(?:预算|总价段)/;
|
|
const MARKET_DISTRIBUTION = /(?:这个|该)?(?:总价段|预算(?:里|下|范围)).{0,24}(?:三房|两房|户型|面积).{0,24}(?:通常|一般|多在|多落在|大多|普遍|偏紧凑|偏实用)|(?:三房|两房|户型|面积).{0,24}(?:在这个|该)(?:总价段|预算(?:里|下|范围)).{0,24}(?:通常|一般|多在|多落在|大多|普遍|偏紧凑|偏实用)|(?:通常|一般|大多|普遍|多在|多落在).{0,28}(?:\d{2,4}\s*(?:平|㎡)|三房|两房).{0,18}(?:预算|总价段)/;
|
|
|
const ROOM_AREA_DISTRIBUTION = /(?:三房|两房|[2-4]房).{0,24}(?:通常|一般|大多|常见|多在|先看|参考|大概).{0,24}(?:\d{2,4}\s*(?:到|至|-|~|~)\s*\d{2,4}\s*(?:平|㎡|平方米)|\d{2,4}\s*(?:多)?平)|(?:三房|两房|[2-4]房).{0,40}\d{2,4}\s*(?:多)?平.{0,30}\d{2,4}\s*(?:多)?平.{0,20}(?:紧凑|宽松|舒展|舒服)|\d{2,4}\s*(?:到|至|-|~|~)\s*\d{2,4}\s*(?:平|㎡|平方米).{0,28}(?:三房|两房|[2-4]房|紧凑|宽松)/;
|
|
const ROOM_AREA_DISTRIBUTION = /(?:三房|两房|[2-4]房).{0,24}(?:通常|一般|大多|常见|多在|先看|参考|大概).{0,24}(?:\d{2,4}\s*(?:到|至|-|~|~)\s*\d{2,4}\s*(?:平|㎡|平方米)|\d{2,4}\s*(?:多)?平)|(?:三房|两房|[2-4]房).{0,40}\d{2,4}\s*(?:多)?平.{0,30}\d{2,4}\s*(?:多)?平.{0,20}(?:紧凑|宽松|舒展|舒服)|\d{2,4}\s*(?:到|至|-|~|~)\s*\d{2,4}\s*(?:平|㎡|平方米).{0,28}(?:三房|两房|[2-4]房|紧凑|宽松)/;
|
|
|
const MARKET_PRICE_AREA_OUTCOME = /(?:预算|总价|附近|区域|片区|现在|当前).{0,20}(?:[\d一二两三四五六七八九十百千万亿]+(?:\.\d+)?\s*(?:万|万元)?).{0,18}(?:只能买|能买到|可以买到|买到).{0,14}(?:[\d一二两三四五六七八九十百千万亿]+(?:\.\d+)?\s*(?:平|㎡|平方米))/;
|
|
const MARKET_PRICE_AREA_OUTCOME = /(?:预算|总价|附近|区域|片区|现在|当前).{0,20}(?:[\d一二两三四五六七八九十百千万亿]+(?:\.\d+)?\s*(?:万|万元)?).{0,18}(?:只能买|能买到|可以买到|买到).{0,14}(?:[\d一二两三四五六七八九十百千万亿]+(?:\.\d+)?\s*(?:平|㎡|平方米))/;
|
|
|
const EXPLICIT_AREA_RANGE = /\d{2,4}(?:\.\d+)?\s*(?:到|至|-|~|~)\s*\d{2,4}(?:\.\d+)?\s*(?:平|㎡|平方米)/;
|
|
const EXPLICIT_AREA_RANGE = /\d{2,4}(?:\.\d+)?\s*(?:到|至|-|~|~)\s*\d{2,4}(?:\.\d+)?\s*(?:平|㎡|平方米)/;
|
|
|
const UNSOURCED_ROOM_ASSUMPTION = /(?:紧凑|宽松|舒适|实用)?\s*(?:三房|三室|3室)|(?:三房|三室|3室).{0,18}(?:紧凑|宽松|舒适|实用|90\s*(?:到|至|-|—)\s*120\s*(?:平|㎡)|90多平|110平)/;
|
|
const UNSOURCED_ROOM_ASSUMPTION = /(?:紧凑|宽松|舒适|实用)?\s*(?:三房|三室|3室)|(?:三房|三室|3室).{0,18}(?:紧凑|宽松|舒适|实用|90\s*(?:到|至|-|—)\s*120\s*(?:平|㎡)|90多平|110平)/;
|
|
|
const UNSOURCED_BUDGET_FEASIBILITY = /(?:预算|总价|\d{2,4}\s*万).{0,16}(?:没问题|肯定够|够用|可选不少|选择很多|能挑不少|可以挑不少|很充足|很宽裕)|(?:没问题|肯定够|够用|可选不少|选择很多|能挑不少|可以挑不少|很充足|很宽裕).{0,16}(?:预算|总价|\d{2,4}\s*万)/;
|
|
const UNSOURCED_BUDGET_FEASIBILITY = /(?:预算|总价|\d{2,4}\s*万).{0,16}(?:没问题|肯定够|够用|可选不少|选择很多|能挑不少|可以挑不少|很充足|很宽裕)|(?:没问题|肯定够|够用|可选不少|选择很多|能挑不少|可以挑不少|很充足|很宽裕).{0,16}(?:预算|总价|\d{2,4}\s*万)/;
|
|
|
-const FIRST_PERSON_INVENTORY_STATE = /(?:我这边|我们|这边|手上|手头|我.{0,10}(?:这边|区域|板块)).{0,24}(?:有|已有|没有|没|还没|暂无|暂时没|没筛出|没找到|没捋出).{0,20}(?:(?:特别)?合适|匹配|在售|可看|几套|多套|少量)?(?:房源|房子|户型)|(?:我这边|我们|这边|手上|手头|我.{0,10}(?:这边|区域|板块)).{0,20}(?:房源|房子|户型).{0,12}(?:有|没有|没|还没|暂无)|(?:我这边|我们|这边|手上|手头|我.{0,10}(?:这边|区域|板块)).{0,24}(?:合适|匹配|符合|筛到|整理出).{0,16}(?:房源|房子|候选)/;
|
|
|
|
|
|
|
+const FIRST_PERSON_INVENTORY_STATE = /(?:我这边|我们|这边|手上|手头|我.{0,10}(?:这边|区域|板块)).{0,24}(?:有|已有|没有|没|还没|暂无|暂时没|没筛出|没找到|没捋出).{0,20}(?:(?:特别)?合适|匹配|在售|可看|几套|多套|少量)?(?:房源|房子|户型|方案|库存|名额)|(?:我这边|我们|这边|手上|手头|我.{0,10}(?:这边|区域|板块)).{0,20}(?:房源|房子|户型|方案|库存|名额).{0,12}(?:有|没有|没|还没|暂无)|(?:我这边|我们|这边|手上|手头|我.{0,10}(?:这边|区域|板块)).{0,24}(?:合适|匹配|符合|筛到|整理出).{0,16}(?:房源|房子|候选|方案)/;
|
|
|
const SAFE_METHOD_CUES = /(?:要|得|需要|应该|可以|建议|先|主要)(?:把|从|看|结合|比较|确认|对准|分清)|(?:不能|不宜|不好|先不)(?:只看|直接|马上|下结论|报数|判断)|(?:关键|重点|主要).{0,12}(?:看|比较|取舍)|(?:还要|仍要|具体).{0,12}(?:看|结合|确认|对上)/;
|
|
const SAFE_METHOD_CUES = /(?:要|得|需要|应该|可以|建议|先|主要)(?:把|从|看|结合|比较|确认|对准|分清)|(?:不能|不宜|不好|先不)(?:只看|直接|马上|下结论|报数|判断)|(?:关键|重点|主要).{0,12}(?:看|比较|取舍)|(?:还要|仍要|具体).{0,12}(?:看|结合|确认|对上)/;
|
|
|
const DEFINITE_FACT_CUES = /(?:已确认|确定有|当前有|完全匹配|一定|保证|肯定|都能|普遍|大多|多在|多落在|通常|一般).{0,24}(?:\d|价格|房源|面积|三房|两房|在售|学区|产权|可看|能看)/;
|
|
const DEFINITE_FACT_CUES = /(?:已确认|确定有|当前有|完全匹配|一定|保证|肯定|都能|普遍|大多|多在|多落在|通常|一般).{0,24}(?:\d|价格|房源|面积|三房|两房|在售|学区|产权|可看|能看)/;
|
|
|
const UNSOURCED_GENERIC_PRICING_METHOD = /(?:价格|费用|收费).{0,20}(?:套餐|账号|席位|人数|数量).{0,20}(?:结合|取决于|要看|来定)|(?:套餐|账号|席位|人数|数量).{0,20}(?:决定|影响).{0,12}(?:价格|费用|收费)/;
|
|
const UNSOURCED_GENERIC_PRICING_METHOD = /(?:价格|费用|收费).{0,20}(?:套餐|账号|席位|人数|数量).{0,20}(?:结合|取决于|要看|来定)|(?:套餐|账号|席位|人数|数量).{0,20}(?:决定|影响).{0,12}(?:价格|费用|收费)/;
|
|
@@ -281,8 +281,8 @@ function buildResponseProvenanceLedger(input = {}) {
|
|
|
}
|
|
}
|
|
|
const successful = successfulToolEvidence(input.toolTrace);
|
|
const successful = successfulToolEvidence(input.toolTrace);
|
|
|
const capabilities = {
|
|
const capabilities = {
|
|
|
- appointment: input.capabilities?.appointment === true || successful.some(trace => /(?:book|schedule|appointment|viewing|带看|看房|预约|排期)/i.test(String(trace.tool || trace.name || ''))),
|
|
|
|
|
- propertyAccess: input.capabilities?.propertyAccess === true || successful.some(trace => /(?:propert(?:y|ies)|listing|房源|楼盘)/i.test(String(trace.tool || trace.name || ''))),
|
|
|
|
|
|
|
+ appointment: input.capabilities?.appointment === true || successful.some(trace => /(?:book|schedule|appointment|viewing|带看|看房|预约|排期|到店)/i.test(String(trace.tool || trace.name || ''))),
|
|
|
|
|
+ propertyAccess: input.capabilities?.propertyAccess === true || successful.some(trace => /(?:propert(?:y|ies)|listing|inventory|catalog|房源|楼盘|方案|库存)/i.test(String(trace.tool || trace.name || ''))),
|
|
|
mediaAccess: input.capabilities?.mediaAccess === true || successful.some(trace => /(?:media|photo|image|video|floor.?plan|户型图|图片|照片|视频|媒体)/i.test(`${trace.tool || trace.name || ''}\n${JSON.stringify(trace.result || {})}`)),
|
|
mediaAccess: input.capabilities?.mediaAccess === true || successful.some(trace => /(?:media|photo|image|video|floor.?plan|户型图|图片|照片|视频|媒体)/i.test(`${trace.tool || trace.name || ''}\n${JSON.stringify(trace.result || {})}`)),
|
|
|
marketEvidence: marketEvidencePresent(input),
|
|
marketEvidence: marketEvidencePresent(input),
|
|
|
areaDistributionEvidence: areaDistributionEvidencePresent(input),
|
|
areaDistributionEvidence: areaDistributionEvidencePresent(input),
|
|
@@ -402,15 +402,15 @@ function evaluateResponseProvenance(reply = '', input = {}) {
|
|
|
&& (personalScheduleClaim || definiteViewingClaim)
|
|
&& (personalScheduleClaim || definiteViewingClaim)
|
|
|
&& !tentativeViewing
|
|
&& !tentativeViewing
|
|
|
&& ledger.capabilities.appointment !== true) {
|
|
&& ledger.capabilities.appointment !== true) {
|
|
|
- violations.push({ code: 'appointment_without_evidence', detail: '看房可用性缺少 appointment evidence' });
|
|
|
|
|
|
|
+ violations.push({ code: 'appointment_without_evidence', detail: '预约可用性缺少 appointment evidence' });
|
|
|
}
|
|
}
|
|
|
if (FIRST_PERSON_INVENTORY_STATE.test(content) && ledger.capabilities.inventoryStatus !== true) {
|
|
if (FIRST_PERSON_INVENTORY_STATE.test(content) && ledger.capabilities.inventoryStatus !== true) {
|
|
|
- violations.push({ code: 'inventory_state_without_evidence', detail: '第一人称房源库存或匹配状态缺少 inventory evidence' });
|
|
|
|
|
|
|
+ violations.push({ code: 'inventory_state_without_evidence', detail: '第一人称库存或匹配状态缺少 inventory evidence' });
|
|
|
}
|
|
}
|
|
|
if (FIRST_PERSON_CAPABILITY.test(content)) {
|
|
if (FIRST_PERSON_CAPABILITY.test(content)) {
|
|
|
- const media = /(?:户型图|平面图|图片|照片|视频|媒体|资料)/.test(content);
|
|
|
|
|
|
|
+ const media = /(?:户型图|平面图|图片|照片|视频|媒体|资料|手册)/.test(content);
|
|
|
if ((media && !ledger.capabilities.mediaAccess) || (!media && !ledger.capabilities.propertyAccess)) {
|
|
if ((media && !ledger.capabilities.mediaAccess) || (!media && !ledger.capabilities.propertyAccess)) {
|
|
|
- violations.push({ code: 'capability_without_evidence', detail: '第一人称房源或媒体访问能力缺少 capability evidence' });
|
|
|
|
|
|
|
+ violations.push({ code: 'capability_without_evidence', detail: '第一人称资料或媒体访问能力缺少 capability evidence' });
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
const roomCount = Number(ledgerFieldValue(ledger, 'roomCount') || 0);
|
|
const roomCount = Number(ledgerFieldValue(ledger, 'roomCount') || 0);
|
|
@@ -445,64 +445,64 @@ function safeRewriteForViolations(input = {}, violations = [], seed = '') {
|
|
|
const choose = (key, values) => values[stableIndex(`${seed}\n${key}`, values.length)];
|
|
const choose = (key, values) => values[stableIndex(`${seed}\n${key}`, values.length)];
|
|
|
if (codes.has('appointment_without_evidence')) {
|
|
if (codes.has('appointment_without_evidence')) {
|
|
|
return choose('appointment', [
|
|
return choose('appointment', [
|
|
|
- '看房可以先定意向,具体时间还要和房源、业主时段对上。您哪天更方便?',
|
|
|
|
|
- '先把想看的房子和大概时段定下来,具体安排还要再确认。您上午还是下午方便?',
|
|
|
|
|
- '看房时间要结合具体房源和双方时段。您先说哪天方便。',
|
|
|
|
|
|
|
+ '预约可以先记意向,具体时间还要和档期对上。您哪天更方便?',
|
|
|
|
|
+ '先把大概时段定下来,具体安排还要再确认。您上午还是下午方便?',
|
|
|
|
|
+ '预约时间要结合双方档期。您先说哪天方便。',
|
|
|
]);
|
|
]);
|
|
|
}
|
|
}
|
|
|
if (codes.has('inventory_state_without_evidence')) {
|
|
if (codes.has('inventory_state_without_evidence')) {
|
|
|
return choose('inventory-state', [
|
|
return choose('inventory-state', [
|
|
|
- '现有信息还不足以判断哪些房源合适。您先说最想看的区域或预算。',
|
|
|
|
|
- '目前只能先补齐找房条件,不能先下库存结论。您更想先定区域还是预算?',
|
|
|
|
|
- '先不判断手上有没有合适房源。您把区域和预算里更重要的一项告诉我。',
|
|
|
|
|
|
|
+ '现有信息还不足以判断有没有合适方案。您先说最关键的一项条件。',
|
|
|
|
|
+ '目前只能先补齐条件,不能先下库存结论。您更想先定范围还是预算?',
|
|
|
|
|
+ '先不判断手上有没有合适方案。您把范围和预算里更重要的一项告诉我。',
|
|
|
]);
|
|
]);
|
|
|
}
|
|
}
|
|
|
if (codes.has('capability_without_evidence')) {
|
|
if (codes.has('capability_without_evidence')) {
|
|
|
- if (/(?:户型图|平面图|图片|照片|视频|媒体)/.test(inbound)) {
|
|
|
|
|
|
|
+ if (/(?:图片|照片|视频|资料|手册)/.test(inbound)) {
|
|
|
return choose('media-capability', [
|
|
return choose('media-capability', [
|
|
|
- '先对准具体哪套,再看对应的户型或视频资料。您发链接或截图给我。',
|
|
|
|
|
- '户型和视频资料要先对应到具体房源。您把房源号或截图发我一个。',
|
|
|
|
|
- '先确定您指的是哪套,资料才不会对错。发个链接或截图就行。',
|
|
|
|
|
|
|
+ '先对准具体对象,再看对应资料。您发链接或截图给我。',
|
|
|
|
|
+ '资料要先对应到具体方案。您把编号或截图发我一个。',
|
|
|
|
|
+ '先确定您指的是哪一项,资料才不会对错。发个链接或截图就行。',
|
|
|
]);
|
|
]);
|
|
|
}
|
|
}
|
|
|
return choose('property-capability', [
|
|
return choose('property-capability', [
|
|
|
- '先对准您说的具体房源,再判断哪些信息能直接比较。您发小区名或房源号都行。',
|
|
|
|
|
- '具体哪套还没对上,先不把房源信息说满。您给我小区名或房源号。',
|
|
|
|
|
- '要先知道您指的是哪套。发个小区名、房源号或截图中的一个就行。',
|
|
|
|
|
|
|
+ '先对准您说的具体对象,再判断哪些信息能直接比较。您发名称或编号都行。',
|
|
|
|
|
+ '具体哪一项还没对上,先不把信息说满。您给我名称或编号。',
|
|
|
|
|
+ '要先知道您指的是哪一项。发个名称、编号或截图中的一个就行。',
|
|
|
]);
|
|
]);
|
|
|
}
|
|
}
|
|
|
if (codes.has('area_distribution_without_evidence')) {
|
|
if (codes.has('area_distribution_without_evidence')) {
|
|
|
- return '三房面积跨度取决于小区、得房率和户型,现在线索还不足以报固定区间。您更看重总价还是空间?';
|
|
|
|
|
|
|
+ return '面积跨度取决于具体规格和方案,现在线索还不足以报固定区间。您更看重总投入还是容量?';
|
|
|
}
|
|
}
|
|
|
if (codes.has('market_distribution_without_evidence')) {
|
|
if (codes.has('market_distribution_without_evidence')) {
|
|
|
const budget = ledgerFieldValue(ledger, 'budget');
|
|
const budget = ledgerFieldValue(ledger, 'budget');
|
|
|
const roomCount = Number(ledgerFieldValue(ledger, 'roomCount') || 0);
|
|
const roomCount = Number(ledgerFieldValue(ledger, 'roomCount') || 0);
|
|
|
const known = [budget ? '预算' : '', roomCount ? `${roomCount}房` : ''].filter(Boolean).join('和');
|
|
const known = [budget ? '预算' : '', roomCount ? `${roomCount}房` : ''].filter(Boolean).join('和');
|
|
|
return choose('market-distribution', [
|
|
return choose('market-distribution', [
|
|
|
- `${known || '当前条件'}先保留,区域和具体房源没定前先不估面积分布。您重点看哪个区域?`,
|
|
|
|
|
- `${known || '现有方向'}先按这个理解;没有区域和市场样本,现在不先下面积结论。您想看哪个片区?`,
|
|
|
|
|
- `先保留${known || '您刚说的条件'},面积要结合区域和具体户型看。您优先考虑哪个区域?`,
|
|
|
|
|
|
|
+ `${known || '当前条件'}先保留,范围和具体方案没定前先不估分布。您重点看哪个范围?`,
|
|
|
|
|
+ `${known || '现有方向'}先按这个理解;没有范围和市场样本,现在不先下分布结论。您想先定哪个范围?`,
|
|
|
|
|
+ `先保留${known || '您刚说的条件'},容量要结合范围和具体规格看。您优先考虑哪个范围?`,
|
|
|
]);
|
|
]);
|
|
|
}
|
|
}
|
|
|
if (codes.has('budget_feasibility_without_evidence')) {
|
|
if (codes.has('budget_feasibility_without_evidence')) {
|
|
|
const budget = ledgerFieldValue(ledger, 'budget') || {};
|
|
const budget = ledgerFieldValue(ledger, 'budget') || {};
|
|
|
const amount = Number(budget.maxWan ?? budget.valueWan ?? budget.minWan ?? 0);
|
|
const amount = Number(budget.maxWan ?? budget.valueWan ?? budget.minWan ?? 0);
|
|
|
return amount
|
|
return amount
|
|
|
- ? `预算先按${amount}万以内记。您更想先定区域还是户型?`
|
|
|
|
|
- : '预算先按您刚说的范围记。您更想先定区域还是户型?';
|
|
|
|
|
|
|
+ ? `预算先按${amount}万以内记。您更想先定范围还是规格?`
|
|
|
|
|
+ : '预算先按您刚说的范围记。您更想先定范围还是规格?';
|
|
|
}
|
|
}
|
|
|
if (codes.has('room_count_without_source')) {
|
|
if (codes.has('room_count_without_source')) {
|
|
|
if (/(?:多大面积|多少平|平方|面积)/.test(inbound)) {
|
|
if (/(?:多大面积|多少平|平方|面积)/.test(inbound)) {
|
|
|
return choose('generic-area', [
|
|
return choose('generic-area', [
|
|
|
- '面积要先看您说的是哪种户型。您目前主要考虑几房?',
|
|
|
|
|
- '不同户型的面积差别很大,先确认房间数更准确。您想看几房?',
|
|
|
|
|
- '现在还没有房间数,先不套面积区间。您主要考虑几房?',
|
|
|
|
|
|
|
+ '面积要先看您说的是哪种规格。您目前主要考虑哪个版本?',
|
|
|
|
|
+ '不同规格的容量差别很大,先确认规格更准确。您目前倾向哪个版本?',
|
|
|
|
|
+ '现在还没有规格线索,先不套容量区间。您主要考虑哪个版本?',
|
|
|
]);
|
|
]);
|
|
|
}
|
|
}
|
|
|
return choose('good-layout', [
|
|
return choose('good-layout', [
|
|
|
- '好房型先看房间数和实际布局。您目前主要考虑几房?',
|
|
|
|
|
- '房型好不好要结合您的使用需求,先从房间数开始。您想看几房?',
|
|
|
|
|
- '先不默认具体户型。您更需要几房?',
|
|
|
|
|
|
|
+ '规格是否合适要结合您的实际使用。您目前主要考虑哪个版本?',
|
|
|
|
|
+ '先按您的使用需求确认规格,再比较容量。您更需要哪一档?',
|
|
|
|
|
+ '先不默认具体规格。您更需要哪一档配置?',
|
|
|
]);
|
|
]);
|
|
|
}
|
|
}
|
|
|
return '';
|
|
return '';
|