lionagi 0.3.2__tar.gz → 0.3.3__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (237) hide show
  1. {lionagi-0.3.2 → lionagi-0.3.3}/PKG-INFO +1 -1
  2. lionagi-0.3.3/lionagi/lions/judge/config.py +8 -0
  3. lionagi-0.3.3/lionagi/lions/judge/data/sample_codes.py +526 -0
  4. lionagi-0.3.3/lionagi/lions/judge/data/sample_rurbic.py +48 -0
  5. lionagi-0.3.3/lionagi/lions/judge/forms/__init__.py +0 -0
  6. lionagi-0.3.3/lionagi/lions/judge/forms/code_analysis_form.py +126 -0
  7. lionagi-0.3.3/lionagi/lions/judge/rubric.py +34 -0
  8. lionagi-0.3.3/lionagi/lions/judge/services/__init__.py +0 -0
  9. lionagi-0.3.3/lionagi/lions/judge/services/judge_code.py +49 -0
  10. lionagi-0.3.3/lionagi/lions/researcher/__init__.py +0 -0
  11. lionagi-0.3.3/lionagi/lions/researcher/data_source/__init__.py +0 -0
  12. lionagi-0.3.3/lionagi/version.py +1 -0
  13. {lionagi-0.3.2 → lionagi-0.3.3}/pyproject.toml +1 -1
  14. lionagi-0.3.2/lionagi/version.py +0 -1
  15. {lionagi-0.3.2 → lionagi-0.3.3}/LICENSE +0 -0
  16. {lionagi-0.3.2 → lionagi-0.3.3}/README.md +0 -0
  17. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/__init__.py +0 -0
  18. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/__init__.py +0 -0
  19. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/_setting/__init__.py +0 -0
  20. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/_setting/_setting.py +0 -0
  21. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/action/README.md +0 -0
  22. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/action/__init__.py +0 -0
  23. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/action/function_calling.py +0 -0
  24. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/action/manual.py +0 -0
  25. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/action/node.py +0 -0
  26. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/action/tool.py +0 -0
  27. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/action/tool_manager.py +0 -0
  28. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/agent/README.md +0 -0
  29. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/agent/__init__.py +0 -0
  30. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/agent/base_agent.py +0 -0
  31. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/agent/eval/README.md +0 -0
  32. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/agent/eval/__init__.py +0 -0
  33. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/agent/eval/evaluator.py +0 -0
  34. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/agent/eval/vote.py +0 -0
  35. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/agent/learn/__init__.py +0 -0
  36. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/agent/learn/learner.py +0 -0
  37. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/agent/plan/__init__.py +0 -0
  38. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/agent/plan/plan.py +0 -0
  39. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/agent/plan/unit_template.py +0 -0
  40. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/collections/README.md +0 -0
  41. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/collections/__init__.py +0 -0
  42. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/collections/_logger.py +0 -0
  43. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/collections/abc/README.md +0 -0
  44. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/collections/abc/__init__.py +0 -0
  45. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/collections/abc/component.py +0 -0
  46. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/collections/abc/concepts.py +0 -0
  47. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/collections/abc/exceptions.py +0 -0
  48. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/collections/abc/util.py +0 -0
  49. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/collections/exchange.py +0 -0
  50. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/collections/flow.py +0 -0
  51. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/collections/model.py +0 -0
  52. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/collections/pile.py +0 -0
  53. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/collections/progression.py +0 -0
  54. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/collections/util.py +0 -0
  55. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/director/README.md +0 -0
  56. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/director/__init__.py +0 -0
  57. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/director/direct.py +0 -0
  58. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/director/director.py +0 -0
  59. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/engine/__init__.py +0 -0
  60. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/engine/branch_engine.py +0 -0
  61. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/engine/instruction_map_engine.py +0 -0
  62. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/engine/sandbox_.py +0 -0
  63. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/engine/script_engine.py +0 -0
  64. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/executor/__init__.py +0 -0
  65. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/executor/base_executor.py +0 -0
  66. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/executor/graph_executor.py +0 -0
  67. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/executor/neo4j_executor.py +0 -0
  68. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/generic/README.md +0 -0
  69. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/generic/__init__.py +0 -0
  70. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/generic/edge.py +0 -0
  71. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/generic/edge_condition.py +0 -0
  72. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/generic/graph.py +0 -0
  73. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/generic/hyperedge.py +0 -0
  74. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/generic/node.py +0 -0
  75. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/generic/tree.py +0 -0
  76. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/generic/tree_node.py +0 -0
  77. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/mail/__init__.py +0 -0
  78. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/mail/mail.py +0 -0
  79. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/mail/mail_manager.py +0 -0
  80. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/mail/package.py +0 -0
  81. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/mail/start_mail.py +0 -0
  82. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/message/__init__.py +0 -0
  83. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/message/action_request.py +0 -0
  84. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/message/action_response.py +0 -0
  85. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/message/assistant_response.py +0 -0
  86. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/message/instruction.py +0 -0
  87. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/message/message.py +0 -0
  88. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/message/system.py +0 -0
  89. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/message/util.py +0 -0
  90. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/report/__init__.py +0 -0
  91. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/report/base.py +0 -0
  92. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/report/form.py +0 -0
  93. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/report/report.py +0 -0
  94. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/report/util.py +0 -0
  95. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/rule/__init__.py +0 -0
  96. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/rule/_default.py +0 -0
  97. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/rule/action.py +0 -0
  98. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/rule/base.py +0 -0
  99. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/rule/boolean.py +0 -0
  100. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/rule/choice.py +0 -0
  101. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/rule/mapping.py +0 -0
  102. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/rule/number.py +0 -0
  103. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/rule/rulebook.py +0 -0
  104. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/rule/string.py +0 -0
  105. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/rule/util.py +0 -0
  106. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/session/__init__.py +0 -0
  107. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/session/branch.py +0 -0
  108. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/session/directive_mixin.py +0 -0
  109. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/session/session.py +0 -0
  110. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/structure/__init__.py +0 -0
  111. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/structure/chain.py +0 -0
  112. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/structure/forest.py +0 -0
  113. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/structure/graph.py +0 -0
  114. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/structure/tree.py +0 -0
  115. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/unit/__init__.py +0 -0
  116. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/unit/parallel_unit.py +0 -0
  117. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/unit/template/__init__.py +0 -0
  118. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/unit/template/action.py +0 -0
  119. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/unit/template/base.py +0 -0
  120. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/unit/template/plan.py +0 -0
  121. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/unit/template/predict.py +0 -0
  122. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/unit/template/score.py +0 -0
  123. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/unit/template/select.py +0 -0
  124. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/unit/unit.py +0 -0
  125. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/unit/unit_form.py +0 -0
  126. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/unit/unit_mixin.py +0 -0
  127. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/unit/util.py +0 -0
  128. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/validator/__init__.py +0 -0
  129. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/validator/validator.py +0 -0
  130. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/work/__init__.py +0 -0
  131. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/work/work.py +0 -0
  132. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/work/work_edge.py +0 -0
  133. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/work/work_function.py +0 -0
  134. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/work/work_function_node.py +0 -0
  135. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/work/work_queue.py +0 -0
  136. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/work/work_task.py +0 -0
  137. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/work/worker.py +0 -0
  138. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/work/worker_engine.py +0 -0
  139. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/core/work/worklog.py +0 -0
  140. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/__init__.py +0 -0
  141. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/compressor/__init__.py +0 -0
  142. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/compressor/base.py +0 -0
  143. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/compressor/llm_compressor.py +0 -0
  144. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/compressor/llm_summarizer.py +0 -0
  145. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/compressor/util.py +0 -0
  146. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/directive/README.md +0 -0
  147. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/directive/__init__.py +0 -0
  148. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/directive/parser/__init__.py +0 -0
  149. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/directive/parser/base_parser.py +0 -0
  150. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/directive/parser/base_syntax.txt +0 -0
  151. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/directive/template/__init__.py +0 -0
  152. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/directive/template/base_template.py +0 -0
  153. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/directive/template/schema.py +0 -0
  154. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/directive/tokenizer.py +0 -0
  155. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/evaluator/README.md +0 -0
  156. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/evaluator/__init__.py +0 -0
  157. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/evaluator/ast_evaluator.py +0 -0
  158. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/evaluator/base_evaluator.py +0 -0
  159. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/knowledge/__init__.py +0 -0
  160. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/knowledge/base.py +0 -0
  161. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/knowledge/graph.py +0 -0
  162. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/memory/__init__.py +0 -0
  163. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/strategies/__init__.py +0 -0
  164. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/experimental/strategies/base.py +0 -0
  165. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/__init__.py +0 -0
  166. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/bridge/__init__.py +0 -0
  167. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/bridge/autogen_/__init__.py +0 -0
  168. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/bridge/autogen_/autogen_.py +0 -0
  169. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/bridge/langchain_/__init__.py +0 -0
  170. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/bridge/langchain_/documents.py +0 -0
  171. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/bridge/langchain_/langchain_bridge.py +0 -0
  172. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/bridge/llamaindex_/__init__.py +0 -0
  173. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/bridge/llamaindex_/index.py +0 -0
  174. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/bridge/llamaindex_/llama_index_bridge.py +0 -0
  175. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/bridge/llamaindex_/llama_pack.py +0 -0
  176. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/bridge/llamaindex_/node_parser.py +0 -0
  177. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/bridge/llamaindex_/reader.py +0 -0
  178. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/bridge/llamaindex_/textnode.py +0 -0
  179. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/bridge/pydantic_/__init__.py +0 -0
  180. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/bridge/pydantic_/pydantic_bridge.py +0 -0
  181. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/bridge/transformers_/__init__.py +0 -0
  182. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/bridge/transformers_/install_.py +0 -0
  183. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/chunker/__init__.py +0 -0
  184. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/chunker/chunk.py +0 -0
  185. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/config/__init__.py +0 -0
  186. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/config/mlx_configs.py +0 -0
  187. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/config/oai_configs.py +0 -0
  188. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/config/ollama_configs.py +0 -0
  189. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/config/openrouter_configs.py +0 -0
  190. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/loader/__init__.py +0 -0
  191. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/loader/load.py +0 -0
  192. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/loader/load_util.py +0 -0
  193. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/provider/__init__.py +0 -0
  194. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/provider/_mapping.py +0 -0
  195. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/provider/litellm.py +0 -0
  196. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/provider/mistralai.py +0 -0
  197. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/provider/mlx_service.py +0 -0
  198. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/provider/oai.py +0 -0
  199. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/provider/ollama.py +0 -0
  200. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/provider/openrouter.py +0 -0
  201. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/provider/services.py +0 -0
  202. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/provider/transformers.py +0 -0
  203. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/storage/__init__.py +0 -0
  204. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/storage/neo4j.py +0 -0
  205. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/storage/storage_util.py +0 -0
  206. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/storage/structure_excel.py +0 -0
  207. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/storage/to_csv.py +0 -0
  208. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/integrations/storage/to_excel.py +0 -0
  209. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/libs/__init__.py +0 -0
  210. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/libs/ln_api.py +0 -0
  211. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/libs/ln_async.py +0 -0
  212. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/libs/ln_context.py +0 -0
  213. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/libs/ln_convert.py +0 -0
  214. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/libs/ln_dataframe.py +0 -0
  215. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/libs/ln_func_call.py +0 -0
  216. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/libs/ln_image.py +0 -0
  217. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/libs/ln_knowledge_graph.py +0 -0
  218. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/libs/ln_nested.py +0 -0
  219. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/libs/ln_parse.py +0 -0
  220. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/libs/ln_queue.py +0 -0
  221. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/libs/ln_tokenize.py +0 -0
  222. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/libs/ln_validate.py +0 -0
  223. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/libs/special_tokens.py +0 -0
  224. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/libs/sys_util.py +0 -0
  225. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/lions/__init__.py +0 -0
  226. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/lions/coder/__init__.py +0 -0
  227. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/lions/coder/add_feature.py +0 -0
  228. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/lions/coder/base_prompts.py +0 -0
  229. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/lions/coder/code_form.py +0 -0
  230. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/lions/coder/coder.py +0 -0
  231. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/lions/coder/util.py +0 -0
  232. {lionagi-0.3.2/lionagi/lions/researcher → lionagi-0.3.3/lionagi/lions/judge}/__init__.py +0 -0
  233. {lionagi-0.3.2/lionagi/lions/researcher/data_source → lionagi-0.3.3/lionagi/lions/judge/data}/__init__.py +0 -0
  234. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/lions/researcher/data_source/finhub_.py +0 -0
  235. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/lions/researcher/data_source/google_.py +0 -0
  236. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/lions/researcher/data_source/wiki_.py +0 -0
  237. {lionagi-0.3.2 → lionagi-0.3.3}/lionagi/lions/researcher/data_source/yfinance_.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lionagi
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: Towards automated general intelligence.
5
5
  Author: HaiyangLi
6
6
  Author-email: quantocean.li@gmail.com
@@ -0,0 +1,8 @@
1
+ judge_model_config = {
2
+ "model": "gpt-4o-mini",
3
+ "temperature": 0.1,
4
+ "api_key_schema": "OPENAI_API_KEY",
5
+ "max_tokens": 1000,
6
+ "costs": (0.15, 0.6),
7
+ "top_p": 0.9,
8
+ }
@@ -0,0 +1,526 @@
1
+ code1 = '''
2
+ from collections import deque
3
+ from functools import singledispatchmethod
4
+ from typing import Annotated, Any, ClassVar, TypeVar
5
+
6
+ from lionabc.exceptions import LionValueError
7
+ from lionfuncs import LN_UNDEFINED, copy, time
8
+ from pydantic import Field, field_serializer, field_validator
9
+ from pydantic.fields import FieldInfo
10
+ from pydantic_core import PydanticUndefined
11
+ from typing_extensions import override
12
+
13
+ from lion_core._class_registry import get_class
14
+ from lion_core.converter import Converter
15
+ from lion_core.generic.component_converter import ComponentConverterRegistry
16
+ from lion_core.generic.element import Element
17
+ from lion_core.generic.note import Note
18
+
19
+ T = TypeVar("T", bound=Element)
20
+
21
+ DEFAULT_SERIALIZATION_INCLUDE: set[str] = {
22
+ "ln_id",
23
+ "timestamp",
24
+ "metadata",
25
+ "content",
26
+ "embedding",
27
+ }
28
+
29
+
30
+ NAMED_FIELD = Annotated[str, Field(..., alias="field")]
31
+
32
+
33
+ class Component(Element):
34
+ """Extended base class for components in the Lion framework."""
35
+
36
+ metadata: Note = Field(
37
+ default_factory=Note,
38
+ description="Additional metadata for the component",
39
+ )
40
+
41
+ content: Any = Field(
42
+ default=None,
43
+ description="The main content of the Component",
44
+ )
45
+
46
+ embedding: list[float] = Field(default_factory=list)
47
+
48
+ extra_fields: dict[str, Any] = Field(default_factory=dict)
49
+
50
+ _converter_registry: ClassVar = ComponentConverterRegistry
51
+
52
+ @field_serializer("metadata")
53
+ def _serialize_metadata(self, value):
54
+ return value.to_dict()
55
+
56
+ @field_serializer("extra_fields")
57
+ def _serialize_extra_fields(
58
+ self,
59
+ value: dict[str, FieldInfo],
60
+ ) -> dict[str, Any]:
61
+ """Custom serializer for extra fields."""
62
+ output_dict = {}
63
+ for k in value.keys():
64
+ k_value = self.__dict__.get(k)
65
+ output_dict[k] = k_value
66
+ return output_dict
67
+
68
+ @field_validator("extra_fields")
69
+ def _validate_extra_fields(cls, value: Any) -> dict[str, FieldInfo]:
70
+ """Custom validator for extra fields."""
71
+ if not isinstance(value, dict):
72
+ raise LionValueError("Extra fields must be a dictionary")
73
+
74
+ out_ = {}
75
+ for k, v in value.items():
76
+ out_[k] = Field(**v) if isinstance(v, dict) else v
77
+
78
+ return out_
79
+
80
+ @property
81
+ def all_fields(self) -> dict[str, FieldInfo]:
82
+ """
83
+ Get all fields including model fields and extra fields.
84
+
85
+ Returns:
86
+ dict[str, FieldInfo]: A dictionary containing all fields.
87
+ """
88
+ return {**self.model_fields, **self.extra_fields}
89
+
90
+ def add_field(
91
+ self,
92
+ field_name: NAMED_FIELD,
93
+ /,
94
+ value: Any = LN_UNDEFINED,
95
+ annotation: Any = LN_UNDEFINED,
96
+ field_obj: FieldInfo = LN_UNDEFINED,
97
+ **kwargs,
98
+ ) -> None:
99
+ """
100
+ Add a new field to the component's extra fields.
101
+
102
+ Args:
103
+ field_name: The name of the field to add.
104
+ value: The value of the field.
105
+ annotation: Type annotation for the field.
106
+ field_obj: A pre-configured FieldInfo object.
107
+ **kwargs: Additional keyword arguments for Field configuration.
108
+
109
+ Raises:
110
+ LionValueError: If the field already exists.
111
+ """
112
+ if field_name in self.all_fields:
113
+ raise LionValueError(f"Field '{field_name}' already exists")
114
+
115
+ self.update_field(
116
+ field_name,
117
+ value=value,
118
+ annotation=annotation,
119
+ field_obj=field_obj,
120
+ **kwargs,
121
+ )
122
+
123
+ # when updating field, we do not check the validity of annotation
124
+ # meaning current value will not get validated, and can lead to
125
+ # errors when storing and loading if you change annotation to a type
126
+ # that is not compatible with the current value
127
+ def update_field(
128
+ self,
129
+ field_name: NAMED_FIELD,
130
+ /,
131
+ value: Any = LN_UNDEFINED,
132
+ annotation: Any = LN_UNDEFINED,
133
+ field_obj: FieldInfo | Any = LN_UNDEFINED,
134
+ **kwargs,
135
+ ) -> None:
136
+ """
137
+ Update an existing field or create a new one if it doesn't exist.
138
+
139
+ Args:
140
+ field_name: The name of the field to update or create.
141
+ value: The new value for the field.
142
+ annotation: Type annotation for the field.
143
+ field_obj: A pre-configured FieldInfo object.
144
+ **kwargs: Additional keyword arguments for Field configuration.
145
+
146
+ Raises:
147
+ ValueError: If both 'default' and 'default_factory' are
148
+ provided in kwargs.
149
+ """
150
+
151
+ # pydanitc Field object cannot have both default and default_factory
152
+ if "default" in kwargs and "default_factory" in kwargs:
153
+ raise ValueError(
154
+ "Cannot provide both 'default' and 'default_factory'",
155
+ )
156
+
157
+ # handle field_obj
158
+ if field_obj is not LN_UNDEFINED:
159
+ if not isinstance(field_obj, FieldInfo):
160
+ raise ValueError(
161
+ "Invalid field_obj, should be a pydantic FieldInfo object"
162
+ )
163
+ self.extra_fields[field_name] = field_obj
164
+
165
+ # handle kwargs
166
+ if kwargs:
167
+ if field_name in self.all_fields: # existing field
168
+ for k, v in kwargs.items():
169
+ self.field_setattr(field_name, k, v)
170
+ else:
171
+ self.extra_fields[field_name] = Field(**kwargs)
172
+
173
+ # handle no explicit defined field
174
+ if field_obj is LN_UNDEFINED and not kwargs:
175
+ if field_name not in self.all_fields:
176
+ self.extra_fields[field_name] = Field()
177
+
178
+ field_obj = self.all_fields[field_name]
179
+
180
+ # handle annotation
181
+ if annotation is not LN_UNDEFINED:
182
+ field_obj.annotation = annotation
183
+ if not field_obj.annotation:
184
+ field_obj.annotation = Any
185
+
186
+ # handle value
187
+ if value is LN_UNDEFINED:
188
+ if getattr(self, field_name, LN_UNDEFINED) is not LN_UNDEFINED:
189
+ value = getattr(self, field_name)
190
+
191
+ elif getattr(field_obj, "default") is not PydanticUndefined:
192
+ value = field_obj.default
193
+
194
+ elif getattr(field_obj, "default_factory"):
195
+ value = field_obj.default_factory()
196
+
197
+ setattr(self, field_name, value)
198
+ self._add_last_update(field_name)
199
+
200
+ def _add_last_update(self, field_name: str, /) -> None:
201
+ current_time = time()
202
+ self.metadata.set(["last_updated", field_name], current_time)
203
+
204
+ @override
205
+ def to_dict(self, **kwargs: Any) -> dict:
206
+ """
207
+ Convert the component to a dictionary representation.
208
+
209
+ Args:
210
+ **kwargs: Additional arguments to pass to model_dump.
211
+
212
+ Returns:
213
+ dict[str, Any]: A dictionary representation of the component.
214
+ """
215
+ dict_ = self.model_dump(**kwargs)
216
+ if isinstance(self.content, Note):
217
+ dict_["content"] = dict_["content"]["content"]
218
+ extra_fields = dict_.pop("extra_fields", {})
219
+ dict_ = {**dict_, **extra_fields, "lion_class": self.class_name()}
220
+ for i in list(dict_.keys()):
221
+ if dict_[i] is LN_UNDEFINED:
222
+ dict_.pop(i)
223
+ return dict_
224
+
225
+ def to_note(self, **kwargs: Any) -> Note:
226
+ return Note(**self.to_dict(**kwargs))
227
+
228
+ @override
229
+ @classmethod
230
+ def from_dict(cls, data: dict, /, **kwargs: Any) -> T:
231
+ """
232
+ Create a component instance from a dictionary.
233
+
234
+ Args:
235
+ data: The dictionary containing component data.
236
+ **kwargs: Additional arguments for Pydantic model validation.
237
+
238
+ Returns:
239
+ T: An instance of the Component class or its subclass.
240
+ """
241
+ input_data = copy(data)
242
+ if "lion_class" in input_data:
243
+ cls = get_class(input_data.pop("lion_class"))
244
+ if cls.from_dict.__func__ != Component.from_dict.__func__:
245
+ return cls.from_dict(input_data, **kwargs)
246
+
247
+ extra_fields = {}
248
+ for k, v in list(input_data.items()):
249
+ if k not in cls.model_fields:
250
+ extra_fields[k] = input_data.pop(k)
251
+ obj = cls.model_validate(input_data, **kwargs)
252
+ for k, v in extra_fields.items():
253
+ obj.update_field(k, value=v)
254
+
255
+ metadata = copy(data.get("metadata", {}))
256
+ last_updated = metadata.get("last_updated", None)
257
+ if last_updated is not None:
258
+ obj.metadata.set(["last_updated"], last_updated)
259
+ else:
260
+ obj.metadata.pop(["last_updated"], None)
261
+ return obj
262
+
263
+ @override
264
+ def __setattr__(self, field_name: str, value: Any) -> None:
265
+ if field_name == "metadata":
266
+ raise AttributeError("Cannot directly assign to metadata.")
267
+ elif field_name == "extra_fields":
268
+ raise AttributeError("Cannot directly assign to extra_fields")
269
+ if field_name in self.extra_fields:
270
+ object.__setattr__(self, field_name, value)
271
+ else:
272
+ super().__setattr__(field_name, value)
273
+
274
+ self._add_last_update(field_name)
275
+
276
+ @override
277
+ def __getattr__(self, field_name: str) -> Any:
278
+ if field_name in self.extra_fields:
279
+ default_ = self.extra_fields[field_name].default
280
+ if default_ is not PydanticUndefined:
281
+ return default_
282
+ return LN_UNDEFINED
283
+
284
+ cls_name = self.__class__.__name__
285
+ raise AttributeError(
286
+ f"'{cls_name}' object has no attribute '{field_name}'",
287
+ )
288
+
289
+ @override
290
+ def __str__(self) -> str:
291
+ """Return a concise string representation of the component."""
292
+ content_preview = str(self.content)[:50]
293
+ if len(content_preview) == 50:
294
+ content_preview += "..."
295
+
296
+ output_str = (
297
+ f"{self.__class__.__name__}("
298
+ f"ln_id={self.ln_id[:8]}..., "
299
+ f"timestamp={str(self.created_datetime)[:-6]}, "
300
+ f"content='{content_preview}', "
301
+ f"metadata_keys={list(self.metadata.keys())}, "
302
+ )
303
+
304
+ for i, j in self.model_dump().items():
305
+ if i not in DEFAULT_SERIALIZATION_INCLUDE:
306
+ if isinstance(j, dict):
307
+ output_str += f"{i}={list(j.keys())}, "
308
+ elif isinstance(j, str):
309
+ j_preview = j[:50]
310
+ if len(j_preview) == 50:
311
+ j_preview = j_preview + "..."
312
+ output_str += f"{i}={j_preview}, "
313
+ else:
314
+ output_str += f"{i}={j}, "
315
+
316
+ output_str += f"extra_fields_keys={list(self.extra_fields.keys())})"
317
+
318
+ return output_str
319
+
320
+ @override
321
+ def __repr__(self) -> str:
322
+ """Return a detailed string representation of the component."""
323
+
324
+ def truncate_dict(
325
+ d: dict[str, Any], max_items: int = 5, max_str_len: int = 50
326
+ ) -> dict[str, Any]:
327
+ items = list(d.items())[:max_items]
328
+ truncated = {
329
+ k: (
330
+ v[:max_str_len] + "..."
331
+ if isinstance(v, str) and len(v) > max_str_len
332
+ else v
333
+ )
334
+ for k, v in items
335
+ }
336
+ if len(d) > max_items:
337
+ truncated["..."] = f"({len(d) - max_items} more items)"
338
+ return truncated
339
+
340
+ content_repr = repr(self.content)
341
+ if len(content_repr) > 100:
342
+ content_repr = content_repr[:97] + "..."
343
+
344
+ dict_ = self.model_dump()
345
+ extra_fields = dict_.pop("extra_fields", {})
346
+
347
+ repr_str = (
348
+ f"{self.class_name()}("
349
+ f"ln_id={repr(self.ln_id)}, "
350
+ f"timestamp={str(self.created_datetime)[:-6]}, "
351
+ f"content={content_repr}, "
352
+ f"metadata={truncate_dict(self.metadata.content)}, "
353
+ )
354
+
355
+ for i, j in dict_.items():
356
+ if i not in DEFAULT_SERIALIZATION_INCLUDE:
357
+ if isinstance(j, dict):
358
+ repr_str += f"{i}={truncate_dict(j)}, "
359
+ elif isinstance(j, str):
360
+ j_repr = j
361
+ if len(j) > 100:
362
+ j_repr = j[:97] + "..."
363
+ repr_str += f"{i}={j_repr}, "
364
+ else:
365
+ repr_str += f"{i}={j}, "
366
+
367
+ repr_str += f"extra_fields={truncate_dict(extra_fields)})"
368
+ return repr_str
369
+
370
+ # converter methods
371
+ @classmethod
372
+ def list_converters(cls) -> list[str]:
373
+ """List all registered converters."""
374
+ return cls._get_converter_registry().list_obj_keys()
375
+
376
+ @classmethod
377
+ def _get_converter_registry(cls) -> ComponentConverterRegistry:
378
+ """Get the converter registry for the class."""
379
+ if isinstance(cls._converter_registry, type):
380
+ cls._converter_registry = cls._converter_registry()
381
+ return cls._converter_registry
382
+
383
+ def convert_to(self, obj_key: str, /, **kwargs: Any) -> Any:
384
+ """Convert the component to a specified type"""
385
+ return self._get_converter_registry().convert_to(
386
+ self,
387
+ obj_key,
388
+ **kwargs,
389
+ )
390
+
391
+ @classmethod
392
+ def convert_from(
393
+ cls, obj: Any, obj_key: str = None, /, **kwargs: Any
394
+ ) -> T:
395
+ """Convert data to create a new component instance"""
396
+ data = cls._get_converter_registry().convert_from(
397
+ cls,
398
+ obj,
399
+ obj_key,
400
+ **kwargs,
401
+ )
402
+ return cls.from_dict(data)
403
+
404
+ @classmethod
405
+ def register_converter(cls, converter: type[Converter]) -> None:
406
+ """Register a new converter."""
407
+ cls._get_converter_registry().register(converter)
408
+
409
+ # field management methods
410
+ def field_setattr(
411
+ self,
412
+ field_name: str,
413
+ attr: Any,
414
+ value: Any,
415
+ /,
416
+ ) -> None:
417
+ """Set the value of a field attribute."""
418
+ all_fields = self.all_fields
419
+ if field_name not in all_fields:
420
+ raise KeyError(f"Field {field_name} not found in object fields.")
421
+ field_obj = all_fields[field_name]
422
+ if hasattr(field_obj, attr):
423
+ setattr(field_obj, attr, value)
424
+ else:
425
+ if not isinstance(field_obj.json_schema_extra, dict):
426
+ field_obj.json_schema_extra = {}
427
+ field_obj.json_schema_extra[attr] = value
428
+
429
+ def field_hasattr(
430
+ self,
431
+ field_name: str,
432
+ attr: str,
433
+ /,
434
+ ) -> bool:
435
+ """Check if a field has a specific attribute."""
436
+ all_fields = self.all_fields
437
+ if field_name not in all_fields:
438
+ raise KeyError(f"Field {field_name} not found in object fields.")
439
+ field_obj = all_fields[field_name]
440
+ if hasattr(field_obj, attr):
441
+ return True
442
+ elif isinstance(field_obj.json_schema_extra, dict):
443
+ if field_name in field_obj.json_schema_extra:
444
+ return True
445
+ else:
446
+ return False
447
+
448
+ def field_getattr(
449
+ self,
450
+ field_name: str,
451
+ attr: str,
452
+ default: Any = LN_UNDEFINED,
453
+ /,
454
+ ) -> Any:
455
+ """Get the value of a field attribute."""
456
+ if str(attr).strip("s").lower() == "annotation":
457
+ return self._field_annotation(field_name)
458
+
459
+ all_fields = self.all_fields
460
+ if field_name not in all_fields:
461
+ raise KeyError(f"Field {field_name} not found in object fields.")
462
+ field_obj = all_fields[field_name]
463
+
464
+ # check fieldinfo attr
465
+
466
+ value = getattr(field_obj, attr, LN_UNDEFINED)
467
+ if value is not LN_UNDEFINED:
468
+ return value
469
+ else:
470
+ if isinstance(field_obj.json_schema_extra, dict):
471
+ value = field_obj.json_schema_extra.get(attr, LN_UNDEFINED)
472
+ if value is not LN_UNDEFINED:
473
+ return value
474
+
475
+ # undefined attr
476
+ if default is not LN_UNDEFINED:
477
+ return default
478
+ else:
479
+ raise AttributeError(
480
+ f"field {field_name} has no attribute {attr}",
481
+ )
482
+
483
+ def field_annotation(self, field_name: Any, /) -> dict[str, Any]:
484
+ """Get the annotation of a field."""
485
+ return self._field_annotation(field_name)
486
+
487
+ @singledispatchmethod
488
+ def _field_annotation(self, field_name: Any, /) -> dict[str, Any]:
489
+ """
490
+ Get field annotation for a given field.
491
+
492
+ Args:
493
+ field: The field to get annotation for.
494
+
495
+ Returns:
496
+ A dictionary containing the field annotation.
497
+ """
498
+ return {}
499
+
500
+ @_field_annotation.register(str)
501
+ def _(self, field_name: str, /) -> dict[str, Any]:
502
+ dict_ = {field_name: self.all_fields[field_name].annotation}
503
+ for _f, _anno in dict_.items():
504
+ if "|" in str(_anno):
505
+ _anno = str(_anno)
506
+ _anno = _anno.split("|")
507
+ dict_[_f] = [str(i).lower().strip() for i in _anno]
508
+ else:
509
+ dict_[_f] = [_anno.__name__] if _anno else None
510
+ return dict_
511
+
512
+ @_field_annotation.register(deque)
513
+ @_field_annotation.register(set)
514
+ @_field_annotation.register(list)
515
+ @_field_annotation.register(tuple)
516
+ def _(self, field_name, /) -> dict[str, Any]:
517
+ dict_ = {}
518
+ for f in field_name:
519
+ dict_.update(self._field_annotation(f))
520
+ return dict_
521
+
522
+
523
+ __all__ = ["Component"]
524
+
525
+ # File: lion_core/generic/component.py
526
+ '''
@@ -0,0 +1,48 @@
1
+ from lionagi.lions.judge.rubric import Rubric, RubricItem
2
+
3
+ functionality = RubricItem(
4
+ name="functionality",
5
+ prompt="Assess how well the code meets the functional requirements.",
6
+ weight=2.7,
7
+ )
8
+
9
+ readability = RubricItem(
10
+ name="readability",
11
+ prompt="Evaluate the readability and clarity of the code.",
12
+ weight=1,
13
+ )
14
+
15
+ efficiency = RubricItem(
16
+ name="efficiency",
17
+ prompt="Examine the efficiency of the algorithms used.",
18
+ weight=1.5,
19
+ )
20
+
21
+ style_compliance = RubricItem(
22
+ name="style_compliance",
23
+ prompt="Check adherence to coding style guidelines.",
24
+ weight=0.5,
25
+ )
26
+
27
+ error_handling = RubricItem(
28
+ name="error_handling",
29
+ prompt="Analyze the robustness of error handling mechanisms.",
30
+ weight=1,
31
+ )
32
+
33
+ code_quality_rubric = Rubric(
34
+ name="code_quality_rubric",
35
+ description="Used for assessing code submissions in programming challenges.",
36
+ items={
37
+ i.name: i
38
+ for i in [
39
+ functionality,
40
+ readability,
41
+ efficiency,
42
+ style_compliance,
43
+ error_handling,
44
+ ]
45
+ },
46
+ )
47
+
48
+ __all__ = ["code_quality_rubric"]
File without changes