Skip to content

A bill of quantities does not end at a page break.

Franz Bettag’s GAEB project combines PDF text, vision models and a review interface. The goal is a traceable bill of quantities: heading hierarchy, complete descriptions, quantities and a controlled X83/X84 export.

Fictional Werkraum project with four fit-out items, full descriptions, quantities and unit prices.
Fictional source · 1 PDF page

One bill of quantities. Two exchange phases.

X83 contains specifications and quantities. The matching X84 contains bid prices. Item identifiers connect the two files.

Manually reviewed fictional bill of quantities, not measured AI output
Item Quantity Unit price
01.01.0010Wandflächen vorbereiten 24.000 8.500 EUR
01.01.0020Wandanstrich ausführen 24.000 14.750 EUR
01.01.0030Sockelleisten montieren 18.500m 11.200 EUR
01.01.0040Abschlusskontrolle 1.000St 45.000 EUR

4 items · EUR 810.20 bid total excluding VAT · X83 and X84 validated against GAEB XSD.

{
  "bidder": "Fiktiver Musterbetrieb",
  "bidder_city": "Musterort",
  "bidder_postcode": "00000",
  "bidder_street": "Beispielstraße 1",
  "currency": "EUR",
  "document_sha256": "91faa4998e3dba7aeeaae66d4dd78f873c16ea46226d25b35e5689f37dc7609d",
  "issues": [],
  "lv_id": "DEMO-WERKRAUM",
  "name": "Fiktives Referenzbeispiel, manuell übertragen",
  "nodes": [
    {
      "alternative_group": null,
      "alternative_rank": null,
      "complements": [],
      "field_sources": {},
      "id": "title01",
      "include_in_total": null,
      "issues": [],
      "item_type": "normal",
      "kind": "heading",
      "long_text": "",
      "oz": "01",
      "parent_id": null,
      "parent_oz": null,
      "quantity": null,
      "short_text": "Ausbau",
      "sources": [],
      "unit": null,
      "unit_price": null
    },
    {
      "alternative_group": null,
      "alternative_rank": null,
      "complements": [],
      "field_sources": {},
      "id": "title0101",
      "include_in_total": null,
      "issues": [],
      "item_type": "normal",
      "kind": "heading",
      "long_text": "",
      "oz": "01.01",
      "parent_id": "title01",
      "parent_oz": "01",
      "quantity": null,
      "short_text": "Oberflächen",
      "sources": [],
      "unit": null,
      "unit_price": null
    },
    {
      "alternative_group": null,
      "alternative_rank": null,
      "complements": [],
      "field_sources": {},
      "id": "item0010",
      "include_in_total": null,
      "issues": [],
      "item_type": "normal",
      "kind": "item",
      "long_text": "Lose Beschichtungen entfernen und den Untergrund trocken reinigen.\nAnschlüsse an Fenster und Türen sorgfältig abkleben. Staub und Restmaterial fachgerecht aufnehmen.",
      "oz": "01.01.0010",
      "parent_id": "title0101",
      "parent_oz": "01.01",
      "quantity": "24.000",
      "short_text": "Wandflächen vorbereiten",
      "sources": [
        {
          "bbox": null,
          "line_ids": [],
          "method": "manual_reference",
          "page": 1
        }
      ],
      "unit": "m2",
      "unit_price": "8.500"
    },
    {
      "alternative_group": null,
      "alternative_rank": null,
      "complements": [],
      "field_sources": {},
      "id": "item0020",
      "include_in_total": null,
      "issues": [],
      "item_type": "normal",
      "kind": "item",
      "long_text": "Zweifacher Anstrich mit weißer Innenwandfarbe auf vorbereitetem Untergrund.\nDie Fläche muss nach dem Trocknen gleichmäßig deckend sein. Abklebungen entfernen und die Arbeitsstelle sauber übergeben.",
      "oz": "01.01.0020",
      "parent_id": "title0101",
      "parent_oz": "01.01",
      "quantity": "24.000",
      "short_text": "Wandanstrich ausführen",
      "sources": [
        {
          "bbox": null,
          "line_ids": [],
          "method": "manual_reference",
          "page": 1
        }
      ],
      "unit": "m2",
      "unit_price": "14.750"
    },
    {
      "alternative_group": null,
      "alternative_rank": null,
      "complements": [],
      "field_sources": {},
      "id": "item0030",
      "include_in_total": null,
      "issues": [],
      "item_type": "normal",
      "kind": "item",
      "long_text": "Sockelleisten aus Holz liefern, ablängen und befestigen. Gehrungen an Ecken herstellen.\nSichtbare Oberflächen dürfen keine offenen Befestigungslöcher aufweisen.",
      "oz": "01.01.0030",
      "parent_id": "title0101",
      "parent_oz": "01.01",
      "quantity": "18.500",
      "short_text": "Sockelleisten montieren",
      "sources": [
        {
          "bbox": null,
          "line_ids": [],
          "method": "manual_reference",
          "page": 1
        }
      ],
      "unit": "m",
      "unit_price": "11.200"
    },
    {
      "alternative_group": null,
      "alternative_rank": null,
      "complements": [],
      "field_sources": {},
      "id": "item0040",
      "include_in_total": null,
      "issues": [],
      "item_type": "normal",
      "kind": "item",
      "long_text": "Alle bearbeiteten Flächen gemeinsam begehen. Kleine Fehlstellen unmittelbar nacharbeiten.\nEin kurzes Protokoll mit Datum und ausgeführten Nacharbeiten übergeben.",
      "oz": "01.01.0040",
      "parent_id": "title0101",
      "parent_oz": "01.01",
      "quantity": "1.000",
      "short_text": "Abschlusskontrolle",
      "sources": [
        {
          "bbox": null,
          "line_ids": [],
          "method": "manual_reference",
          "page": 1
        }
      ],
      "unit": "St",
      "unit_price": "45.000"
    }
  ],
  "page_count": 1,
  "processing_complete": true,
  "project": "Musterprojekt Werkraum",
  "review_status": "synthetic_manual_reference",
  "reviewed": true,
  "schema_version": "lv-1.0"
}
<?xml version='1.0' encoding='UTF-8'?>
<GAEB xmlns="http://www.gaeb.de/GAEB_DA_XML/DA83/3.3">
  <GAEBInfo>
    <Version>3.3</Version>
    <VersDate>2021-05</VersDate>
    <Date>2026-09-08</Date>
    <ProgSystem>Bettag Systems</ProgSystem>
    <ProgName>LV-Konvertierung</ProgName>
  </GAEBInfo>
  <PrjInfo>
    <NamePrj>Musterprojekt Werkraum</NamePrj>
    <Cur>EUR</Cur>
  </PrjInfo>
  <Award>
    <DP>83</DP>
    <BoQ ID="b91faa4998e3dba7aeeaae66d">
      <BoQInfo>
        <Name>DEMO-WERKRAUM</Name>
        <LblBoQ>Musterprojekt Werkraum</LblBoQ>
        <OutlCompl>AllTxt</OutlCompl>
        <BoQBkdn>
          <Type>BoQLevel</Type>
          <Length>2</Length>
          <Num>Yes</Num>
        </BoQBkdn>
        <BoQBkdn>
          <Type>BoQLevel</Type>
          <Length>2</Length>
          <Num>Yes</Num>
        </BoQBkdn>
        <BoQBkdn>
          <Type>Item</Type>
          <Length>4</Length>
          <Num>Yes</Num>
        </BoQBkdn>
      </BoQInfo>
      <BoQBody>
        <BoQCtgy ID="ntitle01" RNoPart="01">
          <LblTx>
            <span>Ausbau</span>
          </LblTx>
          <BoQBody>
            <BoQCtgy ID="ntitle0101" RNoPart="01">
              <LblTx>
                <span>Oberflächen</span>
              </LblTx>
              <BoQBody>
                <Itemlist>
                  <Item ID="nitem0010" RNoPart="0010">
                    <Qty>24.000</Qty>
                    <QU>m2</QU>
                    <Description ID="e5c3c8c11ec758b791cd120b1468e7b3">
                      <CompleteText>
                        <DetailTxt>
                          <Text>
                            <p>
                              <span>Lose Beschichtungen entfernen und den Untergrund trocken reinigen.</span>
                              <br/>
                              <span>Anschlüsse an Fenster und Türen sorgfältig abkleben. Staub und Restmaterial fachgerecht aufnehmen.</span>
                            </p>
                          </Text>
                        </DetailTxt>
                      </CompleteText>
                    </Description>
                  </Item>
                  <Item ID="nitem0020" RNoPart="0020">
                    <Qty>24.000</Qty>
                    <QU>m2</QU>
                    <Description ID="b641721ff4f15759b6480d1cfbb64b67">
                      <CompleteText>
                        <DetailTxt>
                          <Text>
                            <p>
                              <span>Zweifacher Anstrich mit weißer Innenwandfarbe auf vorbereitetem Untergrund.</span>
                              <br/>
                              <span>Die Fläche muss nach dem Trocknen gleichmäßig deckend sein. Abklebungen entfernen und die Arbeitsstelle sauber übergeben.</span>
                            </p>
                          </Text>
                        </DetailTxt>
                      </CompleteText>
                    </Description>
                  </Item>
                  <Item ID="nitem0030" RNoPart="0030">
                    <Qty>18.500</Qty>
                    <QU>m</QU>
                    <Description ID="16163a6edcac5d7d9ecb903d99f34c02">
                      <CompleteText>
                        <DetailTxt>
                          <Text>
                            <p>
                              <span>Sockelleisten aus Holz liefern, ablängen und befestigen. Gehrungen an Ecken herstellen.</span>
                              <br/>
                              <span>Sichtbare Oberflächen dürfen keine offenen Befestigungslöcher aufweisen.</span>
                            </p>
                          </Text>
                        </DetailTxt>
                      </CompleteText>
                    </Description>
                  </Item>
                  <Item ID="nitem0040" RNoPart="0040">
                    <Qty>1.000</Qty>
                    <QU>St</QU>
                    <Description ID="f7eaaa6cc8715f89a0226d02ef343515">
                      <CompleteText>
                        <DetailTxt>
                          <Text>
                            <p>
                              <span>Alle bearbeiteten Flächen gemeinsam begehen. Kleine Fehlstellen unmittelbar nacharbeiten.</span>
                              <br/>
                              <span>Ein kurzes Protokoll mit Datum und ausgeführten Nacharbeiten übergeben.</span>
                            </p>
                          </Text>
                        </DetailTxt>
                      </CompleteText>
                    </Description>
                  </Item>
                </Itemlist>
              </BoQBody>
            </BoQCtgy>
          </BoQBody>
        </BoQCtgy>
      </BoQBody>
    </BoQ>
  </Award>
</GAEB>
<?xml version='1.0' encoding='UTF-8'?>
<GAEB xmlns="http://www.gaeb.de/GAEB_DA_XML/DA84/3.3">
  <GAEBInfo>
    <Version>3.3</Version>
    <VersDate>2021-05</VersDate>
    <Date>2026-09-08</Date>
    <ProgSystem>Bettag Systems</ProgSystem>
    <ProgName>LV-Konvertierung</ProgName>
  </GAEBInfo>
  <PrjInfo>
    <NamePrj>Musterprojekt Werkraum</NamePrj>
  </PrjInfo>
  <Award>
    <DP>84</DP>
    <CTR>
      <Address>
        <Name1>Fiktiver Musterbetrieb</Name1>
        <Street>Beispielstraße 1</Street>
        <PCode>00000</PCode>
        <City>Musterort</City>
      </Address>
    </CTR>
    <BoQ ID="b91faa4998e3dba7aeeaae66d">
      <BoQInfo>
        <Name>DEMO-WERKRAUM</Name>
        <BoQBkdn>
          <Type>BoQLevel</Type>
          <Length>2</Length>
          <Num>Yes</Num>
        </BoQBkdn>
        <BoQBkdn>
          <Type>BoQLevel</Type>
          <Length>2</Length>
          <Num>Yes</Num>
        </BoQBkdn>
        <BoQBkdn>
          <Type>Item</Type>
          <Length>4</Length>
          <Num>Yes</Num>
        </BoQBkdn>
        <Totals>
          <Total>810.20</Total>
        </Totals>
      </BoQInfo>
      <BoQBody>
        <BoQCtgy ID="ntitle01" RNoPart="01">
          <BoQBody>
            <BoQCtgy ID="ntitle0101" RNoPart="01">
              <BoQBody>
                <Itemlist>
                  <Item ID="nitem0010" RNoPart="0010">
                    <UP>8.500</UP>
                    <IT>204.00</IT>
                  </Item>
                  <Item ID="nitem0020" RNoPart="0020">
                    <UP>14.750</UP>
                    <IT>354.00</IT>
                  </Item>
                  <Item ID="nitem0030" RNoPart="0030">
                    <UP>11.200</UP>
                    <IT>207.20</IT>
                  </Item>
                  <Item ID="nitem0040" RNoPart="0040">
                    <UP>45.000</UP>
                    <IT>45.00</IT>
                  </Item>
                </Itemlist>
              </BoQBody>
              <Totals>
                <Total>810.20</Total>
              </Totals>
            </BoQCtgy>
          </BoQBody>
          <Totals>
            <Total>810.20</Total>
          </Totals>
        </BoQCtgy>
      </BoQBody>
    </BoQ>
  </Award>
</GAEB>

Manually transcribed reference of a fictional German bill of quantities. Bidder details are also fictional. This example verifies export behavior, not model extraction quality.

Problem and role

Readable PDF, missing structure

A bill of quantities contains headings, item numbers, full descriptions and quantities. An item may continue on the next page; provisional and alternative items have their own rules. Copying table cells can produce structurally valid data with an incomplete scope of work.

Built by Franz Bettag

Independent development of document preparation, model integration, the structured bill-of-quantities model, review interface, resumable processing and GAEB export. The published documents are independently authored fictional examples.

The actual document and AI workflow

Prepare PDF and text evidence

PDF pages are split into sections. Available text lines receive identifiers and source coordinates. In the hybrid workflow, Qwen3-VL-8B-Instruct sees the image region and those lines. The model assigns lines to items; evidenced descriptions can then be taken from the original text.

Reconstruct the bill of quantities

Pydantic validates the model response. Headings, items, notes and continuations are reconstructed in reading order. A continuation extends only a clearly matching preceding item. Conflicting quantities and uncertain assignments remain visible as review issues.

Compare extraction approaches

The code includes a native-text baseline, the hybrid workflow, a Qwen vision-only variant and an optional LightOnOCR-2-1B stage followed by structuring. Model revision, prompt, code and parameters are recorded with each processing state. A preferred approach must be established on separate test documents.

Review, confirm, export

The review interface exposes quantities, units, prices and full descriptions with their sources. Changes are logged and invalidate earlier exports. GAEB export requires complete processing, explicit review confirmation and no unresolved issues.

Treat X83 and X84 separately

The exporter writes GAEB DA XML 3.3 using the 2021-05 bill-of-quantities package and validates against its XSD schemas. X83 carries the specification; X84 carries the bid. An existing original X83 can be used to check identity, items, quantities, units and descriptions.

What can already be demonstrated

4 items, 2 matching files

The manually transcribed reference generates X83 and X84 with four items and matching item identifiers. X83 retains all four full descriptions. X84 contains bid prices and the calculated total of EUR 810.20 excluding VAT. Both files pass schema validation.

Export boundaries checked

The local check confirmed that missing review confirmation, incomplete processing and unresolved assignment issues each prevent export. This verifies those export rules. It does not measure AI extraction accuracy or compatibility with every estimating application.

Status and next measurement

The inspected repository is a private development deployment ahead of its real-document evaluation gate. No substantiated customer figures for extraction quality or time savings are published yet. The next evaluation must check complete items, descriptions, quantities, special cases, correction effort and target-system imports.

Evidence and next steps

Inspect source and exports

The reference bundle contains the fictional source, manually reviewed JSON, X83, X84 and an export report with checksums. Bidder details are additional fictional example values. The bundle is a reproducible export demonstration, not a model benchmark.