langchain-dev-utils 1.3.0__py3-none-any.whl → 1.3.2__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 +1 @@
1
- __version__ = "1.2.16"
1
+ __version__ = "1.3.2"
@@ -5,9 +5,9 @@ from langchain.agents.middleware.types import (
5
5
  AgentMiddleware,
6
6
  AgentState,
7
7
  ResponseT,
8
+ StateT_co,
8
9
  _InputAgentState,
9
10
  _OutputAgentState,
10
- StateT_co,
11
11
  )
12
12
  from langchain.agents.structured_output import ResponseFormat
13
13
  from langchain_core.messages import SystemMessage
@@ -1,12 +1,8 @@
1
1
  from .format_prompt import format_prompt
2
+ from .handoffs import HandoffAgentMiddleware
2
3
  from .model_fallback import ModelFallbackMiddleware
3
4
  from .model_router import ModelRouterMiddleware
4
- from .plan import (
5
- PlanMiddleware,
6
- create_finish_sub_plan_tool,
7
- create_read_plan_tool,
8
- create_write_plan_tool,
9
- )
5
+ from .plan import PlanMiddleware
10
6
  from .summarization import SummarizationMiddleware
11
7
  from .tool_call_repair import ToolCallRepairMiddleware
12
8
  from .tool_emulator import LLMToolEmulator
@@ -16,12 +12,10 @@ __all__ = [
16
12
  "SummarizationMiddleware",
17
13
  "LLMToolSelectorMiddleware",
18
14
  "PlanMiddleware",
19
- "create_finish_sub_plan_tool",
20
- "create_read_plan_tool",
21
- "create_write_plan_tool",
22
15
  "ModelFallbackMiddleware",
23
16
  "LLMToolEmulator",
24
17
  "ModelRouterMiddleware",
25
18
  "ToolCallRepairMiddleware",
26
19
  "format_prompt",
20
+ "HandoffAgentMiddleware",
27
21
  ]
@@ -0,0 +1,189 @@
1
+ from typing import Any, Awaitable, Callable, Literal
2
+
3
+ from langchain.agents import AgentState
4
+ from langchain.agents.middleware import AgentMiddleware, ModelRequest, ModelResponse
5
+ from langchain.agents.middleware.types import ModelCallResult
6
+ from langchain.tools import BaseTool, ToolRuntime, tool
7
+ from langchain_core.language_models.chat_models import BaseChatModel
8
+ from langchain_core.messages import SystemMessage, ToolMessage
9
+ from langgraph.types import Command
10
+ from typing_extensions import NotRequired, Optional, TypedDict
11
+
12
+ from langchain_dev_utils.chat_models import load_chat_model
13
+
14
+
15
+ class MultiAgentState(AgentState):
16
+ active_agent: NotRequired[str]
17
+
18
+
19
+ class AgentConfig(TypedDict):
20
+ model: NotRequired[str | BaseChatModel]
21
+ prompt: str | SystemMessage
22
+ tools: NotRequired[list[BaseTool | dict[str, Any]]]
23
+ default: NotRequired[bool]
24
+ handoffs: list[str] | Literal["all"]
25
+
26
+
27
+ def _create_handoffs_tool(agent_name: str, tool_description: Optional[str] = None):
28
+ """Create a tool for handoffs to a specified agent.
29
+
30
+ Args:
31
+ agent_name (str): The name of the agent to transfer to.
32
+
33
+ Returns:
34
+ BaseTool: A tool instance for handoffs to the specified agent.
35
+ """
36
+
37
+ tool_name = f"transfer_to_{agent_name}"
38
+ if not tool_name.endswith("_agent"):
39
+ tool_name += "_agent"
40
+ if tool_description is None:
41
+ tool_description = f"Transfer to the {agent_name}"
42
+
43
+ @tool(name_or_callable=tool_name, description=tool_description)
44
+ def handoffs_tool(runtime: ToolRuntime) -> Command:
45
+ return Command(
46
+ update={
47
+ "messages": [
48
+ ToolMessage(
49
+ content=f"Transferred to {agent_name}",
50
+ tool_call_id=runtime.tool_call_id,
51
+ )
52
+ ],
53
+ "active_agent": agent_name,
54
+ }
55
+ )
56
+
57
+ return handoffs_tool
58
+
59
+
60
+ def _get_default_active_agent(state: dict[str, AgentConfig]) -> Optional[str]:
61
+ for agent_name, config in state.items():
62
+ if config.get("default", False):
63
+ return agent_name
64
+ return None
65
+
66
+
67
+ def _transform_agent_config(
68
+ config: dict[str, AgentConfig],
69
+ handoffs_tools: list[BaseTool],
70
+ ) -> dict[str, AgentConfig]:
71
+ """Transform the agent config to add handoffs tools.
72
+
73
+ Args:
74
+ config (dict[str, AgentConfig]): The agent config.
75
+ handoffs_tools (list[BaseTool]): The list of handoffs tools.
76
+
77
+ Returns:
78
+ dict[str, AgentConfig]: The transformed agent config.
79
+ """
80
+
81
+ for agent_name, _cfg in config.items():
82
+ handoffs = _cfg.get("handoffs", [])
83
+ if handoffs == "all":
84
+ handoff_tools = [
85
+ handoff_tool
86
+ for handoff_tool in handoffs_tools
87
+ if handoff_tool.name != f"transfer_to_{agent_name}"
88
+ ]
89
+ else:
90
+ if not isinstance(handoffs, list):
91
+ raise ValueError(
92
+ f"handoffs for agent {agent_name} must be a list of agent names or 'all'"
93
+ )
94
+
95
+ handoff_tools = [
96
+ handoff_tool
97
+ for handoff_tool in handoffs_tools
98
+ if handoff_tool.name
99
+ in [
100
+ f"transfer_to_{_handoff_agent_name}"
101
+ for _handoff_agent_name in handoffs
102
+ ]
103
+ ]
104
+
105
+ _cfg["tools"] = [*_cfg.get("tools", []), *handoff_tools]
106
+ return config
107
+
108
+
109
+ class HandoffAgentMiddleware(AgentMiddleware):
110
+ """Agent middleware for switching between multiple agents.
111
+ This middleware dynamically replaces model call parameters based on the currently active agent configuration, enabling seamless switching between different agents.
112
+
113
+ Args:
114
+ agents_config (dict[str, AgentConfig]): A dictionary of agent configurations.
115
+ custom_handoffs_tool_descriptions (Optional[dict[str, str]]): A dictionary of custom tool descriptions for handoffs tools. Defaults to None.
116
+
117
+ Examples:
118
+ ```python
119
+ from langchain_dev_utils.agents.middleware import HandoffAgentMiddleware
120
+ middleware = HandoffAgentMiddleware(agents_config)
121
+ ```
122
+ """
123
+
124
+ state_schema = MultiAgentState
125
+
126
+ def __init__(
127
+ self,
128
+ agents_config: dict[str, AgentConfig],
129
+ custom_handoffs_tool_descriptions: Optional[dict[str, str]] = None,
130
+ ) -> None:
131
+ default_agent_name = _get_default_active_agent(agents_config)
132
+ if default_agent_name is None:
133
+ raise ValueError(
134
+ "No default agent found, you must set one by set default=True"
135
+ )
136
+
137
+ if custom_handoffs_tool_descriptions is None:
138
+ custom_handoffs_tool_descriptions = {}
139
+
140
+ handoffs_tools = [
141
+ _create_handoffs_tool(
142
+ agent_name,
143
+ custom_handoffs_tool_descriptions.get(agent_name),
144
+ )
145
+ for agent_name in agents_config.keys()
146
+ ]
147
+ self.default_agent_name = default_agent_name
148
+ self.agents_config = _transform_agent_config(
149
+ agents_config,
150
+ handoffs_tools,
151
+ )
152
+ self.tools = handoffs_tools
153
+
154
+ def _get_active_agent_config(self, request: ModelRequest) -> dict[str, Any]:
155
+ active_agent_name = request.state.get("active_agent", self.default_agent_name)
156
+
157
+ _config = self.agents_config[active_agent_name]
158
+
159
+ params = {}
160
+ if _config.get("model"):
161
+ model = _config.get("model")
162
+ if isinstance(model, str):
163
+ model = load_chat_model(model)
164
+ params["model"] = model
165
+ if _config.get("prompt"):
166
+ params["system_prompt"] = _config.get("prompt")
167
+ if _config.get("tools"):
168
+ params["tools"] = _config.get("tools")
169
+ return params
170
+
171
+ def wrap_model_call(
172
+ self, request: ModelRequest, handler: Callable[[ModelRequest], ModelResponse]
173
+ ) -> ModelCallResult:
174
+ override_kwargs = self._get_active_agent_config(request)
175
+ if override_kwargs:
176
+ return handler(request.override(**override_kwargs))
177
+ else:
178
+ return handler(request)
179
+
180
+ async def awrap_model_call(
181
+ self,
182
+ request: ModelRequest,
183
+ handler: Callable[[ModelRequest], Awaitable[ModelResponse]],
184
+ ) -> ModelCallResult:
185
+ override_kwargs = self._get_active_agent_config(request)
186
+ if override_kwargs:
187
+ return await handler(request.override(**override_kwargs))
188
+ else:
189
+ return await handler(request)
@@ -104,9 +104,14 @@ class PlanState(AgentState):
104
104
  plan: NotRequired[list[Plan]]
105
105
 
106
106
 
107
- def create_write_plan_tool(
107
+ class PlanToolDescription(TypedDict):
108
+ write_plan: NotRequired[str]
109
+ finish_sub_plan: NotRequired[str]
110
+ read_plan: NotRequired[str]
111
+
112
+
113
+ def _create_write_plan_tool(
108
114
  description: Optional[str] = None,
109
- message_key: Optional[str] = None,
110
115
  ) -> BaseTool:
111
116
  """Create a tool for writing initial plan.
112
117
 
@@ -116,22 +121,15 @@ def create_write_plan_tool(
116
121
 
117
122
  Args:
118
123
  description: The description of the tool. Uses default description if not provided.
119
- message_key: The key of the message to be updated. Defaults to "messages".
120
124
 
121
125
  Returns:
122
126
  BaseTool: The tool for writing initial plan.
123
-
124
- Example:
125
- Basic usage:
126
- >>> from langchain_dev_utils.agents.middleware import create_write_plan_tool
127
- >>> write_plan_tool = create_write_plan_tool()
128
127
  """
129
128
 
130
129
  @tool(
131
130
  description=description or _DEFAULT_WRITE_PLAN_TOOL_DESCRIPTION,
132
131
  )
133
132
  def write_plan(plan: list[str], runtime: ToolRuntime):
134
- msg_key = message_key or "messages"
135
133
  return Command(
136
134
  update={
137
135
  "plan": [
@@ -141,7 +139,7 @@ def create_write_plan_tool(
141
139
  }
142
140
  for index, content in enumerate(plan)
143
141
  ],
144
- msg_key: [
142
+ "messages": [
145
143
  ToolMessage(
146
144
  content=f"Plan successfully written, please first execute the {plan[0]} sub-plan (no need to change the status to in_process)",
147
145
  tool_call_id=runtime.tool_call_id,
@@ -153,9 +151,8 @@ def create_write_plan_tool(
153
151
  return write_plan
154
152
 
155
153
 
156
- def create_finish_sub_plan_tool(
154
+ def _create_finish_sub_plan_tool(
157
155
  description: Optional[str] = None,
158
- message_key: Optional[str] = None,
159
156
  ) -> BaseTool:
160
157
  """Create a tool for finishing sub-plan tasks.
161
158
 
@@ -164,15 +161,9 @@ def create_finish_sub_plan_tool(
164
161
 
165
162
  Args:
166
163
  description: The description of the tool. Uses default description if not provided.
167
- message_key: The key of the message to be updated. Defaults to "messages".
168
164
 
169
165
  Returns:
170
166
  BaseTool: The tool for finishing sub-plan tasks.
171
-
172
- Example:
173
- Basic usage:
174
- >>> from langchain_dev_utils.agents.middleware import create_finish_sub_plan_tool
175
- >>> finish_sub_plan_tool = create_finish_sub_plan_tool()
176
167
  """
177
168
 
178
169
  @tool(
@@ -181,7 +172,6 @@ def create_finish_sub_plan_tool(
181
172
  def finish_sub_plan(
182
173
  runtime: ToolRuntime,
183
174
  ):
184
- msg_key = message_key or "messages"
185
175
  plan_list = runtime.state.get("plan", [])
186
176
 
187
177
  sub_finish_plan = ""
@@ -200,7 +190,7 @@ def create_finish_sub_plan_tool(
200
190
  return Command(
201
191
  update={
202
192
  "plan": plan_list,
203
- msg_key: [
193
+ "messages": [
204
194
  ToolMessage(
205
195
  content=sub_finish_plan + sub_next_plan,
206
196
  tool_call_id=runtime.tool_call_id,
@@ -212,7 +202,7 @@ def create_finish_sub_plan_tool(
212
202
  return finish_sub_plan
213
203
 
214
204
 
215
- def create_read_plan_tool(
205
+ def _create_read_plan_tool(
216
206
  description: Optional[str] = None,
217
207
  ):
218
208
  """Create a tool for reading all sub-plans.
@@ -225,11 +215,6 @@ def create_read_plan_tool(
225
215
 
226
216
  Returns:
227
217
  BaseTool: The tool for reading all sub-plans.
228
-
229
- Example:
230
- Basic usage:
231
- >>> from langchain_dev_utils.agents.middleware import create_read_plan_tool
232
- >>> read_plan_tool = create_read_plan_tool()
233
218
  """
234
219
 
235
220
  @tool(
@@ -287,12 +272,8 @@ class PlanMiddleware(AgentMiddleware):
287
272
  tool. If not provided, uses the default `_PLAN_SYSTEM_PROMPT` or
288
273
  `_PLAN_SYSTEM_PROMPT_NOT_READ_PLAN` based on the `use_read_plan_tool`
289
274
  parameter.
290
- write_plan_tool_description: Description of the `write_plan` tool.
291
- If not provided, uses the default `_DEFAULT_WRITE_PLAN_TOOL_DESCRIPTION`.
292
- finish_sub_plan_tool_description: Description of the `finish_sub_plan` tool.
293
- If not provided, uses the default `_DEFAULT_FINISH_SUB_PLAN_TOOL_DESCRIPTION`.
294
- read_plan_tool_description: Description of the `read_plan` tool.
295
- If not provided, uses the default `_DEFAULT_READ_PLAN_TOOL_DESCRIPTION`.
275
+ custom_plan_tool_descriptions: Custom descriptions for the plan tools.
276
+ If not provided, uses the default descriptions.
296
277
  use_read_plan_tool: Whether to use the `read_plan` tool.
297
278
  If not provided, uses the default `True`.
298
279
 
@@ -316,31 +297,34 @@ class PlanMiddleware(AgentMiddleware):
316
297
  self,
317
298
  *,
318
299
  system_prompt: Optional[str] = None,
319
- write_plan_tool_description: Optional[str] = None,
320
- finish_sub_plan_tool_description: Optional[str] = None,
321
- read_plan_tool_description: Optional[str] = None,
300
+ custom_plan_tool_descriptions: Optional[PlanToolDescription] = None,
322
301
  use_read_plan_tool: bool = True,
323
302
  ) -> None:
324
303
  super().__init__()
325
304
 
326
- write_plan_tool_description = (
327
- write_plan_tool_description or _DEFAULT_WRITE_PLAN_TOOL_DESCRIPTION
305
+ if not custom_plan_tool_descriptions:
306
+ custom_plan_tool_descriptions = {}
307
+
308
+ write_plan_tool_description = custom_plan_tool_descriptions.get(
309
+ "write_plan",
310
+ _DEFAULT_WRITE_PLAN_TOOL_DESCRIPTION,
328
311
  )
329
- finish_sub_plan_tool_description = (
330
- finish_sub_plan_tool_description
331
- or _DEFAULT_FINISH_SUB_PLAN_TOOL_DESCRIPTION
312
+ finish_sub_plan_tool_description = custom_plan_tool_descriptions.get(
313
+ "finish_sub_plan",
314
+ _DEFAULT_FINISH_SUB_PLAN_TOOL_DESCRIPTION,
332
315
  )
333
- read_plan_tool_description = (
334
- read_plan_tool_description or _DEFAULT_READ_PLAN_TOOL_DESCRIPTION
316
+ read_plan_tool_description = custom_plan_tool_descriptions.get(
317
+ "read_plan",
318
+ _DEFAULT_READ_PLAN_TOOL_DESCRIPTION,
335
319
  )
336
320
 
337
321
  tools = [
338
- create_write_plan_tool(description=write_plan_tool_description),
339
- create_finish_sub_plan_tool(description=finish_sub_plan_tool_description),
322
+ _create_write_plan_tool(description=write_plan_tool_description),
323
+ _create_finish_sub_plan_tool(description=finish_sub_plan_tool_description),
340
324
  ]
341
325
 
342
326
  if use_read_plan_tool:
343
- tools.append(create_read_plan_tool(description=read_plan_tool_description))
327
+ tools.append(_create_read_plan_tool(description=read_plan_tool_description))
344
328
 
345
329
  if system_prompt is None:
346
330
  if use_read_plan_tool:
@@ -134,9 +134,8 @@ class _BaseChatOpenAICompatible(BaseChatOpenAI):
134
134
  from other model providers.
135
135
 
136
136
  **2. Dynamically adapts to choose the most suitable structured-output method**
137
- OpenAICompatibleChatModel adds method="auto" (default), which selects the best
138
- structured-output method (function_calling or json_schema) based on the actual
139
- capabilities of the model provider.
137
+ OpenAICompatibleChatModel selects the best structured-output method (function_calling or json_schema)
138
+ based on the actual capabilities of the model provider.
140
139
 
141
140
  **3. Supports configuration of related parameters**
142
141
  For cases where parameters differ from the official OpenAI API, this library
@@ -527,11 +526,10 @@ class _BaseChatOpenAICompatible(BaseChatOpenAI):
527
526
  schema: Optional[_DictOrPydanticClass] = None,
528
527
  *,
529
528
  method: Literal[
530
- "auto",
531
529
  "function_calling",
532
530
  "json_mode",
533
531
  "json_schema",
534
- ] = "auto",
532
+ ] = "json_schema",
535
533
  include_raw: bool = False,
536
534
  strict: Optional[bool] = None,
537
535
  **kwargs: Any,
@@ -545,7 +543,7 @@ class _BaseChatOpenAICompatible(BaseChatOpenAI):
545
543
 
546
544
  Args:
547
545
  schema: Output schema (Pydantic model class or dictionary definition)
548
- method: Extraction method - defaults to auto,it will choice best method based on provider supported response format
546
+ method: Extraction method - defaults to json_schema, it the provider doesn't support json_schema, it will fallback to function_calling
549
547
  include_raw: Whether to include raw model response alongside parsed output
550
548
  strict: Schema enforcement strictness (provider-dependent)
551
549
  **kwargs: Additional structured output parameters
@@ -553,16 +551,11 @@ class _BaseChatOpenAICompatible(BaseChatOpenAI):
553
551
  Returns:
554
552
  Runnable configured for structured output extraction
555
553
  """
556
- if method not in ["auto", "function_calling", "json_mode", "json_schema"]:
554
+ if method not in ["function_calling", "json_mode", "json_schema"]:
557
555
  raise ValueError(
558
- f"Unsupported method: {method}. Please choose from 'auto', 'function_calling', 'json_mode', 'json_schema'."
556
+ f"Unsupported method: {method}. Please choose from 'function_calling', 'json_mode', 'json_schema'."
559
557
  )
560
- if method == "auto":
561
- if "json_schema" in self.supported_response_format:
562
- method = "json_schema"
563
- else:
564
- method = "function_calling"
565
- elif (
558
+ if (
566
559
  method == "json_schema"
567
560
  and "json_schema" not in self.supported_response_format
568
561
  ):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langchain-dev-utils
3
- Version: 1.3.0
3
+ Version: 1.3.2
4
4
  Summary: A practical utility library for LangChain and LangGraph development
5
5
  Project-URL: Source Code, https://github.com/TBice123123/langchain-dev-utils
6
6
  Project-URL: repository, https://github.com/TBice123123/langchain-dev-utils
@@ -8,6 +8,7 @@ Project-URL: documentation, https://tbice123123.github.io/langchain-dev-utils
8
8
  Author-email: tiebingice <tiebingice123@outlook.com>
9
9
  License-File: LICENSE
10
10
  Requires-Python: >=3.11
11
+ Requires-Dist: langchain-core>=1.2.5
11
12
  Requires-Dist: langchain>=1.2.0
12
13
  Requires-Dist: langgraph>=1.0.0
13
14
  Provides-Extra: standard
@@ -1,16 +1,17 @@
1
- langchain_dev_utils/__init__.py,sha256=7RIJ-Nh9kHJf5O5NvahUeP8DNXq6oIzbYcIt_yKv0lQ,23
1
+ langchain_dev_utils/__init__.py,sha256=HgKA3RqZvC7slo8MgLyffCGwJbQ3cY6I7oUMFvGLWps,22
2
2
  langchain_dev_utils/_utils.py,sha256=MFEzR1BjXMj6HEVwt2x2omttFuDJ_rYAEbNqe99r9pM,1338
3
3
  langchain_dev_utils/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  langchain_dev_utils/agents/__init__.py,sha256=PJ-lSDZv_AXMYA3H4fx-HzJa14tPbkGmq1HX8LNfaPo,125
5
- langchain_dev_utils/agents/factory.py,sha256=mr-Q3fxxV_yEN3l8p-Rk0uxXvKjDUGEZDtrg9HRwr-8,3732
5
+ langchain_dev_utils/agents/factory.py,sha256=8XB6y_ddf58vXlTLHBL6KCirFqkD2GjtzsuOt98sS7U,3732
6
6
  langchain_dev_utils/agents/file_system.py,sha256=Yk3eetREE26WNrnTWLoiDUpOyCJ-rhjlfFDk6foLa1E,8468
7
7
  langchain_dev_utils/agents/plan.py,sha256=WwhoiJBmVYVI9bT8HfjCzTJ_SIp9WFil0gOeznv2omQ,6497
8
8
  langchain_dev_utils/agents/wrap.py,sha256=RuchoH_VotPmKFuYEn2SXoSgNxZhSA9jKM0Iv_8oHLk,4718
9
- langchain_dev_utils/agents/middleware/__init__.py,sha256=EECbcYcHXQAMA-guJNRGwCVi9jG957d0nOaoIuyIKC0,832
9
+ langchain_dev_utils/agents/middleware/__init__.py,sha256=QVQibaNHvHPyNTZ2UNFfYL153ZboaCHcoioTHK0FsiY,710
10
10
  langchain_dev_utils/agents/middleware/format_prompt.py,sha256=LzYiQXCRvkpfDhGPxhZwdepeU3j-HUWPJqcx3FWsfT4,2357
11
+ langchain_dev_utils/agents/middleware/handoffs.py,sha256=hYtm6NKUvfJQ_fxtTBuvEay185_RCB0yXAEdgSL7-Ls,6721
11
12
  langchain_dev_utils/agents/middleware/model_fallback.py,sha256=8xiNjTJ0yiRkPLCRfAGNnqY1TLstj1Anmiqyv5w2mA8,1633
12
13
  langchain_dev_utils/agents/middleware/model_router.py,sha256=qBspvj9ZoKfmC1pHWTO0EHHfxjgCUd-TuSbqvZl0kmg,7977
13
- langchain_dev_utils/agents/middleware/plan.py,sha256=0qDCmenxgY_zrwMfOyYlgLfhYNw-HszNLeeOkfj14NA,16002
14
+ langchain_dev_utils/agents/middleware/plan.py,sha256=-ZLkp85QQTSCX9thMblacJ1N86h0BYPoTwCfJlJ_jzQ,14981
14
15
  langchain_dev_utils/agents/middleware/summarization.py,sha256=IoZ2PM1OC3AXwf0DWpfreuPOAipeiYu0KPmAABWXuY0,3087
15
16
  langchain_dev_utils/agents/middleware/tool_call_repair.py,sha256=oZF0Oejemqs9kSn8xbW79FWyVVarL4IGCz0gpqYBkFM,3529
16
17
  langchain_dev_utils/agents/middleware/tool_emulator.py,sha256=OgtPhqturaWzF4fRSJ3f_IXvIrYrrAjlpOC5zmLtrkY,2031
@@ -19,7 +20,7 @@ langchain_dev_utils/chat_models/__init__.py,sha256=YSLUyHrWEEj4y4DtGFCOnDW02VIYZ
19
20
  langchain_dev_utils/chat_models/base.py,sha256=BzaoCIv145eE8b5wNDsbZDHn4EAxe4vdlptp7qXPWKk,11625
20
21
  langchain_dev_utils/chat_models/types.py,sha256=MD3cv_ZIe9fCdgwisNfuxAOhy-j4YSs1ZOQYyCjlNKs,927
21
22
  langchain_dev_utils/chat_models/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- langchain_dev_utils/chat_models/adapters/openai_compatible.py,sha256=PkOoYNwp2kEhXalUHXCCAnL7LXfeiNoeiQ678suEse4,24492
23
+ langchain_dev_utils/chat_models/adapters/openai_compatible.py,sha256=ws1CTZhyl8gxoY_RCLsV3cDgc8d7yDLWUa6ZfloxuMs,24239
23
24
  langchain_dev_utils/embeddings/__init__.py,sha256=zbEOaV86TUi9Zrg_dH9dpdgacWg31HMJTlTQknA9EKk,244
24
25
  langchain_dev_utils/embeddings/base.py,sha256=BGoWY0L7nG9iRV3d4sSagXhECXrwvS1xA-A_OVltn3k,9406
25
26
  langchain_dev_utils/message_convert/__init__.py,sha256=ZGrHGXPKMrZ_p9MqfIVZ4jgbEyb7aC4Q7X-muuThIYU,457
@@ -32,7 +33,7 @@ langchain_dev_utils/pipeline/types.py,sha256=T3aROKKXeWvd0jcH5XkgMDQfEkLfPaiOhhV
32
33
  langchain_dev_utils/tool_calling/__init__.py,sha256=mu_WxKMcu6RoTf4vkTPbA1WSBSNc6YIqyBtOQ6iVQj4,322
33
34
  langchain_dev_utils/tool_calling/human_in_the_loop.py,sha256=7Z_QO5OZUR6K8nLoIcafc6osnvX2IYNorOJcbx6bVso,9672
34
35
  langchain_dev_utils/tool_calling/utils.py,sha256=S4-KXQ8jWmpGTXYZitovF8rxKpaSSUkFruM8LDwvcvE,2765
35
- langchain_dev_utils-1.3.0.dist-info/METADATA,sha256=_fA9O0n1NOwnh6Vg4ExNxmJ0Sa7yBJdhwvOyK4Cbycw,4515
36
- langchain_dev_utils-1.3.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
37
- langchain_dev_utils-1.3.0.dist-info/licenses/LICENSE,sha256=AWAOzNEcsvCEzHOF0qby5OKxviVH_eT9Yce1sgJTico,1084
38
- langchain_dev_utils-1.3.0.dist-info/RECORD,,
36
+ langchain_dev_utils-1.3.2.dist-info/METADATA,sha256=PLQKHjjqwlL9lvaW3Et1q0gYbZTtRdmTN6w5A4gJiYM,4552
37
+ langchain_dev_utils-1.3.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
38
+ langchain_dev_utils-1.3.2.dist-info/licenses/LICENSE,sha256=AWAOzNEcsvCEzHOF0qby5OKxviVH_eT9Yce1sgJTico,1084
39
+ langchain_dev_utils-1.3.2.dist-info/RECORD,,