mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-07-21 19:21:03 +02:00
Update docs
This commit is contained in:
parent
e29bbbc54f
commit
1e462887b7
5 changed files with 2599 additions and 0 deletions
489
docs/cli/tg-dump-msgpack.md
Normal file
489
docs/cli/tg-dump-msgpack.md
Normal file
|
|
@ -0,0 +1,489 @@
|
||||||
|
# tg-dump-msgpack
|
||||||
|
|
||||||
|
Reads and analyzes knowledge core files in MessagePack format for diagnostic purposes.
|
||||||
|
|
||||||
|
## Synopsis
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tg-dump-msgpack -i INPUT_FILE [options]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
The `tg-dump-msgpack` command is a diagnostic utility that reads knowledge core files stored in MessagePack format and outputs their contents in JSON format or provides a summary analysis. This tool is primarily used for debugging, data inspection, and understanding the structure of knowledge cores.
|
||||||
|
|
||||||
|
MessagePack is a binary serialization format that TrustGraph uses for efficient storage and transfer of knowledge graph data.
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
### Required Arguments
|
||||||
|
|
||||||
|
- `-i, --input-file FILE`: Input MessagePack file to read
|
||||||
|
|
||||||
|
### Optional Arguments
|
||||||
|
|
||||||
|
- `-s, --summary`: Show a summary analysis of the file contents
|
||||||
|
- `-r, --records`: Dump individual records in JSON format (default behavior)
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### Dump Records as JSON
|
||||||
|
```bash
|
||||||
|
tg-dump-msgpack -i knowledge-core.msgpack
|
||||||
|
```
|
||||||
|
|
||||||
|
### Show Summary Analysis
|
||||||
|
```bash
|
||||||
|
tg-dump-msgpack -i knowledge-core.msgpack --summary
|
||||||
|
```
|
||||||
|
|
||||||
|
### Save Output to File
|
||||||
|
```bash
|
||||||
|
tg-dump-msgpack -i knowledge-core.msgpack > analysis.json
|
||||||
|
```
|
||||||
|
|
||||||
|
### Analyze Multiple Files
|
||||||
|
```bash
|
||||||
|
for file in *.msgpack; do
|
||||||
|
echo "=== $file ==="
|
||||||
|
tg-dump-msgpack -i "$file" --summary
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
## Output Formats
|
||||||
|
|
||||||
|
### Record Output (Default)
|
||||||
|
With `-r` or `--records` (default behavior), the command outputs each record as a separate JSON object:
|
||||||
|
|
||||||
|
```json
|
||||||
|
["t", {"m": {"m": [{"s": {"v": "uri1"}, "p": {"v": "predicate"}, "o": {"v": "object"}}]}}]
|
||||||
|
["ge", {"v": [[0.1, 0.2, 0.3, ...]]}]
|
||||||
|
["de", {"metadata": {...}, "chunks": [...]}]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Summary Output
|
||||||
|
With `-s` or `--summary`, the command provides an analytical overview:
|
||||||
|
|
||||||
|
```
|
||||||
|
Vector dimension: 384
|
||||||
|
- NASA Challenger Report
|
||||||
|
- Technical Documentation
|
||||||
|
- Safety Engineering Guidelines
|
||||||
|
```
|
||||||
|
|
||||||
|
## Record Types
|
||||||
|
|
||||||
|
MessagePack files may contain different types of records:
|
||||||
|
|
||||||
|
### Triple Records ("t")
|
||||||
|
RDF triples representing knowledge graph relationships:
|
||||||
|
```json
|
||||||
|
["t", {
|
||||||
|
"m": {
|
||||||
|
"m": [{
|
||||||
|
"s": {"v": "http://example.org/subject"},
|
||||||
|
"p": {"v": "http://example.org/predicate"},
|
||||||
|
"o": {"v": "object value"}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Graph Embeddings ("ge")
|
||||||
|
Vector embeddings for graph entities:
|
||||||
|
```json
|
||||||
|
["ge", {
|
||||||
|
"v": [[0.1, 0.2, 0.3, 0.4, ...]]
|
||||||
|
}]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Document Embeddings ("de")
|
||||||
|
Document chunk embeddings with metadata:
|
||||||
|
```json
|
||||||
|
["de", {
|
||||||
|
"metadata": {
|
||||||
|
"id": "doc-123",
|
||||||
|
"user": "trustgraph",
|
||||||
|
"collection": "default"
|
||||||
|
},
|
||||||
|
"chunks": [{
|
||||||
|
"chunk": "text content",
|
||||||
|
"vectors": [0.1, 0.2, 0.3, ...]
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
### Data Inspection
|
||||||
|
```bash
|
||||||
|
# Quick peek at file structure
|
||||||
|
tg-dump-msgpack -i mystery-core.msgpack --summary
|
||||||
|
|
||||||
|
# Detailed record analysis
|
||||||
|
tg-dump-msgpack -i knowledge-core.msgpack | head -20
|
||||||
|
```
|
||||||
|
|
||||||
|
### Debugging Knowledge Cores
|
||||||
|
```bash
|
||||||
|
# Check if file contains expected data types
|
||||||
|
tg-dump-msgpack -i core.msgpack | grep -o '^\["[^"]*"' | sort | uniq -c
|
||||||
|
|
||||||
|
# Find specific entities
|
||||||
|
tg-dump-msgpack -i core.msgpack | grep "NASA"
|
||||||
|
|
||||||
|
# Check vector dimensions
|
||||||
|
tg-dump-msgpack -i core.msgpack --summary | grep "Vector dimension"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Quality Assurance
|
||||||
|
```bash
|
||||||
|
# Validate file completeness
|
||||||
|
validate_msgpack() {
|
||||||
|
local file="$1"
|
||||||
|
|
||||||
|
echo "Validating: $file"
|
||||||
|
|
||||||
|
# Check file exists and is readable
|
||||||
|
if [ ! -r "$file" ]; then
|
||||||
|
echo "Error: Cannot read file $file"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get summary
|
||||||
|
summary=$(tg-dump-msgpack -i "$file" --summary 2>/dev/null)
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Error: Failed to read MessagePack file"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for vector dimension (indicates embeddings present)
|
||||||
|
if echo "$summary" | grep -q "Vector dimension:"; then
|
||||||
|
dim=$(echo "$summary" | grep "Vector dimension:" | awk '{print $3}')
|
||||||
|
echo "✓ Contains embeddings (dimension: $dim)"
|
||||||
|
else
|
||||||
|
echo "⚠ No embeddings found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Count labels (indicates entities present)
|
||||||
|
label_count=$(echo "$summary" | grep "^-" | wc -l)
|
||||||
|
echo "✓ Found $label_count labeled entities"
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Validate multiple files
|
||||||
|
for file in cores/*.msgpack; do
|
||||||
|
validate_msgpack "$file"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Migration
|
||||||
|
```bash
|
||||||
|
# Convert MessagePack to JSON for processing
|
||||||
|
convert_to_json() {
|
||||||
|
local input="$1"
|
||||||
|
local output="$2"
|
||||||
|
|
||||||
|
echo "Converting $input to $output..."
|
||||||
|
tg-dump-msgpack -i "$input" > "$output"
|
||||||
|
|
||||||
|
# Add array wrapper for valid JSON array
|
||||||
|
sed -i '1i[' "$output"
|
||||||
|
sed -i '$a]' "$output"
|
||||||
|
sed -i 's/$/,/' "$output"
|
||||||
|
sed -i '$s/,$//' "$output"
|
||||||
|
|
||||||
|
echo "Conversion complete"
|
||||||
|
}
|
||||||
|
|
||||||
|
convert_to_json "knowledge.msgpack" "knowledge.json"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Analysis and Reporting
|
||||||
|
```bash
|
||||||
|
# Generate comprehensive analysis report
|
||||||
|
analyze_msgpack() {
|
||||||
|
local file="$1"
|
||||||
|
local report_file="${file%.msgpack}_analysis.txt"
|
||||||
|
|
||||||
|
echo "MessagePack Analysis Report" > "$report_file"
|
||||||
|
echo "File: $file" >> "$report_file"
|
||||||
|
echo "Generated: $(date)" >> "$report_file"
|
||||||
|
echo "=============================" >> "$report_file"
|
||||||
|
echo "" >> "$report_file"
|
||||||
|
|
||||||
|
# Summary information
|
||||||
|
echo "Summary:" >> "$report_file"
|
||||||
|
tg-dump-msgpack -i "$file" --summary >> "$report_file"
|
||||||
|
echo "" >> "$report_file"
|
||||||
|
|
||||||
|
# Record type analysis
|
||||||
|
echo "Record Type Distribution:" >> "$report_file"
|
||||||
|
tg-dump-msgpack -i "$file" | \
|
||||||
|
grep -o '^\["[^"]*"' | \
|
||||||
|
sort | uniq -c | \
|
||||||
|
awk '{print " " $2 ": " $1 " records"}' >> "$report_file"
|
||||||
|
echo "" >> "$report_file"
|
||||||
|
|
||||||
|
# File statistics
|
||||||
|
file_size=$(stat -c%s "$file")
|
||||||
|
echo "File Statistics:" >> "$report_file"
|
||||||
|
echo " Size: $file_size bytes" >> "$report_file"
|
||||||
|
echo " Size (human): $(numfmt --to=iec-i --suffix=B $file_size)" >> "$report_file"
|
||||||
|
|
||||||
|
echo "Analysis saved to: $report_file"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Analyze all MessagePack files
|
||||||
|
for file in *.msgpack; do
|
||||||
|
analyze_msgpack "$file"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
### Comparative Analysis
|
||||||
|
```bash
|
||||||
|
# Compare two knowledge cores
|
||||||
|
compare_msgpack() {
|
||||||
|
local file1="$1"
|
||||||
|
local file2="$2"
|
||||||
|
|
||||||
|
echo "Comparing MessagePack files:"
|
||||||
|
echo "File 1: $file1"
|
||||||
|
echo "File 2: $file2"
|
||||||
|
echo "=========================="
|
||||||
|
|
||||||
|
# Compare summaries
|
||||||
|
echo "Summary comparison:"
|
||||||
|
echo "File 1:"
|
||||||
|
tg-dump-msgpack -i "$file1" --summary | sed 's/^/ /'
|
||||||
|
echo ""
|
||||||
|
echo "File 2:"
|
||||||
|
tg-dump-msgpack -i "$file2" --summary | sed 's/^/ /'
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Compare record counts
|
||||||
|
echo "Record type comparison:"
|
||||||
|
echo "File 1:"
|
||||||
|
tg-dump-msgpack -i "$file1" | \
|
||||||
|
grep -o '^\["[^"]*"' | \
|
||||||
|
sort | uniq -c | \
|
||||||
|
awk '{print " " $2 ": " $1}' | \
|
||||||
|
sort
|
||||||
|
|
||||||
|
echo "File 2:"
|
||||||
|
tg-dump-msgpack -i "$file2" | \
|
||||||
|
grep -o '^\["[^"]*"' | \
|
||||||
|
sort | uniq -c | \
|
||||||
|
awk '{print " " $2 ": " $1}' | \
|
||||||
|
sort
|
||||||
|
}
|
||||||
|
|
||||||
|
compare_msgpack "core1.msgpack" "core2.msgpack"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Usage
|
||||||
|
|
||||||
|
### Large File Processing
|
||||||
|
```bash
|
||||||
|
# Process large files in chunks
|
||||||
|
process_large_msgpack() {
|
||||||
|
local file="$1"
|
||||||
|
local chunk_size=1000
|
||||||
|
|
||||||
|
echo "Processing large file: $file"
|
||||||
|
|
||||||
|
# Count total records first
|
||||||
|
total_records=$(tg-dump-msgpack -i "$file" | wc -l)
|
||||||
|
echo "Total records: $total_records"
|
||||||
|
|
||||||
|
# Process in chunks
|
||||||
|
tg-dump-msgpack -i "$file" | \
|
||||||
|
split -l $chunk_size - "chunk_"
|
||||||
|
|
||||||
|
echo "Split into chunks of $chunk_size records each"
|
||||||
|
|
||||||
|
# Process each chunk
|
||||||
|
for chunk in chunk_*; do
|
||||||
|
echo "Processing $chunk..."
|
||||||
|
# Add your processing logic here
|
||||||
|
wc -l "$chunk"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Clean up
|
||||||
|
rm chunk_*
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Extraction
|
||||||
|
```bash
|
||||||
|
# Extract specific data types
|
||||||
|
extract_triples() {
|
||||||
|
local file="$1"
|
||||||
|
local output="triples.json"
|
||||||
|
|
||||||
|
echo "Extracting triples from $file..."
|
||||||
|
tg-dump-msgpack -i "$file" | \
|
||||||
|
grep '^\["t"' > "$output"
|
||||||
|
|
||||||
|
echo "Triples saved to: $output"
|
||||||
|
}
|
||||||
|
|
||||||
|
extract_embeddings() {
|
||||||
|
local file="$1"
|
||||||
|
local output="embeddings.json"
|
||||||
|
|
||||||
|
echo "Extracting embeddings from $file..."
|
||||||
|
tg-dump-msgpack -i "$file" | \
|
||||||
|
grep -E '^\["(ge|de)"' > "$output"
|
||||||
|
|
||||||
|
echo "Embeddings saved to: $output"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract all data types
|
||||||
|
extract_triples "knowledge.msgpack"
|
||||||
|
extract_embeddings "knowledge.msgpack"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Integration with Other Tools
|
||||||
|
```bash
|
||||||
|
# Convert MessagePack to formats for other tools
|
||||||
|
msgpack_to_turtle() {
|
||||||
|
local input="$1"
|
||||||
|
local output="$2"
|
||||||
|
|
||||||
|
echo "Converting MessagePack to Turtle format..."
|
||||||
|
|
||||||
|
# Extract triples and convert to Turtle
|
||||||
|
tg-dump-msgpack -i "$input" | \
|
||||||
|
grep '^\["t"' | \
|
||||||
|
jq -r '.[1].m.m[] |
|
||||||
|
"<" + .s.v + "> <" + .p.v + "> " +
|
||||||
|
(if .o.e then "<" + .o.v + ">" else "\"" + .o.v + "\"" end) + " ."' \
|
||||||
|
> "$output"
|
||||||
|
|
||||||
|
echo "Turtle format saved to: $output"
|
||||||
|
}
|
||||||
|
|
||||||
|
msgpack_to_turtle "knowledge.msgpack" "knowledge.ttl"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
|
||||||
|
### File Not Found
|
||||||
|
```bash
|
||||||
|
Exception: [Errno 2] No such file or directory: 'missing.msgpack'
|
||||||
|
```
|
||||||
|
**Solution**: Check file path and ensure the file exists.
|
||||||
|
|
||||||
|
### Invalid MessagePack Format
|
||||||
|
```bash
|
||||||
|
Exception: Unpack failed
|
||||||
|
```
|
||||||
|
**Solution**: Verify the file is a valid MessagePack file and not corrupted.
|
||||||
|
|
||||||
|
### Memory Issues with Large Files
|
||||||
|
```bash
|
||||||
|
MemoryError: Unable to allocate memory
|
||||||
|
```
|
||||||
|
**Solution**: Process large files in chunks or use streaming approaches.
|
||||||
|
|
||||||
|
### Permission Errors
|
||||||
|
```bash
|
||||||
|
Exception: [Errno 13] Permission denied
|
||||||
|
```
|
||||||
|
**Solution**: Check file permissions and ensure read access.
|
||||||
|
|
||||||
|
## Performance Considerations
|
||||||
|
|
||||||
|
### File Size Optimization
|
||||||
|
```bash
|
||||||
|
# Check file compression efficiency
|
||||||
|
check_compression() {
|
||||||
|
local file="$1"
|
||||||
|
|
||||||
|
original_size=$(stat -c%s "$file")
|
||||||
|
|
||||||
|
# Test compression
|
||||||
|
gzip -c "$file" > "${file}.gz"
|
||||||
|
compressed_size=$(stat -c%s "${file}.gz")
|
||||||
|
|
||||||
|
ratio=$(echo "scale=2; $compressed_size * 100 / $original_size" | bc)
|
||||||
|
|
||||||
|
echo "Original: $(numfmt --to=iec-i --suffix=B $original_size)"
|
||||||
|
echo "Compressed: $(numfmt --to=iec-i --suffix=B $compressed_size)"
|
||||||
|
echo "Compression ratio: ${ratio}%"
|
||||||
|
|
||||||
|
rm "${file}.gz"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Processing Speed
|
||||||
|
```bash
|
||||||
|
# Time processing operations
|
||||||
|
time_msgpack_ops() {
|
||||||
|
local file="$1"
|
||||||
|
|
||||||
|
echo "Timing MessagePack operations for: $file"
|
||||||
|
|
||||||
|
# Time summary generation
|
||||||
|
echo "Summary generation:"
|
||||||
|
time tg-dump-msgpack -i "$file" --summary > /dev/null
|
||||||
|
|
||||||
|
# Time full dump
|
||||||
|
echo "Full record dump:"
|
||||||
|
time tg-dump-msgpack -i "$file" > /dev/null
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Related Commands
|
||||||
|
|
||||||
|
- [`tg-get-kg-core`](tg-get-kg-core.md) - Export knowledge cores to MessagePack
|
||||||
|
- [`tg-load-kg-core`](tg-load-kg-core.md) - Load MessagePack knowledge cores
|
||||||
|
- [`tg-save-doc-embeds`](tg-save-doc-embeds.md) - Save document embeddings to MessagePack
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
1. **File Validation**: Always validate MessagePack files before processing
|
||||||
|
2. **Memory Management**: Be cautious with large files to avoid memory issues
|
||||||
|
3. **Backup**: Keep backups of original MessagePack files before analysis
|
||||||
|
4. **Incremental Processing**: Process large files incrementally when possible
|
||||||
|
5. **Documentation**: Document the structure and content of your MessagePack files
|
||||||
|
6. **Version Control**: Track changes in MessagePack file formats over time
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Corrupted Files
|
||||||
|
```bash
|
||||||
|
# Test file integrity
|
||||||
|
if tg-dump-msgpack -i "test.msgpack" --summary > /dev/null 2>&1; then
|
||||||
|
echo "File appears valid"
|
||||||
|
else
|
||||||
|
echo "File may be corrupted"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
### Empty or Incomplete Files
|
||||||
|
```bash
|
||||||
|
# Check for empty files
|
||||||
|
if [ ! -s "test.msgpack" ]; then
|
||||||
|
echo "File is empty"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check record count
|
||||||
|
record_count=$(tg-dump-msgpack -i "test.msgpack" 2>/dev/null | wc -l)
|
||||||
|
echo "Records found: $record_count"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Format Issues
|
||||||
|
```bash
|
||||||
|
# Validate JSON output
|
||||||
|
tg-dump-msgpack -i "test.msgpack" | head -1 | jq . > /dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "JSON output is valid"
|
||||||
|
else
|
||||||
|
echo "JSON output may be malformed"
|
||||||
|
fi
|
||||||
|
```
|
||||||
452
docs/cli/tg-init-pulsar-manager.md
Normal file
452
docs/cli/tg-init-pulsar-manager.md
Normal file
|
|
@ -0,0 +1,452 @@
|
||||||
|
# tg-init-pulsar-manager
|
||||||
|
|
||||||
|
Initializes Pulsar Manager with default superuser credentials for TrustGraph.
|
||||||
|
|
||||||
|
## Synopsis
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tg-init-pulsar-manager
|
||||||
|
```
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
The `tg-init-pulsar-manager` command is a setup utility that creates a default superuser account in Pulsar Manager. This is typically run once during initial TrustGraph deployment to establish administrative access to the Pulsar message queue management interface.
|
||||||
|
|
||||||
|
The command configures a superuser with predefined credentials that can be used to access the Pulsar Manager web interface for monitoring and managing Pulsar topics, namespaces, and tenants.
|
||||||
|
|
||||||
|
## Default Configuration
|
||||||
|
|
||||||
|
The command creates a superuser with these default credentials:
|
||||||
|
|
||||||
|
- **Username**: `admin`
|
||||||
|
- **Password**: `apachepulsar`
|
||||||
|
- **Description**: `test`
|
||||||
|
- **Email**: `username@test.org`
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
### Pulsar Manager Service
|
||||||
|
Pulsar Manager must be running and accessible at `http://localhost:7750` before running this command.
|
||||||
|
|
||||||
|
### Network Connectivity
|
||||||
|
The command requires network access to the Pulsar Manager API endpoint.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### Basic Initialization
|
||||||
|
```bash
|
||||||
|
tg-init-pulsar-manager
|
||||||
|
```
|
||||||
|
|
||||||
|
### Verify Initialization
|
||||||
|
```bash
|
||||||
|
# Run the initialization
|
||||||
|
tg-init-pulsar-manager
|
||||||
|
|
||||||
|
# Check if Pulsar Manager is accessible
|
||||||
|
curl -s http://localhost:7750/pulsar-manager/ | grep -q "Pulsar Manager"
|
||||||
|
echo "Pulsar Manager status: $?"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Integration with Setup Scripts
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# setup-trustgraph.sh
|
||||||
|
|
||||||
|
echo "Setting up TrustGraph infrastructure..."
|
||||||
|
|
||||||
|
# Wait for Pulsar Manager to be ready
|
||||||
|
echo "Waiting for Pulsar Manager..."
|
||||||
|
while ! curl -s http://localhost:7750/pulsar-manager/ > /dev/null; do
|
||||||
|
echo " Waiting for Pulsar Manager to start..."
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
|
||||||
|
# Initialize Pulsar Manager
|
||||||
|
echo "Initializing Pulsar Manager..."
|
||||||
|
tg-init-pulsar-manager
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "✓ Pulsar Manager initialized successfully"
|
||||||
|
echo " You can access it at: http://localhost:7750/pulsar-manager/"
|
||||||
|
echo " Username: admin"
|
||||||
|
echo " Password: apachepulsar"
|
||||||
|
else
|
||||||
|
echo "✗ Failed to initialize Pulsar Manager"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
## What It Does
|
||||||
|
|
||||||
|
The command performs the following operations:
|
||||||
|
|
||||||
|
1. **Retrieves CSRF Token**: Gets a CSRF token from Pulsar Manager for secure API access
|
||||||
|
2. **Creates Superuser**: Makes an authenticated API call to create the superuser account
|
||||||
|
3. **Sets Permissions**: Configures the user with administrative privileges
|
||||||
|
|
||||||
|
### HTTP Operations
|
||||||
|
```bash
|
||||||
|
# Equivalent manual operations:
|
||||||
|
CSRF_TOKEN=$(curl http://localhost:7750/pulsar-manager/csrf-token)
|
||||||
|
|
||||||
|
curl \
|
||||||
|
-H "X-XSRF-TOKEN: $CSRF_TOKEN" \
|
||||||
|
-H "Cookie: XSRF-TOKEN=$CSRF_TOKEN;" \
|
||||||
|
-H 'Content-Type: application/json' \
|
||||||
|
-X PUT \
|
||||||
|
http://localhost:7750/pulsar-manager/users/superuser \
|
||||||
|
-d '{"name": "admin", "password": "apachepulsar", "description": "test", "email": "username@test.org"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
### Initial Deployment
|
||||||
|
```bash
|
||||||
|
# Part of TrustGraph deployment sequence
|
||||||
|
deploy_trustgraph() {
|
||||||
|
echo "Deploying TrustGraph..."
|
||||||
|
|
||||||
|
# Start services
|
||||||
|
docker-compose up -d pulsar pulsar-manager
|
||||||
|
|
||||||
|
# Wait for services
|
||||||
|
wait_for_service "http://localhost:7750/pulsar-manager/" "Pulsar Manager"
|
||||||
|
wait_for_service "http://localhost:8080/admin/v2/clusters" "Pulsar"
|
||||||
|
|
||||||
|
# Initialize Pulsar Manager
|
||||||
|
echo "Initializing Pulsar Manager..."
|
||||||
|
tg-init-pulsar-manager
|
||||||
|
|
||||||
|
# Initialize TrustGraph
|
||||||
|
echo "Initializing TrustGraph..."
|
||||||
|
tg-init-trustgraph
|
||||||
|
|
||||||
|
echo "Deployment complete!"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Development Environment Setup
|
||||||
|
```bash
|
||||||
|
# Development setup script
|
||||||
|
setup_dev_environment() {
|
||||||
|
echo "Setting up development environment..."
|
||||||
|
|
||||||
|
# Start local services
|
||||||
|
docker-compose -f docker-compose.dev.yml up -d
|
||||||
|
|
||||||
|
# Wait for readiness
|
||||||
|
echo "Waiting for services to start..."
|
||||||
|
sleep 30
|
||||||
|
|
||||||
|
# Initialize components
|
||||||
|
tg-init-pulsar-manager
|
||||||
|
tg-init-trustgraph
|
||||||
|
|
||||||
|
echo "Development environment ready!"
|
||||||
|
echo "Pulsar Manager: http://localhost:7750/pulsar-manager/"
|
||||||
|
echo "Credentials: admin / apachepulsar"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### CI/CD Integration
|
||||||
|
```bash
|
||||||
|
# Integration testing setup
|
||||||
|
setup_test_environment() {
|
||||||
|
local timeout=300 # 5 minutes
|
||||||
|
local elapsed=0
|
||||||
|
|
||||||
|
echo "Setting up test environment..."
|
||||||
|
|
||||||
|
# Start services
|
||||||
|
docker-compose up -d --wait
|
||||||
|
|
||||||
|
# Wait for Pulsar Manager
|
||||||
|
while ! curl -s http://localhost:7750/pulsar-manager/ > /dev/null; do
|
||||||
|
if [ $elapsed -ge $timeout ]; then
|
||||||
|
echo "Timeout waiting for Pulsar Manager"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
sleep 5
|
||||||
|
elapsed=$((elapsed + 5))
|
||||||
|
done
|
||||||
|
|
||||||
|
# Initialize
|
||||||
|
if tg-init-pulsar-manager; then
|
||||||
|
echo "✓ Test environment ready"
|
||||||
|
else
|
||||||
|
echo "✗ Failed to initialize test environment"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Docker Integration
|
||||||
|
|
||||||
|
### Docker Compose Setup
|
||||||
|
```yaml
|
||||||
|
# docker-compose.yml
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
pulsar:
|
||||||
|
image: apachepulsar/pulsar:latest
|
||||||
|
ports:
|
||||||
|
- "6650:6650"
|
||||||
|
- "8080:8080"
|
||||||
|
command: bin/pulsar standalone
|
||||||
|
|
||||||
|
pulsar-manager:
|
||||||
|
image: apachepulsar/pulsar-manager:latest
|
||||||
|
ports:
|
||||||
|
- "7750:7750"
|
||||||
|
depends_on:
|
||||||
|
- pulsar
|
||||||
|
environment:
|
||||||
|
SPRING_CONFIGURATION_FILE: /pulsar-manager/pulsar-manager/application.properties
|
||||||
|
|
||||||
|
trustgraph-init:
|
||||||
|
image: trustgraph/cli:latest
|
||||||
|
depends_on:
|
||||||
|
- pulsar-manager
|
||||||
|
command: >
|
||||||
|
sh -c "
|
||||||
|
sleep 30 &&
|
||||||
|
tg-init-pulsar-manager &&
|
||||||
|
tg-init-trustgraph
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Kubernetes Setup
|
||||||
|
```yaml
|
||||||
|
# k8s-init-job.yaml
|
||||||
|
apiVersion: batch/v1
|
||||||
|
kind: Job
|
||||||
|
metadata:
|
||||||
|
name: trustgraph-init
|
||||||
|
spec:
|
||||||
|
template:
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: init
|
||||||
|
image: trustgraph/cli:latest
|
||||||
|
command:
|
||||||
|
- sh
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
echo "Waiting for Pulsar Manager..."
|
||||||
|
while ! curl -s http://pulsar-manager:7750/pulsar-manager/; do
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Initializing Pulsar Manager..."
|
||||||
|
tg-init-pulsar-manager
|
||||||
|
|
||||||
|
echo "Initializing TrustGraph..."
|
||||||
|
tg-init-trustgraph
|
||||||
|
env:
|
||||||
|
- name: PULSAR_MANAGER_URL
|
||||||
|
value: "http://pulsar-manager:7750"
|
||||||
|
restartPolicy: Never
|
||||||
|
```
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
|
||||||
|
### Connection Refused
|
||||||
|
```bash
|
||||||
|
curl: (7) Failed to connect to localhost port 7750: Connection refused
|
||||||
|
```
|
||||||
|
**Solution**: Ensure Pulsar Manager is running and accessible on port 7750.
|
||||||
|
|
||||||
|
### CSRF Token Issues
|
||||||
|
```bash
|
||||||
|
curl: (22) The requested URL returned error: 403 Forbidden
|
||||||
|
```
|
||||||
|
**Solution**: The CSRF token mechanism may have changed. Check Pulsar Manager API documentation.
|
||||||
|
|
||||||
|
### User Already Exists
|
||||||
|
```bash
|
||||||
|
HTTP 409 Conflict - User already exists
|
||||||
|
```
|
||||||
|
**Solution**: This is expected on subsequent runs. The superuser is already created.
|
||||||
|
|
||||||
|
### Network Issues
|
||||||
|
```bash
|
||||||
|
curl: (28) Operation timed out
|
||||||
|
```
|
||||||
|
**Solution**: Check network connectivity and firewall settings.
|
||||||
|
|
||||||
|
## Security Considerations
|
||||||
|
|
||||||
|
### Default Credentials
|
||||||
|
The command uses default credentials that should be changed in production:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# After initialization, change the password via Pulsar Manager UI
|
||||||
|
# Or use the API to update credentials
|
||||||
|
change_admin_password() {
|
||||||
|
local new_password="$1"
|
||||||
|
|
||||||
|
# Login to get session
|
||||||
|
session=$(curl -s -c cookies.txt \
|
||||||
|
-d "username=admin&password=apachepulsar" \
|
||||||
|
http://localhost:7750/pulsar-manager/login)
|
||||||
|
|
||||||
|
# Update password
|
||||||
|
curl -s -b cookies.txt \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-X PUT \
|
||||||
|
-d "{\"password\": \"$new_password\"}" \
|
||||||
|
http://localhost:7750/pulsar-manager/users/admin
|
||||||
|
|
||||||
|
rm cookies.txt
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Access Control
|
||||||
|
```bash
|
||||||
|
# Restrict access to Pulsar Manager in production
|
||||||
|
configure_security() {
|
||||||
|
echo "Configuring Pulsar Manager security..."
|
||||||
|
|
||||||
|
# Change default password
|
||||||
|
change_admin_password "$(openssl rand -base64 32)"
|
||||||
|
|
||||||
|
# Configure firewall rules (example)
|
||||||
|
# iptables -A INPUT -p tcp --dport 7750 -s 10.0.0.0/8 -j ACCEPT
|
||||||
|
# iptables -A INPUT -p tcp --dport 7750 -j DROP
|
||||||
|
|
||||||
|
echo "Security configuration complete"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Usage
|
||||||
|
|
||||||
|
### Custom Configuration
|
||||||
|
```bash
|
||||||
|
# Create custom initialization script
|
||||||
|
create_custom_init() {
|
||||||
|
cat > custom-pulsar-manager-init.sh << 'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
PULSAR_MANAGER_URL=${PULSAR_MANAGER_URL:-http://localhost:7750}
|
||||||
|
ADMIN_USER=${ADMIN_USER:-admin}
|
||||||
|
ADMIN_PASS=${ADMIN_PASS:-$(openssl rand -base64 16)}
|
||||||
|
ADMIN_EMAIL=${ADMIN_EMAIL:-admin@example.com}
|
||||||
|
|
||||||
|
echo "Initializing Pulsar Manager at: $PULSAR_MANAGER_URL"
|
||||||
|
|
||||||
|
# Get CSRF token
|
||||||
|
CSRF_TOKEN=$(curl -s "$PULSAR_MANAGER_URL/pulsar-manager/csrf-token")
|
||||||
|
|
||||||
|
if [ -z "$CSRF_TOKEN" ]; then
|
||||||
|
echo "Failed to get CSRF token"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create superuser
|
||||||
|
response=$(curl -s -w "%{http_code}" \
|
||||||
|
-H "X-XSRF-TOKEN: $CSRF_TOKEN" \
|
||||||
|
-H "Cookie: XSRF-TOKEN=$CSRF_TOKEN;" \
|
||||||
|
-H 'Content-Type: application/json' \
|
||||||
|
-X PUT \
|
||||||
|
"$PULSAR_MANAGER_URL/pulsar-manager/users/superuser" \
|
||||||
|
-d "{\"name\": \"$ADMIN_USER\", \"password\": \"$ADMIN_PASS\", \"description\": \"Admin user\", \"email\": \"$ADMIN_EMAIL\"}")
|
||||||
|
|
||||||
|
http_code="${response: -3}"
|
||||||
|
|
||||||
|
if [ "$http_code" = "200" ] || [ "$http_code" = "409" ]; then
|
||||||
|
echo "Pulsar Manager initialized successfully"
|
||||||
|
echo "Username: $ADMIN_USER"
|
||||||
|
echo "Password: $ADMIN_PASS"
|
||||||
|
else
|
||||||
|
echo "Failed to initialize Pulsar Manager (HTTP $http_code)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod +x custom-pulsar-manager-init.sh
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Health Checks
|
||||||
|
```bash
|
||||||
|
# Health check script
|
||||||
|
check_pulsar_manager() {
|
||||||
|
local max_attempts=30
|
||||||
|
local attempt=1
|
||||||
|
|
||||||
|
echo "Checking Pulsar Manager health..."
|
||||||
|
|
||||||
|
while [ $attempt -le $max_attempts ]; do
|
||||||
|
if curl -s http://localhost:7750/pulsar-manager/ > /dev/null; then
|
||||||
|
echo "✓ Pulsar Manager is healthy"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Attempt $attempt/$max_attempts - Pulsar Manager not ready"
|
||||||
|
sleep 5
|
||||||
|
attempt=$((attempt + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "✗ Pulsar Manager health check failed"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Use in deployment scripts
|
||||||
|
if check_pulsar_manager; then
|
||||||
|
tg-init-pulsar-manager
|
||||||
|
else
|
||||||
|
echo "Cannot initialize Pulsar Manager - service not healthy"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
## Related Commands
|
||||||
|
|
||||||
|
- [`tg-init-trustgraph`](tg-init-trustgraph.md) - Initialize TrustGraph with Pulsar configuration
|
||||||
|
- [`tg-show-config`](tg-show-config.md) - Display current TrustGraph configuration
|
||||||
|
|
||||||
|
## Integration Points
|
||||||
|
|
||||||
|
### Pulsar Manager UI
|
||||||
|
After initialization, access the web interface at:
|
||||||
|
- **URL**: `http://localhost:7750/pulsar-manager/`
|
||||||
|
- **Username**: `admin`
|
||||||
|
- **Password**: `apachepulsar`
|
||||||
|
|
||||||
|
### TrustGraph Integration
|
||||||
|
This command is typically run before `tg-init-trustgraph` as part of the complete TrustGraph setup process.
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
1. **Run Once**: Only run during initial setup - subsequent runs are harmless but unnecessary
|
||||||
|
2. **Change Defaults**: Change default credentials in production environments
|
||||||
|
3. **Network Security**: Restrict access to Pulsar Manager in production
|
||||||
|
4. **Health Checks**: Always verify Pulsar Manager is running before initialization
|
||||||
|
5. **Automation**: Include in deployment automation scripts
|
||||||
|
6. **Documentation**: Document custom credentials for operations teams
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Service Not Ready
|
||||||
|
```bash
|
||||||
|
# Check if Pulsar Manager is running
|
||||||
|
docker ps | grep pulsar-manager
|
||||||
|
netstat -tlnp | grep 7750
|
||||||
|
```
|
||||||
|
|
||||||
|
### Port Conflicts
|
||||||
|
```bash
|
||||||
|
# Check if port 7750 is in use
|
||||||
|
lsof -i :7750
|
||||||
|
```
|
||||||
|
|
||||||
|
### Docker Issues
|
||||||
|
```bash
|
||||||
|
# Check Pulsar Manager logs
|
||||||
|
docker logs pulsar-manager
|
||||||
|
|
||||||
|
# Restart if needed
|
||||||
|
docker restart pulsar-manager
|
||||||
|
```
|
||||||
523
docs/cli/tg-init-trustgraph.md
Normal file
523
docs/cli/tg-init-trustgraph.md
Normal file
|
|
@ -0,0 +1,523 @@
|
||||||
|
# tg-init-trustgraph
|
||||||
|
|
||||||
|
Initializes Pulsar with TrustGraph tenant, namespaces, and configuration settings.
|
||||||
|
|
||||||
|
## Synopsis
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tg-init-trustgraph [options]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
The `tg-init-trustgraph` command initializes the Apache Pulsar messaging system with the required tenant, namespaces, policies, and configuration needed for TrustGraph operation. This is a foundational setup command that must be run before TrustGraph can operate properly.
|
||||||
|
|
||||||
|
The command creates the necessary Pulsar infrastructure and optionally loads initial configuration data into the system.
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
### Optional Arguments
|
||||||
|
|
||||||
|
- `-p, --pulsar-admin-url URL`: Pulsar admin URL (default: `http://pulsar:8080`)
|
||||||
|
- `--pulsar-host HOST`: Pulsar host for client connections (default: `pulsar://pulsar:6650`)
|
||||||
|
- `--pulsar-api-key KEY`: Pulsar API key for authentication
|
||||||
|
- `-c, --config CONFIG`: Initial configuration JSON to load
|
||||||
|
- `-t, --tenant TENANT`: Tenant name (default: `tg`)
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### Basic Initialization
|
||||||
|
```bash
|
||||||
|
tg-init-trustgraph
|
||||||
|
```
|
||||||
|
|
||||||
|
### Custom Pulsar Configuration
|
||||||
|
```bash
|
||||||
|
tg-init-trustgraph \
|
||||||
|
--pulsar-admin-url http://localhost:8080 \
|
||||||
|
--pulsar-host pulsar://localhost:6650
|
||||||
|
```
|
||||||
|
|
||||||
|
### With Initial Configuration
|
||||||
|
```bash
|
||||||
|
tg-init-trustgraph \
|
||||||
|
--config '{"prompt": {"system": "You are a helpful AI assistant"}}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Custom Tenant
|
||||||
|
```bash
|
||||||
|
tg-init-trustgraph --tenant production-tg
|
||||||
|
```
|
||||||
|
|
||||||
|
### Production Setup
|
||||||
|
```bash
|
||||||
|
tg-init-trustgraph \
|
||||||
|
--pulsar-admin-url http://pulsar-cluster:8080 \
|
||||||
|
--pulsar-host pulsar://pulsar-cluster:6650 \
|
||||||
|
--pulsar-api-key "your-api-key" \
|
||||||
|
--tenant production \
|
||||||
|
--config "$(cat production-config.json)"
|
||||||
|
```
|
||||||
|
|
||||||
|
## What It Creates
|
||||||
|
|
||||||
|
### Tenant Structure
|
||||||
|
The command creates a TrustGraph tenant with the following namespaces:
|
||||||
|
|
||||||
|
#### Flow Namespace (`tg/flow`)
|
||||||
|
- **Purpose**: Processing workflows and flow definitions
|
||||||
|
- **Retention**: Default retention policies
|
||||||
|
|
||||||
|
#### Request Namespace (`tg/request`)
|
||||||
|
- **Purpose**: Incoming API requests and commands
|
||||||
|
- **Retention**: Default retention policies
|
||||||
|
|
||||||
|
#### Response Namespace (`tg/response`)
|
||||||
|
- **Purpose**: API responses and results
|
||||||
|
- **Retention**: 3 minutes, unlimited size
|
||||||
|
- **Subscription Expiration**: 30 minutes
|
||||||
|
|
||||||
|
#### Config Namespace (`tg/config`)
|
||||||
|
- **Purpose**: System configuration and settings
|
||||||
|
- **Retention**: 10MB size limit, unlimited time
|
||||||
|
- **Subscription Expiration**: 5 minutes
|
||||||
|
|
||||||
|
### Configuration Loading
|
||||||
|
|
||||||
|
If a configuration is provided, the command also:
|
||||||
|
1. Connects to the configuration service
|
||||||
|
2. Loads the provided configuration data
|
||||||
|
3. Ensures configuration versioning is maintained
|
||||||
|
|
||||||
|
## Configuration Format
|
||||||
|
|
||||||
|
The configuration should be provided as JSON with this structure:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"prompt": {
|
||||||
|
"system": "System prompt text",
|
||||||
|
"template-index": ["template1", "template2"],
|
||||||
|
"template.template1": {
|
||||||
|
"id": "template1",
|
||||||
|
"prompt": "Template text with {{variables}}",
|
||||||
|
"response-type": "text"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"token-costs": {
|
||||||
|
"gpt-4": {
|
||||||
|
"input_price": 0.00003,
|
||||||
|
"output_price": 0.00006
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"agent": {
|
||||||
|
"tool-index": ["tool1"],
|
||||||
|
"tool.tool1": {
|
||||||
|
"id": "tool1",
|
||||||
|
"name": "Example Tool",
|
||||||
|
"description": "Tool description",
|
||||||
|
"arguments": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
### Initial Deployment
|
||||||
|
```bash
|
||||||
|
# Complete TrustGraph initialization sequence
|
||||||
|
initialize_trustgraph() {
|
||||||
|
echo "Initializing TrustGraph infrastructure..."
|
||||||
|
|
||||||
|
# Wait for Pulsar to be ready
|
||||||
|
wait_for_pulsar
|
||||||
|
|
||||||
|
# Initialize Pulsar Manager (if using)
|
||||||
|
tg-init-pulsar-manager
|
||||||
|
|
||||||
|
# Initialize TrustGraph
|
||||||
|
tg-init-trustgraph \
|
||||||
|
--config "$(cat initial-config.json)"
|
||||||
|
|
||||||
|
echo "TrustGraph initialization complete!"
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_for_pulsar() {
|
||||||
|
local timeout=300
|
||||||
|
local elapsed=0
|
||||||
|
|
||||||
|
while ! curl -s http://pulsar:8080/admin/v2/clusters > /dev/null; do
|
||||||
|
if [ $elapsed -ge $timeout ]; then
|
||||||
|
echo "Timeout waiting for Pulsar"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "Waiting for Pulsar..."
|
||||||
|
sleep 5
|
||||||
|
elapsed=$((elapsed + 5))
|
||||||
|
done
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Environment-Specific Setup
|
||||||
|
```bash
|
||||||
|
# Development environment
|
||||||
|
setup_dev() {
|
||||||
|
tg-init-trustgraph \
|
||||||
|
--pulsar-admin-url http://localhost:8080 \
|
||||||
|
--pulsar-host pulsar://localhost:6650 \
|
||||||
|
--tenant dev \
|
||||||
|
--config "$(cat dev-config.json)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Staging environment
|
||||||
|
setup_staging() {
|
||||||
|
tg-init-trustgraph \
|
||||||
|
--pulsar-admin-url http://staging-pulsar:8080 \
|
||||||
|
--pulsar-host pulsar://staging-pulsar:6650 \
|
||||||
|
--tenant staging \
|
||||||
|
--config "$(cat staging-config.json)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Production environment
|
||||||
|
setup_production() {
|
||||||
|
tg-init-trustgraph \
|
||||||
|
--pulsar-admin-url http://prod-pulsar:8080 \
|
||||||
|
--pulsar-host pulsar://prod-pulsar:6650 \
|
||||||
|
--pulsar-api-key "$PULSAR_API_KEY" \
|
||||||
|
--tenant production \
|
||||||
|
--config "$(cat production-config.json)"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configuration Management
|
||||||
|
```bash
|
||||||
|
# Load different configurations
|
||||||
|
load_ai_config() {
|
||||||
|
local config='{
|
||||||
|
"prompt": {
|
||||||
|
"system": "You are an AI assistant specialized in data analysis.",
|
||||||
|
"template-index": ["analyze", "summarize"],
|
||||||
|
"template.analyze": {
|
||||||
|
"id": "analyze",
|
||||||
|
"prompt": "Analyze this data: {{data}}",
|
||||||
|
"response-type": "json"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"token-costs": {
|
||||||
|
"gpt-4": {"input_price": 0.00003, "output_price": 0.00006},
|
||||||
|
"claude-3-sonnet": {"input_price": 0.000003, "output_price": 0.000015}
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
|
||||||
|
tg-init-trustgraph --config "$config"
|
||||||
|
}
|
||||||
|
|
||||||
|
load_research_config() {
|
||||||
|
local config='{
|
||||||
|
"prompt": {
|
||||||
|
"system": "You are a research assistant focused on academic literature.",
|
||||||
|
"template-index": ["research", "citation"],
|
||||||
|
"template.research": {
|
||||||
|
"id": "research",
|
||||||
|
"prompt": "Research question: {{question}}\nContext: {{context}}",
|
||||||
|
"response-type": "text"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
|
||||||
|
tg-init-trustgraph --config "$config"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Usage
|
||||||
|
|
||||||
|
### Cluster Setup
|
||||||
|
```bash
|
||||||
|
# Multi-cluster initialization
|
||||||
|
setup_cluster() {
|
||||||
|
local clusters=("cluster1:8080" "cluster2:8080" "cluster3:8080")
|
||||||
|
|
||||||
|
for cluster in "${clusters[@]}"; do
|
||||||
|
echo "Initializing cluster: $cluster"
|
||||||
|
|
||||||
|
tg-init-trustgraph \
|
||||||
|
--pulsar-admin-url "http://$cluster" \
|
||||||
|
--pulsar-host "pulsar://${cluster%:*}:6650" \
|
||||||
|
--tenant "cluster-$(echo $cluster | cut -d: -f1)" \
|
||||||
|
--config "$(cat cluster-config.json)"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configuration Migration
|
||||||
|
```bash
|
||||||
|
# Migrate configuration between environments
|
||||||
|
migrate_config() {
|
||||||
|
local source_env="$1"
|
||||||
|
local target_env="$2"
|
||||||
|
|
||||||
|
echo "Migrating configuration from $source_env to $target_env"
|
||||||
|
|
||||||
|
# Export existing configuration (would need a tg-export-config command)
|
||||||
|
# For now, assume we have the config in a file
|
||||||
|
|
||||||
|
tg-init-trustgraph \
|
||||||
|
--pulsar-admin-url "http://$target_env:8080" \
|
||||||
|
--pulsar-host "pulsar://$target_env:6650" \
|
||||||
|
--config "$(cat ${source_env}-config.json)"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Validation and Testing
|
||||||
|
```bash
|
||||||
|
# Validate initialization
|
||||||
|
validate_initialization() {
|
||||||
|
local tenant="${1:-tg}"
|
||||||
|
local admin_url="${2:-http://pulsar:8080}"
|
||||||
|
|
||||||
|
echo "Validating TrustGraph initialization..."
|
||||||
|
|
||||||
|
# Check tenant exists
|
||||||
|
if curl -s "$admin_url/admin/v2/tenants/$tenant" > /dev/null; then
|
||||||
|
echo "✓ Tenant '$tenant' exists"
|
||||||
|
else
|
||||||
|
echo "✗ Tenant '$tenant' missing"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check namespaces
|
||||||
|
local namespaces=("flow" "request" "response" "config")
|
||||||
|
for ns in "${namespaces[@]}"; do
|
||||||
|
if curl -s "$admin_url/admin/v2/namespaces/$tenant/$ns" > /dev/null; then
|
||||||
|
echo "✓ Namespace '$tenant/$ns' exists"
|
||||||
|
else
|
||||||
|
echo "✗ Namespace '$tenant/$ns' missing"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "✓ TrustGraph initialization validated"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Test configuration loading
|
||||||
|
test_config_loading() {
|
||||||
|
local test_config='{
|
||||||
|
"test": {
|
||||||
|
"value": "test-value",
|
||||||
|
"timestamp": "'$(date -Iseconds)'"
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
|
||||||
|
echo "Testing configuration loading..."
|
||||||
|
|
||||||
|
if tg-init-trustgraph --config "$test_config"; then
|
||||||
|
echo "✓ Configuration loading successful"
|
||||||
|
else
|
||||||
|
echo "✗ Configuration loading failed"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Retry Logic and Error Handling
|
||||||
|
```bash
|
||||||
|
# Robust initialization with retry
|
||||||
|
robust_init() {
|
||||||
|
local max_attempts=5
|
||||||
|
local attempt=1
|
||||||
|
local delay=10
|
||||||
|
|
||||||
|
while [ $attempt -le $max_attempts ]; do
|
||||||
|
echo "Initialization attempt $attempt of $max_attempts..."
|
||||||
|
|
||||||
|
if tg-init-trustgraph "$@"; then
|
||||||
|
echo "✓ Initialization successful on attempt $attempt"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "✗ Attempt $attempt failed"
|
||||||
|
|
||||||
|
if [ $attempt -lt $max_attempts ]; then
|
||||||
|
echo "Waiting ${delay}s before retry..."
|
||||||
|
sleep $delay
|
||||||
|
delay=$((delay * 2)) # Exponential backoff
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
attempt=$((attempt + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "✗ All initialization attempts failed"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Docker Integration
|
||||||
|
|
||||||
|
### Docker Compose
|
||||||
|
```yaml
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
pulsar:
|
||||||
|
image: apachepulsar/pulsar:latest
|
||||||
|
ports:
|
||||||
|
- "6650:6650"
|
||||||
|
- "8080:8080"
|
||||||
|
command: bin/pulsar standalone
|
||||||
|
|
||||||
|
trustgraph-init:
|
||||||
|
image: trustgraph/cli:latest
|
||||||
|
depends_on:
|
||||||
|
- pulsar
|
||||||
|
volumes:
|
||||||
|
- ./config.json:/config.json:ro
|
||||||
|
command: >
|
||||||
|
sh -c "
|
||||||
|
sleep 30 &&
|
||||||
|
tg-init-trustgraph --config '$$(cat /config.json)'
|
||||||
|
"
|
||||||
|
environment:
|
||||||
|
- TRUSTGRAPH_PULSAR_ADMIN_URL=http://pulsar:8080
|
||||||
|
- TRUSTGRAPH_PULSAR_HOST=pulsar://pulsar:6650
|
||||||
|
```
|
||||||
|
|
||||||
|
### Kubernetes Init Container
|
||||||
|
```yaml
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: trustgraph-config
|
||||||
|
data:
|
||||||
|
config.json: |
|
||||||
|
{
|
||||||
|
"prompt": {
|
||||||
|
"system": "You are a helpful AI assistant."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
---
|
||||||
|
apiVersion: batch/v1
|
||||||
|
kind: Job
|
||||||
|
metadata:
|
||||||
|
name: trustgraph-init
|
||||||
|
spec:
|
||||||
|
template:
|
||||||
|
spec:
|
||||||
|
initContainers:
|
||||||
|
- name: wait-for-pulsar
|
||||||
|
image: busybox
|
||||||
|
command:
|
||||||
|
- sh
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
until nc -z pulsar 8080; do
|
||||||
|
echo "Waiting for Pulsar..."
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
containers:
|
||||||
|
- name: init
|
||||||
|
image: trustgraph/cli:latest
|
||||||
|
command:
|
||||||
|
- tg-init-trustgraph
|
||||||
|
- --pulsar-admin-url=http://pulsar:8080
|
||||||
|
- --pulsar-host=pulsar://pulsar:6650
|
||||||
|
- --config=$(cat /config/config.json)
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /config
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: trustgraph-config
|
||||||
|
restartPolicy: Never
|
||||||
|
```
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
|
||||||
|
### Connection Issues
|
||||||
|
```bash
|
||||||
|
Exception: Connection refused
|
||||||
|
```
|
||||||
|
**Solution**: Verify Pulsar is running and accessible at the specified admin URL.
|
||||||
|
|
||||||
|
### Authentication Errors
|
||||||
|
```bash
|
||||||
|
Exception: 401 Unauthorized
|
||||||
|
```
|
||||||
|
**Solution**: Check Pulsar API key if authentication is enabled.
|
||||||
|
|
||||||
|
### Tenant Creation Failures
|
||||||
|
```bash
|
||||||
|
Exception: Tenant creation failed
|
||||||
|
```
|
||||||
|
**Solution**: Verify admin permissions and cluster configuration.
|
||||||
|
|
||||||
|
### Configuration Loading Errors
|
||||||
|
```bash
|
||||||
|
Exception: Invalid JSON configuration
|
||||||
|
```
|
||||||
|
**Solution**: Validate JSON syntax and structure.
|
||||||
|
|
||||||
|
## Security Considerations
|
||||||
|
|
||||||
|
### API Key Management
|
||||||
|
```bash
|
||||||
|
# Use environment variables for sensitive data
|
||||||
|
export PULSAR_API_KEY="your-secure-api-key"
|
||||||
|
tg-init-trustgraph --pulsar-api-key "$PULSAR_API_KEY"
|
||||||
|
|
||||||
|
# Or use a secure file
|
||||||
|
tg-init-trustgraph --pulsar-api-key "$(cat /secure/pulsar-key.txt)"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Network Security
|
||||||
|
```bash
|
||||||
|
# Use TLS for production
|
||||||
|
tg-init-trustgraph \
|
||||||
|
--pulsar-admin-url https://secure-pulsar:8443 \
|
||||||
|
--pulsar-host pulsar+ssl://secure-pulsar:6651
|
||||||
|
```
|
||||||
|
|
||||||
|
## Related Commands
|
||||||
|
|
||||||
|
- [`tg-init-pulsar-manager`](tg-init-pulsar-manager.md) - Initialize Pulsar Manager
|
||||||
|
- [`tg-show-config`](tg-show-config.md) - Display current configuration
|
||||||
|
- [`tg-set-prompt`](tg-set-prompt.md) - Configure individual prompts
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
1. **Run Once**: Typically run once per environment during initial setup
|
||||||
|
2. **Idempotent**: Safe to run multiple times - existing resources are preserved
|
||||||
|
3. **Configuration**: Always load initial configuration during setup
|
||||||
|
4. **Validation**: Verify initialization success with validation scripts
|
||||||
|
5. **Environment Variables**: Use environment variables for sensitive configuration
|
||||||
|
6. **Retry Logic**: Implement retry logic for robust deployments
|
||||||
|
7. **Monitoring**: Monitor namespace and topic creation for issues
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Pulsar Not Ready
|
||||||
|
```bash
|
||||||
|
# Check Pulsar health
|
||||||
|
curl http://pulsar:8080/admin/v2/clusters
|
||||||
|
|
||||||
|
# Check Pulsar logs
|
||||||
|
docker logs pulsar
|
||||||
|
```
|
||||||
|
|
||||||
|
### Permission Issues
|
||||||
|
```bash
|
||||||
|
# Verify Pulsar admin access
|
||||||
|
curl http://pulsar:8080/admin/v2/tenants
|
||||||
|
|
||||||
|
# Check API key validity if using authentication
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configuration Validation
|
||||||
|
```bash
|
||||||
|
# Validate JSON configuration
|
||||||
|
echo "$CONFIG" | jq .
|
||||||
|
|
||||||
|
# Test configuration loading separately
|
||||||
|
tg-init-trustgraph --config '{"test": "value"}'
|
||||||
|
```
|
||||||
568
docs/cli/tg-load-doc-embeds.md
Normal file
568
docs/cli/tg-load-doc-embeds.md
Normal file
|
|
@ -0,0 +1,568 @@
|
||||||
|
# tg-load-doc-embeds
|
||||||
|
|
||||||
|
Loads document embeddings from MessagePack format into TrustGraph processing pipelines.
|
||||||
|
|
||||||
|
## Synopsis
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tg-load-doc-embeds -i INPUT_FILE [options]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
The `tg-load-doc-embeds` command loads document embeddings from MessagePack files into a running TrustGraph system. This is typically used to restore previously saved document embeddings or to load embeddings generated by external systems.
|
||||||
|
|
||||||
|
The command reads document embedding data in MessagePack format and streams it to TrustGraph's document embeddings import API via WebSocket connections.
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
### Required Arguments
|
||||||
|
|
||||||
|
- `-i, --input-file FILE`: Input MessagePack file containing document embeddings
|
||||||
|
|
||||||
|
### Optional Arguments
|
||||||
|
|
||||||
|
- `-u, --url URL`: TrustGraph API URL (default: `$TRUSTGRAPH_API` or `http://localhost:8088/`)
|
||||||
|
- `-f, --flow-id ID`: Flow instance ID to use (default: `default`)
|
||||||
|
- `--format FORMAT`: Input format - `msgpack` or `json` (default: `msgpack`)
|
||||||
|
- `--user USER`: Override user ID from input data
|
||||||
|
- `--collection COLLECTION`: Override collection ID from input data
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### Basic Loading
|
||||||
|
```bash
|
||||||
|
tg-load-doc-embeds -i document-embeddings.msgpack
|
||||||
|
```
|
||||||
|
|
||||||
|
### Load with Custom Flow
|
||||||
|
```bash
|
||||||
|
tg-load-doc-embeds \
|
||||||
|
-i embeddings.msgpack \
|
||||||
|
-f "document-processing-flow"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Override User and Collection
|
||||||
|
```bash
|
||||||
|
tg-load-doc-embeds \
|
||||||
|
-i embeddings.msgpack \
|
||||||
|
--user "research-team" \
|
||||||
|
--collection "research-docs"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Load from JSON Format
|
||||||
|
```bash
|
||||||
|
tg-load-doc-embeds \
|
||||||
|
-i embeddings.json \
|
||||||
|
--format json
|
||||||
|
```
|
||||||
|
|
||||||
|
### Production Loading
|
||||||
|
```bash
|
||||||
|
tg-load-doc-embeds \
|
||||||
|
-i production-embeddings.msgpack \
|
||||||
|
-u https://trustgraph-api.company.com/ \
|
||||||
|
-f "production-flow" \
|
||||||
|
--user "system" \
|
||||||
|
--collection "production-docs"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Input Data Format
|
||||||
|
|
||||||
|
### MessagePack Structure
|
||||||
|
Document embeddings are stored as MessagePack records with this structure:
|
||||||
|
|
||||||
|
```json
|
||||||
|
["de", {
|
||||||
|
"m": {
|
||||||
|
"i": "document-id",
|
||||||
|
"m": [{"metadata": "objects"}],
|
||||||
|
"u": "user-id",
|
||||||
|
"c": "collection-id"
|
||||||
|
},
|
||||||
|
"c": [{
|
||||||
|
"c": "text chunk content",
|
||||||
|
"v": [0.1, 0.2, 0.3, ...]
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Components
|
||||||
|
- **Document Metadata** (`m`):
|
||||||
|
- `i`: Document ID
|
||||||
|
- `m`: Document metadata objects
|
||||||
|
- `u`: User ID
|
||||||
|
- `c`: Collection ID
|
||||||
|
- **Chunks** (`c`): Array of text chunks with embeddings:
|
||||||
|
- `c`: Text content of the chunk
|
||||||
|
- `v`: Vector embedding array
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
### Backup Restoration
|
||||||
|
```bash
|
||||||
|
# Restore document embeddings from backup
|
||||||
|
restore_embeddings() {
|
||||||
|
local backup_file="$1"
|
||||||
|
local target_collection="$2"
|
||||||
|
|
||||||
|
echo "Restoring document embeddings from: $backup_file"
|
||||||
|
|
||||||
|
if [ ! -f "$backup_file" ]; then
|
||||||
|
echo "Backup file not found: $backup_file"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Verify backup file
|
||||||
|
if tg-dump-msgpack -i "$backup_file" --summary | grep -q "Vector dimension:"; then
|
||||||
|
echo "✓ Backup file contains embeddings"
|
||||||
|
else
|
||||||
|
echo "✗ Backup file does not contain valid embeddings"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Load embeddings
|
||||||
|
tg-load-doc-embeds \
|
||||||
|
-i "$backup_file" \
|
||||||
|
--collection "$target_collection"
|
||||||
|
|
||||||
|
echo "Embedding restoration complete"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Restore from backup
|
||||||
|
restore_embeddings "backup-20231215.msgpack" "restored-docs"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Migration
|
||||||
|
```bash
|
||||||
|
# Migrate embeddings between environments
|
||||||
|
migrate_embeddings() {
|
||||||
|
local source_file="$1"
|
||||||
|
local target_env="$2"
|
||||||
|
local target_user="$3"
|
||||||
|
|
||||||
|
echo "Migrating embeddings to: $target_env"
|
||||||
|
|
||||||
|
# Load to target environment
|
||||||
|
tg-load-doc-embeds \
|
||||||
|
-i "$source_file" \
|
||||||
|
-u "https://$target_env/api/" \
|
||||||
|
--user "$target_user" \
|
||||||
|
--collection "migrated-docs"
|
||||||
|
|
||||||
|
echo "Migration complete"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Migrate to production
|
||||||
|
migrate_embeddings "dev-embeddings.msgpack" "prod.company.com" "migration-user"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Batch Processing
|
||||||
|
```bash
|
||||||
|
# Load multiple embedding files
|
||||||
|
batch_load_embeddings() {
|
||||||
|
local input_dir="$1"
|
||||||
|
local collection="$2"
|
||||||
|
|
||||||
|
echo "Batch loading embeddings from: $input_dir"
|
||||||
|
|
||||||
|
for file in "$input_dir"/*.msgpack; do
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
echo "Loading: $(basename "$file")"
|
||||||
|
|
||||||
|
tg-load-doc-embeds \
|
||||||
|
-i "$file" \
|
||||||
|
--collection "$collection"
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "✓ Loaded: $(basename "$file")"
|
||||||
|
else
|
||||||
|
echo "✗ Failed: $(basename "$file")"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Batch loading complete"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load all embeddings
|
||||||
|
batch_load_embeddings "embeddings/" "batch-processed"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Incremental Loading
|
||||||
|
```bash
|
||||||
|
# Load new embeddings incrementally
|
||||||
|
incremental_load() {
|
||||||
|
local embeddings_dir="$1"
|
||||||
|
local processed_log="processed_embeddings.log"
|
||||||
|
|
||||||
|
# Create log if it doesn't exist
|
||||||
|
touch "$processed_log"
|
||||||
|
|
||||||
|
for file in "$embeddings_dir"/*.msgpack; do
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
# Check if already processed
|
||||||
|
if grep -q "$(basename "$file")" "$processed_log"; then
|
||||||
|
echo "Skipping already processed: $(basename "$file")"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Processing new file: $(basename "$file")"
|
||||||
|
|
||||||
|
if tg-load-doc-embeds -i "$file"; then
|
||||||
|
echo "$(date): $(basename "$file")" >> "$processed_log"
|
||||||
|
echo "✓ Processed: $(basename "$file")"
|
||||||
|
else
|
||||||
|
echo "✗ Failed: $(basename "$file")"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run incremental loading
|
||||||
|
incremental_load "embeddings/"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Usage
|
||||||
|
|
||||||
|
### Parallel Loading
|
||||||
|
```bash
|
||||||
|
# Load multiple files in parallel
|
||||||
|
parallel_load_embeddings() {
|
||||||
|
local files=("$@")
|
||||||
|
local max_parallel=3
|
||||||
|
local current_jobs=0
|
||||||
|
|
||||||
|
for file in "${files[@]}"; do
|
||||||
|
# Wait if max parallel jobs reached
|
||||||
|
while [ $current_jobs -ge $max_parallel ]; do
|
||||||
|
wait -n # Wait for any job to complete
|
||||||
|
current_jobs=$((current_jobs - 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
# Start loading in background
|
||||||
|
(
|
||||||
|
echo "Loading: $file"
|
||||||
|
tg-load-doc-embeds -i "$file"
|
||||||
|
echo "Completed: $file"
|
||||||
|
) &
|
||||||
|
|
||||||
|
current_jobs=$((current_jobs + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
# Wait for all remaining jobs
|
||||||
|
wait
|
||||||
|
echo "All parallel loading completed"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load files in parallel
|
||||||
|
embedding_files=(embeddings1.msgpack embeddings2.msgpack embeddings3.msgpack)
|
||||||
|
parallel_load_embeddings "${embedding_files[@]}"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Validation and Loading
|
||||||
|
```bash
|
||||||
|
# Validate before loading
|
||||||
|
validate_and_load() {
|
||||||
|
local file="$1"
|
||||||
|
local collection="$2"
|
||||||
|
|
||||||
|
echo "Validating embedding file: $file"
|
||||||
|
|
||||||
|
# Check file exists and is readable
|
||||||
|
if [ ! -r "$file" ]; then
|
||||||
|
echo "Error: Cannot read file $file"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Validate MessagePack structure
|
||||||
|
if ! tg-dump-msgpack -i "$file" --summary > /dev/null 2>&1; then
|
||||||
|
echo "Error: Invalid MessagePack format"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for document embeddings
|
||||||
|
if ! tg-dump-msgpack -i "$file" | grep -q '^\["de"'; then
|
||||||
|
echo "Error: No document embeddings found"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get embedding statistics
|
||||||
|
summary=$(tg-dump-msgpack -i "$file" --summary)
|
||||||
|
vector_dim=$(echo "$summary" | grep "Vector dimension:" | awk '{print $3}')
|
||||||
|
|
||||||
|
if [ -n "$vector_dim" ]; then
|
||||||
|
echo "✓ Found embeddings with dimension: $vector_dim"
|
||||||
|
else
|
||||||
|
echo "Warning: Could not determine vector dimension"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Load embeddings
|
||||||
|
echo "Loading validated embeddings..."
|
||||||
|
tg-load-doc-embeds -i "$file" --collection "$collection"
|
||||||
|
|
||||||
|
echo "Loading complete"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Validate and load
|
||||||
|
validate_and_load "embeddings.msgpack" "validated-docs"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Progress Monitoring
|
||||||
|
```bash
|
||||||
|
# Monitor loading progress
|
||||||
|
monitor_loading() {
|
||||||
|
local file="$1"
|
||||||
|
local log_file="loading_progress.log"
|
||||||
|
|
||||||
|
# Start loading in background
|
||||||
|
tg-load-doc-embeds -i "$file" > "$log_file" 2>&1 &
|
||||||
|
local load_pid=$!
|
||||||
|
|
||||||
|
echo "Monitoring loading progress (PID: $load_pid)..."
|
||||||
|
|
||||||
|
# Monitor progress
|
||||||
|
while kill -0 $load_pid 2>/dev/null; do
|
||||||
|
if [ -f "$log_file" ]; then
|
||||||
|
# Extract progress from log
|
||||||
|
embeddings_count=$(grep -o "Document embeddings:.*[0-9]" "$log_file" | tail -1 | awk '{print $3}')
|
||||||
|
if [ -n "$embeddings_count" ]; then
|
||||||
|
echo "Progress: $embeddings_count embeddings loaded"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check final status
|
||||||
|
wait $load_pid
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "✓ Loading completed successfully"
|
||||||
|
else
|
||||||
|
echo "✗ Loading failed"
|
||||||
|
cat "$log_file"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm "$log_file"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Monitor loading
|
||||||
|
monitor_loading "large-embeddings.msgpack"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Transformation
|
||||||
|
```bash
|
||||||
|
# Transform embeddings during loading
|
||||||
|
transform_and_load() {
|
||||||
|
local input_file="$1"
|
||||||
|
local output_file="transformed-$(basename "$input_file")"
|
||||||
|
local new_user="$2"
|
||||||
|
local new_collection="$3"
|
||||||
|
|
||||||
|
echo "Transforming embeddings: user=$new_user, collection=$new_collection"
|
||||||
|
|
||||||
|
# This would require a transformation script
|
||||||
|
# For now, we'll show the concept
|
||||||
|
|
||||||
|
# Load with override parameters
|
||||||
|
tg-load-doc-embeds \
|
||||||
|
-i "$input_file" \
|
||||||
|
--user "$new_user" \
|
||||||
|
--collection "$new_collection"
|
||||||
|
|
||||||
|
echo "Transformation and loading complete"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Transform during loading
|
||||||
|
transform_and_load "original.msgpack" "new-user" "new-collection"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Performance Optimization
|
||||||
|
|
||||||
|
### Memory Management
|
||||||
|
```bash
|
||||||
|
# Monitor memory usage during loading
|
||||||
|
monitor_memory_usage() {
|
||||||
|
local file="$1"
|
||||||
|
|
||||||
|
echo "Starting memory-monitored loading..."
|
||||||
|
|
||||||
|
# Start loading in background
|
||||||
|
tg-load-doc-embeds -i "$file" &
|
||||||
|
local load_pid=$!
|
||||||
|
|
||||||
|
# Monitor memory usage
|
||||||
|
while kill -0 $load_pid 2>/dev/null; do
|
||||||
|
memory_usage=$(ps -p $load_pid -o rss= 2>/dev/null | awk '{print $1/1024}')
|
||||||
|
if [ -n "$memory_usage" ]; then
|
||||||
|
echo "Memory usage: ${memory_usage}MB"
|
||||||
|
fi
|
||||||
|
sleep 10
|
||||||
|
done
|
||||||
|
|
||||||
|
wait $load_pid
|
||||||
|
echo "Loading completed"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Chunked Loading
|
||||||
|
```bash
|
||||||
|
# Load large files in chunks
|
||||||
|
chunked_load() {
|
||||||
|
local large_file="$1"
|
||||||
|
local chunk_size=1000 # Records per chunk
|
||||||
|
|
||||||
|
echo "Loading large file in chunks: $large_file"
|
||||||
|
|
||||||
|
# Split the MessagePack file (this would need special tooling)
|
||||||
|
# For demonstration, assuming we have pre-split files
|
||||||
|
|
||||||
|
for chunk in "${large_file%.msgpack}"_chunk_*.msgpack; do
|
||||||
|
if [ -f "$chunk" ]; then
|
||||||
|
echo "Loading chunk: $(basename "$chunk")"
|
||||||
|
tg-load-doc-embeds -i "$chunk"
|
||||||
|
|
||||||
|
# Add delay between chunks to reduce system load
|
||||||
|
sleep 2
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Chunked loading complete"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
|
||||||
|
### File Not Found
|
||||||
|
```bash
|
||||||
|
Exception: [Errno 2] No such file or directory
|
||||||
|
```
|
||||||
|
**Solution**: Verify file path and ensure the MessagePack file exists.
|
||||||
|
|
||||||
|
### Invalid Format
|
||||||
|
```bash
|
||||||
|
Exception: Unpack failed
|
||||||
|
```
|
||||||
|
**Solution**: Verify the file is a valid MessagePack file with document embeddings.
|
||||||
|
|
||||||
|
### WebSocket Connection Issues
|
||||||
|
```bash
|
||||||
|
Exception: Connection failed
|
||||||
|
```
|
||||||
|
**Solution**: Check API URL and ensure TrustGraph is running with WebSocket support.
|
||||||
|
|
||||||
|
### Memory Errors
|
||||||
|
```bash
|
||||||
|
MemoryError: Unable to allocate memory
|
||||||
|
```
|
||||||
|
**Solution**: Process large files in smaller chunks or increase available memory.
|
||||||
|
|
||||||
|
### Flow Not Found
|
||||||
|
```bash
|
||||||
|
Exception: Flow not found
|
||||||
|
```
|
||||||
|
**Solution**: Verify the flow ID exists with `tg-show-flows`.
|
||||||
|
|
||||||
|
## Integration with Other Commands
|
||||||
|
|
||||||
|
### Complete Workflow
|
||||||
|
```bash
|
||||||
|
# Complete document processing workflow
|
||||||
|
process_documents_workflow() {
|
||||||
|
local pdf_dir="$1"
|
||||||
|
local embeddings_file="embeddings.msgpack"
|
||||||
|
|
||||||
|
echo "Starting complete document workflow..."
|
||||||
|
|
||||||
|
# 1. Load PDFs
|
||||||
|
for pdf in "$pdf_dir"/*.pdf; do
|
||||||
|
tg-load-pdf "$pdf"
|
||||||
|
done
|
||||||
|
|
||||||
|
# 2. Wait for processing
|
||||||
|
sleep 30
|
||||||
|
|
||||||
|
# 3. Save embeddings
|
||||||
|
tg-save-doc-embeds -o "$embeddings_file"
|
||||||
|
|
||||||
|
# 4. Process embeddings (example: load to different collection)
|
||||||
|
tg-load-doc-embeds -i "$embeddings_file" --collection "processed-docs"
|
||||||
|
|
||||||
|
echo "Complete workflow finished"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Backup and Restore
|
||||||
|
```bash
|
||||||
|
# Complete backup and restore cycle
|
||||||
|
backup_restore_cycle() {
|
||||||
|
local backup_file="embeddings-backup.msgpack"
|
||||||
|
|
||||||
|
echo "Creating embeddings backup..."
|
||||||
|
tg-save-doc-embeds -o "$backup_file"
|
||||||
|
|
||||||
|
echo "Simulating data loss..."
|
||||||
|
# (In real scenario, this might be system failure)
|
||||||
|
|
||||||
|
echo "Restoring from backup..."
|
||||||
|
tg-load-doc-embeds -i "$backup_file" --collection "restored"
|
||||||
|
|
||||||
|
echo "Backup/restore cycle complete"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Environment Variables
|
||||||
|
|
||||||
|
- `TRUSTGRAPH_API`: Default API URL
|
||||||
|
|
||||||
|
## Related Commands
|
||||||
|
|
||||||
|
- [`tg-save-doc-embeds`](tg-save-doc-embeds.md) - Save document embeddings to MessagePack
|
||||||
|
- [`tg-dump-msgpack`](tg-dump-msgpack.md) - Analyze MessagePack files
|
||||||
|
- [`tg-load-pdf`](tg-load-pdf.md) - Load PDF documents for processing
|
||||||
|
- [`tg-show-flows`](tg-show-flows.md) - List available flows
|
||||||
|
|
||||||
|
## API Integration
|
||||||
|
|
||||||
|
This command uses TrustGraph's WebSocket API for document embeddings import, specifically the `/api/v1/flow/{flow-id}/import/document-embeddings` endpoint.
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
1. **Validation**: Always validate MessagePack files before loading
|
||||||
|
2. **Backups**: Keep backups of original embedding files
|
||||||
|
3. **Monitoring**: Monitor memory usage and loading progress
|
||||||
|
4. **Chunking**: Process large files in manageable chunks
|
||||||
|
5. **Error Handling**: Implement robust error handling and retry logic
|
||||||
|
6. **Documentation**: Document the source and format of embedding files
|
||||||
|
7. **Testing**: Test loading procedures in non-production environments
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Loading Stalls
|
||||||
|
```bash
|
||||||
|
# Check WebSocket connection
|
||||||
|
netstat -an | grep :8088
|
||||||
|
|
||||||
|
# Check system resources
|
||||||
|
free -h
|
||||||
|
df -h
|
||||||
|
```
|
||||||
|
|
||||||
|
### Incomplete Loading
|
||||||
|
```bash
|
||||||
|
# Compare input vs loaded data
|
||||||
|
input_count=$(tg-dump-msgpack -i input.msgpack | grep '^\["de"' | wc -l)
|
||||||
|
echo "Input embeddings: $input_count"
|
||||||
|
|
||||||
|
# Check loaded data (would need query command)
|
||||||
|
# loaded_count=$(tg-query-embeddings --count)
|
||||||
|
# echo "Loaded embeddings: $loaded_count"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Performance Issues
|
||||||
|
```bash
|
||||||
|
# Monitor network usage
|
||||||
|
iftop
|
||||||
|
|
||||||
|
# Check TrustGraph service logs
|
||||||
|
docker logs trustgraph-service
|
||||||
|
```
|
||||||
567
docs/cli/tg-load-sample-documents.md
Normal file
567
docs/cli/tg-load-sample-documents.md
Normal file
|
|
@ -0,0 +1,567 @@
|
||||||
|
# tg-load-sample-documents
|
||||||
|
|
||||||
|
Loads predefined sample documents into TrustGraph library for testing and demonstration purposes.
|
||||||
|
|
||||||
|
## Synopsis
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tg-load-sample-documents [options]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
The `tg-load-sample-documents` command loads a curated set of sample documents into TrustGraph's document library. These documents include academic papers, government reports, and reference materials that demonstrate TrustGraph's capabilities and provide data for testing and evaluation.
|
||||||
|
|
||||||
|
The command downloads documents from public sources and adds them to the library with comprehensive metadata including RDF triples for semantic relationships.
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
### Optional Arguments
|
||||||
|
|
||||||
|
- `-u, --url URL`: TrustGraph API URL (default: `$TRUSTGRAPH_URL` or `http://localhost:8088/`)
|
||||||
|
- `-U, --user USER`: User ID for document ownership (default: `trustgraph`)
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### Basic Loading
|
||||||
|
```bash
|
||||||
|
tg-load-sample-documents
|
||||||
|
```
|
||||||
|
|
||||||
|
### Load with Custom User
|
||||||
|
```bash
|
||||||
|
tg-load-sample-documents -U "demo-user"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Load to Custom Environment
|
||||||
|
```bash
|
||||||
|
tg-load-sample-documents -u http://demo.trustgraph.ai:8088/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Sample Documents
|
||||||
|
|
||||||
|
The command loads the following sample documents:
|
||||||
|
|
||||||
|
### 1. NASA Challenger Report
|
||||||
|
- **Title**: Report of the Presidential Commission on the Space Shuttle Challenger Accident, Volume 1
|
||||||
|
- **Topics**: Safety engineering, space shuttle, NASA
|
||||||
|
- **Format**: PDF
|
||||||
|
- **Source**: NASA Technical Reports Server
|
||||||
|
- **Use Case**: Demonstrates technical document processing and safety analysis
|
||||||
|
|
||||||
|
### 2. Old Icelandic Dictionary
|
||||||
|
- **Title**: A Concise Dictionary of Old Icelandic
|
||||||
|
- **Topics**: Language, linguistics, Old Norse, grammar
|
||||||
|
- **Format**: PDF
|
||||||
|
- **Publication**: 1910, Clarendon Press
|
||||||
|
- **Use Case**: Historical document processing and linguistic analysis
|
||||||
|
|
||||||
|
### 3. US Intelligence Threat Assessment
|
||||||
|
- **Title**: Annual Threat Assessment of the U.S. Intelligence Community - March 2025
|
||||||
|
- **Topics**: National security, cyberthreats, geopolitics
|
||||||
|
- **Format**: PDF
|
||||||
|
- **Source**: Director of National Intelligence
|
||||||
|
- **Use Case**: Current affairs analysis and security research
|
||||||
|
|
||||||
|
### 4. Intelligence and State Policy
|
||||||
|
- **Title**: The Role of Intelligence and State Policies in International Security
|
||||||
|
- **Topics**: Intelligence, international security, state policy
|
||||||
|
- **Format**: PDF (sample)
|
||||||
|
- **Publication**: Cambridge Scholars Publishing, 2021
|
||||||
|
- **Use Case**: Academic research and policy analysis
|
||||||
|
|
||||||
|
### 5. Globalization and Intelligence
|
||||||
|
- **Title**: Beyond the Vigilant State: Globalisation and Intelligence
|
||||||
|
- **Topics**: Intelligence, globalization, security studies
|
||||||
|
- **Format**: PDF
|
||||||
|
- **Author**: Richard J. Aldrich
|
||||||
|
- **Use Case**: Academic paper analysis and research
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
### Demo Environment Setup
|
||||||
|
```bash
|
||||||
|
# Set up demonstration environment
|
||||||
|
setup_demo_environment() {
|
||||||
|
echo "Setting up TrustGraph demo environment..."
|
||||||
|
|
||||||
|
# Initialize system
|
||||||
|
tg-init-trustgraph
|
||||||
|
|
||||||
|
# Load sample documents
|
||||||
|
echo "Loading sample documents..."
|
||||||
|
tg-load-sample-documents -U "demo"
|
||||||
|
|
||||||
|
# Wait for processing
|
||||||
|
echo "Waiting for document processing..."
|
||||||
|
sleep 60
|
||||||
|
|
||||||
|
# Start document processing
|
||||||
|
echo "Starting document processing..."
|
||||||
|
tg-show-library-documents -U "demo" | \
|
||||||
|
grep "| id" | \
|
||||||
|
awk '{print $3}' | \
|
||||||
|
while read doc_id; do
|
||||||
|
proc_id="demo_proc_$(date +%s)_${doc_id}"
|
||||||
|
tg-start-library-processing -d "$doc_id" --id "$proc_id" -U "demo"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Demo environment ready!"
|
||||||
|
echo "Try: tg-invoke-document-rag -q 'What caused the Challenger accident?' -U demo"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Testing Data Pipeline
|
||||||
|
```bash
|
||||||
|
# Test complete document processing pipeline
|
||||||
|
test_document_pipeline() {
|
||||||
|
echo "Testing document processing pipeline..."
|
||||||
|
|
||||||
|
# Load sample documents
|
||||||
|
tg-load-sample-documents -U "test"
|
||||||
|
|
||||||
|
# List loaded documents
|
||||||
|
echo "Loaded documents:"
|
||||||
|
tg-show-library-documents -U "test"
|
||||||
|
|
||||||
|
# Start processing for each document
|
||||||
|
tg-show-library-documents -U "test" | \
|
||||||
|
grep "| id" | \
|
||||||
|
awk '{print $3}' | \
|
||||||
|
while read doc_id; do
|
||||||
|
echo "Processing document: $doc_id"
|
||||||
|
proc_id="test_$(date +%s)_${doc_id}"
|
||||||
|
tg-start-library-processing -d "$doc_id" --id "$proc_id" -U "test"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Wait for processing
|
||||||
|
echo "Processing documents... (this may take several minutes)"
|
||||||
|
sleep 300
|
||||||
|
|
||||||
|
# Test document queries
|
||||||
|
echo "Testing document queries..."
|
||||||
|
|
||||||
|
test_queries=(
|
||||||
|
"What is the Challenger accident?"
|
||||||
|
"What is Old Icelandic?"
|
||||||
|
"What are the main cybersecurity threats?"
|
||||||
|
"What is intelligence policy?"
|
||||||
|
)
|
||||||
|
|
||||||
|
for query in "${test_queries[@]}"; do
|
||||||
|
echo "Query: $query"
|
||||||
|
tg-invoke-document-rag -q "$query" -U "test" | head -5
|
||||||
|
echo "---"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Pipeline test complete!"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Educational Environment
|
||||||
|
```bash
|
||||||
|
# Set up educational/training environment
|
||||||
|
setup_educational_environment() {
|
||||||
|
local class_name="$1"
|
||||||
|
|
||||||
|
echo "Setting up educational environment for: $class_name"
|
||||||
|
|
||||||
|
# Create user for the class
|
||||||
|
class_user=$(echo "$class_name" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')
|
||||||
|
|
||||||
|
# Load sample documents for the class
|
||||||
|
tg-load-sample-documents -U "$class_user"
|
||||||
|
|
||||||
|
# Process documents
|
||||||
|
echo "Processing documents for educational use..."
|
||||||
|
tg-show-library-documents -U "$class_user" | \
|
||||||
|
grep "| id" | \
|
||||||
|
awk '{print $3}' | \
|
||||||
|
while read doc_id; do
|
||||||
|
proc_id="edu_$(date +%s)_${doc_id}"
|
||||||
|
tg-start-library-processing \
|
||||||
|
-d "$doc_id" \
|
||||||
|
--id "$proc_id" \
|
||||||
|
-U "$class_user" \
|
||||||
|
--collection "education"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Educational environment ready for: $class_name"
|
||||||
|
echo "User: $class_user"
|
||||||
|
echo "Collection: education"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Set up for different classes
|
||||||
|
setup_educational_environment "AI Research Methods"
|
||||||
|
setup_educational_environment "Security Studies"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Benchmarking and Performance Testing
|
||||||
|
```bash
|
||||||
|
# Benchmark document processing performance
|
||||||
|
benchmark_processing() {
|
||||||
|
echo "Starting document processing benchmark..."
|
||||||
|
|
||||||
|
# Load sample documents
|
||||||
|
start_time=$(date +%s)
|
||||||
|
tg-load-sample-documents -U "benchmark"
|
||||||
|
load_time=$(date +%s)
|
||||||
|
|
||||||
|
echo "Document loading time: $((load_time - start_time))s"
|
||||||
|
|
||||||
|
# Count documents
|
||||||
|
doc_count=$(tg-show-library-documents -U "benchmark" | grep -c "| id")
|
||||||
|
echo "Documents loaded: $doc_count"
|
||||||
|
|
||||||
|
# Start processing
|
||||||
|
processing_ids=()
|
||||||
|
tg-show-library-documents -U "benchmark" | \
|
||||||
|
grep "| id" | \
|
||||||
|
awk '{print $3}' | \
|
||||||
|
while read doc_id; do
|
||||||
|
proc_id="bench_$(date +%s)_${doc_id}"
|
||||||
|
processing_ids+=("$proc_id")
|
||||||
|
tg-start-library-processing -d "$doc_id" --id "$proc_id" -U "benchmark"
|
||||||
|
done
|
||||||
|
|
||||||
|
processing_start=$(date +%s)
|
||||||
|
|
||||||
|
# Monitor processing completion
|
||||||
|
echo "Monitoring processing completion..."
|
||||||
|
while true; do
|
||||||
|
active_processing=$(tg-show-flows | grep -c "bench_" || echo "0")
|
||||||
|
|
||||||
|
if [ "$active_processing" -eq 0 ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Active processing jobs: $active_processing"
|
||||||
|
sleep 30
|
||||||
|
done
|
||||||
|
|
||||||
|
processing_end=$(date +%s)
|
||||||
|
|
||||||
|
echo "Processing completion time: $((processing_end - processing_start))s"
|
||||||
|
echo "Total benchmark time: $((processing_end - start_time))s"
|
||||||
|
|
||||||
|
# Test query performance
|
||||||
|
echo "Testing query performance..."
|
||||||
|
query_start=$(date +%s)
|
||||||
|
|
||||||
|
for i in {1..10}; do
|
||||||
|
tg-invoke-document-rag \
|
||||||
|
-q "What are the main topics in these documents?" \
|
||||||
|
-U "benchmark" > /dev/null
|
||||||
|
done
|
||||||
|
|
||||||
|
query_end=$(date +%s)
|
||||||
|
echo "Average query time: $(echo "scale=2; ($query_end - $query_start) / 10" | bc)s"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Usage
|
||||||
|
|
||||||
|
### Selective Document Loading
|
||||||
|
```bash
|
||||||
|
# Load only specific types of documents
|
||||||
|
load_by_category() {
|
||||||
|
local category="$1"
|
||||||
|
|
||||||
|
case "$category" in
|
||||||
|
"government")
|
||||||
|
echo "Loading government documents..."
|
||||||
|
# This would require modifying the script to load selectively
|
||||||
|
# For now, we load all and filter by tags later
|
||||||
|
tg-load-sample-documents -U "gov-docs"
|
||||||
|
;;
|
||||||
|
"academic")
|
||||||
|
echo "Loading academic documents..."
|
||||||
|
tg-load-sample-documents -U "academic-docs"
|
||||||
|
;;
|
||||||
|
"historical")
|
||||||
|
echo "Loading historical documents..."
|
||||||
|
tg-load-sample-documents -U "historical-docs"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Loading all sample documents..."
|
||||||
|
tg-load-sample-documents
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load by category
|
||||||
|
load_by_category "government"
|
||||||
|
load_by_category "academic"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Multi-Environment Loading
|
||||||
|
```bash
|
||||||
|
# Load sample documents to multiple environments
|
||||||
|
multi_environment_setup() {
|
||||||
|
local environments=("dev" "staging" "demo")
|
||||||
|
|
||||||
|
for env in "${environments[@]}"; do
|
||||||
|
echo "Setting up $env environment..."
|
||||||
|
|
||||||
|
tg-load-sample-documents \
|
||||||
|
-u "http://$env.trustgraph.company.com:8088/" \
|
||||||
|
-U "sample-data"
|
||||||
|
|
||||||
|
echo "✓ $env environment loaded"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "All environments loaded with sample documents"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Custom Document Sets
|
||||||
|
```bash
|
||||||
|
# Create custom document loading scripts based on the sample
|
||||||
|
create_custom_loader() {
|
||||||
|
local domain="$1"
|
||||||
|
|
||||||
|
cat > "load-${domain}-documents.py" << 'EOF'
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Custom document loader for specific domain
|
||||||
|
Based on tg-load-sample-documents
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
from trustgraph.api import Api
|
||||||
|
|
||||||
|
# Define your own document set here
|
||||||
|
documents = [
|
||||||
|
{
|
||||||
|
"id": "https://example.com/doc/custom-1",
|
||||||
|
"title": "Custom Document 1",
|
||||||
|
"url": "https://example.com/docs/custom1.pdf",
|
||||||
|
# Add your document definitions...
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
# Rest of the implementation similar to tg-load-sample-documents
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "Custom loader created: load-${domain}-documents.py"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create custom loaders for different domains
|
||||||
|
create_custom_loader "medical"
|
||||||
|
create_custom_loader "legal"
|
||||||
|
create_custom_loader "technical"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Document Analysis
|
||||||
|
|
||||||
|
### Content Analysis
|
||||||
|
```bash
|
||||||
|
# Analyze loaded sample documents
|
||||||
|
analyze_sample_documents() {
|
||||||
|
echo "Analyzing sample documents..."
|
||||||
|
|
||||||
|
# Get document statistics
|
||||||
|
total_docs=$(tg-show-library-documents | grep -c "| id")
|
||||||
|
echo "Total documents: $total_docs"
|
||||||
|
|
||||||
|
# Analyze by type
|
||||||
|
echo "Document types:"
|
||||||
|
tg-show-library-documents | \
|
||||||
|
grep "| kind" | \
|
||||||
|
awk '{print $3}' | \
|
||||||
|
sort | uniq -c
|
||||||
|
|
||||||
|
# Analyze tags
|
||||||
|
echo "Popular tags:"
|
||||||
|
tg-show-library-documents | \
|
||||||
|
grep "| tags" | \
|
||||||
|
sed 's/.*| tags.*| \(.*\) |.*/\1/' | \
|
||||||
|
tr ',' '\n' | \
|
||||||
|
sed 's/^ *//;s/ *$//' | \
|
||||||
|
sort | uniq -c | sort -nr | head -10
|
||||||
|
|
||||||
|
# Document sizes (would need additional API)
|
||||||
|
echo "Document analysis complete"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Query Testing
|
||||||
|
```bash
|
||||||
|
# Test sample documents with various queries
|
||||||
|
test_sample_queries() {
|
||||||
|
echo "Testing sample document queries..."
|
||||||
|
|
||||||
|
# Define test queries for different domains
|
||||||
|
queries=(
|
||||||
|
"What caused the Challenger space shuttle accident?"
|
||||||
|
"What is Old Norse language?"
|
||||||
|
"What are current cybersecurity threats?"
|
||||||
|
"How does globalization affect intelligence services?"
|
||||||
|
"What are the main security challenges in international relations?"
|
||||||
|
)
|
||||||
|
|
||||||
|
for query in "${queries[@]}"; do
|
||||||
|
echo "Testing query: $query"
|
||||||
|
echo "===================="
|
||||||
|
|
||||||
|
result=$(tg-invoke-document-rag -q "$query" 2>/dev/null)
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "$result" | head -3
|
||||||
|
echo "✓ Query successful"
|
||||||
|
else
|
||||||
|
echo "✗ Query failed"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
done
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
|
||||||
|
### Network Issues
|
||||||
|
```bash
|
||||||
|
Exception: Connection failed during download
|
||||||
|
```
|
||||||
|
**Solution**: Check internet connectivity and retry. Documents are cached locally after first download.
|
||||||
|
|
||||||
|
### Insufficient Storage
|
||||||
|
```bash
|
||||||
|
Exception: No space left on device
|
||||||
|
```
|
||||||
|
**Solution**: Free up disk space. Sample documents total approximately 50-100MB.
|
||||||
|
|
||||||
|
### API Connection Issues
|
||||||
|
```bash
|
||||||
|
Exception: Connection refused
|
||||||
|
```
|
||||||
|
**Solution**: Verify TrustGraph API is running and accessible.
|
||||||
|
|
||||||
|
### Processing Failures
|
||||||
|
```bash
|
||||||
|
Exception: Document processing failed
|
||||||
|
```
|
||||||
|
**Solution**: Check TrustGraph service logs and ensure all components are running.
|
||||||
|
|
||||||
|
## Monitoring and Validation
|
||||||
|
|
||||||
|
### Loading Progress
|
||||||
|
```bash
|
||||||
|
# Monitor sample document loading
|
||||||
|
monitor_sample_loading() {
|
||||||
|
echo "Starting sample document loading with monitoring..."
|
||||||
|
|
||||||
|
# Start loading in background
|
||||||
|
tg-load-sample-documents &
|
||||||
|
load_pid=$!
|
||||||
|
|
||||||
|
# Monitor progress
|
||||||
|
while kill -0 $load_pid 2>/dev/null; do
|
||||||
|
doc_count=$(tg-show-library-documents 2>/dev/null | grep -c "| id" || echo "0")
|
||||||
|
echo "Documents loaded so far: $doc_count"
|
||||||
|
sleep 10
|
||||||
|
done
|
||||||
|
|
||||||
|
wait $load_pid
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
final_count=$(tg-show-library-documents | grep -c "| id")
|
||||||
|
echo "✓ Loading completed successfully"
|
||||||
|
echo "Total documents loaded: $final_count"
|
||||||
|
else
|
||||||
|
echo "✗ Loading failed"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Validation
|
||||||
|
```bash
|
||||||
|
# Validate sample document loading
|
||||||
|
validate_sample_loading() {
|
||||||
|
echo "Validating sample document loading..."
|
||||||
|
|
||||||
|
# Expected document count (based on current sample set)
|
||||||
|
expected_docs=5
|
||||||
|
|
||||||
|
# Check actual count
|
||||||
|
actual_docs=$(tg-show-library-documents | grep -c "| id")
|
||||||
|
|
||||||
|
if [ "$actual_docs" -eq "$expected_docs" ]; then
|
||||||
|
echo "✓ Document count correct: $actual_docs"
|
||||||
|
else
|
||||||
|
echo "⚠ Document count mismatch: expected $expected_docs, got $actual_docs"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for expected documents
|
||||||
|
expected_titles=(
|
||||||
|
"Challenger"
|
||||||
|
"Icelandic"
|
||||||
|
"Intelligence"
|
||||||
|
"Threat Assessment"
|
||||||
|
"Vigilant State"
|
||||||
|
)
|
||||||
|
|
||||||
|
for title in "${expected_titles[@]}"; do
|
||||||
|
if tg-show-library-documents | grep -q "$title"; then
|
||||||
|
echo "✓ Found document containing: $title"
|
||||||
|
else
|
||||||
|
echo "✗ Missing document containing: $title"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Validation complete"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Environment Variables
|
||||||
|
|
||||||
|
- `TRUSTGRAPH_URL`: Default API URL
|
||||||
|
|
||||||
|
## Related Commands
|
||||||
|
|
||||||
|
- [`tg-show-library-documents`](tg-show-library-documents.md) - List loaded documents
|
||||||
|
- [`tg-start-library-processing`](tg-start-library-processing.md) - Process loaded documents
|
||||||
|
- [`tg-invoke-document-rag`](tg-invoke-document-rag.md) - Query processed documents
|
||||||
|
- [`tg-load-pdf`](tg-load-pdf.md) - Load individual PDF documents
|
||||||
|
|
||||||
|
## API Integration
|
||||||
|
|
||||||
|
This command uses the [Library API](../apis/api-librarian.md) to add sample documents to TrustGraph's document repository.
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
1. **Demo Preparation**: Use for setting up demonstration environments
|
||||||
|
2. **Testing**: Ideal for testing document processing pipelines
|
||||||
|
3. **Education**: Excellent for training and educational purposes
|
||||||
|
4. **Development**: Use in development environments for consistent test data
|
||||||
|
5. **Benchmarking**: Suitable for performance testing and optimization
|
||||||
|
6. **Documentation**: Great for documenting TrustGraph capabilities
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Download Failures
|
||||||
|
```bash
|
||||||
|
# Check document URLs are accessible
|
||||||
|
curl -I "https://ntrs.nasa.gov/api/citations/19860015255/downloads/19860015255.pdf"
|
||||||
|
|
||||||
|
# Check local cache
|
||||||
|
ls -la doc-cache/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Processing Issues
|
||||||
|
```bash
|
||||||
|
# Check document processing status
|
||||||
|
tg-show-library-processing
|
||||||
|
|
||||||
|
# Verify documents are in library
|
||||||
|
tg-show-library-documents | grep -E "(Challenger|Icelandic|Intelligence)"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Performance Problems
|
||||||
|
```bash
|
||||||
|
# Monitor system resources during loading
|
||||||
|
top
|
||||||
|
df -h
|
||||||
|
```
|
||||||
Loading…
Add table
Add a link
Reference in a new issue