lm-deluge 0.0.16__py3-none-any.whl → 0.0.18__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lm_deluge/api_requests/anthropic.py +10 -7
- lm_deluge/api_requests/base.py +23 -0
- lm_deluge/api_requests/bedrock.py +9 -6
- lm_deluge/api_requests/gemini.py +4 -1
- lm_deluge/api_requests/mistral.py +4 -1
- lm_deluge/api_requests/openai.py +15 -2
- lm_deluge/built_in_tools/{anthropic.py → anthropic/__init__.py} +3 -1
- lm_deluge/built_in_tools/anthropic/bash.py +0 -0
- lm_deluge/built_in_tools/anthropic/computer_use.py +0 -0
- lm_deluge/built_in_tools/anthropic/editor.py +559 -0
- lm_deluge/built_in_tools/base.py +9 -0
- lm_deluge/client.py +88 -1
- lm_deluge/image.py +9 -6
- lm_deluge/llm_tools/classify.py +1 -0
- lm_deluge/llm_tools/locate.py +162 -0
- lm_deluge/prompt.py +2 -2
- lm_deluge/request_context.py +1 -0
- lm_deluge/tool.py +4 -0
- lm_deluge/util/spatial.py +139 -0
- {lm_deluge-0.0.16.dist-info → lm_deluge-0.0.18.dist-info}/METADATA +11 -1
- {lm_deluge-0.0.16.dist-info → lm_deluge-0.0.18.dist-info}/RECORD +24 -17
- {lm_deluge-0.0.16.dist-info → lm_deluge-0.0.18.dist-info}/WHEEL +0 -0
- {lm_deluge-0.0.16.dist-info → lm_deluge-0.0.18.dist-info}/licenses/LICENSE +0 -0
- {lm_deluge-0.0.16.dist-info → lm_deluge-0.0.18.dist-info}/top_level.txt +0 -0
lm_deluge/image.py
CHANGED
|
@@ -1,20 +1,23 @@
|
|
|
1
|
-
import os
|
|
2
|
-
from contextlib import contextmanager
|
|
3
|
-
import io
|
|
4
|
-
import requests
|
|
5
|
-
from PIL import Image as PILImage # type: ignore
|
|
6
1
|
import base64
|
|
2
|
+
import io
|
|
7
3
|
import mimetypes
|
|
4
|
+
import os
|
|
5
|
+
from contextlib import contextmanager
|
|
8
6
|
from dataclasses import dataclass, field
|
|
9
7
|
from pathlib import Path
|
|
10
8
|
from typing import Literal
|
|
11
9
|
|
|
10
|
+
import requests
|
|
11
|
+
from PIL import Image as PILImage # type: ignore
|
|
12
|
+
|
|
13
|
+
MediaType = Literal["image/jpeg", "image/png", "image/gif", "image/webp"]
|
|
14
|
+
|
|
12
15
|
|
|
13
16
|
@dataclass(slots=True)
|
|
14
17
|
class Image:
|
|
15
18
|
# raw bytes, pathlike, http url, or base64 data url
|
|
16
19
|
data: bytes | io.BytesIO | Path | str
|
|
17
|
-
media_type:
|
|
20
|
+
media_type: MediaType | None = None # inferred if None
|
|
18
21
|
detail: Literal["low", "high", "auto"] = "auto"
|
|
19
22
|
type: str = field(init=False, default="image")
|
|
20
23
|
_fingerprint_cache: str | None = field(init=False, default=None)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# NOT IMPLEMENTED!!!
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# # utilities for locating things in images
|
|
2
|
+
# from dataclasses import dataclass
|
|
3
|
+
# from typing import Literal
|
|
4
|
+
|
|
5
|
+
# from lm_deluge.util.json import load_json
|
|
6
|
+
# from lm_deluge.util.spatial import Box2D, Point
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# @dataclass
|
|
10
|
+
# class LocatePrompt:
|
|
11
|
+
# description: str
|
|
12
|
+
# task: Literal["click", "detect"] = "click"
|
|
13
|
+
# orientation: Literal["xy", "yx"] = "xy"
|
|
14
|
+
# origin: Literal["top-left", "bottom-left"] = "top-left"
|
|
15
|
+
# coords: Literal["absolute", "relative-1", "relative-1k"] = "absolute"
|
|
16
|
+
# height: int | None = None
|
|
17
|
+
# width: int | None = None
|
|
18
|
+
# output_type: Literal["point", "points", "box", "boxes"] = "point"
|
|
19
|
+
# output_fmt: Literal["json", "xml"] = "xml"
|
|
20
|
+
|
|
21
|
+
# def to_string(self) -> str:
|
|
22
|
+
# """Compose the full prompt string based on the current configuration."""
|
|
23
|
+
# parts: list[str] = []
|
|
24
|
+
|
|
25
|
+
# if self.task == "click":
|
|
26
|
+
# parts.append(
|
|
27
|
+
# "Given an instruction, determine where to click in the image to complete it. "
|
|
28
|
+
# )
|
|
29
|
+
# parts.append(f"\n\nINSTRUCTION: {self.description}\n\n")
|
|
30
|
+
# else:
|
|
31
|
+
# if self.output_type.endswith("s"):
|
|
32
|
+
# parts.append(
|
|
33
|
+
# "Given a description of an object to locate, find ALL instances of that object in the image."
|
|
34
|
+
# )
|
|
35
|
+
# else:
|
|
36
|
+
# parts.append(
|
|
37
|
+
# "Given a description of an object to locate, find that object in the image."
|
|
38
|
+
# )
|
|
39
|
+
# parts.append(f"\n\nDESCRIPTION: {self.description}\n\n")
|
|
40
|
+
|
|
41
|
+
# if self.output_type == "point":
|
|
42
|
+
# point_type = "(x, y)" if self.orientation == "xy" else "(y, x)"
|
|
43
|
+
# parts.append(f"Your response should be a single {point_type} point")
|
|
44
|
+
# if self.output_fmt == "xml":
|
|
45
|
+
# parts.append("enclosed in <point></point> tags.")
|
|
46
|
+
# else:
|
|
47
|
+
# parts.append('formatted as JSON, like {"point": [0, 1]}.')
|
|
48
|
+
|
|
49
|
+
# elif self.output_type == "points":
|
|
50
|
+
# point_type = "(x, y)" if self.orientation == "xy" else "(y, x)"
|
|
51
|
+
# parts.append(f"Your response should be a series of {point_type} points,")
|
|
52
|
+
# if self.output_fmt == "xml":
|
|
53
|
+
# parts.append("each one enclosed in <point></point> tags.")
|
|
54
|
+
# else:
|
|
55
|
+
# parts.append(
|
|
56
|
+
# 'formatted as a JSON array, like [{"point": [0, 1]}, {"point": [1, 0]}].'
|
|
57
|
+
# )
|
|
58
|
+
|
|
59
|
+
# elif self.output_type == "box":
|
|
60
|
+
# box_type = (
|
|
61
|
+
# "(x0, y0, x1, y1)" if self.orientation == "xy" else "(y0, x0, y1, x1)"
|
|
62
|
+
# )
|
|
63
|
+
# parts.append(f"Your response should be a {box_type} bounding box,")
|
|
64
|
+
|
|
65
|
+
# if self.output_fmt == "xml":
|
|
66
|
+
# parts.append("enclosed in <box></box> tags.")
|
|
67
|
+
# else:
|
|
68
|
+
# parts.append('formatted as JSON, like {"box_2d": [0, 0, 1, 1]}')
|
|
69
|
+
|
|
70
|
+
# elif self.output_type == "boxes":
|
|
71
|
+
# box_type = (
|
|
72
|
+
# "(x0, y0, x1, y1)" if self.orientation == "xy" else "(y0, x0, y1, x1)"
|
|
73
|
+
# )
|
|
74
|
+
# parts.append(
|
|
75
|
+
# f"Your response should be a series of {box_type} bounding boxes,"
|
|
76
|
+
# )
|
|
77
|
+
# if self.output_fmt == "xml":
|
|
78
|
+
# parts.append("each one enclosed in <box></box> tags.")
|
|
79
|
+
# else:
|
|
80
|
+
# parts.append(
|
|
81
|
+
# 'formatted as a JSON array, like [{"box_2d": [0, 0, 1, 1]}, {"box_2d": [0.5, 0.5, 1, 1]}].'
|
|
82
|
+
# )
|
|
83
|
+
|
|
84
|
+
# if self.coords == "absolute":
|
|
85
|
+
# parts.append(
|
|
86
|
+
# "The returned coordinates should be absolute pixel coordinates in the image. "
|
|
87
|
+
# f"The image has a height of {self.height} pixels and a width of {self.width} pixels. "
|
|
88
|
+
# )
|
|
89
|
+
# if self.origin == "top-left":
|
|
90
|
+
# parts.append("The origin (0, 0) is at the top-left of the image.")
|
|
91
|
+
# else:
|
|
92
|
+
# parts.append("The origin (0, 0) is at the bottom-left of the image.")
|
|
93
|
+
# elif self.coords == "relative-1":
|
|
94
|
+
# parts.append(
|
|
95
|
+
# "The returned coordinates should be relative coordinates where x are between 0 and 1. "
|
|
96
|
+
# )
|
|
97
|
+
# if self.origin == "top-left":
|
|
98
|
+
# parts.append(
|
|
99
|
+
# "The origin (0, 0) is at the top-left of the image, and (1, 1) is at the bottom-right."
|
|
100
|
+
# )
|
|
101
|
+
# else:
|
|
102
|
+
# parts.append(
|
|
103
|
+
# "The origin (0, 0) is at the bottom-left of the image, and (1, 1) is at the top-right."
|
|
104
|
+
# )
|
|
105
|
+
# elif self.coords == "relative-1k":
|
|
106
|
+
# parts.append(
|
|
107
|
+
# "The returned coordinates should be relative coordinates where x are between 0 and 1000. "
|
|
108
|
+
# )
|
|
109
|
+
# if self.origin == "top-left":
|
|
110
|
+
# parts.append(
|
|
111
|
+
# "The origin (0, 0) is at the top-left of the image, and (1000, 1000) is at the bottom-right."
|
|
112
|
+
# )
|
|
113
|
+
# else:
|
|
114
|
+
# parts.append(
|
|
115
|
+
# "The origin (0, 0) is at the bottom-left of the image, and (1000, 1000) is at the top-right."
|
|
116
|
+
# )
|
|
117
|
+
|
|
118
|
+
# parts.append(
|
|
119
|
+
# "Return JUST the structured output, no prelude or commentary needed."
|
|
120
|
+
# )
|
|
121
|
+
|
|
122
|
+
# result = ""
|
|
123
|
+
# for part in parts:
|
|
124
|
+
# if part.startswith("\n") or result.endswith("\n"):
|
|
125
|
+
# result += part
|
|
126
|
+
# else:
|
|
127
|
+
# result += " " + part
|
|
128
|
+
|
|
129
|
+
# return result.strip()
|
|
130
|
+
|
|
131
|
+
# def parse_output(self, output: str) -> Point | Box2D | list[Point] | list[Box2D]:
|
|
132
|
+
# if self.output_fmt == "json":
|
|
133
|
+
# loaded = load_json(output)
|
|
134
|
+
# if self.output_type == "point":
|
|
135
|
+
# assert isinstance(loaded, dict)
|
|
136
|
+
# if self.orientation == "xy":
|
|
137
|
+
# x, y = loaded["point"]
|
|
138
|
+
# else:
|
|
139
|
+
# y, x = loaded["point"]
|
|
140
|
+
|
|
141
|
+
# return Point(x=)
|
|
142
|
+
|
|
143
|
+
# else:
|
|
144
|
+
# pass
|
|
145
|
+
|
|
146
|
+
# return []
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
# def locate_point():
|
|
150
|
+
# pass
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
# def locate_points():
|
|
154
|
+
# pass
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
# def locate_box():
|
|
158
|
+
# pass
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
# def locate_boxes():
|
|
162
|
+
# pass
|
lm_deluge/prompt.py
CHANGED
|
@@ -8,7 +8,7 @@ import tiktoken
|
|
|
8
8
|
import xxhash
|
|
9
9
|
|
|
10
10
|
from lm_deluge.file import File
|
|
11
|
-
from lm_deluge.image import Image
|
|
11
|
+
from lm_deluge.image import Image, MediaType
|
|
12
12
|
|
|
13
13
|
CachePattern = Literal[
|
|
14
14
|
"tools_only",
|
|
@@ -348,7 +348,7 @@ class Message:
|
|
|
348
348
|
self,
|
|
349
349
|
data: bytes | str | Path | io.BytesIO,
|
|
350
350
|
*,
|
|
351
|
-
media_type:
|
|
351
|
+
media_type: MediaType | None = None,
|
|
352
352
|
detail: Literal["low", "high", "auto"] = "auto",
|
|
353
353
|
max_size: int | None = None,
|
|
354
354
|
) -> "Message":
|
lm_deluge/request_context.py
CHANGED
lm_deluge/tool.py
CHANGED
|
@@ -255,6 +255,10 @@ class Tool(BaseModel):
|
|
|
255
255
|
},
|
|
256
256
|
}
|
|
257
257
|
|
|
258
|
+
def for_openai(self, strict: bool = True, **kwargs):
|
|
259
|
+
"""just an alias for the above"""
|
|
260
|
+
return self.for_openai_completions(strict=strict, **kwargs)
|
|
261
|
+
|
|
258
262
|
def for_openai_responses(self, **kwargs) -> dict[str, Any]:
|
|
259
263
|
if self.built_in:
|
|
260
264
|
return {"type": self.type, **self.built_in_args, **kwargs}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from functools import partial
|
|
3
|
+
|
|
4
|
+
from PIL import Image, ImageDraw
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@dataclass
|
|
8
|
+
class Point:
|
|
9
|
+
def __init__(self, x: float, y: float, description: str | None = None):
|
|
10
|
+
self.x = x
|
|
11
|
+
self.y = y
|
|
12
|
+
self.description = description
|
|
13
|
+
|
|
14
|
+
def __getitem__(self, index):
|
|
15
|
+
if index == 0:
|
|
16
|
+
return self.x
|
|
17
|
+
elif index == 1:
|
|
18
|
+
return self.y
|
|
19
|
+
elif index == "x":
|
|
20
|
+
return self.x
|
|
21
|
+
elif index == "y":
|
|
22
|
+
return self.y
|
|
23
|
+
else:
|
|
24
|
+
raise IndexError("Index out of range")
|
|
25
|
+
|
|
26
|
+
def __iter__(self):
|
|
27
|
+
yield self.x
|
|
28
|
+
yield self.y
|
|
29
|
+
|
|
30
|
+
def __str__(self):
|
|
31
|
+
return f"Point(x={self.x}, y={self.y})"
|
|
32
|
+
|
|
33
|
+
def __repr__(self):
|
|
34
|
+
return f"Point(x={self.x}, y={self.y})"
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def from_tuple(cls, point: tuple, description: str | None = None):
|
|
38
|
+
return cls(point[0], point[1], description)
|
|
39
|
+
|
|
40
|
+
@classmethod
|
|
41
|
+
def from_dict(cls, point: dict, description: str | None = None):
|
|
42
|
+
return cls(point["x"], point["y"], description)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@dataclass
|
|
46
|
+
class Box2D:
|
|
47
|
+
def __init__(
|
|
48
|
+
self,
|
|
49
|
+
xmin: float,
|
|
50
|
+
ymin: float,
|
|
51
|
+
xmax: float,
|
|
52
|
+
ymax: float,
|
|
53
|
+
description: str | None = None,
|
|
54
|
+
):
|
|
55
|
+
self.xmin = xmin
|
|
56
|
+
self.ymin = ymin
|
|
57
|
+
self.xmax = xmax
|
|
58
|
+
self.ymax = ymax
|
|
59
|
+
self.description = description
|
|
60
|
+
|
|
61
|
+
def __repr__(self):
|
|
62
|
+
return f"Box2D(xmin={self.xmin}, ymin={self.ymin}, xmax={self.xmax}, ymax={self.ymax})"
|
|
63
|
+
|
|
64
|
+
def __str__(self):
|
|
65
|
+
return f"Box2D(xmin={self.xmin}, ymin={self.ymin}, xmax={self.xmax}, ymax={self.ymax})"
|
|
66
|
+
|
|
67
|
+
@classmethod
|
|
68
|
+
def from_list(cls, box: list):
|
|
69
|
+
return cls(box[1], box[0], box[3], box[2])
|
|
70
|
+
|
|
71
|
+
def center(self):
|
|
72
|
+
return Point((self.xmin + self.xmax) / 2, (self.ymin + self.ymax) / 2)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def scale(
|
|
76
|
+
obj: Point | Box2D | tuple | dict,
|
|
77
|
+
src_width: int,
|
|
78
|
+
src_height: int,
|
|
79
|
+
dst_width: int,
|
|
80
|
+
dst_height: int,
|
|
81
|
+
return_integers: bool = True,
|
|
82
|
+
):
|
|
83
|
+
if isinstance(obj, tuple):
|
|
84
|
+
if len(obj) == 2:
|
|
85
|
+
obj = Point(obj[0], obj[1])
|
|
86
|
+
elif len(obj) == 4:
|
|
87
|
+
obj = Box2D(obj[0], obj[1], obj[2], obj[3])
|
|
88
|
+
else:
|
|
89
|
+
raise ValueError("Invalid tuple length")
|
|
90
|
+
elif isinstance(obj, dict):
|
|
91
|
+
if "x" in obj and "y" in obj:
|
|
92
|
+
obj = Point(obj["x"], obj["y"])
|
|
93
|
+
elif "xmin" in obj and "ymin" in obj and "xmax" in obj and "ymax" in obj:
|
|
94
|
+
obj = Box2D(obj["xmin"], obj["ymin"], obj["xmax"], obj["ymax"])
|
|
95
|
+
else:
|
|
96
|
+
raise ValueError("Invalid dictionary keys")
|
|
97
|
+
scale_x = dst_width / src_width
|
|
98
|
+
scale_y = dst_height / src_height
|
|
99
|
+
|
|
100
|
+
if isinstance(obj, Point):
|
|
101
|
+
x = obj.x * scale_x
|
|
102
|
+
y = obj.y * scale_y
|
|
103
|
+
if return_integers:
|
|
104
|
+
return Point(int(x), int(y), obj.description)
|
|
105
|
+
return Point(x, y)
|
|
106
|
+
elif isinstance(obj, Box2D):
|
|
107
|
+
xmin = obj.xmin * scale_x
|
|
108
|
+
ymin = obj.ymin * scale_y
|
|
109
|
+
xmax = obj.xmax * scale_x
|
|
110
|
+
ymax = obj.ymax * scale_y
|
|
111
|
+
if return_integers:
|
|
112
|
+
return Box2D(int(xmin), int(ymin), int(xmax), int(ymax), obj.description)
|
|
113
|
+
return Box2D(xmin, ymin, xmax, ymax, obj.description)
|
|
114
|
+
else:
|
|
115
|
+
raise TypeError("Unsupported type")
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
normalize_point = partial(scale, dst_width=1, dst_height=1, return_integers=False)
|
|
119
|
+
denormalize_point = partial(scale, src_width=1, src_height=1, return_integers=False)
|
|
120
|
+
normalize_point_1k = partial(
|
|
121
|
+
scale, dst_width=1000, dst_height=1000, return_integers=True
|
|
122
|
+
)
|
|
123
|
+
denormalize_point_1k = partial(
|
|
124
|
+
scale, src_width=1000, src_height=1000, return_integers=False
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def draw_box(image: Image.Image | str, box: Box2D):
|
|
129
|
+
if isinstance(image, str):
|
|
130
|
+
image = Image.open(image)
|
|
131
|
+
draw = ImageDraw.Draw(image)
|
|
132
|
+
draw.rectangle((box.xmin, box.ymin, box.xmax, box.ymax), outline="red", width=2)
|
|
133
|
+
return image
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def draw_point(image: Image.Image, point: Point):
|
|
137
|
+
draw = ImageDraw.Draw(image)
|
|
138
|
+
draw.ellipse((point[0] - 2, point[1] - 2, point[0] + 2, point[1] + 2), fill="red")
|
|
139
|
+
return image
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lm_deluge
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.18
|
|
4
4
|
Summary: Python utility for using LLM API models.
|
|
5
5
|
Author-email: Benjamin Anderson <ben@trytaylor.ai>
|
|
6
6
|
Requires-Python: >=3.10
|
|
@@ -211,6 +211,16 @@ for tool_call in resps[0].tool_calls:
|
|
|
211
211
|
# this is dumb sorry will make it better
|
|
212
212
|
tool_to_call = [x for x in tools if x.name == tool_call.name][0]
|
|
213
213
|
tool_to_call.call(**tool_call.arguments) # in async code, use .acall()
|
|
214
|
+
|
|
215
|
+
# or use the built-in agent loop to handle this automatically
|
|
216
|
+
import asyncio
|
|
217
|
+
|
|
218
|
+
async def main():
|
|
219
|
+
conv = Conversation.user("List the files in the current directory")
|
|
220
|
+
conv, resp = await client.run_agent_loop(conv, tools=tools)
|
|
221
|
+
print(resp.content.completion)
|
|
222
|
+
|
|
223
|
+
asyncio.run(main())
|
|
214
224
|
```
|
|
215
225
|
|
|
216
226
|
### Prompt Caching (Anthropic)
|
|
@@ -2,47 +2,54 @@ lm_deluge/__init__.py,sha256=mAztMuxINmh7dGbYnT8tsmw1eryQAvd0jpY8yHzd0EE,315
|
|
|
2
2
|
lm_deluge/agent.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
3
|
lm_deluge/batches.py,sha256=05t8UL1xCKjLRKtZLkfbexLqro6T_ufFVsaNIMk05Fw,17725
|
|
4
4
|
lm_deluge/cache.py,sha256=VB1kv8rM2t5XWPR60uhszFcxLDnVKOe1oA5hYjVDjIo,4375
|
|
5
|
-
lm_deluge/client.py,sha256=
|
|
5
|
+
lm_deluge/client.py,sha256=KFkI8uzHxwIvDS1PV4KjykHUMQ48wo6h-Yn4IJKUDbg,25682
|
|
6
6
|
lm_deluge/config.py,sha256=H1tQyJDNHGFuwxqQNL5Z-CjWAC0luHSBA3iY_pxmACM,932
|
|
7
7
|
lm_deluge/embed.py,sha256=CO-TOlC5kOTAM8lcnicoG4u4K664vCBwHF1vHa-nAGg,13382
|
|
8
8
|
lm_deluge/errors.py,sha256=oHjt7YnxWbh-eXMScIzov4NvpJMo0-2r5J6Wh5DQ1tk,209
|
|
9
9
|
lm_deluge/file.py,sha256=zQH1STMjCG9pczO7Fk9Jw0_0Pj_8CogcdIxTe4J4AJw,5414
|
|
10
10
|
lm_deluge/gemini_limits.py,sha256=V9mpS9JtXYz7AY6OuKyQp5TuIMRH1BVv9YrSNmGmHNA,1569
|
|
11
|
-
lm_deluge/image.py,sha256=
|
|
11
|
+
lm_deluge/image.py,sha256=D8kMh2yu8sTuOchKpW9DE3XKbE6oUiFl9cRi6H1GpDc,7526
|
|
12
12
|
lm_deluge/models.py,sha256=6ZCirxOpdcg_M24cKUABYbRpLK-r9dlkXxUS9aeh0UY,49657
|
|
13
|
-
lm_deluge/prompt.py,sha256=
|
|
14
|
-
lm_deluge/request_context.py,sha256=
|
|
13
|
+
lm_deluge/prompt.py,sha256=T8o2hwv3RuxG7-fL5pCl0v14WVpmV09PdRzCZzLNszE,35265
|
|
14
|
+
lm_deluge/request_context.py,sha256=l1DrPTtG80WtUhyDWblTiyT695K7Al9lWWDfdl6PMK0,2338
|
|
15
15
|
lm_deluge/rerank.py,sha256=-NBAJdHz9OB-SWWJnHzkFmeVO4wR6lFV7Vw-SxG7aVo,11457
|
|
16
|
-
lm_deluge/tool.py,sha256
|
|
16
|
+
lm_deluge/tool.py,sha256=X6NDabz53BVe1pokaKCeTLCF1-AlMAxOn1_KWiCSb7c,12407
|
|
17
17
|
lm_deluge/tracker.py,sha256=-EkFDAklh5mclIFR-5SthAwNL4p1yKS8LUN7rhpOVPQ,9266
|
|
18
18
|
lm_deluge/usage.py,sha256=VMEKghePFIID5JFBObqYxFpgYxnbYm_dnHy7V1-_T6M,4866
|
|
19
19
|
lm_deluge/api_requests/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
20
|
-
lm_deluge/api_requests/anthropic.py,sha256=
|
|
21
|
-
lm_deluge/api_requests/base.py,sha256=
|
|
22
|
-
lm_deluge/api_requests/bedrock.py,sha256=
|
|
20
|
+
lm_deluge/api_requests/anthropic.py,sha256=pgDJLS98R59ZBLUGZxEPuuagEKS3UgjPgvr3LPvsndA,7815
|
|
21
|
+
lm_deluge/api_requests/base.py,sha256=O3-Dsl_hr-xtLTekPLdrNnL5mTTfnfsN6Fcwq0-eKMg,5355
|
|
22
|
+
lm_deluge/api_requests/bedrock.py,sha256=kZtKp6GqF73RpmLJKzEj4XTbllB8Kyq9-QydUuh2iu0,10977
|
|
23
23
|
lm_deluge/api_requests/common.py,sha256=BZ3vRO5TB669_UsNKugkkuFSzoLHOYJIKt4nV4sf4vc,422
|
|
24
|
-
lm_deluge/api_requests/gemini.py,sha256=
|
|
25
|
-
lm_deluge/api_requests/mistral.py,sha256=
|
|
26
|
-
lm_deluge/api_requests/openai.py,sha256=
|
|
24
|
+
lm_deluge/api_requests/gemini.py,sha256=N_94TpjpBLyekdrBjax2w0jPqYf70JycaRgZUNSsAAY,7531
|
|
25
|
+
lm_deluge/api_requests/mistral.py,sha256=5EqYZgu9AfGrWs5-ucr8uJK_0cMEoUKKlEjBV3O6EPc,4561
|
|
26
|
+
lm_deluge/api_requests/openai.py,sha256=vunVsUKW-YwMQ_p7DlVBBUMldjxQUaMinpzl0TyIXm4,21228
|
|
27
27
|
lm_deluge/api_requests/response.py,sha256=JFSwHAs-yaJYkscOgTAyHkt-v8FDZ5mgER9NmueXTGk,5866
|
|
28
28
|
lm_deluge/api_requests/deprecated/bedrock.py,sha256=WrcIShCoO8JCUSlFOCHxg6KQCNTZfw3TpYTvSpYk4mA,11320
|
|
29
29
|
lm_deluge/api_requests/deprecated/cohere.py,sha256=KgDScD6_bWhAzOY5BHZQKSA3kurt4KGENqC4wLsGmcU,5142
|
|
30
30
|
lm_deluge/api_requests/deprecated/deepseek.py,sha256=FEApI93VAWDwuaqTooIyKMgONYqRhdUmiAPBRme-IYs,4582
|
|
31
31
|
lm_deluge/api_requests/deprecated/mistral.py,sha256=pOfOZUM4U35I3Plch84SnAFpDAzouHcSNNMtgxRvjy4,4709
|
|
32
32
|
lm_deluge/api_requests/deprecated/vertex.py,sha256=ygXz2RjdXErPCSBbiHLEWbf5_sSTIi31WoX0UaoYzRI,15275
|
|
33
|
-
lm_deluge/built_in_tools/
|
|
33
|
+
lm_deluge/built_in_tools/base.py,sha256=FLYdKVAqlffA6WOu4j8wQVRd0iHMsyBW_T3vfl--aXo,276
|
|
34
34
|
lm_deluge/built_in_tools/openai.py,sha256=aLuJdXbANvXVIU38Vo2zsir7zlwWgX0d8oDPT7Ql64A,721
|
|
35
|
+
lm_deluge/built_in_tools/anthropic/__init__.py,sha256=Dxm8MJTUwMhyXT_78uIdRe8dJsLHZcHThJ9UEurTw18,4526
|
|
36
|
+
lm_deluge/built_in_tools/anthropic/bash.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
37
|
+
lm_deluge/built_in_tools/anthropic/computer_use.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
38
|
+
lm_deluge/built_in_tools/anthropic/editor.py,sha256=DyC_DrHVTm1khU9QDL39vBuhu4tO5mS5H7xMRIT0Ng4,23327
|
|
35
39
|
lm_deluge/llm_tools/__init__.py,sha256=TbZTETq9i_9yYskFWQKOG4pGh5ZiyE_D-h3RArfhGp4,231
|
|
40
|
+
lm_deluge/llm_tools/classify.py,sha256=OdMwV5u4XoPlVhjOHX0sng5KPBIKFJmQeOE2fmnPgLU,21
|
|
36
41
|
lm_deluge/llm_tools/extract.py,sha256=C3drVAMaoFx5jNE38Xi5cXxrqboyoZ9cE7nX5ylWbXw,4482
|
|
42
|
+
lm_deluge/llm_tools/locate.py,sha256=lYNbKTmy9dTvj0lEQkOQ7yrxyqsgYzjD0C_byJKI_4w,6271
|
|
37
43
|
lm_deluge/llm_tools/ocr.py,sha256=7fDlvs6uUOvbxMasvGGNJx5Fj6biM6z3lijKZaGN26k,23
|
|
38
44
|
lm_deluge/llm_tools/score.py,sha256=9oGA3-k2U5buHQXkXaEI9M4Wb5yysNhTLsPbGeghAlQ,2580
|
|
39
45
|
lm_deluge/llm_tools/translate.py,sha256=iXyYvQZ8bC44FWhBk4qpdqjKM1WFF7Shq-H2PxhPgg4,1452
|
|
40
46
|
lm_deluge/util/json.py,sha256=_4Oar2Cmz2L1DK3EtPLPDxD6rsYHxjROmV8ZpmMjQ-4,5822
|
|
41
47
|
lm_deluge/util/logprobs.py,sha256=UkBZakOxWluaLqHrjARu7xnJ0uCHVfLGHJdnYlEcutk,11768
|
|
48
|
+
lm_deluge/util/spatial.py,sha256=BsF_UKhE-x0xBirc-bV1xSKZRTUhsOBdGqsMKme20C8,4099
|
|
42
49
|
lm_deluge/util/validation.py,sha256=hz5dDb3ebvZrZhnaWxOxbNSVMI6nmaOODBkk0htAUhs,1575
|
|
43
50
|
lm_deluge/util/xml.py,sha256=Ft4zajoYBJR3HHCt2oHwGfymGLdvp_gegVmJ-Wqk4Ck,10547
|
|
44
|
-
lm_deluge-0.0.
|
|
45
|
-
lm_deluge-0.0.
|
|
46
|
-
lm_deluge-0.0.
|
|
47
|
-
lm_deluge-0.0.
|
|
48
|
-
lm_deluge-0.0.
|
|
51
|
+
lm_deluge-0.0.18.dist-info/licenses/LICENSE,sha256=uNNXGXPCw2TC7CUs7SEBkA-Mz6QBQFWUUEWDMgEs1dU,1058
|
|
52
|
+
lm_deluge-0.0.18.dist-info/METADATA,sha256=ipVPBfU_QURIDLXW3V-dwTFw_5luECxLTs3_bxku1oc,12978
|
|
53
|
+
lm_deluge-0.0.18.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
54
|
+
lm_deluge-0.0.18.dist-info/top_level.txt,sha256=hqU-TJX93yBwpgkDtYcXyLr3t7TLSCCZ_reytJjwBaE,10
|
|
55
|
+
lm_deluge-0.0.18.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|