Skip to main content

Documentation Index

Fetch the complete documentation index at: https://langchat.neurobrains.co/llms.txt

Use this file to discover all available pages before exploring further.

Custom prompt templates

The fastest way to change behavior. See the Prompts guide and Custom Prompts examples for full details.
lc = LangChat(
    llm=OpenAI("gpt-4o-mini"),
    vector_db=Pinecone("my-index"),
    db=Supabase(),
    prompt_template="""You are Aria, a support agent for Acme Corp.

Context:
{context}

History:
{chat_history}

Customer: {question}
Aria:""",
)

Custom reranker settings

Control how many chunks reach the LLM:
from langchat.adapters.reranker import FlashrankRerankAdapter

reranker = FlashrankRerankAdapter(
    model_name="ms-marco-MiniLM-L-12-v2",
    cache_dir="rerank_models",
    top_n=5,   # pass 5 chunks instead of the default 3
)

lc = LangChat(
    llm=OpenAI("gpt-4o-mini"),
    vector_db=Pinecone("my-index"),
    db=Supabase(),
    reranker=reranker,
)

Custom standalone question prompt

Control how follow-up questions are reformulated:
STANDALONE = """Rewrite the follow-up question as a standalone question in English.
Keep greetings unchanged. Include domain context (Acme Corp products/services).

History:
{chat_history}

Follow-up: {question}
Standalone:"""

lc = LangChat(
    llm=OpenAI("gpt-4o-mini"),
    vector_db=Pinecone("my-index"),
    db=Supabase(),
    standalone_question_prompt=STANDALONE,
)

History window

Reduce token usage by keeping fewer past exchanges in context:
lc = LangChat(
    llm=OpenAI("gpt-4o-mini"),
    vector_db=Pinecone("my-index"),
    db=Supabase(),
    max_chat_history=5,   # only last 5 exchanges
)

Pre-processing questions

Intercept and modify questions before they reach the engine:
async def chat_with_preprocessing(query: str, user_id: str) -> ChatResponse:
    # Clean the query
    clean_query = query.strip()

    # Add user context
    enriched = f"[User tier: premium] {clean_query}"

    # Pass pre-processed standalone question to skip LLM reformulation
    raw = await lc.engine.chat(
        query=clean_query,
        user_id=user_id,
        standalone_question=enriched,
    )
    return ChatResponse(
        text=raw["response"],
        user_id=raw["user_id"],
        platform="web",
        status=raw["status"],
        response_time=raw["response_time"],
        timestamp=raw["timestamp"],
        error=raw.get("error"),
    )

Post-processing responses

Wrap chat() to modify or enrich responses:
import re

async def chat_with_postprocessing(query: str, user_id: str) -> ChatResponse:
    response = await lc.chat(query=query, user_id=user_id)

    if response:
        # Append disclaimer to financial answers
        if any(word in query.lower() for word in ["invest", "stock", "money"]):
            response = ChatResponse(
                text=response.text + "\n\n*This is not financial advice.*",
                user_id=response.user_id,
                platform=response.platform,
                status=response.status,
                response_time=response.response_time,
                timestamp=response.timestamp,
            )

    return response

Accessing the session directly

Manipulate conversation history before a chat call:
session = lc.get_session("alice", "web")

# Inject a system context message
session.chat_history.insert(0, (
    "System: What products do we sell?",
    "We sell enterprise software for HR teams.",
))

# Now the next chat() call will include this in history
response = await lc.chat(query="Tell me more", user_id="alice", platform="web")

Custom routes in API server

Add your own endpoints alongside LangChat’s:
from fastapi import APIRouter
from langchat.api import create_app

router = APIRouter(prefix="/api/v1")

@router.get("/topics")
async def get_topics():
    return ["pricing", "features", "support", "billing"]

@router.post("/feedback")
async def submit_feedback(message_id: str, helpful: bool):
    # save to your database
    return {"saved": True}

app = create_app(
    llm=OpenAI("gpt-4o-mini"),
    vector_db=Pinecone("my-index"),
    db=Supabase(),
    custom_routes=[router],
)