Build a fresh cold-start profile from role metadata.
(role_name: str, role_data: Dict[str, Any])
| 136 | |
| 137 | |
| 138 | def build_seed_profile(role_name: str, role_data: Dict[str, Any]) -> Dict[str, Any]: |
| 139 | """Build a fresh cold-start profile from role metadata.""" |
| 140 | coldstart_agent = importlib.import_module("agents.coldstart-agent.main") |
| 141 | |
| 142 | user_id = role_data.get("user_id") or f"user_{role_name}" |
| 143 | bootstrap_text = ( |
| 144 | role_data.get("natural_language") |
| 145 | or role_data.get("description") |
| 146 | or "" |
| 147 | ).strip() |
| 148 | |
| 149 | profile = coldstart_agent.build_empty_profile(user_id) |
| 150 | parsed = coldstart_agent.parse_natural_language(bootstrap_text) if bootstrap_text else {} |
| 151 | selected_directions = _extract_seed_directions_from_role(role_data) or _select_seed_directions(role_name, parsed) |
| 152 | |
| 153 | profile["core_directions"] = selected_directions |
| 154 | profile["topic_weights"] = { |
| 155 | direction_key: round( |
| 156 | float(((parsed.get("topic_weights") or {}).get(direction_key, weight))), |
| 157 | 4, |
| 158 | ) |
| 159 | for direction_key, weight in selected_directions.items() |
| 160 | } |
| 161 | profile["methodology_preferences"] = role_data.get("methodology_preferences") or parsed.get("methodology_preferences") or {} |
| 162 | profile["taste_profile"] = parsed.get("taste_profile") or {} |
| 163 | profile["must_read"] = { |
| 164 | "authors": list(role_data.get("must_read_authors", []) or []), |
| 165 | "institutions": list(role_data.get("must_read_institutions", []) or []), |
| 166 | "keywords": list(role_data.get("must_read_keywords", []) or []), |
| 167 | } |
| 168 | profile["interest_vector"] = coldstart_agent.generate_interest_vector(selected_directions) |
| 169 | profile["description"] = role_data.get("description") or bootstrap_text |
| 170 | profile["bootstrap_summary"] = role_data.get("bootstrap_summary") or bootstrap_text |
| 171 | profile["secondary_topics"] = list(role_data.get("secondary_topics", []) or []) |
| 172 | profile["report_preferences"] = copy.deepcopy(role_data.get("report_preferences") or {}) |
| 173 | profile["drift_plan"] = copy.deepcopy(role_data.get("drift_plan") or {}) |
| 174 | profile["feishu_chat_id"] = role_data.get("feishu_chat_id") |
| 175 | |
| 176 | return profile |
| 177 | |
| 178 | |
| 179 | def reset_user_profiles( |
no test coverage detected