Metadata-Version: 2.5
Name: nanoinfra
Version: 0.9.1
Summary: A lightweight self-hosted AI agent for infrastructure
Project-URL: Homepage, https://github.com/nanoinfraorg/nanoinfra
Project-URL: Repository, https://github.com/nanoinfraorg/nanoinfra
Project-URL: Issues, https://github.com/nanoinfraorg/nanoinfra/issues
Project-URL: Changelog, https://docs.nanoinfra.org/release-archive/
Author: Xubin Ren, the nanobot contributors, Alberto Ferrer
License: MIT
License-File: LICENSE
License-File: THIRD_PARTY_NOTICES.md
Keywords: agent,ai,chatbot
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Requires-Python: >=3.11
Requires-Dist: anthropic<1.0.0,>=0.100.0
Requires-Dist: chardet<6.0.0,>=3.0.2
Requires-Dist: croniter<7.0.0,>=6.0.0
Requires-Dist: cryptography<46.0.0,>=42.0.0
Requires-Dist: ddgs<10.0.0,>=9.5.5
Requires-Dist: defusedxml<1.0.0,>=0.7.1
Requires-Dist: dulwich<1.0.0,>=0.22.0
Requires-Dist: filelock>=3.25.2
Requires-Dist: httpx<1.0.0,>=0.28.0
Requires-Dist: jinja2<4.0.0,>=3.1.0
Requires-Dist: json-repair<1.0.0,>=0.57.0
Requires-Dist: loguru<1.0.0,>=0.7.3
Requires-Dist: lxml-html-clean<1.0.0,>=0.4.0
Requires-Dist: mcp<2.0.0,>=1.26.0
Requires-Dist: oauth-cli-kit<1.0.0,>=0.1.6
Requires-Dist: openai>=2.8.0
Requires-Dist: openpyxl<4.0.0,>=3.1.0
Requires-Dist: packaging>=24.0
Requires-Dist: prompt-toolkit<4.0.0,>=3.0.50
Requires-Dist: pydantic-settings<3.0.0,>=2.12.0
Requires-Dist: pydantic<3.0.0,>=2.12.0
Requires-Dist: pypdf<6.0.0,>=5.0.0
Requires-Dist: pytest-playwright>=0.8.0
Requires-Dist: python-docx<2.0.0,>=1.1.0
Requires-Dist: python-pptx<2.0.0,>=1.0.0
Requires-Dist: pyyaml<7.0.0,>=6.0
Requires-Dist: questionary<3.0.0,>=2.0.0
Requires-Dist: readability-lxml<1.0.0,>=0.8.4
Requires-Dist: rich<15.0.0,>=14.0.0
Requires-Dist: tiktoken<1.0.0,>=0.12.0
Requires-Dist: typer<1.0.0,>=0.20.0
Requires-Dist: tzdata>=2025.2
Requires-Dist: watchfiles<2.0.0,>=1.1.1
Requires-Dist: websocket-client<2.0.0,>=1.9.0
Requires-Dist: websockets<17.0,>=15.0
Provides-Extra: api
Requires-Dist: aiohttp<4.0.0,>=3.9.0; extra == 'api'
Provides-Extra: azure
Requires-Dist: azure-identity<2.0.0,>=1.19.0; extra == 'azure'
Provides-Extra: bedrock
Requires-Dist: boto3>=1.43.0; extra == 'bedrock'
Provides-Extra: dev
Requires-Dist: aiohttp<4.0.0,>=3.9.0; extra == 'dev'
Requires-Dist: basedpyright<2.0.0,>=1.39.0; extra == 'dev'
Requires-Dist: msgpack<2.0.0,>=1.1.0; extra == 'dev'
Requires-Dist: openpyxl<4.0.0,>=3.1.0; extra == 'dev'
Requires-Dist: pymupdf>=1.25.0; extra == 'dev'
Requires-Dist: pypdf<6.0.0,>=5.0.0; extra == 'dev'
Requires-Dist: pytest-asyncio<2.0.0,>=1.3.0; extra == 'dev'
Requires-Dist: pytest-cov<7.0.0,>=6.0.0; extra == 'dev'
Requires-Dist: pytest-xdist<4.0.0,>=3.8.0; extra == 'dev'
Requires-Dist: pytest<10.0.0,>=9.0.0; extra == 'dev'
Requires-Dist: python-docx<2.0.0,>=1.1.0; extra == 'dev'
Requires-Dist: python-pptx<2.0.0,>=1.0.0; extra == 'dev'
Requires-Dist: python-socketio<6.0.0,>=5.16.0; extra == 'dev'
Requires-Dist: respx<1.0.0,>=0.21.0; extra == 'dev'
Requires-Dist: ruff>=0.1.0; extra == 'dev'
Provides-Extra: documents
Requires-Dist: defusedxml<1.0.0,>=0.7.1; extra == 'documents'
Requires-Dist: openpyxl<4.0.0,>=3.1.0; extra == 'documents'
Requires-Dist: pypdf<6.0.0,>=5.0.0; extra == 'documents'
Requires-Dist: python-docx<2.0.0,>=1.1.0; extra == 'documents'
Requires-Dist: python-pptx<2.0.0,>=1.0.0; extra == 'documents'
Provides-Extra: langfuse
Requires-Dist: langfuse<4.0.0,>=3.0.0; extra == 'langfuse'
Provides-Extra: olostep
Requires-Dist: olostep>=0.1.0; (python_version < '3.14') and extra == 'olostep'
Provides-Extra: pdf
Requires-Dist: pypdf<6.0.0,>=5.0.0; extra == 'pdf'
Provides-Extra: secrets-postgres
Requires-Dist: psycopg[binary]<4.0.0,>=3.1.0; extra == 'secrets-postgres'
Provides-Extra: servers
Requires-Dist: ansible-runner<3.0.0,>=2.4.0; extra == 'servers'
Requires-Dist: asyncssh<3.0.0,>=2.14.0; extra == 'servers'
Requires-Dist: boto3>=1.43.0; extra == 'servers'
Description-Content-Type: text/markdown

<picture>
  <source media="(prefers-color-scheme: dark)" srcset="./images/readme-cover-dark.svg">
  <img alt="nanoinfra README cover" src="./images/readme-cover-light.svg">
</picture>

<div align="center">
  <p>
    <a href="https://github.com/nanoinfraorg/nanoinfra"><img src="https://img.shields.io/github/stars/nanoinfraorg/nanoinfra?style=flat&logo=github" alt="GitHub stars"></a>
    <a href="https://pypi.org/project/nanoinfra/"><img src="https://img.shields.io/pypi/v/nanoinfra" alt="PyPI version"></a>
    <a href="https://github.com/nanoinfraorg/nanoinfra/actions/workflows/ci.yml"><img src="https://github.com/nanoinfraorg/nanoinfra/actions/workflows/ci.yml/badge.svg?branch=main" alt="Test Suite"></a>
    <a href="https://pypi.org/project/nanoinfra/"><img src="https://img.shields.io/badge/python-%3E%3D3.11-blue" alt="Python 3.11 or newer"></a>
    <a href="https://github.com/nanoinfraorg/nanoinfra/blob/main/LICENSE"><img src="https://img.shields.io/github/license/nanoinfraorg/nanoinfra" alt="MIT License"></a>
  </p>
  <p>
    <a href="https://github.com/nanoinfraorg/nanoinfra/blob/main/COMMUNICATION.md">GitHub / Email</a>
  </p>
</div>

# nanoinfra

**nanoinfra** is an ultra-lightweight, open-source, self-hosted AI agent for infrastructure work, written in Python. It keeps an inventory of your servers, the credentials to reach them, and the tools to act on them over SSH, Ansible, AWS SSM, or an HTTP endpoint — reachable from a WebUI, a terminal, or sixteen chat apps. Tools, long-term memory, MCP integrations, model routing, multi-agent delegation, scheduled automation, and an OpenAI-compatible API sit in a core small enough to audit.

Root access, on a short leash: the agent reaches your hosts with credentials you hold, behind sender allowlists, a kernel sandbox, and mutating tools that default to a dry run — while running unprivileged itself.

Full docs, install instructions, and guides: see the [GitHub repository](https://github.com/nanoinfraorg/nanoinfra).
