#!/usr/bin/env python3 # -*- coding: utf-8 -*- """拉取 Langfuse public observations:检查 getServerStatus span 的关键字段。""" from __future__ import annotations import json import sys import time from typing import Any import _bootstrap # noqa: F401 import _config as C from dify_api import Dify def lf_public_get(d: Dify, path: str) -> Any: # 使用 Langfuse web 可达的地址(本机 curl) url = path if path.startswith("http") else C.LANGFUSE_URL.rstrip("/") + path out, err = d.sh( "curl -s -m 20 -u '%s:%s' '%s'" % (C.LANGFUSE_PK, C.LANGFUSE_SK, url) ) if err and not out: raise RuntimeError("curl failed: %s" % err) return json.loads(out) def main() -> int: trace_id = ( sys.argv[1] if len(sys.argv) >= 2 else "cd30cf8f-0003-4355-a70e-8deb144778e2" ) tool_name = sys.argv[2] if len(sys.argv) >= 3 else "getServerStatus" d = Dify(C.DIFY_EMAIL, C.DIFY_PASSWORD) try: d.login() # observations endpoint:返回 generation/tool span 等 items = [] for _ in range(6): obs = lf_public_get(d, "/api/public/observations?traceId=%s" % trace_id) items = obs.get("data") or [] if items: break time.sleep(2) tool_items = [it for it in items if (it.get("name") == tool_name)] print("traceId:", trace_id) print("observations:", len(items)) print("tool_items:", len(tool_items)) if not tool_items: # 给出前几个 observation 用于对照 print("sample observations (name/type/id):") for it in items[:8]: print(" -", it.get("type"), it.get("name"), it.get("id")) return 1 # 输出第一条的完整字段(但做截断) it = tool_items[0] keys = sorted(it.keys()) print("tool keys:", keys) print("\n--- tool observation json (truncated) ---") s = json.dumps(it, ensure_ascii=False, indent=2) print(s[:18000]) return 0 finally: d.close() if __name__ == "__main__": sys.exit(main())