<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>小蟲房仲實戰進階A班|物件社區與周邊綜合評估報告</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Noto+Serif+TC:wght@400;600;700&family=Noto+Sans+TC:wght@300;400;500;700&display=swap" rel="stylesheet">
<style>
:root{
--navy:#0d1f3c;--navy2:#1a3460;--gold:#c8a84b;--gold-pale:#fdf5e0;
--cream:#faf8f3;--border:#e2ddd0;--text:#1a1510;--muted:#7a6e60;
--red:#c0392b;--green:#1e7e4d;--tag-bg:#eef2f8;--tag:#1a3460;
--pur:#4a3080;--pur-pale:#f0ecfa;
}
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0;}
body{font-family:'Noto Sans TC',sans-serif;background:var(--cream);color:var(--text);min-height:100vh;}
.topbar{background:var(--navy);padding:13px 28px;display:flex;align-items:center;gap:12px;border-bottom:2px solid var(--gold);}
.topbar-logo{font-family:'Noto Serif TC',serif;font-size:14px;font-weight:700;color:var(--gold);letter-spacing:2px;}
.topbar-sub{font-size:11px;color:rgba(255,255,255,.45);letter-spacing:.8px;}
.topbar-div{width:1px;height:22px;background:rgba(255,255,255,.2);}
.main{max-width:980px;margin:0 auto;padding:32px 20px 100px;}
/* Input card */
.input-card{background:white;border:1px solid var(--border);border-radius:12px;padding:22px 26px 18px;margin-bottom:24px;box-shadow:0 2px 10px rgba(13,31,60,.05);}
.sec-title{font-family:'Noto Serif TC',serif;font-size:14px;font-weight:700;color:var(--navy);margin-bottom:12px;display:flex;align-items:center;gap:8px;}
.sec-title::before{content:'';width:4px;height:16px;background:var(--gold);border-radius:2px;display:block;}
.apikey-row{display:flex;align-items:center;gap:8px;margin-bottom:14px;padding-bottom:14px;border-bottom:1px solid var(--border);}
.apikey-label{font-size:12px;color:var(--muted);font-weight:500;white-space:nowrap;}
.apikey-input{flex:1;padding:8px 12px;font-size:12px;font-family:'Noto Sans TC',sans-serif;border:1px solid var(--border);border-radius:7px;outline:none;background:var(--cream);letter-spacing:.5px;color:var(--text);}
.apikey-input:focus{border-color:var(--navy2);background:white;}
.apikey-input::placeholder{color:#c0bbb3;letter-spacing:0;}
.apikey-tip{font-size:11px;color:var(--muted);margin-bottom:14px;line-height:1.6;}
.apikey-tip a{color:var(--navy2);}
.paste-area{width:100%;min-height:160px;padding:14px 16px;font-size:13px;font-family:'Noto Sans TC',sans-serif;border:1px solid var(--border);border-radius:8px;outline:none;color:var(--text);background:var(--cream);resize:vertical;line-height:1.8;transition:border-color .2s;}
.paste-area:focus{border-color:var(--navy2);background:white;}
.paste-area::placeholder{color:#c0bbb3;}
.btn-row{display:flex;align-items:center;justify-content:space-between;margin-top:12px;gap:12px;flex-wrap:wrap;}
.hint{font-size:11px;color:var(--muted);line-height:1.7;}
.btn-analyze{background:var(--navy);color:var(--gold);border:none;border-radius:8px;padding:11px 32px;font-family:'Noto Serif TC',serif;font-size:14px;font-weight:700;cursor:pointer;letter-spacing:1px;white-space:nowrap;flex-shrink:0;transition:background .2s;}
.btn-analyze:hover{background:var(--navy2);}
.btn-analyze:disabled{opacity:.45;cursor:not-allowed;}
/* Loading */
.loading-card{display:none;background:white;border:1px solid var(--border);border-radius:12px;padding:44px 32px;text-align:center;margin-bottom:24px;box-shadow:0 2px 10px rgba(13,31,60,.05);}
.loading-card.on{display:block;}
.spinner{width:38px;height:38px;border:3px solid var(--border);border-top-color:var(--gold);border-radius:50%;margin:0 auto 14px;animation:spin .9s linear infinite;}
@keyframes spin{to{transform:rotate(360deg);}}
.l-text{font-size:14px;color:var(--muted);}
.l-status{font-size:13px;color:var(--navy);margin-top:8px;min-height:20px;font-weight:500;}
.steps{display:flex;justify-content:center;gap:8px;margin-top:18px;flex-wrap:wrap;}
.sp{font-size:11px;padding:4px 12px;border-radius:20px;background:#f0ece5;color:var(--muted);transition:all .3s;}
.sp.active{background:var(--navy);color:var(--gold);}
.sp.done{background:#e8f4ec;color:var(--green);}
/* Error */
.err{display:none;background:#fff5f5;border:1px solid #fcc;border-radius:12px;padding:16px 20px;margin-bottom:24px;color:var(--red);font-size:14px;line-height:1.7;}
.err.on{display:block;}
/* Results */
.results{display:none;}
.results.on{display:block;}
/* Property card */
.prop-card{background:white;border:1px solid var(--border);border-radius:12px;margin-bottom:20px;overflow:hidden;box-shadow:0 2px 10px rgba(13,31,60,.05);}
.ph{background:var(--navy);padding:18px 24px;display:flex;align-items:flex-start;justify-content:space-between;gap:16px;}
.pname{font-family:'Noto Serif TC',serif;font-size:19px;font-weight:700;color:var(--gold);line-height:1.3;}
.paddr{font-size:12px;color:rgba(255,255,255,.45);margin-top:4px;}
.pbadge{background:var(--gold);color:var(--navy);border-radius:8px;padding:8px 16px;text-align:center;flex-shrink:0;}
.pb-lbl{font-size:10px;font-weight:500;letter-spacing:1px;}
.pb-num{font-family:'Noto Serif TC',serif;font-size:21px;font-weight:700;line-height:1.2;}
.pmeta{padding:16px 24px;display:flex;flex-wrap:wrap;gap:18px;}
.pmi{min-width:100px;}
.pml{font-size:11px;color:var(--muted);margin-bottom:3px;}
.pmv{font-size:14px;font-weight:500;color:var(--navy);}
.pdesc{padding:0 24px 16px;font-size:13px;color:var(--muted);line-height:1.8;border-top:1px solid var(--border);padding-top:13px;}
/* Table cards */
.tcard{background:white;border:1px solid var(--border);border-radius:12px;margin-bottom:20px;overflow:hidden;box-shadow:0 2px 10px rgba(13,31,60,.05);}
.tcard.pur .thead{border-bottom-color:#d8d0ee;}
.thead{padding:14px 20px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--border);}
.ttitle{font-family:'Noto Serif TC',serif;font-size:14px;font-weight:700;color:var(--navy);display:flex;align-items:center;gap:8px;}
.tcard.pur .ttitle{color:var(--pur);}
.tbadge{background:var(--tag-bg);color:var(--tag);font-size:11px;padding:3px 10px;border-radius:20px;font-weight:500;}
.tcard.pur .tbadge{background:var(--pur-pale);color:var(--pur);}
.src-badge{font-size:10px;background:#f5f0e8;color:#8a6a20;padding:3px 10px;border-radius:20px;font-weight:500;}
.twrap{overflow-x:auto;}
table{width:100%;border-collapse:collapse;font-size:13px;}
th{background:#f5f3ee;color:var(--muted);font-weight:500;font-size:11px;letter-spacing:.4px;padding:9px 13px;text-align:left;white-space:nowrap;border-bottom:1px solid var(--border);}
.tcard.pur th{background:#f4f1fb;}
td{padding:10px 13px;border-bottom:1px solid #f0ece5;color:var(--text);white-space:nowrap;}
tr:last-child td{border-bottom:none;}
tr.hl td{background:var(--gold-pale);}
tr.hl td:first-child{border-left:3px solid var(--gold);padding-left:10px;}
.ph-c{color:var(--red);font-weight:500;}
.pl-c{color:var(--green);font-weight:500;}
.pm-c{color:var(--navy);font-weight:500;}
.tag-t{display:inline-block;background:var(--gold);color:var(--navy);font-size:10px;padding:1px 6px;border-radius:4px;margin-left:4px;font-weight:700;}
.sum-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(155px,1fr));gap:10px;padding:14px 18px;border-top:1px solid var(--border);}
.sc{background:#f7f5f0;border-radius:8px;padding:11px 13px;}
.sc-lbl{font-size:11px;color:var(--muted);margin-bottom:3px;}
.sc-val{font-size:15px;font-weight:600;color:var(--navy);}
.sc-sub{font-size:11px;color:var(--muted);margin-top:2px;}
/* Conclusion blocks */
.con-card{background:white;border:1px solid var(--border);border-radius:12px;margin-bottom:20px;overflow:hidden;box-shadow:0 2px 10px rgba(13,31,60,.05);}
.con-header{padding:14px 20px;border-bottom:1px solid var(--border);}
.con-title{font-family:'Noto Serif TC',serif;font-size:14px;font-weight:700;color:var(--navy);}
.con-body{padding:18px 20px;display:flex;flex-direction:column;gap:12px;}
.con-block{border-left:4px solid;border-radius:0 8px 8px 0;padding:13px 16px;}
.con-block.b1{border-color:#b8caff;background:#f0f4ff;}
.con-block.b2{border-color:#c8b8ff;background:#f5f0ff;}
.con-block.b3{border-color:var(--gold);background:var(--gold-pale);}
.con-block.b4{border-color:#5db87a;background:#e8f9ef;}
.con-block-title{font-family:'Noto Serif TC',serif;font-size:12px;font-weight:700;color:var(--navy);margin-bottom:6px;}
.con-block-text{font-size:13.5px;line-height:1.9;color:var(--text);}
/* Export bar */
.export-bar{display:none;position:sticky;bottom:24px;z-index:100;text-align:right;pointer-events:none;margin-top:8px;}
.export-bar.on{display:block;}
.btn-export{pointer-events:all;background:var(--gold);color:var(--navy);border:none;border-radius:10px;padding:13px 28px;font-family:'Noto Serif TC',serif;font-size:14px;font-weight:700;cursor:pointer;letter-spacing:1px;box-shadow:0 4px 18px rgba(13,31,60,.2);transition:background .2s;}
.btn-export:hover{background:#d4b55a;}
.footer{text-align:center;font-size:11px;color:var(--muted);margin-top:48px;padding-top:20px;border-top:1px solid var(--border);line-height:2;}
.footer a{color:var(--navy2);}
/* Print */
@media print{
@page{margin:16mm 13mm;size:A4;}
body{background:white!important;}
.topbar,.input-card,.loading-card,.err,.export-bar{display:none!important;}
.main{max-width:100%;padding:0;margin:0;}
.prop-card,.tcard,.con-card{box-shadow:none!important;border:1px solid #ccc!important;break-inside:avoid;margin-bottom:12px;}
.ph{-webkit-print-color-adjust:exact;print-color-adjust:exact;background:#0d1f3c!important;}
.pname{color:#c8a84b!important;}
.pbadge,.tag-t{-webkit-print-color-adjust:exact;print-color-adjust:exact;background:#c8a84b!important;}
th{-webkit-print-color-adjust:exact;print-color-adjust:exact;background:#f0ece5!important;}
.tcard.pur th{background:#f4f1fb!important;}
tr.hl td{-webkit-print-color-adjust:exact;print-color-adjust:exact;background:#fdf5e0!important;}
.con-block{-webkit-print-color-adjust:exact;print-color-adjust:exact;}
.sum-cards{break-inside:avoid;}
table{font-size:11px;}
td,th{padding:6px 10px!important;}
.print-header{display:block!important;}
.footer{display:block!important;}
}
@media screen{.print-header{display:none;}}
</style>
</head>
<body>
<div class="topbar">
<div class="topbar-logo">小蟲房仲實戰進階A班</div>
<div class="topbar-div"></div>
<div class="topbar-sub">物件社區與周邊綜合評估報告</div>
</div>
<div class="main">
<div class="print-header" style="margin-bottom:16px;padding-bottom:12px;border-bottom:2px solid #c8a84b;">
<div style="font-family:'Noto Serif TC',serif;font-size:17px;font-weight:700;color:#0d1f3c;letter-spacing:2px;">小蟲房仲實戰進階A班|物件社區與周邊綜合評估報告</div>
<div style="font-size:11px;color:#888;margin-top:4px;">豫卓策略顧問有限公司 · 小蟲AI房仲實戰班 · lin.ee/Xa7O6Kn</div>
<div style="font-size:10px;color:#aaa;margin-top:2px;" id="printDate"></div>
</div>
<div class="input-card">
<div class="sec-title">貼入物件資訊</div>
<div class="apikey-row">
<span class="apikey-label">🔑 API Key</span>
<input class="apikey-input" id="apiKey" type="password"
placeholder="在協作平台使用時填入 sk-ant-api03-…,在 claude.ai 內可留空" autocomplete="off"/>
</div>
<div class="apikey-tip">
在協作平台或其他環境使用,需填入自己的 Anthropic API Key(<a href="https://console.anthropic.com/settings/keys" target="_blank">申請點這裡</a>)。在 claude.ai 內不需要填。
</div>
<textarea class="paste-area" id="pi"
placeholder="把物件說明文字整個貼進來,例如:
【惠宇青山清】台中市南屯區 文心南五路三段58號
4房2廳2衛|90.92坪|11樓/20樓|屋齡3年
總價:4,980萬|單價:54.8萬/坪|精裝修
含雙平面車位,面公園視野戶…
→ 按「開始分析」,AI 自動整理物件資訊、搜尋同社區掛牌、查實價登錄、給出行動建議。"></textarea>
<div class="btn-row">
<div class="hint">分析約需 30–50 秒。AI 會搜尋網路取得最新掛牌行情與實價登錄。</div>
<button class="btn-analyze" id="ab" onclick="go()">▶ 開始分析</button>
</div>
</div>
<div class="loading-card" id="lc">
<div class="spinner"></div>
<div class="l-text">AI 正在搜尋市場資料…</div>
<div class="l-status" id="ls">準備中</div>
<div class="steps">
<div class="sp" id="s0">①識別物件</div>
<div class="sp" id="s1">②同社區掛牌</div>
<div class="sp" id="s2">③實價登錄</div>
<div class="sp" id="s3">④分析結論</div>
</div>
</div>
<div class="err" id="eb"></div>
<div class="results" id="rs"></div>
<div class="export-bar" id="exportBar">
<button class="btn-export" onclick="exportPDF()">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:-2px;margin-right:6px;"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
匯出 PDF
</button>
</div>
</div>
<div class="footer">
豫卓策略顧問有限公司 | 小蟲AI房仲實戰班 課程報名:<a href="https://lin.ee/Xa7O6Kn" target="_blank">lin.ee/Xa7O6Kn</a><br>
板橋 6/4 基礎班・6/5 進階A班 高雄 6/9 基礎班・6/10 進階A班 台中 7/1 基礎班・7/2 進階A班
</div>
<script>
// ── Steps ──
const STS=[['s0','識別社區與物件資訊…'],['s1','搜尋同社區掛牌行情…'],['s2','查詢實價登錄資料…'],['s3','彙整分析結論與行動建議…']];
let si=0,st=null;
function startSteps(){si=0;STS.forEach(([id])=>{document.getElementById(id).className='sp';});applyStep();st=setInterval(()=>{if(si<STS.length-1){document.getElementById(STS[si][0]).className='sp done';si++;applyStep();}},8000);}
function applyStep(){const[id,msg]=STS[si];document.getElementById(id).className='sp active';document.getElementById('ls').textContent=msg;}
function stopSteps(){clearInterval(st);STS.forEach(([id])=>document.getElementById(id).className='sp done');}
function setLoad(on){document.getElementById('lc').classList.toggle('on',on);document.getElementById('ab').disabled=on;on?startSteps():stopSteps();}
function showErr(m){const b=document.getElementById('eb');b.innerHTML='<strong>⚠ 錯誤</strong> '+esc(m);b.classList.add('on');}
function hideErr(){document.getElementById('eb').classList.remove('on');}
function esc(s){return String(s||'').replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"');}
function calcMed(a){const v=a.filter(n=>!isNaN(n)&&n>0).sort((x,y)=>x-y);if(!v.length)return null;const m=Math.floor(v.length/2);return v.length%2?v[m]:(v[m-1]+v[m])/2;}
function pc(price,med){const p=parseFloat(price);if(isNaN(p)||!med)return 'pm-c';if(p>med*1.05)return 'ph-c';if(p<med*0.95)return 'pl-c';return 'pm-c';}
function sumCards(items){if(!items||!items.length)return '';return '<div class="sum-cards">'+items.map(s=>`<div class="sc"><div class="sc-lbl">${esc(s.label)}</div><div class="sc-val">${esc(s.value)}</div>${s.sub?`<div class="sc-sub">${esc(s.sub)}</div>`:''}</div>`).join('')+'</div>';}
function buildResult(d){
const {property:p,community_units:cu,transactions:tx,analysis:an}=d;
let h='';
// 物件卡
h+=`<div class="prop-card"><div class="ph"><div><div class="pname">${esc(p.community_name)}${p.building_name?' '+esc(p.building_name):''}</div><div class="paddr">${[p.address,p.district,p.city].filter(Boolean).map(esc).join(' | ')}</div></div><div class="pbadge"><div class="pb-lbl">總 價</div><div class="pb-num">${esc(p.total_price||'—')}</div></div></div><div class="pmeta">
<div class="pmi"><div class="pml">單價(每坪)</div><div class="pmv">${esc(p.unit_price||'—')}</div></div>
<div class="pmi"><div class="pml">樓層</div><div class="pmv">${esc(p.floor||'—')}</div></div>
<div class="pmi"><div class="pml">坪數</div><div class="pmv">${esc(p.area||'—')}</div></div>
<div class="pmi"><div class="pml">格局</div><div class="pmv">${esc(p.layout||'—')}</div></div>
<div class="pmi"><div class="pml">屋齡</div><div class="pmv">${esc(p.age||'—')}</div></div>
<div class="pmi"><div class="pml">屋況</div><div class="pmv">${esc(p.condition||'—')}</div></div>
</div>${p.notes?`<div class="pdesc">${esc(p.notes)}</div>`:''}</div>`;
// 同社區掛牌
if(cu&&cu.length){
const med=calcMed(cu.map(u=>parseFloat(u.unit_price)));
h+=`<div class="tcard"><div class="thead"><div class="ttitle">同社區掛牌比較 <span class="tbadge">${cu.length} 筆</span></div></div><div class="twrap"><table>
<thead><tr><th>物件</th><th>樓層</th><th>坪數</th><th>格局</th><th>總價(萬)</th><th>單價(萬/坪)</th><th>屋況</th><th>備註</th></tr></thead><tbody>`+
cu.map(u=>`<tr class="${u.is_target?'hl':''}"><td>${esc(u.name||'—')}${u.is_target?'<span class="tag-t">本件</span>':''}</td><td>${esc(u.floor||'—')}</td><td>${esc(u.area||'—')}</td><td>${esc(u.layout||'—')}</td><td class="${pc(u.unit_price,med)}">${esc(u.total_price||'—')}</td><td class="${pc(u.unit_price,med)}">${esc(u.unit_price||'—')}</td><td>${esc(u.condition||'—')}</td><td>${esc(u.note||'—')}</td></tr>`).join('')+
`</tbody></table></div>${sumCards(an&&an.community_summary)}</div>`;
}
// 實價登錄
if(tx&&tx.length){
const med=calcMed(tx.map(u=>parseFloat(u.unit_price)));
h+=`<div class="tcard pur"><div class="thead"><div class="ttitle">同區同屋齡 實價登錄參考 <span class="tbadge">${tx.length} 筆</span></div><span class="src-badge">實價登錄資料</span></div><div class="twrap"><table>
<thead><tr><th>社區名稱</th><th>成交日期</th><th>樓層</th><th>坪數</th><th>格局</th><th>屋齡</th><th>成交總價(萬)</th><th>成交單價(萬/坪)</th><th>備註</th></tr></thead><tbody>`+
tx.map(u=>`<tr><td>${esc(u.community||'—')}</td><td>${esc(u.date||'—')}</td><td>${esc(u.floor||'—')}</td><td>${esc(u.area||'—')}</td><td>${esc(u.layout||'—')}</td><td>${esc(u.age||'—')}</td><td class="${pc(u.unit_price,med)}">${esc(u.total_price||'—')}</td><td class="${pc(u.unit_price,med)}">${esc(u.unit_price||'—')}</td><td>${esc(u.note||'—')}</td></tr>`).join('')+
`</tbody></table></div>${sumCards(an&&an.transaction_summary)}</div>`;
}
// 分析結論
if(an&&an.conclusion){
const lines=an.conclusion.split('\n').filter(l=>l.trim());
const cfg={
'定價位置':['b1','📊'],'競品比較':['b2','🏘️'],
'合理成交價':['b3','💰'],'行動建議':['b4','🎯']
};
let blocks='';
lines.forEach(l=>{
const m=l.match(/^【(.+?)】(.*)$/);
if(m){
const [cls,ic]=cfg[m[1]]||['b1','▶'];
blocks+=`<div class="con-block ${cls}"><div class="con-block-title">${ic} ${esc(m[1])}</div><div class="con-block-text">${esc(m[2].trim())}</div></div>`;
} else if(l.trim()){
blocks+=`<div style="font-size:13px;line-height:1.85;color:var(--muted);padding:2px 0;">${esc(l)}</div>`;
}
});
h+=`<div class="con-card"><div class="con-header"><div class="con-title">分析結論與行動建議</div></div><div class="con-body">${blocks}</div></div>`;
}
return h;
}
// ── Main ──
async function go(){
const input=document.getElementById('pi').value.trim();
if(!input){showErr('請先貼入物件資訊');return;}
hideErr();
document.getElementById('rs').classList.remove('on');
document.getElementById('rs').innerHTML='';
document.getElementById('exportBar').classList.remove('on');
setLoad(true);
const apiKeyVal=document.getElementById('apiKey').value.trim();
const headers={'Content-Type':'application/json'};
if(apiKeyVal){headers['x-api-key']=apiKeyVal;sessionStorage.setItem('ant_key',apiKeyVal);}
const sys=`你是台灣專業不動產市場分析師,精通台中市各區行情與實價登錄。
使用者貼入物件文字,請用 web_search 完成以下作業並輸出純 JSON,不得有任何其他文字:
1. 從文字識別:社區名稱、地址、行政區、總價、單價、樓層、坪數、格局、屋齡、屋況
2. 搜尋「[社區名稱] 591 待售」「[社區名稱] 5168 掛牌」,取得同社區掛牌 4–8 筆(本件設 is_target:true)
3. 搜尋「[社區名稱] 實價登錄」「[行政區] [格局] 實價登錄 屋齡[N]年」,取得近 2 年成交 4–8 筆
4. 輸出 JSON:
{
"property":{
"community_name":"社區名稱","building_name":"棟別(選填)",
"address":"地址","district":"行政區","city":"台中市",
"total_price":"總價如1280萬","unit_price":"單價如25.6萬/坪",
"floor":"如5F/12F","area":"如50坪","layout":"如3房2廳2衛",
"age":"如10年","condition":"屋況","notes":"備註"
},
"community_units":[
{"name":"物件名","floor":"樓層","area":"坪數","layout":"格局",
"total_price":"總價萬","unit_price":"單價萬/坪",
"condition":"屋況","note":"備註","is_target":false}
],
"transactions":[
{"community":"社區","date":"成交年月如2024-08","floor":"樓層",
"area":"坪數","layout":"格局","age":"屋齡",
"total_price":"成交總價萬","unit_price":"成交單價萬/坪","note":"備註"}
],
"analysis":{
"community_summary":[
{"label":"社區掛牌均價","value":"X萬/坪","sub":"共N筆"},
{"label":"本件單價排名","value":"第X高","sub":"共N筆"},
{"label":"議價空間估算","value":"約X%","sub":"相較均價"}
],
"transaction_summary":[
{"label":"近2年成交均價","value":"X萬/坪","sub":"共N筆"},
{"label":"掛牌vs成交","value":"+X%","sub":"高於近期成交均價"}
],
"conclusion":"請依序輸出以下4行,每行前綴【標題】:\n【定價位置】本件在社區掛牌中的相對高低與原因\n【競品比較】與同區近似物件的競爭優劣勢\n【合理成交價】根據實價登錄與掛牌行情,明確給出合理成交價區間(如:XXX~XXX萬),並說明推算依據\n【行動建議】明確二擇一:A)建議進行議價——說明應從幾折切入、目標成交價、議價理由;或 B)價格已具競爭力,建議加強廣告——說明哪些條件有利、廣告應主打哪些亮點"
}
}
找不到的欄位填「—」,空陣列填 []。`;
try{
const r=await fetch('https://api.anthropic.com/v1/messages',{
method:'POST',headers,
body:JSON.stringify({
model:'claude-sonnet-4-20250514',max_tokens:5000,system:sys,
tools:[{type:'web_search_20250305',name:'web_search'}],
messages:[{role:'user',content:'請分析以下物件:\n\n'+input}]
})
});
if(!r.ok){const e=await r.json().catch(()=>({}));throw new Error((e.error&&e.error.message)||'API 錯誤 '+r.status);}
const data=await r.json();
const text=(data.content||[]).filter(b=>b.type==='text').map(b=>b.text).join('');
const m=text.match(/\{[\s\S]*\}/);
if(!m)throw new Error('AI 未回傳有效資料,請再試一次');
let parsed;try{parsed=JSON.parse(m[0]);}catch(e){throw new Error('資料解析失敗,請再試一次');}
setLoad(false);
const sec=document.getElementById('rs');
sec.innerHTML=buildResult(parsed);
sec.classList.add('on');
document.getElementById('exportBar').classList.add('on');
sec.scrollIntoView({behavior:'smooth',block:'start'});
}catch(err){setLoad(false);showErr(err.message||'發生未知錯誤');}
}
function exportPDF(){
const d=new Date(),tw=d.getFullYear()-1911;
const el=document.getElementById('printDate');
if(el)el.textContent=`列印日期:民國${tw}年${d.getMonth()+1}月${d.getDate()}日`;
window.print();
}
window.addEventListener('DOMContentLoaded',()=>{
const k=sessionStorage.getItem('ant_key');
if(k)document.getElementById('apiKey').value=k;
});
</script>
</body>
</html>