diff --git a/app/common/src/main/java/stirling/software/common/model/ApplicationProperties.java b/app/common/src/main/java/stirling/software/common/model/ApplicationProperties.java
index dba7deca2..e8a77bd08 100644
--- a/app/common/src/main/java/stirling/software/common/model/ApplicationProperties.java
+++ b/app/common/src/main/java/stirling/software/common/model/ApplicationProperties.java
@@ -237,6 +237,13 @@ public class ApplicationProperties {
private boolean enabled = false;
private String url = "http://localhost:5001";
private int timeoutSeconds = 120;
+
+ /**
+ * Longer timeout for heavy operations like RAG ingestion, which embeds the whole document
+ * and can take multiple minutes for large books. Applied per-call when the caller
+ * explicitly requests it via {@code AiEngineClient.postWithTimeout}.
+ */
+ private int longRunningTimeoutSeconds = 600;
}
@Data
diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/model/api/ai/AiFile.java b/app/proprietary/src/main/java/stirling/software/proprietary/model/api/ai/AiFile.java
new file mode 100644
index 000000000..5b09fe8d5
--- /dev/null
+++ b/app/proprietary/src/main/java/stirling/software/proprietary/model/api/ai/AiFile.java
@@ -0,0 +1,27 @@
+package stirling.software.proprietary.model.api.ai;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * A file supplied to the AI engine, identified by a stable opaque id plus a display name.
+ *
+ *
Values MUST match {@code AiFile} in {@code engine/src/stirling/contracts/common.py}.
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(description = "File reference sent to the AI engine")
+public class AiFile {
+
+ @Schema(
+ description =
+ "Opaque, stable identifier. Owned by Java; used as the RAG collection key.")
+ private String id;
+
+ @Schema(description = "Original filename, used by agents in user-facing prompts and responses.")
+ private String name;
+}
diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/model/api/ai/AiRagIngestRequest.java b/app/proprietary/src/main/java/stirling/software/proprietary/model/api/ai/AiRagIngestRequest.java
new file mode 100644
index 000000000..ddb9081b6
--- /dev/null
+++ b/app/proprietary/src/main/java/stirling/software/proprietary/model/api/ai/AiRagIngestRequest.java
@@ -0,0 +1,24 @@
+package stirling.software.proprietary.model.api.ai;
+
+import java.util.List;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * Body for {@code POST /api/v1/rag/documents} on the AI engine. Sent by Java when the engine
+ * reports {@code need_ingest} and the requested document's extracted content must be stored before
+ * the workflow can continue.
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class AiRagIngestRequest {
+
+ private String documentId;
+
+ private String source;
+
+ private List pageText;
+}
diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/model/api/ai/AiRagPageText.java b/app/proprietary/src/main/java/stirling/software/proprietary/model/api/ai/AiRagPageText.java
new file mode 100644
index 000000000..417b04a38
--- /dev/null
+++ b/app/proprietary/src/main/java/stirling/software/proprietary/model/api/ai/AiRagPageText.java
@@ -0,0 +1,16 @@
+package stirling.software.proprietary.model.api.ai;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/** A single page of extracted text for RAG ingest requests. */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class AiRagPageText {
+
+ private int pageNumber;
+
+ private String text;
+}
diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/model/api/ai/AiWorkflowEditPlan.java b/app/proprietary/src/main/java/stirling/software/proprietary/model/api/ai/AiWorkflowEditPlan.java
deleted file mode 100644
index c41d6450a..000000000
--- a/app/proprietary/src/main/java/stirling/software/proprietary/model/api/ai/AiWorkflowEditPlan.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package stirling.software.proprietary.model.api.ai;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-
-import lombok.Data;
-
-/**
- * Embedded plan optionally carried inside a question answer response. When present, the consumer
- * (Java) runs the plan steps before delivering the answer; on the resume turn the engine returns
- * the real answer using the captured tool reports.
- *
- * Mirrors the engine's {@code EditPlanResponse} shape but is nested inside an answer rather than
- * acting as the top-level outcome — matches the engine's {@code
- * PdfQuestionAnswerResponse.edit_plan} field.
- */
-@Data
-@Schema(description = "Plan that must run before the answer is final")
-public class AiWorkflowEditPlan {
-
- @Schema(description = "Optional human-readable summary of the plan")
- private String summary;
-
- @Schema(description = "Optional rationale for the plan")
- private String rationale;
-
- @Schema(description = "Tool steps to execute before resuming")
- private List