|
@@ -227,10 +227,33 @@ public class AiGateway {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 先天画像 AI 解读(stub,任务8完善为真实HTTP调用)
|
|
|
|
|
|
|
+ * 先天画像 AI 解读:调用 LangGraph innate_portrait_graph
|
|
|
|
|
+ * @param portrait 先天画像数据
|
|
|
|
|
+ * @return 含 "reading" 字段的 Map;失败返回 null(调用方降级模板)
|
|
|
*/
|
|
*/
|
|
|
public Map<String, Object> generateInnateReading(Object portrait) {
|
|
public Map<String, Object> generateInnateReading(Object portrait) {
|
|
|
- return null;
|
|
|
|
|
|
|
+ if (!enabled || isCircuitOpen()) return null;
|
|
|
|
|
+ try {
|
|
|
|
|
+ ObjectNode body = objectMapper.createObjectNode();
|
|
|
|
|
+ body.set("portrait", objectMapper.valueToTree(portrait));
|
|
|
|
|
+
|
|
|
|
|
+ HttpEntity<String> entity = new HttpEntity<>(body.toString(), createJsonHeaders());
|
|
|
|
|
+ String url = baseUrl + "/api/v1/innate/reading";
|
|
|
|
|
+
|
|
|
|
|
+ ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class);
|
|
|
|
|
+ if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
|
|
|
|
|
+ JsonNode root = objectMapper.readTree(response.getBody());
|
|
|
|
|
+ Map<String, Object> result = new LinkedHashMap<>();
|
|
|
|
|
+ result.put("reading", root.has("reading") ? root.get("reading").asText() : "");
|
|
|
|
|
+ consecutiveFailures.set(0);
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.warn("AiGateway generateInnateReading 调用失败: {}", e.getMessage());
|
|
|
|
|
+ recordFailure();
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private List<Map<String, Object>> parseTasks(JsonNode tasksNode) {
|
|
private List<Map<String, Object>> parseTasks(JsonNode tasksNode) {
|