lionagi 0.5.5__py3-none-any.whl → 0.6.1__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (433) hide show
  1. lionagi/__init__.py +18 -24
  2. lionagi/{core/_class_registry.py → _class_registry.py} +51 -10
  3. lionagi/_errors.py +35 -0
  4. lionagi/libs/__init__.py +3 -0
  5. lionagi/libs/compress/__init__.py +3 -0
  6. lionagi/libs/compress/models.py +6 -2
  7. lionagi/libs/compress/utils.py +4 -16
  8. lionagi/libs/file/__init__.py +3 -0
  9. lionagi/libs/file/chunk.py +4 -0
  10. lionagi/libs/file/file_ops.py +4 -0
  11. lionagi/libs/file/params.py +4 -41
  12. lionagi/libs/file/process.py +4 -0
  13. lionagi/libs/file/save.py +5 -1
  14. lionagi/libs/{parse/flatten → nested}/flatten.py +4 -0
  15. lionagi/libs/{parse/nested → nested}/nfilter.py +4 -0
  16. lionagi/libs/{parse/nested → nested}/nget.py +6 -1
  17. lionagi/libs/{parse/nested → nested}/ninsert.py +5 -1
  18. lionagi/libs/{parse/nested → nested}/nmerge.py +4 -0
  19. lionagi/libs/{parse/nested → nested}/npop.py +5 -2
  20. lionagi/libs/{parse/nested → nested}/nset.py +6 -1
  21. lionagi/libs/{parse/flatten → nested}/unflatten.py +4 -0
  22. lionagi/libs/{parse/nested → nested}/utils.py +5 -1
  23. lionagi/libs/package/__init__.py +3 -0
  24. lionagi/libs/package/imports.py +6 -2
  25. lionagi/libs/package/management.py +7 -3
  26. lionagi/libs/package/params.py +4 -0
  27. lionagi/libs/package/system.py +4 -0
  28. lionagi/libs/parse.py +30 -0
  29. lionagi/libs/{parse/json → schema}/as_readable.py +10 -4
  30. lionagi/libs/{parse/string_parse/code_block.py → schema/extract_code_block.py} +4 -0
  31. lionagi/libs/{parse/string_parse/docstring.py → schema/extract_docstring.py} +4 -0
  32. lionagi/libs/{parse/string_parse/function_.py → schema/function_to_schema.py} +21 -9
  33. lionagi/libs/{parse/json/schema.py → schema/json_schema.py} +5 -1
  34. lionagi/libs/validate/common_field_validators.py +170 -0
  35. lionagi/libs/{parse/validate/keys.py → validate/fuzzy_match_keys.py} +42 -8
  36. lionagi/libs/{parse/validate/mapping.py → validate/fuzzy_validate_mapping.py} +41 -6
  37. lionagi/libs/{string_similarity/algorithms.py → validate/string_similarity.py} +115 -1
  38. lionagi/libs/{parse/validate/boolean.py → validate/validate_boolean.py} +42 -3
  39. lionagi/operations/__init__.py +13 -3
  40. lionagi/operations/brainstorm/__init__.py +3 -3
  41. lionagi/operations/brainstorm/brainstorm.py +33 -19
  42. lionagi/operations/brainstorm/prompt.py +4 -0
  43. lionagi/operations/plan/__init__.py +4 -0
  44. lionagi/operations/plan/plan.py +19 -16
  45. lionagi/operations/plan/prompt.py +4 -0
  46. lionagi/operations/select/__init__.py +4 -0
  47. lionagi/operations/select/prompt.py +4 -0
  48. lionagi/operations/select/select.py +2 -2
  49. lionagi/operations/select/utils.py +4 -4
  50. lionagi/{strategies → operations/strategies}/base.py +6 -2
  51. lionagi/{strategies → operations/strategies}/concurrent.py +8 -5
  52. lionagi/{strategies → operations/strategies}/concurrent_chunk.py +6 -3
  53. lionagi/{strategies → operations/strategies}/concurrent_sequential_chunk.py +8 -4
  54. lionagi/{strategies → operations/strategies}/params.py +26 -6
  55. lionagi/{strategies → operations/strategies}/sequential.py +6 -2
  56. lionagi/{strategies → operations/strategies}/sequential_chunk.py +7 -3
  57. lionagi/{strategies → operations/strategies}/sequential_concurrent_chunk.py +9 -4
  58. lionagi/{strategies → operations/strategies}/utils.py +6 -3
  59. lionagi/operations/types.py +13 -0
  60. lionagi/operations/utils.py +6 -3
  61. lionagi/operatives/action/function_calling.py +136 -0
  62. lionagi/operatives/action/manager.py +236 -0
  63. lionagi/operatives/action/request_response_model.py +90 -0
  64. lionagi/operatives/action/tool.py +141 -0
  65. lionagi/{protocols/operatives/action.py → operatives/action/utils.py} +52 -90
  66. lionagi/{core → operatives}/forms/base.py +9 -4
  67. lionagi/{core → operatives}/forms/form.py +8 -13
  68. lionagi/{core → operatives}/forms/report.py +5 -3
  69. lionagi/operatives/instruct/base.py +79 -0
  70. lionagi/operatives/instruct/instruct.py +105 -0
  71. lionagi/operatives/instruct/instruct_collection.py +52 -0
  72. lionagi/operatives/instruct/node.py +13 -0
  73. lionagi/{protocols/operatives → operatives/instruct}/prompts.py +0 -34
  74. lionagi/{protocols/operatives → operatives/instruct}/reason.py +14 -7
  75. lionagi/{core/models/__init__.py → operatives/manager.py} +5 -1
  76. lionagi/operatives/models/field_model.py +194 -0
  77. lionagi/operatives/models/model_params.py +307 -0
  78. lionagi/{core → operatives}/models/note.py +20 -28
  79. lionagi/{core → operatives}/models/operable_model.py +153 -71
  80. lionagi/{core → operatives}/models/schema_model.py +4 -3
  81. lionagi/{protocols/operatives → operatives}/operative.py +10 -7
  82. lionagi/{protocols/operatives → operatives}/step.py +67 -26
  83. lionagi/operatives/types.py +69 -0
  84. lionagi/protocols/_concepts.py +94 -0
  85. lionagi/protocols/adapters/adapter.py +23 -7
  86. lionagi/protocols/adapters/json_adapter.py +72 -14
  87. lionagi/protocols/adapters/pandas_/csv_adapter.py +50 -0
  88. lionagi/protocols/adapters/pandas_/excel_adapter.py +52 -0
  89. lionagi/protocols/adapters/pandas_/pd_dataframe_adapter.py +31 -0
  90. lionagi/protocols/adapters/pandas_/pd_series_adapter.py +17 -0
  91. lionagi/protocols/adapters/types.py +18 -0
  92. lionagi/protocols/generic/element.py +460 -0
  93. lionagi/protocols/generic/event.py +177 -0
  94. lionagi/protocols/generic/log.py +237 -0
  95. lionagi/{core → protocols}/generic/pile.py +193 -131
  96. lionagi/protocols/generic/processor.py +316 -0
  97. lionagi/protocols/generic/progression.py +500 -0
  98. lionagi/protocols/graph/edge.py +166 -0
  99. lionagi/protocols/graph/graph.py +290 -0
  100. lionagi/protocols/graph/node.py +125 -0
  101. lionagi/protocols/mail/exchange.py +116 -0
  102. lionagi/protocols/mail/mail.py +25 -0
  103. lionagi/protocols/mail/mailbox.py +47 -0
  104. lionagi/protocols/mail/manager.py +168 -0
  105. lionagi/protocols/mail/package.py +55 -0
  106. lionagi/protocols/messages/action_request.py +165 -0
  107. lionagi/protocols/messages/action_response.py +132 -0
  108. lionagi/{core/communication → protocols/messages}/assistant_response.py +55 -79
  109. lionagi/protocols/messages/base.py +73 -0
  110. lionagi/protocols/messages/instruction.py +582 -0
  111. lionagi/protocols/messages/manager.py +429 -0
  112. lionagi/protocols/messages/message.py +216 -0
  113. lionagi/protocols/messages/system.py +115 -0
  114. lionagi/protocols/messages/templates/assistant_response.jinja2 +6 -0
  115. lionagi/{core/communication → protocols/messages}/templates/instruction_message.jinja2 +2 -2
  116. lionagi/protocols/types.py +96 -0
  117. lionagi/service/__init__.py +1 -16
  118. lionagi/service/endpoints/base.py +517 -0
  119. lionagi/service/endpoints/chat_completion.py +102 -0
  120. lionagi/service/endpoints/match_endpoint.py +60 -0
  121. lionagi/service/endpoints/rate_limited_processor.py +146 -0
  122. lionagi/service/endpoints/token_calculator.py +209 -0
  123. lionagi/service/imodel.py +263 -96
  124. lionagi/service/manager.py +45 -0
  125. lionagi/service/providers/anthropic_/messages.py +64 -0
  126. lionagi/service/providers/groq_/chat_completions.py +56 -0
  127. lionagi/service/providers/openai_/chat_completions.py +62 -0
  128. lionagi/service/providers/openrouter_/chat_completions.py +62 -0
  129. lionagi/service/providers/perplexity_/__init__.py +3 -0
  130. lionagi/service/providers/perplexity_/chat_completions.py +40 -0
  131. lionagi/service/types.py +18 -0
  132. lionagi/session/__init__.py +3 -0
  133. lionagi/session/branch.py +1287 -0
  134. lionagi/session/session.py +296 -0
  135. lionagi/settings.py +62 -118
  136. lionagi/utils.py +2386 -0
  137. lionagi/version.py +1 -1
  138. {lionagi-0.5.5.dist-info → lionagi-0.6.1.dist-info}/METADATA +10 -9
  139. lionagi-0.6.1.dist-info/RECORD +169 -0
  140. lionagi/core/action/action_manager.py +0 -289
  141. lionagi/core/action/base.py +0 -109
  142. lionagi/core/action/function_calling.py +0 -153
  143. lionagi/core/action/tool.py +0 -202
  144. lionagi/core/action/types.py +0 -16
  145. lionagi/core/communication/action_request.py +0 -163
  146. lionagi/core/communication/action_response.py +0 -149
  147. lionagi/core/communication/base_mail.py +0 -49
  148. lionagi/core/communication/instruction.py +0 -376
  149. lionagi/core/communication/message.py +0 -286
  150. lionagi/core/communication/message_manager.py +0 -543
  151. lionagi/core/communication/system.py +0 -116
  152. lionagi/core/communication/templates/assistant_response.jinja2 +0 -2
  153. lionagi/core/communication/types.py +0 -27
  154. lionagi/core/communication/utils.py +0 -256
  155. lionagi/core/forms/types.py +0 -13
  156. lionagi/core/generic/component.py +0 -422
  157. lionagi/core/generic/edge.py +0 -163
  158. lionagi/core/generic/element.py +0 -199
  159. lionagi/core/generic/graph.py +0 -377
  160. lionagi/core/generic/log.py +0 -151
  161. lionagi/core/generic/log_manager.py +0 -320
  162. lionagi/core/generic/node.py +0 -11
  163. lionagi/core/generic/progression.py +0 -395
  164. lionagi/core/generic/types.py +0 -23
  165. lionagi/core/generic/utils.py +0 -53
  166. lionagi/core/models/base.py +0 -28
  167. lionagi/core/models/field_model.py +0 -145
  168. lionagi/core/models/model_params.py +0 -194
  169. lionagi/core/models/types.py +0 -19
  170. lionagi/core/session/branch.py +0 -130
  171. lionagi/core/session/branch_mixins.py +0 -581
  172. lionagi/core/session/session.py +0 -163
  173. lionagi/core/session/types.py +0 -8
  174. lionagi/core/typing/__init__.py +0 -9
  175. lionagi/core/typing/_concepts.py +0 -173
  176. lionagi/core/typing/_id.py +0 -104
  177. lionagi/core/typing/_pydantic.py +0 -33
  178. lionagi/core/typing/_typing.py +0 -54
  179. lionagi/integrations/_services.py +0 -17
  180. lionagi/integrations/anthropic_/AnthropicModel.py +0 -268
  181. lionagi/integrations/anthropic_/AnthropicService.py +0 -127
  182. lionagi/integrations/anthropic_/anthropic_max_output_token_data.yaml +0 -12
  183. lionagi/integrations/anthropic_/anthropic_price_data.yaml +0 -34
  184. lionagi/integrations/anthropic_/api_endpoints/api_request.py +0 -277
  185. lionagi/integrations/anthropic_/api_endpoints/data_models.py +0 -40
  186. lionagi/integrations/anthropic_/api_endpoints/match_response.py +0 -119
  187. lionagi/integrations/anthropic_/api_endpoints/messages/request/message_models.py +0 -14
  188. lionagi/integrations/anthropic_/api_endpoints/messages/request/request_body.py +0 -74
  189. lionagi/integrations/anthropic_/api_endpoints/messages/response/__init__.py +0 -0
  190. lionagi/integrations/anthropic_/api_endpoints/messages/response/content_models.py +0 -32
  191. lionagi/integrations/anthropic_/api_endpoints/messages/response/response_body.py +0 -101
  192. lionagi/integrations/anthropic_/api_endpoints/messages/response/usage_models.py +0 -25
  193. lionagi/integrations/anthropic_/version.py +0 -5
  194. lionagi/integrations/groq_/GroqModel.py +0 -325
  195. lionagi/integrations/groq_/GroqService.py +0 -156
  196. lionagi/integrations/groq_/api_endpoints/__init__.py +0 -0
  197. lionagi/integrations/groq_/api_endpoints/data_models.py +0 -187
  198. lionagi/integrations/groq_/api_endpoints/groq_request.py +0 -288
  199. lionagi/integrations/groq_/api_endpoints/match_response.py +0 -106
  200. lionagi/integrations/groq_/api_endpoints/response_utils.py +0 -105
  201. lionagi/integrations/groq_/groq_max_output_token_data.yaml +0 -21
  202. lionagi/integrations/groq_/groq_price_data.yaml +0 -58
  203. lionagi/integrations/groq_/groq_rate_limits.yaml +0 -105
  204. lionagi/integrations/groq_/version.py +0 -5
  205. lionagi/integrations/litellm_/imodel.py +0 -76
  206. lionagi/integrations/ollama_/OllamaModel.py +0 -244
  207. lionagi/integrations/ollama_/OllamaService.py +0 -142
  208. lionagi/integrations/ollama_/api_endpoints/api_request.py +0 -179
  209. lionagi/integrations/ollama_/api_endpoints/chat_completion/message_models.py +0 -31
  210. lionagi/integrations/ollama_/api_endpoints/chat_completion/request_body.py +0 -46
  211. lionagi/integrations/ollama_/api_endpoints/chat_completion/response_body.py +0 -67
  212. lionagi/integrations/ollama_/api_endpoints/chat_completion/tool_models.py +0 -49
  213. lionagi/integrations/ollama_/api_endpoints/completion/__init__.py +0 -0
  214. lionagi/integrations/ollama_/api_endpoints/completion/request_body.py +0 -72
  215. lionagi/integrations/ollama_/api_endpoints/completion/response_body.py +0 -59
  216. lionagi/integrations/ollama_/api_endpoints/data_models.py +0 -15
  217. lionagi/integrations/ollama_/api_endpoints/embedding/__init__.py +0 -0
  218. lionagi/integrations/ollama_/api_endpoints/embedding/request_body.py +0 -33
  219. lionagi/integrations/ollama_/api_endpoints/embedding/response_body.py +0 -29
  220. lionagi/integrations/ollama_/api_endpoints/match_data_model.py +0 -62
  221. lionagi/integrations/ollama_/api_endpoints/match_response.py +0 -190
  222. lionagi/integrations/ollama_/api_endpoints/model/copy_model.py +0 -13
  223. lionagi/integrations/ollama_/api_endpoints/model/create_model.py +0 -28
  224. lionagi/integrations/ollama_/api_endpoints/model/delete_model.py +0 -11
  225. lionagi/integrations/ollama_/api_endpoints/model/list_model.py +0 -60
  226. lionagi/integrations/ollama_/api_endpoints/model/pull_model.py +0 -34
  227. lionagi/integrations/ollama_/api_endpoints/model/push_model.py +0 -35
  228. lionagi/integrations/ollama_/api_endpoints/model/show_model.py +0 -36
  229. lionagi/integrations/ollama_/api_endpoints/option_models.py +0 -68
  230. lionagi/integrations/openai_/OpenAIModel.py +0 -419
  231. lionagi/integrations/openai_/OpenAIService.py +0 -435
  232. lionagi/integrations/openai_/__init__.py +0 -0
  233. lionagi/integrations/openai_/api_endpoints/__init__.py +0 -3
  234. lionagi/integrations/openai_/api_endpoints/api_request.py +0 -277
  235. lionagi/integrations/openai_/api_endpoints/audio/__init__.py +0 -9
  236. lionagi/integrations/openai_/api_endpoints/audio/speech_models.py +0 -34
  237. lionagi/integrations/openai_/api_endpoints/audio/transcription_models.py +0 -136
  238. lionagi/integrations/openai_/api_endpoints/audio/translation_models.py +0 -41
  239. lionagi/integrations/openai_/api_endpoints/audio/types.py +0 -41
  240. lionagi/integrations/openai_/api_endpoints/batch/__init__.py +0 -17
  241. lionagi/integrations/openai_/api_endpoints/batch/batch_models.py +0 -146
  242. lionagi/integrations/openai_/api_endpoints/batch/cancel_batch.py +0 -7
  243. lionagi/integrations/openai_/api_endpoints/batch/create_batch.py +0 -26
  244. lionagi/integrations/openai_/api_endpoints/batch/list_batch.py +0 -37
  245. lionagi/integrations/openai_/api_endpoints/batch/request_object_models.py +0 -65
  246. lionagi/integrations/openai_/api_endpoints/batch/retrieve_batch.py +0 -7
  247. lionagi/integrations/openai_/api_endpoints/batch/types.py +0 -4
  248. lionagi/integrations/openai_/api_endpoints/chat_completions/__init__.py +0 -1
  249. lionagi/integrations/openai_/api_endpoints/chat_completions/request/__init__.py +0 -39
  250. lionagi/integrations/openai_/api_endpoints/chat_completions/request/message_models.py +0 -121
  251. lionagi/integrations/openai_/api_endpoints/chat_completions/request/request_body.py +0 -221
  252. lionagi/integrations/openai_/api_endpoints/chat_completions/request/response_format.py +0 -71
  253. lionagi/integrations/openai_/api_endpoints/chat_completions/request/stream_options.py +0 -14
  254. lionagi/integrations/openai_/api_endpoints/chat_completions/request/tool_choice_models.py +0 -17
  255. lionagi/integrations/openai_/api_endpoints/chat_completions/request/tool_models.py +0 -54
  256. lionagi/integrations/openai_/api_endpoints/chat_completions/request/types.py +0 -18
  257. lionagi/integrations/openai_/api_endpoints/chat_completions/response/__init__.py +0 -0
  258. lionagi/integrations/openai_/api_endpoints/chat_completions/response/choice_models.py +0 -62
  259. lionagi/integrations/openai_/api_endpoints/chat_completions/response/function_models.py +0 -16
  260. lionagi/integrations/openai_/api_endpoints/chat_completions/response/log_prob_models.py +0 -47
  261. lionagi/integrations/openai_/api_endpoints/chat_completions/response/message_models.py +0 -25
  262. lionagi/integrations/openai_/api_endpoints/chat_completions/response/response_body.py +0 -99
  263. lionagi/integrations/openai_/api_endpoints/chat_completions/response/types.py +0 -8
  264. lionagi/integrations/openai_/api_endpoints/chat_completions/response/usage_models.py +0 -24
  265. lionagi/integrations/openai_/api_endpoints/chat_completions/util.py +0 -46
  266. lionagi/integrations/openai_/api_endpoints/data_models.py +0 -23
  267. lionagi/integrations/openai_/api_endpoints/embeddings/__init__.py +0 -3
  268. lionagi/integrations/openai_/api_endpoints/embeddings/request_body.py +0 -79
  269. lionagi/integrations/openai_/api_endpoints/embeddings/response_body.py +0 -67
  270. lionagi/integrations/openai_/api_endpoints/files/__init__.py +0 -11
  271. lionagi/integrations/openai_/api_endpoints/files/delete_file.py +0 -20
  272. lionagi/integrations/openai_/api_endpoints/files/file_models.py +0 -56
  273. lionagi/integrations/openai_/api_endpoints/files/list_files.py +0 -27
  274. lionagi/integrations/openai_/api_endpoints/files/retrieve_file.py +0 -9
  275. lionagi/integrations/openai_/api_endpoints/files/upload_file.py +0 -38
  276. lionagi/integrations/openai_/api_endpoints/fine_tuning/__init__.py +0 -37
  277. lionagi/integrations/openai_/api_endpoints/fine_tuning/cancel_jobs.py +0 -9
  278. lionagi/integrations/openai_/api_endpoints/fine_tuning/create_jobs.py +0 -133
  279. lionagi/integrations/openai_/api_endpoints/fine_tuning/fine_tuning_job_checkpoint_models.py +0 -58
  280. lionagi/integrations/openai_/api_endpoints/fine_tuning/fine_tuning_job_event_models.py +0 -31
  281. lionagi/integrations/openai_/api_endpoints/fine_tuning/fine_tuning_job_models.py +0 -140
  282. lionagi/integrations/openai_/api_endpoints/fine_tuning/list_fine_tuning_checkpoints.py +0 -51
  283. lionagi/integrations/openai_/api_endpoints/fine_tuning/list_fine_tuning_events.py +0 -42
  284. lionagi/integrations/openai_/api_endpoints/fine_tuning/list_fine_tuning_jobs.py +0 -31
  285. lionagi/integrations/openai_/api_endpoints/fine_tuning/retrieve_jobs.py +0 -9
  286. lionagi/integrations/openai_/api_endpoints/fine_tuning/training_format.py +0 -30
  287. lionagi/integrations/openai_/api_endpoints/images/__init__.py +0 -9
  288. lionagi/integrations/openai_/api_endpoints/images/image_edit_models.py +0 -69
  289. lionagi/integrations/openai_/api_endpoints/images/image_models.py +0 -56
  290. lionagi/integrations/openai_/api_endpoints/images/image_variation_models.py +0 -56
  291. lionagi/integrations/openai_/api_endpoints/images/response_body.py +0 -30
  292. lionagi/integrations/openai_/api_endpoints/match_data_model.py +0 -197
  293. lionagi/integrations/openai_/api_endpoints/match_response.py +0 -336
  294. lionagi/integrations/openai_/api_endpoints/models/__init__.py +0 -7
  295. lionagi/integrations/openai_/api_endpoints/models/delete_fine_tuned_model.py +0 -17
  296. lionagi/integrations/openai_/api_endpoints/models/models_models.py +0 -31
  297. lionagi/integrations/openai_/api_endpoints/models/retrieve_model.py +0 -9
  298. lionagi/integrations/openai_/api_endpoints/moderations/__init__.py +0 -3
  299. lionagi/integrations/openai_/api_endpoints/moderations/request_body.py +0 -20
  300. lionagi/integrations/openai_/api_endpoints/moderations/response_body.py +0 -139
  301. lionagi/integrations/openai_/api_endpoints/uploads/__init__.py +0 -19
  302. lionagi/integrations/openai_/api_endpoints/uploads/add_upload_part.py +0 -11
  303. lionagi/integrations/openai_/api_endpoints/uploads/cancel_upload.py +0 -7
  304. lionagi/integrations/openai_/api_endpoints/uploads/complete_upload.py +0 -18
  305. lionagi/integrations/openai_/api_endpoints/uploads/create_upload.py +0 -17
  306. lionagi/integrations/openai_/api_endpoints/uploads/uploads_models.py +0 -52
  307. lionagi/integrations/openai_/image_token_calculator/__init__.py +0 -0
  308. lionagi/integrations/openai_/image_token_calculator/image_token_calculator.py +0 -98
  309. lionagi/integrations/openai_/image_token_calculator/openai_image_token_data.yaml +0 -15
  310. lionagi/integrations/openai_/openai_max_output_token_data.yaml +0 -12
  311. lionagi/integrations/openai_/openai_price_data.yaml +0 -26
  312. lionagi/integrations/openai_/version.py +0 -1
  313. lionagi/integrations/pandas_/__init__.py +0 -24
  314. lionagi/integrations/pandas_/extend_df.py +0 -61
  315. lionagi/integrations/pandas_/read.py +0 -103
  316. lionagi/integrations/pandas_/remove_rows.py +0 -61
  317. lionagi/integrations/pandas_/replace_keywords.py +0 -65
  318. lionagi/integrations/pandas_/save.py +0 -131
  319. lionagi/integrations/pandas_/search_keywords.py +0 -69
  320. lionagi/integrations/pandas_/to_df.py +0 -196
  321. lionagi/integrations/pandas_/update_cells.py +0 -54
  322. lionagi/integrations/perplexity_/PerplexityModel.py +0 -274
  323. lionagi/integrations/perplexity_/PerplexityService.py +0 -118
  324. lionagi/integrations/perplexity_/api_endpoints/__init__.py +0 -0
  325. lionagi/integrations/perplexity_/api_endpoints/api_request.py +0 -171
  326. lionagi/integrations/perplexity_/api_endpoints/chat_completions/__init__.py +0 -0
  327. lionagi/integrations/perplexity_/api_endpoints/chat_completions/request/__init__.py +0 -0
  328. lionagi/integrations/perplexity_/api_endpoints/chat_completions/request/request_body.py +0 -121
  329. lionagi/integrations/perplexity_/api_endpoints/chat_completions/response/__init__.py +0 -0
  330. lionagi/integrations/perplexity_/api_endpoints/chat_completions/response/response_body.py +0 -146
  331. lionagi/integrations/perplexity_/api_endpoints/data_models.py +0 -63
  332. lionagi/integrations/perplexity_/api_endpoints/match_response.py +0 -26
  333. lionagi/integrations/perplexity_/perplexity_max_output_token_data.yaml +0 -3
  334. lionagi/integrations/perplexity_/perplexity_price_data.yaml +0 -10
  335. lionagi/integrations/perplexity_/version.py +0 -1
  336. lionagi/integrations/pydantic_/__init__.py +0 -8
  337. lionagi/integrations/pydantic_/break_down_annotation.py +0 -81
  338. lionagi/integrations/pydantic_/new_model.py +0 -208
  339. lionagi/libs/constants.py +0 -98
  340. lionagi/libs/file/path.py +0 -301
  341. lionagi/libs/file/types.py +0 -22
  342. lionagi/libs/func/__init__.py +0 -0
  343. lionagi/libs/func/async_calls/__init__.py +0 -24
  344. lionagi/libs/func/async_calls/alcall.py +0 -210
  345. lionagi/libs/func/async_calls/bcall.py +0 -130
  346. lionagi/libs/func/async_calls/mcall.py +0 -134
  347. lionagi/libs/func/async_calls/pcall.py +0 -149
  348. lionagi/libs/func/async_calls/rcall.py +0 -217
  349. lionagi/libs/func/async_calls/tcall.py +0 -114
  350. lionagi/libs/func/async_calls/ucall.py +0 -85
  351. lionagi/libs/func/decorators.py +0 -277
  352. lionagi/libs/func/lcall.py +0 -57
  353. lionagi/libs/func/params.py +0 -64
  354. lionagi/libs/func/throttle.py +0 -119
  355. lionagi/libs/func/types.py +0 -39
  356. lionagi/libs/func/utils.py +0 -96
  357. lionagi/libs/package/types.py +0 -26
  358. lionagi/libs/parse/__init__.py +0 -1
  359. lionagi/libs/parse/flatten/__init__.py +0 -9
  360. lionagi/libs/parse/flatten/params.py +0 -52
  361. lionagi/libs/parse/json/__init__.py +0 -27
  362. lionagi/libs/parse/json/extract.py +0 -102
  363. lionagi/libs/parse/json/parse.py +0 -179
  364. lionagi/libs/parse/json/to_json.py +0 -71
  365. lionagi/libs/parse/nested/__init__.py +0 -33
  366. lionagi/libs/parse/nested/to_flat_list.py +0 -64
  367. lionagi/libs/parse/params.py +0 -0
  368. lionagi/libs/parse/string_parse/__init__.py +0 -11
  369. lionagi/libs/parse/type_convert/__init__.py +0 -19
  370. lionagi/libs/parse/type_convert/params.py +0 -145
  371. lionagi/libs/parse/type_convert/to_dict.py +0 -333
  372. lionagi/libs/parse/type_convert/to_list.py +0 -186
  373. lionagi/libs/parse/type_convert/to_num.py +0 -358
  374. lionagi/libs/parse/type_convert/to_str.py +0 -195
  375. lionagi/libs/parse/types.py +0 -9
  376. lionagi/libs/parse/validate/__init__.py +0 -14
  377. lionagi/libs/parse/validate/params.py +0 -62
  378. lionagi/libs/parse/xml/__init__.py +0 -10
  379. lionagi/libs/parse/xml/convert.py +0 -56
  380. lionagi/libs/parse/xml/parser.py +0 -93
  381. lionagi/libs/string_similarity/__init__.py +0 -32
  382. lionagi/libs/string_similarity/matcher.py +0 -102
  383. lionagi/libs/string_similarity/utils.py +0 -15
  384. lionagi/libs/utils.py +0 -266
  385. lionagi/protocols/adapters/pandas_adapter.py +0 -96
  386. lionagi/protocols/configs/__init__.py +0 -0
  387. lionagi/protocols/configs/branch_config.py +0 -86
  388. lionagi/protocols/configs/id_config.py +0 -15
  389. lionagi/protocols/configs/imodel_config.py +0 -73
  390. lionagi/protocols/configs/log_config.py +0 -93
  391. lionagi/protocols/configs/retry_config.py +0 -29
  392. lionagi/protocols/configs/types.py +0 -15
  393. lionagi/protocols/operatives/instruct.py +0 -194
  394. lionagi/protocols/operatives/types.py +0 -19
  395. lionagi/protocols/registries/_component_registry.py +0 -23
  396. lionagi/protocols/registries/_pile_registry.py +0 -30
  397. lionagi/service/complete_request_info.py +0 -11
  398. lionagi/service/rate_limiter.py +0 -108
  399. lionagi/service/service.py +0 -41
  400. lionagi/service/service_match_util.py +0 -131
  401. lionagi/service/service_util.py +0 -72
  402. lionagi/service/token_calculator.py +0 -51
  403. lionagi/strategies/__init__.py +0 -0
  404. lionagi/strategies/types.py +0 -21
  405. lionagi-0.5.5.dist-info/RECORD +0 -374
  406. /lionagi/{core → libs/nested}/__init__.py +0 -0
  407. /lionagi/{core/action → libs/schema}/__init__.py +0 -0
  408. /lionagi/{core/communication → libs/validate}/__init__.py +0 -0
  409. /lionagi/{core/forms → operations/strategies}/__init__.py +0 -0
  410. /lionagi/{core/generic → operatives}/__init__.py +0 -0
  411. /lionagi/{core/session → operatives/action}/__init__.py +0 -0
  412. /lionagi/{integrations/anthropic_ → operatives/forms}/__init__.py +0 -0
  413. /lionagi/{core → operatives}/forms/utils.py +0 -0
  414. /lionagi/{integrations/anthropic_/api_endpoints → operatives/instruct}/__init__.py +0 -0
  415. /lionagi/{integrations/anthropic_/api_endpoints/messages → operatives/models}/__init__.py +0 -0
  416. /lionagi/{integrations → protocols/adapters/pandas_}/__init__.py +0 -0
  417. /lionagi/{integrations/anthropic_/api_endpoints/messages/request → protocols/generic}/__init__.py +0 -0
  418. /lionagi/{integrations/groq_ → protocols/graph}/__init__.py +0 -0
  419. /lionagi/{integrations/litellm_ → protocols/mail}/__init__.py +0 -0
  420. /lionagi/{integrations/ollama_ → protocols/messages}/__init__.py +0 -0
  421. /lionagi/{core/communication → protocols/messages}/templates/README.md +0 -0
  422. /lionagi/{core/communication → protocols/messages}/templates/action_request.jinja2 +0 -0
  423. /lionagi/{core/communication → protocols/messages}/templates/action_response.jinja2 +0 -0
  424. /lionagi/{core/communication → protocols/messages}/templates/system_message.jinja2 +0 -0
  425. /lionagi/{core/communication → protocols/messages}/templates/tool_schemas.jinja2 +0 -0
  426. /lionagi/{integrations/ollama_/api_endpoints → service/endpoints}/__init__.py +0 -0
  427. /lionagi/{integrations/ollama_/api_endpoints/chat_completion → service/providers}/__init__.py +0 -0
  428. /lionagi/{integrations/ollama_/api_endpoints/model → service/providers/anthropic_}/__init__.py +0 -0
  429. /lionagi/{integrations/perplexity_ → service/providers/groq_}/__init__.py +0 -0
  430. /lionagi/{protocols/operatives → service/providers/openai_}/__init__.py +0 -0
  431. /lionagi/{protocols/registries → service/providers/openrouter_}/__init__.py +0 -0
  432. {lionagi-0.5.5.dist-info → lionagi-0.6.1.dist-info}/WHEEL +0 -0
  433. {lionagi-0.5.5.dist-info → lionagi-0.6.1.dist-info}/licenses/LICENSE +0 -0
@@ -2,56 +2,43 @@
2
2
  #
3
3
  # SPDX-License-Identifier: Apache-2.0
4
4
 
5
- from lionagi.libs.utils import is_same_dtype
6
-
7
- from ..typing._pydantic import (
8
- ConfigDict,
9
- Field,
10
- FieldInfo,
11
- PydanticUndefined,
12
- field_serializer,
13
- field_validator,
14
- )
15
- from ..typing._typing import UNDEFINED, Any, TypeVar, override
16
- from .base import BaseAutoModel
5
+ from typing import Any, Self, TypeVar
6
+
7
+ from pydantic import ConfigDict, Field, field_validator, model_validator
8
+ from pydantic.fields import FieldInfo
9
+ from pydantic_core import PydanticUndefined
10
+ from typing_extensions import override
11
+
12
+ from lionagi.utils import UNDEFINED, HashableModel, is_same_dtype
13
+
17
14
  from .field_model import FieldModel
18
15
 
19
- FIELD_NAME = TypeVar("FIELD_NAME", bound=str)
16
+ FieldName = TypeVar("FieldName", bound=str)
20
17
 
21
18
 
22
- class OperableModel(BaseAutoModel):
23
- """Model class supporting dynamic field management and operations.
19
+ __all__ = ("OperableModel",)
24
20
 
25
- Provides:
26
- - Dynamic field addition/updates
27
- - Field attribute access
28
- - Metadata tracking
29
- - Nested model serialization
30
21
 
31
- Example:
32
- ```python
33
- class DynamicModel(OperableModel):
34
- base_field: str = "base"
35
-
36
- model = DynamicModel()
37
-
38
- # Add field with validation
39
- def validate_positive(v: int) -> int:
40
- if v <= 0:
41
- raise ValueError("Must be positive")
42
- return v
43
-
44
- model.add_field(
45
- "age",
46
- value=25,
47
- annotation=int,
48
- validator=validate_positive
49
- )
50
- ```
22
+ class OperableModel(HashableModel):
23
+ """Base model supporting dynamic field management and operations.
24
+
25
+ This class extends Pydantic's model system to allow runtime field
26
+ modifications, attribute tracking, and nested model serialization.
27
+ Fields can be added, updated, and removed dynamically while maintaining
28
+ type safety and validation.
51
29
 
52
30
  Attributes:
53
- extra_fields: Dictionary storing dynamic field definitions
54
- model_config: Configuration forbidding extra direct fields
31
+ extra_fields: Dynamically added field definitions.
32
+ extra_field_models: Associated field models.
33
+
34
+ Example:
35
+ >>> class UserModel(OperableModel):
36
+ ... name: str = "default"
37
+ ...
38
+ >>> user = UserModel()
39
+ >>> user.add_field("age", value=25, annotation=int)
40
+ >>> user.age
41
+ 25
55
42
  """
56
43
 
57
44
  model_config = ConfigDict(
@@ -62,9 +49,18 @@ class OperableModel(BaseAutoModel):
62
49
  use_enum_values=True,
63
50
  )
64
51
 
65
- extra_fields: dict[str, Any] = Field(default_factory=dict)
52
+ extra_fields: dict[str, FieldInfo] | Any = Field(
53
+ default_factory=dict,
54
+ description="Dictionary of dynamically added field definitions",
55
+ exclude=True,
56
+ )
57
+
58
+ extra_field_models: dict[str, FieldModel] = Field(
59
+ default_factory=dict,
60
+ description="Dictionary of field models for dynamic fields",
61
+ exclude=True,
62
+ )
66
63
 
67
- @field_serializer("extra_fields")
68
64
  def _serialize_extra_fields(
69
65
  self,
70
66
  value: dict[str, FieldInfo],
@@ -72,17 +68,18 @@ class OperableModel(BaseAutoModel):
72
68
  """Serialize extra fields to dictionary format.
73
69
 
74
70
  Args:
75
- value: Dictionary of field name to FieldInfo mappings
71
+ value: Dictionary mapping field names to their FieldInfo objects.
76
72
 
77
73
  Returns:
78
- Dictionary of field name to value mappings,
79
- with nested models serialized
74
+ dict[str, Any]: Serialized field values.
80
75
  """
81
76
  output_dict = {}
82
77
  for k in value.keys():
83
78
  k_value = self.__dict__.get(k)
84
- if isinstance(k_value, BaseAutoModel):
79
+ if hasattr(k_value, "to_dict"):
85
80
  k_value = k_value.to_dict()
81
+ elif hasattr(k_value, "model_dump"):
82
+ k_value = k_value.model_dump()
86
83
  output_dict[k] = k_value
87
84
  return output_dict
88
85
 
@@ -91,16 +88,16 @@ class OperableModel(BaseAutoModel):
91
88
  cls,
92
89
  value: list[FieldModel] | dict[str, FieldModel | FieldInfo],
93
90
  ) -> dict[str, FieldInfo]:
94
- """Validate and convert extra fields to FieldInfo objects.
91
+ """Validate and normalize extra field definitions.
95
92
 
96
93
  Args:
97
- value: List of FieldModels or dict of field definitions
94
+ value: Field definitions as list or dictionary.
98
95
 
99
96
  Returns:
100
- Dictionary mapping field names to FieldInfo objects
97
+ dict[str, FieldInfo]: Normalized field definitions.
101
98
 
102
99
  Raises:
103
- ValueError: If value format is invalid
100
+ ValueError: If value format is invalid.
104
101
  """
105
102
  out = {}
106
103
  if isinstance(value, dict):
@@ -116,6 +113,63 @@ class OperableModel(BaseAutoModel):
116
113
 
117
114
  raise ValueError("Invalid extra_fields value")
118
115
 
116
+ @model_validator(mode="after")
117
+ def _validate_extra_field_models(self) -> Self:
118
+ """Validate and normalize extra field models after initial validation.
119
+
120
+ Returns:
121
+ Self: Validated instance with normalized extra fields.
122
+ """
123
+ extra_fields = {}
124
+ extra_field_models = {}
125
+
126
+ # Handle dict[str, FieldInfo | FieldModel]
127
+ if isinstance(self.extra_fields, dict):
128
+ for k, v in self.extra_fields.items():
129
+ if isinstance(v, FieldModel):
130
+ extra_fields[k] = v.field_info
131
+ extra_field_models[k] = v
132
+ elif isinstance(v, FieldInfo):
133
+ extra_fields[k] = v
134
+
135
+ # Handle list input
136
+ elif isinstance(self.extra_fields, list):
137
+ for v in self.extra_fields:
138
+ # list[FieldModel]
139
+ if isinstance(v, FieldModel):
140
+ extra_fields[v.name] = v.field_info
141
+ extra_field_models[v.name] = v
142
+
143
+ # Handle list[tuple[str, FieldInfo | FieldModel]]
144
+ if isinstance(v, tuple) and len(v) == 2:
145
+ if isinstance(v[0], str):
146
+ if isinstance(v[1], FieldInfo):
147
+ extra_fields[v[0]] = v[1]
148
+ if isinstance(v[1], FieldModel):
149
+ extra_fields[v[1].name] = v[1].field_info
150
+ extra_field_models[v[1].name] = v[1]
151
+
152
+ self.extra_fields = extra_fields
153
+ self.extra_field_models = extra_field_models
154
+ return self
155
+
156
+ @override
157
+ def __getattr__(self, field_name: str) -> Any:
158
+ """Get attribute value with metadata tracking.
159
+
160
+ Args:
161
+ field_name: Name of the field to get
162
+
163
+ Returns:
164
+ Field value
165
+
166
+ Raises:
167
+ AttributeError: If field not found
168
+ """
169
+ if field_name == "extra_field" or field_name in self.all_fields:
170
+ return self.__dict__.get(field_name, UNDEFINED)
171
+ raise AttributeError(f"Field {field_name} not found in object fields.")
172
+
119
173
  @override
120
174
  def __setattr__(self, field_name: str, value: Any) -> None:
121
175
  """Set attribute value with metadata tracking.
@@ -131,13 +185,41 @@ class OperableModel(BaseAutoModel):
131
185
  AttributeError: If attempting to directly assign to metadata or
132
186
  extra_fields
133
187
  """
188
+ if not callable(value) and field_name.startswith("__"):
189
+ raise AttributeError("Cannot directly assign to dunder fields")
190
+
191
+ if (
192
+ field_name in self.extra_field_models
193
+ and self.extra_field_models[field_name].validator is not UNDEFINED
194
+ ):
195
+ value = self.extra_field_models[field_name].validator(None, value)
134
196
  if field_name in self.extra_fields:
135
197
  object.__setattr__(self, field_name, value)
136
198
  else:
137
199
  super().__setattr__(field_name, value)
138
200
 
201
+ def __delattr__(self, field_name):
202
+ if field_name in self.extra_fields:
203
+ if self.extra_fields[field_name].default not in [
204
+ UNDEFINED,
205
+ PydanticUndefined,
206
+ ]:
207
+ setattr(
208
+ self, field_name, self.extra_fields[field_name].default
209
+ )
210
+ return
211
+ if self.extra_fields[field_name].default_factory is not UNDEFINED:
212
+ setattr(
213
+ self,
214
+ field_name,
215
+ self.extra_fields[field_name].default_factory(),
216
+ )
217
+ return
218
+
219
+ super().__delattr__(field_name)
220
+
139
221
  @override
140
- def to_dict(self, clean: bool = False) -> dict:
222
+ def to_dict(self) -> dict:
141
223
  """Convert model to dictionary including extra fields.
142
224
 
143
225
  Args:
@@ -147,13 +229,9 @@ class OperableModel(BaseAutoModel):
147
229
  Dictionary containing all fields and their values
148
230
  """
149
231
  dict_ = self.model_dump()
150
- dict_.pop("extra_fields")
151
232
  dict_.update(self._serialize_extra_fields(self.extra_fields))
152
- if clean:
153
- for k, v in dict_.items():
154
- if v is UNDEFINED:
155
- dict_.pop(k)
156
- return dict_
233
+ print(dict_)
234
+ return {k: v for k, v in dict_.items() if v is not UNDEFINED}
157
235
 
158
236
  @property
159
237
  def all_fields(self) -> dict[str, FieldInfo]:
@@ -169,7 +247,7 @@ class OperableModel(BaseAutoModel):
169
247
 
170
248
  def add_field(
171
249
  self,
172
- field_name: FIELD_NAME,
250
+ field_name: FieldName,
173
251
  /,
174
252
  value: Any = UNDEFINED,
175
253
  annotation: type = UNDEFINED,
@@ -204,7 +282,7 @@ class OperableModel(BaseAutoModel):
204
282
 
205
283
  def update_field(
206
284
  self,
207
- field_name: FIELD_NAME,
285
+ field_name: FieldName,
208
286
  /,
209
287
  value: Any = UNDEFINED,
210
288
  annotation: type = UNDEFINED,
@@ -249,6 +327,7 @@ class OperableModel(BaseAutoModel):
249
327
  "Invalid field_model, should be a FieldModel object"
250
328
  )
251
329
  self.extra_fields[field_name] = field_model.field_info
330
+ self.extra_field_models[field_name] = field_model
252
331
 
253
332
  # Handle kwargs
254
333
  if kwargs:
@@ -263,7 +342,7 @@ class OperableModel(BaseAutoModel):
263
342
  if field_name not in self.all_fields:
264
343
  self.extra_fields[field_name] = Field()
265
344
 
266
- field_obj = self.all_fields[field_name]
345
+ field_obj = self.extra_fields[field_name]
267
346
 
268
347
  # Handle annotation
269
348
  if annotation is not None:
@@ -273,6 +352,9 @@ class OperableModel(BaseAutoModel):
273
352
 
274
353
  # Handle value
275
354
  if value is UNDEFINED:
355
+ if field_name in self.all_fields:
356
+ if self.__dict__.get(field_name, UNDEFINED) is not UNDEFINED:
357
+ value = self.__dict__.get(field_name)
276
358
  if getattr(self, field_name, UNDEFINED) is not UNDEFINED:
277
359
  value = getattr(self, field_name)
278
360
  elif getattr(field_obj, "default") is not PydanticUndefined:
@@ -282,9 +364,15 @@ class OperableModel(BaseAutoModel):
282
364
 
283
365
  setattr(self, field_name, value)
284
366
 
367
+ def remove_field(self, field_name: FieldName, /):
368
+ if field_name in self.extra_fields:
369
+ del self.extra_fields[field_name]
370
+ if field_name in self.__dict__:
371
+ del self.__dict__[field_name]
372
+
285
373
  def field_setattr(
286
374
  self,
287
- field_name: FIELD_NAME,
375
+ field_name: FieldName,
288
376
  attr: str,
289
377
  value: Any,
290
378
  /,
@@ -312,7 +400,7 @@ class OperableModel(BaseAutoModel):
312
400
 
313
401
  def field_hasattr(
314
402
  self,
315
- field_name: FIELD_NAME,
403
+ field_name: FieldName,
316
404
  attr: str,
317
405
  /,
318
406
  ) -> bool:
@@ -342,7 +430,7 @@ class OperableModel(BaseAutoModel):
342
430
 
343
431
  def field_getattr(
344
432
  self,
345
- field_name: FIELD_NAME,
433
+ field_name: FieldName,
346
434
  attr: str,
347
435
  default: Any = UNDEFINED,
348
436
  /,
@@ -388,9 +476,3 @@ class OperableModel(BaseAutoModel):
388
476
  raise AttributeError(
389
477
  f"field {field_name} has no attribute {attr}",
390
478
  )
391
-
392
-
393
- __all__ = [
394
- "OperableModel",
395
- "FIELD_NAME",
396
- ]
@@ -2,13 +2,14 @@
2
2
  #
3
3
  # SPDX-License-Identifier: Apache-2.0
4
4
 
5
- from ..typing._pydantic import ConfigDict
6
- from .base import BaseAutoModel
5
+ from pydantic import ConfigDict
6
+
7
+ from lionagi.utils import HashableModel
7
8
 
8
9
  __all__ = ("SchemaModel",)
9
10
 
10
11
 
11
- class SchemaModel(BaseAutoModel):
12
+ class SchemaModel(HashableModel):
12
13
 
13
14
  model_config = ConfigDict(
14
15
  extra="forbid",
@@ -7,12 +7,14 @@ from typing import Self
7
7
  from pydantic import BaseModel, Field, PrivateAttr, model_validator
8
8
  from pydantic.fields import FieldInfo
9
9
 
10
- from lionagi.core.models import FieldModel, ModelParams, OperableModel
11
- from lionagi.core.typing import UNDEFINED
12
- from lionagi.libs.parse import to_json, validate_keys
10
+ from lionagi.libs.validate.fuzzy_match_keys import fuzzy_match_keys
11
+ from lionagi.operatives.models.schema_model import SchemaModel
12
+ from lionagi.utils import UNDEFINED, to_json
13
13
 
14
+ from .models.model_params import FieldModel, ModelParams
14
15
 
15
- class Operative(OperableModel):
16
+
17
+ class Operative(SchemaModel):
16
18
  """Class representing an operative that handles request and response models for operations."""
17
19
 
18
20
  name: str | None = None
@@ -22,11 +24,12 @@ class Operative(OperableModel):
22
24
 
23
25
  response_params: ModelParams | None = Field(default=None)
24
26
  response_type: type[BaseModel] | None = Field(default=None)
25
- response_model: OperableModel | None = Field(default=None)
27
+ response_model: BaseModel | None = Field(default=None)
26
28
  response_str_dict: dict | str | None = Field(default=None)
27
29
 
28
30
  auto_retry_parse: bool = True
29
31
  max_retries: int = 3
32
+ parse_kwargs: dict | None = None
30
33
  _should_retry: bool = PrivateAttr(default=None)
31
34
 
32
35
  @model_validator(mode="after")
@@ -51,7 +54,7 @@ class Operative(OperableModel):
51
54
  if isinstance(d_, list | tuple) and len(d_) == 1:
52
55
  d_ = d_[0]
53
56
  try:
54
- d_ = validate_keys(
57
+ d_ = fuzzy_match_keys(
55
58
  d_, self.request_type.model_fields, handle_unmatched="raise"
56
59
  )
57
60
  d_ = {k: v for k, v in d_.items() if v != UNDEFINED}
@@ -72,7 +75,7 @@ class Operative(OperableModel):
72
75
  d_ = to_json(text, fuzzy_parse=True)
73
76
  if isinstance(d_, list | tuple) and len(d_) == 1:
74
77
  d_ = d_[0]
75
- d_ = validate_keys(
78
+ d_ = fuzzy_match_keys(
76
79
  d_, self.request_type.model_fields, handle_unmatched="force"
77
80
  )
78
81
  d_ = {k: v for k, v in d_.items() if v != UNDEFINED}
@@ -2,20 +2,21 @@
2
2
  #
3
3
  # SPDX-License-Identifier: Apache-2.0
4
4
 
5
- from pydantic import BaseModel
5
+ from pydantic import BaseModel, Field
6
6
  from pydantic.fields import FieldInfo
7
7
 
8
- from lionagi.core.typing import FieldModel, ModelParams
9
- from lionagi.protocols.operatives.operative import Operative
8
+ from lionagi.operatives.instruct.reason import REASON_FIELD, Reason
9
+ from lionagi.operatives.operative import Operative
10
10
 
11
- from .action import (
11
+ from .action.request_response_model import (
12
12
  ACTION_REQUESTS_FIELD,
13
- ACTION_REQUIRED_FIELD,
14
13
  ACTION_RESPONSES_FIELD,
15
14
  ActionRequestModel,
16
15
  ActionResponseModel,
17
16
  )
18
- from .reason import REASON_FIELD, ReasonModel
17
+ from .action.utils import ACTION_REQUIRED_FIELD
18
+ from .models.field_model import FieldModel
19
+ from .models.model_params import ModelParams
19
20
 
20
21
 
21
22
  class StepModel(BaseModel):
@@ -23,13 +24,13 @@ class StepModel(BaseModel):
23
24
 
24
25
  title: str
25
26
  description: str
26
- reason: ReasonModel | None = REASON_FIELD.field_info
27
- action_requests: list[ActionRequestModel] = (
28
- ACTION_REQUESTS_FIELD.field_info
27
+ reason: Reason | None = Field(**REASON_FIELD.to_dict())
28
+ action_requests: list[ActionRequestModel] = Field(
29
+ **ACTION_REQUESTS_FIELD.to_dict()
29
30
  )
30
- action_required: bool = ACTION_REQUIRED_FIELD.field_info
31
- action_responses: list[ActionResponseModel] = (
32
- ACTION_RESPONSES_FIELD.field_info
31
+ action_required: bool = Field(**ACTION_REQUIRED_FIELD.to_dict())
32
+ action_responses: list[ActionResponseModel] = Field(
33
+ **ACTION_RESPONSES_FIELD.to_dict()
33
34
  )
34
35
 
35
36
 
@@ -39,6 +40,7 @@ class Step:
39
40
  @staticmethod
40
41
  def request_operative(
41
42
  *,
43
+ operative: Operative = None,
42
44
  operative_name: str | None = None,
43
45
  reason: bool = False,
44
46
  actions: bool = False,
@@ -53,6 +55,9 @@ class Step:
53
55
  config_dict: dict | None = None,
54
56
  doc: str | None = None,
55
57
  frozen: bool = False,
58
+ max_retries: int = None,
59
+ auto_retry_parse: bool = True,
60
+ parse_kwargs: dict | None = None,
56
61
  ) -> Operative:
57
62
  """Creates an Operative instance configured for request handling.
58
63
 
@@ -71,36 +76,61 @@ class Step:
71
76
  config_dict (dict | None, optional): Configuration dictionary.
72
77
  doc (str | None, optional): Documentation string.
73
78
  frozen (bool, optional): Whether the model is frozen.
79
+ max_retries (int, optional): Maximum number of retries.
74
80
 
75
81
  Returns:
76
82
  Operative: The configured operative instance.
77
83
  """
78
84
 
85
+ params = {}
86
+ if operative:
87
+ params = operative.model_dump()
88
+ request_params = operative.request_params.model_dump()
89
+ field_models = request_params.field_models
90
+
79
91
  field_models = field_models or []
80
92
  exclude_fields = exclude_fields or []
81
93
  field_descriptions = field_descriptions or {}
82
- if reason:
94
+ if reason and REASON_FIELD not in field_models:
83
95
  field_models.append(REASON_FIELD)
84
- if actions:
96
+ if actions and ACTION_REQUESTS_FIELD not in field_models:
85
97
  field_models.extend(
86
98
  [
87
99
  ACTION_REQUESTS_FIELD,
88
100
  ACTION_REQUIRED_FIELD,
89
101
  ]
90
102
  )
91
- request_params = request_params or ModelParams(
92
- parameter_fields=parameter_fields,
93
- base_type=base_type,
94
- field_models=field_models,
95
- exclude_fields=exclude_fields,
96
- name=new_model_name,
97
- field_descriptions=field_descriptions,
98
- inherit_base=inherit_base,
99
- config_dict=config_dict,
100
- doc=doc,
101
- frozen=frozen,
103
+
104
+ if isinstance(request_params, ModelParams):
105
+ request_params = request_params.model_dump()
106
+
107
+ request_params = request_params or {}
108
+ request_params_fields = {
109
+ "parameter_fields": parameter_fields,
110
+ "field_models": field_models,
111
+ "exclude_fields": exclude_fields,
112
+ "field_descriptions": field_descriptions,
113
+ "inherit_base": inherit_base,
114
+ "config_dict": config_dict,
115
+ "doc": doc,
116
+ "frozen": frozen,
117
+ "base_type": base_type,
118
+ "name": new_model_name,
119
+ }
120
+ request_params.update(
121
+ {k: v for k, v in request_params_fields.items() if v is not None}
102
122
  )
103
- return Operative(name=operative_name, request_params=request_params)
123
+ request_params = ModelParams(**request_params)
124
+ if max_retries:
125
+ params["max_retries"] = max_retries
126
+ if operative_name:
127
+ params["name"] = operative_name
128
+ if isinstance(auto_retry_parse, bool):
129
+ params["auto_retry_parse"] = auto_retry_parse
130
+ if parse_kwargs:
131
+ params["parse_kwargs"] = parse_kwargs
132
+ params["request_params"] = request_params
133
+ return Operative(**params)
104
134
 
105
135
  @staticmethod
106
136
  def respond_operative(
@@ -132,6 +162,17 @@ class Step:
132
162
 
133
163
  additional_data = additional_data or {}
134
164
  field_models = field_models or []
165
+ if hasattr(operative.response_model, "action_required"):
166
+ field_models.extend(
167
+ [
168
+ ACTION_RESPONSES_FIELD,
169
+ ACTION_REQUIRED_FIELD,
170
+ ACTION_REQUESTS_FIELD,
171
+ ]
172
+ )
173
+ if "reason" in operative.response_model.model_fields:
174
+ field_models.extend([REASON_FIELD])
175
+
135
176
  operative = Step._create_response_type(
136
177
  operative=operative,
137
178
  response_params=response_params,
@@ -0,0 +1,69 @@
1
+ # Copyright (c) 2023 - 2024, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from .action.function_calling import FunctionCalling
6
+ from .action.manager import ActionManager
7
+ from .action.request_response_model import (
8
+ ActionRequestModel,
9
+ ActionResponseModel,
10
+ )
11
+ from .action.tool import FuncTool, FuncToolRef, Tool, ToolRef
12
+ from .forms.base import BaseForm
13
+ from .forms.form import Form
14
+ from .forms.report import Report
15
+ from .instruct.base import (
16
+ ACTIONS_FIELD,
17
+ CONTEXT_FIELD,
18
+ GUIDANCE_FIELD,
19
+ INSTRUCTION_FIELD,
20
+ REASON_FIELD,
21
+ )
22
+ from .instruct.instruct import (
23
+ INSTRUCT_FIELD,
24
+ LIST_INSTRUCT_FIELD_MODEL,
25
+ Instruct,
26
+ InstructResponse,
27
+ )
28
+ from .instruct.node import InstructNode
29
+ from .instruct.reason import CONFIDENCE_SCORE_FIELD, REASON_FIELD, Reason
30
+ from .models.field_model import FieldModel
31
+ from .models.model_params import ModelParams
32
+ from .models.note import Note
33
+ from .models.operable_model import OperableModel
34
+ from .models.schema_model import SchemaModel
35
+ from .operative import Operative
36
+ from .step import Step
37
+
38
+ __all__ = (
39
+ "ActionManager",
40
+ "ActionRequestModel",
41
+ "ActionResponseModel",
42
+ "BaseForm",
43
+ "CONFIDENCE_SCORE_FIELD",
44
+ "CONTEXT_FIELD",
45
+ "Form",
46
+ "GUIDANCE_FIELD",
47
+ "INSTRUCT_FIELD",
48
+ "INSTRUCTION_FIELD",
49
+ "Instruct",
50
+ "InstructNode",
51
+ "InstructResponse",
52
+ "LIST_INSTRUCT_FIELD_MODEL",
53
+ "ModelParams",
54
+ "Note",
55
+ "OperableModel",
56
+ "Operative",
57
+ "REASON_FIELD",
58
+ "Reason",
59
+ "Report",
60
+ "SchemaModel",
61
+ "Step",
62
+ "Tool",
63
+ "ToolRef",
64
+ "ACTIONS_FIELD",
65
+ "FieldModel",
66
+ "FuncTool",
67
+ "FuncToolRef",
68
+ "FunctionCalling",
69
+ )