package com.iailab.module.ai.service.model.tool; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.annotation.JsonClassDescription; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyDescription; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.stereotype.Component; import java.io.File; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.function.Function; import static cn.hutool.core.date.DatePattern.NORM_DATETIME_PATTERN; import static com.iailab.framework.common.util.collection.CollectionUtils.convertList; /** * 工具:列出指定目录的文件列表 * * @author Iailab */ @Component("directory_list") public class DirectoryListToolFunction implements Function { @Data @JsonClassDescription("列出指定目录的文件列表") public static class Request { /** * 目录路径 */ @JsonProperty(required = true, value = "path") @JsonPropertyDescription("目录路径,例如说:/Users/yunai") private String path; } @Data @AllArgsConstructor @NoArgsConstructor public static class Response { /** * 文件列表 */ private List files; @Data public static class File { /** * 是否为目录 */ private Boolean directory; /** * 名称 */ private String name; /** * 大小,仅对文件有效 */ private String size; /** * 最后修改时间 */ private String lastModified; } } @Override public Response apply(Request request) { // 校验目录存在 String path = StrUtil.blankToDefault(request.getPath(), "/"); if (!FileUtil.exist(path) || !FileUtil.isDirectory(path)) { return new Response(Collections.emptyList()); } // 列出目录 File[] files = FileUtil.ls(path); if (ArrayUtil.isEmpty(files)) { return new Response(Collections.emptyList()); } return new Response(convertList(Arrays.asList(files), file -> new Response.File().setDirectory(file.isDirectory()).setName(file.getName()) .setLastModified(LocalDateTimeUtil.format(LocalDateTimeUtil.of(file.lastModified()), NORM_DATETIME_PATTERN)))); } }