lionagi 0.0.312__py3-none-any.whl → 0.2.1__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 (268) hide show
  1. lionagi/__init__.py +61 -3
  2. lionagi/core/__init__.py +0 -14
  3. lionagi/core/_setting/_setting.py +59 -0
  4. lionagi/core/action/__init__.py +14 -0
  5. lionagi/core/action/function_calling.py +136 -0
  6. lionagi/core/action/manual.py +1 -0
  7. lionagi/core/action/node.py +109 -0
  8. lionagi/core/action/tool.py +114 -0
  9. lionagi/core/action/tool_manager.py +356 -0
  10. lionagi/core/agent/__init__.py +0 -3
  11. lionagi/core/agent/base_agent.py +45 -36
  12. lionagi/core/agent/eval/evaluator.py +1 -0
  13. lionagi/core/agent/eval/vote.py +40 -0
  14. lionagi/core/agent/learn/learner.py +59 -0
  15. lionagi/core/agent/plan/unit_template.py +1 -0
  16. lionagi/core/collections/__init__.py +17 -0
  17. lionagi/core/collections/_logger.py +319 -0
  18. lionagi/core/collections/abc/__init__.py +53 -0
  19. lionagi/core/collections/abc/component.py +615 -0
  20. lionagi/core/collections/abc/concepts.py +297 -0
  21. lionagi/core/collections/abc/exceptions.py +150 -0
  22. lionagi/core/collections/abc/util.py +45 -0
  23. lionagi/core/collections/exchange.py +161 -0
  24. lionagi/core/collections/flow.py +426 -0
  25. lionagi/core/collections/model.py +419 -0
  26. lionagi/core/collections/pile.py +913 -0
  27. lionagi/core/collections/progression.py +236 -0
  28. lionagi/core/collections/util.py +64 -0
  29. lionagi/core/director/direct.py +314 -0
  30. lionagi/core/director/director.py +2 -0
  31. lionagi/core/engine/branch_engine.py +333 -0
  32. lionagi/core/engine/instruction_map_engine.py +204 -0
  33. lionagi/core/engine/sandbox_.py +14 -0
  34. lionagi/core/engine/script_engine.py +99 -0
  35. lionagi/core/executor/base_executor.py +90 -0
  36. lionagi/core/executor/graph_executor.py +330 -0
  37. lionagi/core/executor/neo4j_executor.py +384 -0
  38. lionagi/core/generic/__init__.py +7 -0
  39. lionagi/core/generic/edge.py +112 -0
  40. lionagi/core/generic/edge_condition.py +16 -0
  41. lionagi/core/generic/graph.py +236 -0
  42. lionagi/core/generic/hyperedge.py +1 -0
  43. lionagi/core/generic/node.py +220 -0
  44. lionagi/core/generic/tree.py +48 -0
  45. lionagi/core/generic/tree_node.py +79 -0
  46. lionagi/core/mail/__init__.py +7 -3
  47. lionagi/core/mail/mail.py +25 -0
  48. lionagi/core/mail/mail_manager.py +142 -58
  49. lionagi/core/mail/package.py +45 -0
  50. lionagi/core/mail/start_mail.py +36 -0
  51. lionagi/core/message/__init__.py +19 -0
  52. lionagi/core/message/action_request.py +133 -0
  53. lionagi/core/message/action_response.py +135 -0
  54. lionagi/core/message/assistant_response.py +95 -0
  55. lionagi/core/message/instruction.py +234 -0
  56. lionagi/core/message/message.py +101 -0
  57. lionagi/core/message/system.py +86 -0
  58. lionagi/core/message/util.py +283 -0
  59. lionagi/core/report/__init__.py +4 -0
  60. lionagi/core/report/base.py +217 -0
  61. lionagi/core/report/form.py +231 -0
  62. lionagi/core/report/report.py +166 -0
  63. lionagi/core/report/util.py +28 -0
  64. lionagi/core/rule/__init__.py +0 -0
  65. lionagi/core/rule/_default.py +16 -0
  66. lionagi/core/rule/action.py +99 -0
  67. lionagi/core/rule/base.py +238 -0
  68. lionagi/core/rule/boolean.py +56 -0
  69. lionagi/core/rule/choice.py +47 -0
  70. lionagi/core/rule/mapping.py +96 -0
  71. lionagi/core/rule/number.py +71 -0
  72. lionagi/core/rule/rulebook.py +109 -0
  73. lionagi/core/rule/string.py +52 -0
  74. lionagi/core/rule/util.py +35 -0
  75. lionagi/core/session/__init__.py +0 -3
  76. lionagi/core/session/branch.py +431 -0
  77. lionagi/core/session/directive_mixin.py +287 -0
  78. lionagi/core/session/session.py +230 -902
  79. lionagi/core/structure/__init__.py +1 -0
  80. lionagi/core/structure/chain.py +1 -0
  81. lionagi/core/structure/forest.py +1 -0
  82. lionagi/core/structure/graph.py +1 -0
  83. lionagi/core/structure/tree.py +1 -0
  84. lionagi/core/unit/__init__.py +5 -0
  85. lionagi/core/unit/parallel_unit.py +245 -0
  86. lionagi/core/unit/template/__init__.py +0 -0
  87. lionagi/core/unit/template/action.py +81 -0
  88. lionagi/core/unit/template/base.py +51 -0
  89. lionagi/core/unit/template/plan.py +84 -0
  90. lionagi/core/unit/template/predict.py +109 -0
  91. lionagi/core/unit/template/score.py +124 -0
  92. lionagi/core/unit/template/select.py +104 -0
  93. lionagi/core/unit/unit.py +362 -0
  94. lionagi/core/unit/unit_form.py +305 -0
  95. lionagi/core/unit/unit_mixin.py +1168 -0
  96. lionagi/core/unit/util.py +71 -0
  97. lionagi/core/validator/__init__.py +0 -0
  98. lionagi/core/validator/validator.py +364 -0
  99. lionagi/core/work/__init__.py +0 -0
  100. lionagi/core/work/work.py +76 -0
  101. lionagi/core/work/work_function.py +101 -0
  102. lionagi/core/work/work_queue.py +103 -0
  103. lionagi/core/work/worker.py +258 -0
  104. lionagi/core/work/worklog.py +120 -0
  105. lionagi/experimental/__init__.py +0 -0
  106. lionagi/experimental/compressor/__init__.py +0 -0
  107. lionagi/experimental/compressor/base.py +46 -0
  108. lionagi/experimental/compressor/llm_compressor.py +247 -0
  109. lionagi/experimental/compressor/llm_summarizer.py +61 -0
  110. lionagi/experimental/compressor/util.py +70 -0
  111. lionagi/experimental/directive/__init__.py +19 -0
  112. lionagi/experimental/directive/parser/__init__.py +0 -0
  113. lionagi/experimental/directive/parser/base_parser.py +282 -0
  114. lionagi/experimental/directive/template/__init__.py +0 -0
  115. lionagi/experimental/directive/template/base_template.py +79 -0
  116. lionagi/experimental/directive/template/schema.py +36 -0
  117. lionagi/experimental/directive/tokenizer.py +73 -0
  118. lionagi/experimental/evaluator/__init__.py +0 -0
  119. lionagi/experimental/evaluator/ast_evaluator.py +131 -0
  120. lionagi/experimental/evaluator/base_evaluator.py +218 -0
  121. lionagi/experimental/knowledge/__init__.py +0 -0
  122. lionagi/experimental/knowledge/base.py +10 -0
  123. lionagi/experimental/knowledge/graph.py +0 -0
  124. lionagi/experimental/memory/__init__.py +0 -0
  125. lionagi/experimental/strategies/__init__.py +0 -0
  126. lionagi/experimental/strategies/base.py +1 -0
  127. lionagi/integrations/bridge/autogen_/__init__.py +0 -0
  128. lionagi/integrations/bridge/autogen_/autogen_.py +124 -0
  129. lionagi/integrations/bridge/langchain_/documents.py +4 -0
  130. lionagi/integrations/bridge/llamaindex_/index.py +30 -0
  131. lionagi/integrations/bridge/llamaindex_/llama_index_bridge.py +6 -0
  132. lionagi/integrations/bridge/llamaindex_/llama_pack.py +227 -0
  133. lionagi/integrations/bridge/llamaindex_/node_parser.py +6 -9
  134. lionagi/integrations/bridge/pydantic_/pydantic_bridge.py +1 -0
  135. lionagi/integrations/bridge/transformers_/__init__.py +0 -0
  136. lionagi/integrations/bridge/transformers_/install_.py +36 -0
  137. lionagi/integrations/chunker/__init__.py +0 -0
  138. lionagi/integrations/chunker/chunk.py +312 -0
  139. lionagi/integrations/config/oai_configs.py +38 -7
  140. lionagi/integrations/config/ollama_configs.py +1 -1
  141. lionagi/integrations/config/openrouter_configs.py +14 -2
  142. lionagi/integrations/loader/__init__.py +0 -0
  143. lionagi/integrations/loader/load.py +253 -0
  144. lionagi/integrations/loader/load_util.py +195 -0
  145. lionagi/integrations/provider/_mapping.py +46 -0
  146. lionagi/integrations/provider/litellm.py +2 -1
  147. lionagi/integrations/provider/mlx_service.py +16 -9
  148. lionagi/integrations/provider/oai.py +91 -4
  149. lionagi/integrations/provider/ollama.py +7 -6
  150. lionagi/integrations/provider/openrouter.py +115 -8
  151. lionagi/integrations/provider/services.py +2 -2
  152. lionagi/integrations/provider/transformers.py +18 -22
  153. lionagi/integrations/storage/__init__.py +3 -0
  154. lionagi/integrations/storage/neo4j.py +665 -0
  155. lionagi/integrations/storage/storage_util.py +287 -0
  156. lionagi/integrations/storage/structure_excel.py +285 -0
  157. lionagi/integrations/storage/to_csv.py +63 -0
  158. lionagi/integrations/storage/to_excel.py +83 -0
  159. lionagi/libs/__init__.py +26 -1
  160. lionagi/libs/ln_api.py +78 -23
  161. lionagi/libs/ln_context.py +37 -0
  162. lionagi/libs/ln_convert.py +21 -9
  163. lionagi/libs/ln_func_call.py +69 -28
  164. lionagi/libs/ln_image.py +107 -0
  165. lionagi/libs/ln_knowledge_graph.py +405 -0
  166. lionagi/libs/ln_nested.py +26 -11
  167. lionagi/libs/ln_parse.py +110 -14
  168. lionagi/libs/ln_queue.py +117 -0
  169. lionagi/libs/ln_tokenize.py +164 -0
  170. lionagi/{core/prompt/field_validator.py → libs/ln_validate.py} +79 -14
  171. lionagi/libs/special_tokens.py +172 -0
  172. lionagi/libs/sys_util.py +107 -2
  173. lionagi/lions/__init__.py +0 -0
  174. lionagi/lions/coder/__init__.py +0 -0
  175. lionagi/lions/coder/add_feature.py +20 -0
  176. lionagi/lions/coder/base_prompts.py +22 -0
  177. lionagi/lions/coder/code_form.py +13 -0
  178. lionagi/lions/coder/coder.py +168 -0
  179. lionagi/lions/coder/util.py +96 -0
  180. lionagi/lions/researcher/__init__.py +0 -0
  181. lionagi/lions/researcher/data_source/__init__.py +0 -0
  182. lionagi/lions/researcher/data_source/finhub_.py +191 -0
  183. lionagi/lions/researcher/data_source/google_.py +199 -0
  184. lionagi/lions/researcher/data_source/wiki_.py +96 -0
  185. lionagi/lions/researcher/data_source/yfinance_.py +21 -0
  186. lionagi/tests/integrations/__init__.py +0 -0
  187. lionagi/tests/libs/__init__.py +0 -0
  188. lionagi/tests/libs/test_field_validators.py +353 -0
  189. lionagi/tests/{test_libs → libs}/test_func_call.py +23 -21
  190. lionagi/tests/{test_libs → libs}/test_nested.py +36 -21
  191. lionagi/tests/{test_libs → libs}/test_parse.py +1 -1
  192. lionagi/tests/libs/test_queue.py +67 -0
  193. lionagi/tests/test_core/collections/__init__.py +0 -0
  194. lionagi/tests/test_core/collections/test_component.py +206 -0
  195. lionagi/tests/test_core/collections/test_exchange.py +138 -0
  196. lionagi/tests/test_core/collections/test_flow.py +145 -0
  197. lionagi/tests/test_core/collections/test_pile.py +171 -0
  198. lionagi/tests/test_core/collections/test_progression.py +129 -0
  199. lionagi/tests/test_core/generic/__init__.py +0 -0
  200. lionagi/tests/test_core/generic/test_edge.py +67 -0
  201. lionagi/tests/test_core/generic/test_graph.py +96 -0
  202. lionagi/tests/test_core/generic/test_node.py +106 -0
  203. lionagi/tests/test_core/generic/test_tree_node.py +73 -0
  204. lionagi/tests/test_core/test_branch.py +115 -292
  205. lionagi/tests/test_core/test_form.py +46 -0
  206. lionagi/tests/test_core/test_report.py +105 -0
  207. lionagi/tests/test_core/test_validator.py +111 -0
  208. lionagi/version.py +1 -1
  209. {lionagi-0.0.312.dist-info → lionagi-0.2.1.dist-info}/LICENSE +12 -11
  210. {lionagi-0.0.312.dist-info → lionagi-0.2.1.dist-info}/METADATA +19 -118
  211. lionagi-0.2.1.dist-info/RECORD +240 -0
  212. lionagi/core/branch/__init__.py +0 -4
  213. lionagi/core/branch/base_branch.py +0 -654
  214. lionagi/core/branch/branch.py +0 -471
  215. lionagi/core/branch/branch_flow_mixin.py +0 -96
  216. lionagi/core/branch/executable_branch.py +0 -347
  217. lionagi/core/branch/util.py +0 -323
  218. lionagi/core/direct/__init__.py +0 -6
  219. lionagi/core/direct/predict.py +0 -161
  220. lionagi/core/direct/score.py +0 -278
  221. lionagi/core/direct/select.py +0 -169
  222. lionagi/core/direct/utils.py +0 -87
  223. lionagi/core/direct/vote.py +0 -64
  224. lionagi/core/flow/base/baseflow.py +0 -23
  225. lionagi/core/flow/monoflow/ReAct.py +0 -238
  226. lionagi/core/flow/monoflow/__init__.py +0 -9
  227. lionagi/core/flow/monoflow/chat.py +0 -95
  228. lionagi/core/flow/monoflow/chat_mixin.py +0 -263
  229. lionagi/core/flow/monoflow/followup.py +0 -214
  230. lionagi/core/flow/polyflow/__init__.py +0 -1
  231. lionagi/core/flow/polyflow/chat.py +0 -248
  232. lionagi/core/mail/schema.py +0 -56
  233. lionagi/core/messages/__init__.py +0 -3
  234. lionagi/core/messages/schema.py +0 -533
  235. lionagi/core/prompt/prompt_template.py +0 -316
  236. lionagi/core/schema/__init__.py +0 -22
  237. lionagi/core/schema/action_node.py +0 -29
  238. lionagi/core/schema/base_mixin.py +0 -296
  239. lionagi/core/schema/base_node.py +0 -199
  240. lionagi/core/schema/condition.py +0 -24
  241. lionagi/core/schema/data_logger.py +0 -354
  242. lionagi/core/schema/data_node.py +0 -93
  243. lionagi/core/schema/prompt_template.py +0 -67
  244. lionagi/core/schema/structure.py +0 -910
  245. lionagi/core/tool/__init__.py +0 -3
  246. lionagi/core/tool/tool_manager.py +0 -280
  247. lionagi/integrations/bridge/pydantic_/base_model.py +0 -7
  248. lionagi/tests/test_core/test_base_branch.py +0 -427
  249. lionagi/tests/test_core/test_chat_flow.py +0 -63
  250. lionagi/tests/test_core/test_mail_manager.py +0 -75
  251. lionagi/tests/test_core/test_prompts.py +0 -51
  252. lionagi/tests/test_core/test_session.py +0 -254
  253. lionagi/tests/test_core/test_session_base_util.py +0 -312
  254. lionagi/tests/test_core/test_tool_manager.py +0 -95
  255. lionagi-0.0.312.dist-info/RECORD +0 -111
  256. /lionagi/core/{branch/base → _setting}/__init__.py +0 -0
  257. /lionagi/core/{flow → agent/eval}/__init__.py +0 -0
  258. /lionagi/core/{flow/base → agent/learn}/__init__.py +0 -0
  259. /lionagi/core/{prompt → agent/plan}/__init__.py +0 -0
  260. /lionagi/core/{tool/manual.py → agent/plan/plan.py} +0 -0
  261. /lionagi/{tests/test_integrations → core/director}/__init__.py +0 -0
  262. /lionagi/{tests/test_libs → core/engine}/__init__.py +0 -0
  263. /lionagi/{tests/test_libs/test_async.py → core/executor/__init__.py} +0 -0
  264. /lionagi/tests/{test_libs → libs}/test_api.py +0 -0
  265. /lionagi/tests/{test_libs → libs}/test_convert.py +0 -0
  266. /lionagi/tests/{test_libs → libs}/test_sys_util.py +0 -0
  267. {lionagi-0.0.312.dist-info → lionagi-0.2.1.dist-info}/WHEEL +0 -0
  268. {lionagi-0.0.312.dist-info → lionagi-0.2.1.dist-info}/top_level.txt +0 -0
@@ -1,13 +1,18 @@
1
+ import re
1
2
  from lionagi.libs.sys_util import SysUtil
2
3
  import lionagi.libs.ln_convert as convert
3
4
  from lionagi.libs.ln_api import BaseService
4
5
  from lionagi.integrations.config.mlx_configs import model
5
6
 
6
7
 
7
- class MlXService(BaseService):
8
+ class MLXService(BaseService):
8
9
  def __init__(self, model=model, **kwargs):
9
10
 
10
11
  SysUtil.check_import("mlx_lm")
12
+ SysUtil.check_import("ipywidgets")
13
+
14
+ if model is not None and "olmo" in str(model).lower():
15
+ SysUtil.check_import("olmo", pip_name="ai2-olmo")
11
16
 
12
17
  from mlx_lm import load, generate
13
18
 
@@ -19,16 +24,13 @@ class MlXService(BaseService):
19
24
  self.model = model_
20
25
  self.tokenizer = tokenizer
21
26
  self.generate = generate
27
+ self.allowed_kwargs = []
22
28
 
23
29
  async def serve_chat(self, messages, **kwargs):
24
30
  if "verbose" not in kwargs.keys():
25
- verbose = True
31
+ verbose = False
26
32
 
27
- prompts = [
28
- convert.to_dict(msg["content"])["instruction"]
29
- for msg in messages
30
- if msg["role"] == "user"
31
- ]
33
+ prompts = [msg["content"] for msg in messages if msg["role"] == "user"]
32
34
 
33
35
  payload = {"messages": messages}
34
36
 
@@ -39,8 +41,13 @@ class MlXService(BaseService):
39
41
  prompt=f"{prompts[-1]} \nOutput: ",
40
42
  verbose=verbose,
41
43
  )
42
- completion = {"model": self.model_name, "choices": [{"message": response}]}
43
-
44
+ if "```" in response:
45
+ regex = re.compile(r"```[\s\S]*?```")
46
+ matches = regex.findall(response)
47
+ msg = matches[0].strip("```")
48
+ completion = {"choices": [{"message": {"content": msg}}]}
49
+ else:
50
+ completion = {"choices": [{"message": {"content": response}}]}
44
51
  return payload, completion
45
52
  except Exception as e:
46
53
  self.status_tracker.num_tasks_failed += 1
@@ -1,8 +1,46 @@
1
+ """
2
+ Copyright 2024 HaiyangLi
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ """
16
+
1
17
  from os import getenv
2
18
  from lionagi.integrations.config.oai_configs import oai_schema
3
19
  from lionagi.libs.ln_api import BaseService, PayloadPackage
4
20
 
5
21
 
22
+ allowed_kwargs = [
23
+ "model",
24
+ "frequency_penalty",
25
+ "n",
26
+ "presence_penalty",
27
+ "response_format",
28
+ "temperature",
29
+ "top_p",
30
+ "seed",
31
+ "stop",
32
+ "stream",
33
+ "stream_options",
34
+ "tools",
35
+ "tool_choice",
36
+ "user",
37
+ "max_tokens",
38
+ "logprobs",
39
+ "top_logprobs",
40
+ "logit_bias",
41
+ ]
42
+
43
+
6
44
  class OpenAIService(BaseService):
7
45
  """
8
46
  A service to interact with OpenAI's API endpoints.
@@ -30,6 +68,7 @@ class OpenAIService(BaseService):
30
68
  "audio_speech",
31
69
  "audio_transcriptions",
32
70
  "audio_translations",
71
+ "embeddings",
33
72
  ]
34
73
  schema = oai_schema
35
74
  key_scheme = "OPENAI_API_KEY"
@@ -51,6 +90,7 @@ class OpenAIService(BaseService):
51
90
  **kwargs,
52
91
  )
53
92
  self.active_endpoint = []
93
+ self.allowed_kwargs = allowed_kwargs
54
94
 
55
95
  async def serve(self, input_, endpoint="chat/completions", method="post", **kwargs):
56
96
  """
@@ -84,7 +124,7 @@ class OpenAIService(BaseService):
84
124
  else:
85
125
  return ValueError(f"{endpoint} is currently not supported")
86
126
 
87
- async def serve_chat(self, messages, **kwargs):
127
+ async def serve_chat(self, messages, required_tokens=None, **kwargs):
88
128
  """
89
129
  Serves the chat completion request with the given messages.
90
130
 
@@ -101,16 +141,63 @@ class OpenAIService(BaseService):
101
141
  if "chat/completions" not in self.active_endpoint:
102
142
  await self.init_endpoint("chat/completions")
103
143
  self.active_endpoint.append("chat/completions")
144
+
145
+ msgs = []
146
+
147
+ for msg in messages:
148
+ if isinstance(msg, dict):
149
+ content = msg.get("content")
150
+ if isinstance(content, (dict, str)):
151
+ msgs.append({"role": msg["role"], "content": content})
152
+ elif isinstance(content, list):
153
+ _content = []
154
+ for i in content:
155
+ if "text" in i:
156
+ _content.append({"type": "text", "text": str(i["text"])})
157
+ elif "image_url" in i:
158
+ _content.append(
159
+ {
160
+ "type": "image_url",
161
+ "image_url": {
162
+ "url": f"{i['image_url'].get('url')}",
163
+ "detail": i["image_url"].get("detail", "low"),
164
+ },
165
+ }
166
+ )
167
+ msgs.append({"role": msg["role"], "content": _content})
168
+
104
169
  payload = PayloadPackage.chat_completion(
105
- messages,
170
+ msgs,
106
171
  self.endpoints["chat/completions"].config,
107
172
  self.schema["chat/completions"],
108
173
  **kwargs,
109
174
  )
110
-
111
175
  try:
112
- completion = await self.call_api(payload, "chat/completions", "post")
176
+ completion = await self.call_api(
177
+ payload, "chat/completions", "post", required_tokens=required_tokens
178
+ )
113
179
  return payload, completion
114
180
  except Exception as e:
115
181
  self.status_tracker.num_tasks_failed += 1
116
182
  raise e
183
+
184
+ async def serve_embedding(self, embed_str, required_tokens=None, **kwargs):
185
+ if "embeddings" not in self.active_endpoint:
186
+ await self.init_endpoint("embeddings")
187
+ self.active_endpoint.append("embeddings")
188
+
189
+ payload = PayloadPackage.embeddings(
190
+ embed_str,
191
+ self.endpoints["embeddings"].config,
192
+ self.schema["embeddings"],
193
+ **kwargs,
194
+ )
195
+
196
+ try:
197
+ embed = await self.call_api(
198
+ payload, "embeddings", "post", required_tokens=required_tokens
199
+ )
200
+ return payload, embed
201
+ except Exception as e:
202
+ self.status_tracker.num_tasks_failed += 1
203
+ raise e
@@ -4,14 +4,14 @@ from lionagi.integrations.config.ollama_configs import model
4
4
  allowed_kwargs = [
5
5
  "model",
6
6
  "frequency_penalty",
7
- "max_tokens",
7
+ # "max_tokens",
8
8
  "n",
9
9
  "presence_penalty",
10
10
  "response_format",
11
11
  "seed",
12
12
  "stop",
13
13
  "stream",
14
- "temperature",
14
+ # "temperature",
15
15
  "top_p",
16
16
  "tools",
17
17
  "tool_choice",
@@ -32,7 +32,8 @@ class OllamaService(BaseService):
32
32
 
33
33
  self.ollama = ollama
34
34
  self.model = model
35
- self.client = self.ollama.AsyncClient(**kwargs)
35
+ self.client = self.ollama.AsyncClient()
36
+ self.allowed_kwargs = allowed_kwargs
36
37
 
37
38
  async def serve_chat(self, messages, **kwargs):
38
39
  config = {}
@@ -42,11 +43,11 @@ class OllamaService(BaseService):
42
43
 
43
44
  self.ollama.pull(self.model)
44
45
  payload = {"messages": messages}
46
+ if "model" not in config:
47
+ config["model"] = self.model
45
48
 
46
49
  try:
47
- completion = await self.client.chat(
48
- model=self.model, messages=messages, **config
49
- )
50
+ completion = await self.client.chat(messages=messages, **config)
50
51
  completion["choices"] = [{"message": completion.pop("message")}]
51
52
  return payload, completion
52
53
  except Exception as e:
@@ -2,6 +2,27 @@ from os import getenv
2
2
  from lionagi.integrations.config.openrouter_configs import openrouter_schema
3
3
  from lionagi.libs.ln_api import BaseService, PayloadPackage
4
4
 
5
+ allowed_kwargs = [
6
+ "model",
7
+ "frequency_penalty",
8
+ "n",
9
+ "presence_penalty",
10
+ "response_format",
11
+ "temperature",
12
+ "top_p",
13
+ "seed",
14
+ "stop",
15
+ "stream",
16
+ "stream_options",
17
+ "tools",
18
+ "tool_choice",
19
+ "user",
20
+ "max_tokens",
21
+ "logprobs",
22
+ "top_logprobs",
23
+ "logit_bias",
24
+ ]
25
+
5
26
 
6
27
  class OpenRouterService(BaseService):
7
28
  base_url = "https://openrouter.ai/api/v1/"
@@ -26,8 +47,33 @@ class OpenRouterService(BaseService):
26
47
  **kwargs,
27
48
  )
28
49
  self.active_endpoint = []
50
+ self.allowed_kwargs = allowed_kwargs
29
51
 
30
52
  async def serve(self, input_, endpoint="chat/completions", method="post", **kwargs):
53
+ """
54
+ Serves the input using the specified endpoint and method.
55
+
56
+ Args:
57
+ input_: The input text to be processed.
58
+ endpoint: The API endpoint to use for processing.
59
+ method: The HTTP method to use for the request.
60
+ **kwargs: Additional keyword arguments to pass to the payload creation.
61
+
62
+ Returns:
63
+ A tuple containing the payload and the completion assistant_response from the API.
64
+
65
+ Raises:
66
+ ValueError: If the specified endpoint is not supported.
67
+
68
+ Examples:
69
+ >>> service = OpenAIService(api_key="your_api_key")
70
+ >>> asyncio.run(service.serve("Hello, world!","chat/completions"))
71
+ (payload, completion)
72
+
73
+ >>> service = OpenAIService()
74
+ >>> asyncio.run(service.serve("Convert this text to speech.","audio_speech"))
75
+ ValueError: 'audio_speech' is currently not supported
76
+ """
31
77
  if endpoint not in self.active_endpoint:
32
78
  await self.init_endpoint(endpoint)
33
79
  if endpoint == "chat/completions":
@@ -35,19 +81,80 @@ class OpenRouterService(BaseService):
35
81
  else:
36
82
  return ValueError(f"{endpoint} is currently not supported")
37
83
 
38
- async def serve_chat(self, messages, **kwargs):
39
- endpoint = "chat/completions"
84
+ async def serve_chat(self, messages, required_tokens=None, **kwargs):
85
+ """
86
+ Serves the chat completion request with the given messages.
87
+
88
+ Args:
89
+ messages: The messages to be included in the chat completion.
90
+ **kwargs: Additional keyword arguments for payload creation.
91
+
92
+ Returns:
93
+ A tuple containing the payload and the completion assistant_response from the API.
94
+
95
+ Raises:
96
+ Exception: If the API call fails.
97
+ """
98
+ if "chat/completions" not in self.active_endpoint:
99
+ await self.init_endpoint("chat/completions")
100
+ self.active_endpoint.append("chat/completions")
101
+
102
+ msgs = []
103
+
104
+ for msg in messages:
105
+ if isinstance(msg, dict):
106
+ content = msg.get("content")
107
+ if isinstance(content, (dict, str)):
108
+ msgs.append({"role": msg["role"], "content": content})
109
+ elif isinstance(content, list):
110
+ _content = []
111
+ for i in content:
112
+ if "text" in i:
113
+ _content.append({"type": "text", "text": str(i["text"])})
114
+ elif "image_url" in i:
115
+ _content.append(
116
+ {
117
+ "type": "image_url",
118
+ "image_url": {
119
+ "url": f"{i['image_url'].get('url')}",
120
+ "detail": i["image_url"].get("detail", "low"),
121
+ },
122
+ }
123
+ )
124
+ msgs.append({"role": msg["role"], "content": _content})
40
125
 
41
- if endpoint not in self.active_endpoint:
42
- await self.init_endpoint(endpoint)
43
- self.active_endpoint.append(endpoint)
44
126
  payload = PayloadPackage.chat_completion(
45
- messages, self.endpoints[endpoint].config, self.schema[endpoint], **kwargs
127
+ msgs,
128
+ self.endpoints["chat/completions"].config,
129
+ self.schema["chat/completions"],
130
+ **kwargs,
46
131
  )
47
-
48
132
  try:
49
- completion = await self.call_api(payload, endpoint, "post")
133
+ completion = await self.call_api(
134
+ payload, "chat/completions", "post", required_tokens=required_tokens
135
+ )
50
136
  return payload, completion
51
137
  except Exception as e:
52
138
  self.status_tracker.num_tasks_failed += 1
53
139
  raise e
140
+
141
+ # async def serve_embedding(self, embed_str, required_tokens=None, **kwargs):
142
+ # if "embeddings" not in self.active_endpoint:
143
+ # await self.init_endpoint("embeddings")
144
+ # self.active_endpoint.append("embeddings")
145
+
146
+ # payload = PayloadPackage.embeddings(
147
+ # embed_str,
148
+ # self.endpoints["embeddings"].config,
149
+ # self.schema["embeddings"],
150
+ # **kwargs,
151
+ # )
152
+
153
+ # try:
154
+ # embed = await self.call_api(
155
+ # payload, "embeddings", "post", required_tokens=required_tokens
156
+ # )
157
+ # return payload, embed
158
+ # except Exception as e:
159
+ # self.status_tracker.num_tasks_failed += 1
160
+ # raise e
@@ -131,6 +131,6 @@ class Services:
131
131
  kwargs (Optional[Any]): additional kwargs for calling the model
132
132
  """
133
133
 
134
- from lionagi.integrations.provider.mlx_service import MlXService
134
+ from lionagi.integrations.provider.mlx_service import MLXService
135
135
 
136
- return MlXService(**kwargs)
136
+ return MLXService(**kwargs)
@@ -5,7 +5,7 @@ from lionagi.libs.sys_util import SysUtil
5
5
  from lionagi.libs.ln_api import BaseService
6
6
 
7
7
  allowed_kwargs = [
8
- "model",
8
+ # "model",
9
9
  "tokenizer",
10
10
  "modelcard",
11
11
  "framework",
@@ -17,6 +17,9 @@ allowed_kwargs = [
17
17
  "torch_dtype",
18
18
  "min_length_for_response",
19
19
  "minimum_tokens",
20
+ "mask_token",
21
+ "max_length",
22
+ "max_new_tokens",
20
23
  ]
21
24
 
22
25
 
@@ -52,6 +55,7 @@ class TransformersService(BaseService):
52
55
  self.task = task
53
56
  self.model = model
54
57
  self.config = config
58
+ self.allowed_kwargs = allowed_kwargs
55
59
  try:
56
60
  from transformers import pipeline
57
61
 
@@ -59,19 +63,11 @@ class TransformersService(BaseService):
59
63
  except ImportError:
60
64
  try:
61
65
  if not SysUtil.is_package_installed("torch"):
62
- in_ = input(
63
- "PyTorch is required for transformers. Would you like to install it now? (y/n): "
64
- )
65
- if in_ == "y":
66
- install_pytorch()
66
+ install_pytorch()
67
67
  if not SysUtil.is_package_installed("transformers"):
68
- in_ = input(
69
- "transformers is required. Would you like to install it now? (y/n): "
68
+ SysUtil.install_import(
69
+ package_name="transformers", import_name="pipeline"
70
70
  )
71
- if in_ == "y":
72
- SysUtil.install_import(
73
- package_name="transformers", import_name="pipeline"
74
- )
75
71
  from transformers import pipeline
76
72
 
77
73
  self.pipeline = pipeline
@@ -92,19 +88,19 @@ class TransformersService(BaseService):
92
88
  payload = {"messages": messages}
93
89
  config = {}
94
90
  for k, v in kwargs.items():
91
+ if k == "max_tokens":
92
+ config["max_new_tokens"] = v
95
93
  if k in allowed_kwargs:
96
94
  config[k] = v
97
95
 
98
- conversation = self.pipe(str(messages), **config)
99
-
100
- texts = conversation[-1]["generated_text"]
101
- msgs = (
102
- str(texts.split("]")[1:])
103
- .replace("\\n", "")
104
- .replace("['", "")
105
- .replace("\\", "")
106
- )
96
+ msg = "".join([i["content"] for i in messages if i["role"] == "user"])
97
+ conversation = ""
98
+ response = self.pipe(msg, **config)
99
+ try:
100
+ conversation = response[0]["generated_text"]
101
+ except:
102
+ conversation = response
107
103
 
108
- completion = {"model": self.pipe.model, "choices": [{"message": msgs}]}
104
+ completion = {"choices": [{"message": {"content": conversation}}]}
109
105
 
110
106
  return payload, completion
@@ -0,0 +1,3 @@
1
+ # from lionagi.integrations.storage.neo4j import Neo4j
2
+ #
3
+ # __all__ = ["Neo4j"]