CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-io-quarkiverse-langchain4j--quarkus-langchain4j-core

Core runtime module for Quarkus LangChain4j integration with declarative AI services, guardrails, and observability

Overview
Eval results
Files

media-content.mddocs/

Media Content

Media content annotations enable AI services to process multimodal inputs including images, audio, video, and PDF documents. These annotations mark method parameters as URLs to media resources that AI models can analyze.

Core Imports

import io.quarkiverse.langchain4j.ImageUrl;
import io.quarkiverse.langchain4j.AudioUrl;
import io.quarkiverse.langchain4j.VideoUrl;
import io.quarkiverse.langchain4j.PdfUrl;
import dev.langchain4j.service.UserMessage;
import java.net.URL;
import java.net.URI;

@ImageUrl Annotation

package io.quarkiverse.langchain4j;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface ImageUrl {
}

Marks an AI service method parameter as an image URL for vision models.

Supported Types:

  • String
  • java.net.URL
  • java.net.URI
  • dev.langchain4j.data.image.Image

Limitation: At most one @ImageUrl parameter per method.

@AudioUrl Annotation

package io.quarkiverse.langchain4j;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface AudioUrl {
}

Marks an AI service method parameter as an audio URL for audio-capable models.

Supported Types:

  • String
  • java.net.URL
  • java.net.URI
  • dev.langchain4j.data.audio.Audio

Limitation: At most one @AudioUrl parameter per method.

@VideoUrl Annotation

package io.quarkiverse.langchain4j;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface VideoUrl {
}

Marks an AI service method parameter as a video URL for video-capable models.

Supported Types:

  • String
  • java.net.URL
  • java.net.URI
  • dev.langchain4j.data.video.Video

Limitation: At most one @VideoUrl parameter per method.

@PdfUrl Annotation

package io.quarkiverse.langchain4j;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface PdfUrl {
}

Marks an AI service method parameter as a PDF URL for document analysis.

Supported Types:

  • String
  • java.net.URL
  • java.net.URI
  • dev.langchain4j.data.pdf.PdfFile

Limitation: At most one @PdfUrl parameter per method.

Usage Examples

Image Analysis

import io.quarkiverse.langchain4j.RegisterAiService;
import io.quarkiverse.langchain4j.ImageUrl;
import dev.langchain4j.service.UserMessage;

@RegisterAiService
public interface VisionService {
    @UserMessage("Describe what you see in this image")
    String describeImage(@ImageUrl String imageUrl);
    
    @UserMessage("What objects are visible in this image?")
    List<String> listObjects(@ImageUrl String imageUrl);
}

// Usage
@Inject
VisionService vision;

public void analyzeImage() {
    String description = vision.describeImage("https://example.com/photo.jpg");
    System.out.println(description);
}

Using URL Types

import java.net.URL;
import java.net.URI;

@RegisterAiService
public interface MultiTypeVisionService {
    // Using String
    String describe(@ImageUrl String url);
    
    // Using URL
    String describe(@ImageUrl URL url);
    
    // Using URI
    String describe(@ImageUrl URI uri);
    
    // Using LangChain4j Image type
    String describe(@ImageUrl dev.langchain4j.data.image.Image image);
}

Image Q&A

@RegisterAiService
public interface ImageQA {
    @UserMessage("Look at this image and answer: {question}")
    String answerQuestion(@ImageUrl String imageUrl, @V("question") String question);
}

// Usage
String answer = imageQA.answerQuestion(
    "https://example.com/chart.png",
    "What is the trend in the data?"
);

Audio Transcription

@RegisterAiService
public interface AudioService {
    @UserMessage("Transcribe this audio")
    String transcribe(@AudioUrl String audioUrl);
    
    @UserMessage("Summarize the content of this audio")
    String summarize(@AudioUrl String audioUrl);
}

// Usage
@Inject
AudioService audio;

public void processAudio() {
    String transcript = audio.transcribe("https://example.com/meeting.mp3");
    String summary = audio.summarize("https://example.com/meeting.mp3");
}

Video Analysis

@RegisterAiService
public interface VideoService {
    @UserMessage("Describe what happens in this video")
    String describeVideo(@VideoUrl String videoUrl);
    
    @UserMessage("Identify the key moments in this video")
    List<String> keyMoments(@VideoUrl String videoUrl);
}

// Usage
@Inject
VideoService video;

public void analyzeVideo() {
    String description = video.describeVideo("https://example.com/tutorial.mp4");
    List<String> moments = video.keyMoments("https://example.com/tutorial.mp4");
}

PDF Document Analysis

@RegisterAiService
public interface DocumentService {
    @UserMessage("Summarize this PDF document")
    String summarize(@PdfUrl String pdfUrl);
    
    @UserMessage("Extract key findings from this research paper")
    List<String> extractFindings(@PdfUrl String pdfUrl);
    
    @UserMessage("What is discussed about {topic} in this document?")
    String searchTopic(@PdfUrl String pdfUrl, @V("topic") String topic);
}

// Usage
@Inject
DocumentService docs;

public void processDocument() {
    String summary = docs.summarize("https://example.com/report.pdf");
    String findings = docs.searchTopic("https://example.com/research.pdf", "climate");
}

Image Comparison

@RegisterAiService
public interface ImageComparison {
    @UserMessage("Compare the image at {url1} with the image at {url2}")
    String compare(@V("url1") @ImageUrl String image1, 
                   @V("url2") String image2Ref);
}

// Note: Only one @ImageUrl annotation allowed per method
// For multiple images, pass URLs as regular parameters in the message template

Complex Vision Analysis

@RegisterAiService
public interface AdvancedVision {
    @UserMessage("""
        Analyze this image and provide:
        1. A detailed description
        2. Identified objects and their locations
        3. Any text visible in the image
        4. The dominant colors
        5. The likely context or setting
        """)
    ImageAnalysis analyzeComprehensive(@ImageUrl String imageUrl);
}

public record ImageAnalysis(
    String description,
    List<DetectedObject> objects,
    String extractedText,
    List<String> dominantColors,
    String context
) {}

public record DetectedObject(
    String name,
    String location
) {}

Medical Image Analysis

@RegisterAiService
public interface MedicalImaging {
    @UserMessage("""
        Analyze this medical image for:
        - Visible structures
        - Any anomalies
        - Image quality assessment
        Note: This is for educational purposes only.
        """)
    String analyzeXRay(@ImageUrl String xrayUrl);
}

Document OCR

@RegisterAiService
public interface OCRService {
    @UserMessage("Extract all text from this image")
    String extractText(@ImageUrl String imageUrl);
    
    @UserMessage("Extract the invoice number and total amount from this receipt")
    InvoiceData extractInvoiceData(@ImageUrl String receiptUrl);
}

public record InvoiceData(
    String invoiceNumber,
    BigDecimal totalAmount
) {}

Audio Analysis with Context

@RegisterAiService
public interface AudioAnalysis {
    @UserMessage("""
        Listen to this audio and provide:
        - Speaker count
        - Main topics discussed
        - Sentiment analysis
        - Key takeaways
        """)
    AudioReport analyze(@AudioUrl String audioUrl);
}

public record AudioReport(
    int speakerCount,
    List<String> topics,
    String sentiment,
    List<String> keyTakeaways
) {}

Video Content Moderation

@RegisterAiService
public interface VideoModeration {
    @UserMessage("Check if this video contains inappropriate content")
    ModerationResult moderate(@VideoUrl String videoUrl);
}

public record ModerationResult(
    boolean isAppropriate,
    List<String> flags,
    String reasoning
) {}

Multi-Page PDF Processing

@RegisterAiService
public interface PDFProcessor {
    @UserMessage("Extract the table of contents from this PDF")
    List<TocEntry> extractTOC(@PdfUrl String pdfUrl);
    
    @UserMessage("Find all references to {term} in this document")
    List<Reference> findReferences(@PdfUrl String pdfUrl, @V("term") String term);
}

public record TocEntry(
    String title,
    int pageNumber
) {}

public record Reference(
    String context,
    int pageNumber
) {}

Image Classification

@RegisterAiService
public interface ImageClassifier {
    @SystemMessage("You are an image classifier. Respond with only the category name.")
    @UserMessage("Classify this image into one of: landscape, portrait, abstract, architecture, nature")
    String classify(@ImageUrl String imageUrl);
}

// Usage
String category = classifier.classify("https://example.com/photo.jpg");

Screenshot Analysis

@RegisterAiService
public interface ScreenshotAnalyzer {
    @UserMessage("This is a screenshot of a UI. Describe what you see and suggest improvements.")
    UIAnalysis analyzeUI(@ImageUrl String screenshotUrl);
}

public record UIAnalysis(
    String description,
    List<String> elements,
    List<String> suggestions
) {}

Chart Data Extraction

@RegisterAiService
public interface ChartReader {
    @UserMessage("Extract the data points from this chart image")
    ChartData extractData(@ImageUrl String chartUrl);
    
    @UserMessage("What trend does this graph show?")
    String analyzeTrend(@ImageUrl String chartUrl);
}

public record ChartData(
    String chartType,
    List<DataPoint> dataPoints
) {}

public record DataPoint(
    String label,
    double value
) {}

Model Requirements

Different AI models support different media types:

  • Images: GPT-4 Vision, Claude 3, Gemini Pro Vision
  • Audio: Whisper, various speech-to-text models
  • Video: Limited support, check model capabilities
  • PDF: Various document-understanding models

Always verify that your chosen model supports the media type before use.

Important Notes

  • One Per Method: Only one media URL annotation per method
  • Model Support: Ensure your model supports the media type
  • URL Accessibility: URLs must be publicly accessible or properly authenticated
  • File Size Limits: Models have file size limits for media processing
  • Format Support: Check which image/audio/video/PDF formats your model supports
  • Timeout Considerations: Media processing can take longer than text-only requests
  • Costs: Media processing often incurs higher costs than text-only requests
  • Security: Be cautious with user-uploaded media URLs

Supported Formats

Typical format support (verify with your specific model):

  • Images: JPEG, PNG, GIF, WebP
  • Audio: MP3, WAV, M4A, FLAC
  • Video: MP4, MOV, AVI
  • PDF: PDF documents (text and images)

Install with Tessl CLI

npx tessl i tessl/maven-io-quarkiverse-langchain4j--quarkus-langchain4j-core@1.7.0

docs

ai-services.md

authentication.md

cost-estimation.md

guardrails.md

index.md

media-content.md

memory.md

observability.md

response-augmentation.md

tools.md

tile.json