Skip to content

Commit d464053

Browse files
committed
Merge remote-tracking branch 'origin/develop' into xyc/dev_skills
# Conflicts: # frontend/hooks/agent/useSaveGuard.ts
2 parents 1797e39 + 7123349 commit d464053

File tree

10 files changed

+65
-44
lines changed

10 files changed

+65
-44
lines changed

README.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
[![Docker Pulls](https://img.shields.io/docker/pulls/nexent/nexent?logo=docker&label=DockerPull)](https://hub.docker.com/repositories/nexent)
88
[![Codecov (with branch)](https://img.shields.io/codecov/c/github/ModelEngine-Group/nexent/develop?logo=codecov&color=green)](https://codecov.io/gh/ModelEngine-Group/nexent)
99

10-
Nexent is a zero-code platform for auto-generating agents — no orchestration, no complex drag-and-drop required, using pure language to develop any agent you want. Built on the MCP ecosystem with rich tool integration, Nexent also provides various built-in agents to meet your intelligent service needs in different scenarios such as work, travel, and daily life. Nexent offers powerful capabilities for agent running control, multi-agent collaboration, data processing and knowledge tracing, multimodal dialogue, and batch scaling.
10+
Nexent is a zero-code platform for auto-generating production-grade AI agents, built on **Harness Engineering** principles. It provides unified tools, skills, memory, and orchestration with built-in constraints, feedback loops, and control planes — no orchestration, no complex drag-and-drop required, using pure language to develop any agent you want.
1111

1212
> One prompt. Endless reach.
1313
@@ -58,7 +58,7 @@ Most of all, we need visibility. Star ⭐ and watch the repo, share it with frie
5858

5959
## 💬 Community & contact
6060

61-
- Browse the [Documentation](https://modelengine-group.github.io/nexent) for more information.
61+
- Browse the [Documentation](https://modelengine-group.github.io/nexent) for more information.
6262
- Join our [Discord community](https://discord.gg/tb5H3S3wyv) to chat with other developers and get help!
6363
- Conntact us by Wechat, find our QR Code in our [website](https://nexent.tech/en/contact)
6464

@@ -119,5 +119,4 @@ Prefer to run Nexent from source code? Follow our [Developer Guide](https://mode
119119

120120
# 📄 License
121121

122-
Nexent is licensed under the [MIT](LICENSE) with additional conditions. Please read the [LICENSE](LICENSE) file for details.
123-
122+
Nexent is licensed under the [MIT License](LICENSE).

README_CN.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
[![Docker Pulls](https://img.shields.io/docker/pulls/nexent/nexent?logo=docker&label=DockerPull)](https://hub.docker.com/repositories/nexent)
88
[![Codecov (with branch)](https://img.shields.io/codecov/c/github/ModelEngine-Group/nexent/develop?logo=codecov&color=green)](https://codecov.io/gh/ModelEngine-Group/nexent)
99

10-
Nexent 是一个零代码智能体自动生成平台 —— 无需编排,无需复杂的拖拉拽操作,使用纯语言开发你想要的任何智能体。基于MCP生态,具备丰富的工具集成,同时提供多种自带智能体,满足你的工作、旅行、生活等不同场景的智能服务需要。Nexent 还提供强大的智能体运行控制、多智能体协作、数据处理和知识溯源、多模态对话、批量扩展能力
10+
Nexent 是一个基于 **Harness Engineering** 原则打造的零代码智能体自动生成平台。集统一工具、技能、记忆和编排能力于一体,内置约束机制、反馈循环和控制平面。无需编排,无需复杂的拖拉拽操作,使用纯语言开发你想要的任何智能体。
1111

1212
> 一个提示词,无限种可能。
1313
@@ -58,7 +58,7 @@ bash deploy.sh
5858

5959
## 💬 社区与联系方式
6060

61-
- 浏览 [文档](https://modelengine-group.github.io/nexent) 了解更多信息。
61+
- 浏览 [文档](https://modelengine-group.github.io/nexent) 了解更多信息。
6262
- 加入我们的 [Discord 社区](https://discord.gg/tb5H3S3wyv) 与其他开发者交流并获取帮助!
6363
- 通过微信联系我们,在我们的[网站](https://nexent.tech/zh/contact)找到二维码
6464

@@ -119,4 +119,4 @@ bash deploy.sh
119119

120120
# 📄 许可证
121121

122-
Nexent 采用 [MIT](LICENSE) 许可证,并附有额外条件。请阅读 [LICENSE](LICENSE) 文件了解详情
122+
Nexent 采用 [MIT 许可证](LICENSE)

doc/docs/.vitepress/config.mts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export default defineConfig({
66
base: (globalThis as any).process?.env?.GITHUB_PAGES ? "/nexent/" : "/",
77
title: "Nexent Doc",
88
description:
9-
"A zero-code platform for auto-generating agents no orchestration, no complex drag-and-drop required.",
9+
"A zero-code platform for auto-generating production-grade AI agents using Harness Engineering principles.",
1010

1111
// Add favicon to head
1212
head: [

doc/docs/en/getting-started/overview.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Nexent
22

3-
Nexent is a zero-code platform for auto-generating agents — no orchestration, no complex drag-and-drop required, using pure language to develop any agent you want. Built on the MCP ecosystem with rich tool integration, Nexent also provides various built-in agents to meet your intelligent service needs in different scenarios such as work, travel, and daily life. Nexent offers powerful capabilities for agent running control, multi-agent collaboration, data processing and knowledge tracing, multimodal dialogue, and batch scaling.
3+
Nexent is a zero-code platform for auto-generating production-grade AI agents, built on **Harness Engineering** principles. It provides unified tools, skills, memory, and orchestration with built-in constraints, feedback loops, and control planes — no orchestration, no complex drag-and-drop required, using pure language to develop any agent you want.
44

55
> One prompt. Endless reach.
66
@@ -80,5 +80,4 @@ Join our [Discord community](https://discord.gg/tb5H3S3wyv) to chat with other d
8080

8181
## 📄 License
8282

83-
Nexent is licensed under the [MIT](../license) with additional conditions. Please read the [LICENSE](../license) file for details.
84-
83+
Nexent is licensed under the [MIT License](../license).

doc/docs/zh/getting-started/overview.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Nexent
22

3-
Nexent 是一个零代码智能体自动生成平台 —— 无需编排,无需复杂的拖拉拽操作,使用纯语言开发你想要的任何智能体。基于MCP生态,具备丰富的工具集成,同时提供多种自带智能体,满足你的工作、旅行、生活等不同场景的智能服务需要。Nexent 还提供强大的智能体运行控制、多智能体协作、数据处理和知识溯源、多模态对话、批量扩展能力
3+
Nexent 是一个基于 **Harness Engineering** 原则打造的零代码智能体自动生成平台。集统一工具、技能、记忆和编排能力于一体,内置约束机制、反馈循环和控制平面。无需编排,无需复杂的拖拉拽操作,使用纯语言开发你想要的任何智能体。
44

55
> 一个提示词,无限种可能。
66
@@ -80,4 +80,4 @@ Nexent 采用现代化的分布式微服务架构,专为高性能、可扩展
8080

8181
## 📄 许可证
8282

83-
Nexent 采用 [MIT](../license) 许可证,并附有额外条件。请阅读 [LICENSE](../license) 文件了解详情
83+
Nexent 采用 [MIT 许可证](../license)

sdk/nexent/core/tools/datamate_search_tool.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def __init__(
8585
threshold: float = Field(
8686
description="Default similarity threshold for search results", default=0.2),
8787
kb_page: int = Field(
88-
description="Page index when listing knowledge bases from DataMate", default=0),
88+
description="Page index when listing knowledge bases from DataMate", default=1),
8989
kb_page_size: int = Field(
9090
description="Page size when listing knowledge bases from DataMate", default=20),
9191
):

sdk/nexent/core/tools/knowledge_base_search_tool.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class KnowledgeBaseSearchTool(Tool):
3636
"description_zh": "要执行的搜索查询词"
3737
},
3838
"index_names": {
39+
"type": "array",
3940
"description": "The list of index names to search",
4041
"description_zh": "要索引的知识库"
4142
},
@@ -97,9 +98,9 @@ def __init__(
9798
self.running_prompt_en = "Searching the knowledge base..."
9899

99100

100-
def forward(self, query: str, index_names: str) -> str:
101+
def forward(self, query: str, index_names: List[str]) -> str:
101102
# Parse index_names from string (always required)
102-
search_index_names = [name.strip() for name in index_names.split(",") if name.strip()]
103+
search_index_names = index_names
103104

104105
# Use the instance search_mode
105106
search_mode = self.search_mode

sdk/nexent/datamate/datamate_client.py

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -134,44 +134,65 @@ def _make_request(
134134

135135
def list_knowledge_bases(
136136
self,
137-
page: int = 0,
137+
page: int = 1,
138138
size: int = 20,
139139
authorization: Optional[str] = None
140140
) -> List[Dict[str, Any]]:
141141
"""
142-
Get list of knowledge bases from DataMate.
142+
Get list of all knowledge bases from DataMate by paginating through all pages.
143+
144+
Always starts from page 1, reads the total page count from the first response,
145+
then fetches all remaining pages and aggregates the results.
143146
144147
Args:
145-
page: Page index (default: 0)
146-
size: Page size (default: 20)
147-
authorization: Optional authorization header
148+
page: Ignored; pagination always starts from page 1 (kept for backward compat).
149+
size: Page size for each request (default: 20).
150+
authorization: Optional authorization header.
148151
149152
Returns:
150-
List of knowledge base dictionaries with their IDs and metadata.
153+
Aggregated list of all knowledge base dictionaries with their IDs and metadata.
151154
152155
Raises:
153-
RuntimeError: If the API request fails
156+
RuntimeError: If any API request fails.
154157
"""
155158
try:
156159
url = self._build_url("/api/knowledge-base/list")
157-
payload = {"page": page, "size": size}
158160
headers = self._build_headers(authorization)
159161

160-
logger.info(
161-
f"Fetching DataMate knowledge bases from: {url}, page={page}, size={size}")
162+
all_knowledge_bases: List[Dict[str, Any]] = []
162163

163-
response = self._make_request(
164-
"POST", url, headers, json=payload, error_message="Failed to get knowledge base list")
165-
data = response.json()
164+
# Always start from page 1 to get totalPages
165+
current_page = 1
166+
total_pages = 1
166167

167-
# Extract knowledge base list from response
168-
knowledge_bases = []
169-
if data.get("data"):
170-
knowledge_bases = data.get("data").get("content", [])
168+
while current_page <= total_pages:
169+
payload = {"page": current_page, "size": size}
170+
logger.info(
171+
f"Fetching DataMate knowledge bases from: {url}, page={current_page}, size={size}")
172+
173+
response = self._make_request(
174+
"POST", url, headers, json=payload,
175+
error_message="Failed to get knowledge base list")
176+
data = response.json()
177+
178+
page_content: List[Dict[str, Any]] = []
179+
if data.get("data"):
180+
page_content = data.get("data", {}).get("content", [])
181+
182+
# Read totalPages from the first page response only
183+
if current_page == 1:
184+
total_pages = data.get("data", {}).get("totalPages", 1)
185+
186+
all_knowledge_bases.extend(page_content)
187+
logger.info(
188+
f"Fetched page {current_page}/{total_pages} "
189+
f"({len(page_content)} items, cumulative: {len(all_knowledge_bases)})")
190+
current_page += 1
171191

172192
logger.info(
173-
f"Successfully fetched {len(knowledge_bases)} knowledge bases from DataMate")
174-
return knowledge_bases
193+
f"Successfully fetched {len(all_knowledge_bases)} knowledge bases from DataMate "
194+
f"across {total_pages} page(s)")
195+
return all_knowledge_bases
175196

176197
except httpx.HTTPError as e:
177198
logger.error(

test/sdk/core/tools/test_knowledge_base_search_tool.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -248,10 +248,10 @@ def test_forward_with_custom_index_names(self, knowledge_base_search_tool):
248248
mock_results = create_mock_search_result(2)
249249
knowledge_base_search_tool.vdb_core.hybrid_search.return_value = mock_results
250250

251-
# Pass index_names as parameter (comma-separated string)
252-
result = knowledge_base_search_tool.forward("test query", index_names="custom_index1,custom_index2")
251+
# Pass index_names as a list parameter (forward expects List[str])
252+
knowledge_base_search_tool.forward("test query", index_names=["custom_index1", "custom_index2"])
253253

254-
# Verify vdb_core was called with parsed index names
254+
# Verify vdb_core was called with the index names as-is
255255
knowledge_base_search_tool.vdb_core.hybrid_search.assert_called_once_with(
256256
index_names=["custom_index1", "custom_index2"],
257257
query_text="test query",
@@ -329,7 +329,8 @@ def test_forward_single_index_name(self, knowledge_base_search_tool):
329329
mock_results = create_mock_search_result(1)
330330
knowledge_base_search_tool.vdb_core.hybrid_search.return_value = mock_results
331331

332-
result = knowledge_base_search_tool.forward("test query", index_names="single_index")
332+
# Pass index_names as a list parameter (forward expects List[str])
333+
knowledge_base_search_tool.forward("test query", index_names=["single_index"])
333334

334335
# Verify vdb_core was called with single index
335336
knowledge_base_search_tool.vdb_core.hybrid_search.assert_called_once_with(
@@ -345,12 +346,12 @@ def test_forward_with_whitespace_in_index_names(self, knowledge_base_search_tool
345346
mock_results = create_mock_search_result(1)
346347
knowledge_base_search_tool.vdb_core.hybrid_search.return_value = mock_results
347348

348-
# Pass index_names with extra whitespace
349-
result = knowledge_base_search_tool.forward("test query", index_names=" index1 , index2 ")
349+
# Pass index_names as a list parameter (forward expects List[str])
350+
knowledge_base_search_tool.forward("test query", index_names=[" index1 ", " index2 "])
350351

351-
# Verify whitespace is stripped
352+
# Verify vdb_core was called with the index names as-is (no stripping performed)
352353
knowledge_base_search_tool.vdb_core.hybrid_search.assert_called_once_with(
353-
index_names=["index1", "index2"],
354+
index_names=[" index1 ", " index2 "],
354355
query_text="test query",
355356
embedding_model=knowledge_base_search_tool.embedding_model,
356357
top_k=5

test/sdk/datamate/test_datamate_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ def test_default_parameters(self, client: DataMateClient):
368368

369369
client._http_client.post.assert_called_once_with(
370370
"http://datamate.local:30000/api/knowledge-base/list",
371-
json={"page": 0, "size": 20},
371+
json={"page": 1, "size": 20},
372372
headers={},
373373
timeout=client.timeout,
374374
)

0 commit comments

Comments
 (0)