bisheng-langchain 1.0.1__py3-none-any.whl → 1.2.0.dev1__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/agents/chatglm_functions_agent/base.py +6 -3
- bisheng_langchain/agents/llm_functions_agent/base.py +6 -3
- bisheng_langchain/chains/qa_generation/base.py +1 -1
- bisheng_langchain/chains/transform.py +1 -1
- bisheng_langchain/chat_models/host_llm.py +13 -8
- bisheng_langchain/chat_models/minimax.py +4 -7
- bisheng_langchain/chat_models/proxy_llm.py +5 -7
- bisheng_langchain/chat_models/qwen.py +5 -7
- bisheng_langchain/chat_models/sensetime.py +5 -7
- bisheng_langchain/chat_models/wenxin.py +4 -7
- bisheng_langchain/chat_models/xunfeiai.py +4 -7
- bisheng_langchain/chat_models/zhipuai.py +4 -7
- bisheng_langchain/embeddings/host_embedding.py +6 -4
- bisheng_langchain/embeddings/huggingfacegte.py +2 -2
- bisheng_langchain/embeddings/huggingfacemultilingual.py +2 -2
- bisheng_langchain/embeddings/wenxin.py +5 -8
- bisheng_langchain/gpts/agent_types/llm_functions_agent.py +6 -78
- bisheng_langchain/gpts/agent_types/llm_react_agent.py +2 -5
- bisheng_langchain/gpts/tools/api_tools/base.py +5 -7
- bisheng_langchain/gpts/tools/api_tools/firecrawl.py +1 -1
- bisheng_langchain/gpts/tools/api_tools/flow.py +1 -1
- bisheng_langchain/gpts/tools/api_tools/jina.py +6 -4
- bisheng_langchain/gpts/tools/api_tools/macro_data.py +3 -3
- bisheng_langchain/gpts/tools/api_tools/openapi.py +8 -6
- bisheng_langchain/gpts/tools/api_tools/sina.py +1 -1
- bisheng_langchain/gpts/tools/api_tools/tianyancha.py +6 -3
- bisheng_langchain/gpts/tools/bing_search/tool.py +2 -2
- bisheng_langchain/gpts/tools/calculator/tool.py +2 -2
- bisheng_langchain/gpts/tools/code_interpreter/tool.py +2 -2
- bisheng_langchain/gpts/tools/dalle_image_generator/tool.py +7 -11
- bisheng_langchain/gpts/tools/get_current_time/tool.py +1 -1
- bisheng_langchain/gpts/tools/message/dingding.py +1 -2
- bisheng_langchain/gpts/tools/message/email.py +2 -4
- bisheng_langchain/gpts/tools/message/feishu.py +10 -11
- bisheng_langchain/gpts/tools/message/wechat.py +2 -3
- bisheng_langchain/gpts/tools/sql_agent/tool.py +23 -20
- bisheng_langchain/input_output/input.py +7 -11
- bisheng_langchain/input_output/output.py +2 -6
- bisheng_langchain/memory/redis.py +3 -3
- bisheng_langchain/rag/bisheng_rag_chain.py +2 -8
- bisheng_langchain/rag/bisheng_rag_tool.py +1 -1
- bisheng_langchain/rag/init_retrievers/baseline_vector_retriever.py +1 -1
- bisheng_langchain/rag/init_retrievers/keyword_retriever.py +1 -1
- bisheng_langchain/rag/init_retrievers/mix_retriever.py +1 -1
- bisheng_langchain/rag/init_retrievers/smaller_chunks_retriever.py +2 -2
- bisheng_langchain/retrievers/ensemble.py +3 -2
- bisheng_langchain/utils/azure_dalle_image_generator.py +3 -2
- bisheng_langchain/utils/requests.py +10 -19
- bisheng_langchain/vectorstores/retriever.py +4 -7
- {bisheng_langchain-1.0.1.dist-info → bisheng_langchain-1.2.0.dev1.dist-info}/METADATA +13 -13
- {bisheng_langchain-1.0.1.dist-info → bisheng_langchain-1.2.0.dev1.dist-info}/RECORD +53 -53
- {bisheng_langchain-1.0.1.dist-info → bisheng_langchain-1.2.0.dev1.dist-info}/WHEEL +1 -1
- {bisheng_langchain-1.0.1.dist-info → bisheng_langchain-1.2.0.dev1.dist-info}/top_level.txt +0 -0
@@ -2,6 +2,8 @@ import json
|
|
2
2
|
import re
|
3
3
|
from typing import Any, Dict, List, Optional, Sequence, Tuple, Union
|
4
4
|
|
5
|
+
from pydantic import model_validator, Field
|
6
|
+
|
5
7
|
from bisheng_langchain.chat_models.host_llm import HostChatGLM
|
6
8
|
from langchain.agents.agent import Agent, AgentOutputParser, BaseSingleActionAgent
|
7
9
|
from langchain.agents.structured_chat.output_parser import StructuredChatOutputParserWithRetries
|
@@ -14,7 +16,6 @@ from langchain.schema import AgentAction, AgentFinish, BasePromptTemplate
|
|
14
16
|
from langchain.schema.language_model import BaseLanguageModel
|
15
17
|
from langchain.schema.messages import ChatMessage
|
16
18
|
from langchain.tools import BaseTool, StructuredTool
|
17
|
-
from langchain_core.pydantic_v1 import Field, root_validator
|
18
19
|
|
19
20
|
HUMAN_MESSAGE_TEMPLATE = '{input}\n\n{agent_scratchpad}'
|
20
21
|
|
@@ -81,13 +82,15 @@ class ChatglmFunctionsAgent(BaseSingleActionAgent):
|
|
81
82
|
"""Get allowed tools."""
|
82
83
|
return list([t.name for t in self.tools])
|
83
84
|
|
84
|
-
@
|
85
|
+
@model_validator(mode='before')
|
86
|
+
@classmethod
|
85
87
|
def validate_llm(cls, values: dict) -> dict:
|
86
88
|
if not isinstance(values['llm'], HostChatGLM):
|
87
89
|
raise ValueError('Only supported with ChatGLM3 models.')
|
88
90
|
return values
|
89
91
|
|
90
|
-
@
|
92
|
+
@model_validator(mode='before')
|
93
|
+
@classmethod
|
91
94
|
def validate_prompt(cls, values: dict) -> dict:
|
92
95
|
prompt: BasePromptTemplate = values['prompt']
|
93
96
|
if 'agent_scratchpad' not in prompt.input_variables:
|
@@ -3,6 +3,8 @@ import json
|
|
3
3
|
from json import JSONDecodeError
|
4
4
|
from typing import Any, List, Optional, Sequence, Tuple, Union
|
5
5
|
|
6
|
+
from pydantic import model_validator
|
7
|
+
|
6
8
|
from bisheng_langchain.chat_models.host_llm import HostQwenChat
|
7
9
|
from bisheng_langchain.chat_models.proxy_llm import ProxyChatLLM
|
8
10
|
from langchain.agents import BaseSingleActionAgent
|
@@ -16,7 +18,6 @@ from langchain.schema.messages import AIMessage, BaseMessage, FunctionMessage, S
|
|
16
18
|
from langchain.tools import BaseTool
|
17
19
|
from langchain.tools.convert_to_openai import format_tool_to_openai_function
|
18
20
|
from langchain_core.agents import AgentActionMessageLog
|
19
|
-
from langchain_core.pydantic_v1 import root_validator
|
20
21
|
from langchain_openai import ChatOpenAI
|
21
22
|
|
22
23
|
|
@@ -135,7 +136,8 @@ class LLMFunctionsAgent(BaseSingleActionAgent):
|
|
135
136
|
"""Get allowed tools."""
|
136
137
|
return list([t.name for t in self.tools])
|
137
138
|
|
138
|
-
@
|
139
|
+
@model_validator(mode='before')
|
140
|
+
@classmethod
|
139
141
|
def validate_llm(cls, values: dict) -> dict:
|
140
142
|
if ((not isinstance(values['llm'], ChatOpenAI))
|
141
143
|
and (not isinstance(values['llm'], HostQwenChat))
|
@@ -144,7 +146,8 @@ class LLMFunctionsAgent(BaseSingleActionAgent):
|
|
144
146
|
'Only supported with ChatOpenAI and HostQwenChat and ProxyChatLLM models.')
|
145
147
|
return values
|
146
148
|
|
147
|
-
@
|
149
|
+
@model_validator(mode='before')
|
150
|
+
@classmethod
|
148
151
|
def validate_prompt(cls, values: dict) -> dict:
|
149
152
|
prompt: BasePromptTemplate = values['prompt']
|
150
153
|
if 'agent_scratchpad' not in prompt.input_variables:
|
@@ -9,7 +9,7 @@ from typing import Any, Dict, List, Optional
|
|
9
9
|
from langchain_core.callbacks import CallbackManagerForChainRun
|
10
10
|
from langchain_core.language_models import BaseLanguageModel
|
11
11
|
from langchain_core.prompts import BasePromptTemplate, ChatPromptTemplate
|
12
|
-
from
|
12
|
+
from pydantic import Field
|
13
13
|
from langchain_text_splitters import RecursiveCharacterTextSplitter, TextSplitter
|
14
14
|
|
15
15
|
from langchain.chains.base import Chain
|
@@ -6,7 +6,7 @@ from typing import Any, Awaitable, Callable, Dict, List, Optional
|
|
6
6
|
|
7
7
|
from langchain.chains.base import Chain
|
8
8
|
from langchain_core.callbacks import AsyncCallbackManagerForChainRun, CallbackManagerForChainRun
|
9
|
-
from
|
9
|
+
from pydantic import Field
|
10
10
|
|
11
11
|
logger = logging.getLogger(__name__)
|
12
12
|
|
@@ -7,6 +7,8 @@ import sys
|
|
7
7
|
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Mapping, Optional, Tuple, Union
|
8
8
|
|
9
9
|
import requests
|
10
|
+
from pydantic import ConfigDict, model_validator, Field
|
11
|
+
|
10
12
|
from bisheng_langchain.utils.requests import Requests
|
11
13
|
from langchain.callbacks.manager import AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun
|
12
14
|
from langchain.chat_models.base import BaseChatModel
|
@@ -15,7 +17,6 @@ from langchain.schema.messages import (AIMessage, BaseMessage, ChatMessage, Func
|
|
15
17
|
HumanMessage, SystemMessage)
|
16
18
|
from langchain.utils import get_from_dict_or_env
|
17
19
|
from langchain_core.language_models.llms import create_base_retry_decorator
|
18
|
-
from langchain_core.pydantic_v1 import Field, root_validator
|
19
20
|
|
20
21
|
# from requests.exceptions import HTTPError
|
21
22
|
|
@@ -112,6 +113,7 @@ class BaseHostChatLLM(BaseChatModel):
|
|
112
113
|
model_kwargs: Optional[Dict[str, Any]] = Field(default_factory=dict)
|
113
114
|
"""Holds any model parameters valid for `create` call not explicitly specified."""
|
114
115
|
host_base_url: Optional[str] = None
|
116
|
+
is_ssl: Optional[bool] = False
|
115
117
|
|
116
118
|
headers: Optional[Dict[str, str]] = Field(default_factory=dict)
|
117
119
|
|
@@ -137,13 +139,10 @@ class BaseHostChatLLM(BaseChatModel):
|
|
137
139
|
verbose: Optional[bool] = False
|
138
140
|
|
139
141
|
decoupled: Optional[bool] = False
|
142
|
+
model_config = ConfigDict(validate_by_name=True)
|
140
143
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
allow_population_by_field_name = True
|
145
|
-
|
146
|
-
@root_validator()
|
144
|
+
@model_validator(mode='before')
|
145
|
+
@classmethod
|
147
146
|
def validate_environment(cls, values: Dict) -> Dict:
|
148
147
|
"""Validate that api key and python package exists in environment."""
|
149
148
|
values['host_base_url'] = get_from_dict_or_env(values, 'host_base_url', 'HostBaseUrl')
|
@@ -170,7 +169,13 @@ class BaseHostChatLLM(BaseChatModel):
|
|
170
169
|
headers = values['headers']
|
171
170
|
else:
|
172
171
|
headers = {'Content-Type': 'application/json'}
|
173
|
-
|
172
|
+
if cls.is_ssl and "https" in values['host_base_url']:
|
173
|
+
import aiohttp
|
174
|
+
values['client'] = Requests(headers=headers,
|
175
|
+
aiosession=aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=False)),
|
176
|
+
request_timeout=values['request_timeout'])
|
177
|
+
else:
|
178
|
+
values['client'] = Requests(headers=headers, request_timeout=values['request_timeout'])
|
174
179
|
except AttributeError:
|
175
180
|
raise ValueError('Try upgrading it with `pip install --upgrade requests`.')
|
176
181
|
return values
|
@@ -12,7 +12,7 @@ from langchain.schema import ChatGeneration, ChatResult
|
|
12
12
|
from langchain.schema.messages import (AIMessage, BaseMessage, ChatMessage, FunctionMessage,
|
13
13
|
HumanMessage, SystemMessage)
|
14
14
|
from langchain.utils import get_from_dict_or_env
|
15
|
-
from
|
15
|
+
from pydantic import ConfigDict, model_validator, Field
|
16
16
|
from tenacity import (before_sleep_log, retry, retry_if_exception_type, stop_after_attempt,
|
17
17
|
wait_exponential)
|
18
18
|
|
@@ -141,13 +141,10 @@ class ChatMinimaxAI(BaseChatModel):
|
|
141
141
|
when tiktoken is called, you can specify a model name to use here."""
|
142
142
|
|
143
143
|
verbose: Optional[bool] = False
|
144
|
+
model_config = ConfigDict(validate_by_name=True)
|
144
145
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
allow_population_by_field_name = True
|
149
|
-
|
150
|
-
@root_validator()
|
146
|
+
@model_validator(mode='before')
|
147
|
+
@classmethod
|
151
148
|
def validate_environment(cls, values: Dict) -> Dict:
|
152
149
|
"""Validate that api key and python package exists in environment."""
|
153
150
|
values['minimaxai_api_key'] = get_from_dict_or_env(values, 'minimaxai_api_key',
|
@@ -6,6 +6,8 @@ import logging
|
|
6
6
|
import sys
|
7
7
|
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Mapping, Optional, Tuple, Union
|
8
8
|
|
9
|
+
from pydantic import ConfigDict, model_validator, Field
|
10
|
+
|
9
11
|
from bisheng_langchain.utils import requests
|
10
12
|
from langchain.callbacks.manager import AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun
|
11
13
|
from langchain.chat_models.base import BaseChatModel
|
@@ -13,7 +15,6 @@ from langchain.schema import ChatGeneration, ChatResult
|
|
13
15
|
from langchain.schema.messages import (AIMessage, BaseMessage, ChatMessage, FunctionMessage,
|
14
16
|
HumanMessage, SystemMessage)
|
15
17
|
from langchain.utils import get_from_dict_or_env
|
16
|
-
from langchain_core.pydantic_v1 import Field, root_validator
|
17
18
|
from tenacity import (before_sleep_log, retry, retry_if_exception_type, stop_after_attempt,
|
18
19
|
wait_exponential)
|
19
20
|
|
@@ -137,13 +138,10 @@ class ProxyChatLLM(BaseChatModel):
|
|
137
138
|
when using one of the many model providers that expose an OpenAI-like
|
138
139
|
API but with different models. In those cases, in order to avoid erroring
|
139
140
|
when tiktoken is called, you can specify a model name to use here."""
|
141
|
+
model_config = ConfigDict(validate_by_name=True)
|
140
142
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
allow_population_by_field_name = True
|
145
|
-
|
146
|
-
@root_validator()
|
143
|
+
@model_validator(mode='before')
|
144
|
+
@classmethod
|
147
145
|
def validate_environment(cls, values: Dict) -> Dict:
|
148
146
|
"""Validate that api key and python package exists in environment."""
|
149
147
|
values['elemai_api_key'] = get_from_dict_or_env(values, 'elemai_api_key', 'ELEMAI_API_KEY')
|
@@ -7,6 +7,8 @@ import logging
|
|
7
7
|
import sys
|
8
8
|
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Mapping, Optional, Tuple, Union
|
9
9
|
|
10
|
+
from pydantic import ConfigDict, model_validator, Field
|
11
|
+
|
10
12
|
from bisheng_langchain.utils.requests import Requests
|
11
13
|
# import requests
|
12
14
|
from langchain.callbacks.manager import AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun
|
@@ -15,7 +17,6 @@ from langchain.schema import ChatGeneration, ChatResult
|
|
15
17
|
from langchain.schema.messages import (AIMessage, BaseMessage, ChatMessage, FunctionMessage,
|
16
18
|
HumanMessage, SystemMessage, ToolMessage)
|
17
19
|
from langchain.utils import get_from_dict_or_env
|
18
|
-
from langchain_core.pydantic_v1 import Field, root_validator
|
19
20
|
from tenacity import (before_sleep_log, retry, retry_if_exception_type, stop_after_attempt,
|
20
21
|
wait_exponential)
|
21
22
|
|
@@ -165,13 +166,10 @@ class ChatQWen(BaseChatModel):
|
|
165
166
|
API but with different models. In those cases, in order to avoid erroring
|
166
167
|
when tiktoken is called, you can specify a model name to use here."""
|
167
168
|
verbose: Optional[bool] = False
|
169
|
+
model_config = ConfigDict(validate_by_name=True)
|
168
170
|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
allow_population_by_field_name = True
|
173
|
-
|
174
|
-
@root_validator()
|
171
|
+
@model_validator(mode='before')
|
172
|
+
@classmethod
|
175
173
|
def validate_environment(cls, values: Dict) -> Dict:
|
176
174
|
"""Validate that api key and python package exists in environment."""
|
177
175
|
values['api_key'] = get_from_dict_or_env(values, 'api_key', 'QWEN_API_KEY')
|
@@ -7,6 +7,8 @@ import time
|
|
7
7
|
from typing import Any, Dict, List, Mapping, Optional, Tuple, Union
|
8
8
|
|
9
9
|
import jwt
|
10
|
+
from pydantic import ConfigDict, model_validator, Field
|
11
|
+
|
10
12
|
from bisheng_langchain.utils.requests import Requests
|
11
13
|
from langchain.callbacks.manager import AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun
|
12
14
|
from langchain.chat_models.base import BaseChatModel
|
@@ -14,7 +16,6 @@ from langchain.schema import ChatGeneration, ChatResult
|
|
14
16
|
from langchain.schema.messages import (AIMessage, BaseMessage, ChatMessage, FunctionMessage,
|
15
17
|
HumanMessage, SystemMessage)
|
16
18
|
from langchain.utils import get_from_dict_or_env
|
17
|
-
from langchain_core.pydantic_v1 import Field, root_validator
|
18
19
|
from tenacity import (before_sleep_log, retry, retry_if_exception_type, stop_after_attempt,
|
19
20
|
wait_exponential)
|
20
21
|
|
@@ -157,13 +158,10 @@ class SenseChat(BaseChatModel):
|
|
157
158
|
API but with different models. In those cases, in order to avoid erroring
|
158
159
|
when tiktoken is called, you can specify a model name to use here."""
|
159
160
|
verbose: Optional[bool] = False
|
161
|
+
model_config = ConfigDict(validate_by_name=True)
|
160
162
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
allow_population_by_field_name = True
|
165
|
-
|
166
|
-
@root_validator()
|
163
|
+
@model_validator(mode='before')
|
164
|
+
@classmethod
|
167
165
|
def validate_environment(cls, values: Dict) -> Dict:
|
168
166
|
"""Validate that api key and python package exists in environment."""
|
169
167
|
|
@@ -12,7 +12,7 @@ from langchain.schema import ChatGeneration, ChatResult
|
|
12
12
|
from langchain.schema.messages import (AIMessage, BaseMessage, ChatMessage, FunctionMessage,
|
13
13
|
HumanMessage, SystemMessage)
|
14
14
|
from langchain.utils import get_from_dict_or_env
|
15
|
-
from
|
15
|
+
from pydantic import ConfigDict, model_validator, Field
|
16
16
|
from tenacity import (before_sleep_log, retry, retry_if_exception_type, stop_after_attempt,
|
17
17
|
wait_exponential)
|
18
18
|
|
@@ -138,13 +138,10 @@ class ChatWenxin(BaseChatModel):
|
|
138
138
|
API but with different models. In those cases, in order to avoid erroring
|
139
139
|
when tiktoken is called, you can specify a model name to use here."""
|
140
140
|
verbose: Optional[bool] = False
|
141
|
+
model_config = ConfigDict(validate_by_name=True)
|
141
142
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
allow_population_by_field_name = True
|
146
|
-
|
147
|
-
@root_validator()
|
143
|
+
@model_validator(mode='before')
|
144
|
+
@classmethod
|
148
145
|
def validate_environment(cls, values: Dict) -> Dict:
|
149
146
|
"""Validate that api key and python package exists in environment."""
|
150
147
|
values['wenxin_api_key'] = get_from_dict_or_env(values, 'wenxin_api_key', 'WENXIN_API_KEY')
|
@@ -12,7 +12,7 @@ from langchain.schema import ChatGeneration, ChatResult
|
|
12
12
|
from langchain.schema.messages import (AIMessage, BaseMessage, ChatMessage, FunctionMessage,
|
13
13
|
HumanMessage, SystemMessage)
|
14
14
|
from langchain.utils import get_from_dict_or_env
|
15
|
-
from
|
15
|
+
from pydantic import ConfigDict, model_validator, Field
|
16
16
|
from tenacity import (before_sleep_log, retry, retry_if_exception_type, stop_after_attempt,
|
17
17
|
wait_exponential)
|
18
18
|
|
@@ -141,13 +141,10 @@ class ChatXunfeiAI(BaseChatModel):
|
|
141
141
|
API but with different models. In those cases, in order to avoid erroring
|
142
142
|
when tiktoken is called, you can specify a model name to use here."""
|
143
143
|
verbose: Optional[bool] = False
|
144
|
+
model_config = ConfigDict(validate_by_name=True)
|
144
145
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
allow_population_by_field_name = True
|
149
|
-
|
150
|
-
@root_validator()
|
146
|
+
@model_validator(mode='before')
|
147
|
+
@classmethod
|
151
148
|
def validate_environment(cls, values: Dict) -> Dict:
|
152
149
|
"""Validate that api key and python package exists in environment."""
|
153
150
|
values['xunfeiai_appid'] = get_from_dict_or_env(
|
@@ -12,7 +12,7 @@ from langchain.schema import ChatGeneration, ChatResult
|
|
12
12
|
from langchain.schema.messages import (AIMessage, BaseMessage, ChatMessage, FunctionMessage,
|
13
13
|
HumanMessage, SystemMessage)
|
14
14
|
from langchain.utils import get_from_dict_or_env
|
15
|
-
from
|
15
|
+
from pydantic import ConfigDict, model_validator, Field
|
16
16
|
from tenacity import (before_sleep_log, retry, retry_if_exception_type, stop_after_attempt,
|
17
17
|
wait_exponential)
|
18
18
|
|
@@ -149,13 +149,10 @@ class ChatZhipuAI(BaseChatModel):
|
|
149
149
|
API but with different models. In those cases, in order to avoid erroring
|
150
150
|
when tiktoken is called, you can specify a model name to use here."""
|
151
151
|
verbose: Optional[bool] = False
|
152
|
+
model_config = ConfigDict(validate_by_name=True)
|
152
153
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
allow_population_by_field_name = True
|
157
|
-
|
158
|
-
@root_validator()
|
154
|
+
@model_validator(mode='before')
|
155
|
+
@classmethod
|
159
156
|
def validate_environment(cls, values: Dict) -> Dict:
|
160
157
|
"""Validate that api key and python package exists in environment."""
|
161
158
|
values['zhipuai_api_key'] = get_from_dict_or_env(values, 'zhipuai_api_key',
|
@@ -6,7 +6,7 @@ from typing import Any, Callable, Dict, List, Optional, Tuple, Union
|
|
6
6
|
import requests
|
7
7
|
from langchain.embeddings.base import Embeddings
|
8
8
|
from langchain.utils import get_from_dict_or_env
|
9
|
-
from
|
9
|
+
from pydantic import model_validator, BaseModel, Field
|
10
10
|
from tenacity import (before_sleep_log, retry, retry_if_exception_type, stop_after_attempt,
|
11
11
|
wait_exponential)
|
12
12
|
|
@@ -42,7 +42,7 @@ class HostEmbeddings(BaseModel, Embeddings):
|
|
42
42
|
"""host embedding models.
|
43
43
|
"""
|
44
44
|
|
45
|
-
client: Optional[Any] #: :meta private:
|
45
|
+
client: Optional[Any] = None #: :meta private:
|
46
46
|
"""Model name to use."""
|
47
47
|
model: str = 'embedding-host'
|
48
48
|
host_base_url: str = None
|
@@ -64,7 +64,8 @@ class HostEmbeddings(BaseModel, Embeddings):
|
|
64
64
|
|
65
65
|
url_ep: Optional[str] = None
|
66
66
|
|
67
|
-
@
|
67
|
+
@model_validator(mode='before')
|
68
|
+
@classmethod
|
68
69
|
def validate_environment(cls, values: Dict) -> Dict:
|
69
70
|
"""Validate that api key and python package exists in environment."""
|
70
71
|
values['host_base_url'] = get_from_dict_or_env(values, 'host_base_url', 'HostBaseUrl')
|
@@ -164,7 +165,8 @@ class CustomHostEmbedding(HostEmbeddings):
|
|
164
165
|
model: str = Field('custom-embedding', alias='model')
|
165
166
|
embedding_ctx_length: int = 512
|
166
167
|
|
167
|
-
@
|
168
|
+
@model_validator(mode='before')
|
169
|
+
@classmethod
|
168
170
|
def validate_environment(cls, values: Dict) -> Dict:
|
169
171
|
"""Validate that api key and python package exists in environment."""
|
170
172
|
values['host_base_url'] = get_from_dict_or_env(values, 'host_base_url', 'HostBaseUrl')
|
@@ -2,7 +2,7 @@ from typing import Any, Dict, List, Optional
|
|
2
2
|
|
3
3
|
import requests
|
4
4
|
from langchain_core.embeddings import Embeddings
|
5
|
-
from
|
5
|
+
from pydantic import BaseModel, Extra, Field
|
6
6
|
DEFAULT_Multilingual_MODEL = "thenlper/gte-large-zh"
|
7
7
|
|
8
8
|
|
@@ -27,7 +27,7 @@ class HuggingFaceGteEmbeddings(BaseModel, Embeddings):
|
|
27
27
|
)
|
28
28
|
"""
|
29
29
|
|
30
|
-
client: Any #: :meta private:
|
30
|
+
client: Any = None #: :meta private:
|
31
31
|
model_name: str = DEFAULT_Multilingual_MODEL
|
32
32
|
"""Model name to use."""
|
33
33
|
cache_folder: Optional[str] = None
|
@@ -2,7 +2,7 @@ from typing import Any, Dict, List, Optional
|
|
2
2
|
|
3
3
|
import requests
|
4
4
|
from langchain_core.embeddings import Embeddings
|
5
|
-
from
|
5
|
+
from pydantic import BaseModel, Extra, Field
|
6
6
|
DEFAULT_Multilingual_MODEL = "intfloat/multilingual-e5-large"
|
7
7
|
|
8
8
|
|
@@ -27,7 +27,7 @@ class HuggingFaceMultilingualEmbeddings(BaseModel, Embeddings):
|
|
27
27
|
)
|
28
28
|
"""
|
29
29
|
|
30
|
-
client: Any #: :meta private:
|
30
|
+
client: Any = None #: :meta private:
|
31
31
|
model_name: str = DEFAULT_Multilingual_MODEL
|
32
32
|
"""Model name to use."""
|
33
33
|
cache_folder: Optional[str] = None
|
@@ -7,7 +7,7 @@ from typing import Any, Callable, Dict, List, Optional, Tuple, Union
|
|
7
7
|
# import numpy as np
|
8
8
|
from langchain.embeddings.base import Embeddings
|
9
9
|
from langchain.utils import get_from_dict_or_env
|
10
|
-
from
|
10
|
+
from pydantic import ConfigDict, model_validator, BaseModel, Field
|
11
11
|
from requests.exceptions import HTTPError
|
12
12
|
from tenacity import (before_sleep_log, retry, retry_if_exception_type, stop_after_attempt,
|
13
13
|
wait_exponential)
|
@@ -55,7 +55,7 @@ class WenxinEmbeddings(BaseModel, Embeddings):
|
|
55
55
|
|
56
56
|
"""
|
57
57
|
|
58
|
-
client: Optional[Any] #: :meta private:
|
58
|
+
client: Optional[Any] = None #: :meta private:
|
59
59
|
model: str = 'embedding-v1'
|
60
60
|
|
61
61
|
deployment: Optional[str] = 'default'
|
@@ -72,13 +72,10 @@ class WenxinEmbeddings(BaseModel, Embeddings):
|
|
72
72
|
|
73
73
|
model_kwargs: Optional[Dict[str, Any]] = Field(default_factory=dict)
|
74
74
|
"""Holds any model parameters valid for `create` call not explicitly specified."""
|
75
|
+
model_config = ConfigDict(extra='forbid')
|
75
76
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
extra = Extra.forbid
|
80
|
-
|
81
|
-
@root_validator()
|
77
|
+
@model_validator(mode='before')
|
78
|
+
@classmethod
|
82
79
|
def validate_environment(cls, values: Dict) -> Dict:
|
83
80
|
"""Validate that api key and python package exists in environment."""
|
84
81
|
values['wenxin_api_key'] = get_from_dict_or_env(values, 'wenxin_api_key', 'WENXIN_API_KEY')
|
@@ -8,7 +8,7 @@ from langchain_core.language_models.base import LanguageModelLike
|
|
8
8
|
from langchain_core.messages import FunctionMessage, SystemMessage, ToolMessage
|
9
9
|
from langgraph.graph import END
|
10
10
|
from langgraph.graph.message import MessageGraph
|
11
|
-
from langgraph.prebuilt import
|
11
|
+
from langgraph.prebuilt import ToolNode
|
12
12
|
from langgraph.utils.runnable import RunnableCallable
|
13
13
|
|
14
14
|
|
@@ -35,7 +35,7 @@ def get_openai_functions_agent_executor(tools: list[BaseTool], llm: LanguageMode
|
|
35
35
|
llm_with_tools = llm
|
36
36
|
|
37
37
|
agent = _get_messages | llm_with_tools
|
38
|
-
|
38
|
+
tool_nodes = ToolNode(tools=tools)
|
39
39
|
|
40
40
|
# Define the function that determines whether to continue or not
|
41
41
|
def should_continue(messages):
|
@@ -55,63 +55,11 @@ def get_openai_functions_agent_executor(tools: list[BaseTool], llm: LanguageMode
|
|
55
55
|
|
56
56
|
# Define the function to execute tools
|
57
57
|
async def acall_tool(messages):
|
58
|
-
|
59
|
-
# Based on the continue condition
|
60
|
-
# we know the last message involves a function call
|
61
|
-
last_message = messages[-1]
|
62
|
-
for tool_call in last_message.additional_kwargs['tool_calls']:
|
63
|
-
function = tool_call['function']
|
64
|
-
function_name = function['name']
|
65
|
-
try:
|
66
|
-
_tool_input = json.loads(function['arguments'] or '{}')
|
67
|
-
except Exception as e:
|
68
|
-
raise Exception(f"Error parsing arguments for function: {function_name}. arguments: {function['arguments']}. error: {str(e)}")
|
69
|
-
# We construct an ToolInvocation from the function_call
|
70
|
-
actions.append(ToolInvocation(
|
71
|
-
tool=function_name,
|
72
|
-
tool_input=_tool_input,
|
73
|
-
))
|
74
|
-
# We call the tool_executor and get back a response
|
75
|
-
responses = await tool_executor.abatch(actions, **kwargs)
|
76
|
-
# We use the response to create a ToolMessage
|
77
|
-
tool_messages = [
|
78
|
-
LiberalToolMessage(
|
79
|
-
tool_call_id=tool_call['id'],
|
80
|
-
content=response,
|
81
|
-
additional_kwargs={'name': tool_call['function']['name']},
|
82
|
-
)
|
83
|
-
for tool_call, response in zip(last_message.additional_kwargs['tool_calls'], responses)
|
84
|
-
]
|
58
|
+
tool_messages = await tool_nodes._afunc(messages, None, store=None)
|
85
59
|
return tool_messages
|
86
60
|
|
87
61
|
def call_tool(messages):
|
88
|
-
|
89
|
-
# Based on the continue condition
|
90
|
-
# we know the last message involves a function call
|
91
|
-
last_message = messages[-1]
|
92
|
-
for tool_call in last_message.additional_kwargs['tool_calls']:
|
93
|
-
function = tool_call['function']
|
94
|
-
function_name = function['name']
|
95
|
-
try:
|
96
|
-
_tool_input = json.loads(function['arguments'] or '{}')
|
97
|
-
except Exception as e:
|
98
|
-
raise Exception(f"Error parsing arguments for function: {function_name}. arguments: {function['arguments']}. error: {str(e)}")
|
99
|
-
# We construct an ToolInvocation from the function_call
|
100
|
-
actions.append(ToolInvocation(
|
101
|
-
tool=function_name,
|
102
|
-
tool_input=_tool_input,
|
103
|
-
))
|
104
|
-
# We call the tool_executor and get back a response
|
105
|
-
responses = tool_executor.batch(actions, **kwargs)
|
106
|
-
# We use the response to create a ToolMessage
|
107
|
-
tool_messages = [
|
108
|
-
LiberalToolMessage(
|
109
|
-
tool_call_id=tool_call['id'],
|
110
|
-
content=response,
|
111
|
-
additional_kwargs={'name': tool_call['function']['name']},
|
112
|
-
)
|
113
|
-
for tool_call, response in zip(last_message.additional_kwargs['tool_calls'], responses)
|
114
|
-
]
|
62
|
+
tool_messages = tool_nodes._func(messages, config=None, store=None)
|
115
63
|
return tool_messages
|
116
64
|
|
117
65
|
workflow = MessageGraph()
|
@@ -185,7 +133,7 @@ def get_qwen_local_functions_agent_executor(
|
|
185
133
|
else:
|
186
134
|
llm_with_tools = llm
|
187
135
|
agent = _get_messages | llm_with_tools
|
188
|
-
|
136
|
+
tool_nodes = ToolNode(tools=tools)
|
189
137
|
|
190
138
|
# Define the function that determines whether to continue or not
|
191
139
|
def should_continue(messages):
|
@@ -199,27 +147,7 @@ def get_qwen_local_functions_agent_executor(
|
|
199
147
|
|
200
148
|
# Define the function to execute tools
|
201
149
|
async def call_tool(messages):
|
202
|
-
|
203
|
-
# Based on the continue condition
|
204
|
-
# we know the last message involves a function call
|
205
|
-
last_message = messages[-1]
|
206
|
-
# only one function
|
207
|
-
function = last_message.additional_kwargs['function_call']
|
208
|
-
function_name = function['name']
|
209
|
-
try:
|
210
|
-
_tool_input = json.loads(function['arguments'] or '{}')
|
211
|
-
except Exception as e:
|
212
|
-
raise Exception(
|
213
|
-
f"Error parsing arguments for function: {function_name}. arguments: {function['arguments']}. error: {str(e)}")
|
214
|
-
# We construct an ToolInvocation from the function_call
|
215
|
-
actions.append(ToolInvocation(
|
216
|
-
tool=function_name,
|
217
|
-
tool_input=_tool_input,
|
218
|
-
))
|
219
|
-
# We call the tool_executor and get back a response
|
220
|
-
responses = await tool_executor.abatch(actions, **kwargs)
|
221
|
-
# We use the response to create a ToolMessage
|
222
|
-
tool_messages = [LiberalFunctionMessage(content=responses[0], name=function_name)]
|
150
|
+
tool_messages = await tool_nodes._afunc(messages, config=None, store=None)
|
223
151
|
return tool_messages
|
224
152
|
|
225
153
|
workflow = MessageGraph()
|
@@ -9,7 +9,7 @@ from langchain_core.language_models import LanguageModelLike
|
|
9
9
|
from langchain_core.messages import BaseMessage
|
10
10
|
from langgraph.graph import END, StateGraph
|
11
11
|
from langgraph.graph.state import CompiledStateGraph
|
12
|
-
from langgraph.prebuilt
|
12
|
+
from langgraph.prebuilt import ToolNode
|
13
13
|
from langgraph.utils.runnable import RunnableCallable
|
14
14
|
|
15
15
|
|
@@ -64,10 +64,7 @@ def create_agent_executor(agent_runnable, tools, input_schema=None) -> CompiledS
|
|
64
64
|
The `CompiledStateGraph` object.
|
65
65
|
"""
|
66
66
|
|
67
|
-
|
68
|
-
tool_executor = tools
|
69
|
-
else:
|
70
|
-
tool_executor = ToolExecutor(tools)
|
67
|
+
tool_executor = ToolNode(tools=tools)
|
71
68
|
|
72
69
|
state = _get_agent_state(input_schema)
|
73
70
|
|
@@ -1,7 +1,8 @@
|
|
1
1
|
from typing import Any, Dict, Tuple, Type, Union
|
2
2
|
|
3
|
+
from pydantic import ConfigDict, model_validator, BaseModel, Field
|
4
|
+
|
3
5
|
from bisheng_langchain.utils.requests import Requests, RequestsWrapper
|
4
|
-
from langchain_core.pydantic_v1 import BaseModel, Extra, Field, root_validator
|
5
6
|
from langchain_core.tools import BaseTool, Tool
|
6
7
|
from loguru import logger
|
7
8
|
|
@@ -32,13 +33,10 @@ class APIToolBase(BaseModel):
|
|
32
33
|
params: Dict[str, Any] = {}
|
33
34
|
input_key: str = 'keyword'
|
34
35
|
args_schema: Type[BaseModel] = ApiArg
|
36
|
+
model_config = ConfigDict(extra="forbid")
|
35
37
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
extra = Extra.forbid
|
40
|
-
|
41
|
-
@root_validator()
|
38
|
+
@model_validator(mode='before')
|
39
|
+
@classmethod
|
42
40
|
def validate_environment(cls, values: Dict) -> Dict:
|
43
41
|
"""Validate that api key and python package exists in environment."""
|
44
42
|
timeout = values.get('request_timeout', 30)
|