在实际应用中，我们经常需要根据当前用户的 **身份（Role）或上下文（Context）** 动态分配工具集。例如：普通用户只能查询天气，而管理员可以调用系统重启工具。

Solon AI 提供了两种实现方式：Options 动态添加工具 和 AI Skill 封装工具。


### 1、通过 Options 动态添加工具

这种方式最为直接，适合简单的逻辑判断。你可以在每次发起 `prompt` 请求时，通过 `options` 配置项实时注入工具。

```java
ChatModel chatModel = ChatModel.of(...).model("...").build();

public void demo(String prompt, String role) {

     chatModel.prompt("今天杭州的天气情况？")
            .options(o -> {
                // 根据业务角色，动态注入不同的工具实例
                if("admin".equals(role)) { //在请求时添加（只能在请求时添加）
                    o.toolAdd(new UserTool());
                    o.toolAdd(new AdminTool());
                } else {
                    o.toolAdd(new UserTool());
                }
            }) //添加请求时选项处理
            .call();
}
```


* 优点：上手快，逻辑直观。
* 缺点：业务判断逻辑耦合在调用层，如果多处用到该逻辑，代码会比较冗余。

### 2、使用 Solon AI Skill 实现高级解耦（同等效果）

`AI Skill` 是对一组工具及其选择逻辑的更高维度封装。通过自定义 AI Skill，你可以将“根据角色筛选工具”的逻辑隐藏在组件内部，让调用端保持极致简洁。

更多内容请参考：[《Solon AI Skills 开发》](/article/learn-solon-ai-skills)

#### 第一步：定义 Skill

继承 AbsSkill 并实现 getTools 方法。你可以从 Prompt 的属性中获取上下文信息。

```java
public class AuthControlSkill extends AbsSkill {
    UserTool userTool =  new UserTool();
    AdminTool adminTool =  new AdminTool();
    
    @Override
    public Collection<FunctionTool> getTools(Prompt prompt) {
        // 从请求上下文中提取角色信息
        String role = prompt.attrAs("role");
        
         if("admin".eq(role)) {
             return Arrays.asList(userTool, adminTool);
          } else {
              return Arrays.asList(userTool);
          }
    }
}
```

#### 第二步：应用 Skill

你可以选择在 ChatModel 构建时全局挂载，或者在单次请求时按需挂载。

```java
//在构建时添加（或者在请求时添加）
ChatModel chatModel = ChatModel.of(...).model("...").defaultSkillAdd(new AuthControlSkill()).build();

public void demo(String prompt, String role) {
     // 调用端只需传递业务参数，无需关心工具过滤逻辑
     chatModel.prompt(Prompt.of("今天杭州的天气情况？").attrPut("role", role))
            //.options(o -> {
            //    o.toolAdd(new UserSkill()); //在请求时添加（或者在构建时添加）
            //}) 
            .call();
}
```



### 3、总结：如何选择？



| 维度 | Options 动态添加 | Solon AI Skill 封装 |
| -------- | -------- | -------- |
| 复用性     | 低，逻辑散落在各处     | 高，可作为独立组件复用     |
| 维护性     | 适合临时、简单的逻辑     | 适合复杂权限、多工具协作场景     |
| 代码感     | 过程式命令     | 声明式、面向对象     |







