Commit graph

696 commits

Author SHA1 Message Date
Daniel Chalef
422558d06c @ZLBillShaw has signed the CLA in getzep/graphiti#1085 2025-11-26 18:46:03 -08:00
Daniel Chalef
3ce3962e4b @apetti1920 has signed the CLA in getzep/graphiti#1084 2025-11-24 13:07:46 -08:00
Daniel Chalef
352977a002 @donbr has signed the CLA in getzep/graphiti#1081 2025-11-23 21:19:55 -08:00
Daniel Chalef
582e093582 @supmo668 has signed the CLA in getzep/graphiti#1072 2025-11-23 17:13:50 -08:00
Daniel Chalef
ae78828f9c
fix: replace deprecated gemini-2.5-flash-lite-preview with gemini-2.5-flash-lite (#1076)
fix: replace deprecated gemini-2.5-flash-lite-preview-06-17 with gemini-2.5-flash-lite

Updated all references to the deprecated Gemini model in:
- graphiti_core/llm_client/gemini_client.py
- graphiti_core/cross_encoder/gemini_reranker_client.py
- tests/llm_client/test_gemini_client.py
- README.md

This resolves 404 errors when using Gemini clients.

Fixes #1075

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

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Daniel Chalef <danielchalef@users.noreply.github.com>
2025-11-20 16:03:51 -08:00
Preston Rasmussen
d2654003ff
update summary character limit (#1073)
* update

* update tests
2025-11-18 17:16:02 -05:00
Daniel Chalef
8b7ad6f84c
Update default Anthropic model to claude-haiku-4-5 (#1070)
* Update default Anthropic model to claude-haiku-4-5-latest

- Add Claude 4.5 models to AnthropicModel type (claude-sonnet-4-5-latest, claude-sonnet-4-5-20250929, claude-haiku-4-5-latest)
- Change DEFAULT_MODEL from claude-3-7-sonnet-latest to claude-haiku-4-5-latest
- Update test assertions to reflect new default model

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Add Claude 4.5 models to max_tokens mapping

- Add claude-sonnet-4-5-latest, claude-sonnet-4-5-20250929, and claude-haiku-4-5-latest to ANTHROPIC_MODEL_MAX_TOKENS
- All Claude 4.5 models support 64K (65536) max output tokens
- Based on official Anthropic documentation

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Update uv.lock dependencies

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-15 09:07:18 -08:00
Didier Durand
de382071d1
[Doc]: fixing typos in various files (#1067) 2025-11-15 08:58:49 -08:00
Daniel Chalef
de9970f6f6
Bump v0.24.0 (#1066)
Update pyproject.toml
2025-11-14 10:30:39 -08:00
Didier Durand
177d34fc84
[Doc]: fixing typos in various files (#1065) 2025-11-14 08:35:19 -08:00
Matthew Mo
50bcb74502
Add dynamic max_tokens configuration for Anthropic models (#1043)
* Add dynamic max_tokens configuration for Anthropic models

Implements model-specific max output token limits for AnthropicClient,
following the same pattern as GeminiClient. This replaces the previous
hardcoded min() cap that was preventing models from using their full
output capacity.

Changes:
- Added ANTHROPIC_MODEL_MAX_TOKENS mapping with limits for all supported
  Claude models (ranging from 4K to 65K tokens)
- Implemented _get_max_tokens_for_model() to lookup model-specific limits
- Implemented _resolve_max_tokens() with clear precedence rules:
  1. Explicit max_tokens parameter
  2. Instance max_tokens from initialization
  3. Model-specific limit from mapping
  4. Default fallback (8192 tokens)

This allows edge_operations.py to request 16384 tokens for edge extraction
without being artificially capped, while ensuring cheaper models with lower
limits are still properly handled.

Resolves TODO in anthropic_client.py:207-208.

* Clarify that max_tokens mapping represents standard limits

Updated comments to explicitly state that ANTHROPIC_MODEL_MAX_TOKENS
represents standard limits without beta headers. This prevents confusion
about extended limits (e.g., Claude 3.7's 128K with beta header) which
are not currently implemented in this mapping.
2025-11-14 08:34:56 -08:00
Daniel Chalef
55ef6acb16
Add Azure OpenAI example with Neo4j (#1064)
* Add Azure OpenAI example with Neo4j

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Convert Azure OpenAI example to use uv

- Remove requirements.txt (uv uses pyproject.toml)
- Update README to use 'uv sync' and 'uv run'

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Update Azure OpenAI example to use gpt-4.1

- Change default deployment from gpt-4 to gpt-4.1
- Update README recommendations to prioritize gpt-4.1 models

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Remove model recommendations from Azure OpenAI example

Model recommendations quickly become outdated.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Add default Neo4j credentials to docker-compose

Set sensible defaults (neo4j/password) to prevent NEO4J_AUTH error
when .env file is not present.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Update Azure OpenAI documentation to use v1 API

- Simplified Azure OpenAI setup using AsyncOpenAI with v1 endpoint
- Updated main README with clearer Quick Start example
- Removed outdated API version configuration
- Updated example deployment to gpt-5-mini
- Added note about v1 API endpoint format

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Update LLMConfig to include both model and small_model

Both parameters are needed for proper LLM configuration.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Address PR review feedback

- Remove flawed validation check in azure_openai_neo4j.py
- Remove unused azure-identity dependency
- Update docstrings to reflect dual client support (AsyncAzureOpenAI and AsyncOpenAI)

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

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-14 08:34:35 -08:00
Daniel Chalef
90d7757c17
Use OpenAI structured output API for response validation (#1061)
* Use OpenAI structured output API for response validation

Replace prompt-based schema injection with native json_schema response format. This improves token efficiency and reliability by having OpenAI enforce the schema directly instead of embedding it in the prompt message.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Add type ignore for response_format to fix pyright error

* Increase OpenAIGenericClient max_tokens to 16K and update docs

- Set default max_tokens to 16384 (16K) for OpenAIGenericClient to better support local models
- Add documentation note clarifying OpenAIGenericClient should be used for Ollama and LM Studio
- Previous default was 8192 (8K)

* Refactor max_tokens override to use constructor parameter pattern

- Add max_tokens parameter to __init__ with 16K default
- Override self.max_tokens after super().__init__() instead of mutating config
- Consistent with OpenAIBaseClient and AnthropicClient patterns
- Avoids unintended config mutation side effects

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-11 06:53:37 -08:00
Daniel Chalef
d4a92772ec
Bump graphiti-core to v0.23.1 in mcp_server (#1060)
* Bump graphiti-core to v0.23.1 in mcp_server and consolidate dev dependencies

- Updated graphiti-core from 0.23.0 to 0.23.1 in pyproject.toml and dockerfiles
- Moved all dev dependencies to [dependency-groups].dev (uv's preferred approach)
- Removed redundant [project.optional-dependencies].dev section
- Eliminated duplicate graphiti-core and mcp entries from dev dependencies

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix dev dependencies being installed in Docker containers

Added --no-group dev flag to uv sync in Dockerfiles. The --no-dev flag only
excludes [project.optional-dependencies].dev, but doesn't exclude
[dependency-groups].dev which we now use.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Add --no-sync flag to uv run in Dockerfiles

The uv run command was re-syncing dependencies at runtime and installing dev
groups despite uv sync --no-group dev. Using --no-sync tells uv to use the
already-synced dependencies without re-checking.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Make sed pattern version-agnostic in Dockerfiles

Changed hardcoded version pattern from >=0\.23\.1 to >=[0-9.]\+ so the
Dockerfiles don't need to be updated every time graphiti-core version is
bumped in pyproject.toml.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Remove redundant --no-dev flag from uv sync

Since we removed [project.optional-dependencies].dev, the --no-dev flag no
longer has any effect. Only --no-group dev is needed to exclude dev
dependency-groups.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Use more precise semver regex in sed patterns

Changed from [0-9.]\+ to [0-9]\+\.[0-9]\+\.[0-9]\+ to match proper semantic
versions (e.g., 0.23.1) and avoid matching invalid patterns like .... or
1.2.3.4.5.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix version inconsistencies and add regex end anchor

- Updated MCP_SERVER_VERSION from 1.0.0rc0/1.0.0 to 1.0.1 to match pyproject.toml
- Added $ end-of-line anchor to sed patterns to prevent matching partial strings

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

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-09 09:47:43 -08:00
Daniel Chalef
bb9b33ef6b
Bump version to 0.23.1 (#1058)
🤖 Generated with Claude Code

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-08 18:40:00 -08:00
Gal Shubeli
9d023eb400
Fix entity edge save (#1013)
save-edge-properties
2025-11-08 18:32:51 -08:00
Daniel Chalef
d97c248551
Fix MCP server telemetry and update graphiti-core to v0.23.0 (#1057)
* Fix MCP server telemetry and update graphiti-core to v0.23.0

- Regenerate uv.lock in Docker builds to ensure posthog dependency is included
- Update graphiti-core version to 0.23.0 across all configurations
- Fix Python 3.11 compatibility for Pydantic TypedDict import
- Add FalkorDB Browser UI access information to startup logs

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Add typing-extensions as explicit dependency

Required for Python 3.11 compatibility with Pydantic 2.11.7,
which mandates typing_extensions.TypedDict on Python < 3.12.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Use built-in TypedDict from typing module

Python 3.10+ includes TypedDict in the standard library.
Removed typing-extensions dependency as it's unnecessary.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Revert to typing_extensions.TypedDict for Pydantic compatibility

Pydantic requires typing_extensions.TypedDict on Python < 3.12.
Docker container uses Python 3.11, so this is necessary.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Add Ruff linter rule to prevent typing.TypedDict usage

Adds banned-api configuration to both main and MCP server pyproject.toml
files to enforce typing_extensions.TypedDict usage, required for
Pydantic compatibility on Python < 3.12.

Also includes Ruff auto-formatting changes to quote styles.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Bump MCP server version to 1.0.1

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

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-08 18:31:24 -08:00
Daniel Chalef
d01e3c5df9
Bump version to 0.23.0 (#1056)
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-08 11:06:15 -08:00
Jack Ryan
674619cc89
Update Zep comparison table description (#1046)
Clarify Zep's positioning as a fully managed platform for context engineering and AI memory.

🤖 Generated with Claude Code

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-06 14:40:42 -06:00
Daniel Chalef
c0f1ae9270 @Galleons2029 has signed the CLA in getzep/graphiti#1053 2025-11-06 00:39:58 -08:00
Daniel Chalef
299b581bbe
Fix: Enable FalkorDB Browser startup in MCP Server Docker image (#1045)
* Fix: Enable FalkorDB Browser startup in MCP Server Docker image

This fix addresses issue #1041 where the FalkorDB Browser web UI was not
starting automatically in the combined FalkorDB + MCP Server Docker image.

Changes:
- Modified start-services.sh script in Dockerfile to include browser startup logic
- Browser now starts automatically when BROWSER=1 (default behavior)
- Can be disabled by setting BROWSER=0 environment variable
- Browser logs are written to /var/log/graphiti/browser.log
- Added safety checks to verify browser files exist before starting

Updated documentation:
- Added BROWSER environment variable to docker-compose.yml
- Documented BROWSER variable in README-falkordb-combined.md
- Added section explaining how to disable the browser
- Updated architecture diagrams to show browser process

The fix follows the upstream FalkorDB image pattern where the browser
starts with HOSTNAME="0.0.0.0" on port 3000.

Resolves #1041

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

Co-authored-by: Daniel Chalef <danielchalef@users.noreply.github.com>

* Fix: Add missing port 3000 mapping to BROWSER=0 example

The docker run example for disabling the browser was missing the -p 3000:3000
port mapping, which should be included for reference even when BROWSER=0.

Co-authored-by: Daniel Chalef <danielchalef@users.noreply.github.com>

* default to browser enabled

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Daniel Chalef <danielchalef@users.noreply.github.com>
2025-11-05 11:04:00 -08:00
Daniel Chalef
3627acd81e
Enable FalkorDB fulltext search tests (#1050)
Testing revealed that all FalkorDB fulltext search tests pass successfully.
The skip was added in PR #872 without explanation and appears to be unnecessary.
Removed FalkorDB from the skip conditions, keeping only Kuzu skipped (which
legitimately doesn't support dynamic fulltext index creation).

Tests verified passing locally with FalkorDB 1.2.3.

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

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-05 10:32:10 -08:00
Daniel Chalef
f7816c29b3
Implement build_indices_and_constraints for Kuzu and Neptune drivers (#1048)
* Implement build_indices_and_constraints for Kuzu and Neptune drivers

Both Kuzu and Neptune drivers were missing the build_indices_and_constraints
method required by the abstract GraphDriver base class. Kuzu uses a no-op
implementation since indices are created during schema setup. Neptune delegates
to its existing OpenSearch (AOSS) index creation logic.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Skip fulltext search tests for Kuzu driver

Kuzu requires explicit schema definition and doesn't support dynamic fulltext
index creation like Neo4j or FalkorDB. These tests were already being skipped
for FalkorDB for similar reasons. Updated all four fulltext search tests to
skip for both FalkorDB and Kuzu providers.

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

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-05 11:51:59 -05:00
Daniel Chalef
50659cc805
Disable fork PR comment job in workflow (#1047)
Disable fork PR comment job in Claude Code review workflow

The notify-external-contributor job fails with "Resource not accessible by integration" error when triggered by PRs from forks. GitHub security restrictions limit fork PRs to read-only GITHUB_TOKEN, preventing comment creation despite having pull-requests:write permissions.

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

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-05 08:31:06 -08:00
Gal Shubeli
c144ff5995
[Improvement] Add GraphID isolation support for FalkorDB multi-tenant architecture (#835)
* Update node_db_queries.py

* Update node_db_queries.py

* graph-per-graphid

* fix-groupid-usage

* ruff-fix

* rev-driver-changes

* rm-un-changes

* fix lint

---------

Co-authored-by: Naseem Ali <34807727+Naseem77@users.noreply.github.com>
2025-11-03 10:56:53 -05:00
Daniel Chalef
8d99984204
Fix Azure structured completions (#1039)
update azure azure structured parsing
2025-11-01 18:40:43 -07:00
Daniel Chalef
9cc04e61c9
Fix MCP server release workflow to build all Dockerfile variants (#1037)
* conductor-checkpoint-start

* conductor-checkpoint-msg_0121yRVkMGS2UzMazKiZkgi4

* conductor-checkpoint-msg_01NvLs9EFt8qNiQqtYY8V9WV

* conductor-checkpoint-msg_013iKczSUmjtzPEdcgciXJUd

* conductor-checkpoint-msg_01BFgirbgmehsEGCMWjgSsnv

* conductor-checkpoint-msg_01TA4DYecHTJ36ndBsU9ooyf

* Fix critical issues in MCP release workflow

Address all critical review comments:

1. Fix malformed Docker tags
   - Change tag suffixes from colons to hyphens
   - standalone: 1.0.0-standalone (not 1.0.0:standalone)
   - combined: 1.0.0 and latest (not :latest)

2. Add checkout ref for manual triggers
   - Use inputs.tag for workflow_dispatch events
   - Ensures manual builds use correct tag ref

3. Add tag input validation
   - Validate tag format (mcp-vX.Y.Z) before processing
   - Provide clear error messages for invalid input

4. Fix release summary overwriting
   - Both matrix jobs now append to summary correctly
   - Each variant creates distinct summary section

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_01H4GqBSkLiPgUfHGD57nq5V

* conductor-checkpoint-msg_01T2zdZLAZpVSip6EaiYa66k

* Address code review findings - fix critical checkout ref bug

Fix all critical and high-priority issues from code review:

1. Fix checkout ref logic (CRITICAL)
   - Simplified to: ref: ${{ inputs.tag || github.ref }}
   - Works correctly for both workflow_dispatch and push events
   - Removes conditional logic that would fail for manual triggers

2. Consolidate tag validation
   - Remove duplicate validation logic
   - Single validation path for both trigger types
   - Clearer error messages with received value

3. Add PyPI error handling
   - Use curl -sf for proper error codes
   - Validate GRAPHITI_VERSION is not empty
   - Exit with clear error if PyPI fetch fails

4. Improve docker-compose comments
   - Add concrete version tag examples
   - Show users how to pin specific versions
   - Clarify when local build vs registry pull is used

5. Update workflow_dispatch description
   - Clarify tag must already exist in repo
   - Prevent user confusion about tag creation

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_01KgG6FyiqNNdc51BCehNBjm

* Fix error handling bug in PyPI version fetch

The previous error handling was broken due to set -e causing
immediate exit, making the $? check unreachable.

Changes:
- Use set -eo pipefail for proper pipeline error handling
- Check command success with if ! command; then pattern
- Separate check for empty version string
- Both checks now properly reachable and functional

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

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-30 23:47:19 -07:00
Daniel Chalef
375023b9e8
feat: MCP Server v1.0.0 - Modular architecture with multi-provider support (#1024)
* feat: MCP Server v1.0.0rc0 - Complete refactoring with modular architecture

This is a major refactoring of the MCP Server to support multiple providers
through a YAML-based configuration system with factory pattern implementation.

## Key Changes

### Architecture Improvements
- Modular configuration system with YAML-based settings
- Factory pattern for LLM, Embedder, and Database providers
- Support for multiple database backends (Neo4j, FalkorDB, KuzuDB)
- Clean separation of concerns with dedicated service modules

### Provider Support
- **LLM**: OpenAI, Anthropic, Gemini, Groq
- **Embedders**: OpenAI, Voyage, Gemini, Anthropic, Sentence Transformers
- **Databases**: Neo4j, FalkorDB, KuzuDB (new default)
- Azure OpenAI support with AD authentication

### Configuration
- YAML configuration with environment variable expansion
- CLI argument overrides for runtime configuration
- Multiple pre-configured Docker Compose setups
- Proper boolean handling in environment variables

### Testing & CI
- Comprehensive test suite with unit and integration tests
- GitHub Actions workflows for linting and testing
- Multi-database testing support

### Docker Support
- Updated Docker images with multi-stage builds
- Database-specific docker-compose configurations
- Persistent volume support for all databases

### Bug Fixes
- Fixed KuzuDB connectivity checks
- Corrected Docker command paths
- Improved error handling and logging
- Fixed boolean environment variable expansion

Co-authored-by: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_01PmXwij9S976CQk798DJ4PH

* fix: Improve MCP server configuration and initialization

- Fix API key detection: Remove hardcoded OpenAI checks, let factories handle provider-specific validation
- Fix .env file loading: Search for .env in mcp_server directory first
- Change default transport to SSE for broader compatibility (was stdio)
- Add proper error handling with warnings for failed client initialization
- Model already defaults to gpt-4o as requested

These changes ensure the MCP server properly loads API keys from .env files
and creates the appropriate LLM/embedder clients based on configuration.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_01PCGAWzQUbmh7hAKBvadbYN

* chore: Update default transport from SSE to HTTP

- Changed default transport to 'http' as SSE is deprecated
- Updated all configuration files to use HTTP transport
- Updated Docker compose commands to use HTTP transport
- Updated comments to reflect HTTP transport usage

This change ensures the MCP server uses the recommended HTTP transport
instead of the deprecated SSE transport.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_01FErZjFG5iWrvbdUD2acQwQ

* chore: Update default OpenAI model to gpt-4o-mini

Changed the default LLM model from gpt-4o to gpt-4o-mini across all
configuration files for better cost efficiency while maintaining quality.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_01FETp6u9mWAMjJAeT6WFgAf

* conductor-checkpoint-msg_01AJJ48RbkPaZ99G2GmE6HUi

* fix: Correct default OpenAI model to gpt-4.1

Changed the default LLM model from gpt-4o-mini to gpt-4.1 as requested.
This is the latest GPT-4 series model.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_013HP1MYHKZ5wdTHHxrpBaT9

* fix: Update hardcoded default model to gpt-4.1 and fix config path

- Changed hardcoded default in schema.py from gpt-4o to gpt-4.1
- Fixed default config path to look in config/config.yaml relative to mcp_server directory
- This ensures the server uses gpt-4.1 as the default model everywhere

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_01EaN8GZtehm8LV3a7CdWJ8u

* feat: Add detailed server URL logging and improve access information

- Added comprehensive logging showing exact URLs to access the MCP server
- Display localhost instead of 0.0.0.0 for better usability
- Show MCP endpoint, transport type, and status endpoint information
- Added visual separators to make server info stand out in logs

This helps users understand exactly how to connect to the MCP server
and troubleshoot connection issues.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_01SNpbaZMdxWbefo2zsLprcW

* fix: Correct MCP HTTP endpoint path from / to /mcp/

- Remove incorrect /status endpoint reference
- Update logging to show correct MCP endpoint at /mcp/
- Align with FastMCP documentation standards

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_01417YVh3s6afJadN5AM5Ahk

* fix: Configure consistent logging format between uvicorn and MCP server

- Use simplified format matching uvicorn's default (LEVEL message)
- Remove timestamps from custom logger format
- Suppress verbose MCP and uvicorn access logs
- Improve readability of server startup output

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_014BF6Kzdy7qXc5AgC7eeVa5

* conductor-checkpoint-msg_01TscHXmijzkqcTJX5sGTYP8

* conductor-checkpoint-msg_01Q7VLFTJrtmpkaB7hfUzZLP

* fix: Improve test runner to load API keys from .env file

- Add dotenv loading support in test runner
- Fix duplicate os import issue
- Improve prerequisite checking with helpful hints
- Update error messages to guide users

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_01NfviLNeAhFDA1G5841YKCS

* conductor-checkpoint-msg_015EewQhKbqAGSQkasWtRQjp

* fix: Fix all linting errors in test suite

- Replace bare except with except Exception
- Remove unused imports and variables
- Fix type hints to use modern syntax
- Apply ruff formatting for line length
- Ensure all tests pass linting checks

* conductor-checkpoint-msg_01RedNheKT4yWyXcM83o3Nmv

* fix: Use contextlib.suppress instead of try-except-pass (SIM105)

- Replace try-except-pass with contextlib.suppress in test_async_operations.py
- Replace try-except-pass with contextlib.suppress in test_fixtures.py
- Fixes ruff SIM105 linting errors

* conductor-checkpoint-msg_01GuBj69k2CsqgojBsGJ2zFT

* fix: Move README back to mcp_server root folder

The main README for the MCP server should be in the root of the mcp_server folder for better discoverability

* conductor-checkpoint-msg_01VsJQ3MgDxPwyb4ynvswZfb

* docs: Update README with comprehensive features and database options

- Add comprehensive features list including all supported databases, LLM providers, and transports
- Document Kuzu as the default database with explanation of its benefits and archived status
- Add detailed instructions for running with different databases (Kuzu, Neo4j, FalkorDB)
- Update transport references from SSE to HTTP (default transport)
- Add database-specific Docker Compose instructions
- Update MCP client configurations to use /mcp/ endpoint
- Clarify prerequisites to reflect optional nature of external databases
- Add detailed database configuration examples for all supported backends

* conductor-checkpoint-msg_018Z7AjbTkuDfhqdjB9iGbbD

* docs: Address README review comments

- Shorten Kuzu database description to be more concise
- Update Ollama model example to use 'gpt-oss:120b'
- Restore Azure OpenAI environment variables documentation
- Remove implementation details from Docker section (irrelevant to container users)
- Clarify mcp-remote supports both HTTP and SSE transports

Addresses review comments #1-7 on the PR

* conductor-checkpoint-msg_01QMeMEMe9rTVDgd8Ce5hmXp

* docs: Remove SSE transport reference from Claude Desktop section

Since the MCP server no longer supports SSE transport, removed the
mention of SSE from the mcp-remote description. The server only
uses HTTP transport.

Addresses review comment on line 514

* conductor-checkpoint-msg_01DNn76rvpx7rmTBwsUQd1De

* docs: Remove telemetry from features list

Telemetry is not a feature but a notice about data collection,
so it shouldn't be listed as a feature.

Addresses review comment on line 29

* conductor-checkpoint-msg_01Jcb8sm9bpqB9Ksz1W6YrSz

* feat: Update default embedding model to text-embedding-3-small

Replace outdated text-embedding-ada-002 with the newer, more efficient
text-embedding-3-small model as the default embedder. The new model
offers better performance and is more cost-effective.

Updated:
- config/config.yaml: Changed default model
- README.md: Updated documentation to reflect new default

* conductor-checkpoint-msg_016AXAH98nYKTj5WCueBubmA

* fix: Resolve database connection and episode processing errors

Fixed two critical runtime errors:

1. Database connection check for KuzuDB
   - KuzuDB session.run() returns None, causing async iteration error
   - Added special handling for KuzuDB (in-memory, no query needed)
   - Other databases (Neo4j, FalkorDB) still perform connection test

2. Episode processing parameter error
   - Changed 'episode_type' parameter to 'source' to match Graphiti API
   - Added required 'reference_time' parameter with current timestamp
   - Added datetime imports (UTC, datetime)

Errors fixed:
- 'async for' requires an object with __aiter__ method, got NoneType
- Graphiti.add_episode() got an unexpected keyword argument 'episode_type'

* conductor-checkpoint-msg_01JvcW97a4s3icDWFkhF3kEJ

* fix: Use timezone.utc instead of UTC for Python 3.10 compatibility

The UTC constant was added in Python 3.11. Changed to use
timezone.utc which is available in Python 3.10+.

Fixed ImportError: cannot import name 'UTC' from 'datetime'

* conductor-checkpoint-msg_01Br69UnYf8QXvtAhJVTuDGD

* fix: Convert entity_types from list to dict for Graphiti API

The Graphiti add_episode() API expects entity_types as a
dict[str, type[BaseModel]], not a list. Changed entity type
building to create a dictionary mapping entity names to their
Pydantic model classes.

Fixed error: 'list' object has no attribute 'items'

Changes:
- Build entity_types as dict instead of list in config processing
- Add fallback to convert ENTITY_TYPES list to dict if needed
- Map entity type names to their model classes

* conductor-checkpoint-msg_0173SR9CxbBH9jVWp8tLooRp

* conductor-checkpoint-msg_0169v3hqZG1Sqb13Kp1Vijms

* fix: Remove protected 'name' attribute from entity type models

Pydantic BaseModel reserves 'name' as a protected attribute. Removed
the 'name' attribute from dynamically created entity type models as
it's not needed - the entity type name is already stored as the class
name and dict key.

Fixed error: name cannot be used as an attribute for Requirement as
it is a protected attribute name.

* conductor-checkpoint-msg_0118QJWvZLyoZfwb1UWZqrRa

* conductor-checkpoint-msg_01B78jtT59YDt1Xm5hJpoqQw

* conductor-checkpoint-msg_01MsqeFGoCEXpoNMiDRM3Gjh

* conductor-checkpoint-msg_01SwJkCDAScffk8116KPVpTd

* conductor-checkpoint-msg_01EBWwDRC8bZ7oLYxsrmVnLH

* conductor-checkpoint-msg_01SAcxuF3eqtP4exA47CBqAi

* conductor-checkpoint-msg_011dRKwJM31K3ob9Gy4JCmae

* conductor-checkpoint-msg_018d52yUXdPF48UBWPQdiB4W

* conductor-checkpoint-msg_01MGFAenMDnTX3H9HSZEbj2T

* conductor-checkpoint-msg_01MHw4g8TicrXegSK9phncfw

* conductor-checkpoint-msg_018YrqWa3c2ZpkxemiiaE9tA

* conductor-checkpoint-msg_01SNsax9AwiCBFrC7Fpo7BNe

* conductor-checkpoint-msg_01K7QC1X8iPiYaMdvbi7WtR5

* conductor-checkpoint-msg_01KgGgzpbiuM31KWKxQhNBfY

* conductor-checkpoint-msg_01KL3wzQUn3gekDmznXVgXne

* conductor-checkpoint-msg_016GKc3DYwYUjngGw8pArRJK

* conductor-checkpoint-msg_01QLbhPMGDeB5EHbMq5KT86U

* conductor-checkpoint-msg_01Qdskq96hJ6Q9DPg1h5Jjgg

* conductor-checkpoint-msg_01JhPXYdc6HGsoEW2f1USSyd

* conductor-checkpoint-msg_018NLrtFxs5zfcNwQnNCfvNg

* conductor-checkpoint-msg_01G1G9J7cbupmLkyiQufj335

* conductor-checkpoint-msg_01BHEPsv2EML14gFa6vkn1NP

* conductor-checkpoint-msg_0127MeSvxWk8BLXjB5k3wDJY

* conductor-checkpoint-msg_018dRGHW6fPNqJDN6eV6SpoH

* conductor-checkpoint-msg_01CPPZ9JKakjsmHpzzoFVhaM

* conductor-checkpoint-msg_014jJQ4FkGU4485gF41K2suG

* conductor-checkpoint-msg_01MS72hQDCrr1rB6GSd3zy4h

* conductor-checkpoint-msg_01P7ur6mQEusfHTYpBrBnpk3

* conductor-checkpoint-msg_01JiEiEuJN3sQXheqMzCa6hX

* conductor-checkpoint-msg_01D7XfEJqzTeKGyuE5EFmjND

* conductor-checkpoint-msg_01Gn6qZrD3DZd8c6a6fmMap7

* conductor-checkpoint-msg_01Ji7gxCG4jR145rBAupwU49

* conductor-checkpoint-msg_01CYzyiAtLo95iVLeqWSuYiR

* conductor-checkpoint-msg_017fAeUG21Ym1EeofanFzFGa

* conductor-checkpoint-msg_013rt24pyzMHbrmEQein2dJJ

* conductor-checkpoint-msg_016bN3uyAxN28Rh8uvDpExit

* conductor-checkpoint-msg_017QV6m73ShaMBdQi7L3kmhP

* conductor-checkpoint-msg_01LUZ9XS7C1LCG6A1VFNcRL2

* conductor-checkpoint-msg_0136b9tNU5ko18T3PmRkW3LJ

* conductor-checkpoint-msg_018FX6Mibr66cKLnpL84f2Js

* conductor-checkpoint-msg_01WRZxPMQYjNEjcFNTMzWYeL

* conductor-checkpoint-msg_015Tbxjxrj6dynf7TbZscFD3

* conductor-checkpoint-msg_01ELC9AyZZGry9tN4XKrwEM6

* conductor-checkpoint-msg_01Jk4ugkAqMs4iRYWwnaNAHR

* conductor-checkpoint-msg_01NLStrCDq7HZJy3pKyGSqxM

* conductor-checkpoint-msg_01BFZEVpXbdxuXJguFH3caek

* Remove User and Assistant exception from Preference prioritization

* conductor-checkpoint-msg_01JP4eGXZfEjoSXWUwTHNYoJ

* Add combined FalkorDB + MCP server Docker image

- Created Dockerfile.falkordb-combined extending official FalkorDB image
- Added startup script to run both FalkorDB daemon and MCP server
- Created docker-compose-falkordb-combined.yml for simplified deployment
- Added comprehensive README-falkordb-combined.md documentation
- Updated main README with Option 4 for combined image
- Single container solution for development and single-node deployments

* conductor-checkpoint-msg_01PRJ1fre9d6J4qgBmCBQhCu

* Fix Dockerfile syntax version and Python compatibility

- Set Dockerfile syntax to version 1 as requested
- Use Python 3.11 from Debian Bookworm instead of 3.12
- Add comment explaining Bookworm ships with Python 3.11
- Python 3.11 meets project requirement of >=3.10
- Build tested successfully

* conductor-checkpoint-msg_011Thrsv6CjZKRCXvordMWeb

* Fix combined FalkorDB image to run both services successfully

- Override FalkorDB ENTRYPOINT to use custom startup script
- Use correct FalkorDB module path: /var/lib/falkordb/bin/falkordb.so
- Create config-docker-falkordb-combined.yaml with localhost URI
- Create /var/lib/falkordb/data directory for persistence
- Both FalkorDB and MCP server now start successfully
- Tested: FalkorDB ready, MCP server running on port 8000

* conductor-checkpoint-msg_01FT3bsTuv7466EvCeRtgDsD

* Fix health check to eliminate 404 errors

- Changed health check to only verify FalkorDB (redis-cli ping)
- Removed non-existent /health endpoint check
- MCP server startup is visible in logs
- Container now runs without health check errors

* conductor-checkpoint-msg_01KWBc5S8vWzyovUTWLvPYNw

* Replace Kuzu with FalkorDB as default database

BREAKING CHANGE: Kuzu is no longer supported. FalkorDB is now the default.

- Renamed Dockerfile.falkordb-combined to Dockerfile (default)
- Renamed docker-compose-falkordb-combined.yml to docker-compose.yml (default)
- Updated config.yaml to use FalkorDB with localhost:6379 as default
- Removed Kuzu from pyproject.toml dependencies (now only falkordb extra)
- Updated Dockerfile to use graphiti-core[falkordb] instead of [kuzu,falkordb]
- Completely removed all Kuzu references from README
- Updated README to document FalkorDB combined container as default
- Docker Compose now starts single container with FalkorDB + MCP server
- Prerequisites now require Docker instead of Python for default setup
- Removed old Kuzu docker-compose files

Running from command line now requires external FalkorDB instance at localhost:6379

* conductor-checkpoint-msg_014wBY9WG9GRXP7cUZ2JiqGz

* Complete Kuzu removal from MCP server

Removed all remaining Kuzu references from:
- Test fixtures (test_fixtures.py): Changed default database to falkordb, removed kuzu configuration
- Test runner (run_tests.py): Removed kuzu from database choices, checks, and markers
- Integration tests (test_comprehensive_integration.py): Removed kuzu from parameterized tests and environment setup
- Test README: Updated all examples and documentation to reflect falkordb as default
- Docker README: Completely rewrote to remove KuzuDB section, updated with FalkorDB combined image as default

All Kuzu support has been completely removed from the MCP server codebase. FalkorDB (via combined container) is now the default database backend.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_01FAgmoDFBPETezbBr18Bpir

* Fix Anthropic client temperature type error

Fixed pyright type error where temperature parameter (float | None) was being passed directly to Anthropic's messages.create() method which expects (float | Omit).

Changes:
- Build message creation parameters as a dictionary
- Conditionally include temperature only when not None
- Use dictionary unpacking to pass parameters

This allows temperature to be properly omitted when None, rather than passing None as a value.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_01KEuAQucnvsH94BwFgCAQXg

* Fix critical PR review issues

Fixed high-impact issues from PR #1024 code review:

1. **Boolean conversion bug (schema.py)**
   - Fixed _expand_env_vars returning strings 'true'/'false' instead of booleans
   - Now properly converts boolean-like strings (true/false/1/0/yes/no/on/off) to actual booleans
   - Simplified logic by removing redundant string-to-string conversions
   - Added support for common boolean string variations

2. **Dependency management (pyproject.toml)**
   - Removed pytest from main dependencies (now only in dev dependencies)
   - Moved azure-identity to optional dependencies under new [azure] group
   - Prevents forcing Azure and testing dependencies on all users

3. **Conditional Azure imports (utils.py)**
   - Made azure-identity import conditional in create_azure_credential_token_provider()
   - Raises helpful ImportError with installation instructions if not available
   - Follows lazy-import pattern for optional dependencies

4. **Documentation fix (graphiti_mcp_server.py)**
   - Fixed confusing JSON escaping in add_memory docstring example
   - Changed from triple-backslash escaping to standard JSON string
   - Updated comment to clarify standard JSON escaping is used

Issues verified as already fixed:
- Docker build context (all docker-compose files use context: ..)

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_013aEa7tUV8rEmfw38BzJatc

* Add comprehensive SEMAPHORE_LIMIT documentation

Added detailed documentation for SEMAPHORE_LIMIT configuration to help users optimize episode processing concurrency based on their LLM provider's rate limits.

Changes:

1. **graphiti_mcp_server.py**
   - Expanded inline comments from 3 lines to 26 lines
   - Added provider-specific tuning guidelines (OpenAI, Anthropic, Azure, Ollama)
   - Documented symptoms of too-high/too-low settings
   - Added monitoring recommendations

2. **README.md**
   - Expanded "Concurrency and LLM Provider 429 Rate Limit Errors" section
   - Added tier-specific recommendations for each provider
   - Explained relationship between episode concurrency and LLM request rates
   - Added troubleshooting symptoms and monitoring guidance
   - Included example .env configuration

3. **config.yaml**
   - Added header comment referencing detailed documentation
   - Noted default value and suitable use case

4. **.env.example**
   - Added SEMAPHORE_LIMIT with inline tuning guidelines
   - Quick reference for all major LLM provider tiers
   - Cross-reference to README for full details

Benefits:
- Users can now make informed decisions about concurrency settings
- Reduces likelihood of 429 rate limit errors from misconfiguration
- Helps users maximize throughput within their rate limits
- Provides clear troubleshooting guidance

Addresses PR #1024 review comment about magic number documentation.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_017netxNYzmam5Cu8PM2uQXW

* conductor-checkpoint-msg_012B8ESfBFcMeG3tFimpjbce

* conductor-checkpoint-msg_01Xe46bzgCGV4c8g4piPtSMQ

* conductor-checkpoint-start

* conductor-checkpoint-msg_01QPZK2pa2vUMpURRFmX93Jt

* conductor-checkpoint-msg_01UU5jQcfrW5btRJB3zy5KQZ

* conductor-checkpoint-msg_01884eN3wprtCkrEgEaRDzko

* conductor-checkpoint-msg_01GC2fQiu9gLGPGf8SvG5VW8

* conductor-checkpoint-msg_018ZD567wd4skoiAz7oML7WX

* conductor-checkpoint-msg_01C3AxzcQQSNZxJcuVxAMYpG

* conductor-checkpoint-msg_014w5iHAnv7mVkKfTroeNkuM

* docs: Add current LLM model reference to CLAUDE.md

Added comprehensive model reference section documenting valid model names for OpenAI, Anthropic, and Google Gemini as of January 2025.

OpenAI Models:
- GPT-5 family (reasoning models): gpt-5-mini, gpt-5-nano
- GPT-4.1 family (standard models): gpt-4.1, gpt-4.1-mini, gpt-4.1-nano
- Legacy models: gpt-4o, gpt-4o-mini

Anthropic Models:
- Claude 3.7 family (latest)
- Claude 3.5 family
- Legacy Claude 3 models

Google Gemini Models:
- Gemini 2.5 family (latest)
- Gemini 2.0 family (experimental)
- Gemini 1.5 family (stable)

This documents that model names like gpt-5-mini, gpt-4.1, and gpt-4.1-mini used throughout the codebase are valid OpenAI model identifiers, not errors.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_014JsovjGyTM1mGwR1nVWLvX

* conductor-checkpoint-msg_013ooHLBEhPccaSY4cFse8vK

* conductor-checkpoint-msg_01WfmUCwXhWxEFtV7R3zJLwT

* conductor-checkpoint-msg_01SbjZ9mm9YwqeJHTDUDoKU8

* conductor-checkpoint-msg_01T2cR1aXUjNSegqzXQcW2jC

* conductor-checkpoint-msg_01EnQy5A9dMFD8F11hWKvzGo

* conductor-checkpoint-msg_01R1zsLmxvwjZ9SwKNhSnQAv

* refactor: Remove duplicate is_reasoning_model calculation in factories.py

* conductor-checkpoint-msg_015oLk8qck3TbfaCryY9gngJ

* conductor-checkpoint-msg_018YAxG5GsLq1dBMuGE6kwEJ

* conductor-checkpoint-msg_014fda5sUsvofb537BvqkuBY

* fix: Change default transport to http, mark SSE as deprecated

* conductor-checkpoint-msg_01S3x8oHkFTM2x4ZiT81QetV

* conductor-checkpoint-msg_01AVxUgejEA9piS6narw4omz

* conductor-checkpoint-msg_019W9KoNBmkobBguViYUj18s

* conductor-checkpoint-msg_01S2mYUmqLohxEmoZaNqsm2f

* conductor-checkpoint-msg_013ZGKfZjdDsqiCkAjAiuEk7

* fix: Handle default config path and empty env vars correctly

- Change default config path from 'config.yaml' to 'config/config.yaml'
- Fix env var expansion to return None for empty strings instead of False
- Prevents validation errors when optional string fields have unset env vars

* conductor-checkpoint-msg_01Bx1BqH3BaBxHMrnsbUQXww

* fix: Allow None for episode_id_prefix and convert to empty string

- Change episode_id_prefix type to str | None to accept None from YAML
- Add model_post_init to convert None to empty string for backward compatibility

* conductor-checkpoint-msg_01CXVkHJC8gp5i395MQMhp6D

* feat: Add helpful error message for database connection failures

- Catch Redis/database connection errors during initialization
- Provide clear, formatted error messages with startup instructions
- Include provider-specific guidance (FalkorDB vs Neo4j)
- Improves developer experience when database is not running

* conductor-checkpoint-msg_01Cd9u1z7pqmX1EG7vXXo4GA

* feat: Add specific Neo4j connection error message with startup instructions

* conductor-checkpoint-msg_01XgbmgFaUMPopni4Q8EhG23

* fix: Remove obsolete KuzuDB check from status endpoint

- Remove dead code checking for 'kuzu' provider (was removed)
- Simplify status check to use configured database provider directly
- Status now correctly reports neo4j or falkordb based on config

* conductor-checkpoint-msg_01WLjwygBwfvbJcVoUMDV3h6

* fix: Use service config instead of global config in status endpoint

- Changed status check to use graphiti_service.config.database.provider
- Ensures status reports the actual running database, not potentially stale global
- Fixes issue where status always reported falkordb regardless of config

* conductor-checkpoint-msg_01DoLD51xqrrdFvq3AgkYuQi

* conductor-checkpoint-msg_01EUW7ArnNM6kHCgFDrQZrro

* conductor-checkpoint-msg_01LqYK6nj1ZFfRNBRP15FMLo

* feat: Add standalone Dockerfile for external database deployments

- Create Dockerfile.standalone for MCP server without embedded FalkorDB
- Supports both Neo4j and FalkorDB via DATABASE_PROVIDER build arg
- Update docker-compose-neo4j.yml to use standalone Dockerfile
- Update docker-compose-falkordb.yml to use standalone Dockerfile
- Fixes issue where Neo4j compose was starting embedded FalkorDB
- Separate images: standalone-neo4j and standalone-falkordb

* conductor-checkpoint-msg_01QSHNgVZvF1id5UtLhpzuUa

* refactor: Unified standalone image with both Neo4j and FalkorDB drivers

- Modified Dockerfile.standalone to install both neo4j and falkordb extras
- Both compose files now use the same standalone image
- Config file determines which database to connect to at runtime
- Added build-standalone.sh script for building and pushing to DockerHub
- Image tags: standalone, {version}-standalone, {version}-graphiti-{core}-standalone

* conductor-checkpoint-msg_01H4isP3oHK25sGpVWzXq9kX

* fix: Correct config file paths in compose files

- Fix CONFIG_PATH env var: /app/config/config.yaml -> /app/mcp/config/config.yaml
- Fix volume mount path: /app/config/config.yaml -> /app/mcp/config/config.yaml
- Matches WORKDIR /app/mcp in Dockerfile.standalone
- Fixes issue where wrong config was being loaded

* conductor-checkpoint-msg_01Pv3Qj9UJJat288xZTsfCm3

* conductor-checkpoint-msg_01DkBq4kQA5Fdmxfikm8aBYG

* conductor-checkpoint-msg_01EBqphY68KNzRWei4QNpcYg

* feat: Add /health endpoint for Docker healthchecks

- Add @mcp.custom_route for /health endpoint using FastMCP
- Returns {status: 'healthy', service: 'graphiti-mcp'}
- Update Dockerfile.standalone healthcheck to use /health instead of /
- Eliminates 404 errors in logs from healthcheck pings
- Follows FastMCP best practices for operational monitoring

* conductor-checkpoint-msg_01UpNeurS45bREPEeGkV3uCx

* feat: Add logging to verify entity types are loaded from config

Added INFO level logging during GraphitiService initialization to confirm
that custom entity types from the configuration file are properly loaded.
This helps debug issues where the entity ontology may not be applied.

Logs the entity type names when custom types are present:
  INFO - Using custom entity types: Preference, Requirement, Procedure, ...

* fix: Correct logging message for entity types and add embedder logging

Fixed copy-paste error where entity types else clause was logging about
embedder client. Also added missing else clause for embedder client logging
for consistency.

- Fixed: "No Embedder client configured" -> "Using default entity types"
- Added: Missing embedder client else clause logging

* conductor-checkpoint-msg_01WMuxAzUnkpsa5WSXKMyLLP

* fix: Return JSONResponse from health check endpoint

Fixed TypeError in health check endpoint by returning a proper Starlette
JSONResponse object instead of a plain dict. Starlette custom routes require
ASGI-compatible response objects.

Error was: TypeError: 'dict' object is not callable

* conductor-checkpoint-msg_01CSgKFQaLsKVrBJAYCFoSGa

* conductor-checkpoint-msg_01SFY9xCnHxeCFGf53FESncs

* feat: Return complete node properties and exclude all embeddings

Enhanced node search results to include all relevant properties:
- Added `attributes` dict for custom entity properties
- Changed from single `type` to full `labels` array
- Added `group_id` for partition information
- Added safety filter to strip any keys containing "embedding" from attributes

Added format_node_result() helper function for consistent node formatting
that excludes name_embedding vectors, matching the pattern used for edges.

Embeddings are now explicitly excluded in all data returns:
- EntityNode: name_embedding excluded + attributes filtered
- EntityEdge: fact_embedding excluded (existing)
- EpisodicNode: No embeddings to exclude

This ensures clients receive complete metadata while keeping payload
sizes manageable and avoiding exposure of internal vector representations.

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-30 22:59:01 -07:00
Daniel Chalef
c5714bb3b2
Potential fix for code scanning alert no. 24: Workflow does not contain permissions (#1036)
* Potential fix for code scanning alert no. 24: Workflow does not contain permissions

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Update .github/workflows/claude-code-review.yml

---------

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2025-10-30 19:49:48 -07:00
Daniel Chalef
20816c3c19 @anubhavgirdhar1 has signed the CLA in getzep/graphiti#1035 2025-10-30 08:12:22 -07:00
Daniel Chalef
56694a6dea
Add automated FastAPI server container release workflow (#1031)
* conductor-checkpoint-start

* conductor-checkpoint-msg_01VhH9TifDw4FVprrPE6tss4

* conductor-checkpoint-msg_018cUkkzZNp3RFrut99UPoAJ

* conductor-checkpoint-msg_01S8GCTw5bowCWq4G2jATJ5s

* conductor-checkpoint-msg_01NoAtvCjfekKvenbTgGZtzt

* Fix critical issues in server container release workflow

Address all issues identified by code review:

1. **Dockerfile now installs from PyPI** - Changed from building local source to installing graphiti-core from PyPI, ensuring container matches published package
2. **Fixed version extraction** - Handle workflow_run context where tags aren't available, with pyproject.toml fallback
3. **Added BUILD_DATE and VCS_REF** - Pass all required build arguments to populate OCI labels
4. **Improved pre-release detection** - Enhanced regex to catch all Python patterns (a1, b2, dev0, etc.)
5. **Fixed checkout configuration** - Added fetch-depth: 0 and proper ref for workflow_run trigger

The container now truly uses the PyPI package, making the PyPI availability check meaningful.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_01AuTTSKLm6XPqV4C5C2GL28

* Fix dependency installation order and optimize FalkorDB install

Address additional review concerns:

1. **Fix dependency installation order** - Install server deps first with uv sync, then upgrade graphiti-core to desired PyPI version using --upgrade flag. This prevents stale uv.lock (pinned to 0.13.2) from downgrading our target version.

2. **Optimize FalkorDB installation** - Combine graphiti-core installation with FalkorDB extra in single command, avoiding redundant package reinstall.

3. **Add --upgrade flag** - Ensures the specific PyPI version takes precedence over lockfile version.

The installation sequence is now:
- uv sync (server deps + graphiti-core 0.13.2 from lock)
- uv pip install --upgrade graphiti-core==TARGET_VERSION (upgrades to desired version)

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

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-29 19:24:12 -07:00
Preston Rasmussen
c29f4da21e
update mmr to use bulk load overrides (#1029)
* update mmr to use bulk load overrides

* update returns

* update
2025-10-29 09:51:58 -04:00
Daniel Chalef
ae227ce927 @didier-durand has signed the CLA in getzep/graphiti#1028 2025-10-29 02:32:04 -07:00
Daniel Chalef
56f6d09df0
Add MCP server release workflow (#1025)
* conductor-checkpoint-start

* conductor-checkpoint-msg_01B1n4yHQFoVrWWdKcqPQ4Qa

* conductor-checkpoint-msg_01LS1v8ok5qtzAofv1TFRDHt

* conductor-checkpoint-msg_01H5pxrRKDpizF4wv1irnvRz

* conductor-checkpoint-msg_01EFo2gQBKSFkGcJoJ4bUWNS

* conductor-checkpoint-msg_01QW92pnqMv17sfV4CxFKn7Y

* conductor-checkpoint-msg_01VqPRMaBRGpBf9E8sdpPeFa

* Fix critical issues in MCP server release workflow

- Fix Docker tag format: use version only (0.4.0) instead of mcp-v0.4.0
- Add Python 3.11 setup for tomllib compatibility
- Add workflow_dispatch trigger for testing without creating tags
- Add conditional push logic for manual testing

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Remove workflow_dispatch trigger from MCP server release

Simplify workflow to only trigger on mcp-v*.*.* tags.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_019AX8ymwf9eec2KF979CJCM

* conductor-checkpoint-msg_01LMofTLUNkicSq5vpFmsd1C

* Add semantic version validation to MCP server release

Validate tag follows X.Y.Z format before processing.
Rejects malformed tags like mcp-v1.0 or mcp-v1.0.0.0.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* conductor-checkpoint-msg_01Ndj59qcprSNRfe3vuciwwA

* conductor-checkpoint-msg_01PmA8bfCLKv7yHiaBz2MypS

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-27 12:06:38 -07:00
Preston Rasmussen
71f1f66d11
Search client update (#1026)
* update bulk interfae handling

* bump version

* format
2025-10-26 22:07:36 -04:00
Daniel Chalef
6338378614 @dontang97 has signed the CLA in getzep/graphiti#1020 2025-10-22 02:52:17 -07:00
Naseem Ali
d0a3cd97ae
Integrate MCP for FalkorDB (#910)
* Integrate MCP for FalkorDB

* fix lint errors
2025-10-21 12:06:57 -04:00
Naseem Ali
7c38ce7830
Add FalkorDB support for docker compose (#911) 2025-10-21 11:47:38 -04:00
Jack Ryan
beae5a94c4
Add Zep vs Graphiti comparison table to README (#1014)
Changes auto-committed by Conductor
2025-10-20 17:49:31 -05:00
Daniel Chalef
6b62c75f03 @0fism has signed the CLA in getzep/graphiti#1005 2025-10-15 10:00:37 -07:00
Daniel Chalef
038a72b6aa @ngaiyuc has signed the CLA in getzep/graphiti#1005 2025-10-15 09:45:22 -07:00
Daniel Chalef
12ac194714
v0.22.0 bump (#1003) 2025-10-13 09:52:01 -07:00
Daniel Chalef
37a9ea65a2
Remove integration markers from database tests (#1000)
* Remove integration markers from database tests

Removed @pytest.mark.integration from database tests to allow them to run
while excluding API integration tests that call external services.

Database tests (now run):
- tests/test_edge_int.py
- tests/test_graphiti_int.py
- tests/test_node_int.py
- tests/test_entity_exclusion_int.py
- tests/cross_encoder/test_bge_reranker_client_int.py
- tests/driver/test_falkordb_driver.py

API integration tests (excluded):
- tests/llm_client/test_anthropic_client_int.py
- tests/utils/maintenance/test_temporal_operations_int.py

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Apply ruff formatting to falkordb driver and node queries

- Quote style fixes in falkordb_driver.py
- Trailing whitespace cleanup in node_db_queries.py
- Update uv.lock

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Remove api-integration-tests job from CI workflow

The api-integration-tests job has been removed since API integration tests
are now excluded via @pytest.mark.integration marker.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix database-integration-tests to run all database tests

Previously only ran test_graphiti_mock.py, now runs all database tests:
- tests/test_graphiti_mock.py
- tests/test_graphiti_int.py
- tests/test_node_int.py
- tests/test_edge_int.py
- tests/test_entity_exclusion_int.py
- tests/cross_encoder/test_bge_reranker_client_int.py
- tests/driver/test_falkordb_driver.py

The -m "not integration" filter excludes API integration tests that call
external services (Anthropic, OpenAI, etc).

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Restore integration markers for tests that call LLM APIs

test_graphiti_int.py and test_entity_exclusion_int.py call graphiti.add_episode()
and graphiti.search_() which require LLM API calls, so they are API integration
tests, not pure database tests.

Final categorization:

Pure unit tests (no external dependencies):
- tests/llm_client/test_*.py (except test_anthropic_client_int.py)
- tests/embedder/test_*.py
- tests/utils/maintenance/test_*.py (except test_temporal_operations_int.py)
- tests/utils/search/search_utils_test.py
- tests/test_text_utils.py

Database tests (require Neo4j/FalkorDB, no API calls):
- tests/test_graphiti_mock.py
- tests/test_node_int.py
- tests/test_edge_int.py
- tests/cross_encoder/test_bge_reranker_client_int.py
- tests/driver/test_falkordb_driver.py

API integration tests (excluded via @pytest.mark.integration):
- tests/test_graphiti_int.py
- tests/test_entity_exclusion_int.py
- tests/llm_client/test_anthropic_client_int.py
- tests/utils/maintenance/test_temporal_operations_int.py

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

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-12 10:16:34 -07:00
Naseem Ali
a8ec45b1bd
fix: wrap embeddings with vecf32() in FalkorDB single save paths (#991)
Fixes #972. Entity and edge single save operations now properly convert
embeddings to vecf32 type, matching bulk save behavior and preventing
type mismatch errors during vector similarity searches.
2025-10-12 09:42:52 -07:00
Daniel Chalef
b7358e52eb
Secure Claude PR reviews with two-workflow approach (#999)
Fixes permission errors for fork PRs while maintaining security.

Changes:
- Split into automatic (internal) and manual (fork) workflows
- Add fork detection to prevent auto-review of external PRs
- Add security-hardened prompts preventing secret disclosure
- Create manual workflow for maintainer-triggered fork reviews
- Add friendly notification for external contributors

Security model:
- Internal PRs: Auto-reviewed (trusted contributors)
- Fork PRs: Human gate-keeping required before optional Claude review
- Prevents prompt injection attacks via untrusted PR content

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

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-12 09:41:13 -07:00
Daniel Chalef
a5f26b6764
Fix FalkorDB index deletion implementation (#998)
* Update node_db_queries.py

* Update node_db_queries.py

* fix-delete-idx

* improve-delete

* fix uint tests

---------

Co-authored-by: Naseem Ali <34807727+Naseem77@users.noreply.github.com>
Co-authored-by: Gal Shubeli <galshubeli93@gmail.com>
2025-10-12 09:36:22 -07:00
Daniel Chalef
e72f81092e
Separate unit, database, and API integration tests (#997)
* Separate unit and integration tests to allow external contributors

This change addresses the issue where external contributor PRs fail unit
tests because GitHub secrets (API keys) are unavailable to external PRs
for security reasons.

Changes:
- Split GitHub Actions workflow into two jobs:
  - unit-tests: Runs without API keys or database connections (all PRs)
  - integration-tests: Runs only for internal contributors with API keys
- Renamed test_bge_reranker_client.py to test_bge_reranker_client_int.py
  to follow naming convention for integration tests
- Unit tests now skip all tests requiring databases or API keys
- Integration tests properly separated into:
  - Database integration tests (no API keys)
  - API integration tests (requires OPENAI_API_KEY, etc.)

The unit-tests job now:
- Runs for all PRs (internal and external)
- Requires no GitHub secrets
- Disables all database drivers
- Excludes all integration test files
- Passes 93 tests successfully

The integration-tests job:
- Only runs for internal contributors (same repo PRs or pushes to main)
- Has access to GitHub secrets
- Tests database operations and API integrations
- Uses conditional: github.event.pull_request.head.repo.full_name == github.repository

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Separate database tests from API integration tests

Restructured the workflow into three distinct jobs:

1. unit-tests: Runs on all PRs, no external dependencies (93 tests)
   - No API keys required
   - No database connections required
   - Fast execution

2. database-integration-tests: Runs on all PRs with databases (NEW)
   - Requires Neo4j and FalkorDB services
   - No API keys required
   - Tests database operations without external API calls
   - Includes: test_graphiti_mock.py, test_falkordb_driver.py,
     and utils/maintenance tests

3. api-integration-tests: Runs only for internal contributors
   - Requires API keys (OPENAI_API_KEY, ANTHROPIC_API_KEY, etc.)
   - Conditional execution for same-repo PRs only
   - Tests that make actual API calls to LLM providers

This ensures external contributor PRs can run both unit tests and
database integration tests successfully, while API integration tests
requiring secrets only run for internal contributors.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Disable Kuzu in CI database integration tests

Kuzu requires downloading extensions from external URLs which fails in CI
environment due to network restrictions. Disable Kuzu for database and API
integration tests.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Use pytest -k filter to skip Kuzu tests instead of DISABLE_KUZU

The original workflow used -k "neo4j" to filter tests. Kuzu requires
downloading FTS extensions from external URLs which fails in CI. Use
-k "neo4j or falkordb" to run tests against available databases while
skipping Kuzu parametrized tests.

This maintains the same test coverage as the original workflow while
properly separating unit, database, and API integration tests.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Upgrade Kuzu to v0.11.3+ to fix FTS extension download issue

Kuzu v0.11.3+ has FTS extension pre-installed, eliminating the need to
download it from external URLs. This fixes the "Could not establish
connection" error when trying to download libfts.kuzu_extension in CI.

Changes:
- Upgrade kuzu dependency from >=0.11.2 to >=0.11.3
- Remove pytest -k filters to run all database tests (Neo4j, FalkorDB, Kuzu)
- FTS extension is now available immediately without network calls

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Move pure unit tests from database integration to unit test job

The reviewer correctly identified that test_bulk_utils.py,
test_edge_operations.py, and test_node_operations.py are pure unit tests
using only mocks - they don't require database connections.

Changes:
- Removed tests/utils/maintenance/ from ignore list (too broad)
- Added specific ignore for test_temporal_operations_int.py (true integration test)
- Moved test_bulk_utils.py, test_edge_operations.py, test_node_operations.py to unit tests
- Kept test_graphiti_mock.py in database integration (uses real graph_driver fixture)

This reduces database integration test time and properly categorizes tests.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Skip flaky LLM-based tests in test_temporal_operations_int.py

- test_get_edge_contradictions_multiple_existing
- test_invalidate_edges_partial_update

These tests rely on OpenAI LLM responses for edge contradiction detection and produce non-deterministic results.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Use pytest -k filter for API integration tests

Replace explicit file listing with `pytest tests/ -k "_int"` to automatically discover all integration tests in any subdirectory. This improves maintainability by eliminating the need to manually update the workflow when adding new integration test files.

Excludes:
- tests/driver/ (runs separately in database-integration-tests)
- tests/test_graphiti_mock.py (runs separately in database-integration-tests)

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Rename workflow from "Unit Tests" to "Tests"

The workflow now runs multiple test types (unit, database integration, and API integration), so "Tests" is a more accurate name.

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

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-12 09:07:24 -07:00
Guy Korland
0e2760d1ce
Update README.md fix wrong link (#768)
Co-authored-by: Daniel Chalef <131175+danielchalef@users.noreply.github.com>
2025-10-11 16:07:24 -07:00
Preston Rasmussen
1e35306126
fix deprecated cypher pattern (#993) 2025-10-09 16:12:55 -04:00
Preston Rasmussen
604e3199a3
add search and graph operations interfaces (#984)
* add search and graph operations interfaces

* update

* update

* update

* update

* update

* update
2025-10-07 13:34:37 -04:00