Metadata-Version: 2.4
Name: aec-document-review
Version: 0.1.0
Summary: An LLM agent that reviews architecture, engineering and construction documents (drawings, specifications, reports, calculations) as a Streamlit page: it looks at the pages, not only the text, and hands back Word memos and marked-up PDFs.
License-Expression: MIT
Project-URL: Homepage, https://github.com/soconnell345-geotech/GeotechStaffEngineer
Project-URL: Repository, https://github.com/soconnell345-geotech/GeotechStaffEngineer/tree/master/packages/aec-document-review
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Science/Research
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Scientific/Engineering
Requires-Python: >=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: aec-agent-core==1.0.0
Requires-Dist: planlens==0.15.0
Requires-Dist: streamlit>=1.39
Requires-Dist: requests>=2
Requires-Dist: websockets<16,>=14
Provides-Extra: azure
Requires-Dist: azure-identity>=1.21; extra == "azure"
Requires-Dist: azure-keyvault-secrets>=4.9; extra == "azure"
Requires-Dist: cryptography>=42; extra == "azure"
Dynamic: license-file

# aec-document-review

**Document Review**: an LLM agent that reviews architecture, engineering and
construction (AEC) documents, as a Streamlit page. Upload drawings,
specifications, submittals, reports or calculation packages; it reads the
text, looks at the pages where the text is not the page (drawings, scans,
tables drawn as lines), answers with the sheet or page it found each thing
on, and hands back Word memos and marked-up copies of the PDF. A review aid:
the judgement stays with the reviewer, and every markup it writes is signed
as an AI draft.

It runs on two packages of the same project:

- [`aec-agent-core`](https://pypi.org/project/aec-agent-core/), the shared
  core (model connections, vision calls, guards and records, Word and
  Excel), pinned exactly;
- [`planlens`](https://pypi.org/project/planlens/), the document layer
  (page maps, located text, tables, review markups), pinned exactly.

It imports nothing geotechnical. The geotechnical agent it was split from,
GeotechStaffEngineer, is a separate package.

## Install

```
pip install aec-document-review
pip install "aec-document-review[azure]"   # Key Vault and certificate sign-in
```

Python 3.11 or later; it is tested on 3.11 and 3.12. A host behind a package
mirror installs it from the mirror like any other package; a wheel installed
by path works the same way.

## Run

```
aec-document-review                       # streamlit run of the page
aec-document-review --server.port 8502    # further arguments go to Streamlit
```

or, in a host that starts Streamlit on a script of its own (an `app.py` of a
few lines):

```python
from aec_document_review.tinyapps_entry import main
main()
```

With no model configured the page starts and says so in a banner.

## Settings

Read from the environment, then from an Azure Key Vault (when `KV_NAME`
names one and the host has a managed identity), then from a `.env` file in
the working folder.

| Setting | What it is |
|---|---|
| `PROMPTER_URL`, `PROMPTER_MODEL`, `PROMPTER_API_KEY`, `PROMPTER_CA_BUNDLE` | The OpenAI-compatible model endpoint (the "Prompter"), its model (it must accept images), the key, and a CA bundle for the endpoint's certificate |
| `PROMPTER-API-KEY--<NAME>`, `PROMPTER_KEYS`, `PROMPTER_SHARED_KEY_FALLBACK` | One key per signed-in user (a Key Vault secret per user, or a JSON map), and whether a user without one may use the shared key |
| `KV_NAME` | The Key Vault the settings above may be read from |
| `GRAPH_TENANT_ID`, `GRAPH_CLIENT_ID`, `GRAPH_CLIENT_SECRET` (or `GRAPH_CLIENT_CERT`, `GRAPH_CLIENT_KEY`, `GRAPH_CLIENT_KEY_PASSWORD`, `GRAPH_CLIENT_CERT_THUMBPRINT`) | An app registration that may read and write the SharePoint site, by secret or certificate |
| `SHAREPOINT_SITE_URL` (or `SHAREPOINT_SITE_URLS`), `GEOTECH_SHAREPOINT_ROOT` | The site, or several, and the folder conversations are kept in; the cloud is read off the site's address (`GRAPH_CLOUD` to set it) |
| `X-Windows-Auth-Header` (a request header, `WINDOWS_AUTH_HEADER` to rename it) | The signed-in user, as a reverse proxy doing Windows sign-in passes it; each user's conversations are kept apart |
| `DEV_IDENTITY` | A stand-in for that header on a laptop (`DOMAIN\user`) |
| `GEOTECH_WEBAPP_DATA` | The folder conversations are kept in locally |
| `GEOTECH_MARKUP_AUTHOR` | Who markups are signed by (default: `<user> via Document Review (AI draft)`) |
| `GEOTECH_INSTRUCTIONS` | A folder of the deployment's own instructions for the agents: `all.md` for every agent and helper, then one `<role>.md` per role (`main`, `general-purpose` for the reading helper, `figure`). Each role's text goes last in its prompt, under protected rules the text cannot switch off, at most 4,000 characters a role; the connection diagnostics say what each role gets. Details: GeotechStaffEngineer's [`webapp/README.md`](https://github.com/soconnell345-geotech/GeotechStaffEngineer/blob/master/webapp/README.md), "Your deployment's own instructions" |

The settings keep the `GEOTECH_` names the page had before the split, so a
deployment carries on unchanged.

The project's deployment notes are in its repository:
[`tinyapps/TINYAPPS.md`](https://github.com/soconnell345-geotech/GeotechStaffEngineer/blob/master/tinyapps/TINYAPPS.md)
and the wrapper template
[`tinyapps/wrapper_repo/`](https://github.com/soconnell345-geotech/GeotechStaffEngineer/tree/master/tinyapps/wrapper_repo).

## The review suite

The 38 review tasks the page is measured on, with deterministic checks, run
through the core's suite framework on this page:

```python
from aec_document_review.review_eval import score_review_suite
score_review_suite(model, out_dir="review_eval_run", docs_dir="docs",
                   dry_run=True)   # lists the tasks and checks the documents
```

## Licence

MIT. See `LICENSE`.
