lionagi 0.17.11__py3-none-any.whl → 0.18.1__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.
- lionagi/_errors.py +0 -5
- lionagi/fields.py +83 -0
- lionagi/libs/schema/minimal_yaml.py +98 -0
- lionagi/ln/__init__.py +3 -1
- lionagi/ln/concurrency/primitives.py +4 -4
- lionagi/ln/concurrency/task.py +1 -0
- lionagi/ln/types.py +32 -5
- lionagi/models/field_model.py +21 -4
- lionagi/models/hashable_model.py +2 -3
- lionagi/operations/ReAct/ReAct.py +475 -238
- lionagi/operations/ReAct/utils.py +3 -0
- lionagi/operations/act/act.py +206 -0
- lionagi/operations/builder.py +5 -7
- lionagi/operations/chat/chat.py +130 -114
- lionagi/operations/communicate/communicate.py +101 -42
- lionagi/operations/fields.py +380 -0
- lionagi/operations/flow.py +8 -10
- lionagi/operations/interpret/interpret.py +65 -20
- lionagi/operations/node.py +4 -4
- lionagi/operations/operate/operate.py +216 -108
- lionagi/{protocols/operatives → operations/operate}/operative.py +4 -5
- lionagi/{protocols/operatives → operations/operate}/step.py +34 -39
- lionagi/operations/parse/parse.py +170 -142
- lionagi/operations/select/select.py +79 -18
- lionagi/operations/select/utils.py +8 -2
- lionagi/operations/types.py +119 -23
- lionagi/protocols/action/manager.py +5 -6
- lionagi/protocols/contracts.py +2 -2
- lionagi/protocols/generic/__init__.py +22 -0
- lionagi/protocols/generic/element.py +36 -127
- lionagi/protocols/generic/log.py +3 -2
- lionagi/protocols/generic/pile.py +9 -10
- lionagi/protocols/generic/progression.py +23 -22
- lionagi/protocols/graph/edge.py +6 -5
- lionagi/protocols/ids.py +6 -49
- lionagi/protocols/messages/__init__.py +29 -0
- lionagi/protocols/messages/action_request.py +86 -184
- lionagi/protocols/messages/action_response.py +73 -131
- lionagi/protocols/messages/assistant_response.py +130 -159
- lionagi/protocols/messages/base.py +31 -22
- lionagi/protocols/messages/instruction.py +280 -625
- lionagi/protocols/messages/manager.py +112 -62
- lionagi/protocols/messages/message.py +87 -197
- lionagi/protocols/messages/system.py +52 -123
- lionagi/protocols/types.py +1 -13
- lionagi/service/connections/__init__.py +3 -0
- lionagi/service/connections/endpoint.py +0 -8
- lionagi/service/connections/providers/claude_code_cli.py +3 -2
- lionagi/service/connections/providers/oai_.py +29 -94
- lionagi/service/connections/providers/ollama_.py +3 -2
- lionagi/service/hooks/_types.py +1 -1
- lionagi/service/hooks/_utils.py +1 -1
- lionagi/service/hooks/hook_event.py +3 -8
- lionagi/service/hooks/hook_registry.py +5 -5
- lionagi/service/hooks/hooked_event.py +63 -3
- lionagi/service/imodel.py +24 -20
- lionagi/service/third_party/claude_code.py +3 -3
- lionagi/service/third_party/openai_models.py +435 -0
- lionagi/service/token_calculator.py +1 -94
- lionagi/session/branch.py +190 -400
- lionagi/session/session.py +8 -99
- lionagi/tools/file/reader.py +2 -2
- lionagi/version.py +1 -1
- {lionagi-0.17.11.dist-info → lionagi-0.18.1.dist-info}/METADATA +6 -6
- lionagi-0.18.1.dist-info/RECORD +164 -0
- lionagi/fields/__init__.py +0 -47
- lionagi/fields/action.py +0 -188
- lionagi/fields/base.py +0 -153
- lionagi/fields/code.py +0 -239
- lionagi/fields/file.py +0 -234
- lionagi/fields/instruct.py +0 -135
- lionagi/fields/reason.py +0 -55
- lionagi/fields/research.py +0 -52
- lionagi/operations/_act/act.py +0 -86
- lionagi/operations/brainstorm/__init__.py +0 -2
- lionagi/operations/brainstorm/brainstorm.py +0 -498
- lionagi/operations/brainstorm/prompt.py +0 -11
- lionagi/operations/instruct/__init__.py +0 -2
- lionagi/operations/instruct/instruct.py +0 -28
- lionagi/operations/plan/__init__.py +0 -6
- lionagi/operations/plan/plan.py +0 -386
- lionagi/operations/plan/prompt.py +0 -25
- lionagi/operations/utils.py +0 -45
- lionagi/protocols/forms/__init__.py +0 -2
- lionagi/protocols/forms/base.py +0 -85
- lionagi/protocols/forms/flow.py +0 -79
- lionagi/protocols/forms/form.py +0 -86
- lionagi/protocols/forms/report.py +0 -48
- lionagi/protocols/mail/__init__.py +0 -2
- lionagi/protocols/mail/exchange.py +0 -220
- lionagi/protocols/mail/mail.py +0 -51
- lionagi/protocols/mail/mailbox.py +0 -103
- lionagi/protocols/mail/manager.py +0 -218
- lionagi/protocols/mail/package.py +0 -101
- lionagi/protocols/messages/templates/README.md +0 -28
- lionagi/protocols/messages/templates/action_request.jinja2 +0 -5
- lionagi/protocols/messages/templates/action_response.jinja2 +0 -9
- lionagi/protocols/messages/templates/assistant_response.jinja2 +0 -6
- lionagi/protocols/messages/templates/instruction_message.jinja2 +0 -61
- lionagi/protocols/messages/templates/system_message.jinja2 +0 -11
- lionagi/protocols/messages/templates/tool_schemas.jinja2 +0 -7
- lionagi/protocols/operatives/__init__.py +0 -2
- lionagi/service/connections/providers/types.py +0 -28
- lionagi/service/third_party/openai_model_names.py +0 -198
- lionagi/service/types.py +0 -58
- lionagi-0.17.11.dist-info/RECORD +0 -199
- /lionagi/operations/{_act → act}/__init__.py +0 -0
- {lionagi-0.17.11.dist-info → lionagi-0.18.1.dist-info}/WHEEL +0 -0
- {lionagi-0.17.11.dist-info → lionagi-0.18.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,83 +1,10 @@
|
|
|
1
1
|
# Copyright (c) 2023-2025, HaiyangLi <quantocean.li at gmail dot com>
|
|
2
2
|
# SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
|
-
import base64
|
|
5
4
|
from collections.abc import Callable
|
|
6
|
-
from io import BytesIO
|
|
7
5
|
|
|
8
6
|
import tiktoken
|
|
9
7
|
|
|
10
|
-
GPT4O_IMAGE_PRICING = {
|
|
11
|
-
"base_cost": 85,
|
|
12
|
-
"low_detail": 0,
|
|
13
|
-
"max_dimension": 2048,
|
|
14
|
-
"min_side": 768,
|
|
15
|
-
"tile_size": 512,
|
|
16
|
-
"tile_cost": 170,
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
GPT4O_MINI_IMAGE_PRICING = {
|
|
20
|
-
"base_cost": 2833,
|
|
21
|
-
"low_detail": 0,
|
|
22
|
-
"max_dimension": 2048,
|
|
23
|
-
"min_side": 768,
|
|
24
|
-
"tile_size": 512,
|
|
25
|
-
"tile_cost": 5667,
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
O1_IMAGE_PRICING = {
|
|
29
|
-
"base_cost": 75,
|
|
30
|
-
"low_detail": 0,
|
|
31
|
-
"max_dimension": 2048,
|
|
32
|
-
"min_side": 768,
|
|
33
|
-
"tile_size": 512,
|
|
34
|
-
"tile_cost": 150,
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def calculate_image_token_usage_from_base64(
|
|
39
|
-
image_base64: str, detail, image_pricing
|
|
40
|
-
):
|
|
41
|
-
from PIL import Image
|
|
42
|
-
|
|
43
|
-
# Decode the base64 string to get image data
|
|
44
|
-
if "data:image/jpeg;base64," in image_base64:
|
|
45
|
-
image_base64 = image_base64.split("data:image/jpeg;base64,")[1]
|
|
46
|
-
image_base64.strip("{}")
|
|
47
|
-
|
|
48
|
-
image_data = base64.b64decode(image_base64)
|
|
49
|
-
image = Image.open(BytesIO(image_data))
|
|
50
|
-
|
|
51
|
-
# Get image dimensions
|
|
52
|
-
width, height = image.size
|
|
53
|
-
|
|
54
|
-
if detail == "low":
|
|
55
|
-
return image_pricing["base_cost"] + image_pricing["low_detail"]
|
|
56
|
-
|
|
57
|
-
# Scale to fit within a 2048 x 2048 tile
|
|
58
|
-
max_dimension = image_pricing["max_dimension"]
|
|
59
|
-
if width > max_dimension or height > max_dimension:
|
|
60
|
-
scale_factor = max_dimension / max(width, height)
|
|
61
|
-
width = int(width * scale_factor)
|
|
62
|
-
height = int(height * scale_factor)
|
|
63
|
-
|
|
64
|
-
# Scale such that the shortest side is 768px
|
|
65
|
-
min_side = image_pricing["min_side"]
|
|
66
|
-
if min(width, height) > min_side:
|
|
67
|
-
scale_factor = min_side / min(width, height)
|
|
68
|
-
width = int(width * scale_factor)
|
|
69
|
-
height = int(height * scale_factor)
|
|
70
|
-
|
|
71
|
-
# Calculate the number of 512px tiles
|
|
72
|
-
num_tiles = (width // image_pricing["tile_size"]) * (
|
|
73
|
-
height // image_pricing["tile_size"]
|
|
74
|
-
)
|
|
75
|
-
token_cost = (
|
|
76
|
-
image_pricing["base_cost"] + image_pricing["tile_cost"] * num_tiles
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
return token_cost
|
|
80
|
-
|
|
81
8
|
|
|
82
9
|
def get_encoding_name(value: str) -> str:
|
|
83
10
|
try:
|
|
@@ -91,17 +18,6 @@ def get_encoding_name(value: str) -> str:
|
|
|
91
18
|
return "o200k_base"
|
|
92
19
|
|
|
93
20
|
|
|
94
|
-
def get_image_pricing(model: str) -> dict:
|
|
95
|
-
if "gpt-4o-mini" in model:
|
|
96
|
-
return GPT4O_MINI_IMAGE_PRICING
|
|
97
|
-
elif "gpt-4o" in model:
|
|
98
|
-
return GPT4O_IMAGE_PRICING
|
|
99
|
-
elif "o1" in model and "mini" not in model:
|
|
100
|
-
return O1_IMAGE_PRICING
|
|
101
|
-
else:
|
|
102
|
-
raise ValueError("Invalid model name")
|
|
103
|
-
|
|
104
|
-
|
|
105
21
|
class TokenCalculator:
|
|
106
22
|
@staticmethod
|
|
107
23
|
def calculate_message_tokens(messages: list[dict], /, **kwargs) -> int:
|
|
@@ -177,16 +93,7 @@ class TokenCalculator:
|
|
|
177
93
|
if "text" in i_:
|
|
178
94
|
return TokenCalculator._calculate_chatitem(str(i_["text"]))
|
|
179
95
|
elif "image_url" in i_:
|
|
180
|
-
|
|
181
|
-
if "data:image/jpeg;base64," in a:
|
|
182
|
-
a = a.split("data:image/jpeg;base64,")[1].strip()
|
|
183
|
-
pricing = get_image_pricing(model_name)
|
|
184
|
-
return (
|
|
185
|
-
calculate_image_token_usage_from_base64(
|
|
186
|
-
a, i_.get("detail", "low"), pricing
|
|
187
|
-
)
|
|
188
|
-
+ 15 # buffer for image
|
|
189
|
-
)
|
|
96
|
+
return 500 # fixed cost for image URL
|
|
190
97
|
|
|
191
98
|
if isinstance(i_, list):
|
|
192
99
|
return sum(
|