(feat) add first step of highlighting features of interest

This commit is contained in:
Nicolas Sebastian Schuler
2025-07-31 12:18:18 +02:00
parent c6e30c6be6
commit 64385c1864
12 changed files with 406 additions and 64 deletions

1
.gitignore vendored
View File

@@ -1,4 +1,5 @@
.jj .jj
.tmp-data
# Byte-compiled / optimized / DLL files # Byte-compiled / optimized / DLL files
__pycache__/ __pycache__/
*.py[codz] *.py[codz]

14
data/classes.txt Normal file
View File

@@ -0,0 +1,14 @@
cat
cat-eyes
cat-head
cat-nose
cat-paws
cat-whiskers
dog
dog-eyes
dog-head
dog-nose
dog-paws
dog-whiskers
pointy-ears
round-ears

BIN
data/images/cat.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
data/images/dog.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 408 KiB

9
data/labels/cat.txt Normal file
View File

@@ -0,0 +1,9 @@
12 0.27527216174183516 0.42194566830196395 0.3716951788491446 0.32753241102997754 0.30326594090202175 0.20397925953824225 0.2729393468118196 0.18999211031276278 0.25505443234836706 0.2237943876076715 0.2511664074650078 0.29373013373506884
12 0.5326594090202177 0.11889076841657548 0.4657853810264385 0.2575966649025802 0.484447900466563 0.2832397718159592 0.5458786936236392 0.3053860914229684 0.5458786936236392 0.1550242372490641
5 0.453343701399689 0.6282561193777861 0.3632732196057227 0.6668556691268657 0.2869362363919129 0.8019298889274896 0.5093312597200622 0.9639477007892934 0.48522550544323484 0.6795423332045442
5 0.5590979782270606 0.579301097088608 0.5451010886469674 0.6538992262911651 0.6220839813374806 0.9418013811822842 0.7527216174183515 0.8543816985230376 0.7636080870917574 0.7681276116325807 0.6609642301710731 0.5315116705682198
0 0.0023328149300155523 0.6399120770656856 0.0583203732503888 0.5956194378516674 0.1010886469673406 0.5921226505452976 0.13841368584758942 0.5466644155624892 0.19206842923794715 0.5105309467300007 0.23561430793157076 0.4755630736663019 0.26594090202177295 0.3939713698510051 0.2620528771384137 0.34035396448666705 0.2527216174183515 0.2820741760471693 0.25505443234836706 0.2284567706828313 0.26749611197511663 0.19348889761913265 0.2884914463452566 0.19815128069429247 0.31026438569206843 0.21680081299493176 0.3328149300155521 0.25526547336500033 0.36236391912908245 0.3030548998853885 0.39502332814930013 0.2879021548911191 0.42690513219284604 0.2832397718159592 0.4642301710730949 0.25409987759621033 0.48755832037325036 0.21446962145735185 0.5256609642301711 0.12704993879810517 0.5357698289269052 0.11772517264778552 0.5443234836702955 0.1422026837923746 0.5466562986003111 0.1864953230063929 0.5443234836702955 0.23078796222041123 0.5451010886469674 0.2867365591223291 0.5552099533437014 0.3228700279548178 0.562208398133748 0.3555067094809365 0.573094867807154 0.3939713698510051 0.583203732503888 0.4627415202096124 0.5824261275272161 0.500040584810891 0.5692068429237948 0.5734731182446582 0.6614268811466366 0.5281193503776296 0.7667185069984448 0.7669620158637909 0.7542768273716952 0.8578784858294074 0.6220839813374806 0.9452981684886542 0.5458786936236392 0.6608928009039049 0.5342146189735615 0.6807079289733341 0.5108864696734059 0.7086822274242931 0.4891135303265941 0.7086822274242931 0.5124416796267496 0.9651132965580832 0.4368132702253199 0.9168687567223326 0.42223950233281493 0.9872596161650925 0.4191290824261275 0.9977499780842021 0.0007776049766718507 0.9977499780842021
1 0.40414507772020725 0.4608189917826791 0.38773747841105355 0.4659967332633833 0.3799654576856649 0.48800213455637637 0.37823834196891193 0.5035353589984892 0.38860103626943 0.5281296310318344 0.4136442141623489 0.538485113993243 0.4265975820379965 0.5358962432528909 0.44386873920552683 0.5307185017721866 0.4412780656303973 0.48800213455637637 0.4274611398963731 0.4750577808546158
1 0.5345423143350605 0.4103360123458126 0.5155440414507773 0.4245748014177493 0.5120898100172712 0.45046350882127056 0.5129533678756477 0.4892965699265525 0.5215889464594128 0.5009464882581371 0.5362694300518135 0.498357617517785 0.5552677029360967 0.47764665159496794 0.5595854922279793 0.44787463808091843 0.5518134715025906 0.42198593067739715
2 0.2858376511226252 0.5708459982476446 0.31951640759930916 0.6135623654634548 0.3488773747841105 0.6627509095301451 0.37305699481865284 0.6756952632319059 0.4075993091537133 0.6964062291547228 0.4378238341968912 0.7028784060056033 0.48272884283246975 0.7132338889670116 0.5112262521588946 0.7093505828564836 0.5310880829015544 0.6744008278617298 0.5362694300518135 0.6666342156406734 0.5673575129533679 0.6459232497178563 0.572538860103627 0.5954402702809898 0.5656303972366149 0.5760237397283489 0.5734024179620034 0.538485113993243 0.5854922279792746 0.4867076991862004 0.582901554404145 0.43622471974933386 0.5682210708117443 0.3689140805001785 0.5474956822107081 0.31454779495278373 0.5449050086355786 0.2938368290299667 0.5457685664939551 0.19028199941588153 0.5379965457685665 0.12685466627725436 0.5345423143350605 0.11649918331584583 0.49136442141623493 0.2084040945983464 0.4663212435233161 0.24853159107380446 0.4309153713298791 0.28218691069838214 0.38946459412780654 0.2860702168089103 0.3583765112262521 0.2977201351404949 0.3229706390328152 0.23299836663169166 0.270293609671848 0.19028199941588153 0.25734024179620035 0.20710965922817037 0.2504317789291883 0.24594272033345235 0.25129533678756477 0.2860702168089103 0.2607944732297064 0.3469086792071854 0.2659758203799655 0.40256940012475617 0.27202072538860106 0.46340786252303123 0.27461139896373055 0.498357617517785
3 0.47063903281519864 0.5967347056511659 0.48791018998272884 0.6329788960160957 0.5120898100172712 0.6420399436073282 0.5233160621761658 0.6368622021266239 0.5354058721934369 0.6213289776845111 0.5310880829015544 0.557901644545884 0.5077720207253886 0.5061242297388413 0.4939550949913645 0.44010802585986203 0.4758203799654577 0.39480278790369977 0.45509499136442144 0.39350835253352373 0.4378238341968912 0.42845810752827745 0.43868739205526774 0.47894108696514404 0.45164075993091535 0.5242463249213063 0.46286701208981 0.5760237397283489

7
data/labels/dog.txt Normal file
View File

@@ -0,0 +1,7 @@
13 0.5546424220272904 0.07836257309941519 0.5982048001949317 0.25146198830409355 0.5982048001949317 0.45847953216374265 0.6036500974658869 0.5485380116959063 0.6300986842105263 0.6105263157894736 0.6581030701754387 0.6350877192982455 0.8097934941520467 0.44327485380116954 0.8665801656920077 0.31695906432748533 0.8455768762183236 0.21871345029239764 0.796569200779727 0.18830409356725145 0.7685648148148148 0.12514619883040934 0.7351151315789474 0.11111111111111109 0.6892190545808965 0.05730994152046783
6 0.4434027777777778 0.9988304093567251 0.44729227582846 0.9333333333333332 0.4083972953216374 0.8842105263157893 0.37805921052631575 0.8748538011695906 0.33683053118908374 0.9076023391812865 0.25126157407407407 0.8479532163742689 0.22247928849902532 0.8421052631578945 0.19058540448343078 0.8058479532163741 0.15557992202729043 0.6760233918128654 0.1446893274853801 0.6093567251461988 0.15713572124756334 0.5719298245614034 0.20458759746588695 0.5181286549707602 0.27148696393762184 0.44210526315789467 0.2574847709551657 0.35438596491228064 0.2621521686159844 0.3052631578947368 0.325162037037037 0.12982456140350876 0.3648349171539961 0.10526315789473681 0.5297496345029239 0.043274853801169584 0.5772015107212475 0.0304093567251462 0.6845516569200779 0.05497076023391812 0.7374488304093567 0.10994152046783624 0.7701206140350877 0.12514619883040934 0.7989028996101364 0.18713450292397657 0.8486884746588693 0.22105263157894733 0.8673580653021442 0.3216374269005848 0.8315746832358674 0.40350877192982454 0.8650243664717349 0.5099415204678361 0.8992519493177388 0.5824561403508771 0.9459259259259258 0.6725146198830408 0.9972673001949317 0.7017543859649122 0.9988230994152046 0.9976608187134501
11 0.30491139069264067 0.6233766233766233 0.40424512987012984 0.6883116883116882 0.4353409090909091 0.761038961038961 0.47334686147186145 0.84025974025974 0.4189292478354979 0.8740259740259739 0.3930160984848484 0.9584415584415583 0.3506912878787879 0.9064935064935064 0.32391436688311687 0.8428571428571427 0.31441287878787877 0.7779220779220778 0.2358096590909091 0.7818181818181817 0.22803571428571426 0.7285714285714284 0.24185606060606057 0.6389610389610388 0.2686329816017316 0.6376623376623376
7 0.40165381493506497 0.3103896103896103 0.45693520021645023 0.3155844155844155 0.48889475108225106 0.3311688311688311 0.49407738095238096 0.3675324675324675 0.4621178300865801 0.3779220779220779 0.40597267316017316 0.4051948051948051 0.3852421536796537 0.3779220779220779 0.3852421536796537 0.3415584415584415
7 0.26345035173160175 0.3324675324675324 0.2910910443722944 0.335064935064935 0.29454613095238097 0.3727272727272727 0.2841808712121212 0.4155844155844155 0.26085903679653677 0.4038961038961039 0.25481263528138526 0.3675324675324675 0.25700071785622935 0.3586499146209643 0.26117891363009726 0.34168846834709315
8 0.2150791396103896 0.84025974025974 0.26949675324675326 0.8714285714285714 0.33341585497835496 0.9103896103896103 0.37746820887445887 0.8714285714285714 0.4025175865800865 0.8792207792207791 0.4759381764069264 0.8558441558441559 0.49494115259740257 0.8428571428571427 0.5217180735930735 0.8363636363636363 0.5502225378787878 0.8558441558441559 0.5778632305194805 0.8766233766233765 0.6590577651515152 0.8415584415584414 0.7367972132034631 0.783116883116883 0.7756669372294372 0.7233766233766232 0.8508150703463202 0.6402597402597402 0.8741369047619049 0.5805194805194804 0.8767282196969697 0.5415584415584415 0.8611803300865801 0.49090909090909085 0.8413135822510821 0.4233766233766233 0.8257656926406927 0.396103896103896 0.8603165584415584 0.3389610389610389 0.8741369047619049 0.30779220779220773 0.8499512987012987 0.24545454545454543 0.834403409090909 0.21558441558441555 0.8015800865800867 0.1948051948051948 0.7592552759740259 0.11688311688311687 0.7238406385281385 0.0909090909090909 0.6918810876623377 0.06493506493506493 0.6245068993506493 0.04025974025974025 0.5899560335497835 0.033766233766233764 0.48371212121212115 0.05324675324675324 0.425839420995671 0.06623376623376623 0.39128855519480527 0.0948051948051948 0.34982751623376623 0.11168831168831167 0.3170041937229437 0.1597402597402597 0.30404761904761907 0.21688311688311684 0.2746793831168831 0.2831168831168831 0.25049377705627707 0.335064935064935 0.24876623376623377 0.3532467532467532 0.26776920995670994 0.42207792207792205 0.26431412337662336 0.4506493506493506 0.23667343073593072 0.4818181818181817 0.2090327380952381 0.5103896103896103 0.17880073051948048 0.5441558441558441 0.15720643939393938 0.5649350649350648 0.14424986471861473 0.6051948051948051 0.15116003787878787 0.657142857142857 0.15720643939393938 0.6896103896103896 0.17620941558441558 0.7662337662337662
9 0.26172280844155843 0.4480519480519479 0.2358096590909091 0.4857142857142856 0.1969399350649351 0.5285714285714285 0.17880073051948048 0.5454545454545454 0.15720643939393938 0.5662337662337662 0.14684117965367965 0.5870129870129869 0.14338609307359307 0.6272727272727272 0.1554788961038961 0.6688311688311689 0.1537513528138528 0.6805194805194804 0.16757169913419914 0.6922077922077922 0.19693993506493507 0.6935064935064933 0.2228530844155844 0.6857142857142855 0.2435836038961039 0.6818181818181818 0.27727069805194804 0.5896103896103895 0.3360071699134199 0.5155844155844155 0.38351461038961043 0.4532467532467532 0.3446448863636364 0.3883116883116882 0.3411897997835498 0.3207792207792208 0.31182156385281384 0.3519480519480519 0.28849972943722946 0.4155844155844155

65
data/notes.json Normal file
View File

@@ -0,0 +1,65 @@
{
"categories": [
{
"id": 0,
"name": "cat"
},
{
"id": 1,
"name": "cat-eyes"
},
{
"id": 2,
"name": "cat-head"
},
{
"id": 3,
"name": "cat-nose"
},
{
"id": 4,
"name": "cat-paws"
},
{
"id": 5,
"name": "cat-whiskers"
},
{
"id": 6,
"name": "dog"
},
{
"id": 7,
"name": "dog-eyes"
},
{
"id": 8,
"name": "dog-head"
},
{
"id": 9,
"name": "dog-nose"
},
{
"id": 10,
"name": "dog-paws"
},
{
"id": 11,
"name": "dog-whiskers"
},
{
"id": 12,
"name": "pointy-ears"
},
{
"id": 13,
"name": "round-ears"
}
],
"info": {
"year": 2025,
"version": "1.0",
"contributor": "Label Studio"
}
}

24
main.py Normal file
View File

@@ -0,0 +1,24 @@
import cv2
from src.data import load_data
from src.img_utils import apply_color_overlay, blur_background, desaturate_background
def main():
print("Starting Abduction Demo")
labeled_images = load_data()
image = labeled_images[0].image
mask = labeled_images[0].create_mask([labeled_images[0].labels[0]])
overlay_result = apply_color_overlay(image, mask, color=(255, 100, 0), alpha=0.4)
cv2.imwrite(".tmp-data/highlight_overlay.jpg", overlay_result)
blur_result = blur_background(image, mask, blur_intensity=(51, 51))
cv2.imwrite(".tmp-data/highlight_blurred.jpg", blur_result)
desaturate_result = desaturate_background(image, mask)
cv2.imwrite(".tmp-data/highlight_desaturated.jpg", desaturate_result)
if __name__ == "__main__":
main()

View File

@@ -16,6 +16,8 @@ requires-python = ">=3.13"
dependencies = [ dependencies = [
"langchain>=0.3.27", "langchain>=0.3.27",
"langchain-ollama>=0.3.6", "langchain-ollama>=0.3.6",
"numpy>=2.3.2",
"opencv-python>=4.11.0.86",
] ]
[tool.uv] [tool.uv]

60
src/data.py Normal file
View File

@@ -0,0 +1,60 @@
import json
from pathlib import Path
from typing import List
import cv2
import numpy as np
DATA_PATH_ROOT = Path("data").absolute()
DATA_PATH_IMAGES = DATA_PATH_ROOT / "images"
DATA_PATH_LABELS = DATA_PATH_ROOT / "labels"
class LabeledImage:
categories = {}
def __init__(self, image_path: Path, label_path: Path, label_db: Path) -> None:
self.image_path = image_path
self.image = cv2.imread(image_path)
self.extract_categories(label_db)
self.labels = self.extract_labels(label_path)
self.cl = "cat" if "cat" in [label["name"] for label in self.labels] else "dog"
def extract_categories(self, label_db: Path):
# Create Label<>ID relation db
if LabeledImage.categories == {}:
with label_db.open("r") as f:
labels = json.load(f)
for label in labels["categories"]:
LabeledImage.categories[int(label["id"])] = label["name"]
def extract_labels(self, label_path: Path):
labels = []
with label_path.open("r") as f:
for line in f.readlines():
label = {}
chunks = line.split(" ")
label["id"] = int(chunks[0])
label["name"] = self.categories[label["id"]]
label["polygon"] = chunks[1:]
labels.append(label)
return labels
def create_mask(self, elements: List[dict]):
img_h, img_w, _ = self.image.shape
mask = np.zeros((img_h, img_w), dtype=np.uint8)
for e in elements:
norm_coords = np.array(e["polygon"], dtype=np.float32)
points = norm_coords.reshape(-1, 2)
points[:, 0] *= img_w
points[:, 1] *= img_h
pixel_points = np.array([points], dtype=np.int32)
cv2.fillPoly(mask, pixel_points, 255)
return mask
def load_data():
limgs = []
for img in DATA_PATH_IMAGES.glob("*.jpg"):
limgs.append(LabeledImage(img, DATA_PATH_LABELS / (str(img.stem) + ".txt"), DATA_PATH_ROOT / "notes.json"))
return limgs

82
src/img_utils.py Normal file
View File

@@ -0,0 +1,82 @@
import cv2
import numpy as np
def apply_color_overlay(image, mask, color=(0, 0, 255), alpha=0.5):
"""
Applies a semi-transparent colored overlay to the masked region of an image.
Args:
image (np.ndarray): The original BGR image.
mask (np.ndarray): The single-channel black and white mask.
color (tuple): The BGR color for the overlay (e.g., (0, 0, 255) for red).
alpha (float): The transparency of the overlay (0.0 to 1.0).
Returns:
np.ndarray: The image with the colored overlay.
"""
# Create a colored layer
overlay = np.zeros_like(image)
overlay[mask == 255] = color
# Blend the overlay with the original image
# result = original_image * (1 - alpha) + overlay * alpha
highlighted_image = cv2.addWeighted(image, 1 - alpha, overlay, alpha, 0)
return highlighted_image
def desaturate_background(image, mask):
"""
Keeps the masked area in color and turns the background to grayscale.
Args:
image (np.ndarray): The original BGR image.
mask (np.ndarray): The single-channel black and white mask.
Returns:
np.ndarray: The image with a desaturated background.
"""
# Create a grayscale version of the image, then convert it back to 3 channels
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
background = cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR)
# Use the mask to select the colored foreground
foreground = cv2.bitwise_and(image, image, mask=mask)
# Use the inverted mask to select the grayscale background
inverted_mask = cv2.bitwise_not(mask)
background = cv2.bitwise_and(background, background, mask=inverted_mask)
# Combine the colored foreground and grayscale background
highlighted_image = cv2.add(foreground, background)
return highlighted_image
def blur_background(image, mask, blur_intensity=(35, 35)):
"""
Blurs the background, keeping the masked area in focus.
Args:
image (np.ndarray): The original BGR image.
mask (np.ndarray): The single-channel black and white mask.
blur_intensity (tuple): The kernel size for Gaussian blur. Must be odd numbers.
Returns:
np.ndarray: The image with a blurred background.
"""
# Create a blurred version of the image
blurred_image = cv2.GaussianBlur(image, blur_intensity, 0)
# Use the mask to select the sharp foreground
foreground = cv2.bitwise_and(image, image, mask=mask)
# Use the inverted mask to select the blurred background
inverted_mask = cv2.bitwise_not(mask)
background = cv2.bitwise_and(blurred_image, blurred_image, mask=inverted_mask)
# Combine the sharp foreground and blurred background
highlighted_image = cv2.add(foreground, background)
return highlighted_image

206
uv.lock generated
View File

@@ -1,27 +1,36 @@
version = 1 version = 1
requires-python = ">=3.13" requires-python = ">=3.13"
resolution-markers = [
"platform_system == 'Darwin' and python_full_version >= '3.13'",
"platform_machine == 'aarch64' and platform_system == 'Linux' and python_full_version >= '3.13'",
"(platform_machine != 'aarch64' and platform_system != 'Darwin') or (platform_system != 'Darwin' and platform_system != 'Linux')",
]
[[package]] [[package]]
name = "abduction-demo" name = "abduction-demo"
version = "0.1.0" version = "0.1.0"
source = { virtual = "." } source = { editable = "." }
dependencies = [ dependencies = [
{ name = "langchain" }, { name = "langchain", marker = "python_full_version >= '3.13'" },
{ name = "langchain-ollama" }, { name = "langchain-ollama", marker = "python_full_version >= '3.13'" },
{ name = "numpy", marker = "python_full_version >= '3.13'" },
{ name = "opencv-python", marker = "python_full_version >= '3.13'" },
] ]
[package.dev-dependencies] [package.dev-dependencies]
dev = [ dev = [
{ name = "pyright" }, { name = "pyright", marker = "python_full_version >= '3.13'" },
{ name = "pytest" }, { name = "pytest", marker = "python_full_version >= '3.13'" },
{ name = "ruff" }, { name = "ruff", marker = "python_full_version >= '3.13'" },
{ name = "ty" }, { name = "ty", marker = "python_full_version >= '3.13'" },
] ]
[package.metadata] [package.metadata]
requires-dist = [ requires-dist = [
{ name = "langchain", specifier = ">=0.3.27" }, { name = "langchain", specifier = ">=0.3.27" },
{ name = "langchain-ollama", specifier = ">=0.3.6" }, { name = "langchain-ollama", specifier = ">=0.3.6" },
{ name = "numpy", specifier = ">=2.3.2" },
{ name = "opencv-python", specifier = ">=4.11.0.86" },
] ]
[package.metadata.requires-dev] [package.metadata.requires-dev]
@@ -46,8 +55,8 @@ name = "anyio"
version = "4.9.0" version = "4.9.0"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "idna" }, { name = "idna", marker = "python_full_version >= '3.13'" },
{ name = "sniffio" }, { name = "sniffio", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 } sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 }
wheels = [ wheels = [
@@ -68,7 +77,7 @@ name = "cffi"
version = "1.17.1" version = "1.17.1"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "pycparser" }, { name = "pycparser", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 }
wheels = [ wheels = [
@@ -154,8 +163,8 @@ name = "httpcore"
version = "1.0.9" version = "1.0.9"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "certifi" }, { name = "certifi", marker = "python_full_version >= '3.13'" },
{ name = "h11" }, { name = "h11", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484 } sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484 }
wheels = [ wheels = [
@@ -167,10 +176,10 @@ name = "httpx"
version = "0.28.1" version = "0.28.1"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "anyio" }, { name = "anyio", marker = "python_full_version >= '3.13'" },
{ name = "certifi" }, { name = "certifi", marker = "python_full_version >= '3.13'" },
{ name = "httpcore" }, { name = "httpcore", marker = "python_full_version >= '3.13'" },
{ name = "idna" }, { name = "idna", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 }
wheels = [ wheels = [
@@ -200,7 +209,7 @@ name = "jsonpatch"
version = "1.33" version = "1.33"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "jsonpointer" }, { name = "jsonpointer", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/42/78/18813351fe5d63acad16aec57f94ec2b70a09e53ca98145589e185423873/jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c", size = 21699 } sdist = { url = "https://files.pythonhosted.org/packages/42/78/18813351fe5d63acad16aec57f94ec2b70a09e53ca98145589e185423873/jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c", size = 21699 }
wheels = [ wheels = [
@@ -221,13 +230,13 @@ name = "langchain"
version = "0.3.27" version = "0.3.27"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "langchain-core" }, { name = "langchain-core", marker = "python_full_version >= '3.13'" },
{ name = "langchain-text-splitters" }, { name = "langchain-text-splitters", marker = "python_full_version >= '3.13'" },
{ name = "langsmith" }, { name = "langsmith", marker = "python_full_version >= '3.13'" },
{ name = "pydantic" }, { name = "pydantic", marker = "python_full_version >= '3.13'" },
{ name = "pyyaml" }, { name = "pyyaml", marker = "python_full_version >= '3.13'" },
{ name = "requests" }, { name = "requests", marker = "python_full_version >= '3.13'" },
{ name = "sqlalchemy" }, { name = "sqlalchemy", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/83/f6/f4f7f3a56626fe07e2bb330feb61254dbdf06c506e6b59a536a337da51cf/langchain-0.3.27.tar.gz", hash = "sha256:aa6f1e6274ff055d0fd36254176770f356ed0a8994297d1df47df341953cec62", size = 10233809 } sdist = { url = "https://files.pythonhosted.org/packages/83/f6/f4f7f3a56626fe07e2bb330feb61254dbdf06c506e6b59a536a337da51cf/langchain-0.3.27.tar.gz", hash = "sha256:aa6f1e6274ff055d0fd36254176770f356ed0a8994297d1df47df341953cec62", size = 10233809 }
wheels = [ wheels = [
@@ -239,13 +248,13 @@ name = "langchain-core"
version = "0.3.72" version = "0.3.72"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "jsonpatch" }, { name = "jsonpatch", marker = "python_full_version >= '3.13'" },
{ name = "langsmith" }, { name = "langsmith", marker = "python_full_version >= '3.13'" },
{ name = "packaging" }, { name = "packaging", marker = "python_full_version >= '3.13'" },
{ name = "pydantic" }, { name = "pydantic", marker = "python_full_version >= '3.13'" },
{ name = "pyyaml" }, { name = "pyyaml", marker = "python_full_version >= '3.13'" },
{ name = "tenacity" }, { name = "tenacity", marker = "python_full_version >= '3.13'" },
{ name = "typing-extensions" }, { name = "typing-extensions", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/8b/49/7568baeb96a57d3218cb5f1f113b142063679088fd3a0d0cae1feb0b3d36/langchain_core-0.3.72.tar.gz", hash = "sha256:4de3828909b3d7910c313242ab07b241294650f5cb6eac17738dd3638b1cd7de", size = 567227 } sdist = { url = "https://files.pythonhosted.org/packages/8b/49/7568baeb96a57d3218cb5f1f113b142063679088fd3a0d0cae1feb0b3d36/langchain_core-0.3.72.tar.gz", hash = "sha256:4de3828909b3d7910c313242ab07b241294650f5cb6eac17738dd3638b1cd7de", size = 567227 }
wheels = [ wheels = [
@@ -257,8 +266,8 @@ name = "langchain-ollama"
version = "0.3.6" version = "0.3.6"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "langchain-core" }, { name = "langchain-core", marker = "python_full_version >= '3.13'" },
{ name = "ollama" }, { name = "ollama", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/82/67/93429a78d6fd40e2addf27e881db37e7f0076d712ffe9759ca0d5e10910e/langchain_ollama-0.3.6.tar.gz", hash = "sha256:4270c4b30b3f3d10850cb9a1183b8c77d616195e0d9717ac745ef7f7f6cc2b6e", size = 30479 } sdist = { url = "https://files.pythonhosted.org/packages/82/67/93429a78d6fd40e2addf27e881db37e7f0076d712ffe9759ca0d5e10910e/langchain_ollama-0.3.6.tar.gz", hash = "sha256:4270c4b30b3f3d10850cb9a1183b8c77d616195e0d9717ac745ef7f7f6cc2b6e", size = 30479 }
wheels = [ wheels = [
@@ -270,7 +279,7 @@ name = "langchain-text-splitters"
version = "0.3.9" version = "0.3.9"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "langchain-core" }, { name = "langchain-core", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/91/52/d43ad77acae169210cc476cbc1e4ab37a701017c950211a11ab500fe7d7e/langchain_text_splitters-0.3.9.tar.gz", hash = "sha256:7cd1e5a3aaf609979583eeca2eb34177622570b8fa8f586a605c6b1c34e7ebdb", size = 45260 } sdist = { url = "https://files.pythonhosted.org/packages/91/52/d43ad77acae169210cc476cbc1e4ab37a701017c950211a11ab500fe7d7e/langchain_text_splitters-0.3.9.tar.gz", hash = "sha256:7cd1e5a3aaf609979583eeca2eb34177622570b8fa8f586a605c6b1c34e7ebdb", size = 45260 }
wheels = [ wheels = [
@@ -282,13 +291,13 @@ name = "langsmith"
version = "0.4.8" version = "0.4.8"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "httpx" }, { name = "httpx", marker = "python_full_version >= '3.13'" },
{ name = "orjson", marker = "platform_python_implementation != 'PyPy'" }, { name = "orjson", marker = "platform_python_implementation != 'PyPy' and python_full_version >= '3.13'" },
{ name = "packaging" }, { name = "packaging", marker = "python_full_version >= '3.13'" },
{ name = "pydantic" }, { name = "pydantic", marker = "python_full_version >= '3.13'" },
{ name = "requests" }, { name = "requests", marker = "python_full_version >= '3.13'" },
{ name = "requests-toolbelt" }, { name = "requests-toolbelt", marker = "python_full_version >= '3.13'" },
{ name = "zstandard" }, { name = "zstandard", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/46/38/0da897697ce29fb78cdaacae2d0fa3a4bc2a0abf23f84f6ecd1947f79245/langsmith-0.4.8.tar.gz", hash = "sha256:50eccb744473dd6bd3e0fe024786e2196b1f8598f8defffce7ac31113d6c140f", size = 352414 } sdist = { url = "https://files.pythonhosted.org/packages/46/38/0da897697ce29fb78cdaacae2d0fa3a4bc2a0abf23f84f6ecd1947f79245/langsmith-0.4.8.tar.gz", hash = "sha256:50eccb744473dd6bd3e0fe024786e2196b1f8598f8defffce7ac31113d6c140f", size = 352414 }
wheels = [ wheels = [
@@ -304,19 +313,88 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 },
] ]
[[package]]
name = "numpy"
version = "2.3.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/37/7d/3fec4199c5ffb892bed55cff901e4f39a58c81df9c44c280499e92cad264/numpy-2.3.2.tar.gz", hash = "sha256:e0486a11ec30cdecb53f184d496d1c6a20786c81e55e41640270130056f8ee48", size = 20489306 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/1c/c0/c6bb172c916b00700ed3bf71cb56175fd1f7dbecebf8353545d0b5519f6c/numpy-2.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c8d9727f5316a256425892b043736d63e89ed15bbfe6556c5ff4d9d4448ff3b3", size = 20949074 },
{ url = "https://files.pythonhosted.org/packages/20/4e/c116466d22acaf4573e58421c956c6076dc526e24a6be0903219775d862e/numpy-2.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:efc81393f25f14d11c9d161e46e6ee348637c0a1e8a54bf9dedc472a3fae993b", size = 14177311 },
{ url = "https://files.pythonhosted.org/packages/78/45/d4698c182895af189c463fc91d70805d455a227261d950e4e0f1310c2550/numpy-2.3.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:dd937f088a2df683cbb79dda9a772b62a3e5a8a7e76690612c2737f38c6ef1b6", size = 5106022 },
{ url = "https://files.pythonhosted.org/packages/9f/76/3e6880fef4420179309dba72a8c11f6166c431cf6dee54c577af8906f914/numpy-2.3.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:11e58218c0c46c80509186e460d79fbdc9ca1eb8d8aee39d8f2dc768eb781089", size = 6640135 },
{ url = "https://files.pythonhosted.org/packages/34/fa/87ff7f25b3c4ce9085a62554460b7db686fef1e0207e8977795c7b7d7ba1/numpy-2.3.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5ad4ebcb683a1f99f4f392cc522ee20a18b2bb12a2c1c42c3d48d5a1adc9d3d2", size = 14278147 },
{ url = "https://files.pythonhosted.org/packages/1d/0f/571b2c7a3833ae419fe69ff7b479a78d313581785203cc70a8db90121b9a/numpy-2.3.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:938065908d1d869c7d75d8ec45f735a034771c6ea07088867f713d1cd3bbbe4f", size = 16635989 },
{ url = "https://files.pythonhosted.org/packages/24/5a/84ae8dca9c9a4c592fe11340b36a86ffa9fd3e40513198daf8a97839345c/numpy-2.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:66459dccc65d8ec98cc7df61307b64bf9e08101f9598755d42d8ae65d9a7a6ee", size = 16053052 },
{ url = "https://files.pythonhosted.org/packages/57/7c/e5725d99a9133b9813fcf148d3f858df98511686e853169dbaf63aec6097/numpy-2.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a7af9ed2aa9ec5950daf05bb11abc4076a108bd3c7db9aa7251d5f107079b6a6", size = 18577955 },
{ url = "https://files.pythonhosted.org/packages/ae/11/7c546fcf42145f29b71e4d6f429e96d8d68e5a7ba1830b2e68d7418f0bbd/numpy-2.3.2-cp313-cp313-win32.whl", hash = "sha256:906a30249315f9c8e17b085cc5f87d3f369b35fedd0051d4a84686967bdbbd0b", size = 6311843 },
{ url = "https://files.pythonhosted.org/packages/aa/6f/a428fd1cb7ed39b4280d057720fed5121b0d7754fd2a9768640160f5517b/numpy-2.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:c63d95dc9d67b676e9108fe0d2182987ccb0f11933c1e8959f42fa0da8d4fa56", size = 12782876 },
{ url = "https://files.pythonhosted.org/packages/65/85/4ea455c9040a12595fb6c43f2c217257c7b52dd0ba332c6a6c1d28b289fe/numpy-2.3.2-cp313-cp313-win_arm64.whl", hash = "sha256:b05a89f2fb84d21235f93de47129dd4f11c16f64c87c33f5e284e6a3a54e43f2", size = 10192786 },
{ url = "https://files.pythonhosted.org/packages/80/23/8278f40282d10c3f258ec3ff1b103d4994bcad78b0cba9208317f6bb73da/numpy-2.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4e6ecfeddfa83b02318f4d84acf15fbdbf9ded18e46989a15a8b6995dfbf85ab", size = 21047395 },
{ url = "https://files.pythonhosted.org/packages/1f/2d/624f2ce4a5df52628b4ccd16a4f9437b37c35f4f8a50d00e962aae6efd7a/numpy-2.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:508b0eada3eded10a3b55725b40806a4b855961040180028f52580c4729916a2", size = 14300374 },
{ url = "https://files.pythonhosted.org/packages/f6/62/ff1e512cdbb829b80a6bd08318a58698867bca0ca2499d101b4af063ee97/numpy-2.3.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:754d6755d9a7588bdc6ac47dc4ee97867271b17cee39cb87aef079574366db0a", size = 5228864 },
{ url = "https://files.pythonhosted.org/packages/7d/8e/74bc18078fff03192d4032cfa99d5a5ca937807136d6f5790ce07ca53515/numpy-2.3.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a9f66e7d2b2d7712410d3bc5684149040ef5f19856f20277cd17ea83e5006286", size = 6737533 },
{ url = "https://files.pythonhosted.org/packages/19/ea/0731efe2c9073ccca5698ef6a8c3667c4cf4eea53fcdcd0b50140aba03bc/numpy-2.3.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de6ea4e5a65d5a90c7d286ddff2b87f3f4ad61faa3db8dabe936b34c2275b6f8", size = 14352007 },
{ url = "https://files.pythonhosted.org/packages/cf/90/36be0865f16dfed20f4bc7f75235b963d5939707d4b591f086777412ff7b/numpy-2.3.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3ef07ec8cbc8fc9e369c8dcd52019510c12da4de81367d8b20bc692aa07573a", size = 16701914 },
{ url = "https://files.pythonhosted.org/packages/94/30/06cd055e24cb6c38e5989a9e747042b4e723535758e6153f11afea88c01b/numpy-2.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:27c9f90e7481275c7800dc9c24b7cc40ace3fdb970ae4d21eaff983a32f70c91", size = 16132708 },
{ url = "https://files.pythonhosted.org/packages/9a/14/ecede608ea73e58267fd7cb78f42341b3b37ba576e778a1a06baffbe585c/numpy-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:07b62978075b67eee4065b166d000d457c82a1efe726cce608b9db9dd66a73a5", size = 18651678 },
{ url = "https://files.pythonhosted.org/packages/40/f3/2fe6066b8d07c3685509bc24d56386534c008b462a488b7f503ba82b8923/numpy-2.3.2-cp313-cp313t-win32.whl", hash = "sha256:c771cfac34a4f2c0de8e8c97312d07d64fd8f8ed45bc9f5726a7e947270152b5", size = 6441832 },
{ url = "https://files.pythonhosted.org/packages/0b/ba/0937d66d05204d8f28630c9c60bc3eda68824abde4cf756c4d6aad03b0c6/numpy-2.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:72dbebb2dcc8305c431b2836bcc66af967df91be793d63a24e3d9b741374c450", size = 12927049 },
{ url = "https://files.pythonhosted.org/packages/e9/ed/13542dd59c104d5e654dfa2ac282c199ba64846a74c2c4bcdbc3a0f75df1/numpy-2.3.2-cp313-cp313t-win_arm64.whl", hash = "sha256:72c6df2267e926a6d5286b0a6d556ebe49eae261062059317837fda12ddf0c1a", size = 10262935 },
{ url = "https://files.pythonhosted.org/packages/c9/7c/7659048aaf498f7611b783e000c7268fcc4dcf0ce21cd10aad7b2e8f9591/numpy-2.3.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:448a66d052d0cf14ce9865d159bfc403282c9bc7bb2a31b03cc18b651eca8b1a", size = 20950906 },
{ url = "https://files.pythonhosted.org/packages/80/db/984bea9d4ddf7112a04cfdfb22b1050af5757864cfffe8e09e44b7f11a10/numpy-2.3.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:546aaf78e81b4081b2eba1d105c3b34064783027a06b3ab20b6eba21fb64132b", size = 14185607 },
{ url = "https://files.pythonhosted.org/packages/e4/76/b3d6f414f4eca568f469ac112a3b510938d892bc5a6c190cb883af080b77/numpy-2.3.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:87c930d52f45df092f7578889711a0768094debf73cfcde105e2d66954358125", size = 5114110 },
{ url = "https://files.pythonhosted.org/packages/9e/d2/6f5e6826abd6bca52392ed88fe44a4b52aacb60567ac3bc86c67834c3a56/numpy-2.3.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:8dc082ea901a62edb8f59713c6a7e28a85daddcb67454c839de57656478f5b19", size = 6642050 },
{ url = "https://files.pythonhosted.org/packages/c4/43/f12b2ade99199e39c73ad182f103f9d9791f48d885c600c8e05927865baf/numpy-2.3.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:af58de8745f7fa9ca1c0c7c943616c6fe28e75d0c81f5c295810e3c83b5be92f", size = 14296292 },
{ url = "https://files.pythonhosted.org/packages/5d/f9/77c07d94bf110a916b17210fac38680ed8734c236bfed9982fd8524a7b47/numpy-2.3.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed5527c4cf10f16c6d0b6bee1f89958bccb0ad2522c8cadc2efd318bcd545f5", size = 16638913 },
{ url = "https://files.pythonhosted.org/packages/9b/d1/9d9f2c8ea399cc05cfff8a7437453bd4e7d894373a93cdc46361bbb49a7d/numpy-2.3.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:095737ed986e00393ec18ec0b21b47c22889ae4b0cd2d5e88342e08b01141f58", size = 16071180 },
{ url = "https://files.pythonhosted.org/packages/4c/41/82e2c68aff2a0c9bf315e47d61951099fed65d8cb2c8d9dc388cb87e947e/numpy-2.3.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5e40e80299607f597e1a8a247ff8d71d79c5b52baa11cc1cce30aa92d2da6e0", size = 18576809 },
{ url = "https://files.pythonhosted.org/packages/14/14/4b4fd3efb0837ed252d0f583c5c35a75121038a8c4e065f2c259be06d2d8/numpy-2.3.2-cp314-cp314-win32.whl", hash = "sha256:7d6e390423cc1f76e1b8108c9b6889d20a7a1f59d9a60cac4a050fa734d6c1e2", size = 6366410 },
{ url = "https://files.pythonhosted.org/packages/11/9e/b4c24a6b8467b61aced5c8dc7dcfce23621baa2e17f661edb2444a418040/numpy-2.3.2-cp314-cp314-win_amd64.whl", hash = "sha256:b9d0878b21e3918d76d2209c924ebb272340da1fb51abc00f986c258cd5e957b", size = 12918821 },
{ url = "https://files.pythonhosted.org/packages/0e/0f/0dc44007c70b1007c1cef86b06986a3812dd7106d8f946c09cfa75782556/numpy-2.3.2-cp314-cp314-win_arm64.whl", hash = "sha256:2738534837c6a1d0c39340a190177d7d66fdf432894f469728da901f8f6dc910", size = 10477303 },
{ url = "https://files.pythonhosted.org/packages/8b/3e/075752b79140b78ddfc9c0a1634d234cfdbc6f9bbbfa6b7504e445ad7d19/numpy-2.3.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:4d002ecf7c9b53240be3bb69d80f86ddbd34078bae04d87be81c1f58466f264e", size = 21047524 },
{ url = "https://files.pythonhosted.org/packages/fe/6d/60e8247564a72426570d0e0ea1151b95ce5bd2f1597bb878a18d32aec855/numpy-2.3.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:293b2192c6bcce487dbc6326de5853787f870aeb6c43f8f9c6496db5b1781e45", size = 14300519 },
{ url = "https://files.pythonhosted.org/packages/4d/73/d8326c442cd428d47a067070c3ac6cc3b651a6e53613a1668342a12d4479/numpy-2.3.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0a4f2021a6da53a0d580d6ef5db29947025ae8b35b3250141805ea9a32bbe86b", size = 5228972 },
{ url = "https://files.pythonhosted.org/packages/34/2e/e71b2d6dad075271e7079db776196829019b90ce3ece5c69639e4f6fdc44/numpy-2.3.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9c144440db4bf3bb6372d2c3e49834cc0ff7bb4c24975ab33e01199e645416f2", size = 6737439 },
{ url = "https://files.pythonhosted.org/packages/15/b0/d004bcd56c2c5e0500ffc65385eb6d569ffd3363cb5e593ae742749b2daa/numpy-2.3.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f92d6c2a8535dc4fe4419562294ff957f83a16ebdec66df0805e473ffaad8bd0", size = 14352479 },
{ url = "https://files.pythonhosted.org/packages/11/e3/285142fcff8721e0c99b51686426165059874c150ea9ab898e12a492e291/numpy-2.3.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cefc2219baa48e468e3db7e706305fcd0c095534a192a08f31e98d83a7d45fb0", size = 16702805 },
{ url = "https://files.pythonhosted.org/packages/33/c3/33b56b0e47e604af2c7cd065edca892d180f5899599b76830652875249a3/numpy-2.3.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:76c3e9501ceb50b2ff3824c3589d5d1ab4ac857b0ee3f8f49629d0de55ecf7c2", size = 16133830 },
{ url = "https://files.pythonhosted.org/packages/6e/ae/7b1476a1f4d6a48bc669b8deb09939c56dd2a439db1ab03017844374fb67/numpy-2.3.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:122bf5ed9a0221b3419672493878ba4967121514b1d7d4656a7580cd11dddcbf", size = 18652665 },
{ url = "https://files.pythonhosted.org/packages/14/ba/5b5c9978c4bb161034148ade2de9db44ec316fab89ce8c400db0e0c81f86/numpy-2.3.2-cp314-cp314t-win32.whl", hash = "sha256:6f1ae3dcb840edccc45af496f312528c15b1f79ac318169d094e85e4bb35fdf1", size = 6514777 },
{ url = "https://files.pythonhosted.org/packages/eb/46/3dbaf0ae7c17cdc46b9f662c56da2054887b8d9e737c1476f335c83d33db/numpy-2.3.2-cp314-cp314t-win_amd64.whl", hash = "sha256:087ffc25890d89a43536f75c5fe8770922008758e8eeeef61733957041ed2f9b", size = 13111856 },
{ url = "https://files.pythonhosted.org/packages/c1/9e/1652778bce745a67b5fe05adde60ed362d38eb17d919a540e813d30f6874/numpy-2.3.2-cp314-cp314t-win_arm64.whl", hash = "sha256:092aeb3449833ea9c0bf0089d70c29ae480685dd2377ec9cdbbb620257f84631", size = 10544226 },
]
[[package]] [[package]]
name = "ollama" name = "ollama"
version = "0.5.1" version = "0.5.1"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "httpx" }, { name = "httpx", marker = "python_full_version >= '3.13'" },
{ name = "pydantic" }, { name = "pydantic", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/8d/96/c7fe0d2d1b3053be614822a7b722c7465161b3672ce90df71515137580a0/ollama-0.5.1.tar.gz", hash = "sha256:5a799e4dc4e7af638b11e3ae588ab17623ee019e496caaf4323efbaa8feeff93", size = 41112 } sdist = { url = "https://files.pythonhosted.org/packages/8d/96/c7fe0d2d1b3053be614822a7b722c7465161b3672ce90df71515137580a0/ollama-0.5.1.tar.gz", hash = "sha256:5a799e4dc4e7af638b11e3ae588ab17623ee019e496caaf4323efbaa8feeff93", size = 41112 }
wheels = [ wheels = [
{ url = "https://files.pythonhosted.org/packages/d6/76/3f96c8cdbf3955d7a73ee94ce3e0db0755d6de1e0098a70275940d1aff2f/ollama-0.5.1-py3-none-any.whl", hash = "sha256:4c8839f35bc173c7057b1eb2cbe7f498c1a7e134eafc9192824c8aecb3617506", size = 13369 }, { url = "https://files.pythonhosted.org/packages/d6/76/3f96c8cdbf3955d7a73ee94ce3e0db0755d6de1e0098a70275940d1aff2f/ollama-0.5.1-py3-none-any.whl", hash = "sha256:4c8839f35bc173c7057b1eb2cbe7f498c1a7e134eafc9192824c8aecb3617506", size = 13369 },
] ]
[[package]]
name = "opencv-python"
version = "4.11.0.86"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "numpy", marker = "python_full_version >= '3.13'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/17/06/68c27a523103dad5837dc5b87e71285280c4f098c60e4fe8a8db6486ab09/opencv-python-4.11.0.86.tar.gz", hash = "sha256:03d60ccae62304860d232272e4a4fda93c39d595780cb40b161b310244b736a4", size = 95171956 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/05/4d/53b30a2a3ac1f75f65a59eb29cf2ee7207ce64867db47036ad61743d5a23/opencv_python-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:432f67c223f1dc2824f5e73cdfcd9db0efc8710647d4e813012195dc9122a52a", size = 37326322 },
{ url = "https://files.pythonhosted.org/packages/3b/84/0a67490741867eacdfa37bc18df96e08a9d579583b419010d7f3da8ff503/opencv_python-4.11.0.86-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:9d05ef13d23fe97f575153558653e2d6e87103995d54e6a35db3f282fe1f9c66", size = 56723197 },
{ url = "https://files.pythonhosted.org/packages/f3/bd/29c126788da65c1fb2b5fb621b7fed0ed5f9122aa22a0868c5e2c15c6d23/opencv_python-4.11.0.86-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b92ae2c8852208817e6776ba1ea0d6b1e0a1b5431e971a2a0ddd2a8cc398202", size = 42230439 },
{ url = "https://files.pythonhosted.org/packages/2c/8b/90eb44a40476fa0e71e05a0283947cfd74a5d36121a11d926ad6f3193cc4/opencv_python-4.11.0.86-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b02611523803495003bd87362db3e1d2a0454a6a63025dc6658a9830570aa0d", size = 62986597 },
{ url = "https://files.pythonhosted.org/packages/fb/d7/1d5941a9dde095468b288d989ff6539dd69cd429dbf1b9e839013d21b6f0/opencv_python-4.11.0.86-cp37-abi3-win32.whl", hash = "sha256:810549cb2a4aedaa84ad9a1c92fbfdfc14090e2749cedf2c1589ad8359aa169b", size = 29384337 },
{ url = "https://files.pythonhosted.org/packages/a4/7d/f1c30a92854540bf789e9cd5dde7ef49bbe63f855b85a2e6b3db8135c591/opencv_python-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:085ad9b77c18853ea66283e98affefe2de8cc4c1f43eda4c100cf9b2721142ec", size = 39488044 },
]
[[package]] [[package]]
name = "orjson" name = "orjson"
version = "3.11.1" version = "3.11.1"
@@ -383,10 +461,10 @@ name = "pydantic"
version = "2.11.7" version = "2.11.7"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "annotated-types" }, { name = "annotated-types", marker = "python_full_version >= '3.13'" },
{ name = "pydantic-core" }, { name = "pydantic-core", marker = "python_full_version >= '3.13'" },
{ name = "typing-extensions" }, { name = "typing-extensions", marker = "python_full_version >= '3.13'" },
{ name = "typing-inspection" }, { name = "typing-inspection", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350 } sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350 }
wheels = [ wheels = [
@@ -398,7 +476,7 @@ name = "pydantic-core"
version = "2.33.2" version = "2.33.2"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "typing-extensions" }, { name = "typing-extensions", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195 } sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195 }
wheels = [ wheels = [
@@ -435,8 +513,8 @@ name = "pyright"
version = "1.1.403" version = "1.1.403"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "nodeenv" }, { name = "nodeenv", marker = "python_full_version >= '3.13'" },
{ name = "typing-extensions" }, { name = "typing-extensions", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/fe/f6/35f885264ff08c960b23d1542038d8da86971c5d8c955cfab195a4f672d7/pyright-1.1.403.tar.gz", hash = "sha256:3ab69b9f41c67fb5bbb4d7a36243256f0d549ed3608678d381d5f51863921104", size = 3913526 } sdist = { url = "https://files.pythonhosted.org/packages/fe/f6/35f885264ff08c960b23d1542038d8da86971c5d8c955cfab195a4f672d7/pyright-1.1.403.tar.gz", hash = "sha256:3ab69b9f41c67fb5bbb4d7a36243256f0d549ed3608678d381d5f51863921104", size = 3913526 }
wheels = [ wheels = [
@@ -448,11 +526,11 @@ name = "pytest"
version = "8.4.1" version = "8.4.1"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" }, { name = "colorama", marker = "python_full_version >= '3.13' and sys_platform == 'win32'" },
{ name = "iniconfig" }, { name = "iniconfig", marker = "python_full_version >= '3.13'" },
{ name = "packaging" }, { name = "packaging", marker = "python_full_version >= '3.13'" },
{ name = "pluggy" }, { name = "pluggy", marker = "python_full_version >= '3.13'" },
{ name = "pygments" }, { name = "pygments", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714 } sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714 }
wheels = [ wheels = [
@@ -481,10 +559,10 @@ name = "requests"
version = "2.32.4" version = "2.32.4"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "certifi" }, { name = "certifi", marker = "python_full_version >= '3.13'" },
{ name = "charset-normalizer" }, { name = "charset-normalizer", marker = "python_full_version >= '3.13'" },
{ name = "idna" }, { name = "idna", marker = "python_full_version >= '3.13'" },
{ name = "urllib3" }, { name = "urllib3", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258 } sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258 }
wheels = [ wheels = [
@@ -496,7 +574,7 @@ name = "requests-toolbelt"
version = "1.0.0" version = "1.0.0"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "requests" }, { name = "requests", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 } sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 }
wheels = [ wheels = [
@@ -542,8 +620,8 @@ name = "sqlalchemy"
version = "2.0.41" version = "2.0.41"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "greenlet", marker = "(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')" }, { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64' and python_full_version >= '3.13') or (python_full_version < '3.14' and platform_machine == 'WIN32' and python_full_version >= '3.13') or (python_full_version < '3.14' and platform_machine == 'aarch64' and python_full_version >= '3.13') or (python_full_version < '3.14' and platform_machine == 'amd64' and python_full_version >= '3.13') or (python_full_version < '3.14' and platform_machine == 'ppc64le' and python_full_version >= '3.13') or (python_full_version < '3.14' and platform_machine == 'win32' and python_full_version >= '3.13') or (python_full_version < '3.14' and platform_machine == 'x86_64' and python_full_version >= '3.13')" },
{ name = "typing-extensions" }, { name = "typing-extensions", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/63/66/45b165c595ec89aa7dcc2c1cd222ab269bc753f1fc7a1e68f8481bd957bf/sqlalchemy-2.0.41.tar.gz", hash = "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9", size = 9689424 } sdist = { url = "https://files.pythonhosted.org/packages/63/66/45b165c595ec89aa7dcc2c1cd222ab269bc753f1fc7a1e68f8481bd957bf/sqlalchemy-2.0.41.tar.gz", hash = "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9", size = 9689424 }
wheels = [ wheels = [
@@ -606,7 +684,7 @@ name = "typing-inspection"
version = "0.4.1" version = "0.4.1"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "typing-extensions" }, { name = "typing-extensions", marker = "python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726 } sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726 }
wheels = [ wheels = [
@@ -627,7 +705,7 @@ name = "zstandard"
version = "0.23.0" version = "0.23.0"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "cffi", marker = "platform_python_implementation == 'PyPy'" }, { name = "cffi", marker = "platform_python_implementation == 'PyPy' and python_full_version >= '3.13'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/2ac0287b442160a89d726b17a9184a4c615bb5237db763791a7fd16d9df1/zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", size = 681701 } sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/2ac0287b442160a89d726b17a9184a4c615bb5237db763791a7fd16d9df1/zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", size = 681701 }
wheels = [ wheels = [