langchain-core 1.0.0a5__py3-none-any.whl → 1.0.3__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.
- langchain_core/__init__.py +1 -1
- langchain_core/_api/__init__.py +3 -4
- langchain_core/_api/beta_decorator.py +23 -26
- langchain_core/_api/deprecation.py +51 -64
- langchain_core/_api/path.py +3 -6
- langchain_core/_import_utils.py +3 -4
- langchain_core/agents.py +20 -22
- langchain_core/caches.py +65 -66
- langchain_core/callbacks/__init__.py +1 -8
- langchain_core/callbacks/base.py +321 -336
- langchain_core/callbacks/file.py +44 -44
- langchain_core/callbacks/manager.py +436 -513
- langchain_core/callbacks/stdout.py +29 -30
- langchain_core/callbacks/streaming_stdout.py +32 -32
- langchain_core/callbacks/usage.py +60 -57
- langchain_core/chat_history.py +53 -68
- langchain_core/document_loaders/base.py +27 -25
- langchain_core/document_loaders/blob_loaders.py +1 -1
- langchain_core/document_loaders/langsmith.py +44 -48
- langchain_core/documents/__init__.py +23 -3
- langchain_core/documents/base.py +98 -90
- langchain_core/documents/compressor.py +10 -10
- langchain_core/documents/transformers.py +34 -35
- langchain_core/embeddings/fake.py +50 -54
- langchain_core/example_selectors/length_based.py +1 -1
- langchain_core/example_selectors/semantic_similarity.py +28 -32
- langchain_core/exceptions.py +21 -20
- langchain_core/globals.py +3 -151
- langchain_core/indexing/__init__.py +1 -1
- langchain_core/indexing/api.py +121 -126
- langchain_core/indexing/base.py +73 -75
- langchain_core/indexing/in_memory.py +4 -6
- langchain_core/language_models/__init__.py +14 -29
- langchain_core/language_models/_utils.py +58 -61
- langchain_core/language_models/base.py +53 -162
- langchain_core/language_models/chat_models.py +298 -387
- langchain_core/language_models/fake.py +11 -11
- langchain_core/language_models/fake_chat_models.py +42 -36
- langchain_core/language_models/llms.py +125 -235
- langchain_core/load/dump.py +9 -12
- langchain_core/load/load.py +18 -28
- langchain_core/load/mapping.py +2 -4
- langchain_core/load/serializable.py +42 -40
- langchain_core/messages/__init__.py +10 -16
- langchain_core/messages/ai.py +148 -148
- langchain_core/messages/base.py +58 -52
- langchain_core/messages/block_translators/__init__.py +27 -17
- langchain_core/messages/block_translators/anthropic.py +6 -6
- langchain_core/messages/block_translators/bedrock_converse.py +5 -5
- langchain_core/messages/block_translators/google_genai.py +505 -20
- langchain_core/messages/block_translators/google_vertexai.py +4 -32
- langchain_core/messages/block_translators/groq.py +117 -21
- langchain_core/messages/block_translators/langchain_v0.py +5 -5
- langchain_core/messages/block_translators/openai.py +11 -11
- langchain_core/messages/chat.py +2 -6
- langchain_core/messages/content.py +337 -328
- langchain_core/messages/function.py +6 -10
- langchain_core/messages/human.py +24 -31
- langchain_core/messages/modifier.py +2 -2
- langchain_core/messages/system.py +19 -29
- langchain_core/messages/tool.py +74 -90
- langchain_core/messages/utils.py +474 -504
- langchain_core/output_parsers/__init__.py +13 -10
- langchain_core/output_parsers/base.py +61 -61
- langchain_core/output_parsers/format_instructions.py +9 -4
- langchain_core/output_parsers/json.py +12 -10
- langchain_core/output_parsers/list.py +21 -23
- langchain_core/output_parsers/openai_functions.py +49 -47
- langchain_core/output_parsers/openai_tools.py +16 -21
- langchain_core/output_parsers/pydantic.py +13 -14
- langchain_core/output_parsers/string.py +5 -5
- langchain_core/output_parsers/transform.py +15 -17
- langchain_core/output_parsers/xml.py +35 -34
- langchain_core/outputs/__init__.py +1 -1
- langchain_core/outputs/chat_generation.py +18 -18
- langchain_core/outputs/chat_result.py +1 -3
- langchain_core/outputs/generation.py +10 -11
- langchain_core/outputs/llm_result.py +10 -10
- langchain_core/prompt_values.py +11 -17
- langchain_core/prompts/__init__.py +3 -27
- langchain_core/prompts/base.py +48 -56
- langchain_core/prompts/chat.py +275 -325
- langchain_core/prompts/dict.py +5 -5
- langchain_core/prompts/few_shot.py +81 -88
- langchain_core/prompts/few_shot_with_templates.py +11 -13
- langchain_core/prompts/image.py +12 -14
- langchain_core/prompts/loading.py +4 -6
- langchain_core/prompts/message.py +3 -3
- langchain_core/prompts/prompt.py +24 -39
- langchain_core/prompts/string.py +26 -10
- langchain_core/prompts/structured.py +49 -53
- langchain_core/rate_limiters.py +51 -60
- langchain_core/retrievers.py +61 -198
- langchain_core/runnables/base.py +1478 -1630
- langchain_core/runnables/branch.py +53 -57
- langchain_core/runnables/config.py +72 -89
- langchain_core/runnables/configurable.py +120 -137
- langchain_core/runnables/fallbacks.py +83 -79
- langchain_core/runnables/graph.py +91 -97
- langchain_core/runnables/graph_ascii.py +27 -28
- langchain_core/runnables/graph_mermaid.py +38 -50
- langchain_core/runnables/graph_png.py +15 -16
- langchain_core/runnables/history.py +135 -148
- langchain_core/runnables/passthrough.py +124 -150
- langchain_core/runnables/retry.py +46 -51
- langchain_core/runnables/router.py +25 -30
- langchain_core/runnables/schema.py +75 -80
- langchain_core/runnables/utils.py +60 -67
- langchain_core/stores.py +85 -121
- langchain_core/structured_query.py +8 -8
- langchain_core/sys_info.py +27 -29
- langchain_core/tools/__init__.py +1 -14
- langchain_core/tools/base.py +285 -229
- langchain_core/tools/convert.py +160 -155
- langchain_core/tools/render.py +10 -10
- langchain_core/tools/retriever.py +12 -11
- langchain_core/tools/simple.py +19 -24
- langchain_core/tools/structured.py +32 -39
- langchain_core/tracers/__init__.py +1 -9
- langchain_core/tracers/base.py +97 -99
- langchain_core/tracers/context.py +29 -52
- langchain_core/tracers/core.py +49 -53
- langchain_core/tracers/evaluation.py +11 -11
- langchain_core/tracers/event_stream.py +65 -64
- langchain_core/tracers/langchain.py +21 -21
- langchain_core/tracers/log_stream.py +45 -45
- langchain_core/tracers/memory_stream.py +3 -3
- langchain_core/tracers/root_listeners.py +16 -16
- langchain_core/tracers/run_collector.py +2 -4
- langchain_core/tracers/schemas.py +0 -129
- langchain_core/tracers/stdout.py +3 -3
- langchain_core/utils/__init__.py +1 -4
- langchain_core/utils/_merge.py +2 -2
- langchain_core/utils/aiter.py +57 -61
- langchain_core/utils/env.py +9 -9
- langchain_core/utils/function_calling.py +89 -186
- langchain_core/utils/html.py +7 -8
- langchain_core/utils/input.py +6 -6
- langchain_core/utils/interactive_env.py +1 -1
- langchain_core/utils/iter.py +36 -40
- langchain_core/utils/json.py +4 -3
- langchain_core/utils/json_schema.py +9 -9
- langchain_core/utils/mustache.py +8 -10
- langchain_core/utils/pydantic.py +33 -35
- langchain_core/utils/strings.py +6 -9
- langchain_core/utils/usage.py +1 -1
- langchain_core/utils/utils.py +66 -62
- langchain_core/vectorstores/base.py +182 -216
- langchain_core/vectorstores/in_memory.py +101 -176
- langchain_core/vectorstores/utils.py +5 -5
- langchain_core/version.py +1 -1
- langchain_core-1.0.3.dist-info/METADATA +69 -0
- langchain_core-1.0.3.dist-info/RECORD +172 -0
- {langchain_core-1.0.0a5.dist-info → langchain_core-1.0.3.dist-info}/WHEEL +1 -1
- langchain_core/memory.py +0 -120
- langchain_core/messages/block_translators/ollama.py +0 -47
- langchain_core/prompts/pipeline.py +0 -138
- langchain_core/pydantic_v1/__init__.py +0 -30
- langchain_core/pydantic_v1/dataclasses.py +0 -23
- langchain_core/pydantic_v1/main.py +0 -23
- langchain_core/tracers/langchain_v1.py +0 -31
- langchain_core/utils/loading.py +0 -35
- langchain_core-1.0.0a5.dist-info/METADATA +0 -77
- langchain_core-1.0.0a5.dist-info/RECORD +0 -181
- langchain_core-1.0.0a5.dist-info/entry_points.txt +0 -4
|
@@ -5,7 +5,7 @@ import inspect
|
|
|
5
5
|
import typing
|
|
6
6
|
from collections.abc import AsyncIterator, Iterator, Sequence
|
|
7
7
|
from functools import wraps
|
|
8
|
-
from typing import TYPE_CHECKING, Any,
|
|
8
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
9
9
|
|
|
10
10
|
from pydantic import BaseModel, ConfigDict
|
|
11
11
|
from typing_extensions import override
|
|
@@ -47,45 +47,43 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]):
|
|
|
47
47
|
of a chain of Runnables. Fallbacks are tried in order until one succeeds or
|
|
48
48
|
all fail.
|
|
49
49
|
|
|
50
|
-
While you can instantiate a
|
|
51
|
-
more convenient to use the
|
|
50
|
+
While you can instantiate a `RunnableWithFallbacks` directly, it is usually
|
|
51
|
+
more convenient to use the `with_fallbacks` method on a Runnable.
|
|
52
52
|
|
|
53
53
|
Example:
|
|
54
|
+
```python
|
|
55
|
+
from langchain_core.chat_models.openai import ChatOpenAI
|
|
56
|
+
from langchain_core.chat_models.anthropic import ChatAnthropic
|
|
54
57
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
[ChatOpenAI(model="gpt-3.5-turbo-0125")]
|
|
62
|
-
)
|
|
63
|
-
# Will usually use ChatAnthropic, but fallback to ChatOpenAI
|
|
64
|
-
# if ChatAnthropic fails.
|
|
65
|
-
model.invoke("hello")
|
|
66
|
-
|
|
67
|
-
# And you can also use fallbacks at the level of a chain.
|
|
68
|
-
# Here if both LLM providers fail, we'll fallback to a good hardcoded
|
|
69
|
-
# response.
|
|
58
|
+
model = ChatAnthropic(model="claude-3-haiku-20240307").with_fallbacks(
|
|
59
|
+
[ChatOpenAI(model="gpt-3.5-turbo-0125")]
|
|
60
|
+
)
|
|
61
|
+
# Will usually use ChatAnthropic, but fallback to ChatOpenAI
|
|
62
|
+
# if ChatAnthropic fails.
|
|
63
|
+
model.invoke("hello")
|
|
70
64
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
65
|
+
# And you can also use fallbacks at the level of a chain.
|
|
66
|
+
# Here if both LLM providers fail, we'll fallback to a good hardcoded
|
|
67
|
+
# response.
|
|
74
68
|
|
|
69
|
+
from langchain_core.prompts import PromptTemplate
|
|
70
|
+
from langchain_core.output_parser import StrOutputParser
|
|
71
|
+
from langchain_core.runnables import RunnableLambda
|
|
75
72
|
|
|
76
|
-
def when_all_is_lost(inputs):
|
|
77
|
-
return (
|
|
78
|
-
"Looks like our LLM providers are down. "
|
|
79
|
-
"Here's a nice 🦜️ emoji for you instead."
|
|
80
|
-
)
|
|
81
73
|
|
|
74
|
+
def when_all_is_lost(inputs):
|
|
75
|
+
return (
|
|
76
|
+
"Looks like our LLM providers are down. "
|
|
77
|
+
"Here's a nice 🦜️ emoji for you instead."
|
|
78
|
+
)
|
|
82
79
|
|
|
83
|
-
chain_with_fallback = (
|
|
84
|
-
PromptTemplate.from_template("Tell me a joke about {topic}")
|
|
85
|
-
| model
|
|
86
|
-
| StrOutputParser()
|
|
87
|
-
).with_fallbacks([RunnableLambda(when_all_is_lost)])
|
|
88
80
|
|
|
81
|
+
chain_with_fallback = (
|
|
82
|
+
PromptTemplate.from_template("Tell me a joke about {topic}")
|
|
83
|
+
| model
|
|
84
|
+
| StrOutputParser()
|
|
85
|
+
).with_fallbacks([RunnableLambda(when_all_is_lost)])
|
|
86
|
+
```
|
|
89
87
|
"""
|
|
90
88
|
|
|
91
89
|
runnable: Runnable[Input, Output]
|
|
@@ -97,9 +95,9 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]):
|
|
|
97
95
|
|
|
98
96
|
Any exception that is not a subclass of these exceptions will be raised immediately.
|
|
99
97
|
"""
|
|
100
|
-
exception_key:
|
|
101
|
-
"""If string is specified then handled exceptions will be passed to fallbacks as
|
|
102
|
-
part of the input under the specified key. If None
|
|
98
|
+
exception_key: str | None = None
|
|
99
|
+
"""If `string` is specified then handled exceptions will be passed to fallbacks as
|
|
100
|
+
part of the input under the specified key. If `None`, exceptions
|
|
103
101
|
will not be passed to fallbacks. If used, the base Runnable and its fallbacks
|
|
104
102
|
must accept a dictionary as input."""
|
|
105
103
|
|
|
@@ -118,14 +116,12 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]):
|
|
|
118
116
|
return self.runnable.OutputType
|
|
119
117
|
|
|
120
118
|
@override
|
|
121
|
-
def get_input_schema(
|
|
122
|
-
self, config: Optional[RunnableConfig] = None
|
|
123
|
-
) -> type[BaseModel]:
|
|
119
|
+
def get_input_schema(self, config: RunnableConfig | None = None) -> type[BaseModel]:
|
|
124
120
|
return self.runnable.get_input_schema(config)
|
|
125
121
|
|
|
126
122
|
@override
|
|
127
123
|
def get_output_schema(
|
|
128
|
-
self, config:
|
|
124
|
+
self, config: RunnableConfig | None = None
|
|
129
125
|
) -> type[BaseModel]:
|
|
130
126
|
return self.runnable.get_output_schema(config)
|
|
131
127
|
|
|
@@ -147,10 +143,10 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]):
|
|
|
147
143
|
@classmethod
|
|
148
144
|
@override
|
|
149
145
|
def get_lc_namespace(cls) -> list[str]:
|
|
150
|
-
"""Get the namespace of the
|
|
146
|
+
"""Get the namespace of the LangChain object.
|
|
151
147
|
|
|
152
148
|
Returns:
|
|
153
|
-
|
|
149
|
+
`["langchain", "schema", "runnable"]`
|
|
154
150
|
"""
|
|
155
151
|
return ["langchain", "schema", "runnable"]
|
|
156
152
|
|
|
@@ -166,7 +162,7 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]):
|
|
|
166
162
|
|
|
167
163
|
@override
|
|
168
164
|
def invoke(
|
|
169
|
-
self, input: Input, config:
|
|
165
|
+
self, input: Input, config: RunnableConfig | None = None, **kwargs: Any
|
|
170
166
|
) -> Output:
|
|
171
167
|
if self.exception_key is not None and not isinstance(input, dict):
|
|
172
168
|
msg = (
|
|
@@ -218,8 +214,8 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]):
|
|
|
218
214
|
async def ainvoke(
|
|
219
215
|
self,
|
|
220
216
|
input: Input,
|
|
221
|
-
config:
|
|
222
|
-
**kwargs:
|
|
217
|
+
config: RunnableConfig | None = None,
|
|
218
|
+
**kwargs: Any | None,
|
|
223
219
|
) -> Output:
|
|
224
220
|
if self.exception_key is not None and not isinstance(input, dict):
|
|
225
221
|
msg = (
|
|
@@ -268,10 +264,10 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]):
|
|
|
268
264
|
def batch(
|
|
269
265
|
self,
|
|
270
266
|
inputs: list[Input],
|
|
271
|
-
config:
|
|
267
|
+
config: RunnableConfig | list[RunnableConfig] | None = None,
|
|
272
268
|
*,
|
|
273
269
|
return_exceptions: bool = False,
|
|
274
|
-
**kwargs:
|
|
270
|
+
**kwargs: Any | None,
|
|
275
271
|
) -> list[Output]:
|
|
276
272
|
if self.exception_key is not None and not all(
|
|
277
273
|
isinstance(input_, dict) for input_ in inputs
|
|
@@ -307,7 +303,9 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]):
|
|
|
307
303
|
name=config.get("run_name") or self.get_name(),
|
|
308
304
|
run_id=config.pop("run_id", None),
|
|
309
305
|
)
|
|
310
|
-
for cm, input_, config in zip(
|
|
306
|
+
for cm, input_, config in zip(
|
|
307
|
+
callback_managers, inputs, configs, strict=False
|
|
308
|
+
)
|
|
311
309
|
]
|
|
312
310
|
|
|
313
311
|
to_return: dict[int, Any] = {}
|
|
@@ -325,7 +323,9 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]):
|
|
|
325
323
|
return_exceptions=True,
|
|
326
324
|
**kwargs,
|
|
327
325
|
)
|
|
328
|
-
for (i, input_), output in zip(
|
|
326
|
+
for (i, input_), output in zip(
|
|
327
|
+
sorted(run_again.copy().items()), outputs, strict=False
|
|
328
|
+
):
|
|
329
329
|
if isinstance(output, BaseException) and not isinstance(
|
|
330
330
|
output, self.exceptions_to_handle
|
|
331
331
|
):
|
|
@@ -360,10 +360,10 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]):
|
|
|
360
360
|
async def abatch(
|
|
361
361
|
self,
|
|
362
362
|
inputs: list[Input],
|
|
363
|
-
config:
|
|
363
|
+
config: RunnableConfig | list[RunnableConfig] | None = None,
|
|
364
364
|
*,
|
|
365
365
|
return_exceptions: bool = False,
|
|
366
|
-
**kwargs:
|
|
366
|
+
**kwargs: Any | None,
|
|
367
367
|
) -> list[Output]:
|
|
368
368
|
if self.exception_key is not None and not all(
|
|
369
369
|
isinstance(input_, dict) for input_ in inputs
|
|
@@ -400,11 +400,13 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]):
|
|
|
400
400
|
name=config.get("run_name") or self.get_name(),
|
|
401
401
|
run_id=config.pop("run_id", None),
|
|
402
402
|
)
|
|
403
|
-
for cm, input_, config in zip(
|
|
403
|
+
for cm, input_, config in zip(
|
|
404
|
+
callback_managers, inputs, configs, strict=False
|
|
405
|
+
)
|
|
404
406
|
)
|
|
405
407
|
)
|
|
406
408
|
|
|
407
|
-
to_return: dict[int,
|
|
409
|
+
to_return: dict[int, Output | BaseException] = {}
|
|
408
410
|
run_again = dict(enumerate(inputs))
|
|
409
411
|
handled_exceptions: dict[int, BaseException] = {}
|
|
410
412
|
first_to_raise = None
|
|
@@ -420,7 +422,9 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]):
|
|
|
420
422
|
**kwargs,
|
|
421
423
|
)
|
|
422
424
|
|
|
423
|
-
for (i, input_), output in zip(
|
|
425
|
+
for (i, input_), output in zip(
|
|
426
|
+
sorted(run_again.copy().items()), outputs, strict=False
|
|
427
|
+
):
|
|
424
428
|
if isinstance(output, BaseException) and not isinstance(
|
|
425
429
|
output, self.exceptions_to_handle
|
|
426
430
|
):
|
|
@@ -460,8 +464,8 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]):
|
|
|
460
464
|
def stream(
|
|
461
465
|
self,
|
|
462
466
|
input: Input,
|
|
463
|
-
config:
|
|
464
|
-
**kwargs:
|
|
467
|
+
config: RunnableConfig | None = None,
|
|
468
|
+
**kwargs: Any | None,
|
|
465
469
|
) -> Iterator[Output]:
|
|
466
470
|
if self.exception_key is not None and not isinstance(input, dict):
|
|
467
471
|
msg = (
|
|
@@ -507,7 +511,7 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]):
|
|
|
507
511
|
raise first_error
|
|
508
512
|
|
|
509
513
|
yield chunk
|
|
510
|
-
output:
|
|
514
|
+
output: Output | None = chunk
|
|
511
515
|
try:
|
|
512
516
|
for chunk in stream:
|
|
513
517
|
yield chunk
|
|
@@ -524,8 +528,8 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]):
|
|
|
524
528
|
async def astream(
|
|
525
529
|
self,
|
|
526
530
|
input: Input,
|
|
527
|
-
config:
|
|
528
|
-
**kwargs:
|
|
531
|
+
config: RunnableConfig | None = None,
|
|
532
|
+
**kwargs: Any | None,
|
|
529
533
|
) -> AsyncIterator[Output]:
|
|
530
534
|
if self.exception_key is not None and not isinstance(input, dict):
|
|
531
535
|
msg = (
|
|
@@ -571,7 +575,7 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]):
|
|
|
571
575
|
raise first_error
|
|
572
576
|
|
|
573
577
|
yield chunk
|
|
574
|
-
output:
|
|
578
|
+
output: Output | None = chunk
|
|
575
579
|
try:
|
|
576
580
|
async for chunk in stream:
|
|
577
581
|
yield chunk
|
|
@@ -590,32 +594,32 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]):
|
|
|
590
594
|
Returns:
|
|
591
595
|
If the attribute is anything other than a method that outputs a Runnable,
|
|
592
596
|
returns getattr(self.runnable, name). If the attribute is a method that
|
|
593
|
-
does return a new Runnable (e.g.
|
|
597
|
+
does return a new Runnable (e.g. model.bind_tools([...]) outputs a new
|
|
594
598
|
RunnableBinding) then self.runnable and each of the runnables in
|
|
595
599
|
self.fallbacks is replaced with getattr(x, name).
|
|
596
600
|
|
|
597
601
|
Example:
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
)
|
|
602
|
+
```python
|
|
603
|
+
from langchain_openai import ChatOpenAI
|
|
604
|
+
from langchain_anthropic import ChatAnthropic
|
|
605
|
+
|
|
606
|
+
gpt_4o = ChatOpenAI(model="gpt-4o")
|
|
607
|
+
claude_3_sonnet = ChatAnthropic(model="claude-sonnet-4-5-20250929")
|
|
608
|
+
model = gpt_4o.with_fallbacks([claude_3_sonnet])
|
|
609
|
+
|
|
610
|
+
model.model_name
|
|
611
|
+
# -> "gpt-4o"
|
|
612
|
+
|
|
613
|
+
# .bind_tools() is called on both ChatOpenAI and ChatAnthropic
|
|
614
|
+
# Equivalent to:
|
|
615
|
+
# gpt_4o.bind_tools([...]).with_fallbacks([claude_3_sonnet.bind_tools([...])])
|
|
616
|
+
model.bind_tools([...])
|
|
617
|
+
# -> RunnableWithFallbacks(
|
|
618
|
+
runnable=RunnableBinding(bound=ChatOpenAI(...), kwargs={"tools": [...]}),
|
|
619
|
+
fallbacks=[RunnableBinding(bound=ChatAnthropic(...), kwargs={"tools": [...]})],
|
|
620
|
+
)
|
|
618
621
|
|
|
622
|
+
```
|
|
619
623
|
""" # noqa: E501
|
|
620
624
|
attr = getattr(self.runnable, name)
|
|
621
625
|
if _returns_runnable(attr):
|