93ee7aea1c
Введен единый JSON-контракт для success/failed с общими полями, добавлен трекинг step status (queued/running/success/failed) и output_summary, а сборка run-ответа централизована через общий helper.
198 lines
5.3 KiB
Markdown
198 lines
5.3 KiB
Markdown
# Prisma Platform MVP
|
||
|
||
Минимальный чат-агент на Agno + Ollama с рантаймом AgentOS.
|
||
|
||
В этом проекте AgentOS работает как HTTP API сервер (FastAPI + Uvicorn).
|
||
|
||
## Требования
|
||
|
||
- Python 3.10+
|
||
- Запущенный Ollama endpoint (по умолчанию: `http://localhost:11435`)
|
||
- Доступная модель в Ollama (по умолчанию: `gemma4:31b`)
|
||
|
||
## Текущая структура
|
||
|
||
```text
|
||
prisma_platform/
|
||
├── .env
|
||
├── .env.example
|
||
├── requirements.txt
|
||
├── scenarios/
|
||
│ ├── index.json
|
||
│ └── news_source_discovery/
|
||
│ └── v1.json
|
||
└── src/
|
||
├── __init__.py
|
||
├── api_routes.py
|
||
├── agent_os.py
|
||
├── agent_runner.py
|
||
├── observability.py
|
||
├── scenario_store.py
|
||
├── schemas.py
|
||
├── stub_tools.py
|
||
└── workflow_runner.py
|
||
```
|
||
|
||
## Установка
|
||
|
||
```bash
|
||
python -m venv .venv
|
||
source .venv/bin/activate
|
||
pip install -r requirements.txt
|
||
cp .env.example .env
|
||
```
|
||
|
||
## Запуск
|
||
|
||
Запуск сервера AgentOS:
|
||
|
||
```bash
|
||
python -m src.agent_os
|
||
```
|
||
|
||
По умолчанию AgentOS работает на `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
|
||
|
||
- `POST http://127.0.0.1:7777/api/runs`
|
||
- Тело запроса (JSON):
|
||
|
||
```json
|
||
{
|
||
"scenario_id": "news_source_discovery_v1",
|
||
"input": {
|
||
"url": "https://example.com/news"
|
||
}
|
||
}
|
||
```
|
||
|
||
Пример запроса:
|
||
|
||
```bash
|
||
curl -X POST "http://127.0.0.1:7777/api/runs" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"scenario_id": "news_source_discovery_v1",
|
||
"input": {
|
||
"url": "https://example.com/news"
|
||
}
|
||
}'
|
||
```
|
||
|
||
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"
|
||
```
|
||
|
||
## Переменные окружения
|
||
|
||
Основные переменные:
|
||
|
||
- `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`)
|
||
|
||
## Phoenix трассировка (локально)
|
||
|
||
1. Установите зависимости:
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
2. Поднимите Phoenix (см. `docker-service/docker-compose.yml`) и включите трассировку в `.env`:
|
||
|
||
```dotenv
|
||
PHOENIX_TRACING_ENABLED=true
|
||
PHOENIX_COLLECTOR_ENDPOINT=http://localhost:6006
|
||
PHOENIX_PROJECT_NAME=prisma-platform
|
||
```
|
||
|
||
3. Запустите приложение как обычно (`python -m src.agent_os`).
|
||
|