Compare commits

...

315 Commits

Author SHA1 Message Date
Brayden Zhong
a70f31de5f Community: RankLLMRerank AttributeError (Handle list-based rerank results) (#29840)
# community: Fix AttributeError in RankLLMRerank (`list` object has no
attribute `candidates`)

## **Description**
This PR fixes an issue in `RankLLMRerank` where reranking fails with the
following error:

```
AttributeError: 'list' object has no attribute 'candidates'
```

The issue arises because `rerank_batch()` returns a `List[Result]`
instead of an object containing `.candidates`.

### **Changes Introduced**
- Adjusted `compress_documents()` to support both:
  - Old API format: `rerank_results.candidates`
  - New API format: `rerank_results` as a list
  - Also fix wrong .txt location parsing while I was at it.

---

## **Issue**
Fixes **AttributeError** in `RankLLMRerank` when using
`compression_retriever.invoke()`. The issue is observed when
`rerank_batch()` returns a list instead of an object with `.candidates`.

**Relevant log:**
```
AttributeError: 'list' object has no attribute 'candidates'
```

## **Dependencies**
- No additional dependencies introduced.

---

## **Checklist**
- [x] **Backward compatible** with previous API versions
- [x] **Tested** locally with different RankLLM models
- [x] **No new dependencies introduced**
- [x] **Linted** with `make format && make lint`
- [x] **Ready for review**

---

## **Testing**
- Ran `compression_retriever.invoke(query)`

## **Reviewers**
If no review within a few days, please **@mention** one of:
- @baskaryan
- @efriis
- @eyurtsev
- @ccurme
- @vbarda
- @hwchase17
2025-02-20 12:38:31 -05:00
Levon Ghukasyan
ec403c442a Separate deepale vector store (#29902)
Thank you for contributing to LangChain!

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

- [ ] **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>
2025-02-20 17:37:19 +00:00
Jorge Piedrahita Ortiz
3acf842e35 core: add sambanova chat models to load module mapping (#29855)
- **Description:** add sambanova integration package chat models to load
module mapping, to allow serialization and deserialization
2025-02-20 12:30:50 -05:00
ccurme
d227e4a08e mistralai[patch]: release 0.2.7 (#29906) 2025-02-20 17:27:12 +00:00
Hande
d8bab89e6e community: add cognee retriever (#29878)
This PR adds a new cognee integration, knowledge graph based retrieval
enabling developers to ingest documents into cognee’s knowledge graph,
process them, and then retrieve context via CogneeRetriever.
It includes:
- langchain_cognee package with a CogneeRetriever class
- a test for the integration, demonstrating how to create, process, and
retrieve with cognee
- an example notebook showing its use. It lives in
`docs/docs/integrations` directory.


Followed 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.

Thank you for the review!

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-02-20 17:15:23 +00:00
Sinan CAN
97dd5f45ae Update retrieval.mdx (#29905)
Thank you for contributing to LangChain!

- [ ] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core, etc. is
being modified. Use "docs: ..." for purely docs 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>
2025-02-20 17:12:29 +00:00
dokato
92b415a9f6 community: Made some Jira fields optional for agent to work correctly (#29876)
**Description:** Two small changes have been proposed here:
(1)
Previous code assumes that every issue has a priority field. If an issue
lacks this field, the code will raise a KeyError.
Now, the code checks if priority exists before accessing it. If priority
is missing, it assigns None instead of crashing. This prevents runtime
errors when processing issues without a priority.

(2)

Also If the "style" field is missing, the code throws a KeyError.
`.get("style", None)` safely retrieves the value if present.

**Issue:** #29875 

**Dependencies:** N/A
2025-02-20 12:10:11 -05:00
am-kinetica
ca7eccba1f Handled a bug around empty query results differently (#29877)
Thank you for contributing to LangChain!

- [ ] **Handled query records properly**: "community:
vectorstores/kinetica"

- [ ] **Bugfix for empty query results handling**: 
- **Description:** checked for the number of records returned by a query
before processing further
- **Issue:** resulted in an `AttributeError` earlier which has now been
fixed

@efriis
2025-02-20 12:07:49 -05:00
Antonio Pisani
2c403a3ea9 docs: Add langchain-prolog documentation (#29788)
I want to add documentation for a new integration with SWI-Prolog.

@hwchase17 check this out:

https://github.com/apisani1/langchain-prolog/tree/main/examples/travel_agent

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-02-20 11:50:28 -05:00
Marlene
be7fa920fa Partner: Azure AI Langchain Docs and Package Registry (#29879)
This PR adds documentation for the Azure AI package in Langchain to the
main mono-repo

No issue connected or updated dependencies.

Utilises existing tests and makes updates to the docs

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-02-20 14:35:26 +00:00
Hankyeol Kyung
2dd0ce3077 openai: Update reasoning_effort arg documentation (#29897)
**Description:** Update docstring for `reasoning_effort` argument to
specify that it applies to reasoning models only (e.g., OpenAI o1 and
o3-mini), clarifying its supported models.
**Issue:** None
**Dependencies:** None
2025-02-20 09:03:42 -05:00
Joe Ferrucci
c28ee329c9 Fix typo in local_llms.ipynb docs (#29903)
Change `tailed` to `tailored`

`Docs > How-To > Local LLMs:`

https://python.langchain.com/docs/how_to/local_llms/#:~:text=use%20a%20prompt-,tailed,-for%20your%20specific
2025-02-20 09:03:10 -05:00
ccurme
ed3c2bd557 core[patch]: set version="v2" as default in astream_events (#29894) 2025-02-19 23:21:37 +00:00
Fabian Blatz
a2d05a376c community: ConfluenceLoader: add a filter method for attachments (#29882)
Adds a `attachment_filter_func` parameter to the ConfluenceLoader class
which can be used to determine which files are indexed. This is useful
if you are interested in excluding files based on their media type or
other metadata.
2025-02-19 18:20:45 -05:00
ccurme
9ed47a4d63 community[patch]: release 0.3.18 (#29896) 2025-02-19 20:13:00 +00:00
ccurme
92889edafd core[patch]: release 0.3.37 (#29895) 2025-02-19 20:04:35 +00:00
ccurme
ffd6194060 core[patch]: de-beta rate limiters (#29891) 2025-02-19 19:19:59 +00:00
Erick Friis
5637210a20 infra: run docs build on packages.yml updates (#29796)
Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-02-19 18:45:30 +00:00
ccurme
fb4c8423f0 docs: fix builds (#29890)
Missed in https://github.com/langchain-ai/langchain/pull/29889
2025-02-19 13:35:59 -05:00
ccurme
68b13e5172 pinecone: delete from monorepo (#29889)
This now lives in https://github.com/langchain-ai/langchain-pinecone
2025-02-19 12:55:15 -05:00
Erick Friis
6c1e21d128 core: basemessage.text() (#29078) 2025-02-18 17:45:44 -08:00
Ben Burns
e2ba336e72 docs: fix partner package table build for packages with no download stats (#29871)
The build in #29867 is currently broken because `langchain-cli` didn't
add download stats to the provider file.

This change gracefully handles sorting packages with missing download
counts. I initially updated the build to fetch download counts on every
run, but pypistats [requests](https://pypistats.org/api/) that users not
fetch stats like this via CI.
2025-02-19 11:05:57 +13:00
Eugene Yurtsev
8e5074d82d core: release 0.3.36 (#29869)
Release 0.3.36
2025-02-18 19:51:43 +00:00
Vadym Barda
d04fa1ae50 core[patch]: allow passing JSON schema as args_schema to tools (#29812) 2025-02-18 14:44:31 -05:00
ccurme
5034a8dc5c xai[patch]: release 0.2.1 (#29854) 2025-02-17 14:30:41 -05:00
ccurme
83dcef234d xai[patch]: support dedicated structured output feature (#29853)
https://docs.x.ai/docs/guides/structured-outputs

Interface appears identical to OpenAI's.
```python
from langchain.chat_models import init_chat_model
from pydantic import BaseModel

class Joke(BaseModel):
    setup: str
    punchline: str

llm = init_chat_model("xai:grok-2").with_structured_output(
    Joke, method="json_schema"
)
llm.invoke("Tell me a joke about cats.")
```
2025-02-17 14:19:51 -05:00
ccurme
9d6fcd0bfb infra: add xai to scheduled testing (#29852) 2025-02-17 18:59:45 +00:00
ccurme
8a3b05ae69 langchain[patch]: release 0.3.19 (#29851) 2025-02-17 13:36:23 -05:00
ccurme
c9061162a1 langchain[patch]: add xai to extras (#29850) 2025-02-17 17:49:34 +00:00
Bagatur
1acf57e9bd langchain[patch]: init_chat_model xai support (#29849) 2025-02-17 09:45:39 -08:00
Paul Nikonowicz
1a55da9ff4 docs: Update gemini vector docs (#29841)
# Description

2 changes: 
1. removes get pass from the code example as it reads from stdio causing
a freeze to occur
2. updates to the latest gemini model in the example

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-02-17 07:54:23 -05:00
hsm207
037b129b86 weaviate: Add-deprecation-warning (#29757)
- **Description:** add deprecation warning when using weaviate from
langchain_community
  - **Issue:** NA
  - **Dependencies:** NA
  - **Twitter handle:** NA

---------

Signed-off-by: hsm207 <hsm207@users.noreply.github.com>
Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-02-16 21:42:18 -05:00
Đỗ Quang Minh
cd198ac9ed community: add custom model for OpenAIWhisperParser (#29831)
Add `model` properties for OpenAIWhisperParser. Defaulted to `whisper-1`
(previous value).
Please help me update the docs and other related components of this
repo.
2025-02-16 21:26:07 -05:00
Cole McIntosh
6874c9c1d0 docs: add notebook for langchain-salesforce package (#29800)
**Description:**  
This PR adds a Jupyter notebook that explains the features,
installation, and usage of the
[`langchain-salesforce`](https://github.com/colesmcintosh/langchain-salesforce)
package. The notebook includes:
- Setup instructions for configuring Salesforce credentials  
- Example code demonstrating common operations such as querying,
describing objects, creating, updating, and deleting records

**Issue:**  
N/A

**Dependencies:**  
No new dependencies are required.

**Tests and Docs:**  
- Added an example notebook demonstrating the usage of the
`langchain-salesforce` package, located in `docs/docs/integrations`.

**Lint and Test:**  
- Ran `make format`, `make lint`, and `make test` successfully.

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-02-16 08:34:57 -05:00
Jan Heimes
60f58df5b3 community: add top_k as param to Needle Retriever (#29821)
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, "infra: ..."
for CI changes.
  - Example: "community: add foobar LLM"


- [x] **PR message**: 
This PR adds top_k as a param to the Needle Retriever. By default we use
top 10.



- [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.
2025-02-16 08:30:52 -05:00
Mateusz Szewczyk
8147679169 docs: Rename IBM product name to IBM watsonx (#29802)
Thank you for contributing to LangChain!

Rename IBM product name to `IBM watsonx`

- [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/
2025-02-15 21:48:02 -05:00
Jesus Fernandez Bes
1dfac909d8 community: Adding IN Operator to AzureCosmosDBNoSQLVectorStore (#29805)
- ** Description**: I have added a new operator in the operator map with
key `$in` and value `IN`, so that you can define filters using lists as
values. This was already contemplated but as IN operator was not in the
map they cannot be used.
- **Issue**: Fixes #29804.
- **Dependencies**: No extra.
2025-02-15 21:44:54 -05:00
Wahed Hemati
8901b113c3 docs: add Discord integration docs (#29822)
This PR adds documentation for the `langchain-discord-shikenso`
integration, including an example notebook at
`docs/docs/integrations/tools/discord.ipynb` and updates to
`libs/packages.yml` to track the new package.

  **Issue:**  
  N/A

  **Dependencies:**  
  None

  **Twitter handle:**  
  N/A

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-02-15 21:43:45 -05:00
Akmal Ali Jasmin
f1792e486e fix: Correct getpass usage in Google Generative AI Embedding docs (#29809) (#29810)
**fix: Correct getpass usage in Google Generative AI Embedding docs
(#29809)**

- **Description:** Corrected the `getpass` usage in the Google
Generative AI Embedding documentation by replacing `getpass()` with
`getpass.getpass()` to fix the `TypeError`.
- **Issue:** #29809  
- **Dependencies:** None  

**Additional Notes:**  
The change ensures compatibility with Google Colab and follows Python's
`getpass` module usage standards.
2025-02-15 21:41:00 -05:00
HackHuang
80ca310c15 langchain : Add the full code snippet in rag.ipynb (#29820)
docs(rag.ipynb) : Add the `full code` snippet, it’s necessary and useful
for beginners to demonstrate.

Preview the change :
https://langchain-git-fork-googtech-patch-3-langchain.vercel.app/docs/tutorials/rag/

Two `full code` snippets are added as below :
<details>
<summary>Full Code:</summary>

```python
import bs4
from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.chat_models import init_chat_model
from langchain_openai import OpenAIEmbeddings
from langchain_core.vectorstores import InMemoryVectorStore
from google.colab import userdata
from langchain_core.prompts import PromptTemplate
from langchain_core.documents import Document
from typing_extensions import List, TypedDict
from langgraph.graph import START, StateGraph

#################################################
# 1.Initialize the ChatModel and EmbeddingModel #
#################################################
llm = init_chat_model(
    model="gpt-4o-mini",
    model_provider="openai",
    openai_api_key=userdata.get('OPENAI_API_KEY'),
    base_url=userdata.get('BASE_URL'),
)
embeddings = OpenAIEmbeddings(
    model="text-embedding-3-large",
    openai_api_key=userdata.get('OPENAI_API_KEY'),
    base_url=userdata.get('BASE_URL'),
)

#######################
# 2.Loading documents #
#######################
loader = WebBaseLoader(
    web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
    bs_kwargs=dict(
        # Only keep post title, headers, and content from the full HTML.
        parse_only=bs4.SoupStrainer(
            class_=("post-content", "post-title", "post-header")
        )
    ),
)
docs = loader.load()

#########################
# 3.Splitting documents #
#########################
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,  # chunk size (characters)
    chunk_overlap=200,  # chunk overlap (characters)
    add_start_index=True,  # track index in original document
)
all_splits = text_splitter.split_documents(docs)

###########################################################
# 4.Embedding documents and storing them in a vectorstore #
###########################################################
vector_store = InMemoryVectorStore(embeddings)
_ = vector_store.add_documents(documents=all_splits)

##########################################################
# 5.Customizing the prompt or loading it from Prompt Hub #
##########################################################
# prompt = hub.pull("rlm/rag-prompt") # load the prompt from the prompt-hub
template = """Use the following pieces of context to answer the question at the end.
If you don't know the answer, just say that you don't know, don't try to make up an answer.
Use three sentences maximum and keep the answer as concise as possible.
Always say "thanks for asking!" at the end of the answer.

{context}

Question: {question}

Helpful Answer:"""
prompt = PromptTemplate.from_template(template)

##################################################################################################
# 5.Using LangGraph to tie together the retrieval and generation steps into a single application #                               #
##################################################################################################
# 5.1.Define the state of application, which controls the application datas
class State(TypedDict):
    question: str
    context: List[Document]
    answer: str

# 5.2.1.Define the node of application, which signifies the application steps
def retrieve(state: State):
    retrieved_docs = vector_store.similarity_search(state["question"])
    return {"context": retrieved_docs}

# 5.2.2.Define the node of application, which signifies the application steps
def generate(state: State):
    docs_content = "\n\n".join(doc.page_content for doc in state["context"])
    messages = prompt.invoke({"question": state["question"], "context": docs_content})
    response = llm.invoke(messages)
    return {"answer": response.content}

# 6.Define the "control flow" of application, which signifies the ordering of the application steps
graph_builder = StateGraph(State).add_sequence([retrieve, generate])
graph_builder.add_edge(START, "retrieve")
graph = graph_builder.compile()
```

</details>

<details>
<summary>Full Code:</summary>

```python
import bs4
from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.chat_models import init_chat_model
from langchain_openai import OpenAIEmbeddings
from langchain_core.vectorstores import InMemoryVectorStore
from google.colab import userdata
from langchain_core.prompts import PromptTemplate
from langchain_core.documents import Document
from typing_extensions import List, TypedDict
from langgraph.graph import START, StateGraph
from typing import Literal
from typing_extensions import Annotated

#################################################
# 1.Initialize the ChatModel and EmbeddingModel #
#################################################
llm = init_chat_model(
    model="gpt-4o-mini",
    model_provider="openai",
    openai_api_key=userdata.get('OPENAI_API_KEY'),
    base_url=userdata.get('BASE_URL'),
)
embeddings = OpenAIEmbeddings(
    model="text-embedding-3-large",
    openai_api_key=userdata.get('OPENAI_API_KEY'),
    base_url=userdata.get('BASE_URL'),
)

#######################
# 2.Loading documents #
#######################
loader = WebBaseLoader(
    web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
    bs_kwargs=dict(
        # Only keep post title, headers, and content from the full HTML.
        parse_only=bs4.SoupStrainer(
            class_=("post-content", "post-title", "post-header")
        )
    ),
)
docs = loader.load()

#########################
# 3.Splitting documents #
#########################
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,  # chunk size (characters)
    chunk_overlap=200,  # chunk overlap (characters)
    add_start_index=True,  # track index in original document
)
all_splits = text_splitter.split_documents(docs)

# Search analysis: Add some metadata to the documents in our vector store,
# so that we can filter on section later. 
total_documents = len(all_splits)
third = total_documents // 3
for i, document in enumerate(all_splits):
    if i < third:
        document.metadata["section"] = "beginning"
    elif i < 2 * third:
        document.metadata["section"] = "middle"
    else:
        document.metadata["section"] = "end"

# Search analysis: Define the schema for our search query
class Search(TypedDict):
    query: Annotated[str, ..., "Search query to run."]
    section: Annotated[
        Literal["beginning", "middle", "end"], ..., "Section to query."]

###########################################################
# 4.Embedding documents and storing them in a vectorstore #
###########################################################
vector_store = InMemoryVectorStore(embeddings)
_ = vector_store.add_documents(documents=all_splits)

##########################################################
# 5.Customizing the prompt or loading it from Prompt Hub #
##########################################################
# prompt = hub.pull("rlm/rag-prompt") # load the prompt from the prompt-hub
template = """Use the following pieces of context to answer the question at the end.
If you don't know the answer, just say that you don't know, don't try to make up an answer.
Use three sentences maximum and keep the answer as concise as possible.
Always say "thanks for asking!" at the end of the answer.

{context}

Question: {question}

Helpful Answer:"""
prompt = PromptTemplate.from_template(template)

###################################################################
# 5.Using LangGraph to tie together the analyze_query, retrieval  #
# and generation steps into a single application                  #
###################################################################
# 5.1.Define the state of application, which controls the application datas
class State(TypedDict):
    question: str
    query: Search
    context: List[Document]
    answer: str

# Search analysis: Define the node of application, 
# which be used to generate a query from the user's raw input
def analyze_query(state: State):
    structured_llm = llm.with_structured_output(Search)
    query = structured_llm.invoke(state["question"])
    return {"query": query}

# 5.2.1.Define the node of application, which signifies the application steps
def retrieve(state: State):
    query = state["query"]
    retrieved_docs = vector_store.similarity_search(
        query["query"],
        filter=lambda doc: doc.metadata.get("section") == query["section"],
    )
    return {"context": retrieved_docs}

# 5.2.2.Define the node of application, which signifies the application steps
def generate(state: State):
    docs_content = "\n\n".join(doc.page_content for doc in state["context"])
    messages = prompt.invoke({"question": state["question"], "context": docs_content})
    response = llm.invoke(messages)
    return {"answer": response.content}

# 6.Define the "control flow" of application, which signifies the ordering of the application steps
graph_builder = StateGraph(State).add_sequence([analyze_query, retrieve, generate]) 
graph_builder.add_edge(START, "analyze_query")
graph = graph_builder.compile()
```

</details>

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-02-15 21:37:58 -05:00
Michael Chin
b2c21f3e57 docs: Update SagemakerEndpoint examples (#29814)
Related issue: https://github.com/langchain-ai/langchain-aws/issues/361

Updated the AWS `SagemakerEndpoint` LLM documentation to import from
`langchain-aws`.
2025-02-15 21:34:56 -05:00
Krishna Kulkarni
a98c5f1c4b langchain_community: add image support to DuckDuckGoSearchAPIWrapper (#29816)
- [ ] **PR title**: langchain_community: add image support to
DuckDuckGoSearchAPIWrapper

- **Description:** This PR enhances the DuckDuckGoSearchAPIWrapper
within the langchain_community package by introducing support for image
searches. The enhancement includes:
  - Adding a new method _ddgs_images to handle image search queries.
- Updating the run and results methods to process and return image
search results appropriately.
- Modifying the source parameter to accept "images" as a valid option,
alongside "text" and "news".
- **Dependencies:** No additional dependencies are required for this
change.
2025-02-15 21:32:14 -05:00
Iris Liu
0d9f0b4215 docs: updates Chroma integration API ref docs (#29826)
- Description: updates Chroma integration API ref docs
- Issue: #29817
- Dependencies: N/A
- Twitter handle: @irieliu

Co-authored-by: “Iris <“liuirisny@gmail.com”>
2025-02-15 21:05:21 -05:00
ccurme
3fe7c07394 openai[patch]: release 0.3.6 (#29824) 2025-02-15 13:53:35 -05:00
ccurme
65a6dce428 openai[patch]: enable streaming for o1 (#29823)
Verified streaming works for the `o1-2024-12-17` snapshot as well.
2025-02-15 12:42:05 -05:00
Christophe Bornet
3dffee3d0b all: Bump blockbuster version to 1.5.18 (#29806)
Has fixes for running on Windows and non-CPython runtimes.
2025-02-14 07:55:38 -08:00
ccurme
d9a069c414 tests[patch]: release 0.3.12 (#29797) 2025-02-13 23:57:44 +00:00
ccurme
e4f106ea62 groq[patch]: remove xfails (#29794)
These appear to pass.
2025-02-13 15:49:50 -08:00
Erick Friis
f34e62ef42 packages: add langchain-xai (#29795)
wasn't registered per the contribution guide:
https://python.langchain.com/docs/contributing/how_to/integrations/
2025-02-13 15:36:41 -08:00
ccurme
49cc6106f7 tests[patch]: fix query for test_tool_calling_with_no_arguments (#29793) 2025-02-13 23:15:52 +00:00
Erick Friis
1a225fad03 multiple: fix uv path deps (#29790)
file:// format wasn't working with updates - it doesn't install as an
editable dep

move to tool.uv.sources with path= instead
2025-02-13 21:32:34 +00:00
Erick Friis
ff13384eb6 packages: update counts, add command (#29789) 2025-02-13 20:45:25 +00:00
Mateusz Szewczyk
8d0e31cbc5 docs: Fix model_id on EmbeddingTabs page (#29784)
Thank you for contributing to LangChain!

Fix `model_id` in IBM provider on EmbeddingTabs page

- [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/
2025-02-13 09:41:51 -08:00
Mateusz Szewczyk
61f1be2152 docs: Added IBM to ChatModelTabs and EmbeddingTabs (#29774)
Thank you for contributing to LangChain!

Added IBM to ChatModelTabs and EmbeddingTabs

- [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/
2025-02-13 08:43:42 -08:00
HackHuang
76d32754ff core : update the class docs of InMemoryVectorStore in in_memory.py (#29781)
- **Description:** Add the new introduction about checking `store` in
in_memory.py, It’s necessary and useful for beginners.
```python
Check Documents:
    .. code-block:: python
    
        for doc in vector_store.store.values():
            print(doc)
```

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-02-13 16:41:47 +00:00
Mateusz Szewczyk
b82cef36a5 docs: Update IBM WatsonxLLM and ChatWatsonx documentation (#29752)
Thank you for contributing to LangChain!

Update presented model in `WatsonxLLM` and `ChatWatsonx` documentation.

- [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/
2025-02-13 08:41:07 -08:00
Mohammad Mohtashim
96ad09fa2d (Community): Added API Key for Jina Search API Wrapper (#29622)
- **Description:** Simple change for adding the API Key for Jina Search
API Wrapper
- **Issue:** #29596
2025-02-12 20:12:07 -08:00
ccurme
f1c66a3040 docs: minor fix to provider table (#29771)
Langfair renders as LangfAIr
2025-02-13 04:06:58 +00:00
Jakub Kopecký
c8cb7c25bf docs: update apify integration (#29553)
**Description:** Fixed and updated Apify integration documentation to
use the new [langchain-apify](https://github.com/apify/langchain-apify)
package.
**Twitter handle:** @apify
2025-02-12 20:02:55 -08:00
ccurme
16fb1f5371 chroma[patch]: release 0.2.2 (#29769)
Resolves https://github.com/langchain-ai/langchain/issues/29765
2025-02-13 02:39:16 +00:00
Mohammad Mohtashim
2310847c0f (Chroma): Small Fix in add_texts when checking for embeddings (#29766)
- **Description:** Small fix in `add_texts` to make embedding
nullability is checked properly.
- **Issue:** #29765

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-02-13 02:26:13 +00:00
Eric Pinzur
716fd89d8e docs: contributed Graph RAG Retriever integration (#29744)
**Description:** 

This adds the `Graph RAG` Retriever integration documentation, per
https://python.langchain.com/docs/contributing/how_to/integrations/.

* The integration exists in this public repository:
https://github.com/datastax/graph-rag
* We've implemented the standard langchain tests for retrievers:
https://github.com/datastax/graph-rag/blob/main/packages/langchain-graph-retriever/tests/test_langchain.py
* Our integration is published to PyPi:
https://pypi.org/project/langchain-graph-retriever/
2025-02-12 18:25:48 -08:00
Sunish Sheth
f42dafa809 Deprecating sql_database access for creating UC functions for agent tools (#29745)
Thank you for contributing to LangChain!

- [ ] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core, etc. is
being modified. Use "docs: ..." for purely docs 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: ccurme <chester.curme@gmail.com>
2025-02-13 02:24:44 +00:00
Thor 雷神 Schaeff
a0970d8d7e [WIP] chore: update ElevenLabs tool. (#29722)
Thank you for contributing to LangChain!

- [ ] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core, etc. is
being modified. Use "docs: ..." for purely docs 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>
2025-02-13 01:54:34 +00:00
Chaymae El Aattabi
4b08a7e8e8 Fix #29759: Use local chunk_size_ for looping in embed_documents (#29761)
This fix ensures that the chunk size is correctly determined when
processing text embeddings. Previously, the code did not properly handle
cases where chunk_size was None, potentially leading to incorrect
chunking behavior.

Now, chunk_size_ is explicitly set to either the provided chunk_size or
the default self.chunk_size, ensuring consistent chunking. This update
improves reliability when processing large text inputs in batches and
prevents unintended behavior when chunk_size is not specified.

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-02-13 01:28:26 +00:00
Jorge Piedrahita Ortiz
1fbc01c350 docs: update sambanova integration api reference links (#29762)
- **Description:** update sambanova external package integration api
reference links in docs
2025-02-12 15:58:00 -08:00
Sunish Sheth
043d78d85d Deprecate langhchain community ucfunctiontoolkit in favor for databricks_langchain (#29746)
Thank you for contributing to LangChain!

- [ ] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core, etc. is
being modified. Use "docs: ..." for purely docs 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.
2025-02-12 15:50:35 -08:00
Hugues Chocart
e4eec9e9aa community: add langchain-abso documentation (#29739)
Add the documentation for the community package `langchain-abso`. It
provides a new Chat Model class, that uses https://abso.ai

---------

Co-authored-by: Harrison Chase <hw.chase.17@gmail.com>
2025-02-12 19:57:33 +00:00
ccurme
e61f463745 core[patch]: release 0.3.35 (#29764) 2025-02-12 18:13:10 +00:00
Nuno Campos
fe59f2cc88 core: Fix output of convert_messages when called with BaseMessage.model_dump() (#29763)
- additional_kwargs was being nested twice
- example, response_metadata was placed inside additional_kwargs
2025-02-12 10:05:33 -08:00
Jacob Lee
f4e3e86fbb feat(langchain): Infer o3 modelstrings passed to init_chat_model as OpenAI (#29743) 2025-02-11 16:51:41 -08:00
Mohammad Mohtashim
9f3bcee30a (Community): Adding Structured Support for ChatPerplexity (#29361)
- **Description:** Adding Structured Support for ChatPerplexity
- **Issue:** #29357
- This is implemented as per the Perplexity official docs:
https://docs.perplexity.ai/guides/structured-outputs

---------

Co-authored-by: ccurme <chester.curme@gmail.com>
2025-02-11 15:51:18 -08:00
Jawahar S
994c5465e0 feat: add support for IBM WatsonX AI chat models (#29688)
**Description:** Updated init_chat_model to support Granite models
deployed on IBM WatsonX
**Dependencies:**
[langchain-ibm](https://github.com/langchain-ai/langchain-ibm)

Tagging @baskaryan @efriis for review when you get a chance.
2025-02-11 15:34:29 -08:00
Shailendra Mishra
c7d74eb7a3 Oraclevs integration (#29723)
Thank you for contributing to LangChain!

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


- [ ] **PR message**: ***Delete this entire checklist*** and replace
with
- **Description:** Refactored code to allow a connection or a connection
pool.
- **Issue:** Normally an idel connection is terminated by the server
side listener at timeout. A user thus has to re-instantiate the vector
store. The timeout in case of connection is not configurable. The
solution is to use a connection pool where a user can specify a user
defined timeout and the connections are managed by the pool.
    - **Dependencies:** None
    - **Twitter handle:** 


- [ ] **Add tests and docs**: This is not a new integration. A user can
pass either a connection or a connection pool. The determination of what
is passed is made at run time. Everything should work as before.

- [ ] **Lint and test**:  Already done.

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>
2025-02-11 14:56:55 -08:00
ccurme
42ebf6ae0c deepseek[patch]: release 0.1.2 (#29742) 2025-02-11 11:53:43 -08:00
ccurme
ec55553807 pinecone[patch]: release 0.2.3 (#29741) 2025-02-11 19:27:39 +00:00
ccurme
001cf99253 pinecone[patch]: add support for python 3.13 (#29737) 2025-02-11 11:20:21 -08:00
ccurme
ba8f752bf5 openai[patch]: release 0.3.5 (#29740) 2025-02-11 19:20:11 +00:00
ccurme
9477f49409 openai, deepseek: make _convert_chunk_to_generation_chunk an instance method (#29731)
1. Make `_convert_chunk_to_generation_chunk` an instance method on
BaseChatOpenAI
2. Override on ChatDeepSeek to add `"reasoning_content"` to message
additional_kwargs.

Resolves https://github.com/langchain-ai/langchain/issues/29513
2025-02-11 11:13:23 -08:00
Christopher Menon
1edd27d860 docs: fix SQL-based metadata filter syntax, add link to BigQuery docs (#29736)
Fix the syntax for SQL-based metadata filtering in the [Google BigQuery
Vector Search
docs](https://python.langchain.com/docs/integrations/vectorstores/google_bigquery_vector_search/#searching-documents-with-metadata-filters).
Also add a link to learn more about BigQuery operators that can be used
here.

I have been using this library, and have found that this is the correct
syntax to use for the SQL-based filters.

**Issue**: no open issue.
**Dependencies**: none.
**Twitter handle**: none.

No tests as this is only a change to the documentation.

<!-- 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. -->
2025-02-11 11:10:12 -08:00
ccurme
d0c2dc06d5 mongodb[patch]: fix link in readme (#29738) 2025-02-11 18:19:59 +00:00
zzaebok
3b3d52206f community: change wikidata rest api version from v0 to v1 (#29708)
**Description:**

According to the [wikidata
documentation](https://www.wikidata.org/wiki/Wikidata_talk:REST_API),
Wikibase REST API version 1 (stable) is released from November 11, 2024.
Their guide is to use the new v1 API and, it just requires replacing v0
in the routes with v1 in almost all cases.
So I replaced WIKIDATA_REST_API_URL from v0 to v1 for stable usage.

Co-authored-by: ccurme <chester.curme@gmail.com>
2025-02-10 17:12:38 -08:00
ccurme
4a389ef4c6 community: fix extended testing (#29715)
v0.3.100 of premai sdk appears to break on import:
89d9276cbf/premai/api/__init__.py (L230)
2025-02-10 16:57:34 -08:00
Yoav Levy
af3f759073 docs: fixed nimble's provider page and retriever (#29695)
## **Description:**
- Added information about the retriever that Nimble's provider exposes.
- Fixed the authentication explanation on the retriever page.
2025-02-10 15:30:40 -08:00
Bhav Sardana
624216aa64 community:Fix for Pydantic model validator of GoogleApiYoutubeLoader (#29694)
- **Description:** Community: bugfix for pedantic model validator for
GoogleApiYoutubeLoader
- **Issue:** #29165, #27432 
Fix is similar to #29346
2025-02-10 08:57:58 -05:00
Changyong Um
60740c44c5 community: Add configurable text key for indexing and the retriever in Pinecone Hybrid Search (#29697)
**issue**

In Langchain, the original content is generally stored under the `text`
key. However, the `PineconeHybridSearchRetriever` searches the `context`
field in the metadata and cannot change this key. To address this, I
have modified the code to allow changing the key to something other than
context.

In my opinion, following Langchain's conventions, the `text` key seems
more appropriate than `context`. However, since I wasn't sure about the
author's intent, I have left the default value as `context`.
2025-02-10 08:56:37 -05:00
Jun He
894b0cac3c docs: Remove redundant line (#29698)
If I understand it correctly, chain1 is never used.
2025-02-10 08:53:21 -05:00
Tiest van Gool
6655246504 Classification Tutorial: Replaced .dict() with .model_dump() method (#29701)
The .dict() method is deprecated inf Pydantic V2.0 and use `model_dump`
method instead.

Thank you for contributing to LangChain!

- [ ] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core, etc. is
being modified. Use "docs: ..." for purely docs 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.
2025-02-10 08:38:15 -05:00
Edmond Wang
c36e6d4371 docs: Add Comments and Supplementary Example Code to Vearch Vector Dat… (#29706)
- **Description:** Added some comments to the example code in the Vearch
vector database documentation and included commonly used sample code.
- **Issue:** None
- **Dependencies:** None

---------

Co-authored-by: wangchuxiong <wangchuxiong@jd.com>
2025-02-10 08:35:38 -05:00
Akmal Ali Jasmin
bc5fafa20e [DOC] Fix #29685: HuggingFaceEndpoint missing task argument in documentation (#29686)
## **Description**
This PR updates the LangChain documentation to address an issue where
the `HuggingFaceEndpoint` example **does not specify the required `task`
argument**. Without this argument, users on `huggingface_hub == 0.28.1`
encounter the following error:

```
ValueError: Task unknown has no recommended model. Please specify a model explicitly.
```

---

## **Issue**
Fixes #29685

---

## **Changes Made**
 **Updated `HuggingFaceEndpoint` documentation** to explicitly define
`task="text-generation"`:
```python
llm = HuggingFaceEndpoint(
    repo_id=GEN_MODEL_ID,
    huggingfacehub_api_token=HF_TOKEN,
    task="text-generation"  # Explicitly specify task
)
```

 **Added a deprecation warning note** and recommended using
`InferenceClient`:
```python
from huggingface_hub import InferenceClient
from langchain.llms.huggingface_hub import HuggingFaceHub

client = InferenceClient(model=GEN_MODEL_ID, token=HF_TOKEN)

llm = HuggingFaceHub(
    repo_id=GEN_MODEL_ID,
    huggingfacehub_api_token=HF_TOKEN,
    client=client,
)
```

---

## **Dependencies**
- No new dependencies introduced.
- Change only affects **documentation**.

---

## **Testing**
-  Verified that adding `task="text-generation"` resolves the issue.
-  Tested the alternative approach with `InferenceClient` in Google
Colab.

---

## **Twitter Handle (Optional)**
If this PR gets announced, a shout-out to **@AkmalJasmin** would be
great! 🚀

---

## **Reviewers**
📌 **@langchain-maintainers** Please review this PR. Let me know if
further changes are needed.

🚀 This fix improves **developer onboarding** and ensures the **LangChain
documentation remains up to date**! 🚀
2025-02-08 14:41:02 -05:00
manukychen
3de445d521 using getattr and default value to prevent 'OpenSearchVectorSearch' has no attribute 'bulk_size' (#29682)
- Description: Adding getattr methods and set default value 500 to
cls.bulk_size, it can prevent the error below:
Error: type object 'OpenSearchVectorSearch' has no attribute 'bulk_size'

- Issue: https://github.com/langchain-ai/langchain/issues/29071
2025-02-08 14:39:57 -05:00
Yao Tianjia
5d581ba22c langchain: support the situation when action_input is null in json output_parser (#29680)
Description:
This PR fixes handling of null action_input in
[langchain.agents.output_parser]. Previously, passing null to
action_input could cause OutputParserException with unclear error
message which cause LLM don't know how to modify the action. The changes
include:

Added null-check validation before processing action_input
Implemented proper fallback behavior with default values
Maintained backward compatibility with existing implementations

Error Examples:
```
{
  "action":"some action",
  "action_input":null
}
```

Issue:
None

Dependencies:
None
2025-02-07 22:01:01 -05:00
Philippe PRADOS
beb75b2150 community[minor]: 05 - Refactoring PyPDFium2 parser (#29625)
This is one part of a larger Pull Request (PR) that is too large to be
submitted all at once. This specific part focuses on updating the
PyPDFium2 parser.

For more details, see
https://github.com/langchain-ai/langchain/pull/28970.
2025-02-07 21:31:12 -05:00
Christophe Bornet
723031d548 community: Bump ruff version to 0.9 (#29206)
Co-authored-by: Erick Friis <erick@langchain.dev>
2025-02-08 01:21:10 +00:00
Christophe Bornet
30f6c9f5c8 community: Use Blockbuster to detect blocking calls in asyncio during tests (#29609)
Same as https://github.com/langchain-ai/langchain/pull/29043 for
langchain-community.

**Dependencies:**
- blockbuster (test)

**Twitter handle:** cbornet_

Co-authored-by: Erick Friis <erick@langchain.dev>
2025-02-08 01:10:39 +00:00
Christophe Bornet
3a57a28daa langchain: Use Blockbuster to detect blocking calls in asyncio during tests (#29616)
Same as https://github.com/langchain-ai/langchain/pull/29043 for the
langchain package.

**Dependencies:**
- blockbuster (test)

**Twitter handle:** cbornet_

---------

Co-authored-by: Erick Friis <erick@langchain.dev>
2025-02-08 01:08:15 +00:00
Keenan Pepper
c67d473397 core: Make abatch_as_completed respect max_concurrency (#29426)
- **Description:** Add tests for respecting max_concurrency and
implement it for abatch_as_completed so that test passes
- **Issue:** #29425
- **Dependencies:** none
- **Twitter handle:** keenanpepper
2025-02-07 16:51:22 -08:00
Aaron V
dcfaae85d2 Core: Fix __add__ for concatting two BaseMessageChunk's (#29531)
Description:

The change allows you to use the overloaded `+` operator correctly when
`+`ing two BaseMessageChunk subclasses. Without this you *must*
instantiate a subclass for it to work.

Which feels... wrong. Base classes should be decoupled from sub classes
and should have in no way a dependency on them.

Issue:

You can't `+` a BaseMessageChunk with a BaseMessageChunk

e.g. this will explode

```py
from langchain_core.outputs import (
    ChatGenerationChunk,
)
from langchain_core.messages import BaseMessageChunk


chunk1 = ChatGenerationChunk(
    message=BaseMessageChunk(
        type="customChunk",
        content="HI",
    ),
)

chunk2 = ChatGenerationChunk(
    message=BaseMessageChunk(
        type="customChunk",
        content="HI",
    ),
)

# this will throw
new_chunk = chunk1 + chunk2
```

In case anyone ran into this issue themselves, it's probably best to use
the AIMessageChunk:

a la 

```py
from langchain_core.outputs import (
    ChatGenerationChunk,
)
from langchain_core.messages import AIMessageChunk


chunk1 = ChatGenerationChunk(
    message=AIMessageChunk(
        content="HI",
    ),
)

chunk2 = ChatGenerationChunk(
    message=AIMessageChunk(
        content="HI",
    ),
)

# No explosion!
new_chunk = chunk1 + chunk2
```

Dependencies:

None!

Twitter handle: 
`aaron_vogler`

Keeping these for later if need be:
```
baskaryan
efriis 
eyurtsev
ccurme 
vbarda
hwchase17
baskaryan
efriis
```

Co-authored-by: Erick Friis <erick@langchain.dev>
2025-02-08 00:43:36 +00:00
Marlene
4fa3ef0d55 Community/Partner: Adding Azure community and partner user agent to better track usage in Python (#29561)
- This pull request includes various changes to add a `user_agent`
parameter to Azure OpenAI, Azure Search and Whisper in the Community and
Partner packages. This helps in identifying the source of API requests
so we can better track usage and help support the community better. I
will also be adding the user_agent to the new `langchain-azure` repo as
well.

- No issue connected or  updated dependencies. 
- Utilises existing tests and docs

---------

Co-authored-by: Erick Friis <erick@langchain.dev>
2025-02-07 23:28:30 +00:00
Ella Charlaix
c401254770 huggingface: Add ipex support to HuggingFaceEmbeddings (#29386)
ONNX and OpenVINO models are available by specifying the `backend`
argument (the model is loaded using `optimum`
https://github.com/huggingface/optimum)

```python
from langchain_huggingface import HuggingFaceEmbeddings

embedding = HuggingFaceEmbeddings(
    model_name=model_id,
    model_kwargs={"backend": "onnx"},
)
```

With this PR we also enable the IPEX backend 



```python
from langchain_huggingface import HuggingFaceEmbeddings

embedding = HuggingFaceEmbeddings(
    model_name=model_id,
    model_kwargs={"backend": "ipex"},
)
```
2025-02-07 15:21:09 -08:00
Bruno Alvisio
3eaf561561 core: Handle unterminated escape character when parsing partial JSON (#29065)
**Description**
Currently, when parsing a partial JSON, if a string ends with the escape
character, the whole key/value is removed. For example:

```
>>> from langchain_core.utils.json import parse_partial_json
>>> my_str = '{"foo": "bar", "baz": "qux\\'
>>> 
>>> parse_partial_json(my_str)
{'foo': 'bar'}
```

My expectation (and with this fix) would be for `parse_partial_json()`
to return:
```
>>> from langchain_core.utils.json import parse_partial_json
>>> 
>>> my_str = '{"foo": "bar", "baz": "qux\\'
>>> parse_partial_json(my_str)
{'foo': 'bar', 'baz': 'qux'}
```

Notes:
1. It could be argued that current behavior is still desired.
2. I have experienced this issue when the streaming output from an LLM
and the chunk happens to end with `\\`
3. I haven't included tests. Will do if change is accepted.
4. This is specially troublesome when this function is used by

187131c55c/libs/core/langchain_core/output_parsers/transform.py (L111)

since what happens is that, for example, if the received sequence of
chunks are: `{"foo": "b` , `ar\\` :

Then, the result of calling `self.parse_result()` is:
```
{"foo": "b"}
```
and the second time:
```
{}
```

Co-authored-by: Erick Friis <erick@langchain.dev>
2025-02-07 23:18:21 +00:00
ccurme
0040d93b09 docs: showcase extras in chat model tabs (#29677)
Co-authored-by: Erick Friis <erick@langchain.dev>
2025-02-07 18:16:44 -05:00
Viren
252cf0af10 docs: add LangFair as a provider (#29390)
**Description:**
- Add `docs/docs/providers/langfair.mdx`
- Register langfair in `libs/packages.yml`

**Twitter handle:** @LangFair

**Tests and docs**
1. Integration tests not needed as this PR only adds a .mdx file to
docs.

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
Co-authored-by: Dylan Bouchard <dylan.bouchard@cvshealth.com>
Co-authored-by: Dylan Bouchard <109233938+dylanbouchard@users.noreply.github.com>
Co-authored-by: Erick Friis <erickfriis@gmail.com>
Co-authored-by: Erick Friis <erick@langchain.dev>
2025-02-07 21:27:37 +00:00
Erick Friis
eb9eddae0c docs: use init_chat_model (#29623) 2025-02-07 12:39:27 -08:00
ccurme
bff25b552c community: release 0.3.17 (#29676) 2025-02-07 19:41:44 +00:00
ccurme
01314c51fa langchain: release 0.3.18 (#29654) 2025-02-07 13:40:26 -05:00
ccurme
92e2239414 openai[patch]: make parallel_tool_calls explicit kwarg of bind_tools (#29669)
Improves discoverability and documentation.

cc @vbarda
2025-02-07 13:34:32 -05:00
ccurme
2a243df7bb infra: add UV_NO_SYNC to monorepo makefile (#29670)
Helpful for running `api_docs_quick_preview` locally.
2025-02-07 17:17:05 +00:00
Marc Ammann
5690575f13 openai: Removed tool_calls from completion chunk after other chunks have already been sent. (#29649)
- **Description:** Before sending a completion chunk at the end of an
OpenAI stream, removing the tool_calls as those have already been sent
as chunks.
- **Issue:** -
- **Dependencies:** -
- **Twitter handle:** -

@ccurme as mentioned in another PR

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-02-07 10:15:52 -05:00
Ikko Eltociear Ashimine
0d45ad57c1 community: update base_o365.py (#29657)
extention -> extension
2025-02-07 08:43:29 -05:00
weeix
1b064e198f docs: Fix llama.cpp GPU Installation in llamacpp.ipynb (Deprecated Env Variable) (#29659)
- **Description:** The llamacpp.ipynb notebook used a deprecated
environment variable, LLAMA_CUBLAS, for llama.cpp installation with GPU
support. This commit updates the notebook to use the correct GGML_CUDA
variable, fixing the installation error.
- **Issue:** none
-  **Dependencies:** none
2025-02-07 08:43:09 -05:00
Vincent Emonet
3645181d0e qdrant: Add similarity_search_with_score_by_vector() function to the QdrantVectorStore (#29641)
Added `similarity_search_with_score_by_vector()` function to the
`QdrantVectorStore` class.

It is required when we want to query multiple time with the same
embeddings. It was present in the now deprecated original `Qdrant`
vectorstore implementation, but was absent from the new one. It is also
implemented in a number of others `VectorStore` implementations

I have added tests for this new function

Note that I also argued in this discussion that it should be part of the
general `VectorStore`
https://github.com/langchain-ai/langchain/discussions/29638

Co-authored-by: Erick Friis <erick@langchain.dev>
2025-02-07 00:55:58 +00:00
ccurme
488cb4a739 anthropic: release 0.3.7 (#29653) 2025-02-06 17:05:57 -05:00
ccurme
ab09490c20 openai: release 0.3.4 (#29652) 2025-02-06 17:02:21 -05:00
ccurme
29a0c38cc3 openai[patch]: add test for message.name (#29651) 2025-02-06 16:49:28 -05:00
ccurme
91cca827c0 tests: release 0.3.11 (#29648) 2025-02-06 21:48:09 +00:00
Sunish Sheth
25ce1e211a docs: Updating the imports for langchain-databricks to databricks-langchain (#29646)
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, "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.
2025-02-06 13:28:07 -08:00
ccurme
e1b593ae77 text-splitters[patch]: release 0.3.6 (#29647) 2025-02-06 16:16:05 -05:00
ccurme
a91e58bc10 core: release 0.3.34 (#29644) 2025-02-06 15:53:56 -05:00
Vincent Emonet
08b9eaaa6f community: improve FastEmbedEmbeddings support for ONNX execution provider (e.g. GPU) (#29645)
I made a change to how was implemented the support for GPU in
`FastEmbedEmbeddings` to be more consistent with the existing
implementation `langchain-qdrant` sparse embeddings implementation

It is directly enabling to provide the list of ONNX execution providers:
https://github.com/langchain-ai/langchain/blob/master/libs/partners/qdrant/langchain_qdrant/fastembed_sparse.py#L15

It is a bit less clear to a user that just wants to enable GPU, but
gives more capabilities to work with other execution providers that are
not the `CUDAExecutionProvider`, and is more future proof

Sorry for the disturbance @ccurme

> Nice to see you just moved to `uv`! It is so much nicer to run
format/lint/test! No need to manually rerun the `poetry install` with
all required extras now
2025-02-06 15:31:23 -05:00
Erick Friis
1bf620222b infra: remove deepseek from scheduled tests (#29643) 2025-02-06 19:43:03 +00:00
ccurme
3450bfc806 infra: add UV_FROZEN to makefiles (#29642)
These are set in Github workflows, but forgot to add them to most
makefiles for convenience when developing locally.

`uv run` will automatically sync the lock file. Because many of our
development dependencies are local installs, it will pick up version
changes and update the lock file. Passing `--frozen` or setting this
environment variable disables the behavior.
2025-02-06 14:36:54 -05:00
ccurme
d172984c91 infra: migrate to uv (#29566) 2025-02-06 13:36:26 -05:00
ccurme
9da06e6e94 standard-tests[patch]: use has_structured_output property to engage structured output tests (#29635)
Motivation: dedicated structured output features are becoming more
common, such that integrations can support structured output without
supporting tool calling.

Here we make two changes:

1. Update the `has_structured_output` method to default to True if a
model supports tool calling (in addition to defaulting to True if
`with_structured_output` is overridden).
2. Update structured output tests to engage if `has_structured_output`
is True.
2025-02-06 10:09:06 -08:00
Vincent Emonet
db8201d4da community: fix typo in the module imported when using GPU with FastEmbedEmbeddings (#29631)
Made a mistake in the module to import (the module stay the same only
the installed package changes), fixed it and tested it

https://github.com/langchain-ai/langchain/pull/29627

@ccurme
2025-02-06 10:26:08 -05:00
Mohammed Abbadi
f8fd65dea2 community: Update deeplake.py (#29633)
Deep Lake recently released version 4, which introduces significant
architectural changes, including a new on-disk storage format, enhanced
indexing mechanisms, and improved concurrency. However, LangChain's
vector store integration currently does not support Deep Lake v4 due to
breaking API changes.

Previously, the installation command was:
`pip install deeplake[enterprise]`
This installs the latest available version, which now defaults to Deep
Lake v4. Since LangChain's vector store integration is still dependent
on v3, this can lead to compatibility issues when using Deep Lake as a
vector database within LangChain.

To ensure compatibility, the installation command has been updated to:
`pip install deeplake[enterprise]<4.0.0`
This constraint ensures that pip installs the latest available version
of Deep Lake within the v3 series while avoiding the incompatible v4
update.
2025-02-06 10:25:13 -05:00
Vincent Emonet
0ac5536f04 community: add support for using GPUs with FastEmbedEmbeddings (#29627)
- **Description:** add a `gpu: bool = False` field to the
`FastEmbedEmbeddings` class which enables to use GPU (through ONNX CUDA
provider) when generating embeddings with any fastembed model. It just
requires the user to install a different dependency and we use a
different provider when instantiating `fastembed.TextEmbedding`
- **Issue:** when generating embeddings for a really large amount of
documents this drastically increase performance (honestly that is a must
have in some situations, you can't just use CPU it is way too slow)
- **Dependencies:** no direct change to dependencies, but internally the
users will need to install `fastembed-gpu` instead of `fastembed`, I
made all the changes to the init function to properly let the user know
which dependency they should install depending on if they enabled `gpu`
or not
 
cf. fastembed docs about GPU for more details:
https://qdrant.github.io/fastembed/examples/FastEmbed_GPU/

I did not added test because it would require access to a GPU in the
testing environment
2025-02-06 08:04:19 -05:00
Dmitrii Rashchenko
0ceda557aa add o1 and o3-mini to pricing (#29628)
### PR Title:  
**community: add latest OpenAI models pricing**  

### Description:  
This PR updates the OpenAI model cost calculation mapping by adding the
latest OpenAI models, **o1 (non-preview)** and **o3-mini**, based on the
pricing listed on the [OpenAI pricing
page](https://platform.openai.com/docs/pricing).

### Changes:  
- Added pricing for `o1`, `o1-2024-12-17`, `o1-cached`, and
`o1-2024-12-17-cached` for input tokens.
- Added pricing for `o1-completion` and `o1-2024-12-17-completion` for
output tokens.
- Added pricing for `o3-mini`, `o3-mini-2025-01-31`, `o3-mini-cached`,
and `o3-mini-2025-01-31-cached` for input tokens.
- Added pricing for `o3-mini-completion` and
`o3-mini-2025-01-31-completion` for output tokens.

### Issue:  
N/A  

### Dependencies:  
None  

### Testing & Validation:  
- No functional changes outside of updating the cost mapping.  
- No tests were added or modified.
2025-02-06 08:02:20 -05:00
ZhangShenao
ac53977dbc [MistralAI] Improve MistralAIEmbeddings (#29242)
- Add static method decorator for method.
- Add expected exception for retry decorator

#29125
2025-02-05 21:31:54 -05:00
Andrew Wason
22aa5e07ed standard-tests: Fix ToolsIntegrationTests to correctly handle "content_and_artifact" tools (#29391)
**Description:**

The response from `tool.invoke()` is always a ToolMessage, with content
and artifact fields, not a tuple.
The tuple is converted to a ToolMessage here

b6ae7ca91d/libs/core/langchain_core/tools/base.py (L726)

**Issue:**

Currently `ToolsIntegrationTests` requires `invoke()` to return a tuple
and so standard tests fail for "content_and_artifact" tools. This fixes
that to check the returned ToolMessage.

This PR also adds a test that now passes.
2025-02-05 21:27:09 -05:00
Mohammad Anash
f849305a56 fixed Bug in PreFilter of AzureCosmosDBNoSqlVectorSearch (#29613)
Description: Fixes PreFilter value handling in Azure Cosmos DB NoSQL
vectorstore. The current implementation fails to handle numeric values
in filter conditions, causing an undefined value variable error. This PR
adds support for numeric, boolean, and NULL values while maintaining the
existing string and list handling.

Changes:
Added handling for numeric types (int/float)
Added boolean value support
Added NULL value handling
Added type validation for unsupported values
Fixed scope of value variable initialization

Issue: 
Fixes #29610

Implementation Notes:
No changes to public API
Backwards compatible
Maintains consistent behavior with existing MongoDB-style filtering
Preserves SQL injection prevention through proper value handling

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-02-06 02:20:26 +00:00
Philippe PRADOS
6ff0d5c807 community[minor]: 04 - Refactoring PDFMiner parser (#29526)
This is one part of a larger Pull Request (PR) that is too large to be
submitted all at once. This specific part focuses on updating the XXX
parser.

For more details, see [PR
28970](https://github.com/langchain-ai/langchain/pull/28970).

---------

Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
2025-02-05 21:08:27 -05:00
Yoav Levy
4460d20ba9 docs: Nimble provider doc fixes (#29597)
## Description

- Removed broken link for the API Reference
- Added `OPENAI_API_KEY` setter for the chains to properly run
- renamed one of our examples so it won't override the original
retriever and cause confusion due to it using a different mode of
retrieving
- Moved one of our simple examples to be the first example of our
retriever :)
2025-02-05 11:24:37 -08:00
Isaac Francisco
91ffd7caad core: allow passing message dicts into ChatPromptTemplate (#29363)
Co-authored-by: Erick Friis <erick@langchain.dev>
2025-02-05 09:45:52 -08:00
ccurme
69595b0914 docs: fix builds (#29607)
Failing with:
> ValueError: Provider page not found for databricks-langchain. Please
add one at docs/integrations/providers/databricks-langchain.{mdx,ipynb}
2025-02-05 14:24:53 +00:00
ccurme
91a33a9211 anthropic[patch]: release 0.3.6 (#29606) 2025-02-05 14:18:02 +00:00
ccurme
5cbe6aba8f anthropic[patch]: support citations in streaming (#29591) 2025-02-05 09:12:07 -05:00
William FH
5ae4ed791d Drop duplicate inputs (#29589) 2025-02-04 18:06:10 -08:00
Erick Friis
65f0deb81a packages: databricks-langchain (#29593) 2025-02-05 01:53:34 +00:00
Yoav Levy
621bba7e26 docs: add nimble as a provider (#29579)
## Description:

- Add docs/docs/providers/nimbleway.ipynb
- Add docs/docs/integrations/retrievers/nimbleway.ipynb
- Register nimbleway in libs/packages.yml

- X (twitter) handle: @urielkn / @LevyNorbit8
2025-02-04 16:47:03 -08:00
Erick Friis
50d61eafa2 partners/deepseek: release 0.1.1 (#29592) 2025-02-04 23:46:38 +00:00
Erick Friis
7edfcbb090 docs: rename to langchain-deepseek in docs (#29587) 2025-02-04 14:22:17 -08:00
Erick Friis
04e8f3b6d7 infra: add deepseek api key to release (#29585) 2025-02-04 10:35:07 -08:00
Erick Friis
df8fa882b2 deepseek: bump core (#29584) 2025-02-04 10:25:46 -08:00
Erick Friis
455f65947a deepseek: rename to langchain-deepseek from langchain-deepseek-official (#29583) 2025-02-04 17:57:25 +00:00
Philippe PRADOS
5771e561fb [Bugfix langchain_community] Fix PyMuPDFLoader (#29550)
- **Description:**  add legacy properties
    - **Issue:** #29470
    - **Twitter handle:** pprados
2025-02-04 09:24:40 -05:00
Ashutosh Kumar
65b404a2d1 [oci_generative_ai] Option to pass auth_file_location (#29481)
**PR title**: "community: Option to pass auth_file_location for
oci_generative_ai"

**Description:** Option to pass auth_file_location, to overwrite config
file default location "~/.oci/config" where profile name configs
present. This is not fixing any issues. Just added optional parameter
called "auth_file_location", which internally supported by any OCI
client including GenerativeAiInferenceClient.
2025-02-03 21:44:13 -05:00
Teruaki Ishizaki
aeb42dc900 partners: Fixed the procedure of initializing pad_token_id (#29500)
- **Description:** Add to check pad_token_id and eos_token_id of model
config. It seems that this is the same bug as the HuggingFace TGI bug.
It's same bug as #29434
- **Issue:** #29431
- **Dependencies:** none
- **Twitter handle:** tell14

Example code is followings:
```python
from langchain_huggingface.llms import HuggingFacePipeline

hf = HuggingFacePipeline.from_model_id(
    model_id="meta-llama/Llama-3.2-3B-Instruct",
    task="text-generation",
    pipeline_kwargs={"max_new_tokens": 10},
)

from langchain_core.prompts import PromptTemplate

template = """Question: {question}

Answer: Let's think step by step."""
prompt = PromptTemplate.from_template(template)

chain = prompt | hf

question = "What is electroencephalography?"

print(chain.invoke({"question": question}))
```
2025-02-03 21:40:33 -05:00
Tanushree
e8b91283ef Banner for interrupt (#29567)
Adding banner for interrupt
2025-02-03 17:40:24 -08:00
Erick Friis
ab67137fa3 docs: chat model order experiment (#29480) 2025-02-03 18:55:18 +00:00
AmirPoursaberi
a6efd22ba1 Fix a tiny typo in create_retrieval_chain docstring (#29552)
Hi there!

To fix a tiny typo in `create_retrieval_chain` docstring.
2025-02-03 10:54:49 -05:00
JHIH-SIOU LI
48fa3894c2 docs: update readthedocs document loader options (#29556)
Hi there!

This PR updates the documentation according to the code.
If we run the example as is, then it would result in the following
error:

![image](https://github.com/user-attachments/assets/9c0a336c-775c-489c-a275-f1153d447ecb)

It seems that this part of the code already supplied the required
argument to the BeautifulSoup4:

0c782ee547/libs/community/langchain_community/document_loaders/readthedocs.py (L87-L90)

Since the example can only work by removing this argument, it also seems
legit to remove it from the documentation.
2025-02-03 10:54:24 -05:00
Tyllen
0c782ee547 docs: update payman docs (#29479)
- **Description:** fix the import docs variables

---------

Co-authored-by: ccurme <chester.curme@gmail.com>
2025-02-02 02:41:54 +00:00
Hemant Rawat
db1693aa70 community: fix issue #29429 in age_graph.py (#29506)
## Description:

This PR addresses issue #29429 by fixing the _wrap_query method in
langchain_community/graphs/age_graph.py. The method now correctly
handles Cypher queries with UNION and EXCEPT operators, ensuring that
the fields in the SQL query are ordered as they appear in the Cypher
query. Additionally, the method now properly handles cases where RETURN
* is not supported.

### Issue: #29429

### Dependencies: None


### Add tests and docs:

Added unit tests in tests/unit_tests/graphs/test_age_graph.py to
validate the changes.
No new integrations were added, so no example notebook is necessary.
Lint and test:

Ran make format, make lint, and make test to ensure code quality and
functionality.
2025-02-01 21:24:45 -05:00
Keenan Pepper
2f97916dea docs: Add goodfire notebook and add to packages.yml (#29512)
- **Description:** Add Goodfire ipynb notebook and add
langchain-goodfire package to packages.yml
- **Issue:** n/a
- **Dependencies:** docs only
- **Twitter handle:** keenanpepper

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-02-01 19:43:20 -05:00
ccurme
a3c5e4d070 deepseek[patch]: bump langchain-openai and add to scheduled testing (#29535) 2025-02-01 18:40:59 -05:00
ccurme
16a422f3fa community: add standard tests for Perplexity (#29534) 2025-02-01 17:02:57 -05:00
A Venkata Sai Krishna Varun
21d8d41595 docs: update delete method in vectorstores.mdx (#29497)
Thank you for contributing to LangChain!

- [ ] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core, etc. is
being modified. Use "docs: ..." for purely docs 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>
2025-01-31 18:15:28 +00:00
Mark Perfect
b8e218b09f docs: Fix Milvus vector store initialization (#29511)
- [x] **PR title**:


- [x] **PR message**:

- A change in the Milvus API has caused an issue with the local vector
store initialization. Having used an Ollama embedding model, the vector
store initialization results in the following error:

<img width="978" alt="image"
src="https://github.com/user-attachments/assets/d57e495c-1764-4fbe-ab8c-21ee44f1e686"
/>

- This is fixed by setting the index type explicitly:

`vector_store = Milvus(embedding_function=embeddings,
connection_args={"uri": URI}, index_params={"index_type": "FLAT",
"metric_type": "L2"},)`

Other small documentation edits were also made.


- [x] **Add tests and docs**:
  N/A


- [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: Chester Curme <chester.curme@gmail.com>
2025-01-31 12:57:36 -05:00
Amit Ghadge
0c405245c4 [Integrations][Tool] Added Jenkins tools support (#29516)
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, "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.

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-01-31 12:50:10 -05:00
Subrat Lima
5b826175c9 docs: Update local_llms.ipynb - fixed a typo (#29520)
Description: fixed a typo in the how to > local llma > llamafile section
description.
2025-01-31 11:18:24 -05:00
Christophe Bornet
aab2e42169 core[patch]: Use Blockbuster to detect blocking calls in asyncio during tests (#29043)
This PR uses the [blockbuster](https://github.com/cbornet/blockbuster)
library in langchain-core to detect blocking calls made in the asyncio
event loop during unit tests.
Avoiding blocking calls is hard as these can be deeply buried in the
code or made in 3rd party libraries.
Blockbuster makes it easier to detect them by raising an exception when
a call is made to a known blocking function (eg: `time.sleep`).

Adding blockbuster allowed to find a blocking call in
`aconfig_with_context` (it ends up calling `get_function_nonlocals`
which loads function code).

**Dependencies:**
- blockbuster (test)

**Twitter handle:** cbornet_
2025-01-31 10:06:34 -05:00
Philippe PRADOS
ceda8bc050 community[minor]: 03 - Refactoring PyPDF parser (#29330)
This is one part of a larger Pull Request (PR) that is too large to be
submitted all at once.
This specific part focuses on updating the PyPDF parser.

For more details, see [PR
28970](https://github.com/langchain-ai/langchain/pull/28970).
2025-01-31 10:05:07 -05:00
Julian Castro Pulgarin
b7e3e337b1 community: Fix YahooFinanceNewsTool to handle updated yfinance data structure (#29498)
*Description:**
Updates the YahooFinanceNewsTool to handle the current yfinance news
data structure. The tool was failing with a KeyError due to changes in
the yfinance API's response format. This PR updates the code to
correctly extract news URLs from the new structure.

**Issue:** #29495

**Dependencies:** 
No new dependencies required. Works with existing yfinance package.

The changes maintain backwards compatibility while fixing the KeyError
that users were experiencing.

The modified code properly handles the new data structure where:
- News type is now at `content.contentType`
- News URL is now at `content.canonicalUrl.url`

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-01-31 02:31:44 +00:00
Vadym Barda
22219eefaf docs: update README/intro (#29492) 2025-01-29 22:50:00 +00:00
Erick Friis
332e303858 partners/mistralai: release 0.2.6 (#29491) 2025-01-29 22:23:14 +00:00
Erick Friis
2c795f5628 partners/openai: release 0.3.3 (#29490) 2025-01-29 22:23:03 +00:00
Erick Friis
f307b3cc5f langchain: release 0.3.17 (#29485) 2025-01-29 22:22:49 +00:00
Erick Friis
5cad3683b4 partners/groq: release 0.2.4 (#29488) 2025-01-29 22:22:30 +00:00
Erick Friis
e074c26a6b partners/fireworks: release 0.2.7 (#29487) 2025-01-29 22:22:18 +00:00
Erick Friis
685609e1ef partners/anthropic: release 0.3.5 (#29486) 2025-01-29 22:22:11 +00:00
Erick Friis
ed3a5e664c standard-tests: release 0.3.10 (#29484) 2025-01-29 22:21:05 +00:00
Erick Friis
29461b36d9 partners/ollama: release 0.2.3 (#29489) 2025-01-29 22:19:44 +00:00
Erick Friis
07e2e80fe7 core: release 0.3.33 (#29483) 2025-01-29 14:11:53 -08:00
Erick Friis
8f95da4eb1 multiple: structured output tracing standard metadata (#29421)
Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-01-29 14:00:26 -08:00
ccurme
284c935b08 tests[patch]: improve coverage of structured output tests (#29478) 2025-01-29 14:52:09 -05:00
Erick Friis
c79274cb7c docs: typo in contrib integrations (#29477) 2025-01-29 19:39:36 +00:00
ccurme
a3878a3c62 infra: update deps for notebook tests (#29476) 2025-01-29 10:23:50 -05:00
Matheus Torquato
7aae738296 docs:Fix Imports for Document and BaseRetriever (#29473)
This pull request addresses an issue with import statements in the
langchain_core/retrievers.py file. The following changes have been made:

Corrected the import for Document from langchain_core.documents.base.
Corrected the import for BaseRetriever from langchain_core.retrievers.
These changes ensure that the SimpleRetriever class can correctly
reference the Document and BaseRetriever classes, improving code
reliability and maintainability.

---------

Co-authored-by: Matheus Torquato <mtorquat@jaguarlandrover.com>
Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-01-29 14:32:05 +00:00
Mohammad Anash
12bcc85927 added operator filter for supabase (#29475)
Description
This PR adds support for MongoDB-style $in operator filtering in the
Supabase vectorstore implementation. Currently, filtering with $in
operators returns no results, even when matching documents exist. This
change properly translates MongoDB-style filters to PostgreSQL syntax,
enabling efficient multi-document filtering.
Changes

Modified similarity_search_by_vector_with_relevance_scores to handle
MongoDB-style $in operators
Added automatic conversion of $in filters to PostgreSQL IN clauses
Preserved original vector type handling and numpy array conversion
Maintained compatibility with existing postgrest filters
Added support for the same filtering in
similarity_search_by_vector_returning_embeddings

Issue
Closes #27932

Implementation Notes
No changes to public API or function signatures
Backwards compatible - behavior unchanged for non-$in filters
More efficient than multiple individual queries for multi-ID searches
Preserves all existing functionality including numpy array conversion
for vector types

Dependencies
None

Additional Notes
The implementation handles proper SQL escaping for filter values
Maintains consistent behavior with other vectorstore implementations
that support MongoDB-style operators
Future extensions could support additional MongoDB-style operators ($gt,
$lt, etc.)

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-01-29 14:24:18 +00:00
ccurme
585f467d4a mistral[patch]: release 0.2.5 (#29463) 2025-01-28 18:29:54 -05:00
ccurme
ca9d4e4595 mistralai: support method="json_schema" in structured output (#29461)
https://docs.mistral.ai/capabilities/structured-output/custom_structured_output/
2025-01-28 18:17:39 -05:00
Michael Chin
e120378695 community: Additional AWS deprecations (#29447)
Added deprecation warnings for a few more classes that weremoved to
`langchain-aws` package:
- [SageMaker Endpoint
LLM](https://python.langchain.com/api_reference/aws/retrievers/langchain_aws.retrievers.bedrock.AmazonKnowledgeBasesRetriever.html)
- [Amazon Kendra
retriever](https://python.langchain.com/api_reference/aws/retrievers/langchain_aws.retrievers.kendra.AmazonKendraRetriever.html)
- [Amazon Bedrock Knowledge Bases
retriever](https://python.langchain.com/api_reference/aws/retrievers/langchain_aws.retrievers.bedrock.AmazonKnowledgeBasesRetriever.html)
2025-01-28 09:50:14 -05:00
Tommy Cox
6f711794a7 docs: tiny grammary fix to why_langchain.mdx (#29455)
Description: Tiny grammar fix to doc - why_langchain.mdx
2025-01-28 09:49:33 -05:00
Erick Friis
2d776351af community: release 0.3.16 (#29452) 2025-01-28 07:44:54 +00:00
Erick Friis
737a68fcdc langchain: release 0.3.16 (#29451) 2025-01-28 07:31:09 +00:00
Erick Friis
fa3857c9d0 docs: tests/standard tests api ref redirect (#29444) 2025-01-27 23:21:50 -08:00
Erick Friis
8bf9c71673 core: release 0.3.32 (#29450) 2025-01-28 07:20:04 +00:00
Erick Friis
ecdc881328 langchain: add deepseek provider to init chat model (#29449) 2025-01-27 23:13:59 -08:00
Erick Friis
dced0ed3fd deepseek, docs: chatdeepseek integration added (#29445) 2025-01-28 06:32:58 +00:00
Vadym Barda
7cbf885c18 docs: replace 'state_modifier' with 'prompt' (#29415) 2025-01-27 21:29:18 -05:00
Isaac Francisco
2bb2c9bfe8 change behavior for converting a string to openai messages (#29446) 2025-01-27 18:18:54 -08:00
ccurme
b1fdac726b groq[patch]: update model used in test (#29441)
`llama-3.1-70b-versatile` was [shut
down](https://console.groq.com/docs/deprecations).
2025-01-27 21:11:44 +00:00
Adrián Panella
1551d9750c community(doc_loaders): allow any credential type in AzureAIDocumentI… (#29289)
allow any credential type in AzureAIDocumentInteligence, not only
`api_key`.
This allows to use any of the credentials types integrated with AD.

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-01-27 20:56:30 +00:00
ccurme
f00c66cc1f chroma[patch]: release 0.2.1 (#29440) 2025-01-27 20:41:35 +00:00
Jorge Piedrahita Ortiz
3b886cdbb2 libs: add sambanova-lagchain integration package (#29417)
- **Description:**: Add sambanova-langchain integration package as
suggested in previous PRs

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-01-27 20:34:55 +00:00
Mohammad Anash
aba1fd0bd4 fixed similarity search with score error #29407 (#29413)
Description: Fix TypeError in AzureSearch similarity_search_with_score
by removing search_type from kwargs before passing to underlying
requests.

This resolves issue #29407 where search_type was being incorrectly
passed through to Session.request().
Issue: #29407

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-01-27 20:34:42 +00:00
itaismith
7b404fcd37 partners[chroma]: Upgrade Chroma to 0.6.x (#29404)
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, "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.


- [ ] **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.
2025-01-27 15:32:21 -05:00
Teruaki Ishizaki
3fce78994e community: Fixed the procedure of initializing pad_token_id (#29434)
- **Description:** Add to check pad_token_id and eos_token_id of model
config. It seems that this is the same bug as the HuggingFace TGI bug.
In addition, the source code of
libs/partners/huggingface/langchain_huggingface/llms/huggingface_pipeline.py
also requires similar changes.
- **Issue:** #29431
- **Dependencies:** none
- **Twitter handle:** tell14
2025-01-27 14:54:54 -05:00
Christophe Bornet
dbb6b7b103 core: Add ruff rules TRY (tryceratops) (#29388)
TRY004 ("use TypeError rather than ValueError") existing errors are
marked as ignore to preserve backward compatibility.
LMK if you prefer to fix some of them.

Co-authored-by: Erick Friis <erick@langchain.dev>
2025-01-24 05:01:40 +00:00
Erick Friis
723b603f52 docs: groq api key links (#29402) 2025-01-24 04:33:18 +00:00
ccurme
bd1909fe05 docs: document citations in ChatAnthropic (#29401) 2025-01-23 17:18:51 -08:00
ccurme
bbc50f65e7 anthropic[patch]: release 0.3.4 (#29399) 2025-01-23 23:55:58 +00:00
ccurme
ed797e17fb anthropic[patch]: always return content blocks if citations are generated (#29398)
We currently return string (and therefore no content blocks / citations)
if the response is of the form
```
[
    {"text": "a claim", "citations": [...]},
]
```

There are other cases where we do return citations as-is:
```
[
    {"text": "a claim", "citations": [...]},
    {"text": "some other text"},
    {"text": "another claim", "citations": [...]},
]
```
Here we update to return content blocks including citations in the first
case as well.
2025-01-23 18:47:23 -05:00
ccurme
933b35b9c5 docs: update how-to index page (#29393) 2025-01-23 16:55:36 -05:00
Bagatur
317fb86fd9 openai[patch]: fix int test (#29395) 2025-01-23 21:23:01 +00:00
Bagatur
8d566a8fe7 openai[patch]: detect old models in with_structured_output (#29392)
Co-authored-by: ccurme <chester.curme@gmail.com>
2025-01-23 20:47:32 +00:00
Christophe Bornet
b6ae7ca91d core: Cache RunnableLambda __repr__ (#29199)
`RunnableLambda`'s `__repr__` may do costly OS operation by calling
`get_lambda_source`.
So it's better to cache it.
See #29043

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-01-23 18:34:47 +00:00
Christophe Bornet
618e550f06 core: Cache RunnableLambda deps (#29200)
`RunnableLambda`'s `deps` may do costly OS operation by calling
`get_function_nonlocals`.
So it's better to cache it.
See #29043
2025-01-23 13:09:07 -05:00
ccurme
f795ab99ec docs: fix title rendered for integration package (#29387)
"Tilores LangchAIn" -> "Tilores"
2025-01-23 12:21:19 -05:00
Stefan Berkner
8977451c76 docs: add Tilores provider and tools (#29244)
Description: This PR adds documentation for the Tilores provider and
tools.
Issue: closes #26320
2025-01-23 12:17:59 -05:00
Ahmed Tammaa
d5b8aabb32 text-splitters[patch]: delete unused html_chunks_with_headers.xslt (#29340)
This pull request removes the now-unused html_chunks_with_headers.xslt
file from the codebase. In a previous update ([PR
#27678](https://github.com/langchain-ai/langchain/pull/27678)), the
HTMLHeaderTextSplitter class was refactored to utilize BeautifulSoup
instead of lxml and XSLT for HTML processing. As a result, the
html_chunks_with_headers.xslt file is no longer necessary and can be
safely deleted to maintain code cleanliness and reduce potential
confusion.

Issue: N/A

Dependencies: N/A
2025-01-23 11:29:08 -05:00
Wang Ran (汪然)
8f2c11e17b core[patch]: fix API reference for draw_ascii (#29370)
typo: no `draw` but `draw_ascii` and other things

now, it works:
<img width="688" alt="image"
src="https://github.com/user-attachments/assets/5b5a8cc2-cf81-4a5c-b443-da0e4426556c"
/>

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-01-23 16:04:58 +00:00
Michael Chin
2df9daa7f2 docs: Update BedrockEmbeddings import example in aws.mdx (#29364)
The `BedrockEmbeddings` class in `langchain-community` has been
deprecated since v0.2.11:


https://github.com/langchain-ai/langchain/blob/master/libs/community/langchain_community/embeddings/bedrock.py#L14-L19

Updated the AWS docs for `BedRockEmbeddings` to use the new class in
`langchain-aws`.
2025-01-23 10:05:57 -05:00
Loris Alexandre
e4921239a6 community: missing mandatory parameter partition_key for AzureCosmosDBNoSqlVectorSearch (#29382)
- **Description:** the `delete` function of
AzureCosmosDBNoSqlVectorSearch is using
`self._container.delete_item(document_id)` which miss a mandatory
parameter `partition_key`
We use the class function `delete_document_by_id` to provide a default
`partition_key`
- **Issue:** #29372 
- **Dependencies:** None
- **Twitter handle:** None

Co-authored-by: Loris Alexandre <loris.alexandre@boursorama.fr>
2025-01-23 10:05:10 -05:00
Terry Tan
ec0ebb76f2 community: fix Google Scholar tool errors (#29371)
Resolve https://github.com/langchain-ai/langchain/issues/27557
2025-01-23 10:03:01 -05:00
江同学呀
a1e62070d0 community: Fix the problem of error reporting when OCR extracts text from PDF. (#29378)
- **Description:** The issue has been fixed where images could not be
recognized from ```xObject[obj]["/Filter"]``` (whose value can be either
a string or a list of strings) in the ```_extract_images_from_page()```
method. It also resolves the bug where vectorization by Faiss fails due
to the failure of image extraction from a PDF containing only
images```IndexError: list index out of range```.

![69a60f3f6bd474641b9126d74bb18f7e](https://github.com/user-attachments/assets/dc9e098d-2862-49f7-93b0-00f1056727dc)

- **Issue:** 
    Fix the following issues:
[#15227 ](https://github.com/langchain-ai/langchain/issues/15227)
[#22892 ](https://github.com/langchain-ai/langchain/issues/22892)
[#26652 ](https://github.com/langchain-ai/langchain/issues/26652)
[#27153 ](https://github.com/langchain-ai/langchain/issues/27153)
    Related issues:
[#7067 ](https://github.com/langchain-ai/langchain/issues/7067)

- **Dependencies:** None
- **Twitter handle:** None

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-01-23 15:01:52 +00:00
Tim Mallezie
a13faab6b7 community; allow to set gitlab url in gitlab tool in constrictor (#29380)
This pr, expands the gitlab url so it can also be set in a constructor,
instead of only through env variables.

This allows to do something like this. 
```
       # Create the GitLab API wrapper
        gitlab_api = GitLabAPIWrapper(
            gitlab_url=self.gitlab_url,
            gitlab_personal_access_token=self.gitlab_personal_access_token,
            gitlab_repository=self.gitlab_repository,
            gitlab_branch=self.gitlab_branch,
            gitlab_base_branch=self.gitlab_base_branch,
        )
```
Where before you could not set the url in the constructor.

Co-authored-by: Tim Mallezie <tim.mallezie@dropsolid.com>
2025-01-23 09:36:27 -05:00
Tyllen
f2ea62f632 docs: add payman docs (#29362)
- **Description:** Adding the docs to use the payman-langchain
integration :)
2025-01-22 18:37:47 -08:00
Erick Friis
861024f388 docs: openai audio input (#29360) 2025-01-22 23:45:35 +00:00
Erick Friis
3f1d20964a standard-tests: release 0.3.9 (#29356) 2025-01-22 09:46:19 -08:00
Macs Dickinson
7378c955db community: adds support for getting github releases for the configured repository (#29318)
**Description:** adds support for github tool to query github releases
on the configure respository
**Issue:** N/A
**Dependencies:** N/A
**Twitter handle:** @macsdickinson

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-01-22 15:45:52 +00:00
Tayaa Med Amine
ef1610e24a langchain[patch]: support ollama in init_embeddings (#29349)
Why not Ollama ?

Thank you for contributing to LangChain!

- [ ] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core, etc. is
being modified. Use "docs: ..." for purely docs 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>
2025-01-22 14:47:12 +00:00
Siddhant
9eb10a9240 langchain: added vectorstore docstring linting (#29241)
…ore.py

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, "infra: ..."
for CI changes.
  - Example: "community: add foobar LLM"
  
Added docstring linting in the vectorstore.py file relating to issue
#25154


- [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: Siddhant Jain <sjain35@buffalo.edu>
Co-authored-by: Erick Friis <erick@langchain.dev>
2025-01-22 03:47:43 +00:00
Erick Friis
a2ed796aa6 infra: run doc lint on root pyproject change (#29350) 2025-01-22 03:22:13 +00:00
Sohan
de1fc4811d packages, docs: Pipeshift - Langchain integration of pipeshift (#29114)
Description: Added pipeshift integration. This integrates pipeshift LLM
and ChatModels APIs with langchain
Dependencies: none

Unit Tests & Integration tests are added

Documentation is added as well

This PR is w.r.t
[#27390](https://github.com/langchain-ai/langchain/pull/27390) and as
per request, a freshly minted `langchain-pipeshift` package is uploaded
to PYPI. Only changes to the docs & packages.yml are made in langchain
master branch

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
Co-authored-by: Erick Friis <erick@langchain.dev>
2025-01-22 03:03:06 +00:00
Erick Friis
e723882a49 docs: mongodb api ref redirect (#29348) 2025-01-21 16:48:03 -08:00
Christophe Bornet
836c791829 text-splitters: Bump ruff version to 0.9 (#29231)
Co-authored-by: Erick Friis <erick@langchain.dev>
2025-01-22 00:27:58 +00:00
Christophe Bornet
a004dec119 langchain: Bump ruff version to 0.9 (#29211)
Co-authored-by: Erick Friis <erick@langchain.dev>
2025-01-22 00:26:39 +00:00
Christophe Bornet
2340b3154d standard-tests: Bump ruff version to 0.9 (#29230)
Co-authored-by: Erick Friis <erick@langchain.dev>
2025-01-22 00:23:01 +00:00
Christophe Bornet
e4a78dfc2a core: Bump ruff version to 0.9 (#29201)
Also run some preview autofix and formatting

---------

Co-authored-by: Erick Friis <erick@langchain.dev>
2025-01-22 00:20:09 +00:00
Ella Charlaix
6f95db81b7 huggingface: Add IPEX models support (#29179)
Co-authored-by: Erick Friis <erick@langchain.dev>
2025-01-22 00:16:44 +00:00
Bhav Sardana
d6a7aaa97d community: Fix for Pydantic model validator of GoogleApiClient (#29346)
- [ *] **PR message**: ***Delete this entire checklist*** and replace
with
- **Description:** Fix for pedantic model validator for GoogleApiHandler
    - **Issue:** the issue #29165 

- [ *] **Lint and test**: Run `make format`, `make lint` and `make test`
from the root of the package(s) you've modified.

---------

Signed-off-by: Bhav Sardana <sardana.bhav@gmail.com>
2025-01-21 15:17:43 -05:00
Christophe Bornet
1c4ce7b42b core: Auto-fix some docstrings (#29337) 2025-01-21 13:29:53 -05:00
ccurme
86a0720310 fireworks[patch]: update model used in integration tests (#29342)
No access to firefunction-v1 and -v2.
2025-01-21 11:05:30 -05:00
Hugo Berg
32c9c58adf Community: fix missing f-string modifier in oai structured output parsing error (#29326)
- **Description:** The ValueError raised on certain structured-outputs
parsing errors, in langchain openai community integration, was missing a
f-string modifier and so didn't produce useful outputs. This is a
2-line, 2-character change.
- **Issue:** None open that this fixes
- **Dependencies:** Nothing changed
- **Twitter handle:** None

- [X] **Add tests and docs**: There's nothing to add for.
- [-] **Lint and test**: Happy to run this if you deem it necessary.

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-01-21 14:26:38 +00:00
Nuno Campos
566915d7cf core: fix call to get closure vars for partial-wrapped funcs (#29316)
Thank you for contributing to LangChain!

- [ ] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core, etc. is
being modified. Use "docs: ..." for purely docs 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.
2025-01-21 09:26:15 -05:00
ZhangShenao
33e22ccb19 [Doc] Improve api doc (#29324)
- Fix doc description
- Add static method decorator
2025-01-21 09:16:08 -05:00
Tugay Talha İçen
7b44c3384e Docs: update huggingfacehub.ipynb (#29329)
langchain -> langchain langchain-huggingface 


Updated the installation command from:
%pip install --upgrade --quiet langchain sentence_transformers to: %pip
install --upgrade --quiet langchain-huggingface sentence_transformers

This resolves an import error in the notebook when using from
langchain_huggingface.embeddings import HuggingFaceEmbeddings.
2025-01-21 09:12:22 -05:00
Bagatur
536b44a47f community[patch]: Release 0.3.15 (#29325) 2025-01-21 03:10:07 +00:00
Bagatur
ec5fae76d4 langchain[patch]: Release 0.3.15 (#29322) 2025-01-21 02:24:11 +00:00
Bagatur
923e6fb321 core[patch]: 0.3.31 (#29320) 2025-01-21 01:17:31 +00:00
Ikko Eltociear Ashimine
06456c1dcf docs: update google_cloud_sql_mssql.ipynb (#29315)
arbitary -> arbitrary
2025-01-20 16:11:08 -05:00
Ahmed Tammaa
d3ed9b86be text-splitters[minor]: Replace lxml and XSLT with BeautifulSoup in HTMLHeaderTextSplitter for Improved Large HTML File Processing (#27678)
This pull request updates the `HTMLHeaderTextSplitter` by replacing the
`split_text_from_file` method's implementation. The original method used
`lxml` and XSLT for processing HTML files, which caused
`lxml.etree.xsltapplyerror maxhead` when handling large HTML documents
due to limitations in the XSLT processor. Fixes #13149

By switching to BeautifulSoup (`bs4`), we achieve:

- **Improved Performance and Reliability:** BeautifulSoup efficiently
processes large HTML files without the errors associated with `lxml` and
XSLT.
- **Simplified Dependencies:** Removes the dependency on `lxml` and
external XSLT files, relying instead on the widely used `beautifulsoup4`
library.
- **Maintained Functionality:** The new method replicates the original
behavior, ensuring compatibility with existing code and preserving the
extraction of content and metadata.

**Issue:**

This change addresses issues related to processing large HTML files with
the existing `HTMLHeaderTextSplitter` implementation. It resolves
problems where users encounter lxml.etree.xsltapplyerror maxhead due to
large HTML documents.

**Dependencies:**

- **BeautifulSoup (`beautifulsoup4`):** The `beautifulsoup4` library is
now used for parsing HTML content.
  - Installation: `pip install beautifulsoup4`

**Code Changes:**

Updated the `split_text_from_file` method in `HTMLHeaderTextSplitter` as
follows:

```python
def split_text_from_file(self, file: Any) -> List[Document]:
    """Split HTML file using BeautifulSoup.

    Args:
        file: HTML file path or file-like object.

    Returns:
        List of Document objects with page_content and metadata.
    """
    from bs4 import BeautifulSoup
    from langchain.docstore.document import Document
    import bs4

    # Read the HTML content from the file or file-like object
    if isinstance(file, str):
        with open(file, 'r', encoding='utf-8') as f:
            html_content = f.read()
    else:
        # Assuming file is a file-like object
        html_content = file.read()

    # Parse the HTML content using BeautifulSoup
    soup = BeautifulSoup(html_content, 'html.parser')

    # Extract the header tags and their corresponding metadata keys
    headers_to_split_on = [tag[0] for tag in self.headers_to_split_on]
    header_mapping = dict(self.headers_to_split_on)

    documents = []

    # Find the body of the document
    body = soup.body if soup.body else soup

    # Find all header tags in the order they appear
    all_headers = body.find_all(headers_to_split_on)

    # If there's content before the first header, collect it
    first_header = all_headers[0] if all_headers else None
    if first_header:
        pre_header_content = ''
        for elem in first_header.find_all_previous():
            if isinstance(elem, bs4.Tag):
                text = elem.get_text(separator=' ', strip=True)
                if text:
                    pre_header_content = text + ' ' + pre_header_content
        if pre_header_content.strip():
            documents.append(Document(
                page_content=pre_header_content.strip(),
                metadata={}  # No metadata since there's no header
            ))
    else:
        # If no headers are found, return the whole content
        full_text = body.get_text(separator=' ', strip=True)
        if full_text.strip():
            documents.append(Document(
                page_content=full_text.strip(),
                metadata={}
            ))
        return documents

    # Process each header and its associated content
    for header in all_headers:
        current_metadata = {}
        header_name = header.name
        header_text = header.get_text(separator=' ', strip=True)
        current_metadata[header_mapping[header_name]] = header_text

        # Collect all sibling elements until the next header of the same or higher level
        content_elements = []
        for sibling in header.find_next_siblings():
            if sibling.name in headers_to_split_on:
                # Stop at the next header
                break
            if isinstance(sibling, bs4.Tag):
                content_elements.append(sibling)

        # Get the text content of the collected elements
        current_content = ''
        for elem in content_elements:
            text = elem.get_text(separator=' ', strip=True)
            if text:
                current_content += text + ' '

        # Create a Document if there is content
        if current_content.strip():
            documents.append(Document(
                page_content=current_content.strip(),
                metadata=current_metadata.copy()
            ))
        else:
            # If there's no content, but we have metadata, still create a Document
            documents.append(Document(
                page_content='',
                metadata=current_metadata.copy()
            ))

    return documents
```

---------

Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
2025-01-20 16:10:37 -05:00
Christophe Bornet
989eec4b7b core: Add ruff rule S101 (no assert) (#29267)
Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
2025-01-20 20:24:31 +00:00
Christophe Bornet
e5d62c6ce7 core: Add ruff rule W293 (whitespaces) (#29272) 2025-01-20 15:16:12 -05:00
Philippe PRADOS
4efc5093c1 community[minor]: Refactoring PyMuPDF parser, loader and add image blob parsers (#29063)
* Adds BlobParsers for images. These implementations can take an image
and produce one or more documents per image. This interface can be used
for exposing OCR capabilities.
* Update PyMuPDFParser and Loader to standardize metadata, handle
images, improve table extraction etc.

- **Twitter handle:** pprados

This is one part of a larger Pull Request (PR) that is too large to be
submitted all at once.
This specific part focuses to prepare the update of all parsers.

For more details, see [PR
28970](https://github.com/langchain-ai/langchain/pull/28970).

---------

Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
2025-01-20 15:15:43 -05:00
Syed Baqar Abbas
f175319303 [feat] Added backwards compatibility for OllamaEmbeddings initialization (migration from langchain_community.embeddings to langchain_ollama.embeddings (#29296)
- [feat] **Added backwards compatibility for OllamaEmbeddings
initialization (migration from `langchain_community.embeddings` to
`langchain_ollama.embeddings`**: "langchain_ollama"
- **Description:** Given that `OllamaEmbeddings` from
`langchain_community.embeddings` is deprecated, code is being shifted to
``langchain_ollama.embeddings`. However, this does not offer backward
compatibility of initializing the parameters and `OllamaEmbeddings`
object.
    - **Issue:** #29294 
    - **Dependencies:** None
    - **Twitter handle:** @BaqarAbbas2001


## Additional Information
Previously, `OllamaEmbeddings` from `langchain_community.embeddings`
used to support the following options:

e9abe583b2/libs/community/langchain_community/embeddings/ollama.py (L125-L139)

However, in the new package `from langchain_ollama import
OllamaEmbeddings`, there is no method to set these options. I have added
these parameters to resolve this issue.

This issue was also discussed in
https://github.com/langchain-ai/langchain/discussions/29113
2025-01-20 11:16:29 -05:00
CLOVA Studio 개발
7a95ffc775 community: fix some features on Naver ChatModel & embedding model 2 (#29243)
## Description
- Responding to `NCP API Key` changes.
- To fix `ChatClovaX` `astream` function to raise `SSEError` when an
error event occurs.
- To add `token length` and `ai_filter` to ChatClovaX's
`response_metadata`.
- To update document for apply NCP API Key changes.

cc. @efriis @vbarda
2025-01-20 11:01:03 -05:00
Sangyun_LEE
5d64597490 docs: fix broken Appearance of langchain_community/document_loaders/recursive_url_loader API Reference (#29305)
# PR mesesage
## Description
Fixed a broken Appearance of RecurisveUrlLoader API Reference.

### Before
<p align="center">
<img width="750" alt="image"
src="https://github.com/user-attachments/assets/f39df65d-b788-411d-88af-8bfa2607c00b"
/>
<img width="750" alt="image"
src="https://github.com/user-attachments/assets/b8a92b70-4548-4b4a-965f-026faeebd0ec"
/>
</p>

### After
<p align="center">
<img width="750" alt="image"
src="https://github.com/user-attachments/assets/8ea28146-de45-42e2-b346-3004ec4dfc55"
/>
<img width="750" alt="image"
src="https://github.com/user-attachments/assets/914c6966-4055-45d3-baeb-2d97eab06fe7"
/>
</p>

## Issue:
N/A
## Dependencies
None
## Twitter handle
N/A

# Add tests and docs
Not applicable; this change only affects documentation.

# Lint and test
Ran make format, make lint, and make test to ensure no issues.
2025-01-20 10:56:59 -05:00
Hemant Rawat
6c52378992 Add Google-style docstring linting and update pyproject.toml (#29303)
### Description:

This PR introduces Google-style docstring linting for the
ModelLaboratory class in libs/langchain/langchain/model_laboratory.py.
It also updates the pyproject.toml file to comply with the latest Ruff
configuration standards (deprecating top-level lint settings in favor of
lint).

### Changes include:
- [x] Added detailed Google-style docstrings to all methods in
ModelLaboratory.
- [x] Updated pyproject.toml to move select and pydocstyle settings
under the [tool.ruff.lint] section.
- [x] Ensured all files pass Ruff linting.

Issue:
Closes #25154

### Dependencies:
No additional dependencies are required for this change.

### Checklist
- [x] Files passes ruff linting.
- [x] Docstrings conform to the Google-style convention.
- [x] pyproject.toml updated to avoid deprecation warnings.
- [x] My PR is ready to review, please review.
2025-01-19 14:37:21 -05:00
Mohammad Mohtashim
b5fbebb3c8 (Community): Changing the BaseURL and Model for MiniMax (#29299)
- **Description:** Changed the Base Default Model and Base URL to
correct versions. Plus added a more explicit exception if user provides
an invalid API Key
- **Issue:** #29278
2025-01-19 14:15:02 -05:00
ccurme
c20f7418c7 openai[patch]: fix Azure LLM test (#29302)
The tokens I get are:
```
['', '\n\n', 'The', ' sun', ' was', ' setting', ' over', ' the', ' horizon', ',', ' casting', '']
```
so possibly an extra empty token is included in the output.

lmk @efriis if we should look into this further.
2025-01-19 17:25:42 +00:00
ccurme
6b249a0dc2 openai[patch]: release 0.3.1 (#29301) 2025-01-19 17:04:00 +00:00
ThomasSaulou
e9abe583b2 chatperplexity stream-citations in additional kwargs (#29273)
chatperplexity stream-citations in additional kwargs

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-01-18 22:31:10 +00:00
Farzad Sharif
8fad9214c7 docs: fix qa_per_user.ipynb (#29290)
# Description
The `config` option was not passed to `configurable_retriever.invoke()`.
Screenshot below. Fixed.
 
<img width="731" alt="Screenshot 2025-01-18 at 11 59 28 AM"
src="https://github.com/user-attachments/assets/21f30739-2abd-4150-b3ad-626ea9e3f96c"
/>
2025-01-18 16:24:31 -05:00
Vadim Rusin
2fb6fd7950 docs: fix broken link in JSONOutputParser reference (#29292)
### PR message:
- **Description:** Fixed a broken link in the documentation for the
`JSONOutputParser`. Updated the link to point to the correct reference:
  From:  

`https://python.langchain.com/api_reference/core/output_parsers/langchain_core.output_parsers.json.JSONOutputParser.html`
  To:  

`https://python.langchain.com/api_reference/core/output_parsers/langchain_core.output_parsers.json.JsonOutputParser.html`.
This ensures accurate navigation for users referring to the
`JsonOutputParser` documentation.
- **Issue:** N/A
- **Dependencies:** None
- **Twitter handle:** N/A

### Add tests and docs:
Not applicable; this change only affects documentation.

### Lint and test:
Ran `make format`, `make lint`, and `make test` to ensure no issues.
2025-01-18 16:17:34 -05:00
TheSongg
1cd4d8d101 [langchain_community.llms.xinference]: Rewrite _stream() method and support stream() method in xinference.py (#29259)
- [ ] **PR title**:[langchain_community.llms.xinference]: Rewrite
_stream() method and support stream() method in xinference.py

- [ ] **PR message**: Rewrite the _stream method so that the
chain.stream() can be used to return data streams.

       chain = prompt | llm
       chain.stream(input=user_input)


- [ ] **tests**: 
      from langchain_community.llms import Xinference
      from langchain.prompts import PromptTemplate

      llm = Xinference(
server_url="http://0.0.0.0:9997", # replace your xinference server url
model_uid={model_uid} # replace model_uid with the model UID return from
launching the model
          stream = True
       )
prompt = PromptTemplate(input=['country'], template="Q: where can we
visit in the capital of {country}? A:")
      chain = prompt | llm
      chain.stream(input={'country': 'France'})
2025-01-17 20:31:59 -05:00
Amaan
d4b9404fd6 docs: add langchain dappier tool integration notebook (#29265)
Add tools to interact with Dappier APIs with an example notebook.

For `DappierRealTimeSearchTool`, the tool can be invoked with:

```python
from langchain_dappier import DappierRealTimeSearchTool

tool = DappierRealTimeSearchTool()

tool.invoke({"query": "What happened at the last wimbledon"})
```

```
At the last Wimbledon in 2024, Carlos Alcaraz won the title by defeating Novak Djokovic. This victory marked Alcaraz's fourth Grand Slam title at just 21 years old! 🎉🏆🎾
```

For DappierAIRecommendationTool the tool can be invoked with:

```python
from langchain_dappier import DappierAIRecommendationTool

tool = DappierAIRecommendationTool(
    data_model_id="dm_01j0pb465keqmatq9k83dthx34",
    similarity_top_k=3,
    ref="sportsnaut.com",
    num_articles_ref=2,
    search_algorithm="most_recent",
)
```

```
[{"author": "Matt Weaver", "image_url": "https://images.dappier.com/dm_01j0pb465keqmatq9k83dthx34...", "pubdate": "Fri, 17 Jan 2025 08:04:03 +0000", "source_url": "https://sportsnaut.com/chili-bowl-thursday-bell-column/", "summary": "The article highlights the thrilling unpredictability... ", "title": "Thursday proves why every lap of Chili Bowl..."},
{"author": "Matt Higgins", "image_url": "https://images.dappier.com/dm_01j0pb465keqmatq9k83dthx34...", "pubdate": "Fri, 17 Jan 2025 02:48:42 +0000", "source_url": "https://sportsnaut.com/new-york-mets-news-pete-alonso...", "summary": "The New York Mets are likely parting ways with star...", "title": "MLB insiders reveal New York Mets’ last-ditch..."},
{"author": "Jim Cerny", "image_url": "https://images.dappier.com/dm_01j0pb465keqmatq9k83dthx34...", "pubdate": "Fri, 17 Jan 2025 05:10:39 +0000", "source_url": "https://www.foreverblueshirts.com/new-york-rangers-news...", "summary": "The New York Rangers achieved a thrilling 5-3 comeback... ", "title": "Rangers score 3 times in 3rd period for stirring 5-3..."}]
```

The integration package can be found over here -
https://github.com/DappierAI/langchain-dappier
2025-01-17 19:02:28 -05:00
ccurme
184ea8aeb2 anthropic[patch]: update tool choice type (#29276) 2025-01-17 15:26:33 -05:00
ccurme
ac52021097 anthropic[patch]: release 0.3.2 (#29275) 2025-01-17 19:48:31 +00:00
ccurme
c616b445f2 anthropic[patch]: support parallel_tool_calls (#29257)
Need to:
- Update docs
- Decide if this is an explicit kwarg of bind_tools
- Decide if this should be in standard test with flag for supporting
2025-01-17 19:41:41 +00:00
Erick Friis
628145b172 infra: fix api build (#29274) 2025-01-17 10:41:59 -08:00
Zapiron
97a5bc7fc7 docs: Fixed typos and improve metadata explanation (#29266)
Fix mini typos and made the explanation of metadata filtering clearer
2025-01-17 11:17:40 -05:00
Jun He
f0226135e5 docs: Remove redundant "%" (#29205)
Before this commit, the copied command can't be used directly.
2025-01-17 14:30:58 +00:00
Michael Chin
36ff83a0b5 docs: Message history for Neptune chains (#29260)
Expanded the Amazon Neptune documentation with new sections detailing
usage of chat message history with the
`create_neptune_opencypher_qa_chain` and
`create_neptune_sparql_qa_chain` functions.
2025-01-17 09:06:17 -05:00
ccurme
d5360b9bd6 core[patch]: release 0.3.30 (#29256) 2025-01-16 17:52:37 -05:00
Nuno Campos
595297e2e5 core: Add support for calls in get_function_nonlocals (#29255)
Thank you for contributing to LangChain!

- [ ] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core, etc. is
being modified. Use "docs: ..." for purely docs 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.
2025-01-16 14:43:42 -08:00
Luis Lopez
75663f2cae community: Add cost per 1K tokens for fine-tuned model cached input (#29248)
### Description

- Since there is no cost per 1k input tokens for a fine-tuned cached
version of `gpt-4o-mini-2024-07-18` is not available when using the
`OpenAICallbackHandler`, it raises an error when trying to make calls
with such model.
- To add the price in the `MODEL_COST_PER_1K_TOKENS` dictionary

cc. @efriis
2025-01-16 15:19:26 -05:00
Junon
667d2a57fd add mode arg to OBSFileLoader.load() method (#29246)
- **Description:** add mode arg to OBSFileLoader.load() method
  - **Issue:** #29245
  - **Dependencies:** no dependencies required for this change

---------

Co-authored-by: Junon_Gz <junon_gz@qq.com>
2025-01-16 11:09:04 -05:00
c6388d736b docs: fix typo in tool_results_pass_to_model.ipynb (how-to) (#29252)
Description: fix typo. change word from `cals` to `calls`
Issue: closes #29251 
Dependencies: None
Twitter handle: None
2025-01-16 11:05:28 -05:00
Erick Friis
4bc6cb759f docs: update recommended code interpreters (#29236)
unstable :(
2025-01-15 16:03:26 -08:00
Erick Friis
5eb4dc5e06 standard-tests: double messages test (#29237) 2025-01-15 15:14:29 -08:00
Nithish Raghunandanan
1051fa5729 couchbase: Migrate couchbase partner package to different repo (#29239)
**Description:** Migrate the couchbase partner package to
[Couchbase-Ecosystem](https://github.com/Couchbase-Ecosystem/langchain-couchbase)
org
2025-01-15 12:37:27 -08:00
Nadeem Sajjad
eaf2fb287f community(pypdfloader): added page_label in metadata for pypdf loader (#29225)
# Description

## Summary
This PR adds support for handling multi-labeled page numbers in the
**PyPDFLoader**. Some PDFs use complex page numbering systems where the
actual content may begin after multiple introductory pages. The
page_label field helps accurately reflect the document’s page structure,
making it easier to handle such cases during document parsing.

## Motivation
This feature improves document parsing accuracy by allowing users to
access the actual page labels instead of relying only on the physical
page numbers. This is particularly useful for documents where the first
few pages have roman numerals or other non-standard page labels.

## Use Case
This feature is especially useful for **Retrieval-Augmented Generation**
(RAG) systems where users may reference page numbers when asking
questions. Some PDFs have both labeled page numbers (like roman numerals
for introductory sections) and index-based page numbers.

For example, a user might ask:

	"What is mentioned on page 5?"

The system can now check both:
	•	**Index-based page number** (page)
	•	**Labeled page number** (page_label)

This dual-check helps improve retrieval accuracy. Additionally, the
results can be validated with an **agent or tool** to ensure the
retrieved pages match the user’s query contextually.

## Code Changes

- Added a page_label field to the metadata of the Document class in
**PyPDFLoader**.
- Implemented support for retrieving page_label from the
pdf_reader.page_labels.
- Created a test case (test_pypdf_loader_with_multi_label_page_numbers)
with a sample PDF containing multi-labeled pages
(geotopo-komprimiert.pdf) [[Source of
pdf](https://github.com/py-pdf/sample-files/blob/main/009-pdflatex-geotopo/GeoTopo-komprimiert.pdf)].
- Updated existing tests to ensure compatibility and verify page_label
extraction.

## Tests Added

- Added a new test case for a PDF with multi-labeled pages.
- Verified both page and page_label metadata fields are correctly
extracted.

## Screenshots

<img width="549" alt="image"
src="https://github.com/user-attachments/assets/65db9f5c-032e-4592-926f-824777c28f33"
/>
2025-01-15 14:18:07 -05:00
Mehdi
1a38948ee3 Mehdi zare/fmp data doc (#29219)
Title: community: add Financial Modeling Prep (FMP) API integration

Description: Adding LangChain integration for Financial Modeling Prep
(FMP) API to enable semantic search and structured tool creation for
financial data endpoints. This integration provides semantic endpoint
search using vector stores and automatic tool creation with proper
typing and error handling. Users can discover relevant financial
endpoints using natural language queries and get properly typed
LangChain tools for discovered endpoints.

Issue: N/A

Dependencies:

fmp-data>=0.3.1
langchain-core>=0.1.0
faiss-cpu
tiktoken
Twitter handle: @mehdizarem

Unit tests and example notebook have been added:

Tests are in tests/integration_tests/est_tools.py and
tests/unit_tests/test_tools.py
Example notebook is in docs/tools.ipynb
All format, lint and test checks pass:

pytest
mypy .
Dependencies are imported within functions and not added to
pyproject.toml. The changes are backwards compatible and only affect the
community package.

---------

Co-authored-by: mehdizare <mehdizare@users.noreply.github.com>
Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-01-15 15:31:01 +00:00
Mohammad Mohtashim
288613d361 (text-splitters): Small Fix in _process_html for HTMLSemanticPreservingSplitter to properly extract the metadata. (#29215)
- **Description:** Include `main` in the list of elements whose child
elements needs to be processed for splitting the HTML.
- **Issue:** #29184
2025-01-15 10:18:06 -05:00
TheSongg
4867fe7ac8 [langchain_community.llms.xinference]: fix error in xinference.py (#29216)
- [ ] **PR title**: [langchain_community.llms.xinference]: fix error in
xinference.py

- [ ] **PR message**:
- The old code raised an ValidationError:
pydantic_core._pydantic_core.ValidationError: 1 validation error for
Xinference when import Xinference from xinference.py. This issue has
been resolved by adjusting it's type and default value.

File "/media/vdc/python/lib/python3.10/site-packages/pydantic/main.py",
line 212, in __init__
validated_self = self.__pydantic_validator__.validate_python(data,
self_instance=self)
pydantic_core._pydantic_core.ValidationError: 1 validation error for
Xinference
        client
Field required [type=missing, input_value={'server_url':
'http://10...t4', 'model_kwargs': {}}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.9/v/missing

- [ ] **tests**:

       from langchain_community.llms import Xinference
       llm = Xinference(
server_url="http://0.0.0.0:9997", # replace your xinference server url
model_uid={model_uid} # replace model_uid with the model UID return from
launching the model
         )
2025-01-15 10:11:26 -05:00
Kostadin Devedzhiev
bea5798b04 docs: Fix typo in retrievers documentation: 'An vectorstore' -> 'A vectorstore' (#29221)
- [x] **PR title**: "docs: Fix typo in documentation"

- [x] **PR message**:
- **Description:** Fixed a typo in the documentation, changing "An
vectorstore" to "A vector store" for grammatical accuracy.
    - **Issue:** N/A (no issue filed for this typo fix)
    - **Dependencies:** None
    - **Twitter handle:** N/A


- [x] **Add tests and docs**: This is a minor documentation fix that
doesn't require additional tests or example notebooks.


- [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/
2025-01-15 10:10:14 -05:00
Sohaib Athar
d1cf10373b Update elasticsearch_retriever.ipynb (#29223)
docs: fix typo (connection)
- **Twitter handle:** @ReallyVirtual
2025-01-15 10:09:51 -05:00
Syed Baqar Abbas
4278046329 [fix] Convert table names to list for compatibility in SQLDatabase (#29229)
- [langchain_community.utilities.SQLDatabase] **[fix] Convert table
names to list for compatibility in SQLDatabase**:
  - The issue #29227 is being fixed here
  - The "package" modified is community
  - The issue lied in this block of code:

44b41b699c/libs/community/langchain_community/utilities/sql_database.py (L72-L77)

- [langchain_community.utilities.SQLDatabase] **[fix] Convert table
names to list for compatibility in SQLDatabase**:
- **Description:** When the SQLDatabase is initialized, it runs a code
`self._inspector.get_table_names(schema=schema)` which expects an output
of list. However, with some connectors (such as snowflake) the data type
returned could be another iterable. This results in a type error when
concatenating the table_names to view_names. I have added explicit type
casting to prevent this.
    - **Issue:** The issue #29227 is being fixed here
    - **Dependencies:** None
    - **Twitter handle:** @BaqarAbbas2001

## Additional Information
When the following method is called for a Snowflake database:

44b41b699c/libs/community/langchain_community/utilities/sql_database.py (L75)

Snowflake under the hood calls:
```python
from snowflake.sqlalchemy.snowdialect import SnowflakeDialect
SnowflakeDialect.get_table_names
```

This method returns a `dict_keys()` object which is incompatible to
concatenate with a list and results in a `TypeError`

### Relevant Library Versions
- **snowflake-sqlalchemy**: 1.7.2  
- **snowflake-connector-python**: 3.12.4  
- **sqlalchemy**: 2.0.20  
- **langchain_community**: 0.3.14
2025-01-15 10:00:03 -05:00
Jin Hyung Ahn
05554265b4 community: Fix ConfluenceLoader load() failure caused by deleted pages (#29232)
## Description
This PR modifies the is_public_page function in ConfluenceLoader to
prevent exceptions caused by deleted pages during the execution of
ConfluenceLoader.process_pages().


**Example scenario:**
Consider the following usage of ConfluenceLoader:
```python
import os
from langchain_community.document_loaders import ConfluenceLoader

loader = ConfluenceLoader(
        url=os.getenv("BASE_URL"),
        token=os.getenv("TOKEN"),
        max_pages=1000,
        cql=f'type=page and lastmodified >= "2020-01-01 00:00"',
        include_restricted_content=False,
)

# Raised Exception : HTTPError: Outdated version/old_draft/trashed? Cannot find content Please provide valid ContentId.
documents = loader.load()
```

If a deleted page exists within the query result, the is_public_page
function would previously raise an exception when calling
get_all_restrictions_for_content, causing the loader.load() process to
fail for all pages.



By adding a pre-check for the page's "current" status, unnecessary API
calls to get_all_restrictions_for_content for non-current pages are
avoided.


This fix ensures that such pages are skipped without affecting the rest
of the loading process.





## Issue
N/A (No specific issue number)

## Dependencies
No new dependencies are introduced with this change.

## Twitter handle
[@zenoengine](https://x.com/zenoengine)
2025-01-15 09:56:23 -05:00
Mohammad Mohtashim
21eb39dff0 [Community]: AzureOpenAIWhisperParser Authenication Fix (#29135)
- **Description:** `AzureOpenAIWhisperParser` authentication fix as
stated in the issue.
- **Issue:** #29133
2025-01-15 09:44:53 -05:00
Erick Friis
44b41b699c docs: api docs build folder prep update (#29220) 2025-01-15 03:52:00 +00:00
Erick Friis
b05543c69b packages: disable mongodb for api docs (#29218) 2025-01-15 02:23:01 +00:00
Erick Friis
30badd7a32 packages: update mongodb folder (#29217) 2025-01-15 02:01:06 +00:00
pm390
76172511fd community: Additional parameters for OpenAIAssistantV2Runnable (#29207)
**Description:** Added Additional parameters that could be useful for
usage of OpenAIAssistantV2Runnable.

This change is thought to allow langchain users to set parameters that
cannot be set using assistants UI
(max_completion_tokens,max_prompt_tokens,parallel_tool_calls) and
parameters that could be useful for experimenting like top_p and
temperature.

This PR originated from the need of using parallel_tool_calls in
langchain, this parameter is very important in openAI assistants because
without this parameter set to False strict mode is not respected by
OpenAI Assistants
(https://platform.openai.com/docs/guides/function-calling#parallel-function-calling).

> Note: Currently, if the model calls multiple functions in one turn
then strict mode will be disabled for those calls.

**Issue:** None
**Dependencies:** openai
2025-01-14 15:53:37 -05:00
Guy Korland
efadad6067 Add Link to FalkorDB Memory example (#29204)
- **Description:** Add Link to FalkorDB Memory example
2025-01-14 13:27:52 -05:00
Bagatur
4ab04ad6be docs: oai api ref nit (#29210) 2025-01-14 17:55:16 +00:00
Michael Chin
d9b856abad community: Deprecate Amazon Neptune resources in langchain-community (#29191)
Related: https://github.com/langchain-ai/langchain-aws/pull/322

The legacy `NeptuneOpenCypherQAChain` and `NeptuneSparqlQAChain` classes
are being replaced by the new LCEL format chains
`create_neptune_opencypher_qa_chain` and
`create_neptune_sparql_qa_chain`, respectively, in the `langchain_aws`
package.

This PR adds deprecation warnings to all Neptune classes and functions
that have been migrated to `langchain_aws`. All relevant documentation
has also been updated to replace `langchain_community` usage with the
new `langchain_aws` implementations.

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-01-14 10:23:34 -05:00
Erick Friis
c55af44711 anthropic: pydantic mypy plugin (#29144) 2025-01-13 15:32:40 -08:00
Erick Friis
cdf3a17e55 docs: fix httpx conflicts with overrides in docs build (#29180) 2025-01-13 21:25:00 +00:00
ccurme
1bf6576709 cli[patch]: fix anchor links in templates (#29178)
These are outdated and can break docs builds.
2025-01-13 18:28:18 +00:00
Christopher Varjas
e156b372fb langchain: support api key argument with OpenAI moderation chain (#29140)
**Description:** Makes it possible to instantiate
`OpenAIModerationChain` with an `openai_api_key` argument only and no
`OPENAI_API_KEY` environment variable defined.

**Issue:** https://github.com/langchain-ai/langchain/issues/25176

**Dependencies:** `openai`

---------

Co-authored-by: ccurme <chester.curme@gmail.com>
2025-01-13 11:00:02 -05:00
Nikhil Shahi
335ca3a606 docs: add HyperbrowserLoader docs (#29143)
### Description
This PR adds docs for the
[langchain-hyperbrowser](https://pypi.org/project/langchain-hyperbrowser/)
package. It includes a document loader that uses Hyperbrowser to scrape
or crawl any urls and return formatted markdown or html content as well
as relevant metadata.
[Hyperbrowser](https://hyperbrowser.ai) is a platform for running and
scaling headless browsers. It lets you launch and manage browser
sessions at scale and provides easy to use solutions for any webscraping
needs, such as scraping a single page or crawling an entire site.

### Issue
None

### Dependencies
None

### Twitter Handle
`@hyperbrowser`
2025-01-13 10:45:39 -05:00
Zhengren Wang
4c0217681a cookbook: fix typo in cookbook/mongodb-langchain-cache-memory.ipynb (#29149)
Description: fix "enviornment" into "environment". 
Issue: Typo
Dependencies: None
Twitter handle: zrwang01
2025-01-13 10:35:34 -05:00
Gabe Cornejo
e64bfb537f docs: Fix old link to Unstructured package in document_loader_markdown.ipynb (#29175)
Fixed a broken link in `document_loader_markdown.ipynb` to point to the
updated documentation page for the Unstructured package.
Issue: N/A
Dependencies: None
2025-01-13 15:26:01 +00:00
Tymon Żarski
689592f9bb community: Fix rank-llm import paths for new 0.20.3 version (#29154)
# **PR title**: "community: Fix rank-llm import paths for new 0.20.3
version"
- The "community" package is being modified to handle updated import
paths for the new `rank-llm` version.

---

## Description
This PR updates the import paths for the `rank-llm` package to account
for changes introduced in version `0.20.3`. The changes ensure
compatibility with both pre- and post-revamp versions of `rank-llm`,
specifically version `0.12.8`. Conditional imports are introduced based
on the detected version of `rank-llm` to handle different path
structures for `VicunaReranker`, `ZephyrReranker`, and `SafeOpenai`.

## Issue
RankLLMRerank usage throws an error when used GPT (not only) when
rank-llm version is > 0.12.8 - #29156

## Dependencies
This change relies on the `packaging` and `pkg_resources` libraries to
handle version checks.

## Twitter handle
@tymzar
2025-01-13 10:22:14 -05:00
Andrew
0e3115330d Add additional_instructions on openai assistan runs create. (#29164)
- **Description**: In the functions `_create_run` and `_acreate_run`,
the parameters passed to the creation of
`openai.resources.beta.threads.runs` were limited.

  Source: 
  ```
  def _create_run(self, input: dict) -> Any:
        params = {
            k: v
            for k, v in input.items()
            if k in ("instructions", "model", "tools", "run_metadata")
        }
        return self.client.beta.threads.runs.create(
            input["thread_id"],
            assistant_id=self.assistant_id,
            **params,
        )
  ```
- OpenAI Documentation
([createRun](https://platform.openai.com/docs/api-reference/runs/createRun))

- Full list of parameters `openai.resources.beta.threads.runs` ([source
code](https://github.com/openai/openai-python/blob/main/src/openai/resources/beta/threads/runs/runs.py#L91))

 
- **Issue:** Fix #17574 



- [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: ccurme <chester.curme@gmail.com>
2025-01-13 10:11:47 -05:00
ccurme
e4ceafa1c8 langchain[patch]: update extended tests for compatibility with langchain-openai==0.3 (#29174) 2025-01-13 15:04:22 +00:00
Syed Muneeb Abbas
8ef7f3eacc Fixed the import error in OpenAIWhisperParserLocal and resolved the L… (#29168)
…angChain parser issue.

Thank you for contributing to LangChain!

- [ ] **PR title**: "package: description"
- Where "package" is whichever of langchain, community, core, etc. is
being modified. Use "docs: ..." for purely docs 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.
2025-01-13 09:47:31 -05:00
Priyansh Agrawal
c115c09b6d community: add missing format specifier in error log in CubeSemanticLoader (#29172)
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, "infra: ..."
for CI changes.
  - Example: "community: add foobar LLM"


- [x] **PR message**
- **Description:** Add a missing format specifier in an an error log in
`langchain_community.document_loaders.CubeSemanticLoader`
- **Issue:** raises `TypeError: not all arguments converted during
string formatting`


- [ ] **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.
2025-01-13 09:32:57 -05:00
ThomasSaulou
349b5c91c2 fix chatperplexity: remove 'stream' from params in _stream method (#29173)
quick fix chatperplexity: remove 'stream' from params in _stream method
2025-01-13 09:31:37 -05:00
LIU Yuwei
f980144e9c community: add init for unstructured file loader (#29101)
## Description
Add `__init__` for unstructured loader of
epub/image/markdown/pdf/ppt/word to restrict the input type to `str` or
`Path`.
In the
[signature](https://python.langchain.com/api_reference/community/document_loaders/langchain_community.document_loaders.markdown.UnstructuredMarkdownLoader.html)
these unstructured loaders receive `file_path: str | List[str] | Path |
List[Path]`, but actually they only receive `str` or `Path`.

## Issue
None

## Dependencies
No changes.
2025-01-13 09:26:00 -05:00
Erick Friis
bbc3e3b2cf openai: disable streaming for o1 by default (#29147)
Currently 400s
https://community.openai.com/t/streaming-support-for-o1-o1-2024-12-17-resulting-in-400-unsupported-value/1085043

o1-mini and o1-preview stream fine
2025-01-11 02:24:11 +00:00
Isaac Francisco
62074bac60 replace all LANGCHAIN_ flags with LANGSMITH_ flags (#29120) 2025-01-11 01:24:40 +00:00
Bagatur
5c2fbb5b86 docs: Update openai README.md (#29146) 2025-01-10 17:24:16 -08:00
Erick Friis
0a54aedb85 anthropic: pdf integration test (#29142) 2025-01-10 21:56:31 +00:00
ccurme
8de8519daf tests[patch]: release 0.3.8 (#29141) 2025-01-10 21:53:41 +00:00
Jiang
7d3fb21807 Add lindorm as new integration (#29123)
Misoperation caused the pr close: [origin pr
link](https://github.com/langchain-ai/langchain/pull/29085)

---------

Co-authored-by: jiangzhijie <jiangzhijie.jzj@alibaba-inc.com>
2025-01-10 16:30:37 -05:00
Zapiron
7594ad694f docs: update the correct learning objective YAML instead of XML (#29131)
Update the correct learning objective for the how-to page by changing
XML to YAML which is taught.

Co-authored-by: ccurme <chester.curme@gmail.com>
2025-01-10 16:13:13 -05:00
Mateusz Szewczyk
b1d3e25eb6 docs: Update IBM WatsonxRerank documentation (#29138)
Thank you for contributing to LangChain!

Update presented model in `WatsonxRerank` documentation.

- [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/
2025-01-10 15:07:29 -05:00
ccurme
4819b500e8 pinecone[patch]: release 0.2.2 (#29139) 2025-01-10 14:59:57 -05:00
Ashvin
46fd09ffeb partner: Update aiohttp in langchain pinecone. (#28863)
- **partner**: "Update Aiohttp for resolving vulnerability issue"
    
- **Description:** I have updated the upper limit of aiohttp from `3.10`
to `3.10.5` in the pyproject.toml file of langchain-pinecone. Hopefully
this will resolve #28771 . Please review this as I'm quite unsure.

---------

Co-authored-by: = <=>
Co-authored-by: Chester Curme <chester.curme@gmail.com>
2025-01-10 14:54:52 -05:00
ccurme
df5ec45b32 docs[patch]: update docs for langchain-openai==0.3 (#29119)
Update model for one notebook that specified `gpt-4`.

Otherwise just updating cassettes.

---------

Co-authored-by: Jacob Lee <jacoblee93@gmail.com>
Co-authored-by: Bagatur <baskaryan@gmail.com>
2025-01-10 13:29:31 -05:00
984 changed files with 81685 additions and 68126 deletions

21
.github/actions/uv_setup/action.yml vendored Normal file
View File

@@ -0,0 +1,21 @@
# TODO: https://docs.astral.sh/uv/guides/integration/github/#caching
name: uv-install
description: Set up Python and uv
inputs:
python-version:
description: Python version, supporting MAJOR.MINOR only
required: true
env:
UV_VERSION: "0.5.25"
runs:
using: composite
steps:
- name: Install uv and set the python version
uses: astral-sh/setup-uv@v5
with:
version: ${{ env.UV_VERSION }}
python-version: ${{ inputs.python-version }}

View File

@@ -7,6 +7,8 @@ from typing import Dict, List, Set
from pathlib import Path
import tomllib
from packaging.requirements import Requirement
from get_min_versions import get_min_version_from_toml
@@ -37,6 +39,7 @@ IGNORED_PARTNERS = [
PY_312_MAX_PACKAGES = [
"libs/partners/huggingface", # https://github.com/pytorch/pytorch/issues/130249
"libs/partners/voyageai",
]
@@ -61,15 +64,17 @@ def dependents_graph() -> dict:
# load regular and test deps from pyproject.toml
with open(path, "rb") as f:
pyproject = tomllib.load(f)["tool"]["poetry"]
pyproject = tomllib.load(f)
pkg_dir = "libs" + "/".join(path.split("libs")[1].split("/")[:-1])
for dep in [
*pyproject["dependencies"].keys(),
*pyproject["group"]["test"]["dependencies"].keys(),
*pyproject["project"]["dependencies"],
*pyproject["dependency-groups"]["test"],
]:
requirement = Requirement(dep)
package_name = requirement.name
if "langchain" in dep:
dependents[dep].add(pkg_dir)
dependents[package_name].add(pkg_dir)
continue
# load extended deps from extended_testing_deps.txt
@@ -120,8 +125,7 @@ def _get_configs_for_single_dir(job: str, dir_: str) -> List[Dict[str, str]]:
py_versions = ["3.9", "3.10", "3.11", "3.12", "3.13"]
# custom logic for specific directories
elif dir_ == "libs/partners/milvus":
# milvus poetry doesn't allow 3.12 because they
# declare deps in funny way
# milvus doesn't allow 3.12 because they declare deps in funny way
py_versions = ["3.9", "3.11"]
elif dir_ in PY_312_MAX_PACKAGES:
@@ -148,17 +152,17 @@ def _get_configs_for_single_dir(job: str, dir_: str) -> List[Dict[str, str]]:
def _get_pydantic_test_configs(
dir_: str, *, python_version: str = "3.11"
) -> List[Dict[str, str]]:
with open("./libs/core/poetry.lock", "rb") as f:
core_poetry_lock_data = tomllib.load(f)
for package in core_poetry_lock_data["package"]:
with open("./libs/core/uv.lock", "rb") as f:
core_uv_lock_data = tomllib.load(f)
for package in core_uv_lock_data["package"]:
if package["name"] == "pydantic":
core_max_pydantic_minor = package["version"].split(".")[1]
break
with open(f"./{dir_}/poetry.lock", "rb") as f:
dir_poetry_lock_data = tomllib.load(f)
with open(f"./{dir_}/uv.lock", "rb") as f:
dir_uv_lock_data = tomllib.load(f)
for package in dir_poetry_lock_data["package"]:
for package in dir_uv_lock_data["package"]:
if package["name"] == "pydantic":
dir_max_pydantic_minor = package["version"].split(".")[1]
break
@@ -304,9 +308,8 @@ if __name__ == "__main__":
f"Unknown lib: {file}. check_diff.py likely needs "
"an update for this new library!"
)
elif any(file.startswith(p) for p in ["docs/", "cookbook/"]):
if file.startswith("docs/"):
docs_edited = True
elif file.startswith("docs/") or file in ["pyproject.toml", "uv.lock"]: # docs or root uv files
docs_edited = True
dirs_to_run["lint"].add(".")
dependents = dependents_graph()

View File

@@ -10,26 +10,25 @@ if __name__ == "__main__":
toml_data = tomllib.load(file)
# see if we're releasing an rc
version = toml_data["tool"]["poetry"]["version"]
version = toml_data["project"]["version"]
releasing_rc = "rc" in version or "dev" in version
# if not, iterate through dependencies and make sure none allow prereleases
if not releasing_rc:
dependencies = toml_data["tool"]["poetry"]["dependencies"]
for lib in dependencies:
dep_version = dependencies[lib]
dependencies = toml_data["project"]["dependencies"]
for dep_version in dependencies:
dep_version_string = (
dep_version["version"] if isinstance(dep_version, dict) else dep_version
)
if "rc" in dep_version_string:
raise ValueError(
f"Dependency {lib} has a prerelease version. Please remove this."
f"Dependency {dep_version} has a prerelease version. Please remove this."
)
if isinstance(dep_version, dict) and dep_version.get(
"allow-prereleases", False
):
raise ValueError(
f"Dependency {lib} has allow-prereleases set to true. Please remove this."
f"Dependency {dep_version} has allow-prereleases set to true. Please remove this."
)

View File

@@ -1,3 +1,4 @@
from collections import defaultdict
import sys
from typing import Optional
@@ -7,6 +8,7 @@ else:
# for python 3.10 and below, which doesnt have stdlib tomllib
import tomli as tomllib
from packaging.requirements import Requirement
from packaging.specifiers import SpecifierSet
from packaging.version import Version
@@ -94,6 +96,23 @@ def get_minimum_version(package_name: str, spec_string: str) -> Optional[str]:
return str(min(valid_versions)) if valid_versions else None
def _check_python_version_from_requirement(
requirement: Requirement, python_version: str
) -> bool:
if not requirement.marker:
return True
else:
marker_str = str(requirement.marker)
if "python_version" or "python_full_version" in marker_str:
python_version_str = "".join(
char
for char in marker_str
if char.isdigit() or char in (".", "<", ">", "=", ",")
)
return check_python_version(python_version, python_version_str)
return True
def get_min_version_from_toml(
toml_path: str,
versions_for: str,
@@ -105,8 +124,10 @@ def get_min_version_from_toml(
with open(toml_path, "rb") as file:
toml_data = tomllib.load(file)
# Get the dependencies from tool.poetry.dependencies
dependencies = toml_data["tool"]["poetry"]["dependencies"]
dependencies = defaultdict(list)
for dep in toml_data["project"]["dependencies"]:
requirement = Requirement(dep)
dependencies[requirement.name].append(requirement)
# Initialize a dictionary to store the minimum versions
min_versions = {}
@@ -121,17 +142,11 @@ def get_min_version_from_toml(
if lib in dependencies:
if include and lib not in include:
continue
# Get the version string
version_string = dependencies[lib]
if isinstance(version_string, dict):
version_string = version_string["version"]
if isinstance(version_string, list):
version_string = [
vs
for vs in version_string
if check_python_version(python_version, vs["python"])
][0]["version"]
requirements = dependencies[lib]
for requirement in requirements:
if _check_python_version_from_requirement(requirement, python_version):
version_string = str(requirement.specifier)
break
# Use parse_version to get the minimum supported version from version_string
min_version = get_minimum_version(lib, version_string)

View File

@@ -64,19 +64,29 @@ def main():
try:
# Load packages configuration
package_yaml = load_packages_yaml()
packages = [
# Clean target directories
clean_target_directories([
p
for p in package_yaml["packages"]
if p["repo"].startswith("langchain-ai/")
and p["repo"] != "langchain-ai/langchain"
])
# Move libraries to their new locations
move_libraries([
p
for p in package_yaml["packages"]
if not p.get("disabled", False)
and p["repo"].startswith("langchain-ai/")
and p["repo"] != "langchain-ai/langchain"
]
])
# Clean target directories
clean_target_directories(packages)
# Move libraries to their new locations
move_libraries(packages)
# Delete ones without a pyproject.toml
for partner in Path("langchain/libs/partners").iterdir():
if partner.is_dir() and not (partner / "pyproject.toml").exists():
print(f"Removing {partner} as it does not have a pyproject.toml")
shutil.rmtree(partner)
print("Library sync completed successfully!")

View File

@@ -13,7 +13,7 @@ on:
description: "Python version to use"
env:
POETRY_VERSION: "1.8.4"
UV_FROZEN: "true"
jobs:
build:
@@ -22,25 +22,22 @@ jobs:
working-directory: ${{ inputs.working-directory }}
runs-on: ubuntu-latest
timeout-minutes: 20
name: "poetry run pytest -m compile tests/integration_tests #${{ inputs.python-version }}"
name: "uv run pytest -m compile tests/integration_tests #${{ inputs.python-version }}"
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ inputs.python-version }} + Poetry ${{ env.POETRY_VERSION }}
uses: "./.github/actions/poetry_setup"
- name: Set up Python ${{ inputs.python-version }} + uv
uses: "./.github/actions/uv_setup"
with:
python-version: ${{ inputs.python-version }}
poetry-version: ${{ env.POETRY_VERSION }}
working-directory: ${{ inputs.working-directory }}
cache-key: compile-integration
- name: Install integration dependencies
shell: bash
run: poetry install --with=test_integration,test
run: uv sync --group test --group test_integration
- name: Check integration tests compile
shell: bash
run: poetry run pytest -m compile tests/integration_tests
run: uv run pytest -m compile tests/integration_tests
- name: Ensure the tests did not create any additional files
shell: bash

View File

@@ -12,7 +12,7 @@ on:
description: "Python version to use"
env:
POETRY_VERSION: "1.8.4"
UV_FROZEN: "true"
jobs:
build:
@@ -24,22 +24,19 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ inputs.python-version }} + Poetry ${{ env.POETRY_VERSION }}
uses: "./.github/actions/poetry_setup"
- name: Set up Python ${{ inputs.python-version }} + uv
uses: "./.github/actions/uv_setup"
with:
python-version: ${{ inputs.python-version }}
poetry-version: ${{ env.POETRY_VERSION }}
working-directory: ${{ inputs.working-directory }}
cache-key: core
- name: Install dependencies
shell: bash
run: poetry install --with test,test_integration
run: uv sync --group test --group test_integration
- name: Install deps outside pyproject
if: ${{ startsWith(inputs.working-directory, 'libs/community/') }}
shell: bash
run: poetry run pip install "boto3<2" "google-cloud-aiplatform<2"
run: VIRTUAL_ENV=.venv uv pip install "boto3<2" "google-cloud-aiplatform<2"
- name: Run integration tests
shell: bash
@@ -67,8 +64,6 @@ jobs:
NOMIC_API_KEY: ${{ secrets.NOMIC_API_KEY }}
WATSONX_APIKEY: ${{ secrets.WATSONX_APIKEY }}
WATSONX_PROJECT_ID: ${{ secrets.WATSONX_PROJECT_ID }}
PINECONE_API_KEY: ${{ secrets.PINECONE_API_KEY }}
PINECONE_ENVIRONMENT: ${{ secrets.PINECONE_ENVIRONMENT }}
ASTRA_DB_API_ENDPOINT: ${{ secrets.ASTRA_DB_API_ENDPOINT }}
ASTRA_DB_APPLICATION_TOKEN: ${{ secrets.ASTRA_DB_APPLICATION_TOKEN }}
ASTRA_DB_KEYSPACE: ${{ secrets.ASTRA_DB_KEYSPACE }}

View File

@@ -13,12 +13,13 @@ on:
description: "Python version to use"
env:
POETRY_VERSION: "1.8.4"
WORKDIR: ${{ inputs.working-directory == '' && '.' || inputs.working-directory }}
# This env var allows us to get inline annotations when ruff has complaints.
RUFF_OUTPUT_FORMAT: github
UV_FROZEN: "true"
jobs:
build:
name: "make lint #${{ inputs.python-version }}"
@@ -27,25 +28,10 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ inputs.python-version }} + Poetry ${{ env.POETRY_VERSION }}
uses: "./.github/actions/poetry_setup"
- name: Set up Python ${{ inputs.python-version }} + uv
uses: "./.github/actions/uv_setup"
with:
python-version: ${{ inputs.python-version }}
poetry-version: ${{ env.POETRY_VERSION }}
working-directory: ${{ inputs.working-directory }}
cache-key: lint-with-extras
- name: Check Poetry File
shell: bash
working-directory: ${{ inputs.working-directory }}
run: |
poetry check
- name: Check lock file
shell: bash
working-directory: ${{ inputs.working-directory }}
run: |
poetry lock --check
- name: Install dependencies
# Also installs dev/lint/test/typing dependencies, to ensure we have
@@ -58,17 +44,7 @@ jobs:
# It doesn't matter how you change it, any change will cause a cache-bust.
working-directory: ${{ inputs.working-directory }}
run: |
poetry install --with lint,typing
- name: Get .mypy_cache to speed up mypy
uses: actions/cache@v4
env:
SEGMENT_DOWNLOAD_TIMEOUT_MIN: "2"
with:
path: |
${{ env.WORKDIR }}/.mypy_cache
key: mypy-lint-${{ runner.os }}-${{ runner.arch }}-py${{ inputs.python-version }}-${{ inputs.working-directory }}-${{ hashFiles(format('{0}/poetry.lock', inputs.working-directory)) }}
uv sync --group lint --group typing
- name: Analysing the code with our lint
working-directory: ${{ inputs.working-directory }}
@@ -87,21 +63,12 @@ jobs:
if: ${{ ! startsWith(inputs.working-directory, 'libs/partners/') }}
working-directory: ${{ inputs.working-directory }}
run: |
poetry install --with test
uv sync --inexact --group test
- name: Install unit+integration test dependencies
if: ${{ startsWith(inputs.working-directory, 'libs/partners/') }}
working-directory: ${{ inputs.working-directory }}
run: |
poetry install --with test,test_integration
- name: Get .mypy_cache_test to speed up mypy
uses: actions/cache@v4
env:
SEGMENT_DOWNLOAD_TIMEOUT_MIN: "2"
with:
path: |
${{ env.WORKDIR }}/.mypy_cache_test
key: mypy-test-${{ runner.os }}-${{ runner.arch }}-py${{ inputs.python-version }}-${{ inputs.working-directory }}-${{ hashFiles(format('{0}/poetry.lock', inputs.working-directory)) }}
uv sync --inexact --group test --group test_integration
- name: Analysing the code with our lint
working-directory: ${{ inputs.working-directory }}

View File

@@ -21,7 +21,8 @@ on:
env:
PYTHON_VERSION: "3.11"
POETRY_VERSION: "1.8.4"
UV_FROZEN: "true"
UV_NO_SYNC: "true"
jobs:
build:
@@ -36,13 +37,10 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set up Python + Poetry ${{ env.POETRY_VERSION }}
uses: "./.github/actions/poetry_setup"
- name: Set up Python + uv
uses: "./.github/actions/uv_setup"
with:
python-version: ${{ env.PYTHON_VERSION }}
poetry-version: ${{ env.POETRY_VERSION }}
working-directory: ${{ inputs.working-directory }}
cache-key: release
# We want to keep this build stage *separate* from the release stage,
# so that there's no sharing of permissions between them.
@@ -56,7 +54,7 @@ jobs:
# > from the publish job.
# https://github.com/pypa/gh-action-pypi-publish#non-goals
- name: Build project for distribution
run: poetry build
run: uv build
working-directory: ${{ inputs.working-directory }}
- name: Upload build
@@ -67,11 +65,18 @@ jobs:
- name: Check Version
id: check-version
shell: bash
shell: python
working-directory: ${{ inputs.working-directory }}
run: |
echo pkg-name="$(poetry version | cut -d ' ' -f 1)" >> $GITHUB_OUTPUT
echo version="$(poetry version --short)" >> $GITHUB_OUTPUT
import os
import tomllib
with open("pyproject.toml", "rb") as f:
data = tomllib.load(f)
pkg_name = data["project"]["name"]
version = data["project"]["version"]
with open(os.environ["GITHUB_OUTPUT"], "a") as f:
f.write(f"pkg-name={pkg_name}\n")
f.write(f"version={version}\n")
release-notes:
needs:
- build
@@ -184,13 +189,11 @@ jobs:
# - The package is published, and it breaks on the missing dependency when
# used in the real world.
- name: Set up Python + Poetry ${{ env.POETRY_VERSION }}
uses: "./.github/actions/poetry_setup"
- name: Set up Python + uv
uses: "./.github/actions/uv_setup"
id: setup-python
with:
python-version: ${{ env.PYTHON_VERSION }}
poetry-version: ${{ env.POETRY_VERSION }}
working-directory: ${{ inputs.working-directory }}
- uses: actions/download-artifact@v4
with:
@@ -213,16 +216,18 @@ jobs:
# - attempt install again after 5 seconds if it fails because there is
# sometimes a delay in availability on test pypi
run: |
poetry run pip install dist/*.whl
uv venv
VIRTUAL_ENV=.venv uv pip install dist/*.whl
# Replace all dashes in the package name with underscores,
# since that's how Python imports packages with dashes in the name.
IMPORT_NAME="$(echo "$PKG_NAME" | sed s/-/_/g)"
# also remove _official suffix
IMPORT_NAME="$(echo "$PKG_NAME" | sed s/-/_/g | sed s/_official//g)"
poetry run python -c "import $IMPORT_NAME; print(dir($IMPORT_NAME))"
uv run python -c "import $IMPORT_NAME; print(dir($IMPORT_NAME))"
- name: Import test dependencies
run: poetry install --with test --no-root
run: uv sync --group test
working-directory: ${{ inputs.working-directory }}
# Overwrite the local version of the package with the built version
@@ -233,7 +238,7 @@ jobs:
PKG_NAME: ${{ needs.build.outputs.pkg-name }}
VERSION: ${{ needs.build.outputs.version }}
run: |
poetry run pip install dist/*.whl
VIRTUAL_ENV=.venv uv pip install dist/*.whl
- name: Run unit tests
run: make tests
@@ -242,15 +247,15 @@ jobs:
- name: Check for prerelease versions
working-directory: ${{ inputs.working-directory }}
run: |
poetry run python $GITHUB_WORKSPACE/.github/scripts/check_prerelease_dependencies.py pyproject.toml
uv run python $GITHUB_WORKSPACE/.github/scripts/check_prerelease_dependencies.py pyproject.toml
- name: Get minimum versions
working-directory: ${{ inputs.working-directory }}
id: min-version
run: |
poetry run pip install packaging requests
python_version="$(poetry run python --version | awk '{print $2}')"
min_versions="$(poetry run python $GITHUB_WORKSPACE/.github/scripts/get_min_versions.py pyproject.toml release $python_version)"
VIRTUAL_ENV=.venv uv pip install packaging requests
python_version="$(uv run python --version | awk '{print $2}')"
min_versions="$(uv run python $GITHUB_WORKSPACE/.github/scripts/get_min_versions.py pyproject.toml release $python_version)"
echo "min-versions=$min_versions" >> "$GITHUB_OUTPUT"
echo "min-versions=$min_versions"
@@ -259,12 +264,12 @@ jobs:
env:
MIN_VERSIONS: ${{ steps.min-version.outputs.min-versions }}
run: |
poetry run pip install --force-reinstall $MIN_VERSIONS --editable .
VIRTUAL_ENV=.venv uv pip install --force-reinstall $MIN_VERSIONS --editable .
make tests
working-directory: ${{ inputs.working-directory }}
- name: Import integration test dependencies
run: poetry install --with test,test_integration
run: uv sync --group test --group test_integration
working-directory: ${{ inputs.working-directory }}
- name: Run integration tests
@@ -292,8 +297,6 @@ jobs:
NOMIC_API_KEY: ${{ secrets.NOMIC_API_KEY }}
WATSONX_APIKEY: ${{ secrets.WATSONX_APIKEY }}
WATSONX_PROJECT_ID: ${{ secrets.WATSONX_PROJECT_ID }}
PINECONE_API_KEY: ${{ secrets.PINECONE_API_KEY }}
PINECONE_ENVIRONMENT: ${{ secrets.PINECONE_ENVIRONMENT }}
ASTRA_DB_API_ENDPOINT: ${{ secrets.ASTRA_DB_API_ENDPOINT }}
ASTRA_DB_APPLICATION_TOKEN: ${{ secrets.ASTRA_DB_APPLICATION_TOKEN }}
ASTRA_DB_KEYSPACE: ${{ secrets.ASTRA_DB_KEYSPACE }}
@@ -305,6 +308,7 @@ jobs:
UPSTAGE_API_KEY: ${{ secrets.UPSTAGE_API_KEY }}
FIREWORKS_API_KEY: ${{ secrets.FIREWORKS_API_KEY }}
XAI_API_KEY: ${{ secrets.XAI_API_KEY }}
DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
run: make integration_tests
working-directory: ${{ inputs.working-directory }}
@@ -330,13 +334,10 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set up Python + Poetry ${{ env.POETRY_VERSION }}
uses: "./.github/actions/poetry_setup"
- name: Set up Python + uv
uses: "./.github/actions/uv_setup"
with:
python-version: ${{ env.PYTHON_VERSION }}
poetry-version: ${{ env.POETRY_VERSION }}
working-directory: ${{ inputs.working-directory }}
cache-key: release
- uses: actions/download-artifact@v4
with:
@@ -372,13 +373,10 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set up Python + Poetry ${{ env.POETRY_VERSION }}
uses: "./.github/actions/poetry_setup"
- name: Set up Python + uv
uses: "./.github/actions/uv_setup"
with:
python-version: ${{ env.PYTHON_VERSION }}
poetry-version: ${{ env.POETRY_VERSION }}
working-directory: ${{ inputs.working-directory }}
cache-key: release
- uses: actions/download-artifact@v4
with:

View File

@@ -13,7 +13,8 @@ on:
description: "Python version to use"
env:
POETRY_VERSION: "1.8.4"
UV_FROZEN: "true"
UV_NO_SYNC: "true"
jobs:
build:
@@ -26,17 +27,14 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ inputs.python-version }} + Poetry ${{ env.POETRY_VERSION }}
uses: "./.github/actions/poetry_setup"
- name: Set up Python ${{ inputs.python-version }} + uv
uses: "./.github/actions/uv_setup"
id: setup-python
with:
python-version: ${{ inputs.python-version }}
poetry-version: ${{ env.POETRY_VERSION }}
working-directory: ${{ inputs.working-directory }}
cache-key: core
- name: Install dependencies
shell: bash
run: poetry install --with test
run: uv sync --group test --dev
- name: Run core tests
shell: bash
@@ -48,9 +46,9 @@ jobs:
id: min-version
shell: bash
run: |
poetry run pip install packaging tomli requests
python_version="$(poetry run python --version | awk '{print $2}')"
min_versions="$(poetry run python $GITHUB_WORKSPACE/.github/scripts/get_min_versions.py pyproject.toml pull_request $python_version)"
VIRTUAL_ENV=.venv uv pip install packaging tomli requests
python_version="$(uv run python --version | awk '{print $2}')"
min_versions="$(uv run python $GITHUB_WORKSPACE/.github/scripts/get_min_versions.py pyproject.toml pull_request $python_version)"
echo "min-versions=$min_versions" >> "$GITHUB_OUTPUT"
echo "min-versions=$min_versions"
@@ -59,8 +57,7 @@ jobs:
env:
MIN_VERSIONS: ${{ steps.min-version.outputs.min-versions }}
run: |
poetry run pip install uv
poetry run uv pip install $MIN_VERSIONS
VIRTUAL_ENV=.venv uv pip install $MIN_VERSIONS
make tests
working-directory: ${{ inputs.working-directory }}

View File

@@ -9,7 +9,7 @@ on:
description: "Python version to use"
env:
POETRY_VERSION: "1.8.4"
UV_FROZEN: "true"
jobs:
build:
@@ -19,25 +19,23 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ inputs.python-version }} + Poetry ${{ env.POETRY_VERSION }}
uses: "./.github/actions/poetry_setup"
- name: Set up Python ${{ inputs.python-version }} + uv
uses: "./.github/actions/uv_setup"
with:
python-version: ${{ inputs.python-version }}
poetry-version: ${{ env.POETRY_VERSION }}
cache-key: core
- name: Install dependencies
shell: bash
run: poetry install --with test
run: uv sync --group test
- name: Install langchain editable
run: |
poetry run pip install langchain-experimental -e libs/core libs/langchain libs/community
VIRTUAL_ENV=.venv uv pip install langchain-experimental -e libs/core libs/langchain libs/community
- name: Check doc imports
shell: bash
run: |
poetry run python docs/scripts/check_imports.py
uv run python docs/scripts/check_imports.py
- name: Ensure the test did not create any additional files
shell: bash

View File

@@ -18,7 +18,8 @@ on:
description: "Pydantic version to test."
env:
POETRY_VERSION: "1.8.4"
UV_FROZEN: "true"
UV_NO_SYNC: "true"
jobs:
build:
@@ -31,21 +32,18 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ inputs.python-version }} + Poetry ${{ env.POETRY_VERSION }}
uses: "./.github/actions/poetry_setup"
- name: Set up Python ${{ inputs.python-version }} + uv
uses: "./.github/actions/uv_setup"
with:
python-version: ${{ inputs.python-version }}
poetry-version: ${{ env.POETRY_VERSION }}
working-directory: ${{ inputs.working-directory }}
cache-key: core
- name: Install dependencies
shell: bash
run: poetry install --with test
run: uv sync --group test
- name: Overwrite pydantic version
shell: bash
run: poetry run pip install pydantic~=${{ inputs.pydantic-version }}
run: VIRTUAL_ENV=.venv uv pip install pydantic~=${{ inputs.pydantic-version }}
- name: Run core tests
shell: bash

View File

@@ -14,8 +14,8 @@ on:
description: "Release from a non-master branch (danger!)"
env:
POETRY_VERSION: "1.8.4"
PYTHON_VERSION: "3.10"
PYTHON_VERSION: "3.11"
UV_FROZEN: "true"
jobs:
build:
@@ -29,13 +29,10 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set up Python + Poetry ${{ env.POETRY_VERSION }}
uses: "./.github/actions/poetry_setup"
- name: Set up Python + uv
uses: "./.github/actions/uv_setup"
with:
python-version: ${{ env.PYTHON_VERSION }}
poetry-version: ${{ env.POETRY_VERSION }}
working-directory: ${{ inputs.working-directory }}
cache-key: release
# We want to keep this build stage *separate* from the release stage,
# so that there's no sharing of permissions between them.
@@ -49,7 +46,7 @@ jobs:
# > from the publish job.
# https://github.com/pypa/gh-action-pypi-publish#non-goals
- name: Build project for distribution
run: poetry build
run: uv build
working-directory: ${{ inputs.working-directory }}
- name: Upload build
@@ -60,11 +57,18 @@ jobs:
- name: Check Version
id: check-version
shell: bash
shell: python
working-directory: ${{ inputs.working-directory }}
run: |
echo pkg-name="$(poetry version | cut -d ' ' -f 1)" >> $GITHUB_OUTPUT
echo version="$(poetry version --short)" >> $GITHUB_OUTPUT
import os
import tomllib
with open("pyproject.toml", "rb") as f:
data = tomllib.load(f)
pkg_name = data["project"]["name"]
version = data["project"]["version"]
with open(os.environ["GITHUB_OUTPUT"], "a") as f:
f.write(f"pkg-name={pkg_name}\n")
f.write(f"version={version}\n")
publish:
needs:

View File

@@ -5,7 +5,6 @@ on:
schedule:
- cron: '0 13 * * *'
env:
POETRY_VERSION: "1.8.4"
PYTHON_VERSION: "3.11"
jobs:
@@ -46,20 +45,18 @@ jobs:
fi
done
- name: Set up Python ${{ env.PYTHON_VERSION }} + Poetry ${{ env.POETRY_VERSION }}
uses: "./langchain/.github/actions/poetry_setup"
- name: Setup python ${{ env.PYTHON_VERSION }}
uses: actions/setup-python@v5
id: setup-python
with:
python-version: ${{ env.PYTHON_VERSION }}
poetry-version: ${{ env.POETRY_VERSION }}
cache-key: api-docs
working-directory: langchain
- name: Install initial py deps
working-directory: langchain
run: |
python -m pip install -U uv
python -m uv pip install --upgrade --no-cache-dir pip setuptools pyyaml
- name: Move libs with script
run: python langchain/.github/scripts/prep_api_docs_build.py
env:
@@ -72,7 +69,7 @@ jobs:
- name: Install dependencies
working-directory: langchain
run: |
python -m uv pip install $(ls ./libs/partners | xargs -I {} echo "./libs/partners/{}")
python -m uv pip install $(ls ./libs/partners | xargs -I {} echo "./libs/partners/{}") --overrides ./docs/vercel_overrides.txt
python -m uv pip install libs/core libs/langchain libs/text-splitters libs/community libs/experimental libs/standard-tests
python -m uv pip install -r docs/api_reference/requirements.txt

View File

@@ -18,7 +18,8 @@ concurrency:
cancel-in-progress: true
env:
POETRY_VERSION: "1.8.4"
UV_FROZEN: "true"
UV_NO_SYNC: "true"
jobs:
build:
@@ -127,24 +128,19 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.job-configs.python-version }} + Poetry ${{ env.POETRY_VERSION }}
uses: "./.github/actions/poetry_setup"
- name: Set up Python ${{ matrix.job-configs.python-version }} + uv
uses: "./.github/actions/uv_setup"
with:
python-version: ${{ matrix.job-configs.python-version }}
poetry-version: ${{ env.POETRY_VERSION }}
working-directory: ${{ matrix.job-configs.working-directory }}
cache-key: extended
- name: Install dependencies
- name: Install dependencies and run extended tests
shell: bash
run: |
echo "Running extended tests, installing dependencies with poetry..."
poetry install --with test
poetry run pip install uv
poetry run uv pip install -r extended_testing_deps.txt
- name: Run extended tests
run: make extended_tests
echo "Running extended tests, installing dependencies with uv..."
uv venv
uv sync --group test
VIRTUAL_ENV=.venv uv pip install -r extended_testing_deps.txt
VIRTUAL_ENV=.venv make extended_tests
- name: Ensure the tests did not create any additional files
shell: bash

View File

@@ -15,7 +15,7 @@ on:
- cron: '0 13 * * *'
env:
POETRY_VERSION: "1.8.4"
UV_FROZEN: "true"
jobs:
build:
@@ -25,13 +25,10 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set up Python + Poetry ${{ env.POETRY_VERSION }}
uses: "./.github/actions/poetry_setup"
- name: Set up Python + uv
uses: "./.github/actions/uv_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: 'Authenticate to Google Cloud'
id: 'auth'
@@ -48,17 +45,17 @@ jobs:
- name: Install dependencies
run: |
poetry install --with dev,test
uv sync --group dev --group test
- name: Pre-download files
run: |
poetry run python docs/scripts/cache_data.py
uv run python docs/scripts/cache_data.py
curl -s https://raw.githubusercontent.com/lerocha/chinook-database/master/ChinookDatabase/DataSources/Chinook_Sqlite.sql | sqlite3 docs/docs/how_to/Chinook.db
cp docs/docs/how_to/Chinook.db docs/docs/tutorials/Chinook.db
- name: Prepare notebooks
run: |
poetry run python docs/scripts/prepare_notebooks_for_ci.py --comment-install-cells --working-directory ${{ github.event.inputs.working-directory || 'all' }}
uv run python docs/scripts/prepare_notebooks_for_ci.py --comment-install-cells --working-directory ${{ github.event.inputs.working-directory || 'all' }}
- name: Run notebooks
env:

View File

@@ -14,7 +14,9 @@ on:
env:
POETRY_VERSION: "1.8.4"
DEFAULT_LIBS: '["libs/partners/openai", "libs/partners/anthropic", "libs/partners/fireworks", "libs/partners/groq", "libs/partners/mistralai", "libs/partners/google-vertexai", "libs/partners/google-genai", "libs/partners/aws"]'
UV_FROZEN: "true"
DEFAULT_LIBS: '["libs/partners/openai", "libs/partners/anthropic", "libs/partners/fireworks", "libs/partners/groq", "libs/partners/mistralai", "libs/partners/xai", "libs/partners/google-vertexai", "libs/partners/google-genai", "libs/partners/aws"]'
POETRY_LIBS: ("libs/partners/google-vertexai" "libs/partners/google-genai" "libs/partners/aws")
jobs:
compute-matrix:
@@ -79,7 +81,8 @@ jobs:
mv langchain-google/libs/vertexai langchain/libs/partners/google-vertexai
mv langchain-aws/libs/aws langchain/libs/partners/aws
- name: Set up Python ${{ matrix.python-version }}
- name: Set up Python ${{ matrix.python-version }} with poetry
if: contains(env.POETRY_LIBS, matrix.working-directory)
uses: "./langchain/.github/actions/poetry_setup"
with:
python-version: ${{ matrix.python-version }}
@@ -87,6 +90,12 @@ jobs:
working-directory: langchain/${{ matrix.working-directory }}
cache-key: scheduled
- name: Set up Python ${{ matrix.python-version }} + uv
if: "!contains(env.POETRY_LIBS, matrix.working-directory)"
uses: "./langchain/.github/actions/uv_setup"
with:
python-version: ${{ matrix.python-version }}
- name: 'Authenticate to Google Cloud'
id: 'auth'
uses: google-github-actions/auth@v2
@@ -100,12 +109,20 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Install dependencies
- name: Install dependencies (poetry)
if: contains(env.POETRY_LIBS, matrix.working-directory)
run: |
echo "Running scheduled tests, installing dependencies with poetry..."
cd langchain/${{ matrix.working-directory }}
poetry install --with=test_integration,test
- name: Install dependencies (uv)
if: "!contains(env.POETRY_LIBS, matrix.working-directory)"
run: |
echo "Running scheduled tests, installing dependencies with uv..."
cd langchain/${{ matrix.working-directory }}
uv sync --group test --group test_integration
- name: Run integration tests
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
@@ -117,10 +134,12 @@ jobs:
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 }}
DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
FIREWORKS_API_KEY: ${{ secrets.FIREWORKS_API_KEY }}
GROQ_API_KEY: ${{ secrets.GROQ_API_KEY }}
HUGGINGFACEHUB_API_TOKEN: ${{ secrets.HUGGINGFACEHUB_API_TOKEN }}
MISTRAL_API_KEY: ${{ secrets.MISTRAL_API_KEY }}
XAI_API_KEY: ${{ secrets.XAI_API_KEY }}
COHERE_API_KEY: ${{ secrets.COHERE_API_KEY }}
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}

View File

@@ -97,12 +97,6 @@ repos:
entry: make -C libs/partners/openai format
files: ^libs/partners/openai/
pass_filenames: false
- id: pinecone
name: format partners/pinecone
language: system
entry: make -C libs/partners/pinecone format
files: ^libs/partners/pinecone/
pass_filenames: false
- id: prompty
name: format partners/prompty
language: system

View File

@@ -1,5 +1,9 @@
.PHONY: all clean help docs_build docs_clean docs_linkcheck api_docs_build api_docs_clean api_docs_linkcheck spell_check spell_fix lint lint_package lint_tests format format_diff
.EXPORT_ALL_VARIABLES:
UV_FROZEN = true
UV_NO_SYNC = true
## help: Show this help info.
help: Makefile
@printf "\n\033[1mUsage: make <TARGETS> ...\033[0m\n\n\033[1mTargets:\033[0m\n\n"
@@ -25,20 +29,20 @@ docs_clean:
## docs_linkcheck: Run linkchecker on the documentation.
docs_linkcheck:
poetry run linkchecker _dist/docs/ --ignore-url node_modules
uv run --no-group test linkchecker _dist/docs/ --ignore-url node_modules
## api_docs_build: Build the API Reference documentation.
api_docs_build:
poetry run python docs/api_reference/create_api_rst.py
cd docs/api_reference && poetry run make html
poetry run python docs/api_reference/scripts/custom_formatter.py docs/api_reference/_build/html/
uv run --no-group test python docs/api_reference/create_api_rst.py
cd docs/api_reference && uv run --no-group test make html
uv run --no-group test python docs/api_reference/scripts/custom_formatter.py docs/api_reference/_build/html/
API_PKG ?= text-splitters
api_docs_quick_preview:
poetry run python docs/api_reference/create_api_rst.py $(API_PKG)
cd docs/api_reference && poetry run make html
poetry run python docs/api_reference/scripts/custom_formatter.py docs/api_reference/_build/html/
uv run --no-group test python docs/api_reference/create_api_rst.py $(API_PKG)
cd docs/api_reference && uv run make html
uv run --no-group test python docs/api_reference/scripts/custom_formatter.py docs/api_reference/_build/html/
open docs/api_reference/_build/html/reference.html
## api_docs_clean: Clean the API Reference documentation build artifacts.
@@ -50,15 +54,15 @@ api_docs_clean:
## api_docs_linkcheck: Run linkchecker on the API Reference documentation.
api_docs_linkcheck:
poetry run linkchecker docs/api_reference/_build/html/index.html
uv run --no-group test linkchecker docs/api_reference/_build/html/index.html
## spell_check: Run codespell on the project.
spell_check:
poetry run codespell --toml pyproject.toml
uv run --no-group test codespell --toml pyproject.toml
## spell_fix: Run codespell on the project and fix the errors.
spell_fix:
poetry run codespell --toml pyproject.toml -w
uv run --no-group test codespell --toml pyproject.toml -w
######################
# LINTING AND FORMATTING
@@ -66,9 +70,9 @@ spell_fix:
## lint: Run linting on the project.
lint lint_package lint_tests:
poetry run ruff check docs cookbook
poetry run ruff format docs cookbook cookbook --diff
poetry run ruff check --select I docs cookbook
uv run --group lint ruff check docs cookbook
uv run --group lint ruff format docs cookbook cookbook --diff
uv run --group lint ruff check --select I docs cookbook
git --no-pager grep 'from langchain import' docs cookbook | grep -vE 'from langchain import (hub)' && echo "Error: no importing langchain from root in docs, except for hub" && exit 1 || exit 0
git --no-pager grep 'api.python.langchain.com' -- docs/docs ':!docs/docs/additional_resources/arxiv_references.mdx' ':!docs/docs/integrations/document_loaders/sitemap.ipynb' || exit 0 && \
@@ -77,5 +81,8 @@ lint lint_package lint_tests:
## format: Format the project files.
format format_diff:
poetry run ruff format docs cookbook
poetry run ruff check --select I --fix docs cookbook
uv run --group lint ruff format docs cookbook
uv run --group lint ruff check --select I --fix docs cookbook
update-package-downloads:
uv run python docs/scripts/packages_yml_get_downloads.py

View File

@@ -52,7 +52,7 @@ For these applications, LangChain simplifies the entire application lifecycle:
- **Integration packages** (e.g. **`langchain-openai`**, **`langchain-anthropic`**, etc.): Important integrations have been split into lightweight packages that are co-maintained by the LangChain team and the integration developers.
- **`langchain`**: Chains, agents, and retrieval strategies that make up an application's cognitive architecture.
- **`langchain-community`**: Third-party integrations that are community maintained.
- **[LangGraph](https://langchain-ai.github.io/langgraph)**: Build robust and stateful multi-actor applications with LLMs by modeling steps as edges and nodes in a graph. Integrates smoothly with LangChain, but can be used without it. To learn more about LangGraph, check out our first LangChain Academy course, *Introduction to LangGraph*, available [here](https://academy.langchain.com/courses/intro-to-langgraph).
- **[LangGraph](https://langchain-ai.github.io/langgraph)**: LangGraph powers production-grade agents, trusted by Linkedin, Uber, Klarna, GitLab, and many more. Build robust and stateful multi-actor applications with LLMs by modeling steps as edges and nodes in a graph. Integrates smoothly with LangChain, but can be used without it. To learn more about LangGraph, check out our first LangChain Academy course, *Introduction to LangGraph*, available [here](https://academy.langchain.com/courses/intro-to-langgraph).
### Productionization:

View File

@@ -21,7 +21,6 @@ Notebook | Description
[code-analysis-deeplake.ipynb](https://github.com/langchain-ai/langchain/tree/master/cookbook/code-analysis-deeplake.ipynb) | Analyze its own code base with the help of gpt and activeloop's deep lake.
[custom_agent_with_plugin_retri...](https://github.com/langchain-ai/langchain/tree/master/cookbook/custom_agent_with_plugin_retrieval.ipynb) | Build a custom agent that can interact with ai plugins by retrieving tools and creating natural language wrappers around openapi endpoints.
[custom_agent_with_plugin_retri...](https://github.com/langchain-ai/langchain/tree/master/cookbook/custom_agent_with_plugin_retrieval_using_plugnplai.ipynb) | Build a custom agent with plugin retrieval functionality, utilizing ai plugins from the `plugnplai` directory.
[databricks_sql_db.ipynb](https://github.com/langchain-ai/langchain/tree/master/cookbook/databricks_sql_db.ipynb) | Connect to databricks runtimes and databricks sql.
[deeplake_semantic_search_over_...](https://github.com/langchain-ai/langchain/tree/master/cookbook/deeplake_semantic_search_over_chat.ipynb) | Perform semantic search and question-answering over a group chat using activeloop's deep lake with gpt4.
[elasticsearch_db_qa.ipynb](https://github.com/langchain-ai/langchain/tree/master/cookbook/elasticsearch_db_qa.ipynb) | Interact with elasticsearch analytics databases in natural language and build search queries via the elasticsearch dsl API.
[extraction_openai_tools.ipynb](https://github.com/langchain-ai/langchain/tree/master/cookbook/extraction_openai_tools.ipynb) | Structured Data Extraction with OpenAI Tools

View File

@@ -31,8 +31,8 @@
"source": [
"# Optional\n",
"import os\n",
"# os.environ['LANGCHAIN_TRACING_V2'] = 'true' # enables tracing\n",
"# os.environ['LANGCHAIN_API_KEY'] = <your-api-key>"
"# os.environ['LANGSMITH_TRACING'] = 'true' # enables tracing\n",
"# os.environ['LANGSMITH_API_KEY'] = <your-api-key>"
]
},
{

View File

@@ -66,7 +66,7 @@
},
"outputs": [],
"source": [
"#!python3 -m pip install --upgrade langchain deeplake openai"
"#!python3 -m pip install --upgrade langchain langchain-deeplake openai"
]
},
{
@@ -666,89 +666,26 @@
},
{
"cell_type": "code",
"execution_count": 15,
"execution_count": null,
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Your Deep Lake dataset has been successfully created!\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
" \r"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Dataset(path='hub://adilkhan/langchain-code', tensors=['embedding', 'id', 'metadata', 'text'])\n",
"\n",
" tensor htype shape dtype compression\n",
" ------- ------- ------- ------- ------- \n",
" embedding embedding (8244, 1536) float32 None \n",
" id text (8244, 1) str None \n",
" metadata json (8244, 1) str None \n",
" text text (8244, 1) str None \n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": []
},
{
"data": {
"text/plain": [
"<langchain_community.vectorstores.deeplake.DeepLake at 0x7fe1b67d7a30>"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"outputs": [],
"source": [
"from langchain_community.vectorstores import DeepLake\n",
"from langchain_deeplake.vectorstores import DeeplakeVectorStore\n",
"\n",
"username = \"<USERNAME_OR_ORG>\"\n",
"\n",
"\n",
"db = DeepLake.from_documents(\n",
" texts, embeddings, dataset_path=f\"hub://{username}/langchain-code\", overwrite=True\n",
"db = DeeplakeVectorStore.from_documents(\n",
" documents=texts,\n",
" embedding=embeddings,\n",
" dataset_path=f\"hub://{username}/langchain-code\",\n",
" overwrite=True,\n",
")\n",
"db"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"`Optional`: You can also use Deep Lake's Managed Tensor Database as a hosting service and run queries there. In order to do so, it is necessary to specify the runtime parameter as {'tensor_db': True} during the creation of the vector store. This configuration enables the execution of queries on the Managed Tensor Database, rather than on the client side. It should be noted that this functionality is not applicable to datasets stored locally or in-memory. In the event that a vector store has already been created outside of the Managed Tensor Database, it is possible to transfer it to the Managed Tensor Database by following the prescribed steps."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"# from langchain_community.vectorstores import DeepLake\n",
"\n",
"# db = DeepLake.from_documents(\n",
"# texts, embeddings, dataset_path=f\"hub://{<org_id>}/langchain-code\", runtime={\"tensor_db\": True}\n",
"# )\n",
"# db"
]
},
{
"attachments": {},
"cell_type": "markdown",
@@ -760,24 +697,16 @@
},
{
"cell_type": "code",
"execution_count": 17,
"execution_count": null,
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Deep Lake Dataset in hub://adilkhan/langchain-code already exists, loading from the storage\n"
]
}
],
"outputs": [],
"source": [
"db = DeepLake(\n",
"db = DeeplakeVectorStore(\n",
" dataset_path=f\"hub://{username}/langchain-code\",\n",
" read_only=True,\n",
" embedding=embeddings,\n",
" embedding_function=embeddings,\n",
")"
]
},
@@ -796,36 +725,6 @@
"retriever.search_kwargs[\"k\"] = 20"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"You can also specify user defined functions using [Deep Lake filters](https://docs.deeplake.ai/en/latest/deeplake.core.dataset.html#deeplake.core.dataset.Dataset.filter)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"def filter(x):\n",
" # filter based on source code\n",
" if \"something\" in x[\"text\"].data()[\"value\"]:\n",
" return False\n",
"\n",
" # filter based on path e.g. extension\n",
" metadata = x[\"metadata\"].data()[\"value\"]\n",
" return \"only_this\" in metadata[\"source\"] or \"also_that\" in metadata[\"source\"]\n",
"\n",
"\n",
"### turn on below for custom filtering\n",
"# retriever.search_kwargs['filter'] = filter"
]
},
{
"cell_type": "code",
"execution_count": 20,
@@ -837,10 +736,8 @@
"from langchain.chains import ConversationalRetrievalChain\n",
"from langchain_openai import ChatOpenAI\n",
"\n",
"model = ChatOpenAI(\n",
" model_name=\"gpt-3.5-turbo-0613\"\n",
") # 'ada' 'gpt-3.5-turbo-0613' 'gpt-4',\n",
"qa = ConversationalRetrievalChain.from_llm(model, retriever=retriever)"
"model = ChatOpenAI(model=\"gpt-3.5-turbo-0613\") # 'ada' 'gpt-3.5-turbo-0613' 'gpt-4',\n",
"qa = RetrievalQA.from_llm(model, retriever=retriever)"
]
},
{

View File

@@ -1,273 +0,0 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "707d13a7",
"metadata": {},
"source": [
"# Databricks\n",
"\n",
"This notebook covers how to connect to the [Databricks runtimes](https://docs.databricks.com/runtime/index.html) and [Databricks SQL](https://www.databricks.com/product/databricks-sql) using the SQLDatabase wrapper of LangChain.\n",
"It is broken into 3 parts: installation and setup, connecting to Databricks, and examples."
]
},
{
"cell_type": "markdown",
"id": "0076d072",
"metadata": {},
"source": [
"## Installation and Setup"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "739b489b",
"metadata": {},
"outputs": [],
"source": [
"!pip install databricks-sql-connector"
]
},
{
"cell_type": "markdown",
"id": "73113163",
"metadata": {},
"source": [
"## Connecting to Databricks\n",
"\n",
"You can connect to [Databricks runtimes](https://docs.databricks.com/runtime/index.html) and [Databricks SQL](https://www.databricks.com/product/databricks-sql) using the `SQLDatabase.from_databricks()` method.\n",
"\n",
"### Syntax\n",
"```python\n",
"SQLDatabase.from_databricks(\n",
" catalog: str,\n",
" schema: str,\n",
" host: Optional[str] = None,\n",
" api_token: Optional[str] = None,\n",
" warehouse_id: Optional[str] = None,\n",
" cluster_id: Optional[str] = None,\n",
" engine_args: Optional[dict] = None,\n",
" **kwargs: Any)\n",
"```\n",
"### Required Parameters\n",
"* `catalog`: The catalog name in the Databricks database.\n",
"* `schema`: The schema name in the catalog.\n",
"\n",
"### Optional Parameters\n",
"There following parameters are optional. When executing the method in a Databricks notebook, you don't need to provide them in most of the cases.\n",
"* `host`: The Databricks workspace hostname, excluding 'https://' part. Defaults to 'DATABRICKS_HOST' environment variable or current workspace if in a Databricks notebook.\n",
"* `api_token`: The Databricks personal access token for accessing the Databricks SQL warehouse or the cluster. Defaults to 'DATABRICKS_TOKEN' environment variable or a temporary one is generated if in a Databricks notebook.\n",
"* `warehouse_id`: The warehouse ID in the Databricks SQL.\n",
"* `cluster_id`: The cluster ID in the Databricks Runtime. If running in a Databricks notebook and both 'warehouse_id' and 'cluster_id' are None, it uses the ID of the cluster the notebook is attached to.\n",
"* `engine_args`: The arguments to be used when connecting Databricks.\n",
"* `**kwargs`: Additional keyword arguments for the `SQLDatabase.from_uri` method."
]
},
{
"cell_type": "markdown",
"id": "b11c7e48",
"metadata": {},
"source": [
"## Examples"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "8102bca0",
"metadata": {},
"outputs": [],
"source": [
"# Connecting to Databricks with SQLDatabase wrapper\n",
"from langchain_community.utilities import SQLDatabase\n",
"\n",
"db = SQLDatabase.from_databricks(catalog=\"samples\", schema=\"nyctaxi\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "9dd36f58",
"metadata": {},
"outputs": [],
"source": [
"# Creating a OpenAI Chat LLM wrapper\n",
"from langchain_openai import ChatOpenAI\n",
"\n",
"llm = ChatOpenAI(temperature=0, model_name=\"gpt-4\")"
]
},
{
"cell_type": "markdown",
"id": "5b5c5f1a",
"metadata": {},
"source": [
"### SQL Chain example\n",
"\n",
"This example demonstrates the use of the [SQL Chain](https://python.langchain.com/en/latest/modules/chains/examples/sqlite.html) for answering a question over a Databricks database."
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "36f2270b",
"metadata": {},
"outputs": [],
"source": [
"from langchain_community.utilities import SQLDatabaseChain\n",
"\n",
"db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "4e2b5f25",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"\n",
"\u001b[1m> Entering new SQLDatabaseChain chain...\u001b[0m\n",
"What is the average duration of taxi rides that start between midnight and 6am?\n",
"SQLQuery:\u001b[32;1m\u001b[1;3mSELECT AVG(UNIX_TIMESTAMP(tpep_dropoff_datetime) - UNIX_TIMESTAMP(tpep_pickup_datetime)) as avg_duration\n",
"FROM trips\n",
"WHERE HOUR(tpep_pickup_datetime) >= 0 AND HOUR(tpep_pickup_datetime) < 6\u001b[0m\n",
"SQLResult: \u001b[33;1m\u001b[1;3m[(987.8122786304605,)]\u001b[0m\n",
"Answer:\u001b[32;1m\u001b[1;3mThe average duration of taxi rides that start between midnight and 6am is 987.81 seconds.\u001b[0m\n",
"\u001b[1m> Finished chain.\u001b[0m\n"
]
},
{
"data": {
"text/plain": [
"'The average duration of taxi rides that start between midnight and 6am is 987.81 seconds.'"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"db_chain.run(\n",
" \"What is the average duration of taxi rides that start between midnight and 6am?\"\n",
")"
]
},
{
"cell_type": "markdown",
"id": "e496d5e5",
"metadata": {},
"source": [
"### SQL Database Agent example\n",
"\n",
"This example demonstrates the use of the [SQL Database Agent](/docs/integrations/tools/sql_database) for answering questions over a Databricks database."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "9918e86a",
"metadata": {},
"outputs": [],
"source": [
"from langchain.agents import create_sql_agent\n",
"from langchain_community.agent_toolkits import SQLDatabaseToolkit\n",
"\n",
"toolkit = SQLDatabaseToolkit(db=db, llm=llm)\n",
"agent = create_sql_agent(llm=llm, toolkit=toolkit, verbose=True)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "c484a76e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"\n",
"\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
"\u001b[32;1m\u001b[1;3mAction: list_tables_sql_db\n",
"Action Input: \u001b[0m\n",
"Observation: \u001b[38;5;200m\u001b[1;3mtrips\u001b[0m\n",
"Thought:\u001b[32;1m\u001b[1;3mI should check the schema of the trips table to see if it has the necessary columns for trip distance and duration.\n",
"Action: schema_sql_db\n",
"Action Input: trips\u001b[0m\n",
"Observation: \u001b[33;1m\u001b[1;3m\n",
"CREATE TABLE trips (\n",
"\ttpep_pickup_datetime TIMESTAMP, \n",
"\ttpep_dropoff_datetime TIMESTAMP, \n",
"\ttrip_distance FLOAT, \n",
"\tfare_amount FLOAT, \n",
"\tpickup_zip INT, \n",
"\tdropoff_zip INT\n",
") USING DELTA\n",
"\n",
"/*\n",
"3 rows from trips table:\n",
"tpep_pickup_datetime\ttpep_dropoff_datetime\ttrip_distance\tfare_amount\tpickup_zip\tdropoff_zip\n",
"2016-02-14 16:52:13+00:00\t2016-02-14 17:16:04+00:00\t4.94\t19.0\t10282\t10171\n",
"2016-02-04 18:44:19+00:00\t2016-02-04 18:46:00+00:00\t0.28\t3.5\t10110\t10110\n",
"2016-02-17 17:13:57+00:00\t2016-02-17 17:17:55+00:00\t0.7\t5.0\t10103\t10023\n",
"*/\u001b[0m\n",
"Thought:\u001b[32;1m\u001b[1;3mThe trips table has the necessary columns for trip distance and duration. I will write a query to find the longest trip distance and its duration.\n",
"Action: query_checker_sql_db\n",
"Action Input: SELECT trip_distance, tpep_dropoff_datetime - tpep_pickup_datetime as duration FROM trips ORDER BY trip_distance DESC LIMIT 1\u001b[0m\n",
"Observation: \u001b[31;1m\u001b[1;3mSELECT trip_distance, tpep_dropoff_datetime - tpep_pickup_datetime as duration FROM trips ORDER BY trip_distance DESC LIMIT 1\u001b[0m\n",
"Thought:\u001b[32;1m\u001b[1;3mThe query is correct. I will now execute it to find the longest trip distance and its duration.\n",
"Action: query_sql_db\n",
"Action Input: SELECT trip_distance, tpep_dropoff_datetime - tpep_pickup_datetime as duration FROM trips ORDER BY trip_distance DESC LIMIT 1\u001b[0m\n",
"Observation: \u001b[36;1m\u001b[1;3m[(30.6, '0 00:43:31.000000000')]\u001b[0m\n",
"Thought:\u001b[32;1m\u001b[1;3mI now know the final answer.\n",
"Final Answer: The longest trip distance is 30.6 miles and it took 43 minutes and 31 seconds.\u001b[0m\n",
"\n",
"\u001b[1m> Finished chain.\u001b[0m\n"
]
},
{
"data": {
"text/plain": [
"'The longest trip distance is 30.6 miles and it took 43 minutes and 31 seconds.'"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"agent.run(\"What is the longest trip distance and how long did it take?\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

View File

@@ -86,15 +86,15 @@
"\n",
"Environment Variables:\n",
"- USER_AGENT: Specifies the user agent string to be used.\n",
"- LANGCHAIN_TRACING_V2: Enables or disables tracing for LangChain.\n",
"- LANGCHAIN_API_KEY: API key for accessing LangChain services.\n",
"- LANGSMITH_TRACING: Enables or disables tracing for LangChain.\n",
"- LANGSMITH_API_KEY: API key for accessing LangChain services.\n",
"- TAVILY_API_KEY: API key for accessing Tavily services.\n",
"\"\"\"\n",
"import os\n",
"\n",
"os.environ[\"USER_AGENT\"] = \"myagent\"\n",
"os.environ[\"LANGCHAIN_TRACING_V2\"] = \"true\"\n",
"os.environ[\"LANGCHAIN_API_KEY\"] = \"xxxx\"\n",
"os.environ[\"LANGSMITH_TRACING\"] = \"true\"\n",
"os.environ[\"LANGSMITH_API_KEY\"] = \"xxxx\"\n",
"os.environ[\"TAVILY_API_KEY\"] = \"tvly-xxxx\""
]
},

View File

@@ -124,8 +124,8 @@
"# Optional-- If you want to enable Langsmith -- good for debugging\n",
"import os\n",
"\n",
"os.environ[\"LANGCHAIN_TRACING_V2\"] = \"true\"\n",
"os.environ[\"LANGCHAIN_API_KEY\"] = getpass.getpass()"
"os.environ[\"LANGSMITH_TRACING\"] = \"true\"\n",
"os.environ[\"LANGSMITH_API_KEY\"] = getpass.getpass()"
]
},
{
@@ -156,7 +156,7 @@
"metadata": {},
"outputs": [],
"source": [
"# Ensure you have an HF_TOKEN in your development enviornment:\n",
"# Ensure you have an HF_TOKEN in your development environment:\n",
"# access tokens can be created or copied from the Hugging Face platform (https://huggingface.co/docs/hub/en/security-tokens)\n",
"\n",
"# Load MongoDB's embedded_movies dataset from Hugging Face\n",

View File

@@ -71,9 +71,9 @@
"# Optional: LangSmith API keys\n",
"import os\n",
"\n",
"os.environ[\"LANGCHAIN_TRACING_V2\"] = \"true\"\n",
"os.environ[\"LANGCHAIN_ENDPOINT\"] = \"https://api.smith.langchain.com\"\n",
"os.environ[\"LANGCHAIN_API_KEY\"] = \"api_key\""
"os.environ[\"LANGSMITH_TRACING\"] = \"true\"\n",
"os.environ[\"LANGSMITH_ENDPOINT\"] = \"https://api.smith.langchain.com\"\n",
"os.environ[\"LANGSMITH_API_KEY\"] = \"api_key\""
]
},
{

View File

@@ -29,7 +29,7 @@
"source": [
"import os\n",
"\n",
"os.environ[\"LANGCHAIN_PROJECT\"] = \"movie-qa\""
"os.environ[\"LANGSMITH_PROJECT\"] = \"movie-qa\""
]
},
{

View File

@@ -144,8 +144,8 @@
"outputs": [],
"source": [
"# import os\n",
"# os.environ[\"LANGCHAIN_HANDLER\"] = \"langchain\"\n",
"# os.environ[\"LANGCHAIN_SESSION\"] = \"default\" # Make sure this session actually exists."
"# os.environ[\"LANGSMITH_TRACING\"] = \"true\"\n",
"# os.environ[\"LANGSMITH_PROJECT\"] = \"default\" # Make sure this session actually exists."
]
},
{

View File

@@ -27,7 +27,7 @@ install-py-deps:
$(PYTHON) -m pip install -q --upgrade pip
$(PYTHON) -m pip install -q --upgrade uv
$(PYTHON) -m uv pip install -q --pre -r vercel_requirements.txt
$(PYTHON) -m uv pip install -q --pre $$($(PYTHON) scripts/partner_deps_list.py)
$(PYTHON) -m uv pip install -q --pre $$($(PYTHON) scripts/partner_deps_list.py) --overrides vercel_overrides.txt
generate-files:
mkdir -p $(INTERMEDIATE_DIR)

View File

@@ -528,7 +528,12 @@ def _get_package_version(package_dir: Path) -> str:
"Aborting the build."
)
exit(1)
return pyproject["tool"]["poetry"]["version"]
try:
# uses uv
return pyproject["project"]["version"]
except KeyError:
# uses poetry
return pyproject["tool"]["poetry"]["version"]
def _out_file_path(package_name: str) -> Path:

View File

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

View File

@@ -1 +1 @@
eNrtl81u40YSgDfY2wC55swQOQVqiRRpiZIhLPw7/hlbzkhZ2xkMhFazJfaIZHPYTVmS4UMmAXIMGOQFkvFYC8OZJJhBkt1k9pxDXsA57LNskaJsGTYQIMdAPlju6urqqq+qq6xn4z4NBeP+WxfMlzTERMJCxM/GIX0aUSE/PfOodLh9uldvNJ9HIbt835EyENVCAQcszwPqY5Yn3Cv09QJxsCzA34FLUzOnbW4PL58fqx4VAnepUKvKo2OVcLjKl7BQHeq6XM0pashdmggiQUP15DFIPG5TNxF1A4lMjjzms0TTB5kOn0KGFHuwkGFEr9YtHqRXg/xYZT5xI5u2ouTyTPMEVCX1AohVRmEi1fLlk7FDsQ0kPj91uJDxy5uxfYsJoeAF9Qm3md+Nv+mOWJBTbNpxsaTnEJBPU3LxeY/SAGGX9enZ5FT8HQ4ClxGc7BeeCO5fZACQHAb09vZ5wgCBx76MX9fBiaXNwt4QkuAret608tp3AyQkZr4LVJGLwZ+zIN3/eXYjwKQHRlCW4PhscvjlrA4X8YsdTOqNGyZxSJz4BQ69kvlqVh5GvmQejccre7evyzavrzPyup4vf3/DsBj6JH7Rwa6gP944TGU4RISDjfgr7eWUj0v9rnTi53rJ+FdIRQB5pZ+cwTEZiWenkAv626/jrLa+rm9Pk/i/v71zugp5id80nSin6GWlTqRS1IqmoptVrVjVTeX+TvNiJbummaThUpF0IAu0n0gmtbSoQEGHgspaJDvI+r4ZYl90IDdr0zoYEyfye9Q+X7mzAt4kFQDhJfFAgSM6CLigKHMzvjhADyevDG2uvpqUG+JhF/tslJZD/CYthaPR4MgmkW07/SNPq4xMg7VpRDqvsyNByJNrwCHkifi5Wam8zHamyTiH4DWka0jT/zNAUPnUZR4DwOnv7KmL+HRB07SfbitI3qPQFMamlv78d1YjpB5kMbn72gx4UPnlbqWpKQNUKtZNbyDFdNYbveiJn24rZCa+1sTFYKqNmB1fvgeLlt3RcBvTom2W2tSwDL2jacUyEC9jUiSV0r8ht4yAlSSZAQ8h2ZRAX5PD+DLn4UHy8GqGvmCUINJFJWshjai9ypMYxKIShNTl2P52ZR2tYOJQ1EgLMh6vHu4u7WyunDfAyRXOe4x+8ftbf2+1SKfV9mrr68u64Xp6r9zYP1yyPK1ot/SV1fvBk92DgRiNemzBfqC18y2+g/RysaKXjbJhIj2v5fW8jnpr251Bb7Np7+cPxOH9dbarG/fNduufO1a5EZWb0eijzS1PyoVl1nT3TWuz3N/pLjWWnx5tt6xeXawdtjcc2VjobLkiLLYPsHZUefgBRIOlUyssKlCbDPjWsieD4MmgyYMxpg9mUbFTBrX8zfa4qGzASKj77nBRaSQwKXxijzaYpLVd7tPLL4FB1Gd2rbnfWO7tuyP+cOmB4If9p/2P5ILzdK13ZNUfkG5U0ZsaZ4eya23OQDCMMtIyDiXNtNIqvHb9T3r1wwGa7QCoPpkc8djnwmedzlmDhvCA4nPi8siGTh/SM8j5w6XD+LVlm5ptGG3bxtjqkDJarjfG2IVi6pP4lWPU1KppGuqi4uGaVYJ3k47Cj8+S4vO7v7/9mY0lTkeUrVbVZG4SmJpoaevBjtjaXl1iI7L34bY1/LDUOFrfO9zf2rBh+Km8/QS6THYifz1p82kfAgUCfUtSsHkNLzedpLODFCXdEGllpFtwSgwFjMRWB1yjYQAeJld0ghYttm26YNASTUw7nJFkhD9KBqtNB2pVy6lgWWK1epwNcBVDH4IGDRZy13NehUVIOzCGwQ0/ct2TnOryLvSttpgIcipczoTTAv9hBGZaj3NqNrrT5b17fzlq14g20v+E5mBugXl3DuU2FGWDH8253MGFYH/O5Q4um3Mqd1CZTKs5mjvQDHk053IHF8ltPJyTuU3mH3MoGZQ/5qAKyQP1r0XiOphjFWL3AtmafFNXq1byXWDq1ZW0klMll9i9Eujl3M2TLZtKzFyRFlryVdu+0tVO7rA5qz9BDb7PHDm5Qvxotb679vjevf8DlwNB/w==
eNrtWE1v28gZ7qK3XHopemaJngqPREqkvgyhcPxRK15bie1d21kshNHwlTgWyWE4Q1ly6kPT3gsW/QPdOFZhuNldJGi3H+m5h/4B76G/ZV9SVGQjabfudaWDpJl55/143o9H4rPJECLJRfDBFQ8URJQpXMjk2SSCJzFI9esLH5QrnPOH7b3953HEr3/qKhXKRrFIQ14QIQSUF5jwi0OzyFyqivg99CBTc94Vzvj6F091H6SkfZB645OnOhNoKVB6Q3fB84S+pEfCA1zGEiL97NMl3RcOeLjRDxWxBPF5wFFKqgiorzdUFMNs1RFhZklvPNV5wLzYgU6cmpqKnZ1NXKAOhvibc1dIlby87fTnlDFAIxAw4fCgn/yxf8rDJc2BnkcVXKKrAWSQJJcDgJBQjw/hYnor+YKGoccZTc+Lx1IEV3loRI1DePf4Mg2QoHOBSl630YmVVvHhGNENNLNQMQvmFyMiFeWBh3ARj6I/F2F2/rebByFlA1RC8swlF9PLL2/KCJm82KasvXdLJY2Ym7ygkV+xXt3cj+JAcR+SyerDd83lh3Nz5YJZKtS+vKVYjgOWvOhRT8Kfb10GFY0JE6gj+b3xcoaPB0Ffuclzs2T9IQIZYgbhVxd4TcXy2TnmAv71z0leNJ+1t2ZJ/Pf3fnS+hnlJ3hyAs6QZtrYBXa1klGx8a9iVhmVrP9/ev1rNzeynabjWFIxUEYbpzrRqljWs1EiCasaqR2pf7kc0kD3MzfqsDibMjYMBOJer762AN2kFYHhpPFi8BEahkEByN5OrQ7I7bR/SWns1LTcioj4N+GlWDsmbrBROTkcnDosdxx2e+Eb91CrzLsSs9zq/EkYiNYMOEV8mz+1q+WV+MkvGJQZvENMghvnXEYkQG4/7HAHO3vMelsm5bRjGV+8KKDEA7PaJZWSvf9yUiMDHLKa252qser3+9/cLzVSVUaReu+0NphhuemOWfPnVuwK5is8MeTWaSRPuJNc/wUXHtAxq04ptOYzZdoXWzVIVKk433aOWWf0L5pYz1JImMxQRJhsYDiw1Tq6XfDpKG69ZNu1yBSNd1vJpsRd310Qag1zWwgg8QZ3PWY8wylwg04JMJmtHOyvbrdXLPXRyVYgBh99+/cH3Ox3W63T95tg7Nh/vr9aGh9tb1VYlsg7g8IBXH7daEW0/CTo9KQ6j+DAsWTViVsu1aq1uGDYxC0YB25asb3jllrUuN3ds2zg83tjqR+2W1SntPNo16pR93Pef+Gb7gdUblT92gw9XhOeuq634uBR2tz8c9Xfu70QPT7YPWuIgvL9a2ToqlQc7gxWMhiq3WVzWsDY54tvMW4Zgy5C0YcxGadYwy5qTYdAs3B6Py9omzvp24I2Xtb0UTMBP6sMeV9DcEQFc/w4xiIfcae625aZ5uq5Uf3DkrT8Odumj4/ajcIMWjh7cH4mT4cA+egAndSoe3QDBqJeIkeNQMaxaVoVz1/9Pr/50SG5OANKeckQyCYQMeK93sQcRNlByyTwROzjpI7hY3SC7K0fJ67rh2KxnMEZL3bJR6ZL77b0J9bCYhix55ZabesOyyvqy5tNmrYJ9k3HcLy/S4gv6X//ghw5VtKEhGzlIYCkhMqRDsjLqH8vtbfYRs4fjTfBjZ9R2ux/Fh+Ph4xi5TXSPccrkNwpzCi1kcwgFGM4tBajzLXjWe3mS4ECwiFElZi2lTAyUM+gojsza0JHWaOyp9GAsFfidHvoMUYiup7Z7YadaAqdKu7bFUpuuwMtT0uaBAyO9YSyhEk/RlG9z1qY4oLBRglTtnNpTVoceUjH6F8Sed7ake6KPA60rpxtLOhrn0u1gYMiNuRSSf07f2fLeve8OnHPsNrOfRQvE/nfEfrxA6w5oaZviZAHYXQBjNFgAdhfAWgu47gLXlEMXmN0Fs7GIF4DdBTAlHDpeQHYHyH62QOvb0Pp2gHSpRKh/RyCaR/lUR1D8UHWmTzX0Ri39ezRz9+2uiVgqoag330HBW1c7DijKvewZZ/Zcwnkri5dp7HAx3zh7j5WbCqZZwWj+iw7cyB5woqEwAoezWx4b6T+7NAn/4fjs7G1yP1lr76x/eu/eN5t/1lQ=

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

File diff suppressed because one or more lines are too long

View File

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

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

View File

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

File diff suppressed because one or more lines are too long

View File

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

View File

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

View File

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

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