|
|
@@ -55,10 +55,59 @@ async def get_account_fans_portrait(
|
|
|
response.raise_for_status()
|
|
|
data = response.json()
|
|
|
|
|
|
+ # 格式化输出摘要
|
|
|
+ summary_lines = [f"账号 {account_id} 的粉丝画像"]
|
|
|
+ summary_lines.append("")
|
|
|
+
|
|
|
+ # 年龄分布
|
|
|
+ if need_age and "age" in data:
|
|
|
+ summary_lines.append("【年龄分布】")
|
|
|
+ age_data = data["age"]
|
|
|
+ for item in age_data:
|
|
|
+ name = item.get("name", "")
|
|
|
+ ratio = item.get("ratio", 0)
|
|
|
+ tgi = item.get("tgi", 0)
|
|
|
+ summary_lines.append(f" {name}: {ratio:.1f}% (偏好度: {tgi:.2f})")
|
|
|
+ summary_lines.append("")
|
|
|
+
|
|
|
+ # 性别分布
|
|
|
+ if need_gender and "gender" in data:
|
|
|
+ summary_lines.append("【性别分布】")
|
|
|
+ gender_data = data["gender"]
|
|
|
+ for item in gender_data:
|
|
|
+ name = item.get("name", "")
|
|
|
+ ratio = item.get("ratio", 0)
|
|
|
+ tgi = item.get("tgi", 0)
|
|
|
+ summary_lines.append(f" {name}: {ratio:.1f}% (偏好度: {tgi:.2f})")
|
|
|
+ summary_lines.append("")
|
|
|
+
|
|
|
+ # 城市等级
|
|
|
+ if need_city_level and "city_level" in data:
|
|
|
+ summary_lines.append("【城市等级】")
|
|
|
+ city_level_data = data["city_level"]
|
|
|
+ for item in city_level_data:
|
|
|
+ name = item.get("name", "")
|
|
|
+ ratio = item.get("ratio", 0)
|
|
|
+ tgi = item.get("tgi", 0)
|
|
|
+ summary_lines.append(f" {name}: {ratio:.1f}% (偏好度: {tgi:.2f})")
|
|
|
+ summary_lines.append("")
|
|
|
+
|
|
|
+ # 省份分布 TOP5
|
|
|
+ if need_province and "province" in data:
|
|
|
+ summary_lines.append("【省份分布 TOP5】")
|
|
|
+ province_data = data["province"][:5]
|
|
|
+ for i, item in enumerate(province_data, 1):
|
|
|
+ name = item.get("name", "")
|
|
|
+ ratio = item.get("ratio", 0)
|
|
|
+ tgi = item.get("tgi", 0)
|
|
|
+ summary_lines.append(f" {i}. {name}: {ratio:.1f}% (偏好度: {tgi:.2f})")
|
|
|
+ summary_lines.append("")
|
|
|
+
|
|
|
return ToolResult(
|
|
|
title=f"账号粉丝画像: {account_id}",
|
|
|
- output=json.dumps(data, ensure_ascii=False, indent=2),
|
|
|
+ output="\n".join(summary_lines),
|
|
|
long_term_memory=f"Fetched fans portrait for account '{account_id}'",
|
|
|
+ metadata={"raw_data": data}
|
|
|
)
|
|
|
except httpx.HTTPStatusError as e:
|
|
|
return ToolResult(
|
|
|
@@ -74,7 +123,7 @@ async def get_account_fans_portrait(
|
|
|
)
|
|
|
|
|
|
|
|
|
-@tool(description="获取抖音内容粉丝画像(热点宝),支持选择画像维度")
|
|
|
+@tool(description="获取抖音内容点赞用户画像(热点宝),支持选择画像维度")
|
|
|
async def get_content_fans_portrait(
|
|
|
content_id: str,
|
|
|
need_province: bool = False,
|
|
|
@@ -87,7 +136,7 @@ async def get_content_fans_portrait(
|
|
|
timeout: Optional[float] = None,
|
|
|
) -> ToolResult:
|
|
|
"""
|
|
|
- 获取抖音内容粉丝画像
|
|
|
+ 获取抖音内容点赞用户画像
|
|
|
"""
|
|
|
try:
|
|
|
payload = {
|
|
|
@@ -112,20 +161,69 @@ async def get_content_fans_portrait(
|
|
|
response.raise_for_status()
|
|
|
data = response.json()
|
|
|
|
|
|
+ # 格式化输出摘要
|
|
|
+ summary_lines = [f"内容 {content_id} 的点赞用户画像"]
|
|
|
+ summary_lines.append("")
|
|
|
+
|
|
|
+ # 年龄分布
|
|
|
+ if need_age and "age" in data:
|
|
|
+ summary_lines.append("【年龄分布】")
|
|
|
+ age_data = data["age"]
|
|
|
+ for item in age_data:
|
|
|
+ name = item.get("name", "")
|
|
|
+ ratio = item.get("ratio", 0)
|
|
|
+ tgi = item.get("tgi", 0)
|
|
|
+ summary_lines.append(f" {name}: {ratio:.1f}% (偏好度: {tgi:.2f})")
|
|
|
+ summary_lines.append("")
|
|
|
+
|
|
|
+ # 性别分布
|
|
|
+ if need_gender and "gender" in data:
|
|
|
+ summary_lines.append("【性别分布】")
|
|
|
+ gender_data = data["gender"]
|
|
|
+ for item in gender_data:
|
|
|
+ name = item.get("name", "")
|
|
|
+ ratio = item.get("ratio", 0)
|
|
|
+ tgi = item.get("tgi", 0)
|
|
|
+ summary_lines.append(f" {name}: {ratio:.1f}% (偏好度: {tgi:.2f})")
|
|
|
+ summary_lines.append("")
|
|
|
+
|
|
|
+ # 城市等级
|
|
|
+ if need_city_level and "city_level" in data:
|
|
|
+ summary_lines.append("【城市等级】")
|
|
|
+ city_level_data = data["city_level"]
|
|
|
+ for item in city_level_data:
|
|
|
+ name = item.get("name", "")
|
|
|
+ ratio = item.get("ratio", 0)
|
|
|
+ tgi = item.get("tgi", 0)
|
|
|
+ summary_lines.append(f" {name}: {ratio:.1f}% (偏好度: {tgi:.2f})")
|
|
|
+ summary_lines.append("")
|
|
|
+
|
|
|
+ # 省份分布 TOP5
|
|
|
+ if need_province and "province" in data:
|
|
|
+ summary_lines.append("【省份分布 TOP5】")
|
|
|
+ province_data = data["province"][:5]
|
|
|
+ for i, item in enumerate(province_data, 1):
|
|
|
+ name = item.get("name", "")
|
|
|
+ ratio = item.get("ratio", 0)
|
|
|
+ tgi = item.get("tgi", 0)
|
|
|
+ summary_lines.append(f" {i}. {name}: {ratio:.1f}% (偏好度: {tgi:.2f})")
|
|
|
+ summary_lines.append("")
|
|
|
+
|
|
|
return ToolResult(
|
|
|
- title=f"内容粉丝画像: {content_id}",
|
|
|
- output=json.dumps(data, ensure_ascii=False, indent=2),
|
|
|
+ title=f"内容点赞用户画像: {content_id}",
|
|
|
+ output="\n".join(summary_lines),
|
|
|
long_term_memory=f"Fetched fans portrait for content '{content_id}'",
|
|
|
+ metadata={"raw_data": data}
|
|
|
)
|
|
|
except httpx.HTTPStatusError as e:
|
|
|
return ToolResult(
|
|
|
- title="内容粉丝画像获取失败",
|
|
|
+ title="内容点赞用户画像获取失败",
|
|
|
output="",
|
|
|
error=f"HTTP error {e.response.status_code}: {e.response.text}",
|
|
|
)
|
|
|
except Exception as e:
|
|
|
return ToolResult(
|
|
|
- title="内容粉丝画像获取失败",
|
|
|
+ title="内容点赞用户画像获取失败",
|
|
|
output="",
|
|
|
error=str(e),
|
|
|
)
|