mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-04-22 13:49:45 +08:00

Signed-off-by: yihong0618 <zouzou0208@gmail.com> Signed-off-by: -LAN- <laipz8200@outlook.com> Signed-off-by: xhe <xw897002528@gmail.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: takatost <takatost@gmail.com> Co-authored-by: kurokobo <kuro664@gmail.com> Co-authored-by: Novice Lee <novicelee@NoviPro.local> Co-authored-by: zxhlyh <jasonapring2015@outlook.com> Co-authored-by: AkaraChen <akarachen@outlook.com> Co-authored-by: Yi <yxiaoisme@gmail.com> Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: JzoNg <jzongcode@gmail.com> Co-authored-by: twwu <twwu@dify.ai> Co-authored-by: Hiroshi Fujita <fujita-h@users.noreply.github.com> Co-authored-by: AkaraChen <85140972+AkaraChen@users.noreply.github.com> Co-authored-by: NFish <douxc512@gmail.com> Co-authored-by: Wu Tianwei <30284043+WTW0313@users.noreply.github.com> Co-authored-by: 非法操作 <hjlarry@163.com> Co-authored-by: Novice <857526207@qq.com> Co-authored-by: Hiroki Nagai <82458324+nagaihiroki-git@users.noreply.github.com> Co-authored-by: Gen Sato <52241300+halogen22@users.noreply.github.com> Co-authored-by: eux <euxuuu@gmail.com> Co-authored-by: huangzhuo1949 <167434202+huangzhuo1949@users.noreply.github.com> Co-authored-by: huangzhuo <huangzhuo1@xiaomi.com> Co-authored-by: lotsik <lotsik@mail.ru> Co-authored-by: crazywoola <100913391+crazywoola@users.noreply.github.com> Co-authored-by: nite-knite <nkCoding@gmail.com> Co-authored-by: Jyong <76649700+JohnJyong@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: gakkiyomi <gakkiyomi@aliyun.com> Co-authored-by: CN-P5 <heibai2006@gmail.com> Co-authored-by: CN-P5 <heibai2006@qq.com> Co-authored-by: Chuehnone <1897025+chuehnone@users.noreply.github.com> Co-authored-by: yihong <zouzou0208@gmail.com> Co-authored-by: Kevin9703 <51311316+Kevin9703@users.noreply.github.com> Co-authored-by: -LAN- <laipz8200@outlook.com> Co-authored-by: Boris Feld <lothiraldan@gmail.com> Co-authored-by: mbo <himabo@gmail.com> Co-authored-by: mabo <mabo@aeyes.ai> Co-authored-by: Warren Chen <warren.chen830@gmail.com> Co-authored-by: JzoNgKVO <27049666+JzoNgKVO@users.noreply.github.com> Co-authored-by: jiandanfeng <chenjh3@wangsu.com> Co-authored-by: zhu-an <70234959+xhdd123321@users.noreply.github.com> Co-authored-by: zhaoqingyu.1075 <zhaoqingyu.1075@bytedance.com> Co-authored-by: 海狸大師 <86974027+yenslife@users.noreply.github.com> Co-authored-by: Xu Song <xusong.vip@gmail.com> Co-authored-by: rayshaw001 <396301947@163.com> Co-authored-by: Ding Jiatong <dingjiatong@gmail.com> Co-authored-by: Bowen Liang <liangbowen@gf.com.cn> Co-authored-by: JasonVV <jasonwangiii@outlook.com> Co-authored-by: le0zh <newlight@qq.com> Co-authored-by: zhuxinliang <zhuxinliang@didiglobal.com> Co-authored-by: k-zaku <zaku99@outlook.jp> Co-authored-by: luckylhb90 <luckylhb90@gmail.com> Co-authored-by: hobo.l <hobo.l@binance.com> Co-authored-by: jiangbo721 <365065261@qq.com> Co-authored-by: 刘江波 <jiangbo721@163.com> Co-authored-by: Shun Miyazawa <34241526+miya@users.noreply.github.com> Co-authored-by: EricPan <30651140+Egfly@users.noreply.github.com> Co-authored-by: crazywoola <427733928@qq.com> Co-authored-by: sino <sino2322@gmail.com> Co-authored-by: Jhvcc <37662342+Jhvcc@users.noreply.github.com> Co-authored-by: lowell <lowell.hu@zkteco.in> Co-authored-by: Boris Polonsky <BorisPolonsky@users.noreply.github.com> Co-authored-by: Ademílson Tonato <ademilsonft@outlook.com> Co-authored-by: Ademílson Tonato <ademilson.tonato@refurbed.com> Co-authored-by: IWAI, Masaharu <iwaim.sub@gmail.com> Co-authored-by: Yueh-Po Peng (Yabi) <94939112+y10ab1@users.noreply.github.com> Co-authored-by: Jason <ggbbddjm@gmail.com> Co-authored-by: Xin Zhang <sjhpzx@gmail.com> Co-authored-by: yjc980121 <3898524+yjc980121@users.noreply.github.com> Co-authored-by: heyszt <36215648+hieheihei@users.noreply.github.com> Co-authored-by: Abdullah AlOsaimi <osaimiacc@gmail.com> Co-authored-by: Abdullah AlOsaimi <189027247+osaimi@users.noreply.github.com> Co-authored-by: Yingchun Lai <laiyingchun@apache.org> Co-authored-by: Hash Brown <hi@xzd.me> Co-authored-by: zuodongxu <192560071+zuodongxu@users.noreply.github.com> Co-authored-by: Masashi Tomooka <tmokmss@users.noreply.github.com> Co-authored-by: aplio <ryo.091219@gmail.com> Co-authored-by: Obada Khalili <54270856+obadakhalili@users.noreply.github.com> Co-authored-by: Nam Vu <zuzoovn@gmail.com> Co-authored-by: Kei YAMAZAKI <1715090+kei-yamazaki@users.noreply.github.com> Co-authored-by: TechnoHouse <13776377+deephbz@users.noreply.github.com> Co-authored-by: Riddhimaan-Senapati <114703025+Riddhimaan-Senapati@users.noreply.github.com> Co-authored-by: MaFee921 <31881301+2284730142@users.noreply.github.com> Co-authored-by: te-chan <t-nakanome@sakura-is.co.jp> Co-authored-by: HQidea <HQidea@users.noreply.github.com> Co-authored-by: Joshbly <36315710+Joshbly@users.noreply.github.com> Co-authored-by: xhe <xw897002528@gmail.com> Co-authored-by: weiwenyan-dev <154779315+weiwenyan-dev@users.noreply.github.com> Co-authored-by: ex_wenyan.wei <ex_wenyan.wei@tcl.com> Co-authored-by: engchina <12236799+engchina@users.noreply.github.com> Co-authored-by: engchina <atjapan2015@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: 呆萌闷油瓶 <253605712@qq.com> Co-authored-by: Kemal <kemalmeler@outlook.com> Co-authored-by: Lazy_Frog <4590648+lazyFrogLOL@users.noreply.github.com> Co-authored-by: Yi Xiao <54782454+YIXIAO0@users.noreply.github.com> Co-authored-by: Steven sun <98230804+Tuyohai@users.noreply.github.com> Co-authored-by: steven <sunzwj@digitalchina.com> Co-authored-by: Kalo Chin <91766386+fdb02983rhy@users.noreply.github.com> Co-authored-by: Katy Tao <34019945+KatyTao@users.noreply.github.com> Co-authored-by: depy <42985524+h4ckdepy@users.noreply.github.com> Co-authored-by: 胡春东 <gycm520@gmail.com> Co-authored-by: Junjie.M <118170653@qq.com> Co-authored-by: MuYu <mr.muzea@gmail.com> Co-authored-by: Naoki Takashima <39912547+takatea@users.noreply.github.com> Co-authored-by: Summer-Gu <37869445+gubinjie@users.noreply.github.com> Co-authored-by: Fei He <droxer.he@gmail.com> Co-authored-by: ybalbert001 <120714773+ybalbert001@users.noreply.github.com> Co-authored-by: Yuanbo Li <ybalbert@amazon.com> Co-authored-by: douxc <7553076+douxc@users.noreply.github.com> Co-authored-by: liuzhenghua <1090179900@qq.com> Co-authored-by: Wu Jiayang <62842862+Wu-Jiayang@users.noreply.github.com> Co-authored-by: Your Name <you@example.com> Co-authored-by: kimjion <45935338+kimjion@users.noreply.github.com> Co-authored-by: AugNSo <song.tiankai@icloud.com> Co-authored-by: llinvokerl <38915183+llinvokerl@users.noreply.github.com> Co-authored-by: liusurong.lsr <liusurong.lsr@alibaba-inc.com> Co-authored-by: Vasu Negi <vasu-negi@users.noreply.github.com> Co-authored-by: Hundredwz <1808096180@qq.com> Co-authored-by: Xiyuan Chen <52963600+GareArc@users.noreply.github.com>
177 lines
6.6 KiB
Python
177 lines
6.6 KiB
Python
import threading
|
|
from typing import Optional
|
|
|
|
import pytz
|
|
from flask_login import current_user # type: ignore
|
|
|
|
import contexts
|
|
from core.app.app_config.easy_ui_based_app.agent.manager import AgentConfigManager
|
|
from core.plugin.manager.agent import PluginAgentManager
|
|
from core.plugin.manager.exc import PluginDaemonClientSideError
|
|
from core.tools.tool_manager import ToolManager
|
|
from extensions.ext_database import db
|
|
from models.account import Account
|
|
from models.model import App, Conversation, EndUser, Message, MessageAgentThought
|
|
|
|
|
|
class AgentService:
|
|
@classmethod
|
|
def get_agent_logs(cls, app_model: App, conversation_id: str, message_id: str) -> dict:
|
|
"""
|
|
Service to get agent logs
|
|
"""
|
|
contexts.plugin_tool_providers.set({})
|
|
contexts.plugin_tool_providers_lock.set(threading.Lock())
|
|
|
|
conversation: Conversation | None = (
|
|
db.session.query(Conversation)
|
|
.filter(
|
|
Conversation.id == conversation_id,
|
|
Conversation.app_id == app_model.id,
|
|
)
|
|
.first()
|
|
)
|
|
|
|
if not conversation:
|
|
raise ValueError(f"Conversation not found: {conversation_id}")
|
|
|
|
message: Optional[Message] = (
|
|
db.session.query(Message)
|
|
.filter(
|
|
Message.id == message_id,
|
|
Message.conversation_id == conversation_id,
|
|
)
|
|
.first()
|
|
)
|
|
|
|
if not message:
|
|
raise ValueError(f"Message not found: {message_id}")
|
|
|
|
agent_thoughts: list[MessageAgentThought] = message.agent_thoughts
|
|
|
|
if conversation.from_end_user_id:
|
|
# only select name field
|
|
executor = (
|
|
db.session.query(EndUser, EndUser.name).filter(EndUser.id == conversation.from_end_user_id).first()
|
|
)
|
|
else:
|
|
executor = (
|
|
db.session.query(Account, Account.name).filter(Account.id == conversation.from_account_id).first()
|
|
)
|
|
|
|
if executor:
|
|
executor = executor.name
|
|
else:
|
|
executor = "Unknown"
|
|
|
|
timezone = pytz.timezone(current_user.timezone)
|
|
|
|
app_model_config = app_model.app_model_config
|
|
if not app_model_config:
|
|
raise ValueError("App model config not found")
|
|
|
|
result = {
|
|
"meta": {
|
|
"status": "success",
|
|
"executor": executor,
|
|
"start_time": message.created_at.astimezone(timezone).isoformat(),
|
|
"elapsed_time": message.provider_response_latency,
|
|
"total_tokens": message.answer_tokens + message.message_tokens,
|
|
"agent_mode": app_model_config.agent_mode_dict.get("strategy", "react"),
|
|
"iterations": len(agent_thoughts),
|
|
},
|
|
"iterations": [],
|
|
"files": message.message_files,
|
|
}
|
|
|
|
agent_config = AgentConfigManager.convert(app_model_config.to_dict())
|
|
if not agent_config:
|
|
raise ValueError("Agent config not found")
|
|
|
|
agent_tools = agent_config.tools or []
|
|
|
|
def find_agent_tool(tool_name: str):
|
|
for agent_tool in agent_tools:
|
|
if agent_tool.tool_name == tool_name:
|
|
return agent_tool
|
|
|
|
for agent_thought in agent_thoughts:
|
|
tools = agent_thought.tools
|
|
tool_labels = agent_thought.tool_labels
|
|
tool_meta = agent_thought.tool_meta
|
|
tool_inputs = agent_thought.tool_inputs_dict
|
|
tool_outputs = agent_thought.tool_outputs_dict or {}
|
|
tool_calls = []
|
|
for tool in tools:
|
|
tool_name = tool
|
|
tool_label = tool_labels.get(tool_name, tool_name)
|
|
tool_input = tool_inputs.get(tool_name, {})
|
|
tool_output = tool_outputs.get(tool_name, {})
|
|
tool_meta_data = tool_meta.get(tool_name, {})
|
|
tool_config = tool_meta_data.get("tool_config", {})
|
|
if tool_config.get("tool_provider_type", "") != "dataset-retrieval":
|
|
tool_icon = ToolManager.get_tool_icon(
|
|
tenant_id=app_model.tenant_id,
|
|
provider_type=tool_config.get("tool_provider_type", ""),
|
|
provider_id=tool_config.get("tool_provider", ""),
|
|
)
|
|
if not tool_icon:
|
|
tool_entity = find_agent_tool(tool_name)
|
|
if tool_entity:
|
|
tool_icon = ToolManager.get_tool_icon(
|
|
tenant_id=app_model.tenant_id,
|
|
provider_type=tool_entity.provider_type,
|
|
provider_id=tool_entity.provider_id,
|
|
)
|
|
else:
|
|
tool_icon = ""
|
|
|
|
tool_calls.append(
|
|
{
|
|
"status": "success" if not tool_meta_data.get("error") else "error",
|
|
"error": tool_meta_data.get("error"),
|
|
"time_cost": tool_meta_data.get("time_cost", 0),
|
|
"tool_name": tool_name,
|
|
"tool_label": tool_label,
|
|
"tool_input": tool_input,
|
|
"tool_output": tool_output,
|
|
"tool_parameters": tool_meta_data.get("tool_parameters", {}),
|
|
"tool_icon": tool_icon,
|
|
}
|
|
)
|
|
|
|
result["iterations"].append(
|
|
{
|
|
"tokens": agent_thought.tokens,
|
|
"tool_calls": tool_calls,
|
|
"tool_raw": {
|
|
"inputs": agent_thought.tool_input,
|
|
"outputs": agent_thought.observation,
|
|
},
|
|
"thought": agent_thought.thought,
|
|
"created_at": agent_thought.created_at.isoformat(),
|
|
"files": agent_thought.files,
|
|
}
|
|
)
|
|
|
|
return result
|
|
|
|
@classmethod
|
|
def list_agent_providers(cls, user_id: str, tenant_id: str):
|
|
"""
|
|
List agent providers
|
|
"""
|
|
manager = PluginAgentManager()
|
|
return manager.fetch_agent_strategy_providers(tenant_id)
|
|
|
|
@classmethod
|
|
def get_agent_provider(cls, user_id: str, tenant_id: str, provider_name: str):
|
|
"""
|
|
Get agent provider
|
|
"""
|
|
manager = PluginAgentManager()
|
|
try:
|
|
return manager.fetch_agent_strategy_provider(tenant_id, provider_name)
|
|
except PluginDaemonClientSideError as e:
|
|
raise ValueError(str(e)) from e
|