feat: add versioned skill configuration

This commit is contained in:
hailin
2026-07-14 13:47:36 +08:00
parent 11bab3e98f
commit ed3f6e8516
13 changed files with 668 additions and 0 deletions

View File

@@ -0,0 +1,58 @@
import pytest
from apps.skills.models import SkillDefinition, SkillVersion
from apps.skills.services import (
SkillValidationError,
render_prompt,
validate_skill_version,
)
VALID_INPUT_SCHEMA = {
"type": "object",
"properties": {"problem": {"type": "string"}},
"required": ["problem"],
}
VALID_OUTPUT_SCHEMA = {
"type": "object",
"properties": {"summary": {"type": "string"}},
"required": ["summary"],
}
def make_version(**overrides):
definition = SkillDefinition.objects.create(code="summarize", name="问题摘要")
values = {
"definition": definition,
"version": 1,
"prompt_template": "请总结:{{ input.problem }}",
"input_schema": VALID_INPUT_SCHEMA,
"output_schema": VALID_OUTPUT_SCHEMA,
"example_input": {"problem": "无法登录"},
}
values.update(overrides)
return SkillVersion.objects.create(**values)
def test_validates_and_renders_restricted_template(db):
version = make_version()
validate_skill_version(version)
assert render_prompt(version.prompt_template, {"problem": "无法登录"}) == "请总结:无法登录"
def test_rejects_expression_or_missing_variable(db):
version = make_version(prompt_template="{{ steps.previous.output }}")
with pytest.raises(SkillValidationError, match="不允许的模板变量"):
validate_skill_version(version)
with pytest.raises(SkillValidationError, match="模板变量不存在"):
render_prompt("{{ input.environment }}", {"problem": "无法登录"})
def test_rejects_example_that_does_not_match_schema(db):
version = make_version(example_input={"problem": 123})
with pytest.raises(SkillValidationError, match="示例输入不符合"):
validate_skill_version(version)