:Resources 和 Prompts 进阶——动态数据、参数化 URI 与多轮模板)
Resources 和 Tools 的本质区别第 04 篇主要演示了 Tools。Resources 和 Tools 的分工需要先说清楚:Tools → LLM 主动执行的操作(动词) LLM 决定什么时候调用,调用会产生副作用 示例:create_issue、update_status Resources → LLM 可读取的数据(名词) Host 决定何时注入到上下文,只读,无副作用 示例:当前 Sprint 状态、项目统计"读取某个状态"用 Resource,"执行某个操作"用 Tool。同一个数据可以两种都实现:get_issue作为 Tool(LLM 控制何时调用),jira://issue/PROJ-101作为 Resource(Host 在需要时自动注入)。模式 1:动态 ResourceStatic Resource 每次返回相同的数据(如项目列表)。Dynamic Resource 每次读取返回当前最新状态,内容随时间变化。Sprint 状态资源:每次读取都是实时数据_sprint_progress_pct=65# 模拟随时间推进的进度@server.read_resource()# type: ignore[arg-type]asyncdefread_resource(uri:str)-str:ifstr(uri)=="jira://sprint/current":global_sprint_progress_pct _sprint_progress_pct=min(100,_sprint_progress_pct+random.randint(0,3))returnjson.dumps({"sprint_name":"Sprint 42","progress_pct":_sprint_progress_pct,# ← 每次不同"last_updated":datetime.now(timezone.utc).isoformat(),# ← 时间戳变化"days_remaining":5,"p0_open":count_p0_open(),# ← 随 issue 状态变化},indent=2)测试结果:Read 1: progress=65% last_updated=...62+00:00 Read 2: progress=67% last_updated=...04+00:00 → ✓ data changed between readsDynamic Resource 让 LLM 始终读到最新数据,适合监控类信息(Sprint 健康、队列深度、服务状态)。把这类数据硬编码在 Prompt 里,LLM 会用过时的数据做决策。Resource 描述里标注动态性,LLM 就知道何时需要重读:Resource(uri="jira://sprint/current",name="Current Sprint Status",description=("Live status of the active sprint: progress, issue counts. ""Read this when the user asks about sprint health or velocity. ""Re-read if you need up-to-date data — content changes over time."# ↑ 明确告知 LLM 这是动态数据,必要时重新读取),)模式 2:参数化 URI一种 Resource 类型对应多个具体实例时,用参数化 URI——list_resources()枚举所有实例,read_resource()用一个 handler 处理所有。每个项目有自己的统计资源:@server