feat: 按模型上下文自动配置智能体压缩阈值

- 从 llm.json 解析上下文与输出上限,并增强短模型 ID 匹配

- 切换模型、保存和试运行时按预算公式重算,目录缺失时回退 30K

- 修复模型列表接口未返回能力元数据
This commit is contained in:
2026-07-30 14:20:10 +08:00
parent 5f11219226
commit c78074a969
14 changed files with 410 additions and 23 deletions

View File

@@ -9,7 +9,6 @@ import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import tech.easyflow.ai.dto.ModelInvokeConfigDtos;
import tech.easyflow.ai.entity.Model;
import tech.easyflow.ai.entity.ModelProvider;
import tech.easyflow.ai.entity.table.ModelTableDef;
import tech.easyflow.ai.mapper.ModelMapper;
import tech.easyflow.ai.service.ModelService;
@@ -27,7 +26,6 @@ import java.math.BigInteger;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
/**
@@ -53,16 +51,7 @@ public class ModelController extends BaseCurdController<ModelService, Model> {
@GetMapping("list")
@SaCheckPermission("/api/v1/model/query")
public Result<List<Model>> list(Model entity, Boolean asTree, String sortKey, String sortType) {
QueryWrapper queryWrapper = QueryWrapper.create(entity, buildOperators(entity));
queryWrapper.orderBy(buildOrderBy(sortKey, sortType, getDefaultOrderBy()));
List<Model> list = Tree.tryToTree(modelMapper.selectListWithRelationsByQuery(queryWrapper), asTree);
list.forEach(item -> {
String providerName = Optional.ofNullable(item.getModelProvider())
.map(ModelProvider::getProviderName)
.orElse("-");
item.setTitle(providerName + "/" + item.getTitle());
});
return Result.ok(list);
return Result.ok(service.listSelectableModels(entity, asTree, sortKey, sortType));
}
@GetMapping("getList")

View File

@@ -0,0 +1,41 @@
package tech.easyflow.admin.controller.ai;
import org.testng.Assert;
import org.testng.annotations.Test;
import tech.easyflow.ai.entity.Model;
import tech.easyflow.ai.service.ModelService;
import tech.easyflow.common.domain.Result;
import java.util.List;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* 模型列表控制器测试。
*/
public class ModelControllerTest {
/**
* 验证模型列表使用包含目录能力元数据的服务查询。
*/
@Test
public void listShouldReturnCapabilityDecoratedModels() {
ModelService service = mock(ModelService.class);
Model query = new Model();
Model decoratedModel = new Model();
decoratedModel.setContextWindowTokens(1_000_000L);
decoratedModel.setMaxOutputTokens(64_000L);
when(service.listSelectableModels(query, false, "id", "desc"))
.thenReturn(List.of(decoratedModel));
ModelController controller = new ModelController(service);
Result<List<Model>> result = controller.list(query, false, "id", "desc");
Assert.assertSame(decoratedModel, result.getData().get(0));
Assert.assertEquals(Long.valueOf(1_000_000L),
result.getData().get(0).getContextWindowTokens());
verify(service).listSelectableModels(query, false, "id", "desc");
}
}