|
1 | 1 | { |
2 | | - "version": 1, |
3 | | - "name": "personal-assistant-core-workloads", |
| 2 | + "version": 2, |
| 3 | + "name": "personal-assistant-role-workloads", |
4 | 4 | "cases": [ |
5 | 5 | { |
6 | | - "id": "ru-chat-concise", |
7 | | - "category": "russian_chat", |
8 | | - "system_prompt": "Reply in Russian. Be concise and practical.", |
9 | | - "prompt": "Пользователь спрашивает: \"Что лучше сделать сначала: проверить логи сервиса или сразу перезапустить контейнер?\" Ответь коротко, как инженер.", |
| 6 | + "id": "simple-ping", |
| 7 | + "category": "simple", |
| 8 | + "purpose": "Checks that a small model can handle the very common short Telegram liveness turn without tools or filler.", |
| 9 | + "limitations": ["Does not measure reasoning quality."], |
| 10 | + "system_prompt": "Reply in Russian unless the user writes in another language. Be concise and practical.", |
| 11 | + "prompt": "Ping?", |
10 | 12 | "expect": { |
11 | | - "must_contain": ["логи"], |
| 13 | + "must_contain_any": [["pong", "на связи", "да", "работаю"]], |
12 | 14 | "must_not_contain": ["As an AI"], |
13 | | - "no_tool_call": true |
| 15 | + "no_tool_call": true, |
| 16 | + "max_chars": 120 |
14 | 17 | } |
15 | 18 | }, |
16 | 19 | { |
17 | | - "id": "tool-calendar-intent", |
| 20 | + "id": "simple-ops-logs-first", |
| 21 | + "category": "simple", |
| 22 | + "purpose": "Checks concise operational advice for a real admin/debug pattern.", |
| 23 | + "limitations": ["Does not prove the model can inspect logs itself."], |
| 24 | + "system_prompt": "Reply in Russian. Give the next action first. Do not use tools.", |
| 25 | + "prompt": "Бот не отвечает. Что первым проверить?", |
| 26 | + "expect": { |
| 27 | + "must_contain_any": [["логи", "лог"], ["контейнер", "сервис", "процесс", "health"]], |
| 28 | + "must_not_contain": ["сразу перезапусти все", "As an AI"], |
| 29 | + "no_tool_call": true, |
| 30 | + "max_chars": 260 |
| 31 | + } |
| 32 | + }, |
| 33 | + { |
| 34 | + "id": "default-admin-empty-models", |
| 35 | + "category": "default", |
| 36 | + "purpose": "Checks admin/model-catalog diagnosis without brittle English-only wording.", |
| 37 | + "limitations": ["Does not query the real database."], |
| 38 | + "system_prompt": "Act as a pragmatic senior engineer. Give the next diagnostic step first.", |
| 39 | + "prompt": "После деплоя админка открывается, но список моделей пустой. Что проверишь первым?", |
| 40 | + "expect": { |
| 41 | + "must_contain_any": [ |
| 42 | + ["model_capabilities", "capabilities", "кэш моделей", "таблиц"], |
| 43 | + ["логи", "запрос", "refresh", "hydration", "openrouter"] |
| 44 | + ], |
| 45 | + "must_not_contain": ["перезапусти все"], |
| 46 | + "no_tool_call": true, |
| 47 | + "max_chars": 700 |
| 48 | + } |
| 49 | + }, |
| 50 | + { |
| 51 | + "id": "default-safe-deploy-smoke", |
| 52 | + "category": "default", |
| 53 | + "purpose": "Checks that deployment advice includes service state, health endpoint, and logs instead of only reporting CI success.", |
| 54 | + "limitations": ["Does not run the deployment."], |
| 55 | + "system_prompt": "Reply in Russian. Be concrete and operational.", |
| 56 | + "prompt": "CI прошел, давай деплоить. Какие проверки после docker compose up обязательны?", |
| 57 | + "expect": { |
| 58 | + "must_contain_any": [ |
| 59 | + ["health", "healthz"], |
| 60 | + ["логи", "logs"], |
| 61 | + ["docker compose ps", "контейнер", "статус"] |
| 62 | + ], |
| 63 | + "must_not_contain": ["ничего проверять не нужно"], |
| 64 | + "no_tool_call": true, |
| 65 | + "max_chars": 900 |
| 66 | + } |
| 67 | + }, |
| 68 | + { |
| 69 | + "id": "tool-calendar-morning-window", |
18 | 70 | "category": "tool_use", |
19 | | - "system_prompt": "Use tools when the user asks for data that only a tool can know.", |
20 | | - "prompt": "Проверь мой календарь на завтра утром и скажи, есть ли свободное окно на 30 минут.", |
| 71 | + "purpose": "Checks calendar lookup routing with fixed dates, avoiding ambiguous relative-date behavior.", |
| 72 | + "limitations": ["Only validates tool selection and top-level arguments; it does not execute a real calendar read."], |
| 73 | + "system_prompt": "Use tools for calendar data. Use the exact ISO date range requested by the user.", |
| 74 | + "prompt": "Посмотри мой календарь 2026-06-17 утром с 09:00 до 12:00 по Белграду и скажи, есть ли окно на 30 минут.", |
21 | 75 | "tools": [ |
22 | 76 | { |
23 | | - "name": "calendar_list_events", |
24 | | - "description": "List calendar events for a date range.", |
| 77 | + "name": "calendar__get_events", |
| 78 | + "description": "List calendar events for an exact date-time range.", |
25 | 79 | "input_schema": { |
26 | 80 | "type": "object", |
27 | 81 | "properties": { |
|
33 | 87 | } |
34 | 88 | ], |
35 | 89 | "expect": { |
36 | | - "tool_call": "calendar_list_events" |
| 90 | + "tool_call": "calendar__get_events", |
| 91 | + "tool_args": { |
| 92 | + "date_from": "2026-06-17T09:00:00+02:00", |
| 93 | + "date_to": "2026-06-17T12:00:00+02:00" |
| 94 | + }, |
| 95 | + "max_tool_calls": 1 |
| 96 | + } |
| 97 | + }, |
| 98 | + { |
| 99 | + "id": "tool-tasks-today", |
| 100 | + "category": "tool_use", |
| 101 | + "purpose": "Checks task-list routing for short daily-planning prompts seen in production.", |
| 102 | + "limitations": ["Only validates tool call shape, not task ranking quality."], |
| 103 | + "system_prompt": "Use tools when the user asks about their tasks. Keep tool arguments minimal and explicit.", |
| 104 | + "prompt": "Что мне нужно сделать на 2026-06-17?", |
| 105 | + "tools": [ |
| 106 | + { |
| 107 | + "name": "tasks__get_tasks", |
| 108 | + "description": "Get Todoist tasks for a date or project.", |
| 109 | + "input_schema": { |
| 110 | + "type": "object", |
| 111 | + "properties": { |
| 112 | + "date": {"type": "string"} |
| 113 | + }, |
| 114 | + "required": ["date"] |
| 115 | + } |
| 116 | + } |
| 117 | + ], |
| 118 | + "expect": { |
| 119 | + "tool_call": "tasks__get_tasks", |
| 120 | + "tool_args": { |
| 121 | + "date": "2026-06-17" |
| 122 | + }, |
| 123 | + "max_tool_calls": 1 |
37 | 124 | } |
38 | 125 | }, |
39 | 126 | { |
40 | | - "id": "tool-web-fetch-intent", |
41 | | - "category": "web_fetch", |
42 | | - "system_prompt": "Use tools when the user asks you to inspect a URL. Do not invent page contents.", |
43 | | - "prompt": "Открой https://example.com/release-notes и кратко перечисли изменения в последнем релизе.", |
| 127 | + "id": "tool-memory-recall", |
| 128 | + "category": "tool_use", |
| 129 | + "purpose": "Checks personal-memory recall for short 'check memory' style prompts.", |
| 130 | + "limitations": ["Does not validate the factual answer after memory retrieval."], |
| 131 | + "system_prompt": "Use personal memory tools when the user asks what you remember.", |
| 132 | + "prompt": "Проверь память: что я сохранял про измерение продуктивности разработчиков?", |
44 | 133 | "tools": [ |
45 | 134 | { |
46 | | - "name": "web_fetch", |
47 | | - "description": "Fetch a URL and return readable page text.", |
| 135 | + "name": "personal-memory__recall_facts", |
| 136 | + "description": "Recall saved user facts by semantic query.", |
48 | 137 | "input_schema": { |
49 | 138 | "type": "object", |
50 | 139 | "properties": { |
51 | | - "url": {"type": "string"} |
| 140 | + "query": {"type": "string"} |
52 | 141 | }, |
53 | | - "required": ["url"] |
| 142 | + "required": ["query"] |
54 | 143 | } |
55 | 144 | } |
56 | 145 | ], |
57 | 146 | "expect": { |
58 | | - "tool_call": "web_fetch" |
| 147 | + "tool_call": "personal-memory__recall_facts", |
| 148 | + "max_tool_calls": 1 |
59 | 149 | } |
60 | 150 | }, |
61 | 151 | { |
62 | | - "id": "compaction-summary", |
| 152 | + "id": "tool-health-sleep-summary", |
| 153 | + "category": "tool_use", |
| 154 | + "purpose": "Checks health-dashboard routing for the recurring sleep/health questions in production.", |
| 155 | + "limitations": ["Does not judge medical correctness; it only checks that private health data is fetched through the tool."], |
| 156 | + "system_prompt": "Use health-dashboard tools for the user's health data. Do not infer medical causes from tool-free context.", |
| 157 | + "prompt": "Как я спал 2026-06-14?", |
| 158 | + "tools": [ |
| 159 | + { |
| 160 | + "name": "health-dashboard__get_sleep_summary", |
| 161 | + "description": "Get a sleep summary for a specific date.", |
| 162 | + "input_schema": { |
| 163 | + "type": "object", |
| 164 | + "properties": { |
| 165 | + "date": {"type": "string"} |
| 166 | + }, |
| 167 | + "required": ["date"] |
| 168 | + } |
| 169 | + } |
| 170 | + ], |
| 171 | + "expect": { |
| 172 | + "tool_call": "health-dashboard__get_sleep_summary", |
| 173 | + "tool_args": { |
| 174 | + "date": "2026-06-14" |
| 175 | + }, |
| 176 | + "max_tool_calls": 1 |
| 177 | + } |
| 178 | + }, |
| 179 | + { |
| 180 | + "id": "tool-file-document-search", |
| 181 | + "category": "tool_use", |
| 182 | + "purpose": "Checks file/document lookup routing for short prompts about remembered documents.", |
| 183 | + "limitations": ["Does not validate filesystem permissions or final document content."], |
| 184 | + "system_prompt": "Use filesystem search when the user asks to find something in their documents.", |
| 185 | + "prompt": "Посмотри в документах, где была заметка про Тулу.", |
| 186 | + "tools": [ |
| 187 | + { |
| 188 | + "name": "fs_search", |
| 189 | + "description": "Search files under the assistant context root.", |
| 190 | + "input_schema": { |
| 191 | + "type": "object", |
| 192 | + "properties": { |
| 193 | + "query": {"type": "string"} |
| 194 | + }, |
| 195 | + "required": ["query"] |
| 196 | + } |
| 197 | + } |
| 198 | + ], |
| 199 | + "expect": { |
| 200 | + "tool_call": "fs_search", |
| 201 | + "max_tool_calls": 1 |
| 202 | + } |
| 203 | + }, |
| 204 | + { |
| 205 | + "id": "tool-web-freshness-prooflinks", |
| 206 | + "category": "tool_use", |
| 207 | + "purpose": "Checks web-search routing for freshness/prooflink prompts seen in news conversations.", |
| 208 | + "limitations": ["Does not validate final source quality."], |
| 209 | + "system_prompt": "Use web search for current events and proof links. Do not invent sources.", |
| 210 | + "prompt": "А что в Белграде произошло 2026-05-01? Дай пруфлинки.", |
| 211 | + "tools": [ |
| 212 | + { |
| 213 | + "name": "web_search", |
| 214 | + "description": "Search the web for current or source-backed information.", |
| 215 | + "input_schema": { |
| 216 | + "type": "object", |
| 217 | + "properties": { |
| 218 | + "query": {"type": "string"} |
| 219 | + }, |
| 220 | + "required": ["query"] |
| 221 | + } |
| 222 | + } |
| 223 | + ], |
| 224 | + "expect": { |
| 225 | + "tool_call": "web_search", |
| 226 | + "max_tool_calls": 1 |
| 227 | + } |
| 228 | + }, |
| 229 | + { |
| 230 | + "id": "complex-model-routing-tradeoff", |
| 231 | + "category": "complex", |
| 232 | + "purpose": "Checks model-selection reasoning without fabricated benchmark numbers.", |
| 233 | + "limitations": ["Does not prove the recommendation is globally optimal."], |
| 234 | + "system_prompt": "Reply in Russian. Be explicit about uncertainty. Do not fabricate benchmark numbers.", |
| 235 | + "prompt": "Стоит ли полностью исключить free модели из роутинга, если часть из них внезапно становится платной или недоступной?", |
| 236 | + "expect": { |
| 237 | + "must_contain_any": [ |
| 238 | + ["не стоит", "не полностью", "оставить"], |
| 239 | + ["провер", "healthcheck", "availability", "доступност"], |
| 240 | + ["fallback", "резерв"], |
| 241 | + ["стоимост", "цена", "paid", "платн"] |
| 242 | + ], |
| 243 | + "must_not_contain": ["100%", "гарантированно всегда"], |
| 244 | + "no_tool_call": true, |
| 245 | + "max_chars": 1200 |
| 246 | + } |
| 247 | + }, |
| 248 | + { |
| 249 | + "id": "compaction-preserve-state", |
63 | 250 | "category": "compaction", |
64 | | - "system_prompt": "Summarize the conversation state for future turns. Preserve decisions, unresolved tasks, and concrete identifiers.", |
65 | | - "prompt": "Сожми историю: решили вынести ARM docker build в manual workflow; сделали compact model catalog; free модели проверяем перед назначением; остался watchlist и eval pack. Нужно продолжить без потери контекста.", |
| 251 | + "purpose": "Checks that compaction preserves decisions, unresolved tasks, and caveats from a long working session.", |
| 252 | + "limitations": ["Does not test semantic clustering over real stored embeddings."], |
| 253 | + "system_prompt": "Summarize the conversation state for future turns. Preserve decisions, unresolved tasks, concrete identifiers, and safety caveats.", |
| 254 | + "prompt": "Сожми историю: PR #19 задеплоен; evals/workload.json теперь попадает в Docker image; бесплатные модели можно проверять вручную; paid eval только после подтверждения; нужно заменить синтетические evals на role-based suite из продовых паттернов; здоровье нельзя интерпретировать как диагноз без caveat.", |
66 | 255 | "expect": { |
67 | | - "must_contain": ["ARM", "watchlist", "eval"], |
68 | | - "no_tool_call": true |
| 256 | + "must_contain_any": [ |
| 257 | + ["PR #19", "19"], |
| 258 | + ["evals/workload.json", "workload"], |
| 259 | + ["paid eval", "платн"], |
| 260 | + ["role-based", "role based", "ролев"], |
| 261 | + ["здоров", "диагноз", "caveat"] |
| 262 | + ], |
| 263 | + "must_not_contain": ["уже заменили role-based suite"], |
| 264 | + "no_tool_call": true, |
| 265 | + "max_chars": 1000 |
69 | 266 | } |
70 | 267 | }, |
71 | 268 | { |
72 | | - "id": "admin-debug-next-step", |
73 | | - "category": "admin_debug", |
74 | | - "system_prompt": "Act as a pragmatic senior engineer. Give the next diagnostic step first.", |
75 | | - "prompt": "После деплоя админка открывается, но список моделей пустой. Что проверишь первым?", |
| 269 | + "id": "multimodal-absent-image", |
| 270 | + "category": "multimodal_readiness", |
| 271 | + "purpose": "Checks that a model does not hallucinate screenshot contents when no image is attached.", |
| 272 | + "limitations": ["Actual image understanding requires a later multimodal eval runner."], |
| 273 | + "system_prompt": "Reply in Russian. If an image is not provided, do not claim to see it.", |
| 274 | + "prompt": "Посмотри фотку предыдущую и скажи, что на ней не так.", |
76 | 275 | "expect": { |
77 | | - "must_contain": ["capabilities"], |
78 | | - "must_not_contain": ["перезапусти все"], |
79 | | - "no_tool_call": true |
| 276 | + "must_contain_any": [["не вижу", "нет изображения", "не прикреплена", "нужна фот", "пришли"]], |
| 277 | + "must_not_contain": ["на фото видно", "я вижу"], |
| 278 | + "no_tool_call": true, |
| 279 | + "max_chars": 360 |
80 | 280 | } |
81 | 281 | } |
82 | 282 | ] |
|
0 commit comments