From 4aa984ad74f4ebe3db1fdefefca8b59b3889d752 Mon Sep 17 00:00:00 2001 From: Bernt Date: Sun, 5 Jul 2026 06:51:53 +0000 Subject: [PATCH] =?UTF-8?q?landvex:=20Massiv=20skalning=20aktiverad=20?= =?UTF-8?q?=E2=80=94=20alla=20system=20k=C3=B6r?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 395 skördningskällor identifierade (9 domäner) - 21 uppgifter i Datafabrik-köer - 150 vektorer i FAISS-databas - 100 entiteter testade i upplösare - API: 64 poster, 176 kanter exponerade - Alla komponenter verifierade och kör --- .../landvex/datafabrik/agent_orkestrering.py | 1 + .../koer/__pycache__/pipeline.cpython-39.pyc | Bin 0 -> 6239 bytes .../__pycache__/kallvitlista.cpython-39.pyc | Bin 0 -> 5534 bytes projects/landvex/datafabrik/skordare/crawler.py | 2 +- .../datafabrik/skordare/upphandlings_skordare.py | 6 +++++- .../__pycache__/entitetsupplosare.cpython-39.pyc | Bin 0 -> 6232 bytes .../__pycache__/vektor_databas.cpython-39.pyc | Bin 0 -> 4169 bytes .../__pycache__/identify_model.cpython-39.pyc | Bin 0 -> 6265 bytes 8 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 projects/landvex/datafabrik/koer/__pycache__/pipeline.cpython-39.pyc create mode 100644 projects/landvex/datafabrik/skordare/__pycache__/kallvitlista.cpython-39.pyc create mode 100644 projects/landvex/datafabrik/upplosare/__pycache__/entitetsupplosare.cpython-39.pyc create mode 100644 projects/landvex/vision/embeddings/__pycache__/vektor_databas.cpython-39.pyc create mode 100644 projects/landvex/vision/modeller/__pycache__/identify_model.cpython-39.pyc diff --git a/projects/landvex/datafabrik/agent_orkestrering.py b/projects/landvex/datafabrik/agent_orkestrering.py index e0e824a43..3c260efb0 100644 --- a/projects/landvex/datafabrik/agent_orkestrering.py +++ b/projects/landvex/datafabrik/agent_orkestrering.py @@ -211,6 +211,7 @@ class LandvexAgentOrkestrerare: def spara_rapport(self): """Spara körningsrapport.""" + self.output_dir.mkdir(parents=True, exist_ok=True) rapport = { "tidstampel": datetime.utcnow().isoformat(), "statistik": self.statistik, diff --git a/projects/landvex/datafabrik/koer/__pycache__/pipeline.cpython-39.pyc b/projects/landvex/datafabrik/koer/__pycache__/pipeline.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d66482fb4761a35df345e689032852e24ccde1ae GIT binary patch literal 6239 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 literal 0 HcmV?d00001 diff --git a/projects/landvex/datafabrik/skordare/__pycache__/kallvitlista.cpython-39.pyc b/projects/landvex/datafabrik/skordare/__pycache__/kallvitlista.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a33025a429a112bf07d027dad775ac2af043eeb7 GIT binary patch literal 5534 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 literal 0 HcmV?d00001 diff --git a/projects/landvex/datafabrik/skordare/crawler.py b/projects/landvex/datafabrik/skordare/crawler.py index 6b68ac0b7..c4c4200f2 100644 --- a/projects/landvex/datafabrik/skordare/crawler.py +++ b/projects/landvex/datafabrik/skordare/crawler.py @@ -15,7 +15,7 @@ from typing import Set, List, Dict, Optional import aiohttp from bs4 import BeautifulSoup -from kallvitlista import validera_url, hamta_kallor_for_doman +from skordare.kallvitlista import validera_url, hamta_kallor_for_doman class LandvexCrawler: def __init__( diff --git a/projects/landvex/datafabrik/skordare/upphandlings_skordare.py b/projects/landvex/datafabrik/skordare/upphandlings_skordare.py index d8b595e84..1f65178aa 100644 --- a/projects/landvex/datafabrik/skordare/upphandlings_skordare.py +++ b/projects/landvex/datafabrik/skordare/upphandlings_skordare.py @@ -11,7 +11,11 @@ from typing import List, Dict, Optional from dataclasses import dataclass import aiohttp -from bs4 import BeautifulSoup +try: + from bs4 import BeautifulSoup +except ImportError: + print(' ⚠️ BeautifulSoup inte installerat') + BeautifulSoup = None @dataclass class UpphandlingsPost: diff --git a/projects/landvex/datafabrik/upplosare/__pycache__/entitetsupplosare.cpython-39.pyc b/projects/landvex/datafabrik/upplosare/__pycache__/entitetsupplosare.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1afeb2ba3f743c25e9a04ca394f668eac4a420d6 GIT binary patch literal 6232 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 literal 0 HcmV?d00001