lionagi 0.0.111__py3-none-any.whl → 0.0.113__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 (91) hide show
  1. lionagi/__init__.py +7 -2
  2. lionagi/bridge/__init__.py +7 -0
  3. lionagi/bridge/langchain.py +131 -0
  4. lionagi/bridge/llama_index.py +157 -0
  5. lionagi/configs/__init__.py +7 -0
  6. lionagi/configs/oai_configs.py +49 -0
  7. lionagi/configs/openrouter_config.py +49 -0
  8. lionagi/core/__init__.py +15 -0
  9. lionagi/{session/conversation.py → core/conversations.py} +10 -17
  10. lionagi/core/flows.py +1 -0
  11. lionagi/core/instruction_sets.py +1 -0
  12. lionagi/{session/message.py → core/messages.py} +5 -5
  13. lionagi/core/sessions.py +262 -0
  14. lionagi/datastore/__init__.py +1 -0
  15. lionagi/datastore/chroma.py +1 -0
  16. lionagi/datastore/deeplake.py +1 -0
  17. lionagi/datastore/elasticsearch.py +1 -0
  18. lionagi/datastore/lantern.py +1 -0
  19. lionagi/datastore/pinecone.py +1 -0
  20. lionagi/datastore/postgres.py +1 -0
  21. lionagi/datastore/qdrant.py +1 -0
  22. lionagi/loader/__init__.py +12 -0
  23. lionagi/loader/chunker.py +157 -0
  24. lionagi/loader/reader.py +124 -0
  25. lionagi/objs/__init__.py +7 -0
  26. lionagi/objs/messenger.py +163 -0
  27. lionagi/objs/tool_registry.py +247 -0
  28. lionagi/schema/__init__.py +11 -0
  29. lionagi/schema/base_condition.py +1 -0
  30. lionagi/schema/base_schema.py +239 -0
  31. lionagi/schema/base_tool.py +9 -0
  32. lionagi/schema/data_logger.py +94 -0
  33. lionagi/services/__init__.py +14 -0
  34. lionagi/services/anthropic.py +1 -0
  35. lionagi/services/anyscale.py +0 -0
  36. lionagi/services/azure.py +1 -0
  37. lionagi/{api/oai_service.py → services/base_api_service.py} +74 -148
  38. lionagi/services/bedrock.py +0 -0
  39. lionagi/services/chatcompletion.py +48 -0
  40. lionagi/services/everlyai.py +0 -0
  41. lionagi/services/gemini.py +0 -0
  42. lionagi/services/gpt4all.py +0 -0
  43. lionagi/services/huggingface.py +0 -0
  44. lionagi/services/litellm.py +1 -0
  45. lionagi/services/localai.py +0 -0
  46. lionagi/services/mistralai.py +0 -0
  47. lionagi/services/oai.py +34 -0
  48. lionagi/services/ollama.py +1 -0
  49. lionagi/services/openllm.py +0 -0
  50. lionagi/services/openrouter.py +32 -0
  51. lionagi/services/perplexity.py +0 -0
  52. lionagi/services/predibase.py +0 -0
  53. lionagi/services/rungpt.py +0 -0
  54. lionagi/services/service_objs.py +282 -0
  55. lionagi/services/vllm.py +0 -0
  56. lionagi/services/xinference.py +0 -0
  57. lionagi/structure/__init__.py +7 -0
  58. lionagi/structure/relationship.py +128 -0
  59. lionagi/structure/structure.py +160 -0
  60. lionagi/tests/__init__.py +0 -0
  61. lionagi/tests/test_flatten_util.py +426 -0
  62. lionagi/tools/__init__.py +0 -0
  63. lionagi/tools/coder.py +1 -0
  64. lionagi/tools/planner.py +1 -0
  65. lionagi/tools/prompter.py +1 -0
  66. lionagi/tools/sandbox.py +1 -0
  67. lionagi/tools/scorer.py +1 -0
  68. lionagi/tools/summarizer.py +1 -0
  69. lionagi/tools/validator.py +1 -0
  70. lionagi/utils/__init__.py +46 -8
  71. lionagi/utils/api_util.py +63 -416
  72. lionagi/utils/call_util.py +347 -0
  73. lionagi/utils/flat_util.py +540 -0
  74. lionagi/utils/io_util.py +102 -0
  75. lionagi/utils/load_utils.py +190 -0
  76. lionagi/utils/sys_util.py +85 -660
  77. lionagi/utils/tool_util.py +82 -199
  78. lionagi/utils/type_util.py +81 -0
  79. lionagi/version.py +1 -1
  80. {lionagi-0.0.111.dist-info → lionagi-0.0.113.dist-info}/METADATA +44 -15
  81. lionagi-0.0.113.dist-info/RECORD +84 -0
  82. lionagi/api/__init__.py +0 -8
  83. lionagi/api/oai_config.py +0 -16
  84. lionagi/session/__init__.py +0 -7
  85. lionagi/session/session.py +0 -380
  86. lionagi/utils/doc_util.py +0 -331
  87. lionagi/utils/log_util.py +0 -86
  88. lionagi-0.0.111.dist-info/RECORD +0 -20
  89. {lionagi-0.0.111.dist-info → lionagi-0.0.113.dist-info}/LICENSE +0 -0
  90. {lionagi-0.0.111.dist-info → lionagi-0.0.113.dist-info}/WHEEL +0 -0
  91. {lionagi-0.0.111.dist-info → lionagi-0.0.113.dist-info}/top_level.txt +0 -0
@@ -1,380 +0,0 @@
1
- import os
2
- import aiohttp
3
- import asyncio
4
- import json
5
- from typing import Any
6
-
7
-
8
- from .conversation import Conversation
9
- from ..utils.sys_util import to_list, l_call, al_call
10
- from ..utils.log_util import DataLogger
11
- from ..utils.api_util import StatusTracker
12
- from ..utils.tool_util import ToolManager
13
- from ..api.oai_service import OpenAIService
14
- from ..api.oai_config import oai_llmconfig
15
-
16
- status_tracker = StatusTracker()
17
- OAIService = OpenAIService(api_key=os.getenv('OPENAI_API_KEY'))
18
-
19
-
20
- class Session():
21
- """
22
- A class representing a conversation session with a conversational AI system.
23
-
24
- This class manages the flow of conversation, system settings, and interactions with external tools.
25
-
26
- Attributes:
27
- conversation (Conversation):
28
- An instance of the Conversation class to manage messages.
29
- system (str):
30
- The current system setting for the conversation.
31
- llmconfig (dict):
32
- Configuration settings for the language model.
33
- _logger (DataLogger):
34
- An instance of the DataLogger class for logging conversation details.
35
- api_service:
36
- An instance of the API service for making calls to the conversational AI model.
37
- _toolmanager (ToolManager):
38
- An instance of the ToolManager class for managing external tools.
39
-
40
- Methods:
41
- set_dir(dir):
42
- Set the directory for logging.
43
-
44
- set_system(system):
45
- Set the system for the conversation.
46
-
47
- set_llmconfig(llmconfig):
48
- Set the language model configuration.
49
-
50
- set_api_service(api_service):
51
- Set the API service for making model calls.
52
-
53
- _output(output, invoke=True, out=True) -> Any:
54
- Process the output, invoke tools if needed, and optionally return the output.
55
-
56
- _is_invoked():
57
- Checks if the current message indicates the invocation of a function call.
58
-
59
- register_tools(tools, funcs, update=False, new=False, prefix=None, postfix=None):
60
- Register tools and their corresponding functions.
61
-
62
- initiate(instruction, system=None, context=None, out=True, name=None, invoke=True, **kwargs) -> Any:
63
- Start a new conversation session with the provided instruction.
64
-
65
- followup(instruction, system=None, context=None, out=True, name=None, invoke=True, **kwargs) -> Any:
66
- Continue the conversation with the provided instruction.
67
-
68
- auto_followup(self, instruct, num=3, tool_parser=None, **kwags):
69
- Automates the follow-up process for a specified number of times or until the session concludes.
70
-
71
- _create_payload_chatcompletion(**kwargs) -> dict:
72
- Create a payload for chat completion based on the conversation state and configuration.
73
-
74
- _call_chatcompletion(sleep=0.1, **kwargs) -> None:
75
- Make a call to the chat completion API and process the response.
76
-
77
- messages_to_csv(dir=None, filename="_messages.csv", **kwargs) -> None:
78
- Save conversation messages to a CSV file.
79
-
80
- log_to_csv(dir=None, filename="_llmlog.csv", **kwargs) -> None:
81
- Save conversation logs to a CSV file.
82
- """
83
-
84
- def __init__(self, system, dir=None, llmconfig=oai_llmconfig, api_service=OAIService):
85
- """
86
- Initialize a Session object with default or provided settings.
87
-
88
- Parameters:
89
- system (str): The initial system setting for the conversation.
90
-
91
- dir (Optional[str]): The directory for logging. Default is None.
92
-
93
- llmconfig (Optional[dict]): Configuration settings for the language model. Default is oai_llmconfig.
94
-
95
- api_service: An instance of the API service for making calls to the conversational AI model.
96
- """
97
- self.conversation = Conversation()
98
- self.system = system
99
- self.llmconfig = llmconfig
100
- self._logger = DataLogger(dir=dir)
101
- self.api_service = api_service
102
- self._toolmanager = ToolManager()
103
-
104
- def set_dir(self, dir):
105
- """
106
- Set the directory for logging.
107
-
108
- Parameters:
109
- dir (str): The directory path.
110
- """
111
- self._logger.dir = dir
112
-
113
- def set_system(self, system):
114
- """
115
- Set the system for the conversation.
116
-
117
- Parameters:
118
- system (str): The system setting.
119
- """
120
- self.conversation.change_system(system)
121
-
122
- def set_llmconfig(self, llmconfig):
123
- """
124
- Set the language model configuration.
125
-
126
- Parameters:
127
- llmconfig (dict): Configuration settings for the language model.
128
- """
129
- self.llmconfig = llmconfig
130
-
131
- def set_api_service(self, api_service):
132
- """
133
- Set the API service for making model calls.
134
-
135
- Parameters:
136
- api_service: An instance of the API service.
137
- """
138
- self.api_service = api_service
139
-
140
- async def _output(self, invoke=True, out=True, tool_parser=None):
141
- """
142
- Process the output, invoke tools if needed, and optionally return the output.
143
-
144
- Parameters:
145
- invoke (bool): Whether to invoke tools based on the output. Default is True.
146
-
147
- out (bool): Whether to return the output. Default is True.
148
-
149
- Returns:
150
- Any: The processed output.
151
- """
152
- if invoke:
153
- try:
154
- tool_uses = json.loads(self.conversation.responses[-1]['content'])
155
- if 'function_list' in tool_uses.keys():
156
- func_calls = l_call(tool_uses['function_list'], self._toolmanager._get_function_call)
157
-
158
- else:
159
- func_calls = l_call(tool_uses['tool_uses'], self._toolmanager._get_function_call)
160
-
161
- outs = await al_call(func_calls, self._toolmanager.ainvoke)
162
- if tool_parser:
163
- outs = l_call(outs, tool_parser)
164
- for out, f in zip(outs, func_calls):
165
- response = {"function": f[0], "arguments": f[1], "output": out}
166
- self.conversation.add_messages(response=response)
167
-
168
- except:
169
- pass
170
-
171
- if out:
172
- return self.conversation.responses[-1]['content']
173
-
174
- def _is_invoked(self):
175
- """
176
- Checks if the current message indicates the invocation of a function call.
177
-
178
- Returns:
179
- bool: True if a function call is detected in the content of the last message, False otherwise.
180
- """
181
- msg = self.conversation.messages[-1]
182
- try:
183
- if json.loads(msg['content']).keys() >= {'function', 'arguments', 'output'}:
184
- return True
185
- except:
186
- return False
187
-
188
- def register_tools(self, tools, funcs, update=False, new=False, prefix=None, postfix=None):
189
- """
190
- Register tools and their corresponding functions.
191
-
192
- Parameters:
193
- tools (list): The list of tool information dictionaries.
194
-
195
- funcs (list): The list of corresponding functions.
196
-
197
- update (bool): Whether to update existing functions.
198
-
199
- new (bool): Whether to create new registries for existing functions.
200
-
201
- prefix (Optional[str]): A prefix to add to the function names.
202
-
203
- postfix (Optional[str]): A postfix to add to the function names.
204
- """
205
- funcs = to_list(funcs)
206
- self._toolmanager.register_tools(tools, funcs, update, new, prefix, postfix)
207
-
208
- async def initiate(self, instruction, system=None, context=None, name=None, invoke=True, out=True, tool_parser=None, **kwargs) -> Any:
209
- """
210
- Start a new conversation session with the provided instruction.
211
-
212
- Parameters:
213
- instruction (Union[str, dict]): The instruction to initiate the conversation.
214
-
215
- system (Optional[str]): The system setting for the conversation. Default is None.
216
-
217
- context (Optional[dict]): Additional context for the instruction. Default is None.
218
-
219
- out (bool): Whether to return the output. Default is True.
220
-
221
- name (Optional[str]): The name associated with the instruction. Default is None.
222
-
223
- invoke (bool): Whether to invoke tools based on the output. Default is True.
224
-
225
- tool_parser (Optional[callable]): A custom tool parser function. Default is None.
226
-
227
- **kwargs: Additional keyword arguments for configuration.
228
-
229
- Returns:
230
- Any: The processed output.
231
- """
232
- config = {**self.llmconfig, **kwargs}
233
- system = system or self.system
234
- self.conversation.initiate_conversation(system=system, instruction=instruction, context=context, name=name)
235
- await self._call_chatcompletion(**config)
236
-
237
- return await self._output(invoke, out, tool_parser)
238
-
239
- async def followup(self, instruction, system=None, context=None, out=True, name=None, invoke=True, tool_parser=None, **kwargs) -> Any:
240
- """
241
- Continue the conversation with the provided instruction.
242
-
243
- Parameters:
244
- instruction (Union[str, dict]): The instruction to continue the conversation.
245
-
246
- system (Optional[str]): The system setting for the conversation. Default is None.
247
-
248
- context (Optional[dict]): Additional context for the instruction. Default is None.
249
-
250
- out (bool): Whether to return the output. Default is True.
251
-
252
- name (Optional[str]): The name associated with the instruction. Default is None.
253
-
254
- invoke (bool): Whether to invoke tools based on the output. Default is True.
255
-
256
- tool_parser (Optional[callable]): A custom tool parser function. Default is None.
257
-
258
- **kwargs: Additional keyword arguments for configuration.
259
-
260
- Returns:
261
- Any: The processed output.
262
- """
263
- if system:
264
- self.conversation.change_system(system)
265
- self.conversation.add_messages(instruction=instruction, context=context, name=name)
266
- config = {**self.llmconfig, **kwargs}
267
- await self._call_chatcompletion(**config)
268
-
269
- return await self._output(invoke, out, tool_parser)
270
-
271
- async def auto_followup(self, instruct, num=3, tool_parser=None, **kwargs):
272
- """
273
- Automates the follow-up process for a specified number of times or until the session concludes.
274
-
275
- Parameters:
276
- instruct (Union[str, dict]): The instruction for the follow-up.
277
-
278
- num (int, optional): The number of times to automatically follow up. Defaults to 3.
279
-
280
- tool_parser (callable, optional): A custom tool parser function. Defaults to None.
281
-
282
- **kwargs: Additional keyword arguments passed to the underlying `followup` method.
283
-
284
- """
285
- cont_ = True
286
- while num > 0 and cont_ is True:
287
- await self.followup(instruct, tool_parser=tool_parser, tool_choice="auto", **kwargs)
288
- num -= 1
289
- cont_ = True if self._is_invoked() else False
290
- if num == 0:
291
- await self.followup(instruct, **kwargs)
292
-
293
- def _create_payload_chatcompletion(self, **kwargs):
294
- """
295
- Create a payload for chat completion based on the conversation state and configuration.
296
-
297
- Parameters:
298
- **kwargs: Additional keyword arguments for configuration.
299
-
300
- Returns:
301
- dict: The payload for chat completion.
302
- """
303
- # currently only openai chat completions are supported
304
- messages = self.conversation.messages
305
- config = {**self.llmconfig, **kwargs}
306
- payload = {
307
- "messages": messages,
308
- "model": config.get('model'),
309
- "frequency_penalty": config.get('frequency_penalty'),
310
- "n": config.get('n'),
311
- "presence_penalty": config.get('presence_penalty'),
312
- "response_format": config.get('response_format'),
313
- "temperature": config.get('temperature'),
314
- "top_p": config.get('top_p'),
315
- }
316
-
317
- for key in ["seed", "stop", "stream", "tools", "tool_choice", "user", "max_tokens"]:
318
- if bool(config[key]) is True and str(config[key]) != "none":
319
- payload.update({key: config[key]})
320
- return payload
321
-
322
- async def _call_chatcompletion(self, sleep=0.1, **kwargs):
323
- """
324
- Make a call to the chat completion API and process the response.
325
-
326
- Parameters:
327
- sleep (float): The sleep duration after making the API call. Default is 0.1.
328
-
329
- **kwargs: Additional keyword arguments for configuration.
330
- """
331
- endpoint = f"chat/completions"
332
- try:
333
- async with aiohttp.ClientSession() as session:
334
- payload = self._create_payload_chatcompletion(**kwargs)
335
- completion = await self.api_service.call_api(
336
- session, endpoint, payload)
337
- if "choices" in completion:
338
- self._logger({"input": payload, "output": completion})
339
- self.conversation.add_messages(response=completion['choices'][0])
340
- self.conversation.responses.append(self.conversation.messages[-1])
341
- self.conversation.response_counts += 1
342
- await asyncio.sleep(sleep)
343
- status_tracker.num_tasks_succeeded += 1
344
- else:
345
- status_tracker.num_tasks_failed += 1
346
- except Exception as e:
347
- status_tracker.num_tasks_failed += 1
348
- raise e
349
-
350
- def messages_to_csv(self, dir=None, filename="_messages.csv", **kwargs):
351
- """
352
- Save conversation messages to a CSV file.
353
-
354
- Parameters:
355
- dir (Optional[str]): The directory path for saving the CSV file. Default is None.
356
-
357
- filename (Optional[str]): The filename for the CSV file. Default is "_messages.csv".
358
-
359
- **kwargs: Additional keyword arguments for CSV file settings.
360
- """
361
- dir = dir or self._logger.dir
362
- if dir is None:
363
- raise ValueError("No directory specified.")
364
- self.conversation.msg.to_csv(dir=dir, filename=filename, **kwargs)
365
-
366
- def log_to_csv(self, dir=None, filename="_llmlog.csv", **kwargs):
367
- """
368
- Save conversation logs to a CSV file.
369
-
370
- Parameters:
371
- dir (Optional[str]): The directory path for saving the CSV file. Default is None.
372
-
373
- filename (Optional[str]): The filename for the CSV file. Default is "_llmlog.csv".
374
-
375
- **kwargs: Additional keyword arguments for CSV file settings.
376
- """
377
- dir = dir or self._logger.dir
378
- if dir is None:
379
- raise ValueError("No directory specified.")
380
- self._logger.to_csv(dir=dir, filename=filename, **kwargs)