Metadata-Version: 2.4
Name: unpage
Version: 0.1.0a28
Summary: An agent framework for production engineering
License-File: LICENSE.md
Requires-Python: >=3.12
Requires-Dist: aioboto3==15.1.0
Requires-Dist: aiobotocore==2.24.0
Requires-Dist: aiofiles==24.1.0
Requires-Dist: aiohappyeyeballs==2.6.1
Requires-Dist: aiohttp==3.11.18
Requires-Dist: aioitertools==0.12.0
Requires-Dist: aiosignal==1.3.2
Requires-Dist: aiosonic==0.15.1
Requires-Dist: alembic==1.16.4
Requires-Dist: annotated-types==0.7.0
Requires-Dist: anyio==4.10.0
Requires-Dist: asyncache==0.3.1
Requires-Dist: asyncer==0.0.8
Requires-Dist: attrs==25.3.0
Requires-Dist: authlib==1.6.0
Requires-Dist: backoff==2.2.1
Requires-Dist: blinker==1.9.0
Requires-Dist: boltons==25.0.0
Requires-Dist: boto3==1.39.11
Requires-Dist: botocore==1.39.11
Requires-Dist: cachetools==5.5.2
Requires-Dist: certifi==2025.4.26
Requires-Dist: cffi==1.17.1; platform_python_implementation != 'PyPy'
Requires-Dist: chardet==4.0.0
Requires-Dist: charset-normalizer==3.4.2
Requires-Dist: click==8.1.8
Requires-Dist: cloudpickle==3.1.1
Requires-Dist: colorama==0.4.6; sys_platform == 'win32'
Requires-Dist: colorlog==6.9.0
Requires-Dist: contourpy==1.3.2
Requires-Dist: cryptography==45.0.3
Requires-Dist: cycler==0.12.1
Requires-Dist: cyclopts==3.22.5
Requires-Dist: databricks-sdk==0.59.0
Requires-Dist: datadog-api-client==2.34.0
Requires-Dist: diskcache==5.6.3
Requires-Dist: distro==1.9.0
Requires-Dist: dnspython==2.7.0
Requires-Dist: docker==7.1.0
Requires-Dist: docstring-parser==0.17.0; python_full_version < '4'
Requires-Dist: docutils==0.21.2
Requires-Dist: dotenv==0.9.9
Requires-Dist: dspy==3.0.1
Requires-Dist: email-validator==2.2.0
Requires-Dist: exceptiongroup==1.2.2
Requires-Dist: fastapi-cli==0.0.8
Requires-Dist: fastapi-cloud-cli==0.1.4
Requires-Dist: fastapi==0.116.1
Requires-Dist: fastmcp==2.11.3
Requires-Dist: filelock==3.18.0
Requires-Dist: flask==3.1.1
Requires-Dist: fonttools==4.57.0
Requires-Dist: frozenlist==1.6.0
Requires-Dist: fsspec==2025.3.0
Requires-Dist: gepa==0.0.4
Requires-Dist: gitdb==4.0.12
Requires-Dist: gitpython==3.1.44
Requires-Dist: google-auth==2.40.3
Requires-Dist: graphene==3.4.3
Requires-Dist: graphql-core==3.2.6
Requires-Dist: graphql-relay==3.2.0
Requires-Dist: graphviz==0.21
Requires-Dist: greenlet==3.2.3; (python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')
Requires-Dist: gunicorn==23.0.0; sys_platform != 'win32'
Requires-Dist: h11==0.16.0
Requires-Dist: h2==4.1.0
Requires-Dist: hf-xet==1.1.5; platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'
Requires-Dist: hpack==4.0.0
Requires-Dist: httpcore==1.0.9
Requires-Dist: httptools==0.6.4
Requires-Dist: httpx-sse==0.4.0
Requires-Dist: httpx-ws==0.7.2
Requires-Dist: httpx==0.28.1
Requires-Dist: huggingface-hub==0.33.4
Requires-Dist: human-readable==2.0.0
Requires-Dist: hyperframe==6.0.1
Requires-Dist: idna==3.10
Requires-Dist: importlib-metadata==8.7.0
Requires-Dist: isodate==0.7.2
Requires-Dist: itsdangerous==2.2.0
Requires-Dist: jinja2==3.1.6
Requires-Dist: jiter==0.10.0
Requires-Dist: jmespath==1.0.1
Requires-Dist: joblib==1.5.1
Requires-Dist: json-repair==0.48.0
Requires-Dist: jsonschema-path==0.3.4
Requires-Dist: jsonschema-specifications==2025.4.1
Requires-Dist: jsonschema==4.24.0
Requires-Dist: kiwisolver==1.4.8
Requires-Dist: kr8s==0.20.9
Requires-Dist: lazy-object-proxy==1.11.0
Requires-Dist: litellm==1.75.8
Requires-Dist: magicattr==0.1.6
Requires-Dist: mako==1.3.10
Requires-Dist: markdown-it-py==3.0.0
Requires-Dist: markupsafe==3.0.2
Requires-Dist: matplotlib==3.10.5
Requires-Dist: mcp==1.13.0
Requires-Dist: mdurl==0.1.2
Requires-Dist: mlflow-skinny==3.2.0
Requires-Dist: mlflow-tracing==3.2.0
Requires-Dist: mlflow==3.2.0
Requires-Dist: more-itertools==10.7.0
Requires-Dist: multidict==6.4.3
Requires-Dist: networkx==3.5
Requires-Dist: numpy==2.2.6
Requires-Dist: onecache==0.3.1
Requires-Dist: openai==1.99.8
Requires-Dist: openapi-core==0.19.5
Requires-Dist: openapi-pydantic==0.5.1
Requires-Dist: openapi-schema-validator==0.6.3
Requires-Dist: openapi-spec-validator==0.7.2
Requires-Dist: opentelemetry-api==1.35.0
Requires-Dist: opentelemetry-sdk==1.35.0
Requires-Dist: opentelemetry-semantic-conventions==0.56b0
Requires-Dist: optuna==4.4.0
Requires-Dist: packaging==25.0
Requires-Dist: pagerduty==4.0.0
Requires-Dist: pandas==2.3.1
Requires-Dist: parse==1.20.2
Requires-Dist: pathable==0.4.4
Requires-Dist: pillow==11.2.1
Requires-Dist: prompt-toolkit==3.0.51
Requires-Dist: propcache==0.3.1
Requires-Dist: protobuf==6.31.1
Requires-Dist: pyarrow==20.0.0
Requires-Dist: pyasn1-modules==0.4.2
Requires-Dist: pyasn1==0.6.1
Requires-Dist: pycparser==2.22; platform_python_implementation != 'PyPy'
Requires-Dist: pydantic-core==2.33.2
Requires-Dist: pydantic-settings==2.10.1
Requires-Dist: pydantic-yaml==1.6.0
Requires-Dist: pydantic==2.11.7
Requires-Dist: pydot==4.0.1
Requires-Dist: pygments==2.19.1
Requires-Dist: pyngrok==7.3.0
Requires-Dist: pyparsing==3.2.3
Requires-Dist: pyperclip==1.9.0
Requires-Dist: python-box==7.3.2
Requires-Dist: python-dateutil==2.9.0.post0
Requires-Dist: python-dotenv==1.1.0
Requires-Dist: python-jsonpath==1.3.1
Requires-Dist: python-multipart==0.0.20
Requires-Dist: pytz==2025.2
Requires-Dist: pywin32==311; sys_platform == 'win32'
Requires-Dist: pyyaml==6.0.2
Requires-Dist: questionary==2.1.0
Requires-Dist: referencing==0.36.2
Requires-Dist: regex==2024.11.6
Requires-Dist: requests==2.32.4
Requires-Dist: rfc3339-validator==0.1.4
Requires-Dist: rich-rst==1.3.1
Requires-Dist: rich-toolkit==0.14.8
Requires-Dist: rich==14.0.0
Requires-Dist: rignore==0.6.4
Requires-Dist: rpds-py==0.26.0
Requires-Dist: rsa==4.9.1
Requires-Dist: ruamel-yaml-clib==0.2.12; python_full_version < '3.14' and platform_python_implementation == 'CPython'
Requires-Dist: ruamel-yaml==0.18.12
Requires-Dist: s3transfer==0.13.0
Requires-Dist: scapy==2.6.1
Requires-Dist: scikit-learn==1.6.1
Requires-Dist: scipy==1.15.2
Requires-Dist: sentry-sdk==2.35.0
Requires-Dist: shellingham==1.5.4
Requires-Dist: six==1.17.0
Requires-Dist: smmap==5.0.2
Requires-Dist: sniffio==1.3.1
Requires-Dist: sqlalchemy==2.0.41
Requires-Dist: sqlparse==0.5.3
Requires-Dist: sse-starlette==2.3.4
Requires-Dist: starlette==0.46.2
Requires-Dist: tenacity==9.1.2
Requires-Dist: threadpoolctl==3.6.0
Requires-Dist: tiktoken==0.9.0
Requires-Dist: tokenizers==0.21.2
Requires-Dist: tqdm==4.67.1
Requires-Dist: typer==0.16.0
Requires-Dist: typing-extensions==4.13.2
Requires-Dist: typing-inspection==0.4.0
Requires-Dist: tzdata==2025.2
Requires-Dist: ujson==5.10.0
Requires-Dist: urllib3==2.4.0
Requires-Dist: uvicorn==0.35.0
Requires-Dist: uvloop==0.21.0; platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'
Requires-Dist: waitress==3.0.2; sys_platform == 'win32'
Requires-Dist: watchfiles==1.1.0
Requires-Dist: wcwidth==0.2.13
Requires-Dist: websockets==15.0.1
Requires-Dist: werkzeug==3.1.1
Requires-Dist: wrapt==1.17.2
Requires-Dist: wsproto==1.2.0
Requires-Dist: xxhash==3.5.0
Requires-Dist: yarl==1.20.0
Requires-Dist: zipp==3.23.0
Description-Content-Type: text/markdown

# Unpage
<img width="830" height="180" alt="unpage-banner" src="https://github.com/user-attachments/assets/2f0d2ee7-cbef-4bbb-9189-8a992b512c81" />

> [!WARNING]
> **ALPHA SOFTWARE**
> Unpage is experimental, under heavy development, and may be unstable. Use at your own risk!

Unpage is an infrastructure knowledge graph builder, and an MCP server to enable your LLM-powered application to understand and query your infrastructure.


## Installation

### Prerequisites

- Python 3.12 or higher
- `uv` package manager
- API keys for your LLM and alerting, infrastructure, and observability tools. Learn more in [Plugins](https://docs.aptible.ai/concepts/plugins).

### Install uv

On macOS:
```shell
brew install uv
```

For other platforms, follow the [official uv installation guide](https://github.com/astral-sh/uv).

### Install Unpage

Unpage is designed to be run using `uvx`, which comes with `uv`:

```shell
uvx unpage -h
```

## Quickstart

To get started, run:

```shell
uvx unpage agent quickstart
```

This will get you up and running with your first agent, which will automatically investigate and add context to alerts from [PagerDuty](https://docs.aptible.ai/plugins/pagerduty) (or your preferred alerting provider). You will also have a chance to set up your infrastructure knowledge graph to provide your agent with more context.

The quickstart flow will walk you through:

- Configuring your LLM, [PagerDuty plugin](https://docs.aptible.ai/plugins/pagerduty), and logs and metrics plugins
- Creating your first [agent](https://docs.aptible.ai/concepts/agents) and prompt
- Testing your agent with an existing incident ticket
- Building your [knowledge graph](https://docs.aptible.ai/concepts/knowledge-graph)

### Running the Agent

Once you're happy with the results of your agent, you can automate the agent's actions for new incidents by running `unpage agent serve` and configuring [PagerDuty to send webhooks](https://docs.aptible.ai/plugins/pagerduty#webhooks) to the Unpage server:

```shell
uvx unpage agent serve -h
```

The `agent serve` command supports running the server over an ngrok tunnel, so that you can test your agents end-to-end locally, without deploying. For more information on `agent serve` options, see [its documentation](https://docs.aptible.ai/commands/agent#subcommand%3A-serve).

## Documentation

Detailed documentation lives in [docs/](docs/), and is also published via Mintlify to [docs.aptible.ai](https://docs.aptible.ai).

## License

See [LICENSE.md](./LICENSE.md).

## Copyright

Copyright (c) 2025 Aptible. All rights reserved.
