NextStatNextStat

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

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

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

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

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

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

ИнструментОписание
nextstat_fitMLE-фит → bestfit параметры, неопределенности, NLL, статус сходимости
nextstat_hypotestАсимптотическая CLs-проверка гипотезы при заданном μ
nextstat_upper_limit95% CL верхний предел через CLs-скан
nextstat_rankingРанкинг влияния систематик (важность признаков)
nextstat_significanceЗначимость открытия Z₀ (тест только фона)
nextstat_scanСкан профильного правдоподобия по значениям μ
nextstat_workspace_auditАудит совместимости workspace

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.