lionagi 0.0.201__py3-none-any.whl → 0.0.204__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 (53) hide show
  1. lionagi/_services/anthropic.py +79 -1
  2. lionagi/_services/base_service.py +1 -1
  3. lionagi/_services/services.py +61 -25
  4. lionagi/_services/transformers.py +46 -0
  5. lionagi/agents/__init__.py +0 -0
  6. lionagi/configs/oai_configs.py +1 -1
  7. lionagi/configs/openrouter_configs.py +1 -1
  8. lionagi/core/__init__.py +3 -7
  9. lionagi/core/branch/__init__.py +0 -0
  10. lionagi/core/branch/branch.py +589 -0
  11. lionagi/core/branch/branch_manager.py +139 -0
  12. lionagi/core/branch/cluster.py +1 -0
  13. lionagi/core/branch/conversation.py +484 -0
  14. lionagi/core/core_util.py +59 -0
  15. lionagi/core/flow/__init__.py +0 -0
  16. lionagi/core/flow/flow.py +19 -0
  17. lionagi/core/instruction_set/__init__.py +0 -0
  18. lionagi/core/instruction_set/instruction_set.py +343 -0
  19. lionagi/core/messages/__init__.py +0 -0
  20. lionagi/core/messages/messages.py +176 -0
  21. lionagi/core/sessions/__init__.py +0 -0
  22. lionagi/core/sessions/session.py +428 -0
  23. lionagi/models/__init__.py +0 -0
  24. lionagi/models/base_model.py +0 -0
  25. lionagi/models/imodel.py +53 -0
  26. lionagi/schema/data_logger.py +75 -155
  27. lionagi/tests/test_utils/test_call_util.py +658 -657
  28. lionagi/tools/tool_manager.py +121 -188
  29. lionagi/utils/__init__.py +5 -10
  30. lionagi/utils/call_util.py +667 -585
  31. lionagi/utils/io_util.py +3 -0
  32. lionagi/utils/nested_util.py +17 -211
  33. lionagi/utils/pd_util.py +57 -0
  34. lionagi/utils/sys_util.py +220 -184
  35. lionagi/utils/url_util.py +55 -0
  36. lionagi/version.py +1 -1
  37. {lionagi-0.0.201.dist-info → lionagi-0.0.204.dist-info}/METADATA +12 -8
  38. {lionagi-0.0.201.dist-info → lionagi-0.0.204.dist-info}/RECORD +47 -32
  39. lionagi/core/branch.py +0 -193
  40. lionagi/core/conversation.py +0 -341
  41. lionagi/core/flow.py +0 -8
  42. lionagi/core/instruction_set.py +0 -150
  43. lionagi/core/messages.py +0 -243
  44. lionagi/core/sessions.py +0 -474
  45. /lionagi/{tools → agents}/planner.py +0 -0
  46. /lionagi/{tools → agents}/prompter.py +0 -0
  47. /lionagi/{tools → agents}/scorer.py +0 -0
  48. /lionagi/{tools → agents}/summarizer.py +0 -0
  49. /lionagi/{tools → agents}/validator.py +0 -0
  50. /lionagi/core/{flow_util.py → flow/flow_util.py} +0 -0
  51. {lionagi-0.0.201.dist-info → lionagi-0.0.204.dist-info}/LICENSE +0 -0
  52. {lionagi-0.0.201.dist-info → lionagi-0.0.204.dist-info}/WHEEL +0 -0
  53. {lionagi-0.0.201.dist-info → lionagi-0.0.204.dist-info}/top_level.txt +0 -0
@@ -1 +1,79 @@
1
- # TODO
1
+ from os import getenv
2
+ from .base_service import BaseService, PayloadCreation
3
+
4
+ class AnthropicService(BaseService):
5
+ """
6
+ A service to interact with Anthropic's API endpoints.
7
+
8
+ Attributes:
9
+ base_url (str): The base URL for the Anthropic API.
10
+ available_endpoints (list): A list of available API endpoints.
11
+ schema (dict): The schema configuration for the API.
12
+ key_scheme (str): The environment variable name for Anthropic API key.
13
+ token_encoding_name (str): The default token encoding scheme.
14
+
15
+ Examples:
16
+ >>> service = AnthropicService(api_key="your_api_key")
17
+ >>> asyncio.run(service.serve("Hello, world!", "chat/completions"))
18
+ (payload, completion)
19
+ """
20
+
21
+ base_url = "https://api.anthropic.com/v1/"
22
+ available_endpoints = ['chat/completions']
23
+ schema = {} # TODO
24
+ key_scheme = "ANTHROPIC_API_KEY"
25
+ token_encoding_name = "cl100k_base"
26
+
27
+ def __init__(self, api_key = None, key_scheme = None,schema = None, token_encoding_name: str = "cl100k_base", **kwargs):
28
+ key_scheme = key_scheme or self.key_scheme
29
+ super().__init__(
30
+ api_key = api_key or getenv(key_scheme),
31
+ schema = schema or self.schema,
32
+ token_encoding_name=token_encoding_name,
33
+ **kwargs
34
+ )
35
+ self.active_endpoint = []
36
+
37
+ async def serve(self, input_, endpoint="chat/completions", method="post", **kwargs):
38
+ """
39
+ Serves the input using the specified endpoint and method.
40
+
41
+ Args:
42
+ input_: The input text to be processed.
43
+ endpoint: The API endpoint to use for processing.
44
+ method: The HTTP method to use for the request.
45
+ **kwargs: Additional keyword arguments to pass to the payload creation.
46
+
47
+ Returns:
48
+ A tuple containing the payload and the completion response from the API.
49
+ """
50
+ if endpoint not in self.active_endpoint:
51
+ await self. init_endpoint(endpoint)
52
+ if endpoint == "chat/completions":
53
+ return await self.serve_chat(input_, **kwargs)
54
+ else:
55
+ return ValueError(f'{endpoint} is currently not supported')
56
+
57
+ async def serve_chat(self, messages, **kwargs):
58
+ """
59
+ Serves the chat completion request with the given messages.
60
+
61
+ Args:
62
+ messages: The messages to be included in the chat completion.
63
+ **kwargs: Additional keyword arguments for payload creation.
64
+
65
+ Returns:
66
+ A tuple containing the payload and the completion response from the API.
67
+ """
68
+ if "chat/completions" not in self.active_endpoint:
69
+ await self. init_endpoint("chat/completions")
70
+ self.active_endpoint.append("chat/completions")
71
+ payload = PayloadCreation.chat_completion(
72
+ messages, self.endpoints["chat/completions"].config, self.schema["chat/completions"], **kwargs)
73
+
74
+ try:
75
+ completion = await self.call_api(payload, "chat/completions", "post")
76
+ return payload, completion
77
+ except Exception as e:
78
+ self.status_tracker.num_tasks_failed += 1
79
+ raise e
@@ -283,6 +283,7 @@ class BaseService:
283
283
  'interval': interval
284
284
  }
285
285
 
286
+
286
287
  async def init_endpoint(self, endpoint_: Optional[Union[List[str], List[EndPoint], str, EndPoint]] = None) -> None:
287
288
  """
288
289
  Initializes the specified endpoint or all endpoints if none is specified.
@@ -411,4 +412,3 @@ class PayloadCreation:
411
412
  optional_=schema['optional'],
412
413
  input_key="training_file",
413
414
  **kwargs)
414
-
@@ -1,11 +1,9 @@
1
- from .oai import OpenAIService
2
- from .openrouter import OpenRouterService
3
-
4
1
  class Services:
5
2
 
6
3
  @staticmethod
7
4
  def OpenAI(**kwargs):
8
- """A service to interact with OpenAI's API endpoints.
5
+ """
6
+ A service to interact with OpenAI's API endpoints.
9
7
 
10
8
  Attributes:
11
9
  api_key (Optional[str]): The API key used for authentication.
@@ -13,25 +11,19 @@ class Services:
13
11
  status_tracker (StatusTracker): The object tracking the status of API calls.
14
12
  endpoints (Dict[str, EndPoint]): A dictionary of endpoint objects.
15
13
  base_url (str): The base URL for the OpenAI API.
16
- available_endpoints (list): A list of available API endpoints.
17
- ['chat/completions', 'finetune', 'audio_speech', 'audio_transcriptions', 'audio_translations']
14
+ available_endpoints (list): A list of available API endpoints, including
15
+ 'chat/completions'
18
16
  key_scheme (str): The environment variable name for API key.
19
17
  token_encoding_name (str): The default token encoding scheme.
20
-
21
- Examples:
22
- >>> service = OpenAIService(api_key="your_api_key")
23
- >>> asyncio.run(service.serve("Hello, world!", "chat/completions"))
24
- (payload, completion)
25
-
26
- >>> service = OpenAIService()
27
- >>> asyncio.run(service.serve("Convert this text to speech.", "audio_speech"))
28
- ValueError: 'audio_speech' is currently not supported
29
18
  """
19
+
20
+ from .oai import OpenAIService
30
21
  return OpenAIService(**kwargs)
31
22
 
32
23
  @staticmethod
33
24
  def OpenRouter(**kwargs):
34
- """A service to interact with OpenRouter's API endpoints.
25
+ """
26
+ A service to interact with OpenRouter's API endpoints.
35
27
 
36
28
  Attributes:
37
29
  api_key (Optional[str]): The API key used for authentication.
@@ -39,17 +31,61 @@ class Services:
39
31
  status_tracker (StatusTracker): The object tracking the status of API calls.
40
32
  endpoints (Dict[str, EndPoint]): A dictionary of endpoint objects.
41
33
  base_url (str): The base URL for the OpenAI API.
42
- available_endpoints (list): A list of available API endpoints. ['chat/completions']
34
+ available_endpoints (list): A list of available API endpoints, including
35
+ 'chat/completions'
43
36
  key_scheme (str): The environment variable name for API key.
44
37
  token_encoding_name (str): The default token encoding scheme.
38
+ """
45
39
 
46
- Examples:
47
- >>> service = OpenAIService(api_key="your_api_key")
48
- >>> asyncio.run(service.serve("Hello, world!", "chat/completions"))
49
- (payload, completion)
40
+ from .openrouter import OpenRouterService
41
+ return OpenRouterService(**kwargs)
50
42
 
51
- >>> service = OpenAIService()
52
- >>> asyncio.run(service.serve("Convert this text to speech.", "audio_speech"))
53
- ValueError: 'audio_speech' is currently not supported
43
+ @staticmethod
44
+ def Transformers(**kwargs):
54
45
  """
55
- return OpenRouterService(**kwargs)
46
+ A service to interact with Transformers' pipeline
47
+
48
+ Attributes:
49
+ task (str): The specific task to be performed by the transformer model.
50
+ Currently, only 'conversational' tasks are supported.
51
+ model (Union[str, Any]): Identifier for the transformer model to be used. This
52
+ can be a model name or a path to a model.
53
+ config (Union[str, Dict, Any]): Configuration for the transformer model. Can
54
+ include tokenizer information among others.
55
+ pipe (pipeline): The loaded transformer pipeline for the specified task, model,
56
+ and configuration.
57
+
58
+ Warnings:
59
+ - Ensure the selected model is suitable for conversational tasks to avoid
60
+ unexpected behavior.
61
+ - As this service heavily relies on external libraries (Hugging Face's
62
+ Transformers), ensure they are installed and updated to compatible versions.
63
+
64
+ Dependencies:
65
+ - Requires the `transformers` library by Hugging Face and `asyncio` for
66
+ asynchronous operations.
67
+ """
68
+
69
+ from .transformers import TransformersService
70
+ return TransformersService(**kwargs)
71
+
72
+
73
+ @staticmethod
74
+ def Anthropic(**kwargs):
75
+ """
76
+ A service to interact with Anthropic's API endpoints.
77
+
78
+ Attributes:
79
+ api_key (Optional[str]): The API key used for authentication.
80
+ schema (Dict[str, Any]): The schema defining the service's endpoints.
81
+ status_tracker (StatusTracker): The object tracking the status of API calls.
82
+ endpoints (Dict[str, EndPoint]): A dictionary of endpoint objects.
83
+ base_url (str): The base URL for the Anthropic API.
84
+ available_endpoints (list): A list of available API endpoints, including
85
+ 'chat/completions'
86
+ key_scheme (str): The environment variable name for API key.
87
+ token_encoding_name (str): The default token encoding scheme.
88
+ """
89
+
90
+ from .anthropic import AnthropicService
91
+ return AnthropicService(**kwargs)
@@ -0,0 +1,46 @@
1
+ from typing import Union, str, Dict, Any
2
+ from transformers import pipeline, Conversation
3
+
4
+ from .base_service import BaseService
5
+
6
+ import functools
7
+ from concurrent.futures import ThreadPoolExecutor
8
+ import asyncio
9
+
10
+
11
+ def force_async(fn):
12
+ pool = ThreadPoolExecutor()
13
+
14
+ @functools.wraps(fn)
15
+ def wrapper(*args, **kwargs):
16
+ future = pool.submit(fn, *args, **kwargs)
17
+ return asyncio.wrap_future(future) # make it awaitable
18
+
19
+ return wrapper
20
+
21
+
22
+ class TransformersService(BaseService):
23
+ def __init__(self, task: str = None, model: Union[str, Any] = None, config: Union[str, Dict, Any] = None, **kwargs):
24
+ super().__init__()
25
+ self.task = task
26
+ self.model = model
27
+ self.config = config
28
+ self.pipe = pipeline(task=task, model=model, config=config, **kwargs)
29
+
30
+ @force_async
31
+ def serve_chat(self, messages, **kwargs):
32
+ if self.task:
33
+ if self.task != 'conversational':
34
+ raise ValueError(f"Invalid transformers pipeline task: {self.task}. Valid task: 'conversational'")
35
+
36
+ payload = {'messages': messages}
37
+ conversation = self.pipe(Conversation(messages), **kwargs)
38
+ completion = {"Conversation id": conversation.uuid,
39
+ "model": self.pipe.model,
40
+ "choices": [{
41
+ "message": conversation.messages[-1]
42
+ }]
43
+ }
44
+
45
+ return payload, completion
46
+
File without changes
@@ -2,7 +2,7 @@
2
2
 
3
3
  # ChatCompletion
4
4
  oai_chat_llmconfig = {
5
- "model": "gpt-4-1106-preview",
5
+ "model": "gpt-4-turbo-preview",
6
6
  "frequency_penalty": 0,
7
7
  "max_tokens": None,
8
8
  "n": 1,
@@ -1,5 +1,5 @@
1
1
  openrouter_chat_llmconfig = {
2
- "model": "gpt-4-1106-preview",
2
+ "model": "gpt-4-turbo-preview",
3
3
  "frequency_penalty": 0,
4
4
  "max_tokens": None,
5
5
  "n": 1,
lionagi/core/__init__.py CHANGED
@@ -1,15 +1,11 @@
1
- from .messages import System, Instruction
2
- from .instruction_set import InstructionSet
3
- from .conversation import Conversation
4
- from .branch import Branch
5
- from .sessions import Session
1
+ from .messages.messages import System, Instruction
2
+ from .branch.branch import Branch
3
+ from .sessions.session import Session
6
4
 
7
5
 
8
6
  __all__ = [
9
7
  'System',
10
8
  'Instruction',
11
- 'Conversation',
12
- 'InstructionSet',
13
9
  'Branch',
14
10
  'Session'
15
11
  ]
File without changes