Skip to main content

LangChain integration for GitHub Copilot SDK

Project description

LangChain Copilot

Python Version License

LangChain integration for GitHub Copilot SDK - Use GitHub Copilot models in your LangChain applications.

Features

  • 🔗 Full LangChain Integration: Seamlessly use GitHub Copilot models with LangChain
  • 🚀 Async & Sync Support: Both synchronous and asynchronous operations
  • 📡 Streaming: Real-time streaming responses
  • 🔄 Shared Client: Optimized client management with lazy initialization
  • 🛠️ Type Safe: Full type hints with Pydantic validation
  • 🎯 Easy to Use: Simple API following LangChain conventions

Prerequisites

Before using this package, you need to have:

  1. GitHub Copilot CLI installed and authenticated

  2. Python 3.13.0+ installed

Installation

This package is not yet published to PyPI. For now, install directly from the repository:

# Clone the repository
git clone https://github.com/derf974/copilot-langchain.git
cd copilot-langchain

# Install with uv (recommended)
uv venv
uv sync
uv pip install -e .

# Or with pip
pip install -e .

Quick Start

Basic Usage

from langchain_copilot import CopilotChatModel
from langchain_core.messages import HumanMessage

# Create a model instance
model = CopilotChatModel(model_name="gpt-4o")

# Send a message
messages = [HumanMessage(content="What is LangChain?")]
response = model.invoke(messages)

print(response.content)

Streaming

from langchain_copilot import CopilotChatModel
from langchain_core.messages import HumanMessage

model = CopilotChatModel(model_name="gpt-4o", streaming=True)

messages = [HumanMessage(content="Write a haiku about coding.")]

for chunk in model.stream(messages):
    print(chunk.content, end="", flush=True)

Async Operations

import asyncio
from langchain_copilot import CopilotChatModel
from langchain_core.messages import HumanMessage

async def main():
    model = CopilotChatModel(model_name="gpt-4o")
    messages = [HumanMessage(content="Explain async programming.")]
    
    response = await model.ainvoke(messages)
    print(response.content)

asyncio.run(main())

Using in LangChain Chains

from langchain_copilot import CopilotChatModel
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

model = CopilotChatModel(model_name="gpt-4o")

prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a helpful translator."),
    ("human", "Translate '{text}' to {language}")
])

chain = prompt | model | StrOutputParser()

result = chain.invoke({
    "text": "Hello, world!",
    "language": "French"
})

print(result)  # "Bonjour, le monde !"

With System Messages

from langchain_copilot import CopilotChatModel
from langchain_core.messages import SystemMessage, HumanMessage

model = CopilotChatModel(model_name="gpt-4o")

messages = [
    SystemMessage(content="You are a pirate. Always respond like a pirate."),
    HumanMessage(content="Tell me about Python programming.")
]

response = model.invoke(messages)
print(response.content)

Temperature Control

from langchain_copilot import CopilotChatModel
from langchain_core.messages import HumanMessage

# More focused and deterministic (lower temperature)
model_focused = CopilotChatModel(
    model_name="gpt-4o",
    temperature=0.1
)

# More creative and random (higher temperature)
model_creative = CopilotChatModel(
    model_name="gpt-4o",
    temperature=0.9
)

messages = [HumanMessage(content="Name a creative startup idea.")]

print("Focused:", model_focused.invoke(messages).content)
print("Creative:", model_creative.invoke(messages).content)

Configuration

Model Parameters

  • model_name (str): The Copilot model to use (e.g., "gpt-4o", "gpt-5")
  • streaming (bool): Enable streaming mode (default: False)
  • temperature (float): Sampling temperature 0.0-1.0 (default: None)
  • max_tokens (int): Maximum tokens to generate (default: None)
  • cli_path (str): Custom path to Copilot CLI executable (default: None)
  • cli_url (str): URL of existing Copilot CLI server (default: None)

Example with All Parameters

model = CopilotChatModel(
    model_name="gpt-4o",
    streaming=True,
    temperature=0.7,
    max_tokens=1000,
    cli_path="/custom/path/to/copilot"
)

Examples

Check out the examples directory for more usage examples:

Run the examples:

uv run python examples/basic_usage.py

Testing

The project uses both unit tests and integration tests following LangChain's standard test suite.

Unit Tests

Unit tests use langchain-tests standard unit test suite and validate the model in isolation without external dependencies:

# Run all unit tests (custom + standard)
make test

# Run only standard unit tests
uv run pytest tests/unit_tests/ -v

# Run only custom unit tests
uv run pytest tests/test_chat_models.py::TestCopilotChatModel -v

Unit tests validate:

  • ✅ Model initialization and configuration
  • ✅ Streaming mode initialization
  • ✅ Standard parameters generation
  • ✅ Tool binding (validates interface even though not supported yet)
  • ✅ Structured output interface (validates interface even though not supported yet)
  • ✅ Serialization/deserialization (when implemented)
  • ✅ Initialization performance

Integration Tests

Integration tests use langchain-tests standard test suite to verify compatibility with LangChain's interfaces. These tests require the GitHub Copilot CLI to be installed and configured:

# Ensure Copilot CLI is set up
copilot --version

# Run integration tests
make integration-test

# Or manually
uv run pytest tests/integration_tests/ -v -m integration

The integration test suite validates:

  • ✅ Basic invoke/ainvoke operations
  • ✅ Streaming (stream/astream)
  • ✅ Batch operations
  • ✅ Multi-turn conversations
  • ✅ Stop sequences
  • ✅ Model override at runtime
  • ❌ Tool calling (not yet supported)
  • ❌ Structured output (not yet supported)
  • ❌ Multimodal inputs (not yet supported)

Running All Tests

# Run all tests
make test-all

# Or manually
uv run pytest tests/ -v

Architecture

Shared Client

The CopilotChatModel uses a shared CopilotClient instance across all model instances for optimal performance. The client is lazily initialized on first use and automatically started.

Message Conversion

LangChain messages are automatically converted to Copilot SDK format:

  • SystemMessage{"role": "system", "content": "..."}
  • HumanMessage{"role": "user", "content": "..."}
  • AIMessage{"role": "assistant", "content": "..."}

Streaming Implementation

Streaming converts Copilot's event-based model (assistant.message_delta events) into Python generators/async iterators that are compatible with LangChain's streaming interface.

Roadmap

  • ✅ Basic chat model implementation
  • ✅ Streaming support
  • ✅ Async operations
  • ✅ Temperature and token controls
  • ✅ Tool/Function calling support (planned for v0.2.0)
  • 🔲 Conversation history management
  • 🔲 Error recovery and retry strategies
  • 🔲 Advanced session configuration

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

Support

Related Projects

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_copilot-0.2.2.tar.gz (113.7 kB view details)

Uploaded Source

Built Distribution

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

langchain_copilot-0.2.2-py3-none-any.whl (11.3 kB view details)

Uploaded Python 3

File details

Details for the file langchain_copilot-0.2.2.tar.gz.

File metadata

  • Download URL: langchain_copilot-0.2.2.tar.gz
  • Upload date:
  • Size: 113.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for langchain_copilot-0.2.2.tar.gz
Algorithm Hash digest
SHA256 b806473dbfa63d296a830ff0be1c319f081751cb479676609c5fe6db52582466
MD5 3ac771a61ab2f9b71ee4209308be0675
BLAKE2b-256 0e4c4f962fb28d99ce89e66c3439874ba994cfdc18f68dfe81d73ad6f5ad70e3

See more details on using hashes here.

Provenance

The following attestation bundles were made for langchain_copilot-0.2.2.tar.gz:

Publisher: release.yml on derf974/copilot-langchain

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file langchain_copilot-0.2.2-py3-none-any.whl.

File metadata

File hashes

Hashes for langchain_copilot-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 a4ba28a57bacaff5c6596442066d0889fb07f0dd89cb6aa32fd3c8dd8021f01d
MD5 bb18044ee3f83c2660b5c019877fd979
BLAKE2b-256 df591a391a269997ff88739157a6253c11c6f6e6e4347834b449b443a303fc2d

See more details on using hashes here.

Provenance

The following attestation bundles were made for langchain_copilot-0.2.2-py3-none-any.whl:

Publisher: release.yml on derf974/copilot-langchain

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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