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.
Files changed (109) hide show
  1. lionagi/_errors.py +0 -5
  2. lionagi/fields.py +83 -0
  3. lionagi/libs/schema/minimal_yaml.py +98 -0
  4. lionagi/ln/__init__.py +3 -1
  5. lionagi/ln/concurrency/primitives.py +4 -4
  6. lionagi/ln/concurrency/task.py +1 -0
  7. lionagi/ln/types.py +32 -5
  8. lionagi/models/field_model.py +21 -4
  9. lionagi/models/hashable_model.py +2 -3
  10. lionagi/operations/ReAct/ReAct.py +475 -238
  11. lionagi/operations/ReAct/utils.py +3 -0
  12. lionagi/operations/act/act.py +206 -0
  13. lionagi/operations/builder.py +5 -7
  14. lionagi/operations/chat/chat.py +130 -114
  15. lionagi/operations/communicate/communicate.py +101 -42
  16. lionagi/operations/fields.py +380 -0
  17. lionagi/operations/flow.py +8 -10
  18. lionagi/operations/interpret/interpret.py +65 -20
  19. lionagi/operations/node.py +4 -4
  20. lionagi/operations/operate/operate.py +216 -108
  21. lionagi/{protocols/operatives → operations/operate}/operative.py +4 -5
  22. lionagi/{protocols/operatives → operations/operate}/step.py +34 -39
  23. lionagi/operations/parse/parse.py +170 -142
  24. lionagi/operations/select/select.py +79 -18
  25. lionagi/operations/select/utils.py +8 -2
  26. lionagi/operations/types.py +119 -23
  27. lionagi/protocols/action/manager.py +5 -6
  28. lionagi/protocols/contracts.py +2 -2
  29. lionagi/protocols/generic/__init__.py +22 -0
  30. lionagi/protocols/generic/element.py +36 -127
  31. lionagi/protocols/generic/log.py +3 -2
  32. lionagi/protocols/generic/pile.py +9 -10
  33. lionagi/protocols/generic/progression.py +23 -22
  34. lionagi/protocols/graph/edge.py +6 -5
  35. lionagi/protocols/ids.py +6 -49
  36. lionagi/protocols/messages/__init__.py +29 -0
  37. lionagi/protocols/messages/action_request.py +86 -184
  38. lionagi/protocols/messages/action_response.py +73 -131
  39. lionagi/protocols/messages/assistant_response.py +130 -159
  40. lionagi/protocols/messages/base.py +31 -22
  41. lionagi/protocols/messages/instruction.py +280 -625
  42. lionagi/protocols/messages/manager.py +112 -62
  43. lionagi/protocols/messages/message.py +87 -197
  44. lionagi/protocols/messages/system.py +52 -123
  45. lionagi/protocols/types.py +1 -13
  46. lionagi/service/connections/__init__.py +3 -0
  47. lionagi/service/connections/endpoint.py +0 -8
  48. lionagi/service/connections/providers/claude_code_cli.py +3 -2
  49. lionagi/service/connections/providers/oai_.py +29 -94
  50. lionagi/service/connections/providers/ollama_.py +3 -2
  51. lionagi/service/hooks/_types.py +1 -1
  52. lionagi/service/hooks/_utils.py +1 -1
  53. lionagi/service/hooks/hook_event.py +3 -8
  54. lionagi/service/hooks/hook_registry.py +5 -5
  55. lionagi/service/hooks/hooked_event.py +63 -3
  56. lionagi/service/imodel.py +24 -20
  57. lionagi/service/third_party/claude_code.py +3 -3
  58. lionagi/service/third_party/openai_models.py +435 -0
  59. lionagi/service/token_calculator.py +1 -94
  60. lionagi/session/branch.py +190 -400
  61. lionagi/session/session.py +8 -99
  62. lionagi/tools/file/reader.py +2 -2
  63. lionagi/version.py +1 -1
  64. {lionagi-0.17.11.dist-info → lionagi-0.18.1.dist-info}/METADATA +6 -6
  65. lionagi-0.18.1.dist-info/RECORD +164 -0
  66. lionagi/fields/__init__.py +0 -47
  67. lionagi/fields/action.py +0 -188
  68. lionagi/fields/base.py +0 -153
  69. lionagi/fields/code.py +0 -239
  70. lionagi/fields/file.py +0 -234
  71. lionagi/fields/instruct.py +0 -135
  72. lionagi/fields/reason.py +0 -55
  73. lionagi/fields/research.py +0 -52
  74. lionagi/operations/_act/act.py +0 -86
  75. lionagi/operations/brainstorm/__init__.py +0 -2
  76. lionagi/operations/brainstorm/brainstorm.py +0 -498
  77. lionagi/operations/brainstorm/prompt.py +0 -11
  78. lionagi/operations/instruct/__init__.py +0 -2
  79. lionagi/operations/instruct/instruct.py +0 -28
  80. lionagi/operations/plan/__init__.py +0 -6
  81. lionagi/operations/plan/plan.py +0 -386
  82. lionagi/operations/plan/prompt.py +0 -25
  83. lionagi/operations/utils.py +0 -45
  84. lionagi/protocols/forms/__init__.py +0 -2
  85. lionagi/protocols/forms/base.py +0 -85
  86. lionagi/protocols/forms/flow.py +0 -79
  87. lionagi/protocols/forms/form.py +0 -86
  88. lionagi/protocols/forms/report.py +0 -48
  89. lionagi/protocols/mail/__init__.py +0 -2
  90. lionagi/protocols/mail/exchange.py +0 -220
  91. lionagi/protocols/mail/mail.py +0 -51
  92. lionagi/protocols/mail/mailbox.py +0 -103
  93. lionagi/protocols/mail/manager.py +0 -218
  94. lionagi/protocols/mail/package.py +0 -101
  95. lionagi/protocols/messages/templates/README.md +0 -28
  96. lionagi/protocols/messages/templates/action_request.jinja2 +0 -5
  97. lionagi/protocols/messages/templates/action_response.jinja2 +0 -9
  98. lionagi/protocols/messages/templates/assistant_response.jinja2 +0 -6
  99. lionagi/protocols/messages/templates/instruction_message.jinja2 +0 -61
  100. lionagi/protocols/messages/templates/system_message.jinja2 +0 -11
  101. lionagi/protocols/messages/templates/tool_schemas.jinja2 +0 -7
  102. lionagi/protocols/operatives/__init__.py +0 -2
  103. lionagi/service/connections/providers/types.py +0 -28
  104. lionagi/service/third_party/openai_model_names.py +0 -198
  105. lionagi/service/types.py +0 -58
  106. lionagi-0.17.11.dist-info/RECORD +0 -199
  107. /lionagi/operations/{_act → act}/__init__.py +0 -0
  108. {lionagi-0.17.11.dist-info → lionagi-0.18.1.dist-info}/WHEEL +0 -0
  109. {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
- a: str = i_["image_url"].get("url", "")
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(