feat: 接入langfuse

This commit is contained in:
2026-09-27 17:42:14 +08:00
parent 576791fd4e
commit fb98a10b4c
6 changed files with 354 additions and 35 deletions
+21 -4
View File
@@ -23,20 +23,25 @@ from app.processor.state import QueryState
def route_after_intent(state: QueryState) -> str:
# 按最终意图分流:问答进入 QA,意图不明进入澄清,新建或修改进入需求理解
return state["intent"]
def route_after_requirement(state: QueryState) -> bool:
# True 进入澄清,False 进入修改范围判断
return state["requirement"].needs_clarification
def route_after_wait(state: QueryState) -> str:
# 用户补充后回到输入节点合并上下文,取消则结束流程
return "input_node" if state["status"] == "running" else END
def route_after_scope(state: QueryState) -> str:
# 需要规划时先获取组件能力,供规划节点选择可用组件
if state["change_scope"].needs_planning:
return "component_resource_node"
# 已支持的简单修改直接生成动作,尚不支持的需求暂时结束流程
return "action_node" if can_generate_actions(state) else END
@@ -208,6 +213,7 @@ if __name__ == "__main__":
from pydantic import BaseModel
from app.clients.decision import close_decision_engine
from app.observability.tracing import ainvoke_screen, flush_tracing
async def main():
# 1. 修改请求,测试完整流程
@@ -230,10 +236,17 @@ if __name__ == "__main__":
"context": {"selected_node_ids": ["sales-chart"]},
}
}
# 2. 执行图,程序退出时关闭共享连接
config = {"configurable": {"thread_id": str(uuid4())}}
thread_id = str(uuid4())
session_id = (
state["request"].get("context", {}).get("conversation_id") or thread_id
)
try:
final_state = await query_app.ainvoke(state, config=config)
final_state = await ainvoke_screen(
query_app, state, thread_id=thread_id, session_id=session_id
)
while final_state.get("__interrupt__"):
pending = final_state["__interrupt__"][0].value
print(pending["question"])
@@ -252,11 +265,15 @@ if __name__ == "__main__":
notes = input("补充说明(可留空):").strip()
if notes:
reply["answer"] = notes
final_state = await query_app.ainvoke(
Command(resume=reply), config=config
final_state = await ainvoke_screen(
query_app,
Command(resume=reply),
thread_id=thread_id,
session_id=session_id,
)
finally:
await close_decision_engine()
flush_tracing()
# 3. 打印完整 state
print(
+4 -2
View File
@@ -46,6 +46,7 @@ if __name__ == "__main__":
from pydantic import BaseModel
from app.clients.decision import close_decision_engine
from app.observability.tracing import ainvoke_screen, flush_tracing
from app.processor.graph import query_app
async def main():
@@ -57,11 +58,12 @@ if __name__ == "__main__":
}
}
try:
final_state = await query_app.ainvoke(
state, config={"configurable": {"thread_id": "clarify-test"}}
final_state = await ainvoke_screen(
query_app, state, thread_id="clarify-test"
)
finally:
await close_decision_engine()
flush_tracing()
print(
json.dumps(
{