551 lines
32 KiB
Markdown
551 lines
32 KiB
Markdown
# Request Trace: req_c0af91b38de3436e82a75b9c3664c95a
|
||
|
||
- session_id: as_a4d91e7eca7547e0a37dc4dc6492cf9b
|
||
- active_rag_session_id: aa7d907e-2a76-4bf7-99dc-5a400a417f8c
|
||
- process_version: v2
|
||
- created_at: 2026-03-27T05:24:20.178027+00:00
|
||
|
||
## User Message
|
||
Какие методы есть в API?
|
||
|
||
## Step bootstrap
|
||
```json
|
||
{
|
||
"status": "started",
|
||
"details": {}
|
||
}
|
||
```
|
||
|
||
## Event status
|
||
```json
|
||
{
|
||
"source": "orchestrator",
|
||
"text": "Запрос принят и поставлен в обработку.",
|
||
"payload": {},
|
||
"created_at": "2026-03-27T05:24:20.194032+00:00"
|
||
}
|
||
```
|
||
|
||
## Event status
|
||
```json
|
||
{
|
||
"source": "orchestrator",
|
||
"text": "Запускаю процесс обработки v1.",
|
||
"payload": {
|
||
"process_version": "v2"
|
||
},
|
||
"created_at": "2026-03-27T05:24:20.194168+00:00"
|
||
}
|
||
```
|
||
|
||
## Step bootstrap
|
||
```json
|
||
{
|
||
"status": "completed",
|
||
"details": {}
|
||
}
|
||
```
|
||
|
||
## Step intent_router
|
||
```json
|
||
{
|
||
"status": "started",
|
||
"details": {}
|
||
}
|
||
```
|
||
|
||
## Event status
|
||
```json
|
||
{
|
||
"source": "intent_router",
|
||
"text": "Маршрутизирую запрос и определяю целевой workflow.",
|
||
"payload": {},
|
||
"created_at": "2026-03-27T05:24:20.198014+00:00"
|
||
}
|
||
```
|
||
|
||
## Event status
|
||
```json
|
||
{
|
||
"source": "intent_router",
|
||
"text": "Маршрут выбран: DOCUMENTATION_EXPLAIN / API_METHOD_EXPLAIN.",
|
||
"payload": {
|
||
"intent": "DOCUMENTATION_EXPLAIN",
|
||
"sub_intent": "API_METHOD_EXPLAIN",
|
||
"matched_intent_source": "deterministic"
|
||
},
|
||
"created_at": "2026-03-27T05:24:20.237289+00:00"
|
||
}
|
||
```
|
||
|
||
## Step intent_router
|
||
```json
|
||
{
|
||
"status": "completed",
|
||
"details": {
|
||
"intent": "DOCUMENTATION_EXPLAIN",
|
||
"sub_intent": "API_METHOD_EXPLAIN",
|
||
"matched_intent_source": "deterministic"
|
||
}
|
||
}
|
||
```
|
||
|
||
## Step workflow_documentation_explain
|
||
```json
|
||
{
|
||
"status": "started",
|
||
"details": {}
|
||
}
|
||
```
|
||
|
||
## Event status
|
||
```json
|
||
{
|
||
"source": "task_workflow",
|
||
"text": "Запускаю workflow docs_qa.",
|
||
"payload": {
|
||
"intent": "DOCUMENTATION_EXPLAIN",
|
||
"sub_intent": "API_METHOD_EXPLAIN"
|
||
},
|
||
"created_at": "2026-03-27T05:24:20.237970+00:00"
|
||
}
|
||
```
|
||
|
||
## Event status
|
||
```json
|
||
{
|
||
"source": "status.rag_retrieval",
|
||
"text": "RAG Retrieval",
|
||
"payload": {
|
||
"status_block": {
|
||
"id": "rag_retrieval",
|
||
"title": "RAG Retrieval",
|
||
"lines": [
|
||
"planned_layers: D2_FACT_INDEX, D4_WORKFLOW_INDEX, D1_DOCUMENT_CATALOG, D0_DOC_CHUNKS",
|
||
"executed_layers: D2_FACT_INDEX, D4_WORKFLOW_INDEX, D1_DOCUMENT_CATALOG, D0_DOC_CHUNKS",
|
||
"D2_FACT_INDEX: 8 hits",
|
||
"D4_WORKFLOW_INDEX: 2 hits",
|
||
"D1_DOCUMENT_CATALOG: 4 hits",
|
||
"D0_DOC_CHUNKS: 4 hits"
|
||
],
|
||
"append": false
|
||
},
|
||
"kind": "task_progress"
|
||
},
|
||
"created_at": "2026-03-27T05:29:27.952296+00:00"
|
||
}
|
||
```
|
||
|
||
## Event status
|
||
```json
|
||
{
|
||
"source": "status.workflow",
|
||
"text": "Task Workflow",
|
||
"payload": {
|
||
"status_block": {
|
||
"id": "workflow",
|
||
"title": "Task Workflow",
|
||
"lines": [
|
||
"workflow_id: docs_qa",
|
||
"prompt: docs_explain_answer",
|
||
"answer_mode: answered"
|
||
],
|
||
"append": false
|
||
},
|
||
"kind": "task_progress"
|
||
},
|
||
"created_at": "2026-03-27T05:29:27.954440+00:00"
|
||
}
|
||
```
|
||
|
||
## Event status
|
||
```json
|
||
{
|
||
"source": "status.evidence_gate",
|
||
"text": "Evidence Gate",
|
||
"payload": {
|
||
"status_block": {
|
||
"id": "evidence_gate",
|
||
"title": "Evidence Gate",
|
||
"lines": [
|
||
"decision: allow",
|
||
"reason: evidence_sufficient",
|
||
"satisfied: retrieval_non_empty"
|
||
],
|
||
"append": false
|
||
},
|
||
"kind": "task_progress"
|
||
},
|
||
"created_at": "2026-03-27T05:29:27.955424+00:00"
|
||
}
|
||
```
|
||
|
||
## Event status
|
||
```json
|
||
{
|
||
"source": "rag_retrieval",
|
||
"text": "RAG retrieval завершен.",
|
||
"payload": {
|
||
"planned_layers": [
|
||
"D2_FACT_INDEX",
|
||
"D4_WORKFLOW_INDEX",
|
||
"D1_DOCUMENT_CATALOG",
|
||
"D0_DOC_CHUNKS"
|
||
],
|
||
"executed_layers": [
|
||
"D2_FACT_INDEX",
|
||
"D4_WORKFLOW_INDEX",
|
||
"D1_DOCUMENT_CATALOG",
|
||
"D0_DOC_CHUNKS"
|
||
],
|
||
"non_empty_layers": [
|
||
"D2_FACT_INDEX",
|
||
"D4_WORKFLOW_INDEX",
|
||
"D1_DOCUMENT_CATALOG",
|
||
"D0_DOC_CHUNKS"
|
||
]
|
||
},
|
||
"created_at": "2026-03-27T05:29:27.956040+00:00"
|
||
}
|
||
```
|
||
|
||
## Event status
|
||
```json
|
||
{
|
||
"source": "evidence_gate",
|
||
"text": "Evidence gate оценен.",
|
||
"payload": {
|
||
"decision": "allow",
|
||
"reason": "evidence_sufficient",
|
||
"missing": [],
|
||
"satisfied": [
|
||
"retrieval_non_empty"
|
||
]
|
||
},
|
||
"created_at": "2026-03-27T05:29:27.956637+00:00"
|
||
}
|
||
```
|
||
|
||
## Event status
|
||
```json
|
||
{
|
||
"source": "workflow_result",
|
||
"text": "Workflow docs_qa завершен.",
|
||
"payload": {
|
||
"workflow_id": "docs_qa",
|
||
"result_type": "answer",
|
||
"answer_length": 1418
|
||
},
|
||
"created_at": "2026-03-27T05:29:27.956966+00:00"
|
||
}
|
||
```
|
||
|
||
## Step workflow_documentation_explain
|
||
```json
|
||
{
|
||
"status": "completed",
|
||
"details": {
|
||
"workflow_id": "docs_qa",
|
||
"meta": {
|
||
"workflow_id": "docs_qa",
|
||
"intent": "DOCUMENTATION_EXPLAIN",
|
||
"diagnostics": {
|
||
"intent": "DOCUMENTATION_EXPLAIN",
|
||
"sub_intent": "API_METHOD_EXPLAIN",
|
||
"layers_used": [
|
||
"D2_FACT_INDEX",
|
||
"D4_WORKFLOW_INDEX",
|
||
"D1_DOCUMENT_CATALOG",
|
||
"D0_DOC_CHUNKS"
|
||
],
|
||
"documents_found": 1,
|
||
"facts_found": 2,
|
||
"relations_found": 0,
|
||
"openapi_fields_extracted": 0,
|
||
"missing_required_fields": [],
|
||
"openapi_status": {
|
||
"has_path": false,
|
||
"has_method": false,
|
||
"has_request": false,
|
||
"has_response": false
|
||
},
|
||
"prompt_used": "docs_explain_answer",
|
||
"llm_mode": "prose",
|
||
"output_valid": true,
|
||
"matched_intent_source": "deterministic",
|
||
"matched_anchor_type": "topic",
|
||
"matched_anchor_value": null,
|
||
"exact_anchor_match": false,
|
||
"docs_layers_requested": [
|
||
"D2_FACT_INDEX",
|
||
"D4_WORKFLOW_INDEX",
|
||
"D1_DOCUMENT_CATALOG",
|
||
"D0_DOC_CHUNKS"
|
||
],
|
||
"docs_layers_with_hits": [
|
||
"D2_FACT_INDEX",
|
||
"D4_WORKFLOW_INDEX",
|
||
"D1_DOCUMENT_CATALOG",
|
||
"D0_DOC_CHUNKS"
|
||
],
|
||
"planned_layers": [
|
||
"D2_FACT_INDEX",
|
||
"D4_WORKFLOW_INDEX",
|
||
"D1_DOCUMENT_CATALOG",
|
||
"D0_DOC_CHUNKS"
|
||
],
|
||
"executed_layers": [
|
||
"D2_FACT_INDEX",
|
||
"D4_WORKFLOW_INDEX",
|
||
"D1_DOCUMENT_CATALOG",
|
||
"D0_DOC_CHUNKS"
|
||
],
|
||
"non_empty_layers": [
|
||
"D2_FACT_INDEX",
|
||
"D4_WORKFLOW_INDEX",
|
||
"D1_DOCUMENT_CATALOG",
|
||
"D0_DOC_CHUNKS"
|
||
],
|
||
"layer_diagnostics": {
|
||
"D2_FACT_INDEX": {
|
||
"hits": 8,
|
||
"top_ids": [
|
||
"80c5e54d5ebe430623c215b27c8f7112010666951d905f15e9f909a6caff517e",
|
||
"6bf0a662808009874a108d0c97f7cca7fc4ff7a3a3d66e0947b31bf813cfdf4d",
|
||
"7aefee9ff6110088aad1891da66fc9085eb3f77d832605a3da565deecb96e850",
|
||
"8c717a73b32f2f6d69293c34ce4804a82c168a9dc2d611465ab5563637c71fe0",
|
||
"149c4e0d3d34b3faba055b1495d54818fadc882af633da70035b82190c1bd327"
|
||
],
|
||
"top_sections": [
|
||
"api.send_message_endpoint:workflow_step",
|
||
"api.send_message_endpoint:mentions_entity"
|
||
]
|
||
},
|
||
"D4_WORKFLOW_INDEX": {
|
||
"hits": 2,
|
||
"top_ids": [
|
||
"api.control_actions_endpoint",
|
||
"api.send_message_endpoint"
|
||
],
|
||
"top_sections": [
|
||
"Scenario"
|
||
]
|
||
},
|
||
"D1_DOCUMENT_CATALOG": {
|
||
"hits": 4,
|
||
"top_ids": [
|
||
"api.send_message_endpoint",
|
||
"api.control_actions_endpoint",
|
||
"docs/README.md",
|
||
"domain.runtime_health"
|
||
],
|
||
"top_sections": [
|
||
"HTTP API /send",
|
||
"HTTP API /actions/{action}",
|
||
"Readme",
|
||
"Сущность runtime health"
|
||
]
|
||
},
|
||
"D0_DOC_CHUNKS": {
|
||
"hits": 4,
|
||
"top_ids": [
|
||
"api.send_message_endpoint"
|
||
],
|
||
"top_sections": [
|
||
"api.send_message_endpoint:Описание",
|
||
"api.send_message_endpoint:Сценарий",
|
||
"api.send_message_endpoint:Summary",
|
||
"api.send_message_endpoint:Функциональные требования"
|
||
]
|
||
}
|
||
},
|
||
"query_entity_candidates": [],
|
||
"resolved_entity_candidates": [],
|
||
"query_anchor_candidates": [],
|
||
"resolved_anchor_candidates": [
|
||
"docs/documentation/api/send-message-endpoint.md",
|
||
"api.control_actions_endpoint",
|
||
"docs/documentation/api/control-actions-endpoint.md",
|
||
"api.send_message_endpoint",
|
||
"docs/README.md",
|
||
"domain.runtime_health",
|
||
"docs/documentation/domain/runtime-health-entity.md"
|
||
],
|
||
"anchor_candidates": [],
|
||
"selected_anchor": null,
|
||
"anchor_selection_reason": "",
|
||
"anchor_match_type": "",
|
||
"doc_ids": [
|
||
"api.send_message_endpoint",
|
||
"api.control_actions_endpoint",
|
||
"api.actions_endpoint",
|
||
"docs/README.md",
|
||
"domain.runtime_health"
|
||
],
|
||
"doc_paths": [
|
||
"docs/documentation/api/send-message-endpoint.md",
|
||
"docs/documentation/api/control-actions-endpoint.md",
|
||
"docs/README.md",
|
||
"docs/documentation/domain/runtime-health-entity.md"
|
||
],
|
||
"doc_titles": [
|
||
"api.send_message_endpoint:workflow_step",
|
||
"api.send_message_endpoint:mentions_entity",
|
||
"Scenario",
|
||
"HTTP API /send",
|
||
"HTTP API /actions/{action}",
|
||
"Readme",
|
||
"Сущность runtime health",
|
||
"api.send_message_endpoint:Описание",
|
||
"api.send_message_endpoint:Сценарий",
|
||
"api.send_message_endpoint:Summary",
|
||
"api.send_message_endpoint:Функциональные требования"
|
||
],
|
||
"relation_hits_count": 0,
|
||
"relation_targets": [],
|
||
"selected_doc_ids": [
|
||
"api.send_message_endpoint",
|
||
"api.control_actions_endpoint"
|
||
],
|
||
"selected_fact_ids": [
|
||
"80c5e54d5ebe430623c215b27c8f7112010666951d905f15e9f909a6caff517e",
|
||
"8c717a73b32f2f6d69293c34ce4804a82c168a9dc2d611465ab5563637c71fe0"
|
||
],
|
||
"selected_relation_ids": [],
|
||
"selected_chunk_ids": [
|
||
"api.send_message_endpoint"
|
||
],
|
||
"selected_entity_ids": [],
|
||
"selected_workflow_ids": [
|
||
"f78b822d4366b10322fd4a35e347deae59d55ff4132951201f4df3d1653aec61"
|
||
],
|
||
"fallback_doc_hits_count": 3,
|
||
"fallback_used": false,
|
||
"fact_hits": 2,
|
||
"entity_hits": 0,
|
||
"evidence_summary": {
|
||
"documents": 1,
|
||
"facts": 2,
|
||
"entities": 0,
|
||
"workflows": 1,
|
||
"relations": 0,
|
||
"chunks": 2,
|
||
"selected_doc_ids": [
|
||
"api.send_message_endpoint",
|
||
"api.control_actions_endpoint"
|
||
],
|
||
"selected_fact_ids": [
|
||
"80c5e54d5ebe430623c215b27c8f7112010666951d905f15e9f909a6caff517e",
|
||
"8c717a73b32f2f6d69293c34ce4804a82c168a9dc2d611465ab5563637c71fe0"
|
||
],
|
||
"selected_relation_ids": [],
|
||
"selected_chunk_ids": [
|
||
"api.send_message_endpoint"
|
||
],
|
||
"entity_hits": 0,
|
||
"openapi_signals": {
|
||
"path_found": false,
|
||
"method_found": false,
|
||
"operation_semantics_found": false,
|
||
"request_payload_found": false,
|
||
"request_schema": false,
|
||
"request_fields_found": false,
|
||
"response_payload_found": false,
|
||
"response_schema": false,
|
||
"response_fields_found": false,
|
||
"status_codes": false,
|
||
"content_type_found": false,
|
||
"examples_found": false,
|
||
"payload_description": false
|
||
}
|
||
},
|
||
"gate_decision": "allow",
|
||
"gate_decision_reason": "evidence_sufficient",
|
||
"gate_missing_requirements": [],
|
||
"gate_satisfied_requirements": [
|
||
"retrieval_non_empty"
|
||
],
|
||
"openapi_evidence": {
|
||
"path_found": false,
|
||
"method_found": false,
|
||
"operation_semantics_found": false,
|
||
"request_payload_found": false,
|
||
"request_schema": false,
|
||
"request_fields_found": false,
|
||
"response_payload_found": false,
|
||
"response_schema": false,
|
||
"response_fields_found": false,
|
||
"status_codes": false,
|
||
"content_type_found": false,
|
||
"examples_found": false,
|
||
"payload_description": false
|
||
},
|
||
"requested_fragment_type": null,
|
||
"fragment_evidence_found": [],
|
||
"fragment_missing_requirements": [],
|
||
"prompt": {
|
||
"prompt_name": "docs_explain_answer",
|
||
"system_prompt": "Ты объясняешь документацию системы.\n\nНа вход приходит JSON с полями:\n- question\n- intent\n- sub_intent\n- documents\n- facts\n- relations\n\nПравила:\n- Используй только предоставленные факты\n- Не додумывай\n- Если данных недостаточно, скажи это явно\n- Объясняй структурировано\n\nФормат ответа:\n1. Краткое описание\n2. Основные элементы\n3. Как это работает\n4. Связи с другими частями системы (если есть)",
|
||
"user_prompt": "{\n \"question\": \"Какие методы есть в API?\",\n \"intent\": \"DOCUMENTATION_EXPLAIN\",\n \"sub_intent\": \"API_METHOD_EXPLAIN\",\n \"documents\": [\n {\n \"layer\": \"D1_DOCUMENT_CATALOG\",\n \"path\": \"docs/documentation/api/send-message-endpoint.md\",\n \"title\": \"HTTP API /send\",\n \"content\": \"Endpoint `/send` выполняет ручную отправку сообщения в Telegram через `TelegramSendService`. Он используется для операторской проверки доставки и для отправки уведомлений вне периодического worker loop. Endpoint работает поверх тех же credentials и того же delivery path, что и фоновая отправка.\",\n \"metadata\": {\n \"name\": \"send_message_endpoint\",\n \"tags\": [\n \"api\",\n \"telegram\",\n \"manual-send\"\n ],\n \"type\": \"api_method\",\n \"layer\": \"application\",\n \"links\": [\n {\n \"type\": \"part_of\",\n \"target\": \"architecture.telegram_notify_app\"\n },\n {\n \"type\": \"depends_on\",\n \"target\": \"logic.telegram_notification_loop\"\n }\n ],\n \"owner\": null,\n \"title\": \"HTTP API /send\",\n \"doc_id\": null,\n \"module\": \"telegram_notify_app\",\n \"parent\": \"architecture.telegram_notify_app\",\n \"status\": \"draft\",\n \"repo_id\": \"/Users/alex/Dev_projects_v2/apps/test_echo_app\",\n \"section\": null,\n \"blob_sha\": \"5fbf2e33510b0676a3a53b957a4569bd3c2c31fb7719546602c573421ccaa32d\",\n \"children\": [],\n \"doc_kind\": \"misc\",\n \"entities\": [\n \"TelegramControlAppFactory\",\n \"TelegramSendService\",\n \"TelegramNotifyWorker\"\n ],\n \"updated_at\": \"2026-03-20\",\n \"doc_version\": null,\n \"document_id\": \"api.send_message_endpoint\",\n \"source_path\": \"docs/documentation/api/send-message-endpoint.md\",\n \"summary_text\": \"Endpoint `/send` выполняет ручную отправку сообщения в Telegram через `TelegramSendService`. Он используется для операторской проверки доставки и для отправки уведомлений вне периодического worker loop. Endpoint работает поверх тех же credentials и того же delivery path, что и фоновая отправка.\",\n \"artifact_type\": null,\n \"last_modified\": null,\n \"staleness_score\": null,\n \"system_component\": null\n }\n }\n ],\n \"facts\": [\n {\n \"layer\": \"D2_FACT_INDEX\",\n \"path\": \"docs/documentation/api/send-message-endpoint.md\",\n \"title\": \"api.send_message_endpoint:workflow_step\",\n \"content\": \"api.send_message_endpoint workflow_step Предусловия:**\",\n \"metadata\": {\n \"tags\": [],\n \"owner\": null,\n \"anchor\": \"Сценарий\",\n \"doc_id\": null,\n \"object\": \"Предусловия:**\",\n \"fact_id\": \"80c5e54d5ebe430623c215b27c8f7112010666951d905f15e9f909a6caff517e\",\n \"repo_id\": \"/Users/alex/Dev_projects_v2/apps/test_echo_app\",\n \"section\": null,\n \"blob_sha\": \"5fbf2e33510b0676a3a53b957a4569bd3c2c31fb7719546602c573421ccaa32d\",\n \"predicate\": \"workflow_step\",\n \"object_ref\": null,\n \"subject_id\": \"api.send_message_endpoint\",\n \"doc_version\": null,\n \"source_path\": \"docs/documentation/api/send-message-endpoint.md\",\n \"artifact_type\": null,\n \"last_modified\": null,\n \"staleness_score\": null,\n \"system_component\": null\n }\n },\n {\n \"layer\": \"D2_FACT_INDEX\",\n \"path\": \"docs/documentation/api/send-message-endpoint.md\",\n \"title\": \"api.send_message_endpoint:mentions_entity\",\n \"content\": \"api.send_message_endpoint mentions_entity TelegramControlAppFactory\",\n \"metadata\": {\n \"tags\": [],\n \"owner\": null,\n \"anchor\": \"frontmatter.entities\",\n \"doc_id\": null,\n \"object\": \"TelegramControlAppFactory\",\n \"fact_id\": \"8c717a73b32f2f6d69293c34ce4804a82c168a9dc2d611465ab5563637c71fe0\",\n \"repo_id\": \"/Users/alex/Dev_projects_v2/apps/test_echo_app\",\n \"section\": null,\n \"blob_sha\": \"5fbf2e33510b0676a3a53b957a4569bd3c2c31fb7719546602c573421ccaa32d\",\n \"predicate\": \"mentions_entity\",\n \"object_ref\": null,\n \"subject_id\": \"api.send_message_endpoint\",\n \"doc_version\": null,\n \"source_path\": \"docs/documentation/api/send-message-endpoint.md\",\n \"artifact_type\": null,\n \"last_modified\": null,\n \"staleness_score\": null,\n \"system_component\": null\n }\n }\n ],\n \"entities\": [],\n \"workflows\": [\n {\n \"layer\": \"D4_WORKFLOW_INDEX\",\n \"path\": \"docs/documentation/api/control-actions-endpoint.md\",\n \"title\": \"Scenario\",\n \"content\": \"Scenario\\nHTTP control plane запущен.\\n`ControlActionSet` сконфигурирован в `TelegramControlChannel`.\\nВ path передано одно из поддерживаемых действий: `start`, `stop`, `status`.\\nКлиент отправляет `GET` или `POST` на `/actions/{action}`.\\n1. Endpoint принимает запрос и извлекает path parameter `action`.\\n2. API определяет источник клиента через `X-Client-Source` или `User-Agent`.\\n3. Для `start` и `stop` запрос логируется как control action.\\n4. Канал сопоставляет `action` с callback из `ControlActionSet`.\\n5. API ожидает завершения callback в пределах допустимого timeout.\\n6. При успешном завершении API возвращает JSON со статусом `ok`.\\n1. Если `start` или `stop` не успевают завершиться в timeout, API возвращает `202 accepted` и сообщает, что операция еще выполняется.\",\n \"metadata\": {\n \"owner\": null,\n \"doc_id\": null,\n \"repo_id\": \"/Users/alex/Dev_projects_v2/apps/test_echo_app\",\n \"section\": null,\n \"trigger\": [\n \"Клиент отправляет `GET` или `POST` на `/actions/{action}`.\"\n ],\n \"blob_sha\": \"a251c550a23249ef1a74389c93aaccd4c5ae88ef621efad2aa018fcd132cce7e\",\n \"main_flow\": [\n \"1. Endpoint принимает запрос и извлекает path parameter `action`.\",\n \"2. API определяет источник клиента через `X-Client-Source` или `User-Agent`.\",\n \"3. Для `start` и `stop` запрос логируется как control action.\",\n \"4. Канал сопоставляет `action` с callback из `ControlActionSet`.\",\n \"5. API ожидает завершения callback в пределах допустимого timeout.\",\n \"6. При успешном завершении API возвращает JSON со статусом `ok`.\"\n ],\n \"doc_version\": null,\n \"document_id\": \"api.control_actions_endpoint\",\n \"source_path\": \"docs/documentation/api/control-actions-endpoint.md\",\n \"workflow_id\": \"f78b822d4366b10322fd4a35e347deae59d55ff4132951201f4df3d1653aec61\",\n \"artifact_type\": null,\n \"last_modified\": null,\n \"preconditions\": [\n \"HTTP control plane запущен.\",\n \"`ControlActionSet` сконфигурирован в `TelegramControlChannel`.\",\n \"В path передано одно из поддерживаемых действий: `start`, `stop`, `status`.\"\n ],\n \"workflow_name\": \"Scenario\",\n \"error_handling\": [\n \"1. Если actions не сконфигурированы, API возвращает `404`.\",\n \"2. Если передано неподдерживаемое действие, API возвращает `404`.\",\n \"3. Если callback завершился исключением, API возвращает `500`.\"\n ],\n \"postconditions\": [\n \"Клиент получает результат выполнения control action или признак, что операция еще продолжается.\"\n ],\n \"staleness_score\": null,\n \"alternative_flow\": [\n \"1. Если `start` или `stop` не успевают завершиться в timeout, API возвращает `202 accepted` и сообщает, что операция еще выполняется.\"\n ],\n \"system_component\": null\n }\n }\n ],\n \"relations\": [],\n \"chunks\": [\n {\n \"layer\": \"D0_DOC_CHUNKS\",\n \"path\": \"docs/documentation/api/send-message-endpoint.md\",\n \"title\": \"api.send_message_endpoint:Описание\",\n \"content\": \"Метод принимает текст сообщения и инициирует разовую отправку в Telegram без ожидания планового интервала worker'а. Endpoint нужен для ручной диагностики канала доставки и для ad-hoc уведомлений.\",\n \"metadata\": {\n \"tags\": [\n \"api\",\n \"telegram\",\n \"manual-send\"\n ],\n \"type\": \"api_method\",\n \"order\": 3,\n \"owner\": null,\n \"doc_id\": null,\n \"module\": \"telegram_notify_app\",\n \"repo_id\": \"/Users/alex/Dev_projects_v2/apps/test_echo_app\",\n \"section\": null,\n \"blob_sha\": \"5fbf2e33510b0676a3a53b957a4569bd3c2c31fb7719546602c573421ccaa32d\",\n \"doc_kind\": \"misc\",\n \"doc_version\": null,\n \"document_id\": \"api.send_message_endpoint\",\n \"source_path\": \"docs/documentation/api/send-message-endpoint.md\",\n \"section_path\": \"Details > Описание\",\n \"artifact_type\": null,\n \"last_modified\": null,\n \"section_title\": \"Описание\",\n \"staleness_score\": null,\n \"system_component\": null\n }\n },\n {\n \"layer\": \"D0_DOC_CHUNKS\",\n \"path\": \"docs/documentation/api/send-message-endpoint.md\",\n \"title\": \"api.send_message_endpoint:Сценарий\",\n \"content\": \"**Название:** Ручная отправка сообщения в Telegram\\n\\n**Предусловия:**\\n- HTTP control plane запущен.\\n- Telegram credentials доступны в переменных окружения.\\n- Клиент передает непустой параметр `message`.\\n\\n**Триггер:**\\n- Клиент отправляет `GET /send?message=...`.\\n\\n**Основной сценарий:**\\n1. Endpoint принимает HTTP-запрос `GET /send`.\\n2. API извлекает query parameter `message`.\\n3. API проверяет, что сообщение не пустое.\\n4. Endpoint вызывает `TelegramSendService.send(message)`.\\n5. Сервис получает Telegram credentials из окружения.\\n6. Сервис вызывает Telegram Bot API для отправки сообщения.\\n7. API возвращает клиенту успешный JSON-ответ.\\n\\n**Альтернативный сценарий:**\\n1. Если credentials отсутствуют, сервис завершает вызов пользовательской ошибкой.\\n\\n**Обработка ошибок:**\\n1. Если `message` пустой или credentials не заданы, API возвращает `400`.\\n2. Если отправка завершилась непредвиденной ошибкой, API возвращает `500`.\\n\\n**Постусловие:**\\n- Сообщение либо отправлено в Telegram, либо клиент получил диагностическую ошибку.\",\n \"metadata\": {\n \"tags\": [\n \"api\",\n \"telegram\",\n \"manual-send\"\n ],\n \"type\": \"api_method\",\n \"order\": 4,\n \"owner\": null,\n \"doc_id\": null,\n \"module\": \"telegram_notify_app\",\n \"repo_id\": \"/Users/alex/Dev_projects_v2/apps/test_echo_app\",\n \"section\": null,\n \"blob_sha\": \"5fbf2e33510b0676a3a53b957a4569bd3c2c31fb7719546602c573421ccaa32d\",\n \"doc_kind\": \"misc\",\n \"doc_version\": null,\n \"document_id\": \"api.send_message_endpoint\",\n \"source_path\": \"docs/documentation/api/send-message-endpoint.md\",\n \"section_path\": \"Details > Сценарий\",\n \"artifact_type\": null,\n \"last_modified\": null,\n \"section_title\": \"Сценарий\",\n \"staleness_score\": null,\n \"system_component\": null\n }\n }\n ]\n}",
|
||
"log_context": "graph.project_qa.docs.answer",
|
||
"prompt_stats": {
|
||
"system_chars": 393,
|
||
"user_chars": 10838,
|
||
"tokens_in_estimate": 2808
|
||
}
|
||
},
|
||
"answer_mode": "answered",
|
||
"degrade_reason": null,
|
||
"degraded_reason": null,
|
||
"code_intents_stubbed": false
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
## Step finalize
|
||
```json
|
||
{
|
||
"status": "started",
|
||
"details": {}
|
||
}
|
||
```
|
||
|
||
## Event user
|
||
```json
|
||
{
|
||
"source": "agent",
|
||
"text": "### 1. Краткое описание\nДокументация описывает метод API `/send`, который предназначен для ручной отправки сообщений в Telegram. Метод позволяет операторам отправлять сообщения вручную без ожидания плановой отправки, а также использовать его для диагностики работы канала доставки.\n\n### 2. Основные элементы\n- **Метод**: `/send`\n- **Тип**: API метод\n- **Модуль**: telegram_notify_app\n- **Параметры запроса**: message (текст сообщения)\n- **Используемые сервисы**: TelegramSendService\n- **Зависимости**: credentials для доступа к Telegram API\n- **Сценарии использования**: диагностика канала доставки, оперативные уведомления\n\n### 3. Как это работает\n1. Пользователь отправляет GET-запрос на `/send` с параметром `message`.\n2. API извлекает значение параметра `message` и проверяет его на непустоту.\n3. Если проверка пройдена, вызывается метод `TelegramSendService.send(message)`.\n4. Service получает необходимые для отправки данные из окружения.\n5. Запускается вызов Telegram Bot API для отправки сообщения.\n6. В случае успешного завершения отправляется ответ клиенту с подтверждением успешной отправки.\n\n### 4. Связи с другими частями системы\n- Зависит от сервиса `TelegramSendService`.\n- Используется для диагностики и ручного управления каналом доставки вместе с компонентом `TelegramControlAppFactory`.\n- Работает поверх тех же credentials и пути доставки, что и фоновый механизм отправки сообщений (`worker loop`).",
|
||
"payload": {},
|
||
"created_at": "2026-03-27T05:29:27.958501+00:00"
|
||
}
|
||
```
|
||
|
||
## Event status
|
||
```json
|
||
{
|
||
"source": "orchestrator",
|
||
"text": "Обработка запроса завершена.",
|
||
"payload": {},
|
||
"created_at": "2026-03-27T05:29:27.958731+00:00"
|
||
}
|
||
```
|
||
|
||
## Step finalize
|
||
```json
|
||
{
|
||
"status": "completed",
|
||
"details": {}
|
||
}
|
||
```
|
||
|
||
## Result
|
||
```json
|
||
{
|
||
"status": "done",
|
||
"answer": "### 1. Краткое описание\nДокументация описывает метод API `/send`, который предназначен для ручной отправки сообщений в Telegram. Метод позволяет операторам отправлять сообщения вручную без ожидания плановой отправки, а также использовать его для диагностики работы канала доставки.\n\n### 2. Основные элементы\n- **Метод**: `/send`\n- **Тип**: API метод\n- **Модуль**: telegram_notify_app\n- **Параметры запроса**: message (текст сообщения)\n- **Используемые сервисы**: TelegramSendService\n- **Зависимости**: credentials для доступа к Telegram API\n- **Сценарии использования**: диагностика канала доставки, оперативные уведомления\n\n### 3. Как это работает\n1. Пользователь отправляет GET-запрос на `/send` с параметром `message`.\n2. API извлекает значение параметра `message` и проверяет его на непустоту.\n3. Если проверка пройдена, вызывается метод `TelegramSendService.send(message)`.\n4. Service получает необходимые для отправки данные из окружения.\n5. Запускается вызов Telegram Bot API для отправки сообщения.\n6. В случае успешного завершения отправляется ответ клиенту с подтверждением успешной отправки.\n\n### 4. Связи с другими частями системы\n- Зависит от сервиса `TelegramSendService`.\n- Используется для диагностики и ручного управления каналом доставки вместе с компонентом `TelegramControlAppFactory`.\n- Работает поверх тех же credentials и пути доставки, что и фоновый механизм отправки сообщений (`worker loop`).",
|
||
"completed_at": "2026-03-27T05:29:27.959532+00:00"
|
||
}
|
||
```
|