agentrun-inner-test 0.0.46__py3-none-any.whl → 0.0.56__py3-none-any.whl

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.
Files changed (43) hide show
  1. agentrun/__init__.py +1 -1
  2. agentrun/agent_runtime/api/control.py +1 -1
  3. agentrun/credential/api/control.py +1 -1
  4. agentrun/integration/agentscope/__init__.py +2 -1
  5. agentrun/integration/agentscope/builtin.py +23 -0
  6. agentrun/integration/builtin/__init__.py +2 -0
  7. agentrun/integration/builtin/knowledgebase.py +137 -0
  8. agentrun/integration/crewai/__init__.py +2 -1
  9. agentrun/integration/crewai/builtin.py +23 -0
  10. agentrun/integration/google_adk/__init__.py +2 -1
  11. agentrun/integration/google_adk/builtin.py +23 -0
  12. agentrun/integration/langchain/__init__.py +2 -1
  13. agentrun/integration/langchain/builtin.py +23 -0
  14. agentrun/integration/langgraph/__init__.py +2 -1
  15. agentrun/integration/langgraph/builtin.py +23 -0
  16. agentrun/integration/pydantic_ai/__init__.py +2 -1
  17. agentrun/integration/pydantic_ai/builtin.py +23 -0
  18. agentrun/knowledgebase/__client_async_template.py +173 -0
  19. agentrun/knowledgebase/__init__.py +53 -0
  20. agentrun/knowledgebase/__knowledgebase_async_template.py +438 -0
  21. agentrun/knowledgebase/api/__data_async_template.py +414 -0
  22. agentrun/knowledgebase/api/__init__.py +19 -0
  23. agentrun/knowledgebase/api/control.py +606 -0
  24. agentrun/knowledgebase/api/data.py +624 -0
  25. agentrun/knowledgebase/client.py +311 -0
  26. agentrun/knowledgebase/knowledgebase.py +748 -0
  27. agentrun/knowledgebase/model.py +270 -0
  28. agentrun/model/api/control.py +1 -1
  29. agentrun/sandbox/aio_sandbox.py +11 -4
  30. agentrun/sandbox/api/control.py +1 -1
  31. agentrun/sandbox/browser_sandbox.py +2 -2
  32. agentrun/sandbox/model.py +0 -13
  33. agentrun/toolset/api/control.py +1 -1
  34. agentrun/toolset/toolset.py +1 -0
  35. agentrun/utils/__data_api_async_template.py +1 -0
  36. agentrun/utils/config.py +12 -0
  37. agentrun/utils/control_api.py +27 -0
  38. agentrun/utils/data_api.py +1 -0
  39. {agentrun_inner_test-0.0.46.dist-info → agentrun_inner_test-0.0.56.dist-info}/METADATA +4 -2
  40. {agentrun_inner_test-0.0.46.dist-info → agentrun_inner_test-0.0.56.dist-info}/RECORD +43 -32
  41. {agentrun_inner_test-0.0.46.dist-info → agentrun_inner_test-0.0.56.dist-info}/WHEEL +0 -0
  42. {agentrun_inner_test-0.0.46.dist-info → agentrun_inner_test-0.0.56.dist-info}/licenses/LICENSE +0 -0
  43. {agentrun_inner_test-0.0.46.dist-info → agentrun_inner_test-0.0.56.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,53 @@
1
+ """KnowledgeBase 模块 / KnowledgeBase Module"""
2
+
3
+ from .api import (
4
+ BailianDataAPI,
5
+ get_data_api,
6
+ KnowledgeBaseControlAPI,
7
+ KnowledgeBaseDataAPI,
8
+ RagFlowDataAPI,
9
+ )
10
+ from .client import KnowledgeBaseClient
11
+ from .knowledgebase import KnowledgeBase
12
+ from .model import (
13
+ BailianProviderSettings,
14
+ BailianRetrieveSettings,
15
+ KnowledgeBaseCreateInput,
16
+ KnowledgeBaseListInput,
17
+ KnowledgeBaseListOutput,
18
+ KnowledgeBaseProvider,
19
+ KnowledgeBaseUpdateInput,
20
+ ProviderSettings,
21
+ RagFlowProviderSettings,
22
+ RagFlowRetrieveSettings,
23
+ RetrieveInput,
24
+ RetrieveSettings,
25
+ )
26
+
27
+ __all__ = [
28
+ # base
29
+ "KnowledgeBase",
30
+ "KnowledgeBaseClient",
31
+ "KnowledgeBaseControlAPI",
32
+ # data api
33
+ "KnowledgeBaseDataAPI",
34
+ "RagFlowDataAPI",
35
+ "BailianDataAPI",
36
+ "get_data_api",
37
+ # enums
38
+ "KnowledgeBaseProvider",
39
+ # provider settings
40
+ "ProviderSettings",
41
+ "RagFlowProviderSettings",
42
+ "BailianProviderSettings",
43
+ # retrieve settings
44
+ "RetrieveSettings",
45
+ "RagFlowRetrieveSettings",
46
+ "BailianRetrieveSettings",
47
+ # api model
48
+ "KnowledgeBaseCreateInput",
49
+ "KnowledgeBaseUpdateInput",
50
+ "KnowledgeBaseListInput",
51
+ "KnowledgeBaseListOutput",
52
+ "RetrieveInput",
53
+ ]
@@ -0,0 +1,438 @@
1
+ """KnowledgeBase 高层 API / KnowledgeBase High-Level API
2
+
3
+ 此模块定义知识库资源的高级API。
4
+ This module defines the high-level API for knowledge base resources.
5
+ """
6
+
7
+ import asyncio
8
+ from typing import Any, Dict, List, Optional
9
+
10
+ from agentrun.utils.config import Config
11
+ from agentrun.utils.log import logger
12
+ from agentrun.utils.model import PageableInput
13
+ from agentrun.utils.resource import ResourceBase
14
+
15
+ from .api.data import get_data_api
16
+ from .model import (
17
+ BailianProviderSettings,
18
+ BailianRetrieveSettings,
19
+ KnowledgeBaseCreateInput,
20
+ KnowledgeBaseImmutableProps,
21
+ KnowledgeBaseListInput,
22
+ KnowledgeBaseListOutput,
23
+ KnowledgeBaseMutableProps,
24
+ KnowledgeBaseProvider,
25
+ KnowledgeBaseSystemProps,
26
+ KnowledgeBaseUpdateInput,
27
+ RagFlowProviderSettings,
28
+ RagFlowRetrieveSettings,
29
+ RetrieveInput,
30
+ )
31
+
32
+
33
+ class KnowledgeBase(
34
+ KnowledgeBaseMutableProps,
35
+ KnowledgeBaseImmutableProps,
36
+ KnowledgeBaseSystemProps,
37
+ ResourceBase,
38
+ ):
39
+ """知识库资源 / KnowledgeBase Resource
40
+
41
+ 提供知识库的完整生命周期管理,包括创建、删除、更新、查询。
42
+ Provides complete lifecycle management for knowledge bases, including create, delete, update, and query.
43
+ """
44
+
45
+ @classmethod
46
+ def __get_client(cls):
47
+ """获取客户端实例 / Get client instance
48
+
49
+ Returns:
50
+ KnowledgeBaseClient: 客户端实例 / Client instance
51
+ """
52
+ from .client import KnowledgeBaseClient
53
+
54
+ return KnowledgeBaseClient()
55
+
56
+ @classmethod
57
+ async def create_async(
58
+ cls, input: KnowledgeBaseCreateInput, config: Optional[Config] = None
59
+ ):
60
+ """创建知识库(异步)/ Create knowledge base asynchronously
61
+
62
+ Args:
63
+ input: 知识库输入参数 / KnowledgeBase input parameters
64
+ config: 配置 / Configuration
65
+
66
+ Returns:
67
+ KnowledgeBase: 创建的知识库对象 / Created knowledge base object
68
+ """
69
+ return await cls.__get_client().create_async(input, config=config)
70
+
71
+ @classmethod
72
+ async def delete_by_name_async(
73
+ cls, knowledge_base_name: str, config: Optional[Config] = None
74
+ ):
75
+ """根据名称删除知识库(异步)/ Delete knowledge base by name asynchronously
76
+
77
+ Args:
78
+ knowledge_base_name: 知识库名称 / KnowledgeBase name
79
+ config: 配置 / Configuration
80
+ """
81
+ return await cls.__get_client().delete_async(
82
+ knowledge_base_name, config=config
83
+ )
84
+
85
+ @classmethod
86
+ async def update_by_name_async(
87
+ cls,
88
+ knowledge_base_name: str,
89
+ input: KnowledgeBaseUpdateInput,
90
+ config: Optional[Config] = None,
91
+ ):
92
+ """根据名称更新知识库(异步)/ Update knowledge base by name asynchronously
93
+
94
+ Args:
95
+ knowledge_base_name: 知识库名称 / KnowledgeBase name
96
+ input: 知识库更新输入参数 / KnowledgeBase update input parameters
97
+ config: 配置 / Configuration
98
+
99
+ Returns:
100
+ KnowledgeBase: 更新后的知识库对象 / Updated knowledge base object
101
+ """
102
+ return await cls.__get_client().update_async(
103
+ knowledge_base_name, input, config=config
104
+ )
105
+
106
+ @classmethod
107
+ async def get_by_name_async(
108
+ cls, knowledge_base_name: str, config: Optional[Config] = None
109
+ ):
110
+ """根据名称获取知识库(异步)/ Get knowledge base by name asynchronously
111
+
112
+ Args:
113
+ knowledge_base_name: 知识库名称 / KnowledgeBase name
114
+ config: 配置 / Configuration
115
+
116
+ Returns:
117
+ KnowledgeBase: 知识库对象 / KnowledgeBase object
118
+ """
119
+ return await cls.__get_client().get_async(
120
+ knowledge_base_name, config=config
121
+ )
122
+
123
+ @classmethod
124
+ async def _list_page_async(
125
+ cls, page_input: PageableInput, config: Config | None = None, **kwargs
126
+ ):
127
+ return await cls.__get_client().list_async(
128
+ input=KnowledgeBaseListInput(
129
+ **kwargs,
130
+ **page_input.model_dump(),
131
+ ),
132
+ config=config,
133
+ )
134
+
135
+ @classmethod
136
+ async def list_all_async(
137
+ cls,
138
+ *,
139
+ provider: Optional[str] = None,
140
+ config: Optional[Config] = None,
141
+ ) -> List[KnowledgeBaseListOutput]:
142
+ """列出所有知识库(异步)/ List all knowledge bases asynchronously
143
+
144
+ Args:
145
+ provider: 提供商 / Provider
146
+ config: 配置 / Configuration
147
+
148
+ Returns:
149
+ List[KnowledgeBaseListOutput]: 知识库列表 / KnowledgeBase list
150
+ """
151
+ return await cls._list_all_async(
152
+ lambda kb: kb.knowledge_base_id or "",
153
+ config=config,
154
+ provider=provider,
155
+ )
156
+
157
+ async def update_async(
158
+ self, input: KnowledgeBaseUpdateInput, config: Optional[Config] = None
159
+ ):
160
+ """更新知识库(异步)/ Update knowledge base asynchronously
161
+
162
+ Args:
163
+ input: 知识库更新输入参数 / KnowledgeBase update input parameters
164
+ config: 配置 / Configuration
165
+
166
+ Returns:
167
+ KnowledgeBase: 更新后的知识库对象 / Updated knowledge base object
168
+ """
169
+ if self.knowledge_base_name is None:
170
+ raise ValueError(
171
+ "knowledge_base_name is required to update a KnowledgeBase"
172
+ )
173
+
174
+ result = await self.update_by_name_async(
175
+ self.knowledge_base_name, input, config=config
176
+ )
177
+ self.update_self(result)
178
+
179
+ return self
180
+
181
+ async def delete_async(self, config: Optional[Config] = None):
182
+ """删除知识库(异步)/ Delete knowledge base asynchronously
183
+
184
+ Args:
185
+ config: 配置 / Configuration
186
+ """
187
+ if self.knowledge_base_name is None:
188
+ raise ValueError(
189
+ "knowledge_base_name is required to delete a KnowledgeBase"
190
+ )
191
+
192
+ return await self.delete_by_name_async(
193
+ self.knowledge_base_name, config=config
194
+ )
195
+
196
+ async def get_async(self, config: Optional[Config] = None):
197
+ """刷新知识库信息(异步)/ Refresh knowledge base info asynchronously
198
+
199
+ Args:
200
+ config: 配置 / Configuration
201
+
202
+ Returns:
203
+ KnowledgeBase: 刷新后的知识库对象 / Refreshed knowledge base object
204
+ """
205
+ if self.knowledge_base_name is None:
206
+ raise ValueError(
207
+ "knowledge_base_name is required to refresh a KnowledgeBase"
208
+ )
209
+
210
+ result = await self.get_by_name_async(
211
+ self.knowledge_base_name, config=config
212
+ )
213
+ self.update_self(result)
214
+
215
+ return self
216
+
217
+ async def refresh_async(self, config: Optional[Config] = None):
218
+ """刷新知识库信息(异步)/ Refresh knowledge base info asynchronously
219
+
220
+ Args:
221
+ config: 配置 / Configuration
222
+
223
+ Returns:
224
+ KnowledgeBase: 刷新后的知识库对象 / Refreshed knowledge base object
225
+ """
226
+ return await self.get_async(config=config)
227
+
228
+ # =========================================================================
229
+ # 数据链路方法 / Data API Methods
230
+ # =========================================================================
231
+
232
+ def _get_data_api(self, config: Optional[Config] = None):
233
+ """获取数据链路 API 实例 / Get data API instance
234
+
235
+ 根据当前知识库的 provider 类型返回对应的数据链路 API。
236
+ Returns the corresponding data API based on current knowledge base provider type.
237
+
238
+ Args:
239
+ config: 配置 / Configuration
240
+
241
+ Returns:
242
+ KnowledgeBaseDataAPI: 数据链路 API 实例 / Data API instance
243
+
244
+ Raises:
245
+ ValueError: 如果 provider 未设置 / If provider is not set
246
+ """
247
+ if self.provider is None:
248
+ raise ValueError("provider is required to get data API")
249
+
250
+ provider = (
251
+ self.provider
252
+ if isinstance(self.provider, KnowledgeBaseProvider)
253
+ else KnowledgeBaseProvider(self.provider)
254
+ )
255
+
256
+ # 转换 provider_settings 和 retrieve_settings 为正确的类型
257
+ # Convert provider_settings and retrieve_settings to correct types
258
+ converted_provider_settings = None
259
+ converted_retrieve_settings = None
260
+
261
+ if provider == KnowledgeBaseProvider.BAILIAN:
262
+ # 百炼设置 / Bailian settings
263
+ if self.provider_settings:
264
+ if isinstance(self.provider_settings, BailianProviderSettings):
265
+ converted_provider_settings = self.provider_settings
266
+ elif isinstance(self.provider_settings, dict):
267
+ converted_provider_settings = BailianProviderSettings(
268
+ **self.provider_settings
269
+ )
270
+
271
+ if self.retrieve_settings:
272
+ if isinstance(self.retrieve_settings, BailianRetrieveSettings):
273
+ converted_retrieve_settings = self.retrieve_settings
274
+ elif isinstance(self.retrieve_settings, dict):
275
+ converted_retrieve_settings = BailianRetrieveSettings(
276
+ **self.retrieve_settings
277
+ )
278
+
279
+ elif provider == KnowledgeBaseProvider.RAGFLOW:
280
+ # RagFlow 设置 / RagFlow settings
281
+ if self.provider_settings:
282
+ if isinstance(self.provider_settings, RagFlowProviderSettings):
283
+ converted_provider_settings = self.provider_settings
284
+ elif isinstance(self.provider_settings, dict):
285
+ converted_provider_settings = RagFlowProviderSettings(
286
+ **self.provider_settings
287
+ )
288
+
289
+ if self.retrieve_settings:
290
+ if isinstance(self.retrieve_settings, RagFlowRetrieveSettings):
291
+ converted_retrieve_settings = self.retrieve_settings
292
+ elif isinstance(self.retrieve_settings, dict):
293
+ converted_retrieve_settings = RagFlowRetrieveSettings(
294
+ **self.retrieve_settings
295
+ )
296
+
297
+ return get_data_api(
298
+ provider=provider,
299
+ knowledge_base_name=self.knowledge_base_name or "",
300
+ config=config,
301
+ provider_settings=converted_provider_settings,
302
+ retrieve_settings=converted_retrieve_settings,
303
+ credential_name=self.credential_name,
304
+ )
305
+
306
+ async def retrieve_async(
307
+ self,
308
+ query: str,
309
+ config: Optional[Config] = None,
310
+ ) -> Dict[str, Any]:
311
+ """检索知识库(异步)/ Retrieve from knowledge base asynchronously
312
+
313
+ 根据当前知识库的 provider 类型和配置执行检索。
314
+ Executes retrieval based on current knowledge base provider type and configuration.
315
+
316
+ Args:
317
+ query: 查询文本 / Query text
318
+ config: 配置 / Configuration
319
+
320
+ Returns:
321
+ Dict[str, Any]: 检索结果 / Retrieval results
322
+ """
323
+ data_api = self._get_data_api(config)
324
+ return await data_api.retrieve_async(query, config=config)
325
+
326
+ @classmethod
327
+ async def _safe_get_kb_async(
328
+ cls,
329
+ kb_name: str,
330
+ config: Optional[Config] = None,
331
+ ) -> Any:
332
+ """安全获取知识库(异步)/ Safely get knowledge base asynchronously
333
+
334
+ Args:
335
+ kb_name: 知识库名称 / Knowledge base name
336
+ config: 配置 / Configuration
337
+
338
+ Returns:
339
+ Any: 知识库对象或异常 / Knowledge base object or exception
340
+ """
341
+ try:
342
+ return await cls.get_by_name_async(kb_name, config=config)
343
+ except Exception as e:
344
+ return e
345
+
346
+ @classmethod
347
+ async def _safe_retrieve_kb_async(
348
+ cls,
349
+ kb_name: str,
350
+ kb_or_error: Any,
351
+ query: str,
352
+ config: Optional[Config] = None,
353
+ ) -> Dict[str, Any]:
354
+ """安全执行知识库检索(异步)/ Safely retrieve from knowledge base asynchronously
355
+
356
+ Args:
357
+ kb_name: 知识库名称 / Knowledge base name
358
+ kb_or_error: 知识库对象或异常 / Knowledge base object or exception
359
+ query: 查询文本 / Query text
360
+ config: 配置 / Configuration
361
+
362
+ Returns:
363
+ Dict[str, Any]: 检索结果 / Retrieval results
364
+ """
365
+ if isinstance(kb_or_error, Exception):
366
+ logger.warning(
367
+ f"Failed to get knowledge base '{kb_name}': {kb_or_error}"
368
+ )
369
+ return {
370
+ "data": f"Failed to retrieve: {kb_or_error}",
371
+ "query": query,
372
+ "knowledge_base_name": kb_name,
373
+ "error": True,
374
+ }
375
+ try:
376
+ return await kb_or_error.retrieve_async(query, config=config)
377
+ except Exception as e:
378
+ logger.warning(
379
+ f"Failed to retrieve from knowledge base '{kb_name}': {e}"
380
+ )
381
+ return {
382
+ "data": f"Failed to retrieve: {e}",
383
+ "query": query,
384
+ "knowledge_base_name": kb_name,
385
+ "error": True,
386
+ }
387
+
388
+ @classmethod
389
+ async def multi_retrieve_async(
390
+ cls,
391
+ query: str,
392
+ knowledge_base_names: List[str],
393
+ config: Optional[Config] = None,
394
+ ) -> Dict[str, Any]:
395
+ """多知识库检索(异步)/ Multi knowledge base retrieval asynchronously
396
+
397
+ 根据知识库名称列表进行检索,自动获取各知识库的配置并执行检索。
398
+ 如果某个知识库查询失败,不影响其他知识库的查询。
399
+ Retrieves from multiple knowledge bases by name list, automatically fetching
400
+ configuration for each knowledge base and executing retrieval.
401
+ If one knowledge base fails, it won't affect other knowledge bases.
402
+
403
+ Args:
404
+ query: 查询文本 / Query text
405
+ knowledge_base_names: 知识库名称列表 / List of knowledge base names
406
+ config: 配置 / Configuration
407
+
408
+ Returns:
409
+ Dict[str, Any]: 检索结果,按知识库名称分组 / Retrieval results grouped by knowledge base name
410
+ """
411
+ # 1. 根据 knowledge_base_names 并发获取各知识库配置(安全方式)
412
+ # Fetch all knowledge bases concurrently by name (safely)
413
+ knowledge_base_results = await asyncio.gather(*[
414
+ cls._safe_get_kb_async(name, config=config)
415
+ for name in knowledge_base_names
416
+ ])
417
+
418
+ # 2. 并发执行各知识库的检索(安全方式)
419
+ # Execute retrieval for each knowledge base concurrently (safely)
420
+ retrieve_results = await asyncio.gather(*[
421
+ cls._safe_retrieve_kb_async(
422
+ kb_name, kb_or_error, query, config=config
423
+ )
424
+ for kb_name, kb_or_error in zip(
425
+ knowledge_base_names, knowledge_base_results
426
+ )
427
+ ])
428
+
429
+ # 3. 合并返回结果,按知识库名称分组
430
+ # Merge results, grouped by knowledge base name
431
+ results: Dict[str, Any] = {}
432
+ for kb_name, result in zip(knowledge_base_names, retrieve_results):
433
+ results[kb_name] = result
434
+
435
+ return {
436
+ "results": results,
437
+ "query": query,
438
+ }