diff --git a/.gitignore b/.gitignore index 94d7ad7..25649c6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .jj +.tmp-data # Byte-compiled / optimized / DLL files __pycache__/ *.py[codz] diff --git a/data/classes.txt b/data/classes.txt new file mode 100644 index 0000000..ec08738 --- /dev/null +++ b/data/classes.txt @@ -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 diff --git a/data/images/cat.jpg b/data/images/cat.jpg new file mode 100644 index 0000000..f05893f Binary files /dev/null and b/data/images/cat.jpg differ diff --git a/data/images/dog.jpg b/data/images/dog.jpg new file mode 100644 index 0000000..4e37458 Binary files /dev/null and b/data/images/dog.jpg differ diff --git a/data/labels/cat.txt b/data/labels/cat.txt new file mode 100644 index 0000000..5bef68c --- /dev/null +++ b/data/labels/cat.txt @@ -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 diff --git a/data/labels/dog.txt b/data/labels/dog.txt new file mode 100644 index 0000000..de3b7f8 --- /dev/null +++ b/data/labels/dog.txt @@ -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 diff --git a/data/notes.json b/data/notes.json new file mode 100644 index 0000000..4d718d2 --- /dev/null +++ b/data/notes.json @@ -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" + } +} \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..4bb52a7 --- /dev/null +++ b/main.py @@ -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() diff --git a/pyproject.toml b/pyproject.toml index 27210c5..7e68b74 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,6 +16,8 @@ requires-python = ">=3.13" dependencies = [ "langchain>=0.3.27", "langchain-ollama>=0.3.6", + "numpy>=2.3.2", + "opencv-python>=4.11.0.86", ] [tool.uv] diff --git a/src/data.py b/src/data.py new file mode 100644 index 0000000..1c45f50 --- /dev/null +++ b/src/data.py @@ -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 diff --git a/src/img_utils.py b/src/img_utils.py new file mode 100644 index 0000000..4e55b8a --- /dev/null +++ b/src/img_utils.py @@ -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 diff --git a/uv.lock b/uv.lock index b392bd9..8bdfbf6 100644 --- a/uv.lock +++ b/uv.lock @@ -1,27 +1,36 @@ version = 1 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]] name = "abduction-demo" version = "0.1.0" -source = { virtual = "." } +source = { editable = "." } dependencies = [ - { name = "langchain" }, - { name = "langchain-ollama" }, + { name = "langchain", marker = "python_full_version >= '3.13'" }, + { 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] dev = [ - { name = "pyright" }, - { name = "pytest" }, - { name = "ruff" }, - { name = "ty" }, + { name = "pyright", marker = "python_full_version >= '3.13'" }, + { name = "pytest", marker = "python_full_version >= '3.13'" }, + { name = "ruff", marker = "python_full_version >= '3.13'" }, + { name = "ty", marker = "python_full_version >= '3.13'" }, ] [package.metadata] requires-dist = [ { name = "langchain", specifier = ">=0.3.27" }, { 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] @@ -46,8 +55,8 @@ name = "anyio" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "idna" }, - { name = "sniffio" }, + { name = "idna", marker = "python_full_version >= '3.13'" }, + { 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 } wheels = [ @@ -68,7 +77,7 @@ name = "cffi" version = "1.17.1" source = { registry = "https://pypi.org/simple" } 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 } wheels = [ @@ -154,8 +163,8 @@ name = "httpcore" version = "1.0.9" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "certifi" }, - { name = "h11" }, + { name = "certifi", marker = "python_full_version >= '3.13'" }, + { 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 } wheels = [ @@ -167,10 +176,10 @@ name = "httpx" version = "0.28.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, + { name = "anyio", marker = "python_full_version >= '3.13'" }, + { name = "certifi", marker = "python_full_version >= '3.13'" }, + { name = "httpcore", marker = "python_full_version >= '3.13'" }, + { 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 } wheels = [ @@ -200,7 +209,7 @@ name = "jsonpatch" version = "1.33" source = { registry = "https://pypi.org/simple" } 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 } wheels = [ @@ -221,13 +230,13 @@ name = "langchain" version = "0.3.27" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "langchain-core" }, - { name = "langchain-text-splitters" }, - { name = "langsmith" }, - { name = "pydantic" }, - { name = "pyyaml" }, - { name = "requests" }, - { name = "sqlalchemy" }, + { name = "langchain-core", marker = "python_full_version >= '3.13'" }, + { name = "langchain-text-splitters", marker = "python_full_version >= '3.13'" }, + { name = "langsmith", marker = "python_full_version >= '3.13'" }, + { name = "pydantic", marker = "python_full_version >= '3.13'" }, + { name = "pyyaml", marker = "python_full_version >= '3.13'" }, + { name = "requests", marker = "python_full_version >= '3.13'" }, + { 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 } wheels = [ @@ -239,13 +248,13 @@ name = "langchain-core" version = "0.3.72" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "jsonpatch" }, - { name = "langsmith" }, - { name = "packaging" }, - { name = "pydantic" }, - { name = "pyyaml" }, - { name = "tenacity" }, - { name = "typing-extensions" }, + { name = "jsonpatch", marker = "python_full_version >= '3.13'" }, + { name = "langsmith", marker = "python_full_version >= '3.13'" }, + { name = "packaging", marker = "python_full_version >= '3.13'" }, + { name = "pydantic", marker = "python_full_version >= '3.13'" }, + { name = "pyyaml", marker = "python_full_version >= '3.13'" }, + { name = "tenacity", marker = "python_full_version >= '3.13'" }, + { 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 } wheels = [ @@ -257,8 +266,8 @@ name = "langchain-ollama" version = "0.3.6" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "langchain-core" }, - { name = "ollama" }, + { name = "langchain-core", marker = "python_full_version >= '3.13'" }, + { 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 } wheels = [ @@ -270,7 +279,7 @@ name = "langchain-text-splitters" version = "0.3.9" source = { registry = "https://pypi.org/simple" } 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 } wheels = [ @@ -282,13 +291,13 @@ name = "langsmith" version = "0.4.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "httpx" }, - { name = "orjson", marker = "platform_python_implementation != 'PyPy'" }, - { name = "packaging" }, - { name = "pydantic" }, - { name = "requests" }, - { name = "requests-toolbelt" }, - { name = "zstandard" }, + { name = "httpx", marker = "python_full_version >= '3.13'" }, + { name = "orjson", marker = "platform_python_implementation != 'PyPy' and python_full_version >= '3.13'" }, + { name = "packaging", marker = "python_full_version >= '3.13'" }, + { name = "pydantic", marker = "python_full_version >= '3.13'" }, + { name = "requests", marker = "python_full_version >= '3.13'" }, + { name = "requests-toolbelt", marker = "python_full_version >= '3.13'" }, + { 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 } 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 }, ] +[[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]] name = "ollama" version = "0.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "httpx" }, - { name = "pydantic" }, + { name = "httpx", marker = "python_full_version >= '3.13'" }, + { 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 } wheels = [ { 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]] name = "orjson" version = "3.11.1" @@ -383,10 +461,10 @@ name = "pydantic" version = "2.11.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "annotated-types" }, - { name = "pydantic-core" }, - { name = "typing-extensions" }, - { name = "typing-inspection" }, + { name = "annotated-types", marker = "python_full_version >= '3.13'" }, + { name = "pydantic-core", marker = "python_full_version >= '3.13'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.13'" }, + { 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 } wheels = [ @@ -398,7 +476,7 @@ name = "pydantic-core" version = "2.33.2" source = { registry = "https://pypi.org/simple" } 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 } wheels = [ @@ -435,8 +513,8 @@ name = "pyright" version = "1.1.403" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nodeenv" }, - { name = "typing-extensions" }, + { name = "nodeenv", marker = "python_full_version >= '3.13'" }, + { 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 } wheels = [ @@ -448,11 +526,11 @@ name = "pytest" version = "8.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "iniconfig" }, - { name = "packaging" }, - { name = "pluggy" }, - { name = "pygments" }, + { name = "colorama", marker = "python_full_version >= '3.13' and sys_platform == 'win32'" }, + { name = "iniconfig", marker = "python_full_version >= '3.13'" }, + { name = "packaging", marker = "python_full_version >= '3.13'" }, + { name = "pluggy", marker = "python_full_version >= '3.13'" }, + { 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 } wheels = [ @@ -481,10 +559,10 @@ name = "requests" version = "2.32.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3" }, + { name = "certifi", marker = "python_full_version >= '3.13'" }, + { name = "charset-normalizer", marker = "python_full_version >= '3.13'" }, + { name = "idna", marker = "python_full_version >= '3.13'" }, + { 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 } wheels = [ @@ -496,7 +574,7 @@ name = "requests-toolbelt" version = "1.0.0" source = { registry = "https://pypi.org/simple" } 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 } wheels = [ @@ -542,8 +620,8 @@ name = "sqlalchemy" version = "2.0.41" source = { registry = "https://pypi.org/simple" } 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 = "typing-extensions" }, + { 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", 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 } wheels = [ @@ -606,7 +684,7 @@ name = "typing-inspection" version = "0.4.1" source = { registry = "https://pypi.org/simple" } 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 } wheels = [ @@ -627,7 +705,7 @@ name = "zstandard" version = "0.23.0" source = { registry = "https://pypi.org/simple" } 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 } wheels = [