bisheng-langchain 0.4.1.1__py3-none-any.whl → 1.0.0__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.
- bisheng_langchain/chat_models/sensetime.py +2 -1
- bisheng_langchain/chat_models/zhipuai.py +2 -1
- bisheng_langchain/gpts/load_tools.py +4 -3
- bisheng_langchain/gpts/tools/api_tools/__init__.py +77 -0
- bisheng_langchain/gpts/tools/api_tools/firecrawl.py +86 -0
- bisheng_langchain/gpts/tools/api_tools/jina.py +45 -0
- bisheng_langchain/gpts/tools/api_tools/openapi.py +18 -2
- bisheng_langchain/gpts/tools/api_tools/silicon_flow.py +62 -0
- bisheng_langchain/gpts/tools/bing_search/self_arxiv.py +47 -0
- bisheng_langchain/gpts/tools/bing_search/tool.py +1 -1
- bisheng_langchain/gpts/tools/message/__init__.py +0 -0
- bisheng_langchain/gpts/tools/message/dingding.py +57 -0
- bisheng_langchain/gpts/tools/message/email.py +103 -0
- bisheng_langchain/gpts/tools/message/feishu.py +121 -0
- bisheng_langchain/gpts/tools/message/wechat.py +52 -0
- bisheng_langchain/gpts/tools/sql_agent/tool.py +13 -5
- bisheng_langchain/vectorstores/elastic_keywords_search.py +2 -1
- {bisheng_langchain-0.4.1.1.dist-info → bisheng_langchain-1.0.0.dist-info}/METADATA +1 -1
- {bisheng_langchain-0.4.1.1.dist-info → bisheng_langchain-1.0.0.dist-info}/RECORD +21 -12
- {bisheng_langchain-0.4.1.1.dist-info → bisheng_langchain-1.0.0.dist-info}/WHEEL +0 -0
- {bisheng_langchain-0.4.1.1.dist-info → bisheng_langchain-1.0.0.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,6 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
+
import ast
|
3
4
|
import json
|
4
5
|
import logging
|
5
6
|
import time
|
@@ -390,7 +391,7 @@ class SenseChat(BaseChatModel):
|
|
390
391
|
|
391
392
|
def _norm_text(text):
|
392
393
|
if text[0] == '"' and text[-1] == '"':
|
393
|
-
out =
|
394
|
+
out = ast.literal_eval(text)
|
394
395
|
else:
|
395
396
|
out = text
|
396
397
|
return out
|
@@ -1,6 +1,7 @@
|
|
1
1
|
"""ZhipuAI chat wrapper."""
|
2
2
|
from __future__ import annotations
|
3
3
|
|
4
|
+
import ast
|
4
5
|
import logging
|
5
6
|
import sys
|
6
7
|
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Mapping, Optional, Tuple, Union
|
@@ -274,7 +275,7 @@ class ChatZhipuAI(BaseChatModel):
|
|
274
275
|
# print('response', response)
|
275
276
|
def _norm_text(text):
|
276
277
|
if text[0] == '"' and text[-1] == '"':
|
277
|
-
out =
|
278
|
+
out = ast.literal_eval(text)
|
278
279
|
else:
|
279
280
|
out = text
|
280
281
|
return out
|
@@ -17,7 +17,8 @@ from langchain_core.tools import BaseTool, Tool
|
|
17
17
|
from mypy_extensions import Arg, KwArg
|
18
18
|
|
19
19
|
from bisheng_langchain.gpts.tools.api_tools import ALL_API_TOOLS
|
20
|
-
from bisheng_langchain.gpts.tools.bing_search.
|
20
|
+
from bisheng_langchain.gpts.tools.bing_search.self_arxiv import ArxivAPIWrapperSelf
|
21
|
+
from bisheng_langchain.gpts.tools.bing_search.tool import BingSearchResults, BingSearchRun
|
21
22
|
from bisheng_langchain.gpts.tools.calculator.tool import calculator
|
22
23
|
from bisheng_langchain.gpts.tools.code_interpreter.tool import CodeInterpreterTool
|
23
24
|
# from langchain_community.utilities.dalle_image_generator import DallEAPIWrapper
|
@@ -40,7 +41,7 @@ def _get_calculator() -> BaseTool:
|
|
40
41
|
|
41
42
|
|
42
43
|
def _get_arxiv() -> BaseTool:
|
43
|
-
return ArxivQueryRun(api_wrapper=
|
44
|
+
return ArxivQueryRun(api_wrapper=ArxivAPIWrapperSelf(top_k_results=5,load_max_docs=5,load_all_available_meta=True))
|
44
45
|
|
45
46
|
|
46
47
|
_BASE_TOOLS: Dict[str, Callable[[], BaseTool]] = {
|
@@ -57,7 +58,7 @@ _EXTRA_LLM_TOOLS: Dict[
|
|
57
58
|
|
58
59
|
|
59
60
|
def _get_bing_search(**kwargs: Any) -> BaseTool:
|
60
|
-
return
|
61
|
+
return BingSearchResults(api_wrapper=BingSearchAPIWrapper(**kwargs))
|
61
62
|
|
62
63
|
|
63
64
|
def _get_dalle_image_generator(**kwargs: Any) -> Tool:
|
@@ -1,6 +1,13 @@
|
|
1
1
|
from typing import Any, Callable, Dict, List, Tuple
|
2
2
|
|
3
3
|
# from .eastmoney import
|
4
|
+
from bisheng_langchain.gpts.tools.api_tools.firecrawl import FireCrawl
|
5
|
+
from bisheng_langchain.gpts.tools.api_tools.jina import JinaTool
|
6
|
+
from bisheng_langchain.gpts.tools.api_tools.silicon_flow import SiliconFlow
|
7
|
+
from bisheng_langchain.gpts.tools.message.dingding import DingdingMessageTool
|
8
|
+
from bisheng_langchain.gpts.tools.message.email import EmailMessageTool
|
9
|
+
from bisheng_langchain.gpts.tools.message.feishu import FeishuMessageTool
|
10
|
+
from bisheng_langchain.gpts.tools.message.wechat import WechatMessageTool
|
4
11
|
from langchain_core.tools import BaseTool
|
5
12
|
from mypy_extensions import KwArg
|
6
13
|
|
@@ -43,8 +50,78 @@ _TMP_TOOLS: Dict[str, Tuple[Callable[[KwArg(Any)], BaseTool], List[str]]] = {
|
|
43
50
|
f'flow_{name}': (FlowTools.get_api_tool, ['collection_id', 'description'])
|
44
51
|
for name in _tmp_flow
|
45
52
|
}
|
53
|
+
firecrawl_class_methods = [
|
54
|
+
method for method in FireCrawl.__dict__
|
55
|
+
if isinstance(FireCrawl.__dict__[method], classmethod)
|
56
|
+
]
|
57
|
+
|
58
|
+
_FIRE_TOOLS: Dict[str, Tuple[Callable[[KwArg(Any)], BaseTool], List[str]]] = {
|
59
|
+
'fire_search_crawl': (FireCrawl.get_api_tool, ['api_key','maxdepth', 'limit', 'timeout','base_url']),
|
60
|
+
'fire_search_scrape': (FireCrawl.get_api_tool, ['api_key','maxdepth', 'limit', 'timeout','base_url'])
|
61
|
+
}
|
62
|
+
jina_class_methods = [
|
63
|
+
method for method in JinaTool.__dict__
|
64
|
+
if isinstance(JinaTool.__dict__[method], classmethod)
|
65
|
+
]
|
66
|
+
_JINA_TOOLS: Dict[str, Tuple[Callable[[KwArg(Any)], BaseTool], List[str]]] = {
|
67
|
+
'jina_get_markdown': (JinaTool.get_api_tool, ['jina_api_key'])
|
68
|
+
}
|
69
|
+
silicon_class_methods = [
|
70
|
+
method for method in SiliconFlow.__dict__
|
71
|
+
if isinstance(SiliconFlow.__dict__[method], classmethod)
|
72
|
+
]
|
73
|
+
_SILICON_TOOLS: Dict[str, Tuple[Callable[[KwArg(Any)], BaseTool], List[str]]] = {
|
74
|
+
'silicon_stable_diffusion': (SiliconFlow.get_api_tool, ['siliconflow_api_key']),
|
75
|
+
'silicon_flux': (SiliconFlow.get_api_tool, ['siliconflow_api_key'])
|
76
|
+
}
|
77
|
+
dingding_class_methods = [
|
78
|
+
method for method in DingdingMessageTool.__dict__
|
79
|
+
if isinstance(DingdingMessageTool.__dict__[method], classmethod)
|
80
|
+
]
|
81
|
+
|
82
|
+
_DING_TOOLS: Dict[str, Tuple[Callable[[KwArg(Any)], BaseTool], List[str]]] = {
|
83
|
+
'ding_send_message': (DingdingMessageTool.get_api_tool, [])
|
84
|
+
}
|
85
|
+
|
86
|
+
|
87
|
+
email_class_methods = [
|
88
|
+
method for method in EmailMessageTool.__dict__
|
89
|
+
if isinstance(EmailMessageTool.__dict__[method], classmethod)
|
90
|
+
]
|
91
|
+
|
92
|
+
_EMAIL_TOOLS: Dict[str, Tuple[Callable[[KwArg(Any)], BaseTool], List[str]]] = {
|
93
|
+
'email_send_email': (EmailMessageTool.get_api_tool, ['email_account','email_password','smtp_server','smtp_port','encrypt_method']),
|
94
|
+
}
|
95
|
+
|
96
|
+
feishu_class_methods = [
|
97
|
+
method for method in FeishuMessageTool.__dict__
|
98
|
+
if isinstance(FeishuMessageTool.__dict__[method], classmethod)
|
99
|
+
]
|
100
|
+
|
101
|
+
_FEISHU_TOOLS: Dict[str, Tuple[Callable[[KwArg(Any)], BaseTool], List[str]]] = {
|
102
|
+
'feishu_send_message': (FeishuMessageTool.get_api_tool, ['app_id', 'app_secret']),
|
103
|
+
'feishu_get_chat_messages': (FeishuMessageTool.get_api_tool, ['app_id', 'app_secret']),
|
104
|
+
}
|
105
|
+
|
106
|
+
wechat_class_methods = [
|
107
|
+
method for method in WechatMessageTool.__dict__
|
108
|
+
if isinstance(WechatMessageTool.__dict__[method], classmethod)
|
109
|
+
]
|
110
|
+
|
111
|
+
_WECHAT_TOOLS: Dict[str, Tuple[Callable[[KwArg(Any)], BaseTool], List[str]]] = {
|
112
|
+
'wechat_send_message': (WechatMessageTool.get_api_tool, [])
|
113
|
+
}
|
114
|
+
|
115
|
+
|
46
116
|
ALL_API_TOOLS = {}
|
47
117
|
ALL_API_TOOLS.update(_TIAN_YAN_CHA_TOOLS)
|
48
118
|
ALL_API_TOOLS.update(_SINA_TOOLS)
|
49
119
|
ALL_API_TOOLS.update(_MACRO_TOOLS)
|
50
120
|
ALL_API_TOOLS.update(_TMP_TOOLS)
|
121
|
+
ALL_API_TOOLS.update(_FIRE_TOOLS)
|
122
|
+
ALL_API_TOOLS.update(_JINA_TOOLS)
|
123
|
+
ALL_API_TOOLS.update(_SILICON_TOOLS)
|
124
|
+
ALL_API_TOOLS.update(_DING_TOOLS)
|
125
|
+
ALL_API_TOOLS.update(_EMAIL_TOOLS)
|
126
|
+
ALL_API_TOOLS.update(_FEISHU_TOOLS)
|
127
|
+
ALL_API_TOOLS.update(_WECHAT_TOOLS)
|
@@ -0,0 +1,86 @@
|
|
1
|
+
import time
|
2
|
+
from typing import Any, Dict, Type
|
3
|
+
|
4
|
+
import requests
|
5
|
+
|
6
|
+
from langchain_core.pydantic_v1 import BaseModel, Field, root_validator
|
7
|
+
|
8
|
+
from bisheng_langchain.gpts.tools.api_tools.base import (APIToolBase,
|
9
|
+
MultArgsSchemaTool)
|
10
|
+
|
11
|
+
|
12
|
+
class InputArgs(BaseModel):
|
13
|
+
target_url: str = Field(description="params target_url")
|
14
|
+
|
15
|
+
|
16
|
+
class FireCrawl(BaseModel):
|
17
|
+
|
18
|
+
api_key: str = Field(description="apikey")
|
19
|
+
base_url: str = Field(description="params base_url")
|
20
|
+
maxdepth: int = Field(description="params maxDepth")
|
21
|
+
limit: int = Field(description="params limit")
|
22
|
+
timeout: int = Field(description="params timeout")
|
23
|
+
|
24
|
+
|
25
|
+
def search_crawl(self, target_url: str) -> str:
|
26
|
+
"""crawl from firecrawl"""
|
27
|
+
url = "https://api.firecrawl.dev/v1/crawl"
|
28
|
+
headers = {
|
29
|
+
"Content-Type": "application/json",
|
30
|
+
"Authorization": "Bearer " + self.api_key,
|
31
|
+
}
|
32
|
+
params = {
|
33
|
+
"url": target_url,
|
34
|
+
"maxDepth": self.maxdepth,
|
35
|
+
"limit": self.limit,
|
36
|
+
"scrapeOptions": {
|
37
|
+
"formats": ["markdown"],
|
38
|
+
},
|
39
|
+
}
|
40
|
+
response = requests.post(url, json=params, headers=headers)
|
41
|
+
status_url = response.json()["url"]
|
42
|
+
start_time = time.time()
|
43
|
+
while True:
|
44
|
+
response = requests.get(status_url,headers=headers)
|
45
|
+
print("wating for completion " + status_url)
|
46
|
+
data = response.json()
|
47
|
+
if time.time() - start_time > self.timeout:
|
48
|
+
return "timeout"
|
49
|
+
if data["status"] == "completed":
|
50
|
+
return response.text
|
51
|
+
elif data["status"] == "failed":
|
52
|
+
return "failed"
|
53
|
+
else:
|
54
|
+
time.sleep(5)
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
def search_scrape(self, target_url: str) -> str:
|
59
|
+
"""scrape from firecrawl"""
|
60
|
+
url = "https://api.firecrawl.dev/v1/scrape"
|
61
|
+
headers = {
|
62
|
+
"Content-Type": "application/json",
|
63
|
+
"Authorization": "Bearer " + self.api_key,
|
64
|
+
}
|
65
|
+
params = {
|
66
|
+
"url": target_url,
|
67
|
+
"formats": ["markdown"],
|
68
|
+
"timeout": self.timeout,
|
69
|
+
}
|
70
|
+
|
71
|
+
response = requests.post(url, json=params, headers=headers)
|
72
|
+
return response.text
|
73
|
+
|
74
|
+
|
75
|
+
@classmethod
|
76
|
+
def get_api_tool(cls, name: str, **kwargs: Any) -> "FireCrawl":
|
77
|
+
attr_name = name.split("_", 1)[-1]
|
78
|
+
c = FireCrawl(**kwargs)
|
79
|
+
class_method = getattr(c, attr_name)
|
80
|
+
|
81
|
+
return MultArgsSchemaTool(
|
82
|
+
name=name,
|
83
|
+
description=class_method.__doc__,
|
84
|
+
func=class_method,
|
85
|
+
args_schema=InputArgs,
|
86
|
+
)
|
@@ -0,0 +1,45 @@
|
|
1
|
+
from typing import Any, Optional
|
2
|
+
|
3
|
+
import requests
|
4
|
+
from pydantic import BaseModel, Field
|
5
|
+
|
6
|
+
from bisheng_langchain.gpts.tools.api_tools.base import (APIToolBase,
|
7
|
+
MultArgsSchemaTool)
|
8
|
+
|
9
|
+
|
10
|
+
class InputArgs(BaseModel):
|
11
|
+
# jina_api_key: Optional[str] = Field(default=None,description="jina api key")
|
12
|
+
target_url: Optional[str] = Field(default=None,description="params target_url")
|
13
|
+
|
14
|
+
|
15
|
+
class JinaTool(BaseModel):
|
16
|
+
|
17
|
+
jina_api_key: str = Field(default=None,description="jina api key")
|
18
|
+
|
19
|
+
def get_markdown(self, target_url: str) -> Any:
|
20
|
+
"""get url from jina api"""
|
21
|
+
url = "https://r.jina.ai/" + target_url
|
22
|
+
|
23
|
+
headers = {
|
24
|
+
"Content-Type": "application/json",
|
25
|
+
"Authorization": "Bearer " + self.jina_api_key,
|
26
|
+
}
|
27
|
+
|
28
|
+
response = requests.get(url, headers=headers)
|
29
|
+
|
30
|
+
return response.text
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
@classmethod
|
35
|
+
def get_api_tool(cls, name: str, **kwargs: Any) -> "JinaTool":
|
36
|
+
attr_name = name.split("_", 1)[-1]
|
37
|
+
c = JinaTool(jina_api_key=kwargs.get('jina_api_key'))
|
38
|
+
class_method = getattr(c, attr_name)
|
39
|
+
|
40
|
+
return MultArgsSchemaTool(
|
41
|
+
name=name,
|
42
|
+
description=class_method.__doc__,
|
43
|
+
func=class_method,
|
44
|
+
args_schema=InputArgs,
|
45
|
+
)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from typing import Any
|
1
|
+
from typing import Any, Optional
|
2
2
|
|
3
3
|
from langchain_core.tools import BaseTool
|
4
4
|
from loguru import logger
|
@@ -9,6 +9,10 @@ from .base import APIToolBase, Field, MultArgsSchemaTool
|
|
9
9
|
|
10
10
|
class OpenApiTools(APIToolBase):
|
11
11
|
|
12
|
+
api_key: Optional[str]
|
13
|
+
api_location: Optional[str]
|
14
|
+
parameter_name: Optional[str]
|
15
|
+
|
12
16
|
def get_real_path(self, path_params: dict|None):
|
13
17
|
path = self.params['path']
|
14
18
|
if path_params:
|
@@ -36,6 +40,17 @@ class OpenApiTools(APIToolBase):
|
|
36
40
|
json_data[k] = v
|
37
41
|
else:
|
38
42
|
params[k] = v
|
43
|
+
# if ('api_location' in self.params and self.params['api_location'] == "query") or \
|
44
|
+
# (hasattr(self, 'api_location') and self.api_location == "query"):
|
45
|
+
# if self.parameter_name:
|
46
|
+
# params.update({self.parameter_name:self.api_key})
|
47
|
+
# elif self.params['parameter_name']:
|
48
|
+
# params.update({self.params['parameter_name']:self.api_key})
|
49
|
+
api_location = self.params.get('api_location')
|
50
|
+
if (api_location == "query") or (hasattr(self, 'api_location') and self.api_location == "query"):
|
51
|
+
parameter_name = getattr(self, 'parameter_name', None) or self.params.get('parameter_name')
|
52
|
+
if parameter_name:
|
53
|
+
params.update({parameter_name: self.api_key})
|
39
54
|
return params, json_data, path_params
|
40
55
|
|
41
56
|
def parse_args_schema(self):
|
@@ -88,6 +103,7 @@ class OpenApiTools(APIToolBase):
|
|
88
103
|
extra = {}
|
89
104
|
if 'proxy' in kwargs:
|
90
105
|
extra['proxy'] = kwargs.pop('proxy')
|
106
|
+
|
91
107
|
params, json_data, path_params = self.get_params_json(**kwargs)
|
92
108
|
path = self.get_real_path(path_params)
|
93
109
|
logger.info('api_call url={}', path)
|
@@ -116,7 +132,7 @@ class OpenApiTools(APIToolBase):
|
|
116
132
|
|
117
133
|
params, json_data, path_params = self.get_params_json(**kwargs)
|
118
134
|
path = self.get_real_path(path_params)
|
119
|
-
logger.info('api_call url={}', path)
|
135
|
+
logger.info('api_call url={} params={}', path, params)
|
120
136
|
method = self.get_request_method()
|
121
137
|
|
122
138
|
if method == 'get':
|
@@ -0,0 +1,62 @@
|
|
1
|
+
from typing import Any, Optional
|
2
|
+
|
3
|
+
import requests
|
4
|
+
from loguru import logger
|
5
|
+
from pydantic import BaseModel, Field
|
6
|
+
|
7
|
+
from bisheng_langchain.gpts.tools.api_tools.base import (APIToolBase,
|
8
|
+
MultArgsSchemaTool)
|
9
|
+
|
10
|
+
|
11
|
+
class InputArgs(BaseModel):
|
12
|
+
prompt: str = Field(description="text to image prompt ")
|
13
|
+
negative_prompt: Optional[str] = Field(default=None,description="text to image negative_prompt")
|
14
|
+
|
15
|
+
|
16
|
+
class SiliconFlow(APIToolBase):
|
17
|
+
|
18
|
+
siliconflow_api_key: str = Field(description="params api key")
|
19
|
+
|
20
|
+
def stable_diffusion(self, negative_prompt: str, prompt: str) -> str:
|
21
|
+
"""silicon stable diffusion api"""
|
22
|
+
url = "https://api.siliconflow.cn/v1/images/generations"
|
23
|
+
headers = {
|
24
|
+
"Content-Type": "application/json",
|
25
|
+
"Authorization": "Bearer " + self.siliconflow_api_key,
|
26
|
+
}
|
27
|
+
params = {
|
28
|
+
"model": "stabilityai/stable-diffusion-3-5-large",
|
29
|
+
"prompt": prompt,
|
30
|
+
"negative_prompt": negative_prompt,
|
31
|
+
}
|
32
|
+
|
33
|
+
response = requests.post(url, json=params, headers=headers)
|
34
|
+
return response.text
|
35
|
+
|
36
|
+
def flux(self, prompt: str) -> str:
|
37
|
+
"""silicon flux api"""
|
38
|
+
url = "https://api.siliconflow.cn/v1/images/generations"
|
39
|
+
headers = {
|
40
|
+
"Content-Type": "application/json",
|
41
|
+
"Authorization": "Bearer " + self.siliconflow_api_key,
|
42
|
+
}
|
43
|
+
params = {
|
44
|
+
"model": "black-forest-labs/FLUX.1-pro",
|
45
|
+
"prompt": prompt,
|
46
|
+
}
|
47
|
+
|
48
|
+
response = requests.post(url, json=params, headers=headers)
|
49
|
+
return response.text
|
50
|
+
|
51
|
+
@classmethod
|
52
|
+
def get_api_tool(cls, name: str, **kwargs: Any) -> "SiliconFlow":
|
53
|
+
attr_name = name.split("_", 1)[-1]
|
54
|
+
c = SiliconFlow(**kwargs)
|
55
|
+
class_method = getattr(c, attr_name)
|
56
|
+
|
57
|
+
return MultArgsSchemaTool(
|
58
|
+
name=name,
|
59
|
+
description=class_method.__doc__,
|
60
|
+
func=class_method,
|
61
|
+
args_schema=InputArgs,
|
62
|
+
)
|
@@ -0,0 +1,47 @@
|
|
1
|
+
"""Util that calls Arxiv."""
|
2
|
+
|
3
|
+
import logging
|
4
|
+
|
5
|
+
from langchain_community.utilities.arxiv import ArxivAPIWrapper
|
6
|
+
|
7
|
+
logger = logging.getLogger(__name__)
|
8
|
+
|
9
|
+
|
10
|
+
class ArxivAPIWrapperSelf(ArxivAPIWrapper):
|
11
|
+
def run(self, query: str) -> str:
|
12
|
+
"""
|
13
|
+
Performs an arxiv search and A single string
|
14
|
+
with the publish date, title, authors, and summary
|
15
|
+
for each article separated by two newlines.
|
16
|
+
|
17
|
+
If an error occurs or no documents found, error text
|
18
|
+
is returned instead. Wrapper for
|
19
|
+
https://lukasschwab.me/arxiv.py/index.html#Search
|
20
|
+
|
21
|
+
Args:
|
22
|
+
query: a plaintext search query
|
23
|
+
"""
|
24
|
+
try:
|
25
|
+
if self.is_arxiv_identifier(query):
|
26
|
+
results = self.arxiv_search(
|
27
|
+
id_list=query.split(),
|
28
|
+
max_results=self.top_k_results,
|
29
|
+
).results()
|
30
|
+
else:
|
31
|
+
results = self.arxiv_search( # type: ignore
|
32
|
+
query[: self.ARXIV_MAX_QUERY_LENGTH], max_results=self.top_k_results
|
33
|
+
).results()
|
34
|
+
except self.arxiv_exceptions as ex:
|
35
|
+
return f"Arxiv exception: {ex}"
|
36
|
+
docs = [
|
37
|
+
f"Published: {result.updated.date()}\n"
|
38
|
+
f"Title: {result.title}\n"
|
39
|
+
f"Authors: {', '.join(a.name for a in result.authors)}\n"
|
40
|
+
f"Summary: {result.summary}\n"
|
41
|
+
f"pdf_url: {result.pdf_url}"
|
42
|
+
for result in results
|
43
|
+
]
|
44
|
+
if docs:
|
45
|
+
return "\n\n".join(docs)[: self.doc_content_chars_max]
|
46
|
+
else:
|
47
|
+
return "No good Arxiv Result was found"
|
@@ -42,7 +42,7 @@ class BingSearchResults(BaseTool):
|
|
42
42
|
"Useful for when you need to answer questions about current events. "
|
43
43
|
"Input should be a search query. Output is a JSON array of the query results"
|
44
44
|
)
|
45
|
-
num_results: int =
|
45
|
+
num_results: int = 5
|
46
46
|
args_schema = BingSearchInput
|
47
47
|
api_wrapper: BingSearchAPIWrapper
|
48
48
|
|
File without changes
|
@@ -0,0 +1,57 @@
|
|
1
|
+
from typing import Any, Optional, Type
|
2
|
+
|
3
|
+
import requests
|
4
|
+
from langchain_core.pydantic_v1 import BaseModel, Field, root_validator
|
5
|
+
from loguru import logger
|
6
|
+
|
7
|
+
from bisheng_langchain.gpts.tools.api_tools.base import (APIToolBase,
|
8
|
+
MultArgsSchemaTool)
|
9
|
+
|
10
|
+
|
11
|
+
class InputArgs(BaseModel):
|
12
|
+
url: str = Field(description="钉钉机器人的URL地址")
|
13
|
+
message: str = Field(description="需要发送的钉钉消息")
|
14
|
+
|
15
|
+
|
16
|
+
class DingdingMessageTool(BaseModel):
|
17
|
+
|
18
|
+
def send_message(self, message: str, url: str) -> str:
|
19
|
+
"""
|
20
|
+
发送钉钉机器人消息
|
21
|
+
|
22
|
+
Args:
|
23
|
+
webhook_url: 钉钉机器人的 webhook 地址
|
24
|
+
message: 要发送的消息内容
|
25
|
+
|
26
|
+
Returns:
|
27
|
+
dict: 钉钉接口的响应结果
|
28
|
+
"""
|
29
|
+
# 构建请求头
|
30
|
+
headers = {"Content-Type": "application/json"}
|
31
|
+
# 构建请求体
|
32
|
+
data = {"msgtype": "text", "text": {"content": message}}
|
33
|
+
|
34
|
+
try:
|
35
|
+
# 发送 POST 请求
|
36
|
+
response = requests.post(url=url, headers=headers, json=data)
|
37
|
+
|
38
|
+
# 检查响应状态
|
39
|
+
response.raise_for_status()
|
40
|
+
return response.json()
|
41
|
+
|
42
|
+
except requests.exceptions.RequestException as e:
|
43
|
+
return f"发送消息失败: {str(e)}"
|
44
|
+
|
45
|
+
|
46
|
+
@classmethod
|
47
|
+
def get_api_tool(cls, name: str, **kwargs: Any) -> "DingdingMessageTool":
|
48
|
+
attr_name = name.split("_", 1)[-1]
|
49
|
+
c = DingdingMessageTool(**kwargs)
|
50
|
+
class_method = getattr(c, attr_name)
|
51
|
+
|
52
|
+
return MultArgsSchemaTool(
|
53
|
+
name=name,
|
54
|
+
description=class_method.__doc__,
|
55
|
+
func=class_method,
|
56
|
+
args_schema=InputArgs,
|
57
|
+
)
|
@@ -0,0 +1,103 @@
|
|
1
|
+
import os
|
2
|
+
import smtplib
|
3
|
+
from email.mime.application import MIMEApplication
|
4
|
+
from email.mime.multipart import MIMEMultipart
|
5
|
+
from email.mime.text import MIMEText
|
6
|
+
from typing import Any, Optional
|
7
|
+
|
8
|
+
from langchain_core.pydantic_v1 import BaseModel, Field, root_validator
|
9
|
+
|
10
|
+
from bisheng_langchain.gpts.tools.api_tools.base import (APIToolBase,
|
11
|
+
MultArgsSchemaTool)
|
12
|
+
|
13
|
+
|
14
|
+
class InputArgs(BaseModel):
|
15
|
+
receiver: str = Field(description="收件人)")
|
16
|
+
subject: str = Field(description="邮件主题")
|
17
|
+
content: str = Field(description="邮件正文内容")
|
18
|
+
|
19
|
+
|
20
|
+
class EmailMessageTool(APIToolBase):
|
21
|
+
|
22
|
+
email_account: str = Field(description="发件人邮箱")
|
23
|
+
email_password: str = Field(description="邮箱授权码/密码")
|
24
|
+
smtp_server: str = Field(description="SMTP服务器地址")
|
25
|
+
encrypt_method: str = Field(description="encrypt_method")
|
26
|
+
smtp_port: int = Field(default=465, description=" 端口号(SSL一般465,TLS用587)")
|
27
|
+
|
28
|
+
def send_email(
|
29
|
+
self,
|
30
|
+
receiver,
|
31
|
+
subject,
|
32
|
+
content,
|
33
|
+
):
|
34
|
+
"""
|
35
|
+
发送电子邮件函数
|
36
|
+
|
37
|
+
参数:
|
38
|
+
sender : str - 发件人邮箱
|
39
|
+
password : str - 邮箱授权码/密码
|
40
|
+
receiver : str/list - 收件人(多个用逗号)
|
41
|
+
subject : str - 邮件主题
|
42
|
+
content : str - 邮件正文内容
|
43
|
+
content_type : str - 内容类型(plain/html)
|
44
|
+
attachments : list - 附件路径列表
|
45
|
+
smtp_server : str - SMTP服务器地址
|
46
|
+
port : int - 端口号(SSL一般465,TLS用587)
|
47
|
+
"""
|
48
|
+
|
49
|
+
try:
|
50
|
+
content_type = "plain"
|
51
|
+
# 创建邮件对象
|
52
|
+
msg = MIMEMultipart()
|
53
|
+
msg["From"] = self.email_account
|
54
|
+
msg["To"] = receiver
|
55
|
+
msg["Subject"] = subject
|
56
|
+
|
57
|
+
# 添加正文
|
58
|
+
body = MIMEText(content, content_type, "utf-8")
|
59
|
+
msg.attach(body)
|
60
|
+
|
61
|
+
# 添加附件
|
62
|
+
# if attachments:
|
63
|
+
# for file_path in attachments:
|
64
|
+
# with open(file_path, "rb") as f:
|
65
|
+
# part = MIMEApplication(f.read())
|
66
|
+
# part.add_header(
|
67
|
+
# "Content-Disposition",
|
68
|
+
# "attachment",
|
69
|
+
# filename=os.path.basename(file_path),
|
70
|
+
# )
|
71
|
+
# msg.attach(part)
|
72
|
+
|
73
|
+
# 创建SMTP连接
|
74
|
+
if self.smtp_port == 465:
|
75
|
+
# SSL连接
|
76
|
+
server = smtplib.SMTP_SSL(self.smtp_server, self.smtp_port)
|
77
|
+
else:
|
78
|
+
# TLS连接
|
79
|
+
server = smtplib.SMTP(self.smtp_server, self.smtp_port)
|
80
|
+
server.starttls()
|
81
|
+
|
82
|
+
# 登录邮箱
|
83
|
+
server.login(self.email_account, self.email_password)
|
84
|
+
|
85
|
+
# 发送邮件
|
86
|
+
server.sendmail(self.email_account, receiver.split(","), msg.as_string())
|
87
|
+
except Exception as e:
|
88
|
+
raise Exception(f"邮件发送失败:{e}")
|
89
|
+
|
90
|
+
return "发送成功"
|
91
|
+
|
92
|
+
@classmethod
|
93
|
+
def get_api_tool(cls, name: str, **kwargs: Any) -> "EmailMessageTool":
|
94
|
+
attr_name = name.split("_", 1)[-1]
|
95
|
+
c = EmailMessageTool(**kwargs)
|
96
|
+
class_method = getattr(c, attr_name)
|
97
|
+
|
98
|
+
return MultArgsSchemaTool(
|
99
|
+
name=name,
|
100
|
+
description=class_method.__doc__,
|
101
|
+
func=class_method,
|
102
|
+
args_schema=InputArgs,
|
103
|
+
)
|
@@ -0,0 +1,121 @@
|
|
1
|
+
from typing import Any, Optional, Type
|
2
|
+
|
3
|
+
import requests
|
4
|
+
from langchain_core.pydantic_v1 import BaseModel, Field, root_validator
|
5
|
+
from loguru import logger
|
6
|
+
|
7
|
+
from bisheng_langchain.gpts.tools.api_tools.base import (APIToolBase,
|
8
|
+
MultArgsSchemaTool)
|
9
|
+
|
10
|
+
|
11
|
+
class InputArgs(BaseModel):
|
12
|
+
message: Optional[str] = Field(description="需要发送的钉钉消息")
|
13
|
+
receive_id: Optional[str] = Field(description="接收的ID")
|
14
|
+
receive_id_type: Optional[str] = Field(description="接收的ID类型")
|
15
|
+
container_id: Optional[str] = Field(description="container_id")
|
16
|
+
start_time: Optional[str] = Field(description="start_time")
|
17
|
+
end_time: Optional[str] = Field(description="end_time")
|
18
|
+
# page_token: Optional[str] = Field(description="page_token")
|
19
|
+
container_id_type: Optional[str] = Field(description="container_id_type")
|
20
|
+
page_size: Optional[int] = Field(default=20,description="page_size")
|
21
|
+
page_token: Optional[str] = Field(description="page_token")
|
22
|
+
sort_type: Optional[str] = Field(description="sort_type",default="ByCreateTimeAsc")
|
23
|
+
|
24
|
+
|
25
|
+
class FeishuMessageTool(BaseModel):
|
26
|
+
API_BASE_URL = "https://open.feishu.cn/open-apis"
|
27
|
+
app_id: str = Field(description="app_id")
|
28
|
+
app_secret: str = Field(description="app_secret")
|
29
|
+
|
30
|
+
def send_message(self, message: str, receive_id: str, receive_id_type: str) -> str:
|
31
|
+
"""
|
32
|
+
发送钉钉机器人消息
|
33
|
+
|
34
|
+
Args:
|
35
|
+
webhook_url: 钉钉机器人的 webhook 地址
|
36
|
+
message: 要发送的消息内容
|
37
|
+
|
38
|
+
Returns:
|
39
|
+
dict: 钉钉接口的响应结果
|
40
|
+
"""
|
41
|
+
# 构建请求头
|
42
|
+
headers = {"Content-Type": "application/json","Authorization":f"Bearer {self.get_access_token()}"}
|
43
|
+
# 构建请求体
|
44
|
+
url = f"{self.API_BASE_URL}/im/v1/messages?receive_id_type={receive_id_type}"
|
45
|
+
payload = {
|
46
|
+
"receive_id": receive_id,
|
47
|
+
"msg_type": "text",
|
48
|
+
"content": '{\"text\":\"' + message + '\"}',
|
49
|
+
# "content": message.strip('"').replace(r"\"", '"').replace(r"\\", "\\"),
|
50
|
+
}
|
51
|
+
try:
|
52
|
+
# 发送 POST 请求
|
53
|
+
response = requests.post(url=url, headers=headers, json=payload)
|
54
|
+
|
55
|
+
# 检查响应状态
|
56
|
+
response.raise_for_status()
|
57
|
+
return response.json()
|
58
|
+
|
59
|
+
except requests.exceptions.RequestException as e:
|
60
|
+
return f"发送消息失败: {str(e)}"
|
61
|
+
|
62
|
+
|
63
|
+
def get_chat_messages(
|
64
|
+
self,
|
65
|
+
container_id: str,
|
66
|
+
container_id_type: str,
|
67
|
+
start_time: Optional[str],
|
68
|
+
end_time: Optional[str],
|
69
|
+
page_size: Optional[int] ,
|
70
|
+
page_token: Optional[str],
|
71
|
+
sort_type: Optional[str],
|
72
|
+
) -> str:
|
73
|
+
"""获取聊天记录"""
|
74
|
+
url = f"{self.API_BASE_URL}/im/v1/messages"
|
75
|
+
headers = {"Content-Type": "application/json","Authorization":f"Bearer {self.get_access_token()}"}
|
76
|
+
params={
|
77
|
+
"container_id": container_id,
|
78
|
+
"container_id_type": container_id_type,
|
79
|
+
"start_time": start_time,
|
80
|
+
"end_time": end_time,
|
81
|
+
"page_token": page_token,
|
82
|
+
}
|
83
|
+
if page_size:
|
84
|
+
params["page_size"] = page_size
|
85
|
+
if sort_type:
|
86
|
+
params["sort_type"] = sort_type
|
87
|
+
try:
|
88
|
+
response = requests.get(
|
89
|
+
url=url,
|
90
|
+
headers=headers,
|
91
|
+
params=params
|
92
|
+
)
|
93
|
+
except requests.exceptions.RequestException as e:
|
94
|
+
return f"获取消息失败: {str(e)}"
|
95
|
+
|
96
|
+
if response.json()["code"] != 0:
|
97
|
+
return f"获取消息失败: {response.json()}"
|
98
|
+
|
99
|
+
return response.json()["data"]
|
100
|
+
|
101
|
+
def get_access_token(self) -> str:
|
102
|
+
url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal"
|
103
|
+
params = {"app_id":self.app_id , "app_secret": self.app_secret}
|
104
|
+
response = requests.post(url,json=params)
|
105
|
+
if response.json()["code"] != 0:
|
106
|
+
raise Exception("app_id or app_secret error")
|
107
|
+
return response.json()["tenant_access_token"]
|
108
|
+
|
109
|
+
|
110
|
+
@classmethod
|
111
|
+
def get_api_tool(cls, name: str, **kwargs: Any) -> "FeishuMessageTool":
|
112
|
+
attr_name = name.split("_", 1)[-1]
|
113
|
+
c = FeishuMessageTool(**kwargs)
|
114
|
+
class_method = getattr(c, attr_name)
|
115
|
+
|
116
|
+
return MultArgsSchemaTool(
|
117
|
+
name=name,
|
118
|
+
description=class_method.__doc__,
|
119
|
+
func=class_method,
|
120
|
+
args_schema=InputArgs,
|
121
|
+
)
|
@@ -0,0 +1,52 @@
|
|
1
|
+
from typing import Any, Optional, Type
|
2
|
+
|
3
|
+
import requests
|
4
|
+
from langchain_core.pydantic_v1 import BaseModel, Field, root_validator
|
5
|
+
from loguru import logger
|
6
|
+
|
7
|
+
from bisheng_langchain.gpts.tools.api_tools.base import (APIToolBase,
|
8
|
+
MultArgsSchemaTool)
|
9
|
+
|
10
|
+
|
11
|
+
class InputArgs(BaseModel):
|
12
|
+
url: str = Field(description="企业微信机器人的webhook地址")
|
13
|
+
message: str = Field(description="需要发送的消息")
|
14
|
+
|
15
|
+
|
16
|
+
class WechatMessageTool(BaseModel):
|
17
|
+
|
18
|
+
def send_message(self, message: str, url: str) -> str:
|
19
|
+
"""
|
20
|
+
发送企业微信机器人消息
|
21
|
+
|
22
|
+
Args:
|
23
|
+
webhook_url: 机器人的 webhook 地址
|
24
|
+
message: 要发送的消息内容
|
25
|
+
|
26
|
+
Returns:
|
27
|
+
dict: 钉钉接口的响应结果
|
28
|
+
"""
|
29
|
+
# 构建请求头
|
30
|
+
headers = {"Content-Type": "application/json"}
|
31
|
+
# 构建请求体
|
32
|
+
data = {"msgtype": "text", "text": {"content": message}}
|
33
|
+
|
34
|
+
try:
|
35
|
+
# 发送 POST 请求
|
36
|
+
response = requests.post(url=url, headers=headers, json=data)
|
37
|
+
return response.json()
|
38
|
+
except requests.exceptions.RequestException as e:
|
39
|
+
return f"发送消息失败: {str(e)}"
|
40
|
+
|
41
|
+
@classmethod
|
42
|
+
def get_api_tool(cls, name: str, **kwargs: Any) -> "WechatMessageTool":
|
43
|
+
attr_name = name.split("_", 1)[-1]
|
44
|
+
c = WechatMessageTool(**kwargs)
|
45
|
+
class_method = getattr(c, attr_name)
|
46
|
+
|
47
|
+
return MultArgsSchemaTool(
|
48
|
+
name=name,
|
49
|
+
description=class_method.__doc__,
|
50
|
+
func=class_method,
|
51
|
+
args_schema=InputArgs,
|
52
|
+
)
|
@@ -72,6 +72,9 @@ class SqlAgentAPIWrapper(BaseModel):
|
|
72
72
|
query_gen: Optional[Any]
|
73
73
|
workflow: Optional[StateGraph]
|
74
74
|
app: Optional[Any]
|
75
|
+
schema_llm: Optional[Any]
|
76
|
+
query_check_llm: Optional[Any]
|
77
|
+
query_gen_llm: Optional[Any]
|
75
78
|
|
76
79
|
class Config:
|
77
80
|
arbitrary_types_allowed = True
|
@@ -79,6 +82,11 @@ class SqlAgentAPIWrapper(BaseModel):
|
|
79
82
|
def __init__(self, **kwargs):
|
80
83
|
super().__init__(**kwargs)
|
81
84
|
self.llm = kwargs.get('llm')
|
85
|
+
|
86
|
+
# todo 修改sql agent实现逻辑。此处逻辑只支持bishengLLM组件。原因是因为目前的实现必须实例化多个llm对象,每个llm对象绑定不同的tool
|
87
|
+
self.schema_llm = self.llm.__class__(model_id=self.llm.model_id, model_name=self.llm.model_name)
|
88
|
+
self.query_check_llm = self.llm.__class__(model_id=self.llm.model_id, model_name=self.llm.model_name)
|
89
|
+
self.query_gen_llm = self.llm.__class__(model_id=self.llm.model_id, model_name=self.llm.model_name)
|
82
90
|
self.sql_address = kwargs.get('sql_address')
|
83
91
|
|
84
92
|
self.db = SQLDatabase.from_uri(self.sql_address)
|
@@ -94,7 +102,7 @@ class SqlAgentAPIWrapper(BaseModel):
|
|
94
102
|
# Define a new graph
|
95
103
|
self.workflow = StateGraph(State)
|
96
104
|
self.init_workflow()
|
97
|
-
self.app = self.workflow.compile(checkpointer=False)
|
105
|
+
self.app = self.workflow.compile(checkpointer=False, debug=True)
|
98
106
|
|
99
107
|
def init_workflow(self):
|
100
108
|
self.workflow.add_node("first_tool_call", self.first_tool_call)
|
@@ -104,7 +112,7 @@ class SqlAgentAPIWrapper(BaseModel):
|
|
104
112
|
|
105
113
|
self.workflow.add_node("get_schema_tool", create_tool_node_with_fallback([self.get_schema_tool]))
|
106
114
|
|
107
|
-
model_get_schema = self.
|
115
|
+
model_get_schema = self.schema_llm.bind_tools(
|
108
116
|
[self.get_schema_tool]
|
109
117
|
)
|
110
118
|
self.workflow.add_node(
|
@@ -162,8 +170,8 @@ class SqlAgentAPIWrapper(BaseModel):
|
|
162
170
|
query_check_prompt = ChatPromptTemplate.from_messages(
|
163
171
|
[("system", query_check_system), ("placeholder", "{messages}")]
|
164
172
|
)
|
165
|
-
query_check = query_check_prompt | self.
|
166
|
-
[self.db_query_tool]
|
173
|
+
query_check = query_check_prompt | self.query_check_llm.bind_tools(
|
174
|
+
[self.db_query_tool]
|
167
175
|
)
|
168
176
|
return query_check
|
169
177
|
|
@@ -195,7 +203,7 @@ class SqlAgentAPIWrapper(BaseModel):
|
|
195
203
|
query_gen_prompt = ChatPromptTemplate.from_messages(
|
196
204
|
[("system", query_gen_system), ("placeholder", "{messages}")]
|
197
205
|
)
|
198
|
-
query_gen = query_gen_prompt | self.
|
206
|
+
query_gen = query_gen_prompt | self.query_gen_llm.bind_tools(
|
199
207
|
[SubmitFinalAnswer]
|
200
208
|
)
|
201
209
|
return query_gen
|
@@ -1,6 +1,7 @@
|
|
1
1
|
"""Wrapper around Elasticsearch vector database."""
|
2
2
|
from __future__ import annotations
|
3
3
|
|
4
|
+
import ast
|
4
5
|
import uuid
|
5
6
|
from abc import ABC
|
6
7
|
from typing import TYPE_CHECKING, Any, Callable, Dict, Iterable, List, Optional, Tuple
|
@@ -233,7 +234,7 @@ class ElasticKeywordsSearch(VectorStore, ABC):
|
|
233
234
|
keywords_str = self.llm_chain.run(query)
|
234
235
|
print('llm search keywords:', keywords_str)
|
235
236
|
try:
|
236
|
-
keywords =
|
237
|
+
keywords = ast.literal_eval(keywords_str)
|
237
238
|
if not isinstance(keywords, list):
|
238
239
|
raise ValueError('Keywords extracted by llm is not list.')
|
239
240
|
except Exception as e:
|
@@ -37,10 +37,10 @@ bisheng_langchain/chat_models/host_llm.py,sha256=35_jTdUm85mk-t2MARZYGC8dIPVtf5X
|
|
37
37
|
bisheng_langchain/chat_models/minimax.py,sha256=JLs_f6vWD9beZYUtjD4FG28G8tZHrGUAWOwdLIuJomw,13901
|
38
38
|
bisheng_langchain/chat_models/proxy_llm.py,sha256=3ZCWU4n4eEMQcWiZt1BgD6DuVlbW8IyZSWGPsRunQco,17084
|
39
39
|
bisheng_langchain/chat_models/qwen.py,sha256=W73KxDRQBUZEzttEM4K7ZzPqbN-82O6YQmpX-HB_wZU,19971
|
40
|
-
bisheng_langchain/chat_models/sensetime.py,sha256=
|
40
|
+
bisheng_langchain/chat_models/sensetime.py,sha256=vHFIPqjEkiS54BHHGD9_Z1WhNfxsWudnUG-_DZQYt9E,17079
|
41
41
|
bisheng_langchain/chat_models/wenxin.py,sha256=OBXmFWkUWZMu1lUz6hPAEawsbAcdgMWcm9WkJJLZyng,13671
|
42
42
|
bisheng_langchain/chat_models/xunfeiai.py,sha256=Yz09-I8u6XhGVnT5mdel15Z3CCQZqApJkgnaxyiZNFk,14037
|
43
|
-
bisheng_langchain/chat_models/zhipuai.py,sha256=
|
43
|
+
bisheng_langchain/chat_models/zhipuai.py,sha256=CO_kadwv2Vp6_5wjKhXJKRSxme4AOkd_ymMuV2dWGtU,15365
|
44
44
|
bisheng_langchain/chat_models/interface/__init__.py,sha256=KwcZMPSxFiXu6joXoZEgq6THxZeDXA8neZcOuLKBpUk,443
|
45
45
|
bisheng_langchain/chat_models/interface/minimax.py,sha256=tF3S7ryFtYVXwh7jHHH9z1eY8nMCy0iLiFocsPSJ3pA,4423
|
46
46
|
bisheng_langchain/chat_models/interface/openai.py,sha256=v4kxxglJoVMJ9kxaRDIJnWHBSvjl9vRhzQb5Fr-keg0,2081
|
@@ -73,7 +73,7 @@ bisheng_langchain/gpts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
|
|
73
73
|
bisheng_langchain/gpts/assistant.py,sha256=Xx5sNVJzB9chUHf9jYigNugWw-gyEIb6GpLOnrMWDXU,5552
|
74
74
|
bisheng_langchain/gpts/auto_optimization.py,sha256=WNsC19rgvuDYQlSIaYThq5RqCbuobDbzCwAJW4Ksw0c,3626
|
75
75
|
bisheng_langchain/gpts/auto_tool_selected.py,sha256=21WETf9o0YS-QEBwv3mmZRObKWszefQkXEqAA6KzoaM,1582
|
76
|
-
bisheng_langchain/gpts/load_tools.py,sha256=
|
76
|
+
bisheng_langchain/gpts/load_tools.py,sha256=uQ-jcnkwRdy2l2S61WQWuodlGAbhHjEwJTTBQ17eHro,9039
|
77
77
|
bisheng_langchain/gpts/message_types.py,sha256=7EJOx62j9E1U67jxWgxE_I7a8IjAvvKANknXkD2gFm0,213
|
78
78
|
bisheng_langchain/gpts/utils.py,sha256=t3YDxaJ0OYd6EKsek7PJFRYnsezwzEFK5oVU-PRbu5g,6671
|
79
79
|
bisheng_langchain/gpts/agent_types/__init__.py,sha256=88tFt1GfrfIqa4hCg0cMJk7rTeUmCSSdiVhR41CW4rM,381
|
@@ -88,15 +88,19 @@ bisheng_langchain/gpts/prompts/opening_dialog_prompt.py,sha256=VVF0JLHtetupVB0ka
|
|
88
88
|
bisheng_langchain/gpts/prompts/react_agent_prompt.py,sha256=MA5FReipAYfe6ypOvg_SJSlHxsjNdCh1HFG22axjFLo,1968
|
89
89
|
bisheng_langchain/gpts/prompts/select_tools_prompt.py,sha256=AyvVnrLEsQy7RHuGTPkcrMUxgA98Q0TzF-xweoc7GyY,1400
|
90
90
|
bisheng_langchain/gpts/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
91
|
-
bisheng_langchain/gpts/tools/api_tools/__init__.py,sha256=
|
91
|
+
bisheng_langchain/gpts/tools/api_tools/__init__.py,sha256=PovWXou3paSpV9xABCt4HBqcD5saW4gYg1W7eut8oFQ,4810
|
92
92
|
bisheng_langchain/gpts/tools/api_tools/base.py,sha256=zPUCM_mOM9ygsc8pwejZvngEfEvGtiWTKbavfza7Eqg,3593
|
93
|
+
bisheng_langchain/gpts/tools/api_tools/firecrawl.py,sha256=9zvgE1N1Z9jb8zIpyiDFKP_31bStP4u13fhTPFIVvf8,2682
|
93
94
|
bisheng_langchain/gpts/tools/api_tools/flow.py,sha256=ot2YAYgQGWgUpb2nCECAmpqHY6m0SgzwkupF9kDT3lU,2461
|
95
|
+
bisheng_langchain/gpts/tools/api_tools/jina.py,sha256=lk8t_PlrcVS_oI5DHgNYpwLtC2tquTb4XmJvJNRsF-k,1321
|
94
96
|
bisheng_langchain/gpts/tools/api_tools/macro_data.py,sha256=FyG-qtl2ECS1CDKt6olN0eDTDM91d-UvDkMDBiVLgYQ,27429
|
95
|
-
bisheng_langchain/gpts/tools/api_tools/openapi.py,sha256=
|
97
|
+
bisheng_langchain/gpts/tools/api_tools/openapi.py,sha256=6SiL-p80-SN8Q1LWnEqjR7Baq3RfqDwpdjZmOiQQItc,6648
|
98
|
+
bisheng_langchain/gpts/tools/api_tools/silicon_flow.py,sha256=VRMqiqO2yWGpYwF2OktSFf9mBNCAioV0Nu2FPBA9x7U,2035
|
96
99
|
bisheng_langchain/gpts/tools/api_tools/sina.py,sha256=4KpK7_HUUtjpdJ-K4LjPlb-occyAZcRtmmCWqJ2BotE,9708
|
97
100
|
bisheng_langchain/gpts/tools/api_tools/tianyancha.py,sha256=abDAz-yAH1-2rKiSmZ6TgnrNUnpgAZpDY8oDiWfWapc,6684
|
98
101
|
bisheng_langchain/gpts/tools/bing_search/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
99
|
-
bisheng_langchain/gpts/tools/bing_search/
|
102
|
+
bisheng_langchain/gpts/tools/bing_search/self_arxiv.py,sha256=Wo8UXgj6zPYADPccIwDP46vIpaMpxxZvBSx6CUBn1V8,1609
|
103
|
+
bisheng_langchain/gpts/tools/bing_search/tool.py,sha256=qxeExWyL_wZVGtbcFuHYf9mauUK6oH6D2YkhzvytPLY,1710
|
100
104
|
bisheng_langchain/gpts/tools/calculator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
101
105
|
bisheng_langchain/gpts/tools/calculator/tool.py,sha256=iwGPE7jvxZg_jUL2Aq9HHwnRJrF9-ongwrsBX6uk1U0,705
|
102
106
|
bisheng_langchain/gpts/tools/code_interpreter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -105,8 +109,13 @@ bisheng_langchain/gpts/tools/dalle_image_generator/__init__.py,sha256=47DEQpj8HB
|
|
105
109
|
bisheng_langchain/gpts/tools/dalle_image_generator/tool.py,sha256=h_mSGn2fvw4wGufrqKYC3lI1LLo9Uu_rynDM88IonMA,7631
|
106
110
|
bisheng_langchain/gpts/tools/get_current_time/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
107
111
|
bisheng_langchain/gpts/tools/get_current_time/tool.py,sha256=3uvk7Yu07qhZy1sBrFMhGEwyxEGMB8vubizs9x-6DG8,801
|
112
|
+
bisheng_langchain/gpts/tools/message/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
113
|
+
bisheng_langchain/gpts/tools/message/dingding.py,sha256=ovYzyJZpVprKm9-qEAst8rDFKBOj_fVFs1YLA2B6-lg,1744
|
114
|
+
bisheng_langchain/gpts/tools/message/email.py,sha256=Oirj4gw-ZkS0EeuPrYG3dSqAHSPSY67CIKZUcAolqE0,3522
|
115
|
+
bisheng_langchain/gpts/tools/message/feishu.py,sha256=yVoaugM7T67vNT5r9y8eHjUzmox5NxKnawxrq48bRtc,4519
|
116
|
+
bisheng_langchain/gpts/tools/message/wechat.py,sha256=iUHXWiVwlE0GhkSEhzCBOiZq-orkReiBvvCV5PCFImo,1666
|
108
117
|
bisheng_langchain/gpts/tools/sql_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
109
|
-
bisheng_langchain/gpts/tools/sql_agent/tool.py,sha256=
|
118
|
+
bisheng_langchain/gpts/tools/sql_agent/tool.py,sha256=WIN0rfdrNR7uGDIc_VGdPjzXrVnUs24OAicOl0_-5bM,11861
|
110
119
|
bisheng_langchain/input_output/__init__.py,sha256=sW_GB7MlrHYsqY1Meb_LeimQqNsMz1gH-00Tqb2BUyM,153
|
111
120
|
bisheng_langchain/input_output/input.py,sha256=I5YDmgbvvj1o2lO9wi8LE37wM0wP5jkhUREU32YrZMQ,1094
|
112
121
|
bisheng_langchain/input_output/output.py,sha256=6U-az6-Cwz665C2YmcH3SYctWVjPFjmW8s70CA_qphk,11585
|
@@ -154,10 +163,10 @@ bisheng_langchain/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
|
|
154
163
|
bisheng_langchain/utils/azure_dalle_image_generator.py,sha256=96-_nO4hDSwyPE4rSYop5SgJ-U9CE2un4bTdW0E5RGU,6582
|
155
164
|
bisheng_langchain/utils/requests.py,sha256=vWGKyNTxApVeaVdKxqACfIT1Q8wMy-jC3kUv2Ce9Mzc,8688
|
156
165
|
bisheng_langchain/vectorstores/__init__.py,sha256=zCZgDe7LyQ0iDkfcm5UJ5NxwKQSRHnqrsjx700Fy11M,213
|
157
|
-
bisheng_langchain/vectorstores/elastic_keywords_search.py,sha256=
|
166
|
+
bisheng_langchain/vectorstores/elastic_keywords_search.py,sha256=BxvT9FUTju4AZPtQFTbYLmIIKKw8bqcact5Cav_5H2I,15357
|
158
167
|
bisheng_langchain/vectorstores/milvus.py,sha256=jWq_lce-ihOz07D1kwj5ctPzElYexNCjJ-xSv-pK1CI,37172
|
159
168
|
bisheng_langchain/vectorstores/retriever.py,sha256=hj4nAAl352EV_ANnU2OHJn7omCH3nBK82ydo14KqMH4,4353
|
160
|
-
bisheng_langchain-0.
|
161
|
-
bisheng_langchain-0.
|
162
|
-
bisheng_langchain-0.
|
163
|
-
bisheng_langchain-0.
|
169
|
+
bisheng_langchain-1.0.0.dist-info/METADATA,sha256=GdivqH5jT1mf7I_xk3v8Dz7YIIzasRn_nb1fd-4kt28,2439
|
170
|
+
bisheng_langchain-1.0.0.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
171
|
+
bisheng_langchain-1.0.0.dist-info/top_level.txt,sha256=Z6pPNyCo4ihyr9iqGQbH8sJiC4dAUwA_mAyGRQB5_Fs,18
|
172
|
+
bisheng_langchain-1.0.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|