| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- """
- 频繁项集 API 工具
- 封装 pattern.aiddit.com 的频繁项集接口,用于查询与指定分类节点
- 在优质内容中共同出现的关联要素。
- """
- import logging
- import httpx
- from agent.tools import tool
- from agent.tools.models import ToolResult
- logger = logging.getLogger(__name__)
- ITEMSETS_URL = "https://pattern.aiddit.com/api/pattern/tools/get_frequent_itemsets/execute"
- HEADERS = {
- "Accept": "*/*",
- "Accept-Language": "zh-CN,zh;q=0.9",
- "Connection": "keep-alive",
- "Content-Type": "application/json",
- "Origin": "https://pattern.aiddit.com",
- "Referer": "https://pattern.aiddit.com/execution/33",
- "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36",
- }
- @tool(description="查询与指定分类节点在优质内容中共同出现的频繁项集(关联要素),用于扩展制作需求的关联维度")
- async def get_frequent_itemsets(
- entity_ids: list,
- top_n: int = 20,
- execution_id: int = 33,
- sort_by: str = "absolute_support",
- ) -> ToolResult:
- """
- 获取与指定分类节点关联的频繁项集。
- Args:
- entity_ids: 分类节点的 entity_id 列表(即搜索接口返回的 entity_id 字段,非 stable_id)
- top_n: 返回前 N 个项集,默认 20
- execution_id: 执行 ID,默认 33
- sort_by: 排序字段,默认 "absolute_support"
- """
- payload = {
- "execution_id": execution_id,
- "args": {
- "top_n": top_n,
- "category_ids": entity_ids,
- "sort_by": sort_by,
- },
- }
- try:
- import json as _json
- async with httpx.AsyncClient(timeout=30.0) as client:
- resp = await client.post(ITEMSETS_URL, json=payload, headers=HEADERS)
- resp.raise_for_status()
- outer = resp.json()
- # result 字段是 JSON 字符串,需要二次解析
- data = _json.loads(outer["result"])
- total = data.get("total", 0)
- groups = data.get("groups", {})
- # 收集所有 group 下的 itemsets
- all_itemsets = []
- for group_key, group in groups.items():
- for itemset in group.get("itemsets", []):
- itemset["_group"] = group_key
- all_itemsets.append(itemset)
- lines = [f"频繁项集查询 entity_ids={entity_ids},共 {total} 条,返回 {len(all_itemsets)} 条:\n"]
- for i, itemset in enumerate(all_itemsets, 1):
- itemset_id = itemset.get("id", "")
- item_count = itemset.get("item_count", "")
- support = itemset.get("support", 0)
- abs_support = itemset.get("absolute_support", "")
- lines.append(f"{i}. 项集ID={itemset_id} | 项数={item_count} | support={support:.4f} | abs={abs_support}")
- for elem in itemset.get("items", []):
- dim = elem.get("dimension", "")
- path = elem.get("category_path", "")
- ename = elem.get("element_name") or ""
- label = f"{path}({ename})" if ename else path
- lines.append(f" [{dim}] {label}")
- lines.append("")
- return ToolResult(
- title=f"频繁项集: entity_ids={entity_ids} → {total} 条",
- output="\n".join(lines),
- )
- return ToolResult(
- title="频繁项集查询失败",
- output=f"HTTP {e.response.status_code}: {e.response.text[:200]}",
- )
- except Exception as e:
- logger.exception("get_frequent_itemsets error")
- return ToolResult(title="频繁项集查询失败", output=f"错误: {e}")
|