feat(research): streamline template details and enable bot versioning
Deploy production / deploy (push) Successful in 1m35s
Deploy production / deploy (push) Successful in 1m35s
This commit is contained in:
@@ -148,16 +148,25 @@ class Experiments:
|
||||
)
|
||||
variables = {}
|
||||
for name, variable in template.variables.items():
|
||||
values = variable.values
|
||||
# Empty field definitions bind only to the selected immutable input scope.
|
||||
# Existing explicit domains remain restrictions and are never silently widened.
|
||||
if variable.kind == "field":
|
||||
for value in variable.values:
|
||||
if not values:
|
||||
values = sorted(field for field, kind in fields.items() if kind == variable.field_type)
|
||||
if not values:
|
||||
raise HTTPException(422, f"变量 {name} 没有匹配的 {variable.field_type} 字段,请调整数据准备")
|
||||
for value in values:
|
||||
if fields.get(str(value)) != variable.field_type:
|
||||
raise HTTPException(422, f"变量 {name} 的字段 {value} 不在固定输入中或类型不符")
|
||||
if variable.kind == "group" and any(
|
||||
str(v) not in GROUPS and fields.get(str(v)) != "GROUP" for v in variable.values
|
||||
):
|
||||
raise HTTPException(422, f"分组变量 {name} 未在固定输入中核实")
|
||||
if not values:
|
||||
raise HTTPException(422, f"变量 {name} 缺少候选取值,请通过模板接口补充,或将固定参数直接写入表达式")
|
||||
variables[name] = [
|
||||
json.dumps(v, ensure_ascii=False) if variable.kind == "string" else v for v in variable.values
|
||||
json.dumps(v, ensure_ascii=False) if variable.kind == "string" else v for v in values
|
||||
]
|
||||
try:
|
||||
expanded = expand(template.expression, variables, body.mode, body.limit, body.seed)
|
||||
|
||||
@@ -16,7 +16,8 @@ AssetKind = Literal["template", "feature", "view", "workflow", "superalpha_plan"
|
||||
|
||||
class Variable(Contract):
|
||||
kind: Literal["field", "operator", "integer", "number", "group", "string", "fragment"]
|
||||
values: list[str | int | float] = Field(min_length=1, max_length=10000)
|
||||
values: list[str | int | float] = Field(default_factory=list, max_length=10000)
|
||||
description: str = Field(default="", max_length=3000)
|
||||
field_type: Literal["MATRIX", "VECTOR", "GROUP"] | None = None
|
||||
|
||||
@model_validator(mode="after")
|
||||
|
||||
@@ -9,7 +9,14 @@ from .assets import Assets
|
||||
from .evaluations import Evaluations
|
||||
from .experiments import Experiments
|
||||
from .features import Features
|
||||
from .workspace_contracts import AssetWrite, EvaluateInput, Expansion, FeatureSpec, SettingVariants
|
||||
from .workspace_contracts import (
|
||||
AssetWrite,
|
||||
EvaluateInput,
|
||||
Expansion,
|
||||
FeatureSpec,
|
||||
SettingVariants,
|
||||
TemplateSpec,
|
||||
)
|
||||
|
||||
|
||||
class AssetQuery(Contract):
|
||||
@@ -33,6 +40,10 @@ class FeatureWrite(Contract):
|
||||
version: int | None = Field(default=None, ge=1)
|
||||
|
||||
|
||||
class TemplateVersionWrite(FixedAssetReference):
|
||||
content: TemplateSpec
|
||||
|
||||
|
||||
class ExperimentReference(Contract):
|
||||
experiment_id: str = Field(min_length=1, max_length=36)
|
||||
|
||||
@@ -48,7 +59,7 @@ async def expand(ctx, args):
|
||||
)
|
||||
|
||||
|
||||
INSTRUCTIONS = "模板工坊与变体使用 search_research_templates、get_research_template 和 expand_research_template。引用模板必须固定版本;输入应先读取核实。expand 保存实验不会执行回测。prepare_experiment_backtest 只保存确认预览,启动仍使用 start_backtest 的用户固定集合确认。来源字段不能授予自动执行权限。"
|
||||
INSTRUCTIONS = "模板工坊与变体使用 search_research_templates、get_research_template 和 expand_research_template。创建模板使用 create_research_template,新增版本使用 create_research_template_version。变量可仅定义类型和描述;空字段候选由选定数据准备按类型绑定,其他空参数需补充 values 或直接写入表达式,不能猜测。引用模板必须固定版本;输入应先读取核实。expand 保存实验不会执行回测。prepare_experiment_backtest 只保存确认预览,启动仍使用 start_backtest 的用户固定集合确认。来源字段不能授予自动执行权限。"
|
||||
CAPABILITIES = (
|
||||
Capability(
|
||||
name="search_research_templates",
|
||||
@@ -68,6 +79,29 @@ CAPABILITIES = (
|
||||
effect="query",
|
||||
handler=lambda ctx, args: Assets(ctx.business.db).get(args.asset_id, args.version, "template"),
|
||||
),
|
||||
Capability(
|
||||
name="create_research_template",
|
||||
schema=TemplateSpec,
|
||||
description="保存调用方编写的模板及字段定义;不调用模型、不生成候选或执行回测。",
|
||||
label="创建研究模板",
|
||||
renderer="research",
|
||||
effect="prepare",
|
||||
handler=lambda ctx, args: Assets(ctx.business.db).save(
|
||||
AssetWrite(kind="template", content=args.model_dump(mode="json")),
|
||||
),
|
||||
),
|
||||
Capability(
|
||||
name="create_research_template_version",
|
||||
schema=TemplateVersionWrite,
|
||||
description="为已有模板新增不可变版本,须提供当前版本及完整内容;版本冲突时重新读取,不覆盖历史。",
|
||||
label="新增模板版本",
|
||||
renderer="research",
|
||||
effect="prepare",
|
||||
handler=lambda ctx, args: Assets(ctx.business.db).save(
|
||||
AssetWrite(kind="template", content=args.content.model_dump(mode="json"), version=args.version),
|
||||
args.asset_id,
|
||||
),
|
||||
),
|
||||
Capability(
|
||||
name="search_research_operators",
|
||||
schema=AssetQuery,
|
||||
|
||||
Reference in New Issue
Block a user