Update 86 files
- /rag/commands/expert.py - /core/services/__init__.py - /core/services/embedding_service.py - /core/services/file_service.py - /core/services/giga_client.py - /core/services/kb_service.py - /core/services/postgres_service.py - /core/services/qdrant_service.py - /core/services/reranker_service.py - /core/functions/__init__.py - /core/functions/check_consistency.py - /core/functions/check_spelling.py - /core/functions/critique_answer.py - /core/functions/expand_query.py - /core/functions/extract_metrics.py - /core/functions/file_processor.py - /core/functions/generate_document.py - /core/functions/intent_classify.py - /core/functions/rerank_context.py - /core/functions/summarize_document.py - /core/utils/__init__.py - /core/utils/arg_parser.py - /core/utils/config_loader.py - /core/utils/layout_converter.py - /core/utils/logger.py - /core/utils/text_utils.py - /core/utils/web_utils.py - /bots/commands/__init__.py - /bots/commands/base.py - /bots/commands/create.py - /core/commands/global_remove.py - /core/commands/help.py - /core/commands/info.py - /core/commands/kb.py - /core/commands/learn.py - /core/commands/other.py - /core/commands/registry.py - /core/commands/stats.py - /core/commands/template.py - /core/handlers/__init__.py - /core/handlers/message_handler.py - /core/workers/__init__.py - /core/workers/indexing_worker.py - /core/xmpp/__init__.py - /core/xmpp/client.py - /bots/commands/global_remove.py - /bots/commands/help.py - /bots/commands/info.py - /bots/commands/kb.py - /bots/commands/registry.py - /bots/commands/other.py - /bots/commands/template.py - /bots/commands/learn.py - /bots/commands/stats.py - /bots/handlers/message_handler.py - /bots/handlers/__init__.py - /bots/workers/__init__.py - /bots/workers/indexing_worker.py - /bots/xmpp/__init__.py - /bots/xmpp/client.py - /rag/services/qdrant_service.py - /rag/services/giga_client.py - /rag/services/embedding_service.py - /rag/services/reranker_service.py - /rag/services/__init__.py - /rag/services/file_service.py - /rag/services/postgres_service.py - /rag/services/kb_service.py - /rag/functions/check_spelling.py - /rag/functions/__init__.py - /rag/functions/extract_metrics.py - /rag/functions/generate_document.py - /rag/functions/expand_query.py - /rag/functions/critique_answer.py - /rag/functions/file_processor.py - /rag/functions/check_consistency.py - /rag/functions/summarize_document.py - /rag/functions/rerank_context.py - /rag/functions/intent_classify.py - /rag/utils/__init__.py - /rag/utils/layout_converter.py - /rag/utils/text_utils.py - /rag/utils/arg_parser.py - /rag/utils/config_loader.py - /rag/utils/logger.py - /rag/utils/web_utils.py
This commit is contained in:
62
rag/utils/arg_parser.py
Normal file
62
rag/utils/arg_parser.py
Normal file
@@ -0,0 +1,62 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Утилита для разбора аргументов командной строки в стиле --flag value или --flag.
|
||||
Используется командами бота для извлечения флагов (--global, --title и т.д.) и позиционных аргументов.
|
||||
"""
|
||||
|
||||
import shlex
|
||||
from typing import Tuple, Dict, List, Any
|
||||
|
||||
|
||||
def parse_args(args_str: str) -> Tuple[str, Dict[str, Any], List[str]]:
|
||||
"""
|
||||
Разбирает строку аргументов.
|
||||
|
||||
Возвращает кортеж: (команда, словарь флагов, список позиционных аргументов).
|
||||
|
||||
Пример:
|
||||
"!learn --global --title 'Мой документ' file.docx"
|
||||
-> ("!learn", {"global": True, "title": "Мой документ"}, ["file.docx"])
|
||||
|
||||
Алгоритм:
|
||||
1. Разбить строку на части, учитывая кавычки (через shlex.split).
|
||||
2. Если shlex не справился (непарные кавычки), разбить по пробелам (грубо).
|
||||
3. Первая часть – имя команды.
|
||||
4. Далее идём по частям: если часть начинается с '--', то это флаг.
|
||||
- Если следующий элемент не начинается с '--', то это значение флага.
|
||||
- Иначе флаг булевый (True).
|
||||
5. Всё, что не начинается с '--', – позиционные аргументы.
|
||||
"""
|
||||
if not args_str:
|
||||
return "", {}, []
|
||||
|
||||
# Пытаемся разбить с учётом кавычек (shlex)
|
||||
try:
|
||||
parts = shlex.split(args_str)
|
||||
except ValueError:
|
||||
# fallback: просто по пробелам (может быть неточно, но работает для простых случаев)
|
||||
parts = args_str.split()
|
||||
|
||||
if not parts:
|
||||
return "", {}, []
|
||||
|
||||
cmd = parts[0] # первая часть – имя команды
|
||||
flags = {}
|
||||
positionals = []
|
||||
i = 1
|
||||
while i < len(parts):
|
||||
p = parts[i]
|
||||
if p.startswith('--'):
|
||||
key = p[2:] # убираем '--'
|
||||
# Если следующий элемент есть и он не флаг, то это значение
|
||||
if i + 1 < len(parts) and not parts[i+1].startswith('--'):
|
||||
flags[key] = parts[i+1]
|
||||
i += 2
|
||||
else:
|
||||
flags[key] = True
|
||||
i += 1
|
||||
else:
|
||||
positionals.append(p)
|
||||
i += 1
|
||||
|
||||
return cmd, flags, positionals
|
||||
Reference in New Issue
Block a user