Skip to main content

LangChain BaseChatModel adapter for Pi (@earendil-works/pi-ai) via a Node sidecar — use Pi with any provider, model and auth from LangChain/LangGraph in Python. Includes a native opencode/Zen chat model (no pi).

Project description

langchain-pi

A LangChain BaseChatModel adapter for Pi (@earendil-works/pi-ai), the Python twin of langchain-pi-ts. Use Pi — and any provider, model and credential it resolves — from LangChain and LangGraph in Python, with native tool calling and streaming.

Pi is a TypeScript/Node stack with no Python SDK, so langchain-pi drives a tiny Node sidecar that wraps pi-ai's streamSimple + ModelRegistry/AuthStorage. Node keeps owning provider dispatch, OAuth refresh and the provider stealth headers; Python only frames the request and reconstructs the streamed events. Python never touches a token.

Requirements

  • Python ≥ 3.9
  • Node ≥ 22.19.0 on PATH, with @earendil-works/pi-ai and @earendil-works/pi-coding-agent resolvable (install them where the sidecar can reach them, or point node_modules_dir at a node_modules directory that has them). Note: NODE_PATH does not work for ESM, so node_modules_dir resolves each package via its package.json entry.
  • A provider authenticated in ~/.pi (e.g. openai-codex), exactly as for the Pi CLI / the TS package.

Install

pip install langchain-pi          # or: uv add langchain-pi
npm install @earendil-works/pi-ai @earendil-works/pi-coding-agent

Usage

from langchain_pi import ChatPi

model = ChatPi(
    provider="openai-codex",
    model="gpt-5.3-codex-spark",
    reasoning="minimal",
    system="You are a helpful assistant.",
)

print(model.invoke("Hello!").content)

Tool calling

Accepts any LangChain tool; schemas are converted to the JSON Schema pi-ai expects.

from langchain_core.tools import tool

@tool
def get_weather(city: str) -> str:
    """Get the current weather for a city."""
    return f"It is sunny in {city}, 24C."

agent_model = model.bind_tools([get_weather])

Streaming

for chunk in model.stream("Write a haiku."):
    print(chunk.content, end="")

LangGraph

from langgraph.prebuilt import create_react_agent

agent = create_react_agent(model, [get_weather])
agent.invoke({"messages": [("user", "What's the weather in Paris?")]})

Pointing at your Node install

If pi-ai isn't resolvable from the sidecar's location, pass the node_modules directory that contains it:

ChatPi(provider="opencode", model="deepseek-v4-flash-free",
       node_modules_dir="/path/to/your/project/node_modules")

Native opencode/Zen (no Pi)

For OpenCode Zen you don't need Pi — it's an OpenAI-compatible endpoint. langchain_pi.opencode ships a ChatOpencode (a thin ChatOpenAI subclass) that points at it and reads the key opencode auto-provisions into ~/.local/share/opencode/auth.json. Install the optional extra:

pip install "langchain-pi[opencode]"
from langchain_pi.opencode import ChatOpencode

# Free models work with no key (anonymous IP-limited trial):
free = ChatOpencode("deepseek-v4-flash-free")

# A key (auto-read, or OPENCODE_API_KEY / api_key) unlocks paid models + higher limits:
paid = ChatOpencode("glm-5")
go = ChatOpencode("glm-5", tier="go")

Free models: deepseek-v4-flash-free, big-pickle, mimo-v2.5-free, nemotron-3-super-free.

Notes

  • Node is a runtime prerequisite — the heavy provider/auth logic lives in pi-ai.
  • Tool-call deltas and usage/cost metadata are reconstructed 1:1 with the TS twin.
  • Cancellation (e.g. LangGraph) aborts the in-flight provider request via the sidecar.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

langchain_pi-0.2.0.tar.gz (24.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

langchain_pi-0.2.0-py3-none-any.whl (12.3 kB view details)

Uploaded Python 3

File details

Details for the file langchain_pi-0.2.0.tar.gz.

File metadata

  • Download URL: langchain_pi-0.2.0.tar.gz
  • Upload date:
  • Size: 24.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"CachyOS Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for langchain_pi-0.2.0.tar.gz
Algorithm Hash digest
SHA256 a25638c8c98dbeae952363198df99de53bc4b6d6e52f34e24fcd16cd3ad133e9
MD5 21062a201936b68284926521ddc8e21c
BLAKE2b-256 6db07cc28ed0a92ab5a89119a7e5ebf004b5c3628e4e3833d3df4a2c53ee4f88

See more details on using hashes here.

File details

Details for the file langchain_pi-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: langchain_pi-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 12.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"CachyOS Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for langchain_pi-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 dcf9286a04df9ee08125199480eff2423a582506c30186c83fb1b3d6a959fd62
MD5 32b798a588093d0732d60aa4cdf51a40
BLAKE2b-256 911affc0300e4ea5bcbcb915ec22f023301c1e11ff481a66452c4bc5ecbcb9c2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page