From 2e345698e456a0037ceeada4fe4991b51287fd96 Mon Sep 17 00:00:00 2001 From: Daniel Chalef <131175+danielchalef@users.noreply.github.com> Date: Sat, 30 Aug 2025 08:36:01 -0700 Subject: [PATCH] feat: Add KuzuDB support to MCP server and make it default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- mcp_server/config/config.yaml | 6 +- mcp_server/docker/docker-compose-kuzu.yml | 42 +++++++++++ mcp_server/pyproject.toml | 4 + mcp_server/src/config/schema.py | 10 ++- mcp_server/src/graphiti_mcp_server.py | 61 +++++++++++---- mcp_server/src/services/factories.py | 46 +++++++++++- mcp_server/uv.lock | 91 +++++++++++++++++++++-- 7 files changed, 237 insertions(+), 23 deletions(-) create mode 100644 mcp_server/docker/docker-compose-kuzu.yml diff --git a/mcp_server/config/config.yaml b/mcp_server/config/config.yaml index e8c1a575..637ef76d 100644 --- a/mcp_server/config/config.yaml +++ b/mcp_server/config/config.yaml @@ -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} diff --git a/mcp_server/docker/docker-compose-kuzu.yml b/mcp_server/docker/docker-compose-kuzu.yml new file mode 100644 index 00000000..7183659c --- /dev/null +++ b/mcp_server/docker/docker-compose-kuzu.yml @@ -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: \ No newline at end of file diff --git a/mcp_server/pyproject.toml b/mcp_server/pyproject.toml index 72f00834..217b48cb 100644 --- a/mcp_server/pyproject.toml +++ b/mcp_server/pyproject.toml @@ -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 } diff --git a/mcp_server/src/config/schema.py b/mcp_server/src/config/schema.py index a2ed36c2..ef7e75c6 100644 --- a/mcp_server/src/config/schema.py +++ b/mcp_server/src/config/schema.py @@ -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) diff --git a/mcp_server/src/graphiti_mcp_server.py b/mcp_server/src/graphiti_mcp_server.py index 617507fc..c7c19a2c 100644 --- a/mcp_server/src/graphiti_mcp_server.py +++ b/mcp_server/src/graphiti_mcp_server.py @@ -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', ) diff --git a/mcp_server/src/services/factories.py b/mcp_server/src/services/factories.py index 52131734..683685dc 100644 --- a/mcp_server/src/services/factories.py +++ b/mcp_server/src/services/factories.py @@ -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}') diff --git a/mcp_server/uv.lock b/mcp_server/uv.lock index 4bd1bda0..bc8e829c 100644 --- a/mcp_server/uv.lock +++ b/mcp_server/uv.lock @@ -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" },