Metadata-Version: 2.3
Name: contract-to-tree
Version: 0.1.1
Summary: 
Author: Jarosław Jezierczak
Author-email: jezierczak@gmail.com
Requires-Python: >=3.10,<4.0
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Requires-Dist: odfpy (>=1.4,<2.0)
Requires-Dist: openai (>=1.0,<2.0)
Requires-Dist: openpyxl (>=3.1,<4.0)
Requires-Dist: pdfplumber (>=0.11,<1.0)
Requires-Dist: pydantic (>=2.10,<3.0)
Requires-Dist: python-dotenv (>=1.0,<2.0)
Requires-Dist: xlrd (>=2.0,<3.0)
Description-Content-Type: text/markdown

# contract-to-tree

Biblioteka do zamiany kosztorysów budowlanych i instalacyjnych na ustandaryzowane drzewo JSON.

## Stan projektu

Obecnie dostępny jest bazowy parser regułowy dla plików `.xlsx`, `.xls` i `.ods` oraz pierwszy parser PDF-ów tekstowych. Obsługiwane są:

- arkusze z nagłówkami w różnych wierszach;
- grupy i pozycje kosztorysowe;
- ilość, jednostka, cena jednostkowa i cena końcowa;
- składniki kosztu: materiał, robocizna i sprzęt;
- źródło pozycji: plik, arkusz i numer wiersza;
- ostrzeżenia, poziom pewności i wartości wyliczone;
- płaski wynik oraz drzewo o konfigurowalnej głębokości.

## Uruchomienie

Opcjonalna konfiguracja LLM:

```bash
Copy-Item .env.example .env
```

Następnie wpisz lokalnie `OPENAI_API_KEY`. Domyślny model to `gpt-4o-mini`. Klucz nie powinien być wpisywany do kodu ani commitowany do repozytorium.

```bash
.venv\Scripts\python.exe -m contract_to_tree.cli parse assets\budowlanka_oferty.xlsx --max-depth 2
```

Zapis do pliku:

```bash
.venv\Scripts\python.exe -m contract_to_tree.cli parse assets\budowlanka_oferty.xlsx --output wynik.json
```

PDF tekstowy:

```bash
.venv\Scripts\python.exe -m contract_to_tree.cli parse "assets\kosztorys-oferta_bez_podpisu.pdf" --strategy pdf-rules --output wynik.json
```

Raport zbiorczy dla katalogu próbek:

```bash
.venv\Scripts\python.exe -m contract_to_tree.cli benchmark assets --output benchmark.json
```

Jawne użycie strategii OpenAI:

```bash
.venv\Scripts\python.exe -m contract_to_tree.cli parse "assets\Przedmiar elektryka.xlsx" --strategy llm-openai --output wynik-llm.json
```

Ta strategia wykonuje zewnętrzne zapytanie API i nie jest uruchamiana przez zwykły benchmark.

Strategia odkrywania schematu nagłówka:

```bash
.venv\Scripts\python.exe -m contract_to_tree.cli parse "assets\budowlanka_oferty.xlsx" --strategy schema-llm --output wynik-schema-llm.json
```

W tym wariancie LLM interpretuje tylko nagłówek i kilka przykładowych wierszy, a cały dokument parsują następnie reguły.

## Testy

```bash
.venv\Scripts\python.exe -m unittest discover -s tests -v
```

Opis modelu danych i dalszych wariantów znajduje się w [USTALENIA.md](USTALENIA.md).

## Stabilny interfejs biblioteczny

Najprostsze użycie w innym projekcie:

```python
from contract_to_tree import parse_document

estimate = parse_document("kosztorys.xlsx", max_depth=2)
payload = estimate.model_dump(mode="json")
```

`parse_document()` oraz model `CostEstimate` są głównym interfejsem publicznym.
Nowe strategie powinny nadal zwracać `CostEstimate` w schemacie `1.0`.
Mapowania LLM są lokalnie walidowane pod kątem opisów, ilości i cen; błędny
kandydat jest zastępowany najlepszym kandydatem regułowym.

