FASTMCP中的Resources和Templates

部署运行你感兴趣的模型镜像

Resources = 给 MCP 客户端/LLM 读取的数据端点(只读、按 URI 索引、像“虚拟文件系统”或“HTTP GET”);
Templates = 可带参数的资源路由(URI 里占位符 → 运行函数动态生成内容)。

快速要点
• 用途:把文件、配置、数据库查询结果、运行时状态、动态生成的文本/JSON/二进制等,按需提供给 LLM(通过 resources/read 而不是塞进提示词里),减少 token 压力。
• 只读:资源的定位是“读取数据”。涉及改变状态/执行动作的,应该用 Tool(RPC)而不是 Resource。
• URI 是钥匙:@mcp.resource(“scheme://path”) 把函数注册为一个资源;客户端用这个 URI 来取数据。
• 动态/静态都行:
• 动态:用 @mcp.resource 装饰函数,读取时才执行(Lazy)。
• 静态:用 mcp.add_resource(TextResource/FileResource/DirectoryResource/HttpResource …) 直接挂现成内容或文件夹索引。
• 模板(Templates):URI 里写占位符(如 user://{name}、path://{filepath*}),请求时把路径参数传给函数,动态生成资源。
• 返回类型:str→text/plain,dict/list/model→自动 JSON,bytes→Blob(要给合适 mime_type),None→空内容。
• 元数据与提示:mime_type / tags / meta / annotations(readOnlyHint,idempotentHint) 用于客户端展示、缓存与安全提示(不强制,仅提示)。
• 启用/禁用:可在装饰器或运行时 enable()/disable();变更时会向客户端发 resources/list_changed 通知。
• 上下文:签名里加 ctx: Context 可拿到 request_id 等(做审计、多租户、鉴权等)。
• 错误处理:抛标准异常会被转为 MCP 错误;想隐藏细节可开 mask_error_details=True 或抛 ResourceError 精准控制对外消息。
• 重复注册策略:on_duplicate_resources 控制重复 URI 的处理(warn/error/replace/ignore)。

和 Tool/Prompt 的区别(记这个表就行)

能力 Resource Tool
语义 读取数据(GET) 执行动作/有副作用(POST/PUT/DELETE)
触发 resources/read tools/call
适合 文件/配置/查询结果/日志/监控视图 写库、发送消息、下单、触发流程
可参数化 通过 URI 模板 {param}/{param*} 通过函数参数(JSON-RPC)
缓存/幂等 天然适合缓存(idempotentHint) 需谨慎,可能有副作用

设计建议(结合你的场景)
• RAG/知识库:
• kb://doc/{id} 返回单文档;kb://search/{query} 返回检索结果(只读→Resource,若要写入索引→Tool)。
• 大结果可分页:kb://search/{query}?page=1&page_size=20(FastMCP 侧解析查询串或用 {page} 模板)。
• 短期记忆/Redis(只读视图):
• memory://session/{sid} 返回当前会话摘要;写入或清空记忆则走 Tool(如 memory.clear)。
• 监控/状态面板:
• status://app/current、metrics://{name},给 mime_type=“application/json”,加 annotations={“readOnlyHint”: true} 方便客户端缓存与展示。
• 文件系统/日志:
• file://…/DirectoryResource 暴露目录清单;敏感路径用 mask_error_details 或做白名单。
• 命名与稳定性:URI 要稳定可书签化(避免把会频繁变动的细节放进路径),必要时用 meta 携带版本等信息。
• 性能:昂贵的动态资源(例如深度检索)要么缓存、要么限制参数范围,并在 description 里写清语义,便于 LLM 正确选择。

小例子(动态模板 + 静态文件)

from fastmcp import FastMCP, Context
from fastmcp.resources import FileResource
from pathlib import Path

mcp = FastMCP(name="KB")

动态模板:会话记忆只读视图

@mcp.resource("memory://session/{sid}")
def session_view(sid: str, ctx: Context) -> dict:
    """Return chat memory snapshot for a session (read-only)."""
    return {"sid": sid, "summary": "...", "messages": []}

暴露 README.md 作为静态资源

readme = Path("./README.md").resolve()
if readme.exists():
    mcp.add_resource(FileResource(
        uri=f"file://{readme.as_posix()}",
        path=readme,
        name="Project README",
        mime_type="text/markdown",
        tags={"docs"}
    ))

记住:读 = Resource,写/动作 = Tool;固定 = 资源,带参数 = 模板。把需要“让 LLM 随取随用”的上下文做成资源 URI,客户端用 resources/list 发现、用 resources/read 获取,就能把大量上下文从提示词里“移出来”,按需加载、可缓存、更稳更省。

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

<think>好的,我现在需要帮助用户确认在RuoYi项目中HTML文件应该放在哪个目录下,并且如何正确显示。用户之前已经问过如何在RuoYi中添加HTML页面,现在他根据提供的引用材料,特别关注是否应该将HTML放在templates目录下,以及如何配置以确保显示正确。首先,回顾之前的回答,用户已经知道静态资源可以放在static或templates目录。但根据引用[1],templates目录用于存放需要模板引擎处理的页面,比如Thymeleaf、FreeMarker等,而static用于纯静态资源。RuoYi默认使用的是Thymeleaf吗?需要确认这一点。如果用户使用的是Thymeleaf,那么放在templates下是正确的,但可能需要控制器来映射访问路径。接下来,用户提供的引用[1]提到,如果使用JSP,可能需要放在webapp目录下,而templates可能不识别。但RuoYi通常基于SpringBoot,可能默认不支持JSP,而是使用Thymeleaf。所以用户的问题应该是关于Thymeleaf的情况。用户需要确保HTML文件放在templates目录下,并且通过控制器返回视图名称,这样Thymeleaf会自动解析。比如,在Controller中添加一个方法,返回"demo",对应templates/demo.html。同时,检查pom.xml是否有Thymeleaf依赖,如果没有,可能需要添加,如引用[3]提到的资源过滤问题,可能需要配置Maven的resources插件确保文件被正确打包。此外,用户之前的回答中提到菜单配置,需要将请求路径指向控制器映射的路径,而不是直接指向HTML文件。例如,请求路径设为/demo,对应Controller中的GetMapping("/demo"),返回视图名称。这才能正确通过Thymeleaf渲染页面。 还要注意权限配置,确保菜单项被正确分配,用户登录后有权访问。同时,如果遇到页面空白的问题,可能是路径错误或缓存问题,需要清理缓存或检查日志。综合以上,用户需要确认项目使用的模板引擎,正确放置HTML文件到templates,配置控制器,检查依赖资源过滤设置,以及正确设置菜单路径。这样HTML内容才能正确显示。</think>在RuoYi框架中,HTML文件放置在`src/main/resources/templates`目录下的正确配置及显示方法如下: --- ### 一、路径配置规范 1. **模板引擎依赖** RuoYi默认使用Thymeleaf模板引擎,需确保`pom.xml`包含以下依赖(若未配置可能无法渲染)[^1]: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> ``` 2. **目录结构要求** - 将HTML文件存放至: ```text src/main/resources/templates/[模块名]/xxx.html ``` - 示例:用户管理页面可放置于 ```text src/main/resources/templates/system/user.html ``` --- ### 二、控制器映射配置 1. **编写Controller方法** 在对应的Controller类中添加映射方法,返回逻辑视图名: ```java @Controller @RequestMapping("/system/user") public class UserController { @GetMapping("/customPage") public String customPage() { return "system/user"; // 自动指向templates/system/user.html } } ``` 2. **路径匹配规则** Thymeleaf默认视图解析规则为: $$ \text{前缀} + \text{视图名} + \text{后缀} = \text{classpath:/templates/} + \text{system/user} + \text{.html} $$ 无需手动配置路径拼接[^1] --- ### 三、菜单配置与访问 1. **后台菜单设置** - **菜单路径**:填写控制器映射路径`/system/user/customPage` - **目标类型**:选择`菜单项`(非iframe链接) - **权限标识**:需与`@RequiresPermissions`注解匹配[^2] 2. **访问验证** 登录后通过`http://localhost:80/system/user/customPage`访问页面 --- ### 四、常见问题处理 | 问题现象 | 解决方案 | |-------------------------|--------------------------------------------------------------------------| | 页面返回空白 | 检查HTML文件名与控制器返回值是否一致,清理浏览器缓存 | | 模板文件未加载 | 在`pom.xml`中添加资源过滤配置(参考引用[3]) | | 403权限错误 | 检查角色权限分配,确保`@RequiresPermissions`与菜单权限标识匹配 | | Thymeleaf标签未解析 | 在HTML文件头添加命名空间:`<html xmlns:th="http://www.thymeleaf.org">` | --- ### 五、特殊场景示例 **动态数据渲染** 在HTML中使用Thymeleaf语法接收后端数据: ```html <div th:text="${serverTime}"></div> ``` 对应控制器代码: ```java @GetMapping("/customPage") public String customPage(ModelMap model) { model.put("serverTime", LocalDateTime.now()); return "system/user"; } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MonkeyKing.sun

对你有帮助的话,可以打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值