This release has been yanked by its maintainers, and will be ignored by installers, except when explicitly specified.
Consider using release 0.2.17 instead.
Reason given by maintainers: Обновлена версия
aisha
Локальный консольный AI-агент на Python 3.11+. Работает с внешним llama-server (llama.cpp) по OpenAI-совместимому REST API. Это не веб-приложение: вся логика — цикл «запрос модели → вызовы инструментов → результаты → снова модель» в одном процессе.
Версия: 0.2.3.
Возможности
- Файлы — чтение, запись, точечное редактирование, листинг,
glob-поиск иgrep; - Shell — запуск команд (
powershell/cmd/sh), таймауты, обрезка вывода, подтверждение опасных команд; - Веб — поиск DuckDuckGo и загрузка страниц с SSRF-защитой;
- Память — постоянные блоки (глобальные и проектные) с приоритетом проекта;
- Скиллы — переиспользуемые инструкции в
SKILL.md; - Многошаговые задачи — todo-список и уточняющие вопросы к пользователю;
- Нативный tool calling — модель сама вызывает инструменты через API;
- Авто-сжатие истории при приближении к лимиту контекста;
- Два режима — one-shot (передан промпт) и интерактивный REPL.
Требования
- Python 3.11+;
- запущенный llama-server (llama.cpp) с поддержкой OpenAI-совместимого API и tool calling.
Установка
Из PyPI (рекомендуется):
pip install aisha
Для разработки из исходников (src-layout):
pip install -e ".[dev]" # editable-установка: изменения в src/ сразу подхватываются
Точка входа — aisha = "aisha.cli:main" (см. pyproject.toml).
Запуск llama-server
Перед использованием нужно поднять сервер, например:
llama-server \
--model ./models/Qwen3.5-9B-Q4_K_XL.gguf \
--port 8088 \
--n-gpu-layers 99
По умолчанию aisha ждёт сервер на http://localhost:8088. Проверить подключение:
aisha --doctor
Быстрый старт
aisha "объясни, что делает этот проект" # one-shot: один запрос и выход
aisha # без аргументов — интерактивный REPL
python -m aisha ... # эквивалентный вызов
CLI
aisha [промпт...] [флаги]
| Флаг | Описание |
|---|---|
prompt (позиционный) |
запрос; без него запускается REPL |
--server URL |
адрес llama-server (по умолч. http://localhost:8088) |
--model NAME |
имя модели на сервере |
--api-key KEY |
API-ключ для сервера (если требуется авторизация) |
-r, --read-only |
режим только для чтения (только безопасные инструменты) |
--permission auto|ask|deny |
режим запуска shell-команд |
--shell powershell|cmd |
оболочка по умолчанию |
--tools-only |
показать список инструментов и выйти |
--doctor |
диагностика подключения к серверу |
--tool-call-test |
вместе с --doctor: проверить tool calling |
--no-color |
отключить цвета |
--debug |
режим отладки: reasoning модели, дампы запросов/ответов, traceback |
--version |
показать версию |
Конфигурация
Приоритет (каждый слой глубоко сливается с предыдущим):
DEFAULTS ← ~/.aisha/config.toml ← <workspace>/aisha.toml ← env AISHA_* ← CLI-флаги
Полный пример ~/.aisha/config.toml:
[server]
base_url = "http://localhost:8088"
model = "Qwen3.5-9B-Q4_K_XL"
api_key = "" # необязательно; если сервер требует авторизацию (Bearer)
connect_timeout = 5.0
request_timeout = 600.0
[llm]
temperature = 0.6
top_p = 0.9 # необязательно; None = не передавать (используется серверный умолчание)
top_k = 40 # необязательно; целое > 0
repeat_penalty = 1.1 # необязательно; > 0
frequency_penalty = 0.0 # необязательно; -2.0 .. 2.0
max_output_tokens = 32768
context_window = 32768
context_soft_limit = 0.85
max_tool_iterations = 25
tool_guide = false # true — добавить «Справочник инструментов» в системный промпт (для слабых моделей)
[tools]
shell = true
web_search = true
permission = "ask" # auto | ask | deny
shell_type = "powershell"
shell_timeout = 120
max_output_chars = 65536
allow_read_outside_workspace = false
allow_write_outside_workspace = false
[web]
timeout = 20
max_results = 8
max_page_bytes = 2097152
max_content_chars = 50000
allow_private_hosts = false
[memory]
enabled = true
max_block_chars = 30000
[ui]
theme = "dark"
stream = true
show_reasoning = false
debug = false # true — то же, что --debug: reasoning + дампы запросов/ответов
input_history = "~/.aisha/input_history.txt"
Переменные окружения:
| Переменная | Куда |
|---|---|
AISHA_SERVER_URL |
server.base_url |
AISHA_MODEL |
server.model |
AISHA_API_KEY |
server.api_key |
AISHA_PERMISSION |
tools.permission |
AISHA_SHELL |
tools.shell_type |
AISHA_CONTEXT_WINDOW |
llm.context_window |
AISHA_MAX_OUTPUT_TOKENS |
llm.max_output_tokens |
Конфиг строго валидируется: неизвестная секция или ключ вызывает ошибку.
Проектный aisha.toml ограничен в правах безопасности — он не может ставить
permission = "auto", включать доступ за пределы workspace или включать shell,
если тот отключён глобально. Это защита от «троянского» конфига в склонированном репозитории.
Инструменты
| Инструмент | Read-only | Назначение |
|---|---|---|
read_file |
да | чтение файла UTF-8 с offset/limit |
write_file |
нет | создание/перезапись (атомарно) |
edit_file |
нет | точная замена фрагмента текста |
list_dir |
да | содержимое каталога |
glob |
да | поиск файлов по маске |
grep |
да | regex-поиск по содержимому |
run_command |
нет | запуск shell-команды |
web_search |
да | поиск DuckDuckGo |
web_fetch |
да | загрузка веб-страницы |
todowrite |
да | полная замена todo-списка сессии |
ask_user |
да | уточняющий вопрос (только в REPL) |
memory_list / memory_get |
да | список/чтение блоков памяти |
memory_set / memory_replace |
нет | запись/правка блоков памяти |
skill |
да | загрузить текст скилла по имени |
Файловые инструменты не выходят за пределы workspace (path-traversal блокируется),
если не включён соответствующий allow_*_outside_workspace.
Память и скиллы
- Память — JSON-блоки в
~/.aisha/memory/(глобально) и<workspace>/.aisha/memory/(проектно). Проектный блок перекрывает глобальный с тем жеlabel. Вызовmemory_getне выводится в консоль (это фоновое чтение собственной памяти агента). - Скиллы — каталоги
~/.aisha/skills/<name>/SKILL.mdи<workspace>/.aisha/skills/<name>/SKILL.mdс обязательным YAML-frontmatter (name,description).
Кастомный системный промпт (SYSTEM.md)
Если в корне проекта есть файл <workspace>/.aisha/SYSTEM.md, его содержимое
полностью заменяет встроенный системный промпт aisha (persona, окружение, правила,
секции памяти и скиллов). При этом «Справочник инструментов» (tool_guide = true),
AGENTS.md и текущий todo-список по-прежнему добавляются после него. Файл обрезается
до 64 КБ, как и AGENTS.md.
REPL
Команды внутри интерактивного режима:
| Команда | Действие |
|---|---|
/help |
справка |
/new |
новая сессия (сброс истории) |
/status |
сервер, модель, workspace, режим, токены |
/tools |
список инструментов |
/skills |
индекс скиллов |
/memory |
блоки памяти |
/compact |
принудительное сжатие истории |
/doctor |
проверка соединения |
/init |
изучить проект и создать AGENTS.md |
/clear |
очистка экрана |
/quit, /exit, Ctrl+D |
выход |
Дополнительно: Ctrl+C отменяет текущий запрос (REPL не завершается),
Ctrl+↑/↓ — история запросов, Tab — автодополнение команд и путей.
Безопасность
- Запуск shell-команд в режиме
permission = "ask"требует подтверждения; опасные команды (rm -rf,Remove-Item -Recurse,git reset --hardи т.п.) подтверждаются всегда. web_fetchблокирует private/localhost/loopback-адреса (SSRF-защита), если не включёнweb.allow_private_hosts.find_dangerвshell.py— эвристика по regex, а не песочница: обойти её можно. Не запускайте aisha от имени пользователя с повышенными правами в недоверенном окружении.
Разработка
pip install -e ".[dev]"
pytest # весь набор; реальный сервер не нужен
pytest tests/test_config.py # один тест
ruff check . # линт (E, F, I, W; line-length 100)
Тесты не ходят в реальный сервер: test_client.py подменяет транспорт
httpx.MockTransport, конфиг-тесты подменяют Path.home.
Структура проекта
src/aisha/
├── cli.py # entry point: args → config → registry → client → AgentLoop → UI
├── client.py # async SSE-клиент к llama-server, ретраи, tool-call сборка
├── agent.py # AgentLoop: цикл модель↔инструменты, компакция
├── context.py # системный промпт, история, оценка токенов
├── config.py # конфигурация, валидация, безопасность
├── memory.py # постоянная память (блоки)
├── skills.py # скиллы (SKILL.md)
├── ui.py # ConsoleUI: rich + prompt_toolkit, REPL
├── fsutil.py # атомарная запись, проверка путей, human_size
├── errors.py # иерархия исключений
└── tools/ # реализации инструментов (base, files, shell, web, extras)
Metadata
Release files for aisha 0.2.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| aisha-0.2.3.tar.gz | 56.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| aisha-0.2.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 115.5 kB
Release files / aisha-0.2.3.tar.gz
| Download URL | aisha-0.2.3.tar.gz |
|---|---|
| Size | 56.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
85c56f01f5afb1609d850b731a99ee7d8f0031e6a6cbb7a4394c45e02bc4b839
|
|
BLAKE2b-256 checksum How to use checksums |
b00ef235bdc624b2614781c05f473967c44d65fcb194d0cd17b3683e94cee0bd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.13
|
Release files / aisha-0.2.3-py3-none-any.whl
| Download URL | aisha-0.2.3-py3-none-any.whl |
|---|---|
| Size | 58.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a37dbe7bfbc616a905ae6cfc7fcc2b31acabc2d6c08cfa4b09bf8344bd0f9b0a
|
|
BLAKE2b-256 checksum How to use checksums |
3a3c09bec6167a5964b20064803f7f0f2f10eaaa6cd6c60b5cbb44318a527539
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.13
|