Перевести исполнение сценариев на MCP workflow runner.
Удален legacy workflow_runner со stub-инструментами, добавлен mcp_client и новый mcp_workflow_runner с planner-моделью через polza.ai, обновлены сценарий, API/AgentOS wiring и документация под текущий контур запуска.
This commit is contained in:
@@ -1,14 +1,19 @@
|
||||
# Prisma Platform MVP
|
||||
|
||||
Минимальный чат-агент на Agno + Ollama с рантаймом AgentOS.
|
||||
MVP-реализация сценарного раннера на Agno AgentOS.
|
||||
|
||||
В этом проекте AgentOS работает как HTTP API сервер (FastAPI + Uvicorn).
|
||||
Текущая схема исполнения:
|
||||
|
||||
- сценарий хранится в `scenarios/*.json`;
|
||||
- исполнение идет через `src/mcp_workflow_runner.py`;
|
||||
- каждый шаг вызывает MCP инструмент через `src/mcp_client.py`;
|
||||
- для подготовки аргументов шага используется planner-агент с моделью через `polza.ai`.
|
||||
|
||||
## Требования
|
||||
|
||||
- Python 3.10+
|
||||
- Запущенный Ollama endpoint (по умолчанию: `http://localhost:11435`)
|
||||
- Доступная модель в Ollama (по умолчанию: `gemma4:31b`)
|
||||
- MCP endpoint (по умолчанию `http://127.0.0.1:8081/mcp`)
|
||||
- доступ к модели через `polza.ai` (`POLZA_API_KEY`)
|
||||
|
||||
## Текущая структура
|
||||
|
||||
@@ -26,11 +31,11 @@ prisma_platform/
|
||||
├── api_routes.py
|
||||
├── agent_os.py
|
||||
├── agent_runner.py
|
||||
├── mcp_client.py
|
||||
├── mcp_workflow_runner.py
|
||||
├── observability.py
|
||||
├── scenario_store.py
|
||||
├── schemas.py
|
||||
├── stub_tools.py
|
||||
└── workflow_runner.py
|
||||
└── schemas.py
|
||||
```
|
||||
|
||||
## Установка
|
||||
@@ -44,25 +49,32 @@ cp .env.example .env
|
||||
|
||||
## Запуск
|
||||
|
||||
Запуск сервера AgentOS:
|
||||
1) Поднимите MCP stub (из соседнего репозитория):
|
||||
|
||||
```bash
|
||||
python -m src.agent_os
|
||||
cd /home/worker/projects/docker-service/mcp-stub
|
||||
docker compose up --build -d
|
||||
```
|
||||
|
||||
По умолчанию AgentOS работает на `http://127.0.0.1:7777`.
|
||||
2) Запустите сервер AgentOS:
|
||||
|
||||
Документация API доступна по адресам:
|
||||
```bash
|
||||
cd /home/worker/projects/prisma_platform
|
||||
.venv/bin/python -m src.agent_os
|
||||
```
|
||||
|
||||
По умолчанию приложение доступно на `http://127.0.0.1:7777`.
|
||||
|
||||
Документация API:
|
||||
|
||||
- `http://127.0.0.1:7777/docs`
|
||||
- `http://127.0.0.1:7777/redoc`
|
||||
|
||||
Верхний слой сервиса реализован как кастомные FastAPI роуты (`src/api_routes.py`), подключенные через `AgentOS(base_app=...)`.
|
||||
|
||||
### Запуск сценария через HTTP
|
||||
## Запуск сценария через HTTP
|
||||
|
||||
- `POST http://127.0.0.1:7777/api/runs`
|
||||
- Тело запроса (JSON):
|
||||
|
||||
Тело запроса:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -73,10 +85,10 @@ python -m src.agent_os
|
||||
}
|
||||
```
|
||||
|
||||
Пример запроса:
|
||||
Пример:
|
||||
|
||||
```bash
|
||||
curl -X POST "http://127.0.0.1:7777/api/runs" \
|
||||
curl -s -X POST "http://127.0.0.1:7777/api/runs" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"scenario_id": "news_source_discovery_v1",
|
||||
@@ -86,106 +98,45 @@ curl -X POST "http://127.0.0.1:7777/api/runs" \
|
||||
}'
|
||||
```
|
||||
|
||||
Endpoint возвращает единый JSON-контракт. Поля одинаковые для `success` и `failed`,
|
||||
а в неактуальных полях приходит `null`.
|
||||
Успешный ответ содержит:
|
||||
|
||||
Пример успешного ответа:
|
||||
|
||||
```json
|
||||
{
|
||||
"scenario_id": "news_source_discovery_v1",
|
||||
"status": "success",
|
||||
"input": {
|
||||
"url": "https://example.com/news"
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"node_id": "search_news_sources",
|
||||
"status": "success",
|
||||
"started_at": "2026-04-22T10:00:00+00:00",
|
||||
"finished_at": "2026-04-22T10:00:00+00:00",
|
||||
"error": null
|
||||
}
|
||||
],
|
||||
"output_summary": "По заглушечным данным самым ранним источником считается https://news-a.example/article-1",
|
||||
"workflow_name": "news_source_discovery_v1",
|
||||
"scenario_name": "News Source Discovery V1",
|
||||
"result": {
|
||||
"tool_name": "generate_summary",
|
||||
"ok": true,
|
||||
"payload": {
|
||||
"input_count": 3,
|
||||
"summary": "По заглушечным данным самым ранним источником считается https://news-a.example/article-1"
|
||||
},
|
||||
"received_at": "2026-04-22T10:00:00+00:00"
|
||||
},
|
||||
"error": null,
|
||||
"run_id": "run_xxx",
|
||||
"session_id": "session_xxx"
|
||||
}
|
||||
```
|
||||
|
||||
Пример ответа с ошибкой валидации:
|
||||
|
||||
```json
|
||||
{
|
||||
"scenario_id": "news_source_discovery_v1",
|
||||
"status": "failed",
|
||||
"input": {},
|
||||
"steps": [
|
||||
{
|
||||
"node_id": "search_news_sources",
|
||||
"status": "queued",
|
||||
"started_at": null,
|
||||
"finished_at": null,
|
||||
"error": null
|
||||
}
|
||||
],
|
||||
"output_summary": null,
|
||||
"workflow_name": null,
|
||||
"scenario_name": "News Source Discovery V1",
|
||||
"result": null,
|
||||
"error": {
|
||||
"code": "invalid_input",
|
||||
"message": "Input does not match scenario input_schema: ..."
|
||||
},
|
||||
"run_id": null,
|
||||
"session_id": null
|
||||
}
|
||||
```
|
||||
|
||||
Проверка, что сервер поднят:
|
||||
|
||||
```bash
|
||||
curl -s "http://127.0.0.1:7777/docs" | grep -n "Swagger UI"
|
||||
```
|
||||
- `status=success`
|
||||
- список `steps` со статусами шагов
|
||||
- `output_summary`
|
||||
- `result` итогового шага
|
||||
|
||||
## Переменные окружения
|
||||
|
||||
Основные переменные:
|
||||
Основные:
|
||||
|
||||
- `AGENT_ID` (по умолчанию: `prisma-agent`)
|
||||
- `OLLAMA_MODEL_ID` (по умолчанию: `gemma4:31b`)
|
||||
- `OLLAMA_HOST` (по умолчанию: `http://localhost:11435`)
|
||||
- `OLLAMA_TEMPERATURE` (по умолчанию: `0`)
|
||||
- `AGENT_MARKDOWN` (по умолчанию: `false`)
|
||||
- `AGENT_DEBUG_MODE` (по умолчанию: `true`)
|
||||
- `AGENT_INSTRUCTIONS` (по умолчанию: `You are a helpful assistant. Answer briefly and clearly.`)
|
||||
- `AGENT_OS_HOST` (по умолчанию: `127.0.0.1`)
|
||||
- `AGENT_OS_PORT` (по умолчанию: `7777`)
|
||||
- `PHOENIX_TRACING_ENABLED` (по умолчанию: `false`)
|
||||
- `PHOENIX_COLLECTOR_ENDPOINT` (по умолчанию: `http://localhost:6006`)
|
||||
- `PHOENIX_PROJECT_NAME` (по умолчанию: `prisma-platform`)
|
||||
- `AGENT_ID` (default: `prisma-agent`)
|
||||
- `AGENT_MARKDOWN` (default: `false`)
|
||||
- `AGENT_DEBUG_MODE` (default: `true`)
|
||||
- `AGENT_INSTRUCTIONS`
|
||||
- `AGENT_OS_HOST` (default: `127.0.0.1`)
|
||||
- `AGENT_OS_PORT` (default: `7777`)
|
||||
|
||||
Planner-модель (`polza.ai`):
|
||||
|
||||
- `POLZA_BASE_URL` (default: `https://api.polza.ai/v1`)
|
||||
- `POLZA_MODEL_ID` (default: `google/gemma-4-31b-it`)
|
||||
- `POLZA_API_KEY` (required)
|
||||
- `POLZA_TEMPERATURE` (default: `0`)
|
||||
|
||||
MCP:
|
||||
|
||||
- `MCP_BASE_URL` (default: `http://127.0.0.1:8081/mcp`)
|
||||
- `MCP_TIMEOUT_SECONDS` (default: `10`)
|
||||
|
||||
Phoenix tracing:
|
||||
|
||||
- `PHOENIX_TRACING_ENABLED` (default: `false`)
|
||||
- `PHOENIX_COLLECTOR_ENDPOINT` (default: `http://localhost:6006`)
|
||||
- `PHOENIX_PROJECT_NAME` (default: `prisma-platform`)
|
||||
|
||||
## Phoenix трассировка (локально)
|
||||
|
||||
1. Установите зависимости:
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
2. Поднимите Phoenix (см. `docker-service/docker-compose.yml`) и включите трассировку в `.env`:
|
||||
1) Включите трассировку в `.env`:
|
||||
|
||||
```dotenv
|
||||
PHOENIX_TRACING_ENABLED=true
|
||||
@@ -193,5 +144,9 @@ PHOENIX_COLLECTOR_ENDPOINT=http://localhost:6006
|
||||
PHOENIX_PROJECT_NAME=prisma-platform
|
||||
```
|
||||
|
||||
3. Запустите приложение как обычно (`python -m src.agent_os`).
|
||||
2) Запустите приложение:
|
||||
|
||||
```bash
|
||||
.venv/bin/python -m src.agent_os
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user