Neptune MCP Support
This commit is contained in:
parent
352977a002
commit
9814aac1ca
11 changed files with 969 additions and 32 deletions
|
|
@ -71,7 +71,7 @@ embedder:
|
|||
model: "voyage-3"
|
||||
|
||||
database:
|
||||
provider: "falkordb" # Default: falkordb. Options: neo4j, falkordb
|
||||
provider: "falkordb" # Default: falkordb. Options: neo4j, falkordb, neptune
|
||||
|
||||
providers:
|
||||
falkordb:
|
||||
|
|
@ -86,6 +86,13 @@ database:
|
|||
database: ${NEO4J_DATABASE:neo4j}
|
||||
use_parallel_runtime: ${USE_PARALLEL_RUNTIME:false}
|
||||
|
||||
neptune:
|
||||
host: ${NEPTUNE_HOST:neptune-db://localhost}
|
||||
aoss_host: ${AOSS_HOST}
|
||||
port: ${NEPTUNE_PORT:8182}
|
||||
aoss_port: ${AOSS_PORT:443}
|
||||
region: ${AWS_REGION:}
|
||||
|
||||
graphiti:
|
||||
group_id: ${GRAPHITI_GROUP_ID:main}
|
||||
episode_id_prefix: ${EPISODE_ID_PREFIX:}
|
||||
|
|
|
|||
|
|
@ -33,16 +33,17 @@ ENV UV_COMPILE_BYTECODE=1 \
|
|||
WORKDIR /app/mcp
|
||||
|
||||
# Accept graphiti-core version as build argument
|
||||
ARG GRAPHITI_CORE_VERSION=0.23.1
|
||||
ARG GRAPHITI_CORE_VERSION=0.24.1
|
||||
|
||||
# Copy project files for dependency installation
|
||||
COPY pyproject.toml uv.lock ./
|
||||
|
||||
# Remove the local path override for graphiti-core in Docker builds
|
||||
# Install with falkordb and neptune extras for maximum flexibility
|
||||
# and regenerate lock file to match the PyPI version
|
||||
RUN sed -i '/\[tool\.uv\.sources\]/,/graphiti-core/d' pyproject.toml && \
|
||||
if [ -n "${GRAPHITI_CORE_VERSION}" ]; then \
|
||||
sed -i "s/graphiti-core\[falkordb\]>=[0-9]\+\.[0-9]\+\.[0-9]\+$/graphiti-core[falkordb]==${GRAPHITI_CORE_VERSION}/" pyproject.toml; \
|
||||
sed -i "s/graphiti-core\[falkordb\]>=[0-9]\+\.[0-9]\+\.[0-9]\+$/graphiti-core[falkordb,neptune]==${GRAPHITI_CORE_VERSION}/" pyproject.toml; \
|
||||
fi && \
|
||||
echo "Regenerating lock file for PyPI graphiti-core..." && \
|
||||
rm -f uv.lock && \
|
||||
|
|
@ -112,7 +113,7 @@ EOF
|
|||
RUN chmod +x /start-services.sh
|
||||
|
||||
# Add Docker labels with version information
|
||||
ARG MCP_SERVER_VERSION=1.0.1
|
||||
ARG MCP_SERVER_VERSION=1.0.2
|
||||
ARG BUILD_DATE
|
||||
ARG VCS_REF
|
||||
LABEL org.opencontainers.image.title="FalkorDB + Graphiti MCP Server" \
|
||||
|
|
|
|||
|
|
@ -28,16 +28,16 @@ ENV UV_COMPILE_BYTECODE=1 \
|
|||
WORKDIR /app/mcp
|
||||
|
||||
# Accept graphiti-core version as build argument
|
||||
ARG GRAPHITI_CORE_VERSION=0.23.1
|
||||
ARG GRAPHITI_CORE_VERSION=0.24.1
|
||||
|
||||
# Copy project files for dependency installation
|
||||
COPY pyproject.toml uv.lock ./
|
||||
|
||||
# Remove the local path override for graphiti-core in Docker builds
|
||||
# Install with BOTH neo4j and falkordb extras for maximum flexibility
|
||||
# Install with neo4j, falkordb, and neptune extras for maximum flexibility
|
||||
# and regenerate lock file to match the PyPI version
|
||||
RUN sed -i '/\[tool\.uv\.sources\]/,/graphiti-core/d' pyproject.toml && \
|
||||
sed -i "s/graphiti-core\[falkordb\]>=[0-9]\+\.[0-9]\+\.[0-9]\+$/graphiti-core[neo4j,falkordb]==${GRAPHITI_CORE_VERSION}/" pyproject.toml && \
|
||||
sed -i "s/graphiti-core\[falkordb\]>=[0-9]\+\.[0-9]\+\.[0-9]\+$/graphiti-core[neo4j,falkordb,neptune]==${GRAPHITI_CORE_VERSION}/" pyproject.toml && \
|
||||
echo "Regenerating lock file for PyPI graphiti-core..." && \
|
||||
rm -f uv.lock && \
|
||||
uv lock
|
||||
|
|
@ -58,7 +58,7 @@ COPY config/ ./config/
|
|||
RUN mkdir -p /var/log/graphiti
|
||||
|
||||
# Add Docker labels with version information
|
||||
ARG MCP_SERVER_VERSION=1.0.1
|
||||
ARG MCP_SERVER_VERSION=1.0.2
|
||||
ARG BUILD_DATE
|
||||
ARG VCS_REF
|
||||
LABEL org.opencontainers.image.title="Graphiti MCP Server (Standalone)" \
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
[project]
|
||||
name = "mcp-server"
|
||||
version = "1.0.1"
|
||||
version = "1.0.2"
|
||||
description = "Graphiti MCP Server"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.10,<4"
|
||||
dependencies = [
|
||||
"mcp>=1.9.4",
|
||||
"openai>=1.91.0",
|
||||
"graphiti-core[falkordb]>=0.23.1",
|
||||
"graphiti-core[falkordb,neptune]>=0.23.1",
|
||||
"pydantic-settings>=2.0.0",
|
||||
"pyyaml>=6.0",
|
||||
"typing-extensions>=4.0.0",
|
||||
|
|
|
|||
|
|
@ -191,11 +191,42 @@ class FalkorDBProviderConfig(BaseModel):
|
|||
database: str = 'default_db'
|
||||
|
||||
|
||||
class NeptuneProviderConfig(BaseModel):
|
||||
"""Neptune provider configuration."""
|
||||
|
||||
host: str = 'neptune-db://localhost'
|
||||
aoss_host: str | None = None
|
||||
port: int = Field(default=8182, ge=1, le=65535)
|
||||
aoss_port: int = Field(default=443, ge=1, le=65535)
|
||||
region: str | None = None
|
||||
|
||||
def model_post_init(self, __context) -> None:
|
||||
"""Validate Neptune-specific requirements."""
|
||||
if not self.host.startswith(('neptune-db://', 'neptune-graph://')):
|
||||
raise ValueError(
|
||||
'Neptune host must start with neptune-db:// or neptune-graph://\n'
|
||||
'Examples:\n'
|
||||
' - Database: neptune-db://my-cluster.us-east-1.neptune.amazonaws.com\n'
|
||||
' - Analytics: neptune-graph://g-abc123xyz'
|
||||
)
|
||||
|
||||
if not self.aoss_host:
|
||||
raise ValueError(
|
||||
'Neptune requires aoss_host for full-text search.\n'
|
||||
'Set AOSS_HOST environment variable or add to config:\n'
|
||||
' database:\n'
|
||||
' providers:\n'
|
||||
' neptune:\n'
|
||||
' aoss_host: "your-aoss-endpoint.us-east-1.aoss.amazonaws.com"'
|
||||
)
|
||||
|
||||
|
||||
class DatabaseProvidersConfig(BaseModel):
|
||||
"""Database providers configuration."""
|
||||
|
||||
neo4j: Neo4jProviderConfig | None = None
|
||||
falkordb: FalkorDBProviderConfig | None = None
|
||||
neptune: NeptuneProviderConfig | None = None
|
||||
|
||||
|
||||
class DatabaseConfig(BaseModel):
|
||||
|
|
|
|||
|
|
@ -228,6 +228,23 @@ class GraphitiService:
|
|||
embedder=embedder_client,
|
||||
max_coroutines=self.semaphore_limit,
|
||||
)
|
||||
elif self.config.database.provider.lower() == 'neptune':
|
||||
# For Neptune, create a NeptuneDriver instance directly
|
||||
from graphiti_core.driver.neptune_driver import NeptuneDriver
|
||||
|
||||
neptune_driver = NeptuneDriver(
|
||||
host=db_config['host'],
|
||||
aoss_host=db_config['aoss_host'],
|
||||
port=db_config['port'],
|
||||
aoss_port=db_config['aoss_port'],
|
||||
)
|
||||
|
||||
self.client = Graphiti(
|
||||
graph_driver=neptune_driver,
|
||||
llm_client=llm_client,
|
||||
embedder=embedder_client,
|
||||
max_coroutines=self.semaphore_limit,
|
||||
)
|
||||
else:
|
||||
# For Neo4j (default), use the original approach
|
||||
self.client = Graphiti(
|
||||
|
|
@ -266,6 +283,25 @@ class GraphitiService:
|
|||
f' - Or run Neo4j manually: docker run -p 7474:7474 -p 7687:7687 neo4j:latest\n\n'
|
||||
f'{"=" * 70}\n'
|
||||
) from db_error
|
||||
elif db_provider.lower() == 'neptune':
|
||||
raise RuntimeError(
|
||||
f'\n{"=" * 70}\n'
|
||||
f'Database Connection Error: Neptune is not accessible\n'
|
||||
f'{"=" * 70}\n\n'
|
||||
f'Neptune: {db_config.get("host", "unknown")}\n'
|
||||
f'OpenSearch: {db_config.get("aoss_host", "unknown")}\n\n'
|
||||
f'Troubleshooting:\n'
|
||||
f' 1. Verify Neptune endpoint format (neptune-db:// or neptune-graph://)\n'
|
||||
f' 2. Check AWS credentials: aws sts get-caller-identity\n'
|
||||
f' 3. Verify security groups allow access\n'
|
||||
f' 4. Confirm OpenSearch Serverless endpoint is accessible\n'
|
||||
f' 5. Check IAM permissions (neptune-db:*, aoss:*, neptune-graph:*)\n\n'
|
||||
f'AWS Setup:\n'
|
||||
f' - Region: {db_config.get("region", "not set")}\n'
|
||||
f' - Run: aws neptune describe-db-clusters (for Database)\n'
|
||||
f' - Run: aws neptune-graph list-graphs (for Analytics)\n\n'
|
||||
f'{"=" * 70}\n'
|
||||
) from db_error
|
||||
else:
|
||||
raise RuntimeError(
|
||||
f'\n{"=" * 70}\n'
|
||||
|
|
@ -806,7 +842,7 @@ async def initialize_server() -> ServerConfig:
|
|||
)
|
||||
parser.add_argument(
|
||||
'--database-provider',
|
||||
choices=['neo4j', 'falkordb'],
|
||||
choices=['neo4j', 'falkordb', 'neptune'],
|
||||
help='Database provider to use',
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -16,6 +16,14 @@ try:
|
|||
except ImportError:
|
||||
HAS_FALKOR = False
|
||||
|
||||
# Try to import NeptuneDriver if available
|
||||
try:
|
||||
from graphiti_core.driver.neptune_driver import NeptuneDriver # noqa: F401
|
||||
|
||||
HAS_NEPTUNE = True
|
||||
except ImportError:
|
||||
HAS_NEPTUNE = False
|
||||
|
||||
# Kuzu support removed - FalkorDB is now the default
|
||||
from graphiti_core.embedder import EmbedderClient, OpenAIEmbedder
|
||||
from graphiti_core.llm_client import LLMClient, OpenAIClient
|
||||
|
|
@ -433,5 +441,76 @@ class DatabaseDriverFactory:
|
|||
'database': falkor_config.database,
|
||||
}
|
||||
|
||||
case 'neptune':
|
||||
if not HAS_NEPTUNE:
|
||||
raise ValueError(
|
||||
'Neptune driver not available. Install with:\n'
|
||||
' pip install graphiti-core[neptune]\n'
|
||||
'or:\n'
|
||||
' uv add graphiti-core[neptune]'
|
||||
)
|
||||
|
||||
# Validate AWS credentials early
|
||||
import boto3
|
||||
|
||||
try:
|
||||
session = boto3.Session()
|
||||
credentials = session.get_credentials()
|
||||
if not credentials:
|
||||
raise ValueError(
|
||||
'AWS credentials not configured for Neptune.\n'
|
||||
'Configure using one of:\n'
|
||||
' 1. AWS CLI: aws configure\n'
|
||||
' 2. Environment: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY\n'
|
||||
' 3. IAM role (if running on AWS)\n'
|
||||
' 4. Credentials file: ~/.aws/credentials'
|
||||
)
|
||||
|
||||
region = session.region_name
|
||||
if not region:
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.warning('AWS region not detected, using default from config')
|
||||
except Exception as e:
|
||||
raise ValueError(f'AWS credential error: {e}') from e
|
||||
|
||||
# Load Neptune config
|
||||
if config.providers.neptune:
|
||||
neptune_config = config.providers.neptune
|
||||
else:
|
||||
from config.schema import NeptuneProviderConfig
|
||||
|
||||
neptune_config = NeptuneProviderConfig()
|
||||
|
||||
# Environment overrides
|
||||
import os
|
||||
|
||||
host = os.environ.get('NEPTUNE_HOST', neptune_config.host)
|
||||
aoss_host = os.environ.get('AOSS_HOST', neptune_config.aoss_host)
|
||||
port = int(os.environ.get('NEPTUNE_PORT', str(neptune_config.port)))
|
||||
aoss_port = int(os.environ.get('AOSS_PORT', str(neptune_config.aoss_port)))
|
||||
region_override = os.environ.get('AWS_REGION', region or neptune_config.region)
|
||||
|
||||
if not aoss_host:
|
||||
raise ValueError(
|
||||
'Neptune requires AOSS_HOST for full-text search.\n'
|
||||
'Set it in config or environment variable.'
|
||||
)
|
||||
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.info(f'Creating Neptune driver for {host} with region {region_override}')
|
||||
|
||||
return {
|
||||
'driver': 'neptune',
|
||||
'host': host,
|
||||
'aoss_host': aoss_host,
|
||||
'port': port,
|
||||
'aoss_port': aoss_port,
|
||||
'region': region_override,
|
||||
}
|
||||
|
||||
case _:
|
||||
raise ValueError(f'Unsupported Database provider: {provider}')
|
||||
|
|
|
|||
|
|
@ -6,9 +6,6 @@ import os
|
|||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
# Add the current directory to the path
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent / 'src'))
|
||||
|
||||
from config.schema import GraphitiConfig
|
||||
from services.factories import DatabaseDriverFactory, EmbedderFactory, LLMClientFactory
|
||||
|
||||
|
|
|
|||
308
mcp_server/tests/test_neptune_configuration.py
Normal file
308
mcp_server/tests/test_neptune_configuration.py
Normal file
|
|
@ -0,0 +1,308 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Tests for Neptune database provider configuration and validation.
|
||||
|
||||
These tests validate Neptune-specific configuration requirements including:
|
||||
- Endpoint format validation (neptune-db:// and neptune-graph://)
|
||||
- AOSS host requirement validation
|
||||
- AWS credential validation (mocked)
|
||||
- Environment variable overrides
|
||||
- Factory creation with Neptune provider
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
from config.schema import DatabaseProvidersConfig, GraphitiConfig, NeptuneProviderConfig
|
||||
from services.factories import DatabaseDriverFactory
|
||||
|
||||
|
||||
def test_neptune_provider_config_validation():
|
||||
"""Test NeptuneProviderConfig validation rules."""
|
||||
print('\nTesting Neptune provider configuration validation...')
|
||||
|
||||
# Test valid Database endpoint
|
||||
try:
|
||||
config = NeptuneProviderConfig(
|
||||
host='neptune-db://my-cluster.us-east-1.neptune.amazonaws.com',
|
||||
aoss_host='my-aoss.us-east-1.aoss.amazonaws.com',
|
||||
port=8182,
|
||||
aoss_port=443,
|
||||
)
|
||||
print('✓ Valid Database endpoint accepted')
|
||||
assert config.host.startswith('neptune-db://')
|
||||
except Exception as e:
|
||||
print(f'✗ Failed to accept valid Database endpoint: {e}')
|
||||
raise
|
||||
|
||||
# Test valid Analytics endpoint
|
||||
try:
|
||||
config = NeptuneProviderConfig(
|
||||
host='neptune-graph://g-abc123xyz',
|
||||
aoss_host='my-aoss.us-east-1.aoss.amazonaws.com',
|
||||
)
|
||||
print('✓ Valid Analytics endpoint accepted')
|
||||
assert config.host.startswith('neptune-graph://')
|
||||
except Exception as e:
|
||||
print(f'✗ Failed to accept valid Analytics endpoint: {e}')
|
||||
raise
|
||||
|
||||
# Test invalid endpoint format
|
||||
try:
|
||||
config = NeptuneProviderConfig(
|
||||
host='https://my-neptune.com',
|
||||
aoss_host='my-aoss.us-east-1.aoss.amazonaws.com',
|
||||
)
|
||||
print('✗ Invalid endpoint format should have been rejected')
|
||||
raise AssertionError('Expected ValueError for invalid endpoint format')
|
||||
except ValueError as e:
|
||||
print(f'✓ Invalid endpoint format rejected: {str(e)[:60]}...')
|
||||
assert 'must start with neptune-db:// or neptune-graph://' in str(e)
|
||||
|
||||
# Test missing AOSS host
|
||||
try:
|
||||
config = NeptuneProviderConfig(
|
||||
host='neptune-db://my-cluster.us-east-1.neptune.amazonaws.com',
|
||||
aoss_host=None,
|
||||
)
|
||||
print('✗ Missing AOSS host should have been rejected')
|
||||
raise AssertionError('Expected ValueError for missing AOSS host')
|
||||
except ValueError as e:
|
||||
print(f'✓ Missing AOSS host rejected: {str(e)[:60]}...')
|
||||
assert 'requires aoss_host' in str(e)
|
||||
|
||||
# Test port range validation
|
||||
try:
|
||||
config = NeptuneProviderConfig(
|
||||
host='neptune-db://my-cluster.us-east-1.neptune.amazonaws.com',
|
||||
aoss_host='my-aoss.us-east-1.aoss.amazonaws.com',
|
||||
port=70000, # Invalid port
|
||||
)
|
||||
print('✗ Invalid port should have been rejected')
|
||||
raise AssertionError('Expected ValidationError for invalid port')
|
||||
except Exception as e:
|
||||
print(f'✓ Invalid port rejected: {str(e)[:60]}...')
|
||||
|
||||
print('✓ Neptune provider configuration validation complete')
|
||||
|
||||
|
||||
def test_neptune_environment_overrides():
|
||||
"""Test Neptune configuration with environment variable overrides."""
|
||||
print('\nTesting Neptune environment variable overrides...')
|
||||
|
||||
# Set Neptune environment variables
|
||||
test_env = {
|
||||
'NEPTUNE_HOST': 'neptune-db://test-cluster.us-west-2.neptune.amazonaws.com',
|
||||
'AOSS_HOST': 'test-aoss.us-west-2.aoss.amazonaws.com',
|
||||
'NEPTUNE_PORT': '9999',
|
||||
'AOSS_PORT': '9443',
|
||||
'AWS_REGION': 'us-west-2',
|
||||
}
|
||||
|
||||
with patch.dict(os.environ, test_env, clear=False):
|
||||
try:
|
||||
# Load config with environment overrides
|
||||
config_path = Path(__file__).parent.parent / 'config' / 'config.yaml'
|
||||
config = GraphitiConfig(_env_file=None, config_path=str(config_path))
|
||||
|
||||
print(f'✓ Loaded configuration with environment overrides')
|
||||
|
||||
# Verify environment variables were applied
|
||||
if config.database.providers and config.database.providers.neptune:
|
||||
neptune_config = config.database.providers.neptune
|
||||
print(
|
||||
f' Neptune host: {neptune_config.host}'
|
||||
)
|
||||
print(
|
||||
f' AOSS host: {neptune_config.aoss_host}'
|
||||
)
|
||||
print(f' Neptune port: {neptune_config.port}')
|
||||
print(f' AOSS port: {neptune_config.aoss_port}')
|
||||
print(f' Region: {neptune_config.region}')
|
||||
|
||||
# Verify the overrides were applied correctly
|
||||
assert neptune_config.host == test_env['NEPTUNE_HOST']
|
||||
assert neptune_config.aoss_host == test_env['AOSS_HOST']
|
||||
assert neptune_config.port == 9999
|
||||
assert neptune_config.aoss_port == 9443
|
||||
assert neptune_config.region == test_env['AWS_REGION']
|
||||
print('✓ All environment overrides applied correctly')
|
||||
else:
|
||||
print('⚠ Neptune provider not configured, skipping validation')
|
||||
|
||||
except Exception as e:
|
||||
print(f'✗ Failed to load configuration with environment overrides: {e}')
|
||||
raise
|
||||
|
||||
print('✓ Neptune environment override tests complete')
|
||||
|
||||
|
||||
def test_neptune_factory_creation_with_mock_credentials():
|
||||
"""Test Neptune factory creation with mocked AWS credentials."""
|
||||
print('\nTesting Neptune factory creation with mocked credentials...')
|
||||
|
||||
# Mock AWS credentials
|
||||
mock_credentials = MagicMock()
|
||||
mock_credentials.access_key = 'mock_access_key'
|
||||
mock_credentials.secret_key = 'mock_secret_key'
|
||||
mock_credentials.token = None
|
||||
|
||||
mock_session = MagicMock()
|
||||
mock_session.get_credentials.return_value = mock_credentials
|
||||
mock_session.region_name = 'us-east-1'
|
||||
|
||||
# Create test configuration
|
||||
test_config = {
|
||||
'database': {
|
||||
'provider': 'neptune',
|
||||
'providers': {
|
||||
'neptune': {
|
||||
'host': 'neptune-db://test-cluster.us-east-1.neptune.amazonaws.com',
|
||||
'aoss_host': 'test-aoss.us-east-1.aoss.amazonaws.com',
|
||||
'port': 8182,
|
||||
'aoss_port': 443,
|
||||
'region': 'us-east-1',
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
with patch('boto3.Session', return_value=mock_session):
|
||||
try:
|
||||
# Create database config using factory
|
||||
config = DatabaseProvidersConfig(**test_config['database']['providers'])
|
||||
print('✓ Created DatabaseProvidersConfig with Neptune')
|
||||
|
||||
# Verify Neptune config was created
|
||||
assert config.neptune is not None
|
||||
print('✓ Neptune provider config exists')
|
||||
|
||||
# Create driver config from factory
|
||||
db_config = DatabaseDriverFactory.create_config(test_config)
|
||||
print('✓ Created driver config from factory')
|
||||
|
||||
# Verify config contains expected Neptune parameters
|
||||
assert db_config['driver'] == 'neptune'
|
||||
assert db_config['host'] == 'neptune-db://test-cluster.us-east-1.neptune.amazonaws.com'
|
||||
assert db_config['aoss_host'] == 'test-aoss.us-east-1.aoss.amazonaws.com'
|
||||
assert db_config['port'] == 8182
|
||||
assert db_config['aoss_port'] == 443
|
||||
assert db_config['region'] == 'us-east-1'
|
||||
print('✓ All Neptune parameters validated correctly')
|
||||
|
||||
except Exception as e:
|
||||
print(f'✗ Factory creation failed: {e}')
|
||||
raise
|
||||
|
||||
print('✓ Neptune factory creation tests complete')
|
||||
|
||||
|
||||
def test_neptune_factory_missing_credentials():
|
||||
"""Test Neptune factory creation fails gracefully without AWS credentials."""
|
||||
print('\nTesting Neptune factory behavior with missing AWS credentials...')
|
||||
|
||||
# Mock AWS session with no credentials
|
||||
mock_session = MagicMock()
|
||||
mock_session.get_credentials.return_value = None
|
||||
mock_session.region_name = 'us-east-1'
|
||||
|
||||
test_config = {
|
||||
'database': {
|
||||
'provider': 'neptune',
|
||||
'providers': {
|
||||
'neptune': {
|
||||
'host': 'neptune-db://test-cluster.us-east-1.neptune.amazonaws.com',
|
||||
'aoss_host': 'test-aoss.us-east-1.aoss.amazonaws.com',
|
||||
'port': 8182,
|
||||
'aoss_port': 443,
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
with patch('boto3.Session', return_value=mock_session):
|
||||
try:
|
||||
db_config = DatabaseDriverFactory.create_config(test_config)
|
||||
print('✗ Factory should have failed with missing credentials')
|
||||
raise AssertionError('Expected ValueError for missing AWS credentials')
|
||||
except ValueError as e:
|
||||
print(f'✓ Missing credentials rejected: {str(e)[:60]}...')
|
||||
assert 'AWS credentials not configured' in str(e)
|
||||
assert 'aws configure' in str(e).lower()
|
||||
|
||||
print('✓ Missing credentials handling validated')
|
||||
|
||||
|
||||
def test_neptune_factory_import_check():
|
||||
"""Test Neptune factory import checking and error messages."""
|
||||
print('\nTesting Neptune driver import availability...')
|
||||
|
||||
try:
|
||||
from graphiti_core.driver.neptune_driver import NeptuneDriver
|
||||
|
||||
print('✓ NeptuneDriver successfully imported')
|
||||
print(f' NeptuneDriver class: {NeptuneDriver.__name__}')
|
||||
|
||||
except ImportError as e:
|
||||
print(f'⚠ NeptuneDriver not available: {e}')
|
||||
print(' This is expected if graphiti-core[neptune] is not installed')
|
||||
print(' Install with: uv add graphiti-core[neptune]')
|
||||
|
||||
print('✓ Import check complete')
|
||||
|
||||
|
||||
def test_database_providers_config_with_neptune():
|
||||
"""Test DatabaseProvidersConfig accepts Neptune configuration."""
|
||||
print('\nTesting DatabaseProvidersConfig with Neptune...')
|
||||
|
||||
try:
|
||||
config = DatabaseProvidersConfig(
|
||||
neptune=NeptuneProviderConfig(
|
||||
host='neptune-db://my-cluster.us-east-1.neptune.amazonaws.com',
|
||||
aoss_host='my-aoss.us-east-1.aoss.amazonaws.com',
|
||||
port=8182,
|
||||
aoss_port=443,
|
||||
region='us-east-1',
|
||||
)
|
||||
)
|
||||
print('✓ DatabaseProvidersConfig created with Neptune')
|
||||
|
||||
assert config.neptune is not None
|
||||
assert config.neptune.host == 'neptune-db://my-cluster.us-east-1.neptune.amazonaws.com'
|
||||
assert config.neptune.aoss_host == 'my-aoss.us-east-1.aoss.amazonaws.com'
|
||||
assert config.neptune.port == 8182
|
||||
assert config.neptune.aoss_port == 443
|
||||
assert config.neptune.region == 'us-east-1'
|
||||
print('✓ All Neptune fields validated correctly')
|
||||
|
||||
except Exception as e:
|
||||
print(f'✗ Failed to create DatabaseProvidersConfig with Neptune: {e}')
|
||||
raise
|
||||
|
||||
print('✓ DatabaseProvidersConfig Neptune integration complete')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print('=' * 70)
|
||||
print('Neptune Configuration Tests')
|
||||
print('=' * 70)
|
||||
|
||||
try:
|
||||
test_neptune_provider_config_validation()
|
||||
test_neptune_environment_overrides()
|
||||
test_database_providers_config_with_neptune()
|
||||
test_neptune_factory_import_check()
|
||||
test_neptune_factory_creation_with_mock_credentials()
|
||||
test_neptune_factory_missing_credentials()
|
||||
|
||||
print('\n' + '=' * 70)
|
||||
print('All Neptune tests passed!')
|
||||
print('=' * 70)
|
||||
|
||||
except Exception as e:
|
||||
print('\n' + '=' * 70)
|
||||
print(f'Tests failed: {e}')
|
||||
print('=' * 70)
|
||||
raise
|
||||
225
mcp_server/tests/test_neptune_simple.py
Normal file
225
mcp_server/tests/test_neptune_simple.py
Normal file
|
|
@ -0,0 +1,225 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Simple Neptune validation tests that can run with minimal dependencies.
|
||||
|
||||
These tests verify core Neptune configuration logic without requiring
|
||||
full MCP server dependencies.
|
||||
"""
|
||||
|
||||
|
||||
def test_neptune_endpoint_validation():
|
||||
"""Test Neptune endpoint format validation logic."""
|
||||
print('\nTesting Neptune endpoint format validation...')
|
||||
|
||||
valid_database_endpoints = [
|
||||
'neptune-db://my-cluster.us-east-1.neptune.amazonaws.com',
|
||||
'neptune-db://cluster.region.neptune.amazonaws.com',
|
||||
'neptune-db://localhost',
|
||||
]
|
||||
|
||||
valid_analytics_endpoints = [
|
||||
'neptune-graph://g-abc123xyz',
|
||||
'neptune-graph://g-12345',
|
||||
]
|
||||
|
||||
invalid_endpoints = [
|
||||
'https://neptune.com',
|
||||
'http://localhost',
|
||||
'neptune://wrong-prefix',
|
||||
'bolt://localhost',
|
||||
'redis://localhost',
|
||||
]
|
||||
|
||||
# Test valid Database endpoints
|
||||
for endpoint in valid_database_endpoints:
|
||||
is_valid = endpoint.startswith('neptune-db://')
|
||||
assert is_valid, f'Expected {endpoint} to be valid Database endpoint'
|
||||
print(f'✓ Valid Database endpoint: {endpoint}')
|
||||
|
||||
# Test valid Analytics endpoints
|
||||
for endpoint in valid_analytics_endpoints:
|
||||
is_valid = endpoint.startswith('neptune-graph://')
|
||||
assert is_valid, f'Expected {endpoint} to be valid Analytics endpoint'
|
||||
print(f'✓ Valid Analytics endpoint: {endpoint}')
|
||||
|
||||
# Test invalid endpoints
|
||||
for endpoint in invalid_endpoints:
|
||||
is_valid = endpoint.startswith(('neptune-db://', 'neptune-graph://'))
|
||||
assert not is_valid, f'Expected {endpoint} to be invalid'
|
||||
print(f'✓ Rejected invalid endpoint: {endpoint}')
|
||||
|
||||
print('✓ Neptune endpoint validation logic verified')
|
||||
|
||||
|
||||
def test_neptune_port_ranges():
|
||||
"""Test Neptune port validation logic."""
|
||||
print('\nTesting Neptune port validation...')
|
||||
|
||||
valid_ports = [1, 8182, 9999, 443, 65535]
|
||||
invalid_ports = [0, -1, 70000, 100000]
|
||||
|
||||
# Test valid ports
|
||||
for port in valid_ports:
|
||||
is_valid = 1 <= port <= 65535
|
||||
assert is_valid, f'Expected {port} to be valid'
|
||||
print(f'✓ Valid port: {port}')
|
||||
|
||||
# Test invalid ports
|
||||
for port in invalid_ports:
|
||||
is_valid = 1 <= port <= 65535
|
||||
assert not is_valid, f'Expected {port} to be invalid'
|
||||
print(f'✓ Rejected invalid port: {port}')
|
||||
|
||||
print('✓ Neptune port validation logic verified')
|
||||
|
||||
|
||||
def test_neptune_configuration_requirements():
|
||||
"""Test Neptune configuration requirements."""
|
||||
print('\nTesting Neptune configuration requirements...')
|
||||
|
||||
# Neptune requires both graph endpoint and AOSS endpoint
|
||||
required_fields = ['host', 'aoss_host', 'port', 'aoss_port']
|
||||
|
||||
print('Neptune requires the following configuration fields:')
|
||||
for field in required_fields:
|
||||
print(f' - {field}')
|
||||
|
||||
# Verify required fields are documented
|
||||
assert 'host' in required_fields
|
||||
assert 'aoss_host' in required_fields
|
||||
assert 'port' in required_fields
|
||||
assert 'aoss_port' in required_fields
|
||||
|
||||
print('✓ All required Neptune fields documented')
|
||||
|
||||
# Verify default values are sensible
|
||||
defaults = {
|
||||
'host': 'neptune-db://localhost',
|
||||
'port': 8182,
|
||||
'aoss_port': 443,
|
||||
}
|
||||
|
||||
print('\nDefault values:')
|
||||
for field, value in defaults.items():
|
||||
print(f' - {field}: {value}')
|
||||
|
||||
assert defaults['port'] == 8182 # Standard Neptune port
|
||||
assert defaults['aoss_port'] == 443 # Standard HTTPS port for AOSS
|
||||
|
||||
print('✓ Neptune configuration requirements verified')
|
||||
|
||||
|
||||
def test_neptune_error_messages():
|
||||
"""Test Neptune error message quality."""
|
||||
print('\nTesting Neptune error message quality...')
|
||||
|
||||
# Error messages should be helpful and actionable
|
||||
error_scenarios = {
|
||||
'invalid_endpoint': 'host must start with neptune-db:// or neptune-graph://',
|
||||
'missing_aoss': 'requires aoss_host',
|
||||
'missing_credentials': 'AWS credentials not configured',
|
||||
'setup_help': 'aws configure',
|
||||
}
|
||||
|
||||
print('Expected error message content:')
|
||||
for scenario, expected in error_scenarios.items():
|
||||
print(f' - {scenario}: "{expected}"')
|
||||
|
||||
# Verify error messages are informative
|
||||
assert len(error_scenarios) > 0
|
||||
assert all(len(msg) > 10 for msg in error_scenarios.values())
|
||||
|
||||
print('✓ Error message content verified')
|
||||
|
||||
|
||||
def test_neptune_aws_integration():
|
||||
"""Test Neptune AWS integration requirements."""
|
||||
print('\nTesting Neptune AWS integration requirements...')
|
||||
|
||||
# Neptune requires AWS credentials
|
||||
aws_credential_sources = [
|
||||
'AWS CLI (aws configure)',
|
||||
'Environment variables (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)',
|
||||
'IAM role (when running on AWS)',
|
||||
'Credentials file (~/.aws/credentials)',
|
||||
]
|
||||
|
||||
print('Neptune supports the following AWS credential sources:')
|
||||
for source in aws_credential_sources:
|
||||
print(f' - {source}')
|
||||
|
||||
assert len(aws_credential_sources) >= 4
|
||||
print('✓ AWS credential sources documented')
|
||||
|
||||
# Neptune requires AWS region
|
||||
print('\nNeptune requires AWS region configuration')
|
||||
region_sources = [
|
||||
'config.yaml (region field)',
|
||||
'AWS_REGION environment variable',
|
||||
'AWS profile default region',
|
||||
]
|
||||
|
||||
for source in region_sources:
|
||||
print(f' - {source}')
|
||||
|
||||
assert len(region_sources) >= 3
|
||||
print('✓ Region configuration sources documented')
|
||||
|
||||
|
||||
def test_neptune_dependencies():
|
||||
"""Test Neptune dependency requirements."""
|
||||
print('\nTesting Neptune dependency requirements...')
|
||||
|
||||
# Neptune requires specific Python packages
|
||||
required_packages = [
|
||||
'boto3>=1.39.16',
|
||||
'opensearch-py>=3.0.0',
|
||||
'langchain-aws>=0.2.29',
|
||||
]
|
||||
|
||||
print('Neptune requires the following Python packages:')
|
||||
for package in required_packages:
|
||||
print(f' - {package}')
|
||||
|
||||
assert len(required_packages) >= 3
|
||||
print('✓ Dependency requirements documented')
|
||||
|
||||
# Installation methods
|
||||
install_commands = [
|
||||
'pip install graphiti-core[neptune]',
|
||||
'uv add graphiti-core[neptune]',
|
||||
]
|
||||
|
||||
print('\nInstallation commands:')
|
||||
for cmd in install_commands:
|
||||
print(f' - {cmd}')
|
||||
|
||||
assert len(install_commands) >= 2
|
||||
print('✓ Installation methods documented')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print('=' * 70)
|
||||
print('Neptune Simple Validation Tests')
|
||||
print('=' * 70)
|
||||
|
||||
try:
|
||||
test_neptune_endpoint_validation()
|
||||
test_neptune_port_ranges()
|
||||
test_neptune_configuration_requirements()
|
||||
test_neptune_error_messages()
|
||||
test_neptune_aws_integration()
|
||||
test_neptune_dependencies()
|
||||
|
||||
print('\n' + '=' * 70)
|
||||
print('All simple validation tests passed!')
|
||||
print('=' * 70)
|
||||
print('\nNote: For full integration tests, run:')
|
||||
print(' python tests/test_neptune_configuration.py')
|
||||
print('=' * 70)
|
||||
|
||||
except AssertionError as e:
|
||||
print('\n' + '=' * 70)
|
||||
print(f'Test failed: {e}')
|
||||
print('=' * 70)
|
||||
raise
|
||||
289
mcp_server/uv.lock
generated
289
mcp_server/uv.lock
generated
|
|
@ -233,6 +233,34 @@ wheels = [
|
|||
{ url = "https://files.pythonhosted.org/packages/a0/59/76ab57e3fe74484f48a53f8e337171b4a2349e506eabe136d7e01d059086/backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5", size = 12313, upload-time = "2025-07-02T02:27:14.263Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "boto3"
|
||||
version = "1.41.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "botocore" },
|
||||
{ name = "jmespath" },
|
||||
{ name = "s3transfer" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/fa/81/2600e83ddd7cb1dac43d28fd39774434afcda0d85d730402192b1a9266a3/boto3-1.41.2.tar.gz", hash = "sha256:7054fbc61cadab383f40ea6d725013ba6c8f569641dddb14c0055e790280ad6c", size = 111593, upload-time = "2025-11-21T20:32:08.622Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/48/41/1ed7fdc3f124c1cf2df78e605588fa78a182410b832f5b71944a69436171/boto3-1.41.2-py3-none-any.whl", hash = "sha256:edcde82fdae4201aa690e3683f8e5b1a846cf1bbf79d03db4fa8a2f6f46dba9c", size = 139343, upload-time = "2025-11-21T20:32:07.147Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "botocore"
|
||||
version = "1.41.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "jmespath" },
|
||||
{ name = "python-dateutil" },
|
||||
{ name = "urllib3" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/c5/0b/6eb5dc752b240dd0b76d7e3257ae25b70683896d1789e7bfb78fba7c7c99/botocore-1.41.2.tar.gz", hash = "sha256:49a3e8f4c1a1759a687941fef8b36efd7bafcf63c1ef74aa75d6497eb4887c9c", size = 14660558, upload-time = "2025-11-21T20:31:58.785Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/77/4d/516ee2157c0686fbe48ca8b94dffc17a0c35040d4626761d74b1a43215c8/botocore-1.41.2-py3-none-any.whl", hash = "sha256:154052dfaa7292212f01c8fab822c76cd10a15a7e164e4c45e4634eb40214b90", size = 14324839, upload-time = "2025-11-21T20:31:56.236Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cachetools"
|
||||
version = "5.5.2"
|
||||
|
|
@ -455,6 +483,14 @@ wheels = [
|
|||
{ url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "events"
|
||||
version = "0.5"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/25/ed/e47dec0626edd468c84c04d97769e7ab4ea6457b7f54dcb3f72b17fcd876/Events-0.5-py3-none-any.whl", hash = "sha256:a7286af378ba3e46640ac9825156c93bdba7502174dd696090fdfcd4d80a1abd", size = 6758, upload-time = "2023-07-31T08:23:13.645Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "exceptiongroup"
|
||||
version = "1.3.0"
|
||||
|
|
@ -648,7 +684,7 @@ wheels = [
|
|||
|
||||
[[package]]
|
||||
name = "graphiti-core"
|
||||
version = "0.23.1"
|
||||
version = "0.24.1"
|
||||
source = { editable = "../" }
|
||||
dependencies = [
|
||||
{ name = "diskcache" },
|
||||
|
|
@ -665,6 +701,12 @@ dependencies = [
|
|||
falkordb = [
|
||||
{ name = "falkordb" },
|
||||
]
|
||||
neptune = [
|
||||
{ name = "boto3" },
|
||||
{ name = "langchain-aws", version = "0.2.35", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
|
||||
{ name = "langchain-aws", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
|
||||
{ name = "opensearch-py" },
|
||||
]
|
||||
|
||||
[package.metadata]
|
||||
requires-dist = [
|
||||
|
|
@ -734,6 +776,67 @@ wheels = [
|
|||
{ url = "https://files.pythonhosted.org/packages/ab/f8/14672d69a91495f43462c5490067eeafc30346e81bda1a62848e897f9bc3/groq-0.31.0-py3-none-any.whl", hash = "sha256:5e3c7ec9728b7cccf913da982a9b5ebb46dc18a070b35e12a3d6a1e12d6b0f7f", size = 131365, upload-time = "2025-08-05T23:13:59.768Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "grpcio"
|
||||
version = "1.76.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "typing-extensions" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/b6/e0/318c1ce3ae5a17894d5791e87aea147587c9e702f24122cc7a5c8bbaeeb1/grpcio-1.76.0.tar.gz", hash = "sha256:7be78388d6da1a25c0d5ec506523db58b18be22d9c37d8d3a32c08be4987bd73", size = 12785182, upload-time = "2025-10-21T16:23:12.106Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/88/17/ff4795dc9a34b6aee6ec379f1b66438a3789cd1315aac0cbab60d92f74b3/grpcio-1.76.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:65a20de41e85648e00305c1bb09a3598f840422e522277641145a32d42dcefcc", size = 5840037, upload-time = "2025-10-21T16:20:25.069Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/4e/ff/35f9b96e3fa2f12e1dcd58a4513a2e2294a001d64dec81677361b7040c9a/grpcio-1.76.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:40ad3afe81676fd9ec6d9d406eda00933f218038433980aa19d401490e46ecde", size = 11836482, upload-time = "2025-10-21T16:20:30.113Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3e/1c/8374990f9545e99462caacea5413ed783014b3b66ace49e35c533f07507b/grpcio-1.76.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:035d90bc79eaa4bed83f524331d55e35820725c9fbb00ffa1904d5550ed7ede3", size = 6407178, upload-time = "2025-10-21T16:20:32.733Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/1e/77/36fd7d7c75a6c12542c90a6d647a27935a1ecaad03e0ffdb7c42db6b04d2/grpcio-1.76.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4215d3a102bd95e2e11b5395c78562967959824156af11fa93d18fdd18050990", size = 7075684, upload-time = "2025-10-21T16:20:35.435Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/38/f7/e3cdb252492278e004722306c5a8935eae91e64ea11f0af3437a7de2e2b7/grpcio-1.76.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:49ce47231818806067aea3324d4bf13825b658ad662d3b25fada0bdad9b8a6af", size = 6611133, upload-time = "2025-10-21T16:20:37.541Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7e/20/340db7af162ccd20a0893b5f3c4a5d676af7b71105517e62279b5b61d95a/grpcio-1.76.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8cc3309d8e08fd79089e13ed4819d0af72aa935dd8f435a195fd152796752ff2", size = 7195507, upload-time = "2025-10-21T16:20:39.643Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/10/f0/b2160addc1487bd8fa4810857a27132fb4ce35c1b330c2f3ac45d697b106/grpcio-1.76.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:971fd5a1d6e62e00d945423a567e42eb1fa678ba89072832185ca836a94daaa6", size = 8160651, upload-time = "2025-10-21T16:20:42.492Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/2c/2c/ac6f98aa113c6ef111b3f347854e99ebb7fb9d8f7bb3af1491d438f62af4/grpcio-1.76.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d9adda641db7207e800a7f089068f6f645959f2df27e870ee81d44701dd9db3", size = 7620568, upload-time = "2025-10-21T16:20:45.995Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/90/84/7852f7e087285e3ac17a2703bc4129fafee52d77c6c82af97d905566857e/grpcio-1.76.0-cp310-cp310-win32.whl", hash = "sha256:063065249d9e7e0782d03d2bca50787f53bd0fb89a67de9a7b521c4a01f1989b", size = 3998879, upload-time = "2025-10-21T16:20:48.592Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/10/30/d3d2adcbb6dd3ff59d6ac3df6ef830e02b437fb5c90990429fd180e52f30/grpcio-1.76.0-cp310-cp310-win_amd64.whl", hash = "sha256:a6ae758eb08088d36812dd5d9af7a9859c05b1e0f714470ea243694b49278e7b", size = 4706892, upload-time = "2025-10-21T16:20:50.697Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a0/00/8163a1beeb6971f66b4bbe6ac9457b97948beba8dd2fc8e1281dce7f79ec/grpcio-1.76.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2e1743fbd7f5fa713a1b0a8ac8ebabf0ec980b5d8809ec358d488e273b9cf02a", size = 5843567, upload-time = "2025-10-21T16:20:52.829Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/10/c1/934202f5cf335e6d852530ce14ddb0fef21be612ba9ecbbcbd4d748ca32d/grpcio-1.76.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:a8c2cf1209497cf659a667d7dea88985e834c24b7c3b605e6254cbb5076d985c", size = 11848017, upload-time = "2025-10-21T16:20:56.705Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/11/0b/8dec16b1863d74af6eb3543928600ec2195af49ca58b16334972f6775663/grpcio-1.76.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:08caea849a9d3c71a542827d6df9d5a69067b0a1efbea8a855633ff5d9571465", size = 6412027, upload-time = "2025-10-21T16:20:59.3Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d7/64/7b9e6e7ab910bea9d46f2c090380bab274a0b91fb0a2fe9b0cd399fffa12/grpcio-1.76.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f0e34c2079d47ae9f6188211db9e777c619a21d4faba6977774e8fa43b085e48", size = 7075913, upload-time = "2025-10-21T16:21:01.645Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/68/86/093c46e9546073cefa789bd76d44c5cb2abc824ca62af0c18be590ff13ba/grpcio-1.76.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8843114c0cfce61b40ad48df65abcfc00d4dba82eae8718fab5352390848c5da", size = 6615417, upload-time = "2025-10-21T16:21:03.844Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f7/b6/5709a3a68500a9c03da6fb71740dcdd5ef245e39266461a03f31a57036d8/grpcio-1.76.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8eddfb4d203a237da6f3cc8a540dad0517d274b5a1e9e636fd8d2c79b5c1d397", size = 7199683, upload-time = "2025-10-21T16:21:06.195Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/91/d3/4b1f2bf16ed52ce0b508161df3a2d186e4935379a159a834cb4a7d687429/grpcio-1.76.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:32483fe2aab2c3794101c2a159070584e5db11d0aa091b2c0ea9c4fc43d0d749", size = 8163109, upload-time = "2025-10-21T16:21:08.498Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/5c/61/d9043f95f5f4cf085ac5dd6137b469d41befb04bd80280952ffa2a4c3f12/grpcio-1.76.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dcfe41187da8992c5f40aa8c5ec086fa3672834d2be57a32384c08d5a05b4c00", size = 7626676, upload-time = "2025-10-21T16:21:10.693Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/36/95/fd9a5152ca02d8881e4dd419cdd790e11805979f499a2e5b96488b85cf27/grpcio-1.76.0-cp311-cp311-win32.whl", hash = "sha256:2107b0c024d1b35f4083f11245c0e23846ae64d02f40b2b226684840260ed054", size = 3997688, upload-time = "2025-10-21T16:21:12.746Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/60/9c/5c359c8d4c9176cfa3c61ecd4efe5affe1f38d9bae81e81ac7186b4c9cc8/grpcio-1.76.0-cp311-cp311-win_amd64.whl", hash = "sha256:522175aba7af9113c48ec10cc471b9b9bd4f6ceb36aeb4544a8e2c80ed9d252d", size = 4709315, upload-time = "2025-10-21T16:21:15.26Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/bf/05/8e29121994b8d959ffa0afd28996d452f291b48cfc0875619de0bde2c50c/grpcio-1.76.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:81fd9652b37b36f16138611c7e884eb82e0cec137c40d3ef7c3f9b3ed00f6ed8", size = 5799718, upload-time = "2025-10-21T16:21:17.939Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d9/75/11d0e66b3cdf998c996489581bdad8900db79ebd83513e45c19548f1cba4/grpcio-1.76.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:04bbe1bfe3a68bbfd4e52402ab7d4eb59d72d02647ae2042204326cf4bbad280", size = 11825627, upload-time = "2025-10-21T16:21:20.466Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/28/50/2f0aa0498bc188048f5d9504dcc5c2c24f2eb1a9337cd0fa09a61a2e75f0/grpcio-1.76.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d388087771c837cdb6515539f43b9d4bf0b0f23593a24054ac16f7a960be16f4", size = 6359167, upload-time = "2025-10-21T16:21:23.122Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/66/e5/bbf0bb97d29ede1d59d6588af40018cfc345b17ce979b7b45424628dc8bb/grpcio-1.76.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:9f8f757bebaaea112c00dba718fc0d3260052ce714e25804a03f93f5d1c6cc11", size = 7044267, upload-time = "2025-10-21T16:21:25.995Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f5/86/f6ec2164f743d9609691115ae8ece098c76b894ebe4f7c94a655c6b03e98/grpcio-1.76.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:980a846182ce88c4f2f7e2c22c56aefd515daeb36149d1c897f83cf57999e0b6", size = 6573963, upload-time = "2025-10-21T16:21:28.631Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/60/bc/8d9d0d8505feccfdf38a766d262c71e73639c165b311c9457208b56d92ae/grpcio-1.76.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f92f88e6c033db65a5ae3d97905c8fea9c725b63e28d5a75cb73b49bda5024d8", size = 7164484, upload-time = "2025-10-21T16:21:30.837Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/67/e6/5d6c2fc10b95edf6df9b8f19cf10a34263b7fd48493936fffd5085521292/grpcio-1.76.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4baf3cbe2f0be3289eb68ac8ae771156971848bb8aaff60bad42005539431980", size = 8127777, upload-time = "2025-10-21T16:21:33.577Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3f/c8/dce8ff21c86abe025efe304d9e31fdb0deaaa3b502b6a78141080f206da0/grpcio-1.76.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:615ba64c208aaceb5ec83bfdce7728b80bfeb8be97562944836a7a0a9647d882", size = 7594014, upload-time = "2025-10-21T16:21:41.882Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e0/42/ad28191ebf983a5d0ecef90bab66baa5a6b18f2bfdef9d0a63b1973d9f75/grpcio-1.76.0-cp312-cp312-win32.whl", hash = "sha256:45d59a649a82df5718fd9527ce775fd66d1af35e6d31abdcdc906a49c6822958", size = 3984750, upload-time = "2025-10-21T16:21:44.006Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/9e/00/7bd478cbb851c04a48baccaa49b75abaa8e4122f7d86da797500cccdd771/grpcio-1.76.0-cp312-cp312-win_amd64.whl", hash = "sha256:c088e7a90b6017307f423efbb9d1ba97a22aa2170876223f9709e9d1de0b5347", size = 4704003, upload-time = "2025-10-21T16:21:46.244Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/fc/ed/71467ab770effc9e8cef5f2e7388beb2be26ed642d567697bb103a790c72/grpcio-1.76.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:26ef06c73eb53267c2b319f43e6634c7556ea37672029241a056629af27c10e2", size = 5807716, upload-time = "2025-10-21T16:21:48.475Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/2c/85/c6ed56f9817fab03fa8a111ca91469941fb514e3e3ce6d793cb8f1e1347b/grpcio-1.76.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:45e0111e73f43f735d70786557dc38141185072d7ff8dc1829d6a77ac1471468", size = 11821522, upload-time = "2025-10-21T16:21:51.142Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ac/31/2b8a235ab40c39cbc141ef647f8a6eb7b0028f023015a4842933bc0d6831/grpcio-1.76.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:83d57312a58dcfe2a3a0f9d1389b299438909a02db60e2f2ea2ae2d8034909d3", size = 6362558, upload-time = "2025-10-21T16:21:54.213Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/bd/64/9784eab483358e08847498ee56faf8ff6ea8e0a4592568d9f68edc97e9e9/grpcio-1.76.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:3e2a27c89eb9ac3d81ec8835e12414d73536c6e620355d65102503064a4ed6eb", size = 7049990, upload-time = "2025-10-21T16:21:56.476Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/2b/94/8c12319a6369434e7a184b987e8e9f3b49a114c489b8315f029e24de4837/grpcio-1.76.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61f69297cba3950a524f61c7c8ee12e55c486cb5f7db47ff9dcee33da6f0d3ae", size = 6575387, upload-time = "2025-10-21T16:21:59.051Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/15/0f/f12c32b03f731f4a6242f771f63039df182c8b8e2cf8075b245b409259d4/grpcio-1.76.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6a15c17af8839b6801d554263c546c69c4d7718ad4321e3166175b37eaacca77", size = 7166668, upload-time = "2025-10-21T16:22:02.049Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ff/2d/3ec9ce0c2b1d92dd59d1c3264aaec9f0f7c817d6e8ac683b97198a36ed5a/grpcio-1.76.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:25a18e9810fbc7e7f03ec2516addc116a957f8cbb8cbc95ccc80faa072743d03", size = 8124928, upload-time = "2025-10-21T16:22:04.984Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/1a/74/fd3317be5672f4856bcdd1a9e7b5e17554692d3db9a3b273879dc02d657d/grpcio-1.76.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:931091142fd8cc14edccc0845a79248bc155425eee9a98b2db2ea4f00a235a42", size = 7589983, upload-time = "2025-10-21T16:22:07.881Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/45/bb/ca038cf420f405971f19821c8c15bcbc875505f6ffadafe9ffd77871dc4c/grpcio-1.76.0-cp313-cp313-win32.whl", hash = "sha256:5e8571632780e08526f118f74170ad8d50fb0a48c23a746bef2a6ebade3abd6f", size = 3984727, upload-time = "2025-10-21T16:22:10.032Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/41/80/84087dc56437ced7cdd4b13d7875e7439a52a261e3ab4e06488ba6173b0a/grpcio-1.76.0-cp313-cp313-win_amd64.whl", hash = "sha256:f9f7bd5faab55f47231ad8dba7787866b69f5e93bc306e3915606779bbfb4ba8", size = 4702799, upload-time = "2025-10-21T16:22:12.709Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b4/46/39adac80de49d678e6e073b70204091e76631e03e94928b9ea4ecf0f6e0e/grpcio-1.76.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:ff8a59ea85a1f2191a0ffcc61298c571bc566332f82e5f5be1b83c9d8e668a62", size = 5808417, upload-time = "2025-10-21T16:22:15.02Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/9c/f5/a4531f7fb8b4e2a60b94e39d5d924469b7a6988176b3422487be61fe2998/grpcio-1.76.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:06c3d6b076e7b593905d04fdba6a0525711b3466f43b3400266f04ff735de0cd", size = 11828219, upload-time = "2025-10-21T16:22:17.954Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/4b/1c/de55d868ed7a8bd6acc6b1d6ddc4aa36d07a9f31d33c912c804adb1b971b/grpcio-1.76.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fd5ef5932f6475c436c4a55e4336ebbe47bd3272be04964a03d316bbf4afbcbc", size = 6367826, upload-time = "2025-10-21T16:22:20.721Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/59/64/99e44c02b5adb0ad13ab3adc89cb33cb54bfa90c74770f2607eea629b86f/grpcio-1.76.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b331680e46239e090f5b3cead313cc772f6caa7d0fc8de349337563125361a4a", size = 7049550, upload-time = "2025-10-21T16:22:23.637Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/43/28/40a5be3f9a86949b83e7d6a2ad6011d993cbe9b6bd27bea881f61c7788b6/grpcio-1.76.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2229ae655ec4e8999599469559e97630185fdd53ae1e8997d147b7c9b2b72cba", size = 6575564, upload-time = "2025-10-21T16:22:26.016Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/4b/a9/1be18e6055b64467440208a8559afac243c66a8b904213af6f392dc2212f/grpcio-1.76.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:490fa6d203992c47c7b9e4a9d39003a0c2bcc1c9aa3c058730884bbbb0ee9f09", size = 7176236, upload-time = "2025-10-21T16:22:28.362Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/0f/55/dba05d3fcc151ce6e81327541d2cc8394f442f6b350fead67401661bf041/grpcio-1.76.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:479496325ce554792dba6548fae3df31a72cef7bad71ca2e12b0e58f9b336bfc", size = 8125795, upload-time = "2025-10-21T16:22:31.075Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/4a/45/122df922d05655f63930cf42c9e3f72ba20aadb26c100ee105cad4ce4257/grpcio-1.76.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1c9b93f79f48b03ada57ea24725d83a30284a012ec27eab2cf7e50a550cbbbcc", size = 7592214, upload-time = "2025-10-21T16:22:33.831Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/4a/6e/0b899b7f6b66e5af39e377055fb4a6675c9ee28431df5708139df2e93233/grpcio-1.76.0-cp314-cp314-win32.whl", hash = "sha256:747fa73efa9b8b1488a95d0ba1039c8e2dca0f741612d80415b1e1c560febf4e", size = 4062961, upload-time = "2025-10-21T16:22:36.468Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/19/41/0b430b01a2eb38ee887f88c1f07644a1df8e289353b78e82b37ef988fb64/grpcio-1.76.0-cp314-cp314-win_amd64.whl", hash = "sha256:922fa70ba549fce362d2e2871ab542082d66e2aaf0c19480ea453905b01f384e", size = 4834462, upload-time = "2025-10-21T16:22:39.772Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "h11"
|
||||
version = "0.16.0"
|
||||
|
|
@ -916,6 +1019,15 @@ wheels = [
|
|||
{ url = "https://files.pythonhosted.org/packages/b3/4a/4175a563579e884192ba6e81725fc0448b042024419be8d83aa8a80a3f44/jiter-0.10.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa96f2abba33dc77f79b4cf791840230375f9534e5fac927ccceb58c5e604a5", size = 354213, upload-time = "2025-05-18T19:04:41.894Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jmespath"
|
||||
version = "1.0.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/00/2a/e867e8531cf3e36b41201936b7fa7ba7b5702dbef42922193f05c8976cd6/jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe", size = 25843, upload-time = "2022-06-17T18:00:12.224Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256, upload-time = "2022-06-17T18:00:10.251Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "joblib"
|
||||
version = "1.5.1"
|
||||
|
|
@ -947,35 +1059,119 @@ wheels = [
|
|||
]
|
||||
|
||||
[[package]]
|
||||
name = "langchain-core"
|
||||
version = "0.3.74"
|
||||
name = "langchain-aws"
|
||||
version = "0.2.35"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "jsonpatch" },
|
||||
{ name = "langsmith" },
|
||||
{ name = "packaging" },
|
||||
{ name = "pydantic" },
|
||||
{ name = "pyyaml" },
|
||||
{ name = "tenacity" },
|
||||
{ name = "typing-extensions" },
|
||||
resolution-markers = [
|
||||
"python_full_version >= '3.14'",
|
||||
"python_full_version == '3.12.*'",
|
||||
"python_full_version == '3.13.*'",
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/f1/c6/5d755a0f1f4857abbe5ea6f5907ed0e2b5df52bf4dde0a0fd768290e3084/langchain_core-0.3.74.tar.gz", hash = "sha256:ff604441aeade942fbcc0a3860a592daba7671345230c2078ba2eb5f82b6ba76", size = 569553, upload-time = "2025-08-07T20:47:05.094Z" }
|
||||
dependencies = [
|
||||
{ name = "boto3", marker = "python_full_version >= '3.12'" },
|
||||
{ name = "langchain-core", version = "0.3.80", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
|
||||
{ name = "numpy", marker = "python_full_version >= '3.12'" },
|
||||
{ name = "pydantic", marker = "python_full_version >= '3.12'" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/8d/7a/19a903725acbb1c4481dc0391b2551250bf4e04cbe5a891a55e09319772b/langchain_aws-0.2.35.tar.gz", hash = "sha256:45793a34fe45d365f4292cc768db74669ca24601d2c5da1ac6f44403750d70af", size = 120567, upload-time = "2025-10-02T23:59:57.204Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/4d/26/545283681ac0379d31c7ad0bac5f195e1982092d76c65ca048db9e3cec0e/langchain_core-0.3.74-py3-none-any.whl", hash = "sha256:088338b5bc2f6a66892f9afc777992c24ee3188f41cbc603d09181e34a228ce7", size = 443453, upload-time = "2025-08-07T20:47:03.853Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/41/92/1827652b4ed6d8ffaffe8b40be49a6889a9b3cb4b523fb56871691c48601/langchain_aws-0.2.35-py3-none-any.whl", hash = "sha256:8ddb10f3c29f6d52bcbaa4d7f4f56462acf01f608adc7c70f41e5a476899a6bc", size = 145620, upload-time = "2025-10-02T23:59:55.288Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "langchain-aws"
|
||||
version = "1.1.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
resolution-markers = [
|
||||
"python_full_version < '3.12'",
|
||||
]
|
||||
dependencies = [
|
||||
{ name = "boto3", marker = "python_full_version < '3.12'" },
|
||||
{ name = "langchain-core", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
|
||||
{ name = "numpy", marker = "python_full_version < '3.12'" },
|
||||
{ name = "pydantic", marker = "python_full_version < '3.12'" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/52/1d/bb306951b1c394b7a27effb8eb6c9ee65dd77fcc4be7c20f76e3299a9e1e/langchain_aws-1.1.0.tar.gz", hash = "sha256:1e2f8570328eae4907c3cf7e900dc68d8034ddc865d9dc96823c9f9d8cccb901", size = 393899, upload-time = "2025-11-24T14:35:24.216Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/26/33/91b8d2a7570657b371382b45054142c54165a51706990a5c1b4cc40c0e9a/langchain_aws-1.1.0-py3-none-any.whl", hash = "sha256:8ec074615b42839e035354063717374c32c63f5028ef5221ba073fd5f3ef5e37", size = 152432, upload-time = "2025-11-24T14:35:23.004Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "langchain-core"
|
||||
version = "0.3.80"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
resolution-markers = [
|
||||
"python_full_version >= '3.14'",
|
||||
"python_full_version == '3.12.*'",
|
||||
"python_full_version == '3.13.*'",
|
||||
]
|
||||
dependencies = [
|
||||
{ name = "jsonpatch", marker = "python_full_version >= '3.12'" },
|
||||
{ name = "langsmith", marker = "python_full_version >= '3.12'" },
|
||||
{ name = "packaging", marker = "python_full_version >= '3.12'" },
|
||||
{ name = "pydantic", marker = "python_full_version >= '3.12'" },
|
||||
{ name = "pyyaml", marker = "python_full_version >= '3.12'" },
|
||||
{ name = "tenacity", marker = "python_full_version >= '3.12'" },
|
||||
{ name = "typing-extensions", marker = "python_full_version >= '3.12'" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/49/49/f76647b7ba1a6f9c11b0343056ab4d3e5fc445981d205237fed882b2ad60/langchain_core-0.3.80.tar.gz", hash = "sha256:29636b82513ab49e834764d023c4d18554d3d719a185d37b019d0a8ae948c6bb", size = 583629, upload-time = "2025-11-19T22:23:18.771Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/da/e8/e7a090ebe37f2b071c64e81b99fb1273b3151ae932f560bb94c22f191cde/langchain_core-0.3.80-py3-none-any.whl", hash = "sha256:2141e3838d100d17dce2359f561ec0df52c526bae0de6d4f469f8026c5747456", size = 450786, upload-time = "2025-11-19T22:23:17.133Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "langchain-core"
|
||||
version = "1.1.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
resolution-markers = [
|
||||
"python_full_version < '3.12'",
|
||||
]
|
||||
dependencies = [
|
||||
{ name = "jsonpatch", marker = "python_full_version < '3.12'" },
|
||||
{ name = "langsmith", marker = "python_full_version < '3.12'" },
|
||||
{ name = "packaging", marker = "python_full_version < '3.12'" },
|
||||
{ name = "pydantic", marker = "python_full_version < '3.12'" },
|
||||
{ name = "pyyaml", marker = "python_full_version < '3.12'" },
|
||||
{ name = "tenacity", marker = "python_full_version < '3.12'" },
|
||||
{ name = "typing-extensions", marker = "python_full_version < '3.12'" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/1e/17/67c1cc2ace919e2b02dd9d783154d7fb3f1495a4ef835d9cd163b7855ac2/langchain_core-1.1.0.tar.gz", hash = "sha256:2b76a82d427922c8bc51c08404af4fc2a29e9f161dfe2297cb05091e810201e7", size = 781995, upload-time = "2025-11-21T21:01:26.958Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/71/1e/e129fc471a2d2a7b3804480a937b5ab9319cab9f4142624fcb115f925501/langchain_core-1.1.0-py3-none-any.whl", hash = "sha256:2c9f27dadc6d21ed4aa46506a37a56e6a7e2d2f9141922dc5c251ba921822ee6", size = 473752, upload-time = "2025-11-21T21:01:25.841Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "langchain-text-splitters"
|
||||
version = "0.3.9"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
resolution-markers = [
|
||||
"python_full_version >= '3.14'",
|
||||
"python_full_version == '3.12.*'",
|
||||
"python_full_version == '3.13.*'",
|
||||
]
|
||||
dependencies = [
|
||||
{ name = "langchain-core" },
|
||||
{ name = "langchain-core", version = "0.3.80", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/91/52/d43ad77acae169210cc476cbc1e4ab37a701017c950211a11ab500fe7d7e/langchain_text_splitters-0.3.9.tar.gz", hash = "sha256:7cd1e5a3aaf609979583eeca2eb34177622570b8fa8f586a605c6b1c34e7ebdb", size = 45260, upload-time = "2025-07-24T14:38:45.14Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/e2/52/7638394b88bc15083fd2c3752a843784d9d2d110d68fed6437c8607fb749/langchain_text_splitters-0.3.9-py3-none-any.whl", hash = "sha256:cee0bb816211584ea79cc79927317c358543f40404bcfdd69e69ba3ccde54401", size = 33314, upload-time = "2025-07-24T14:38:43.953Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "langchain-text-splitters"
|
||||
version = "1.0.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
resolution-markers = [
|
||||
"python_full_version < '3.12'",
|
||||
]
|
||||
dependencies = [
|
||||
{ name = "langchain-core", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/fa/2e/c833dcc379c1c086453708ef5eef7d4d1f808559ca4458bd6569d5d83ad7/langchain_text_splitters-1.0.0.tar.gz", hash = "sha256:d8580a20ad7ed10b432feb273e5758b2cc0902d094919629cec0e1ad691a6744", size = 264257, upload-time = "2025-10-17T14:33:41.743Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/1e/97/d362353ab04f865af6f81d4d46e7aa428734aa032de0017934b771fc34b7/langchain_text_splitters-1.0.0-py3-none-any.whl", hash = "sha256:f00c8219d3468f2c5bd951b708b6a7dd9bc3c62d0cfb83124c377f7170f33b2e", size = 33851, upload-time = "2025-10-17T14:33:40.46Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "langsmith"
|
||||
version = "0.4.16"
|
||||
|
|
@ -1074,10 +1270,10 @@ wheels = [
|
|||
|
||||
[[package]]
|
||||
name = "mcp-server"
|
||||
version = "1.0.1"
|
||||
version = "1.0.2"
|
||||
source = { virtual = "." }
|
||||
dependencies = [
|
||||
{ name = "graphiti-core", extra = ["falkordb"] },
|
||||
{ name = "graphiti-core", extra = ["falkordb", "neptune"] },
|
||||
{ name = "mcp" },
|
||||
{ name = "openai" },
|
||||
{ name = "pydantic-settings" },
|
||||
|
|
@ -1115,7 +1311,7 @@ requires-dist = [
|
|||
{ name = "anthropic", marker = "extra == 'providers'", specifier = ">=0.49.0" },
|
||||
{ name = "azure-identity", marker = "extra == 'azure'", specifier = ">=1.21.0" },
|
||||
{ name = "google-genai", marker = "extra == 'providers'", specifier = ">=1.8.0" },
|
||||
{ name = "graphiti-core", extras = ["falkordb"], editable = "../" },
|
||||
{ name = "graphiti-core", extras = ["falkordb", "neptune"], editable = "../" },
|
||||
{ name = "groq", marker = "extra == 'providers'", specifier = ">=0.2.0" },
|
||||
{ name = "mcp", specifier = ">=1.9.4" },
|
||||
{ name = "openai", specifier = ">=1.91.0" },
|
||||
|
|
@ -1514,6 +1710,35 @@ wheels = [
|
|||
{ url = "https://files.pythonhosted.org/packages/7a/d2/f99bdd6fc737d6b3cf0df895508d621fc9a386b375a1230ee81d46c5436e/openai-1.91.0-py3-none-any.whl", hash = "sha256:207f87aa3bc49365e014fac2f7e291b99929f4fe126c4654143440e0ad446a5f", size = 735837, upload-time = "2025-06-23T18:27:08.913Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "opensearch-protobufs"
|
||||
version = "0.19.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "grpcio" },
|
||||
{ name = "protobuf" },
|
||||
]
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/16/e2/8a09dbdbfe51e30dfecb625a0f5c524a53bfa4b1fba168f73ac85621dba2/opensearch_protobufs-0.19.0-py3-none-any.whl", hash = "sha256:5137c9c2323cc7debb694754b820ca4cfb5fc8eb180c41ff125698c3ee11bfc2", size = 39778, upload-time = "2025-09-29T20:05:52.379Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "opensearch-py"
|
||||
version = "3.1.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "certifi" },
|
||||
{ name = "events" },
|
||||
{ name = "opensearch-protobufs" },
|
||||
{ name = "python-dateutil" },
|
||||
{ name = "requests" },
|
||||
{ name = "urllib3" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/65/9f/d4969f7e8fa221bfebf254cc3056e7c743ce36ac9874e06110474f7c947d/opensearch_py-3.1.0.tar.gz", hash = "sha256:883573af13175ff102b61c80b77934a9e937bdcc40cda2b92051ad53336bc055", size = 258616, upload-time = "2025-11-20T16:37:36.777Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/08/a1/293c8ad81768ad625283d960685bde07c6302abf20a685e693b48ab6eb91/opensearch_py-3.1.0-py3-none-any.whl", hash = "sha256:e5af83d0454323e6ea9ddee8c0dcc185c0181054592d23cb701da46271a3b65b", size = 385729, upload-time = "2025-11-20T16:37:34.941Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "orjson"
|
||||
version = "3.11.2"
|
||||
|
|
@ -1817,6 +2042,21 @@ wheels = [
|
|||
{ url = "https://files.pythonhosted.org/packages/cc/35/cc0aaecf278bb4575b8555f2b137de5ab821595ddae9da9d3cd1da4072c7/propcache-0.3.2-py3-none-any.whl", hash = "sha256:98f1ec44fb675f5052cccc8e609c46ed23a35a1cfd18545ad4e29002d858a43f", size = 12663, upload-time = "2025-06-09T22:56:04.484Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "protobuf"
|
||||
version = "6.33.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/0a/03/a1440979a3f74f16cab3b75b0da1a1a7f922d56a8ddea96092391998edc0/protobuf-6.33.1.tar.gz", hash = "sha256:97f65757e8d09870de6fd973aeddb92f85435607235d20b2dfed93405d00c85b", size = 443432, upload-time = "2025-11-13T16:44:18.895Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/06/f1/446a9bbd2c60772ca36556bac8bfde40eceb28d9cc7838755bc41e001d8f/protobuf-6.33.1-cp310-abi3-win32.whl", hash = "sha256:f8d3fdbc966aaab1d05046d0240dd94d40f2a8c62856d41eaa141ff64a79de6b", size = 425593, upload-time = "2025-11-13T16:44:06.275Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a6/79/8780a378c650e3df849b73de8b13cf5412f521ca2ff9b78a45c247029440/protobuf-6.33.1-cp310-abi3-win_amd64.whl", hash = "sha256:923aa6d27a92bf44394f6abf7ea0500f38769d4b07f4be41cb52bd8b1123b9ed", size = 436883, upload-time = "2025-11-13T16:44:09.222Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/cd/93/26213ff72b103ae55bb0d73e7fb91ea570ef407c3ab4fd2f1f27cac16044/protobuf-6.33.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:fe34575f2bdde76ac429ec7b570235bf0c788883e70aee90068e9981806f2490", size = 427522, upload-time = "2025-11-13T16:44:10.475Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c2/32/df4a35247923393aa6b887c3b3244a8c941c32a25681775f96e2b418f90e/protobuf-6.33.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:f8adba2e44cde2d7618996b3fc02341f03f5bc3f2748be72dc7b063319276178", size = 324445, upload-time = "2025-11-13T16:44:11.869Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8e/d0/d796e419e2ec93d2f3fa44888861c3f88f722cde02b7c3488fcc6a166820/protobuf-6.33.1-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:0f4cf01222c0d959c2b399142deb526de420be8236f22c71356e2a544e153c53", size = 339161, upload-time = "2025-11-13T16:44:12.778Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/1d/2a/3c5f05a4af06649547027d288747f68525755de692a26a7720dced3652c0/protobuf-6.33.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:8fd7d5e0eb08cd5b87fd3df49bc193f5cfd778701f47e11d127d0afc6c39f1d1", size = 323171, upload-time = "2025-11-13T16:44:14.035Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/08/b4/46310463b4f6ceef310f8348786f3cff181cea671578e3d9743ba61a459e/protobuf-6.33.1-py3-none-any.whl", hash = "sha256:d595a9fd694fdeb061a62fbe10eb039cc1e444df81ec9bb70c7fc59ebcb1eafa", size = 170477, upload-time = "2025-11-13T16:44:17.633Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "psutil"
|
||||
version = "7.1.2"
|
||||
|
|
@ -2321,6 +2561,18 @@ wheels = [
|
|||
{ url = "https://files.pythonhosted.org/packages/24/3c/21cf283d67af33a8e6ed242396863af195a8a6134ec581524fd22b9811b6/ruff-0.12.10-py3-none-win_arm64.whl", hash = "sha256:cc138cc06ed9d4bfa9d667a65af7172b47840e1a98b02ce7011c391e54635ffc", size = 12074225, upload-time = "2025-08-21T18:23:20.137Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "s3transfer"
|
||||
version = "0.15.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "botocore" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/ca/bb/940d6af975948c1cc18f44545ffb219d3c35d78ec972b42ae229e8e37e08/s3transfer-0.15.0.tar.gz", hash = "sha256:d36fac8d0e3603eff9b5bfa4282c7ce6feb0301a633566153cbd0b93d11d8379", size = 152185, upload-time = "2025-11-20T20:28:56.327Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/5f/e1/5ef25f52973aa12a19cf4e1375d00932d7fb354ffd310487ba7d44225c1a/s3transfer-0.15.0-py3-none-any.whl", hash = "sha256:6f8bf5caa31a0865c4081186689db1b2534cef721d104eb26101de4b9d6a5852", size = 85984, upload-time = "2025-11-20T20:28:55.046Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "safetensors"
|
||||
version = "0.6.2"
|
||||
|
|
@ -2762,7 +3014,8 @@ source = { registry = "https://pypi.org/simple" }
|
|||
dependencies = [
|
||||
{ name = "aiohttp" },
|
||||
{ name = "aiolimiter" },
|
||||
{ name = "langchain-text-splitters" },
|
||||
{ name = "langchain-text-splitters", version = "0.3.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
|
||||
{ name = "langchain-text-splitters", version = "1.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
|
||||
{ name = "numpy", marker = "python_full_version < '3.14'" },
|
||||
{ name = "pillow" },
|
||||
{ name = "pydantic" },
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue