feat: Add KuzuDB support to MCP server and make it default

- Add KuzuProviderConfig to schema for KuzuDB configuration
- Update DatabaseDriverFactory to support KuzuDB initialization
- Modify GraphitiService to handle KuzuDB driver instantiation
- Update CLI argument parser to include 'kuzu' option
- Make KuzuDB the default database provider (in-memory by default)
- Add docker-compose-kuzu.yml for standalone KuzuDB deployment
- Fix FalkorDB factory to parse URI into host/port parameters
- Fix EntityNode type access (use labels[0] instead of type)
- Add kuzu dependency to MCP server pyproject.toml

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Daniel Chalef 2025-08-30 08:36:01 -07:00
parent f41a1e7ce3
commit 2e345698e4
7 changed files with 237 additions and 23 deletions

View file

@ -68,7 +68,7 @@ embedder:
model: "voyage-3"
database:
provider: "neo4j" # Options: neo4j, falkordb
provider: "kuzu" # Options: neo4j, falkordb, kuzu
providers:
neo4j:
@ -82,6 +82,10 @@ database:
uri: ${FALKORDB_URI:redis://localhost:6379}
password: ${FALKORDB_PASSWORD:}
database: ${FALKORDB_DATABASE:default_db}
kuzu:
db: ${KUZU_DB::memory:}
max_concurrent_queries: ${KUZU_MAX_CONCURRENT_QUERIES:1}
graphiti:
group_id: ${GRAPHITI_GROUP_ID:main}

View file

@ -0,0 +1,42 @@
services:
graphiti-mcp:
image: zepai/knowledge-graph-mcp:latest
build:
context: .
dockerfile: Dockerfile
env_file:
- path: .env
required: false # Makes the file optional. Default value is 'true'
environment:
# Database configuration for KuzuDB
- KUZU_DB=${KUZU_DB:-:memory:}
- KUZU_MAX_CONCURRENT_QUERIES=${KUZU_MAX_CONCURRENT_QUERIES:-1}
# LLM provider configurations
- OPENAI_API_KEY=${OPENAI_API_KEY}
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
- GOOGLE_API_KEY=${GOOGLE_API_KEY}
- GROQ_API_KEY=${GROQ_API_KEY}
- AZURE_OPENAI_API_KEY=${AZURE_OPENAI_API_KEY}
- AZURE_OPENAI_ENDPOINT=${AZURE_OPENAI_ENDPOINT}
- AZURE_OPENAI_DEPLOYMENT=${AZURE_OPENAI_DEPLOYMENT}
# Embedder provider configurations
- VOYAGE_API_KEY=${VOYAGE_API_KEY}
- AZURE_OPENAI_EMBEDDINGS_ENDPOINT=${AZURE_OPENAI_EMBEDDINGS_ENDPOINT}
- AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT=${AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT}
# Application configuration
- GRAPHITI_GROUP_ID=${GRAPHITI_GROUP_ID:-main}
- SEMAPHORE_LIMIT=${SEMAPHORE_LIMIT:-10}
- CONFIG_PATH=/app/config/config.yaml
- PATH=/root/.local/bin:${PATH}
volumes:
- ./config.yaml:/app/config/config.yaml:ro
# Optional: If you want to persist KuzuDB data, uncomment the following line
# and change KUZU_DB to /data/kuzu.db
# - kuzu_data:/data
ports:
- "8000:8000" # Expose the MCP server via HTTP for SSE transport
command: ["uv", "run", "graphiti_mcp_server.py", "--transport", "sse", "--config", "/app/config/config.yaml"]
# Optional: Volume for persistent KuzuDB storage
# volumes:
# kuzu_data:

View file

@ -12,6 +12,7 @@ dependencies = [
"pydantic-settings>=2.0.0",
"pyyaml>=6.0",
"pytest>=8.4.1",
"kuzu>=0.11.2",
]
[project.optional-dependencies]
@ -63,3 +64,6 @@ ignore = ["E501"]
quote-style = "single"
indent-style = "space"
docstring-code-format = true
[tool.uv.sources]
graphiti-core = { path = "../", editable = true }

View file

@ -171,17 +171,25 @@ class FalkorDBProviderConfig(BaseModel):
database: str = 'default_db'
class KuzuProviderConfig(BaseModel):
"""KuzuDB provider configuration."""
db: str = ':memory:'
max_concurrent_queries: int = 1
class DatabaseProvidersConfig(BaseModel):
"""Database providers configuration."""
neo4j: Neo4jProviderConfig | None = None
falkordb: FalkorDBProviderConfig | None = None
kuzu: KuzuProviderConfig | None = None
class DatabaseConfig(BaseModel):
"""Database configuration."""
provider: str = Field(default='neo4j', description='Database provider')
provider: str = Field(default='kuzu', description='Database provider')
providers: DatabaseProvidersConfig = Field(default_factory=DatabaseProvidersConfig)

View file

@ -154,18 +154,53 @@ class GraphitiService:
# Store entity types for later use
self.entity_types = custom_types
# Initialize Graphiti client with database connection params
self.client = Graphiti(
uri=db_config['uri'],
user=db_config['user'],
password=db_config['password'],
llm_client=llm_client,
embedder=embedder_client,
max_coroutines=self.semaphore_limit,
)
# Initialize Graphiti client with appropriate driver
if self.config.database.provider.lower() == 'kuzu':
# For KuzuDB, create a KuzuDriver instance directly
from graphiti_core.driver.kuzu_driver import KuzuDriver
# Test connection
await self.client.driver.client.verify_connectivity() # type: ignore
kuzu_driver = KuzuDriver(
db=db_config['db'],
max_concurrent_queries=db_config['max_concurrent_queries'],
)
self.client = Graphiti(
graph_driver=kuzu_driver,
llm_client=llm_client,
embedder=embedder_client,
max_coroutines=self.semaphore_limit,
)
elif self.config.database.provider.lower() == 'falkordb':
# For FalkorDB, create a FalkorDriver instance directly
from graphiti_core.driver.falkordb_driver import FalkorDriver
falkor_driver = FalkorDriver(
host=db_config['host'],
port=db_config['port'],
password=db_config['password'],
database=db_config['database'],
)
self.client = Graphiti(
graph_driver=falkor_driver,
llm_client=llm_client,
embedder=embedder_client,
max_coroutines=self.semaphore_limit,
)
else:
# For Neo4j (default), use the original approach
self.client = Graphiti(
uri=db_config['uri'],
user=db_config['user'],
password=db_config['password'],
llm_client=llm_client,
embedder=embedder_client,
max_coroutines=self.semaphore_limit,
)
# Test connection (Neo4j and FalkorDB have verify_connectivity, KuzuDB doesn't need it)
if self.config.database.provider.lower() != 'kuzu':
await self.client.driver.client.verify_connectivity() # type: ignore
# Build indices
await self.client.build_indices_and_constraints()
@ -345,7 +380,7 @@ async def search_nodes(
NodeResult(
uuid=node.uuid,
name=node.name,
type=node.type or 'Unknown',
type=node.labels[0] if node.labels else 'Unknown',
created_at=node.created_at.isoformat() if node.created_at else None,
summary=node.summary,
)
@ -667,7 +702,7 @@ async def initialize_server() -> ServerConfig:
)
parser.add_argument(
'--database-provider',
choices=['neo4j', 'falkordb'],
choices=['neo4j', 'falkordb', 'kuzu'],
help='Database provider to use',
)

View file

@ -15,6 +15,14 @@ try:
HAS_FALKOR = True
except ImportError:
HAS_FALKOR = False
# Try to import KuzuDriver if available
try:
from graphiti_core.driver.kuzu_driver import KuzuDriver # noqa: F401
HAS_KUZU = True
except ImportError:
HAS_KUZU = False
from graphiti_core.embedder import EmbedderClient, OpenAIEmbedder
from graphiti_core.llm_client import LLMClient, OpenAIClient
from graphiti_core.llm_client.config import LLMConfig as GraphitiLLMConfig
@ -327,16 +335,52 @@ class DatabaseDriverFactory:
# Check for environment variable overrides (for CI/CD compatibility)
import os
from urllib.parse import urlparse
uri = os.environ.get('FALKORDB_URI', falkor_config.uri)
password = os.environ.get('FALKORDB_PASSWORD', falkor_config.password)
# Parse the URI to extract host and port
parsed = urlparse(uri)
host = parsed.hostname or 'localhost'
port = parsed.port or 6379
return {
'driver': 'falkordb',
'uri': uri,
'host': host,
'port': port,
'password': password,
'database': falkor_config.database,
}
case 'kuzu':
if not HAS_KUZU:
raise ValueError('KuzuDB driver not available in current graphiti-core version')
# Use KuzuDB config if provided, otherwise use defaults
if config.providers.kuzu:
kuzu_config = config.providers.kuzu
else:
# Create default KuzuDB configuration
from config.schema import KuzuProviderConfig
kuzu_config = KuzuProviderConfig()
# Check for environment variable overrides (for CI/CD compatibility)
import os
db = os.environ.get('KUZU_DB', kuzu_config.db)
max_concurrent_queries = int(
os.environ.get(
'KUZU_MAX_CONCURRENT_QUERIES', kuzu_config.max_concurrent_queries
)
)
return {
'driver': 'kuzu',
'db': db,
'max_concurrent_queries': max_concurrent_queries,
}
case _:
raise ValueError(f'Unsupported Database provider: {provider}')

91
mcp_server/uv.lock generated
View file

@ -613,8 +613,8 @@ wheels = [
[[package]]
name = "graphiti-core"
version = "0.18.9"
source = { registry = "https://pypi.org/simple" }
version = "0.19.0rc3"
source = { editable = "../" }
dependencies = [
{ name = "diskcache" },
{ name = "neo4j" },
@ -623,11 +623,52 @@ dependencies = [
{ name = "posthog" },
{ name = "pydantic" },
{ name = "python-dotenv" },
{ name = "pyyaml" },
{ name = "tenacity" },
]
sdist = { url = "https://files.pythonhosted.org/packages/2c/c5/b4480b44d40cc6031cc74fb703a36f1d81e03672f330c0e81ebfa7bda6ad/graphiti_core-0.18.9.tar.gz", hash = "sha256:00bce4693fe78f9484d46f54df34a086b35b6dda9bd07a8b09126e9e57c06f2c", size = 6467404 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/b7/2d/e91698f78c8752b7ad960990584a984eabebc2d73fd5f401bbf28bc22224/graphiti_core-0.18.9-py3-none-any.whl", hash = "sha256:30bbaef5558596ffcec09a9ef7747921a95631c67c5f5a4e2c06eef982c3554a", size = 139857 },
[package.metadata]
requires-dist = [
{ name = "anthropic", marker = "extra == 'anthropic'", specifier = ">=0.49.0" },
{ name = "anthropic", marker = "extra == 'dev'", specifier = ">=0.49.0" },
{ name = "boto3", marker = "extra == 'neptune'", specifier = ">=1.39.16" },
{ name = "diskcache", specifier = ">=5.6.3" },
{ name = "diskcache-stubs", marker = "extra == 'dev'", specifier = ">=5.6.3.6.20240818" },
{ name = "falkordb", marker = "extra == 'dev'", specifier = ">=1.1.2,<2.0.0" },
{ name = "falkordb", marker = "extra == 'falkordb'", specifier = ">=1.1.2,<2.0.0" },
{ name = "google-genai", marker = "extra == 'dev'", specifier = ">=1.8.0" },
{ name = "google-genai", marker = "extra == 'google-genai'", specifier = ">=1.8.0" },
{ name = "groq", marker = "extra == 'dev'", specifier = ">=0.2.0" },
{ name = "groq", marker = "extra == 'groq'", specifier = ">=0.2.0" },
{ name = "ipykernel", marker = "extra == 'dev'", specifier = ">=6.29.5" },
{ name = "jupyterlab", marker = "extra == 'dev'", specifier = ">=4.2.4" },
{ name = "kuzu", marker = "extra == 'dev'", specifier = ">=0.11.2" },
{ name = "kuzu", marker = "extra == 'kuzu'", specifier = ">=0.11.2" },
{ name = "langchain-anthropic", marker = "extra == 'dev'", specifier = ">=0.2.4" },
{ name = "langchain-aws", marker = "extra == 'neptune'", specifier = ">=0.2.29" },
{ name = "langchain-openai", marker = "extra == 'dev'", specifier = ">=0.2.6" },
{ name = "langgraph", marker = "extra == 'dev'", specifier = ">=0.2.15" },
{ name = "langsmith", marker = "extra == 'dev'", specifier = ">=0.1.108" },
{ name = "mcp", marker = "extra == 'dev'", specifier = ">=1.9.4" },
{ name = "neo4j", specifier = ">=5.26.0" },
{ name = "numpy", specifier = ">=1.0.0" },
{ name = "openai", specifier = ">=1.91.0" },
{ name = "opensearch-py", marker = "extra == 'neptune'", specifier = ">=3.0.0" },
{ name = "posthog", specifier = ">=3.0.0" },
{ name = "pydantic", specifier = ">=2.11.5" },
{ name = "pyright", marker = "extra == 'dev'", specifier = ">=1.1.404" },
{ name = "pytest", marker = "extra == 'dev'", specifier = ">=8.3.3" },
{ name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.24.0" },
{ name = "pytest-xdist", marker = "extra == 'dev'", specifier = ">=3.6.1" },
{ name = "python-dotenv", specifier = ">=1.0.1" },
{ name = "pyyaml", specifier = ">=6.0.2" },
{ name = "ruff", marker = "extra == 'dev'", specifier = ">=0.7.1" },
{ name = "sentence-transformers", marker = "extra == 'dev'", specifier = ">=3.2.1" },
{ name = "sentence-transformers", marker = "extra == 'sentence-transformers'", specifier = ">=3.2.1" },
{ name = "tenacity", specifier = ">=9.0.0" },
{ name = "transformers", marker = "extra == 'dev'", specifier = ">=4.45.2" },
{ name = "voyageai", marker = "extra == 'dev'", specifier = ">=0.2.3" },
{ name = "voyageai", marker = "extra == 'voyageai'", specifier = ">=0.2.3" },
]
[[package]]
@ -859,6 +900,40 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 },
]
[[package]]
name = "kuzu"
version = "0.11.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/66/fd/adbd05ccf81e6ad2674fcd3849d5d6ffeaf2141a9b8d1c1c4e282e923e1f/kuzu-0.11.2.tar.gz", hash = "sha256:9f224ec218ab165a18acaea903695779780d70335baf402d9b7f59ba389db0bd", size = 4902887 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/0e/91/bed837f5f49220a9f869da8a078b34a3484f210f7b57b267177821545c03/kuzu-0.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b25174cdb721aae47896ed62842d3859679607b493a9a6bbbcd9fb7fb3707", size = 3702618 },
{ url = "https://files.pythonhosted.org/packages/72/8a/fd5e053b0055718afe00b6a99393a835c6254354128fbb7f66a35fd76089/kuzu-0.11.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:9a8567c53bfe282f4727782471ff718842ffead8c48c1762c1df9197408fc986", size = 4101371 },
{ url = "https://files.pythonhosted.org/packages/ad/4b/e45cadc85bdc5079f432675bbe8d557600f0d4ab46fe24ef218374419902/kuzu-0.11.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d793bb5a0a14ada730a697eccac2a4c68b434b82692d985942900ef2003e099e", size = 6211974 },
{ url = "https://files.pythonhosted.org/packages/10/ca/92d6a1e6452fcf06bfc423ce2cde819ace6b6e47921921cc8fae87c27780/kuzu-0.11.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1be4e9b6c93ca8591b1fb165f9b9a27d70a56af061831afcdfe7aebb89ee6ff", size = 6992196 },
{ url = "https://files.pythonhosted.org/packages/49/6c/983fc6265dfc1169c87c4a0722f36ee665c5688e1166faeb4cd85e6af078/kuzu-0.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0ec7a304c746a2a98ecfd7e7c3f6fe92c4dfee2e2565c0b7cb4cffd0c2e374a", size = 4303517 },
{ url = "https://files.pythonhosted.org/packages/b5/14/8ae2c52657b93715052ecf47d70232f2c8d9ffe2d1ec3527c8e9c3cb2df5/kuzu-0.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf53b4f321a4c05882b14cef96d39a1e90fa993bab88a1554fb1565367553b8c", size = 3704177 },
{ url = "https://files.pythonhosted.org/packages/2d/7a/bce7bb755e16f9ca855f76a3acc6cfa9fae88c4d6af9df3784c50b2120a5/kuzu-0.11.2-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:2d749883b74f5da5ff4a4b0635a98f6cc5165743995828924321d2ca797317cb", size = 4102372 },
{ url = "https://files.pythonhosted.org/packages/c8/12/f5b1d51fcb78a86c078fb85cc53184ce962a3e86852d47d30e287a932e3f/kuzu-0.11.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:632507e5982928ed24fbb5e70ad143d7970bc4059046e77e0522707efbad303b", size = 6212492 },
{ url = "https://files.pythonhosted.org/packages/81/96/d6e57af6ccf9e0697812ad3039c80b87b768cf2674833b0b23d317ea3427/kuzu-0.11.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5211884601f8f08ae97ba25006d0facde24077c5333411d944282b8a2068ab4", size = 6992888 },
{ url = "https://files.pythonhosted.org/packages/40/ee/1f275ac5679a3f615ce0d9cf8c79001fdb535ccc8bc344e49b14484c7cd7/kuzu-0.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:82a6c8bfe1278dc1010790e398bf772683797ef5c16052fa0f6f78bacbc59aa3", size = 4304064 },
{ url = "https://files.pythonhosted.org/packages/73/ba/9f20d9e83681a0ddae8ec13046b116c34745fa0e66862d4e2d8414734ce0/kuzu-0.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aed88ffa695d07289a3d8557bd8f9e743298a4f4349208a60bbb06f4ebf15c26", size = 3703781 },
{ url = "https://files.pythonhosted.org/packages/53/a0/bb815c0490f3d4d30389156369b9fe641e154f0d4b1e8340f09a76021922/kuzu-0.11.2-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:595824b03248af928e3faee57f6825d3a46920f2d3b9bd0c0bb7fc3fa097fce9", size = 4103990 },
{ url = "https://files.pythonhosted.org/packages/a5/6f/97b647c0547a634a669055ff4cfd21a92ea3999aedc6a7fe9004f03f25e3/kuzu-0.11.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5674c6d9d26f5caa0c7ce6f34c02e4411894879aa5b2ce174fad576fa898523", size = 6211947 },
{ url = "https://files.pythonhosted.org/packages/42/74/c7f1a1cfb08c05c91c5a94483be387e80fafab8923c4243a22e9cced5c1b/kuzu-0.11.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c61daf02da35b671f4c6f3c17105725c399a5e14b7349b00eafbcd24ac90034a", size = 6991879 },
{ url = "https://files.pythonhosted.org/packages/54/9e/50d67d7bc08faed95ede6de1a6aa0d81079c98028ca99e32d09c2ab1aead/kuzu-0.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:682096cd87dcbb8257f933ea4172d9dc5617a8d0a5bdd19cd66cf05b68881afd", size = 4305706 },
{ url = "https://files.pythonhosted.org/packages/65/f0/5649a01af37def50293cd7c194afc19f09b343fd2b7f2b28e021a207f8ce/kuzu-0.11.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:17a11b67652e8b331c85cd1a1a30b32ee6783750084473abbab2aa1963ee2a3b", size = 3703740 },
{ url = "https://files.pythonhosted.org/packages/24/e2/e0beb9080911fc1689899a42da0f83534949f43169fb80197def3ec1223f/kuzu-0.11.2-cp313-cp313-macosx_11_0_x86_64.whl", hash = "sha256:bdded35426210faeca8da11e8b4a54e60ccc0c1a832660d76587b5be133b0f55", size = 4104073 },
{ url = "https://files.pythonhosted.org/packages/f2/4c/7a831c9c6e609692953db677f54788bd1dde4c9d34e6ba91f1e153d2e7fe/kuzu-0.11.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6116b609aac153f3523130b31295643d34a6c9509914c0fa9d804b26b23eee73", size = 6212263 },
{ url = "https://files.pythonhosted.org/packages/47/95/615ef10b46b22ec1d33fdbba795e6e79733d9a244aabdeeb910f267ab36c/kuzu-0.11.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09da5b8cb24dc6b281a6e4ac0f7f24226eb9909803b187e02d014da13ba57bcf", size = 6992492 },
{ url = "https://files.pythonhosted.org/packages/a7/dd/2c905575913c743e6c67a5ca89a6b4ea9d9737238966d85d7e710f0d3e60/kuzu-0.11.2-cp313-cp313-win_amd64.whl", hash = "sha256:c663fb84682f8ebffbe7447a4e552a0e03bd29097d319084a2c53c2e032a780e", size = 4305267 },
{ url = "https://files.pythonhosted.org/packages/89/05/44fbfc9055dba3f472ea4aaa8110635864d3441eede987526ef401680765/kuzu-0.11.2-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5c03fb95ffb9185c1519333f8ee92b7a9695aa7aa9a179e868a7d7bd13d10a16", size = 6216795 },
{ url = "https://files.pythonhosted.org/packages/4f/ca/16c81dc68cc1e8918f8481e7ee89c28aa665c5cb36be7ad0fc1d0d295760/kuzu-0.11.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d857f0efddf26d5e2dc189facb84bf04a997e395972486669b418a470cc76034", size = 6996333 },
{ url = "https://files.pythonhosted.org/packages/48/d8/9275c7e6312bd76dc670e8e2da68639757c22cf2c366e96527595a1d881c/kuzu-0.11.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb9e4641867c35b98ceaa604aa79832c0eeed41f5fd1b6da22b1c217b2f1b8ea", size = 6212202 },
{ url = "https://files.pythonhosted.org/packages/88/89/67a977493c60bca3610845df13020711f357a5d80bf91549e4b48d877c2f/kuzu-0.11.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553408d76a0b4fdecc1338b69b71d7bde42f6936d3b99d9852b30d33bda15978", size = 6992264 },
{ url = "https://files.pythonhosted.org/packages/b6/49/869ceceb1d8a5ea032a35c734e55cfee919340889973623096da7eb94f6b/kuzu-0.11.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:989a87fa13ffa39ab7773d968fe739ac4f8faf9ddb5dad72ced2eeef12180293", size = 6216814 },
{ url = "https://files.pythonhosted.org/packages/bc/cd/933b34a246edb882a042eb402747167719222c05149b73b48ba7d310d554/kuzu-0.11.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e67420d04a9643fd6376a23b17b398a3e32bb0c2bd8abbf8d1e4697056596c7e", size = 6996343 },
]
[[package]]
name = "langchain-core"
version = "0.3.74"
@ -992,6 +1067,7 @@ source = { virtual = "." }
dependencies = [
{ name = "azure-identity" },
{ name = "graphiti-core" },
{ name = "kuzu" },
{ name = "mcp" },
{ name = "openai" },
{ name = "pydantic-settings" },
@ -1024,8 +1100,9 @@ requires-dist = [
{ name = "anthropic", marker = "extra == 'providers'", specifier = ">=0.49.0" },
{ name = "azure-identity", specifier = ">=1.21.0" },
{ name = "google-genai", marker = "extra == 'providers'", specifier = ">=1.8.0" },
{ name = "graphiti-core", specifier = ">=0.16.0" },
{ name = "graphiti-core", editable = "../" },
{ name = "groq", marker = "extra == 'providers'", specifier = ">=0.2.0" },
{ name = "kuzu", specifier = ">=0.11.2" },
{ name = "mcp", specifier = ">=1.9.4" },
{ name = "openai", specifier = ">=1.91.0" },
{ name = "pydantic-settings", specifier = ">=2.0.0" },
@ -1037,7 +1114,7 @@ requires-dist = [
[package.metadata.requires-dev]
dev = [
{ name = "graphiti-core", specifier = ">=0.16.0" },
{ name = "graphiti-core", editable = "../" },
{ name = "httpx", specifier = ">=0.28.1" },
{ name = "mcp", specifier = ">=1.9.4" },
{ name = "pyright", specifier = ">=1.1.404" },