agentrun-inner-test 0.0.46__py3-none-any.whl → 0.0.64__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 (53) hide show
  1. agentrun/__init__.py +34 -1
  2. agentrun/agent_runtime/__endpoint_async_template.py +40 -0
  3. agentrun/agent_runtime/api/control.py +1 -1
  4. agentrun/agent_runtime/endpoint.py +79 -0
  5. agentrun/credential/api/control.py +1 -1
  6. agentrun/integration/agentscope/__init__.py +2 -1
  7. agentrun/integration/agentscope/builtin.py +23 -0
  8. agentrun/integration/builtin/__init__.py +2 -0
  9. agentrun/integration/builtin/knowledgebase.py +137 -0
  10. agentrun/integration/crewai/__init__.py +2 -1
  11. agentrun/integration/crewai/builtin.py +23 -0
  12. agentrun/integration/google_adk/__init__.py +2 -1
  13. agentrun/integration/google_adk/builtin.py +23 -0
  14. agentrun/integration/langchain/__init__.py +2 -1
  15. agentrun/integration/langchain/builtin.py +23 -0
  16. agentrun/integration/langgraph/__init__.py +2 -1
  17. agentrun/integration/langgraph/builtin.py +23 -0
  18. agentrun/integration/pydantic_ai/__init__.py +2 -1
  19. agentrun/integration/pydantic_ai/builtin.py +23 -0
  20. agentrun/knowledgebase/__client_async_template.py +173 -0
  21. agentrun/knowledgebase/__init__.py +53 -0
  22. agentrun/knowledgebase/__knowledgebase_async_template.py +438 -0
  23. agentrun/knowledgebase/api/__data_async_template.py +414 -0
  24. agentrun/knowledgebase/api/__init__.py +19 -0
  25. agentrun/knowledgebase/api/control.py +606 -0
  26. agentrun/knowledgebase/api/data.py +624 -0
  27. agentrun/knowledgebase/client.py +311 -0
  28. agentrun/knowledgebase/knowledgebase.py +748 -0
  29. agentrun/knowledgebase/model.py +270 -0
  30. agentrun/memory_collection/__client_async_template.py +178 -0
  31. agentrun/memory_collection/__init__.py +37 -0
  32. agentrun/memory_collection/__memory_collection_async_template.py +457 -0
  33. agentrun/memory_collection/api/__init__.py +5 -0
  34. agentrun/memory_collection/api/control.py +610 -0
  35. agentrun/memory_collection/client.py +323 -0
  36. agentrun/memory_collection/memory_collection.py +844 -0
  37. agentrun/memory_collection/model.py +162 -0
  38. agentrun/model/api/control.py +1 -1
  39. agentrun/sandbox/aio_sandbox.py +11 -4
  40. agentrun/sandbox/api/control.py +1 -1
  41. agentrun/sandbox/browser_sandbox.py +2 -2
  42. agentrun/sandbox/model.py +0 -13
  43. agentrun/toolset/api/control.py +1 -1
  44. agentrun/toolset/toolset.py +1 -0
  45. agentrun/utils/__data_api_async_template.py +1 -0
  46. agentrun/utils/config.py +12 -0
  47. agentrun/utils/control_api.py +27 -0
  48. agentrun/utils/data_api.py +1 -0
  49. {agentrun_inner_test-0.0.46.dist-info → agentrun_inner_test-0.0.64.dist-info}/METADATA +4 -2
  50. {agentrun_inner_test-0.0.46.dist-info → agentrun_inner_test-0.0.64.dist-info}/RECORD +53 -34
  51. {agentrun_inner_test-0.0.46.dist-info → agentrun_inner_test-0.0.64.dist-info}/WHEEL +0 -0
  52. {agentrun_inner_test-0.0.46.dist-info → agentrun_inner_test-0.0.64.dist-info}/licenses/LICENSE +0 -0
  53. {agentrun_inner_test-0.0.46.dist-info → agentrun_inner_test-0.0.64.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,414 @@
1
+ """KnowledgeBase 数据链路 API / KnowledgeBase Data API
2
+
3
+ 提供知识库检索功能的数据链路 API。
4
+ Provides data API for knowledge base retrieval operations.
5
+
6
+ 根据不同的 provider 类型(ragflow / bailian)分发到不同的实现。
7
+ Dispatches to different implementations based on provider type (ragflow / bailian).
8
+ """
9
+
10
+ from abc import ABC, abstractmethod
11
+ from typing import Any, Dict, List, Optional, Union
12
+
13
+ from alibabacloud_bailian20231229 import models as bailian_models
14
+ import httpx
15
+
16
+ from agentrun.utils.config import Config
17
+ from agentrun.utils.control_api import ControlAPI
18
+ from agentrun.utils.data_api import DataAPI, ResourceType
19
+ from agentrun.utils.log import logger
20
+
21
+ from ..model import (
22
+ BailianProviderSettings,
23
+ BailianRetrieveSettings,
24
+ KnowledgeBaseProvider,
25
+ RagFlowProviderSettings,
26
+ RagFlowRetrieveSettings,
27
+ )
28
+
29
+
30
+ class KnowledgeBaseDataAPI(ABC):
31
+ """知识库数据链路 API 基类 / KnowledgeBase Data API Base Class
32
+
33
+ 定义知识库检索的抽象接口,由具体的 provider 实现。
34
+ Defines abstract interface for knowledge base retrieval, implemented by specific providers.
35
+ """
36
+
37
+ def __init__(
38
+ self,
39
+ knowledge_base_name: str,
40
+ config: Optional[Config] = None,
41
+ ):
42
+ """初始化知识库数据链路 API / Initialize KnowledgeBase Data API
43
+
44
+ Args:
45
+ knowledge_base_name: 知识库名称 / Knowledge base name
46
+ config: 配置 / Configuration
47
+ """
48
+ self.knowledge_base_name = knowledge_base_name
49
+ self.config = Config.with_configs(config)
50
+
51
+ @abstractmethod
52
+ async def retrieve_async(
53
+ self,
54
+ query: str,
55
+ config: Optional[Config] = None,
56
+ ) -> Dict[str, Any]:
57
+ """检索知识库(异步)/ Retrieve from knowledge base (async)
58
+
59
+ Args:
60
+ query: 查询文本 / Query text
61
+ config: 配置 / Configuration
62
+
63
+ Returns:
64
+ Dict[str, Any]: 检索结果 / Retrieval results
65
+ """
66
+ raise NotImplementedError("Subclasses must implement retrieve_async")
67
+
68
+
69
+ class RagFlowDataAPI(KnowledgeBaseDataAPI):
70
+ """RagFlow 知识库数据链路 API / RagFlow KnowledgeBase Data API
71
+
72
+ 实现 RagFlow 知识库的检索逻辑。
73
+ Implements retrieval logic for RagFlow knowledge base.
74
+ """
75
+
76
+ def __init__(
77
+ self,
78
+ knowledge_base_name: str,
79
+ config: Optional[Config] = None,
80
+ provider_settings: Optional[RagFlowProviderSettings] = None,
81
+ retrieve_settings: Optional[RagFlowRetrieveSettings] = None,
82
+ credential_name: Optional[str] = None,
83
+ ):
84
+ """初始化 RagFlow 知识库数据链路 API / Initialize RagFlow KnowledgeBase Data API
85
+
86
+ Args:
87
+ knowledge_base_name: 知识库名称 / Knowledge base name
88
+ config: 配置 / Configuration
89
+ provider_settings: RagFlow 提供商设置 / RagFlow provider settings
90
+ retrieve_settings: RagFlow 检索设置 / RagFlow retrieve settings
91
+ credential_name: 凭证名称 / Credential name
92
+ """
93
+ super().__init__(knowledge_base_name, config)
94
+ self.provider_settings = provider_settings
95
+ self.retrieve_settings = retrieve_settings
96
+ self.credential_name = credential_name
97
+
98
+ async def _get_api_key_async(self, config: Optional[Config] = None) -> str:
99
+ """获取 API Key(异步)/ Get API Key (async)
100
+
101
+ Args:
102
+ config: 配置 / Configuration
103
+
104
+ Returns:
105
+ str: API Key
106
+
107
+ Raises:
108
+ ValueError: 凭证名称未设置或凭证不存在 / Credential name not set or credential not found
109
+ """
110
+ if not self.credential_name:
111
+ raise ValueError(
112
+ "credential_name is required for RagFlow retrieval"
113
+ )
114
+
115
+ from agentrun.credential import Credential
116
+
117
+ credential = await Credential.get_by_name_async(
118
+ self.credential_name, config=config
119
+ )
120
+ if not credential.credential_secret:
121
+ raise ValueError(
122
+ f"Credential '{self.credential_name}' has no secret configured"
123
+ )
124
+ return credential.credential_secret
125
+
126
+ def _build_request_body(self, query: str) -> Dict[str, Any]:
127
+ """构建请求体 / Build request body
128
+
129
+ Args:
130
+ query: 查询文本 / Query text
131
+
132
+ Returns:
133
+ Dict[str, Any]: 请求体 / Request body
134
+ """
135
+ if self.provider_settings is None:
136
+ raise ValueError(
137
+ "provider_settings is required for RagFlow retrieval"
138
+ )
139
+
140
+ body: Dict[str, Any] = {
141
+ "question": query,
142
+ "dataset_ids": self.provider_settings.dataset_ids,
143
+ "page": 1,
144
+ "page_size": 30,
145
+ }
146
+
147
+ # 添加检索设置 / Add retrieve settings
148
+ if self.retrieve_settings:
149
+ if self.retrieve_settings.similarity_threshold is not None:
150
+ body["similarity_threshold"] = (
151
+ self.retrieve_settings.similarity_threshold
152
+ )
153
+ if self.retrieve_settings.vector_similarity_weight is not None:
154
+ body["vector_similarity_weight"] = (
155
+ self.retrieve_settings.vector_similarity_weight
156
+ )
157
+ if self.retrieve_settings.cross_languages is not None:
158
+ body["cross_languages"] = self.retrieve_settings.cross_languages
159
+
160
+ return body
161
+
162
+ async def retrieve_async(
163
+ self,
164
+ query: str,
165
+ config: Optional[Config] = None,
166
+ ) -> Dict[str, Any]:
167
+ """RagFlow 检索(异步)/ RagFlow retrieval (async)
168
+
169
+ Args:
170
+ query: 查询文本 / Query text
171
+ config: 配置 / Configuration
172
+
173
+ Returns:
174
+ Dict[str, Any]: 检索结果 / Retrieval results
175
+ """
176
+ try:
177
+ if self.provider_settings is None:
178
+ raise ValueError(
179
+ "provider_settings is required for RagFlow retrieval"
180
+ )
181
+
182
+ # 获取 API Key / Get API Key
183
+ api_key = await self._get_api_key_async(config)
184
+
185
+ # 构建请求 / Build request
186
+ base_url = self.provider_settings.base_url.rstrip("/")
187
+ url = f"{base_url}/api/v1/retrieval"
188
+ headers = {
189
+ "Content-Type": "application/json",
190
+ "Authorization": f"Bearer {api_key}",
191
+ }
192
+ body = self._build_request_body(query)
193
+
194
+ # 发送请求 / Send request
195
+ async with httpx.AsyncClient(
196
+ timeout=self.config.get_timeout()
197
+ ) as client:
198
+ response = await client.post(url, json=body, headers=headers)
199
+ response.raise_for_status()
200
+ result = response.json()
201
+ logger.debug(f"RagFlow retrieval result: {result}")
202
+
203
+ # 返回结果 / Return result
204
+ data = result.get("data", {})
205
+
206
+ if data == False:
207
+ raise Exception(f"RagFlow retrieval failed: {result}")
208
+
209
+ return {
210
+ "data": data,
211
+ "query": query,
212
+ "knowledge_base_name": self.knowledge_base_name,
213
+ }
214
+ except Exception as e:
215
+ logger.warning(
216
+ "Failed to retrieve from RagFlow knowledge base "
217
+ f"'{self.knowledge_base_name}': {e}"
218
+ )
219
+ return {
220
+ "data": f"Failed to retrieve: {e}",
221
+ "query": query,
222
+ "knowledge_base_name": self.knowledge_base_name,
223
+ "error": True,
224
+ }
225
+
226
+
227
+ class BailianDataAPI(KnowledgeBaseDataAPI, ControlAPI):
228
+ """百炼知识库数据链路 API / Bailian KnowledgeBase Data API
229
+
230
+ 实现百炼知识库的检索逻辑。
231
+ Implements retrieval logic for Bailian knowledge base.
232
+ """
233
+
234
+ def __init__(
235
+ self,
236
+ knowledge_base_name: str,
237
+ config: Optional[Config] = None,
238
+ provider_settings: Optional[BailianProviderSettings] = None,
239
+ retrieve_settings: Optional[BailianRetrieveSettings] = None,
240
+ ):
241
+ """初始化百炼知识库数据链路 API / Initialize Bailian KnowledgeBase Data API
242
+
243
+ Args:
244
+ knowledge_base_name: 知识库名称 / Knowledge base name
245
+ config: 配置 / Configuration
246
+ provider_settings: 百炼提供商设置 / Bailian provider settings
247
+ retrieve_settings: 百炼检索设置 / Bailian retrieve settings
248
+ """
249
+ KnowledgeBaseDataAPI.__init__(self, knowledge_base_name, config)
250
+ ControlAPI.__init__(self, config)
251
+ self.provider_settings = provider_settings
252
+ self.retrieve_settings = retrieve_settings
253
+
254
+ async def retrieve_async(
255
+ self,
256
+ query: str,
257
+ config: Optional[Config] = None,
258
+ ) -> Dict[str, Any]:
259
+ """百炼检索(异步)/ Bailian retrieval (async)
260
+
261
+ Args:
262
+ query: 查询文本 / Query text
263
+ config: 配置 / Configuration
264
+
265
+ Returns:
266
+ Dict[str, Any]: 检索结果 / Retrieval results
267
+ """
268
+ try:
269
+ if self.provider_settings is None:
270
+ raise ValueError(
271
+ "provider_settings is required for Bailian retrieval"
272
+ )
273
+
274
+ workspace_id = self.provider_settings.workspace_id
275
+ index_ids = self.provider_settings.index_ids
276
+
277
+ # 构建检索请求 / Build retrieve request
278
+ request_params: Dict[str, Any] = {
279
+ "query": query,
280
+ }
281
+
282
+ # 添加检索设置 / Add retrieve settings
283
+ if self.retrieve_settings:
284
+ if self.retrieve_settings.dense_similarity_top_k is not None:
285
+ request_params["dense_similarity_top_k"] = (
286
+ self.retrieve_settings.dense_similarity_top_k
287
+ )
288
+ if self.retrieve_settings.sparse_similarity_top_k is not None:
289
+ request_params["sparse_similarity_top_k"] = (
290
+ self.retrieve_settings.sparse_similarity_top_k
291
+ )
292
+ if self.retrieve_settings.rerank_min_score is not None:
293
+ request_params["rerank_min_score"] = (
294
+ self.retrieve_settings.rerank_min_score
295
+ )
296
+ if self.retrieve_settings.rerank_top_n is not None:
297
+ request_params["rerank_top_n"] = (
298
+ self.retrieve_settings.rerank_top_n
299
+ )
300
+
301
+ # 获取百炼客户端 / Get Bailian client
302
+ client = self._get_bailian_client(config)
303
+
304
+ # 对每个 index_id 进行检索并合并结果 / Retrieve from each index and merge results
305
+ all_nodes: List[Dict[str, Any]] = []
306
+ for index_id in index_ids:
307
+ request_params["index_id"] = index_id
308
+ request = bailian_models.RetrieveRequest(**request_params)
309
+ response = await client.retrieve_async(workspace_id, request)
310
+ logger.debug(f"Bailian retrieve response: {response}")
311
+
312
+ if (
313
+ response.body
314
+ and response.body.data
315
+ and response.body.data.nodes
316
+ ):
317
+ for node in response.body.data.nodes:
318
+ all_nodes.append({
319
+ "text": (
320
+ node.text if hasattr(node, "text") else None
321
+ ),
322
+ "score": (
323
+ node.score if hasattr(node, "score") else None
324
+ ),
325
+ "metadata": (
326
+ node.metadata
327
+ if hasattr(node, "metadata")
328
+ else None
329
+ ),
330
+ })
331
+
332
+ return {
333
+ "data": all_nodes,
334
+ "query": query,
335
+ "knowledge_base_name": self.knowledge_base_name,
336
+ }
337
+ except Exception as e:
338
+ logger.warning(
339
+ "Failed to retrieve from Bailian knowledge base "
340
+ f"'{self.knowledge_base_name}': {e}"
341
+ )
342
+ return {
343
+ "data": f"Failed to retrieve: {e}",
344
+ "query": query,
345
+ "knowledge_base_name": self.knowledge_base_name,
346
+ "error": True,
347
+ }
348
+
349
+
350
+ def get_data_api(
351
+ provider: KnowledgeBaseProvider,
352
+ knowledge_base_name: str,
353
+ config: Optional[Config] = None,
354
+ provider_settings: Optional[
355
+ Union[RagFlowProviderSettings, BailianProviderSettings]
356
+ ] = None,
357
+ retrieve_settings: Optional[
358
+ Union[RagFlowRetrieveSettings, BailianRetrieveSettings]
359
+ ] = None,
360
+ credential_name: Optional[str] = None,
361
+ ) -> KnowledgeBaseDataAPI:
362
+ """根据 provider 类型获取对应的数据链路 API / Get data API by provider type
363
+
364
+ Args:
365
+ provider: 提供商类型 / Provider type
366
+ knowledge_base_name: 知识库名称 / Knowledge base name
367
+ config: 配置 / Configuration
368
+ provider_settings: 提供商设置 / Provider settings
369
+ retrieve_settings: 检索设置 / Retrieve settings
370
+ credential_name: 凭证名称(RagFlow 需要)/ Credential name (required for RagFlow)
371
+
372
+ Returns:
373
+ KnowledgeBaseDataAPI: 对应的数据链路 API 实例 / Corresponding data API instance
374
+
375
+ Raises:
376
+ ValueError: 不支持的 provider 类型 / Unsupported provider type
377
+ """
378
+ if provider == KnowledgeBaseProvider.RAGFLOW or provider == "ragflow":
379
+ ragflow_provider_settings = (
380
+ provider_settings
381
+ if isinstance(provider_settings, RagFlowProviderSettings)
382
+ else None
383
+ )
384
+ ragflow_retrieve_settings = (
385
+ retrieve_settings
386
+ if isinstance(retrieve_settings, RagFlowRetrieveSettings)
387
+ else None
388
+ )
389
+ return RagFlowDataAPI(
390
+ knowledge_base_name,
391
+ config,
392
+ provider_settings=ragflow_provider_settings,
393
+ retrieve_settings=ragflow_retrieve_settings,
394
+ credential_name=credential_name,
395
+ )
396
+ elif provider == KnowledgeBaseProvider.BAILIAN or provider == "bailian":
397
+ bailian_provider_settings = (
398
+ provider_settings
399
+ if isinstance(provider_settings, BailianProviderSettings)
400
+ else None
401
+ )
402
+ bailian_retrieve_settings = (
403
+ retrieve_settings
404
+ if isinstance(retrieve_settings, BailianRetrieveSettings)
405
+ else None
406
+ )
407
+ return BailianDataAPI(
408
+ knowledge_base_name,
409
+ config,
410
+ provider_settings=bailian_provider_settings,
411
+ retrieve_settings=bailian_retrieve_settings,
412
+ )
413
+ else:
414
+ raise ValueError(f"Unsupported provider type: {provider}")
@@ -0,0 +1,19 @@
1
+ """KnowledgeBase API 模块 / KnowledgeBase API Module"""
2
+
3
+ from .control import KnowledgeBaseControlAPI
4
+ from .data import (
5
+ BailianDataAPI,
6
+ get_data_api,
7
+ KnowledgeBaseDataAPI,
8
+ RagFlowDataAPI,
9
+ )
10
+
11
+ __all__ = [
12
+ # Control API
13
+ "KnowledgeBaseControlAPI",
14
+ # Data API
15
+ "KnowledgeBaseDataAPI",
16
+ "RagFlowDataAPI",
17
+ "BailianDataAPI",
18
+ "get_data_api",
19
+ ]