Агентный анализ
Определения LLM-инструментов для AI-управляемой физики
NextStat предоставляет свои основные операции как стандартизированные определения инструментов, совместимые с OpenAI function calling, LangChain и Model Context Protocol (MCP). Это позволяет AI-агентам — GPT-4o, Llama 4, Claude, локальным Ollama-моделям — обнаруживать и вызывать статистические фиты, проверки гипотез и ranking plots программно.
Ключевая идея
Физик говорит: "Проверь, как меняется значимость, если убрать систематику JES, и построй график."Агент вызывает nextstat_fit, сравнивает до/после и строит график без написания скрипта.
Доступные инструменты
| Инструмент | Описание |
|---|---|
| nextstat_fit | MLE-фит → bestfit параметры, неопределенности, NLL, статус сходимости |
| nextstat_hypotest | Асимптотическая CLs-проверка гипотезы при заданном μ |
| nextstat_upper_limit | 95% 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.
