Skip to content

Conversation

@lu-yg
Copy link
Collaborator

@lu-yg lu-yg commented Oct 11, 2025

English | 简体中文

PR

PR Checklist

Please check if your PR fulfills the following requirements:

  • The commit message follows our Commit Message Guidelines
  • Tests for the changes have been added (for bug fixes / features)
  • Docs have been added / updated (for bug fixes / features)
  • Built its own designer, fully self-validated

PR Type

What kind of change does this PR introduce?

  • Bugfix
  • Feature
  • Code style update (formatting, local variables)
  • Refactoring (no functional changes, no api changes)
  • Build related changes
  • CI related changes
  • Documentation content changes
  • Other... Please describe:

Background and solution

What is the current behavior?

Issue Number: N/A

What is the new behavior?

Does this PR introduce a breaking change?

  • Yes
  • No

Other information

Summary by CodeRabbit

  • New Features

    • Added document storage and search system with support for multiple organized collections.
    • New REST endpoints for uploading, managing, and searching documents across collections, including batch operations.
  • Infrastructure

    • Integrated persistent storage backend for document management into application stack.
  • Removals

    • Removed search API endpoint.

@coderabbitai
Copy link

coderabbitai bot commented Oct 11, 2025

Walkthrough

This pull request introduces a comprehensive Retrieval-Augmented Generation (RAG) feature using ChromaDB and LangChain4j. It adds vector storage capabilities for document ingestion, embedding, search, and deletion across multiple collections. Infrastructure includes a new VectorStorageController, StorageService, RAG configuration classes, and supporting DTOs. Legacy search code is removed, and dependencies are updated to support vector operations. Minor refactoring and annotation updates are included throughout.

Changes

Cohort / File(s) Summary
Configuration & Infrastructure
Dockerfile, docker-compose.yml, .gitignore, pom.xml
Added ChromaDB service to docker-compose with persistent volume, updated Dockerfile to copy documents and embedding models, replaced environment variables with FOLDER_PATH. Added LangChain4j, ChromaDB, and PDF parsing dependencies to pom.xml; renamed netty-buffer version property; removed Alibaba bailian dependency. Updated .gitignore patterns.
RAG Configuration
base/src/main/java/com/tinyengine/it/rag/config/RAGConfig.java, base/src/main/java/com/tinyengine/it/rag/config/VectorStoreConfig.java
Added RAGConfig component for document chunking, Chroma settings, connection parameters, and embedding configuration with environment variable support. Added VectorStoreConfig to wire EmbeddingModel and EmbeddingStore beans with resilient fallback handling and ChromaDB connectivity testing.
Vector Storage Service
base/src/main/java/com/tinyengine/it/rag/service/StorageService.java
New StorageService implementing document ingestion, splitting, embedding, storage, search, and deletion across multiple collections with batch processing, metadata handling, and error tracking. Supports folder scanning, PDF/text parsing, and comprehensive collection management.
Vector Storage Controller
base/src/main/java/com/tinyengine/it/controller/VectorStorageController.java
New REST controller exposing endpoints for creating vector storage, searching collections, retrieving documents, batch operations, and folder auto-ingestion with OpenAPI annotations and validation.
RAG Data Models
base/src/main/java/com/tinyengine/it/rag/entity/VectorDocument.java, base/src/main/java/com/tinyengine/it/rag/entity/EmbeddingMatchDto.java, base/src/main/java/com/tinyengine/it/rag/entity/SearchRequest.java, base/src/main/java/com/tinyengine/it/rag/entity/DeleteResult.java, base/src/main/java/com/tinyengine/it/rag/entity/BatchDeleteResult.java, base/src/main/java/com/tinyengine/it/rag/entity/BatchResult.java
Added DTOs and entities for vector operations: VectorDocument for ingestion results, EmbeddingMatchDto for search results with factory conversion, SearchRequest for query parameters, DeleteResult/BatchDeleteResult for deletion tracking, and BatchResult for batch operation outcomes.
Exception Handling
base/src/main/java/com/tinyengine/it/common/exception/ExceptionEnum.java
Added seven new exception constants (CM327–CM333) for RAG operations: ChromaDB initialization, connection, document loading, processing, retrieval, deletion failures, and folder scanning errors.
Chat & AI Services
base/src/main/java/com/tinyengine/it/service/app/v1/AiChatV1Service.java, base/src/main/java/com/tinyengine/it/service/app/impl/v1/AiChatV1ServiceImpl.java, base/src/main/java/com/tinyengine/it/controller/AiChatController.java
Removed legacy search API (chatSearch method) and Alibaba integration code. Expanded ChatRequest DTO with additional fields (maxTokens, streamOptions, presencePenalty, responseFormat, enableThinking, enableSearch, etc.). Maintained core chat completion flow.
Chat Request DTO
base/src/main/java/com/tinyengine/it/model/dto/ChatRequest.java
Expanded ChatRequest with 15+ new fields and JsonProperty mappings for advanced API features (streaming, thinking, search, tool calling, formatting). Changed temperature from Double to Float.
Log Annotations
base/src/main/java/com/tinyengine/it/common/log/SystemControllerLog.java, base/src/main/java/com/tinyengine/it/common/log/SystemServiceLog.java, base/src/main/java/com/tinyengine/it/common/log/SystemLogAspect.java
Added description() attribute to SystemControllerLog and SystemServiceLog annotations for metadata capture. Minor formatting in SystemLogAspect.
Controllers – Documentation
base/src/main/java/com/tinyengine/it/controller/AppController.java, base/src/main/java/com/tinyengine/it/controller/AppExtensionController.java
Consolidated and reformatted OpenAPI annotations (@operation, @parameter, @apiresponse). Updated AppExtensionController tag from "应用" to "AppExtension".
Controllers – Cleanup
base/src/main/java/com/tinyengine/it/controller/ResourceController.java, base/src/main/java/com/tinyengine/it/controller/ResourceGroupController.java
Minor formatting: added blank lines between methods/fields; no functional changes.
Utility & Helper Updates
base/src/main/java/com/tinyengine/it/common/utils/ImageThumbnailGenerator.java, base/src/main/java/com/tinyengine/it/common/utils/Utils.java
Replaced RuntimeException with ServiceException (CM309) for thumbnail failures; added UTF-8 decoding for SVG detection; improved null-safety. Minor formatting adjustments.
Database & Task Services
app/src/main/java/com/tinyengine/it/task/DatabaseCleanupService.java, app/src/main/java/com/tinyengine/it/task/CleanupProperties.java
Renamed formatter constant to FORMATTER; normalized log messages from Chinese to English; added explicit type suffixes (0L). Reformatted method bodies in CleanupProperties without behavioral changes.
Mapper
base/src/main/java/com/tinyengine/it/mapper/ResourceGroupResourceMapper.java
Removed @delete annotation from deleteResourceGroupResourceByGroupId method; mapping now relies on external SQL configuration.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant VectorStorageController
    participant StorageService
    participant EmbeddingModel
    participant EmbeddingStore
    participant FileSystem

    Client->>VectorStorageController: POST /create (filePaths)
    VectorStorageController->>StorageService: initializeKnowledgeBase(filePaths)
    
    rect rgb(200, 220, 240)
    Note over StorageService,FileSystem: Document Loading & Splitting
    StorageService->>FileSystem: Load documents from paths
    StorageService->>StorageService: splitDocuments (chunking)
    end
    
    rect rgb(220, 240, 200)
    Note over StorageService,EmbeddingStore: Embedding & Storage
    StorageService->>EmbeddingModel: embedBatch(textSegments)
    EmbeddingModel-->>StorageService: embeddings[]
    StorageService->>EmbeddingStore: add(segments with embeddings)
    EmbeddingStore-->>StorageService: stored
    end
    
    StorageService-->>VectorStorageController: VectorDocument (counts, status)
    VectorStorageController-->>Client: Result<VectorDocument>
Loading
sequenceDiagram
    participant Client
    participant VectorStorageController
    participant StorageService
    participant EmbeddingModel
    participant EmbeddingStore

    Client->>VectorStorageController: POST /search (SearchRequest)
    VectorStorageController->>StorageService: search(searchRequest)
    
    rect rgb(220, 240, 200)
    Note over StorageService,EmbeddingModel: Query Embedding
    StorageService->>EmbeddingModel: embed(content)
    EmbeddingModel-->>StorageService: queryEmbedding
    end
    
    rect rgb(240, 220, 200)
    Note over StorageService,EmbeddingStore: Vector Search
    StorageService->>EmbeddingStore: search(queryEmbedding, maxResults, minScore)
    EmbeddingStore-->>StorageService: EmbeddingMatch[] (scored results)
    end
    
    StorageService->>StorageService: mapToEmbeddingMatchDto[]
    StorageService-->>VectorStorageController: List<EmbeddingMatchDto>
    VectorStorageController-->>Client: Result<List<EmbeddingMatchDto>>
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Areas requiring extra attention:

  • VectorStoreConfig.java: Fallback handling, bean initialization with try-catch, ChromaDB connectivity testing logic—verify resilience patterns and edge cases.
  • StorageService.java: Largest new class with complex document loading, batch embedding, metadata handling, multiple collection support, and error tracking—review batch processing logic, null-safety, and error code mapping (CM327–CM333).
  • RAGConfig.java: Environment variable loading and default values—verify all properties align with deployment expectations.
  • VectorStorageController.java: Public API surface with 9 endpoints—verify request validation, error handling, and OpenAPI annotations.
  • ChatRequest.java & AiChatV1ServiceImpl.java: Expanded fields and request body construction—ensure all new fields are correctly serialized and none conflict with existing API contracts.
  • pom.xml: New transitive dependencies from LangChain4j—check for version conflicts or compatibility issues with existing Spring Boot and JVM versions.

Poem

🐰 Hops through vectors and embeddings bright,
ChromaDB glows in the autumn light,
Documents split, chunks take their flight,
Searching embeddings left and right—
RAG's here to make knowledge tight! 🌟

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed The pull request title "feat: add rag API" clearly describes the primary objective of the changeset. The PR introduces comprehensive RAG (Retrieval Augmented Generation) functionality including a new VectorStorageController with nine public endpoints, supporting configuration classes (RAGConfig and VectorStoreConfig), a StorageService with document management capabilities, multiple new entity and DTO classes, infrastructure updates (docker-compose, Dockerfile, pom.xml), and Docker integration with ChromaDB. While the PR includes secondary changes such as removing the search endpoint from AiChatController and minor refactoring, the title accurately reflects the main purpose from the developer's perspective. The title is specific, concise, and avoids generic language.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between bdaf93f and f0cb1e2.

📒 Files selected for processing (5)
  • Dockerfile (1 hunks)
  • base/src/main/java/com/tinyengine/it/controller/AiChatController.java (0 hunks)
  • base/src/main/java/com/tinyengine/it/service/app/impl/v1/AiChatV1ServiceImpl.java (5 hunks)
  • base/src/main/java/com/tinyengine/it/service/app/v1/AiChatV1Service.java (0 hunks)
  • pom.xml (5 hunks)
💤 Files with no reviewable changes (2)
  • base/src/main/java/com/tinyengine/it/service/app/v1/AiChatV1Service.java
  • base/src/main/java/com/tinyengine/it/controller/AiChatController.java
🚧 Files skipped from review as they are similar to previous changes (1)
  • pom.xml
🧰 Additional context used
🧬 Code graph analysis (1)
base/src/main/java/com/tinyengine/it/service/app/impl/v1/AiChatV1ServiceImpl.java (1)
base/src/main/java/com/tinyengine/it/common/utils/JsonUtils.java (1)
  • JsonUtils (45-349)
🔇 Additional comments (2)
Dockerfile (2)

17-18: Verify source directories exist in the build stage.

The COPY commands will fail during image build if /app/documents or /app/all-MiniLM-L6-v2 don't exist in the build stage. The Dockerfile doesn't show these being created or downloaded during the build (lines 1–12).

Clarify:

  • Are these directories committed to the repository and included by ADD . . (line 3)?
  • Are they created/downloaded by the Maven build process?
  • If not, the build will fail with "COPY failed: stat /app/documents: no such file or directory".

Consider adding a fallback to ensure reliability:

+RUN mkdir -p /app/documents /app/all-MiniLM-L6-v2
 COPY --from=build /app/documents /app/documents
 COPY --from=build /app/all-MiniLM-L6-v2 /app/all-MiniLM-L6-v2

This addresses the previous reviewer's concern about ensuring the directory exists before runtime.


20-20: ENV syntax is now correct.

The ENV statement syntax is fixed (no spaces around the =). ✓


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (6)
base/src/main/java/com/tinyengine/it/controller/AppExtensionController.java (2)

116-129: Use @RequestBody annotation instead of @Parameter for request bodies.

The @Parameter annotation at Line 118 is used to document a request body, which is incorrect. OpenAPI 3.0 distinguishes between parameters (query, path, header, cookie) and request bodies. Use @io.swagger.v3.oas.annotations.parameters.RequestBody for documenting request body payloads.

Apply this diff:

     @Operation(summary = "新建桥接或工具", description = "新建桥接或工具",
-        parameters = {
-            @Parameter(name = "AppExtension", description = "入参对象")
-        }, responses = {
+        requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
+            description = "AppExtension object to create",
+            required = true,
+            content = @Content(schema = @Schema(implementation = AppExtension.class))
+        ),
+        responses = {

137-150: Use @RequestBody annotation instead of @Parameter for request bodies.

Same issue as in createAppExtension: the @Parameter annotation at Line 139 incorrectly documents a request body. Use @io.swagger.v3.oas.annotations.parameters.RequestBody instead.

Apply this diff:

     @Operation(summary = "修改桥接或工具", description = "修改桥接或工具",
-        parameters = {
-            @Parameter(name = "AppExtension", description = "入参对象")
-        }, responses = {
+        requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
+            description = "AppExtension object to update",
+            required = true,
+            content = @Content(schema = @Schema(implementation = AppExtension.class))
+        ),
+        responses = {
base/src/main/java/com/tinyengine/it/controller/AiChatController.java (3)

88-91: Sanitize error messages to avoid information leakage.

Returning e.getMessage() directly may expose sensitive internal details (stack traces, paths, configuration). Log the full exception and return a generic error message to the client.

Apply this diff:

         } catch (Exception e) {
+            // Log the full exception for debugging
+            log.error("Error processing AI chat request", e);
             return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
-                .body(e.getMessage());
+                .body("An error occurred processing your request");
         }

Note: Add private static final Logger log = LoggerFactory.getLogger(AiChatController.class); at the class level if not already present.


126-129: Sanitize error messages to avoid information leakage.

Returning e.getMessage() directly may expose sensitive internal details. Log the full exception and return a generic error message to the client.

Apply this diff:

         } catch (Exception e) {
+            // Log the full exception for debugging
+            log.error("Error processing chat completions request", e);
             return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
-                .body(e.getMessage());
+                .body("An error occurred processing your request");
         }

Note: Add private static final Logger log = LoggerFactory.getLogger(AiChatController.class); at the class level if not already present.


112-115: Enforce API key validation before execution
chatCompletion currently trusts request.getApiKey() without verifying authenticity or authorization. Add checks (e.g. validate JWT signature or user-registered key) in the controller or AiChatV1ServiceImpl to prevent unauthorized API-key usage.

app/src/main/java/com/tinyengine/it/task/DatabaseCleanupService.java (1)

206-206: Complete the internationalization.

Line 206 contains a Chinese error message "获取表记录数失败" that was missed during the English translation effort. All other messages in the file have been translated to English.

Apply this diff to complete the translation:

-            logger.error("获取表记录数失败: {}", e.getMessage());
+            logger.error("Failed to get table record count: {}", e.getMessage());
🧹 Nitpick comments (10)
base/src/main/java/com/tinyengine/it/rag/entity/BatchResult.java (2)

18-18: Consider enhancing the Javadoc.

The current documentation is minimal. Consider adding details about what batch operation this result represents and the meaning of the counts.

For example:

 /**
- * Batch result
+ * Result of a batch document processing operation.
+ * Tracks the number of successfully processed items and errors encountered.
  */

13-13: Approve BatchResult implementation – no lingering NodeDto references found. Optionally, enrich the class Javadoc to describe successCount and errorCount.

base/src/main/java/com/tinyengine/it/controller/AppExtensionController.java (1)

90-108: Improve parameter documentation for clarity.

The @Parameter annotation documents a generic map parameter, which doesn't help API consumers understand what query parameters to provide. Based on the implementation (Lines 103-105), the endpoint expects app, name, and category query parameters.

Apply this diff to document the actual query parameters:

     @Operation(summary = "获取单个应用的桥接源或工具类列表", description = "获取单个应用的桥接源或工具类列表",
         parameters = {
-            @Parameter(name = "map", description = "入参对象")
+            @Parameter(name = "app", description = "Application ID"),
+            @Parameter(name = "name", description = "Extension name"),
+            @Parameter(name = "category", description = "Extension category")
         }, responses = {
base/src/main/java/com/tinyengine/it/rag/entity/SearchRequest.java (1)

17-27: Consider adding validation and documentation.

The SearchRequest DTO lacks input validation and field documentation, which could lead to unclear API contracts and invalid data reaching the service layer.

Consider these improvements:

  1. Add validation annotations:
import jakarta.validation.constraints.*;

@Data
public class SearchRequest {
    @NotBlank(message = "Collection name is required")
    private String collection;
    
    @NotBlank(message = "Search content is required")
    private String content;
    
    private String documentSetId; // Optional filter
    
    @Min(value = 1, message = "maxResults must be at least 1")
    @Max(value = 100, message = "maxResults cannot exceed 100")
    private int maxResults = 10;
    
    @DecimalMin(value = "0.0", inclusive = true)
    @DecimalMax(value = "1.0", inclusive = true)
    private double minScore = 0.7;
}
  1. Add field-level JavaDoc to clarify the purpose and constraints of each field, especially whether documentSetId is optional and what it filters.
docker-compose.yml (1)

17-26: Consider adding operational safeguards.

The RAG service configuration is functional, but consider these operational improvements for production readiness:

  tiny-engine-rag:
    image: chromadb/chroma:5.0.4
    ports:
      - "8000:8000"
    environment:
      - IS_PERSISTENT=TRUE
      - PERSIST_DIRECTORY=/chroma/chroma
    volumes:
      - ./docker-deploy-data/chroma/data:/chroma/chroma
    command: "--workers 1 --host 0.0.0.0 --port 8000"
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/api/v1/heartbeat"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
    deploy:
      resources:
        limits:
          memory: 2G
          cpus: '1.0'

Considerations:

  • restart: unless-stopped ensures service availability after failures
  • Health checks enable container orchestration to detect and restart unhealthy instances
  • Resource limits prevent runaway resource consumption
  • Single worker might become a bottleneck under load; consider increasing --workers based on expected traffic
base/src/main/java/com/tinyengine/it/rag/entity/VectorDocument.java (3)

22-24: Consider removing @AllArgsConstructor to avoid confusion.

The class declares @AllArgsConstructor but also defines multiple custom constructors (lines 57-77). This can confuse callers about which constructor to use and may lead to inconsistent initialization. Consider removing @AllArgsConstructor and keeping only the custom constructors that enforce proper status initialization.


57-77: Extract duplicated status initialization logic.

The status initialization logic errorCount == 0 ? "SUCCESS" : "PARTIAL_SUCCESS" is duplicated across three constructors (lines 61, 68, 76). Consider extracting this into a private helper method or a post-construct method to reduce duplication.

Example refactor:

+    private String determineStatus() {
+        return errorCount == 0 ? "SUCCESS" : "PARTIAL_SUCCESS";
+    }
+
     public VectorDocument(int successCount, int errorCount) {
         this.successCount = successCount;
         this.errorCount = errorCount;
         this.processingTime = 0L;
-        this.status = errorCount == 0 ? "SUCCESS" : "PARTIAL_SUCCESS";
+        this.status = determineStatus();
     }

55-55: Consider using an enum for status values.

The status field uses string literals ("SUCCESS", "PARTIAL_SUCCESS"). Using an enum would provide type safety, prevent typos, and make valid states explicit.

Example:

public enum ProcessingStatus {
    SUCCESS, PARTIAL_SUCCESS, FAILED
}

private ProcessingStatus status;
base/src/main/java/com/tinyengine/it/rag/entity/EmbeddingMatchDto.java (1)

79-79: documentSetId extracted but not exposed as a field.

Line 79 extracts documentSetId from metadata, but unlike collection and source, it's not set as a top-level field in the DTO—only added to the metadata map on line 87. If documentSetId is frequently accessed, consider adding it as a field similar to collection and source.

Also applies to: 87-87

base/src/main/java/com/tinyengine/it/rag/config/VectorStoreConfig.java (1)

141-166: Avoid creating a brand-new OkHttp client per heartbeat call

testChromaConnection instantiates a fresh OkHttpClient on every invocation. That allocates connection pools that never get reused, creating avoidable GC pressure and leaking sockets under load. Move the client into a singleton (field-level) and reuse it for all heartbeat probes instead of rebuilding each time.

-        OkHttpClient client = new OkHttpClient.Builder()
-            .connectTimeout(Duration.ofSeconds(5))
-            .readTimeout(Duration.ofSeconds(5))
-            .build();
+        okhttp3.Response response = httpClient.newCall(request).execute();
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 91aab3e and 3f442ea.

⛔ Files ignored due to path filters (1)
  • __pycache__/chromadb.cpython-313.pyc is excluded by !**/*.pyc
📒 Files selected for processing (30)
  • .gitignore (2 hunks)
  • Dockerfile (1 hunks)
  • app/src/main/java/com/tinyengine/it/task/CleanupProperties.java (2 hunks)
  • app/src/main/java/com/tinyengine/it/task/DatabaseCleanupService.java (9 hunks)
  • base/src/main/java/com/tinyengine/it/common/exception/ExceptionEnum.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/common/log/SystemControllerLog.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/common/log/SystemLogAspect.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/common/log/SystemServiceLog.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/common/utils/ImageThumbnailGenerator.java (15 hunks)
  • base/src/main/java/com/tinyengine/it/common/utils/Utils.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/controller/AiChatController.java (2 hunks)
  • base/src/main/java/com/tinyengine/it/controller/AppController.java (7 hunks)
  • base/src/main/java/com/tinyengine/it/controller/AppExtensionController.java (6 hunks)
  • base/src/main/java/com/tinyengine/it/controller/ResourceController.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/controller/ResourceGroupController.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/controller/VectorStorageController.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/mapper/ResourceGroupResourceMapper.java (0 hunks)
  • base/src/main/java/com/tinyengine/it/rag/config/RAGConfig.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/rag/config/VectorStoreConfig.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/rag/entity/BatchDeleteResult.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/rag/entity/BatchResult.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/rag/entity/DeleteResult.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/rag/entity/EmbeddingMatchDto.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/rag/entity/SearchRequest.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/rag/entity/VectorDocument.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/rag/service/StorageService.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/service/app/impl/v1/AiChatV1ServiceImpl.java (0 hunks)
  • base/src/main/java/com/tinyengine/it/service/app/v1/AiChatV1Service.java (0 hunks)
  • docker-compose.yml (2 hunks)
  • pom.xml (5 hunks)
💤 Files with no reviewable changes (3)
  • base/src/main/java/com/tinyengine/it/service/app/v1/AiChatV1Service.java
  • base/src/main/java/com/tinyengine/it/service/app/impl/v1/AiChatV1ServiceImpl.java
  • base/src/main/java/com/tinyengine/it/mapper/ResourceGroupResourceMapper.java
🧰 Additional context used
🧬 Code graph analysis (1)
base/src/main/java/com/tinyengine/it/controller/VectorStorageController.java (1)
base/src/main/java/com/tinyengine/it/controller/HomeController.java (1)
  • RestController (28-41)
🔇 Additional comments (21)
base/src/main/java/com/tinyengine/it/controller/AppController.java (1)

63-193: LGTM! Documentation formatting improvements.

The Swagger/OpenAPI annotations have been consistently reformatted across all endpoints for better readability. No functional changes to the API surface.

base/src/main/java/com/tinyengine/it/controller/AppExtensionController.java (1)

158-171: LGTM!

The parameter documentation correctly matches the actual query parameter name.

base/src/main/java/com/tinyengine/it/common/log/SystemControllerLog.java (1)

31-37: LGTM! Clean annotation API extension.

The addition of the description() attribute with a default empty string is backward-compatible and aligns with the corresponding change in SystemServiceLog.java. This enhances logging capabilities without breaking existing code.

base/src/main/java/com/tinyengine/it/common/log/SystemServiceLog.java (1)

31-37: LGTM! Consistent annotation API extension.

The addition of the description() attribute mirrors the change in SystemControllerLog.java and maintains consistency across logging annotations.

app/src/main/java/com/tinyengine/it/task/DatabaseCleanupService.java (2)

33-33: LGTM! Proper constant naming convention.

Renaming formatter to FORMATTER follows Java naming conventions for static final constants.


76-76: LGTM! Correct literal type for long variable.

Using 0L instead of 0 is the correct literal type for the long variable totalRowsCleaned.

base/src/main/java/com/tinyengine/it/common/exception/ExceptionEnum.java (1)

258-293: LGTM! New error constants align with RAG feature.

The seven new exception enum constants (CM327–CM333) provide clear error codes for ChromaDB initialization, connection, document processing, retrieval, and deletion failures. The naming is consistent with the existing convention, and the messages are appropriately descriptive.

base/src/main/java/com/tinyengine/it/common/utils/ImageThumbnailGenerator.java (4)

15-16: LGTM! Imports support improved exception handling.

The new imports enable consistent use of ServiceException with standardized error codes (CM309) across thumbnail generation failures.


102-102: LGTM! Consistent exception handling upgrade.

Replacing RuntimeException with ServiceException(CM309) provides standardized error codes for thumbnail generation failures, improving error tracking and diagnostics.

Also applies to: 135-135, 384-384, 423-423, 491-491


175-176: LGTM! Explicit UTF-8 decoding for SVG.

Using StandardCharsets.UTF_8 explicitly for decoding SVG content is correct and clearer than relying on platform defaults.


205-207: LGTM! Null safety improvement.

Adding a null check for input prevents NullPointerException and returns a safe default empty string.

pom.xml (3)

36-36: LGTM! Property naming convention improved.

Renaming netty-buffer-version to netty-buffer.version follows the consistent dot-separated naming convention used elsewhere in the POM.


127-132: LGTM! Lombok and MapStruct processor additions.

Adding Lombok and MapStruct processor dependencies supports the new DTO classes and code generation introduced in the RAG feature. The optional=true flag on Lombok is appropriate.

Also applies to: 139-144


38-39: Confirm beta dependencies for production readiness
As of Oct 11, 2025, both langchain4j-chroma (1.1.0-beta7) and langchain4j-rag (1.5.0-beta11) are only available as beta releases; no GA versions exist. Ensure you’re comfortable deploying these betas or plan to upgrade when stable versions are released.

base/src/main/java/com/tinyengine/it/rag/entity/DeleteResult.java (1)

1-33: LGTM! Clean DTO design.

The DeleteResult class provides a clear data structure for tracking deletion operations with success/failure counts and target identification. The Lombok @Data annotation generates all necessary boilerplate.

base/src/main/java/com/tinyengine/it/rag/entity/BatchDeleteResult.java (1)

1-35: LGTM! Batch result aggregation.

The BatchDeleteResult class appropriately aggregates multiple DeleteResult instances with totals, providing a clear summary of batch deletion operations.

base/src/main/java/com/tinyengine/it/rag/entity/EmbeddingMatchDto.java (2)

63-100: LGTM! Defensive null handling in factory method.

The from() method safely handles null values for match.embedded() and metadata, preventing NullPointerException and providing sensible defaults.


67-67: Verify createTime timestamp source. EmbeddingMatchDto#setCreateTime uses LocalDateTime.now(), capturing conversion time rather than the original match creation. I couldn’t locate a timestamp on either EmbeddingMatch or TextSegment—please confirm if an original creation timestamp exists and use that if available.

base/src/main/java/com/tinyengine/it/rag/service/StorageService.java (2)

343-350: Add resource cleanup for PDF parser

ApachePdfBoxDocumentParser wraps PDFBox resources; leaving it unclosed risks file descriptor leaks. Use try-with-resources around the parser (e.g., via FileSystemDocumentLoader.loadDocument(filePath, new ApachePdfBoxDocumentParser())) or ensure document.close() is called after usage.

-                    ApachePdfBoxDocumentParser pdfParser = new ApachePdfBoxDocumentParser();
-                    document = FileSystemDocumentLoader.loadDocument(filePath, pdfParser);
+                    try (ApachePdfBoxDocumentParser pdfParser = new ApachePdfBoxDocumentParser()) {
+                        document = FileSystemDocumentLoader.loadDocument(filePath, pdfParser);
+                    }

Likely an incorrect or invalid review comment.


303-308: Preserve service exception messaging

initializeKnowledgeBase wraps any exception in CM330, which masks specific ServiceException codes/messages set deeper in the stack (e.g., loadDocuments’ CM329). Only wrap unexpected exceptions; rethrow ServiceException as-is to keep precise error codes at the API boundary.

-        } catch (ServiceException e) {
-            throw e;
-        } catch (Exception e) {
+        } catch (ServiceException e) {
+            throw e;
+        } catch (Exception e) {

Likely an incorrect or invalid review comment.

base/src/main/java/com/tinyengine/it/controller/VectorStorageController.java (1)

199-202: Return 400 when required request params are missing

deleteByFilePath takes filePath and collection as plain @RequestParam strings without required = true or validation. If the client omits them, Spring will pass null, the service throws, and the user gets a 500 instead of a clear 400. Mark both params as required (the default) and add @NotBlank or explicit validation to give early, descriptive feedback.

-    public Result<DeleteResult> deleteByFilePath(@RequestParam String filePath, @RequestParam String collection) {
+    public Result<DeleteResult> deleteByFilePath(
+            @RequestParam(name = "filePath") @NotBlank String filePath,
+            @RequestParam(name = "collection") @NotBlank String collection) {

Likely an incorrect or invalid review comment.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
base/src/main/java/com/tinyengine/it/rag/config/RAGConfig.java (1)

37-37: Past issue still present: double slash in tokenizerPath.

The double slash in the default path remains: ".//all-MiniLM-L6-v2/tokenizer.json". This could cause file resolution issues depending on how the path is processed.

🧹 Nitpick comments (2)
base/src/main/java/com/tinyengine/it/controller/VectorStorageController.java (2)

74-76: Consider adding request body validation.

Endpoints accepting @RequestBody lack @Valid annotations. While deleteMultipleFiles validates its list, the other endpoints (create, createInCollection, searchInCollection, searchAllCollections) don't enforce constraints on their payloads. Adding @Valid and field-level validations (e.g., @NotEmpty for lists, @NotBlank for strings in SearchRequest) would provide consistent error handling and improve API robustness.

Example for create:

-    public Result<VectorDocument> create(@RequestBody List<String> filePath) {
+    public Result<VectorDocument> create(@RequestBody @NotEmpty List<@NotBlank String> filePath) {

Example for searchInCollection:

-    public Result<List<EmbeddingMatchDto>> searchInCollection(@RequestBody SearchRequest searchDto) {
+    public Result<List<EmbeddingMatchDto>> searchInCollection(@Valid @RequestBody SearchRequest searchDto) {

Also applies to: 99-101, 120-122, 142-145


98-98: Validate path variables and request parameters.

@PathVariable String collection (line 98) and @RequestParam fields (line 200) lack validation. Empty or whitespace-only values could reach the service layer and cause confusing errors.

Add @NotBlank:

-    public Result<VectorDocument> createInCollection(
-            @PathVariable String collection,
+    public Result<VectorDocument> createInCollection(
+            @PathVariable @NotBlank String collection,
-    public Result<DeleteResult> deleteByFilePath(@RequestParam String filePath, @RequestParam String collection) {
+    public Result<DeleteResult> deleteByFilePath(
+            @RequestParam @NotBlank String filePath, 
+            @RequestParam @NotBlank String collection) {

Also applies to: 200-200

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3f442ea and 0d8fc8d.

📒 Files selected for processing (5)
  • Dockerfile (1 hunks)
  • base/src/main/java/com/tinyengine/it/controller/AiChatController.java (0 hunks)
  • base/src/main/java/com/tinyengine/it/controller/VectorStorageController.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/rag/config/RAGConfig.java (1 hunks)
  • base/src/main/java/com/tinyengine/it/rag/service/StorageService.java (1 hunks)
💤 Files with no reviewable changes (1)
  • base/src/main/java/com/tinyengine/it/controller/AiChatController.java
🚧 Files skipped from review as they are similar to previous changes (2)
  • Dockerfile
  • base/src/main/java/com/tinyengine/it/rag/service/StorageService.java
🧰 Additional context used
🧬 Code graph analysis (1)
base/src/main/java/com/tinyengine/it/controller/VectorStorageController.java (1)
base/src/main/java/com/tinyengine/it/controller/AiChatController.java (1)
  • Validated (43-123)
🔇 Additional comments (2)
base/src/main/java/com/tinyengine/it/controller/VectorStorageController.java (2)

140-146: Past issue resolved: HTTP verb now correct.

The endpoint now correctly uses @PostMapping instead of @GetMapping, allowing the @RequestBody to be properly handled.


222-226: Past issue resolved: input validation added.

The @NotEmpty annotations on both the list and its elements now guard against invalid input.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 369a4f5 and 864256f.

📒 Files selected for processing (4)
  • Dockerfile (1 hunks)
  • base/src/main/java/com/tinyengine/it/controller/AiChatController.java (2 hunks)
  • base/src/main/java/com/tinyengine/it/service/app/impl/v1/AiChatV1ServiceImpl.java (6 hunks)
  • pom.xml (6 hunks)
✅ Files skipped from review due to trivial changes (1)
  • base/src/main/java/com/tinyengine/it/service/app/impl/v1/AiChatV1ServiceImpl.java
🚧 Files skipped from review as they are similar to previous changes (1)
  • pom.xml
🔇 Additional comments (1)
base/src/main/java/com/tinyengine/it/controller/AiChatController.java (1)

19-19: LGTM! Formatting changes look good.

The changes are formatting-only with no functional modifications. The NodeDto import and return statement are correct and properly used.

Also applies to: 145-145

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 130

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review continued from previous batch...

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 28

♻️ Duplicate comments (55)
documents/tinyengine/api/backend-api/dsl-code-generation.md (1)

22-24: Add an explicit separator between the two statements.

The sample relies on automatic semicolon insertion; please terminate the generateCode call to avoid ASI surprises when copied verbatim.

-const result = generateCode({ pageInfo, blocksData })
+const result = generateCode({ pageInfo, blocksData });
documents/tinyengine/api/backend-api/app-utility-management.md (1)

99-116: Switch delete endpoint to HTTP DELETE

Documenting a destructive operation as GET /app-center/api/apps/extension/delete violates HTTP safety/idempotency expectations and exposes the API to browser prefetching and CSRF risks. Please align the doc (and endpoint) with a DELETE verb and resource-style URI (e.g. /app-center/api/apps/{appId}/extensions/{extensionId}) plus appropriate responses (204/404/403).

Apply this diff to update the documentation:

-**Path:** /app-center/api/apps/extension/delete
-
-**Method:** GET
+**Path:** /app-center/api/apps/{appId}/extensions/{extensionId}
+
+**Method:** DELETE
documents/tinyengine/extension-capabilities-tutorial/mcpService.md (1)

693-694: 完善综合示例,替换 TODO。

“综合示例”部分仍是空的 TODO,占位内容无法指导读者完成端到端流程(注册工具→连接管理→调用→清理)。请补充可运行的完整示例。

documents/tinyengine/practical-cases/pdm-metadata-approval-workflow.md (1)

11-20: Descriptive alt text still missing; confirm image assets exist

Both images still use generic alt text and reference ./imgs/process.png / ./imgs/pdm.png, which were previously reported missing. Please add meaningful alt text (e.g., “PDM 审批流程示意图”, “PDM 与低代码平台集成示意图”) and ensure the PNG files exist at those paths before merging.

If the assets should already be present, run:

#!/bin/bash
set -euo pipefail
echo "Listing referenced images..."
for img in process.png pdm.png; do
  echo "--- searching for $img ---"
  fd -t f -i "$img" documents/
done
documents/tinyengine/basic-features/using-components.md (3)

11-71: Restore the referenced images or fix the paths.

This doc references 13 assets under ./imgs/, but the PR doesn’t add that directory or the files, so the images will render broken. Either commit the actual assets at documents/tinyengine/basic-features/imgs/ with the exact filenames used here, or update the links to point at existing resources.


20-20: Correct the adverb form (“很好的” → “很好地”).

应写作“不能很好地拖入”,请改为副词形式。


23-23: Fix the mismatched Chinese quote.

“插入“ → “插入”,请使用成对的全角引号。

documents/tinyengine/advanced-features/canvas-shortcuts.md (2)

5-13: Normalize list formatting and copy for readability.

These list items still use the literal “•” symbol plus inconsistent spacing, so they don’t render as proper Markdown lists and the Chinese copy reads awkwardly. Please switch to standard list markers and tidy the wording/spacing.

-• 在画布中右键页面元素 -> 添加父级 -> 容器:
+- 在画布中右键页面元素 → 添加父级 → 容器:
@@
-• 选中指定 容器 点击 鼠标左键:
+- 左键单击以选中目标容器:
@@
-• 点击 画布元素 或 点击 大纲树 , 即可查看新增的父容器
+- 点击画布元素或大纲树即可查看新增的父容器

7-25: Add the referenced images (and descriptive alt text) or fix the links.

The Markdown still points to ./imgs/canvas-shortcuts-1.png-5.png, but those assets were missing in earlier iterations and haven’t been added in this PR. Broken image links degrade the doc, so please commit the PNGs (under documents/tinyengine/advanced-features/imgs/) or update the paths. While you’re there, replace the filename-style alt text with meaningful descriptions for accessibility/SEO.

-![canvas-shortcuts-1](./imgs/canvas-shortcuts-1.png)
+![右键添加父容器操作示意](./imgs/canvas-shortcuts-1.png)
@@
-![canvas-shortcuts-2](./imgs/canvas-shortcuts-2.png)
+![左键选中目标容器示意](./imgs/canvas-shortcuts-2.png)
@@
-![canvas-shortcuts-3](./imgs/canvas-shortcuts-3.png)
+![通过画布或大纲树查看新增父容器示意](./imgs/canvas-shortcuts-3.png)
@@
-![canvas-shortcuts-4](./imgs/canvas-shortcuts-4.png)
+![多选节点示意](./imgs/canvas-shortcuts-4.png)
@@
-![canvas-shortcuts-5](./imgs/canvas-shortcuts-5.png)
+![画布快捷键总览](./imgs/canvas-shortcuts-5.png)

Ensure each referenced file exists in the repository before merging.

documents/tinyengine/development-getting-started/dev-quick-start.md (1)

120-121: Replace the obsolete branch name.

refactor/develop no longer exists; the current active branch is develop. Update the cloning guidance accordingly to avoid broken setup steps.

documents/tinyengine/solutions/canvas-communication-solution.md (2)

9-14: Confirm image asset paths render

Please double-check that ./imgs/origin-canvas-communication.png and ./imgs/new-canvas-communication.png actually exist under documents/tinyengine/solutions/imgs/ (or update the links). They were previously missing, so the diagrams still won’t display unless the paths are fixed.


196-203: Make the updateAttributes example valid JS

The snippet still uses { ... } placeholders and the literal boolean, so it can’t run as written. Swap in concrete sample data and a real boolean to make the example copy-pastable.

 useCanvas().operateNode({
   type: 'updateAttributes',
   id: '432423',
-  value: { props: { ... }, loop: { ... } },
-  overwrite: boolean
+  value: { props: { text: 'Hello' }, loop: null },
+  overwrite: false
 })
documents/tinyengine/solutions/import-map-local.md (3)

44-50: Add the trailing comma so the example compiles.

Line 49 closes importMapLocalConfig without a comma before // ...otherConfig, so copying this snippet yields a syntax error in JS/TS object literals. Please add the comma.

   importMapLocalConfig: {
     importMap: { imports: { ... } },
     copy: { ... }
-  }
+  },
   // ...otherConfig

90-90: Keep the vue runtime filename consistent.

Lines 90 and 99 still reference /dist/vue.runtime.global.prod.js while the rest of the doc uses /dist/vue.runtime.esm-browser.js. Mixing filenames confuses readers and leads to broken copy-paste paths. Align both lines with the ESM build.

Also applies to: 99-99


152-163: Document the version override pitfall.

When copy.version (Line 162) diverges from the version encoded in your importMap URLs, the build copies one version while runtime requests another, ending in 404s. Add an explicit caution here telling readers to keep these versions aligned unless they understand the reconciliation logic.

documents/tinyengine/advanced-features/block-management.md (4)

34-34: Confirm the referenced image assets exist.

文档引用了 ./imgs/createEmptyBlock.png 等多张图片,请确认这些文件已随 PR 提交(位于 documents/tinyengine/advanced-features/imgs/),以免出现断链。如需排查,可运行此前脚本重新验证。若缺失,请补全或更新路径。


22-22: Remove duplicated “views” and polish sentence.

目前句子里出现“views 文件夹下 views每个页面…”,重复导致读起来别扭,同时缺少空格。建议改为更顺畅的表述,例如:

-其中,views 文件夹下 views每个页面都有路由一一对应,用户可以根据路由访问。components文件夹下的 Header、Footer、Container则没有对应路由可以访问,但是他们可以被页面1、2、3引用,提高代码复用率,我们的区块则对应 components 下的Header、Footer、Container等组件概念(即可重用的业务组件)。
+其中,views 文件夹下的每个页面都有一一对应的路由,用户可按路由访问。components 文件夹中的 Header、Footer、Container 虽无对应路由,但可被页面 1、2、3 引用以提升复用率;区块正是对应 components 下这些可复用的业务组件。

68-70: Tighten wording in “基本设置” bullets.

“更好的明白”应写作“更好地明白”,同时“公开范围”这一行可精简并分句,使说明更清晰。例如:

-- 区块描述:区块的描述,可以让别人更好的明白该区块的用途以及含义
+- 区块描述:区块的描述,可以让别人更好地明白该区块的用途及含义
@@
-- 公开范围:区块的公开范围,设置 区块发布之后别的用户是否可以搜索,私有即只有自己可以看到、公开即所有用户都可以看到、半公开可以选择可以搜索到该区块的组织
+- 公开范围:设置区块发布后其他用户是否可搜索;私有:仅自己可见;公开:所有用户可见;半公开:可指定可搜索到该区块的组织

105-105: Use the more natural “即为”.

此处“即是”读起来略显别扭,建议换成“即为”并顺带优化句子结构,例如:

-在区块发布之后,我们在物料面板拖出区块到画布中,选中我们拖出的区块,右侧属性面板的属性即是我们定义的暴露属性
+在区块发布之后,我们可在物料面板将区块拖入画布。选中该区块后,右侧属性面板中的属性即为我们定义的暴露属性。
documents/tinyengine/extension-capabilities-tutorial/how-to-custom-theme.md (2)

7-43: Add or fix the referenced screenshots/gifs.

The doc links to several local assets (default-theme.gif, cli-theme.png, theme-registry.png, custom-theme.gif), but I still don’t see these files in the repository. Without them the walkthrough shows broken images. Please commit the assets (under documents/tinyengine/extension-capabilities-tutorial/imgs/) or update the doc to point at existing resources. After adding them, rerun an asset check to confirm the paths resolve.

Run:

#!/bin/bash
set -euo pipefail
for f in \
  documents/tinyengine/extension-capabilities-tutorial/imgs/default-theme.gif \
  documents/tinyengine/extension-capabilities-tutorial/imgs/cli-theme.png \
  documents/tinyengine/extension-capabilities-tutorial/imgs/theme-registry.png \
  documents/tinyengine/extension-capabilities-tutorial/imgs/custom-theme.gif
do
  if [[ -f "$f" ]]; then
    echo "OK: $f"
  else
    echo "MISSING: $f"
  fi
done

13-13: Wrap the bare URL to satisfy markdownlint.

Line 13 leaves the URL bare, triggering MD034. Wrap it in Markdown link syntax (e.g., [快速开始(设计器)](https://opentiny.design/tiny-engine#/help-center/course/dev/dev-quick-start)) so the doc passes lint.

documents/tinyengine/advanced-features/using-utils-methods.md (2)

8-8: Promote the bold notice to an actual heading.

Replace the emphasized line with a Markdown heading (for example, #### 注意:utils 是应用级别的,即引入之后,即可在该应用下任意页面中进行调用) to satisfy MD036.


64-64: Convert this bold title into a proper heading and capitalize “CDN”.

Use heading syntax instead of bold (e.g., #### 预置的 CDN 链接) so it passes MD036 and keeps capitalization consistent.

documents/tinyengine/extension-capabilities-overview/new-architecture.md (1)

6-10: 修正术语与语句重复,保持标点一致。

前一轮已指出这里的表述问题仍未处理:请改成“TinyEngine 官方在逐渐增加新特性并修复 Bug”,避免“TinyEngine引擎官方”“慢慢的”“bug”混用;同时把“两次‘能够’”合并为“既…又…”结构,并在句末补上句号,以提升可读性。

documents/tinyengine/solutions/block-release-solution.md (3)

19-121: Please confirm local image assets are checked in

This doc references twelve screenshots under ./imgs/…. If any are missing, the rendered guide will have broken links. Re-run the repository check to make sure each file exists and commit any that are absent.

#!/bin/bash
set -euo pipefail
base="documents/tinyengine/solutions/imgs"
while IFS= read -r path; do
  rel="${path#*](./imgs/}"
  rel="${rel%)*}"
  [ -z "$rel" ] && continue
  f="$base/$rel"
  if [ -f "$f" ]; then
    echo "OK  $f"
  else
    echo "MISSING  $f"
  fi
done < documents/tinyengine/solutions/block-release-solution.md

63-69: Fix the npmmirror example URL

/files endpoints require a concrete version or tag; semver ranges like ^3 will 404. Update the example to show a real version (or latest) so readers can follow it successfully.

-以vue为例:
-`https://registry.npmmirror.com/vue/^3/files/package.json`
+以 vue 为例(需使用具体版本或 latest 标签):
+`https://registry.npmmirror.com/vue/3.4.0/files/package.json`
+
+`https://registry.npmmirror.com/vue/latest/files/package.json`

135-160: Make the response example valid JSON

The block is labeled js, includes inline comments, and ends with a trailing comma, so readers can’t copy/paste it. Drop the comments (or switch to jsonc) and remove the trailing comma.

-```js
+```json
 {
   "data": {
       "id": 100,
       "teamId": 0,
       "taskTypeId": 5,   // 任务类型 5为区块发布任务
       "uniqueId": 1001, // 被发布区块的id
       "taskName": "PortalBlock", // 任务名称
       "taskStatus": 0, // 任务状态
       "taskResult": null,
-      "progress": "",  // 任务进度 描述
-  }
+      "progress": ""
+  }
 }

</blockquote></details>
<details>
<summary>documents/tinyengine/api/backend-api/data-source-management.md (2)</summary><blockquote>

`105-108`: **Switch delete endpoint to DELETE.**

Still documenting deletion as `GET /api/sources/delete/:id`, which is cacheable and CSRF-prone. Publish it as an idempotent DELETE on the resource path instead.

```diff
-**Path:** /api/sources/delete/:id
-**Method:** GET
+**Path:** /app-center/api/sources/:id
+**Method:** DELETE

138-141: Use DELETE for template removal.

Destructive template removal is again exposed as GET. Please align with REST semantics and CSRF safeguards by documenting it as DELETE on the resource.

-**Path:** /api/source_tpl/delete/:id
-**Method:** GET
+**Path:** /app-center/api/source_tpl/:id
+**Method:** DELETE
documents/tinyengine/api/backend-api/app-services.md (1)

75-80: Fix the printWidth wording.

The description still contains the typo “每行长指定每行代码的最大列数度”. Please change it to “指定每行代码的最大列数”.

-<span style="white-space: pre-wrap">每行长指定每行代码的最大列数度</span>
+<span style="white-space: pre-wrap">指定每行代码的最大列数</span>
documents/tinyengine/ecosystem-center/how-to-import-library.md (1)

58-59: 修正“只能时”笔误

表格里两处“只能时 TinyFormItem”应改为“只能是 TinyFormItem”,否则表述不通顺。建议直接套用上次给出的修改。

-| 子节点类型白名单   | 一些组件需要组合使用,如 TinyForm 组件的子节点只能时 TinyFormItem |
-| 父节点类型白名单   | 一些组件需要组合使用,如 TinyForm 组件的子节点只能时 TinyFormItem |
+| 子节点类型白名单   | 一些组件需要组合使用,如 TinyForm 组件的子节点只能是 TinyFormItem |
+| 父节点类型白名单   | 一些组件需要组合使用,如 TinyForm 组件的子节点只能是 TinyFormItem |
documents/tinyengine/ecosystem-center/publish-other-ecosystems.md (1)

1-1: 移除标题前的空格

一级标题前多了一个空格,违反 markdownlint MD023,请把行首空格删掉。

- ## 如何发布其他生态
+## 如何发布其他生态
documents/tinyengine/solutions/third-party-library-in-designer.md (4)

21-21: npm.destructuring 类型应为 Boolean

“是否解构”是布尔语义,类型请改成 Boolean 并调整描述。

-| npm.destructuring | String  | 是否解构。取决于npm包导出当前组件的方式是export还是export default |
+| npm.destructuring | Boolean | 是否解构。取决于 npm 包导出当前组件的方式(export / export default) |

264-265: shortcuts 属性名与示例不一致

示例属性为 placeholdersize,但 shortcuts 仍写着 text。请保持一致。

-            "shortcuts": {
-              "properties": ["text", "size"]
-            },
+            "shortcuts": {
+              "properties": ["placeholder", "size"]
+            },

267-267: 更正动作名拼写

bindEevent 拼写错误,应为 bindEvent,避免误导使用者。

-              "actions": ["copy", "remove", "insert", "updateAttr", "bindEevent", "createBlock"],
+              "actions": ["copy", "remove", "insert", "updateAttr", "bindEvent", "createBlock"],

430-431: 示例图标与组件不符

此处示例仍用 icon": "button",应与 ElInput 示例保持一致改成 "input"

-              "icon": "button",
+              "icon": "input",
documents/tinyengine/basic-features/page-management.md (2)

37-55: Polish wording and terminology per prior suggestion.

The phrasing“出来编辑面板”、Vue3setUp、以及图片 alt 文本“声明周期配置”仍未调整。Please adopt the improved wording for clarity and correctness (see prior diff).


26-60: Add the six referenced images so the doc renders correctly.

addFolder.png, addPage.png, pagedelOrCopy.png, pageManaIndex.png, lifecycle.gif, and pageManaHistoryRestore.png are still absent under documents/tinyengine/basic-features/imgs/. Commit these assets or update the links.

#!/bin/bash
set -euo pipefail
base="documents/tinyengine/basic-features"
imgs=(
  imgs/addFolder.png
  imgs/addPage.png
  imgs/pagedelOrCopy.png
  imgs/pageManaIndex.png
  imgs/lifecycle.gif
  imgs/pageManaHistoryRestore.png
)
for img in "${imgs[@]}"; do
  path="$base/$img"
  if [[ -f "$path" ]]; then
    echo "OK  - $path"
  else
    echo "MISS- $path"
  fi
done
documents/tinyengine/basic-features/page-and-block-preview.md (2)

5-5: Refine the intro sentence for clarity (same issue as before).

请按照先前建议修订“的/地”用法并整体润色该句,提升可读性。


9-19: Restore images and provide descriptive alt text.

preview-btn.png, preview-pre.png, and preview.png are still missing, and the alt text remains placeholder (“Alt text”). Add the screenshots (or fix paths) and use meaningful alt descriptions.

#!/bin/bash
set -euo pipefail
base="documents/tinyengine/basic-features"
imgs=(
  imgs/preview-btn.png
  imgs/preview-pre.png
  imgs/preview.png
)
for img in "${imgs[@]}"; do
  path="$base/$img"
  if [[ -f "$path" ]]; then
    echo "OK  - $path"
  else
    echo "MISS- $path"
  fi
done
documents/tinyengine/development-getting-started/dev-intro.md (2)

9-9: Remove the duplicated “的”.

“符合企业组织理念的的低代码平台” still has a double “的”; drop one for correct grammar.


24-24: Add spacing between English and Chinese terms.

“TinyEngine可以”应写作“TinyEngine 可以”以遵循中英混排规范。

documents/tinyengine/tutorials/issue-1-2023.10.27.md (2)

6-173: Normalize heading levels (### → ##).

The question sections jump from # to ###, violating the heading hierarchy (MD001). Please change question headings to ## so the structure progresses one level at a time.


125-187: Polish interrogative wording (“或者” → “或/还是”).

Questions 7 and 4 still use“或者”。在疑问句中建议改为“或/还是”,与之前建议一致。

documents/tinyengine/solutions/front-backend-docker-deployment.md (2)

37-56: Document needs RAG service section (still missing).

The deploy guide still omits the new RAG/Chroma service, required backend env vars (e.g. FOLDER_PATH, CHROMA_BASE_URL), volume mounts, and port guidance. Without this, the compose stack in this PR cannot be reproduced. Please add the RAG section covering service definition, persistence volume, backend env wiring, and the 9090/8000 port notes.


20-41: Fix broken image references before publishing.

./imgs/daemon.png and ./imgs/nginxcof.png are still missing, so the doc renders broken images. Add the assets (or correct the paths) under documents/tinyengine/solutions/imgs/.

#!/bin/bash
set -euo pipefail
base="documents/tinyengine/solutions"
for img in imgs/daemon.png imgs/nginxcof.png; do
  path="$base/$img"
  if [[ -f "$path" ]]; then
    echo "OK  - $path"
  else
    echo "MISS- $path"
  fi
done
documents/tinyengine/development-getting-started/debugging-of-java-backend.md (3)

26-97: Commit all referenced screenshots before merging.

./imgs/java-debugging-image33.png through java-debugging-image42.png are still absent, so every screenshot is broken. Please add these assets (or correct the links).

#!/bin/bash
set -euo pipefail
base="documents/tinyengine/development-getting-started"
for n in {33..42}; do
  path="$base/imgs/java-debugging-image${n}.png"
  if [[ -f "$path" ]]; then
    echo "OK  - $path"
  else
    echo "MISS- $path"
  fi
done

72-72: Call out the required dev profile.

application-dev.yml only applies when SPRING_PROFILES_ACTIVE=dev (or equivalent) is set. Please add this to the instructions so readers get the expected config.


92-93: Fix Swagger URL to use the configured 9090 port.

The doc still points to localhost:9091, but the dev profile exposes 9090. Update the link to http://localhost:9090/swagger-ui.html.

documents/tinyengine/api/frontend-api/canvas-api.md (2)

60-135: Fix delegated method descriptions & add fence language.

getContext/getGlobalState still claim to call render.setDataSourceMap, and getDocument keeps the contentDcocument typo. The code fence also lacks a language tag, tripping markdownlint. Please update the comments and fence as previously requested.

-  ```
+  ```ts
   {
@@
-   getContext, // 方法函数, 转接的方法, 调用render的setDataSourceMap
+   getContext, // 转接的方法,调用 render 的 getContext
@@
-   getGlobalState,// 转接的方法, 调用render的setDataSourceMap
+   getGlobalState,// 转接的方法,调用 render 的 getGlobalState
@@
-   getDocument, // 方法函数,返回画布iframe的contentDcocument
+   getDocument, // 方法函数,返回画布 iframe 的 contentDocument
   }

142-171: Correct renderer block wording and casing, add fence language.

The renderer snippet still misses a language tag, keeps “放回” instead of “返回”, and uses setPagecss instead of setPageCss. Please align casing and wording per prior feedback.

-```
+```ts
 {
-  getApp, //方法函数, 放回当前画布的vue实例app
-  getI18n //方法函数, 放回当前画布vue实例初始化后的TinyI18nHost
+  getApp, // 方法函数,返回当前画布的 vue 实例 app
+  getI18n // 方法函数,返回当前画布 vue 实例初始化后的 TinyI18nHost
@@
-  setPagecss,
+  setPageCss,
 }
documents/tinyengine/api/frontend-api/material-api.md (1)

414-428: Avoid parameter shadowing in the upload example.

The example still redeclares material, causing a const redeclaration error. Rename the parameter and the local variable to keep them distinct.

-export const handleUploadMaterial = async (material) => {
+export const handleUploadMaterial = async (file) => {
   // 1. 允许用户上传物料
-  getMetaApi(META_SERVICE.Http).post('xxx/upload', material)
+  getMetaApi(META_SERVICE.Http).post('xxx/upload', file)
   // 2. 刷新物料, 让画布重新加载,并在物料插件更新列表。
-  const material = useMaterial()
-  await material.refreshMaterial()
+  const materialSvc = useMaterial()
+  await materialSvc.refreshMaterial()
 }
documents/tinyengine/api/frontend-api/settings-panel-api.md (3)

1-1: Remove the trailing tab in the H1.

Line 1 still ends with a hard tab, violating MD010 and causing rendering quirks. Please drop the tab so the header ends right after “API”.


5-5: Use “来自” instead of “来自于”.

The phrase “来自于” is redundant; “来自” is the standard form. Update the sentence accordingly.


21-33: Align getSharedOptions definition with its usage.

The function is defined without parameters but the example calls getSharedOptions('variableConfiguratorList'). Please pick one contract (e.g., zero-arg returning an object) and update both definition and usage consistently, same as previously requested.

-export const getSharedOptions = () => ({
-  variableConfiguratorList: [ /* 变量绑定列表 */ ]
-})
+export const getSharedOptions = () => ({
+  variableConfiguratorList: [ /* 变量绑定列表 */ ]
+})
@@
-getSharedOptions('variableConfiguratorList')
+getSharedOptions().variableConfiguratorList
🧹 Nitpick comments (8)
documents/tinyengine/advanced-features/conditional-rendering.md (2)

19-19: 修正第 5 步的措辞

这里应为“选择绑定的变量”。“选项绑定的变量”语义不通,读者容易困惑。


29-29: 更正图片说明中的拼写

alt 文案写成了 “state.isLogin为ture时”。请改为 “state.isLogin为true时” 以避免误导。

documents/tinyengine/advanced-features/new-ai-plugin-usage.md (1)

146-174: Add language identifiers to fenced code blocks

Markdown lint (MD040) is flagging the sample dialogue blocks because the fences lack a language hint. Please annotate them (e.g.text) so automated docs checks pass.

-```
+```text
 用户:帮我创建一个包含用户信息表单的页面,需要有姓名、邮箱、手机号字段
 AI:好的,我将为您创建一个包含用户信息表单的页面...
 [执行创建页面操作]
 AI:已完成页面创建,您可以在页面列表中查看新创建的表单页面

</blockquote></details>
<details>
<summary>documents/tinyengine/extension-capabilities-tutorial/ai-plugin-configuration.md (1)</summary><blockquote>

`23-24`: **Clean up the list/heading mix.**

The `- ###` line renders inconsistently; drop the list marker or convert it into plain body text for consistent formatting.

</blockquote></details>
<details>
<summary>documents/tinyengine/development-getting-started/dev-quick-start.md (1)</summary><blockquote>

`90-124`: **Resolve markdownlint findings (tabs & fenced block language).**

Replace the hard tab before the comment in the diff snippet with spaces, and add a language hint (e.g., `text`) to the directory-structure code block to satisfy MD010/MD040.

</blockquote></details>
<details>
<summary>documents/tinyengine/about-designer/customize-material-package-themes-dsl-toolbar-plugins.md (1)</summary><blockquote>

`13-14`: **Polish wording in DSL description**

去掉多余的“的”并统一空格/措辞可读性会更好。


```diff
-3. **定制DSL:** DSL为 **单选**。DSL是将物料的Schema 解析成不同技术栈源码的转换工具,所以DSL的必须和选择的物料在技术栈保持一致。
+3. **定制DSL:** DSL 为 **单选**。DSL 是将物料的 Schema 解析成不同技术栈源码的转换工具,所以 DSL 必须与选择的物料在技术栈保持一致。
documents/tinyengine/practical-cases/graphical-element-arrangement-designer.md (1)

32-32: Fix the typo “TinyEinge”.

Line 32 spells the product name as “TinyEinge”; correct it to “TinyEngine”.

docker-compose.yml (1)

18-30: Pin the Chroma image to a fixed version.

Pulling chromadb/chroma:latest makes builds non-reproducible and risks accidental upgrades when upstream publishes breaking changes. Please pin to a tested tag (e.g., chromadb/chroma:0.5.4) and update intentionally when validating a new release.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b2ce522 and ca68c38.

📒 Files selected for processing (98)
  • docker-compose.yml (2 hunks)
  • documents/tinyengine/about-applications/create-application-blank-or-template.md (1 hunks)
  • documents/tinyengine/about-applications/develop-application.md (1 hunks)
  • documents/tinyengine/about-designer/create-designer.md (1 hunks)
  • documents/tinyengine/about-designer/customize-designer.md (1 hunks)
  • documents/tinyengine/about-designer/customize-material-package-themes-dsl-toolbar-plugins.md (1 hunks)
  • documents/tinyengine/about-designer/designer-intro.md (1 hunks)
  • documents/tinyengine/about-materials/add-library-and-blocks.md (1 hunks)
  • documents/tinyengine/about-materials/build-material-asset-package.md (1 hunks)
  • documents/tinyengine/about-materials/create-material-asset-package.md (1 hunks)
  • documents/tinyengine/about-materials/materials-intro.md (1 hunks)
  • documents/tinyengine/advanced-features/advanced-panel-settings.md (1 hunks)
  • documents/tinyengine/advanced-features/block-management.md (1 hunks)
  • documents/tinyengine/advanced-features/canvas-shortcuts.md (1 hunks)
  • documents/tinyengine/advanced-features/conditional-rendering.md (1 hunks)
  • documents/tinyengine/advanced-features/data-source-and-collection-mock-data.md (1 hunks)
  • documents/tinyengine/advanced-features/data-source-and-collection-remote-fields.md (1 hunks)
  • documents/tinyengine/advanced-features/data-source-and-collection-usage.md (1 hunks)
  • documents/tinyengine/advanced-features/how-to-use-slots.md (1 hunks)
  • documents/tinyengine/advanced-features/integrating-chatgpt-for-simple-pages.md (1 hunks)
  • documents/tinyengine/advanced-features/js-panel-and-event-binding.md (1 hunks)
  • documents/tinyengine/advanced-features/loop-rendering.md (1 hunks)
  • documents/tinyengine/advanced-features/new-ai-plugin-usage.md (1 hunks)
  • documents/tinyengine/advanced-features/route-capabilities/page-support-nested-route.md (1 hunks)
  • documents/tinyengine/advanced-features/route-capabilities/route-bar-clear-preview-page.md (1 hunks)
  • documents/tinyengine/advanced-features/route-capabilities/route-bar-current-page-highlight.md (1 hunks)
  • documents/tinyengine/advanced-features/route-capabilities/route-view-support-preview-subpage.md (1 hunks)
  • documents/tinyengine/advanced-features/theme-switch.md (1 hunks)
  • documents/tinyengine/advanced-features/using-utils-methods.md (1 hunks)
  • documents/tinyengine/api/api-overview.md (1 hunks)
  • documents/tinyengine/api/backend-api/ai-function-api.md (1 hunks)
  • documents/tinyengine/api/backend-api/app-services.md (1 hunks)
  • documents/tinyengine/api/backend-api/app-utility-management.md (1 hunks)
  • documents/tinyengine/api/backend-api/data-source-management.md (1 hunks)
  • documents/tinyengine/api/backend-api/dsl-code-generation.md (1 hunks)
  • documents/tinyengine/api/frontend-api/canvas-api.md (1 hunks)
  • documents/tinyengine/api/frontend-api/global-layout-api.md (1 hunks)
  • documents/tinyengine/api/frontend-api/globalService-api.md (1 hunks)
  • documents/tinyengine/api/frontend-api/main-package-api.md (1 hunks)
  • documents/tinyengine/api/frontend-api/material-api.md (1 hunks)
  • documents/tinyengine/api/frontend-api/preview-api.md (1 hunks)
  • documents/tinyengine/api/frontend-api/registry-api.md (1 hunks)
  • documents/tinyengine/api/frontend-api/settings-panel-api.md (1 hunks)
  • documents/tinyengine/basic-features/designer-ui-modules.md (1 hunks)
  • documents/tinyengine/basic-features/frontend-application-flow.md (1 hunks)
  • documents/tinyengine/basic-features/inline-style-variable-binding.md (1 hunks)
  • documents/tinyengine/basic-features/internationalization.md (1 hunks)
  • documents/tinyengine/basic-features/intro-to-designer.md (1 hunks)
  • documents/tinyengine/basic-features/outline-tree.md (1 hunks)
  • documents/tinyengine/basic-features/page-and-block-preview.md (1 hunks)
  • documents/tinyengine/basic-features/page-management.md (1 hunks)
  • documents/tinyengine/basic-features/state-management-and-variable-binding.md (1 hunks)
  • documents/tinyengine/basic-features/style-settings.md (1 hunks)
  • documents/tinyengine/basic-features/using-components.md (1 hunks)
  • documents/tinyengine/changelog/changelog.md (1 hunks)
  • documents/tinyengine/changelog/v2.7-upgrade-guide.md (1 hunks)
  • documents/tinyengine/development-getting-started/debugging-of-java-backend.md (1 hunks)
  • documents/tinyengine/development-getting-started/dev-intro.md (1 hunks)
  • documents/tinyengine/development-getting-started/dev-quick-start.md (1 hunks)
  • documents/tinyengine/ecosystem-center/ecosystem-intro.md (1 hunks)
  • documents/tinyengine/ecosystem-center/how-to-import-library.md (1 hunks)
  • documents/tinyengine/ecosystem-center/how-to-publish-block.md (1 hunks)
  • documents/tinyengine/ecosystem-center/publish-other-ecosystems.md (1 hunks)
  • documents/tinyengine/extension-capabilities-overview/meta-services-and-meta-apps.md (1 hunks)
  • documents/tinyengine/extension-capabilities-overview/new-architecture.md (1 hunks)
  • documents/tinyengine/extension-capabilities-overview/new-registry-advanced.md (1 hunks)
  • documents/tinyengine/extension-capabilities-overview/new-registry.md (1 hunks)
  • documents/tinyengine/extension-capabilities-overview/registry.md (1 hunks)
  • documents/tinyengine/extension-capabilities-tutorial/ai-plugin-configuration.md (1 hunks)
  • documents/tinyengine/extension-capabilities-tutorial/code-output-function/code-output-overview-and-usage.md (1 hunks)
  • documents/tinyengine/extension-capabilities-tutorial/code-output-function/custom-page-code-output-plugin.md (1 hunks)
  • documents/tinyengine/extension-capabilities-tutorial/code-output-function/how-to-customize-code-output-plugins.md (1 hunks)
  • documents/tinyengine/extension-capabilities-tutorial/code-output-function/how-to-customize-code-output.md (1 hunks)
  • documents/tinyengine/extension-capabilities-tutorial/code-output-function/official-code-output-api.md (1 hunks)
  • documents/tinyengine/extension-capabilities-tutorial/customize-meta-service-logic.md (1 hunks)
  • documents/tinyengine/extension-capabilities-tutorial/customize-page-configured.md (1 hunks)
  • documents/tinyengine/extension-capabilities-tutorial/customize-plugin-ui.md (1 hunks)
  • documents/tinyengine/extension-capabilities-tutorial/develop-configurator-components.md (1 hunks)
  • documents/tinyengine/extension-capabilities-tutorial/how-to-custom-theme.md (1 hunks)
  • documents/tinyengine/extension-capabilities-tutorial/how-to-develop-plugins.md (1 hunks)
  • documents/tinyengine/extension-capabilities-tutorial/mcpService.md (1 hunks)
  • documents/tinyengine/getting-started/introduction.md (1 hunks)
  • documents/tinyengine/getting-started/quick-start.md (1 hunks)
  • documents/tinyengine/practical-cases/graphical-element-arrangement-designer.md (1 hunks)
  • documents/tinyengine/practical-cases/pdm-metadata-approval-workflow.md (1 hunks)
  • documents/tinyengine/practical-cases/smb-lightweight-application-service.md (1 hunks)
  • documents/tinyengine/solutions/block-construction-solution.md (1 hunks)
  • documents/tinyengine/solutions/block-lan-release-solution.md (1 hunks)
  • documents/tinyengine/solutions/block-release-solution.md (1 hunks)
  • documents/tinyengine/solutions/canvas-communication-solution.md (1 hunks)
  • documents/tinyengine/solutions/front-backend-docker-deployment.md (1 hunks)
  • documents/tinyengine/solutions/import-map-local.md (1 hunks)
  • documents/tinyengine/solutions/material-sync-solution.md (1 hunks)
  • documents/tinyengine/solutions/server-deployment-solution-java.md (1 hunks)
  • documents/tinyengine/solutions/server-deployment-solution.md (1 hunks)
  • documents/tinyengine/solutions/third-party-library-in-designer.md (1 hunks)
  • documents/tinyengine/tutorials/build-a-page-from-scratch.md (1 hunks)
  • documents/tinyengine/tutorials/issue-1-2023.10.27.md (1 hunks)
✅ Files skipped from review due to trivial changes (7)
  • documents/tinyengine/advanced-features/advanced-panel-settings.md
  • documents/tinyengine/extension-capabilities-tutorial/code-output-function/official-code-output-api.md
  • documents/tinyengine/api/frontend-api/globalService-api.md
  • documents/tinyengine/ecosystem-center/ecosystem-intro.md
  • documents/tinyengine/extension-capabilities-tutorial/customize-plugin-ui.md
  • documents/tinyengine/api/frontend-api/registry-api.md
  • documents/tinyengine/advanced-features/route-capabilities/route-bar-current-page-highlight.md
🚧 Files skipped from review as they are similar to previous changes (31)
  • documents/tinyengine/basic-features/intro-to-designer.md
  • documents/tinyengine/advanced-features/how-to-use-slots.md
  • documents/tinyengine/solutions/block-construction-solution.md
  • documents/tinyengine/about-materials/materials-intro.md
  • documents/tinyengine/practical-cases/smb-lightweight-application-service.md
  • documents/tinyengine/getting-started/quick-start.md
  • documents/tinyengine/advanced-features/route-capabilities/page-support-nested-route.md
  • documents/tinyengine/advanced-features/integrating-chatgpt-for-simple-pages.md
  • documents/tinyengine/about-applications/develop-application.md
  • documents/tinyengine/basic-features/frontend-application-flow.md
  • documents/tinyengine/advanced-features/loop-rendering.md
  • documents/tinyengine/solutions/server-deployment-solution-java.md
  • documents/tinyengine/tutorials/build-a-page-from-scratch.md
  • documents/tinyengine/extension-capabilities-tutorial/code-output-function/how-to-customize-code-output.md
  • documents/tinyengine/about-designer/customize-designer.md
  • documents/tinyengine/api/frontend-api/preview-api.md
  • documents/tinyengine/basic-features/outline-tree.md
  • documents/tinyengine/about-materials/build-material-asset-package.md
  • documents/tinyengine/ecosystem-center/how-to-publish-block.md
  • documents/tinyengine/extension-capabilities-overview/new-registry.md
  • documents/tinyengine/about-materials/add-library-and-blocks.md
  • documents/tinyengine/solutions/material-sync-solution.md
  • documents/tinyengine/basic-features/inline-style-variable-binding.md
  • documents/tinyengine/basic-features/style-settings.md
  • documents/tinyengine/extension-capabilities-tutorial/how-to-develop-plugins.md
  • documents/tinyengine/advanced-features/theme-switch.md
  • documents/tinyengine/api/frontend-api/main-package-api.md
  • documents/tinyengine/solutions/server-deployment-solution.md
  • documents/tinyengine/advanced-features/route-capabilities/route-bar-clear-preview-page.md
  • documents/tinyengine/about-designer/designer-intro.md
  • documents/tinyengine/extension-capabilities-tutorial/customize-meta-service-logic.md
🧰 Additional context used
🪛 LanguageTool
documents/tinyengine/advanced-features/block-management.md

[uncategorized] ~68-~68: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:好"地"明白
Context: ...围进行设置,下面对相关设置项进行讲解 - 区块描述:区块的描述,可以让别人更好的明白该区块的用途以及含义 - 区块标签:区块的标签,方便消费侧用户搜索 - 公开...

(wb4)


[uncategorized] ~105-~105: 您的意思是“"既"是”吗?
Context: ...发布之后,我们在物料面板拖出区块到画布中,选中我们拖出的区块,右侧属性面板的属性即是我们定义的暴露属性 ![区块暴露属性的消费](./imgs/blockexp...

(JI11_JI2)

documents/tinyengine/api/frontend-api/settings-panel-api.md

[uncategorized] ~5-~5: 成分累赘: “来自” “于” 不一起使用,请删除 “于”:"来自"。
Context: # 设置面板模块API ## 变量绑定 变量绑定列表中的变量可能来自于其他元应用。 目前提供一种在元应用中注册变量绑定列表来源的方法:首先在元应用配...

(wb2)

documents/tinyengine/changelog/changelog.md

[grammar] ~11-~11: There might be a mistake here.
Context: ...'s Change #### 🎉 Exciting New Features - 新的注册表声明方式:采用基于唯一 ID 的扁平结构,更加灵活和精确 - **...

(QB_NEW_EN)


[grammar] ~23-~23: There might be a mistake here.
Context: ... - 优化了插件的加载和初始化流程 #### 📚 Documentation - 新增 v2.7 升级指南 ...

(QB_NEW_EN)


[grammar] ~26-~26: There might be a mistake here.
Context: ...apabilities-overview/new-registry.md) 文档 - 新增 [注册表高级配置](../extension-capabilities-o...

(QB_NEW_EN)

documents/tinyengine/api/backend-api/app-services.md

[grammar] ~21-~21: There might be a mistake here.
Context: ...称 | 参数值 | 是否必须 | 示例 | 备注 | | ------------ | ---------------- | ----...

(QB_NEW_EN)


[grammar] ~22-~22: There might be a mistake here.
Context: ...------------- | -------- | ---- | ---- | | Content-Type | application/json | 是 ...

(QB_NEW_EN)


[grammar] ~66-~66: There might be a mistake here.
Context: ... | 参数名称 | 是否必须 | 示例 | 备注 | | --------- | -------- | ------- | -----...

(QB_NEW_EN)


[grammar] ~67-~67: There might be a mistake here.
Context: ... | -------- | ------- | -------------- | | type | 是 | Block | Page ...

(QB_NEW_EN)


[grammar] ~68-~68: There might be a mistake here.
Context: ... | 是 | Block | Page | | id | 是 | 123 | 区块或者页面...

(QB_NEW_EN)


[grammar] ~69-~69: There might be a mistake here.
Context: ... | 是 | 123 | 区块或者页面id | | history | 否 | 123 | 历史记录id...

(QB_NEW_EN)


[grammar] ~70-~70: There might be a mistake here.
Context: ...ory | 否 | 123 | 历史记录id | | framework | 是 | Angular | Vue ...

(QB_NEW_EN)


[grammar] ~100-~100: There might be a mistake here.
Context: ...Query | 参数名称 | 是否必须 | 示例 | 备注 | | -------- | -------- | ---- | -------- ...

(QB_NEW_EN)


[grammar] ~101-~101: There might be a mistake here.
Context: ... -------- | -------- | ---- | -------- | | type | 是 | Page | Page |...

(QB_NEW_EN)


[grammar] ~102-~102: There might be a mistake here.
Context: ...| type | 是 | Page | Page | | id | 是 | 123 | |...

(QB_NEW_EN)


[grammar] ~103-~103: There might be a mistake here.
Context: ...| id | 是 | 123 | | | platform | 是 | 123 | 平台id | |...

(QB_NEW_EN)


[grammar] ~104-~104: There might be a mistake here.
Context: ...| | platform | 是 | 123 | 平台id | | app | 是 | 123 | 应用id | |...

(QB_NEW_EN)


[grammar] ~105-~105: There might be a mistake here.
Context: ...| | app | 是 | 123 | 应用id | | history | 是 | 123 | 历史记录 | ##...

(QB_NEW_EN)

documents/tinyengine/extension-capabilities-tutorial/mcpService.md

[uncategorized] ~697-~697: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:合理"地"增加
Context: ...总结 MCP 服务为 tiny-engine 智能化提供了强大的驱动。通过合理的增加工具、prompts 等 mcp 能力,它能够让 AI 理解TinyEngi...

(wb4)

documents/tinyengine/api/backend-api/dsl-code-generation.md

[grammar] ~22-~22: There might be a mistake here.
Context: ...= generateCode({ pageInfo, blocksData }) result.forEach((item) => fs.writeFile...

(QB_NEW_EN)

documents/tinyengine/solutions/block-lan-release-solution.md

[uncategorized] ~106-~106: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:正确"地"显示
Context: ...正常发布在私仓上,如果想要在TinyEngine的页面上去获取到私仓里的包,正确的显示区块,我们还需要借助unpkg去获取到包的数据,而由于公网的unpkg无法直...

(wb4)


[uncategorized] ~185-~185: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:正常"地"使用
Context: ...ng) 验证完成后,可以在物料中把刚才发布的区块进行添加,添加完毕后就可以正常的使用区块功能。 ## 五、服务部署 当前步骤都是在电脑本地环境下运行调试的,...

(wb4)

documents/tinyengine/api/backend-api/app-utility-management.md

[grammar] ~20-~20: There might be a mistake here.
Context: ...称 | 参数值 | 是否必须 | 示例 | 备注 | | ------------ | ---------------- | ----...

(QB_NEW_EN)


[grammar] ~21-~21: There might be a mistake here.
Context: ...------------- | -------- | ---- | ---- | | Content-Type | application/json | 是 ...

(QB_NEW_EN)


[grammar] ~65-~65: There might be a mistake here.
Context: ...称 | 参数值 | 是否必须 | 示例 | 备注 | | ------------ | ---------------- | ----...

(QB_NEW_EN)


[grammar] ~66-~66: There might be a mistake here.
Context: ...------------- | -------- | ---- | ---- | | Content-Type | application/json | 是 ...

(QB_NEW_EN)


[grammar] ~112-~112: There might be a mistake here.
Context: ...Query** | 参数名称 | 是否必须 | 示例 | 备注 | | -------- | -------- | ---- | ---------...

(QB_NEW_EN)


[grammar] ~113-~113: There might be a mistake here.
Context: ...------- | -------- | ---- | ---------- | | id | 是 | 333 | 工具类id | ...

(QB_NEW_EN)


[grammar] ~114-~114: There might be a mistake here.
Context: ... | id | 是 | 333 | 工具类id | | app | 是 | 12 | 所属应用id | ...

(QB_NEW_EN)


[grammar] ~146-~146: There might be a mistake here.
Context: ...| 备注 | | -------- | -------- | ----- | --------...

(QB_NEW_EN)


[grammar] ~147-~147: There might be a mistake here.
Context: ...-------------------------------------- | | app | 否 | 12 | 应用id ...

(QB_NEW_EN)


[grammar] ~148-~148: There might be a mistake here.
Context: ...| 应用id | | category | 否 | utils | 两种取值:util...

(QB_NEW_EN)

documents/tinyengine/advanced-features/js-panel-and-event-binding.md

[uncategorized] ~90-~90: 成分累赘: “来自” “于” 不一起使用,请删除 “于”:"来自"。
Context: ...签名需参考组件的文档 1. 首先在页面JS中定义渲染函数,这里的函数参数的定义来自于 TinyVue 的文档 ![在页面JS中定义渲染函数](./imgs/pag...

(wb2)


[uncategorized] ~103-~103: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:方便"地"提供
Context: ...够很方便的为元素或区块添加事件,通过可视化的优势快速定位到某个元素。同时也很方便的提供一些状态获取方法,国际化词条获取方法等。

(wb4)

documents/tinyengine/api/backend-api/ai-function-api.md

[grammar] ~23-~23: There might be a mistake here.
Context: ...称 | 参数值 | 是否必须 | 示例 | 备注 | | ------------ | ---------------- | ----...

(QB_NEW_EN)


[grammar] ~24-~24: There might be a mistake here.
Context: ...------------- | -------- | ---- | ---- | | Content-Type | application/json | 是 ...

(QB_NEW_EN)

documents/tinyengine/advanced-features/new-ai-plugin-usage.md

[uncategorized] ~38-~38: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:新"地"会话
Context: ...assistant-settings.png) 注意:切换 AI 模型会开启新的会话。 ### 2.3 MCP工具管理 ![MCP工具管理](./imgs...

(wb4)

documents/tinyengine/about-materials/create-material-asset-package.md

[uncategorized] ~8-~8: 数词与名词之间一般应存在量词,可能缺少量词。
Context: ...r的组件库与区块。 物料资产包版本是用户自定义的,用户可以将物料资产包回退到任一版本。 构建物料资产包...

(wa5)

documents/tinyengine/basic-features/page-and-block-preview.md

[uncategorized] ~5-~5: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:最终"地"表现
Context: ... 在一些场景下,设计器的画布并不能使得我们直观的感受到所设计的区块或者页面最终的表现。比如说,当页面上区块和组件应用层次较多,区块之间或者组件之间交互行为较为复...

(wb4)


[uncategorized] ~5-~5: 您不可用“是”来表达个形容词。大部分人都平常用“很”来代替“是”。您是不是想表达"很困难"?
Context: ...组件之间交互行为较为复杂时,我们在画布上去清晰的感知页面的静态布局以及动态交互很是困难,这时候就需要设计器的页面/区块预览能力来为开发提供帮助 ### 页面...

(SHI_ADHECTIVE_ERROR)

documents/tinyengine/basic-features/using-components.md

[uncategorized] ~20-~20: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:好"地"拖
Context: ...# 从画布中直接添加组件 对于复杂的页面,嵌套层级可能很深,直接拖拽并不能很好的拖入到指定的层级中,所以,设计器提供在画布中右键精准添加组件的能力。 1. 画...

(wb4)

documents/tinyengine/development-getting-started/dev-intro.md

[uncategorized] ~16-~16: 数量词修饰并列短语,可能产生歧义
Context: ...持二次开发或被集成 - 直接生成可部署的源码,运行时无需引擎支撑 - 允许接入第三方组件、允许定制扩展插件 - 支持高代码与低代码,混合开发部署应用 - 平台接入 AI ...

(s5)

documents/tinyengine/development-getting-started/dev-quick-start.md

[uncategorized] ~14-~14: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:必要"地"开发
Context: ...t 代码版本管理⼯具 - chrome浏览器 110+ 版本 - 以及其他必要的开发前端开发环境、⼯具等。 ## 二、Tiny Engine CLI ...

(wb4)


[uncategorized] ~64-~64: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:新"地"插
Context: ... 另起一个终端,在当前目录下,输入下面命令,选择创建plugin类型,创建一个新的插件 ```shell npx @opentiny/tiny-engine-c...

(wb4)


[uncategorized] ~102-~102: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:新"地"插
Context: ...#### 2.2.3 开发调试插件 重新打开项目页面,可以看到侧边栏多了一个新的插件: ![cli-plugin-open](./imgs/cli-plugi...

(wb4)

documents/tinyengine/ecosystem-center/how-to-import-library.md

[uncategorized] ~5-~5: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:好"地"可
Context: ...组件库 ## 介绍 组件是页面搭建最小的可复用单元,组件库是一系列已经封装好的可复用组件的集合。通过导入第三方组件库,可以利用已经开发好的功能,无需从头开始编...

(wb4)

documents/tinyengine/ecosystem-center/publish-other-ecosystems.md

[uncategorized] ~7-~7: 能愿动词不能成为‘把’字句、‘被’字句的谓语动词。应该是:"会被……标识"。
Context: ...为插件 npm 包所在的仓库地址 版本号决定了安装哪一个版本的 npm 包 被标识为官方的插件会显示“官方”字样 被标识为默认的插件会在创建设计器时默认被选中 公开决定了插...

(wa3)


[uncategorized] ~8-~8: 能愿动词不能成为‘把’字句、‘被’字句的谓语动词。应该是:"会被……标识"。
Context: ...号决定了安装哪一个版本的 npm 包 被标识为官方的插件会显示“官方”字样 被标识为默认的插件会在创建设计器时默认被选中 公开决定了插件的可见范围,私有代表仅自己可见,公开代...

(wa3)

documents/tinyengine/extension-capabilities-overview/new-architecture.md

[uncategorized] ~6-~6: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:慢慢"地"增加
Context: ...对官方项目代码的修改程度也逐渐增多,与此同时,TinyEngine引擎官方在慢慢的增加新特性,以及修复 bug,导致 fork 出来的代码与官方引擎项目差异越来越...

(wb4)


[uncategorized] ~10-~10: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:新"地"可
Context: ...对插件、设计器、布局、出码等等方式进行定制。 基于这个需求与思路,我们设计了新的可扩展架构——洛书架构 ## 扩展架构核心特性 - 提供 cli 工具,使用...

(wb4)

documents/tinyengine/extension-capabilities-overview/new-registry-advanced.md

[uncategorized] ~10-~10: 单纯方位词与名词结合不加“的”,您的意思是否是:"版本下 或 版本以下 或 版本的下"边
Context: ...背景:开源的开发过程中,难免会遇到一些紧急的 bug 需要修复,如果等待开源版本的下个版本发布,可能需要经过这样一个流程: 1. 用户向TinyEngine团队...

(wa2)

documents/tinyengine/extension-capabilities-tutorial/code-output-function/code-output-overview-and-usage.md

[uncategorized] ~34-~34: 1.动词被副词修饰时,助词应该用‘得’;2.省略宾语时,助词应该用‘的’;可能造成歧义。您的意思是不是:膨胀"得"非常巨大
Context: ...但是,在我们实战经验中却发现随着需求的变更以及时间的变迁,运行时引擎的代码会膨胀的非常巨大,运行时引擎内部的架构也越来越复杂,会带来一些明显的痛点: - 由于运...

(wb4)


[uncategorized] ~40-~40: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:完美"地"解决
Context: ...用低代码搭建的场景)。 在经历一番探索之后,我们发现使用出码的方案可以相对完美的解决以上痛点: - 运行时引擎仅在设计态搭建页面的时候存在,正式上线的代码是人...

(wb4)

documents/tinyengine/getting-started/introduction.md

[uncategorized] ~23-~23: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:强大"地"开放
Context: ...nyEngine 有开放的物料协议和扩展接口:得益于 TinyEngine 强大的开放物料设计,可直接导入第三方组件库,例如 elementUI 和 AntDes...

(wb4)

documents/tinyengine/practical-cases/graphical-element-arrangement-designer.md

[uncategorized] ~19-~19: “个”不能与“云”搭配,可改为:"每"一朵"云"
Context: ...计器,顺利生成资源模板,实现一键部署。 考虑到需要支持大量的云服务资源,同时每一个云服务资源需要配置的属性也是不一样的,因而采用传统开发方式,为每一种云服务资源开...

(wa5)


[uncategorized] ~68-~68: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:完备"地"插
Context: ...# 整体插件架构介绍 TinyEngine整体架构优秀之处在于,提供了一套完备的插件体系,包含了插件开发所有的基础UI库、工具库、插件面板的显示控制、生命周期管...

(wb4)


[uncategorized] ~74-~74: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:一定"地"开发
Context: ...或切换。 ### 遵循插件规范开发 TinyEngine插件开发需要遵循一定的开发规范,主要是文件规范与导出规范: * 文件规范,必须包含下面几个文件 `...

(wb4)


[uncategorized] ~121-~121: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:快速"地"完成
Context: ...具栏插件、导出插件、主题、属性配置插件、模板转换插件,微调整体设计器样式,就快速的完成了一个资源编排领域的图元编排设计器。 ​​![image](./imgs/...

(wb4)


[uncategorized] ~127-~127: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:优秀"地"插
Context: ...TinyEngine的基础引擎能力,快速搭建出PoC原型,再此基础上,利用其优秀的插件架构和提供的插件公共能力,添加业务相关插件,快速开发出一个领域定制的专属设计...

(wb4)

documents/tinyengine/practical-cases/pdm-metadata-approval-workflow.md

[uncategorized] ~13-~13: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:常用"地"审批
Context: ...完成。但是,所有类型的审批流大致相似。如:页面上常见的元素包括表单、表格以及常用的审批组件等。 技术分析:若采用传统的开发方式,每当新增一种流程时,前端开发人员...

(wb4)


[uncategorized] ~18-~18: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:完美"地"贯通
Context: ...续内容中详细介绍),以实现对审批流程人员编排。这样,前后端之间的连接就实现了完美的贯通。 PDM ### 技术实现细节 ...

(wb4)

documents/tinyengine/solutions/third-party-library-in-designer.md

[uncategorized] ~10-~10: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:进一步"地"解释
Context: ...ts、组件面板配置snippets。下面将在协议基础上对核心字段作进一步的解释,可以打开源码中物料资产包文件(packages\design-core\p...

(wb4)

documents/tinyengine/tutorials/issue-1-2023.10.27.md

[uncategorized] ~125-~125: 表示选择的疑问句中不能使用 “或者” ,请改用:"还是"。
Context: ...## 问题7:在使用 TinyEngine 低代码引擎时,组件内的静态资源(图片或者音频)如何引用? 答:这个问题要分多种情况讨论, - 设计器开发: 可以拉下...

(wb3)


[uncategorized] ~187-~187: 表示选择的疑问句中不能使用 “或者” ,请改用:"还是"。
Context: ...大家敬请期待 ### 问题4:TinyEngine 低代码引擎是否提供商业版本或者商业上的技术支持? 答:目前只有一个开源版本的代码,没有商业版本。至于商业技术...

(wb3)

🪛 markdownlint-cli2 (0.18.1)
documents/tinyengine/api/frontend-api/settings-panel-api.md

1-1: Hard tabs
Column: 12

(MD010, no-hard-tabs)

documents/tinyengine/api/backend-api/app-services.md

19-19: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


25-25: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


64-64: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


87-87: Multiple headings with the same content

(MD024, no-duplicate-heading)


96-96: Multiple headings with the same content

(MD024, no-duplicate-heading)


98-98: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


108-108: Multiple headings with the same content

(MD024, no-duplicate-heading)

documents/tinyengine/api/frontend-api/canvas-api.md

3-3: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3

(MD001, heading-increment)


7-7: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


25-25: Spaces inside code span elements

(MD038, no-space-in-code)


28-28: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


60-60: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


142-142: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

documents/tinyengine/api/backend-api/app-utility-management.md

18-18: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


24-24: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


63-63: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


69-69: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


110-110: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


144-144: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)

documents/tinyengine/api/backend-api/ai-function-api.md

21-21: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


27-27: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)

documents/tinyengine/advanced-features/new-ai-plugin-usage.md

146-146: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


157-157: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


168-168: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

documents/tinyengine/advanced-features/using-utils-methods.md

21-21: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


27-27: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)

documents/tinyengine/basic-features/internationalization.md

5-5: Multiple spaces after hash on atx style heading

(MD019, no-multiple-space-atx)

documents/tinyengine/development-getting-started/debugging-of-java-backend.md

26-26: Images should have alternate text (alt text)

(MD045, no-alt-text)


30-30: Images should have alternate text (alt text)

(MD045, no-alt-text)


36-36: Images should have alternate text (alt text)

(MD045, no-alt-text)


42-42: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


46-46: Images should have alternate text (alt text)

(MD045, no-alt-text)


48-48: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


52-52: Images should have alternate text (alt text)

(MD045, no-alt-text)


56-56: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


60-60: Images should have alternate text (alt text)

(MD045, no-alt-text)


74-74: Images should have alternate text (alt text)

(MD045, no-alt-text)


86-86: Images should have alternate text (alt text)

(MD045, no-alt-text)


90-90: Images should have alternate text (alt text)

(MD045, no-alt-text)


95-95: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


97-97: Images should have alternate text (alt text)

(MD045, no-alt-text)

documents/tinyengine/development-getting-started/dev-quick-start.md

90-90: Hard tabs
Column: 1

(MD010, no-hard-tabs)


124-124: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

documents/tinyengine/ecosystem-center/publish-other-ecosystems.md

1-1: Headings must start at the beginning of the line

(MD023, heading-start-left)

documents/tinyengine/extension-capabilities-tutorial/ai-plugin-configuration.md

9-9: Images should have alternate text (alt text)

(MD045, no-alt-text)


11-11: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


15-15: Images should have alternate text (alt text)

(MD045, no-alt-text)


21-21: Images should have alternate text (alt text)

(MD045, no-alt-text)


27-27: Images should have alternate text (alt text)

(MD045, no-alt-text)


30-30: Images should have alternate text (alt text)

(MD045, no-alt-text)


34-34: Images should have alternate text (alt text)

(MD045, no-alt-text)


40-40: Images should have alternate text (alt text)

(MD045, no-alt-text)


43-43: Images should have alternate text (alt text)

(MD045, no-alt-text)


46-46: Images should have alternate text (alt text)

(MD045, no-alt-text)


50-50: Images should have alternate text (alt text)

(MD045, no-alt-text)


54-54: Images should have alternate text (alt text)

(MD045, no-alt-text)


55-55: Images should have alternate text (alt text)

(MD045, no-alt-text)

documents/tinyengine/extension-capabilities-tutorial/how-to-custom-theme.md

13-13: Bare URL used

(MD034, no-bare-urls)

documents/tinyengine/solutions/block-release-solution.md

57-57: Spaces inside code span elements

(MD038, no-space-in-code)


61-61: Bare URL used

(MD034, no-bare-urls)


63-63: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


93-93: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


97-97: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


101-101: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


105-105: Code block style
Expected: fenced; Actual: indented

(MD046, code-block-style)


109-109: Code block style
Expected: fenced; Actual: indented

(MD046, code-block-style)


111-111: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


115-115: Code block style
Expected: fenced; Actual: indented

(MD046, code-block-style)


119-119: Code block style
Expected: fenced; Actual: indented

(MD046, code-block-style)

documents/tinyengine/tutorials/issue-1-2023.10.27.md

7-7: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3

(MD001, heading-increment)


175-175: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3

(MD001, heading-increment)


177-177: Bare URL used

(MD034, no-bare-urls)

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (1)
Dockerfile (1)

15-24: Guarantee /app/documents exists without relying on build artifacts.

COPY --from=build /app/documents /app/documents breaks the build whenever the source folder isn’t present (e.g., clean repo without bundled documents, .dockerignore exclusions). The runtime still requires the directory, so we need to create it explicitly instead of copying a possibly missing path.

Use:

-COPY --from=build /app/documents /app/documents
+RUN mkdir -p /app/documents

Keep the ENV pointing to /app/documents so the RAG ingestion code can still use the folder.

🧹 Nitpick comments (1)
docker-compose.yml (1)

21-29: Clean up Chroma volume wiring.

You define the chroma_data named volume but still bind-mount ./docker-deploy-data/chroma/data. Either switch the service to use the named volume or drop the unused declaration to avoid confusion.

If you prefer the named volume, apply:

-    volumes:
-      - ./docker-deploy-data/chroma/data:/data
+    volumes:
+      - chroma_data:/data
...
-volumes:
-  chroma_data:
+volumes:
+  chroma_data:

Also applies to: 58-59

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 316f90d and 592f754.

📒 Files selected for processing (3)
  • Dockerfile (1 hunks)
  • base/src/main/java/com/tinyengine/it/rag/entity/SearchRequest.java (1 hunks)
  • docker-compose.yml (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • base/src/main/java/com/tinyengine/it/rag/entity/SearchRequest.java

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
base/src/main/java/com/tinyengine/it/rag/config/RAGConfig.java (1)

19-21: Enhance JavaDoc with field descriptions.

The JavaDoc comment is minimal. Consider adding descriptions for each configuration field to improve maintainability and clarify the purpose of each setting.

Example enhancement:

 /**
- * RAG config
+ * Configuration properties for the RAG (Retrieval-Augmented Generation) subsystem.
+ * These properties can be overridden via application.properties/yml with the "rag." prefix.
+ *
+ * <p>Key configuration areas:
+ * <ul>
+ *   <li>Document processing: chunk size, overlap, result limits, score thresholds</li>
+ *   <li>Chroma vector store: connection URL, collection name, model paths</li>
+ *   <li>Connection management: timeouts, retries</li>
+ *   <li>Embedding: model selection, batch processing</li>
+ * </ul>
  */
 @Component
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 592f754 and 8bc8564.

📒 Files selected for processing (3)
  • Dockerfile (1 hunks)
  • base/src/main/java/com/tinyengine/it/rag/config/RAGConfig.java (1 hunks)
  • docker-compose.yml (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • Dockerfile
  • docker-compose.yml

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
base/src/main/java/com/tinyengine/it/service/app/impl/v1/AiChatV1ServiceImpl.java (1)

97-112: Harden baseUrl handling; prevent insecure schemes and SSRF vectors.

baseUrl is user-supplied; only protocol normalization occurs. Disallow http:// and validate targets (allowlist or block private/reserved IPs/hosts).

Minimal scheme guard:

     private String ensureUrlProtocol(String url) {
-        if (url.startsWith("http://") || url.startsWith("https://")) {
-            return url;
-        }
+        if (url.startsWith("http://")) {
+            throw new IllegalArgumentException("Insecure HTTP baseUrl is not allowed; use HTTPS.");
+        }
+        if (url.startsWith("https://")) {
+            return url;
+        }
         // 默认使用https
         return "https://" + url;
     }

Optionally, add host validation against a configured allowlist.

🧹 Nitpick comments (6)
base/src/main/java/com/tinyengine/it/service/app/impl/v1/AiChatV1ServiceImpl.java (5)

82-85: Add per-request timeout to avoid indefinite hangs.

Set a request timeout; connectTimeout alone isn’t sufficient.

 HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
-        .uri(URI.create(normalizedUrl))
+        .uri(URI.create(normalizedUrl))
+        .timeout(Duration.ofSeconds(config.getTimeoutSeconds()))
         .header("Content-Type", "application/json")
         .header("Authorization", "Bearer " + apiKey)
         .POST(HttpRequest.BodyPublishers.ofString(requestBody));

61-63: Reuse the shared HttpClient; avoid per-request client creation in streaming path.

Creating a new client per stream wastes resources and ignores configured timeouts.

-                HttpClient client = HttpClient.newHttpClient();
-                HttpResponse<InputStream> response = client.send(
+                HttpResponse<InputStream> response = httpClient.send(
                         requestBuilder.build(),
                         HttpResponse.BodyHandlers.ofInputStream()
                 );

Also consider a longer but finite timeout for streaming via requestBuilder.timeout(...).

Also applies to: 341-343


330-333: Handle non-2xx responses for standard calls.

Currently parses body without checking status.

-        HttpResponse<String> response = httpClient.send(
-                requestBuilder.build(), HttpResponse.BodyHandlers.ofString());
-        return JsonUtils.MAPPER.readTree(response.body());
+        HttpResponse<String> response = httpClient.send(
+                requestBuilder.build(), HttpResponse.BodyHandlers.ofString());
+        int sc = response.statusCode();
+        if (sc < 200 || sc >= 300) {
+            throw new IOException("API 请求失败: " + sc + " - " + response.body());
+        }
+        return JsonUtils.MAPPER.readTree(response.body());

213-218: Parse Status as Number to avoid false negatives.

Status might be Integer/Long/String. The current cast can default to 0.

-            long status = safeCastToLong(body.get("Status"));
+            Object statusObj = body.get("Status");
+            long status = (statusObj instanceof Number)
+                    ? ((Number) statusObj).longValue()
+                    : Long.parseLong(String.valueOf(statusObj));

245-277: Defensive typing for nodes list.

The method signature expects List<Map<String,Object>> but call site passes a raw List. Iterate defensively to avoid ClassCastException.

-    private List<NodeDto> convertToNodeDtos(List<Map<String, Object>> nodes) {
+    private List<NodeDto> convertToNodeDtos(List<Map<String, Object>> nodes) {
         List<NodeDto> nodeDtos = new ArrayList<>();
-
-        for (Map<String, Object> node : nodes) {
+        for (Object n : nodes) {
+            if (!(n instanceof Map)) {
+                log.warn("Unexpected node type: {}", n == null ? "null" : n.getClass());
+                continue;
+            }
+            Map<String, Object> node = (Map<String, Object>) n;
             try {
                 NodeDto nodeDto = new NodeDto();
                 // ...
base/src/main/java/com/tinyengine/it/model/dto/ChatRequest.java (1)

33-59: Prefer typed DTOs for complex options instead of Object.

Fields like streamOptions, responseFormat, toolChoice, searchOptions are Object. Define small POJOs to validate shape and aid schema evolution. This improves maintainability and avoids invalid payloads at runtime.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8bc8564 and bdaf93f.

📒 Files selected for processing (2)
  • base/src/main/java/com/tinyengine/it/model/dto/ChatRequest.java (2 hunks)
  • base/src/main/java/com/tinyengine/it/service/app/impl/v1/AiChatV1ServiceImpl.java (6 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
base/src/main/java/com/tinyengine/it/service/app/impl/v1/AiChatV1ServiceImpl.java (1)
base/src/main/java/com/tinyengine/it/common/utils/JsonUtils.java (1)
  • JsonUtils (45-349)

@hexqi hexqi merged commit 1470bb6 into opentiny:develop Oct 29, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants