-
Notifications
You must be signed in to change notification settings - Fork 2k
Add NEO4J_DATABASE environment variable support #892
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Add NEO4J_DATABASE environment variable support #892
Conversation
|
All contributors have signed the CLA ✍️ ✅ |
|
I have read the CLA Document and I hereby sign the CLA |
|
recheck |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Important
Looks good to me! 👍
Reviewed everything up to 08df73a in 1 minute and 29 seconds. Click for details.
- Reviewed
169lines of code in8files - Skipped
0files when reviewing. - Skipped posting
7draft comments. View those below. - Modify your settings and rules to customize what types of comments Ellipsis leaves. And don't forget to react with 👍 or 👎 to teach Ellipsis.
1. .env.example:7
- Draft comment:
The added NEO4J_DATABASE variable comment is clear. Ensure it remains consistent with our Enterprise-only usage notice. - Reason this comment was not posted:
Confidence changes required:0%<= threshold80%None
2. README.md:272
- Draft comment:
Updated Neo4j documentation clearly notes that custom database names require Enterprise edition. Ensure consistency with driver usage details. - Reason this comment was not posted:
Confidence changes required:0%<= threshold80%None
3. graphiti_core/graphiti.py:188
- Draft comment:
Consider replacing 'database or "neo4j"' with a check against None (e.g. 'database if database is not None else "neo4j"') to avoid unintentionally overriding an empty string. Also, verify that a copyright header is present. - Reason this comment was not posted:
Confidence changes required:66%<= threshold80%None
4. mcp_server/graphiti_mcp_server.py:464
- Draft comment:
Good integration of the 'database' parameter in Neo4jConfig and its env parsing. Ensure the file includes the required copyright header. - Reason this comment was not posted:
Confidence changes required:0%<= threshold80%None
5. server/.env.example:5
- Draft comment:
The consistent comment for NEO4J_DATABASE is maintained here. No changes needed. - Reason this comment was not posted:
Confidence changes required:0%<= threshold80%None
6. tests/test_graphiti_int.py:78
- Draft comment:
The new integration test for the Neo4j 'database' parameter is comprehensive. Optionally, consider asserting that the specified database is used during queries if feasible. - Reason this comment was not posted:
Confidence changes required:33%<= threshold80%None
7. uv.lock:2
- Draft comment:
Version bump update from 0.20.0 to 0.20.1 is noted. Ensure that versioning is managed correctly with other related changes. - Reason this comment was not posted:
Confidence changes required:0%<= threshold80%None
Workflow ID: wflow_fdTtRtuWlfaitmqS
You can customize by changing your verbosity settings, reacting with 👍 or 👎, replying to comments, or adding code review rules.
* @bechbd has signed the CLA in getzep/graphiti#793 * move summary out of attribute extraction (#792) * move summary out of attribute extraction * linter * linter * fix db query * add community group id index (#802) * add community group id index * updates nodes and indices * update add triple to always have embeddings (#803) update * @hugo-son has signed the CLA in getzep/graphiti#805 * test updates (#806) * test updates * update * Fix Azure OpenAI configuration parameter in README (#807) Change llm_config parameter to config in OpenAIClient and OpenAIRerankerClient examples to match actual API. This resolves TypeError when users follow the Azure OpenAI configuration examples. Fixes: TypeError: OpenAIClient.__init__() got an unexpected keyword argument 'llm_config' 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <[email protected]> * @mvanders has signed the CLA in getzep/graphiti#808 * @v-khanna has signed the CLA in getzep/graphiti#812 * add batch delete capabilities (#813) * add batch delete capabilities * use session for delete queries * @vjeeva has signed the CLA in getzep/graphiti#814 * @liebertar has signed the CLA in getzep/graphiti#816 * Add support for non-ASCII characters in LLM prompts (#805) * Add support for non-ASCII characters in LLM prompts - Add ensure_ascii parameter to Graphiti class (default: True) - Create to_prompt_json helper function for consistent JSON serialization - Update all prompt files to use new helper function - Preserve Korean/Japanese/Chinese characters when ensure_ascii=False - Maintain backward compatibility with existing behavior Fixes issue where non-ASCII characters were escaped as unicode sequences in prompts, making them unreadable in LLM logs and potentially affecting model understanding. * Remove unused json imports after replacing with to_prompt_json helper - Fix ruff lint errors (F401) for unused json imports - All prompt files now use to_prompt_json helper instead of json.dumps - Maintains clean code style and passes lint checks * Fix ensure_ascii propagation to all LLM calls - Add ensure_ascii parameter to maintenance operation functions that were missing it - Update function signatures in node_operations, community_operations, temporal_operations, and edge_operations - Ensure all llm_client.generate_response calls receive proper ensure_ascii context - Fix hardcoded ensure_ascii: True values that prevented non-ASCII character preservation - Maintain backward compatibility with default ensure_ascii=True - Complete the fix for issue #804 ensuring Korean/Japanese/Chinese characters are properly handled in LLM prompts * ensure ascii default to false (#817) * Null search datetimes (#818) * support null operations * update * only provide variables for non-null params * test update * Update CONTRIBUTING.md (#830) * Fix: Search methods configuration ignored (#788) (#829) fix: respect search_methods configuration in edge_search and node_search The search functions were ignoring the configured search_methods and always executing all three methods (BM25, cosine similarity, and BFS). This was causing unnecessary performance overhead - running 3x the required computations when users only wanted specific search methods. Now the functions build search tasks dynamically based on what's actually configured in search_methods, only executing the requested search algorithms. This should significantly improve performance when users need only specific search methods. Would appreciate your review on this approach\! Fixes #788 * @CaroLe-prw has signed the CLA in getzep/graphiti#833 * add bulk delete (#837) * add bulk delete * Update graphiti_core/edges.py Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Update graphiti_core/edges.py Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Update graphiti_core/edges.py Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * @Wizmann has signed the CLA in getzep/graphiti#842 * Fix Community Operations with FalkorDB (#824) * Update node_db_queries.py * Update node_db_queries.py * fix-community-operations --------- Co-authored-by: Naseem Ali <[email protected]> * fix typo and model selector (#843) * fix typo and model selector * bump version * update prompts and support thinking models (#846) * update prompts and support thinking models * update * type ignore * @liangyuanpeng has signed the CLA in getzep/graphiti#847 * Amazon Neptune Support (#793) * Rebased Neptune changes based on significant rework done * Updated the README documentation * Fixed linting and formatting * Update README.md Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Update graphiti_core/driver/neptune_driver.py Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Update README.md Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Addressed feedback from code review * Updated the README documentation for clarity * Updated the README and neptune_driver based on PR feedback * Update node_db_queries.py --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> Co-authored-by: Preston Rasmussen <[email protected]> * Gpt 5 default (#849) * gpt-5-mini and gpt-5-nano default * bump version * remove unused imports * linter * update * disable neptune errors while we get a fixture in place * update pyright * revert non-structured completions * fix typo * @aktek-yazge has signed the CLA in getzep/graphiti#735 * fix broken link (#855) * feat: Add GitHub AI Moderator for automated spam detection (#856) feat: Add GitHub AI Moderator workflow Add simple workflow configuration for GitHub's AI Moderator action to automatically detect spam in issues and comments. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <[email protected]> * use hnsw indexes (#859) * use hnsw indexes * add migration * updates * add group_id validation * updates * add type annotation * updates * update * swap to prerelease * bump version (#860) * dont create extra search embeddings (#861) * dont create extra search embeddings * updates * add missing conditionals * fix * float 0 * null check * more nullchecks * bump version * Fixed issue where creating indices was not called for Neptune and added missing quickstart example (#850) * Rebased Neptune changes based on significant rework done * Updated the README documentation * Fixed linting and formatting * Update README.md Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Update graphiti_core/driver/neptune_driver.py Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Update README.md Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Addressed feedback from code review * Updated the README documentation for clarity * Updated the README and neptune_driver based on PR feedback * Update node_db_queries.py * bug: Fixed issue with missing call to create indicies for Neptune and added quickstart example * chore: added pyright to ignore the attribute not in GrapHDriver * Fixed quickstart with feedback from automated PR --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> Co-authored-by: Preston Rasmussen <[email protected]> * docs: Update Ollama integration to use OpenAIGenericClient (#866) - Replace OpenAIClient with OpenAIGenericClient in Ollama documentation - Add bash code block formatting for model installation commands - Update API key placeholder from 'abc' to 'ollama' for clarity - Add comment clarifying Ollama's OpenAI-compatible endpoint Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com> Co-authored-by: Daniel Chalef <[email protected]> * update migration (#870) * update migration * bump version * close driver * Add support for Kuzu as the graph driver (#799) * Fix FalkoDB tests * Add support for graph memory using Kuzu * Fix lints * Fix queries * Add tests * Add comments * Add more test coverage * Add mocked tests * Format * Add mocked tests II * Refactor community queries * Add more mocked tests * Refactor tests to always cleanup * Add more mocked tests * Update kuzu * Refactor how filters are built * Add more mocked tests * Refactor and cleanup * Fix tests * Fix lints * Refactor tests * Disable neptune * Fix * Update kuzu version * Update kuzu to latest release * Fix filter * Fix query * Fix Neptune query * Fix bulk queries * Fix lints * Fix deletes * Comments and format * Add Kuzu to the README * Fix bulk queries * Test all fields of nodes and edges * Fix lints * Update search_utils.py --------- Co-authored-by: Preston Rasmussen <[email protected]> * docs: Add Azure OpenAI v1 API opt-in requirement documentation (#873) Add important notice about Azure OpenAI v1 API opt-in requirement for structured outputs. Without this opt-in, users encounter 404 errors when using client.beta.chat.completions.parse(). Includes link to Microsoft's official documentation on the v1 API migration. Fixes ZEPAI-1634 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <[email protected]> * Update claude-code-review.yml (#876) * Update claude.yml (#877) * Update claude-code-review.yml (#880) * Update claude-code-review.yml (#883) * Update cla.yml (#884) * update-tests (#872) * update-tests * unit test update * update tests * update tests * update kuzu query * update * update query * update args * fix bulk episode add * make handling better * @Shelvak has signed the CLA in getzep/graphiti#885 * @maskshell has signed the CLA in getzep/graphiti#886 * don't return index labels (#887) * don't return index labels * update tests * remove parallel runtime and build dynamic indexes sequentially * bump version (#889) * bump version * remove unused imports * update (#891) * @jeanlucthumm has signed the CLA in getzep/graphiti#892 * cleanup (#894) * cleanup * update * remove unused imports * @Bit-urd has signed the CLA in getzep/graphiti#895 * add episode bulk search results (#897) * add episode bulk search results * update * docstring * update * Add return to add_triplet (#898) * update * add triplet results * Update graphiti_core/graphiti.py Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com> --------- Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com> * @DavIvek has signed the CLA in getzep/graphiti#900 * @gsw945 has signed the CLA in getzep/graphiti#901 * OpenSearch Integration for Neo4j (#896) * move aoss to driver * add indexes * don't save vectors to neo4j with aoss * load embeddings from aoss * add group_id routing * add search filters and similarity search * neptune regression update * update neptune for regression purposes * update index creation with aliasing * regression tested * update version * edits * claude suggestions * cleanup * updates * add embedding dim env var * use cosine sim * updates * updates * remove unused imports * update * @luan122 has signed the CLA in getzep/graphiti#908 * OpenSearch updates (#906) * updates * add uuid filter functionality * update * updates * bump-version * update * fix typo * use async function * update unit tests * update delete * update deletion * async update * update * update * update * update * @Brandtweary has signed the CLA in getzep/graphiti#916 * Embedding fix (#917) * embedding fix * pre3 * fixedmake format * fix-fulltext-syntax-error (#914) * fix-fulltext-syntax-error * update-abs-method * Graph quality updates (#922) duplicate_of updates * Skip entity attribute extraction when no fields defined (#924) * pre5 (#926) * don't save duplicate edges (#927) * don't save duplicate edges * remove build duplicate edges * Improve node deduplication w/ deterministic matching, LLM fallbacks (#929) * add repository guidelines and project structure documentation * update neo4j image version and modify test command to disable specific databases * implement deduplication helpers and integrate with node operations * refactor string formatting to use single quotes in node operations * enhance deduplication helpers with UUID indexing and update resolution logic * implement exact fact matching (#931) * Bump v0.30.0pre0 (#932) * Update pyproject.toml bump v0.30.0pre0 * Update pyproject.toml * Refactor batch deduplication logic to enhance node resolution and track duplicate pairs (#929) (#936) * Refactor deduplication logic to enhance node resolution and track duplicate pairs (#929) * Simplify deduplication process in bulk_utils by reusing canonical nodes. * Update dedup_helpers to store duplicate pairs during resolution. * Modify node_operations to append duplicate pairs when resolving nodes. * Add tests to verify deduplication behavior and ensure correct state updates. * reveret to concurrent dedup with fanout and then reconcilation * add performance note for deduplication loop in bulk_utils * enhance deduplication logic in bulk_utils to handle missing canonical nodes gracefully * Update graphiti_core/utils/bulk_utils.py Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com> * refactor deduplication logic in bulk_utils to use directed union-find for canonical UUID resolution * implement _build_directed_uuid_map for efficient UUID resolution in bulk_utils * document directed union-find lookup in bulk_utils for clarity --------- Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com> * Update pyproject.toml to 0.30.0pre1 (#938) * Fix index out of range errors in LLM deduplication responses (#939) * add tests for llm dedupe guardrails * document llm dedupe guardrails * chore: Bump version (#940) * Improve node dedup prompts (#942) * remove poetry.lock * Improve dedup prompts * normalize string formatting in dedupe_nodes.py to use single quotes * bump 0.30.0pre3 (#946) * fix: Add edge type validation based on node labels (#948) * fix: Add edge type validation based on node labels - Add DEFAULT_EDGE_NAME constant for 'RELATES_TO' - Implement pre-resolution validation to reset invalid edge names - Add post-resolution validation for LLM-returned fact types - Rename parameter from edge_types to edge_type_candidates for clarity - Add comprehensive tests for validation scenarios This ensures edges conform to edge_type_map constraints and prevents misclassification when edge types don't match node label pairs. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * chore: Bump version to 0.30.0pre4 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> --------- Co-authored-by: Claude <[email protected]> * Allow Edge extraction to keep discovered edge labels (#950) * chore: Update dependencies and enhance edge resolution logic - Add new dependencies: boto3, opensearch-py, and langchain-aws to pyproject.toml. - Modify Graphiti class to handle additional parameters in edge resolution. - Improve edge type handling in deduplication logic by introducing custom edge type names. - Enhance tests for edge resolution to cover new scenarios and ensure correct behavior. This update improves the flexibility and functionality of edge operations while ensuring compatibility with new libraries. * refactor: Clean up test_edge_operations.py and format response returns - Remove unnecessary stubs for opensearchpy module. - Format return values in llm_client.generate_response for consistency. - Enhance readability by ensuring proper indentation and structure in test cases. This refactor improves the clarity and maintainability of the test suite for edge operations. * bump version to 0.30.0pre5 and enhance docstring for resolve_extracted_edge function - Update version in pyproject.toml to 0.30.0pre5. - Add detailed docstring to resolve_extracted_edge function in edge_operations.py, clarifying parameters and return values. This update improves documentation clarity for the edge resolution process. * Improve JSON entity extraction prompt (#949) Add guideline to extract entities from all JSON properties, not just primary fields like name/user. This ensures comprehensive entity extraction while maintaining the existing exclusion of date properties. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <[email protected]> * Make natural language extraction configurable (#943) Replace MULTILINGUAL_EXTRACTION_RESPONSES constant with configurable get_extraction_language_instruction() function to improve determinism and allow customization. Changes: - Replace constant with function in client.py - Update all LLM client implementations to use new function - Maintain backward compatibility with same default behavior - Enable users to override function for custom language requirements Users can now customize extraction behavior by monkey-patching: ```python import graphiti_core.llm_client.client as client client.get_extraction_language_instruction = lambda: "Custom instruction" ``` 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <[email protected]> * 21 pre 7 (#954) * fix: Prevent duplicate edge facts within same episode (#955) * fix: Prevent duplicate edge facts within same episode This fixes three related bugs that allowed verbatim duplicate edge facts: 1. Fixed LLM deduplication: Changed related_edges_context to use integer indices instead of UUIDs, matching the EdgeDuplicate model expectations. 2. Fixed batch deduplication: Removed episode skip in dedupe_edges_bulk that prevented comparing edges from the same episode. Added self-comparison guard to prevent edge from comparing against itself. 3. Added fast-path deduplication: Added exact string matching before parallel processing in resolve_extracted_edges to catch within-episode duplicates early, preventing race conditions where concurrent edges can't see each other. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * test: Add tests for edge deduplication fixes Added three tests to verify the edge deduplication fixes: 1. test_dedupe_edges_bulk_deduplicates_within_episode: Verifies that dedupe_edges_bulk now compares edges from the same episode after removing the `if i == j: continue` check. 2. test_resolve_extracted_edge_uses_integer_indices_for_duplicates: Validates that the LLM receives integer indices for duplicate detection and correctly processes returned duplicate_facts. 3. test_resolve_extracted_edges_fast_path_deduplication: Confirms that the fast-path exact string matching deduplicates identical edges before parallel processing, preventing race conditions. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * fix: Remove unused variables flagged by ruff - Remove unused loop variable 'j' in bulk_utils.py - Remove unused return value 'edges_by_episode' in test - Replace unused 'edge_uuid' with '_' in test loop 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> --------- Co-authored-by: Claude <[email protected]> * bump pre8 (#956) * chore: Update edge extraction prompt to paraphrase instead of quote (#957) * chore: Update edge extraction prompt to paraphrase instead of quote - Changed instruction 5 to request paraphrasing rather than verbatim quoting - Updated string quotes to use double quotes for consistency 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * chore: Format edge_operations.py and update lock file - Minor formatting fix in edge_operations.py list comprehension - Update uv.lock with version bump to 0.21.0rc8 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> --------- Co-authored-by: Claude <[email protected]> * Bump version to 0.21.0pre9 (#958) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <[email protected]> * fix: Fix typo in JSON entity extraction prompt (#953) * fix: Fix typo in JSON entity extraction prompt Change "an entities" to "any entities" in guideline 1 of the extract_json prompt. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Update graphiti_core/prompts/extract_nodes.py Co-authored-by: Daniel Chalef <[email protected]> --------- Co-authored-by: Claude <[email protected]> Co-authored-by: Daniel Chalef <[email protected]> * Update Claude review prompt to focus on critical feedback (#960) chore: Update Claude review prompt to focus on critical feedback only Added instruction to eliminate positive feedback from code reviews, reducing noise and focusing on actionable improvements. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <[email protected]> * feat: Add optional callback to control node summary generation (#959) Add NodeSummaryFilter callback parameter to extract_attributes_from_nodes and extract_attributes_from_node functions, allowing consumers to selectively skip summary regeneration for specific nodes. This enables downstream applications to implement custom logic for throttling or filtering which nodes should have summaries regenerated, reducing unnecessary LLM calls and token costs. Key changes: - Add NodeSummaryFilter type alias: Callable[[EntityNode], Awaitable[bool]] - Update extract_attributes_from_nodes with optional should_summarize_node parameter - Update extract_attributes_from_node with conditional summary generation logic - Add 5 comprehensive test cases covering callback functionality - Maintain full backwards compatibility (default None = all summaries generated) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <[email protected]> * Bump version to 0.21.0pre10 (#962) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <[email protected]> * Refactor issue workflows for improved automation (#964) - Consolidate issue-triage.yml and issue-deduplication.yml into single workflow with sequential jobs - Create daily_issue_maintenance.yml with three jobs: - find-legacy-duplicates: Manual job to scan all open issues for duplicates - check-stale-issues: Daily job to request confirmation on issues >60 days old - close-unconfirmed-issues: Daily job to close issues without confirmation after 14 days - Update triage to use gh CLI tools with database-specific labels (neo4j, falkordb, neptune) - Separate deduplication into dedicated job using MCP GitHub tools - Add "duplicate" label to both real-time and batch deduplication workflows - Update claude-code-review.yml to use latest Sonnet model 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <[email protected]> * fix: Improve deduplication ID validation and logging (#965) * fix: Improve deduplication ID validation and logging - Add comprehensive logging to verify IDs sent to LLM (sent vs received) - Enhance prompt with explicit ID bounds (0 through N-1) - Add validation warnings for missing and extra IDs from LLM responses - Improve error message clarity for invalid dedupe IDs - Log actual IDs sent to LLM to confirm no index leakage This helps diagnose cases where the LLM returns IDs outside the valid range (e.g., ID 19 when only 0-18 were sent). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * fix: Remove redundant logging parameter Address reviewer comment about redundant third parameter in debug log statement. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * fix: Address reviewer comments on list slicing and prompt clarity - Fix list slicing bug: change <= to < to avoid gap when exactly 20 elements (previously would skip element 10 when showing 21 elements) - Consolidate redundant prompt phrasing while maintaining clarity (reduced from 3 sentences to 2, keeping essential constraints) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * fix: Remove redundant prompt text to reduce token usage Consolidate 'using these exact IDs (0 through N-1)' with following sentence to eliminate repetition. Changes: - 'using these exact IDs (0 through {N-1}). Do not skip IDs or use IDs outside this range' - 'with IDs 0 through {N-1}. Do not skip or add IDs' Saves ~15 tokens per deduplication call. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> --------- Co-authored-by: Claude <[email protected]> * filter out falsey values before creating embeddings (#966) * filter out falsey values * update * early return * Remove ensure_ascii configuration parameter (#969) * Remove ensure_ascii configuration parameter - Changed to_prompt_json default from ensure_ascii=True to False - Removed ensure_ascii parameter from Graphiti.__init__ and GraphitiClients - Removed ensure_ascii from all function signatures and context dictionaries - Removed ensure_ascii from all test files - All JSON serialization now preserves Unicode characters by default 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * format --------- Co-authored-by: Claude <[email protected]> * Optimize edge deduplication prompt for caching and clarity (#970) * Optimize edge deduplication prompt for caching and clarity - Restructure prompt to place invariant instructions at top and dynamic context at bottom for better LLM caching - Change 'id' to 'idx' in edge context lists to avoid confusion with other identifiers - Remove 'fact_type_id' from edge types context as LLM only needs fact_type_name - Remove dynamic range values from prompt instructions (e.g., "range 0-N") - Add debug logging before LLM call to track input sizes - Add validation logging after LLM response to catch invalid idx values - Clarify that duplicate_facts uses EXISTING FACTS idx and contradicted_facts uses INVALIDATION CANDIDATES idx 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Address terminology consistency and edge case logging - Update Pydantic field descriptions to use 'idx' instead of 'ids' for consistency - Fix debug logging to handle empty list edge case (avoid 'idx 0--1' display) Note on review feedback: - Validation is intentionally non-redundant: warnings provide visibility, list comprehensions ensure robustness - WARNING level is appropriate for LLM output issues (not system errors) - Existing test coverage is sufficient for this defensive logging addition 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> --------- Co-authored-by: Claude <[email protected]> * fix: Improve edge extraction entity ID validation (#968) * fix: Improve edge extraction entity ID validation Fixes invalid entity ID references in edge extraction that caused warnings like: "WARNING: source or target node not filled WILL_FIND. source_node_uuid: 23 and target_node_uuid: 3" Changes: - Format ENTITIES list as proper JSON in prompt for better LLM parsing - Clarify field descriptions to reference entity id from ENTITIES list - Add explicit entity ID validation as #1 extraction rule with examples - Improve error logging (removed PII, added entity count and valid range) These changes follow patterns from extract_nodes.py and dedupe_nodes.py where entity referencing works reliably. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * wip * fix: Align fact field naming and add description - Change extraction rule to reference 'fact' instead of 'fact_text' - Add descriptive text for fact field in Edge model * fix: Remove ensure_ascii parameter from to_prompt_json call Align with other to_prompt_json calls that don't use ensure_ascii * fix: Use validated target_node_idx variable consistently Line 190 was using raw edge_data.target_entity_id instead of the validated target_node_idx variable, creating inconsistency with line 189 * fix: Improve edge extraction validation checks - Add explicit check for empty nodes list - Use more explicit 0 <= idx comparison instead of -1 < idx - Prevents nonsensical error message when no entities provided * chore: Restore uv.lock from main branch Previously deleted in commit 7e4464b, now restored to match main branch state * Update uv.lock --------- Co-authored-by: Claude <[email protected]> * Bump version to 0.21.0pre12 (#967) Bump version to 0.21.0pre11 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <[email protected]> * validate nodes and edges aren't falsey (#973) * validate nodes and edges aren't falsey * update * update * Add group_id parameter to language extraction function (#952) * Add group_id parameter to get_extraction_language_instruction Enable consumers to provide group-specific language extraction instructions by passing group_id through the call chain. Changes: - Add optional group_id parameter to get_extraction_language_instruction() - Add group_id parameter to all LLMClient.generate_response() methods - Pass group_id through to language instruction function - Maintain backward compatibility with default None value Users can now customize extraction per group: ```python def custom_instruction(group_id: str | None = None) -> str: if group_id == 'spanish-users': return '\n\nExtract in Spanish.' return '\n\nExtract in original language.' client.get_extraction_language_instruction = custom_instruction ``` 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Pass group_id to generate_response in extraction operations Thread group_id parameter through all extraction-related generate_response() calls where it's naturally available (via episode.group_id or node.group_id). This enables consumers to override get_extraction_language_instruction() with group-specific language preferences. Changes: - edge_operations.py: Pass group_id in extract_edges() - node_operations.py: Pass episode.group_id in extract_nodes() and node.group_id in extract_attributes_from_node() - node_operations.py: Add group_id parameter to extract_nodes_reflexion() 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Fix type inconsistency in extract_nodes_reflexion parameter Change group_id parameter from str = '' to str | None = None to match the pattern used throughout the codebase and align with the optional nature of group_id in generate_response(). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Remove ensure_ascii parameter and uv.lock file * Reset uv.lock to main branch version --------- Co-authored-by: Claude <[email protected]> * Update issue triage workflow to allow non-write users for duplicate checks (#974) * remove generic aoss_client interactions for release build (#975) * remove generic aoss_client interactions for release build * remove unused imports * update * revert changes to Neptune driver * Update graphiti_core/driver/neptune_driver.py Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com> * default to sync OpenSearch client * update * aoss_client now Any type * update stubs --------- Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com> * Refactor node extraction; remove summary from attribute extraction (#977) * Refactor node extraction for better maintainability - Extract helper functions from extract_attributes_from_node to improve code organization - Add _extract_entity_attributes, _extract_entity_summary, and _build_episode_context helpers - Apply consistent formatting (double quotes per ruff configuration) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Apply consistent single quote style throughout node_operations 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * cleanup * cleanup 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Bump version to 0.22.0pre0 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> --------- Co-authored-by: Claude <[email protected]> * Enforce shorter summaries with 8 sentence limit (#978) * Enforce shorter summaries with 8 sentence limit Replace 250-word limit with 8 sentence limit for node summaries to improve conciseness. Also update prompt system message for summarize_context to better reflect its dual purpose of generating summaries and attributes. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Update graphiti_core/prompts/summarize_nodes.py Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com> * Bump version to 0.22.0pre1 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Update graphiti_core/prompts/summarize_nodes.py 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> --------- Co-authored-by: Claude <[email protected]> Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com> * Refactor summary prompts to use character limit and prevent meta-commentary (#979) * Refactor summary prompts to use character limit and prevent meta-commentary - Changed summary length constraint from "8 sentences" to "250 characters" for more predictable output - Created reusable summary_instructions snippet in snippets.py with clear BAD/GOOD examples - Added explicit instruction to output only factual content without meta-commentary - Applied consistent formatting across extract_nodes.py and summarize_nodes.py - Bumped version to 0.22.0pre2 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Add copyright header to snippets.py 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> --------- Co-authored-by: Claude <[email protected]> * Refactor prompt structure: move MESSAGES after instructions (#980) * Refactor prompt structure: move MESSAGES after instructions Reordered prompt structure in extract_nodes.py to place MESSAGES section after instructions/guidelines in both extract_attributes and extract_summary functions for improved prompt clarity. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Add sentence-aware text truncator for entity summaries - Created truncate_at_sentence() utility function that truncates text at sentence boundaries while respecting max character limits - Added MAX_SUMMARY_CHARS constant (250 chars) for entity summaries - Applied truncator to entity summaries in prompts (extract_nodes.py) - Applied truncator to LLM-generated summaries (node_operations.py) - Added comprehensive test suite for truncation logic 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Clean up formatting in extract_attributes prompt - Remove extra blank lines - Fix indentation of MESSAGES tag 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Bump version to 0.22.0pre3 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> --------- Co-authored-by: Claude <[email protected]> * @clsferguson has signed the CLA in getzep/graphiti#981 * Add OpenTelemetry distributed tracing support (#982) * Add OpenTelemetry distributed tracing support - Add tracer abstraction with no-op and OpenTelemetry implementations - Instrument add_episode and add_episode_bulk with tracing spans - Instrument LLM client with cache-aware tracing - Add configurable span name prefix support - Refactor add_episode methods to improve code quality - Add OTEL_TRACING.md documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Fix linting errors in tracing implementation - Remove unused episodes_by_uuid variable - Fix tracer type annotations for context manager support - Replace isinstance tuple with union syntax - Use contextlib.suppress for exception handling - Fix import ordering and use AbstractContextManager 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Address PR review feedback on tracing implementation Critical fixes: - Remove flawed error span creation in graphiti.py that created orphaned spans - Restructure LLM client tracing to create span once at start, eliminating code duplication - Initialize LLM client tracer to NoOpTracer by default to fix type checking Enhancements: - Add comprehensive span attributes to add_episode: reference_time, entity/edge type counts, previous episodes count, invalidated edge count, community count - Optimize isinstance check for better performance 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Add prompt name tracking to OpenTelemetry tracing spans Add prompt_name parameter to all LLM client generate_response() methods and set it as a span attribute in the llm.generate span. This enables better observability by identifying which prompt template was used for each LLM call. Changes: - Add prompt_name parameter to LLMClient.generate_response() base method - Add prompt_name parameter and tracing to OpenAIBaseClient, AnthropicClient, GeminiClient, and OpenAIGenericClient - Update all 14 LLM call sites across maintenance operations to include prompt_name: - edge_operations.py: 4 calls - node_operations.py: 6 calls (note: 7 listed but only 6 unique) - temporal_operations.py: 2 calls - community_operations.py: 2 calls 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Fix exception handling in add_episode to record errors in OpenTelemetry span Moved try-except block inside the OpenTelemetry span context and added proper error recording with span.set_status() and span.record_exception(). This ensures exceptions are captured in the distributed trace, matching the pattern used in add_episode_bulk. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> --------- Co-authored-by: Claude <[email protected]> * Bump pre-release version to 0.22.0pre4 (#983) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <[email protected]> * Remove JSON indentation from prompts to reduce token usage (#985) Changes to `to_prompt_json()` helper to default to minified JSON (no indentation) instead of 2-space indentation. This reduces token consumption in LLM prompts while maintaining all necessary information. - Changed default `indent` parameter from `2` to `None` in `prompt_helpers.py` - Updated all prompt modules to remove explicit `indent=2` arguments - Minor code formatting fixes in LLM clients 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <[email protected]> * bump 0.22.0pre5 (#986) * Add OpenTelemetry stdout example with Kuzu (#987) - Created examples/opentelemetry/ with working stdout tracing example - Uses Kuzu in-memory database for zero-setup requirement - Demonstrates ingestion and search with distributed tracing - Updated OTEL_TRACING.md with simplified documentation and Kuzu example - Uses local editable graphiti-core install for development 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <[email protected]> * Fix datetime comparison errors by normalizing to UTC (#988) * Fix datetime comparison errors by normalizing to UTC Applied ensure_utc() to all datetime comparisons in edge_operations.py to prevent TypeError when comparing timezone-naive and timezone-aware datetimes. Removed redundant tzinfo checks since ensure_utc() handles both None and naive datetimes. Fixed comparisons at: - Lines 419, 423: resolve_edge_contradictions function - Line 430: resolve_edge_contradictions function - Line 627: resolve_extracted_edge function (removed redundant tzinfo checks) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Update uv.lock 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Fix sorting with mixed timezone-aware/naive datetimes Normalize datetime to UTC in sort key to prevent TypeError when comparing mixed timezone-aware and timezone-naive datetimes during sorting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> --------- Co-authored-by: Claude <[email protected]> * add search and graph operations interfaces (#984) * add search and graph operations interfaces * update * update * update * update * update * update * fix deprecated cypher pattern (#993) * Update README.md fix wrong link (#768) Co-authored-by: Daniel Chalef <[email protected]> * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> --------- Co-authored-by: Claude <[email protected]> * 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 <[email protected]> Co-authored-by: Gal Shubeli <[email protected]> * 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 <[email protected]> * 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. * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> --------- Co-authored-by: Claude <[email protected]> * v0.22.0 bump (#1003) * @ngaiyuc has signed the CLA in getzep/graphiti#1005 * @0fism has signed the CLA in getzep/graphiti#1005 * Add Zep vs Graphiti comparison table to README (#1014) Changes auto-committed by Conductor * Add FalkorDB support for docker compose (#911) * Integrate MCP for FalkorDB (#910) * Integrate MCP for FalkorDB * fix lint errors * @dontang97 has signed the CLA in getzep/graphiti#1020 * Search client update (#1026) * update bulk interfae handling * bump version * format * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> * conductor-checkpoint-msg_01Ndj59qcprSNRfe3vuciwwA * conductor-checkpoint-msg_01PmA8bfCLKv7yHiaBz2MypS --------- Co-authored-by: Claude <[email protected]> * @didier-durand has signed the CLA in getzep/graphiti#1028 * update mmr to use bulk load overrides (#1029) * update mmr to use bulk load overrides * update returns * update * 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 <[email protected]> * 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 <[email protected]> --------- Co-authored-by: Claude <[email protected]> * @anubhavgirdhar1 has signed the CLA in getzep/graphiti#1035 * 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> * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> * 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 <[email protected]> * 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 …
Summary
Changes
databaseparameter to MCP server Neo4jConfig class with environment variable parsingNotes
Important
Add support for configurable Neo4j database names via
NEO4J_DATABASEenvironment variable, with updates to configuration, constructors, tests, and documentation.NEO4J_DATABASEenvironment variable for configurable Neo4j database names.Neo4jConfigingraphiti_mcp_server.pyto parseNEO4J_DATABASE.Graphiticonstructor ingraphiti.pyto acceptdatabaseparameter.databaseparameter toNeo4jDriver.test_graphiti_neo4j_database_parameterintest_graphiti_int.py..env.examplefiles andREADME.mdto documentNEO4J_DATABASEusage and Neo4j Enterprise requirement.This description was created by
for 08df73a. You can customize this summary. It will automatically update as commits are pushed.