lionagi 0.17.7__py3-none-any.whl → 0.17.9__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/_types.py CHANGED
@@ -1,3 +1,5 @@
1
+ """lionagi type definitions."""
2
+
1
3
  # Lazy loading for heavy type imports to improve startup performance
2
4
  _lazy_type_imports = {}
3
5
 
@@ -296,19 +296,22 @@ class ActionManager(Manager):
296
296
  if isinstance(server_config, dict) and "server" in server_config:
297
297
  server_name = server_config["server"]
298
298
 
299
+ if request_options:
300
+ for k in list(request_options.keys()):
301
+ if not k.startswith(f"{server_name}_"):
302
+ request_options[f"{server_name}_{k}"] = (
303
+ request_options.pop(k)
304
+ )
305
+
299
306
  if tool_names:
300
307
  # Register specific tools with qualified names
301
308
  for tool_name in tool_names:
302
309
  # Use qualified name to avoid collisions
303
- qualified_name = (
304
- f"{server_name}_{tool_name}" if server_name else tool_name
305
- )
306
-
307
310
  # Store original tool name in config for MCP calls
308
311
  config_with_metadata = dict(server_config)
309
312
  config_with_metadata["_original_tool_name"] = tool_name
310
313
 
311
- mcp_config = {qualified_name: config_with_metadata}
314
+ mcp_config = {tool_name: config_with_metadata}
312
315
 
313
316
  # Get request_options for this tool if provided
314
317
  tool_request_options = None
@@ -320,7 +323,7 @@ class ActionManager(Manager):
320
323
  mcp_config=mcp_config, request_options=tool_request_options
321
324
  )
322
325
  self.register_tool(tool, update=update)
323
- registered_tools.append(qualified_name)
326
+ registered_tools.append(tool_name)
324
327
  else:
325
328
  # Auto-discover tools from the server
326
329
  from lionagi.service.connections.mcp.wrapper import (
@@ -333,16 +336,12 @@ class ActionManager(Manager):
333
336
 
334
337
  # Register each discovered tool with qualified name
335
338
  for tool in tools:
336
- # Use qualified name to avoid collisions: server_toolname
337
- qualified_name = (
338
- f"{server_name}_{tool.name}" if server_name else tool.name
339
- )
340
339
 
341
340
  # Store original tool name in config for MCP calls
342
341
  config_with_metadata = dict(server_config)
343
342
  config_with_metadata["_original_tool_name"] = tool.name
344
343
 
345
- mcp_config = {qualified_name: config_with_metadata}
344
+ mcp_config = {tool.name: config_with_metadata}
346
345
 
347
346
  # Get request_options for this tool if provided
348
347
  tool_request_options = None
@@ -356,11 +355,9 @@ class ActionManager(Manager):
356
355
  request_options=tool_request_options,
357
356
  )
358
357
  self.register_tool(tool_obj, update=update)
359
- registered_tools.append(qualified_name)
358
+ registered_tools.append(tool.name)
360
359
  except Exception as e:
361
- print(
362
- f"Warning: Failed to register tool {qualified_name}: {e}"
363
- )
360
+ print(f"Warning: Failed to register tool {tool.name}: {e}")
364
361
 
365
362
  return registered_tools
366
363
 
@@ -79,7 +79,7 @@ class ClaudeCodeCLIEndpoint(Endpoint):
79
79
  def create_payload(self, request: dict | BaseModel, **kwargs):
80
80
  req_dict = {**self.config.kwargs, **to_dict(request), **kwargs}
81
81
  messages = req_dict.pop("messages")
82
- req_obj = ClaudeCodeRequest.create(messages=messages, **req_dict)
82
+ req_obj = ClaudeCodeRequest(messages=messages, **req_dict)
83
83
  return {"request": req_obj}, {}
84
84
 
85
85
  async def stream(
@@ -25,16 +25,16 @@ def get_handler(d_: dict, k: str | type, get: bool = False, /):
25
25
  if handler is not None:
26
26
  if not is_coro_func(handler):
27
27
 
28
- async def _func(x):
28
+ async def _func(*args, **kwargs):
29
29
  await sleep(0)
30
- return handler(x)
30
+ return handler(*args, **kwargs)
31
31
 
32
32
  return _func
33
33
  return handler
34
34
 
35
- async def _func(x):
35
+ async def _func(*args, **_kwargs):
36
36
  await sleep(0)
37
- return x
37
+ return args[0] if args else None
38
38
 
39
39
  return _func
40
40
 
@@ -3,16 +3,21 @@
3
3
 
4
4
  from __future__ import annotations
5
5
 
6
- from typing import Any
6
+ from typing import TYPE_CHECKING, Any
7
7
 
8
8
  import anyio
9
- from pydantic import Field, PrivateAttr
9
+ from pydantic import Field, PrivateAttr, field_validator
10
10
 
11
11
  from lionagi.ln.concurrency import fail_after, get_cancelled_exc_class
12
12
  from lionagi.protocols.types import Event, EventStatus
13
13
 
14
14
  from ._types import AssosiatedEventInfo, HookEventTypes
15
- from .hook_registry import HookRegistry
15
+
16
+ if TYPE_CHECKING:
17
+ from .hook_registry import HookRegistry
18
+ else:
19
+ # Import at runtime for Pydantic
20
+ from .hook_registry import HookRegistry
16
21
 
17
22
 
18
23
  class HookEvent(Event):
@@ -27,6 +32,12 @@ class HookEvent(Event):
27
32
 
28
33
  assosiated_event_info: AssosiatedEventInfo | None = None
29
34
 
35
+ @field_validator("exit", mode="before")
36
+ def _validate_exit(cls, v: Any) -> bool:
37
+ if v is None:
38
+ return False
39
+ return v
40
+
30
41
  async def invoke(self):
31
42
  start = anyio.current_time()
32
43
  self.execution.status = EventStatus.PROCESSING
@@ -61,7 +72,9 @@ class HookEvent(Event):
61
72
  self.execution.status = EventStatus.FAILED
62
73
  self.execution.response = None
63
74
  self.execution.error = str(e)
64
- self._should_exit = True
75
+ # Registry/wiring failures should obey the configured policy
76
+ self._exit_cause = e
77
+ self._should_exit = bool(self.exit)
65
78
 
66
79
  finally:
67
80
  self.execution.duration = anyio.current_time() - start
@@ -10,7 +10,7 @@ from lionagi.protocols.types import Event, EventStatus
10
10
  from lionagi.utils import UNDEFINED
11
11
 
12
12
  from ._types import HookDict, HookEventTypes, StreamHandlers
13
- from ._utils import validate_hooks, validate_stream_handlers
13
+ from ._utils import get_handler, validate_hooks, validate_stream_handlers
14
14
 
15
15
  E = TypeVar("E", bound=Event)
16
16
 
@@ -48,17 +48,17 @@ class HookRegistry:
48
48
  raise RuntimeError(
49
49
  "Either hook_type or chunk_type must be provided"
50
50
  )
51
- if ht_ and (h := self._hooks.get(ht_)):
52
- validate_hooks({ht_: h})
51
+ if ht_ and (self._hooks.get(ht_)):
52
+ validate_hooks({ht_: self._hooks[ht_]})
53
+ h = get_handler(self._hooks, ht_, True)
53
54
  return await h(ev_, **kw)
54
55
  elif not ct_:
55
56
  raise RuntimeError(
56
57
  "Hook type is required when chunk_type is not provided"
57
58
  )
58
59
  else:
59
- validate_stream_handlers(
60
- {ct_: (h := self._stream_handlers.get(ct_))}
61
- )
60
+ validate_stream_handlers({ct_: self._stream_handlers.get(ct_)})
61
+ h = get_handler(self._stream_handlers, ct_, True)
62
62
  return await h(ev_, ct_, ch_, **kw)
63
63
 
64
64
  async def _call_stream_handler(
@@ -69,8 +69,8 @@ class HookRegistry:
69
69
  /,
70
70
  **kw,
71
71
  ):
72
- handler = self._stream_handlers.get(ct_)
73
- validate_stream_handlers({ct_: handler})
72
+ validate_stream_handlers({ct_: self._stream_handlers.get(ct_)})
73
+ handler = get_handler(self._stream_handlers, ct_, True)
74
74
  return await handler(ev_, ct_, ch_, **kw)
75
75
 
76
76
  async def pre_event_create(
@@ -94,6 +94,7 @@ class HookRegistry:
94
94
  None,
95
95
  None,
96
96
  event_type,
97
+ exit=exit,
97
98
  **kw,
98
99
  )
99
100
  return (res, False, EventStatus.COMPLETED)
@@ -119,6 +120,7 @@ class HookRegistry:
119
120
  None,
120
121
  None,
121
122
  event,
123
+ exit=exit,
122
124
  **kw,
123
125
  )
124
126
  return (res, False, EventStatus.COMPLETED)
@@ -129,7 +131,7 @@ class HookRegistry:
129
131
 
130
132
  async def post_invocation(
131
133
  self, event: E, /, exit: bool = False, **kw
132
- ) -> tuple[None | Exception, bool, EventStatus, EventStatus]:
134
+ ) -> tuple[None | Exception, bool, EventStatus]:
133
135
  """Hook to be called right after event finished its execution.
134
136
  It can either raise an exception to abort the event invocation or pass to continue (status: aborted).
135
137
  It cannot modify the event itself, and won't be able to access the event instance.
@@ -140,6 +142,7 @@ class HookRegistry:
140
142
  None,
141
143
  None,
142
144
  event,
145
+ exit=exit,
143
146
  **kw,
144
147
  )
145
148
  return (res, False, EventStatus.COMPLETED)
@@ -163,6 +166,7 @@ class HookRegistry:
163
166
  chunk_type,
164
167
  chunk,
165
168
  None,
169
+ exit=exit,
166
170
  **kw,
167
171
  )
168
172
  return (res, False, None)
@@ -191,20 +195,35 @@ class HookRegistry:
191
195
  if hook_type is None and chunk_type is None:
192
196
  raise ValueError("Either method or chunk_type must be provided")
193
197
  if hook_type:
194
- meta = {}
195
- meta["event_type"] = event_like.class_name(full=True)
198
+ # Align with AssosiatedEventInfo
199
+ meta = {"lion_class": event_like.class_name(full=True)}
196
200
  match hook_type:
197
201
  case HookEventTypes.PreEventCreate:
198
- return await self.pre_event_create(event_like, **kw), meta
202
+ return (
203
+ await self.pre_event_create(
204
+ event_like, exit=exit, **kw
205
+ ),
206
+ meta,
207
+ )
199
208
  case HookEventTypes.PreInvocation:
200
209
  meta["event_id"] = str(event_like.id)
201
210
  meta["event_created_at"] = event_like.created_at
202
- return await self.pre_invocation(event_like, **kw), meta
211
+ return (
212
+ await self.pre_invocation(event_like, exit=exit, **kw),
213
+ meta,
214
+ )
203
215
  case HookEventTypes.PostInvocation:
204
216
  meta["event_id"] = str(event_like.id)
205
217
  meta["event_created_at"] = event_like.created_at
206
- return await self.post_invocation(**kw), meta
207
- return await self.handle_streaming_chunk(chunk_type, chunk, exit, **kw)
218
+ return (
219
+ await self.post_invocation(
220
+ event_like, exit=exit, **kw
221
+ ),
222
+ meta,
223
+ )
224
+ return await self.handle_streaming_chunk(
225
+ chunk_type, chunk, exit=exit, **kw
226
+ )
208
227
 
209
228
  def _can_handle(
210
229
  self,
@@ -26,7 +26,6 @@ from lionagi import ln
26
26
  from lionagi.libs.schema.as_readable import as_readable
27
27
  from lionagi.utils import is_coro_func, is_import_installed
28
28
 
29
- HAS_CLAUDE_CODE_SDK = is_import_installed("claude_code_sdk")
30
29
  HAS_CLAUDE_CODE_CLI = False
31
30
  CLAUDE_CLI = None
32
31
 
@@ -68,7 +67,6 @@ __all__ = (
68
67
  "ClaudeChunk",
69
68
  "ClaudeSession",
70
69
  "stream_claude_code_cli",
71
- "stream_cc_sdk_events",
72
70
  )
73
71
 
74
72
 
@@ -117,6 +115,59 @@ class ClaudeCodeRequest(BaseModel):
117
115
  return "bypassPermissions"
118
116
  return v
119
117
 
118
+ @model_validator(mode="before")
119
+ def _validate_message_prompt(cls, data):
120
+ if "prompt" in data and data["prompt"]:
121
+ return data
122
+
123
+ if not (msg := data.get("messages")):
124
+ raise ValueError("messages may not be empty")
125
+ resume = data.get("resume")
126
+ continue_conversation = data.get("continue_conversation")
127
+
128
+ prompt = ""
129
+
130
+ # 1. if resume or continue_conversation, use the last message
131
+ if resume or continue_conversation:
132
+ continue_conversation = True
133
+ prompt = msg[-1]["content"]
134
+ if isinstance(prompt, (dict, list)):
135
+ prompt = ln.json_dumps(prompt)
136
+
137
+ # 2. else, use entire messages except system message
138
+ else:
139
+ prompts = []
140
+ continue_conversation = False
141
+ for message in msg:
142
+ if message["role"] != "system":
143
+ content = message["content"]
144
+ prompts.append(
145
+ ln.json_dumps(content)
146
+ if isinstance(content, (dict, list))
147
+ else content
148
+ )
149
+
150
+ prompt = "\n".join(prompts)
151
+
152
+ # 3. assemble the request data
153
+ data_: dict[str, Any] = dict(
154
+ prompt=prompt,
155
+ resume=resume,
156
+ continue_conversation=bool(continue_conversation),
157
+ )
158
+
159
+ # 4. extract system prompt if available
160
+ if (msg[0]["role"] == "system") and (resume or continue_conversation):
161
+ data_["system_prompt"] = msg[0]["content"]
162
+
163
+ if "append_system_prompt" in data and data["append_system_prompt"]:
164
+ data_["append_system_prompt"] = str(
165
+ data.get("append_system_prompt")
166
+ )
167
+
168
+ data_.update(data)
169
+ return data_
170
+
120
171
  # Workspace path derived from repo + ws
121
172
  def cwd(self) -> Path:
122
173
  if not self.ws:
@@ -209,73 +260,6 @@ class ClaudeCodeRequest(BaseModel):
209
260
  args += ["--model", self.model or "sonnet", "--verbose"]
210
261
  return args
211
262
 
212
- # ------------------------ SDK helpers -----------------------------------
213
- def as_claude_options(self):
214
- from claude_code_sdk import ClaudeCodeOptions
215
-
216
- data = {
217
- k: v
218
- for k, v in self.model_dump(exclude_none=True).items()
219
- if k in CLAUDE_CODE_OPTION_PARAMS
220
- }
221
- return ClaudeCodeOptions(**data)
222
-
223
- # ------------------------ convenience constructor -----------------------
224
- @classmethod
225
- def create(
226
- cls,
227
- messages: list[dict[str, Any]],
228
- resume: str | None = None,
229
- continue_conversation: bool | None = None,
230
- **kwargs,
231
- ):
232
- if not messages:
233
- raise ValueError("messages may not be empty")
234
-
235
- prompt = ""
236
-
237
- # 1. if resume or continue_conversation, use the last message
238
- if resume or continue_conversation:
239
- continue_conversation = True
240
- prompt = messages[-1]["content"]
241
- if isinstance(prompt, (dict, list)):
242
- prompt = ln.json_dumps(prompt)
243
-
244
- # 2. else, use entire messages except system message
245
- else:
246
- prompts = []
247
- continue_conversation = False
248
- for message in messages:
249
- if message["role"] != "system":
250
- content = message["content"]
251
- prompts.append(
252
- ln.json_dumps(content)
253
- if isinstance(content, (dict, list))
254
- else content
255
- )
256
-
257
- prompt = "\n".join(prompts)
258
-
259
- # 3. assemble the request data
260
- data: dict[str, Any] = dict(
261
- prompt=prompt,
262
- resume=resume,
263
- continue_conversation=bool(continue_conversation),
264
- )
265
-
266
- # 4. extract system prompt if available
267
- if (messages[0]["role"] == "system") and (
268
- resume or continue_conversation
269
- ):
270
- data["system_prompt"] = messages[0]["content"]
271
- if kwargs.get("append_system_prompt"):
272
- data["append_system_prompt"] = str(
273
- kwargs.get("append_system_prompt")
274
- )
275
-
276
- data.update(kwargs)
277
- return cls.model_validate(data, strict=False)
278
-
279
263
 
280
264
  @dataclass
281
265
  class ClaudeChunk:
@@ -499,23 +483,6 @@ async def _ndjson_from_cli(request: ClaudeCodeRequest):
499
483
  await proc.wait()
500
484
 
501
485
 
502
- def _stream_claude_code(request: ClaudeCodeRequest):
503
- from claude_code_sdk import query as sdk_query
504
-
505
- return sdk_query(
506
- prompt=request.prompt, options=request.as_claude_options()
507
- )
508
-
509
-
510
- def stream_cc_sdk_events(request: ClaudeCodeRequest):
511
- if not HAS_CLAUDE_CODE_SDK:
512
- raise RuntimeError(
513
- "claude_code_sdk not installed (uv pip install lionagi[claude_code])"
514
- )
515
-
516
- return _stream_claude_code(request)
517
-
518
-
519
486
  # --------------------------------------------------------------------------- SSE route
520
487
  async def stream_cc_cli_events(request: ClaudeCodeRequest):
521
488
  if not CLAUDE_CLI:
lionagi/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.17.7"
1
+ __version__ = "0.17.9"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lionagi
3
- Version: 0.17.7
3
+ Version: 0.17.9
4
4
  Summary: An Intelligence Operating System.
5
5
  Author-email: HaiyangLi <quantocean.li@gmail.com>
6
6
  License: Apache License
@@ -1,11 +1,11 @@
1
1
  lionagi/__init__.py,sha256=iS8Y4ZSsP2EPwEsqeodelqdoL1BdiK1bCAYJHak1AUM,2474
2
2
  lionagi/_class_registry.py,sha256=pfUO1DjFZIqr3OwnNMkFqL_fiEBrrf8-swkGmP_KDLE,3112
3
3
  lionagi/_errors.py,sha256=ia_VWhPSyr5FIJLSdPpl04SrNOLI2skN40VC8ePmzeQ,3748
4
- lionagi/_types.py,sha256=COWRrmstmABGKKn-h_cKiAREGsMp_Ik49OdR4lSS3P8,1263
4
+ lionagi/_types.py,sha256=nGtsaSee7FaIZvym3PH8NPaN5PN8QscTgcZfpMNaMEo,1296
5
5
  lionagi/config.py,sha256=yGnzj5D14B2TBhqVeyp1uccvAK6mk4hm0QA8dAEJUeQ,4776
6
6
  lionagi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  lionagi/utils.py,sha256=yRHKN_v9xRnUa-nYg1lTpCCK2wNDg4pCpicUEIyFwKg,7084
8
- lionagi/version.py,sha256=_9A_jQb7KUl9K8At8l-nfzMi9odK4IQSyRft9V3xoYs,23
8
+ lionagi/version.py,sha256=MY-kSx5QDTHjTQLJRkNa1ih3bsMMiGFMr264PPlSZRY,23
9
9
  lionagi/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  lionagi/adapters/_utils.py,sha256=sniMG1LDDkwJNzUF2K32jv7rA6Y1QcohgyNclYsptzI,453
11
11
  lionagi/adapters/async_postgres_adapter.py,sha256=2XlxYNPow78dFHIQs8W1oJ2zkVD5Udn3aynMBF9Nf3k,3498
@@ -103,7 +103,7 @@ lionagi/protocols/ids.py,sha256=RM40pP_4waMJcfCGmEK_PfS8-k_DuDbC1fG-2Peuf6s,2472
103
103
  lionagi/protocols/types.py,sha256=6GJ5ZgDyWl8tckNLXB0z8jbtkordWpgm5r4ht31KVRc,2431
104
104
  lionagi/protocols/action/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
105
105
  lionagi/protocols/action/function_calling.py,sha256=jFy6Ruh3QWkERtBHXqPWVwrOH5aDitEo8oJHZgW5xnI,5066
106
- lionagi/protocols/action/manager.py,sha256=akq3HuLUuTRkm7ENmn8oycNH-4ksfekXOwOJky5OBrE,18835
106
+ lionagi/protocols/action/manager.py,sha256=5RgXj7dbQn0DThrwq4qgZxM9HKAsdA_gIIdKdokAMGE,18692
107
107
  lionagi/protocols/action/tool.py,sha256=_o7rLokD3poupqst6YoQqEC6RvePDueySoVrGK2S538,5850
108
108
  lionagi/protocols/forms/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
109
109
  lionagi/protocols/forms/base.py,sha256=1J8UU2LXm1Lax5McJos0xjZTzMVLYQWd_hwtxI2wSuM,2838
@@ -164,7 +164,7 @@ lionagi/service/connections/mcp/__init__.py,sha256=3lzOakDoBWmMaNnT2g-YwktPKa_Wm
164
164
  lionagi/service/connections/mcp/wrapper.py,sha256=M7k-XH7x1__SZ0pq7ddnM0_G0t5ZZD3c8O_AbldkSjA,9158
165
165
  lionagi/service/connections/providers/__init__.py,sha256=3lzOakDoBWmMaNnT2g-YwktPKa_Wme4lnPRSmOQfayY,105
166
166
  lionagi/service/connections/providers/anthropic_.py,sha256=vok8mIyFiuV3K83tOjdYfruA6cv1h_57ML6RtpuW-bU,3157
167
- lionagi/service/connections/providers/claude_code_cli.py,sha256=kqEOnCUOOh2O_3NGi6W7r-gdLsbW-Jcp11tm30VEv4Q,4455
167
+ lionagi/service/connections/providers/claude_code_cli.py,sha256=XWIF96Ypb3ExfD-wbEggaX0phxu5O_X1OXAdImNyz2g,4448
168
168
  lionagi/service/connections/providers/exa_.py,sha256=kuWD7yyYRqIa4ChSn0TsxFA5V5LwvFUD-w8TZ6mx4rk,1048
169
169
  lionagi/service/connections/providers/nvidia_nim_.py,sha256=95vmo0DSONYBVHkR9SGJ5BiHNKFZNZBrjw4_7ShOXQA,3154
170
170
  lionagi/service/connections/providers/oai_.py,sha256=3x5d6Ei1hKu8Mix0N2V2K21O9dd-2jtAELHhHXj5iHk,6071
@@ -173,14 +173,14 @@ lionagi/service/connections/providers/perplexity_.py,sha256=1GMmxAXsKGsB-xlqxO6h
173
173
  lionagi/service/connections/providers/types.py,sha256=omKWbmJYu_ozK_qJLcxQezVcauXTqhp4ClOWAyENEFU,807
174
174
  lionagi/service/hooks/__init__.py,sha256=WCfzc-Aco5PkKufDMvSYxbrLqlEvmOsaZELlWKAuG2w,464
175
175
  lionagi/service/hooks/_types.py,sha256=e1vmA24arGKweS45jEXK6pw8Ysk2NOvlBc6m1ABsKws,1255
176
- lionagi/service/hooks/_utils.py,sha256=51dqdRrln2aJCkCz8g4L6Ik_v9atdFHPzjm9ASu6OvA,2560
177
- lionagi/service/hooks/hook_event.py,sha256=NH3PdoWwAt96GQQi99TjqAu-zU-zTgWz6pDdIaKureE,2418
178
- lionagi/service/hooks/hook_registry.py,sha256=S6wYKKSHTUKRDN2P1opHKisdaYOXnttVIWYoMIlB_6c,7870
176
+ lionagi/service/hooks/_utils.py,sha256=VVPWL7HE61xc4UPYF0DIuMeFhVb3gSzPNJTNZK7ssqA,2627
177
+ lionagi/service/hooks/hook_event.py,sha256=cJCnE3dQnOvjPj9wptBvPGGJx2LQqtXgwPMU8JLQSkM,2831
178
+ lionagi/service/hooks/hook_registry.py,sha256=V25UwTVoOixL1CKfRAyR0__fggCvF5pBK5fF4PzcZd8,8527
179
179
  lionagi/service/hooks/hooked_event.py,sha256=D_1HtWCH3CriNlmsksi5lerXuF_LV2lbktcEdhZqXw0,4339
180
180
  lionagi/service/third_party/README.md,sha256=qFjWnI8rmLivIyr6Tc-hRZh-rQwntROp76af4MBNJJc,2214
181
181
  lionagi/service/third_party/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
182
182
  lionagi/service/third_party/anthropic_models.py,sha256=oqSPSlcayYG-fS5BLiLeTtkrpaxgkPhEK_YgneumrOo,4004
183
- lionagi/service/third_party/claude_code.py,sha256=wRqNBSy4kc-pHkuntNJnstyqOVdSKK9NV1s2x3Ia704,24794
183
+ lionagi/service/third_party/claude_code.py,sha256=C3EKtEEqN3zto42pJhd7hhqJQt1gtShSDDeTzphUUss,23844
184
184
  lionagi/service/third_party/exa_models.py,sha256=G_hnekcy-DillPLzMoDQ8ZisVAL8Mp7iMAK4xqAT_3w,5470
185
185
  lionagi/service/third_party/openai_model_names.py,sha256=C44tnqexgc4ZU2-3I_sn5d688hf3WWx-25xBd50bvas,5121
186
186
  lionagi/service/third_party/pplx_models.py,sha256=-EhyJgOWR6rzSv3zczUtk80X6c19p18Dg9KC6l8BFRQ,6473
@@ -193,7 +193,7 @@ lionagi/tools/base.py,sha256=hEGnE4MD0CM4UqnF0xsDRKB0aM-pyrTFHl8utHhyJLU,1897
193
193
  lionagi/tools/types.py,sha256=XtJLY0m-Yi_ZLWhm0KycayvqMCZd--HxfQ0x9vFUYDE,230
194
194
  lionagi/tools/file/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
195
195
  lionagi/tools/file/reader.py,sha256=Q9x1UP7YmBqN53e1kUN68OmIs-D1m9EM9VVbWfM35js,9658
196
- lionagi-0.17.7.dist-info/METADATA,sha256=RVhAS_0eXRZlzmyY3smI143cFOMZLge0KuLP-QsT-z0,23448
197
- lionagi-0.17.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
198
- lionagi-0.17.7.dist-info/licenses/LICENSE,sha256=VXFWsdoN5AAknBCgFqQNgPWYx7OPp-PFEP961zGdOjc,11288
199
- lionagi-0.17.7.dist-info/RECORD,,
196
+ lionagi-0.17.9.dist-info/METADATA,sha256=0v_5cWnPYJKWZwBEceY9UNdFncXb3Bfs1gg60CF8gjE,23448
197
+ lionagi-0.17.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
198
+ lionagi-0.17.9.dist-info/licenses/LICENSE,sha256=VXFWsdoN5AAknBCgFqQNgPWYx7OPp-PFEP961zGdOjc,11288
199
+ lionagi-0.17.9.dist-info/RECORD,,