mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-04-25 00:16:23 +02:00
* Bump setup.py versions for 1.1 * PoC MCP server (#419) * Very initial MCP server PoC for TrustGraph * Put service on port 8000 * Add MCP container and packages to buildout * Update docs for API/CLI changes in 1.0 (#421) * Update some API basics for the 0.23/1.0 API change * Add MCP container push (#425) * Add command args to the MCP server (#426) * Host and port parameters * Added websocket arg * More docs * MCP client support (#427) - MCP client service - Tool request/response schema - API gateway support for mcp-tool - Message translation for tool request & response - Make mcp-tool using configuration service for information about where the MCP services are. * Feature/react call mcp (#428) Key Features - MCP Tool Integration: Added core MCP tool support with ToolClientSpec and ToolClient classes - API Enhancement: New mcp_tool method for flow-specific tool invocation - CLI Tooling: New tg-invoke-mcp-tool command for testing MCP integration - React Agent Enhancement: Fixed and improved multi-tool invocation capabilities - Tool Management: Enhanced CLI for tool configuration and management Changes - Added MCP tool invocation to API with flow-specific integration - Implemented ToolClientSpec and ToolClient for tool call handling - Updated agent-manager-react to invoke MCP tools with configurable types - Enhanced CLI with new commands and improved help text - Added comprehensive documentation for new CLI commands - Improved tool configuration management Testing - Added tg-invoke-mcp-tool CLI command for isolated MCP integration testing - Enhanced agent capability to invoke multiple tools simultaneously * Test suite executed from CI pipeline (#433) * Test strategy & test cases * Unit tests * Integration tests * Extending test coverage (#434) * Contract tests * Testing embeedings * Agent unit tests * Knowledge pipeline tests * Turn on contract tests * Increase storage test coverage (#435) * Fixing storage and adding tests * PR pipeline only runs quick tests * Empty configuration is returned as empty list, previously was not in response (#436) * Update config util to take files as well as command-line text (#437) * Updated CLI invocation and config model for tools and mcp (#438) * Updated CLI invocation and config model for tools and mcp * CLI anomalies * Tweaked the MCP tool implementation for new model * Update agent implementation to match the new model * Fix agent tools, now all tested * Fixed integration tests * Fix MCP delete tool params * Update Python deps to 1.2 * Update to enable knowledge extraction using the agent framework (#439) * Implement KG extraction agent (kg-extract-agent) * Using ReAct framework (agent-manager-react) * ReAct manager had an issue when emitting JSON, which conflicts which ReAct manager's own JSON messages, so refactored ReAct manager to use traditional ReAct messages, non-JSON structure. * Minor refactor to take the prompt template client out of prompt-template so it can be more readily used by other modules. kg-extract-agent uses this framework. * Migrate from setup.py to pyproject.toml (#440) * Converted setup.py to pyproject.toml * Modern package infrastructure as recommended by py docs * Install missing build deps (#441) * Install missing build deps (#442) * Implement logging strategy (#444) * Logging strategy and convert all prints() to logging invocations * Fix/startup failure (#445) * Fix loggin startup problems * Fix logging startup problems (#446) * Fix logging startup problems (#447) * Fixed Mistral OCR to use current API (#448) * Fixed Mistral OCR to use current API * Added PDF decoder tests * Fix Mistral OCR ident to be standard pdf-decoder (#450) * Fix Mistral OCR ident to be standard pdf-decoder * Correct test * Schema structure refactor (#451) * Write schema refactor spec * Implemented schema refactor spec * Structure data mvp (#452) * Structured data tech spec * Architecture principles * New schemas * Updated schemas and specs * Object extractor * Add .coveragerc * New tests * Cassandra object storage * Trying to object extraction working, issues exist * Validate librarian collection (#453) * Fix token chunker, broken API invocation (#454) * Fix token chunker, broken API invocation (#455) * Knowledge load utility CLI (#456) * Knowledge loader * More tests
112 lines
3.8 KiB
Python
112 lines
3.8 KiB
Python
"""
|
|
Helper for managing Cassandra containers in integration tests
|
|
Alternative to testcontainers for Fedora/Podman compatibility
|
|
"""
|
|
|
|
import subprocess
|
|
import time
|
|
import socket
|
|
from contextlib import contextmanager
|
|
from cassandra.cluster import Cluster
|
|
from cassandra.policies import RetryPolicy
|
|
|
|
|
|
class CassandraTestContainer:
|
|
"""Simple Cassandra container manager using Podman"""
|
|
|
|
def __init__(self, image="docker.io/library/cassandra:4.1", port=9042):
|
|
self.image = image
|
|
self.port = port
|
|
self.container_name = f"test-cassandra-{int(time.time())}"
|
|
self.container_id = None
|
|
|
|
def start(self):
|
|
"""Start Cassandra container"""
|
|
# Remove any existing container with same name
|
|
subprocess.run([
|
|
"podman", "rm", "-f", self.container_name
|
|
], capture_output=True)
|
|
|
|
# Start new container with faster startup options
|
|
result = subprocess.run([
|
|
"podman", "run", "-d",
|
|
"--name", self.container_name,
|
|
"-p", f"{self.port}:9042",
|
|
"-e", "JVM_OPTS=-Dcassandra.skip_wait_for_gossip_to_settle=0",
|
|
self.image
|
|
], capture_output=True, text=True)
|
|
|
|
if result.returncode != 0:
|
|
raise RuntimeError(f"Failed to start container: {result.stderr}")
|
|
|
|
self.container_id = result.stdout.strip()
|
|
|
|
# Wait for Cassandra to be ready
|
|
self._wait_for_ready()
|
|
return self
|
|
|
|
def stop(self):
|
|
"""Stop and remove container"""
|
|
import time
|
|
if self.container_name:
|
|
# Small delay before stopping to ensure connections are closed
|
|
time.sleep(0.5)
|
|
subprocess.run([
|
|
"podman", "rm", "-f", self.container_name
|
|
], capture_output=True)
|
|
|
|
def get_connection_host_port(self):
|
|
"""Get host and port for connection"""
|
|
return "localhost", self.port
|
|
|
|
def _wait_for_ready(self, timeout=120):
|
|
"""Wait for Cassandra to be ready for CQL queries"""
|
|
start_time = time.time()
|
|
|
|
print(f"Waiting for Cassandra to be ready on port {self.port}...")
|
|
|
|
while time.time() - start_time < timeout:
|
|
try:
|
|
# First check if port is open
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
sock.settimeout(1)
|
|
result = sock.connect_ex(("localhost", self.port))
|
|
sock.close()
|
|
|
|
if result == 0:
|
|
# Port is open, now try to connect with Cassandra driver
|
|
try:
|
|
cluster = Cluster(['localhost'], port=self.port)
|
|
cluster.connect_timeout = 5
|
|
session = cluster.connect()
|
|
|
|
# Try a simple query to verify Cassandra is ready
|
|
session.execute("SELECT release_version FROM system.local")
|
|
session.shutdown()
|
|
cluster.shutdown()
|
|
|
|
print("Cassandra is ready!")
|
|
return
|
|
|
|
except Exception as e:
|
|
print(f"Cassandra not ready yet: {e}")
|
|
pass
|
|
|
|
except Exception as e:
|
|
print(f"Connection check failed: {e}")
|
|
pass
|
|
|
|
time.sleep(3)
|
|
|
|
raise RuntimeError(f"Cassandra not ready after {timeout} seconds")
|
|
|
|
|
|
@contextmanager
|
|
def cassandra_container(image="docker.io/library/cassandra:4.1", port=9042):
|
|
"""Context manager for Cassandra container"""
|
|
container = CassandraTestContainer(image, port)
|
|
try:
|
|
container.start()
|
|
yield container
|
|
finally:
|
|
container.stop()
|