NextStatNextStat

Агентный анализ

Определения LLM-инструментов для AI-управляемой физики

NextStat предоставляет 31 операцию в 12+ статистических вертикалях как стандартизированные определения инструментов, совместимые с OpenAI function calling, LangChain и Model Context Protocol (MCP). Это позволяет AI-агентам — GPT-4o, Llama 4, Claude, локальным Ollama-моделям — обнаруживать и вызывать регрессию, survival-анализ, проверки гипотез, каузальный вывод, временные ряды и многое другое — программно.

Ключевая идея

Физик говорит: "Проверь, как меняется значимость, если убрать систематику JES, и построй график."Агент вызывает nextstat_fit, сравнивает до/после и строит график без написания скрипта.

Доступные инструменты

ИнструментОписание
HEP / HistFactory
nextstat_fitMLE-фит → bestfit параметры, неопределённости, NLL, сходимость
nextstat_hypotestАсимптотическая CLs-проверка гипотезы при заданном μ
nextstat_hypotest_toysCLs-проверка гипотезы на toy-экспериментах
nextstat_upper_limit95% CL верхний предел через CLs-скан
nextstat_rankingРанкинг влияния систематик (важность признаков)
nextstat_discovery_asymptoticЗначимость открытия Z₀ (тест только фона)
nextstat_scanСкан профильного правдоподобия по значениям μ
nextstat_workspace_auditАудит совместимости workspace
nextstat_read_root_histogramЧтение TH1-гистограммы из ROOT-файла
Регрессия и байесовские методы
nextstat_glm_fitGLM-фит (линейная, логистическая, Пуассон, NB) → коэффициенты, SE
nextstat_bayesian_sampleNUTS-семплинг для любой модели → постериор, ESS, R̂, диагностика
Survival и клиника
nextstat_survival_fitCox PH / Weibull / Log-Normal AFT / Exponential MLE-фит
nextstat_kaplan_meierКривая KM + опциональный log-rank тест
nextstat_competing_risksAalen–Johansen CIF, тест Грея, Fine–Gray регрессия
Эконометрика и каузальность
nextstat_panel_fePanel FE (within-оценка) с кластерными робастными SE
nextstat_didDifference-in-Differences (TWFE) → ATT с кластерными SE
nextstat_iv_2slsIV / 2SLS с диагностикой слабых инструментов
nextstat_event_studyДинамический DiD event study с лидами/лагами
nextstat_aipwДважды-робастный ATE/ATT (AIPW) с диагностикой propensity
Временные ряды и волатильность
nextstat_kalmanФильтр Калмана / сглаживание / прогноз
nextstat_garch_fitGARCH(1,1) / EGARCH / GJR-GARCH / стохастическая волатильность
nextstat_meta_analysisМета-анализ фиксированных/случайных эффектов с I², Q, τ²
nextstat_churn_retentionКривая удержания по данным tenure/event
nextstat_chain_ladderСтраховое резервирование (chain ladder / Mack)
Фарма и PK/PD
nextstat_pharma_fitПопуляционный PK-фит (FOCE/FOCEI/SAEM) для 1/2/3-камерных моделей
nextstat_pharma_vpcVisual Predictive Check — симуляция + диагностика
nextstat_trial_simulateМонте-Карло симуляция клинического исследования
nextstat_bioequivalenceABE (TOST) + RSABE с мощностью и размером выборки
nextstat_dose_responseEmax / Sigmoid-Emax моделирование доза-ответ
Надёжность
nextstat_fault_tree_mcДерево отказов — Монте-Карло (CPU/CUDA/Metal)
nextstat_fault_tree_ce_isДерево отказов — CE-IS importance sampling (p~1e-16)

OpenAI function calling

import json, openai
from nextstat.tools import get_toolkit, execute_tool

# 1. Получить определения инструментов (OpenAI-совместимый JSON Schema)
tools = get_toolkit()

# 2. Отправить их в модель
response = openai.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "user", "content": "Сфить этот workspace и скажи мне силу сигнала"},
    ],
    tools=tools,
)

# 3. Выполнить tool calls от агента
for call in response.choices[0].message.tool_calls:
    result = execute_tool(call.function.name, json.loads(call.function.arguments))
    print(json.dumps(result, indent=2))

Интеграция с LangChain

from nextstat.tools import get_langchain_tools
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain.agents import create_tool_calling_agent, AgentExecutor

tools = get_langchain_tools()  # list of StructuredTool
llm = ChatOpenAI(model="gpt-4o")

prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a HEP physicist assistant with NextStat tools."),
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}"),
])

agent = create_tool_calling_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools)

result = executor.invoke({
    "input": "Какова значимость открытия (Z₀) для этого workspace?"
})

MCP (Model Context Protocol)

Для MCP-based tool servers (Windsurf, Cursor, Claude Desktop):

from nextstat.tools import get_mcp_tools, handle_mcp_call

# Зарегистрировать инструменты на MCP-сервере
tools = get_mcp_tools()  # список {name, description, inputSchema}

# Обработать входящий вызов инструмента
result = handle_mcp_call("nextstat_fit", {"workspace_json": ws_str})

Локальные агенты (Ollama / vLLM)

Схемы инструментов работают с любой моделью, поддерживающей вызов инструментов (function calling). Для локальных моделей через Ollama или vLLM:

import json, requests
from nextstat.tools import get_toolkit, execute_tool

tools = get_toolkit()

# Ollama с вызовом инструментов (function calling)
response = requests.post("http://localhost:11434/api/chat", json={
    "model": "llama3.1",
    "messages": [{"role": "user", "content": "Сделай фит этого workspace"}],
    "tools": tools,
})

# Распарсить и выполнить
for call in response.json()["message"]["tool_calls"]:
    result = execute_tool(call["function"]["name"], call["function"]["arguments"])

Справка API

ФункцияВозвращает
get_toolkit()OpenAI-совместимые определения инструментов (список dict)
execute_tool(name, args)Выполнение вызова инструмента → JSON-сериализуемый dict
get_langchain_tools()Экземпляры LangChain StructuredTool
get_mcp_tools()MCP-совместимые определения инструментов
get_tool_names()Список имён доступных инструментов
get_tool_schema(name)JSON Schema для конкретного инструмента

Серверный режим (nextstat-server)

Если вы запускаете nextstat-server, агенты могут получать определения инструментов и выполнять их через HTTP, без импорта Python:

  • Реестр tools: GET /v1/tools/schema
  • Выполнение инструмента: POST /v1/tools/execute
from nextstat.tools import get_toolkit, execute_tool

server_url = "http://127.0.0.1:3742"
tools = get_toolkit(transport="server", server_url=server_url)

out = execute_tool(
    "nextstat_hypotest",
    {"workspace_json": "...", "mu": 1.0, "execution": {"deterministic": True}},
    transport="server",
    server_url=server_url,
)
# server_url можно задать через переменную окружения NEXTSTAT_SERVER_URL
# fallback_to_local=False отключает локальный fallback

Полная документация сервера: сервер NextStat.