Programmatic Ingestion Control for Enterprise Java
A strongly typed, fluent Java 25 client SDK designed to manage document ingestion pipelines, connector registration, Auto-Narrativization Copilot workflows, and AIOps observability directly from your Java & Spring Boot microservices.
Fluent Client API
Type-safe builder patterns for client configuration, custom endpoints, HTTP timeouts, authentication headers, and reactive execution.
OIS Document Lifecycle & Job Control
Create, start, pause, stop, and monitor document ingestion pipelines with full compliance for OIS models and DocumentAction (UPSERT / DELETE tombstones).
Auto-Narrativization Copilot
Trigger AI-driven narrative generation from connector schemas, test dry-run outputs, and update Mustache templates programmatically.
AIOps Observability & RCA
Query automated Root Cause Analysis (RCA) reports, correlated OpenTelemetry spans, and live pipeline throughput metrics.
Spring Boot Starter
Seamless autoconfiguration via `opencrawling.client.*` properties and injectable `OpenCrawlingClient` beans in Spring components.
Java 25 & Zero-Dependency
Built with native `java.net.http.HttpClient` leveraging Virtual Threads for non-blocking I/O with zero external transport bloat.
Interactive Usage Examples
import org.opencrawling.sdk.OpenCrawlingClient;
import java.time.Duration;
// Initialize OpenCrawlingClient with fluent configuration
OpenCrawlingClient client = OpenCrawlingClient.builder()
.baseUrl("http://localhost:8080")
.apiKey("oc-api-key-enterprise-prod")
.connectTimeout(Duration.ofSeconds(10))
.readTimeout(Duration.ofSeconds(30))
.build();
System.out.println("Connected to OpenCrawling REST API!");
import org.opencrawling.sdk.models.JobRequest;
import org.opencrawling.sdk.models.JobResponse;
import org.opencrawling.sdk.models.NarrativizationConfig;
// Create job with Auto-Narrativization enabled
JobResponse job = client.jobs().create(
JobRequest.builder()
.name("Enterprise Documentation Crawler")
.targetUrl("https://docs.example.com")
.repositoryConnector("FileSystem_Local")
.outputConnector("PGVector_Output")
.transformationConnector("Ollama_Embedding_Default")
.narrativization(NarrativizationConfig.builder()
.enabled(true)
.template("Document titled {{title}} with content: {{content}}")
.build())
.build()
);
System.out.println("Job created with ID: " + job.id());
// Trigger immediate job execution
client.jobs().start(job.id());
import org.opencrawling.sdk.models.ConnectorRequest;
import org.opencrawling.sdk.models.ConnectorResponse;
// Register custom PGVector output store connector
ConnectorResponse connector = client.connectors().create(
ConnectorRequest.builder()
.name("Custom_PGVector_Output")
.description("Custom PGVector Vector Store Output Connector")
.type("output")
.className("org.opencrawling.vector.VectorOutputConnector")
.maxConnections(20)
.addConfiguration("pgVectorUrl", "jdbc:postgresql://localhost:5432/opencrawling")
.addConfiguration("tableName", "vector_embeddings_ais")
.build()
);
System.out.println("Registered connector: " + connector.name());
import org.opencrawling.sdk.models.CopilotRequest;
import org.opencrawling.sdk.models.CopilotResponse;
// Trigger AI Copilot to generate Mustache narrative template
CopilotResponse copilotResponse = client.narrativization().generateTemplate(
CopilotRequest.builder()
.connectorType("repository")
.addField("title", "string", "Document Title")
.addField("content", "string", "Extracted body text content")
.addField("author", "string", "Document creator/author")
.build()
);
System.out.println("Generated Template:\n" + copilotResponse.template());
import org.opencrawling.sdk.models.DiagnosticReport;
import org.opencrawling.sdk.models.JobTraceResponse;
// Fetch AI-powered Root Cause Analysis (RCA) report
DiagnosticReport report = client.observability().diagnose("job-123");
System.out.println("Health Status: " + report.status());
System.out.println("AI Summary: " + report.summary());
// Query correlated OpenTelemetry spans for trace inspection
JobTraceResponse traces = client.observability().getTraces("job-123");
System.out.println("Total Spans: " + traces.totalSpans() + ", Duration: " + traces.totalDurationMillis() + "ms");
// application.yml
opencrawling:
client:
base-url: http://localhost:8080
api-key: your-api-key
connect-timeout: 10s
read-timeout: 30s
// Spring Service
import org.opencrawling.sdk.OpenCrawlingClient;
import org.springframework.stereotype.Service;
@Service
public class DocumentIngestionService {
private final OpenCrawlingClient client;
public DocumentIngestionService(OpenCrawlingClient client) {
this.client = client;
}
public void triggerJob(String jobId) {
client.jobs().start(jobId);
}
}
Add to Your Project
Deploying via Maven Central or local repository dependency.
<dependency>
<groupId>org.opencrawling</groupId>
<artifactId>oc-java-client-sdk</artifactId>
<version>1.0.1</version>
</dependency>