Skip to main content
Framework adapters let you wrap agents and tools built with other frameworks — LangChain, LlamaIndex, CrewAI, AutoGen — as OpenGAP skills. This means your existing agent code works inside an OpenGAP-structured repository without rewriting.

LangChain adapter

Wrap a LangChain tool as an OpenGAP skill:
# skills/langchain_search.py
from gitagent import skill
from gitagent.adapters import langchain_tool

from langchain.tools import DuckDuckGoSearchRun

# Wrap the LangChain tool — it becomes an OpenGAP skill
duckduckgo = langchain_tool(DuckDuckGoSearchRun())
The adapter reads the LangChain tool’s name and description and creates a compliant @skill-decorated function. Input/output schemas are inferred from the LangChain tool definition.

Wrap a LangChain agent as a skill

# skills/langchain_agent.py
from gitagent import skill
from gitagent.adapters import langchain_agent as wrap_agent

from langchain.agents import initialize_agent, load_tools
from langchain.llms import OpenAI

llm = OpenAI()
tools = load_tools(["serpapi", "calculator"], llm=llm)
lc_agent = initialize_agent(tools, llm)

# The whole LangChain agent becomes one OpenGAP skill
research = wrap_agent(
    agent=lc_agent,
    name="langchain_researcher",
    description="Research a topic using web search and calculations"
)
The parent OpenGAP agent can call langchain_researcher as a sub-agent.

Use LangChain in a skill directly

You don’t need an adapter if you just use LangChain inside a regular skill:
from gitagent import skill
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI

@skill(name="summarize_langchain", description="Summarize text using LangChain")
def summarize(text: str, max_sentences: int = 3) -> str:
    llm = OpenAI()
    prompt = PromptTemplate(
        input_variables=["text", "max_sentences"],
        template="Summarize in {max_sentences} sentences: {text}"
    )
    chain = LLMChain(llm=llm, prompt=prompt)
    return chain.run(text=text, max_sentences=max_sentences)

LlamaIndex adapter

Wrap a LlamaIndex query engine as an OpenGAP skill:
# skills/llamaindex_query.py
from gitagent import skill
from gitagent.adapters import llamaindex_query_engine

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader

documents = SimpleDirectoryReader("data/").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()

# Wrap as OpenGAP skill
query_knowledge_base = llamaindex_query_engine(
    engine=query_engine,
    name="query_knowledge_base",
    description="Query the internal knowledge base for information about our products"
)

Wrap a LlamaIndex agent

from gitagent.adapters import llamaindex_agent as wrap_li_agent
from llama_index.core.agent import ReActAgent
from llama_index.core.tools import QueryEngineTool

li_agent = ReActAgent.from_tools([...])

knowledge_agent = wrap_li_agent(
    agent=li_agent,
    name="knowledge_agent",
    description="Answer questions using the company knowledge base"
)

CrewAI adapter

Wrap a CrewAI crew as an OpenGAP skill:
# skills/crewai_research.py
from gitagent.adapters import crewai_crew
from crewai import Agent, Crew, Task

researcher = Agent(role="Researcher", goal="Research topics thoroughly", ...)
writer = Agent(role="Writer", goal="Write clear summaries", ...)

research_task = Task(description="Research: {topic}", agent=researcher)
write_task = Task(description="Write summary of research", agent=writer)

crew = Crew(agents=[researcher, writer], tasks=[research_task, write_task])

research_crew = crewai_crew(
    crew=crew,
    name="research_crew",
    description="Research a topic using a multi-agent crew",
    inputs=["topic"]
)

AutoGen adapter

Wrap an AutoGen conversation as an OpenGAP skill:
# skills/autogen_coder.py
from gitagent.adapters import autogen_conversation
import autogen

assistant = autogen.AssistantAgent("assistant", ...)
user_proxy = autogen.UserProxyAgent("user_proxy", ...)

code_assistant = autogen_conversation(
    initiator=user_proxy,
    recipient=assistant,
    name="code_assistant",
    description="Write and debug Python code"
)

Generic Python adapter

For any callable that doesn’t fit a specific adapter:
from gitagent import skill

# Any Python function can be a skill — no adapter needed
@skill(
    name="my_existing_function",
    description="Does something useful"
)
def my_existing_function(input: str) -> str:
    return existing_library.process(input)

Adapter configuration

Adapters pass through to the underlying framework’s configuration. For models used inside adapted agents, configure them in the framework’s own way (LangChain uses OPENAI_API_KEY, etc.) or via the adapter:
langchain_tool(
    tool=MyTool(),
    llm_config={"model": "gpt-4o", "temperature": 0.0}
)

Installing adapters

Adapters are optional extras:
pip install "gitagent[langchain]"
pip install "gitagent[llamaindex]"
pip install "gitagent[crewai]"
pip install "gitagent[autogen]"
pip install "gitagent[all]"       # all adapters