This is an automated email from the ASF dual-hosted git repository.
jamesnetherton pushed a commit to branch camel-quarkus-main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus-examples.git
The following commit(s) were added to refs/heads/camel-quarkus-main by this
push:
new b571b0b9 data-extract: Upgrade to granite 4
b571b0b9 is described below
commit b571b0b9f2600cac5d1c31c1f6132ae948b4c60d
Author: Alexandre Gallice <[email protected]>
AuthorDate: Fri Jan 16 08:34:56 2026 +0100
data-extract: Upgrade to granite 4
---
data-extract-langchain4j/README.adoc | 8 ++++----
.../extraction/CustomPojoExtractionService.java | 3 ++-
.../src/main/resources/application.properties | 2 +-
.../org/acme/extraction/OllamaTestResource.java | 2 +-
..._chat-3867080e-87d5-40d6-b9a8-b90817d980f9.json | 24 ----------------------
..._chat-3ac79428-f534-4e6a-aa8f-8e401ac22256.json | 24 ----------------------
..._chat-4b63856f-cac5-4bc1-b66a-d01255ac40e0.json | 24 ++++++++++++++++++++++
...chat-be38bae8-7817-4141-8b20-2cff30446e53.json} | 10 ++++-----
..._chat-e8f3defd-bdcb-47f4-8782-687fd3cae6d1.json | 24 ++++++++++++++++++++++
9 files changed, 61 insertions(+), 60 deletions(-)
diff --git a/data-extract-langchain4j/README.adoc
b/data-extract-langchain4j/README.adoc
index 02721a07..0a642898 100644
--- a/data-extract-langchain4j/README.adoc
+++ b/data-extract-langchain4j/README.adoc
@@ -15,7 +15,7 @@ In this example, we'll convert those text conversations into
Java Objects that c
image::schema.png[]
In order to achieve this extraction, we'll need a
https://en.wikipedia.org/wiki/Large_language_model[Large Language Model (LLM)]
and related serving framework that natively supports
https://ollama.com/blog/structured-outputs[JSON structured output].
-Here, we choose https://ollama.com/library/granite3.3:2b[granite3.3:2b] served
through https://ollama.com/[ollama] as it seems compute friendly and under
Apache V2 license.
+Here, we choose https://ollama.com/library/granite4:3b-h[granite4:3b-h] served
through https://ollama.com/[ollama] as it seems compute friendly and under
Apache V2 license.
In order to request inference to the served model, we'll use the high-level
LangChain4j APIs like
https://docs.langchain4j.dev/tutorials/ai-services[AiServices].
=== Start the Large Language Model
@@ -24,21 +24,21 @@ Let's start a container to serve the LLM with Ollama, in a
first shell type:
[source,shell]
----
-docker run --rm -it -v cqex-data-extract-ollama:/root/.ollama -p 11434:11434
--name cqex-data-extract-ollama ollama/ollama:0.9.3
+docker run --rm -it -v cqex-data-extract-ollama:/root/.ollama -p 11434:11434
--name cqex-data-extract-ollama ollama/ollama:0.14.1
----
After a moment, a log like below should be output:
[source,shell]
----
-time=2026-01-06T14:21:55.578Z level=INFO source=types.go:130 msg="inference
compute" id=0 library=cpu variant="" compute="" driver=0.0 name="" total="62.2
GiB" available="49.9 GiB"
+time=2026-01-07T14:28:19.092Z level=INFO source=types.go:60 msg="inference
compute" id=cpu library=cpu compute="" name=cpu description=cpu libdirs=ollama
driver="" pci_id="" type="" total="62.2 GiB" available="62.2 GiB"
----
Then, download the codellama model, in a second shell type:
[source,shell]
----
-docker exec -it cqex-data-extract-ollama ollama pull granite3.3:2b
+docker exec -it cqex-data-extract-ollama ollama pull granite4:3b-h
----
After a moment, log like below should be output:
diff --git
a/data-extract-langchain4j/src/main/java/org/acme/extraction/CustomPojoExtractionService.java
b/data-extract-langchain4j/src/main/java/org/acme/extraction/CustomPojoExtractionService.java
index 82fad99e..5a8a7994 100644
---
a/data-extract-langchain4j/src/main/java/org/acme/extraction/CustomPojoExtractionService.java
+++
b/data-extract-langchain4j/src/main/java/org/acme/extraction/CustomPojoExtractionService.java
@@ -53,7 +53,8 @@ public interface CustomPojoExtractionService {
String CUSTOM_POJO_EXTRACT_PROMPT = "Extract information about a customer
from the transcript delimited by triple backticks: ```{{text}}```."
+ "The customerBirthday field should be formatted as
{{dateFormat}}."
+ "The summary field should concisely relate the customer main
ask."
- + "Source any extracted field values from what is explicitly
mentioned in the transcript.";
+ + "Source any extracted field values from what is explicitly
mentioned in the transcript."
+ + "Extracted field values should be as accurate as possible.";
/**
* The text and dateFormat parameters of this method are automatically
injected as {{text}} & {{dateFormat}} in the
diff --git a/data-extract-langchain4j/src/main/resources/application.properties
b/data-extract-langchain4j/src/main/resources/application.properties
index 29386679..0d258925 100644
--- a/data-extract-langchain4j/src/main/resources/application.properties
+++ b/data-extract-langchain4j/src/main/resources/application.properties
@@ -20,4 +20,4 @@ quarkus.default-locale=en_US
# Adjust as per your where your Ollama instance is running
langchain4j.ollama.base-url=http://localhost:11434
# The chat model to use
-langchain4j.ollama.chat-model.model-id=granite3.3:2b
+langchain4j.ollama.chat-model.model-id=granite4:3b-h
diff --git
a/data-extract-langchain4j/src/test/java/org/acme/extraction/OllamaTestResource.java
b/data-extract-langchain4j/src/test/java/org/acme/extraction/OllamaTestResource.java
index 7a3ad63a..a1b32a0c 100644
---
a/data-extract-langchain4j/src/test/java/org/acme/extraction/OllamaTestResource.java
+++
b/data-extract-langchain4j/src/test/java/org/acme/extraction/OllamaTestResource.java
@@ -36,7 +36,7 @@ public class OllamaTestResource implements
QuarkusTestResourceLifecycleManager {
private static final Logger LOG =
LoggerFactory.getLogger(OllamaTestResource.class);
- private static final String OLLAMA_IMAGE = "ollama/ollama:0.9.3";
+ private static final String OLLAMA_IMAGE = "ollama/ollama:0.14.1";
private static final int OLLAMA_SERVER_PORT = 11434;
private static final String MODE_MOCK = "mock";
diff --git
a/data-extract-langchain4j/src/test/resources/mappings/api_chat-3867080e-87d5-40d6-b9a8-b90817d980f9.json
b/data-extract-langchain4j/src/test/resources/mappings/api_chat-3867080e-87d5-40d6-b9a8-b90817d980f9.json
deleted file mode 100644
index deacf720..00000000
---
a/data-extract-langchain4j/src/test/resources/mappings/api_chat-3867080e-87d5-40d6-b9a8-b90817d980f9.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "id" : "3867080e-87d5-40d6-b9a8-b90817d980f9",
- "name" : "api_chat",
- "request" : {
- "url" : "/api/chat",
- "method" : "POST",
- "bodyPatterns" : [ {
- "equalToJson" : "{\n \"model\" : \"granite3.3:2b\",\n \"messages\" : [
{\n \"role\" : \"user\",\n \"content\" : \"Extract information about a
customer from the transcript delimited by triple backticks: ```Operator: Hello,
how may I help you ?\\nCustomer: Hello, I'm calling because I need to declare
an accident on my main vehicle.\\nOperator: Ok, can you please give me your
name ?\\nCustomer: My name is Sarah London.\\nOperator: Could you please give
me your birth date ?\\nC [...]
- "ignoreArrayOrder" : true,
- "ignoreExtraElements" : true
- } ]
- },
- "response" : {
- "status" : 200,
- "body" :
"{\"model\":\"granite3.3:2b\",\"created_at\":\"2025-12-18T13:25:30.629932212Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\n
\\\"customerSatisfied\\\": true,\\n \\\"customerName\\\": \\\"Sarah
London\\\",\\n \\\"customerBirthday\\\": {\\\"year\\\": 1986, \\\"month\\\":
7, \\\"day\\\": 10},\\n \\\"summary\\\": \\\"The customer, Sarah London, is
calling to declare an accident and seek reimbursement for related
expenses.\\\"\\n}\"},\"done_reason\":\"stop\",\"done\ [...]
- "headers" : {
- "Date" : "Thu, 18 Dec 2025 13:25:30 GMT",
- "Content-Type" : "application/json; charset=utf-8"
- }
- },
- "uuid" : "3867080e-87d5-40d6-b9a8-b90817d980f9",
- "persistent" : true,
- "insertionIndex" : 6
-}
\ No newline at end of file
diff --git
a/data-extract-langchain4j/src/test/resources/mappings/api_chat-3ac79428-f534-4e6a-aa8f-8e401ac22256.json
b/data-extract-langchain4j/src/test/resources/mappings/api_chat-3ac79428-f534-4e6a-aa8f-8e401ac22256.json
deleted file mode 100644
index 8b687b63..00000000
---
a/data-extract-langchain4j/src/test/resources/mappings/api_chat-3ac79428-f534-4e6a-aa8f-8e401ac22256.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "id" : "3ac79428-f534-4e6a-aa8f-8e401ac22256",
- "name" : "api_chat",
- "request" : {
- "url" : "/api/chat",
- "method" : "POST",
- "bodyPatterns" : [ {
- "equalToJson" : "{\n \"model\" : \"granite3.3:2b\",\n \"messages\" : [
{\n \"role\" : \"user\",\n \"content\" : \"Extract information about a
customer from the transcript delimited by triple backticks: ```Operator: Hello,
how may I help you?\\nCustomer: Hello, I am currently at the police station
because I've got an accident. The police would need a proof that I have an
insurance. Could you please help me?\\nOperator: Sure, could you please remind
me your name and birth dat [...]
- "ignoreArrayOrder" : true,
- "ignoreExtraElements" : true
- } ]
- },
- "response" : {
- "status" : 200,
- "body" :
"{\"model\":\"granite3.3:2b\",\"created_at\":\"2025-12-18T13:25:52.676173019Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\n
\\\"customerSatisfied\\\": true,\\n \\\"customerName\\\": \\\"Kate
Boss\\\",\\n \\\"customerBirthday\\\": {\\\"year\\\": 1999, \\\"month\\\": 8,
\\\"day\\\": 13},\\n \\\"summary\\\": \\\"The customer, Kate Boss, needed to
provide proof of insurance at the police station due to an accident. Initially,
there was a misunderstanding regarding [...]
- "headers" : {
- "Date" : "Thu, 18 Dec 2025 13:25:52 GMT",
- "Content-Type" : "application/json; charset=utf-8"
- }
- },
- "uuid" : "3ac79428-f534-4e6a-aa8f-8e401ac22256",
- "persistent" : true,
- "insertionIndex" : 4
-}
\ No newline at end of file
diff --git
a/data-extract-langchain4j/src/test/resources/mappings/api_chat-4b63856f-cac5-4bc1-b66a-d01255ac40e0.json
b/data-extract-langchain4j/src/test/resources/mappings/api_chat-4b63856f-cac5-4bc1-b66a-d01255ac40e0.json
new file mode 100644
index 00000000..12285be4
--- /dev/null
+++
b/data-extract-langchain4j/src/test/resources/mappings/api_chat-4b63856f-cac5-4bc1-b66a-d01255ac40e0.json
@@ -0,0 +1,24 @@
+{
+ "id" : "4b63856f-cac5-4bc1-b66a-d01255ac40e0",
+ "name" : "api_chat",
+ "request" : {
+ "url" : "/api/chat",
+ "method" : "POST",
+ "bodyPatterns" : [ {
+ "equalToJson" : "{\n \"model\" : \"granite4:3b-h\",\n \"messages\" : [
{\n \"role\" : \"user\",\n \"content\" : \"Extract information about a
customer from the transcript delimited by triple backticks: ```Operator: Hello,
how may I help you ?\\nCustomer: Hello, I'm calling because I need to declare
an accident on my main vehicle.\\nOperator: Ok, can you please give me your
name ?\\nCustomer: My name is Sarah London.\\nOperator: Could you please give
me your birth date ?\\nC [...]
+ "ignoreArrayOrder" : true,
+ "ignoreExtraElements" : true
+ } ]
+ },
+ "response" : {
+ "status" : 200,
+ "body" :
"{\"model\":\"granite4:3b-h\",\"created_at\":\"2026-01-15T15:03:26.59496985Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\n
\\\"customerSatisfied\\\": true,\\n \\\"customerName\\\": \\\"Sarah
London\\\",\\n \\\"customerBirthday\\\": {\\\"year\\\": 1986, \\\"month\\\":
7, \\\"day\\\": 10},\\n \\\"summary\\\": \\\"The customer, Sarah London,
called to declare an accident on her main vehicle. The operator confirmed that
all expenses linked to the accident would be [...]
+ "headers" : {
+ "Date" : "Thu, 15 Jan 2026 15:03:26 GMT",
+ "Content-Type" : "application/json; charset=utf-8"
+ }
+ },
+ "uuid" : "4b63856f-cac5-4bc1-b66a-d01255ac40e0",
+ "persistent" : true,
+ "insertionIndex" : 6
+}
\ No newline at end of file
diff --git
a/data-extract-langchain4j/src/test/resources/mappings/api_chat-4a005fe6-e449-482d-8ce6-8c341fa4cb9f.json
b/data-extract-langchain4j/src/test/resources/mappings/api_chat-be38bae8-7817-4141-8b20-2cff30446e53.json
similarity index 52%
rename from
data-extract-langchain4j/src/test/resources/mappings/api_chat-4a005fe6-e449-482d-8ce6-8c341fa4cb9f.json
rename to
data-extract-langchain4j/src/test/resources/mappings/api_chat-be38bae8-7817-4141-8b20-2cff30446e53.json
index 269fdb3b..f72b3e9e 100644
---
a/data-extract-langchain4j/src/test/resources/mappings/api_chat-4a005fe6-e449-482d-8ce6-8c341fa4cb9f.json
+++
b/data-extract-langchain4j/src/test/resources/mappings/api_chat-be38bae8-7817-4141-8b20-2cff30446e53.json
@@ -1,24 +1,24 @@
{
- "id" : "4a005fe6-e449-482d-8ce6-8c341fa4cb9f",
+ "id" : "be38bae8-7817-4141-8b20-2cff30446e53",
"name" : "api_chat",
"request" : {
"url" : "/api/chat",
"method" : "POST",
"bodyPatterns" : [ {
- "equalToJson" : "{\n \"model\" : \"granite3.3:2b\",\n \"messages\" : [
{\n \"role\" : \"user\",\n \"content\" : \"Extract information about a
customer from the transcript delimited by triple backticks: ```Operator: Hello,
how may I help you ?\\nCustomer: Hello, I'm John. I need to share a problem
with you. Actually, the insurance has reimbursed only half the money I have
spent due to the accident.\\nOperator: Hello John, could you please give me
your last name so that I can [...]
+ "equalToJson" : "{\n \"model\" : \"granite4:3b-h\",\n \"messages\" : [
{\n \"role\" : \"user\",\n \"content\" : \"Extract information about a
customer from the transcript delimited by triple backticks: ```Operator: Hello,
how may I help you ?\\nCustomer: Hello, I'm John. I need to share a problem
with you. Actually, the insurance has reimbursed only half the money I have
spent due to the accident.\\nOperator: Hello John, could you please give me
your last name so that I can [...]
"ignoreArrayOrder" : true,
"ignoreExtraElements" : true
} ]
},
"response" : {
"status" : 200,
- "body" :
"{\"model\":\"granite3.3:2b\",\"created_at\":\"2025-12-18T13:25:40.569059754Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\n
\\\"customerSatisfied\\\": false,\\n \\\"customerName\\\": \\\"John
Doe\\\",\\n \\\"customerBirthday\\\": {\\\"year\\\": 2001, \\\"month\\\": 11,
\\\"day\\\": 1},\\n \\\"summary\\\": \\\"Customer, John Doe, is dissatisfied
with being reimbursed only half the amount due to an accident, as the full
reimbursement option was automatically can [...]
+ "body" :
"{\"model\":\"granite4:3b-h\",\"created_at\":\"2026-01-15T15:03:40.273238709Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\n
\\\"customerSatisfied\\\": false,\\n \\\"customerName\\\": \\\"John
Doe\\\",\\n \\\"customerBirthday\\\": {\\n \\\"year\\\": 2001,\\n
\\\"month\\\": 11,\\n \\\"day\\\": 1\\n },\\n \\\"summary\\\":
\\\"Customer John Doe is dissatisfied with the insurance company's decision to
cancel the full reimbursement option automatically. He [...]
"headers" : {
- "Date" : "Thu, 18 Dec 2025 13:25:40 GMT",
+ "Date" : "Thu, 15 Jan 2026 15:03:40 GMT",
"Content-Type" : "application/json; charset=utf-8"
}
},
- "uuid" : "4a005fe6-e449-482d-8ce6-8c341fa4cb9f",
+ "uuid" : "be38bae8-7817-4141-8b20-2cff30446e53",
"persistent" : true,
"insertionIndex" : 5
}
\ No newline at end of file
diff --git
a/data-extract-langchain4j/src/test/resources/mappings/api_chat-e8f3defd-bdcb-47f4-8782-687fd3cae6d1.json
b/data-extract-langchain4j/src/test/resources/mappings/api_chat-e8f3defd-bdcb-47f4-8782-687fd3cae6d1.json
new file mode 100644
index 00000000..3c634a2b
--- /dev/null
+++
b/data-extract-langchain4j/src/test/resources/mappings/api_chat-e8f3defd-bdcb-47f4-8782-687fd3cae6d1.json
@@ -0,0 +1,24 @@
+{
+ "id" : "e8f3defd-bdcb-47f4-8782-687fd3cae6d1",
+ "name" : "api_chat",
+ "request" : {
+ "url" : "/api/chat",
+ "method" : "POST",
+ "bodyPatterns" : [ {
+ "equalToJson" : "{\n \"model\" : \"granite4:3b-h\",\n \"messages\" : [
{\n \"role\" : \"user\",\n \"content\" : \"Extract information about a
customer from the transcript delimited by triple backticks: ```Operator: Hello,
how may I help you?\\nCustomer: Hello, I am currently at the police station
because I've got an accident. The police would need a proof that I have an
insurance. Could you please help me?\\nOperator: Sure, could you please remind
me your name and birth dat [...]
+ "ignoreArrayOrder" : true,
+ "ignoreExtraElements" : true
+ } ]
+ },
+ "response" : {
+ "status" : 200,
+ "body" :
"{\"model\":\"granite4:3b-h\",\"created_at\":\"2026-01-15T15:03:54.19103477Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\n
\\\"customerSatisfied\\\": true,\\n \\\"customerName\\\": \\\"Kate
Boss\\\",\\n \\\"customerBirthday\\\": {\\\"year\\\": 1999, \\\"month\\\": 8,
\\\"day\\\": 13},\\n \\\"summary\\\": \\\"The customer Kate Boss requested
assistance in providing proof of insurance for an accident she was involved in
at a police station. The operator helped v [...]
+ "headers" : {
+ "Date" : "Thu, 15 Jan 2026 15:03:54 GMT",
+ "Content-Type" : "application/json; charset=utf-8"
+ }
+ },
+ "uuid" : "e8f3defd-bdcb-47f4-8782-687fd3cae6d1",
+ "persistent" : true,
+ "insertionIndex" : 4
+}
\ No newline at end of file