Compare commits

..

258 Commits

Author SHA1 Message Date
Eugene Yurtsev
8a41a62bb6 x 2024-10-21 17:17:11 -04:00
Eugene Yurtsev
aa0b25cb2a docs: fix some typos (#27519)
* Fix some typos
* Add some missing links
2024-10-21 16:00:31 -04:00
Eugene Yurtsev
13f7d2d58d tools concept (#27482)
Add tools conceptual page
2024-10-21 15:34:21 -04:00
Lance Martin
8484c23c72 Address comments, minor cleanups (#27475) 2024-10-21 08:10:16 -07:00
Lance Martin
8033cae96a First draft of concept pages (#27088)
Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
2024-10-18 12:52:52 -07:00
Eugene Yurtsev
127ac819fc Docs: conceptual docs batch 1 (#27173)
Re-organizing some of the content involves runnables/lcel/streaming into
conceptual guides.

Conceptual guides added:
- [x] Runnables
- [x] LCEL
- [x] Chat Models
- [x] LLM
- [x] async
- [x] Messages
- [x] Chat History
- [x] Multimodality
- [x] Tokenization

Outstanding:
- [ ] Callbacks/Tracers
- [ ] Streaming
- [ ] Tool Creation
- [ ] Document Loading


Other conceptual guides are placeholders to make sure that no existing
links breaks.

Some high level re-organization:

* Introduce the Runnable interface prior to LCEL (since those are two
distinct concepts)
* Cross-link as much related content as possible (including how-to
guides)
2024-10-18 14:59:53 -04:00
Eugene Yurtsev
046f6a5544 concepts docs: archictecture individual page (#27290)
Update architecture page
2024-10-11 16:06:57 -04:00
Eugene Yurtsev
f8ce6210be concept docs: add scaffold (#27277)
Starting to structure the scaffold for the concepts. Moving concept
content into their own pages.

TBD what we'll end up doing with the actual concepts page in terms of
visual layout.
2024-10-11 15:50:37 -04:00
Eugene Yurtsev
8d9ef40118 docs: move concepts into a separate directory (#27171)
Move concepts into a separate directory
2024-10-07 15:19:38 -04:00
Eugene Yurtsev
13646282bd Merge branch 'master' into concept_docs 2024-10-07 15:15:43 -04:00
Christophe Bornet
c4ebccfec2 core[minor]: Improve support for id in VectorStore (#26660)
Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
2024-10-07 15:01:08 -04:00
Bharat Ramanathan
931ce8d026 core[patch]: Update AsyncCallbackManager to honor run_inline attribute and prevent context loss (#26885)
## Description

This PR fixes the context loss issue in `AsyncCallbackManager`,
specifically in `on_llm_start` and `on_chat_model_start` methods. It
properly honors the `run_inline` attribute of callback handlers,
preventing race conditions and ordering issues.

Key changes:
1. Separate handlers into inline and non-inline groups.
2. Execute inline handlers sequentially for each prompt.
3. Execute non-inline handlers concurrently across all prompts.
4. Preserve context for stateful handlers.
5. Maintain performance benefits for non-inline handlers.

**These changes are implemented in `AsyncCallbackManager` rather than
`ahandle_event` because the issue occurs at the prompt and message_list
levels, not within individual events.**

## Testing

- Test case implemented in #26857 now passes, verifying execution order
for inline handlers.

## Related Issues

- Fixes issue discussed in #23909 

## Dependencies

No new dependencies are required.

---

@eyurtsev: This PR implements the discussed changes to respect
`run_inline` in `AsyncCallbackManager`. Please review and advise on any
needed changes.

Twitter handle: @parambharat

---------

Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
2024-10-07 14:59:29 -04:00
Aleksandar Petrov
c61b9daef5 docs: Grammar fix in concepts.mdx (#27149)
Missing "is" in a sentence about the Tool usage.
2024-10-07 18:55:25 +00:00
Eugene Yurtsev
8f8392137a Update MIGRATE.md (#27169)
Upgrade the content of MIGRATE.md so it's in sync
2024-10-07 14:53:40 -04:00
João Carlos Ferra de Almeida
780ce00dea core[minor]: add **kwargs to index and aindex functions for custom vector_field support (#26998)
Added `**kwargs` parameters to the `index` and `aindex` functions in
`libs/core/langchain_core/indexing/api.py`. This allows users to pass
additional arguments to the `add_documents` and `aadd_documents`
methods, enabling the specification of a custom `vector_field`. For
example, users can now use `vector_field="embedding"` when indexing
documents in `OpenSearchVectorStore`

---------

Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
2024-10-07 14:52:50 -04:00
Jorge Piedrahita Ortiz
14de81b140 community: sambastudio chat model (#27056)
**Description:**: sambastudio chat model integration added, previously
only LLM integration
     included docs and tests

---------

Co-authored-by: luisfucros <luisfucros@gmail.com>
Co-authored-by: Chester Curme <chester.curme@gmail.com>
2024-10-07 14:31:39 -04:00
Aditya Anand
f70650f67d core[patch]: correct typo doc-string for astream_events method (#27108)
This commit addresses a typographical error in the documentation for the
async astream_events method. The word 'evens' was incorrectly used in
the introductory sentence for the reference table, which could lead to
confusion for users.\n\n### Changes Made:\n- Corrected 'Below is a table
that illustrates some evens that might be emitted by various chains.' to
'Below is a table that illustrates some events that might be emitted by
various chains.'\n\nThis enhancement improves the clarity of the
documentation and ensures accurate terminology is used throughout the
reference material.\n\nIssue Reference: #27107
2024-10-07 14:12:42 -04:00
Bagatur
38099800cc docs: fix anthropic max_tokens docstring (#27166) 2024-10-07 16:51:42 +00:00
ogawa
07dd8dd3d7 community[patch]: update gpt-4o cost (#27038)
updated OpenAI cost definition according to the following:
https://openai.com/api/pricing/
2024-10-07 09:06:30 -04:00
Averi Kitsch
7a07196df6 docs: update Google Spanner Vector Store documentation (#27124)
Thank you for contributing to LangChain!

- [X] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core, etc. is
being modified. Use "docs: ..." for purely docs changes, "templates:
..." for template changes, "infra: ..." for CI changes.
  - Example: "community: add foobar LLM"


- [x] **PR message**: ***Delete this entire checklist*** and replace
with
    - **Description:** Update Spanner VS integration doc
    - **Issue:** None
    - **Dependencies:** None
    - **Twitter handle:** NA


- [x] **Add tests and docs**: If you're adding a new integration, please
include
1. a test for the integration, preferably unit tests that do not rely on
network access,
2. an example notebook showing its use. It lives in
`docs/docs/integrations` directory.


- [x] **Lint and test**: Run `make format`, `make lint` and `make test`
from the root of the package(s) you've modified. See contribution
guidelines for more: https://python.langchain.com/docs/contributing/

Additional guidelines:
- Make sure optional dependencies are imported within a function.
- Please do not add dependencies to pyproject.toml files (even optional
ones) unless they are required for unit tests.
- Most PRs should not touch more than one package.
- Changes should be backwards compatible.
- If you are adding something to community, do not re-import it in
langchain.

If no one reviews your PR within a few days, please @-mention one of
baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17.

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-10-04 23:59:10 +00:00
Bagatur
06ce5d1d5c anthropic[patch]: Release 0.2.3 (#27126) 2024-10-04 22:38:03 +00:00
Bagatur
0b8416bd2e anthropic[patch]: fix input_tokens when cached (#27125) 2024-10-04 22:35:51 +00:00
Erick Friis
64a16f2cf0 infra: add nvidia and astradb back to api build (#27115)
test build
https://github.com/langchain-ai/langchain/actions/runs/11185115845
2024-10-04 14:41:41 -07:00
Bagatur
bd5b335cb4 standard-tests[patch]: fix oai usage metadata test (#27122) 2024-10-04 20:00:48 +00:00
Bagatur
827bdf4f51 fireworks[patch]: Release 0.2.1 (#27120) 2024-10-04 18:59:15 +00:00
Bagatur
98942edcc9 openai[patch]: Release 0.2.2 (#27119) 2024-10-04 11:54:01 -07:00
Bagatur
414fe16071 anthropic[patch]: Release 0.2.2 (#27118) 2024-10-04 11:53:53 -07:00
Bagatur
11df1b2b8d core[patch]: Release 0.3.9 (#27117) 2024-10-04 18:35:33 +00:00
Scott Hurrey
558fb4d66d box: Add citation support to langchain_box.retrievers.BoxRetriever when used with Box AI (#27012)
Thank you for contributing to LangChain!

**Description:** Box AI can return responses, but it can also be
configured to return citations. This change allows the developer to
decide if they want the answer, the citations, or both. Regardless of
the combination, this is returned as a single List[Document] object.

**Dependencies:** Updated to the latest Box Python SDK, v1.5.1
**Twitter handle:** BoxPlatform


- [x] **Add tests and docs**: If you're adding a new integration, please
include
1. a test for the integration, preferably unit tests that do not rely on
network access,
2. an example notebook showing its use. It lives in
`docs/docs/integrations` directory.


- [x] **Lint and test**: Run `make format`, `make lint` and `make test`
from the root of the package(s) you've modified. See contribution
guidelines for more: https://python.langchain.com/docs/contributing/

Additional guidelines:
- Make sure optional dependencies are imported within a function.
- Please do not add dependencies to pyproject.toml files (even optional
ones) unless they are required for unit tests.
- Most PRs should not touch more than one package.
- Changes should be backwards compatible.
- If you are adding something to community, do not re-import it in
langchain.

If no one reviews your PR within a few days, please @-mention one of
baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17.

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-10-04 18:32:34 +00:00
Bagatur
1e768a9ec7 anthropic[patch]: correctly handle tool msg with empty list (#27109) 2024-10-04 11:30:50 -07:00
Bagatur
4935a14314 core,integrations[minor]: Dont error on fields in model_kwargs (#27110)
Given the current erroring behavior, every time we've moved a kwarg from
model_kwargs and made it its own field that was a breaking change.
Updating this behavior to support the old instantiations /
serializations.

Assuming build_extra_kwargs was not something that itself is being used
externally and needs to be kept backwards compatible
2024-10-04 11:30:27 -07:00
Bagatur
0495b7f441 anthropic[patch]: add usage_metadata details (#27087)
fixes https://github.com/langchain-ai/langchain/pull/27087
2024-10-04 08:46:49 -07:00
Erick Friis
e8e5d67a8d openai: fix None token detail (#27091)
happens in Azure
2024-10-04 01:25:38 +00:00
Vadym Barda
2715bed70e docs[patch]: update links w/ new langgraph API ref (#26961)
Co-authored-by: Erick Friis <erick@langchain.dev>
2024-10-03 23:52:01 +00:00
Rashmi Pawar
47142eb6ee docs: Integrations NVIDIA llm documentation (#26934)
**Description:**

Add Notebook for NVIDIA prompt completion llm class.

cc: @sumitkbh @mattf @dglogo

---------

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-10-03 23:32:45 +00:00
Erick Friis
ab4dab9a0c core: fix batch race condition in FakeListChatModel (#26924)
fixed #26273
2024-10-03 23:14:31 +00:00
Bagatur
87fc5ce688 core[patch]: exclude model cache from ser (#27086) 2024-10-03 22:00:31 +00:00
Bagatur
c09da53978 openai[patch]: add usage metadata details (#27080) 2024-10-03 14:01:03 -07:00
Bagatur
546dc44da5 core[patch]: add UsageMetadata details (#27072) 2024-10-03 20:36:17 +00:00
Sean
cc1b8b3d30 docs: Documentation update for Document Parse (#26844)
Renamed `Layout Analysis` to `Document Parser` in the doc as we have
recently renamed it!

---------

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-10-03 20:36:04 +00:00
Erick Friis
7f730ce8b2 docs: remove spaces in percent pip (#27082) 2024-10-03 20:34:24 +00:00
Tibor Reiss
47a9199fa6 community[patch]: Fix missing protected_namespaces (#27076)
Fixes #26861

---------

Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
2024-10-03 20:12:11 +00:00
Bagatur
2a54448a0a langchain[patch]: Release 0.3.2 (#27073) 2024-10-03 18:13:23 +00:00
Bharat Ramanathan
103e573f9b community[patch]: chore warn deprecate the wandb callback handler (#27062)
- **Description:**: This PR deprecates the wandb callback handler in
favor of the new
[WeaveTracer](https://weave-docs.wandb.ai/guides/integrations/langchain#using-weavetracer)
in W&B
- **Dependencies:** No dependencies, just a deprecation warning.
- **Twitter handle:** @parambharat


@baskaryan
2024-10-03 11:59:20 -04:00
Vadym Barda
907c758d67 docs[patch]: add long-term memory agent tutorial (#27057) 2024-10-02 23:02:44 -04:00
Eugene Yurtsev
c661ffe813 x 2024-10-02 13:54:21 -04:00
Eugene Yurtsev
635c55c039 core[patch]: Release 0.3.8 (#27046)
0.3.8 release for core
2024-10-02 16:58:38 +00:00
Eugene Yurtsev
74bf620e97 core[patch]: Support injected tool args that are arbitrary types (#27045)
This adds support for inject tool args that are arbitrary types when
used with pydantic 2.

We'll need to add similar logic on the v1 path, and potentially mirror
the config from the original model when we're doing the subset.
2024-10-02 12:50:58 -04:00
Erick Friis
e806e9de38 infra: fix api docs build checkout 2 (#27033) 2024-10-01 14:49:35 -07:00
Bagatur
099235da01 Revert "huggingface[patch]: make HuggingFaceEndpoint serializable (#2… (#27032)
…7027)"

This reverts commit b5e28d3a6d.
2024-10-01 21:26:38 +00:00
Bagatur
5f2e93ffea huggingface[patch]: xfail test (#27031) 2024-10-01 21:14:07 +00:00
Bagatur
b5e28d3a6d huggingface[patch]: make HuggingFaceEndpoint serializable (#27027) 2024-10-01 13:16:10 -07:00
ccurme
9d10151123 core[patch]: fix init of RunnableAssign (#26903)
Example in API ref currently raises ValidationError.

Resolves https://github.com/langchain-ai/langchain/issues/26862
2024-10-01 14:21:54 -04:00
Erick Friis
f7583194de docs: build new api docs (#26951) 2024-10-01 09:18:54 -07:00
Erick Friis
95a87291fd community: deprecate community ollama integrations (#26733) 2024-10-01 09:18:07 -07:00
ZhangShenao
e317d457cf Bug-Fix[Community] Fix FastEmbedEmbeddings (#26764)
#26759 

- Fix https://github.com/langchain-ai/langchain/issues/26759 
- Change `model` param from private to public, which may not be
initiated.
- Add test case
2024-09-30 21:23:08 -04:00
Erick Friis
a8e1577f85 milvus: mv to external repo (#26920) 2024-10-01 00:38:30 +00:00
Erick Friis
35f6393144 unstructured: mv to external repo (#26923) 2024-09-30 17:38:21 -07:00
Erick Friis
7ecd720120 multiple: update docs urls to latest 2 (#26837) 2024-09-30 17:37:07 -07:00
Erika Cardenas
4a32cc3c66 Update FeatureTables.js to add Weaviate (#26824)
Thank you for contributing to LangChain!


- [x] **PR message**: 
    - Add Weaviate to the vector store list.

Additional guidelines:
- Make sure optional dependencies are imported within a function.
- Please do not add dependencies to pyproject.toml files (even optional
ones) unless they are required for unit tests.
- Most PRs should not touch more than one package.
- Changes should be backwards compatible.
- If you are adding something to community, do not re-import it in
langchain.

If no one reviews your PR within a few days, please @-mention one of
baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17.

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-30 23:05:37 +00:00
William FH
6a861b0ad9 [Doc] Name variable langgraph_agent_executor (#26799) 2024-09-30 15:52:23 -07:00
Ayodele Aransiola
5346c7b27e doc: grammar fix on index.mdx (#26771)
Thank you for contributing to LangChain!

- [x] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core,
experimental, etc. is being modified. Use "docs: ..." for purely docs
changes, "templates: ..." for template changes, "infra: ..." for CI
changes.
  - Example: "community: add foobar LLM"


The PR is an adjustment on few grammar adjustments on the page.
@leomofthings is my twitter handle




If no one reviews your PR within a few days, please @-mention one of
baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17.

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-30 21:52:39 +00:00
Tomaz Bratanic
446144e7c6 Update neo4j vector procedures (#26775) 2024-09-30 14:45:09 -07:00
Arun Prakash
870bd42b0d docs: GremlinGraph Remove = in the URL (#26705)
- **Description:** URL is appended with = which is not working
    - **Issue:** removing the = symbol makes the URL valid
    - **Twitter handle:** @arunprakash_com

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-30 21:36:30 +00:00
federico-pisanu
2538963945 core[patch]: improve index/aindex api when batch_size<n_docs (#25754)
- **Description:** prevent index function to re-index entire source
document even if nothing has changed.
- **Issue:** #22135

I worked on a solution to this issue that is a compromise between being
cheap and being fast.
In the previous code, when batch_size is greater than the number of docs
from a certain source almost the entire source is deleted (all documents
from that source except for the documents in the first batch)
My solution deletes documents from vector store and record manager only
if at least one document has changed for that source.

Hope this can help!

---------

Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
2024-09-30 20:57:41 +00:00
Eugene Yurtsev
7fde2791dc core[patch]: Add kwargs to Runnable (#27008)
Fixes #26685

---------

Co-authored-by: Tibor Reiss <tibor.reiss@gmail.com>
2024-09-30 16:45:29 -04:00
Christophe Bornet
2a6abd3f0a community[patch]: Add docstring for Links (#25969)
Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
2024-09-30 20:33:50 +00:00
Ronan Amicel
19ed3165fb docs: Fix typo in list of PDF loaders (#26774)
Description: Fix typo in list of PDF loaders.

Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
2024-09-30 20:04:18 +00:00
Mohammad Mohtashim
e12f570ead Merge pull request #26794
* [chore]: Agent Observation should be casted to string to avoid errors

* Merge branch 'master' into fix_observation_type_streaming

* [chore]: Using Json.dumps

* [chore]: Exact same logic as  when casting agent oobservation to string
2024-09-30 15:54:51 -04:00
Bagatur
34bd718fe1 core[patch]: Release 0.3.7 (#27004) 2024-09-30 18:52:42 +00:00
Bagatur
248be02259 core[patch]: fix structured prompt template format (#27003)
template_format is an init argument on ChatPromptTemplate but not an
attribute on the object so was getting shoved into
StructuredPrompt.structured_ouptut_kwargs
2024-09-30 11:47:46 -07:00
Bagatur
0078493a80 fireworks[patch]: allow tool_choice with multiple tools (#26999)
https://docs.fireworks.ai/api-reference/post-chatcompletions
2024-09-30 11:28:43 -07:00
Bagatur
c7120d87dd groq[patch]: support tool_choice=any/required (#27000)
https://console.groq.com/docs/api-reference#chat-create
2024-09-30 11:28:35 -07:00
Christophe Bornet
db8845a62a core: Add ruff rules for pycodestyle Warning (W) (#26964)
All auto-fixes.
2024-09-30 09:31:43 -04:00
Bagatur
9404e7af9d openai[patch]: exclude http client (#26891)
httpx clients aren't serializable
2024-09-29 11:16:27 -07:00
Andrew Benton
ce2669cb56 docs: update code interpreter tool table to reflect riza file upload support (#26960)
**Description:** Update the code interpreter tools feature table to
reflect Riza file upload support (blog announcement here:
https://riza.io/blog/adding-support-for-input-files-and-http-credentials)
**Issue:** N/A
**Dependencies:** N/A
2024-09-29 12:04:07 -04:00
Erick Friis
b2c315997c infra: custom commit to external repo (#26962) 2024-09-27 16:39:28 -07:00
Ben Chambers
29bf89db25 community: Add conversions from GVS to networkx (#26906)
These allow converting linked documents (such as those used with
GraphVectorStore) to networkx for rendering and/or in-memory graph
algorithms such as community detection.
2024-09-27 16:48:55 -04:00
Christophe Bornet
7809b31b95 core[patch]: Add ruff rules for flake8-simplify (SIM) (#26848)
Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
2024-09-27 20:13:23 +00:00
Eugene Yurtsev
de0b48c41a docs: Upgrade examples with RunnableWithMessageHistory to langgraph memory (#26855)
This PR updates the documentation examples that used
RunnableWithMessageHistory to show how to achieve the same
implementation with langgraph memory.

Some of the underlying PRs (not all of them):

- docs[patch]: update chatbot tutorial and migration guide (#26780)
- docs[patch]: update chatbot memory how-to (#26790)
- docs[patch]: update chatbot tools how-to (#26816)
- docs: update chat history in rag how-to (#26821)
- docs: update trim messages notebook (#26793)
- docs: clean up imports in how to guide for rag qa with chat history
(#26825)
- docs[patch]: update conversational rag tutorial (#26814)

---------

Co-authored-by: ccurme <chester.curme@gmail.com>
Co-authored-by: Vadym Barda <vadym@langchain.dev>
Co-authored-by: mercyspirit <ziying.qiu@gmail.com>
Co-authored-by: aqiu7 <aqiu7@gatech.edu>
Co-authored-by: John <43506685+Coniferish@users.noreply.github.com>
Co-authored-by: Erick Friis <erick@langchain.dev>
Co-authored-by: William FH <13333726+hinthornw@users.noreply.github.com>
Co-authored-by: Subhrajyoty Roy <subhrajyotyroy@gmail.com>
Co-authored-by: Rajendra Kadam <raj.725@outlook.com>
Co-authored-by: Christophe Bornet <cbornet@hotmail.com>
Co-authored-by: Devin Gaffney <itsme@devingaffney.com>
Co-authored-by: Bagatur <22008038+baskaryan@users.noreply.github.com>
2024-09-27 20:04:30 +00:00
ccurme
44eddd39d6 infra[patch]: update notebooks workflow (#26956)
Addressing some lingering comments from
https://github.com/langchain-ai/langchain/pull/26944, adding parameters
for
- python version
- working directory

![Screenshot 2024-09-27 at 3 33
21 PM](https://github.com/user-attachments/assets/dfa45772-fddb-4489-a148-c9ed83d844d0)
2024-09-27 15:39:14 -04:00
ccurme
67df944dfb infra: add CI job for running tutorial notebooks (#26944) 2024-09-27 18:29:49 +00:00
Erick Friis
9eb26c5f9d infra: api docs build ref experimental (#26950) 2024-09-27 10:21:07 -07:00
Erick Friis
135164e1ee infra: api docs build ref update (#26949) 2024-09-27 10:12:10 -07:00
Erick Friis
c38ea7a069 infra: api docs build (#26948) 2024-09-27 09:47:43 -07:00
Christophe Bornet
f4e738bb40 core: Add ruff rules for PIE (#26939)
All auto-fixes.
2024-09-27 12:08:35 -04:00
ccurme
836c2a4ae0 docs: update memory integrations page (#26912) 2024-09-27 10:02:09 -04:00
ccurme
39987ebd91 openai[patch]: update deprecation target in API ref (#26921) 2024-09-27 08:42:31 -04:00
Subhrajyoty Roy
7f37fd8b80 community[patch]: callback before yield for cloudflare (#26927)
**Description:** Moves yield to after callback for `_stream` function
for the cloudfare workersai model in the community llm package
**Issue:** #16913
2024-09-27 08:42:01 -04:00
Youshin Kim
2d9a09dfa4 Fix typo in mlflow code example in mlflow.py (#26931)
- [x] PR title: Fix typo in code example in mlflow.py
- In libs/community/langchain_community/chat_models/mlflow.py
2024-09-27 12:41:39 +00:00
Subhrajyoty Roy
7037ba0f06 community[patch]: callback before yield for mlx pipeline (#26928)
**Description:** Moves yield to after callback for `_stream` function
for the MLX pipeline model in the community llm package
**Issue:** #16913
2024-09-27 08:41:34 -04:00
Subhrajyoty Roy
adcfecdb67 community[patch]: callback before yield for textgen (#26929)
**Description:** Moves callback to before yield for `_stream` and
`_astream` function for the textgen model in the community llm package
**Issue:** #16913
2024-09-27 08:41:13 -04:00
Subhrajyoty Roy
5f2cc4ecb2 community[patch]: callback before yield for titan takeoff (#26930)
**Description:** Moves yield to after callback for `_stream` function
for the titan takeoff model in the community llm package
**Issue:** #16913
2024-09-27 08:40:22 -04:00
Emmanuel Sciara
c6350d636e core[fix]: using async rate limiter methods in async code (#26914)
**Description:** Replaced blocking (sync) rate_limiter code in async
methods.

**Issue:** #26913

**Dependencies:** N/A

**Twitter handle:** no need 🤗
2024-09-26 20:44:28 +00:00
Eugene Yurtsev
02f5962cf1 docs: add api referencs to langgraph (#26877)
Add api references to langgraph
2024-09-26 15:21:10 -04:00
Abhi Agarwal
696114e145 community: add sqlite-vec vectorstore (#25003)
**Description**:

Adds a vector store integration with
[sqlite-vec](https://alexgarcia.xyz/sqlite-vec/), the successor to
sqlite-vss that is a single C file with no external dependencies.

Pretty straightforward, just copy-pasted the sqlite-vss integration and
made a few tweaks and added integration tests. Only question is whether
all documentation should be directed away from sqlite-vss if it is
defacto deprecated (cc @asg017).

---------

Co-authored-by: Erick Friis <erick@langchain.dev>
Co-authored-by: philippe-oger <philippe.oger@adevinta.com>
2024-09-26 17:37:10 +00:00
Erick Friis
8bc12df2eb voyageai: new models (#26907)
Co-authored-by: fzowl <zoltan@voyageai.com>
Co-authored-by: fzowl <160063452+fzowl@users.noreply.github.com>
2024-09-26 17:07:10 +00:00
Eugene Yurtsev
2a0d9d05fb docs: Fix trim_messages invocations in the memory migration guide (#26902)
Should only be start_on="human", not start_on=("human", "ai")
2024-09-26 17:02:30 +00:00
Erick Friis
7a99a4d4f8 infra: fix experimental in dco imports check (#26905) 2024-09-26 09:51:58 -07:00
Subhrajyoty Roy
ba467f1a36 community[patch]: callback before yield for gigachat (#26881)
**Description:** Moves yield to after callback for `_stream` and
`_astream` function for the gigachat model in the community llm package
**Issue:** #16913
2024-09-26 12:47:28 -04:00
Subhrajyoty Roy
11e703a97e community[patch]: callback before yield for google palm (#26882)
**Description:** Moves yield to after callback for `_stream` function
for the google palm model in the community package
**Issue:** #16913
2024-09-26 12:47:05 -04:00
Julius Stopforth
121e79b1f0 core: Fix IndexError when trim_messages invoked with empty list (#26896)
This prevents `trim_messages` from raising an `IndexError` when invoked
with `include_system=True`, `strategy="last"`, and an empty message
list.

Fixes #26895

Dependencies: none
2024-09-26 11:29:58 -04:00
ccurme
7091a1a798 openai[patch]: increase token limit in azure integration tests (#26901)
`test_json_mode` occasionally runs into this
2024-09-26 14:31:33 +00:00
Erick Friis
2ea5f60cc5 experimental: migrate to external repo (#26879)
security scanners can't distinguish monorepo sources from each other.
this will resolve issues for folks trying to use e.g. langchain-core but
getting security issues from experimental flagged!
2024-09-25 19:02:19 -07:00
Bagatur
c750600d3d infra: update release secrets (#26878) 2024-09-26 00:12:31 +00:00
Jack Peplinski
edf879d321 docs: update extraction_examples.ipynb (#26874)
The `Without examples 😿` and `With examples 😻` should have different
outputs to illustrate their point.

See v0.2 docs.
https://python.langchain.com/docs/how_to/extraction_examples/#without-examples-

If no one reviews your PR within a few days, please @-mention one of
baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17.
2024-09-25 17:26:42 -04:00
Erick Friis
6f3c8313ba community: bump langchain version (#26876) 2024-09-25 12:58:24 -07:00
Erick Friis
e068407f18 community: bump core versoin (#26875) 2024-09-25 12:57:16 -07:00
Eugene Yurtsev
25cb44c9ee 0.3.1 release community (#26872)
Release for 0.3.1

---------

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-25 19:38:53 +00:00
Erick Friis
9a31ad6f60 langchain: release 0.3.1 (#26868) 2024-09-25 11:43:54 -07:00
Erick Friis
ef2ab26113 core: release 0.3.6 (#26863) 2024-09-25 11:05:53 -07:00
ccurme
87e21493f7 docs[patch]: remove deprecated loaders from feature tables (#26709) 2024-09-25 12:53:32 -04:00
ccurme
a0010063e8 docs[patch]: add guide for loading web pages (#26708) 2024-09-25 12:03:42 -04:00
Bagatur
eaffa92c1d openai[patch]: Release 0.2.1 (#26858) 2024-09-25 15:55:49 +00:00
Rajendra Kadam
51c4393298 community[patch]: Fix validation error in SettingsConfigDict across multiple Langchain modules (#26852)
- **Description:** This pull request addresses the validation error in
`SettingsConfigDict` due to extra fields in the `.env` file. The issue
is prevalent across multiple Langchain modules. This fix ensures that
extra fields in the `.env` file are ignored, preventing validation
errors.
  **Changes include:**
    - Applied fixes to modules using `SettingsConfigDict`.

- **Issue:** NA, similar
https://github.com/langchain-ai/langchain/issues/26850
- **Dependencies:** NA
2024-09-25 10:02:14 -04:00
Devin Gaffney
d502858412 Update main README.md to reference latest version of documentation (#26854)
Update README.md to point at latest docs
2024-09-25 09:44:18 -04:00
Eugene Yurtsev
27c12146c8 docs[patch]: In conceptual docs explain constraints on ToolMessage (#26792)
Minor clarification
2024-09-25 09:34:45 -04:00
Christophe Bornet
3a1b9259a7 core: Add ruff rules for comprehensions (C4) (#26829) 2024-09-25 09:34:17 -04:00
Rajendra Kadam
7e5a9c317f community[minor]: [Pebblo] Enhance PebbloSafeLoader to take anonymize flag (#26812)
- **Description:** The flag is named `anonymize_snippets`. When set to
true, the Pebblo server will anonymize snippets by redacting all
personally identifiable information (PII) from the snippets going into
VectorDB and the generated reports
- **Issue:** NA
- **Dependencies:** NA
- **docs**: Updated
2024-09-25 09:33:06 -04:00
Rajendra Kadam
92003b3724 community[patch]: [SharePointLoader] Fix validation error in _O365Settings due to extra fields in .env file (#26851)
**Description:** Fix validation error in _O365Settings by ignoring extra
fields in .env file
**Issue:** https://github.com/langchain-ai/langchain/issues/26850
**Dependencies:** NA
2024-09-25 09:31:59 -04:00
Subhrajyoty Roy
b61fb98466 community[patch]: callback before yield for friendli (#26842)
**Description:** Moves yield to after callback for `_stream` and
`_astream` function for the friendli model in the community package
**Issue:** #16913
2024-09-25 09:31:12 -04:00
ccurme
13acf9e6b0 langchain[patch]: add deprecation warnings (#26853) 2024-09-25 09:26:44 -04:00
William FH
82b5b77940 [Core] Add more interops tests (#26841)
To test that the client propagates both ways
2024-09-24 20:18:20 -07:00
William FH
9b6ac41442 [Core] Inherit tracing metadata & tags (#26838) 2024-09-24 19:33:12 -07:00
Erick Friis
3796e143f8 docs: remove one more print from build (#26834) 2024-09-24 22:40:16 +00:00
Erick Friis
95269366ae docs: make build less verbose (#26833) 2024-09-24 22:30:05 +00:00
Erick Friis
425c0f381f experimental: release 0.3.1 (#26830) 2024-09-24 15:03:05 -07:00
John
6c3ea262c8 partners/unstructured: release 0.1.5 (#26831)
**Description:** update package version to support loading URLs #26670
**Issue:**  #26697
2024-09-24 15:02:53 -07:00
mercyspirit
0414be4b80 experimental[major]: CVE-2024-46946 fix (#26783)
Description: Resolve CVE-2024-46946 by switching out sympify with
parse_expr with a very specific allowed set of operations.

https://nvd.nist.gov/vuln/detail/cve-2024-46946

Sympify uses eval which makes it vulnerable to code execution.
parse_expr is limited to specific expressions.

Bandit results

![image](https://github.com/user-attachments/assets/170a6376-7028-4e70-a7ef-9acfb49c1d8a)

---------

Co-authored-by: aqiu7 <aqiu7@gatech.edu>
Co-authored-by: Eugene Yurtsev <eugene@langchain.dev>
Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
2024-09-24 21:37:56 +00:00
Erick Friis
f9ef688b3a docs: upgrade to docusaurus v3 (#26803) 2024-09-24 11:28:13 -07:00
Subhrajyoty Roy
b1da532522 community[patch]: callback before yield for deepsparse llm (#26822)
**Description:** Moves yield to after callback for `_stream` and
`_astream` function for the deepsparse model in the community package
**Issue:** #16913
2024-09-24 13:55:52 -04:00
Nuno Campos
de70a64e3a core: Run LangChainTracer inline (#26797)
- this flag ensures the tracer always runs in the same thread as the run
being traced for both sync and async runs
- pro: less chance for ordering bugs and other oddities
- blocking the event loop is not a concern given all code in the tracer
holds the GIL anyway
2024-09-24 08:31:18 -07:00
Jorge Piedrahita Ortiz
408a930d55 community: Add Sambanova Cloud Chat model community integration (#26333)
**Description:** : Add SambaNova Cloud Chat model community integration
Includes 
- chat model integration (following Standardize ChatModel docstrings)
-  tests
- docs usage notebook (following Standardize ChatModel integration docs)

https://cloud.sambanova.ai/

---------

Co-authored-by: luisfucros <luisfucros@gmail.com>
Co-authored-by: ccurme <chester.curme@gmail.com>
2024-09-24 14:11:32 +00:00
Tom
2b83c7c3ab community[patch]: Fix tool_calls parsing when streaming from DeepInfra (#26813)
- **Description:** This PR fixes the response parsing logic for
`ChatDeepInfra`, more specifially `_convert_delta_to_message_chunk()`,
which is invoked when streaming via `ChatDeepInfra`.
- **Issue:** Streaming from DeepInfra via `ChatDeepInfra` is currently
broken because the response parsing logic doesn't handle that
`tool_calls` can be `None`. (There is no GitHub issue for this problem
yet.)
- **Dependencies:** –
- **Twitter handle:** –

Keeping this here as a reminder:
> If no one reviews your PR within a few days, please @-mention one of
baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17.
2024-09-24 13:47:36 +00:00
Subhrajyoty Roy
997d95c8f8 community[patch]: callback before yield for bedrock llm (#26804)
**Description:** Moves yield to after callback for
`_prepare_input_and_invoke_stream` and
`_aprepare_input_and_invoke_stream` for bedrock llm in community
package.
**Issue:** #16913
2024-09-24 12:14:59 +00:00
Erick Friis
e40a2b8bbf docs: fix mdx codefences (#26802)
```
git grep -l -E '"```\{=mdx\}\\n",' | xargs perl -0777 -i -pe 's/"```\{=mdx\}\\n",\n    (\W.*?),\n\s*"```\\?n?"/$1/s'
```
2024-09-24 06:06:13 +00:00
Erick Friis
35081d2765 docs: fix admonition formatting (#26801) 2024-09-23 21:55:17 -07:00
Erick Friis
603d38f06d docs: make docs mdxv2 compatible (#26798)
prep for docusaurus migration
2024-09-23 21:24:23 -07:00
ccurme
2a4c5713cd openai[patch]: fix azure integration tests (#26791) 2024-09-23 17:49:15 -04:00
ccurme
1ce056d1b2 docs[patch]: add memory migration guides to sidebar (#26711)
Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
2024-09-23 15:31:27 -04:00
Mohammad Mohtashim
154a5ff7ca core[patch]: On Chain Start Fix for Chain Class (#26593)
- **Issue:** #26588

---------

Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
2024-09-23 19:30:59 +00:00
ccurme
bba7af903b core[patch]: set default on Blob (#26787)
Resolves https://github.com/langchain-ai/langchain/issues/26781
2024-09-23 18:55:56 +00:00
ccurme
97b27f0930 langchain[patch]: fix extended tests (#26788)
Broken by addition of `disabled_params`
2024-09-23 18:52:09 +00:00
Brace Sproul
fb9ac8da2f fix(docs): Drop announcement bar (#26782) 2024-09-23 18:03:59 +00:00
Bagatur
e1e4f88b3e openai[patch]: enable Azure structured output, parallel_tool_calls=Fa… (#26599)
…lse, tool_choice=required

response_format=json_schema, tool_choice=required, parallel_tool_calls
are all supported for gpt-4o on azure.
2024-09-22 22:25:22 -07:00
Gabriel Altay
bb40a0fb32 Remove pydantic restricted namespaces from HuggingFaceInferenceAPIEmbedings (#26744)
without this `model_config` importing this package produces warnings
about "model_name" having conflicts with protected namespace "model_".

Thank you for contributing to LangChain!

- [ ] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core,
experimental, etc. is being modified. Use "docs: ..." for purely docs
changes, "templates: ..." for template changes, "infra: ..." for CI
changes.
  - Example: "community: add foobar LLM"


- [ ] **PR message**: ***Delete this entire checklist*** and replace
with
    - **Description:** a description of the change
    - **Issue:** the issue # it fixes, if applicable
    - **Dependencies:** any dependencies required for this change
- **Twitter handle:** if your PR gets announced, and you'd like a
mention, we'll gladly shout you out!


- [ ] **Add tests and docs**: If you're adding a new integration, please
include
1. a test for the integration, preferably unit tests that do not rely on
network access,
2. an example notebook showing its use. It lives in
`docs/docs/integrations` directory.


- [ ] **Lint and test**: Run `make format`, `make lint` and `make test`
from the root of the package(s) you've modified. See contribution
guidelines for more: https://python.langchain.com/docs/contributing/

Additional guidelines:
- Make sure optional dependencies are imported within a function.
- Please do not add dependencies to pyproject.toml files (even optional
ones) unless they are required for unit tests.
- Most PRs should not touch more than one package.
- Changes should be backwards compatible.
- If you are adding something to community, do not re-import it in
langchain.

If no one reviews your PR within a few days, please @-mention one of
baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17.

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2024-09-22 08:05:37 -04:00
Gor Hayrapetyan
f97ac92f00 community[patch]: Handle empty PR body in get_pull_request in Github utility (#26739)
**Description:**
When PR body is empty `get_pull_request` method fails with bellow
exception.


**Issue:**
```
TypeError('expected string or buffer')Traceback (most recent call last):


  File ".../.venv/lib/python3.9/site-packages/langchain_core/tools/base.py", line 661, in run
    response = context.run(self._run, *tool_args, **tool_kwargs)


  File ".../.venv/lib/python3.9/site-packages/langchain_community/tools/github/tool.py", line 52, in _run
    return self.api_wrapper.run(self.mode, query)


  File ".../.venv/lib/python3.9/site-packages/langchain_community/utilities/github.py", line 816, in run
    return json.dumps(self.get_pull_request(int(query)))


  File ".../.venv/lib/python3.9/site-packages/langchain_community/utilities/github.py", line 495, in get_pull_request
    add_to_dict(response_dict, "body", pull.body)


  File ".../.venv/lib/python3.9/site-packages/langchain_community/utilities/github.py", line 487, in add_to_dict
    tokens = get_tokens(value)


  File ".../.venv/lib/python3.9/site-packages/langchain_community/utilities/github.py", line 483, in get_tokens
    return len(tiktoken.get_encoding("cl100k_base").encode(text))


  File "....venv/lib/python3.9/site-packages/tiktoken/core.py", line 116, in encode
    if match := _special_token_regex(disallowed_special).search(text):


TypeError: expected string or buffer
```

**Twitter:**  __gorros__
2024-09-22 01:56:24 +00:00
Erick Friis
238a31bbd9 core: release 0.3.5 (#26737) 2024-09-21 00:26:39 +00:00
William FH
55af6fbd02 [LangChainTracer] Omit Chunk (#26602)
in events / new llm token
2024-09-20 17:10:34 -07:00
Anton Dubovik
3e2cb4e8a4 openai: embeddings: supported chunk_size when check_embedding_ctx_length is disabled (#23767)
Chunking of the input array controlled by `self.chunk_size` is being
ignored when `self.check_embedding_ctx_length` is disabled. Effectively,
the chunk size is assumed to be equal 1 in such a case. This is
suprising.

The PR takes into account `self.chunk_size` passed by the user.

---------

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-20 16:58:45 -07:00
William FH
864020e592 [Tracer] add project name to run from tracer (#26736) 2024-09-20 16:48:37 -07:00
Nithish Raghunandanan
2d21274bf6 couchbase: Add ttl support to caches & chat_message_history (#26214)
**Description:** Add support to delete documents automatically from the
caches & chat message history by adding a new optional parameter, `ttl`.


- [x] **Add tests and docs**: If you're adding a new integration, please
include
1. a test for the integration, preferably unit tests that do not rely on
network access,
2. an example notebook showing its use. It lives in
`docs/docs/integrations` directory.


- [x] **Lint and test**: Run `make format`, `make lint` and `make test`
from the root of the package(s) you've modified. See contribution
guidelines for more: https://python.langchain.com/docs/contributing/

---------

Co-authored-by: Nithish Raghunandanan <nithishr@users.noreply.github.com>
Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-20 23:44:29 +00:00
Krishna Kulkarni
c6c508ee96 Refining Skip Count Calculation by Filtering Documents with session_id (#26020)
In the previous implementation, `skip_count` was counting all the
documents in the collection. Instead, we want to filter the documents by
`session_id` and calculate `skip_count` by subtracting `history_size`
from the filtered count.

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2024-09-20 23:40:56 +00:00
Tibor Reiss
a8b24135a2 fix[experimental]: Fix text splitter with gradient (#26629)
Fixes #26221

---------

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-20 23:35:50 +00:00
Alejandro Rodríguez
4ac9a6f52c core: fix "template" not allowed as prompt param (#26060)
- **Description:**  fix "template" not allowed as prompt param
- **Issue:** #26058
- **Dependencies:** none


- [ ] **Add tests and docs**: If you're adding a new integration, please
include
1. a test for the integration, preferably unit tests that do not rely on
network access,
2. an example notebook showing its use. It lives in
`docs/docs/integrations` directory.


- [ ] **Lint and test**: Run `make format`, `make lint` and `make test`
from the root of the package(s) you've modified. See contribution
guidelines for more: https://python.langchain.com/docs/contributing/

Additional guidelines:
- Make sure optional dependencies are imported within a function.
- Please do not add dependencies to pyproject.toml files (even optional
ones) unless they are required for unit tests.
- Most PRs should not touch more than one package.
- Changes should be backwards compatible.
- If you are adding something to community, do not re-import it in
langchain.

If no one reviews your PR within a few days, please @-mention one of
baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17.

---------

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-20 23:33:06 +00:00
Christophe Bornet
58f339a67c community: Fix links in GraphVectorStore pydoc (#25959)
Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-20 23:17:53 +00:00
Christophe Bornet
e49c413977 core: Add docstring for GraphVectorStoreRetriever (#26224)
Co-authored-by: Erick Friis <erickfriis@gmail.com>
2024-09-20 23:16:37 +00:00
Lucain
a2023a1e96 huggingface; fix huggingface_endpoint.py (initialize clients only with supported kwargs) (#26378)
## Description

By default, `HuggingFaceEndpoint` instantiates both the
`InferenceClient` and the `AsyncInferenceClient` with the
`"server_kwargs"` passed as input. This is an issue as both clients
might not support exactly the same kwargs. This has been highlighted in
https://github.com/huggingface/huggingface_hub/issues/2522 by
@morgandiverrez with the `trust_env` parameter. In order to make
`langchain` integration future-proof, I do think it's wiser to forward
only the supported parameters to each client. Parameters that are not
supported are simply ignored with a warning to the user. From a
`huggingface_hub` maintenance perspective, this allows us much more
flexibility as we are not constrained to support the exact same kwargs
in both clients.

## Issue

https://github.com/huggingface/huggingface_hub/issues/2522

## Dependencies

None

## Twitter 

https://x.com/Wauplin

---------

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-20 16:05:24 -07:00
ccurme
f2285376a5 community[patch]: add web loader tests (#26728) 2024-09-20 18:29:54 -04:00
Erick Friis
4a2745064a core: release 0.3.4 (#26729) 2024-09-20 14:47:15 -07:00
Nuno Campos
345edeb1f0 core: In astream_events propagate cancellation reason to inner task (#26727)
Thank you for contributing to LangChain!

- [ ] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core,
experimental, etc. is being modified. Use "docs: ..." for purely docs
changes, "templates: ..." for template changes, "infra: ..." for CI
changes.
  - Example: "community: add foobar LLM"


- [ ] **PR message**: ***Delete this entire checklist*** and replace
with
    - **Description:** a description of the change
    - **Issue:** the issue # it fixes, if applicable
    - **Dependencies:** any dependencies required for this change
- **Twitter handle:** if your PR gets announced, and you'd like a
mention, we'll gladly shout you out!


- [ ] **Add tests and docs**: If you're adding a new integration, please
include
1. a test for the integration, preferably unit tests that do not rely on
network access,
2. an example notebook showing its use. It lives in
`docs/docs/integrations` directory.


- [ ] **Lint and test**: Run `make format`, `make lint` and `make test`
from the root of the package(s) you've modified. See contribution
guidelines for more: https://python.langchain.com/docs/contributing/

Additional guidelines:
- Make sure optional dependencies are imported within a function.
- Please do not add dependencies to pyproject.toml files (even optional
ones) unless they are required for unit tests.
- Most PRs should not touch more than one package.
- Changes should be backwards compatible.
- If you are adding something to community, do not re-import it in
langchain.

If no one reviews your PR within a few days, please @-mention one of
baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17.
2024-09-20 14:42:10 -07:00
Erick Friis
465e43cd43 core: release 0.3.3 (#26713) 2024-09-20 13:54:19 -07:00
Eugene Yurtsev
4fc69d61ad core[patch]: Fix defusedxml import (#26718)
Fix defusedxml import. Haven't investigated what's actually going on
under the hood -- defusedxml probably does some weird things in __init__
2024-09-20 16:53:24 -04:00
Eugene Yurtsev
79b224f6f3 core/langchain: fix version used in deprecation (#26724)
in core deprecation should be version 0.3.3 instead of 0.3.4
in langchain deprecation should be version 0.3.1 instead of 0.3.4
2024-09-20 16:47:18 -04:00
Eugene Yurtsev
8a9f7091c0 docs: Update trim message usage in migrating_memory (#26722)
Make sure we don't end up with a ToolMessage that precedes an AIMessage
2024-09-20 20:20:27 +00:00
Eugene Yurtsev
91f4711e53 core[patch],langchain[patch]: deprecate memory and entity abstractions and implementations (#26717)
This PR deprecates the old memory, entity abstractions and implementations
2024-09-20 15:06:25 -04:00
William FH
19ce95d3c9 Avoid copying runs (#26689)
Also, re-unify run trees. Use a single shared client.
2024-09-20 10:57:41 -07:00
Eric
90031b1b3e support epsilla cloud vector database in langchain (#26065)
Description

- support epsilla cloud in langchain

---------

Co-authored-by: Leonid Ganeline <leo.gan.57@gmail.com>
Co-authored-by: Chester Curme <chester.curme@gmail.com>
2024-09-20 17:14:23 +00:00
ZhangShenao
baef7639fd Improvement[text-splitter] Fix import of ExperimentalMarkdownSyntaxTextSplitter (#26703)
#26028 

Export `ExperimentalMarkdownSyntaxTextSplitter` in __init__

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-20 17:04:31 +00:00
Eugene Yurtsev
acf8c2c13e docs: Add migration instructions for v0.0.x memory abstractions (#26668)
This PR adds a migration guide for any code that relies on old memory
abstractions.
2024-09-20 15:09:23 +00:00
ccurme
eeab6a688c docs[patch]: update PDF loader docs (#26627)
Docs preview:
https://langchain-git-cc-pdfdocs-langchain.vercel.app/docs/how_to/document_loader_pdf/
2024-09-20 11:07:06 -04:00
stein1988
91594928c5 fix:fix ChatZhipuAI tool call bug (#26693)
- [ ] **PR title**: "community:fix ChatZhipuAI tool call bug"

- [ ] **Description:** ZhipuAI api response as follows:
{'id': '20240920132549e379a9152a6a4d7c', 'created': 1726809949, 'model':
'glm-4-flash', 'choices': [{'index': 0, 'finish_reason': 'tool_calls',
'delta': {'role': 'assistant', 'tool_calls': [{'id':
'call_20240920132549e379a9152a6a4d7c', 'index': 0, 'type': 'function',
'function': {'name': 'get_datetime_offline', 'arguments': '{}'}}]}}]}
so, tool_calls = dct.get("tool_call", None) in
_convert_delta_to_message_chunk should be "tool_calls"
2024-09-20 13:06:42 +00:00
guoqiang0401
8f0c04f47e Update tool_calling.ipynb (#26699)
There is a small bug in "TypedDict class" sample source.

Thank you for contributing to LangChain!

- [ ] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core,
experimental, etc. is being modified. Use "docs: ..." for purely docs
changes, "templates: ..." for template changes, "infra: ..." for CI
changes.
  - Example: "community: add foobar LLM"


- [ ] **PR message**: ***Delete this entire checklist*** and replace
with
    - **Description:** a description of the change
    - **Issue:** the issue # it fixes, if applicable
    - **Dependencies:** any dependencies required for this change
- **Twitter handle:** if your PR gets announced, and you'd like a
mention, we'll gladly shout you out!


- [ ] **Add tests and docs**: If you're adding a new integration, please
include
1. a test for the integration, preferably unit tests that do not rely on
network access,
2. an example notebook showing its use. It lives in
`docs/docs/integrations` directory.


- [ ] **Lint and test**: Run `make format`, `make lint` and `make test`
from the root of the package(s) you've modified. See contribution
guidelines for more: https://python.langchain.com/docs/contributing/

Additional guidelines:
- Make sure optional dependencies are imported within a function.
- Please do not add dependencies to pyproject.toml files (even optional
ones) unless they are required for unit tests.
- Most PRs should not touch more than one package.
- Changes should be backwards compatible.
- If you are adding something to community, do not re-import it in
langchain.

If no one reviews your PR within a few days, please @-mention one of
baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17.
2024-09-20 13:04:50 +00:00
Bagatur
f7bb3640f1 core[patch]: support js chat model namespaces (#26688) 2024-09-19 16:14:20 -07:00
Bagatur
c453b76579 core[patch]: Release 0.3.2 (#26686) 2024-09-19 14:58:45 -07:00
Piyush Jain
f087ab43fd core[patch]: Fix load of ChatBedrock (#26679)
Complementary PR to master for #26643.

Co-authored-by: Bagatur <22008038+baskaryan@users.noreply.github.com>
2024-09-19 21:57:20 +00:00
Bagatur
409f35363b core[patch]: support load from path for default namespaces (#26675) 2024-09-19 14:47:27 -07:00
Eugene Yurtsev
e8236e58f2 ci: restore qa template that was known to work (#26684)
Restore qa template that was working
2024-09-19 17:20:42 -04:00
ccurme
eef18dec44 unstructured[patch]: support loading URLs (#26670)
`unstructured.partition.auto.partition` supports a `url` kwarg, but
`url` in `UnstructuredLoader.__init__` is reserved for the server URL.
Here we add a `web_url` kwarg that is passed to the partition kwargs:
```python
self.unstructured_kwargs["url"] = web_url
```
2024-09-19 11:40:25 -07:00
Erick Friis
311f861547 core, community: move graph vectorstores to community (#26678)
remove beta namespace from core, add to community
2024-09-19 11:38:14 -07:00
Serena Ruan
c77c28e631 [community] Fix WorkspaceClient error with pydantic validation (#26649)
Thank you for contributing to LangChain!

Fix error like
<img width="1167" alt="image"
src="https://github.com/user-attachments/assets/2e219b26-ec7e-48ef-8111-e0ff2f5ac4c0">

After the fix:
<img width="584" alt="image"
src="https://github.com/user-attachments/assets/48f36fe7-628c-48b6-81b2-7fe741e4ca85">


- [ ] **Add tests and docs**: If you're adding a new integration, please
include
1. a test for the integration, preferably unit tests that do not rely on
network access,
2. an example notebook showing its use. It lives in
`docs/docs/integrations` directory.


- [ ] **Lint and test**: Run `make format`, `make lint` and `make test`
from the root of the package(s) you've modified. See contribution
guidelines for more: https://python.langchain.com/docs/contributing/

Additional guidelines:
- Make sure optional dependencies are imported within a function.
- Please do not add dependencies to pyproject.toml files (even optional
ones) unless they are required for unit tests.
- Most PRs should not touch more than one package.
- Changes should be backwards compatible.
- If you are adding something to community, do not re-import it in
langchain.

If no one reviews your PR within a few days, please @-mention one of
baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17.

---------

Signed-off-by: serena-ruan <serena.rxy@gmail.com>
Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-19 18:25:33 +00:00
ccurme
7d49ee9741 unstructured[patch]: add to integration tests (#26666)
- Add to tests on parsed content;
- Add tests for async + lazy loading;
- Add a test for `strategy="hi_res"`.
2024-09-19 13:43:34 -04:00
Erick Friis
28dd6564db docs: highlight styling (#26636)
MERGE ME PLEASE
2024-09-19 17:12:59 +00:00
ccurme
f91bdd12d2 community[patch]: add to pypdf tests and run in CI (#26663) 2024-09-19 14:45:49 +00:00
ice yao
4d3d62c249 docs: fix nomic link error (#26642) 2024-09-19 14:41:45 +00:00
Rajendra Kadam
60dc19da30 [community] Added PebbloTextLoader for loading text data in PebbloSafeLoader (#26582)
- **Description:** Added PebbloTextLoader for loading text in
PebbloSafeLoader.
- Since PebbloSafeLoader wraps document loaders, this new loader enables
direct loading of text into Documents using PebbloSafeLoader.
- **Issue:** NA
- **Dependencies:** NA
- [x] **Tests**: Added/Updated tests
2024-09-19 09:59:04 -04:00
Jorge Piedrahita Ortiz
55b641b761 community: fix error in sambastudio embeddings (#26260)
fix error in samba studio embeddings  result unpacking
2024-09-19 09:57:04 -04:00
Jorge Piedrahita Ortiz
37b72023fe community: remove sambaverse (#26265)
removing Sambaverse llm model and references given is not available
after Sep/10/2024

<img width="1781" alt="image"
src="https://github.com/user-attachments/assets/4dcdb5f7-5264-4a03-b8e5-95c88304e059">
2024-09-19 09:56:30 -04:00
Martin Triska
3fc0ea510e community : [bugfix] Use document ids as keys in AzureSearch vectorstore (#25486)
# Description
[Vector store base
class](4cdaca67dc/libs/core/langchain_core/vectorstores/base.py (L65))
currently expects `ids` to be passed in and that is what it passes along
to the AzureSearch vector store when attempting to `add_texts()`.
However AzureSearch expects `keys` to be passed in. When they are not
present, AzureSearch `add_embeddings()` makes up new uuids. This is a
problem when trying to run indexing. [Indexing code
expects](b297af5482/libs/core/langchain_core/indexing/api.py (L371))
the documents to be uploaded using provided ids. Currently AzureSearch
ignores `ids` passed from `indexing` and makes up new ones. Later when
`indexer` attempts to delete removed file, it uses the `id` it had
stored when uploading the document, however it was uploaded under
different `id`.

**Twitter handle: @martintriska1**
2024-09-19 09:37:18 -04:00
Tomaz Bratanic
a8561bc303 Fix async parsing for llm graph transformer (#26650) 2024-09-19 09:15:33 -04:00
Erik
4e0a6ebe7d community: Add warning when page_content is empty (#25955)
Page content sometimes is empty when PyMuPDF can not find text on pages.
For example, this can happen when the text of the PDF is not copyable
"by hand". Then an OCR solution is need - which is not integrated here.

This warning should accurately warn the user that some pages are lost
during this process.

Thank you for contributing to LangChain!

- [ ] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core,
experimental, etc. is being modified. Use "docs: ..." for purely docs
changes, "templates: ..." for template changes, "infra: ..." for CI
changes.
  - Example: "community: add foobar LLM"


- [ ] **PR message**: ***Delete this entire checklist*** and replace
with
    - **Description:** a description of the change
    - **Issue:** the issue # it fixes, if applicable
    - **Dependencies:** any dependencies required for this change
- **Twitter handle:** if your PR gets announced, and you'd like a
mention, we'll gladly shout you out!


- [ ] **Add tests and docs**: If you're adding a new integration, please
include
1. a test for the integration, preferably unit tests that do not rely on
network access,
2. an example notebook showing its use. It lives in
`docs/docs/integrations` directory.


- [ ] **Lint and test**: Run `make format`, `make lint` and `make test`
from the root of the package(s) you've modified. See contribution
guidelines for more: https://python.langchain.com/docs/contributing/

Additional guidelines:
- Make sure optional dependencies are imported within a function.
- Please do not add dependencies to pyproject.toml files (even optional
ones) unless they are required for unit tests.
- Most PRs should not touch more than one package.
- Changes should be backwards compatible.
- If you are adding something to community, do not re-import it in
langchain.

If no one reviews your PR within a few days, please @-mention one of
baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17.

---------

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-19 05:22:09 +00:00
Christophe Bornet
fd21ffe293 core: Add N(naming) ruff rules (#25362)
Public classes/functions are not renamed and rule is ignored for them.

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-19 05:09:39 +00:00
Daniel Cooke
7835c0651f langchain_chroma: Pass through kwargs to Chroma collection.delete (#25970)
Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-19 04:21:24 +00:00
Tibor Reiss
85caaa773f docs[community]: Fix raw string in docstring (#26350)
Fixes #26212: replaced the raw string with backslashes. Alternative:
raw-stringif the full docstring.

---------

Co-authored-by: Erick Friis <erickfriis@gmail.com>
2024-09-19 04:18:56 +00:00
Erick Friis
8fb643a6e8 partners/box: release 0.2.1 (#26644) 2024-09-19 04:02:06 +00:00
Tomaz Bratanic
03b9aca55d community: Retry retriable errors in Neo4j (#26211)
Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-19 04:01:07 +00:00
Scott Hurrey
acbb4e4701 box: Add searchoptions for BoxRetriever, documentation for BoxRetriever as agent tool (#26181)
Thank you for contributing to LangChain!

- [x] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core,
experimental, etc. is being modified. Use "docs: ..." for purely docs
changes, "templates: ..." for template changes, "infra: ..." for CI
changes.
  - Example: "community: add foobar LLM"


Added search options for BoxRetriever and added documentation to
demonstrate how to use BoxRetriever as an agent tool - @BoxPlatform


- [x] **Add tests and docs**: If you're adding a new integration, please
include
1. a test for the integration, preferably unit tests that do not rely on
network access,
2. an example notebook showing its use. It lives in
`docs/docs/integrations` directory.


- [x] **Lint and test**: Run `make format`, `make lint` and `make test`
from the root of the package(s) you've modified. See contribution
guidelines for more: https://python.langchain.com/docs/contributing/

Additional guidelines:
- Make sure optional dependencies are imported within a function.
- Please do not add dependencies to pyproject.toml files (even optional
ones) unless they are required for unit tests.
- Most PRs should not touch more than one package.
- Changes should be backwards compatible.
- If you are adding something to community, do not re-import it in
langchain.

If no one reviews your PR within a few days, please @-mention one of
baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17.
2024-09-18 21:00:06 -07:00
Erick Friis
e0c36afc3e docs: v0.3 link redirect (#26632) 2024-09-18 14:28:56 -07:00
Erick Friis
9909354cd0 core: use ruff.target-version instead (#26634)
tested on one of the replacement cases and seems to work! 
![ScreenShot 2024-09-18 at 02 02
43PM](https://github.com/user-attachments/assets/7170975a-2542-43ed-a203-d4126c6a2c81)
2024-09-18 21:06:14 +00:00
Erick Friis
84b831356c core: remove [project] tag from pyproject (#26633)
makes core incompatible with uv installs
2024-09-18 20:39:49 +00:00
Christophe Bornet
a47b332841 core: Put Python version as a project requirement so it is considered by ruff (#26608)
Ruff doesn't know about the python version in
`[tool.poetry.dependencies]`. It can get it from
`project.requires-python`.

Notes:
* poetry seems to have issues getting the python constraints from
`requires-python` and using `python` in per dependency constraints. So I
had to duplicate the info. I will open an issue on poetry.
* `inspect.isclass()` doesn't work correctly with `GenericAlias`
(`list[...]`, `dict[..., ...]`) on Python <3.11 so I added some `not
isinstance(type, GenericAlias)` checks:

Python 3.11
```pycon
>>> import inspect
>>> inspect.isclass(list)
True
>>> inspect.isclass(list[str])
False
```

Python 3.9
```pycon
>>> import inspect
>>> inspect.isclass(list)
True
>>> inspect.isclass(list[str])
True
```

Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
2024-09-18 14:37:57 +00:00
Patrick McGleenon
0f07cf61da docs: fixed typo in XML document loader (#26613)
Fixed typo `Unstrucutred`
2024-09-18 14:26:57 +00:00
Erick Friis
d158401e73 infra: master release checkout ref for release note (#26605) 2024-09-18 01:51:54 +00:00
Bagatur
de58942618 docs: consolidate dropdowns (#26600) 2024-09-18 01:24:10 +00:00
Bagatur
df38d5250f docs: cleanup nav (#26546) 2024-09-17 17:49:46 -07:00
sanjay920
b246052184 docs: fix typo in clickhouse vectorstore doc (#26598)
- **Description:** typo in clickhouse vectorstore doc
- **Issue:** #26597
- **Dependencies:** none
- **Twitter handle:** sanjay920

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-17 23:33:22 +00:00
Miguel Grinberg
52729ac0be docs: update hybrid search example with Elasticsearch retriever (#26328)
- **Description:** the example to perform hybrid search with the
Elasticsearch retriever is out of date
- **Issue:** N/A
- **Dependencies:** N/A

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-17 23:15:27 +00:00
Marco Rossi IT
f62d454f36 docs: fix typo on amazon_textract.ipynb (#26493)
- **Description:** fixed a typo on amazon textract page

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-17 22:27:45 +00:00
gbaian10
6fe2536c5a docs: fix the ImportError in google_speech_to_text.ipynb (#26522)
fix #26370

- #26370 

`GoogleSpeechToTextLoader` is a deprecated method in
`langchain_community.document_loaders.google_speech_to_text`.

The new recommended usage is to use `SpeechToTextLoader` from
`langchain_google_community`.

When importing from `langchain_google_community`, use the name
`SpeechToTextLoader` instead of the old `GoogleSpeechToTextLoader`.


![image](https://github.com/user-attachments/assets/3a8bd309-9858-4938-b7db-872f51b9542e)

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-17 22:18:57 +00:00
Zhanwei Zhang
418b170f94 docs: Fix typo in conda environment code block in rag.ipynb (#26487)
Thank you for contributing to LangChain!

- [x] **PR title**: Fix typo in conda environment code block in
rag.ipynb
  - In docs/tutorials/rag.ipynb

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-17 22:13:55 +00:00
ZhangShenao
c3b3f46cb8 Improvement[Community] Improve api doc of BeautifulSoupTransformer (#26423)
- Add missing args

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-17 22:00:07 +00:00
ogawa
e2245fac82 community[patch]: o1-preview and o1-mini costs (#26411)
updated OpenAI cost definitions according to the following:
https://openai.com/api/pricing/

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-17 21:59:46 +00:00
ZhangShenao
1a8e9023de Improvement[Community] Improve streamlit_callback_handler (#26373)
- add decorator for static methods

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-17 21:54:37 +00:00
Bagatur
1a62f9850f anthropic[patch]: Release 0.2.1 (#26592) 2024-09-17 14:44:21 -07:00
Harutaka Kawamura
6ed50e78c9 community: Rename deployments server to AI gateway (#26368)
We recently renamed `MLflow Deployments Server` to `MLflow AI Gateway`
in mlflow. This PR updates the relevant notebooks to use `MLflow AI
gateway`

---

Thank you for contributing to LangChain!

- [x] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core,
experimental, etc. is being modified. Use "docs: ..." for purely docs
changes, "templates: ..." for template changes, "infra: ..." for CI
changes.
  - Example: "community: add foobar LLM"


- [x] **PR message**: ***Delete this entire checklist*** and replace
with
    - **Description:** a description of the change
    - **Issue:** the issue # it fixes, if applicable
    - **Dependencies:** any dependencies required for this change
- **Twitter handle:** if your PR gets announced, and you'd like a
mention, we'll gladly shout you out!


- [x] **Add tests and docs**: If you're adding a new integration, please
include
1. a test for the integration, preferably unit tests that do not rely on
network access,
2. an example notebook showing its use. It lives in
`docs/docs/integrations` directory.


- [x] **Lint and test**: Run `make format`, `make lint` and `make test`
from the root of the package(s) you've modified. See contribution
guidelines for more: https://python.langchain.com/docs/contributing/

Additional guidelines:
- Make sure optional dependencies are imported within a function.
- Please do not add dependencies to pyproject.toml files (even optional
ones) unless they are required for unit tests.
- Most PRs should not touch more than one package.
- Changes should be backwards compatible.
- If you are adding something to community, do not re-import it in
langchain.

If no one reviews your PR within a few days, please @-mention one of
baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17.

---------

Signed-off-by: harupy <17039389+harupy@users.noreply.github.com>
Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-17 21:36:04 +00:00
Bagatur
5ced41bf50 anthropic[patch]: fix tool call and tool res image_url handling (#26587)
Co-authored-by: ccurme <chester.curme@gmail.com>
2024-09-17 14:30:07 -07:00
Christophe Bornet
c6bdd6f482 community: Fix references in link extractors docstrings (#26314)
Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-17 21:26:25 +00:00
Christophe Bornet
3a99467ccb core[patch]: Add ruff rule UP006(use PEP585 annotations) (#26574)
* Added rules `UPD006` now that Pydantic is v2+

---------

Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
2024-09-17 21:22:50 +00:00
wlleiiwang
2ef4c9466f community: modify document links for tencent vectordb (#26316)
- modify document links for create a tencent vectordb database instance.

Co-authored-by: wlleiiwang <wlleiiwang@tencent.com>
Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-17 21:11:10 +00:00
Erick Friis
194adc485c docs: pypi readme image links (#26590) 2024-09-17 20:41:34 +00:00
Bagatur
97b05d70e6 docs: anthropic api ref nit (#26591) 2024-09-17 20:39:53 +00:00
Bagatur
e1d113ea84 core,openai,grow,fw[patch]: deprecate bind_functions, update chat mod… (#26584)
…el api ref
2024-09-17 11:32:39 -07:00
ccurme
7c05f71e0f milvus[patch]: fix vectorstore integration tests (#26583)
Resolves https://github.com/langchain-ai/langchain/issues/26564
2024-09-17 14:17:05 -04:00
Bagatur
145a49cca2 core[patch]: Release 0.3.1 (#26581) 2024-09-17 17:34:09 +00:00
Nuno Campos
5fc44989bf core[patch]: Fix "argument of type 'NoneType' is not iterable" error in LangChainTracer (#26576)
Thank you for contributing to LangChain!

- [ ] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core,
experimental, etc. is being modified. Use "docs: ..." for purely docs
changes, "templates: ..." for template changes, "infra: ..." for CI
changes.
  - Example: "community: add foobar LLM"


- [ ] **PR message**: ***Delete this entire checklist*** and replace
with
    - **Description:** a description of the change
    - **Issue:** the issue # it fixes, if applicable
    - **Dependencies:** any dependencies required for this change
- **Twitter handle:** if your PR gets announced, and you'd like a
mention, we'll gladly shout you out!


- [ ] **Add tests and docs**: If you're adding a new integration, please
include
1. a test for the integration, preferably unit tests that do not rely on
network access,
2. an example notebook showing its use. It lives in
`docs/docs/integrations` directory.


- [ ] **Lint and test**: Run `make format`, `make lint` and `make test`
from the root of the package(s) you've modified. See contribution
guidelines for more: https://python.langchain.com/docs/contributing/

Additional guidelines:
- Make sure optional dependencies are imported within a function.
- Please do not add dependencies to pyproject.toml files (even optional
ones) unless they are required for unit tests.
- Most PRs should not touch more than one package.
- Changes should be backwards compatible.
- If you are adding something to community, do not re-import it in
langchain.

If no one reviews your PR within a few days, please @-mention one of
baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17.

---------

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-17 10:29:46 -07:00
Erick Friis
f4a65236ee infra: only force reinstall on release (#26580) 2024-09-17 17:12:17 +00:00
Isaac Francisco
06cde06a20 core[minor]: remove beta from RemoveMessage (#26579) 2024-09-17 17:09:58 +00:00
Erick Friis
3e51fdc840 infra: more skip if pull request libs (#26578) 2024-09-17 09:48:02 -07:00
RUO
0a177ec2cc community: Enhance MongoDBLoader with flexible metadata and optimized field extraction (#23376)
### Description:
This pull request significantly enhances the MongodbLoader class in the
LangChain community package by adding robust metadata customization and
improved field extraction capabilities. The updated class now allows
users to specify additional metadata fields through the metadata_names
parameter, enabling the extraction of both top-level and deeply nested
document attributes as metadata. This flexibility is crucial for users
who need to include detailed contextual information without altering the
database schema.

Moreover, the include_db_collection_in_metadata flag offers optional
inclusion of database and collection names in the metadata, allowing for
even greater customization depending on the user's needs.

The loader's field extraction logic has been refined to handle missing
or nested fields more gracefully. It now employs a safe access mechanism
that avoids the KeyError previously encountered when a specified nested
field was absent in a document. This update ensures that the loader can
handle diverse and complex data structures without failure, making it
more resilient and user-friendly.

### Issue:
This pull request addresses a critical issue where the MongodbLoader
class in the LangChain community package could throw a KeyError when
attempting to access nested fields that may not exist in some documents.
The previous implementation did not handle the absence of specified
nested fields gracefully, leading to runtime errors and interruptions in
data processing workflows.

This enhancement ensures robust error handling by safely accessing
nested document fields, using default values for missing data, thus
preventing KeyError and ensuring smoother operation across various data
structures in MongoDB. This improvement is crucial for users working
with diverse and complex data sets, ensuring the loader can adapt to
documents with varying structures without failing.

### Dependencies: 
Requires motor for asynchronous MongoDB interaction.

### Twitter handle: 
N/A

### Add tests and docs
Tests: Unit tests have been added to verify that the metadata inclusion
toggle works as expected and that the field extraction correctly handles
nested fields.
Docs: An example notebook demonstrating the use of the enhanced
MongodbLoader is included in the docs/docs/integrations directory. This
notebook includes setup instructions, example usage, and outputs.
(Here is the notebook link : [colab
link](https://colab.research.google.com/drive/1tp7nyUnzZa3dxEFF4Kc3KS7ACuNF6jzH?usp=sharing))
Lint and test
Before submitting, I ran make format, make lint, and make test as per
the contribution guidelines. All tests pass, and the code style adheres
to the LangChain standards.

```python
import unittest
from unittest.mock import patch, MagicMock
import asyncio
from langchain_community.document_loaders.mongodb import MongodbLoader

class TestMongodbLoader(unittest.TestCase):
    def setUp(self):
        """Setup the MongodbLoader test environment by mocking the motor client 
        and database collection interactions."""
        # Mocking the AsyncIOMotorClient
        self.mock_client = MagicMock()
        self.mock_db = MagicMock()
        self.mock_collection = MagicMock()

        self.mock_client.get_database.return_value = self.mock_db
        self.mock_db.get_collection.return_value = self.mock_collection

        # Initialize the MongodbLoader with test data
        self.loader = MongodbLoader(
            connection_string="mongodb://localhost:27017",
            db_name="testdb",
            collection_name="testcol"
        )

    @patch('langchain_community.document_loaders.mongodb.AsyncIOMotorClient', return_value=MagicMock())
    def test_constructor(self, mock_motor_client):
        """Test if the constructor properly initializes with the correct database and collection names."""
        loader = MongodbLoader(
            connection_string="mongodb://localhost:27017",
            db_name="testdb",
            collection_name="testcol"
        )
        self.assertEqual(loader.db_name, "testdb")
        self.assertEqual(loader.collection_name, "testcol")

    def test_aload(self):
        """Test the aload method to ensure it correctly queries and processes documents."""
        # Setup mock data and responses for the database operations
        self.mock_collection.count_documents.return_value = asyncio.Future()
        self.mock_collection.count_documents.return_value.set_result(1)
        self.mock_collection.find.return_value = [
            {"_id": "1", "content": "Test document content"}
        ]

        # Run the aload method and check responses
        loop = asyncio.get_event_loop()
        results = loop.run_until_complete(self.loader.aload())
        self.assertEqual(len(results), 1)
        self.assertEqual(results[0].page_content, "Test document content")

    def test_construct_projection(self):
        """Verify that the projection dictionary is constructed correctly based on field names."""
        self.loader.field_names = ['content', 'author']
        self.loader.metadata_names = ['timestamp']
        expected_projection = {'content': 1, 'author': 1, 'timestamp': 1}
        projection = self.loader._construct_projection()
        self.assertEqual(projection, expected_projection)

if __name__ == '__main__':
    unittest.main()
```


### Additional Example for Documentation
Sample Data:

```json
[
    {
        "_id": "1",
        "title": "Artificial Intelligence in Medicine",
        "content": "AI is transforming the medical industry by providing personalized medicine solutions.",
        "author": {
            "name": "John Doe",
            "email": "john.doe@example.com"
        },
        "tags": ["AI", "Healthcare", "Innovation"]
    },
    {
        "_id": "2",
        "title": "Data Science in Sports",
        "content": "Data science provides insights into player performance and strategic planning in sports.",
        "author": {
            "name": "Jane Smith",
            "email": "jane.smith@example.com"
        },
        "tags": ["Data Science", "Sports", "Analytics"]
    }
]
```
Example Code:

```python
loader = MongodbLoader(
    connection_string="mongodb://localhost:27017",
    db_name="example_db",
    collection_name="articles",
    filter_criteria={"tags": "AI"},
    field_names=["title", "content"],
    metadata_names=["author.name", "author.email"],
    include_db_collection_in_metadata=True
)

documents = loader.load()

for doc in documents:
    print("Page Content:", doc.page_content)
    print("Metadata:", doc.metadata)
```
Expected Output:

```
Page Content: Artificial Intelligence in Medicine AI is transforming the medical industry by providing personalized medicine solutions.
Metadata: {'author_name': 'John Doe', 'author_email': 'john.doe@example.com', 'database': 'example_db', 'collection': 'articles'}
```

Thank you.

---

Additional guidelines:
- Make sure optional dependencies are imported within a function.
- Please do not add dependencies to pyproject.toml files (even optional
ones) unless they are required for unit tests.
- Most PRs should not touch more than one package.
- Changes should be backwards compatible.
- If you are adding something to community, do not re-import it in
langchain.

If no one reviews your PR within a few days, please @-mention one of
baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17.

---------

Co-authored-by: ccurme <chester.curme@gmail.com>
2024-09-17 10:23:17 -04:00
ccurme
6758894af1 docs: update v0.3 integrations table (#26571) 2024-09-17 09:56:04 -04:00
venkatram-dev
6ba3c715b7 doc_fix_chroma_integration (#26565)
Thank you for contributing to LangChain!

- [x] **PR title**: "package: description"
docs:integrations:vectorstores:chroma:fix_typo


- [x] **PR message**: ***Delete this entire checklist*** and replace
with


- **Description:** fix_typo in docs:integrations:vectorstores:chroma
https://python.langchain.com/docs/integrations/vectorstores/chroma/
    - **Issue:** https://github.com/langchain-ai/langchain/issues/26561

- [ ] **Add tests and docs**: If you're adding a new integration, please
include
1. a test for the integration, preferably unit tests that do not rely on
network access,
2. an example notebook showing its use. It lives in
`docs/docs/integrations` directory.


- [ ] **Lint and test**: Run `make format`, `make lint` and `make test`
from the root of the package(s) you've modified. See contribution
guidelines for more: https://python.langchain.com/docs/contributing/

Additional guidelines:
- Make sure optional dependencies are imported within a function.
- Please do not add dependencies to pyproject.toml files (even optional
ones) unless they are required for unit tests.
- Most PRs should not touch more than one package.
- Changes should be backwards compatible.
- If you are adding something to community, do not re-import it in
langchain.

If no one reviews your PR within a few days, please @-mention one of
baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17.
2024-09-17 08:17:54 -04:00
Bagatur
d8952b8e8c langchain[patch]: infer mistral provider in init_chat_model (#26557) 2024-09-17 00:35:54 +00:00
Bagatur
31f61d4d7d docs: v0.3 nits (#26556) 2024-09-17 00:14:47 +00:00
Bagatur
99abd254fb docs: clean up init_chat_model (#26551) 2024-09-16 22:08:22 +00:00
Tomaz Bratanic
3bcd641bc1 Add check for prompt based approach in llm graph transformer (#26519) 2024-09-16 15:01:09 -07:00
Bagatur
0bd98c99b3 docs: add sema4 to release table (#26549) 2024-09-16 14:59:13 -07:00
Eugene Yurtsev
8a2f2fc30b docs: what langchain-cli migrate can do (#26547) 2024-09-16 20:10:40 +00:00
SQpgducray
724a53711b docs: Fix missing self argument in _get_docs_with_query method of `Cust… (#26312)
…omSelfQueryRetriever`

This commit corrects an issue in the `_get_docs_with_query` method of
the `CustomSelfQueryRetriever` class. The method was incorrectly using
`self.vectorstore.similarity_search_with_score(query, **search_kwargs)`
without including the `self` argument, which is required for proper
method invocation.

The `self` argument is necessary for calling instance methods and
accessing instance attributes. By including `self` in the method call,
we ensure that the method is correctly executed in the context of the
current instance, allowing it to function as intended.

No other changes were made to the method's logic or functionality.

Thank you for contributing to LangChain!

- [ ] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core,
experimental, etc. is being modified. Use "docs: ..." for purely docs
changes, "templates: ..." for template changes, "infra: ..." for CI
changes.
  - Example: "community: add foobar LLM"


- [ ] **PR message**: ***Delete this entire checklist*** and replace
with
    - **Description:** a description of the change
    - **Issue:** the issue # it fixes, if applicable
    - **Dependencies:** any dependencies required for this change
- **Twitter handle:** if your PR gets announced, and you'd like a
mention, we'll gladly shout you out!


- [ ] **Add tests and docs**: If you're adding a new integration, please
include
1. a test for the integration, preferably unit tests that do not rely on
network access,
2. an example notebook showing its use. It lives in
`docs/docs/integrations` directory.


- [ ] **Lint and test**: Run `make format`, `make lint` and `make test`
from the root of the package(s) you've modified. See contribution
guidelines for more: https://python.langchain.com/docs/contributing/

Additional guidelines:
- Make sure optional dependencies are imported within a function.
- Please do not add dependencies to pyproject.toml files (even optional
ones) unless they are required for unit tests.
- Most PRs should not touch more than one package.
- Changes should be backwards compatible.
- If you are adding something to community, do not re-import it in
langchain.

If no one reviews your PR within a few days, please @-mention one of
baskaryan, efriis, eyurtsev, ccurme, vbarda, hwchase17.

Co-authored-by: Erick Friis <erick@langchain.dev>
2024-09-16 20:02:30 +00:00
Eugene Yurtsev
c6a78132d6 docs: show how to use langchain-cli for migration (#26535)
Update v0.3 instructions a bit

---------

Co-authored-by: Bagatur <22008038+baskaryan@users.noreply.github.com>
2024-09-16 15:53:05 -04:00
Bagatur
a319a0ff1d docs: add redirects for tools and lcel (#26541) 2024-09-16 18:06:15 +00:00
Eugene Yurtsev
63c3cc1f1f ci: updates issue and discussion templates (#26542)
Update issue and discussion templates
2024-09-16 17:43:04 +00:00
ccurme
0154c586d3 docs: update integrations table in 0.3 guide (#26536) 2024-09-16 17:41:56 +00:00
Eugene Yurtsev
c2588b334f unstructured: release 0.1.4 (#26540)
Release to work with langchain 0.3
2024-09-16 17:38:38 +00:00
Eugene Yurtsev
8b985a42e9 milvus: 0.1.6 release (#26538)
Release to work with langchain 0.3
2024-09-16 13:33:09 -04:00
Eugene Yurtsev
5b4206acd8 box: 0.2.0 release (#26539)
Release to work with langchain 0.3
2024-09-16 13:32:59 -04:00
ccurme
0592c29e9b qdrant[patch]: release 0.1.4 (#26534)
`langchain-qdrant` imports pydantic but was importing pydantic proper
before 0.3 release:
042e84170b/libs/partners/qdrant/langchain_qdrant/sparse_embeddings.py (L5-L8)
2024-09-16 13:04:12 -04:00
Eugene Yurtsev
88891477eb langchain-cli: release 0.0.31 (#26533)
langchain-cli 0.0.31 release
2024-09-16 12:57:24 -04:00
ccurme
88bc15d69b standard-tests[patch]: add async test for structured output (#26527) 2024-09-16 11:15:23 -04:00
Erick Friis
1ab181f514 voyageai: release 0.1.2 (#26512) 2024-09-16 03:11:15 +00:00
Erick Friis
ee4e11379f nomic: release 0.1.3, core 0.3 compat but not required (#26511) 2024-09-15 20:10:25 -07:00
Yoshitaka Fujii
bd42344b0a docs: Update concepts.mdx (#26496)
- Fix comments in Python
- Fix repeated sentences
2024-09-16 01:46:15 +00:00
Erick Friis
9f5960a0aa docs: new algolia index (#26508) 2024-09-15 18:33:42 -07:00
Erick Friis
135afdf4fb docs: most 0.1 redirects too (#26494)
takes redirects from 0.1 docs and factors them into suggested redirects
in 0.3 docs
2024-09-15 18:29:58 +00:00
Erick Friis
4131be63af multiple: 0.3.0 not dev version (#26502) 2024-09-15 18:26:50 +00:00
Bhadresh Savani
f66b7ba32d Update google_search.ipynb (#26420)
Added changes for pip installation
2024-09-14 15:08:40 -07:00
jessicaou
9c6aa3f0b7 broken LangGraph docs link (#26438)
Update broken langgraph link in the README.md file

Co-authored-by: Jess Ou <jessou@jesss-mbp.local.meter>
2024-09-14 15:07:51 -07:00
Nicolas
2240ca2979 docs: Fix Firecrawl v0 version (#26452)
Firecrawl integration is currently on v0 - which is supported until
version 0.0.20.

@rafaelsideguide is working on a pr for v1 but meanwhile we should fix
the docs.
2024-09-14 15:06:15 -07:00
Eugene Yurtsev
77ccb4b1cf cli[patch]: Update the migration script message (#26490)
Update the migration script message
2024-09-14 14:40:35 -04:00
995 changed files with 40127 additions and 64590 deletions

View File

@@ -96,25 +96,21 @@ body:
attributes:
label: System Info
description: |
Please share your system info with us.
Please share your system info with us. Do NOT skip this step and please don't trim
the output. Most users don't include enough information here and it makes it harder
for us to help you.
"pip freeze | grep langchain"
platform (windows / linux / mac)
python version
OR if you're on a recent version of langchain-core you can paste the output of:
Run the following command in your terminal and paste the output here:
python -m langchain_core.sys_info
or if you have an existing python interpreter running:
from langchain_core import sys_info
sys_info.print_sys_info()
alternatively, put the entire output of `pip freeze` here.
placeholder: |
"pip freeze | grep langchain"
platform
python version
Alternatively, if you're on a recent version of langchain-core you can paste the output of:
python -m langchain_core.sys_info
These will only surface LangChain packages, don't forget to include any other relevant
packages you're using (if you're not sure what's relevant, you can paste the entire output of `pip freeze`).
validations:
required: true

View File

@@ -1,7 +1,7 @@
Thank you for contributing to LangChain!
- [ ] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core, experimental, etc. is being modified. Use "docs: ..." for purely docs changes, "templates: ..." for template changes, "infra: ..." for CI changes.
- Where "package" is whichever of langchain, community, core, etc. is being modified. Use "docs: ..." for purely docs changes, "templates: ..." for template changes, "infra: ..." for CI changes.
- Example: "community: add foobar LLM"

View File

@@ -15,7 +15,6 @@ LANGCHAIN_DIRS = [
"libs/text-splitters",
"libs/langchain",
"libs/community",
"libs/experimental",
]
# when set to True, we are ignoring core dependents
@@ -153,14 +152,19 @@ def _get_pydantic_test_configs(
core_min_pydantic_version = get_min_version_from_toml(
"./libs/core/pyproject.toml", "release", python_version, include=["pydantic"]
)["pydantic"]
core_min_pydantic_minor = core_min_pydantic_version.split(".")[1] if "." in core_min_pydantic_version else "0"
dir_min_pydantic_version = (
get_min_version_from_toml(
f"./{dir_}/pyproject.toml", "release", python_version, include=["pydantic"]
)
.get("pydantic", "0.0.0")
core_min_pydantic_minor = (
core_min_pydantic_version.split(".")[1]
if "." in core_min_pydantic_version
else "0"
)
dir_min_pydantic_version = get_min_version_from_toml(
f"./{dir_}/pyproject.toml", "release", python_version, include=["pydantic"]
).get("pydantic", "0.0.0")
dir_min_pydantic_minor = (
dir_min_pydantic_version.split(".")[1]
if "." in dir_min_pydantic_version
else "0"
)
dir_min_pydantic_minor = dir_min_pydantic_version.split(".")[1] if "." in dir_min_pydantic_version else "0"
custom_mins = {
# depends on pydantic-settings 2.4 which requires pydantic 2.7

View File

@@ -21,7 +21,14 @@ MIN_VERSION_LIBS = [
"SQLAlchemy",
]
SKIP_IF_PULL_REQUEST = ["langchain-core"]
# some libs only get checked on release because of simultaneous changes in
# multiple libs
SKIP_IF_PULL_REQUEST = [
"langchain-core",
"langchain-text-splitters",
"langchain",
"langchain-community",
]
def get_min_version(version: str) -> str:
@@ -70,7 +77,7 @@ def get_min_version_from_toml(
for lib in set(MIN_VERSION_LIBS + (include or [])):
if versions_for == "pull_request" and lib in SKIP_IF_PULL_REQUEST:
# some libs only get checked on release because of simultaneous
# changes
# changes in multiple libs
continue
# Check if the lib is present in the dependencies
if lib in dependencies:
@@ -88,7 +95,6 @@ def get_min_version_from_toml(
if check_python_version(python_version, vs["python"])
][0]["version"]
# Use parse_version to get the minimum supported version from version_string
min_version = get_min_version(version_string)

View File

@@ -58,6 +58,7 @@ jobs:
AZURE_OPENAI_API_BASE: ${{ secrets.AZURE_OPENAI_API_BASE }}
AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }}
AZURE_OPENAI_CHAT_DEPLOYMENT_NAME: ${{ secrets.AZURE_OPENAI_CHAT_DEPLOYMENT_NAME }}
AZURE_OPENAI_LEGACY_CHAT_DEPLOYMENT_NAME: ${{ secrets.AZURE_OPENAI_LEGACY_CHAT_DEPLOYMENT_NAME }}
AZURE_OPENAI_LLM_DEPLOYMENT_NAME: ${{ secrets.AZURE_OPENAI_LLM_DEPLOYMENT_NAME }}
AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME: ${{ secrets.AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME }}
MISTRAL_API_KEY: ${{ secrets.MISTRAL_API_KEY }}

View File

@@ -85,7 +85,7 @@ jobs:
path: langchain
sparse-checkout: | # this only grabs files for relevant dir
${{ inputs.working-directory }}
ref: master # this scopes to just master branch
ref: ${{ github.ref }} # this scopes to just ref'd branch
fetch-depth: 0 # this fetches entire commit history
- name: Check Tags
id: check-tags
@@ -269,6 +269,7 @@ jobs:
AZURE_OPENAI_API_BASE: ${{ secrets.AZURE_OPENAI_API_BASE }}
AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }}
AZURE_OPENAI_CHAT_DEPLOYMENT_NAME: ${{ secrets.AZURE_OPENAI_CHAT_DEPLOYMENT_NAME }}
AZURE_OPENAI_LEGACY_CHAT_DEPLOYMENT_NAME: ${{ secrets.AZURE_OPENAI_LEGACY_CHAT_DEPLOYMENT_NAME }}
AZURE_OPENAI_LLM_DEPLOYMENT_NAME: ${{ secrets.AZURE_OPENAI_LLM_DEPLOYMENT_NAME }}
AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME: ${{ secrets.AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME }}
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
@@ -293,7 +294,6 @@ jobs:
VOYAGE_API_KEY: ${{ secrets.VOYAGE_API_KEY }}
UPSTAGE_API_KEY: ${{ secrets.UPSTAGE_API_KEY }}
FIREWORKS_API_KEY: ${{ secrets.FIREWORKS_API_KEY }}
UNSTRUCTURED_API_KEY: ${{ secrets.UNSTRUCTURED_API_KEY }}
run: make integration_tests
working-directory: ${{ inputs.working-directory }}

View File

@@ -58,7 +58,7 @@ jobs:
env:
MIN_VERSIONS: ${{ steps.min-version.outputs.min-versions }}
run: |
poetry run pip install --force-reinstall $MIN_VERSIONS --editable .
poetry run pip install $MIN_VERSIONS
make tests
working-directory: ${{ inputs.working-directory }}

View File

@@ -31,7 +31,7 @@ jobs:
- name: Install langchain editable
run: |
poetry run pip install -e libs/core libs/langchain libs/community libs/experimental
poetry run pip install langchain-experimental -e libs/core libs/langchain libs/community
- name: Check doc imports
shell: bash

153
.github/workflows/api_doc_build.yml vendored Normal file
View File

@@ -0,0 +1,153 @@
name: API docs build
on:
workflow_dispatch:
schedule:
- cron: '0 13 * * *'
env:
POETRY_VERSION: "1.8.1"
PYTHON_VERSION: "3.11"
jobs:
build:
runs-on: ubuntu-latest
permissions: write-all
steps:
- uses: actions/checkout@v4
with:
path: langchain
- uses: actions/checkout@v4
with:
repository: langchain-ai/langchain-api-docs-html
path: langchain-api-docs-html
token: ${{ secrets.TOKEN_GITHUB_API_DOCS_HTML }}
- uses: actions/checkout@v4
with:
repository: langchain-ai/langchain-google
path: langchain-google
- uses: actions/checkout@v4
with:
repository: langchain-ai/langchain-datastax
path: langchain-datastax
- uses: actions/checkout@v4
with:
repository: langchain-ai/langchain-nvidia
path: langchain-nvidia
- uses: actions/checkout@v4
with:
repository: langchain-ai/langchain-cohere
path: langchain-cohere
- uses: actions/checkout@v4
with:
repository: langchain-ai/langchain-elastic
path: langchain-elastic
- uses: actions/checkout@v4
with:
repository: langchain-ai/langchain-postgres
path: langchain-postgres
- uses: actions/checkout@v4
with:
repository: langchain-ai/langchain-aws
path: langchain-aws
- uses: actions/checkout@v4
with:
repository: langchain-ai/langchain-weaviate
path: langchain-weaviate
- uses: actions/checkout@v4
with:
repository: langchain-ai/langchain-ai21
path: langchain-ai21
- uses: actions/checkout@v4
with:
repository: langchain-ai/langchain-together
path: langchain-together
- uses: actions/checkout@v4
with:
repository: langchain-ai/langchain-experimental
path: langchain-experimental
- uses: actions/checkout@v4
with:
repository: langchain-ai/langchain-milvus
path: langchain-milvus
- uses: actions/checkout@v4
with:
repository: langchain-ai/langchain-unstructured
path: langchain-unstructured
- name: Set Git config
working-directory: langchain
run: |
git config --local user.email "actions@github.com"
git config --local user.name "Github Actions"
- name: Move libs
run: |
rm -rf \
langchain/libs/partners/google-genai \
langchain/libs/partners/google-vertexai \
langchain/libs/partners/astradb \
langchain/libs/partners/nvidia-trt \
langchain/libs/partners/nvidia-ai-endpoints \
langchain/libs/partners/cohere \
langchain/libs/partners/elasticsearch \
langchain/libs/partners/upstage \
langchain/libs/partners/ai21 \
langchain/libs/partners/together \
langchain/libs/standard-tests \
langchain/libs/experimental \
langchain/libs/partners/milvus \
langchain/libs/partners/unstructured
mv langchain-google/libs/genai langchain/libs/partners/google-genai
mv langchain-google/libs/vertexai langchain/libs/partners/google-vertexai
mv langchain-google/libs/community langchain/libs/partners/google-community
mv langchain-datastax/libs/astradb langchain/libs/partners/astradb
mv langchain-nvidia/libs/ai-endpoints langchain/libs/partners/nvidia-ai-endpoints
mv langchain-cohere/libs/cohere langchain/libs/partners/cohere
mv langchain-elastic/libs/elasticsearch langchain/libs/partners/elasticsearch
mv langchain-postgres langchain/libs/partners/postgres
mv langchain-aws/libs/aws langchain/libs/partners/aws
mv langchain-weaviate/libs/weaviate langchain/libs/partners/weaviate
mv langchain-ai21/libs/ai21 langchain/libs/partners/ai21
mv langchain-together/libs/together langchain/libs/partners/together
mv langchain-experimental/libs/experimental langchain/libs/experimental
mv langchain-milvus/libs/milvus langchain/libs/partners/milvus
mv langchain-unstructured/libs/unstructured langchain/libs/partners/unstructured
- name: Rm old html
run:
rm -rf langchain-api-docs-html/api_reference_build/html
- name: Set up Python ${{ env.PYTHON_VERSION }} + Poetry ${{ env.POETRY_VERSION }}
uses: "./langchain/.github/actions/poetry_setup"
with:
python-version: ${{ env.PYTHON_VERSION }}
poetry-version: ${{ env.POETRY_VERSION }}
cache-key: api-docs
working-directory: langchain
- name: Install dependencies
working-directory: langchain
run: |
python -m pip install -U uv
python -m uv pip install --upgrade --no-cache-dir pip setuptools
# skip airbyte and ibm due to pandas dependency issue
python -m uv pip install $(ls ./libs/partners | grep -vE "airbyte|ibm" | xargs -I {} echo "./libs/partners/{}")
python -m uv pip install libs/core libs/langchain libs/text-splitters libs/community libs/experimental
python -m uv pip install -r docs/api_reference/requirements.txt
- name: Build docs
working-directory: langchain
run: |
python docs/api_reference/create_api_rst.py
python -m sphinx -T -E -b html -d ../langchain-api-docs-html/_build/doctrees -c docs/api_reference docs/api_reference ../langchain-api-docs-html/api_reference_build/html -j auto
python docs/api_reference/scripts/custom_formatter.py ../langchain-api-docs-html/api_reference_build/html
# Default index page is blank so we copy in the actual home page.
cp ../langchain-api-docs-html/api_reference_build/html/{reference,index}.html
rm -rf ../langchain-api-docs-html/_build/
# https://github.com/marketplace/actions/add-commit
- uses: EndBug/add-and-commit@v9
with:
cwd: langchain-api-docs-html
message: 'Update API docs build'

63
.github/workflows/run_notebooks.yml vendored Normal file
View File

@@ -0,0 +1,63 @@
name: Run notebooks
on:
workflow_dispatch:
inputs:
python_version:
description: 'Python version'
required: false
default: '3.11'
working-directory:
description: 'Working directory or subset (e.g., docs/docs/tutorials/llm_chain.ipynb)'
required: false
default: 'all'
schedule:
- cron: '0 13 * * *'
env:
POETRY_VERSION: "1.7.1"
jobs:
build:
runs-on: ubuntu-latest
name: "Test docs"
steps:
- uses: actions/checkout@v4
- name: Set up Python + Poetry ${{ env.POETRY_VERSION }}
uses: "./.github/actions/poetry_setup"
with:
python-version: ${{ github.event.inputs.python_version || '3.11' }}
poetry-version: ${{ env.POETRY_VERSION }}
working-directory: ${{ inputs.working-directory }}
cache-key: run-notebooks
- name: Install dependencies
run: |
pip install -e libs/core
pip install -e libs/langchain
pip install -e libs/community
pip install --upgrade langchain-experimental
pip install -e libs//partners/anthropic
pip install -e libs//partners/chroma
pip install -e libs//partners/openai
pip install -e libs//partners/mistralai
pip install jupyter langgraph click pypdf vcrpy
- name: Pre-download tiktoken files
run: |
python docs/scripts/download_tiktoken.py
- name: Prepare notebooks
run: |
python docs/scripts/prepare_notebooks_for_ci.py --comment-install-cells
- name: Run notebooks
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
MISTRAL_API_KEY: ${{ secrets.MISTRAL_API_KEY }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}
run: |
./docs/scripts/execute_notebooks.sh ${{ github.event.inputs.working-directory || 'all' }}

View File

@@ -86,6 +86,7 @@ jobs:
AZURE_OPENAI_API_BASE: ${{ secrets.AZURE_OPENAI_API_BASE }}
AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }}
AZURE_OPENAI_CHAT_DEPLOYMENT_NAME: ${{ secrets.AZURE_OPENAI_CHAT_DEPLOYMENT_NAME }}
AZURE_OPENAI_LEGACY_CHAT_DEPLOYMENT_NAME: ${{ secrets.AZURE_OPENAI_LEGACY_CHAT_DEPLOYMENT_NAME }}
AZURE_OPENAI_LLM_DEPLOYMENT_NAME: ${{ secrets.AZURE_OPENAI_LLM_DEPLOYMENT_NAME }}
AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME: ${{ secrets.AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME }}
FIREWORKS_API_KEY: ${{ secrets.FIREWORKS_API_KEY }}

View File

@@ -1,70 +1,11 @@
# Migrating
## 🚨Breaking Changes for select chains (SQLDatabase) on 7/28/23
Please see the following guides for migratin LangChain code:
In an effort to make `langchain` leaner and safer, we are moving select chains to `langchain_experimental`.
This migration has already started, but we are remaining backwards compatible until 7/28.
On that date, we will remove functionality from `langchain`.
Read more about the motivation and the progress [here](https://github.com/langchain-ai/langchain/discussions/8043).
* Migrate to [LangChain v0.3](https://python.langchain.com/docs/versions/v0_3/)
* Migrate to [LangChain v0.2](https://python.langchain.com/docs/versions/v0_2/)
* Migrating from [LangChain 0.0.x Chains](https://python.langchain.com/docs/versions/migrating_chains/)
* Upgrate to [LangGraph Memory](https://python.langchain.com/docs/versions/migrating_memory/)
### Migrating to `langchain_experimental`
We are moving any experimental components of LangChain, or components with vulnerability issues, into `langchain_experimental`.
This guide covers how to migrate.
### Installation
Previously:
`pip install -U langchain`
Now (only if you want to access things in experimental):
`pip install -U langchain langchain_experimental`
### Things in `langchain.experimental`
Previously:
`from langchain.experimental import ...`
Now:
`from langchain_experimental import ...`
### PALChain
Previously:
`from langchain.chains import PALChain`
Now:
`from langchain_experimental.pal_chain import PALChain`
### SQLDatabaseChain
Previously:
`from langchain.chains import SQLDatabaseChain`
Now:
`from langchain_experimental.sql import SQLDatabaseChain`
Alternatively, if you are just interested in using the query generation part of the SQL chain, you can check out this [`SQL question-answering tutorial`](https://python.langchain.com/v0.2/docs/tutorials/sql_qa/#convert-question-to-sql-query)
`from langchain.chains import create_sql_query_chain`
### `load_prompt` for Python files
Note: this only applies if you want to load Python files as prompts.
If you want to load json/yaml files, no change is needed.
Previously:
`from langchain.prompts import load_prompt`
Now:
`from langchain_experimental.prompts import load_prompt`
The [LangChain CLI](https://python.langchain.com/docs/versions/v0_3/#migrate-using-langchain-cli) can help automatically upgrade your code to use non deprecated imports.
This will be especially helpful if you're still on either version 0.0.x or 0.1.x of LangChain.

View File

@@ -38,8 +38,8 @@ conda install langchain -c conda-forge
For these applications, LangChain simplifies the entire application lifecycle:
- **Open-source libraries**: Build your applications using LangChain's open-source [building blocks](https://python.langchain.com/v0.2/docs/concepts#langchain-expression-language-lcel), [components](https://python.langchain.com/v0.2/docs/concepts), and [third-party integrations](https://python.langchain.com/v0.2/docs/integrations/platforms/).
Use [LangGraph](/docs/concepts/#langgraph) to build stateful agents with first-class streaming and human-in-the-loop support.
- **Open-source libraries**: Build your applications using LangChain's open-source [building blocks](https://python.langchain.com/docs/concepts/#langchain-expression-language-lcel), [components](https://python.langchain.com/docs/concepts/), and [third-party integrations](https://python.langchain.com/docs/integrations/platforms/).
Use [LangGraph](https://langchain-ai.github.io/langgraph/) to build stateful agents with first-class streaming and human-in-the-loop support.
- **Productionization**: Inspect, monitor, and evaluate your apps with [LangSmith](https://docs.smith.langchain.com/) so that you can constantly optimize and deploy with confidence.
- **Deployment**: Turn your LangGraph applications into production-ready APIs and Assistants with [LangGraph Cloud](https://langchain-ai.github.io/langgraph/cloud/).
@@ -65,20 +65,20 @@ For these applications, LangChain simplifies the entire application lifecycle:
**❓ Question answering with RAG**
- [Documentation](https://python.langchain.com/v0.2/docs/tutorials/rag/)
- [Documentation](https://python.langchain.com/docs/tutorials/rag/)
- End-to-end Example: [Chat LangChain](https://chat.langchain.com) and [repo](https://github.com/langchain-ai/chat-langchain)
**🧱 Extracting structured output**
- [Documentation](https://python.langchain.com/v0.2/docs/tutorials/extraction/)
- [Documentation](https://python.langchain.com/docs/tutorials/extraction/)
- End-to-end Example: [SQL Llama2 Template](https://github.com/langchain-ai/langchain-extract/)
**🤖 Chatbots**
- [Documentation](https://python.langchain.com/v0.2/docs/tutorials/chatbot/)
- [Documentation](https://python.langchain.com/docs/tutorials/chatbot/)
- End-to-end Example: [Web LangChain (web researcher chatbot)](https://weblangchain.vercel.app) and [repo](https://github.com/langchain-ai/weblangchain)
And much more! Head to the [Tutorials](https://python.langchain.com/v0.2/docs/tutorials/) section of the docs for more.
And much more! Head to the [Tutorials](https://python.langchain.com/docs/tutorials/) section of the docs for more.
## 🚀 How does LangChain help?
@@ -93,10 +93,10 @@ Off-the-shelf chains make it easy to get started. Components make it easy to cus
LCEL is a key part of LangChain, allowing you to build and organize chains of processes in a straightforward, declarative manner. It was designed to support taking prototypes directly into production without needing to alter any code. This means you can use LCEL to set up everything from basic "prompt + LLM" setups to intricate, multi-step workflows.
- **[Overview](https://python.langchain.com/v0.2/docs/concepts/#langchain-expression-language-lcel)**: LCEL and its benefits
- **[Interface](https://python.langchain.com/v0.2/docs/concepts/#runnable-interface)**: The standard Runnable interface for LCEL objects
- **[Primitives](https://python.langchain.com/v0.2/docs/how_to/#langchain-expression-language-lcel)**: More on the primitives LCEL includes
- **[Cheatsheet](https://python.langchain.com/v0.2/docs/how_to/lcel_cheatsheet/)**: Quick overview of the most common usage patterns
- **[Overview](https://python.langchain.com/docs/concepts/#langchain-expression-language-lcel)**: LCEL and its benefits
- **[Interface](https://python.langchain.com/docs/concepts/#runnable-interface)**: The standard Runnable interface for LCEL objects
- **[Primitives](https://python.langchain.com/docs/how_to/#langchain-expression-language-lcel)**: More on the primitives LCEL includes
- **[Cheatsheet](https://python.langchain.com/docs/how_to/lcel_cheatsheet/)**: Quick overview of the most common usage patterns
## Components
@@ -104,24 +104,24 @@ Components fall into the following **modules**:
**📃 Model I/O**
This includes [prompt management](https://python.langchain.com/v0.2/docs/concepts/#prompt-templates), [prompt optimization](https://python.langchain.com/v0.2/docs/concepts/#example-selectors), a generic interface for [chat models](https://python.langchain.com/v0.2/docs/concepts/#chat-models) and [LLMs](https://python.langchain.com/v0.2/docs/concepts/#llms), and common utilities for working with [model outputs](https://python.langchain.com/v0.2/docs/concepts/#output-parsers).
This includes [prompt management](https://python.langchain.com/docs/concepts/#prompt-templates), [prompt optimization](https://python.langchain.com/docs/concepts/#example-selectors), a generic interface for [chat models](https://python.langchain.com/docs/concepts/#chat-models) and [LLMs](https://python.langchain.com/docs/concepts/#llms), and common utilities for working with [model outputs](https://python.langchain.com/docs/concepts/#output-parsers).
**📚 Retrieval**
Retrieval Augmented Generation involves [loading data](https://python.langchain.com/v0.2/docs/concepts/#document-loaders) from a variety of sources, [preparing it](https://python.langchain.com/v0.2/docs/concepts/#text-splitters), then [searching over (a.k.a. retrieving from)](https://python.langchain.com/v0.2/docs/concepts/#retrievers) it for use in the generation step.
Retrieval Augmented Generation involves [loading data](https://python.langchain.com/docs/concepts/#document-loaders) from a variety of sources, [preparing it](https://python.langchain.com/docs/concepts/#text-splitters), then [searching over (a.k.a. retrieving from)](https://python.langchain.com/docs/concepts/#retrievers) it for use in the generation step.
**🤖 Agents**
Agents allow an LLM autonomy over how a task is accomplished. Agents make decisions about which Actions to take, then take that Action, observe the result, and repeat until the task is complete. LangChain provides a [standard interface for agents](https://python.langchain.com/v0.2/docs/concepts/#agents), along with [LangGraph](https://github.com/langchain-ai/langgraph) for building custom agents.
Agents allow an LLM autonomy over how a task is accomplished. Agents make decisions about which Actions to take, then take that Action, observe the result, and repeat until the task is complete. LangChain provides a [standard interface for agents](https://python.langchain.com/docs/concepts/#agents), along with [LangGraph](https://github.com/langchain-ai/langgraph) for building custom agents.
## 📖 Documentation
Please see [here](https://python.langchain.com) for full documentation, which includes:
- [Introduction](https://python.langchain.com/v0.2/docs/introduction/): Overview of the framework and the structure of the docs.
- [Introduction](https://python.langchain.com/docs/introduction/): Overview of the framework and the structure of the docs.
- [Tutorials](https://python.langchain.com/docs/use_cases/): If you're looking to build something specific or are more of a hands-on learner, check out our tutorials. This is the best place to get started.
- [How-to guides](https://python.langchain.com/v0.2/docs/how_to/): Answers to “How do I….?” type questions. These guides are goal-oriented and concrete; they're meant to help you complete a specific task.
- [Conceptual guide](https://python.langchain.com/v0.2/docs/concepts/): Conceptual explanations of the key parts of the framework.
- [How-to guides](https://python.langchain.com/docs/how_to/): Answers to “How do I….?” type questions. These guides are goal-oriented and concrete; they're meant to help you complete a specific task.
- [Conceptual guide](https://python.langchain.com/docs/concepts/): Conceptual explanations of the key parts of the framework.
- [API Reference](https://api.python.langchain.com): Thorough documentation of every class and method.
## 🌐 Ecosystem
@@ -134,7 +134,7 @@ Please see [here](https://python.langchain.com) for full documentation, which in
As an open-source project in a rapidly developing field, we are extremely open to contributions, whether it be in the form of a new feature, improved infrastructure, or better documentation.
For detailed information on how to contribute, see [here](https://python.langchain.com/v0.2/docs/contributing/).
For detailed information on how to contribute, see [here](https://python.langchain.com/docs/contributing/).
## 🌟 Contributors

View File

@@ -46,7 +46,7 @@ generate-files:
$(PYTHON) scripts/partner_pkg_table.py $(INTERMEDIATE_DIR)
wget -q https://raw.githubusercontent.com/langchain-ai/langserve/main/README.md -O $(INTERMEDIATE_DIR)/langserve.md
curl https://raw.githubusercontent.com/langchain-ai/langserve/main/README.md | sed 's/<=/\&lt;=/g' > $(INTERMEDIATE_DIR)/langserve.md
$(PYTHON) scripts/resolve_local_links.py $(INTERMEDIATE_DIR)/langserve.md https://github.com/langchain-ai/langserve/tree/main/
copy-infra:
@@ -65,7 +65,7 @@ render:
$(PYTHON) scripts/notebook_convert.py $(INTERMEDIATE_DIR) $(OUTPUT_NEW_DOCS_DIR)
md-sync:
rsync -avm --include="*/" --include="*.mdx" --include="*.md" --include="*.png" --include="*/_category_.yml" --exclude="*" $(INTERMEDIATE_DIR)/ $(OUTPUT_NEW_DOCS_DIR)
rsync -avmq --include="*/" --include="*.mdx" --include="*.md" --include="*.png" --include="*/_category_.yml" --exclude="*" $(INTERMEDIATE_DIR)/ $(OUTPUT_NEW_DOCS_DIR)
append-related:
$(PYTHON) scripts/append_related_links.py $(OUTPUT_NEW_DOCS_DIR)
@@ -82,9 +82,9 @@ vercel-build: install-vercel-deps build generate-references
mv $(OUTPUT_NEW_DOCS_DIR) docs
rm -rf build
mkdir static/api_reference
git clone --depth=1 https://github.com/baskaryan/langchain-api-docs-build.git
mv langchain-api-docs-build/api_reference_build/html/* static/api_reference/
rm -rf langchain-api-docs-build
git clone --depth=1 https://github.com/langchain-ai/langchain-api-docs-html.git
mv langchain-api-docs-html/api_reference_build/html/* static/api_reference/
rm -rf langchain-api-docs-html
NODE_OPTIONS="--max-old-space-size=5000" yarn run docusaurus build
start:

View File

@@ -26,7 +26,6 @@ from sphinx.util.docutils import SphinxDirective
_DIR = Path(__file__).parent.absolute()
sys.path.insert(0, os.path.abspath("."))
sys.path.insert(0, os.path.abspath("../../libs/langchain"))
sys.path.insert(0, os.path.abspath("../../libs/experimental"))
with (_DIR.parents[1] / "libs" / "langchain" / "pyproject.toml").open("r") as f:
data = toml.load(f)

View File

@@ -15,7 +15,7 @@
:member-order: groupwise
:show-inheritance: True
:special-members: __call__
:exclude-members: construct, copy, dict, from_orm, parse_file, parse_obj, parse_raw, schema, schema_json, update_forward_refs, validate, json, is_lc_serializable, to_json_not_implemented, lc_secrets, lc_attributes, lc_id, get_lc_namespace, astream_log, transform, atransform, get_output_schema, get_prompts, config_schema, map, pick, pipe, with_listeners, with_alisteners, with_config, with_fallbacks, with_types, with_retry, InputType, OutputType, config_specs, output_schema, get_input_schema, get_graph, get_name, input_schema, name, bind, assign, as_tool, get_config_jsonschema, get_input_jsonschema, get_output_jsonschema, model_construct, model_copy, model_dump, model_dump_json, model_parametrized_name, model_post_init, model_rebuild, model_validate, model_validate_json, model_validate_strings, to_json, model_extra, model_fields_set, model_json_schema
:exclude-members: construct, copy, dict, from_orm, parse_file, parse_obj, parse_raw, schema, schema_json, update_forward_refs, validate, json, is_lc_serializable, to_json_not_implemented, lc_secrets, lc_attributes, lc_id, get_lc_namespace, astream_log, transform, atransform, get_output_schema, get_prompts, config_schema, map, pick, pipe, InputType, OutputType, config_specs, output_schema, get_input_schema, get_graph, get_name, input_schema, name, assign, as_tool, get_config_jsonschema, get_input_jsonschema, get_output_jsonschema, model_construct, model_copy, model_dump, model_dump_json, model_parametrized_name, model_post_init, model_rebuild, model_validate, model_validate_json, model_validate_strings, to_json, model_extra, model_fields_set, model_json_schema, predict, apredict, predict_messages, apredict_messages, generate, generate_prompt, agenerate, agenerate_prompt, call_as_llm
.. NOTE:: {{objname}} implements the standard :py:class:`Runnable Interface <langchain_core.runnables.base.Runnable>`. 🏃

View File

@@ -0,0 +1 @@
eNqFVW1sU1UYBrcfhgQlEhMlRg8NEBN229vbj63DKGNzOnRu0IqAWebpuaftZbf3XM85d1u3LIQh0YREcxMTEzXRSGmxzI0JBAySaBCjBH/rMEr4YdQoGn+YqInO99y1MGTB/mhOz/u8X8/7vKeT1WHKhcWc5VOWIynHRMIP4U9WOX3eo0K+UClSWWBmub8vnTnkcWtufUFKV7RHIti1wtiRBc5ci4QJK0aGo5EiFQLnqShnmVm6tPy38VARjw5KNkQdEWpHUd2It6BQAwU3z46HOLMpnEKeoDwEVsKgFEeqq4K1NjQxoDyYSW11Q2zsmVSLaYI5DpWaARF1w0gpR8mYXY/p4GIQU+Jhyy4NCoo5KQxyKjxbisE94KwcTCoIt1zVswJ3oAUcok7ecihiYClaY9REOcYRdOhyWoBGrGHagjAhHsdSnRwTSe4JCcB6hjB6WtCcZweOI+CDSsxDDgWEZOAgRihHAcGKboSzzJMI4nHoG9Fh+IYQPY4Lt6LAPNtEWYpwozxw5KWwasBSkEFBCrSIoYPxkAvToFxaAbfjoQAZnP7T6uJIqiSbsSHkuQGLJTegTkhuOfnQxATcKTVYnJqK3HrQgUVQlt1DiQTowES1QLEJmnqlXGBC+rM3qWQGiKOu1KhDmAkJ/PfyY5bbgkyas4HOGlFzDWTo14YodTVsA9+VBS//GHZd2yJY2SNqjFN1tWiqlpvNNSUqDbTmSP9UR6OOSH8JRO0gPRyLh41jo5qQ2HJsUKVmYyip4gb2M4sNLiZDEEerL4xfWXCeXoxhwj/ci0lf+oaQimn/MObFZPz44nvuOaAv6lc7+29OVzdeTxcLR6Ph1tkbAouSQ/zDOWwLOnuN5GsuNdiNmKYnNT063WDJBmnLgn8onmo9Alp1QX10fwVCSk9MlmEi9OJn1fp6vtP3RGOa3y67q9wF0/HPdnOrBRmtKE1dpHYPRZPterRdb0OP9WamOutpMksOYzbDQfo5GMijjeFXScFzhqhZ61xy7HOh622pZbNhH6VWf5tgWOqnX47ruj634ZZIDgtiOSpjOZZKpf4nLjBDpX9C9afpKc1ozSx0mYjvnkNLeS48cPV6KqoeqGjdLZDX62mg0S3RS9ejt+2u1YvWLNP/EM6DejS9Q+R6jQQpxLaYu2h/b7JrqMtJnBzViM08U5PwylMtEMSo9OdQnEQTRipptMbNeLYtnkglcjgWTyaTuqEn4/HsoWEL+7VoOIryjOVtOtPZrXVieHK0dCAbv9q166mO3p7OqZ3adpZlwF8GA88Oc2glTTnI0a8FqWHBOa2A+/aOXf6JNpIi2QSNJUjMMHI5om2BvWkI6JpAyup1CP5N9lUWXqRPvnjg4O3Lgk/Tky9/s/Xc5lUH3jovzu6TX6/45ezOI6OREP78jrW52OrY8edWlkZ6rI+PNl3+80rLD6tv6776+tjIuvvPXKEPP3Lnr6/NnBoYO3l5+sD+gQ2XtpfXbJo811Jq2nbymYO2e8/6bd2b3yA9masb7869f+HLf/rH55tf3PHVSyuvkA/61vxtf3e0+c0H86WP/vrx7Q3pWDqDm1dVP71w8fS9Wy8fOL2+OZza9OpPM8fe/v7dncRYtXFy70Ntj8/O/3x6ei/UPT/ftOz8H/et+B3O/wLqW+ZT

View File

@@ -0,0 +1 @@
eNqFVX1sU1UU3yBREIiJX4kY4VLY0GSve6/tuo8/MKVjfIxtyAYOcJbb927Xt76++3jvvm2lzAjjDwN+PWUQoghhXWeaMjYYERE1zkxZ+HCJBDIiQqKJMRElUYMxmnle18KQBftHc3vP75x7zu/8zumO3laiGzJV89OyyoiORQY/DGtHr062mMRgO5NRwsJUSqypq2/oNnV5rCDMmGZUFBdjTXZilYV1qsmiU6TR4lahOEoMAzcTIxGkUuxK/t9xRxS3BxiNENVwVCCBd3mKkCOHgptNcYdOFQInh2kQ3QFWkUIqKrOv2sKYGSgaQyqOkuccHU22M5WIYhtFBZsS4dycQVWVMM4FwXmXq9yOwShVsuFtVxvOcKusxAIGwboYDujEMBVmBFrA2XaQiCHqsmaXb4N9aAKHiNosqwRRsETlrURCIaojKFbTSRhqkltJEcKiaOqY2SdVQkw3DQbA7AtOtM4gIVPJOLaBD4pRE6kEEIyCg9FGdJTh2mYe4SA1GYJ4OlCASCt8Q4iVqga3RpiaioSCBOFceuCox5x2AbINCRhimEQxVBB3aNAYojM5Q3PckUFmTv8pdXIkOyWF0ggytQyLMS1DncF0WW12dHTAnS0MWSeSTW42aNMkKA22EJEBtKmjN0ywBPJ6MxGmBrMG7hHMUSCOaIwjqkgleMA60rxV1oqQREIK0JkS7b5mFGmlIoRoHFaA7+SEl9WPNU2RRWzbi+02prPC4exc7jWnbH1xIDuVWR/6cnkUr4mBvlXEO90ep6u/nTMYllUFBMopGFJKahn7x5MNGhYjEIfLzo6VnHDum4yhhtVTg8W6+rtC2kxbPViPej3HJ9/rpgr6Ilavf829z2WNd55zOwXBWTpwV2AjpopWTwgrBhm4TfJtlxTMhpvjvRwv9OVYUkDaLGx1l/BlH4BWNVAf6UxCSGYaOxLQEXLuTG92Ug/XVee6+V3eI4lK6I71SZUuFyFXKaonGrJnDwneCl6o8HjQ8pqGtD/7TMOUzRho0EH6IWjIslzze8WwqUaIlPJP2fYxx52y7GFTYB4Zl11T0Cz7p5Xw8Dw/VnhfpA4DIqv2iwl3eXn5/8QFZgizBu36OL6cc5U2TFRZ4tk4hqbynNh12XySdj6Q0aL7IO/kk0Oj+6Knzsfj2ZjKJs3JknUazgFecOvrlpWuEr2Vonc58QXXR6pWY6n2RDsnKtSUOAYLn3AZQbQzawy5giVBF1/mFjwCCXqDJWUlPC9K7qDXzQtC0OPqbpWxlRKcAmqmtFkhR/1VnB/DyuHqM7Kxeis31PpqVvrTjdxaGqTAXwMGnlWqkmQ90UGOVirzNAy4TpLgvta3wRosE8vFoFfkyyTscvOuEm4pzE1OQLcFkrC3Q+aPZXtyYiMN5y+Zv3tGXuYz/cW3qqun+2Z/9dmqM8NnBy/emHXr0tKH/yh85iEH+fb1G6P7pQMjg86ea03JP4fqr+8bX/jDzr7huf4ratXlby5vad9Y+1PfhqsPvrSkL33he27uxU+7Dx/e8/Pe0c2PBV6pGSk4kQ7zK6rnRZTT57k5X3YuOpfobGmoqVpndj7wFC5Ynz5Yd81aNX9425MlS26+W3le6dpGN885crNr6MK8Ga8W0LbruxY1mkOHpsX3Lvz97YX9czw7l00729/4xdewh0+9kx59fvXQJX91y4G6zYFZvxSMR45pgx0zbzniZ55eUTRv1+fCP3t9obpnH89r2tMZmfneE4FDC94PzC7sUh8dKcRp6+TV8BuvBXZX/rr/5IJ0eZzygZc3HRzdss/sPra4tvGF4x/5Rv7aVxP68bfFQNT4+PS8g+n+7afy8/L+BTWeI00=

View File

@@ -0,0 +1 @@
eNqNVktv20YQRi75HQtdlATiU9Tzpjh2GzgvVA6KICiIDTmStloumd2lHjF8aPq46y80rl0EaZtTb7n01EN/QX5NZ5emIhvuAxBAzrczs/P4ZqjX5wuQiuXixjsmNEiaaBTU5vW5hJclKP3dWQZ6lqenTx6Pj96Ukn2YaV2ooefRgrmaLhhfu0meeQqoTGanL/J0/fHGzeMGHsdzWDeGpKEXfO3oo3ud3mj8xXwf7pYvHz/rr9LO4aGG1TjyH84f9Rot0sAbpbVYzqgmTBE9A7IEig9JmCDjA6OV0VUsQZVcK9QNEanujlMo9MyY03RBRQKp0WYi4WUKcZpnlAlj8fwrhGF1LVxrU6GWIBGdUK5g50DSZZzkWCqhrzllGZ2Cqg9OzmdAU6zvD2+fKpDOaIpWm9+LNRZUOBcFVl7otvH32yhJMH5nXyR5ysR088v0FStaJIUJpxrOquPNmzvenbd7uRBgO7V5OwcoHMrZAn7dq+JyHoCY6tnmTdgN39XY0bqAzXtaFJwl1Fh6X6tc/Ix1LLDf8O2Z0lSX6vUp3g5//XmegVKYy4+PD+skvv8PX1evPw26fng2BokM2/wkpkysTu9hJpsPB5K1SNgjYyhI6IcRCbpDP8Af+ezh0T8kZ4n1DUYpsTYfb949rsnyb1xpTHLO82VcFrGttaF2YyhKzluNusOVVDcOSdDYcuv5cUMzzQEv+XLHMRXkQCK/mEpyvKOUHBXqqVgul+5FFGZAzGSgzpYxjeMmz6uiNYfkuCloBvjSvOS02SJNCdNKp7mH+U9yKRg1eJKXQsu1OXgqmIaUjLFxoEg+IaMMJHbEqCFlUKXdc3t9I1lPThCGboTz0tSvYpYaFxcW3oNcxSMxBQ7KWmOIXLMMYijyZIaaQS/sRZ2w3/Z3j40L00DHHzjYT38w9P3miYmylBLztSlyqjR2IMUo0yv+goFv/e1oXHXZH0YdE5KGrIgTY9lxu7U8QbnruwHKTMUpNWUJbJFEyrY1xh2jbY1LIdbGF0uqynpekoqr3boQvW606kYe+vSCoO0WYlpVPzVJB77vmzSXTKRxVpiEItevgbkFum6nBlKYSjB2vWALMWki2H+0b9wWSDlVSoizF9Z7EFpvW5iZcMOB2+9XaMKKOMsQ82s9g1itCpmVGcMKmHr0TbUSnpemtOZsAsAVZ3PYLecncKemJtJkxjivNNvbFCvQaHY6Nk1cERpxWFWa4RXQakYWTGFZ5PipqRQDN9rFrF5lvMCGzk2KQddea+SMGX4OycAi5cIw3L5OSyRQ1Ye+tbZA1QcMu3tygjOIgyVxlH13MOj1/aCHg767y80eOGl9mvjPcxzsNcHJgwT5aV4uj36LfJrMFnk6HhGHmKGgIjVMNmS6djtc0dkSrlTUU1Q4k/oCb2ZDuLQ+TFTOi7VjnuTg/8fmknqDHeXI6a10kWUQkXuIbh0+w2UJ0pD/iRFr7T2Oe1IDuTXCnW4W5m2yV006XyNrQvLH+wOXjHG/oTWuJks75ZJbtQPzkcGxHF6Oltw3fz2EPaKcjJgscqlt3LfRHQDJMDBysVTqJe9e6mkfP3ZRu3NdU6uVbj9zsSl+Y9h2o8HJ3wjDCKE=

View File

@@ -0,0 +1 @@
eNrtWH+QE9UdB/lRRVBwKlKldc2ABzab7K9kkysK4ThQ8Y7DOwbRO7eb3Zdkuc1u2N0kl8NzAIXB6qDBEQeVqUq40xM5UAQ7pxbaolIY20JbBQttBZTyo8zY3ghisd+3m+RyxwE6I+0/MEzu7fd9v9/3fd9fn/feorYUMkxF1/qvVTQLGaJkwYf55KI2A81LItN6uDWOrJgu52pm1NatThrKnrExy0qY5V6vmFA8ombFDD2hSB5Jj3tTtDeOTFOMIjMX1uXM3ssGz3fFxSbB0huRZrrKCZpiODfhKnAB5b75LkNXEYxcSRMZLpiVdDBFszApHRMtk7BiiEgjEf4YhKIRZmSiq6UBq9FlpGI2SRWTMiJZ0tQ1DVkkA8tQDBPE2ixdV/MLaWLcXsgSU4qaEUwkGlJMMJCZVC1TmAvCWEBGpmQoCewIzBwiHD4CaVFFQ4QOM3GlGclERDcI2HbCQDHYnZJCbkKUpKQhWnikyYRlJE0LGPMreIhZJookVVswDTJERk8SGgIOSwcBMw37s72OY0CIYT1pEaDPAGcQKAW/oOIOLQFUM6YnVZkII0IsmAeCRsaDN6BgFsGUYiguwg7muxIQImRYiu3w+S6b0x712mqpJmySquuNRDJhezGTsF1nWoaiRV0tLUDDKaIYSMbOzSttKGHVw3ORZAFrQ0tbDIkyJNrjuZhuWtkNZ6VOBzgOJSwSaZIuwwLZV6PNSsJNyCiigjvbJRxXOzez7Y0IJUhRBX+3OlLZ9WIioSqSiOe9OIxr8ylEYlvOnm7HmUZCAmpWdnOoYIe3JgOZrhGUh+U8zPom0rRERVMhVUlVBJNaE/Z8Z+lEQpQaQQ+Zr6JsqyO8rpRHN7NrqkRpRm0PldjT2TWiEfdzr5fSjaQG+YWybRU1Zy+Xn+xejvXQtIff0EOxmdGk7JqIqJpoQ9HJRZF2qA2WpPwkRa8reEmF1LZi2dU+OvAS5GoCsg891AoqraS5KAcRQTvfb8vX7Iszpheiub/fNbkpEJ3s21MNxU0wPFGLEgSuPYL2l1N0OUMT06rq1lbkl6nrMxgb6gxI/QgEpLIQ/DYpltQakdxe0WfY97i6t4WLTYV6tMh8w4Jg4c9sjqMoas/N5+U0oEAUDa+YY4PB4AX0gmeQld2I90dSQZLh65xd+rh79xB9STpdL29PK7YHLBpzHs5uewrcxHm5+7aHoe9tzxtNKnL2LRgLFD3tnmnBKn+suoql+ZkV98TT8ebqOu2NJlJS9aRMWtD6EWknRJOV3UNwwaAYZH0yI/MsoliRpX0RnqeDFO+XIsFgYHVKEbPttIcmoroeVVFHxVSyQoSWQ9baaZNtmzKnOlR1R8Xae8i79bAO/qsTwc+arqHWWmRAOmbb7aWhwA3UCuJ3h+ZkNwakoBT2sxQt8zwTiUjkZKibQgIVEySHu4MNMQtbnY60rf8NNz56eT/734C6J/bd+etJwxcLY3d2DV4eHy+f+FnX9wbOPLZ43Gvu7R+1apGPV+358/DP/7l86fNPmx/sTF/FTvp4wcJl6U3jXjn0zgMtfzn82br7Dj+9Y8Vm4egr7LgnzizdPZLp/OGiRaO+GhP4dMW27IJFHu7w1knHG+ZSwsHRS2uMhsPoheSgIUcmLRrz0/1LhNzDf4t/8kjwupWfyo9+/vLLVz17tPPZNz/9/O+Jd44/29Xy5oLLjH0PfPbBqyfI1Y927Z968ODi4wsHVI0pv7k/u2W8eGzrlkGrjtEREh0bd3rpsiMrjj5xR6z+6gMn1y0YOzo+hb/pTNczw96tndw+YujYE9fmTo2InNz+2jW3ZUc9dv+sIZOX/3LvnY8f4MELX389oN/OT64IRvv363duOH+7FM0dXLSh3IECB8X7XznfBdNCI8rY6JlSM6RVN8XHh2rvbqxEk5PzZswJNMm+6dMheWo5qqqxmseYUcAZVyl2ixoRgYKXFFPSAWNkMYNZ8SEhj5IgwLgLWCTI0N9jWIcop0AKwMYGOEkFvBdkHdeLDe4YeFBTn+QCtwOwQLVbY8mEIaaF7jNH71klnj+p2BNFKFvSPguDSMgGkU0ONBR7hZfxsPC/I+SgWmXfqNbqTGdX3+K95Rytbl0h9e/Kt2jGz1+gn36bDr74Arp6L5+juaCvUL5r8Hmo6QII4MMIcI7N9SjgvYM+LJ5MLpgwroiuqnpaSCaE4nnJVa4lVdXtKoTZ+SpEDzLBVUwwOApaioUPna7Z3SvVwkpTCyvBGkkDzpauQn2k02lP3ixcKrhGgKeYNq75ZarueK4MTlZl+KgJg7IeSsvcRJmBog5PWQU4AU6CmiJiuqQDthsZPDFLU/CpETdSZBJ6hAjFkQFhwWyQN8DC8h4+gL9sTSTNMB4OiqbMahYUGavIS3jv0k0hpEURnAxsaTBRxScIASV0KQacNM/wnI8JsFTpNFbRjSsEFSynqLIWbKVzGrW3qIqmBRGQwUq5lz7ACVtfCUdvlYFyzodNslA8IUhY0ufxF74j8O2nPDR8K6YAIcfztpM0WSn6GEOV7eOkpmWwLkVyPOv1SrLWO1r5T6+fa/JzXtDppWnWk9CijvdlvGkaMBdvM61oshBP4A1xHqpAaLQJfo+vQJBR1EBYjqeLJMXAFlRWV2K1cDUwzaSBhHjY1k4ztrYiWcHmMkFPIOBQJSUhxONAowp8mGJzOZRYMq6AB7A/AthbNoLiWRhHEFJNVWlEpe7sJpb4FFsqxRRVdTjZ4hYdIub0+extQp+wgI6aHE6mF9Hm5GyijNIJHe6QDiPt4UppNp8jnIKANuIt0n57WfwdV3B+lhNBm5JM4Qy3h1G4P+XjELClbYITBzDb39ICNQiFZUApUx44lgT4IAOFXtrQcR9ocXdXfBVMxNQMUaj8qSAtQaLat7Ie5eomKkIEWbh54iQ6uyt0zxUTLO4s4FW9/mAYyZJf9IX9KMjzwSAbCbPIx3IcYiXKLwfCEusX6UjYz/s4iZXlSNjH0pTISn7ZLwX4Hg1mdvdSRBh3TNO+PuK7cRwuVcWrJ5Ffv3hjjpxngx6PB3dtniN+tZ7w0fiXCXgIvz3yMfgXWHo6GQ6Qforry8tOj7XBR8BtxFUO95OW7+gt4fLrL9pbgpvoFhRNUwHcBJEe0hgy8vda/KAggH7M8M1eFOwLeY+r94UQDl+vFbmwWhLO7zPl4NwplbdPNUImXT03NS0jh6braRdcrkutP3vbvQ13bOvlmvvm1+PErodx/fkQrx7k6guCDvcl3LuEe5dw73+Oe/V21+qrai8qIvXRAC4yLtUnKSpMYWzKj/L4VKAzhRGIgFMaCk++uEML36iF4lZrCsgw9OLlELrqpfflS+/Ll96Xv9P35RxD8dx3+8DMX3pg/j88MPN9PTD7xAqmZjYT5Kw5986a1synKius6unnfGD2USzFRCQZwSAghVk6GGHpCBfgGF+EE8PixX1g9nFUgAt/uwfmpu4H5vqZ+7TdNUMfvHbHbGLs2GFzPjy0bNhTV066PNk5+SXmkT+NPvSbstGna15sP7Ex+tGTL1h1zzfM+fKr/8y57cXGDe+GvugMn/rHvuN74xM7Tnf9e0PzX2ddfeOuyKlr2Y3KwZXb2jdGd1KDJw7IHfnj7UPZ0ZN3/KhRnbBmxb82/2LwiE1vuX/bPm7HDTvXXxF2L+nafGDbrpNfuG97/PoTP1ky4Mnk6NDK8O6QXLX/+89tXHeTtH7Z0Oe2rBjoz+bm7R24/ve7BnZsmnD91RMDkzOrto6+tfbVA9elOl5nm7YbQ56ZcnMgcHTBlqZRweVr3p9Ej1HEWRNu1fa7O0a+0vZe56CdVW/8PIIOrPzk9V2dLdFEYteRytmHfjzqXa2/8OC8MSe2/uDk8OZBJ5qX/IEd/8jCsgP1u6nEV7OPbnvqygktv6shH+t8PxdaP3VFKjp+yJmGcV/f5R4mkdtPD919Suoaseqx7amRzSO3fdl6CzN0+5n31nVUt03Mv15XPXO/OPyyfv3+CwLsDoI=

View File

@@ -0,0 +1 @@
eNqFVVtsFFUYLjQEHwjXJvqiHDcIATrb2QvdbuVib0CF2tpWuQXXszNnd6ednTPMOdN2aUoCKAaqwTEEgiY8yHZXNxWoLSGKoIlNNMELGqLUEEN4gBhM0BBF5AH/M7tLCzS4D5uz5//+2/f9/9ld2S5iMY0aUwY1gxMLKxx+MGdX1iLbbML4a5kk4Qmqplua29qP2pY29kyCc5NVV1RgU/NigycsamqKV6HJii5fRZIwhuOEpaNUTf0y9fteTxL3RDjtJAbzVCOf7A+WI08RBTdbej0W1QmcPDYjlgesCoVSDC6uEhrSkihKo097+srROBQzpjEO2R/AryW6TlEt4FEjX8SQoSkEcYqShHCUorYXNSKVGos4gk5trOspZBCiCghkR9hIwZHqTFxYhJnUcG0YMS1p6gTFLQikGXEvWku7EbaICAoR4QpwKk6tur/OSVrqTmDOUBIS4yQB+FbBB1WJLoyKjm2VSAGJUcMgXPIDX7LfHxYx3MLyjAlXAee4S9NTEUawpSQiULCtcxbpAGfhoBKmWJopFBXgGpTHIWLENYMgCpakth26j1ELgX6mRRIgk9ZFyoEexbYwFydBgWUzDsBCBi96iZGYrbuO3eDjslAkEhusm1jIHR8xTAhHqc0RxLOAAkS64BtCNBom3LIEtXUVRYngOF8eOFopr2hAE5AIUxIkiaGDXo8Js0YsrrmT0+txke7pgVYnRhIl6ZR2Itt0WUyZLnWMWyCapw/k8ohZ1yyiCnILQbdOgNJoB1E4QLf2ZRMEq7Ax+9MJyrgz9NAOHAfiiMklYihUhQTOR/HtmlmOVBLTgc6cInR1l8zJdRJiSlgHvjN5L+cENk1dU7CwVwgZBwuDI4laHjbnxHxJsEkGd07VFOuoaEnByhpI9gaCXv+JHgk2RTN02DlJx1BSxnTtpycaTKx0Qhyp8Bw4mbzzsYkYypyBJqw0t90XUjDtDGArWRkcnnhv2QbMF3GydS0PpysYx9MFvD6fNzR0X2CWMhRnIIZ1RobukXzPJQe7EZDkSkn2HSuypMNo84RzNOQLf5BfX0Z2ZyAkt9muNChCvvk6W3h83m9eV1Tz15K56XpQxzmz2tLKkT+E2oiJxO4hX2W17KsO+tGapvbBukKa9knFGGq3YPRjIEhDUfyskrCNTqLm6iaVfcwz3pZYNh32kUuFlxfEEj+ddFCW5bGFj0RasCCaITKmA+Fw+H/iAjOEOyOiP0kOS/5Qe77LZcHNY2gyz/zzXagnI+qBihY8AjleTxGNHomevJ6gf3OuULSkqc5ncI7Ivhcbarv4ho6e+hhes622pTbVpqnm+pM9kqJTW5U4/IcRyR2IHu6MoYAcCIZUfywmK1gNh6pilWQZVn3hUDQoV/nl0NEuDTs5n9eH4pTGdXK8brVUh+HJkdrcsXGy9ZteqGlqrBvcKLXSKAX+2jHwbFCDZNqIBePo5NzUsOAWyYB7a80mZ6RKCSvRyqgfk6pQQPYvk2phb4oDdG9A0uJ1cP8rd2byL9Lov/P7HytxP6Xr93/7/JfPlb0eIcuvf5jWpgXW1cz+4a1nh+ZmDq/zBz+Zx25c3PNj96GyaRumn71Zeu3NJy7La7c8fv3UjdPJc9l9kSM3r1ddWrWyCa/8ovaac7Bs7z8HX/UN7JjyyoJ921/eOGNxy6w3MrfC5zuG3xld/+mSfmvLATKtf+HQ3KWXvrpNW38bOXD8yh9HPp4zf/fhtiMz7uxcX3bz7b+vXpxTcWFkntMqlx5WLnz3+/mGedOHm++896Sx7fbI7CZlhXNo1EQzT17d+2fnY33kyp7LVbfONJzdYcXrnxr+6d2Zo1NPLV7Sf+CvVUt/PnRuFjR5925pyefLN6zwTykp+Q/z/kl9

View File

@@ -0,0 +1 @@
eNqFVX1sE2UY3wTE8I8wM4mJH6+XTWKy6/qxdusSldExRDI3tiIwstS3d2/bW6/3Hve+t62bSxRQo0TxAtEYNU7oOlMHbDhCdBA1CiJgAokai4gfKPCHGgU/QgLB524tDFmwf7R37/N7vn7P73m7bribGEyhWumIonFiYInDC7PWDRtkrUkY35BNEZ6gcqa1pT28zTSUfGWCc53VV1djXXFhjScMqiuSS6Kp6m5PdYowhuOEZaJUTh+/aXa/kMK9EU6TRGNCPfK4vTVVSCii4GRNv2BQlcCTYDJiCGCVKJSicftoZQLzBQzxBEE9BMOPgRQNtTc9JAx02nGoTFQbJ6nYlInoExnVNMJFL+Rxe71BOxynVC1k0nDKycRxt6KmI4xgQ0pEDMJMlbNIFzjbDjJhkqHoNhM2uAFN4hDR4opGEAVLSukjMopRA0HfukES0J7STaoQliTTwNx+0mTEDZNxABYyuNAKRmKm6jj2gA9KUxNpBBCcggPrgf4c2u0hIBylJkcQzwA2EOmGbwixVNPhlCWoqcooShAulgeORtplN6DYkAiTEiSFoYN+QYcZEYMrDuP9goN0nv7T6tRIdkkqpUlk6g6Lad2hjnFD0eLCwACc2RpRDCLb5BaCdk6B0mgXkThAOweGEwTLoLRNmQRl3Bq7Tjs7gTiic5FoEpUhgbU93qfoVUgmMRXozEn2XB1xWrkkIbqIVeA7O+lljWJdVxUJ2/Zqe4wjBQ2Jdi3Xm3O21ERQoMatPQ3FOqpb0yB1DbldvhqXd7RXZBwrmgpaFVUMJWV1xz4x1aBjKQlxxMIaWdlJ5x1TMZRZQ81Yamm/JqTNtDWEjVSg5t2p54apgb6INRxqvT5dwXg1nc/l8bhqx64JzNKaZA3FsMrI2BWSr7jkYDd8ojsguj07iiypIG2esLb5PcG3Qas6qI+sz0JIbrJ1GZgIOXJwuLC0W1uWFad5sqQs0wjTsfY1GUoV8taidqIje/eQJ1Dv9tS7A2hJc3gkVEgTnnYYY2EDpB+DgSwuDn9YSphaksi50LRjzwtX27KXTYV95GLhxoJh2a9WpsbtdufvuyHSgAVRNDtjxhcMBv8nLjBDuDVu9ye6g6K3NjzZpb+mI4+m85y89gr1ZO16oKKKGyCv1lNEoxuip6/HHejIFYoWFdnaC88Rt+fh0PLuhse6Fre2xVem+jzJjh5fI2vc3StKKjVlkcPdT0RHEL3cyqO6On8s6CXRqOQP+GpxjEheH/H7PCQgByQpSrZ1K9jKeVweFKc0rpKdoSYxhOHKEdsd2VjDjasfbWheGhpZJbbRKAX+whh41qhGsu3EADlaOSc1LLhBsuDe1rDaGq+TglLULwf8xIu9sZgkLoK9KQroikAy9u3g/Mc8lZ28kfaXlt+z8ZYS5zMj/FLLso8Xzt3/wSOvnr/93JLn86+93Dfa1nqrIBzedcc3X/yq7vIlX7j3u86yeX/W0dOXTv9xc6LrqP7jvs/OdV3a/cCeJ1Y8+N6Xv43mT0zcxWbMydC17y+KTSxpnbv+zZmHT4yuKmvV5/j7jn6/t9nvOlw5W9hCrPL5q5eHBz+cVVZResl7UaicSctajgQP1izY/PP+82e2b/n0r1PNrm/fmDh5KDT+yuCTvyh/5zcd+OeZY0097nnBNGY/LbztueMVg7PPlh24u+b1Y4dKT219a9aajr2Ll+3A8x+/M1I+uuGrxvHNFyJb0x99XVnx7OD96Z3o8/KzP5zZaP3+4ieDG1cMoYoL72w/t/bizSUlly/PKDm+/Ok6XFpS8i/VnBjV

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
eNqFVWtsFFUUbnkkqFEUjIQfhMvK409nO/vuFh+UbbEIpbUPeYVu7s7c7U47O3c6987SpTbGAqlEfIwv0BoSZdkla4E2gJoIKlHUgIkVjbEgkEhC1KAhKgHxB56Z7kKRBvfH5u4933l95zt3e3MpYjCFaqUDisaJgSUOP5jVmzNIp0kY35RNEp6gcqahvql5p2koI/MSnOussrwc64obazxhUF2R3BJNlqc85UnCGG4jLBOjcvpk6ZVuVxJ3RTntIBpzVSKP6PWXIVcRBTdru10GVQmcXCYjhgusEoVSNG5fJRSkJFGMxua4etbZjlQmqm2QVGzKRPAJjGoa4YIXAoteb9j255SqhdAaTjqhOU4pajrKCDakRNQgzFQ5i7aDs+0gEyYZim63boOr0CgOEa1N0QiiYEkqG4iM4tRA0KhukAT0o6RIGcKSZBqY2ydNRtwwGQdgIYMbtTASN1XHcT34oDQ1kUYAwSk4sPXEQA7PNusIx6jJEcQzoH1EUvANIZZqOtyyBDVVGcUIwsXywNFIu+0GFBsSZVKCJDF00O3SYSjE4IpDcbfLQTqn/7Q6NpJdkkppBzJ1h8W07lDHuKFoba6eHrizRaEYRLbJLQRdNwZKY+1E4gBd15NLECyDtF7MJCjj1tAtYtkHxBGdC0STqAwJrD1tGxS9DMkkrgKdecmeq6NGK99BiC5gFfjOjnpZg1jXVUXCtr3cHuNAQTSCXcut5rytLQEkp3Hr/apiHeUNadC2hkS3z+/2DnYJjGNFU0GcgoqhpKzu2D8ca9Cx1AFxhMLeWNlR571jMZRZu+qwVN90U0ibaWsXNpJB//6x94apgb6IlYs03JquYLyRzuf2eNyhoZsCs7QmWbviWGVk6DrJ113ysBs+QQwKomdvkSUVpM0T1s6A6N8NWtVBfWRjFkJyk/VmYCLkqy9zhS19p35ZcZpnSqZlqmE61uElhlKGvCHURHRk7x7yBCtFT6VfRI/VNQ9ECmmaxx3GULMB0o/DQGqKw89JCVPrIHI+Mu7YR1w32rKXTYV95ELhiYJh2T+tjF8UxZH5t0UasCCKZmfM+MLh8P/EBWYItw7Y/QliWPCGmke7DPjXjKDxPEffuUI9WbseqGjubZA36imi0W3R49fjC6/JF4oWFNk6BOeo6KmuTnR0tixuaazgy6TGmvjy9TWNCjvYJUgqNWWBw2NPBEcQXdwaQRX+gOz1xn1BjyRVhCpiPtGPpbg/RPxB2eP1xXamFGzlPW4PaqO0TSX7IkuECIYnR2hyZGPlqlevqKpbGhlYJTTSGAX+mjHwrFGNZJuIAXK08k5qWHCDZMG9sWq1daBCCkuxIA544uGgT/QGhMWwN0UBXRdIxn4dnD+VZ7KjL9LRUjT7uSklzmfi8pfql3266N6jHx+r2NZ6orFp7c+tmzaIm3d81l/7Q7zP/8EbWxbu/77h6ul5NUe+3Xj2H9Y148KEygsH92y7vG/LPad+O37RbG3JXfrz7dMPz2raPPlkxfCrrpaz0x7YPnfFJ++m2nfcfdeFeQ3VfXV/hYefCqzE8/u3Hf8Dr359bdngfcFY5HLq737/1R3HQp2rntg6YWH4zJEz8Tt/DEyaPzx95taXZwz2oYd8F58ns89NWX5/tvbJCV8/uL32uzvmnqi6cj49vHe2q6r/2YFzqdLX3jqy4M0lc2q/ELZPevSRny4dXhSY+Wt16+Zv5nTuFhZ8Ho384pse2vQC2zr5/KkFv/fOmjrS/srUWM1KLTj58feuqQc/an0aqLh2bWJJ36HzQaO0pORfBzAQdg==

View File

@@ -0,0 +1 @@
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

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
eNqFVV9sU1UY39wD+KKMqKghcqzgg+62t+3d2i4+MDoQso0NNkRmluX03NP10tt7ruee260sC5Fh4p8IuZoYNegD61otExhiJMH/+oBBgolRM2I0IAaNYmKiSEIIfueuhSEL9qE5Pd/v+/f7ft/pjnKecsdgVv2UYQnKMRHww/F2lDl90qWO2FnKUZFherGnu7dvwuXGzIqMELbTGgph2whiS2Q4sw0SJCwXyodDOeo4eIg6xRTTC6fq/xwN5PDIoGBZajmBVhRWI1oTCtRQcPPEaIAzk8Ip4DqUB8BKGJRiCXm11rg/MDYgPZhOTXlDTOzqVIkqDrMsKpQIRFQjkYR0FIyZ1ZgWzvkxBc4bZmHQoZiTzCCnjmsKZ3ArOEsHnTqEG7bsWYLb0CwOUWvIsChiYMkZ26iO0owj6NDmNAONGHnahDAhLsdCniwdCe46AoDVDEG0yaFp1/Qdh8EHFZiLLAoIwcDBGaYc+QRLuhFOMVcgiMehb0Tz8A0h1lk23DoZ5po6SlGEa+WBIy8EZQOGhAw6JENzGDoYDdgwDcqF4XM7GvCR/uk/rc6NJEsyGcsi1/ZZLNg+dY7ghjUUGBuDO6kGg1NdklsNOjAHylJbKREAHRgrZyjWQVO7ixnmCG/6BpUcAOKoLRRqEaZDAu/toW2G3YR0mjaBzgqRc/Vl6FWylNoKNoHv0qyXdxDbtmkQLO0hOcapqloUWcuN5ooUlQJas4T3XlutjlBPAURtITUY1YKRgyOKI7BhmaBKxcRQUsn27UfnGmxMshBHqS6MV5p13j8XwxxvsguT7t7rQkqmvUnMcy3aO3PvuWuBvqhXTvbcmK5qvJYuGgyHg7Hp6wI7BYt4k2lsOnT6KslXXSqwG1FFbVHU8P4aSyZIW2S8CS0RexO0aoP66HgJQgrX2VGEidAvj5Wr67m3u6M2zR/qFhfbYTreB2u40YQiMdRLbSR3D4VbWtVwq6qhR7v6ppLVNH3zDmO6j4P00zCQ1bXhl0nGtbJUryTnHftM4FpbctlM2EehVN8mGJb86RU1VVVnHrwpksOCGJbMWIwmEon/iQvMUOEdlv0pakKJxPpmu2zW+mfQfJ6zD1y1npKsBypafhPktXpqaHRT9Pz1qFp/pVq0Yuje+3AeVMPrmb15deeax7ra9GQ7zXQazdqWtcl3RxRiMldXBLzyVPEFMSK8GaThqB6JtUTj8ZYEiUS1uE5xOE5icaKSdBxrE3kDe5VwMIyGGBsy6YHkGiWJ4clRen3ZeOX2LevbutYlpx5XNrIUA/76MPBsMYuWeikHOXoVPzUsOKclcN/YtsU7HCcJkmomJJzCNJJOE2UV7E1NQFcFUpSvg/9v8lRp9kX6/OSy5xfW+Z+Gzl0d2c/URTu3d5xrGt9X3P3L90nj2Iqzdz3X+O3iPQ8d3TW86cW7r/xz5qtV3Q0/PvJK48Cqj9fd3nX5yGh297J953Ov5ztDBzafPnF+tH7B0QtaeW3zfQtvGz97T/s365VDn5xe/mzkllNLO/Zu3fCW+tKmDy8cP3XpzqX9+IGWnZcvxgzx6vHhW0fKe36u/7o8/tpfJ1ZueLpx5Z57H2746bue1iVnXl505OzvPX989Okzuy6lXvhiyXTg4rnJ8TsunXyj9OuCurorVxrqflt9aPvf0MW/54vuGA==

View File

@@ -0,0 +1 @@
eNqFVE9oHFUYj7RYWy/qIdBi7XSJipK3O7N/kt1ACem2SUtNN82upV3R8vbNtzuTnZ2ZzrxdktYSTBpEFONDyMGDUjPZrWvMJrZasLUQ04rF9mBPXQJV8OBBUDFeCkJ9s9lNUhLinN58f3/f7/e9N1IqgGWrhv7YtKpTsDCh/MdmIyULTufBpueLOaCKITt9sXhiMm+p1ecVSk27w+fDpurFOlUsw1SJlxg5X0Hy5cC2cQZsJ2XIQ9XsWU8OD56iRhZ029MhSKI/2Cp4GkHc8tpZj2VowE+evA2Wh3uJwZHo1DUp6l7PudfdDEMGzbUQDedlQAFkG7oOFPl5RdHvj3jOlRTAMh9m3FEMm7K5dfAqmBAwKQKdGLKqZ9gXmTOq2SrIkNYwhTJxK9bmZ+UsgImwphaguJzFZrFpairBrt83wLtP13EiOmTCenfZHQfxKXXKrnQ1cPj6hjibuiB6A0Gvf3YQ2RSrusb5QBrmkIpmzX91rcPEJMvroLpSrLicPLM2xrDZVC8msfgjJbFFFDaFrVxb8NJau5XXqZoDVor2rW9Xd662C3glyds+90hhe0gnbCqNNRvmVkheSSlzVQJIbEOiNNNgSQM9QxU2KYntFy2wTb5lMFrkJWneHnG4InD7h1J9MT6NHWmoeb/pGecAV4d9222prYK/XYiDKbiqC1Jbhyh1iAGhpzcxHa23SWwoxlzCwrqd5oIcbIhfIkpez4Jcjm4oe9WzOpbF+2tqTqWofim4WO4vc4KiKFZf2DTSghxnze3oBCKRyP/U5cwAZZfd+ZAYQf72xPKUoWCyKmyUuXy16niKLh6OqGWTyFU8jWhh0+iN8YiBZLkOGqkyu8bPp0TJX+g5FMoETbNPhTMnjukZ6UjyWPdXg4hoRl5GlD8vgGoLMUhZVQhJaWhvC4fTYdkfScvBFIhhWQqmAnIklArKZLKgYlaWvJKQMYyMBpVoN4piogCK19aGlQ6cPNrVezg6fQL1GymD85fAnGfd0KEYB4uvIyvXWvMLbkGRp/d3nWSXwyRCUiESDJBwyp9OE7Sf35vGAq0siOO+DrVn7C2+phY33biz590nmmrfllfevzOwID51/pMpe2L+9N3m37fvf3N7y5X+92bb5hP389c+/yD17x83L4x9/Pj1Bzj9z9PPjb6xaC3NzA0v/vnRr2Yltm3AW+q5tG9h/npPMu7smtn69uG7O0YGKs33fhEPOVvHvWPPfnav+eXb8sFXj1/9sjwQpt91a3/tWfrZ+Ymgzpsk9tKtJydi20I7F98Z2bEwGv564sXvKxfojzd2z9tHb+3tHH6wc994NfmhLzVW2d2yOPz3N62dHPfDh1ua8G8wusTP/wHDg2Hi

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
eNqdVn1wE8cVh5JQWtKE0DJt0kk51BYG8Ml3kqwPHDIRsg0GbNmWCB+BmNXdnu7su9vj9k62bD5DJlMmkz8uaVpamjCpjUVdY/NVSKF0hqFpISHJNJCZGhLoDCkNk9bNQFo3bTP03UkGufBXNSNpb/ft7/3ee7+3e08XctikCtEnDii6hU0kWPBAnacLJt5gY2o906dhSyZib1Myle6xTWV4nmxZBl1QWYkMxU8MrCPFLxCtMsdXCjKyKmFsqNiD6c0QMX9h0oVun4YpRVlMfQuYJ7t9AgFfugUPvrU6A5/aTst1zVgyZkRMFROLjKJLxNSQC8RIJtG8RYmoKulQ9CxjIA/RXwQo/iZ1Nc/gMizDBIKmpWDKaOAQoDxgb21OQgUIRVIEz8ccRrJ1L/pxkE1FNwtKPKlF8oxmgxedtCGRMBAKkyN0FpPG8J9nECMik7Fs8GdiQRHJrOJOXwXjM4mK3Zhtik3fpnUwoxERq+5U1rDYEGE1RVdcSx3mePg3kIlUFautFiFqqwBjN4MSUimGVWqZGGllExbWIFxk2abrh/Nz7py3UyaK4M51+6y84ZEYi9Z1d2vsGuhI8wzGp8e3aVMJrFTD/xcHzKDCgqkYJUufrxQoCA206O29XTfvkbq104qK6fZh3XaDftInI8PIe+nCNtRcdYcUiT43s2P0IEegFp9LHmWzJshQyWEd/jyo/2FSfMyAWmTSwdy29/RCLQT5BRKMQiu8GVnJytj0hkApUxpqxMRle11SY4yhpIEKJljBhCqYqnKWbu9lXVHAnIr0rA2SGx8rNZCuULmIllVLQ8nEuuCNYLeGvOwqFlIVGN4tCy6+29hugxVhb2X2zgSVcykHI5k2LFgAtmndpoKMkQhVuzRhWq9MqOUMjj8VhpAgYNA20CQiUHD2ZbsUowKaXFIhnf3QPjr2NOP0t2NssMA9h/uKu5z9UGC1JJzKNkr0gdLJwbpc7lzudzuLBb665RxOAol4fWVTHo4vneH9oaif29/JQhkVXYX4WDc4p8/w1o+XLxhIaAcQtnQ0On3FzYPlNoQ6exqQkEyNg0SmIDt7kKmFQ4fK503bS7NTSDTd6a60eNtd0M/z/siBccA0rwvOHq/Rj47bjC0zzwoEMJxXuT6BkHYFO8PXW1sFqTWjLVT8qEMI1hlL2xvDjWuyibqg0knji5YvjZBWpOYbVsfV2vaGTFN2jcDykUAkVBXk+ADL+zk/7+fZNUsEqQ2n4skVihztaKHIVuzwBjWU1v25laFkYEVIbm5rXMWhOiNcJ7YbiVUNcYtkllFSk2u06jMJUUqmosvquFpFSVdFOqVEXaY5Xs0AOzuniAurmltq7VhGzeSSoTRXE5bzS1uysVXpJ+IbBD0hdWXy0YYOZXlghREtoxcJR1iuxDDMhaKc+xkc04YKDWLJTk8sGt4LejbgIsLb+9z2tenTvaBDfPZ0oXQh/TS57LaEZ/TWgCadE3WmAo0aYVLYYAJcIMTw4QVccEEwyCxuSA8kSm7Sd5XggbSJdCqBDGvHJF8QZFtvx2J/4q5iP+GKHSrp0ocbgsWdBqGYLbFyBlaxLcWrmK2vOVTsLJaYWTgOujy3zglP9R1dnR2iYIuinOvQuFhXKAgHmS1Ih0tb4Eh13QAhVqNOTyAWHSytjOmuH2LlWJ5jOf6X7oEhQJu5wRjEtFiKBbj8rbwzXKGhTrfHFgb5qmAYEl8NN6qg2iJO2ZkaooEyaTXcvFglSDzWycJ9hFVFU6Aw3m/pxYI6vVWw+bU7DSzSjuEVpBDyysr9utzCxC6+G8RtmFAsFvvV3Y3GoIJgEguEj423oricDR/Q6Gt3GpQgeniNDnSOmbOK6Ax/Bx5aA2GEcawKRaUARsFIFeJxIIaCoSCPMlFRDA8l6tgEEmTMpjwBOoWa1Y3xhvrEkVVsuZLYpFF88yrohOqKJPWlsAmVcfoFldginJYm7gOslvhq53BUiAmZWCTAC5FoSOSi7CI4h8bQbumu1z1qvVewbX3FC+D1iZdnPjdlgveZBN+bN60W1H6Rm/b5K62zRuijL4R+Ftwyf+432Yvr73niD4+eXR2b/4ZYf+PMB0tPb5l5MPU79uXHpmxIjl46d+6ROYu2XorPfnyEP31h14fSi98aGfxk9KgWG9Lf3HVq9K3d16+NoDc3LkEPV6/NMw+9cvxS/cruRLz64qmDs+772uo/X/OtGxyUbtR+8by+ePaRuTNf2LOsTbMP7mR/cKai4erHdPSSUn/fj/7JP7joe8LRxbtzi7fM+uqha3TPbCl9z7BRP0X+yY4Zj0tvTdS2Xrv3+29PPvj7Y9rzD008GUstCV31vT905aONX5r6/Nwj7105tfLTP/3wnac2D7z7gNVNzn9+9dySocLm6y+/2v8Lc4ryzAN//8tLO6etPzDSFZn9WOHd6ZfXT/vC/matIVwzapzddmbyI1NjYowbMXde3bq06jcDM89Mp/cPt/14e/zna9LnL38qV/2NRk9O3XHuw3033mne+pUVbE9sTvfg7meHAo2f/fal/8zL77XOz3940cj0Cfe/PXqhuZDa+o/XK7eTtX9NPPh+5UHH2Hzio8/+GNjx7dDC7SfvDV35179v2jOqv7z3ePM3+oY69u47xp2dvOuD6m27o03r0hfmtW3sOR7b/sbX3+taMf2pwsffXd744havipMmZDKfPGdDSf8L0feGaA==

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
eNqdVmtwE9cVNnXJBOiDtilD2smwVtqQZLzyriTrYdfJGNkKfspYBoyBMVe7V9rFu3uXfdiWXZMG6DDTQpoNMGHaIdTYloLiYAKURxob8mpJG5oOTUN5NDPptKEtLcy0k04JBHp2JYFc+JX9Id2999zvfPec75y7GzK9WNNFoswYFxUDa4gz4EW3NmQ0vM7EurEpLWNDIPxoWzTWMWJq4tlHBcNQ9aqKCqSKbqJiBYlujsgVvWwFJyCjAsaqhB2Y0TjhU+dKrw+6ZKzrKIl1VxW1ctDFEfClGPDiWqVQ8NT3G7ZryhAwxWNd1DBPiUqCaDKygaiERmRnMUEkifSJSpJSkYPozgHkfqOKlKJwEZaqAUHNELFOyeAQoBxgZ21hWAIIMSFyjo+FVMJUnNNPg2zLuanK89QNkgIATsNiXMI2JqbypyHAnBJQHPw5c4QTeVJGhTVMKAglpWMNywSImCkqbmIFhkgWk0Qvy2G7yimXRiRsR8UEY9fQapiRCY8leyqpGrSP0LKoiLalAnMs/KtIQ5KEpW6DEKmbg7Ed4wSSdAyruqFhJBdNGFiGgCDD1Gw/jJux55ydAhE5e27QZaRUh0QhHra7W2PbQEGyYzA9gK6hoTxYPsufFQfMQAOcJqp5S5crf1CQIqjV2Xs7s86rbmdXzmlq0IUV0z70SpeAVDXlhAuboArJHuqId9mRLdCDGIGeXDZ5lExqIFSxFyvw50D9H5Pcaxz0JJA+6ra9oyjdQIajCUrUy50ZQUwKWHOGQCmeH8pEw0V7bVIFxpBSTznlLad85VRlMUu7OpO2KGBOQkrSBFFOP6uuIkXUhRxaUsoPExpWOGcEu2XkRFc0kCTC8G5RsPHt0rdLMAd7K7J3BqiYSzEYia/FnAFgQ6uHMgJGPGTtR6MC0Q1r3/SuMYE4DoOygSThgYD1UnJAVMuhlBISBDMLdaRgRzFWtgdjlQbmvTid22Xth/RKedlUrNWJMp6vRdpmcudy1q4rGtgqhnUoCiRqGyraUtDeFIp1+4JuZn8/DUkUFQlOR9tHs9Kqs/7z4gUVcT0AQudbp5XObd5XbEN0a6wFcdHYNEikcYI1hjTZ7ztYPK+ZTpCtTLjtTnf5xdvuvG6WdQdengaspxTOGnPK/Mi0zdjQUjRHAMMaZvYV4iOBRAzBGmUZD/MCpFSFbo03pm0Fm/qGUUgGfudkJt+190SbCln8oGTeaB0kxpqMaCJoNUDFsEp5GI+PYv1VjLfK66GeaOkYD+f9dNw1Dy93aEjRE5CL+kLeM5xgKj2Yz4bvmvFJO+NwHJs/NEka96tEx3SelTXeSbfn7iu6oe5gTl400ZJQEQOOW2vSSX3fQH8fz5k8L/T2yUxowOeFWja5xKH8FugqthsgRMu6NeLzhfblVwrBz8JZGZplaIY9ZtcMB1qzD6MSzaB1zMENaaSss+Uy6reFVuNlK71+hmGq7VtDMnkcM+N1RIb06NVwPWGJIP6VfhpaMpZEWYTMOL/521e3Rith89E7DQzSg+GezvgY55kqtoB7BvDtQ9yG8YVCoVfvblSA8oJJiA2+Mt1Kx8VsWI+sH73TIA8xwsr6eH/BnBZ56+y34KUbxRFmWBxKsIEgQkyI82Efw3E86w/G/SwOToQjdBhxAqZjjgCtTN2K1tqWhnA2BuBhQnpE/Oy5GaXd3VyiOy7XiG7Ux3kjamNPq7+1KxmOeMV+vXZRc2OAdCMp1bKiVqrvaYm3Jbs4mg14Ar5KL8N6aNbNuFk3S3ct5hJrcaw2ulQUgn3tOjJF079O8nUo7t7lvqhnqU9Ysra1k0ER1R/he9RwZ0utQeJNOqnrbTUa4mE+EY0FmyJMvSh2VAb6E+FIfEktpBMZQk1FNXyBqNA+9Zp8idBQInSuQLyFAqmmeEcENe7p/bCaWgxfV/Z3TDVUFqgJwz/cezHRwDWt8PlydjvEwOwV+ZrKJe31ZiguxXujvg6mzi+kGtuToc6OZbXrOCWcGIingi19YrNnqRosCkLAH6CZfBz8jC/oqOc29c/I6nAnXVzxdFTNfUZm4CtHEROJdAxrUEFWlpOIyUNr13Aact5eu8I6FORCXDzk5xGfSPh4JkgvgqZZQLvVH0bte8H5nnwqnbur3prx4YIf3lviPKVG+2ryE+a+oXcn9l/Wd37vobI/vfT39x+NpfeenjrUPvxNrax1yz/R774fuXplW9nMLnP9/vHB774bemwqM4s7cWSu92SvcLB9zpVPHjo3seej9UND15Kv7V7+8Y1rV85/tP7TTb8UZsbODPsHf/WPpjObm3d0PfOXxl512Ve6tPHa+yIHr+5YsIluy9KzziwTLp3avlx7e/K3X04+vyD12r9OT8a+82ApO7iT+cUf9v5xV/TY2INvvrN7qqPRc8+cDUePvzm/o/Ho7J+yFzq3z0uX7nxEbKi6dGBe/POdY3U/Hp67UT3SOvLvufNmW5cfW7D++qcHDh9/evfUA5cvP3/8RvnjysUPf794YkQxeh6ewO9v9r1+beB6ZAv7TOfhycDrNQsv3j/1xon5a5a+9+2GSxfeeGRG+LS2fDHVumZzV2BW89dO7Hnh5Pwbdc9uaaC+lJ517/b6rTN/1rc18vYp91PeV78ain5Q/fjTrvGHJ774g6bDz31y7Gb58OzVe7emttX8+cLfxr4+LHpLuB2XD+1qfbHk4xefvGf13vbz72VLG56YX554YMEXDgYXjcwRdtSz2YqNN82xlQdOnkd/vTihn8Qs89/JU//ZteYb3N5m3T0na7x1vmHjqsxVbapsVd2v72/+zbYnIZc3b5aWLAx+7rm+0pKS/wE1Cc+Y

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
eNqdVX1wFOUZT4Si6ScdB6ztWLdRB4Ts3u59X2J0kjsIIV6+LgkxhInv7r57t7n9yn5ccslQhrS10jqQhVahnZHWHJcaQoAYEZEPcQo6WGSs/YNAVbRW2o4VRqfUwVb77OYCycBf3Zm73fd9n/f3fPx+z/sOjmSwboiqUjwmKibWEWfCwLAHR3TcY2HD/HFexmZK5XONDYmWYUsXp5alTFMzyj0epImUqmEFiRSnyp4M4+FSyPTAtyZhFybHqnz2XPGmgVIZGwZKYqO0nFg7UMqp4EsxYVBaI2awQpgpTAiqJKm9opIkBBFLvFFGcDpGJiYQYWDHnoNPVrVMx1qmiE4ljtLY3XptnccmEiXME0jhCTchSAEgKaLVwASGXLNE0vXo+qA6lVoBbLME4nnRCRlJhKZjAfYBnEEgHU/blxGW4fqSCR6KAEFe8wnJGKZuuYUjkEH0YkkC4JVuEuWdytolrGThJWXEkix2MlyyrlNpvO4DLAbWdyqJAhwMS8uIUl2VsFMe8KqXrl8HM7LKY8mZSmom6aMCpGnprOrYKjDLwBuiwEiGgYAkA8OEiWUNKAVDB4umQutHUhjxQPiWXEo1THt8LoV7EcdhQIc4VB5ytPck+0WtDKoqSEDEKGSqYDdPezSNsUYiCWqTn95l70OaJokcctY93YaqjBVoJs2shm9cHnVyI0EUimlPNkAQVbWexixoTSEYyh+m6H19pAF0KhJoh5QQxJPX3PWXZi9oiEsDCFnQsZ2f3jw+20Y17F1xxDUk5kAinUvZu5AuB/3PzZ7XLcUUZWyPRBtvdFdYvO7ORzEMFdo/B9jIKpy9y6XhhTmbsalnSU4FDPu39PhMfSSsJM2UPeyL+H4HgtVAUPhHedhmWsZgDrjAf3htpNBBzzTUzZD4TtHiXAx4sY+s1MUywhsiElgjvLTXTzDBctpf7g8RNfGWsWjBTctNadjfoiPFADWSK2ZoH+FSlpLG/Gj0poQfcQiHbJzwQack7tNUA5OFqOyxdrJ5+uwga2PPTauLVPUkUsR+1619xGW+t7+vl+csnk9lemU60u/3iSy2OGGysEXTVccNBETKhj0cCAfHCysztR+FXGmSoUmaeRHEL3IgNScZTdVN0sAcNKqZtafKZNTn6KzSxwR8QZqmK+Bo4CSLxwmLjakysGNUOG0vqYg/1EdCx2BJlEUgxv0vnISGnQvA5oM3GphqGsOZOeKn3efobAsdO/hOEtdh/JFI5PDNjWagfGASYQKH5loZeHY0jFc2Dt5oUIAYZmRjrG/GnBR5e+peGHT5vH4kRHxCOMiyXj4SoTkOYTbsZYMIIxwO7o2uJKOIS2Ey4QrQHok9Ul8Vr42OJgA8qqppEW89Vzyvq4sTuli5km5j26p6arpjGh1O6aHGSNRfzaKIv0MOrDHZECAkWW/X6jYmoJJMyBvyB3x0OEQyFE0xFEPSRqpeVsOybglBtgf4MDN1PYmGvnAVzQSEuD/ehaPtmYAVXNGbZFYjxU/Ho7hWaOKj3XLrKtWUAu1UMrM6pSZRQ6TaH2+KJ/oTSaATmalKTwUB4hShLpWFFiGhRcjpBvHNNEgFwbsiqKTmHocVxCq46RoUKVsBnQVqwvBGMk6IJq6sVxU89QuogZUR+cpVq9tlwWR6jLZ6bMhKbVWirS5QbVWnOmpws2Vpqe7udJDHrXGam1WEkDdI0oU6BGl/2FXP9dD/z6gOtJOzO55s0Kav9BFFNRRREPIJrEMH2aOcpFo8nOw6zgPnzVWP2JNhLsKxrA8E4vf6OcFLVsOZOYN27XzIOdeCe7dvzDt9pyRPFO+6++e3FbnPPPh9+aXZ9Lpynl54+PPlix84/9hfYk3/WDtU8+baN+ev2PgMvVS8j8lnSj5etnnhZ+9+7dTmX36//z30mG/7jvU7i7+zZsc3tk8835E57lEuffL2mbtf+Hj0C+HYu8f+eezB9z39/UfTh249dfqB+w/2HW9+qOX1rS9daLrrLZu6p+PEB/323k93f6Rb27bEXl109d70IEU9NVX9eftl1tr/Rv2pJ9dtYoOXBxYUXX7w6P33tH4mBPf9agNx18/OLjj94X9KXo5dKWHafr+po9m387WttfbJs2fIarv5QHfv5u8OPT1/0aCVa9944LaJ7z16afIna9bE6r4qb7mlM/rewPy6RV//W+Wli/SVOLW4/PzQ7nWbco2Rkne+Wds8cXHpb/a0Xm5ffmH5yY0lx799tpJ66OIT7f9m36r/08CGV7518f2nf73wxaHbN5xM19Sfk2PLH342t/RW38RP73x5Z8+FL3aefvjxP3/l7WWXhraiK39NJfPb6j+4ejW2bPe/bv/htv82TO5p3PPpJ39f9eH2M02+O8fe+MGrT65c0PTRgeeHF3CPK4enDp5AV+5wuJhX9MfxHU9M3FJU9D/qSetg

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
eNq1VWtsFFUUblMhkEJMCgaJRm4XDQnpbPfR3e1WUWopL4E2to2pBJq7M3d2L525M87cKV2gEFqjAXyNGo2ikUdtmwKlFNAIocQGrQkPf0ACFa1KxWCIRMFIVAiemX0IFPyl82P3zr3nfuc753znTGtnEzFMqrHcnZRxYmCRw4tpt3Ya5DmLmPz5DpXwhCa1V1fV1G63DDo0M8G5bpYVF2OdelVqcgMrXkyLm/zFYgLzYlFTdYW4MO0xTUp+lff9ao9KTBPHiekpQ0tXewxNIbDymEmTE9VThDyiBt4ZdzbrNQthgyDMEGnWicHhj6eJIazENYPyhOpFVUxJZo6QQRTShBlHlMmaoWLXWDY0FfEEQRzMvGiBjJKALWmIaRw1Mm2le9iEFYsgTXYcYs4NGrM4eDcbiYS4lvFQBC64ZTDELEVB4MO9m7WfYaZwvJ6WIvRPgJZJjNvCK1fAT40KMSBqojCSCeGIYwDFTEIJbKKYorkragDaMritahJRnLvpbAsKNuIEfjkUyIGHJEKiMPBzvPq8PmdP0xt0ePPD2sQyadAhG7pDQcaKSVwLTUkXhCd1l69sMTfPDmh2XQYBMay6BtWgltSxREzRoHrawrPgprzjmGZxhJHuGnsdax0bgAACM1044OJUlhLzZvTVHsySVfKtlCBiyuKptGb2nBqkUiMRGVuKE5WzN5pWLRTJQXfq6xQsRclB8zgJbhA1RTP+P9cu/K2+QSmOZ0RlV4JpLoTGE7yBsoabkvSfM5rvekEqwSYoRYJeQWl3LQ6JDKAWW0FEDnsuqKOSBjGhUdE9BFJOPYEIwWpGTC2dCYIlAHqxPaGZ3O65dTTsxqJIdC4QJmoS8Ld3xVdRvQgBX0fD3dAdjLhas7sbCdEFrNAm0u00jwBDg3F7r56EIcQEZ/Q0F/u8gYg3sDPdVILD2+7Fuq5Q0RVg8QrIc0fK6eiDnsw9hbA4T9jbo9Fgl0FMHQYWaeswOfSR2doOVMmxLzrTg2tb1VOZGIdz7mufA7TtQ3MNWoQCEVRDdBTwBUqQP1zmC5UFS9G8xbU7K9Juau9Ib0+tgZkpQ4SVmax0igmLwdTprrhjPj6BBicKhckRS5p0FREMomLK3Jv+aDgSLfHvv93EXdudAZ/77B+NYBJubwuUHLj9BGa/kRREp5gfBgO+UHTI0yzclYCgUgZDMMujf7Stu87apQkduqsd5C5h7/D7ss9Q4b/6d+27o9FoKFwaCYeCgExYk5YULD0lVQHE1AQaFjhVid0OBAIHHYWYpuDoAQY2ZFnRVgrweYlTZm+d+XGz0KgBdhbB0SoTk+7l4L70KUyy5mT2aKtvT3o//fkUqGQPIRyN+kojwUBAxjE55gsQMST7cTgcCIUlMRYI766YK1RgMUGEGld9duec+iXlixdUdNQAa2LY3aKiWRJ0i0E6wPbp8np7X6kYFWNiJBQSff4SyScKT1bV9GZElxVVu9Nq7nd4fUdqenyWu3DapnE57pO3yD7KBmZPqFw35htr4/xxhcd6rrcurHtm4sZjRwpPnsg7fv+GgvPf7qj+80z94/0f7Z41wKsvXDm3ZVP/d6ySvD2p7jxb2bVx+enNdcsuvVb44HB9/uTfZved+vT9ok3jH5rKpYJLWy6re4TIxTXLiL5VzB8Tf31O371vnbOnFY2f8U6owvfupFNnx4082j97V6B0yYZXJoQ8Y49Wb3lzUcHlyOJfBtYO5059+J6zK/p+Hx6RR+p6qk7nH/7y2pWSi3/tPX01tK4iNPDG5p+Cg1yc/Gp8cHnB5M9/fOGBrsq2eU+t/fXcSxMm9lW2rV+kWL2Fa6+0Tew/OD08WP7syNLBAX/LlB+OHui6OHZSB32CXHg5QhPTTz5Wf/2q/+fge+uufRDTZ9BH1vRWVVf2b56VP3S4tu545I/kEa3/6yUnp0DSbtzIyzmxXWk+k5uT8zfUHYmM

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
eNrtVV9v3EQQV8UXWa2QkND5znfn8zVGeYii0iIaFdSChNrK2qzH9jb2rru7zuUa3QOhrzyYTwAkSqqoBR4QL1CJN3jgC4RPw6x91z8hqFV5hJNO55vZmfnNzm9+PjjZBW2EkpceC2lBM27xj/nq4ETD/RqMfXhcgs1Vcnj1yq3DWouzt3NrKxMNBqwSfVMKm/cLJjOeMyH7XJUDIVN1tK2S+a8nObAE0z88/cSA9jYykLb50Z1u47xqPvD7w/5wdPn7Dc6hst4VyVUiZNY8yR6IqkcSSAtm4bhzNz+wqioEZw7j4J5R8nRTSQkt5uZ0B6DyWCF24ZEGU2Eb8MWxsczW5uAI88Ifv5+UYAzL4NsbH67AfXmyUVjv5i5vzvr5eJ1GQTCm75GSrY8mayPf93v52ButXeA4Iw6WMR6CsFoV3kZRqJm3qSHBRgUrTHNkdQ2/XHjsWle++ebdxxwdGOHZeQV/7/HnC8NvaJEJ2Xz90znvFttzF90chr5/ceGtdp6u8NNz/it7lTLwArJjHBvyozmpdwVXWh4lOIzm6fta9MhoSm5CRUb+KCDDMBqOo0lIrm7dOvxUsOYUp0oypbICnnDGc/B4V6N5JJXXWr7bXHZ9HWRm8+YwmExa2nyOM9PIgT8v/bZPl+ykEfX70/54jfYoXg7gaGPYq4Rurym2ogQaybooenSbWZ7HGI/kjbFqKjIa7VPDWQFxXcX3jXgAMVbIMtA0GroJP/dKm2ts38SFQIqiO1w5EzWTsYSysvPn0QF6XbrV6TbXM0O8PbdgaDTy16bDychf9KiQSEjJIUZeZ8YBw6XAtbMQMxHjxul5DJJtF5DQyJGnR5XOYo6g2k4TYZbOFPmFXpOrWWxtEddiFWBxi7FDATpO6uUNJWzeViuUzNyGYIKgBZsrbZeGYYAADTCN93cOw0zpHVO5tIarCmKHSchd0ba3QjKOjVUat+vl6MXin8Vk/VVigl+0moEuygGm9iqtcAIDJwrG/q8y/0WVmf4rlbkcBC+rzFvX92nHsjhnJkelmfhBMGLpcDyGcDiZhjANJuOQh5NJyCGFYcr4MJhylvjjURqMp9Pt0OfBOISQJ3w7BNSokkmRIkPdygncg9v0Ga3R25HY4BNaLP5s4s9HrfEWCozjIr2LQsdxJ3GdcV6ICltDxDXHFcOInRnTnX4suYbPt1+r1rUawW11QW9as0v6quaWp3r0TcvYVUREP1M1YRoIk4QZI5yIWpIqTVpdQRJ7TJoZuIkSy8yO6RNUA2JzwFOOkM5RCUAmEpUSDTh8QNUj7VbsWWIV6TK0MausffJBSuZYO1HyHUt2pJq1/u5oj9yrjSWGzdHI7LmDKwQagBhwLHTFS7YnyrrEDAlxUvJCOoeFCwP9O/LjZf2I7K+gLMgdudmBResStjNutMERdS+XqrbxLtPCya9jBF1Fu/l3Ie76Vxcb4w2WyIqIpl63DnSBn7uvnWqBbwzYY5itPXN38RcRsNwq

View File

@@ -451,8 +451,7 @@ steps of the thought-process and explore other directions from there. To verify
the effectiveness of the proposed technique, we implemented a ToT-based solver
for the Sudoku Puzzle. Experimental results show that the ToT framework can
significantly increase the success rate of Sudoku puzzle solving. Our
implementation of the ToT-based Sudoku solver is available on GitHub:
\url{https://github.com/jieyilong/tree-of-thought-puzzle-solver}.
implementation of the ToT-based Sudoku solver is available on [GitHub](https://github.com/jieyilong/tree-of-thought-puzzle-solver).
## Plan-and-Solve Prompting: Improving Zero-Shot Chain-of-Thought Reasoning by Large Language Models

View File

@@ -0,0 +1,40 @@
# Agents
By themselves, language models can't take actions - they just output text.
A big use case for LangChain is creating **agents**.
Agents are systems that use an LLM as a reasoning engine to determine which actions to take and what the inputs to those actions should be.
The results of those actions can then be fed back into the agent and it determine whether more actions are needed, or whether it is okay to finish.
[LangGraph](https://github.com/langchain-ai/langgraph) is an extension of LangChain specifically aimed at creating highly controllable and customizable agents.
Please check out that documentation for a more in depth overview of agent concepts.
There is a legacy `agent` concept in LangChain that we are moving towards deprecating: `AgentExecutor`.
AgentExecutor was essentially a runtime for agents.
It was a great place to get started, however, it was not flexible enough as you started to have more customized agents.
In order to solve that we built LangGraph to be this flexible, highly-controllable runtime.
If you are still using AgentExecutor, do not fear: we still have a guide on [how to use AgentExecutor](/docs/how_to/agent_executor).
It is recommended, however, that you start to transition to LangGraph.
In order to assist in this, we have put together a [transition guide on how to do so](/docs/how_to/migrate_agent).
## ReAct agents
<span data-heading-keywords="react,react agent"></span>
One popular architecture for building agents is [**ReAct**](https://arxiv.org/abs/2210.03629).
ReAct combines reasoning and acting in an iterative process - in fact the name "ReAct" stands for "Reason" and "Act".
The general flow looks like this:
- The model will "think" about what step to take in response to an input and any previous observations.
- The model will then choose an action from available tools (or choose to respond to the user).
- The model will generate arguments to that tool.
- The agent runtime (executor) will parse out the chosen tool and call it with the generated arguments.
- The executor will return the results of the tool call back to the model as an observation.
- This process repeats until the agent chooses to respond.
There are general prompting based implementations that do not require any model-specific features, but the most
reliable implementations use features like [tool calling](/docs/how_to/tool_calling/) to reliably format outputs
and reduce variance.
Please see the [LangGraph documentation](https://langchain-ai.github.io/langgraph/) for more information,
or [this how-to guide](/docs/how_to/migrate_agent/) for specific information on migrating to LangGraph.

View File

@@ -0,0 +1,59 @@
import ThemedImage from '@theme/ThemedImage';
import useBaseUrl from '@docusaurus/useBaseUrl';
In this section, you'll find explanations of the key concepts, providing a deeper understanding of core principles.
The conceptual guide will not cover step-by-step instructions or specific implementation details — those are found in the [How-To Guides](/docs/how_to/) and [Tutorials](/docs/tutorials) sections. For detailed reference material, please visit the [API Reference](https://python.langchain.com/api_reference/).
## Architecture
LangChain as a framework consists of a number of packages.
### `langchain-core`
This package contains base abstractions of different components and ways to compose them together.
The interfaces for core components like LLMs, vector stores, retrievers and more are defined here.
No third party integrations are defined here.
The dependencies are kept purposefully very lightweight.
### `langchain`
The main `langchain` package contains chains, agents, and retrieval strategies that make up an application's cognitive architecture.
These are NOT third party integrations.
All chains, agents, and retrieval strategies here are NOT specific to any one integration, but rather generic across all integrations.
### `langchain-community`
This package contains third party integrations that are maintained by the LangChain community.
Key partner packages are separated out (see below).
This contains all integrations for various components (LLMs, vector stores, retrievers).
All dependencies in this package are optional to keep the package as lightweight as possible.
### Partner packages
While the long tail of integrations is in `langchain-community`, we split popular integrations into their own packages (e.g. `langchain-openai`, `langchain-anthropic`, etc).
This was done in order to improve support for these important integrations.
### [`langgraph`](https://langchain-ai.github.io/langgraph)
`langgraph` is an extension of `langchain` aimed at
building robust and stateful multi-actor applications with LLMs by modeling steps as edges and nodes in a graph.
LangGraph exposes high level interfaces for creating common types of agents, as well as a low-level API for composing custom flows.
### [`langserve`](/docs/langserve)
A package to deploy LangChain chains as REST APIs. Makes it easy to get a production ready API up and running.
### [LangSmith](https://docs.smith.langchain.com)
A developer platform that lets you debug, test, evaluate, and monitor LLM applications.
<ThemedImage
alt="Diagram outlining the hierarchical organization of the LangChain framework, displaying the interconnected parts across multiple layers."
sources={{
light: useBaseUrl('/svg/langchain_stack_062024.svg'),
dark: useBaseUrl('/svg/langchain_stack_062024_dark.svg'),
}}
title="LangChain Framework Overview"
style={{ width: "100%" }}
/>

View File

@@ -0,0 +1,83 @@
# Async Programming with LangChain
:::info Prerequisites
* [Runnable Interface](/docs/concepts/runnables)
* [asyncio documentation](https://docs.python.org/3/library/asyncio.html)
:::
## Overview
LLM based applications often involve a lot of I/O-bound operations, such as making API calls to language models, databases, or other services. Asynchronous programming (or async programming) is a paradigm that allows a program to perform multiple tasks concurrently without blocking the execution of other tasks, improving efficiency and responsiveness, particularly in I/O-bound operations.
:::note
You are expected to be familiar with asynchronous programming in Python before reading this guide. If you are not, please find appropriate resources online to learn how to program asynchronously in Python.
This guide specifically focuses on what you need to know to work with LangChain in an asynchronous context, assuming that you are already familiar with asynch
:::
## LangChain Asynchronous APIs
Many LangChain APIs are designed to be asynchronous, allowing you to build efficient and responsive applications.
Typically, any method that may perform I/O operations (e.g., making API calls, reading files) will have an asynchronous counterpart.
In LangChain, async implementations are located in the same classes as their synchronous counterparts, with the asynchronous methods having an "a" prefix. For example, the synchronous `invoke` method has an asynchronous counterpart called `ainvoke`.
Many components of LangChain implement the [Runnable Interface](/docs/concepts/runnables), which includes support for asynchronous execution. This means that you can run Runnables asynchronously using the `await` keyword in Python.
```python
await some_runnable.ainvoke(some_input)
```
Other components like [Embedding Models](/docs/concepts/embedding_models) and [VectorStore](/docs/concepts/vectorstores) that do not implement the [Runnable Interface](/docs/concepts/runnables) usually still follow the same rule and include the asynchronous version of method in the same class with an "a" prefix.
For example,
```python
await some_vectorstore.aadd_documents(documents)
```
Runnables created using the [LangChain Expression Language (LCEL)](/docs/concepts/lcel) can also be run asynchronously as they implement
the full [Runnable Interface](/docs/concepts/runnables).
Fore more information, please review the [API reference](https://python.langchain.com/api_reference/) for the specific component you are using.
## Delegation to Sync Methods
Most popular LangChain integrations implement asynchronous support of their APIs. For example, the `ainvoke` method of many ChatModel implementations uses the `httpx.AsyncClient` to make asynchronous HTTP requests to the model provider's API.
When an asynchronous implementation is not available, LangChain tries to provide a default implementation, even if it incurs
a **slight** overhead.
By default, LangChain will delegate the execution of a unimplemented asynchronous methods to the synchronous counterparts. LangChain almost always assumes that the synchronous method should be treated as a blocking operation and should be run in a separate thread.
This is done using [asyncio.loop.run_in_executor](https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.run_in_executor) functionality provided by the `asyncio` library. LangChain uses the default executor provided by the `asyncio` library, which lazily initializes a thread pool executor with a default number of threads that is reused in the given event loop. While this strategy incurs a slight overhead due to context switching between threads, it guarantees that every asynchronous method has a default implementation that works out of the box.
## Performance
Async code in LangChain should generally perform relatively well with minimal overhead out of the box, and is unlikely
to be a bottleneck in most applications.
The two main sources of overhead are:
1. Cost of context switching between threads when [delegating to synchronous methods](#delegation-to-sync-methods). This can be addressed by providing a native asynchronous implementation.
2. In [LCEL](/docs/concepts/lcel) any "cheap functions" that appear as part of the chain will be either scheduled as tasks on the event loop (if they are async) or run in a separate thread (if they are sync), rather than just be run inline.
The latency overhead you should expect from these is between tens of microseconds to a few milliseconds.
A more common source of performance issues arises from users accidentally blocking the event loop by calling synchronous code in an async context (e.g., calling `invoke` rather than `ainvoke`).
## Compatibility
LangChain is only compatible with the `asyncio` library, which is distributed as part of the Python standard library. It will not work with other async libraries like `trio` or `curio`.
In Python 3.9 and 3.10, [asyncio's tasks](https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task) did not
accept a `context` parameter. Due to this limitation, LangChain cannot automatically propagate the `RunnableConfig` down the call chain
in certain scenarios.
If you are experiencing issues with streaming, callbacks or tracing in async code and are using Python 3.9 or 3.10, this is a likely cause.
Please read [Propagation RunnableConfig](/docs/concepts/runnables#propagation-runnableconfig) for more details to learn how to propagate the `RunnableConfig` down the call chain manually (or upgrade to Python 3.11 where this is no longer an issue).
## How to use in IPython and Jupyter Notebooks
As of IPython 7.0, IPython supports asynchronous REPLs. This means that you can use the `await` keyword in the IPython REPL and Jupyter Notebooks without any additional setup. For more information, see the [IPython blog post](https://blog.jupyter.org/ipython-7-0-async-repl-a35ce050f7f7).

View File

@@ -0,0 +1,21 @@
# Callbacks
:::note Pre-requisites
- [Runnable interface](/docs/concepts/#runnable-interface)
:::
The lowest level way to stream outputs from LLMs in LangChain is via the [callbacks](/docs/concepts/#callbacks) system. You can pass a
callback handler that handles the [`on_llm_new_token`](https://python.langchain.com/api_reference/langchain/callbacks/langchain.callbacks.streaming_aiter.AsyncIteratorCallbackHandler.html#langchain.callbacks.streaming_aiter.AsyncIteratorCallbackHandler.on_llm_new_token) event into LangChain components. When that component is invoked, any
[LLM](/docs/concepts/#llms) or [chat model](/docs/concepts/#chat-models) contained in the component calls
the callback with the generated token. Within the callback, you could pipe the tokens into some other destination, e.g. a HTTP response.
You can also handle the [`on_llm_end`](https://python.langchain.com/api_reference/langchain/callbacks/langchain.callbacks.streaming_aiter.AsyncIteratorCallbackHandler.html#langchain.callbacks.streaming_aiter.AsyncIteratorCallbackHandler.on_llm_end) event to perform any necessary cleanup.
You can see [this how-to section](/docs/how_to/#callbacks) for more specifics on using callbacks.
Callbacks were the first technique for streaming introduced in LangChain. While powerful and generalizable,
they can be unwieldy for developers. For example:
- You need to explicitly initialize and manage some aggregator or other stream to collect results.
- The execution order isn't explicitly guaranteed, and you could theoretically have a callback run after the `.invoke()` method finishes.
- Providers would often make you pass an additional parameter to stream outputs instead of returning them all at once.
- You would often ignore the result of the actual model call in favor of callback results.

View File

@@ -0,0 +1,46 @@
# Chat History
:::info Prerequisites
- [Messages](/docs/concepts/messages)
- [Chat Models](/docs/concepts/chat_models)
- [Tool Calling](/docs/concepts/tool_calling)
:::
## Overview
Chat history is a record of the conversation between the user and the chat model. It is used to maintain context and state throughout the conversation. The chat history is sequence of [messages](/docs/concepts/messages), each of which is associated with a specific [role](/docs/concepts/messages#role), such as "user", "assistant", "system", or "tool".
## Conversation Patterns
Most conversations start with a **system message** that sets the context for the conversation. This is followed by a **user message** containing the user's input, and then an **assistant message** containing the model's response.
The **assistant** may respond directly to the user or if configured with tools request that a [tool](/docs/concepts/tool_calling) be invoked to perform a specific task.
So a full conversation often involves a combination of two patterns of alternating messages:
1. The **user** and the **assistant** representing a back-and-forth conversation.
2. The **assistant** and **tool messages** representing an ["agentic" workflow](/docs/concepts/agents) where the assistant is invoking tools to perform specific tasks.
## Managing Chat History
Since chat models have a maximum limit on input size, it's important to manage chat history and trim it as needed to avoid exceeding the [context window](/docs/concepts/chat_models#context_window).
While processing chat history, it's essential to preserve a correct conversation structure.
Key guidelines for managing chat history:
- The conversation should follow one of these structures:
- The first message is either a "user" message or a "system" message, followed by a "user" and then an "assistant" message.
- The last message should be either a "user" message or a "tool" message containing the result of a tool call.
- When using [tool calling](/docs/concepts/tool_calling), a "tool" message should only follow an "assistant" message that requested the tool invocation.
:::tip
Understanding correct conversation structure is essential for being able to properly implement
[memory](https://langchain-ai.github.io/langgraph/concepts/memory/) in chat models.
:::
## Related Resources
- [How to Trim Messages](https://python.langchain.com/docs/how_to/trim_messages/)
- [Memory Guide](https://langchain-ai.github.io/langgraph/concepts/memory/) for information on implementing short-term and long-term memory in chat models using [LangGraph](https://langchain-ai.github.io/langgraph/).

View File

@@ -0,0 +1,162 @@
# Chat Models
## Overview
Large Language Models (LLMs) are advanced machine learning models that excel in a wide range of language-related tasks such as text generation, translation, summarization, question answering, and more, without needing task-specific tuning for every scenario.
Modern LLMs are typically accessed through a chat model interface that takes [messages](/docs/concepts/messages) as input and returns [messages](/docs/concepts/messages) as output.
The newest generation of chat models offer additional capabilities:
* [Tool Calling](/docs/concepts#tool-calling): Many popular chat models offer a native [tool calling](/docs/concepts#tool-calling) API. This API allows developers to build rich applications that enable AI to interact with external services, APIs, and databases. Tool calling can also be used to extract structured information from unstructured data and perform various other tasks.
* [Multimodality](/docs/concepts/multimodality): The ability to work with data other than text; for example, images, audio, and video.
## Features
LangChain provides a consistent interface for working with chat models from different providers while offering additional features for monitoring, debugging, and optimizing the performance of applications that use LLMs.
* Integrations with many chat model providers (e.g., Anthropic, OpenAI, Ollama, Cohere, Hugging Face, Groq, Microsoft Azure, Google Vertex, Amazon Bedrock). Please see [chat model integrations](/docs/integrations/chat/) for an up-to-date list of supported models.
* Use either LangChain's [messages](/docs/concepts/messages) format or OpenAI format.
* Standard [tool calling API](/docs/concepts#tool-calling): standard interface for binding tools to models, accessing tool call requests made by models, and sending tool results back to the model.
* Standard API for structuring outputs (/docs/concepts/structured_outputs) via the `with_structured_output` method.
* Provides support for [async programming](/docs/concepts/async), [efficient batching](/docs/concepts/runnables#batch), [a rich streaming API](/docs/concepts/streaming).
* Integration with [LangSmith](https://docs.smith.langchain.com) for monitoring and debugging production-grade applications based on LLMs.
* Additional features like standardized [token usage](/docs/concepts/messages#token_usage), [rate limiting](#rate-limiting), [caching](#cache) and more.
## Available Integrations
LangChain has many chat model integrations that allow you to use a wide variety of models from different providers.
These integrations are one of two types:
1. **Official Models**: These are models that are officially supported by LangChain and/or model provider. You can find these models in the `langchain-<provider>` packages.
2. **Community Models**: There are models that are mostly contributed and supported by the community. You can find these models in the `langchain-community` package.
LangChain chat models are named with a convention that prefixes "Chat" to their class names (e.g., `ChatOllama`, `ChatAnthropic`, `ChatOpenAI`, etc.).
Please review the [chat model integrations](/docs/integrations/chat/) for a list of supported models.
:::note
Models that do **not** include the prefix "Chat" in their name or include "LLM" as a suffix in their name typically refer to older models that do not follow the chat model interface and instead use an interface that takes a string as input and returns a string as output.
:::
## Interface
LangChain chat models implement the [BaseChatModel](https://python.langchain.com/api_reference/core/language_models/langchain_core.language_models.chat_models.BaseChatModel.html) interface. Because [BaseChatModel] also implements the [Runnable Interface](/docs/concepts/runnables), chat models support a [standard streaming interface](/docs/concepts/streaming), [async programming](/docs/concepts/async), optimized [batching](/docs/concepts/runnables#batch), and more. Please see the [Runnable Interface](/docs/concepts/runnables) for more details.
Many of the key methods of chat models operate on [messages](/docs/concepts/messages) as input and return messages as output.
Chat models offer a standard set of parameters that can be used to configure the model. These parameters are typically used to control the behavior of the model, such as the temperature of the output, the maximum number of tokens in the response, and the maximum time to wait for a response. Please see the [standard parameters](#standard-parameters) section for more details.
### Key Methods
The key methods of a chat model are:
1. **invoke**: The primary method for interacting with a chat model. It takes a list of [messages](/docs/concepts/messages) as input and returns a list of messages as output.
2. **stream**: A method that allows you to stream the output of a chat model as it is generated.
3. **batch**: A method that allows you to batch multiple requests to a chat model together for more efficient processing.
4. **bind_tools**: A method that allows you to bind a tool to a chat model for use in the model's execution context.
5. **with_structured_output**: A wrapper around the `invoke` method for models that natively support [structured output](/docs/concepts#structured_output).
Other important methods can be found in the [BaseChatModel API Reference](https://python.langchain.com/api_reference/core/language_models/langchain_core.language_models.chat_models.BaseChatModel.html).
### Inputs and Outputs
Modern LLMs are typically accessed through a chat model interface that takes [messages](/docs/concepts/messages) as input and returns [messages](/docs/concepts/messages) as output. Messages are typically associated with a role (e.g., "system", "human", "assistant") and one or more content blocks that contain text or potentially multimodal data (e.g., images, audio, video).
LangChain supports two message formats to interact with chat models:
1. **LangChain Message Format**: LangChain's own message format, which is used by default and is used internally by LangChain.
2. **OpenAI's Message Format**: OpenAI's message format.
### Standard Parameters
Many chat models have standardized parameters that can be used to configure the model:
| Parameter | Description |
|----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `model` | The name or identifier of the specific AI model you want to use (e.g., `"gpt-3.5-turbo"` or `"gpt-4"`). |
| `temperature` | Controls the randomness of the model's output. A higher value (e.g., 1.0) makes responses more creative, while a lower value (e.g., 0.1) makes them more deterministic and focused. |
| `timeout` | The maximum time (in seconds) to wait for a response from the model before canceling the request. Ensures the request doesnt hang indefinitely. |
| `max_tokens` | Limits the total number of tokens (words and punctuation) in the response. This controls how long the output can be. |
| `stop` | Specifies stop sequences that indicate when the model should stop generating tokens. For example, you might use specific strings to signal the end of a response. |
| `max_retries` | The maximum number of attempts the system will make to resend a request if it fails due to issues like network timeouts or rate limits. |
| `api_key` | The API key required for authenticating with the model provider. This is usually issued when you sign up for access to the model. |
| `base_url` | The URL of the API endpoint where requests are sent. This is typically provided by the model's provider and is necessary for directing your requests. |
| `rate_limiter` | An optional [BaseRateLimiter](https://python.langchain.com/api_reference/core/rate_limiters/langchain_core.rate_limiters.BaseRateLimiter.html#langchain_core.rate_limiters.BaseRateLimiter) to space out requests to avoid exceeding rate limits. See [rate-limiting](#rate-limiting) below for more details. |
Some important things to note:
- Standard parameters only apply to model providers that expose parameters with the intended functionality. For example, some providers do not expose a configuration for maximum output tokens, so max_tokens can't be supported on these.
- Standard params are currently only enforced on integrations that have their own integration packages (e.g. `langchain-openai`, `langchain-anthropic`, etc.), they're not enforced on models in ``langchain-community``.
ChatModels also accept other parameters that are specific to that integration. To find all the parameters supported by a ChatModel head to the [API reference](https://python.langchain.com/api_reference/) for that model.
## Tool Calling
Chat models can call [tools](/docs/concepts/tools) to perform tasks such as fetching data from a database, making API requests, or running custom code. Please
see the [tool calling](/docs/concepts#tool-calling) guide for more information.
## Structured Outputs
Chat models can be requested to respond in a particular format (e.g., JSON or matching a particular schema). This feature is extremely
useful for information extraction tasks. Please read more about
the technique in the [structured outputs](/docs/concepts#structured_output) guide.
## Multimodality
Large Language Models (LLMs) are not limited to processing text. They can also be used to process other types of data, such as images, audio, and video. This is known as [multimodality](/docs/concepts/multimodality).
Currently, only some LLMs support multimodal inputs, and almost none support multimodal outputs. Please consult the specific model documentation for details.
## Context Window
A chat model's context window refers to the maximum size of the input sequence the model can process at one time. While the context windows of modern LLMs are quite large, they still present a limitation that developers must keep in mind when working with chat models.
If the input exceeds the context window, the model may not be able to process the entire input and could raise an error. In conversational applications, this is especially important because the context window determines how much information the model can "remember" throughout a conversation. Developers often need to manage the input within the context window to maintain a coherent dialogue without exceeding the limit. For more details on handling memory in conversations, refer to the [memory](https://langchain-ai.github.io/langgraph/concepts/memory/).
The size of the input is measured in [tokens](/docs/concepts/tokens) which are the unit of processing that the model uses.
## Advanced Topics
### Rate-limiting
Many chat model providers impose a limit on the number of requests that can be made in a given time period.
If you hit a rate limit, you will typically receive a rate limit error response from the provider, and will need to wait before making more requests.
You have a few options to deal with rate limits:
1. Try to avoid hitting rate limits by spacing out requests: Chat models accept a `rate_limiter` parameter that can be provided during initialization. This parameter is used to control the rate at which requests are made to the model provider. Spacing out the requests to a given model is a particularly useful strategy when benchmarking models to evaluate their performance. Please see the [how to handle rate limits](https://python.langchain.com/docs/how_to/chat_model_rate_limiting/) for more information on how to use this feature.
2. Try to recover from rate limit errors: If you receive a rate limit error, you can wait a certain amount of time before retrying the request. The amount of time to wait can be increased with each subsequent rate limit error. Chat models have a `max_retries` parameter that can be used to control the number of retries. See the [standard parameters](#standard-parameters) section for more information.
3. Fallback to another chat model: If you hit a rate limit with one chat model, you can switch to another chat model that is not rate-limited.
### Caching
Chat model APIs can be slow, so a natural question is whether to cache the results of previous conversations. Theoretically, caching can help improve performance by reducing the number of requests made to the model provider. In practice, caching chat model responses is a complex problem and should be approached with caution.
The reason is that getting a cache hit is unlikely after the first or second interaction in a conversation if relying on caching the **exact** inputs into the model. For example, how likely do you think that multiple conversations start with the exact same message? What about the exact same three messages?
An alternative approach is to use semantic caching, where you cache responses based on the meaning of the input rather than the exact input itself. This can be effective in some situations, but not in others.
A semantic cache introduces a dependency on another model on the critical path of your application (e.g., the semantic cache may rely on an [embedding model](/docs/concepts/embedding_models) to convert text to a vector representation), and it's not guaranteed to capture the meaning of the input accurately.
However, there might be situations where caching chat model responses is beneficial. For example, if you have a chat model that is used to answer frequently asked questions, caching responses can help reduce the load on the model provider and improve response times.
Please see the [how to cache chat model responses](/docs/how_to/#chat-model-caching) guide for more details.
## Related Resources
* How-to guides on using chat models: [how-to guides](/docs/how_to/#chat-models).
* List of supported chat models: [chat model integrations](/docs/integrations/chat/).
### Conceptual guides
* [Messages](/docs/concepts/messages)
* [Tool calling](/docs/concepts#tool-calling)
* [Multimodality](/docs/concepts/multimodality)
* [Structured outputs](/docs/concepts#structured_output)
* [Tokens](/docs/concepts/tokens)

View File

@@ -0,0 +1,165 @@
# Embedding models
<span data-heading-keywords="embedding,embeddings"></span>
:::info[Prerequisites]
* [Documents](/docs/concepts/retrievers/#interface)
:::
:::info[Note]
This conceptual overview focuses on text-based embedding models.
Embedding models can also be [multimodal](/docs/concepts/multimodality) though such models are not currently supported by LangChain.
:::
## Overview
Imagine being able to capture the essence of any text - a tweet, document, or book - in a single, compact representation.
This is the power of embedding models, which lie at the heart of many retrieval systems.
Embedding models transform human language into a format that machines can understand and compare with speed and accuracy.
These models take text as input and produce a fixed-length array of numbers, a numerical fingerprint of the text's semantic meaning.
Embeddings allow search system to find relevant documents not just based on keyword matches, but on semantic understanding.
## Key concepts
![Conceptual Overview](/img/embeddings_concept.png)
(1) **Embed text as a vector**: Embeddings transform text into a numerical vector representation.
(2) **Measure similarity**: Embedding vectors can be comparing using simple mathematical operations.
## Embedding data
### Historical context
The landscape of embedding models has evolved significantly over the years.
A pivotal moment came in 2018 when Google introduced [BERT (Bidirectional Encoder Representations from Transformers)](https://www.nvidia.com/en-us/glossary/bert/).
BERT applied transformer models to embed text as a simple vector representation, which lead to unprecedented performance across various NLP tasks.
However, BERT wasn't optimized for generating sentence embeddings efficiently.
This limitation spurred the creation of [SBERT (Sentence-BERT)](https://www.sbert.net/examples/training/sts/README.html), which adapted the BERT architecture to generate semantically rich sentence embeddings, easily comparable via similarity metrics like cosine similarity, dramatically reduced the computational overhead for tasks like finding similar sentences.
Today, the embedding model ecosystem is diverse, with numerous providers offering their own implementations.
To navigate this variety, researchers and practitioners often turn to benchmarks like the Massive Text Embedding Benchmark (MTEB) [here](https://huggingface.co/blog/mteb) for objective comparisons.
:::info[Further reading]
* See the [seminal BERT paper](https://arxiv.org/abs/1810.04805).
* See Cameron Wolfe's [excellent review](https://cameronrwolfe.substack.com/p/the-basics-of-ai-powered-vector-search?utm_source=profile&utm_medium=reader2) of embedding models.
* See the [Massive Text Embedding Benchmark (MTEB)](https://huggingface.co/blog/mteb) leaderboard for a comprehensive overview of embedding models.
:::
### LangChain Interface
Today, there are [many different embedding models](/docs/integrations/text_embedding/).
LangChain provides a universal interface for working with them, providing standard methods for common operations.
This common interface simplifies interaction with various embedding providers through two central methods:
- `embed_documents`: For embedding multiple texts (documents)
- `embed_query`: For embedding a single text (query)
This distinction is important, as some providers employ different embedding strategies for documents (which are to be searched) versus queries (the search input itself).
To illustrate, here's a practical example using LangChain's `.embed_documents` method to embed a list of strings:
```python
from langchain_openai import OpenAIEmbeddings
embeddings_model = OpenAIEmbeddings()
embeddings = embeddings_model.embed_documents(
[
"Hi there!",
"Oh, hello!",
"What's your name?",
"My friends call me World",
"Hello World!"
]
)
len(embeddings), len(embeddings[0])
(5, 1536)
```
For convenience, you can also use the `embed_query` method to embed a single text:
```python
query_embedding = embeddings_model.embed_query("What is the meaning of life?")
```
:::info[Further reading]
* See the full list of [LangChain embedding model integrations](/docs/integrations/text_embedding/).
* See these [how-to guides](/docs/how_to/embed_text) for working with embedding models.
:::
## Measure similarity
Each embedding is essentially a set of coordinates in a vast, abstract space.
In this space, the position of each point (embedding) reflects the meaning of its corresponding text.
Just as similar words might be close to each other in a thesaurus, similar concepts end up close to each other in this embedding space.
This allows for intuitive comparisons between different pieces of text.
By reducing text to these numerical representations, we can use simple mathematical operations to quickly measure how alike two pieces of text are, regardless of their original length or structure.
Some common similarity metrics include:
- **Cosine Similarity**: Measures the cosine of the angle between two vectors.
- **Euclidean Distance**: Measures the straight-line distance between two points.
- **Dot Product**: Measures the projection of one vector onto another.
As an example, any two embedded texts can be compared with cosine_similarity:
```python
import numpy as np
def cosine_similarity(vec1, vec2):
dot_product = np.dot(vec1, vec2)
norm_vec1 = np.linalg.norm(vec1)
norm_vec2 = np.linalg.norm(vec2)
return dot_product / (norm_vec1 * norm_vec2)
similarity = cosine_similarity(query_result, document_result)
print("Cosine Similarity:", similarity)
```
:::info[Further reading]
* See Simon Willisons [nice blog post and video](https://simonwillison.net/2023/Oct/23/embeddings/) on embeddings and similarity metrics.
* See [this documentation](https://developers.google.com/machine-learning/clustering/dnn-clustering/supervised-similarity) from Google on similarity metrics to consider with embeddings.
* See Pinecone's [blog post](https://www.pinecone.io/learn/vector-similarity/) on similarity metrics.
* See OpenAI's [FAQ](https://platform.openai.com/docs/guides/embeddings/faq) on what similarity metric to use with OpenAI embeddings.
:::
## Advanced
### Embedding with higher granularity
![](/img/embeddings_colbert.png)
Embedding models compress text into fixed-length (vector) representations, which can put a heavy burden on that single vector to capture the semantic nuance and detail of the document.
In some cases, irrelevant or redundant content can dilute the semantic usefulness of the embedding.
[ColBERT](https://arxiv.org/abs/2004.12832) (Contextualized Late Interaction over BERT) is an innovative approach to address this limitation by using higher granularity embeddings.
Here's how ColBERT works:
- **Token-level embeddings**: Produce contextually influenced embeddings for each token in the document and the query.
- **MaxSim operation**: For each query token, compute its maximum similarity with all document tokens.
- **Aggregation**: The final relevance score is obtained by summing these maximum similarities across all query tokens.
This token-wise scoring can yield strong results, especially for tasks requiring precise matching or handling longer documents.
Key advantages of ColBERT:
- **Improved accuracy**: Token-level interactions can capture more nuanced relationships between query and document.
- **Interpretability**: The token-level matching allows for easier interpretation of why a document was considered relevant.
However, ColBERT does come with some trade-offs:
- **Increased computational cost**: Processing and storing token-level embeddings requires more resources.
- **Complexity**: Implementing and optimizing ColBERT can be more challenging than simpler embedding models.
| Name | When to use | Description |
|----------------------------------------------------------------------------------|------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [ColBERT](/docs/integrations/providers/ragatouille/#using-colbert-as-a-reranker) | When higher granularity embeddings are needed. | ColBERT uses contextually influenced embeddings for each token in the document and query to get a granular query-document similarity score. [Paper](https://arxiv.org/abs/2112.01488). |
:::tip
See our RAG from Scratch video on [ColBERT](https://youtu.be/cN6S0Ehm7_8?feature=shared>).
:::

View File

@@ -1,134 +1,32 @@
---
sidebar_position: 0
sidebar_class_name: hidden
---
# Conceptual guide
import ThemedImage from '@theme/ThemedImage';
import useBaseUrl from '@docusaurus/useBaseUrl';
In this section, you'll find explanations of the key concepts, providing a deeper understanding of core principles.
This section contains introductions to key parts of LangChain.
The conceptual guide will not cover step-by-step instructions or specific implementation details — those are found in the [How-To Guides](/docs/how_to/) and [Tutorials](/docs/tutorials) sections. For detailed reference material, please visit the [API Reference](https://python.langchain.com/api_reference/).
## Architecture
LangChain as a framework consists of a number of packages.
* Conceptual Guide: [LangChain Architecture](/docs/concepts/architecture)
### `langchain-core`
This package contains base abstractions of different components and ways to compose them together.
The interfaces for core components like LLMs, vector stores, retrievers and more are defined here.
No third party integrations are defined here.
The dependencies are kept purposefully very lightweight.
### `langchain`
The main `langchain` package contains chains, agents, and retrieval strategies that make up an application's cognitive architecture.
These are NOT third party integrations.
All chains, agents, and retrieval strategies here are NOT specific to any one integration, but rather generic across all integrations.
### `langchain-community`
This package contains third party integrations that are maintained by the LangChain community.
Key partner packages are separated out (see below).
This contains all integrations for various components (LLMs, vector stores, retrievers).
All dependencies in this package are optional to keep the package as lightweight as possible.
### Partner packages
While the long tail of integrations is in `langchain-community`, we split popular integrations into their own packages (e.g. `langchain-openai`, `langchain-anthropic`, etc).
This was done in order to improve support for these important integrations.
### [`langgraph`](https://langchain-ai.github.io/langgraph)
`langgraph` is an extension of `langchain` aimed at
building robust and stateful multi-actor applications with LLMs by modeling steps as edges and nodes in a graph.
LangGraph exposes high level interfaces for creating common types of agents, as well as a low-level API for composing custom flows.
### [`langserve`](/docs/langserve)
A package to deploy LangChain chains as REST APIs. Makes it easy to get a production ready API up and running.
### [LangSmith](https://docs.smith.langchain.com)
A developer platform that lets you debug, test, evaluate, and monitor LLM applications.
<ThemedImage
alt="Diagram outlining the hierarchical organization of the LangChain framework, displaying the interconnected parts across multiple layers."
sources={{
light: useBaseUrl('/svg/langchain_stack_062024.svg'),
dark: useBaseUrl('/svg/langchain_stack_062024_dark.svg'),
}}
title="LangChain Framework Overview"
style={{ width: "100%" }}
/>
## LangChain Expression Language (LCEL)
<span data-heading-keywords="lcel"></span>
`LangChain Expression Language`, or `LCEL`, is a declarative way to chain LangChain components.
LCEL was designed from day 1 to **support putting prototypes in production, with no code changes**, from the simplest “prompt + LLM” chain to the most complex chains (weve seen folks successfully run LCEL chains with 100s of steps in production). To highlight a few of the reasons you might want to use LCEL:
- **First-class streaming support:**
When you build your chains with LCEL you get the best possible time-to-first-token (time elapsed until the first chunk of output comes out). For some chains this means eg. we stream tokens straight from an LLM to a streaming output parser, and you get back parsed, incremental chunks of output at the same rate as the LLM provider outputs the raw tokens.
- **Async support:**
Any chain built with LCEL can be called both with the synchronous API (eg. in your Jupyter notebook while prototyping) as well as with the asynchronous API (eg. in a [LangServe](/docs/langserve/) server). This enables using the same code for prototypes and in production, with great performance, and the ability to handle many concurrent requests in the same server.
- **Optimized parallel execution:**
Whenever your LCEL chains have steps that can be executed in parallel (eg if you fetch documents from multiple retrievers) we automatically do it, both in the sync and the async interfaces, for the smallest possible latency.
- **Retries and fallbacks:**
Configure retries and fallbacks for any part of your LCEL chain. This is a great way to make your chains more reliable at scale. Were currently working on adding streaming support for retries/fallbacks, so you can get the added reliability without any latency cost.
- **Access intermediate results:**
For more complex chains its often very useful to access the results of intermediate steps even before the final output is produced. This can be used to let end-users know something is happening, or even just to debug your chain. You can stream intermediate results, and its available on every [LangServe](/docs/langserve) server.
- **Input and output schemas**
Input and output schemas give every LCEL chain Pydantic and JSONSchema schemas inferred from the structure of your chain. This can be used for validation of inputs and outputs, and is an integral part of LangServe.
- [**Seamless LangSmith tracing**](https://docs.smith.langchain.com)
As your chains get more and more complex, it becomes increasingly important to understand what exactly is happening at every step.
With LCEL, **all** steps are automatically logged to [LangSmith](https://docs.smith.langchain.com/) for maximum observability and debuggability.
LCEL aims to provide consistency around behavior and customization over legacy subclassed chains such as `LLMChain` and
`ConversationalRetrievalChain`. Many of these legacy chains hide important details like prompts, and as a wider variety
of viable models emerge, customization has become more and more important.
If you are currently using one of these legacy chains, please see [this guide for guidance on how to migrate](/docs/versions/migrating_chains).
For guides on how to do specific tasks with LCEL, check out [the relevant how-to guides](/docs/how_to/#langchain-expression-language-lcel).
### Runnable interface
## Runnable interface
<span data-heading-keywords="invoke,runnable"></span>
To make it as easy as possible to create custom chains, we've implemented a ["Runnable"](https://python.langchain.com/api_reference/core/runnables/langchain_core.runnables.base.Runnable.html#langchain_core.runnables.base.Runnable) protocol. Many LangChain components implement the `Runnable` protocol, including chat models, LLMs, output parsers, retrievers, prompt templates, and more. There are also several useful primitives for working with runnables, which you can read about below.
* Conceptual Guide: [About the Runnable interface](/docs/concepts/runnables)
* How-to Guides: [How to use the Runnable interface](/docs/how_to/#langchain-expression-language-lcel)
This is a standard interface, which makes it easy to define custom chains as well as invoke them in a standard way.
The standard interface includes:
The Runnable interface is a standard interface for defining and invoking LangChain components.
- `stream`: stream back chunks of the response
- `invoke`: call the chain on an input
- `batch`: call the chain on a list of inputs
## LangChain Expression Language (LCEL)
These also have corresponding async methods that should be used with [asyncio](https://docs.python.org/3/library/asyncio.html) `await` syntax for concurrency:
<span data-heading-keywords="lcel"></span>
- `astream`: stream back chunks of the response async
- `ainvoke`: call the chain on an input async
- `abatch`: call the chain on a list of inputs async
- `astream_log`: stream back intermediate steps as they happen, in addition to the final response
- `astream_events`: **beta** stream events as they happen in the chain (introduced in `langchain-core` 0.1.14)
The **input type** and **output type** varies by component:
| Component | Input Type | Output Type |
| --- | --- | --- |
| Prompt | Dictionary | PromptValue |
| ChatModel | Single string, list of chat messages or a PromptValue | ChatMessage |
| LLM | Single string, list of chat messages or a PromptValue | String |
| OutputParser | The output of an LLM or ChatModel | Depends on the parser |
| Retriever | Single string | List of Documents |
| Tool | Single string or dictionary, depending on the tool | Depends on the tool |
All runnables expose input and output **schemas** to inspect the inputs and outputs:
- `input_schema`: an input Pydantic model auto-generated from the structure of the Runnable
- `output_schema`: an output Pydantic model auto-generated from the structure of the Runnable
* Conceptual Guide: [About the Runnable interface](/docs/concepts/lcel)
* How-to Guides: [How to use the Runnable interface](/docs/how_to/#langchain-expression-language-lcel)
## Components
@@ -136,51 +34,16 @@ LangChain provides standard, extendable interfaces and external integrations for
Some components LangChain implements, some components we rely on third-party integrations for, and others are a mix.
### Chat models
<span data-heading-keywords="chat model,chat models"></span>
Language models that use a sequence of messages as inputs and return chat messages as outputs (as opposed to using plain text).
These are traditionally newer models (older models are generally `LLMs`, see below).
Chat models support the assignment of distinct roles to conversation messages, helping to distinguish messages from the AI, users, and instructions such as system messages.
Although the underlying models are messages in, message out, the LangChain wrappers also allow these models to take a string as input. This means you can easily use chat models in place of LLMs.
When a string is passed in as input, it is converted to a `HumanMessage` and then passed to the underlying model.
LangChain does not host any Chat Models, rather we rely on third party integrations.
We have some standardized parameters when constructing ChatModels:
- `model`: the name of the model
- `temperature`: the sampling temperature
- `timeout`: request timeout
- `max_tokens`: max tokens to generate
- `stop`: default stop sequences
- `max_retries`: max number of times to retry requests
- `api_key`: API key for the model provider
- `base_url`: endpoint to send requests to
Some important things to note:
- standard params only apply to model providers that expose parameters with the intended functionality. For example, some providers do not expose a configuration for maximum output tokens, so max_tokens can't be supported on these.
- standard params are currently only enforced on integrations that have their own integration packages (e.g. `langchain-openai`, `langchain-anthropic`, etc.), they're not enforced on models in ``langchain-community``.
ChatModels also accept other parameters that are specific to that integration. To find all the parameters supported by a ChatModel head to the API reference for that model.
:::important
Some chat models have been fine-tuned for **tool calling** and provide a dedicated API for it.
Generally, such models are better at tool calling than non-fine-tuned models, and are recommended for use cases that require tool calling.
Please see the [tool calling section](/docs/concepts/#functiontool-calling) for more information.
:::
For specifics on how to use chat models, see the [relevant how-to guides here](/docs/how_to/#chat-models).
* Conceptual Guide: [About Chat Models](/docs/concepts/chat_models)
* Integrations: [LangChain Chat Model Integrations](/docs/integrations/chat/)
* How-to Guides: [How to use Chat Models](/docs/how_to/#chat-models)
#### Multimodality
Some chat models are multimodal, accepting images, audio and even video as inputs. These are still less common, meaning model providers haven't standardized on the "best" way to define the API. Multimodal **outputs** are even less common. As such, we've kept our multimodal abstractions fairly light weight and plan to further solidify the multimodal APIs and interaction patterns as the field matures.
In LangChain, most chat models that support multimodal inputs also accept those values in OpenAI's content blocks format. So far this is restricted to image inputs. For models like Gemini which support video and other bytes input, the APIs also support the native, model-specific representations.
For specifics on how to use multimodal models, see the [relevant how-to guides here](/docs/how_to/#multimodal).
For a full list of LangChain model providers with multimodal models, [check out this table](/docs/integrations/chat/#advanced-features).
* Conceptual Guide: [About Multimodal Chat Models](/docs/concepts/multimodality)
### LLMs
<span data-heading-keywords="llm,llms"></span>
@@ -192,157 +55,33 @@ even for non-chat use cases.
You are probably looking for [the section above instead](/docs/concepts/#chat-models).
:::
Language models that takes a string as input and returns a string.
These are traditionally older models (newer models generally are [Chat Models](/docs/concepts/#chat-models), see above).
Although the underlying models are string in, string out, the LangChain wrappers also allow these models to take messages as input.
This gives them the same interface as [Chat Models](/docs/concepts/#chat-models).
When messages are passed in as input, they will be formatted into a string under the hood before being passed to the underlying model.
LangChain does not host any LLMs, rather we rely on third party integrations.
For specifics on how to use LLMs, see the [how-to guides](/docs/how_to/#llms).
* Conceptual Guide: [About Language Models](/docs/concepts/llms)
* Integrations: [LangChain LLM Integrations](/docs/integrations/llms/)
* How-to Guides: [How to use LLMs](/docs/how_to/#llms)
<a id="aimessage"></a>
<a id="systemmessage"></a>
<a id="humanmessage"></a>
<a id="toolmessage"></a>
<a id="legacy-functionmessage"></a>
### Messages
Some language models take a list of messages as input and return a message.
There are a few different types of messages.
All messages have a `role`, `content`, and `response_metadata` property.
The `role` describes WHO is saying the message. The standard roles are "user", "assistant", "system", and "tool".
LangChain has different message classes for different roles.
The `content` property describes the content of the message.
This can be a few different things:
- A string (most models deal with this type of content)
- A List of dictionaries (this is used for multimodal input, where the dictionary contains information about that input type and that input location)
Optionally, messages can have a `name` property which allows for differentiating between multiple speakers with the same role.
For example, if there are two users in the chat history it can be useful to differentiate between them. Not all models support this.
#### HumanMessage
This represents a message with role "user".
#### AIMessage
This represents a message with role "assistant". In addition to the `content` property, these messages also have:
**`response_metadata`**
The `response_metadata` property contains additional metadata about the response. The data here is often specific to each model provider.
This is where information like log-probs and token usage may be stored.
**`tool_calls`**
These represent a decision from an language model to call a tool. They are included as part of an `AIMessage` output.
They can be accessed from there with the `.tool_calls` property.
This property returns a list of `ToolCall`s. A `ToolCall` is a dictionary with the following arguments:
- `name`: The name of the tool that should be called.
- `args`: The arguments to that tool.
- `id`: The id of that tool call.
#### SystemMessage
This represents a message with role "system", which tells the model how to behave. Not every model provider supports this.
#### ToolMessage
This represents a message with role "tool", which contains the result of calling a tool. In addition to `role` and `content`, this message has:
- a `tool_call_id` field which conveys the id of the call to the tool that was called to produce this result.
- an `artifact` field which can be used to pass along arbitrary artifacts of the tool execution which are useful to track but which should not be sent to the model.
#### (Legacy) FunctionMessage
This is a legacy message type, corresponding to OpenAI's legacy function-calling API. `ToolMessage` should be used instead to correspond to the updated tool-calling API.
This represents the result of a function call. In addition to `role` and `content`, this message has a `name` parameter which conveys the name of the function that was called to produce this result.
* Conceptual Guide: [About Messages](/docs/concepts/messages)
* How-to Guides: [How to use Messages](/docs/how_to/#messages)
### Prompt templates
<span data-heading-keywords="prompt,prompttemplate,chatprompttemplate"></span>
Prompt templates help to translate user input and parameters into instructions for a language model.
This can be used to guide a model's response, helping it understand the context and generate relevant and coherent language-based output.
Prompt Templates take as input a dictionary, where each key represents a variable in the prompt template to fill in.
Prompt Templates output a PromptValue. This PromptValue can be passed to an LLM or a ChatModel, and can also be cast to a string or a list of messages.
The reason this PromptValue exists is to make it easy to switch between strings and messages.
There are a few different types of prompt templates:
Conceptual Guide: [About Prompt Templates](/docs/concepts/prompts)
How-to Guides: [How to use Prompt Templates](/docs/how_to/#prompt-templates)
#### String PromptTemplates
These prompt templates are used to format a single string, and generally are used for simpler inputs.
For example, a common way to construct and use a PromptTemplate is as follows:
```python
from langchain_core.prompts import PromptTemplate
prompt_template = PromptTemplate.from_template("Tell me a joke about {topic}")
prompt_template.invoke({"topic": "cats"})
```
#### ChatPromptTemplates
These prompt templates are used to format a list of messages. These "templates" consist of a list of templates themselves.
For example, a common way to construct and use a ChatPromptTemplate is as follows:
```python
from langchain_core.prompts import ChatPromptTemplate
prompt_template = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant"),
("user", "Tell me a joke about {topic}")
])
prompt_template.invoke({"topic": "cats"})
```
In the above example, this ChatPromptTemplate will construct two messages when called.
The first is a system message, that has no variables to format.
The second is a HumanMessage, and will be formatted by the `topic` variable the user passes in.
#### MessagesPlaceholder
<span data-heading-keywords="messagesplaceholder"></span>
This prompt template is responsible for adding a list of messages in a particular place.
In the above ChatPromptTemplate, we saw how we could format two messages, each one a string.
But what if we wanted the user to pass in a list of messages that we would slot into a particular spot?
This is how you use MessagesPlaceholder.
```python
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage
prompt_template = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant"),
MessagesPlaceholder("msgs")
])
prompt_template.invoke({"msgs": [HumanMessage(content="hi!")]})
```
This will produce a list of two messages, the first one being a system message, and the second one being the HumanMessage we passed in.
If we had passed in 5 messages, then it would have produced 6 messages in total (the system message plus the 5 passed in).
This is useful for letting a list of messages be slotted into a particular spot.
An alternative way to accomplish the same thing without using the `MessagesPlaceholder` class explicitly is:
```python
prompt_template = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant"),
("placeholder", "{msgs}") # <-- This is the changed part
])
```
For specifics on how to use prompt templates, see the [relevant how-to guides here](/docs/how_to/#prompt-templates).
### Example selectors
One common prompting technique for achieving better performance is to include examples as part of the prompt.
@@ -358,41 +97,15 @@ For specifics on how to use example selectors, see the [relevant how-to guides h
:::note
The information here refers to parsers that take a text output from a model try to parse it into a more structured representation.
More and more models are supporting function (or tool) calling, which handles this automatically.
It is recommended to use function/tool calling rather than output parsing.
See documentation for that [here](/docs/concepts/#function-tool-calling).
Output parsers precede chat models that were capable of calling tools. These days, it is recommended to use function/tool calling
as it's simpler while providing better quality results.
See documentation for that [here](/docs/concepts/#function-tool-calling).
:::
`Output parser` is responsible for taking the output of a model and transforming it to a more suitable format for downstream tasks.
Useful when you are using LLMs to generate structured data, or to normalize output from chat models and LLMs.
Conceptual Guide: [About Output Parsers](/docs/concepts/output_parsers)
How-to Guides: [How to use Output Parsers](/docs/how_to/#output-parsers)
LangChain has lots of different types of output parsers. This is a list of output parsers LangChain supports. The table below has various pieces of information:
- **Name**: The name of the output parser
- **Supports Streaming**: Whether the output parser supports streaming.
- **Has Format Instructions**: Whether the output parser has format instructions. This is generally available except when (a) the desired schema is not specified in the prompt but rather in other parameters (like OpenAI function calling), or (b) when the OutputParser wraps another OutputParser.
- **Calls LLM**: Whether this output parser itself calls an LLM. This is usually only done by output parsers that attempt to correct misformatted output.
- **Input Type**: Expected input type. Most output parsers work on both strings and messages, but some (like OpenAI Functions) need a message with specific kwargs.
- **Output Type**: The output type of the object returned by the parser.
- **Description**: Our commentary on this output parser and when to use it.
| Name | Supports Streaming | Has Format Instructions | Calls LLM | Input Type | Output Type | Description |
|-----------------|--------------------|-------------------------------|-----------|----------------------------------|----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [JSON](https://python.langchain.com/api_reference/core/output_parsers/langchain_core.output_parsers.json.JsonOutputParser.html#langchain_core.output_parsers.json.JsonOutputParser) | ✅ | ✅ | | `str` \| `Message` | JSON object | Returns a JSON object as specified. You can specify a Pydantic model and it will return JSON for that model. Probably the most reliable output parser for getting structured data that does NOT use function calling. |
| [XML](https://python.langchain.com/api_reference/core/output_parsers/langchain_core.output_parsers.xml.XMLOutputParser.html#langchain_core.output_parsers.xml.XMLOutputParser) | ✅ | ✅ | | `str` \| `Message` | `dict` | Returns a dictionary of tags. Use when XML output is needed. Use with models that are good at writing XML (like Anthropic's). |
| [CSV](https://python.langchain.com/api_reference/core/output_parsers/langchain_core.output_parsers.list.CommaSeparatedListOutputParser.html#langchain_core.output_parsers.list.CommaSeparatedListOutputParser) | ✅ | ✅ | | `str` \| `Message` | `List[str]` | Returns a list of comma separated values. |
| [OutputFixing](https://python.langchain.com/api_reference/langchain/output_parsers/langchain.output_parsers.fix.OutputFixingParser.html#langchain.output_parsers.fix.OutputFixingParser) | | | ✅ | `str` \| `Message` | | Wraps another output parser. If that output parser errors, then this will pass the error message and the bad output to an LLM and ask it to fix the output. |
| [RetryWithError](https://python.langchain.com/api_reference/langchain/output_parsers/langchain.output_parsers.retry.RetryWithErrorOutputParser.html#langchain.output_parsers.retry.RetryWithErrorOutputParser) | | | ✅ | `str` \| `Message` | | Wraps another output parser. If that output parser errors, then this will pass the original inputs, the bad output, and the error message to an LLM and ask it to fix it. Compared to OutputFixingParser, this one also sends the original instructions. |
| [Pydantic](https://python.langchain.com/api_reference/core/output_parsers/langchain_core.output_parsers.pydantic.PydanticOutputParser.html#langchain_core.output_parsers.pydantic.PydanticOutputParser) | | ✅ | | `str` \| `Message` | `pydantic.BaseModel` | Takes a user defined Pydantic model and returns data in that format. |
| [YAML](https://python.langchain.com/api_reference/langchain/output_parsers/langchain.output_parsers.yaml.YamlOutputParser.html#langchain.output_parsers.yaml.YamlOutputParser) | | ✅ | | `str` \| `Message` | `pydantic.BaseModel` | Takes a user defined Pydantic model and returns data in that format. Uses YAML to encode it. |
| [PandasDataFrame](https://python.langchain.com/api_reference/langchain/output_parsers/langchain.output_parsers.pandas_dataframe.PandasDataFrameOutputParser.html#langchain.output_parsers.pandas_dataframe.PandasDataFrameOutputParser) | | ✅ | | `str` \| `Message` | `dict` | Useful for doing operations with pandas DataFrames. |
| [Enum](https://python.langchain.com/api_reference/langchain/output_parsers/langchain.output_parsers.enum.EnumOutputParser.html#langchain.output_parsers.enum.EnumOutputParser) | | ✅ | | `str` \| `Message` | `Enum` | Parses response into one of the provided enum values. |
| [Datetime](https://python.langchain.com/api_reference/langchain/output_parsers/langchain.output_parsers.datetime.DatetimeOutputParser.html#langchain.output_parsers.datetime.DatetimeOutputParser) | | ✅ | | `str` \| `Message` | `datetime.datetime` | Parses response into a datetime string. |
| [Structured](https://python.langchain.com/api_reference/langchain/output_parsers/langchain.output_parsers.structured.StructuredOutputParser.html#langchain.output_parsers.structured.StructuredOutputParser) | | ✅ | | `str` \| `Message` | `Dict[str, str]` | An output parser that returns structured information. It is less powerful than other output parsers since it only allows for fields to be strings. This can be useful when you are working with smaller LLMs. |
For specifics on how to use output parsers, see the [relevant how-to guides here](/docs/how_to/#output-parsers).
### Chat history
Most LLM applications have a conversational interface.
@@ -419,82 +132,40 @@ These classes load Document objects. LangChain has hundreds of integrations with
Each DocumentLoader has its own specific parameters, but they can all be invoked in the same way with the `.load` method.
An example use case is as follows:
```python
from langchain_community.document_loaders.csv_loader import CSVLoader
### Output parsers
<span data-heading-keywords="output parser"></span>
loader = CSVLoader(
... # <-- Integration specific parameters here
)
data = loader.load()
```
:::note
The information here refers to parsers that take a text output from a model try to parse it into a more structured representation.
More and more models are supporting function (or tool) calling, which handles this automatically.
It is recommended to use function/tool calling rather than output parsing.
See documentation for that [here](/docs/concepts/#function-tool-calling).
:::
For specifics on how to use document loaders, see the [relevant how-to guides here](/docs/how_to/#document-loaders).
* Conceptual Guide: [About Output Parsers](/docs/concepts/output_parsers)
* How-to Guides: [How to use Output Parsers](/docs/how_to/#output-parsers)
### Text splitters
Once you've loaded documents, you'll often want to transform them to better suit your application. The simplest example is you may want to split a long document into smaller chunks that can fit into your model's context window. LangChain has a number of built-in document transformers that make it easy to split, combine, filter, and otherwise manipulate documents.
When you want to deal with long pieces of text, it is necessary to split up that text into chunks. As simple as this sounds, there is a lot of potential complexity here. Ideally, you want to keep the semantically related pieces of text together. What "semantically related" means could depend on the type of text. This notebook showcases several ways to do that.
At a high level, text splitters work as following:
1. Split the text up into small, semantically meaningful chunks (often sentences).
2. Start combining these small chunks into a larger chunk until you reach a certain size (as measured by some function).
3. Once you reach that size, make that chunk its own piece of text and then start creating a new chunk of text with some overlap (to keep context between chunks).
That means there are two different axes along which you can customize your text splitter:
1. How the text is split
2. How the chunk size is measured
For specifics on how to use text splitters, see the [relevant how-to guides here](/docs/how_to/#text-splitters).
* Conceptual Guide: [About Text Splitters](/docs/concepts/text_splitters)
### Embedding models
<span data-heading-keywords="embedding,embeddings"></span>
Embedding models create a vector representation of a piece of text. You can think of a vector as an array of numbers that captures the semantic meaning of the text.
By representing the text in this way, you can perform mathematical operations that allow you to do things like search for other pieces of text that are most similar in meaning.
These natural language search capabilities underpin many types of [context retrieval](/docs/concepts/#retrieval),
where we provide an LLM with the relevant data it needs to effectively respond to a query.
![](/img/embeddings.png)
The `Embeddings` class is a class designed for interfacing with text embedding models. There are many different embedding model providers (OpenAI, Cohere, Hugging Face, etc) and local models, and this class is designed to provide a standard interface for all of them.
The base Embeddings class in LangChain provides two methods: one for embedding documents and one for embedding a query. The former takes as input multiple texts, while the latter takes a single text. The reason for having these as two separate methods is that some embedding providers have different embedding methods for documents (to be searched over) vs queries (the search query itself).
For specifics on how to use embedding models, see the [relevant how-to guides here](/docs/how_to/#embedding-models).
### Vector stores
<span data-heading-keywords="vector,vectorstore,vectorstores,vector store,vector stores"></span>
One of the most common ways to store and search over unstructured data is to embed it and store the resulting embedding vectors,
and then at query time to embed the unstructured query and retrieve the embedding vectors that are 'most similar' to the embedded query.
A vector store takes care of storing embedded data and performing vector search for you.
Most vector stores can also store metadata about embedded vectors and support filtering on that metadata before
similarity search, allowing you more control over returned documents.
Vector stores can be converted to the retriever interface by doing:
```python
vectorstore = MyVectorStore()
retriever = vectorstore.as_retriever()
```
For specifics on how to use vector stores, see the [relevant how-to guides here](/docs/how_to/#vector-stores).
* Conceptual Guide: [About Embedding Models](/docs/concepts/embedding_models)
* How-to Guides: [How to use Embedding Models](/docs/how_to/#embedding-models)
### Retrievers
<span data-heading-keywords="retriever,retrievers"></span>
A retriever is an interface that returns documents given an unstructured query.
It is more general than a vector store.
A retriever does not need to be able to store documents, only to return (or retrieve) them.
Retrievers can be created from vector stores, but are also broad enough to include [Wikipedia search](/docs/integrations/retrievers/wikipedia/) and [Amazon Kendra](/docs/integrations/retrievers/amazon_kendra_retriever/).
* Conceptual Guide: [About Retrievers](/docs/concepts/retrievers)
* How-to Guides: [How to use Retrievers](/docs/how_to/#retrievers)
Retrievers accept a string query as input and return a list of Document's as output.
### Vector stores
<span data-heading-keywords="vector,vectorstore,vectorstores,vector store,vector stores"></span>
For specifics on how to use retrievers, see the [relevant how-to guides here](/docs/how_to/#retrievers).
* Conceptual Guide: [About Vector Stores](/docs/concepts/vectorstores)
* How-to Guides: [How to use Vector Stores](/docs/how_to/#vector-stores)
### Key-value stores
@@ -523,100 +194,7 @@ For key-value store implementations, see [this section](/docs/integrations/store
### Tools
<span data-heading-keywords="tool,tools"></span>
Tools are utilities designed to be called by a model: their inputs are designed to be generated by models, and their outputs are designed to be passed back to models.
Tools are needed whenever you want a model to control parts of your code or call out to external APIs.
A tool consists of:
1. The `name` of the tool.
2. A `description` of what the tool does.
3. A `JSON schema` defining the inputs to the tool.
4. A `function` (and, optionally, an async variant of the function).
When a tool is bound to a model, the name, description and JSON schema are provided as context to the model.
Given a list of tools and a set of instructions, a model can request to call one or more tools with specific inputs.
Typical usage may look like the following:
```python
tools = [...] # Define a list of tools
llm_with_tools = llm.bind_tools(tools)
ai_msg = llm_with_tools.invoke("do xyz...")
# -> AIMessage(tool_calls=[ToolCall(...), ...], ...)
```
The `AIMessage` returned from the model MAY have `tool_calls` associated with it.
Read [this guide](/docs/concepts/#aimessage) for more information on what the response type may look like.
Once the chosen tools are invoked, the results can be passed back to the model so that it can complete whatever task
it's performing.
There are generally two different ways to invoke the tool and pass back the response:
#### Invoke with just the arguments
When you invoke a tool with just the arguments, you will get back the raw tool output (usually a string).
This generally looks like:
```python
# You will want to previously check that the LLM returned tool calls
tool_call = ai_msg.tool_calls[0]
# ToolCall(args={...}, id=..., ...)
tool_output = tool.invoke(tool_call["args"])
tool_message = ToolMessage(
content=tool_output,
tool_call_id=tool_call["id"],
name=tool_call["name"]
)
```
Note that the `content` field will generally be passed back to the model.
If you do not want the raw tool response to be passed to the model, but you still want to keep it around,
you can transform the tool output but also pass it as an artifact (read more about [`ToolMessage.artifact` here](/docs/concepts/#toolmessage))
```python
... # Same code as above
response_for_llm = transform(response)
tool_message = ToolMessage(
content=response_for_llm,
tool_call_id=tool_call["id"],
name=tool_call["name"],
artifact=tool_output
)
```
#### Invoke with `ToolCall`
The other way to invoke a tool is to call it with the full `ToolCall` that was generated by the model.
When you do this, the tool will return a ToolMessage.
The benefits of this are that you don't have to write the logic yourself to transform the tool output into a ToolMessage.
This generally looks like:
```python
tool_call = ai_msg.tool_calls[0]
# -> ToolCall(args={...}, id=..., ...)
tool_message = tool.invoke(tool_call)
# -> ToolMessage(
content="tool result foobar...",
tool_call_id=...,
name="tool_name"
)
```
If you are invoking the tool this way and want to include an [artifact](/docs/concepts/#toolmessage) for the ToolMessage, you will need to have the tool return two things.
Read more about [defining tools that return artifacts here](/docs/how_to/tool_artifacts/).
#### Best practices
When designing tools to be used by a model, it is important to keep in mind that:
- Chat models that have explicit [tool-calling APIs](/docs/concepts/#functiontool-calling) will be better at tool calling than non-fine-tuned models.
- Models will perform better if the tools have well-chosen names, descriptions, and JSON schemas. This another form of prompt engineering.
- Simple, narrowly scoped tools are easier for models to use than complex tools.
#### Related
For specifics on how to use tools, see the [tools how-to guides](/docs/how_to/#tools).
To use a pre-built tool, see the [tool integration docs](/docs/integrations/tools/).
[Tools](/docs/concepts/tools) are utilities designed to be called by a model: their inputs are designed to be generated by models, and their outputs are designed to be passed back to models.
### Toolkits
<span data-heading-keywords="toolkit,toolkits"></span>
@@ -636,44 +214,6 @@ tools = toolkit.get_tools()
### Agents
By themselves, language models can't take actions - they just output text.
A big use case for LangChain is creating **agents**.
Agents are systems that use an LLM as a reasoning engine to determine which actions to take and what the inputs to those actions should be.
The results of those actions can then be fed back into the agent and it determine whether more actions are needed, or whether it is okay to finish.
[LangGraph](https://github.com/langchain-ai/langgraph) is an extension of LangChain specifically aimed at creating highly controllable and customizable agents.
Please check out that documentation for a more in depth overview of agent concepts.
There is a legacy `agent` concept in LangChain that we are moving towards deprecating: `AgentExecutor`.
AgentExecutor was essentially a runtime for agents.
It was a great place to get started, however, it was not flexible enough as you started to have more customized agents.
In order to solve that we built LangGraph to be this flexible, highly-controllable runtime.
If you are still using AgentExecutor, do not fear: we still have a guide on [how to use AgentExecutor](/docs/how_to/agent_executor).
It is recommended, however, that you start to transition to LangGraph.
In order to assist in this, we have put together a [transition guide on how to do so](/docs/how_to/migrate_agent).
#### ReAct agents
<span data-heading-keywords="react,react agent"></span>
One popular architecture for building agents is [**ReAct**](https://arxiv.org/abs/2210.03629).
ReAct combines reasoning and acting in an iterative process - in fact the name "ReAct" stands for "Reason" and "Act".
The general flow looks like this:
- The model will "think" about what step to take in response to an input and any previous observations.
- The model will then choose an action from available tools (or choose to respond to the user).
- The model will generate arguments to that tool.
- The agent runtime (executor) will parse out the chosen tool and call it with the generated arguments.
- The executor will return the results of the tool call back to the model as an observation.
- This process repeats until the agent chooses to respond.
There are general prompting based implementations that do not require any model-specific features, but the most
reliable implementations use features like [tool calling](/docs/how_to/tool_calling/) to reliably format outputs
and reduce variance.
Please see the [LangGraph documentation](https://langchain-ai.github.io/langgraph/) for more information,
or [this how-to guide](/docs/how_to/migrate_agent/) for specific information on migrating to LangGraph.
### Callbacks
@@ -717,8 +257,6 @@ During run-time LangChain configures an appropriate callback manager (e.g., [Cal
The `callbacks` property is available on most objects throughout the API (Models, Tools, Agents, etc.) in two different places:
The callbacks are available on most objects throughout the API (Models, Tools, Agents, etc.) in two different places:
- **Request time callbacks**: Passed at the time of the request in addition to the input data.
Available on all standard `Runnable` objects. These callbacks are INHERITED by all children
of the object they are defined on. For example, `chain.invoke({"number": 25}, {"callbacks": [handler]})`.
@@ -734,10 +272,10 @@ of the object.
If you're creating a custom chain or runnable, you need to remember to propagate request time
callbacks to any child objects.
:::important Async in Python<=3.10
:::important Async in Python&lt;=3.10
Any `RunnableLambda`, a `RunnableGenerator`, or `Tool` that invokes other runnables
and is running `async` in python<=3.10, will have to propagate callbacks to child
and is running `async` in python&lt;=3.10, will have to propagate callbacks to child
objects manually. This is because LangChain cannot automatically propagate
callbacks to child objects in this case.
@@ -752,117 +290,23 @@ For specifics on how to use callbacks, see the [relevant how-to guides here](/do
### Streaming
<span data-heading-keywords="stream,streaming"></span>
Individual LLM calls often run for much longer than traditional resource requests.
This compounds when you build more complex chains or agents that require multiple reasoning steps.
Fortunately, LLMs generate output iteratively, which means it's possible to show sensible intermediate results
before the final response is ready. Consuming output as soon as it becomes available has therefore become a vital part of the UX
around building apps with LLMs to help alleviate latency issues, and LangChain aims to have first-class support for streaming.
Below, we'll discuss some concepts and considerations around streaming in LangChain.
Conceptual Guide: [Streaming](/docs/concepts/streaming)
#### `.stream()` and `.astream()`
Most modules in LangChain include the `.stream()` method (and the equivalent `.astream()` method for [async](https://docs.python.org/3/library/asyncio.html) environments) as an ergonomic streaming interface.
`.stream()` returns an iterator, which you can consume with a simple `for` loop. Here's an example with a chat model:
```python
from langchain_anthropic import ChatAnthropic
model = ChatAnthropic(model="claude-3-sonnet-20240229")
for chunk in model.stream("what color is the sky?"):
print(chunk.content, end="|", flush=True)
```
For models (or other components) that don't support streaming natively, this iterator would just yield a single chunk, but
you could still use the same general pattern when calling them. Using `.stream()` will also automatically call the model in streaming mode
without the need to provide additional config.
The type of each outputted chunk depends on the type of component - for example, chat models yield [`AIMessageChunks`](https://python.langchain.com/api_reference/core/messages/langchain_core.messages.ai.AIMessageChunk.html).
Because this method is part of [LangChain Expression Language](/docs/concepts/#langchain-expression-language-lcel),
you can handle formatting differences from different outputs using an [output parser](/docs/concepts/#output-parsers) to transform
each yielded chunk.
You can check out [this guide](/docs/how_to/streaming/#using-stream) for more detail on how to use `.stream()`.
TODO(concepts): Add URL fragment
#### `.astream_events()`
<span data-heading-keywords="astream_events,stream_events,stream events"></span>
While the `.stream()` method is intuitive, it can only return the final generated value of your chain. This is fine for single LLM calls,
but as you build more complex chains of several LLM calls together, you may want to use the intermediate values of
the chain alongside the final output - for example, returning sources alongside the final generation when building a chat
over documents app.
There are ways to do this [using callbacks](/docs/concepts/#callbacks-1), or by constructing your chain in such a way that it passes intermediate
values to the end with something like chained [`.assign()`](/docs/how_to/passthrough/) calls, but LangChain also includes an
`.astream_events()` method that combines the flexibility of callbacks with the ergonomics of `.stream()`. When called, it returns an iterator
which yields [various types of events](/docs/how_to/streaming/#event-reference) that you can filter and process according
to the needs of your project.
Here's one small example that prints just events containing streamed chat model output:
```python
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_anthropic import ChatAnthropic
model = ChatAnthropic(model="claude-3-sonnet-20240229")
prompt = ChatPromptTemplate.from_template("tell me a joke about {topic}")
parser = StrOutputParser()
chain = prompt | model | parser
async for event in chain.astream_events({"topic": "parrot"}, version="v2"):
kind = event["event"]
if kind == "on_chat_model_stream":
print(event, end="|", flush=True)
```
You can roughly think of it as an iterator over callback events (though the format differs) - and you can use it on almost all LangChain components!
See [this guide](/docs/how_to/streaming/#using-stream-events) for more detailed information on how to use `.astream_events()`,
including a table listing available events.
TODO(concepts): Add URL fragment
#### Callbacks
The lowest level way to stream outputs from LLMs in LangChain is via the [callbacks](/docs/concepts/#callbacks) system. You can pass a
callback handler that handles the [`on_llm_new_token`](https://python.langchain.com/api_reference/langchain/callbacks/langchain.callbacks.streaming_aiter.AsyncIteratorCallbackHandler.html#langchain.callbacks.streaming_aiter.AsyncIteratorCallbackHandler.on_llm_new_token) event into LangChain components. When that component is invoked, any
[LLM](/docs/concepts/#llms) or [chat model](/docs/concepts/#chat-models) contained in the component calls
the callback with the generated token. Within the callback, you could pipe the tokens into some other destination, e.g. a HTTP response.
You can also handle the [`on_llm_end`](https://python.langchain.com/api_reference/langchain/callbacks/langchain.callbacks.streaming_aiter.AsyncIteratorCallbackHandler.html#langchain.callbacks.streaming_aiter.AsyncIteratorCallbackHandler.on_llm_end) event to perform any necessary cleanup.
You can see [this how-to section](/docs/how_to/#callbacks) for more specifics on using callbacks.
Callbacks were the first technique for streaming introduced in LangChain. While powerful and generalizable,
they can be unwieldy for developers. For example:
- You need to explicitly initialize and manage some aggregator or other stream to collect results.
- The execution order isn't explicitly guaranteed, and you could theoretically have a callback run after the `.invoke()` method finishes.
- Providers would often make you pass an additional parameter to stream outputs instead of returning them all at once.
- You would often ignore the result of the actual model call in favor of callback results.
* Conceptual Guide: [Callbacks](/docs/concepts/callbacks)
* How-to Guides: [How to use Callbacks](/docs/how_to/#callbacks)
#### Tokens
The unit that most model providers use to measure input and output is via a unit called a **token**.
Tokens are the basic units that language models read and generate when processing or producing text.
The exact definition of a token can vary depending on the specific way the model was trained -
for instance, in English, a token could be a single word like "apple", or a part of a word like "app".
When you send a model a prompt, the words and characters in the prompt are encoded into tokens using a **tokenizer**.
The model then streams back generated output tokens, which the tokenizer decodes into human-readable text.
The below example shows how OpenAI models tokenize `LangChain is cool!`:
![](/img/tokenization.png)
You can see that it gets split into 5 different tokens, and that the boundaries between tokens are not exactly the same as word boundaries.
The reason language models use tokens rather than something more immediately intuitive like "characters"
has to do with how they process and understand text. At a high-level, language models iteratively predict their next generated output based on
the initial input and their previous generations. Training the model using tokens language models to handle linguistic
units (like words or subwords) that carry meaning, rather than individual characters, which makes it easier for the model
to learn and understand the structure of the language, including grammar and context.
Furthermore, using tokens can also improve efficiency, since the model processes fewer units of text compared to character-level processing.
* Conceptual Guide: [Tokens](/docs/concepts/tokens)
### Function/tool calling

View File

@@ -0,0 +1,29 @@
# LangGraph
## Overview
[LangGraph](https://langchain-ai.github.io/langgraph/) is a library for building stateful, multi-actor applications with LLMs, used to create agent and multi-agent workflows. Compared to other LLM frameworks, it offers these core benefits: cycles, controllability, and persistence. LangGraph allows you to define flows that involve cycles, essential for most agentic architectures, differentiating it from DAG-based solutions. As a very low-level framework, it provides fine-grained control over both the flow and state of your application, crucial for creating reliable agents. Additionally, LangGraph includes built-in persistence, enabling advanced human-in-the-loop and memory features.
LangGraph is inspired by [Pregel](https://research.google/pubs/pub37252/) and [Apache Beam](https://beam.apache.org/). The public interface draws inspiration from [NetworkX](https://networkx.org/documentation/latest/). LangGraph is built by LangChain Inc, the creators of LangChain, but can be used without LangChain.
To learn more about LangGraph, check out our first LangChain Academy course, *Introduction to LangGraph*, available for free [here](https://academy.langchain.com/courses/intro-to-langgraph).
### Key Features
- **Cycles and Branching**: Implement loops and conditionals in your apps.
- **Persistence**: Automatically save state after each step in the graph. Pause and resume the graph execution at any point to support error recovery, human-in-the-loop workflows, time travel and more.
- **Human-in-the-Loop**: Interrupt graph execution to approve or edit next action planned by the agent.
- **Streaming Support**: Stream outputs as they are produced by each node (including token streaming).
- **Integration with LangChain**: LangGraph integrates seamlessly with [LangChain](https://github.com/langchain-ai/langchain/) and [LangSmith](https://docs.smith.langchain.com/) (but does not require them).
## How does it compare to LCEL?
The [**L**ang**C**hain **E**xpression **L**anguage (LCEL)](/docs/concepts/lcel) is an orchestration layer that allows LangChain to handle the run-time execution of chains in an optimized way.
While we have seen users run chains with hundreds of steps in production, we generally recommend using LCEL for simpler orchestration tasks. When the application requires complex state management, branching, cycles or multiple agents, we recommend that users take advantage of [LangGraph](/docs/concepts/langgraph).
If you are build complex LLM applications that may require multiple agents, branching, cycles, or advanced state management, LangGraph is the right tool for you, and remember that you can still use LCEL within individual nodes in LangGraph.
## Documentation
For additional information on LangGraph, please visit the [LangGraph documentation](https://langchain-ai.github.io/langgraph/) page.

View File

@@ -0,0 +1,4 @@
# LangServe
PLACE HOLDER TO BE REPLACED BY ACTUAL DOCUMENTATION
USED TO MAKE SURE THAT WE DO NOT FORGET TO ADD LINKS LATER

221
docs/docs/concepts/lcel.mdx Normal file
View File

@@ -0,0 +1,221 @@
# LangChain Expression Language (LCEL)
:::info Prerequisites
* [Runnable Interface](/docs/concepts/runnables)
:::
The **L**ang**C**hain **E**xpression **L**anguage (LCEL) takes a [declarative](https://en.wikipedia.org/wiki/Declarative_programming) approach to building new [Runnables](/docs/concepts/runnables) from existing Runnables.
This means that you describe what you want to happen, rather than how you want it to happen, allowing LangChain to optimize the run-time execution of the chains.
We often refer to a `Runnable` created using LCEL as a "chain". It's important to remember that a "chain" is `Runnable` and it implements the full [Runnable Interface](/docs/concepts/runnables).
:::note
* The [LCEL cheatsheet](https://python.langchain.com/docs/how_to/lcel_cheatsheet/) shows common patterns that involve the Runnable interface and LCEL expressions.
* Please see the following list of [how-to guides](/docs/how_to/#langchain-expression-language-lcel) that cover common tasks with LCEL.
* A list of built-in `Runnables` can be found in the [LangChain Core API Reference](https://python.langchain.com/api_reference/core/runnables.html). Many of these Runnables are useful when composing custom "chains" in LangChain using LCEL.
:::
## Benefits of LCEL
LangChain optimizes the run-time execution of chains built with LCEL in a number of ways:
- **Optimize parallel execution**: Run Runnables in parallel using [RunnableParallel](#RunnableParallel) or run multiple inputs through a given chain in parallel using the [Runnable Batch API](/docs/concepts/runnables#batch). Parallel execution can significantly reduce the latency as processing can be done in parallel instead of sequentially.
- **Guarantee Async support**: Any chain built with LCEL can be run asynchronously using the [Runnable Async API](/docs/concepts/runnables#async-api). This can be useful when running chains in a server environment where you want to handle large number of requests concurrently.
- **Simplify streaming**: LCEL chains can be streamed, allowing for incremental output as the chain is executed. LangChain can optimize the streaming of the output to minimize the time-to-first-token(time elapsed until the first chunk of output from a [chat model](/docs/concepts/chat_models) or [llm](/docs/concepts/llms) comes out).
Other benefits include:
- [**Seamless LangSmith tracing**](https://docs.smith.langchain.com)
As your chains get more and more complex, it becomes increasingly important to understand what exactly is happening at every step.
With LCEL, **all** steps are automatically logged to [LangSmith](https://docs.smith.langchain.com/) for maximum observability and debuggability.
- **Standard API**: Because all chains are built using the Runnable interface, they can be used in the same way as any other Runnable.
- [**Deployable with LangServe**](/docs/concepts/langserve): Chains built with LCEL can be deployed using for production use.
## Should I use LCEL?
LCEL is an [orchestration solution](https://en.wikipedia.org/wiki/Orchestration_(computing)) -- it allows LangChain to handle run-time execution of chains in an optimized way.
While we have seen users run chains with hundreds of steps in production, we generally recommend using LCEL for simpler orchestration tasks. When the application requires complex state management, branching, cycles or multiple agents, we recommend that users take advantage of [LangGraph](/docs/concepts/langgraph).
In LangGraph, users define graphs that specify the flow of the application. This allows users to keep using LCEL within individual nodes when LCEL is needed, while making it easy to define complex orchestration logic that is more readable and maintainable.
Here are some guidelines:
* If you are making a single LLM call, you don't need LCEL; instead call the underlying [chat model](/docs/concepts/chat_models) directly.
* If you have a simple chain (e.g., prompt + llm + parser, simple retrieval set up etc.), LCEL is a reasonable fit, if you're taking advantage of the LCEL benefits.
* If you're building a complex chain (e.g., with branching, cycles, multiple agents, etc.) use [LangGraph](/docs/concepts/langgraph) instead. Remember that you can always use LCEL within individual nodes in LangGraph.
## Composition Primitives
`LCEL` chains are built by composing existing `Runnables` together. The two main composition primitives are [RunnableSequence](https://python.langchain.com/api_reference/core/runnables/langchain_core.runnables.base.RunnableSequence.html#langchain_core.runnables.base.RunnableSequence) and [RunnableParallel](https://python.langchain.com/api_reference/core/runnables/langchain_core.runnables.base.RunnableParallel.html#langchain_core.runnables.base.RunnableParallel).
Many other composition primitives (e.g., [RunnableAssign](
https://python.langchain.com/api_reference/core/runnables/langchain_core.runnables.passthrough.RunnableAssign.html#langchain_core.runnables.passthrough.RunnableAssign
)) can be thought of as variations of these two primitives.
:::note
You can find a list of all composition primitives in the [LangChain Core API Reference](https://python.langchain.com/api_reference/core/runnables.html).
:::
### RunnableSequence
`RunnableSequence` is a composition primitive that allows you "chain" multiple runnables sequentially, with the output of one runnable serving as the input to the next.
```python
from langchain_core.runnables import RunnableSequence
chain = RunnableSequence([runnable1, runnable2])
```
Invoking the `chain` with some input:
```python
final_output = chain.invoke(some_input)
```
corresponds to the following:
```python
output1 = runnable1.invoke(some_input)
final_output = runnable2.invoke(output1)
```
:::note
`runnable1` and `runnable2` are placeholders for any `Runnable` that you want to chain together.
:::
### RunnableParallel
`RunnableParallel` is a composition primitive that allows you to run multiple runnables concurrently, with the same input provided to each.
```python
from langchain_core.runnables import RunnableParallel
chain = RunnableParallel({
"key1": runnable1,
"key2": runnable2,
})
```
Invoking the `chain` with some input:
```python
final_output = chain.invoke(some_input)
```
Will yield a `final_output` dictionary with the same keys as the input dictionary, but with the values replaced by the output of the corresponding runnable.
```python
{
"key1": runnable1.invoke(some_input),
"key2": runnable2.invoke(some_input),
}
```
Recall, that the runnables are executed in parallel, so while the result is the same as
dictionary comprehension shown above, the execution time is much faster.
:::note
`RunnableParallel`supports both synchronous and asynchronous execution (as all `Runnables` do).
* For synchronous execution, `RunnableParallel` uses a [ThreadPoolExecutor](https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor) to run the runnables concurrently.
* For asynchronous execution, `RunnableParallel` uses [asyncio.gather](https://docs.python.org/3/library/asyncio.html#asyncio.gather) to run the runnables concurrently.
:::
## Composition Syntax
The usage of `RunnableSequence` and `RunnableParallel` is so common that we created a shorthand syntax for using them. This helps
to make the code more readable and concise.
### The `|` operator
We have [overloaded](https://docs.python.org/3/reference/datamodel.html#special-method-names) the `|` operator to create a `RunnableSequence` from two `Runnables`.
```python
chain = runnable1 | runnable2
```
is Equivalent to:
```python
chain = RunnableSequence([runnable1, runnable2])
```
### The `.pipe` method`
If you have moral qualms with operator overloading, you can use the `.pipe` method instead. This is equivalent to the `|` operator.
```python
chain = runnable1.pipe(runnable2)
```
### Coercion
LCEL applies automatic type coercion to make it easier to compose chains.
If you do not understand the type coercion, you can always use the `RunnableSequence` and `RunnableParallel` classes directly.
This will make the code more verbose, but it will also make it more explicit.
#### Dictionary to RunnableParallel
Inside an LCEL expression, a dictionary is automatically converted to a `RunnableParallel`.
For example, the following code:
```python
mapping = {
"key1": runnable1,
"key2": runnable2,
}
chain = mapping | runnable3
```
It gets automatically converted to the following:
```python
chain = RunnableSequence([RunnableParallel(mapping), runnable3])
```
:::caution
You have to be careful because the `mapping` dictionary is not a `RunnableParallel` object, it is just a dictionary. This means that the following code will raise an `AttributeError`:
```python
mapping.invoke(some_input)
```
:::
#### Function to RunnableLambda
Inside an LCEL expression, a function is automatically converted to a `RunnableLambda`.
```
def some_func(x):
return x
chain = some_func | runnable1
```
It gets automatically converted to the following:
```python
chain = RunnableSequence([RunnableLambda(some_func), runnable1])
```
:::caution
You have to be careful because the lambda function is not a `RunnableLambda` object, it is just a function. This means that the following code will raise an `AttributeError`:
```python
lambda x: x + 1.invoke(some_input)
```
:::
## Legacy Chains
LCEL aims to provide consistency around behavior and customization over legacy subclassed chains such as `LLMChain` and
`ConversationalRetrievalChain`. Many of these legacy chains hide important details like prompts, and as a wider variety
of viable models emerge, customization has become more and more important.
If you are currently using one of these legacy chains, please see [this guide for guidance on how to migrate](/docs/versions/migrating_chains).
For guides on how to do specific tasks with LCEL, check out [the relevant how-to guides](/docs/how_to/#langchain-expression-language-lcel).

Some files were not shown because too many files have changed in this diff Show More