Files
JARVIS/backend/app/tools/langchain_adapter.py

76 lines
2.2 KiB
Python

"""
LangChain Adapter
Adapts Jarvis tools to LangChain tool format.
"""
from typing import List, Dict, Any, Optional, Callable
import json
class LangChainToolAdapter:
"""Adapter for converting Jarvis tools to LangChain tools"""
def __init__(self, registry: Any):
self.registry = registry
def to_langchain_tools(self) -> List[Dict[str, Any]]:
"""Convert all enabled tools to LangChain format"""
import asyncio
async def _convert():
tools = await self.registry.list_enabled()
result = []
for metadata in tools:
lc_tool = await self._create_langchain_tool(metadata)
if lc_tool:
result.append(lc_tool)
return result
return asyncio.get_event_loop().run_until_complete(_convert())
async def _create_langchain_tool(self, metadata: Any) -> Optional[Dict[str, Any]]:
"""Create a single LangChain tool from metadata"""
executor = await self.registry.get_executor(metadata.name)
if not executor:
return None
config = await self.registry.get_config(metadata.name)
return {
"name": metadata.name,
"description": metadata.description,
"display_name": metadata.display_name,
"tags": metadata.tags,
"version": metadata.version,
"executor": executor,
"config": config,
}
def get_tool_schemas(self) -> List[Dict[str, Any]]:
"""Get tool schemas for LLM function calling"""
import asyncio
async def _get():
tools = await self.registry.list_enabled()
schemas = []
for tool in tools:
schemas.append(
{
"name": tool.name,
"description": tool.description,
"parameters": {
"type": "object",
"properties": {},
"required": [],
},
}
)
return schemas
return asyncio.get_event_loop().run_until_complete(_get())