Skip to content

Langchain SDK

Since Langchain already provides multi-provider abstraction and chaining capabilities, DeepintShield adds enterprise features like governance, semantic caching, MCP tools, observability, etc, on top of your existing setup.

Endpoint: /langchain


Install with the LangChain extra:

Terminal window
pip install "deepintshield[langchain]"
from deepintshield import DeepintShield
from langchain_core.messages import HumanMessage
shield = DeepintShield(virtual_key="sk-bf-your-virtual-key")
llm = shield.langchain(model="gpt-4o-mini") # pre-wired ChatOpenAI
response = llm.invoke([HumanMessage(content="Hello!")])
print(response.content)

Your existing Langchain provider switching works unchanged through DeepintShield:

from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.messages import HumanMessage
base_url = "http://localhost:8080/langchain"
# OpenAI models via Langchain
openai_llm = ChatOpenAI(
model="gpt-4o-mini",
openai_api_base=base_url
)
# Anthropic models via Langchain
anthropic_llm = ChatAnthropic(
model="claude-3-sonnet-20240229",
anthropic_api_url=base_url
)
# Google models via Langchain
google_llm = ChatGoogleGenerativeAI(
model="gemini-1.5-flash",
google_api_base=base_url
)
# All work the same way
openai_response = openai_llm.invoke([HumanMessage(content="Hello GPT!")])
anthropic_response = anthropic_llm.invoke([HumanMessage(content="Hello Claude!")])
google_response = google_llm.invoke([HumanMessage(content="Hello Gemini!")])

Add DeepintShield-specific headers for governance and tracking. Different LangChain provider classes support different methods for adding custom headers:

Use default_headers parameter for OpenAI models:

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
llm = ChatOpenAI(
model="gpt-4o-mini",
openai_api_base="http://localhost:8080/langchain",
default_headers={
"x-bf-vk": "your-virtual-key",
}
)
response = llm.invoke([HumanMessage(content="Hello!")])
print(response.content)

Use default_headers parameter for Anthropic models:

from langchain_anthropic import ChatAnthropic
from langchain_core.messages import HumanMessage
llm = ChatAnthropic(
model="claude-3-sonnet-20240229",
anthropic_api_url="http://localhost:8080/langchain",
default_headers={
"x-bf-vk": "your-virtual-key", # Virtual key for governance
}
)
response = llm.invoke([HumanMessage(content="Hello!")])
print(response.content)

Use additional_headers parameter for Google/Gemini models:

from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.messages import HumanMessage
llm = ChatGoogleGenerativeAI(
model="gemini-2.5-flash",
google_api_base="http://localhost:8080/langchain",
additional_headers={
"x-bf-vk": "your-virtual-key", # Virtual key for governance
}
)
response = llm.invoke([HumanMessage(content="Hello!")])
print(response.content)

For Bedrock models, there are two approaches:

Method 1: Using the client’s event system (after initialization)

from langchain_aws import ChatBedrockConverse
from langchain_core.messages import HumanMessage
llm = ChatBedrockConverse(
model="us.anthropic.claude-haiku-4-5-20251001-v1:0",
region_name="us-west-2",
endpoint_url="http://localhost:8080/langchain",
aws_access_key_id="dummy-access-key",
aws_secret_access_key="dummy-secret-key",
max_tokens=2000
)
def add_bifrost_headers(request, **kwargs):
"""Add custom headers to Bedrock requests"""
request.headers.add_header("x-bf-vk", "your-virtual-key")
# Register header injection for all Bedrock operations
llm.client.meta.events.register_first(
"before-sign.bedrock-runtime.*",
add_bifrost_headers
)
response = llm.invoke([HumanMessage(content="Hello!")])
print(response.content)

Method 2: Pre-configuring a boto3 client

from langchain_aws import ChatBedrockConverse
from langchain_core.messages import HumanMessage
import boto3
# Create and configure boto3 client
bedrock_client = boto3.client(
service_name="bedrock-runtime",
region_name="us-west-2",
endpoint_url="http://localhost:8080/langchain",
aws_access_key_id="dummy-access-key",
aws_secret_access_key="dummy-secret-key"
)
def add_bifrost_headers(request, **kwargs):
"""Add custom headers to Bedrock requests"""
request.headers.add_header("x-bf-vk", "your-virtual-key")
# Register header injection before creating LLM
bedrock_client.meta.events.register_first(
"before-sign.bedrock-runtime.*",
add_bifrost_headers
)
# Pass the configured client to ChatBedrockConverse
llm = ChatBedrockConverse(
model="us.anthropic.claude-haiku-4-5-20251001-v1:0",
client=bedrock_client,
max_tokens=2000
)
response = llm.invoke([HumanMessage(content="Hello!")])
print(response.content)

Pass API keys directly to bypass DeepintShield’s key management. You can pass any provider’s API key since DeepintShield only looks for Authorization or x-api-key headers. This requires the Allow Direct API keys option to be enabled in DeepintShield configuration.

Learn more: See Key Management for enabling direct API key usage.

from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
from langchain_core.messages import HumanMessage
# Using OpenAI key directly
openai_llm = ChatOpenAI(
model="gpt-4o-mini",
openai_api_base="http://localhost:8080/langchain",
default_headers={
"Authorization": "Bearer sk-your-openai-key"
}
)
# Using Anthropic key for Claude models
anthropic_llm = ChatAnthropic(
model="claude-3-sonnet-20240229",
anthropic_api_url="http://localhost:8080/langchain",
default_headers={
"x-api-key": "sk-ant-your-anthropic-key"
}
)
# Using Azure with direct Azure key
from langchain_openai import AzureChatOpenAI
azure_llm = AzureChatOpenAI(
deployment_name="gpt-4o-aug",
api_key="your-azure-api-key",
azure_endpoint="http://localhost:8080/langchain",
api_version="2024-05-01-preview",
max_tokens=100,
default_headers={
"x-bf-azure-endpoint": "https://your-resource.openai.azure.com",
}
)
openai_response = openai_llm.invoke([HumanMessage(content="Hello GPT!")])
anthropic_response = anthropic_llm.invoke([HumanMessage(content="Hello Claude!")])
azure_response = azure_llm.invoke([HumanMessage(content="Hello from Azure!")])

Control extended reasoning capabilities for models that support thinking/reasoning modes.

For Azure OpenAI reasoning models, use ChatOpenAI with the reasoning parameter and Azure-specific headers:

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
# Azure OpenAI with reasoning control
llm = ChatOpenAI(
model="azure/gpt-5.1", # Azure deployment name
base_url="http://localhost:8080/langchain",
api_key="dummy-key",
reasoning={
"effort": "high", # "minimal" | "low" | "medium" | "high"
"summary": "detailed" # "auto" | "concise" | "detailed"
},
default_headers={
"authorization": "Bearer your-azure-api-key",
"x-bf-azure-endpoint": "https://your-resource.openai.azure.com"
}
)
response = llm.invoke([HumanMessage(content="Solve this complex problem...")])

For OpenAI reasoning models, use ChatOpenAI with the reasoning parameter:

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
# OpenAI with reasoning control
llm = ChatOpenAI(
model="gpt-5",
base_url="http://localhost:8080/langchain",
api_key="dummy-key",
max_tokens=2000,
reasoning={
"effort": "high",
"summary": "detailed"
}
)
response = llm.invoke([HumanMessage(content="Solve this complex problem...")])

Both Anthropic Claude and Amazon Nova models support reasoning/thinking capabilities via Bedrock. Use ChatBedrockConverse with model-specific configuration formats.

from langchain_aws import ChatBedrockConverse
from langchain_core.messages import HumanMessage
# Bedrock Claude with reasoning control
llm = ChatBedrockConverse(
model="us.anthropic.claude-opus-4-5-20251101-v1:0",
region_name="dummy-region",
endpoint_url="http://localhost:8080/langchain",
aws_access_key_id="dummy-access-key",
aws_secret_access_key="dummy-secret-key",
max_tokens=2000,
additional_model_request_fields={ # Anthropic format
"reasoning_config": {
"type": "enabled",
"budget_tokens": 1500, # Control thinking token budget
}
}
)
response = llm.invoke([HumanMessage(content="Reason through this problem...")])
from langchain_aws import ChatBedrockConverse
from langchain_core.messages import HumanMessage
# Bedrock Nova with reasoning control
llm = ChatBedrockConverse(
model="global.amazon.nova-2-lite-v1:0",
region_name="dummy-region",
endpoint_url="http://localhost:8080/langchain",
aws_access_key_id="dummy-access-key",
aws_secret_access_key="dummy-secret-key",
max_tokens=2000,
additional_model_request_fields={ # Nova format
"reasoningConfig": {
"type": "enabled",
"maxReasoningEffort": "high", # "low" | "medium" | "high"
}
}
)
response = llm.invoke([HumanMessage(content="Reason through this problem...")])

For Google Gemini 2.5 models (Pro, Flash) and Gemini 3, use ChatGoogleGenerativeAI with the thinking_budget parameter:

from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.messages import HumanMessage
# Gemini with thinking budget control
llm = ChatGoogleGenerativeAI(
model="gemini/gemini-2.5-flash", # or "vertex/gemini-2.5-flash"
base_url="http://localhost:8080/langchain",
api_key="dummy-key",
max_tokens=4000,
thinking_budget=1024, # 0=disable, -1=dynamic, >0=constrained token budget
include_thoughts=True, # Include reasoning in response
)
response = llm.invoke([HumanMessage(content="Reason through this problem...")])

LangChain’s OpenAIEmbeddings class can be used to generate embeddings through DeepintShield:

from langchain_openai import OpenAIEmbeddings
# Create embeddings instance
embeddings = OpenAIEmbeddings(
model="text-embedding-3-small",
base_url="http://localhost:8080/langchain",
api_key="dummy-key"
)
# Embed a single query
query_embedding = embeddings.embed_query("What is machine learning?")
# Embed multiple documents
doc_embeddings = embeddings.embed_documents([
"Machine learning is a subset of AI",
"Deep learning uses neural networks",
"NLP helps computers understand text"
])

For embedding models from other providers (Cohere, Bedrock, Gemini, etc.), you can use GoogleGenerativeAIEmbeddings from the langchain_google_genai package. This module sends text strings directly and works across multiple providers:

from langchain_google_genai import GoogleGenerativeAIEmbeddings
# Works with any provider's embedding models
embeddings = GoogleGenerativeAIEmbeddings(
model="cohere/cohere-embed-v4.0", # or bedrock/..., gemini/..., etc.
base_url="http://localhost:8080/langchain",
api_key="dummy-key"
)
query_embedding = embeddings.embed_query("What is machine learning?")
doc_embeddings = embeddings.embed_documents([
"Machine learning is a subset of AI",
"Deep learning uses neural networks"
])

The Langchain integration supports all features that are available in both the Langchain SDK and DeepintShield core functionality. Your existing Langchain chains and workflows work seamlessly with DeepintShield’s enterprise features. 😄