|
|
@@ -10,14 +10,27 @@ Pattern 维度分析 Tool
|
|
|
- account_name: 账号名称
|
|
|
- post_id: 帖子 ID
|
|
|
- log_id: 推导日志目录名(形如 20260313210921)
|
|
|
-- cluster_level: 在人设树中查找祖先节点的目标深度(root 为 0 层)
|
|
|
+
|
|
|
+已推导/未推导维度节点在结果中以对象列表表示,字段见 _analyze_single_round 返回说明。
|
|
|
"""
|
|
|
|
|
|
import json
|
|
|
+import logging
|
|
|
import sys
|
|
|
from pathlib import Path
|
|
|
from typing import Any, Dict, List, Optional, Tuple, Set
|
|
|
|
|
|
+logger = logging.getLogger(__name__)
|
|
|
+
|
|
|
+try:
|
|
|
+ from agent.tools import tool, ToolResult, ToolContext
|
|
|
+except ImportError:
|
|
|
+ def tool(*args, **kwargs):
|
|
|
+ return lambda f: f
|
|
|
+
|
|
|
+ ToolResult = None
|
|
|
+ ToolContext = None
|
|
|
+
|
|
|
# 保证直接运行或作为包加载时都能解析 utils / tools(IDE 可跳转)
|
|
|
_root = Path(__file__).resolve().parent.parent
|
|
|
if str(_root) not in sys.path:
|
|
|
@@ -35,6 +48,9 @@ TOP_KEYS = [
|
|
|
]
|
|
|
SUB_KEYS = ["two_x", "one_x", "zero_x"]
|
|
|
|
|
|
+# 在人设树中查找祖先节点的目标深度(root 为 0 层)
|
|
|
+CLUSTER_LEVEL = 3
|
|
|
+
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
# 1. 读取推导日志:按轮次累计 matched_post_point
|
|
|
@@ -52,6 +68,7 @@ def _load_round_matched_points(
|
|
|
account_name: str,
|
|
|
post_id: str,
|
|
|
log_id: str,
|
|
|
+ max_round: Optional[int] = None,
|
|
|
) -> List[Dict[str, Any]]:
|
|
|
"""
|
|
|
读取指定日志目录下所有 {轮次}.评估.json,按轮次排序,生成:
|
|
|
@@ -91,6 +108,9 @@ def _load_round_matched_points(
|
|
|
continue
|
|
|
eval_files.append((r, p))
|
|
|
|
|
|
+ if max_round is not None:
|
|
|
+ eval_files = [(r, p) for r, p in eval_files if r <= max_round]
|
|
|
+
|
|
|
eval_files.sort(key=lambda x: x[0])
|
|
|
results: List[Dict[str, Any]] = []
|
|
|
cumulative: List[Dict[str, Any]] = []
|
|
|
@@ -512,11 +532,36 @@ class TreeIndex:
|
|
|
# 4. 对单轮数据执行 pattern & 聚类分析
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
+def _dim_obj(
|
|
|
+ tree_node_name: str,
|
|
|
+ tree_index: TreeIndex,
|
|
|
+ matched_point: Optional[str] = None,
|
|
|
+) -> Dict[str, Any]:
|
|
|
+ dim = (tree_index.node_info.get(tree_node_name) or {}).get("dimension") or ""
|
|
|
+ o: Dict[str, Any] = {
|
|
|
+ "tree_node_name": tree_node_name,
|
|
|
+ "dimension": dim,
|
|
|
+ }
|
|
|
+ if matched_point is not None:
|
|
|
+ o["matched_point"] = matched_point
|
|
|
+ return o
|
|
|
+
|
|
|
+
|
|
|
+def _entry_to_matched_point(entry: Dict[str, Any]) -> str:
|
|
|
+ """is_fully_derived 为 true 时用 matched_post_point,否则用 derivation_output_point。"""
|
|
|
+ dop = entry.get("derivation_output_point")
|
|
|
+ dop_s = str(dop).strip() if dop is not None else ""
|
|
|
+ if entry.get("is_fully_derived") is True:
|
|
|
+ mpp = entry.get("matched_post_point")
|
|
|
+ return str(mpp).strip() if mpp is not None else ""
|
|
|
+ return dop_s
|
|
|
+
|
|
|
+
|
|
|
def _analyze_single_round(
|
|
|
patterns: List[Dict[str, Any]],
|
|
|
tree_index: TreeIndex,
|
|
|
cumulative_points: List[Dict[str, Any]],
|
|
|
- cluster_level: int,
|
|
|
+ cluster_level: int = CLUSTER_LEVEL,
|
|
|
) -> Dict[str, Any]:
|
|
|
"""
|
|
|
对某一轮(给定累计 point 列表)执行维度分析:
|
|
|
@@ -527,24 +572,19 @@ def _analyze_single_round(
|
|
|
3. 对筛选出 pattern 的每个元素标记是否已推导:
|
|
|
- 元素在 derived_ancestor_set 中 → is_derived=True(已推导维度)
|
|
|
- 其他 → is_derived=False(未推导维度)
|
|
|
- 4. 汇总 derived_dims / underived_dims 列表。
|
|
|
-
|
|
|
- 返回结构:
|
|
|
- {
|
|
|
- "cumulative_points": [...], # 原始累计 point 对象列表
|
|
|
- "derived_ancestor_nodes": [...], # 所有 derivation_output_point 对应的 cluster_level 层祖先节点(已推导维度节点集合)
|
|
|
- "patterns": [...], # 筛选后带 is_derived 标记的 pattern 列表
|
|
|
- "derived_dims": [...], # 已推导维度节点(去重,出现于筛选 pattern 中)
|
|
|
- "underived_dims": [...], # 未推导维度节点(去重,排除已推导节点)
|
|
|
- "patterns_count": int,
|
|
|
- "derived_dim_count": int,
|
|
|
- "underived_dim_count": int,
|
|
|
- }
|
|
|
+ 4. 汇总 derived_dims / underived_dims 对象列表。
|
|
|
+
|
|
|
+ 返回结构(节选):
|
|
|
+ - derived_ancestor_nodes: [{ tree_node_name, dimension, matched_point }, ...]
|
|
|
+ - derived_dims: [{ tree_node_name, dimension, matched_point }, ...]
|
|
|
+ - underived_dims: [{ tree_node_name, dimension }, ...](无 matched_point)
|
|
|
"""
|
|
|
- # 1. 收集 derived_ancestor_set,同时记录每个祖先节点对应的 matched_post_point 来源
|
|
|
+ # 1. 收集 derived_ancestor_set,同时按规则累计每个祖先的 matched_point
|
|
|
derived_ancestor_set: Set[str] = set()
|
|
|
- ancestor_to_mpps: Dict[str, List[str]] = {} # 祖先节点 -> [matched_post_point, ...]
|
|
|
+ ancestor_to_matched: Dict[str, List[str]] = {}
|
|
|
for entry in cumulative_points:
|
|
|
+ if not isinstance(entry, dict):
|
|
|
+ continue
|
|
|
dop = entry.get("derivation_output_point")
|
|
|
if not dop:
|
|
|
continue
|
|
|
@@ -552,9 +592,9 @@ def _analyze_single_round(
|
|
|
if not ancestor:
|
|
|
continue
|
|
|
derived_ancestor_set.add(ancestor)
|
|
|
- mpp = entry.get("matched_post_point") or ""
|
|
|
- if mpp and mpp not in ancestor_to_mpps.get(ancestor, []):
|
|
|
- ancestor_to_mpps.setdefault(ancestor, []).append(mpp)
|
|
|
+ pt = _entry_to_matched_point(entry)
|
|
|
+ if pt and pt not in ancestor_to_matched.get(ancestor, []):
|
|
|
+ ancestor_to_matched.setdefault(ancestor, []).append(pt)
|
|
|
|
|
|
# 2. 筛选 pattern:已推导维度节点占所有元素的比例 >= 50%
|
|
|
filtered_patterns: List[Dict[str, Any]] = []
|
|
|
@@ -578,23 +618,19 @@ def _analyze_single_round(
|
|
|
f"derived_ancestor_set: {len(derived_ancestor_set)}"
|
|
|
)
|
|
|
|
|
|
- def _node_label(name: str, is_derived: bool) -> str:
|
|
|
- """
|
|
|
- 返回格式化标签:
|
|
|
- - 已推导节点:'node_name->dimension(mpp1,mpp2,...)'
|
|
|
- - 未推导节点:'node_name->dimension'
|
|
|
- """
|
|
|
- dim = (tree_index.node_info.get(name) or {}).get("dimension") or ""
|
|
|
- base = f"{name}->{dim}" if dim else name
|
|
|
- if is_derived:
|
|
|
- mpps = ancestor_to_mpps.get(name) or []
|
|
|
- if mpps:
|
|
|
- return f"{base}({','.join(mpps)})"
|
|
|
- return base
|
|
|
+ def _matched_join(name: str) -> str:
|
|
|
+ pts = ancestor_to_matched.get(name) or []
|
|
|
+ return ", ".join(pts) if pts else ""
|
|
|
+
|
|
|
+ derived_ancestor_nodes: List[Dict[str, Any]] = []
|
|
|
+ for anc in sorted(derived_ancestor_set):
|
|
|
+ derived_ancestor_nodes.append(
|
|
|
+ _dim_obj(anc, tree_index, matched_point=_matched_join(anc) or "")
|
|
|
+ )
|
|
|
|
|
|
# 3. 对筛选 pattern 元素分类并汇总维度列表
|
|
|
- derived_dims: List[str] = []
|
|
|
- underived_dims: List[str] = []
|
|
|
+ derived_dims: List[Dict[str, Any]] = []
|
|
|
+ underived_dims: List[Dict[str, Any]] = []
|
|
|
derived_dims_seen: Set[str] = set()
|
|
|
underived_dims_seen: Set[str] = set()
|
|
|
|
|
|
@@ -616,11 +652,17 @@ def _analyze_single_round(
|
|
|
if is_derived:
|
|
|
if name and name not in derived_dims_seen:
|
|
|
derived_dims_seen.add(name)
|
|
|
- derived_dims.append(_node_label(name, is_derived=True))
|
|
|
+ derived_dims.append(
|
|
|
+ _dim_obj(
|
|
|
+ name,
|
|
|
+ tree_index,
|
|
|
+ matched_point=_matched_join(name) or "",
|
|
|
+ )
|
|
|
+ )
|
|
|
else:
|
|
|
if name and name not in underived_dims_seen:
|
|
|
underived_dims_seen.add(name)
|
|
|
- underived_dims.append(_node_label(name, is_derived=False))
|
|
|
+ underived_dims.append(_dim_obj(name, tree_index))
|
|
|
|
|
|
scored_patterns.append(
|
|
|
{
|
|
|
@@ -631,7 +673,7 @@ def _analyze_single_round(
|
|
|
)
|
|
|
|
|
|
# 从 underived_dims 中排除与 derived_dims 重叠的节点
|
|
|
- underived_dims = [d for d in underived_dims if d.split("->")[0] not in derived_dims_seen]
|
|
|
+ underived_dims = [d for d in underived_dims if d["tree_node_name"] not in derived_dims_seen]
|
|
|
|
|
|
# 按 is_derived=True 的元素数量从高到低排序,数量相同再按元素总数从高到低
|
|
|
scored_patterns.sort(
|
|
|
@@ -644,7 +686,7 @@ def _analyze_single_round(
|
|
|
|
|
|
return {
|
|
|
"cumulative_points": list(cumulative_points),
|
|
|
- "derived_ancestor_nodes": sorted(derived_ancestor_set),
|
|
|
+ "derived_ancestor_nodes": derived_ancestor_nodes,
|
|
|
"patterns": scored_patterns,
|
|
|
"derived_dims": derived_dims,
|
|
|
"underived_dims": underived_dims,
|
|
|
@@ -654,12 +696,32 @@ def _analyze_single_round(
|
|
|
}
|
|
|
|
|
|
|
|
|
+def _format_round_dimension_text(
|
|
|
+ derived_dims: List[Dict[str, Any]],
|
|
|
+ underived_dims: List[Dict[str, Any]],
|
|
|
+) -> str:
|
|
|
+ """已推导/未推导维度,每行:维度:tree_node_name,匹配点:matched_point"""
|
|
|
+ lines: List[str] = ["【已推导的维度】"]
|
|
|
+ for d in derived_dims:
|
|
|
+ name = d.get("tree_node_name") or ""
|
|
|
+ mp = d.get("matched_point") or "-"
|
|
|
+ lines.append(f"维度:{name},匹配点:{mp}")
|
|
|
+ if not derived_dims:
|
|
|
+ lines.append("(无)")
|
|
|
+ lines.append("")
|
|
|
+ lines.append("【未推导的维度】")
|
|
|
+ for d in underived_dims:
|
|
|
+ name = d.get("tree_node_name") or ""
|
|
|
+ lines.append(f"维度:{name}")
|
|
|
+ if not underived_dims:
|
|
|
+ lines.append("(无)")
|
|
|
+ return "\n".join(lines)
|
|
|
+
|
|
|
|
|
|
def pattern_dimension_analyze(
|
|
|
account_name: str,
|
|
|
post_id: str,
|
|
|
log_id: str,
|
|
|
- cluster_level: int = 2,
|
|
|
) -> Dict[str, Any]:
|
|
|
"""
|
|
|
Pattern 维度分析主入口。
|
|
|
@@ -669,14 +731,13 @@ def pattern_dimension_analyze(
|
|
|
account_name : 账号名(用于定位 input / output 下的数据目录)
|
|
|
post_id : 帖子 ID(用于定位推导日志)
|
|
|
log_id : 推导日志目录名(../output/{account_name}/推导日志/{post_id}/{log_id}/)
|
|
|
- cluster_level : 在人设树中查找祖先节点的目标深度(root 为 0 层),默认 2
|
|
|
|
|
|
逻辑概述
|
|
|
--------
|
|
|
- 每一轮:
|
|
|
- 1. 从 derivation_output_point 在人设树中找到 cluster_level 层祖先节点 → 已推导维度节点集合。
|
|
|
+ 聚类层级固定为 CLUSTER_LEVEL(默认 3)。每一轮:
|
|
|
+ 1. 从 derivation_output_point 在人设树中找到该层祖先节点 → 已推导维度节点集合。
|
|
|
2. 筛选包含已推导维度节点的 pattern。
|
|
|
- 3. 标记每个 pattern 元素是否已推导,汇总 derived_dims / underived_dims。
|
|
|
+ 3. 标记每个 pattern 元素是否已推导,汇总 derived_dims / underived_dims(对象列表)。
|
|
|
"""
|
|
|
eval_dir = _round_eval_dir(account_name, post_id, log_id)
|
|
|
if not eval_dir.is_dir():
|
|
|
@@ -688,7 +749,7 @@ def pattern_dimension_analyze(
|
|
|
"account_name": account_name,
|
|
|
"post_id": post_id,
|
|
|
"log_id": log_id,
|
|
|
- "cluster_level": cluster_level,
|
|
|
+ "cluster_level": CLUSTER_LEVEL,
|
|
|
"rounds": [],
|
|
|
"message": "未在指定日志目录下找到任何评估结果文件(*_评估.json)",
|
|
|
}
|
|
|
@@ -707,7 +768,6 @@ def pattern_dimension_analyze(
|
|
|
patterns=deduped_patterns,
|
|
|
tree_index=tree_index,
|
|
|
cumulative_points=cumulative_points,
|
|
|
- cluster_level=cluster_level,
|
|
|
)
|
|
|
analyzed["round"] = r
|
|
|
rounds_output.append(analyzed)
|
|
|
@@ -716,18 +776,145 @@ def pattern_dimension_analyze(
|
|
|
"account_name": account_name,
|
|
|
"post_id": post_id,
|
|
|
"log_id": log_id,
|
|
|
- "cluster_level": cluster_level,
|
|
|
+ "cluster_level": CLUSTER_LEVEL,
|
|
|
"rounds": rounds_output,
|
|
|
}
|
|
|
|
|
|
|
|
|
+def round_pattern_dimension_analyze_core(
|
|
|
+ account_name: str,
|
|
|
+ post_id: str,
|
|
|
+ log_id: str,
|
|
|
+ round: int,
|
|
|
+) -> Dict[str, Any]:
|
|
|
+ """
|
|
|
+ 仅使用第 round 轮及之前的评估文件,得到该轮结束时的累计选题点状态并做维度分析。
|
|
|
+ 返回 analyzed 单轮结构(含 derived_dims / underived_dims 等),失败时含 error 字段。
|
|
|
+ """
|
|
|
+ eval_dir = _round_eval_dir(account_name, post_id, log_id)
|
|
|
+ if not eval_dir.is_dir():
|
|
|
+ return {"error": f"推导日志目录不存在: {eval_dir}"}
|
|
|
+
|
|
|
+ round_infos = _load_round_matched_points(
|
|
|
+ account_name, post_id, log_id, max_round=round
|
|
|
+ )
|
|
|
+ if not round_infos:
|
|
|
+ return {
|
|
|
+ "error": f"在 {eval_dir} 下未找到第 {round} 轮及之前的 *_评估.json",
|
|
|
+ }
|
|
|
+ last = round_infos[-1]
|
|
|
+ if last.get("round") != round:
|
|
|
+ return {
|
|
|
+ "error": (
|
|
|
+ f"指定轮次 {round} 的评估文件不存在;"
|
|
|
+ f"当前仅加载到第 {last.get('round')} 轮"
|
|
|
+ ),
|
|
|
+ }
|
|
|
+
|
|
|
+ tree_index = TreeIndex(account_name)
|
|
|
+ raw_patterns = _load_raw_patterns(account_name)
|
|
|
+ deduped_patterns = _dedupe_patterns(raw_patterns)
|
|
|
+ analyzed = _analyze_single_round(
|
|
|
+ patterns=deduped_patterns,
|
|
|
+ tree_index=tree_index,
|
|
|
+ cumulative_points=last["cumulative_points"],
|
|
|
+ )
|
|
|
+ analyzed["round"] = round
|
|
|
+ return analyzed
|
|
|
+
|
|
|
+
|
|
|
+@tool()
|
|
|
+async def round_pattern_dimension_analyze(
|
|
|
+ account_name: str,
|
|
|
+ post_id: str,
|
|
|
+ log_id: str,
|
|
|
+ round: int,
|
|
|
+) -> Any:
|
|
|
+ """
|
|
|
+ 推导维度分析,返回当前轮次已推导的维度和可能的未推导维度数据
|
|
|
+
|
|
|
+ Args:
|
|
|
+ account_name: 账号名称
|
|
|
+ post_id: 帖子 ID
|
|
|
+ log_id: 推导日志目录名
|
|
|
+ round: 推导轮次(正整数)
|
|
|
+
|
|
|
+ Returns:
|
|
|
+ ToolResult:output 为可读文本,含「已推导的维度」「未推导的维度」两段,
|
|
|
+ 每行格式为「维度:tree_node_name,匹配点:matched_point」
|
|
|
+ (未推导行固定为「-」;matched_point 规则:is_fully_derived 为真取选题点否则取推导输出点)。
|
|
|
+ """
|
|
|
+ if ToolResult is None:
|
|
|
+ return None
|
|
|
+
|
|
|
+ logger.info(
|
|
|
+ "round_pattern_dimension_analyze: account=%s post_id=%s log_id=%s round=%s",
|
|
|
+ account_name,
|
|
|
+ post_id,
|
|
|
+ log_id,
|
|
|
+ round,
|
|
|
+ )
|
|
|
+
|
|
|
+ try:
|
|
|
+ r = int(round)
|
|
|
+ if r < 1:
|
|
|
+ return ToolResult(
|
|
|
+ title="维度分析: 轮次无效",
|
|
|
+ output="",
|
|
|
+ error="round 须为 >= 1 的整数",
|
|
|
+ )
|
|
|
+ except (TypeError, ValueError):
|
|
|
+ return ToolResult(
|
|
|
+ title="维度分析: 轮次无效",
|
|
|
+ output="",
|
|
|
+ error="round 须为整数",
|
|
|
+ )
|
|
|
+
|
|
|
+ try:
|
|
|
+ analyzed = round_pattern_dimension_analyze_core(
|
|
|
+ account_name, post_id, log_id, r
|
|
|
+ )
|
|
|
+ if analyzed.get("error"):
|
|
|
+ return ToolResult(
|
|
|
+ title=f"维度分析 第{r}轮 失败",
|
|
|
+ output="",
|
|
|
+ error=str(analyzed["error"]),
|
|
|
+ )
|
|
|
+
|
|
|
+ # 保存到与 {轮次}_评估.json 同级目录
|
|
|
+ out_dir = _round_eval_dir(account_name, post_id, log_id)
|
|
|
+ out_dir.mkdir(parents=True, exist_ok=True)
|
|
|
+ out_path = out_dir / f"{r}_维度分析.json"
|
|
|
+ with open(out_path, "w", encoding="utf-8") as f:
|
|
|
+ json.dump(analyzed, f, ensure_ascii=False, indent=2)
|
|
|
+
|
|
|
+ derived = analyzed.get("derived_dims") or []
|
|
|
+ underived = analyzed.get("underived_dims") or []
|
|
|
+ text = _format_round_dimension_text(derived, underived)
|
|
|
+ meta = (
|
|
|
+ f"round={r}, derived={len(derived)}, underived={len(underived)}, "
|
|
|
+ f"patterns={analyzed.get('patterns_count', 0)}"
|
|
|
+ )
|
|
|
+ return ToolResult(
|
|
|
+ title=f"第 {r} 轮维度分析(已推导 {len(derived)} / 未推导 {len(underived)})",
|
|
|
+ output=text,
|
|
|
+ metadata={"round_pattern_dimension_analyze": meta},
|
|
|
+ )
|
|
|
+ except Exception as e:
|
|
|
+ logger.exception("round_pattern_dimension_analyze failed: %s", e)
|
|
|
+ return ToolResult(
|
|
|
+ title="维度分析失败",
|
|
|
+ output="",
|
|
|
+ error=str(e),
|
|
|
+ )
|
|
|
+
|
|
|
+
|
|
|
def main(account_name, post_id, log_id) -> None:
|
|
|
"""本地简单测试:以家有大志账号的一次推导日志做分析,并将结果写入输出目录。"""
|
|
|
result = pattern_dimension_analyze(
|
|
|
account_name=account_name,
|
|
|
post_id=post_id,
|
|
|
log_id=log_id,
|
|
|
- cluster_level=3,
|
|
|
)
|
|
|
# 控制台打印前 4000 字符,便于快速查看
|
|
|
# print(json.dumps(result, ensure_ascii=False, indent=2)[:4000] + "...")
|
|
|
@@ -742,16 +929,79 @@ def main(account_name, post_id, log_id) -> None:
|
|
|
print(f"\n分析结果已写入: {out_path}")
|
|
|
|
|
|
|
|
|
+def main_round_pattern_dimension_analyze(
|
|
|
+ account_name: str,
|
|
|
+ post_id: str,
|
|
|
+ log_id: str,
|
|
|
+ round_num: int,
|
|
|
+) -> None:
|
|
|
+ """本地测试:直接调用 round_pattern_dimension_analyze,打印 ToolResult。"""
|
|
|
+ import asyncio
|
|
|
+
|
|
|
+ async def _run() -> None:
|
|
|
+ result = await round_pattern_dimension_analyze(
|
|
|
+ account_name=account_name,
|
|
|
+ post_id=post_id,
|
|
|
+ log_id=log_id,
|
|
|
+ round=round_num,
|
|
|
+ context=None,
|
|
|
+ )
|
|
|
+ if result is None:
|
|
|
+ print(
|
|
|
+ "round_pattern_dimension_analyze 返回 None:请先将 Agent 项目根目录加入 PYTHONPATH,"
|
|
|
+ "或在 __main__ 中保证能 import agent.tools.ToolResult"
|
|
|
+ )
|
|
|
+ return
|
|
|
+ if result.error:
|
|
|
+ print(f"错误: {result.error}")
|
|
|
+ else:
|
|
|
+ print(result.title)
|
|
|
+ print(result.output)
|
|
|
+
|
|
|
+ asyncio.run(_run())
|
|
|
+
|
|
|
+
|
|
|
if __name__ == "__main__":
|
|
|
- account_name = "家有大志"
|
|
|
+ import asyncio
|
|
|
+ import importlib.util
|
|
|
+
|
|
|
+ # 直接加载 ToolResult,避免 import agent 时拉全量依赖(如 langchain)
|
|
|
+ _agent_root = Path(__file__).resolve().parents[3]
|
|
|
+ _models_py = _agent_root / "agent" / "tools" / "models.py"
|
|
|
+ if _models_py.is_file():
|
|
|
+ _spec = importlib.util.spec_from_file_location(
|
|
|
+ "_pattern_dim_tool_models", _models_py
|
|
|
+ )
|
|
|
+ if _spec and _spec.loader:
|
|
|
+ _m = importlib.util.module_from_spec(_spec)
|
|
|
+ _spec.loader.exec_module(_m)
|
|
|
+ globals()["ToolResult"] = _m.ToolResult
|
|
|
+ if getattr(_m, "ToolContext", None) is not None:
|
|
|
+ globals()["ToolContext"] = _m.ToolContext
|
|
|
+
|
|
|
+ # ---------- 开关与参数(改这里即可) ----------
|
|
|
+ run_round_pattern_test = False
|
|
|
+ run_full_pattern_analyze = True
|
|
|
+
|
|
|
+ test_account_name = "家有大志"
|
|
|
+ test_post_id = "68fb6a5c000000000302e5de"
|
|
|
+ test_log_id = "20260317214307"
|
|
|
+ test_round = 1
|
|
|
|
|
|
items = [
|
|
|
- {"post_id": "68fb6a5c000000000302e5de", "log_id": "20260317214307"},
|
|
|
- {"post_id": "69185d49000000000d00f94e", "log_id": "20260317214841"},
|
|
|
- {"post_id": "6921937a000000001b0278d1", "log_id": "20260317215616"}
|
|
|
+ {"post_id": "68fb6a5c000000000302e5de", "log_id": "20260318172724"},
|
|
|
+ # {"post_id": "69185d49000000000d00f94e", "log_id": "20260317214841"},
|
|
|
+ # {"post_id": "6921937a000000001b0278d1", "log_id": "20260317215616"},
|
|
|
]
|
|
|
- for item in items:
|
|
|
- post_id = item["post_id"]
|
|
|
- log_id = item["log_id"]
|
|
|
- main(account_name, post_id, log_id)
|
|
|
+
|
|
|
+ if run_round_pattern_test:
|
|
|
+ main_round_pattern_dimension_analyze(
|
|
|
+ test_account_name,
|
|
|
+ test_post_id,
|
|
|
+ test_log_id,
|
|
|
+ test_round,
|
|
|
+ )
|
|
|
+ elif run_full_pattern_analyze:
|
|
|
+ for item in items:
|
|
|
+ main(test_account_name, item["post_id"], item["log_id"])
|
|
|
|