Skip to main content

langchain-glean

PyPI version

Connect Glean – The Work AI platform connected to all your data – with LangChain.

Overview

The package provides:

  • Chat models – ChatGlean wraps the /v1/chat assistant API and ChatGleanAgent targets specific agents
  • Retrievers – typed helpers for Glean search and the people directory
  • Tools – drop-in utilities for LangChain agents

Each implementation supports three input styles so you can start simple and scale up only when required:

  1. Plain strings (retrievers only) – pass the search query text
  2. Simple objects – pass a small Pydantic model (e.g. ChatBasicRequest, SearchBasicRequest, PeopleProfileBasicRequest)
  3. Full Glean request classes – hand-craft a glean.models.SearchRequest, glean.models.ChatRequest, or glean.models.ListEntitiesRequest

Installation

pip install -U langchain-glean

Environment variables

export GLEAN_API_TOKEN="<your-token>"              # user or global token
export GLEAN_SERVER_URL="https://your-company-be.glean.com" # full backend URL (preferred)
# Deprecated: GLEAN_INSTANCE is still supported as a fallback
# export GLEAN_INSTANCE="acme"
export GLEAN_ACT_AS="user@acme.com"                # only for global tokens

Quick Start

Chat with Glean Assistant

from langchain_core.messages import HumanMessage
from langchain_glean.chat_models import ChatGlean

chat = ChatGlean()
response = chat.invoke([HumanMessage(content="When is the next company holiday?")])
print(response.content)

Need streaming? Replace invoke with stream or astream.

Chat Models

ChatGlean

Connect to the Glean Assistant API with LangChain's chat interface.

Basic usage with message list

from langchain_glean.chat_models import ChatGlean
from langchain_core.messages import HumanMessage

chat = ChatGlean()
response = chat.invoke([HumanMessage(content="Hello")])

Using the simplified request object

from langchain_glean.chat_models import ChatGlean, ChatBasicRequest

chat = ChatGlean()
response = chat.invoke(ChatBasicRequest(
    message="Hello", 
    context=["Previous conversation context"]
))

Using the full Glean SDK request

from glean.api_client import models
from langchain_glean.chat_models import ChatGlean

chat = ChatGlean()
req = models.ChatRequest(
    messages=[
        models.ChatMessage(
            author="USER", 
            message_type="CONTENT", 
            fragments=[models.ChatMessageFragment(text="Hello")]
        )
    ]
)
response = chat.invoke(req)

ChatGleanAgent

Connect directly to an individual Glean agent.

from langchain_core.messages import HumanMessage
from langchain_glean.chat_models import ChatGleanAgent

agent_chat = ChatGleanAgent(agent_id="abc123")
response = agent_chat.invoke([HumanMessage(content="What are our Q4 sales targets?")])
print(response.content)

You can provide additional input fields for the agent:

response = agent_chat.invoke(
    [HumanMessage(content="What are our sales targets?")],
    fields={"department": "Marketing", "quarter": "Q4"}
)

Retrievers

GleanSearchRetriever

Search Glean's unified index and get results as LangChain documents.

Simple string query

from langchain_glean.retrievers import GleanSearchRetriever

retriever = GleanSearchRetriever()
results = retriever.invoke("quarterly report")

Using the simplified request object

from langchain_glean.retrievers import GleanSearchRetriever, SearchBasicRequest

retriever = GleanSearchRetriever()
results = retriever.invoke(SearchBasicRequest(
    query="quarterly report", 
    data_sources=["confluence", "drive"]
))

Using the full Glean SDK request

from glean.api_client import models
from langchain_glean.retrievers import GleanSearchRetriever

retriever = GleanSearchRetriever()
req = models.SearchRequest(
    query="quarterly report", 
    page_size=5,
    facet_filters=[models.FacetFilter(name="datasource", values=["confluence"])]
)
results = retriever.invoke(req)

GleanPeopleProfileRetriever

Search Glean's people directory and get results as LangChain documents.

Simple string query

from langchain_glean.retrievers import GleanPeopleProfileRetriever

people = GleanPeopleProfileRetriever()
results = people.invoke("jane doe")

Using the simplified request object

from langchain_glean.retrievers import GleanPeopleProfileRetriever, PeopleProfileBasicRequest

people = GleanPeopleProfileRetriever()
results = people.invoke(PeopleProfileBasicRequest(
    query="staff engineer", 
    page_size=3
))

Using the full Glean SDK request

from glean.api_client import models
from langchain_glean.retrievers import GleanPeopleProfileRetriever

people = GleanPeopleProfileRetriever()
req = models.ListEntitiesRequest(
    entity_type="PEOPLE", 
    query="staff engineer", 
    page_size=3
)
results = people.invoke(req)

Tools for LangChain Agents

Available Tools

Tool name Purpose Arguments
GleanSearchTool Search content Query string or SearchBasicRequest
GleanPeopleProfileSearchTool Find people Query string or PeopleProfileBasicRequest
GleanChatTool Converse with Glean Assistant Message string or ChatBasicRequest
GleanListAgentsTool List available agents None
GleanGetAgentSchemaTool Get agent input schema agent_id (str)
GleanRunAgentTool Run a specific agent agent_id (str), fields (dict)

Basic Search Tool Example

from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_core.prompts import ChatPromptTemplate

from langchain_glean.retrievers import GleanSearchRetriever
from langchain_glean.tools import GleanSearchTool

# Create the tool
retriever = GleanSearchRetriever()
search_tool = GleanSearchTool(retriever=retriever)

# Set up the agent
llm = ChatOpenAI(model="gpt-3.5-turbo")
prompt = ChatPromptTemplate.from_messages([
    ("system", "You can search our knowledge base when needed."),
    ("user", "{input}"),
])

agent = create_openai_tools_agent(llm, [search_tool], prompt)
executor = AgentExecutor(agent=agent, tools=[search_tool])

# Run the agent
result = executor.invoke({"input": "Find the latest QBR deck"})
print(result["output"])

Using Glean Agent Tools

from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_core.prompts import ChatPromptTemplate
from langchain_glean.tools import GleanListAgentsTool, GleanGetAgentSchemaTool, GleanRunAgentTool

# Create tools
list_agents_tool = GleanListAgentsTool()
get_schema_tool = GleanGetAgentSchemaTool()
run_agent_tool = GleanRunAgentTool()

# Set up the agent
llm = ChatOpenAI(model="gpt-4")
prompt = ChatPromptTemplate.from_messages([
    ("system", "You can find and run Glean agents to answer questions."),
    ("user", "{input}"),
])

agent = create_openai_tools_agent(llm, [list_agents_tool, get_schema_tool, run_agent_tool], prompt)
executor = AgentExecutor(agent=agent, tools=[list_agents_tool, get_schema_tool, run_agent_tool])

# Run the agent
result = executor.invoke({
    "input": "Find an agent that can help with sales data and run it to get Q4 forecast"
})
print(result["output"])

Advanced Usage

Full Request Objects

Pass any SDK request class (SearchRequest, ChatRequest, ListEntitiesRequest) directly for complete API control.

Async Support

Every retriever and tool exposes ainvoke and async streams:

# Async search
documents = await retriever.ainvoke("monthly revenue")

# Async streaming chat
async for chunk in chat.astream([HumanMessage(content="Hello")]):
    print(chunk.content, end="", flush=True)

Custom Agent Config

Override model behavior per call:

chat.invoke(
    ChatBasicRequest(message="Summarise last quarter"),
    agent_config={"agent": "GPT", "mode": "SEARCH"},
    timeout_millis=30_000,
)

Resume a Chat

Either pass chat_id per call or set it as a property:

chat = ChatGlean()
chat.chat_id = "abc123"
chat.invoke([HumanMessage(content="Continue...")])

Contributing

  1. mise install && mise run setup
  2. mise run lint && mise run test
  3. Open a PR!

Links

Metadata

Release files for langchain-glean 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for langchain-glean 0.4.0
File Size Uploaded
langchain_glean-0.4.0.tar.gz 130.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for langchain-glean 0.4.0
File Interpreter ABI Platform
langchain_glean-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 156.9 kB

Release files / langchain_glean-0.4.0.tar.gz

Download URL langchain_glean-0.4.0.tar.gz
Size 130.1 kB
Tags Source
SHA-256 checksum
How to use checksums
ef1b957d861f6960e102b86720b3dcf558bb18ff90f833be8de380dc16337854
BLAKE2b-256 checksum
How to use checksums
6cbb6ad25df3c2b66090f02f69126433142dcf7955f56139f1558e3620d2685b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 5, 2026.

Transparency log

Release files / langchain_glean-0.4.0-py3-none-any.whl

Download URL langchain_glean-0.4.0-py3-none-any.whl
Size 26.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0d7f342e3fbaabb4cc5c7d44f82e87278a3dc36fcbab532dfef8318299f082fe
BLAKE2b-256 checksum
How to use checksums
37a67302e134f292c7c677e493ec231d40950e26a6e40043df3da2fc784e5d57
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 5, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.4.0 This release

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page