agstack 1.19.0__tar.gz → 1.21.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agstack-1.19.0 → agstack-1.21.0}/PKG-INFO +1 -1
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/agent.py +29 -1
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/tool.py +15 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack.egg-info/PKG-INFO +1 -1
- {agstack-1.19.0 → agstack-1.21.0}/pyproject.toml +1 -1
- {agstack-1.19.0 → agstack-1.21.0}/LICENSE +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/README.md +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/__init__.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/cache/__init__.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/cache/base.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/cache/memory.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/cache/redis.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/config/__init__.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/config/logger.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/config/manager.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/config/types.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/contexts.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/decorators.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/events.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/exceptions.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/fastapi/__init__.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/fastapi/exception.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/fastapi/middleware.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/fastapi/offline.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/fastapi/sse.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/infra/db/__init__.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/infra/es/__init__.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/infra/kg/__init__.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/infra/mq/__init__.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/__init__.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/client.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/__init__.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/context.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/event.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/exceptions.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/factory.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/flow.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/loader.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/nodes/__init__.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/nodes/agent_node.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/nodes/base.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/nodes/detect_node.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/nodes/echo_node.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/nodes/llm_chat_node.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/nodes/llm_embed_node.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/nodes/llm_rerank_node.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/nodes/python_node.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/nodes/subflow_node.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/nodes/switch_node.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/nodes/tool_node.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/records.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/registry.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/sandbox.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/state.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/flow/trace.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/prompts.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/llm/token.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/messagebus/__init__.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/messagebus/base.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/messagebus/memory.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/messagebus/redis.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/schema.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/security/__init__.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/security/casbin.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/security/crypt.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack/status.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack.egg-info/SOURCES.txt +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack.egg-info/dependency_links.txt +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack.egg-info/requires.txt +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/agstack.egg-info/top_level.txt +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/setup.cfg +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/tests/test_cache_memory.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/tests/test_cache_redis.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/tests/test_flow_io.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/tests/test_flow_switch_subflow.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/tests/test_messagebus_memory.py +0 -0
- {agstack-1.19.0 → agstack-1.21.0}/tests/test_messagebus_redis.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agstack
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.21.0
|
|
4
4
|
Summary: Production-ready toolkit for building FastAPI and LLM applications
|
|
5
5
|
Author-email: XtraVisions <gitadmin@xtravisions.com>, Chen Hao <chenhao@xtravisions.com>
|
|
6
6
|
Maintainer-email: XtraVisions <gitadmin@xtravisions.com>, Chen Hao <chenhao@xtravisions.com>
|
|
@@ -261,14 +261,42 @@ class Agent:
|
|
|
261
261
|
except json.JSONDecodeError:
|
|
262
262
|
tool_args = {}
|
|
263
263
|
|
|
264
|
+
# 执行前进度事件
|
|
265
|
+
progress_label = tool.get_progress_label(tool_args)
|
|
266
|
+
if progress_label:
|
|
267
|
+
yield event.custom(
|
|
268
|
+
name="skill_progress",
|
|
269
|
+
value={
|
|
270
|
+
"progressId": tool_call["id"],
|
|
271
|
+
"description": progress_label,
|
|
272
|
+
"status": "running",
|
|
273
|
+
},
|
|
274
|
+
)
|
|
275
|
+
|
|
264
276
|
# 执行工具(传入 LLM 解析的参数作为 inputs)
|
|
265
277
|
result = await tool.execute_async(context, tool_args)
|
|
266
278
|
|
|
279
|
+
# 执行后进度事件
|
|
280
|
+
if progress_label:
|
|
281
|
+
yield event.custom(
|
|
282
|
+
name="skill_progress",
|
|
283
|
+
value={
|
|
284
|
+
"progressId": tool_call["id"],
|
|
285
|
+
"status": "completed" if result.success else "failed",
|
|
286
|
+
},
|
|
287
|
+
)
|
|
288
|
+
|
|
267
289
|
# 使用 result.content 作为 LLM 上下文(Tool 已计算好)
|
|
268
290
|
result_content = result.content or (
|
|
269
291
|
json.dumps(result.result) if result.success else json.dumps({"error": result.error})
|
|
270
292
|
)
|
|
271
|
-
context.add_message(
|
|
293
|
+
context.add_message(
|
|
294
|
+
self.name,
|
|
295
|
+
"tool",
|
|
296
|
+
content=result_content,
|
|
297
|
+
tool_call_id=tool_call["id"],
|
|
298
|
+
summary=result.summary,
|
|
299
|
+
)
|
|
272
300
|
|
|
273
301
|
# AG-UI: TOOL_CALL_RESULT
|
|
274
302
|
yield event.tool_call_result(tool_call_id=tool_call["id"], content=result_content)
|
|
@@ -43,6 +43,7 @@ class Tool:
|
|
|
43
43
|
category: str | None = None,
|
|
44
44
|
summary_fn: Callable[["ToolResult"], str | None] | None = None,
|
|
45
45
|
result_formatter: Callable[["ToolResult"], str] | None = None,
|
|
46
|
+
progress_label_fn: Callable[[dict[str, Any]], str] | None = None,
|
|
46
47
|
):
|
|
47
48
|
"""初始化工具
|
|
48
49
|
|
|
@@ -55,6 +56,7 @@ class Tool:
|
|
|
55
56
|
:param category: 工具分类(retrieval / analysis / action / utility)
|
|
56
57
|
:param summary_fn: 生成面向用户摘要的函数 (ToolResult) -> str | None
|
|
57
58
|
:param result_formatter: 自定义 LLM 内容格式化函数 (ToolResult) -> str
|
|
59
|
+
:param progress_label_fn: 基于调用参数生成动态进度描述 (args) -> str
|
|
58
60
|
"""
|
|
59
61
|
self.name = name
|
|
60
62
|
self.description = description
|
|
@@ -65,6 +67,19 @@ class Tool:
|
|
|
65
67
|
self.category = category
|
|
66
68
|
self.summary_fn = summary_fn
|
|
67
69
|
self.result_formatter = result_formatter
|
|
70
|
+
self.progress_label_fn = progress_label_fn
|
|
71
|
+
|
|
72
|
+
def get_progress_label(self, args: dict[str, Any]) -> str | None:
|
|
73
|
+
"""基于调用参数生成面向用户的动态进度描述
|
|
74
|
+
|
|
75
|
+
返回 None 时不发送进度事件。
|
|
76
|
+
"""
|
|
77
|
+
if self.progress_label_fn:
|
|
78
|
+
try:
|
|
79
|
+
return self.progress_label_fn(args)
|
|
80
|
+
except Exception:
|
|
81
|
+
pass
|
|
82
|
+
return self.label
|
|
68
83
|
|
|
69
84
|
async def execute_async(self, context: "FlowContext", inputs: dict[str, Any] | None = None) -> ToolResult:
|
|
70
85
|
"""异步执行工具(包含计时、摘要生成、结果格式化、可观测性记录)"""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agstack
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.21.0
|
|
4
4
|
Summary: Production-ready toolkit for building FastAPI and LLM applications
|
|
5
5
|
Author-email: XtraVisions <gitadmin@xtravisions.com>, Chen Hao <chenhao@xtravisions.com>
|
|
6
6
|
Maintainer-email: XtraVisions <gitadmin@xtravisions.com>, Chen Hao <chenhao@xtravisions.com>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|