lite-agent 0.8.0__tar.gz → 0.9.0__tar.gz

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.

Files changed (145) hide show
  1. {lite_agent-0.8.0 → lite_agent-0.9.0}/CHANGELOG.md +18 -0
  2. {lite_agent-0.8.0 → lite_agent-0.9.0}/PKG-INFO +2 -2
  3. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/basic.py +1 -1
  4. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/basic_agent.py +4 -4
  5. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/cancel_and_transfer_demo.py +21 -19
  6. lite_agent-0.9.0/examples/knowledge/main.py +67 -0
  7. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/non_streaming.py +2 -3
  8. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/response_api_example.py +2 -2
  9. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/simple_debug.py +1 -2
  10. lite_agent-0.9.0/htmlcov/.gitignore +2 -0
  11. lite_agent-0.9.0/htmlcov/class_index.html +771 -0
  12. lite_agent-0.9.0/htmlcov/coverage_html_cb_6fb7b396.js +733 -0
  13. lite_agent-0.9.0/htmlcov/favicon_32_cb_58284776.png +0 -0
  14. lite_agent-0.9.0/htmlcov/function_index.html +1475 -0
  15. lite_agent-0.9.0/htmlcov/index.html +272 -0
  16. lite_agent-0.9.0/htmlcov/keybd_closed_cb_ce680311.png +0 -0
  17. lite_agent-0.9.0/htmlcov/status.json +1 -0
  18. lite_agent-0.9.0/htmlcov/style_cb_6b508a39.css +377 -0
  19. lite_agent-0.9.0/htmlcov/z_02adcf90d0f2eeb1___init___py.html +228 -0
  20. lite_agent-0.9.0/htmlcov/z_02adcf90d0f2eeb1_events_py.html +216 -0
  21. lite_agent-0.9.0/htmlcov/z_02adcf90d0f2eeb1_messages_py.html +441 -0
  22. lite_agent-0.9.0/htmlcov/z_02adcf90d0f2eeb1_tool_calls_py.html +112 -0
  23. lite_agent-0.9.0/htmlcov/z_1d32cdd6b7b66bed___init___py.html +97 -0
  24. lite_agent-0.9.0/htmlcov/z_1d32cdd6b7b66bed_message_builder_py.html +308 -0
  25. lite_agent-0.9.0/htmlcov/z_1d32cdd6b7b66bed_metrics_py.html +147 -0
  26. lite_agent-0.9.0/htmlcov/z_40b804173f68aa9e___init___py.html +105 -0
  27. lite_agent-0.9.0/htmlcov/z_40b804173f68aa9e_agent_py.html +777 -0
  28. lite_agent-0.9.0/htmlcov/z_40b804173f68aa9e_chat_display_py.html +884 -0
  29. lite_agent-0.9.0/htmlcov/z_40b804173f68aa9e_client_py.html +337 -0
  30. lite_agent-0.9.0/htmlcov/z_40b804173f68aa9e_constants_py.html +127 -0
  31. lite_agent-0.9.0/htmlcov/z_40b804173f68aa9e_loggers_py.html +100 -0
  32. lite_agent-0.9.0/htmlcov/z_40b804173f68aa9e_message_transfers_py.html +216 -0
  33. lite_agent-0.9.0/htmlcov/z_40b804173f68aa9e_runner_py.html +993 -0
  34. lite_agent-0.9.0/htmlcov/z_71ac9935daa08879___init___py.html +108 -0
  35. lite_agent-0.9.0/htmlcov/z_71ac9935daa08879_base_py.html +151 -0
  36. lite_agent-0.9.0/htmlcov/z_71ac9935daa08879_completion_py.html +175 -0
  37. lite_agent-0.9.0/htmlcov/z_71ac9935daa08879_responses_py.html +173 -0
  38. lite_agent-0.9.0/htmlcov/z_c8357a9ef7e20b45___init___py.html +103 -0
  39. lite_agent-0.9.0/htmlcov/z_c8357a9ef7e20b45_litellm_py.html +181 -0
  40. lite_agent-0.9.0/htmlcov/z_f01690d2832086e5___init___py.html +101 -0
  41. lite_agent-0.9.0/htmlcov/z_f01690d2832086e5_completion_event_processor_py.html +397 -0
  42. lite_agent-0.9.0/htmlcov/z_f01690d2832086e5_response_event_processor_py.html +310 -0
  43. {lite_agent-0.8.0 → lite_agent-0.9.0}/pyproject.toml +7 -2
  44. lite_agent-0.9.0/pyrightconfig.json +12 -0
  45. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/agent.py +94 -43
  46. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/chat_display.py +298 -41
  47. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/message_transfers.py +21 -2
  48. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/processors/response_event_processor.py +4 -2
  49. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/runner.py +39 -8
  50. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/utils/message_builder.py +3 -1
  51. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_agent_additional.py +6 -12
  52. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_cancel_pending_tools.py +1 -1
  53. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_chat_display_additional.py +2 -3
  54. lite_agent-0.9.0/tests/unit/test_chat_display_simple.py +155 -0
  55. lite_agent-0.9.0/tests/unit/test_client.py +326 -0
  56. lite_agent-0.9.0/tests/unit/test_message_builder.py +422 -0
  57. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_message_transfers.py +27 -20
  58. lite_agent-0.9.0/tests/unit/test_response_handlers.py +270 -0
  59. lite_agent-0.9.0/tests/unit/test_utils_extended.py +97 -0
  60. {lite_agent-0.8.0 → lite_agent-0.9.0}/uv.lock +273 -273
  61. {lite_agent-0.8.0 → lite_agent-0.9.0}/.claude/settings.local.json +0 -0
  62. {lite_agent-0.8.0 → lite_agent-0.9.0}/.github/workflows/ci.yml +0 -0
  63. {lite_agent-0.8.0 → lite_agent-0.9.0}/.gitignore +0 -0
  64. {lite_agent-0.8.0 → lite_agent-0.9.0}/.python-version +0 -0
  65. {lite_agent-0.8.0 → lite_agent-0.9.0}/.vscode/launch.json +0 -0
  66. {lite_agent-0.8.0 → lite_agent-0.9.0}/CLAUDE.md +0 -0
  67. {lite_agent-0.8.0 → lite_agent-0.9.0}/README.md +0 -0
  68. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/basic_model.py +0 -0
  69. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/channels/rich_channel.py +0 -0
  70. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/chat_display_demo.py +0 -0
  71. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/confirm_and_continue.py +0 -0
  72. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/consolidate_history.py +0 -0
  73. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/context.py +0 -0
  74. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/debug_non_streaming.py +0 -0
  75. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/debug_with_logging.py +0 -0
  76. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/handoffs.py +0 -0
  77. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/image.py +0 -0
  78. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/llm_config_demo.py +0 -0
  79. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/message_transfer_example.py +0 -0
  80. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/message_transfer_example_new.py +0 -0
  81. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/new_message_structure_demo.py +0 -0
  82. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/reasoning_example.py +0 -0
  83. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/responses.py +0 -0
  84. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/set_chat_history_example.py +0 -0
  85. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/simple_debug2.py +0 -0
  86. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/stop_before_functions.py +0 -0
  87. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/stop_with_tool_call.py +0 -0
  88. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/streaming_demo.py +0 -0
  89. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/terminal.py +0 -0
  90. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/translate/main.py +0 -0
  91. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/translate/prompts/translation_system.md.j2 +0 -0
  92. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/translate.py +0 -0
  93. {lite_agent-0.8.0 → lite_agent-0.9.0}/examples/type_system_example.py +0 -0
  94. {lite_agent-0.8.0 → lite_agent-0.9.0}/scripts/record_chat_messages.py +0 -0
  95. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/__init__.py +0 -0
  96. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/client.py +0 -0
  97. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/constants.py +0 -0
  98. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/loggers.py +0 -0
  99. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/processors/__init__.py +0 -0
  100. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/processors/completion_event_processor.py +0 -0
  101. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/py.typed +0 -0
  102. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/response_handlers/__init__.py +0 -0
  103. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/response_handlers/base.py +0 -0
  104. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/response_handlers/completion.py +0 -0
  105. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/response_handlers/responses.py +0 -0
  106. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/stream_handlers/__init__.py +0 -0
  107. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/stream_handlers/litellm.py +0 -0
  108. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/templates/handoffs_source_instructions.xml.j2 +0 -0
  109. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/templates/handoffs_target_instructions.xml.j2 +0 -0
  110. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/templates/wait_for_user_instructions.xml.j2 +0 -0
  111. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/types/__init__.py +0 -0
  112. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/types/events.py +0 -0
  113. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/types/messages.py +0 -0
  114. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/types/tool_calls.py +0 -0
  115. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/utils/__init__.py +0 -0
  116. {lite_agent-0.8.0 → lite_agent-0.9.0}/src/lite_agent/utils/metrics.py +0 -0
  117. {lite_agent-0.8.0 → lite_agent-0.9.0}/temp/main.py +0 -0
  118. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/integration/test_agent_with_mocks.py +0 -0
  119. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/integration/test_basic.py +0 -0
  120. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/integration/test_mock_litellm.py +0 -0
  121. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/mocks/basic/1.jsonl +0 -0
  122. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/mocks/confirm_and_continue/1.jsonl +0 -0
  123. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/mocks/confirm_and_continue/2.jsonl +0 -0
  124. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/mocks/context/1.jsonl +0 -0
  125. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/mocks/handoffs/1.jsonl +0 -0
  126. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/performance/test_set_chat_history_performance.py +0 -0
  127. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/test_new_messages.py +0 -0
  128. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_agent.py +0 -0
  129. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_agent_handoffs.py +0 -0
  130. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_append_message.py +0 -0
  131. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_chat_display.py +0 -0
  132. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_completion_condition.py +0 -0
  133. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_file_recording.py +0 -0
  134. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_litellm_stream_handler.py +0 -0
  135. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_message_transfer.py +0 -0
  136. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_message_transfers_additional.py +0 -0
  137. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_response_api_format.py +0 -0
  138. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_response_event_processor.py +0 -0
  139. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_runner.py +0 -0
  140. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_set_chat_history.py +0 -0
  141. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_simple_stream_handlers.py +0 -0
  142. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_stream_chunk_processor.py +0 -0
  143. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_stream_handlers_additional.py +0 -0
  144. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/unit/test_streaming_config.py +0 -0
  145. {lite_agent-0.8.0 → lite_agent-0.9.0}/tests/utils/mock_litellm.py +0 -0
@@ -1,3 +1,21 @@
1
+ ## v0.9.0
2
+
3
+ [v0.8.0...v0.9.0](https://github.com/Jannchie/lite-agent/compare/v0.8.0...v0.9.0)
4
+
5
+ ### :sparkles: Features
6
+
7
+ - **agent**: improve assistant message tool_call handling - By [Jannchie](mailto:jannchie@gmail.com) in [45e6de8](https://github.com/Jannchie/lite-agent/commit/45e6de8)
8
+ - **chat-display**: add column-style message display and show model info - By [Jannchie](mailto:jannchie@gmail.com) in [3559137](https://github.com/Jannchie/lite-agent/commit/3559137)
9
+ - **tests**: add tests for client message_builder and response handlers - By [Jannchie](mailto:jannchie@gmail.com) in [ceec7d7](https://github.com/Jannchie/lite-agent/commit/ceec7d7)
10
+
11
+ ### :art: Refactors
12
+
13
+ - **examples**: update examples to use new message and content types - By [Jannchie](mailto:jannchie@gmail.com) in [59b4618](https://github.com/Jannchie/lite-agent/commit/59b4618)
14
+
15
+ ### :wrench: Chores
16
+
17
+ - **deps**: bump funcall to 0.11.0 - By [Jannchie](mailto:jannchie@gmail.com) in [eb5e7ae](https://github.com/Jannchie/lite-agent/commit/eb5e7ae)
18
+
1
19
  ## v0.8.0
2
20
 
3
21
  [v0.7.0...v0.8.0](https://github.com/Jannchie/lite-agent/compare/v0.7.0...v0.8.0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lite-agent
3
- Version: 0.8.0
3
+ Version: 0.9.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
@@ -18,7 +18,7 @@ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
18
18
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
19
19
  Requires-Python: >=3.10
20
20
  Requires-Dist: aiofiles>=24.1.0
21
- Requires-Dist: funcall>=0.10.0
21
+ Requires-Dist: funcall>=0.11.0
22
22
  Requires-Dist: openai<=1.99.5
23
23
  Requires-Dist: prompt-toolkit>=3.0.51
24
24
  Requires-Dist: rich>=14.0.0
@@ -31,7 +31,7 @@ agent = Agent(
31
31
 
32
32
 
33
33
  async def main():
34
- runner = Runner(agent, streaming=False, api="completion")
34
+ runner = Runner(agent, streaming=True, api="responses")
35
35
  resp = await runner.run_until_complete(
36
36
  "What is the temperature in New York?",
37
37
  includes=["usage", "assistant_message", "function_call", "function_call_output", "timing"],
@@ -4,6 +4,7 @@ import logging
4
4
  from rich.logging import RichHandler
5
5
 
6
6
  from lite_agent.agent import Agent
7
+ from lite_agent.types import NewUserMessage, UserTextContent
7
8
 
8
9
  logging.basicConfig(
9
10
  level=logging.WARNING,
@@ -39,10 +40,9 @@ agent = Agent(
39
40
  async def main():
40
41
  resp = await agent.completion(
41
42
  [
42
- {
43
- "role": "user",
44
- "content": "What is the temperature and whether in New York?",
45
- },
43
+ NewUserMessage(
44
+ content=[UserTextContent(text="What is the temperature and whether in New York?")],
45
+ ),
46
46
  ],
47
47
  )
48
48
  async for chunk in resp:
@@ -6,6 +6,7 @@ Demo showing two new features:
6
6
  """
7
7
 
8
8
  import asyncio
9
+ import json
9
10
  import logging
10
11
 
11
12
  from funcall.decorators import tool
@@ -13,7 +14,8 @@ from rich.logging import RichHandler
13
14
 
14
15
  from lite_agent.agent import Agent
15
16
  from lite_agent.runner import Runner
16
- from lite_agent.types import AssistantTextContent, AssistantToolCall, NewAssistantMessage
17
+ from lite_agent.types import AssistantTextContent, AssistantToolCall, AssistantToolCallResult, NewAssistantMessage, ToolCall, ToolCallFunction
18
+ from lite_agent.types.events import FunctionCallOutputEvent
17
19
 
18
20
  logging.basicConfig(
19
21
  level=logging.WARNING,
@@ -106,9 +108,9 @@ async def demo_1_cancel_pending_tools():
106
108
  chunks.append(chunk)
107
109
  if len(chunks) >= 3: # Stop after getting cancellation events
108
110
  break
109
- except Exception:
111
+ except Exception as e:
110
112
  # Expected - no real LLM configured
111
- pass
113
+ logger.debug("Expected exception in demo: %s", e)
112
114
 
113
115
  print(f"Events from run() method: {len(chunks)}")
114
116
  for i, chunk in enumerate(chunks):
@@ -156,7 +158,7 @@ async def demo_1_cancel_pending_tools():
156
158
  print(f"Content items in assistant message: {len(assistant_msg.content)}")
157
159
 
158
160
  # Show the cancellation results
159
- cancellation_results = [item for item in assistant_msg.content if item.type == "tool_call_result"]
161
+ cancellation_results = [item for item in assistant_msg.content if isinstance(item, AssistantToolCallResult)]
160
162
  print(f"Cancellation results added: {len(cancellation_results)}")
161
163
  for result in cancellation_results:
162
164
  print(f" - {result.call_id}: {result.output}")
@@ -194,9 +196,6 @@ async def demo_2_transfer_events():
194
196
  print(f"Current agent: {runner.agent.name}")
195
197
 
196
198
  # Simulate transfer_to_agent call
197
- import json
198
-
199
- from lite_agent.types import ToolCall, ToolCallFunction
200
199
 
201
200
  transfer_call = ToolCall(
202
201
  type="function",
@@ -209,13 +208,14 @@ async def demo_2_transfer_events():
209
208
  )
210
209
 
211
210
  # Handle transfer and collect events
212
- chunks = []
213
- async for chunk in runner._handle_tool_calls([transfer_call], ["function_call_output"]):
214
- chunks.append(chunk)
211
+ chunks = [chunk async for chunk in runner._handle_tool_calls([transfer_call], ["function_call_output"])]
215
212
 
216
213
  print(f"Events generated: {len(chunks)}")
217
214
  for i, chunk in enumerate(chunks):
218
- print(f" Event {i + 1}: {chunk.type} - {chunk.content}")
215
+ if isinstance(chunk, FunctionCallOutputEvent):
216
+ print(f" Event {i + 1}: {chunk.type} - {chunk.content}")
217
+ else:
218
+ print(f" Event {i + 1}: {chunk.type}")
219
219
 
220
220
  print(f"Agent after transfer: {runner.agent.name}")
221
221
 
@@ -232,13 +232,14 @@ async def demo_2_transfer_events():
232
232
  )
233
233
 
234
234
  # Handle parent transfer and collect events
235
- chunks = []
236
- async for chunk in runner._handle_tool_calls([parent_transfer_call], ["function_call_output"]):
237
- chunks.append(chunk)
235
+ chunks = [chunk async for chunk in runner._handle_tool_calls([parent_transfer_call], ["function_call_output"])]
238
236
 
239
237
  print(f"Events generated: {len(chunks)}")
240
238
  for i, chunk in enumerate(chunks):
241
- print(f" Event {i + 1}: {chunk.type} - {chunk.content}")
239
+ if isinstance(chunk, FunctionCallOutputEvent):
240
+ print(f" Event {i + 1}: {chunk.type} - {chunk.content}")
241
+ else:
242
+ print(f" Event {i + 1}: {chunk.type}")
242
243
 
243
244
  print(f"Agent after parent transfer: {runner.agent.name}")
244
245
 
@@ -265,13 +266,14 @@ async def demo_2_transfer_events():
265
266
  index=1,
266
267
  )
267
268
 
268
- chunks = []
269
- async for chunk in runner._handle_tool_calls([transfer_call_1, transfer_call_2], ["function_call_output"]):
270
- chunks.append(chunk)
269
+ chunks = [chunk async for chunk in runner._handle_tool_calls([transfer_call_1, transfer_call_2], ["function_call_output"])]
271
270
 
272
271
  print(f"Events generated: {len(chunks)}")
273
272
  for i, chunk in enumerate(chunks):
274
- print(f" Event {i + 1}: {chunk.content}")
273
+ if isinstance(chunk, FunctionCallOutputEvent):
274
+ print(f" Event {i + 1}: {chunk.content}")
275
+ else:
276
+ print(f" Event {i + 1}: {chunk.type}")
275
277
 
276
278
  print(f"Final agent: {runner.agent.name}")
277
279
 
@@ -0,0 +1,67 @@
1
+ import asyncio
2
+ import logging
3
+
4
+ from rich.logging import RichHandler
5
+
6
+ from lite_agent.agent import Agent
7
+ from lite_agent.chat_display import display_messages
8
+ from lite_agent.runner import Runner
9
+
10
+ logging.basicConfig(
11
+ level=logging.WARNING,
12
+ format="%(message)s",
13
+ datefmt="[%X]",
14
+ handlers=[RichHandler(rich_tracebacks=True)],
15
+ )
16
+
17
+ logger = logging.getLogger("lite_agent")
18
+ logger.setLevel(logging.DEBUG)
19
+
20
+
21
+ def list_knowledges() -> list[str]:
22
+ """
23
+ 列出系统中存在的知识,返回的是知识的标题
24
+ """
25
+ return ["苹果的价格的计算方法", "香蕉的价格", "茄子的价格", "芒果的价格", "其他水果蔬菜的价格"]
26
+
27
+
28
+ def read_knowledge(knowledge: str) -> str:
29
+ """
30
+ 通过知识的标题获取其内容
31
+ """
32
+ match knowledge:
33
+ case "苹果的价格的计算方法":
34
+ return "苹果的价格是两倍的香蕉的价格减去茄子的价格"
35
+ case "香蕉的价格":
36
+ return "香蕉的价格为3元"
37
+ case "其他水果蔬菜的价格":
38
+ return "茄子的价格为5元"
39
+ case "茄子的价格":
40
+ return "茄子的价格请参阅其他知识库"
41
+ case "芒果的价格":
42
+ return "芒果的价格为7元"
43
+ case _:
44
+ return "不存在的知识"
45
+
46
+
47
+ agent = Agent(
48
+ model="gpt-5-mini",
49
+ name="Assistant",
50
+ instructions="你是一个有帮助的助手。",
51
+ tools=[list_knowledges, read_knowledge],
52
+ reasoning={"effort": "minimal"},
53
+ )
54
+
55
+
56
+ async def main():
57
+ runner = Runner(agent, streaming=True)
58
+ await runner.run_until_complete(
59
+ "苹果的价格是多少?查询知识库告诉我答案。",
60
+ includes=["usage", "assistant_message", "function_call", "function_call_output", "timing"],
61
+ )
62
+
63
+ display_messages(runner.messages)
64
+
65
+
66
+ if __name__ == "__main__":
67
+ asyncio.run(main())
@@ -3,6 +3,7 @@ Simple example demonstrating non-streaming mode in LiteAgent.
3
3
  """
4
4
 
5
5
  import asyncio
6
+ from datetime import datetime, timezone
6
7
 
7
8
  from lite_agent import Agent, Runner
8
9
 
@@ -33,9 +34,7 @@ async def main():
33
34
  # Example with a simple tool
34
35
  def get_time() -> str:
35
36
  """Get the current time."""
36
- from datetime import datetime
37
-
38
- return f"Current time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
37
+ return f"Current time: {datetime.now(timezone.utc).strftime('%Y-%m-%d %H:%M:%S')}"
39
38
 
40
39
  agent_with_tools = Agent(
41
40
  name="TimeAgent",
@@ -86,7 +86,7 @@ async def main():
86
86
  )
87
87
 
88
88
  # This will raise an error when trying to convert
89
- converted_messages = agent._convert_responses_to_completions_format(runner.messages) # noqa: SLF001
89
+ converted_messages = agent._convert_responses_to_completions_format(runner.messages)
90
90
  print("❌ This should not be reached!")
91
91
 
92
92
  except ValueError as e:
@@ -108,7 +108,7 @@ async def main():
108
108
  print("\n=== Converted messages for LLM API ===")
109
109
  # Note: In a real application, this conversion happens automatically
110
110
  # We're accessing the private method here just for demonstration
111
- converted_messages = agent._convert_responses_to_completions_format(runner.messages) # noqa: SLF001
111
+ converted_messages = agent._convert_responses_to_completions_format(runner.messages)
112
112
  for i, message in enumerate(converted_messages):
113
113
  print(f"Converted Message {i + 1}:")
114
114
  print(f" {message}")
@@ -3,6 +3,7 @@ Simple debug to check non-streaming response.
3
3
  """
4
4
 
5
5
  import asyncio
6
+ import traceback
6
7
 
7
8
  from lite_agent import Agent, Runner
8
9
 
@@ -29,8 +30,6 @@ async def main():
29
30
  print(f"First chunk: {chunks[0]}")
30
31
  except Exception as e:
31
32
  print(f"Error: {e}")
32
- import traceback
33
-
34
33
  traceback.print_exc()
35
34
 
36
35
 
@@ -0,0 +1,2 @@
1
+ # Created by coverage.py
2
+ *