最佳实践
本文档总结了使用 agent_skills 协议开发技能时的最佳实践和推荐做法,帮助开发者构建高质量、可维护的技能系统。
技能设计最佳实践
1. 清晰的技能定义
推荐做法:
- 提供清晰、准确的技能名称和描述
- 详细说明输入输出参数
- 使用标准的 JSON Schema 定义数据结构
- 提供使用示例
# ✅ 好的示例
skill_definition = {
"skill_id": "text-sentiment-analysis",
"name": "文本情感分析",
"description": "分析文本的情感倾向,返回正面、负面或中性的概率分布。支持中文和英文文本。",
"input_schema": {
"type": "object",
"properties": {
"text": {
"type": "string",
"description": "待分析的文本内容,长度建议在 1000 字符以内",
"minLength": 1,
"maxLength": 10000
},
"language": {
"type": "string",
"description": "文本语言代码,支持 'zh'(中文)和 'en'(英文)",
"enum": ["zh", "en"],
"default": "zh"
}
},
"required": ["text"]
},
"output_schema": {
"type": "object",
"properties": {
"sentiment": {
"type": "string",
"enum": ["positive", "negative", "neutral"],
"description": "情感倾向"
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "置信度分数"
}
}
}
}
# ❌ 不好的示例
bad_skill_definition = {
"skill_id": "analyze",
"name": "分析",
"description": "分析文本",
# 缺少详细的输入输出定义
}
2. 单一职责原则
推荐做法:
- 每个技能应该专注于单一功能
- 避免创建"万能"技能
- 将复杂功能拆分为多个简单技能
# ✅ 好的做法:拆分为多个专门技能
skills = [
{"skill_id": "text-preprocessing", "name": "文本预处理"},
{"skill_id": "text-sentiment-analysis", "name": "情感分析"},
{"skill_id": "text-summarization", "name": "文本摘要"}
]
# ❌ 不好的做法:一个技能做所有事情
bad_skill = {
"skill_id": "text-processor",
"name": "文本处理器",
# 包含预处理、情感分析、摘要等多个功能
}
3. 版本管理
推荐做法:
- 使用语义化版本号(Semantic Versioning)
- 提供版本迁移指南
- 保持向后兼容性
- 明确标记废弃版本
# 语义化版本:主版本号.次版本号.修订号
version = "1.2.3" # 主版本:不兼容的 API 修改
# 次版本:向后兼容的功能新增
# 修订号:向后兼容的问题修复
# 版本兼容性声明
skill_definition = {
"version": "2.0.0",
"backward_compatible": False, # 不向后兼容
"migration_guide": "https://docs.example.com/migration-v2",
"deprecated_versions": ["1.x.x"]
}
实现最佳实践
1. 输入验证
推荐做法:
- 始终验证输入参数
- 提供清晰的错误消息
- 处理边界情况
def process_skill(input_data: dict) -> dict:
# ✅ 好的做法:完整的输入验证
if "text" not in input_data:
raise ValueError("缺少必需参数: text")
text = input_data["text"]
if not isinstance(text, str):
raise TypeError("参数 'text' 必须是字符串类型")
if len(text.strip()) == 0:
raise ValueError("参数 'text' 不能为空")
if len(text) > 10000:
raise ValueError("参数 'text' 长度不能超过 10000 字符")
# 处理逻辑
return process(text)
2. 错误处理
推荐做法:
- 使用标准的错误代码
- 提供详细的错误信息
- 区分可恢复和不可恢复的错误
class SkillError(Exception):
"""技能基础错误类"""
def __init__(self, code: str, message: str, details: dict = None):
self.code = code
self.message = message
self.details = details or {}
super().__init__(self.message)
class InvalidInputError(SkillError):
"""输入验证错误"""
pass
class ProcessingError(SkillError):
"""处理过程错误"""
pass
def process_skill(input_data: dict) -> dict:
try:
# 验证输入
validate_input(input_data)
# 处理逻辑
result = do_processing(input_data)
return {"success": True, "result": result}
except InvalidInputError as e:
# 可恢复的错误
return {
"success": False,
"error": {
"code": e.code,
"message": e.message,
"details": e.details
}
}
except Exception as e:
# 不可恢复的错误
logger.error(f"技能处理失败: {e}", exc_info=True)
return {
"success": False,
"error": {
"code": "INTERNAL_ERROR",
"message": "处理过程中发生内部错误"
}
}