bisheng-langchain 0.4.1.2__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.
@@ -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 = eval(text)
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 = eval(text)
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.tool import BingSearchRun
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=ArxivAPIWrapper())
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 BingSearchRun(api_wrapper=BingSearchAPIWrapper(**kwargs))
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 = 4
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.llm.bind_tools(
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.llm.bind_tools(
166
- [self.db_query_tool], tool_choice="required"
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.llm.bind_tools(
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 = eval(keywords_str)
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:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bisheng-langchain
3
- Version: 0.4.1.2
3
+ Version: 1.0.0
4
4
  Summary: bisheng langchain modules
5
5
  Home-page: https://github.com/dataelement/bisheng
6
6
  Author: DataElem
@@ -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=fuQ5yYGO5F7o7iQ7us17MlL4TAWRRFCCpNN9bAF-ydc,17056
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=MgN8pFInUB6q5agZSnAOipYxTIxAAGhh-Zq6NXs9Hxc,15342
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=uaz80q56lK-VchYkU908W5i0ytsztAJNlHBqQTnIMRI,8868
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=CkEjgIFM4GIv86V1B7SsFLaB6M86c54QuO8wIRizUZ8,1608
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=7i2Dw05u7FMKWeCKBvkNuPt9z575GaYyy-VyodUc2JM,5760
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/tool.py,sha256=v_VlqcMplITA5go5qWA4qZ5p43E1-1s0bzmyY7H0hqY,1710
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=YhKfYOzy4XOMcQtW-AUe85sgWRT5k0--zW4VK6oO-Dg,11239
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=sIMbud4UfbfLTLf_pIIfcVC2lHbaTWCTTABTFP5mXkE,15334
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.4.1.2.dist-info/METADATA,sha256=KoaWVufE0MmVMNM8fep7mmlrnM1JgySbaVTxvgInzBk,2441
161
- bisheng_langchain-0.4.1.2.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
162
- bisheng_langchain-0.4.1.2.dist-info/top_level.txt,sha256=Z6pPNyCo4ihyr9iqGQbH8sJiC4dAUwA_mAyGRQB5_Fs,18
163
- bisheng_langchain-0.4.1.2.dist-info/RECORD,,
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,,