-
Notifications
You must be signed in to change notification settings - Fork 70
feat: add rag API #270
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: add rag API #270
Conversation
WalkthroughThis 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
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>
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>>
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Areas requiring extra attention:
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro 📒 Files selected for processing (5)
💤 Files with no reviewable changes (2)
🚧 Files skipped from review as they are similar to previous changes (1)
🧰 Additional context used🧬 Code graph analysis (1)base/src/main/java/com/tinyengine/it/service/app/impl/v1/AiChatV1ServiceImpl.java (1)
🔇 Additional comments (2)
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. Comment |
There was a problem hiding this 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@RequestBodyannotation instead of@Parameterfor request bodies.The
@Parameterannotation 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.RequestBodyfor 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@RequestBodyannotation instead of@Parameterfor request bodies.Same issue as in
createAppExtension: the@Parameterannotation at Line 139 incorrectly documents a request body. Use@io.swagger.v3.oas.annotations.parameters.RequestBodyinstead.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: ApproveBatchResultimplementation – no lingeringNodeDtoreferences found. Optionally, enrich the class Javadoc to describesuccessCountanderrorCount.base/src/main/java/com/tinyengine/it/controller/AppExtensionController.java (1)
90-108: Improve parameter documentation for clarity.The
@Parameterannotation documents a genericmapparameter, which doesn't help API consumers understand what query parameters to provide. Based on the implementation (Lines 103-105), the endpoint expectsapp,name, andcategoryquery 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:
- 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; }
- Add field-level JavaDoc to clarify the purpose and constraints of each field, especially whether
documentSetIdis 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-stoppedensures 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
--workersbased on expected trafficbase/src/main/java/com/tinyengine/it/rag/entity/VectorDocument.java (3)
22-24: Consider removing @AllArgsConstructor to avoid confusion.The class declares
@AllArgsConstructorbut 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@AllArgsConstructorand 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
statusfield 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
documentSetIdfrom metadata, but unlikecollectionandsource, it's not set as a top-level field in the DTO—only added to the metadata map on line 87. IfdocumentSetIdis frequently accessed, consider adding it as a field similar tocollectionandsource.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
testChromaConnectioninstantiates a freshOkHttpClienton 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
⛔ Files ignored due to path filters (1)
__pycache__/chromadb.cpython-313.pycis 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 inSystemServiceLog.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 inSystemControllerLog.javaand maintains consistency across logging annotations.app/src/main/java/com/tinyengine/it/task/DatabaseCleanupService.java (2)
33-33: LGTM! Proper constant naming convention.Renaming
formattertoFORMATTERfollows Java naming conventions for static final constants.
76-76: LGTM! Correct literal type for long variable.Using
0Linstead of0is the correct literal type for thelongvariabletotalRowsCleaned.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
ServiceExceptionwith standardized error codes (CM309) across thumbnail generation failures.
102-102: LGTM! Consistent exception handling upgrade.Replacing
RuntimeExceptionwithServiceException(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_8explicitly for decoding SVG content is correct and clearer than relying on platform defaults.
205-207: LGTM! Null safety improvement.Adding a null check for
inputpreventsNullPointerExceptionand returns a safe default empty string.pom.xml (3)
36-36: LGTM! Property naming convention improved.Renaming
netty-buffer-versiontonetty-buffer.versionfollows 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=trueflag 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
DeleteResultclass provides a clear data structure for tracking deletion operations with success/failure counts and target identification. The Lombok@Dataannotation generates all necessary boilerplate.base/src/main/java/com/tinyengine/it/rag/entity/BatchDeleteResult.java (1)
1-35: LGTM! Batch result aggregation.The
BatchDeleteResultclass appropriately aggregates multipleDeleteResultinstances 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 formatch.embedded()andmetadata, preventingNullPointerExceptionand providing sensible defaults.
67-67: Verify createTime timestamp source.EmbeddingMatchDto#setCreateTimeusesLocalDateTime.now(), capturing conversion time rather than the original match creation. I couldn’t locate a timestamp on eitherEmbeddingMatchorTextSegment—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
ApachePdfBoxDocumentParserwraps PDFBox resources; leaving it unclosed risks file descriptor leaks. Use try-with-resources around the parser (e.g., viaFileSystemDocumentLoader.loadDocument(filePath, new ApachePdfBoxDocumentParser())) or ensuredocument.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
initializeKnowledgeBasewraps any exception in CM330, which masks specificServiceExceptioncodes/messages set deeper in the stack (e.g., loadDocuments’ CM329). Only wrap unexpected exceptions; rethrowServiceExceptionas-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
deleteByFilePathtakesfilePathandcollectionas plain@RequestParamstrings withoutrequired = trueor validation. If the client omits them, Spring will passnull, the service throws, and the user gets a 500 instead of a clear 400. Mark both params as required (the default) and add@NotBlankor 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.
base/src/main/java/com/tinyengine/it/controller/AiChatController.java
Outdated
Show resolved
Hide resolved
base/src/main/java/com/tinyengine/it/controller/AppExtensionController.java
Show resolved
Hide resolved
base/src/main/java/com/tinyengine/it/controller/AppExtensionController.java
Show resolved
Hide resolved
base/src/main/java/com/tinyengine/it/controller/VectorStorageController.java
Show resolved
Hide resolved
base/src/main/java/com/tinyengine/it/controller/VectorStorageController.java
Show resolved
Hide resolved
base/src/main/java/com/tinyengine/it/rag/service/StorageService.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this 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
@RequestBodylack@Validannotations. WhiledeleteMultipleFilesvalidates its list, the other endpoints (create,createInCollection,searchInCollection,searchAllCollections) don't enforce constraints on their payloads. Adding@Validand field-level validations (e.g.,@NotEmptyfor lists,@NotBlankfor strings inSearchRequest) 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@RequestParamfields (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
📒 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
@PostMappinginstead of@GetMapping, allowing the@RequestBodyto be properly handled.
222-226: Past issue resolved: input validation added.The
@NotEmptyannotations on both the list and its elements now guard against invalid input.
base/src/main/java/com/tinyengine/it/controller/VectorStorageController.java
Show resolved
Hide resolved
base/src/main/java/com/tinyengine/it/service/app/impl/v1/AiChatV1ServiceImpl.java
Show resolved
Hide resolved
There was a problem hiding this 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
📒 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
There was a problem hiding this 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
There was a problem hiding this 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...
documents/tinyengine/advanced-features/integrating-chatgpt-for-simple-pages.md
Outdated
Show resolved
Hide resolved
documents/tinyengine/solutions/third-party-library-in-designer.md
Outdated
Show resolved
Hide resolved
documents/tinyengine/solutions/third-party-library-in-designer.md
Outdated
Show resolved
Hide resolved
documents/tinyengine/solutions/third-party-library-in-designer.md
Outdated
Show resolved
Hide resolved
documents/tinyengine/solutions/third-party-library-in-designer.md
Outdated
Show resolved
Hide resolved
There was a problem hiding this 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
generateCodecall 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 DELETEDocumenting a destructive operation as
GET /app-center/api/apps/extension/deleteviolates HTTP safety/idempotency expectations and exposes the API to browser prefetching and CSRF risks. Please align the doc (and endpoint) with aDELETEverb 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:** DELETEdocuments/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 existBoth 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/ donedocuments/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 atdocuments/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 (underdocuments/tinyengine/advanced-features/imgs/) or update the paths. While you’re there, replace the filename-style alt text with meaningful descriptions for accessibility/SEO.- + @@ - + @@ - + @@ - + @@ - +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/developno longer exists; the current active branch isdevelop. Update the cloning guidance accordingly to avoid broken setup steps.documents/tinyengine/solutions/canvas-communication-solution.md (2)
9-14: Confirm image asset paths renderPlease double-check that
./imgs/origin-canvas-communication.pngand./imgs/new-canvas-communication.pngactually exist underdocuments/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 JSThe snippet still uses
{ ... }placeholders and the literalboolean, 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
importMapLocalConfigwithout 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.jswhile 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 (underdocuments/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 inThis 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
/filesendpoints require a concrete version or tag; semver ranges like^3will 404. Update the example to show a real version (orlatest) 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 JSONThe 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 tojsonc) 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:** DELETEdocuments/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 属性名与示例不一致示例属性为
placeholder和size,但 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“出来编辑面板”、
Vue3、setUp、以及图片 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, andpageManaHistoryRestore.pngare still absent underdocuments/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 donedocuments/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, andpreview.pngare 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 donedocuments/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.pngand./imgs/nginxcof.pngare still missing, so the doc renders broken images. Add the assets (or correct the paths) underdocuments/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 donedocuments/tinyengine/development-getting-started/debugging-of-java-backend.md (3)
26-97: Commit all referenced screenshots before merging.
./imgs/java-debugging-image33.pngthroughjava-debugging-image42.pngare 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.ymlonly applies whenSPRING_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 tohttp://localhost:9090/swagger-ui.html.documents/tinyengine/api/frontend-api/canvas-api.md (2)
60-135: Fix delegated method descriptions & add fence language.
getContext/getGlobalStatestill claim to callrender.setDataSourceMap, andgetDocumentkeeps thecontentDcocumenttypo. 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
setPagecssinstead ofsetPageCss. 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 aconstredeclaration 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
MD010and 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: AligngetSharedOptionsdefinition 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 blocksMarkdown 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:latestmakes 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
📒 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: ...发布之后,我们在物料面板拖出区块到画布中,选中我们拖出的区块,右侧属性面板的属性即是我们定义的暴露属性 
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 的文档 
[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工具管理 
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 开发调试插件 重新打开项目页面,可以看到侧边栏多了一个新的插件: 
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: ...具栏插件、导出插件、主题、属性配置插件、模板转换插件,微调整体设计器样式,就快速的完成了一个资源编排领域的图元编排设计器。 
[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: ...续内容中详细介绍),以实现对审批流程人员编排。这样,前后端之间的连接就实现了完美的贯通。
### 技术实现细节 ...
(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)
documents/tinyengine/about-applications/create-application-blank-or-template.md
Outdated
Show resolved
Hide resolved
documents/tinyengine/about-applications/create-application-blank-or-template.md
Outdated
Show resolved
Hide resolved
documents/tinyengine/about-materials/create-material-asset-package.md
Outdated
Show resolved
Hide resolved
documents/tinyengine/advanced-features/data-source-and-collection-usage.md
Outdated
Show resolved
Hide resolved
documents/tinyengine/extension-capabilities-tutorial/develop-configurator-components.md
Outdated
Show resolved
Hide resolved
documents/tinyengine/extension-capabilities-tutorial/mcpService.md
Outdated
Show resolved
Hide resolved
documents/tinyengine/practical-cases/graphical-element-arrangement-designer.md
Outdated
Show resolved
Hide resolved
There was a problem hiding this 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/documentsexists without relying on build artifacts.
COPY --from=build /app/documents /app/documentsbreaks the build whenever the source folder isn’t present (e.g., clean repo without bundled documents,.dockerignoreexclusions). 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/documentsKeep the ENV pointing to
/app/documentsso 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_datanamed 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
📒 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
There was a problem hiding this 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
📒 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
There was a problem hiding this 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
📒 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)
English | 简体中文
PR
PR Checklist
Please check if your PR fulfills the following requirements:
PR Type
What kind of change does this PR introduce?
Background and solution
What is the current behavior?
Issue Number: N/A
What is the new behavior?
Does this PR introduce a breaking change?
Other information
Summary by CodeRabbit
New Features
Infrastructure
Removals