lite-agent 0.10.0__py3-none-any.whl → 0.12.0__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.
Potentially problematic release.
This version of lite-agent might be problematic. Click here for more details.
- lite_agent/agent.py +15 -0
- lite_agent/client.py +50 -24
- lite_agent/context.py +37 -0
- lite_agent/runner.py +30 -3
- lite_agent/utils/advanced_message_builder.py +49 -16
- {lite_agent-0.10.0.dist-info → lite_agent-0.12.0.dist-info}/METADATA +2 -1
- {lite_agent-0.10.0.dist-info → lite_agent-0.12.0.dist-info}/RECORD +8 -7
- {lite_agent-0.10.0.dist-info → lite_agent-0.12.0.dist-info}/WHEEL +0 -0
lite_agent/agent.py
CHANGED
|
@@ -41,6 +41,7 @@ class Agent:
|
|
|
41
41
|
message_transfer: Callable[[RunnerMessages], RunnerMessages] | None = None,
|
|
42
42
|
completion_condition: str = "stop",
|
|
43
43
|
stop_before_tools: list[str] | list[Callable] | None = None,
|
|
44
|
+
termination_tools: list[str] | list[Callable] | None = None,
|
|
44
45
|
) -> None:
|
|
45
46
|
self.name = name
|
|
46
47
|
self.instructions = instructions
|
|
@@ -58,6 +59,20 @@ class Agent:
|
|
|
58
59
|
else:
|
|
59
60
|
self.stop_before_functions = set()
|
|
60
61
|
|
|
62
|
+
# Convert termination_tools to function names
|
|
63
|
+
if termination_tools:
|
|
64
|
+
self.termination_tools = set()
|
|
65
|
+
for func in termination_tools:
|
|
66
|
+
if isinstance(func, str):
|
|
67
|
+
self.termination_tools.add(func)
|
|
68
|
+
elif callable(func):
|
|
69
|
+
self.termination_tools.add(func.__name__)
|
|
70
|
+
else:
|
|
71
|
+
msg = f"termination_tools must contain strings or callables, got {type(func)}"
|
|
72
|
+
raise TypeError(msg)
|
|
73
|
+
else:
|
|
74
|
+
self.termination_tools = set()
|
|
75
|
+
|
|
61
76
|
if isinstance(model, BaseLLMClient):
|
|
62
77
|
# If model is a BaseLLMClient instance, use it directly
|
|
63
78
|
self.client = model
|
lite_agent/client.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import abc
|
|
2
2
|
import os
|
|
3
|
-
from typing import Any, Literal
|
|
3
|
+
from typing import Any, Literal, NotRequired, TypedDict
|
|
4
4
|
|
|
5
5
|
import litellm
|
|
6
6
|
from openai.types.chat import ChatCompletionToolParam
|
|
@@ -8,12 +8,28 @@ from openai.types.responses import FunctionToolParam
|
|
|
8
8
|
from pydantic import BaseModel
|
|
9
9
|
|
|
10
10
|
ReasoningEffort = Literal["minimal", "low", "medium", "high"]
|
|
11
|
-
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ThinkingConfigDict(TypedDict):
|
|
14
|
+
"""Thinking configuration for reasoning models like Claude."""
|
|
15
|
+
|
|
16
|
+
type: Literal["enabled"] # 启用推理
|
|
17
|
+
budget_tokens: NotRequired[int] # 推理令牌预算,可选
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ReasoningEffortDict(TypedDict):
|
|
21
|
+
"""Reasoning effort configuration."""
|
|
22
|
+
|
|
23
|
+
effort: ReasoningEffort
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
ThinkingConfig = ThinkingConfigDict | None
|
|
12
27
|
|
|
13
28
|
# 统一的推理配置类型
|
|
14
29
|
ReasoningConfig = (
|
|
15
|
-
|
|
16
|
-
|
|
|
30
|
+
ReasoningEffort # "minimal", "low", "medium", "high"
|
|
31
|
+
| ReasoningEffortDict # {"effort": "minimal"}
|
|
32
|
+
| ThinkingConfigDict # {"type": "enabled", "budget_tokens": 2048}
|
|
17
33
|
| bool # True/False 简单开关
|
|
18
34
|
| None # 不启用推理
|
|
19
35
|
)
|
|
@@ -36,8 +52,9 @@ def parse_reasoning_config(reasoning: ReasoningConfig) -> tuple[ReasoningEffort
|
|
|
36
52
|
|
|
37
53
|
Args:
|
|
38
54
|
reasoning: 统一的推理配置
|
|
39
|
-
-
|
|
40
|
-
-
|
|
55
|
+
- ReasoningEffort: "minimal", "low", "medium", "high" -> reasoning_effort
|
|
56
|
+
- ReasoningEffortDict: {"effort": "minimal"} -> reasoning_effort
|
|
57
|
+
- ThinkingConfigDict: {"type": "enabled", "budget_tokens": 2048} -> thinking_config
|
|
41
58
|
- bool: True -> "medium", False -> None
|
|
42
59
|
- None: 不启用推理
|
|
43
60
|
|
|
@@ -47,28 +64,38 @@ def parse_reasoning_config(reasoning: ReasoningConfig) -> tuple[ReasoningEffort
|
|
|
47
64
|
if reasoning is None:
|
|
48
65
|
return None, None
|
|
49
66
|
|
|
50
|
-
if isinstance(reasoning, str):
|
|
51
|
-
#
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
return reasoning, None # type: ignore[return-value]
|
|
55
|
-
elif isinstance(reasoning, dict):
|
|
56
|
-
# 检查是否为 {"effort": "value"} 格式
|
|
57
|
-
if "effort" in reasoning and len(reasoning) == 1:
|
|
58
|
-
effort = reasoning["effort"]
|
|
59
|
-
if isinstance(effort, str) and effort in ("minimal", "low", "medium", "high"):
|
|
60
|
-
return effort, None # type: ignore[return-value]
|
|
61
|
-
else:
|
|
62
|
-
# 其他字典格式,作为 thinking_config
|
|
63
|
-
return None, reasoning
|
|
64
|
-
elif isinstance(reasoning, bool):
|
|
65
|
-
# 布尔类型,True 使用默认的 medium,False 不启用
|
|
67
|
+
if isinstance(reasoning, str) and reasoning in ("minimal", "low", "medium", "high"):
|
|
68
|
+
return reasoning, None # type: ignore[return-value]
|
|
69
|
+
|
|
70
|
+
if isinstance(reasoning, bool):
|
|
66
71
|
return ("medium", None) if reasoning else (None, None)
|
|
67
72
|
|
|
73
|
+
if isinstance(reasoning, dict):
|
|
74
|
+
return _parse_dict_reasoning_config(reasoning)
|
|
75
|
+
|
|
68
76
|
# 其他类型或无效格式,默认不启用
|
|
69
77
|
return None, None
|
|
70
78
|
|
|
71
79
|
|
|
80
|
+
def _parse_dict_reasoning_config(reasoning: ReasoningEffortDict | ThinkingConfigDict | dict[str, Any]) -> tuple[ReasoningEffort | None, ThinkingConfig]:
|
|
81
|
+
"""解析字典格式的推理配置。"""
|
|
82
|
+
# 检查是否为 {"effort": "value"} 格式 (ReasoningEffortDict)
|
|
83
|
+
if "effort" in reasoning and len(reasoning) == 1:
|
|
84
|
+
effort = reasoning["effort"]
|
|
85
|
+
if isinstance(effort, str) and effort in ("minimal", "low", "medium", "high"):
|
|
86
|
+
return effort, None # type: ignore[return-value]
|
|
87
|
+
|
|
88
|
+
# 检查是否为 ThinkingConfigDict 格式
|
|
89
|
+
if "type" in reasoning and reasoning.get("type") == "enabled":
|
|
90
|
+
# 验证 ThinkingConfigDict 的结构
|
|
91
|
+
valid_keys = {"type", "budget_tokens"}
|
|
92
|
+
if all(key in valid_keys for key in reasoning):
|
|
93
|
+
return None, reasoning # type: ignore[return-value]
|
|
94
|
+
|
|
95
|
+
# 其他未知字典格式,仍尝试作为 thinking_config
|
|
96
|
+
return None, reasoning # type: ignore[return-value]
|
|
97
|
+
|
|
98
|
+
|
|
72
99
|
class BaseLLMClient(abc.ABC):
|
|
73
100
|
"""Base class for LLM clients."""
|
|
74
101
|
|
|
@@ -240,8 +267,7 @@ class LiteLLMClient(BaseLLMClient):
|
|
|
240
267
|
|
|
241
268
|
# Add reasoning parameters if specified
|
|
242
269
|
if final_reasoning_effort is not None:
|
|
243
|
-
response_params["
|
|
270
|
+
response_params["reasoning"] = {"effort": final_reasoning_effort}
|
|
244
271
|
if final_thinking_config is not None:
|
|
245
272
|
response_params["thinking"] = final_thinking_config
|
|
246
|
-
|
|
247
273
|
return await litellm.aresponses(**response_params) # type: ignore[return-value]
|
lite_agent/context.py
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""Context utilities for injecting history messages into tool calls."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, Generic, TypeVar
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel
|
|
8
|
+
|
|
9
|
+
T = TypeVar("T")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class HistoryContext(BaseModel, Generic[T]):
|
|
13
|
+
"""包含历史消息的上下文容器
|
|
14
|
+
|
|
15
|
+
这个类会自动被 Runner 用来包装用户的 context,确保工具函数能够访问历史消息。
|
|
16
|
+
|
|
17
|
+
Attributes:
|
|
18
|
+
history_messages: 工具调用前的所有历史消息
|
|
19
|
+
data: 用户自定义的上下文数据(可选)
|
|
20
|
+
|
|
21
|
+
Examples:
|
|
22
|
+
>>> # 只需要历史消息的工具
|
|
23
|
+
>>> async def count_messages(ctx: Context[HistoryContext[None]]) -> str:
|
|
24
|
+
... return f"总共 {len(ctx.value.history_messages)} 条消息"
|
|
25
|
+
|
|
26
|
+
>>> # 需要历史消息和用户数据的工具
|
|
27
|
+
>>> class UserData(BaseModel):
|
|
28
|
+
... user_id: str
|
|
29
|
+
>>>
|
|
30
|
+
>>> async def analyze_user(ctx: Context[HistoryContext[UserData]]) -> str:
|
|
31
|
+
... messages = ctx.value.history_messages
|
|
32
|
+
... user_id = ctx.value.data.user_id
|
|
33
|
+
... return f"用户 {user_id} 有 {len(messages)} 条消息"
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
history_messages: list[Any]
|
|
37
|
+
data: T | None = None
|
lite_agent/runner.py
CHANGED
|
@@ -5,8 +5,11 @@ from os import PathLike
|
|
|
5
5
|
from pathlib import Path
|
|
6
6
|
from typing import Any, Literal, cast
|
|
7
7
|
|
|
8
|
+
from funcall import Context
|
|
9
|
+
|
|
8
10
|
from lite_agent.agent import Agent
|
|
9
11
|
from lite_agent.constants import CompletionMode, StreamIncludes, ToolName
|
|
12
|
+
from lite_agent.context import HistoryContext
|
|
10
13
|
from lite_agent.loggers import logger
|
|
11
14
|
from lite_agent.types import (
|
|
12
15
|
AgentChunk,
|
|
@@ -181,6 +184,24 @@ class Runner:
|
|
|
181
184
|
)
|
|
182
185
|
return # Stop processing other tool calls after transfer
|
|
183
186
|
|
|
187
|
+
# Auto-inject history messages into context
|
|
188
|
+
if context is not None and not isinstance(context, Context):
|
|
189
|
+
# If user provided a plain object, wrap it in Context first
|
|
190
|
+
context = Context(context)
|
|
191
|
+
|
|
192
|
+
if isinstance(context, Context):
|
|
193
|
+
# Extract original value and wrap in HistoryContext
|
|
194
|
+
original_value = context.value
|
|
195
|
+
wrapped = HistoryContext(
|
|
196
|
+
history_messages=self.messages.copy(),
|
|
197
|
+
data=original_value,
|
|
198
|
+
)
|
|
199
|
+
context = Context(wrapped)
|
|
200
|
+
else:
|
|
201
|
+
# No context provided, create HistoryContext with only history messages
|
|
202
|
+
wrapped = HistoryContext(history_messages=self.messages.copy())
|
|
203
|
+
context = Context(wrapped)
|
|
204
|
+
|
|
184
205
|
async for tool_call_chunk in self.agent.handle_tool_calls(tool_calls, context=context):
|
|
185
206
|
# if tool_call_chunk.type == "function_call" and tool_call_chunk.type in includes:
|
|
186
207
|
# yield tool_call_chunk
|
|
@@ -270,12 +291,18 @@ class Runner:
|
|
|
270
291
|
|
|
271
292
|
def is_finish() -> bool:
|
|
272
293
|
if completion_condition == CompletionMode.CALL:
|
|
273
|
-
# Check if
|
|
294
|
+
# Check if any termination tool was called in the last assistant message
|
|
274
295
|
if self.messages and isinstance(self.messages[-1], NewAssistantMessage):
|
|
275
296
|
last_message = self.messages[-1]
|
|
276
297
|
for content_item in last_message.content:
|
|
277
|
-
if isinstance(content_item, AssistantToolCallResult)
|
|
278
|
-
|
|
298
|
+
if isinstance(content_item, AssistantToolCallResult):
|
|
299
|
+
tool_name = self._get_tool_call_name_by_id(content_item.call_id)
|
|
300
|
+
# Check custom termination tools first, then default wait_for_user
|
|
301
|
+
if hasattr(self.agent, "termination_tools") and self.agent.termination_tools:
|
|
302
|
+
if tool_name in self.agent.termination_tools:
|
|
303
|
+
return True
|
|
304
|
+
elif tool_name == ToolName.WAIT_FOR_USER:
|
|
305
|
+
return True
|
|
279
306
|
return False
|
|
280
307
|
return finish_reason == CompletionMode.STOP
|
|
281
308
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Advanced message builder with fluent interface for complex message construction."""
|
|
2
2
|
|
|
3
3
|
from datetime import datetime, timezone
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any, Literal
|
|
5
5
|
|
|
6
6
|
from lite_agent.loggers import logger
|
|
7
7
|
from lite_agent.types import (
|
|
@@ -71,7 +71,7 @@ class FluentMessageBuilder:
|
|
|
71
71
|
logger.debug(f"Added text content (length: {len(text)})")
|
|
72
72
|
return self
|
|
73
73
|
|
|
74
|
-
def add_image(self, image_url: str | None = None, file_id: str | None = None, detail:
|
|
74
|
+
def add_image(self, image_url: str | None = None, file_id: str | None = None, detail: Literal["auto", "low", "high"] = "auto") -> "FluentMessageBuilder":
|
|
75
75
|
"""Add image content to user message."""
|
|
76
76
|
if self._message_type != "user":
|
|
77
77
|
msg = "Images can only be added to user messages"
|
|
@@ -121,10 +121,9 @@ class FluentMessageBuilder:
|
|
|
121
121
|
msg = "Message type not set. Call user_message(), assistant_message(), or system_message() first."
|
|
122
122
|
raise ValueError(msg)
|
|
123
123
|
|
|
124
|
-
if
|
|
125
|
-
self._meta.usage
|
|
126
|
-
|
|
127
|
-
if self._meta.usage is not None:
|
|
124
|
+
if isinstance(self._meta, AssistantMessageMeta):
|
|
125
|
+
if self._meta.usage is None:
|
|
126
|
+
self._meta.usage = MessageUsage()
|
|
128
127
|
if input_tokens is not None:
|
|
129
128
|
self._meta.usage.input_tokens = input_tokens
|
|
130
129
|
if output_tokens is not None:
|
|
@@ -144,20 +143,30 @@ class FluentMessageBuilder:
|
|
|
144
143
|
msg = "Message type not set. Call user_message(), assistant_message(), or system_message() first."
|
|
145
144
|
raise ValueError(msg)
|
|
146
145
|
|
|
147
|
-
if
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
146
|
+
if isinstance(self._meta, AssistantMessageMeta):
|
|
147
|
+
if latency_ms is not None:
|
|
148
|
+
self._meta.latency_ms = latency_ms
|
|
149
|
+
if total_time_ms is not None:
|
|
150
|
+
self._meta.total_time_ms = total_time_ms
|
|
151
151
|
|
|
152
152
|
return self
|
|
153
153
|
|
|
154
154
|
def build(self) -> NewUserMessage | NewAssistantMessage | NewSystemMessage:
|
|
155
155
|
"""Build the final message."""
|
|
156
156
|
if self._message_type == "user":
|
|
157
|
+
if not isinstance(self._meta, MessageMeta):
|
|
158
|
+
msg = "Invalid meta type for user message"
|
|
159
|
+
raise TypeError(msg)
|
|
157
160
|
message = NewUserMessage(content=self._content_items, meta=self._meta)
|
|
158
161
|
elif self._message_type == "assistant":
|
|
162
|
+
if not isinstance(self._meta, AssistantMessageMeta):
|
|
163
|
+
msg = "Invalid meta type for assistant message"
|
|
164
|
+
raise TypeError(msg)
|
|
159
165
|
message = NewAssistantMessage(content=self._content_items, meta=self._meta)
|
|
160
166
|
elif self._message_type == "system":
|
|
167
|
+
if not isinstance(self._meta, MessageMeta):
|
|
168
|
+
msg = "Invalid meta type for system message"
|
|
169
|
+
raise TypeError(msg)
|
|
161
170
|
message = NewSystemMessage(content=self._content, meta=self._meta)
|
|
162
171
|
else:
|
|
163
172
|
msg = "Message type not set"
|
|
@@ -173,29 +182,53 @@ class MessageBuilderFactory:
|
|
|
173
182
|
@staticmethod
|
|
174
183
|
def create_simple_user_message(text: str) -> NewUserMessage:
|
|
175
184
|
"""Create a simple user text message."""
|
|
176
|
-
|
|
185
|
+
result = FluentMessageBuilder().user_message().add_text(text).build()
|
|
186
|
+
if not isinstance(result, NewUserMessage):
|
|
187
|
+
msg = "Expected NewUserMessage"
|
|
188
|
+
raise TypeError(msg)
|
|
189
|
+
return result
|
|
177
190
|
|
|
178
191
|
@staticmethod
|
|
179
192
|
def create_simple_assistant_message(text: str, model: str | None = None) -> NewAssistantMessage:
|
|
180
193
|
"""Create a simple assistant text message."""
|
|
181
|
-
|
|
194
|
+
result = FluentMessageBuilder().assistant_message(model).add_text(text).build()
|
|
195
|
+
if not isinstance(result, NewAssistantMessage):
|
|
196
|
+
msg = "Expected NewAssistantMessage"
|
|
197
|
+
raise TypeError(msg)
|
|
198
|
+
return result
|
|
182
199
|
|
|
183
200
|
@staticmethod
|
|
184
201
|
def create_system_message(text: str) -> NewSystemMessage:
|
|
185
202
|
"""Create a system message."""
|
|
186
|
-
|
|
203
|
+
result = FluentMessageBuilder().system_message().add_text(text).build()
|
|
204
|
+
if not isinstance(result, NewSystemMessage):
|
|
205
|
+
msg = "Expected NewSystemMessage"
|
|
206
|
+
raise TypeError(msg)
|
|
207
|
+
return result
|
|
187
208
|
|
|
188
209
|
@staticmethod
|
|
189
210
|
def create_user_message_with_image(text: str, image_url: str) -> NewUserMessage:
|
|
190
211
|
"""Create a user message with text and image."""
|
|
191
|
-
|
|
212
|
+
result = FluentMessageBuilder().user_message().add_text(text).add_image(image_url=image_url).build()
|
|
213
|
+
if not isinstance(result, NewUserMessage):
|
|
214
|
+
msg = "Expected NewUserMessage"
|
|
215
|
+
raise TypeError(msg)
|
|
216
|
+
return result
|
|
192
217
|
|
|
193
218
|
@staticmethod
|
|
194
219
|
def create_assistant_with_tool_call(text: str, call_id: str, tool_name: str, arguments: dict[str, Any], model: str | None = None) -> NewAssistantMessage:
|
|
195
220
|
"""Create an assistant message with text and a tool call."""
|
|
196
|
-
|
|
221
|
+
result = FluentMessageBuilder().assistant_message(model).add_text(text).add_tool_call(call_id, tool_name, arguments).build()
|
|
222
|
+
if not isinstance(result, NewAssistantMessage):
|
|
223
|
+
msg = "Expected NewAssistantMessage"
|
|
224
|
+
raise TypeError(msg)
|
|
225
|
+
return result
|
|
197
226
|
|
|
198
227
|
@staticmethod
|
|
199
228
|
def create_assistant_with_tool_result(call_id: str, result: str, execution_time_ms: int | None = None, model: str | None = None) -> NewAssistantMessage:
|
|
200
229
|
"""Create an assistant message with just a tool result."""
|
|
201
|
-
|
|
230
|
+
build_result = FluentMessageBuilder().assistant_message(model).add_tool_result(call_id, result, execution_time_ms).build()
|
|
231
|
+
if not isinstance(build_result, NewAssistantMessage):
|
|
232
|
+
msg = "Expected NewAssistantMessage"
|
|
233
|
+
raise TypeError(msg)
|
|
234
|
+
return build_result
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lite-agent
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.12.0
|
|
4
4
|
Summary: A lightweight, extensible framework for building AI agent.
|
|
5
5
|
Author-email: Jianqi Pan <jannchie@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -13,6 +13,7 @@ Classifier: Programming Language :: Python :: 3
|
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.10
|
|
14
14
|
Classifier: Programming Language :: Python :: 3.11
|
|
15
15
|
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
16
17
|
Classifier: Topic :: Communications :: Chat
|
|
17
18
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
18
19
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
lite_agent/__init__.py,sha256=Swuefee0etSiaDnn30K2hBNV9UI3hIValW3A-pRE7e0,338
|
|
2
|
-
lite_agent/agent.py,sha256=
|
|
2
|
+
lite_agent/agent.py,sha256=gMn-NeQxl0298uKmlJph_c9WP3QN8WeKMEEDuv5RdVw,18681
|
|
3
3
|
lite_agent/chat_display.py,sha256=6gPgutMj7hCUOH6QBcC2f4Bhc93Gdq4vBa_1y6QKt2g,40793
|
|
4
|
-
lite_agent/client.py,sha256
|
|
4
|
+
lite_agent/client.py,sha256=-9BXLhAp3bGJsdKJ02lLpPJeHQKyHKQwhebZ6WCYh_k,9988
|
|
5
5
|
lite_agent/constants.py,sha256=_xIDdQwaJrWk8N_62o-KYEo3jj1waPJ0ZOd3hHybKNo,718
|
|
6
|
+
lite_agent/context.py,sha256=qnqj4JVYL0pkle1YptwM_CXJUWTeLaYtI1_MGtJYaHI,1225
|
|
6
7
|
lite_agent/loggers.py,sha256=XkNkdqwD_nQGfhQJ-bBWT7koci_mMkNw3aBpyMhOICw,57
|
|
7
8
|
lite_agent/message_transfers.py,sha256=N9ViK7Gxqqa1sd3V_hkNuQ9fUipg7M95l-sVBBG2Id4,5357
|
|
8
9
|
lite_agent/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
|
-
lite_agent/runner.py,sha256=
|
|
10
|
+
lite_agent/runner.py,sha256=p-Dw4RNYfRnIwnbt8oJv8e4qI84X7OUWLxgyITMnGe8,45090
|
|
10
11
|
lite_agent/processors/__init__.py,sha256=ybpAzpMBIE9v5I24wIBZRXeaOaPNTmoKH13aofgNI6Q,234
|
|
11
12
|
lite_agent/processors/completion_event_processor.py,sha256=zoWvs8dfrIkCSITGtS-4Hpve3WFCA0UUsMvYifL2fw0,13010
|
|
12
13
|
lite_agent/processors/response_event_processor.py,sha256=Jr3cj1ItJ8aq9UBhEEjDwWDnPNOZ2ZXjWJ3-g4ghkhM,8514
|
|
@@ -24,11 +25,11 @@ lite_agent/types/events.py,sha256=mFMqV55WWJbPDyb_P61nd3qMLpEnwZgVY6NTKFkINkg,23
|
|
|
24
25
|
lite_agent/types/messages.py,sha256=aq36BOLktd6rwxknqVXOLK7pLlwYktaBFn0Sp71l6nw,9993
|
|
25
26
|
lite_agent/types/tool_calls.py,sha256=Xnut8-2-Ld9vgA2GKJY6BbFlBaAv_n4W7vo7Jx21A-E,260
|
|
26
27
|
lite_agent/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
27
|
-
lite_agent/utils/advanced_message_builder.py,sha256=
|
|
28
|
+
lite_agent/utils/advanced_message_builder.py,sha256=3U1PQrbdYQuIkv3j83TggDu3TmFN57TPZU32GTyPe4E,10196
|
|
28
29
|
lite_agent/utils/message_builder.py,sha256=J-yycL9pXSO9MbgC5NEGqvoP1LC2Nxe9r2YRWXoaIAQ,8126
|
|
29
30
|
lite_agent/utils/message_converter.py,sha256=5HmNncTl71TD2M_6Ezz1Tnfavzna8DQYb4-D47Du7mA,9165
|
|
30
31
|
lite_agent/utils/message_state_manager.py,sha256=rFUyqyd_7NdJRtyqsAWGcfwrDIlD6gK2dBDSDx1eGBs,5766
|
|
31
32
|
lite_agent/utils/metrics.py,sha256=RzOEhCWxbLmmIEkzaxOJ6tAdthI8dv2Foc98Lq8afOQ,1915
|
|
32
|
-
lite_agent-0.
|
|
33
|
-
lite_agent-0.
|
|
34
|
-
lite_agent-0.
|
|
33
|
+
lite_agent-0.12.0.dist-info/METADATA,sha256=CvsMgd3DNYoZTvD0bTirNibch5S9eH8K-hjwWvEjFZo,3538
|
|
34
|
+
lite_agent-0.12.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
35
|
+
lite_agent-0.12.0.dist-info/RECORD,,
|
|
File without changes
|