package knowledge import ( "strconv" "strings" "unicode/utf8" ) const ( minGraphNodes = 18 minLayer1Nodes = 6 minLayer2Nodes = 10 minBreadthNodes = 22 targetGraphNodes = 28 minNodeCopyRunes = 15 ) func GraphTooThin(g Graph) bool { if len(g.Nodes) < minGraphNodes { return true } layerCounts := map[int]int{} thinCopy := 0 for _, node := range g.Nodes { layerCounts[node.Layer]++ if utf8.RuneCountInString(strings.TrimSpace(node.Relation)) < minNodeCopyRunes || utf8.RuneCountInString(strings.TrimSpace(node.PlacementValue)) < minNodeCopyRunes { thinCopy++ } } if layerCounts[1] < minLayer1Nodes || layerCounts[2] < minLayer2Nodes { return true } if thinCopy > len(g.Nodes)/2 { return true } return false } func GraphNeedsBreadth(g Graph) bool { return len(g.Nodes) < minBreadthNodes } func MinBreadthGraphNodes() int { return minBreadthNodes } func KnowledgeGraphRetryUserPrompt() string { return strings.TrimSpace(`上次產出過於簡略或節點不足。請重新產出完整 TKG JSON: - 節點總數 **24~32 個**,L1≥8、L2≥12(廣度優先,多方向觸及) - 每個節點的 relation 與 placementValue 各 25~55 字,寫完整句子 - 痛點/求助類節點至少 10 個;L2 周邊情境要覆蓋多種生活場景,不可精簡或省略欄位`) } func KnowledgeGraphBreadthUserPrompt(currentNodes int) string { return strings.TrimSpace(`目前延伸知識僅 ` + strconv.Itoa(currentNodes) + ` 個節點,廣度不足。請**維持既有節點**,只追加新節點與邊: - 至少再增加 **10~14 個**節點,總數目標 **24~32 個** - 優先補齊 L2 周邊情境:不同治療階段、生活事件、相鄰困擾、相關品類與使用場景 - 也要補 L1 直接相關的成因、症狀、機制,讓圖譜能觸及更多討論方向 - 新節點的 relation 與 placementValue 必須各 25~55 字;不要 high/medium/low - 只追加,不要刪除或覆蓋既有節點`) }