"""Domain-owned AI capabilities; caller owns authorization and transactions.""" from pydantic import Field from ..ai.alpha_tools import AlphaArgs from ..ai.capabilities import Capability from ..preparations.service import Preparations from ..schemas import Contract from .contracts import ChatboxResearchInput, InputPageArgs, ResearchInputSelection, ResearchPreviewInput class AlphaSourcesArgs(AlphaArgs): limit: int = Field(default=25, ge=1, le=100) offset: int = Field(default=0, ge=0) async def prepare(ctx, args): return await ctx.business.research_builder.prepare(ResearchPreviewInput(**args.model_dump())) INSTRUCTIONS = "研究先用 search_data_preparations 查询可编辑集合,读取集合 ID 与 version 后使用 prepare_research_input 固定输入。已有快照使用 get_research_input。所有研究来源保留独立快照,删除集合不影响已有研究。构建回测需明确假设、字段绑定和范围;VECTOR 必须显式处理,不能当作 MATRIX。直接表达式回测不声明数据准备来源。" class PreparationSearch(Contract): q: str = Field(default="", max_length=300) scope_key: str | None = None limit: int = Field(default=25, ge=1, le=100) offset: int = Field(default=0, ge=0) CAPABILITIES = ( Capability(name="search_data_preparations", schema=PreparationSearch, description="分页搜索数据准备集合,返回 ID、version、范围与字段数;非空集合可固定为研究输入。", label="查询数据准备", renderer="catalog", effect="query", handler=lambda ctx, args: Preparations(ctx.business.db).list(**args.model_dump())), Capability( name="prepare_research_input", schema=ResearchInputSelection, description="将数据准备集合的明确 ID 和 version 固定为研究快照,保留完整字段与数据集归属。已有快照直接读取。", label="固定研究输入", renderer="catalog", effect="prepare", handler=lambda ctx, args: ctx.business.research_builder.select_input(args), refresh=("datasets",), ), Capability( name="get_research_input", schema=InputPageArgs, description="分页读取不可变研究输入及原版本字段说明。q 仅搜索字段 ID,类型筛选不改变输入。field_count 是输入总数,total 是筛选匹配数。", label="读取固定研究输入", renderer="catalog", effect="query", handler=lambda ctx, args: ctx.business.research_builder.input_page(**args.model_dump()), ), Capability( name="prepare_research_backtest", schema=ChatboxResearchInput, description="从研究输入快照构建固定回测预览:提供假设、候选模板(如 rank({price}))、具名字段绑定及真实类型、明确模拟参数。服务端校验归属/类型/范围并替换占位符;不验证算子语义、不自动聚合 VECTOR。来源由服务端标记为当前 chatbox 研究。", label="构建研究候选与预览", renderer="backtest", effect="prepare", handler=prepare, refresh=("backtests",), ), Capability( name="get_alpha_sources", schema=AlphaSourcesArgs, description="分页读取 Alpha 的全部已保存研究来源、关联回测、聊天会话和输入快照。没有记录不推断来源。", label="查询 Alpha 研究来源", renderer="catalog", effect="query", handler=lambda ctx, args: ctx.business.get_alpha_sources(**args.model_dump()), ), )