lionagi 0.0.312__tar.gz → 0.2.3__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {lionagi-0.0.312 → lionagi-0.2.3}/LICENSE +12 -11
- {lionagi-0.0.312 → lionagi-0.2.3}/PKG-INFO +26 -120
- lionagi-0.2.3/README.md +48 -0
- lionagi-0.2.3/lionagi/__init__.py +73 -0
- lionagi-0.2.3/lionagi/core/_setting/_setting.py +59 -0
- lionagi-0.2.3/lionagi/core/action/__init__.py +14 -0
- lionagi-0.2.3/lionagi/core/action/function_calling.py +136 -0
- lionagi-0.2.3/lionagi/core/action/manual.py +1 -0
- lionagi-0.2.3/lionagi/core/action/node.py +109 -0
- lionagi-0.2.3/lionagi/core/action/tool.py +114 -0
- lionagi-0.2.3/lionagi/core/action/tool_manager.py +356 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/core/agent/base_agent.py +45 -36
- lionagi-0.2.3/lionagi/core/agent/eval/evaluator.py +1 -0
- lionagi-0.2.3/lionagi/core/agent/eval/vote.py +40 -0
- lionagi-0.2.3/lionagi/core/agent/learn/learner.py +59 -0
- lionagi-0.2.3/lionagi/core/agent/plan/unit_template.py +1 -0
- lionagi-0.2.3/lionagi/core/collections/__init__.py +17 -0
- lionagi-0.2.3/lionagi/core/collections/_logger.py +319 -0
- lionagi-0.2.3/lionagi/core/collections/abc/__init__.py +53 -0
- lionagi-0.2.3/lionagi/core/collections/abc/component.py +615 -0
- lionagi-0.2.3/lionagi/core/collections/abc/concepts.py +297 -0
- lionagi-0.2.3/lionagi/core/collections/abc/exceptions.py +150 -0
- lionagi-0.2.3/lionagi/core/collections/abc/util.py +45 -0
- lionagi-0.2.3/lionagi/core/collections/exchange.py +161 -0
- lionagi-0.2.3/lionagi/core/collections/flow.py +426 -0
- lionagi-0.2.3/lionagi/core/collections/model.py +419 -0
- lionagi-0.2.3/lionagi/core/collections/pile.py +913 -0
- lionagi-0.2.3/lionagi/core/collections/progression.py +236 -0
- lionagi-0.2.3/lionagi/core/collections/util.py +64 -0
- lionagi-0.2.3/lionagi/core/director/direct.py +314 -0
- lionagi-0.2.3/lionagi/core/director/director.py +2 -0
- lionagi-0.2.3/lionagi/core/engine/branch_engine.py +333 -0
- lionagi-0.2.3/lionagi/core/engine/instruction_map_engine.py +204 -0
- lionagi-0.2.3/lionagi/core/engine/sandbox_.py +14 -0
- lionagi-0.2.3/lionagi/core/engine/script_engine.py +99 -0
- lionagi-0.2.3/lionagi/core/executor/base_executor.py +90 -0
- lionagi-0.2.3/lionagi/core/executor/graph_executor.py +330 -0
- lionagi-0.2.3/lionagi/core/executor/neo4j_executor.py +384 -0
- lionagi-0.2.3/lionagi/core/generic/__init__.py +7 -0
- lionagi-0.2.3/lionagi/core/generic/edge.py +112 -0
- lionagi-0.2.3/lionagi/core/generic/edge_condition.py +16 -0
- lionagi-0.2.3/lionagi/core/generic/graph.py +243 -0
- lionagi-0.2.3/lionagi/core/generic/hyperedge.py +1 -0
- lionagi-0.2.3/lionagi/core/generic/node.py +224 -0
- lionagi-0.2.3/lionagi/core/generic/tree.py +48 -0
- lionagi-0.2.3/lionagi/core/generic/tree_node.py +79 -0
- lionagi-0.2.3/lionagi/core/mail/__init__.py +12 -0
- lionagi-0.2.3/lionagi/core/mail/mail.py +25 -0
- lionagi-0.2.3/lionagi/core/mail/mail_manager.py +181 -0
- lionagi-0.2.3/lionagi/core/mail/package.py +45 -0
- lionagi-0.2.3/lionagi/core/mail/start_mail.py +36 -0
- lionagi-0.2.3/lionagi/core/message/__init__.py +19 -0
- lionagi-0.2.3/lionagi/core/message/action_request.py +133 -0
- lionagi-0.2.3/lionagi/core/message/action_response.py +135 -0
- lionagi-0.2.3/lionagi/core/message/assistant_response.py +95 -0
- lionagi-0.2.3/lionagi/core/message/instruction.py +234 -0
- lionagi-0.2.3/lionagi/core/message/message.py +101 -0
- lionagi-0.2.3/lionagi/core/message/system.py +86 -0
- lionagi-0.2.3/lionagi/core/message/util.py +283 -0
- lionagi-0.2.3/lionagi/core/report/__init__.py +4 -0
- lionagi-0.2.3/lionagi/core/report/base.py +218 -0
- lionagi-0.2.3/lionagi/core/report/form.py +231 -0
- lionagi-0.2.3/lionagi/core/report/report.py +166 -0
- lionagi-0.2.3/lionagi/core/report/util.py +28 -0
- lionagi-0.2.3/lionagi/core/rule/_default.py +16 -0
- lionagi-0.2.3/lionagi/core/rule/action.py +99 -0
- lionagi-0.2.3/lionagi/core/rule/base.py +238 -0
- lionagi-0.2.3/lionagi/core/rule/boolean.py +56 -0
- lionagi-0.2.3/lionagi/core/rule/choice.py +47 -0
- lionagi-0.2.3/lionagi/core/rule/mapping.py +96 -0
- lionagi-0.2.3/lionagi/core/rule/number.py +71 -0
- lionagi-0.2.3/lionagi/core/rule/rulebook.py +109 -0
- lionagi-0.2.3/lionagi/core/rule/string.py +52 -0
- lionagi-0.2.3/lionagi/core/rule/util.py +35 -0
- lionagi-0.2.3/lionagi/core/session/branch.py +431 -0
- lionagi-0.2.3/lionagi/core/session/directive_mixin.py +287 -0
- lionagi-0.2.3/lionagi/core/session/session.py +311 -0
- lionagi-0.2.3/lionagi/core/structure/__init__.py +1 -0
- lionagi-0.2.3/lionagi/core/structure/chain.py +1 -0
- lionagi-0.2.3/lionagi/core/structure/forest.py +1 -0
- lionagi-0.2.3/lionagi/core/structure/graph.py +1 -0
- lionagi-0.2.3/lionagi/core/structure/tree.py +1 -0
- lionagi-0.2.3/lionagi/core/unit/__init__.py +5 -0
- lionagi-0.2.3/lionagi/core/unit/parallel_unit.py +245 -0
- lionagi-0.2.3/lionagi/core/unit/template/action.py +81 -0
- lionagi-0.2.3/lionagi/core/unit/template/base.py +51 -0
- lionagi-0.2.3/lionagi/core/unit/template/plan.py +84 -0
- lionagi-0.2.3/lionagi/core/unit/template/predict.py +109 -0
- lionagi-0.2.3/lionagi/core/unit/template/score.py +124 -0
- lionagi-0.2.3/lionagi/core/unit/template/select.py +104 -0
- lionagi-0.2.3/lionagi/core/unit/unit.py +362 -0
- lionagi-0.2.3/lionagi/core/unit/unit_form.py +305 -0
- lionagi-0.2.3/lionagi/core/unit/unit_mixin.py +1168 -0
- lionagi-0.2.3/lionagi/core/unit/util.py +71 -0
- lionagi-0.2.3/lionagi/core/validator/validator.py +364 -0
- lionagi-0.2.3/lionagi/core/work/work.py +76 -0
- lionagi-0.2.3/lionagi/core/work/work_edge.py +96 -0
- lionagi-0.2.3/lionagi/core/work/work_function.py +124 -0
- lionagi-0.2.3/lionagi/core/work/work_function_node.py +44 -0
- lionagi-0.2.3/lionagi/core/work/work_queue.py +105 -0
- lionagi-0.2.3/lionagi/core/work/work_task.py +155 -0
- lionagi-0.2.3/lionagi/core/work/worker.py +383 -0
- lionagi-0.2.3/lionagi/core/work/worker_engine.py +179 -0
- lionagi-0.2.3/lionagi/core/work/worklog.py +122 -0
- lionagi-0.2.3/lionagi/experimental/compressor/__init__.py +0 -0
- lionagi-0.2.3/lionagi/experimental/compressor/base.py +46 -0
- lionagi-0.2.3/lionagi/experimental/compressor/llm_compressor.py +247 -0
- lionagi-0.2.3/lionagi/experimental/compressor/llm_summarizer.py +61 -0
- lionagi-0.2.3/lionagi/experimental/compressor/util.py +70 -0
- lionagi-0.2.3/lionagi/experimental/directive/__init__.py +19 -0
- lionagi-0.2.3/lionagi/experimental/directive/parser/__init__.py +0 -0
- lionagi-0.2.3/lionagi/experimental/directive/parser/base_parser.py +282 -0
- lionagi-0.2.3/lionagi/experimental/directive/template/__init__.py +0 -0
- lionagi-0.2.3/lionagi/experimental/directive/template/base_template.py +79 -0
- lionagi-0.2.3/lionagi/experimental/directive/template/schema.py +36 -0
- lionagi-0.2.3/lionagi/experimental/directive/tokenizer.py +73 -0
- lionagi-0.2.3/lionagi/experimental/evaluator/__init__.py +0 -0
- lionagi-0.2.3/lionagi/experimental/evaluator/ast_evaluator.py +131 -0
- lionagi-0.2.3/lionagi/experimental/evaluator/base_evaluator.py +218 -0
- lionagi-0.2.3/lionagi/experimental/knowledge/__init__.py +0 -0
- lionagi-0.2.3/lionagi/experimental/knowledge/base.py +10 -0
- lionagi-0.2.3/lionagi/experimental/knowledge/graph.py +0 -0
- lionagi-0.2.3/lionagi/experimental/memory/__init__.py +0 -0
- lionagi-0.2.3/lionagi/experimental/strategies/__init__.py +0 -0
- lionagi-0.2.3/lionagi/experimental/strategies/base.py +1 -0
- lionagi-0.2.3/lionagi/integrations/__init__.py +1 -0
- lionagi-0.2.3/lionagi/integrations/bridge/autogen_/__init__.py +0 -0
- lionagi-0.2.3/lionagi/integrations/bridge/autogen_/autogen_.py +124 -0
- lionagi-0.2.3/lionagi/integrations/bridge/langchain_/__init__.py +0 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/bridge/langchain_/documents.py +4 -0
- lionagi-0.2.3/lionagi/integrations/bridge/llamaindex_/__init__.py +0 -0
- lionagi-0.2.3/lionagi/integrations/bridge/llamaindex_/index.py +30 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/bridge/llamaindex_/llama_index_bridge.py +6 -0
- lionagi-0.2.3/lionagi/integrations/bridge/llamaindex_/llama_pack.py +227 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/bridge/llamaindex_/node_parser.py +6 -9
- lionagi-0.2.3/lionagi/integrations/bridge/pydantic_/__init__.py +0 -0
- lionagi-0.2.3/lionagi/integrations/bridge/pydantic_/pydantic_bridge.py +1 -0
- lionagi-0.2.3/lionagi/integrations/bridge/transformers_/__init__.py +0 -0
- lionagi-0.2.3/lionagi/integrations/bridge/transformers_/install_.py +36 -0
- lionagi-0.2.3/lionagi/integrations/chunker/__init__.py +0 -0
- lionagi-0.2.3/lionagi/integrations/chunker/chunk.py +312 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/config/oai_configs.py +38 -7
- lionagi-0.2.3/lionagi/integrations/config/ollama_configs.py +1 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/config/openrouter_configs.py +14 -2
- lionagi-0.2.3/lionagi/integrations/loader/__init__.py +0 -0
- lionagi-0.2.3/lionagi/integrations/loader/load.py +253 -0
- lionagi-0.2.3/lionagi/integrations/loader/load_util.py +195 -0
- lionagi-0.2.3/lionagi/integrations/provider/_mapping.py +46 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/provider/litellm.py +2 -1
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/provider/mlx_service.py +16 -9
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/provider/oai.py +91 -4
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/provider/ollama.py +7 -6
- lionagi-0.2.3/lionagi/integrations/provider/openrouter.py +160 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/provider/services.py +2 -2
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/provider/transformers.py +18 -22
- lionagi-0.2.3/lionagi/integrations/storage/__init__.py +3 -0
- lionagi-0.2.3/lionagi/integrations/storage/neo4j.py +665 -0
- lionagi-0.2.3/lionagi/integrations/storage/storage_util.py +287 -0
- lionagi-0.2.3/lionagi/integrations/storage/structure_excel.py +285 -0
- lionagi-0.2.3/lionagi/integrations/storage/to_csv.py +63 -0
- lionagi-0.2.3/lionagi/integrations/storage/to_excel.py +83 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/libs/__init__.py +26 -1
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/libs/ln_api.py +78 -23
- lionagi-0.2.3/lionagi/libs/ln_context.py +37 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/libs/ln_convert.py +21 -9
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/libs/ln_func_call.py +69 -28
- lionagi-0.2.3/lionagi/libs/ln_image.py +107 -0
- lionagi-0.2.3/lionagi/libs/ln_knowledge_graph.py +405 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/libs/ln_nested.py +26 -11
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/libs/ln_parse.py +110 -14
- lionagi-0.2.3/lionagi/libs/ln_queue.py +117 -0
- lionagi-0.2.3/lionagi/libs/ln_tokenize.py +164 -0
- lionagi-0.0.312/lionagi/core/prompt/field_validator.py → lionagi-0.2.3/lionagi/libs/ln_validate.py +79 -14
- lionagi-0.2.3/lionagi/libs/special_tokens.py +172 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/libs/sys_util.py +107 -2
- lionagi-0.2.3/lionagi/lions/__init__.py +0 -0
- lionagi-0.2.3/lionagi/lions/coder/__init__.py +0 -0
- lionagi-0.2.3/lionagi/lions/coder/add_feature.py +20 -0
- lionagi-0.2.3/lionagi/lions/coder/base_prompts.py +22 -0
- lionagi-0.2.3/lionagi/lions/coder/code_form.py +13 -0
- lionagi-0.2.3/lionagi/lions/coder/coder.py +168 -0
- lionagi-0.2.3/lionagi/lions/coder/util.py +96 -0
- lionagi-0.2.3/lionagi/lions/researcher/__init__.py +0 -0
- lionagi-0.2.3/lionagi/lions/researcher/data_source/__init__.py +0 -0
- lionagi-0.2.3/lionagi/lions/researcher/data_source/finhub_.py +191 -0
- lionagi-0.2.3/lionagi/lions/researcher/data_source/google_.py +199 -0
- lionagi-0.2.3/lionagi/lions/researcher/data_source/wiki_.py +96 -0
- lionagi-0.2.3/lionagi/lions/researcher/data_source/yfinance_.py +21 -0
- lionagi-0.2.3/lionagi/tests/__init__.py +0 -0
- lionagi-0.2.3/lionagi/tests/api/__init__.py +0 -0
- lionagi-0.2.3/lionagi/tests/api/aws/__init__.py +0 -0
- lionagi-0.2.3/lionagi/tests/api/aws/conftest.py +28 -0
- lionagi-0.2.3/lionagi/tests/api/aws/test_aws_s3.py +7 -0
- lionagi-0.2.3/lionagi/tests/integrations/__init__.py +0 -0
- lionagi-0.2.3/lionagi/tests/libs/__init__.py +0 -0
- lionagi-0.2.3/lionagi/tests/libs/test_field_validators.py +353 -0
- {lionagi-0.0.312/lionagi/tests/test_libs → lionagi-0.2.3/lionagi/tests/libs}/test_func_call.py +23 -21
- {lionagi-0.0.312/lionagi/tests/test_libs → lionagi-0.2.3/lionagi/tests/libs}/test_nested.py +36 -21
- {lionagi-0.0.312/lionagi/tests/test_libs → lionagi-0.2.3/lionagi/tests/libs}/test_parse.py +1 -1
- lionagi-0.2.3/lionagi/tests/libs/test_queue.py +67 -0
- lionagi-0.2.3/lionagi/tests/test_core/__init__.py +0 -0
- lionagi-0.2.3/lionagi/tests/test_core/collections/__init__.py +0 -0
- lionagi-0.2.3/lionagi/tests/test_core/collections/test_component.py +206 -0
- lionagi-0.2.3/lionagi/tests/test_core/collections/test_exchange.py +138 -0
- lionagi-0.2.3/lionagi/tests/test_core/collections/test_flow.py +145 -0
- lionagi-0.2.3/lionagi/tests/test_core/collections/test_pile.py +171 -0
- lionagi-0.2.3/lionagi/tests/test_core/collections/test_progression.py +129 -0
- lionagi-0.2.3/lionagi/tests/test_core/generic/__init__.py +0 -0
- lionagi-0.2.3/lionagi/tests/test_core/generic/test_edge.py +67 -0
- lionagi-0.2.3/lionagi/tests/test_core/generic/test_graph.py +96 -0
- lionagi-0.2.3/lionagi/tests/test_core/generic/test_node.py +106 -0
- lionagi-0.2.3/lionagi/tests/test_core/generic/test_structure.py +194 -0
- lionagi-0.2.3/lionagi/tests/test_core/generic/test_tree_node.py +73 -0
- lionagi-0.2.3/lionagi/tests/test_core/graph/__init__.py +0 -0
- lionagi-0.2.3/lionagi/tests/test_core/graph/test_graph.py +71 -0
- lionagi-0.2.3/lionagi/tests/test_core/graph/test_tree.py +76 -0
- lionagi-0.2.3/lionagi/tests/test_core/mail/__init__.py +0 -0
- lionagi-0.2.3/lionagi/tests/test_core/mail/test_mail.py +98 -0
- lionagi-0.2.3/lionagi/tests/test_core/test_branch.py +115 -0
- lionagi-0.2.3/lionagi/tests/test_core/test_form.py +46 -0
- lionagi-0.2.3/lionagi/tests/test_core/test_report.py +105 -0
- lionagi-0.2.3/lionagi/tests/test_core/test_structure/__init__.py +0 -0
- lionagi-0.2.3/lionagi/tests/test_core/test_structure/test_base_structure.py +198 -0
- lionagi-0.2.3/lionagi/tests/test_core/test_structure/test_graph.py +55 -0
- lionagi-0.2.3/lionagi/tests/test_core/test_structure/test_tree.py +49 -0
- lionagi-0.2.3/lionagi/tests/test_core/test_validator.py +111 -0
- lionagi-0.2.3/lionagi/version.py +1 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi.egg-info/PKG-INFO +26 -120
- lionagi-0.2.3/lionagi.egg-info/SOURCES.txt +263 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi.egg-info/requires.txt +4 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/pyproject.toml +11 -2
- {lionagi-0.0.312 → lionagi-0.2.3}/setup.py +1 -1
- lionagi-0.0.312/README.md +0 -147
- lionagi-0.0.312/lionagi/__init__.py +0 -14
- lionagi-0.0.312/lionagi/core/__init__.py +0 -15
- lionagi-0.0.312/lionagi/core/agent/__init__.py +0 -3
- lionagi-0.0.312/lionagi/core/branch/__init__.py +0 -4
- lionagi-0.0.312/lionagi/core/branch/base_branch.py +0 -654
- lionagi-0.0.312/lionagi/core/branch/branch.py +0 -471
- lionagi-0.0.312/lionagi/core/branch/branch_flow_mixin.py +0 -96
- lionagi-0.0.312/lionagi/core/branch/executable_branch.py +0 -347
- lionagi-0.0.312/lionagi/core/branch/util.py +0 -323
- lionagi-0.0.312/lionagi/core/direct/__init__.py +0 -6
- lionagi-0.0.312/lionagi/core/direct/predict.py +0 -161
- lionagi-0.0.312/lionagi/core/direct/score.py +0 -278
- lionagi-0.0.312/lionagi/core/direct/select.py +0 -169
- lionagi-0.0.312/lionagi/core/direct/utils.py +0 -87
- lionagi-0.0.312/lionagi/core/direct/vote.py +0 -64
- lionagi-0.0.312/lionagi/core/flow/base/baseflow.py +0 -23
- lionagi-0.0.312/lionagi/core/flow/monoflow/ReAct.py +0 -238
- lionagi-0.0.312/lionagi/core/flow/monoflow/__init__.py +0 -9
- lionagi-0.0.312/lionagi/core/flow/monoflow/chat.py +0 -95
- lionagi-0.0.312/lionagi/core/flow/monoflow/chat_mixin.py +0 -263
- lionagi-0.0.312/lionagi/core/flow/monoflow/followup.py +0 -214
- lionagi-0.0.312/lionagi/core/flow/polyflow/__init__.py +0 -1
- lionagi-0.0.312/lionagi/core/flow/polyflow/chat.py +0 -248
- lionagi-0.0.312/lionagi/core/mail/__init__.py +0 -8
- lionagi-0.0.312/lionagi/core/mail/mail_manager.py +0 -97
- lionagi-0.0.312/lionagi/core/mail/schema.py +0 -56
- lionagi-0.0.312/lionagi/core/messages/__init__.py +0 -3
- lionagi-0.0.312/lionagi/core/messages/schema.py +0 -533
- lionagi-0.0.312/lionagi/core/prompt/prompt_template.py +0 -316
- lionagi-0.0.312/lionagi/core/schema/__init__.py +0 -22
- lionagi-0.0.312/lionagi/core/schema/action_node.py +0 -29
- lionagi-0.0.312/lionagi/core/schema/base_mixin.py +0 -296
- lionagi-0.0.312/lionagi/core/schema/base_node.py +0 -199
- lionagi-0.0.312/lionagi/core/schema/condition.py +0 -24
- lionagi-0.0.312/lionagi/core/schema/data_logger.py +0 -354
- lionagi-0.0.312/lionagi/core/schema/data_node.py +0 -93
- lionagi-0.0.312/lionagi/core/schema/prompt_template.py +0 -67
- lionagi-0.0.312/lionagi/core/schema/structure.py +0 -910
- lionagi-0.0.312/lionagi/core/session/__init__.py +0 -3
- lionagi-0.0.312/lionagi/core/session/session.py +0 -983
- lionagi-0.0.312/lionagi/core/tool/__init__.py +0 -3
- lionagi-0.0.312/lionagi/core/tool/tool_manager.py +0 -280
- lionagi-0.0.312/lionagi/integrations/bridge/pydantic_/base_model.py +0 -7
- lionagi-0.0.312/lionagi/integrations/config/ollama_configs.py +0 -1
- lionagi-0.0.312/lionagi/integrations/provider/openrouter.py +0 -53
- lionagi-0.0.312/lionagi/tests/test_core/test_base_branch.py +0 -427
- lionagi-0.0.312/lionagi/tests/test_core/test_branch.py +0 -292
- lionagi-0.0.312/lionagi/tests/test_core/test_chat_flow.py +0 -63
- lionagi-0.0.312/lionagi/tests/test_core/test_mail_manager.py +0 -75
- lionagi-0.0.312/lionagi/tests/test_core/test_prompts.py +0 -51
- lionagi-0.0.312/lionagi/tests/test_core/test_session.py +0 -254
- lionagi-0.0.312/lionagi/tests/test_core/test_session_base_util.py +0 -312
- lionagi-0.0.312/lionagi/tests/test_core/test_tool_manager.py +0 -95
- lionagi-0.0.312/lionagi/version.py +0 -1
- lionagi-0.0.312/lionagi.egg-info/SOURCES.txt +0 -116
- {lionagi-0.0.312 → lionagi-0.2.3}/README.rst +0 -0
- {lionagi-0.0.312/lionagi/integrations → lionagi-0.2.3/lionagi/core}/__init__.py +0 -0
- {lionagi-0.0.312/lionagi/core/branch/base → lionagi-0.2.3/lionagi/core/_setting}/__init__.py +0 -0
- {lionagi-0.0.312/lionagi/core/flow → lionagi-0.2.3/lionagi/core/agent}/__init__.py +0 -0
- {lionagi-0.0.312/lionagi/core/flow/base → lionagi-0.2.3/lionagi/core/agent/eval}/__init__.py +0 -0
- {lionagi-0.0.312/lionagi/core/prompt → lionagi-0.2.3/lionagi/core/agent/learn}/__init__.py +0 -0
- {lionagi-0.0.312/lionagi/integrations/bridge/langchain_ → lionagi-0.2.3/lionagi/core/agent/plan}/__init__.py +0 -0
- /lionagi-0.0.312/lionagi/core/tool/manual.py → /lionagi-0.2.3/lionagi/core/agent/plan/plan.py +0 -0
- {lionagi-0.0.312/lionagi/integrations/bridge/llamaindex_ → lionagi-0.2.3/lionagi/core/director}/__init__.py +0 -0
- {lionagi-0.0.312/lionagi/integrations/bridge/pydantic_ → lionagi-0.2.3/lionagi/core/engine}/__init__.py +0 -0
- {lionagi-0.0.312/lionagi/tests → lionagi-0.2.3/lionagi/core/executor}/__init__.py +0 -0
- {lionagi-0.0.312/lionagi/tests/test_core → lionagi-0.2.3/lionagi/core/rule}/__init__.py +0 -0
- {lionagi-0.0.312/lionagi/tests/test_integrations → lionagi-0.2.3/lionagi/core/session}/__init__.py +0 -0
- {lionagi-0.0.312/lionagi/tests/test_libs → lionagi-0.2.3/lionagi/core/unit/template}/__init__.py +0 -0
- /lionagi-0.0.312/lionagi/integrations/bridge/llamaindex_/index.py → /lionagi-0.2.3/lionagi/core/validator/__init__.py +0 -0
- /lionagi-0.0.312/lionagi/integrations/bridge/pydantic_/pydantic_bridge.py → /lionagi-0.2.3/lionagi/core/work/__init__.py +0 -0
- /lionagi-0.0.312/lionagi/tests/test_libs/test_async.py → /lionagi-0.2.3/lionagi/experimental/__init__.py +0 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/bridge/__init__.py +0 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/bridge/langchain_/langchain_bridge.py +0 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/bridge/llamaindex_/reader.py +0 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/bridge/llamaindex_/textnode.py +0 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/config/__init__.py +0 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/config/mlx_configs.py +0 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/provider/__init__.py +0 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/provider/mistralai.py +0 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/libs/ln_async.py +0 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/libs/ln_dataframe.py +0 -0
- {lionagi-0.0.312/lionagi/tests/test_libs → lionagi-0.2.3/lionagi/tests/libs}/test_api.py +0 -0
- {lionagi-0.0.312/lionagi/tests/test_libs → lionagi-0.2.3/lionagi/tests/libs}/test_convert.py +0 -0
- {lionagi-0.0.312/lionagi/tests/test_libs → lionagi-0.2.3/lionagi/tests/libs}/test_sys_util.py +0 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi.egg-info/dependency_links.txt +0 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/lionagi.egg-info/top_level.txt +0 -0
- {lionagi-0.0.312 → lionagi-0.2.3}/setup.cfg +0 -0
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
Apache License
|
2
2
|
Version 2.0, January 2004
|
3
3
|
http://www.apache.org/licenses/
|
4
4
|
|
@@ -186,16 +186,17 @@
|
|
186
186
|
same "printed page" as the copyright notice for easier
|
187
187
|
identification within third-party archives.
|
188
188
|
|
189
|
-
Copyright 2023 HaiyangLi <ocean@lionagi.ai>
|
190
189
|
|
191
|
-
|
192
|
-
you may not use this file except in compliance with the License.
|
193
|
-
You may obtain a copy of the License at
|
190
|
+
Copyright 2024 HaiyangLi
|
194
191
|
|
195
|
-
|
192
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
193
|
+
you may not use this file except in compliance with the License.
|
194
|
+
You may obtain a copy of the License at
|
196
195
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
196
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
197
|
+
|
198
|
+
Unless required by applicable law or agreed to in writing, software
|
199
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
200
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
201
|
+
See the License for the specific language governing permissions and
|
202
|
+
limitations under the License.
|
@@ -1,10 +1,10 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: lionagi
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.2.3
|
4
4
|
Summary: Towards automated general intelligence.
|
5
5
|
Author: HaiyangLi
|
6
6
|
Author-email: Haiyang Li <ocean@lionagi.ai>
|
7
|
-
License:
|
7
|
+
License: Apache License
|
8
8
|
Version 2.0, January 2004
|
9
9
|
http://www.apache.org/licenses/
|
10
10
|
|
@@ -192,19 +192,20 @@ License: Apache License
|
|
192
192
|
same "printed page" as the copyright notice for easier
|
193
193
|
identification within third-party archives.
|
194
194
|
|
195
|
-
Copyright 2023 HaiyangLi <ocean@lionagi.ai>
|
196
195
|
|
197
|
-
|
198
|
-
you may not use this file except in compliance with the License.
|
199
|
-
You may obtain a copy of the License at
|
196
|
+
Copyright 2024 HaiyangLi
|
200
197
|
|
201
|
-
|
198
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
199
|
+
you may not use this file except in compliance with the License.
|
200
|
+
You may obtain a copy of the License at
|
202
201
|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
202
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
203
|
+
|
204
|
+
Unless required by applicable law or agreed to in writing, software
|
205
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
206
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
207
|
+
See the License for the specific language governing permissions and
|
208
|
+
limitations under the License.
|
208
209
|
|
209
210
|
Project-URL: PyPI, https://pypi.org/project/lionagi/
|
210
211
|
Project-URL: Repository, https://github.com/lion-agi/lionagi
|
@@ -221,135 +222,40 @@ Requires-Dist: tiktoken>=0.5.1
|
|
221
222
|
Requires-Dist: pydantic>=2.6.0
|
222
223
|
Requires-Dist: aiocache>=0.12.2
|
223
224
|
Requires-Dist: pandas>=2.1.0
|
225
|
+
Requires-Dist: pytest>=8.2.2
|
226
|
+
Requires-Dist: moto>=5.0.9
|
227
|
+
Requires-Dist: PyYAML>=6.0.1
|
228
|
+
Requires-Dist: boto3>=1.34.131
|
224
229
|
|
225
230
|
![PyPI - Version](https://img.shields.io/pypi/v/lionagi?labelColor=233476aa&color=231fc935) ![PyPI - Downloads](https://img.shields.io/pypi/dm/lionagi?color=blue)
|
226
231
|
|
227
232
|
|
233
|
+
[PyPI](https://pypi.org/project/lionagi/) | [Documentation](https://ocean-lion.com/Welcome) | [Discord](https://discord.gg/aqSJ2v46vu) | [Roadmap](https://trello.com/b/3seomsrI/lionagi)
|
228
234
|
|
229
|
-
[PyPI](https://pypi.org/project/lionagi/) | [Documentation](https://ocean-lion.com/Welcome) | [Discord](https://discord.gg/xCkA5ErGmV)
|
230
235
|
|
231
|
-
|
232
|
-
|
236
|
+
# Language InterOperable Network - LION
|
237
|
+
### an AGentic Intelligence Operating System
|
233
238
|
|
234
|
-
To contribute, you need to make a fork first, and then make pull request from your fork.
|
235
239
|
```
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
**LionAGI is undergoing major transformation.**
|
241
|
-
|
242
|
-
It is an intelligent agentic workflow automation framework. It introduces advanced ML models into any existing workflows and data infrastructure.
|
243
|
-
|
244
|
-
#### Currently, it can
|
245
|
-
|
246
|
-
- generate inferences from almost all models including local
|
247
|
-
- run most model inferencing in parallel
|
248
|
-
- produce structured pydantic outputs with flexible usage
|
249
|
-
- automate workflow via graph based agents
|
250
|
-
- use advanced prompting techniques, i.e. ReAct (reason-action)
|
251
|
-
- …
|
252
|
-
|
253
|
-
#### It aims to:
|
254
|
-
|
255
|
-
- provide a centralized agent-managed framework for ML-powered tools coordination.
|
256
|
-
- such that, people can utilize intelligence to solve their problems in real life.
|
257
|
-
- achieve the goal by dramatically lowering the barrier of entries for creating use-case/domain specific tools.
|
258
|
-
|
259
|
-
#### Why?
|
260
|
-
|
261
|
-
- To better the human experience for more.
|
262
|
-
|
263
|
-
---
|
264
|
-
|
240
|
+
pip install lionagi==0.2.2
|
241
|
+
```
|
265
242
|
|
266
243
|
**Powerful Intelligent Workflow Automation**
|
267
244
|
|
268
|
-
|
245
|
+
lionagi is an intelligent agentic workflow automation framework. It introduces advanced ML models into any existing workflows and data infrastructure.
|
269
246
|
|
270
247
|
|
271
|
-
|
248
|
+
### Why Automating Workflows?
|
272
249
|
|
273
250
|
Intelligent AI models such as [Large Language Model (LLM)](https://en.wikipedia.org/wiki/Large_language_model), introduced new possibilities of human-computer interaction. LLMs is drawing a lot of attention worldwide due to its “one model fits all”, and incredible performance. One way of using LLM is to use as search engine, however, this usage is complicated by the fact that LLMs [hallucinate](https://arxiv.org/abs/2311.05232).
|
274
251
|
|
275
|
-
What goes inside of a LLM is more akin to a [black-box](https://pauldeepakraj-r.medium.com/demystifying-the-black-box-a-deep-dive-into-llm-interpretability-971524966fdf), lacking interpretability, meaning we don’t know how it reaches certain answer or conclusion, thus we cannot fully trust/rely the output from such a system.
|
276
|
-
|
277
|
-
<img width="500" alt="ReAct flow" src="https://github.com/lion-agi/lionagi/assets/122793010/fabec1eb-fa8e-4ce9-b75f-b7aca4809c0f">
|
278
|
-
|
279
|
-
|
280
|
-
Another approach of using LLM is to treat them as [intelligent agent](https://arxiv.org/html/2401.03428v1), that are equipped with various tools and data sources. A workflow conducted by such an intelligent agent have clear steps, and we can specify, observe, evaluate and optimize the logic for each decision that the `agent` made to perform actions. This approach, though we still cannot pinpoint how LLM output what it outputs, but the flow itself is **explainable**.
|
281
|
-
|
282
|
-
LionAGI `agent` can manage and direct other agents, can also use multiple different tools in parallel.
|
283
|
-
|
284
|
-
<img width="700" alt="parallel agents" src="https://github.com/lion-agi/lionagi/assets/122793010/ab263a6a-c7cc-40c3-8c03-ba1968df7309">
|
285
|
-
|
286
|
-
|
287
|
-
### Install LionAGI with pip:
|
288
|
-
|
289
|
-
```bash
|
290
|
-
pip install lionagi
|
291
|
-
```
|
292
|
-
Download the `.env_template` file, input your appropriate `API_KEY`, save the file, rename as `.env` and put in your project's root directory.
|
293
|
-
by default we use `OPENAI_API_KEY`.
|
294
|
-
|
295
|
-
|
296
|
-
### Quick Start
|
297
|
-
|
298
|
-
The following example shows how to use LionAGI's `Session` object to interact with `gpt-4-turbo` model:
|
299
|
-
|
300
|
-
```python
|
301
|
-
|
302
|
-
# define system messages, context and user instruction
|
303
|
-
system = "You are a helpful assistant designed to perform calculations."
|
304
|
-
instruction = {"Addition":"Add the two numbers together i.e. x+y"}
|
305
|
-
context = {"x": 10, "y": 5}
|
306
|
-
|
307
|
-
model="gpt-4-turbo-preview"
|
308
|
-
```
|
309
|
-
|
310
|
-
```python
|
311
|
-
# in interactive environment (.ipynb for example)
|
312
|
-
from lionagi import Session
|
313
|
-
|
314
|
-
calculator = Session(system)
|
315
|
-
result = await calculator.chat(instruction, context=context, model=model)
|
316
|
-
|
317
|
-
print(f"Calculation Result: {result}")
|
318
|
-
```
|
319
|
-
|
320
|
-
```python
|
321
|
-
# or otherwise, you can use
|
322
|
-
import asyncio
|
323
|
-
from dotenv import load_dotenv
|
324
|
-
|
325
|
-
load_dotenv()
|
326
|
-
|
327
|
-
from lionagi import Session
|
328
|
-
|
329
|
-
async def main():
|
330
|
-
calculator = Session(system)
|
331
|
-
result = await calculator.chat(instruction, context=context, model=model)
|
332
|
-
|
333
|
-
print(f"Calculation Result: {result}")
|
334
|
-
|
335
|
-
if __name__ == "__main__":
|
336
|
-
asyncio.run(main())
|
337
|
-
```
|
338
|
-
|
339
|
-
Visit our notebooks for examples.
|
252
|
+
What goes inside of a LLM is more akin to a [black-box](https://pauldeepakraj-r.medium.com/demystifying-the-black-box-a-deep-dive-into-llm-interpretability-971524966fdf), lacking interpretability, meaning we don’t know how it reaches certain answer or conclusion, thus we cannot fully trust/rely the output from such a system. Another approach of using LLM is to treat them as [intelligent agent](https://arxiv.org/html/2401.03428v1), that are equipped with various tools and data sources. A workflow conducted by such an intelligent agent have clear steps, and we can specify, observe, evaluate and optimize the logic for each decision that the `agent` made to perform actions. This approach, though we still cannot pinpoint how LLM output what it outputs, but the flow itself is **explainable**.
|
340
253
|
|
341
|
-
LionAGI is designed to be `asynchronous` only, please check python official documentation on how `async` work: [here](https://docs.python.org/3/library/asyncio.html)
|
342
254
|
|
343
|
-
---
|
344
255
|
|
345
|
-
**Notice**:
|
346
|
-
* calling API with maximum throughput over large set of data with advanced models i.e. gpt-4 can get **EXPENSIVE IN JUST SECONDS**,
|
347
|
-
* please know what you are doing, and check the usage on OpenAI regularly
|
348
|
-
* default rate limits are set to be 1,000 requests, 100,000 tokens per miniute, please check the [OpenAI usage limit documentation](https://platform.openai.com/docs/guides/rate-limits?context=tier-free) you can modify token rate parameters to fit different use cases.
|
349
|
-
* if you would like to build from source, please download the [latest release](https://github.com/lion-agi/lionagi/releases),
|
350
256
|
### Community
|
351
257
|
|
352
|
-
We encourage contributions to LionAGI and invite you to enrich its features and capabilities. Engage with us and other community members [Join Our Discord](https://discord.gg/
|
258
|
+
We encourage contributions to LionAGI and invite you to enrich its features and capabilities. Engage with us and other community members [Join Our Discord](https://discord.gg/aqSJ2v46vu)
|
353
259
|
|
354
260
|
### Citation
|
355
261
|
|
lionagi-0.2.3/README.md
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
![PyPI - Version](https://img.shields.io/pypi/v/lionagi?labelColor=233476aa&color=231fc935) ![PyPI - Downloads](https://img.shields.io/pypi/dm/lionagi?color=blue)
|
2
|
+
|
3
|
+
|
4
|
+
[PyPI](https://pypi.org/project/lionagi/) | [Documentation](https://ocean-lion.com/Welcome) | [Discord](https://discord.gg/aqSJ2v46vu) | [Roadmap](https://trello.com/b/3seomsrI/lionagi)
|
5
|
+
|
6
|
+
|
7
|
+
# Language InterOperable Network - LION
|
8
|
+
### an AGentic Intelligence Operating System
|
9
|
+
|
10
|
+
```
|
11
|
+
pip install lionagi==0.2.2
|
12
|
+
```
|
13
|
+
|
14
|
+
**Powerful Intelligent Workflow Automation**
|
15
|
+
|
16
|
+
lionagi is an intelligent agentic workflow automation framework. It introduces advanced ML models into any existing workflows and data infrastructure.
|
17
|
+
|
18
|
+
|
19
|
+
### Why Automating Workflows?
|
20
|
+
|
21
|
+
Intelligent AI models such as [Large Language Model (LLM)](https://en.wikipedia.org/wiki/Large_language_model), introduced new possibilities of human-computer interaction. LLMs is drawing a lot of attention worldwide due to its “one model fits all”, and incredible performance. One way of using LLM is to use as search engine, however, this usage is complicated by the fact that LLMs [hallucinate](https://arxiv.org/abs/2311.05232).
|
22
|
+
|
23
|
+
What goes inside of a LLM is more akin to a [black-box](https://pauldeepakraj-r.medium.com/demystifying-the-black-box-a-deep-dive-into-llm-interpretability-971524966fdf), lacking interpretability, meaning we don’t know how it reaches certain answer or conclusion, thus we cannot fully trust/rely the output from such a system. Another approach of using LLM is to treat them as [intelligent agent](https://arxiv.org/html/2401.03428v1), that are equipped with various tools and data sources. A workflow conducted by such an intelligent agent have clear steps, and we can specify, observe, evaluate and optimize the logic for each decision that the `agent` made to perform actions. This approach, though we still cannot pinpoint how LLM output what it outputs, but the flow itself is **explainable**.
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
### Community
|
28
|
+
|
29
|
+
We encourage contributions to LionAGI and invite you to enrich its features and capabilities. Engage with us and other community members [Join Our Discord](https://discord.gg/aqSJ2v46vu)
|
30
|
+
|
31
|
+
### Citation
|
32
|
+
|
33
|
+
When referencing LionAGI in your projects or research, please cite:
|
34
|
+
|
35
|
+
```bibtex
|
36
|
+
@software{Li_LionAGI_2023,
|
37
|
+
author = {Haiyang Li},
|
38
|
+
month = {12},
|
39
|
+
year = {2023},
|
40
|
+
title = {LionAGI: Towards Automated General Intelligence},
|
41
|
+
url = {https://github.com/lion-agi/lionagi},
|
42
|
+
}
|
43
|
+
```
|
44
|
+
|
45
|
+
|
46
|
+
### Requirements
|
47
|
+
Python 3.10 or higher.
|
48
|
+
|
@@ -0,0 +1,73 @@
|
|
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
|
+
|
17
|
+
import logging
|
18
|
+
from .version import __version__
|
19
|
+
from dotenv import load_dotenv
|
20
|
+
|
21
|
+
from lionagi.libs.ln_convert import to_list, to_dict, to_df, to_readable_dict
|
22
|
+
from lionagi.libs.ln_func_call import alcall, bcall, lcall, CallDecorator as cd, tcall
|
23
|
+
from lionagi.core.collections.abc import Field
|
24
|
+
from lionagi.core.collections import progression, flow, pile, iModel
|
25
|
+
from lionagi.core.generic import Node, Graph, Tree, Edge
|
26
|
+
from lionagi.core.action import func_to_tool
|
27
|
+
from lionagi.core.report import Form, Report
|
28
|
+
from lionagi.core.session.branch import Branch
|
29
|
+
from lionagi.core.session.session import Session
|
30
|
+
from lionagi.core.work.worker import work, Worker, worklink
|
31
|
+
from lionagi.integrations.provider.services import Services
|
32
|
+
from lionagi.integrations.chunker.chunk import chunk
|
33
|
+
from lionagi.integrations.loader.load import load
|
34
|
+
import lionagi.core.director.direct as direct
|
35
|
+
|
36
|
+
|
37
|
+
__all__ = [
|
38
|
+
"Field",
|
39
|
+
"progression",
|
40
|
+
"flow",
|
41
|
+
"pile",
|
42
|
+
"iModel",
|
43
|
+
"work",
|
44
|
+
"worklink",
|
45
|
+
"Worker",
|
46
|
+
"Branch",
|
47
|
+
"Session",
|
48
|
+
"Form",
|
49
|
+
"Report",
|
50
|
+
"Services",
|
51
|
+
"direct",
|
52
|
+
"Node",
|
53
|
+
"Graph",
|
54
|
+
"Tree",
|
55
|
+
"Edge",
|
56
|
+
"chunk",
|
57
|
+
"load",
|
58
|
+
"func_to_tool",
|
59
|
+
"cd",
|
60
|
+
"alcall",
|
61
|
+
"bcall",
|
62
|
+
"to_list",
|
63
|
+
"to_dict",
|
64
|
+
"lcall",
|
65
|
+
"to_df",
|
66
|
+
"tcall",
|
67
|
+
"to_readable_dict",
|
68
|
+
]
|
69
|
+
|
70
|
+
|
71
|
+
logger = logging.getLogger(__name__)
|
72
|
+
logger.setLevel(logging.INFO)
|
73
|
+
load_dotenv()
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# TODO
|
2
|
+
|
3
|
+
# import csv
|
4
|
+
# import json
|
5
|
+
# import threading
|
6
|
+
# from contextlib import contextmanager
|
7
|
+
|
8
|
+
|
9
|
+
# class Settings:
|
10
|
+
# def __init__(self):
|
11
|
+
# self._lock = threading.Lock()
|
12
|
+
# self._config = {}
|
13
|
+
# self._default_service = None
|
14
|
+
|
15
|
+
# def load_from_json(self, file_path):
|
16
|
+
# with self._lock:
|
17
|
+
# with open(file_path, "r") as file:
|
18
|
+
# self._config = json.load(file)
|
19
|
+
|
20
|
+
# def save_to_json(self, file_path):
|
21
|
+
# with self._lock:
|
22
|
+
# with open(file_path, "w") as file:
|
23
|
+
# json.dump(self._config, file, indent=4)
|
24
|
+
|
25
|
+
# def load_default_service(self, file_path):
|
26
|
+
# with self._lock:
|
27
|
+
# with open(file_path, "r") as file:
|
28
|
+
# reader = csv.DictReader(file)
|
29
|
+
# self._default_service = next(reader)
|
30
|
+
|
31
|
+
# def save_default_service(self, file_path):
|
32
|
+
# with self._lock:
|
33
|
+
# fieldnames = ["provider", "api_key", "rate_limit"]
|
34
|
+
# with open(file_path, "w", newline="") as file:
|
35
|
+
# writer = csv.DictWriter(file, fieldnames=fieldnames)
|
36
|
+
# writer.writeheader()
|
37
|
+
# writer.writerow(self._default_service)
|
38
|
+
|
39
|
+
# @contextmanager
|
40
|
+
# def service_context(self, provider=None, api_key=None, rate_limit=None):
|
41
|
+
# with self._lock:
|
42
|
+
# service_config = {
|
43
|
+
# "provider": provider or self._default_service["provider"],
|
44
|
+
# "api_key": api_key or self._default_service["api_key"],
|
45
|
+
# "rate_limit": rate_limit or self._default_service["rate_limit"],
|
46
|
+
# }
|
47
|
+
# yield service_config
|
48
|
+
|
49
|
+
# def get_config(self, key):
|
50
|
+
# with self._lock:
|
51
|
+
# return self._config.get(key)
|
52
|
+
|
53
|
+
# def set_config(self, key, value):
|
54
|
+
# with self._lock:
|
55
|
+
# self._config[key] = value
|
56
|
+
|
57
|
+
|
58
|
+
# # Singleton instance
|
59
|
+
# lionagi_settings = Settings()
|
@@ -0,0 +1,14 @@
|
|
1
|
+
from .function_calling import FunctionCalling
|
2
|
+
from .tool import Tool
|
3
|
+
from .tool_manager import ToolManager, func_to_tool
|
4
|
+
from .node import ActionNode, DirectiveSelection
|
5
|
+
|
6
|
+
|
7
|
+
__all__ = [
|
8
|
+
"FunctionCalling",
|
9
|
+
"Tool",
|
10
|
+
"ToolManager",
|
11
|
+
"func_to_tool",
|
12
|
+
"ActionNode",
|
13
|
+
"DirectiveSelection",
|
14
|
+
]
|
@@ -0,0 +1,136 @@
|
|
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
|
+
|
17
|
+
"""
|
18
|
+
This module defines the FunctionCalling class, which facilitates dynamic
|
19
|
+
invocation of functions based on various input types. It supports initializing
|
20
|
+
function calls from tuples, dictionaries, ActionRequest objects, or JSON strings.
|
21
|
+
|
22
|
+
Note:
|
23
|
+
Function Calling object is the only way for AI system to call functions.
|
24
|
+
"""
|
25
|
+
|
26
|
+
from functools import singledispatchmethod
|
27
|
+
from typing import Any, Callable, Dict
|
28
|
+
|
29
|
+
from lionagi.libs import ParseUtil
|
30
|
+
from lionagi.libs.ln_func_call import call_handler
|
31
|
+
from lionagi.core.collections.abc import Actionable
|
32
|
+
from lionagi.core.message.action_request import ActionRequest
|
33
|
+
|
34
|
+
|
35
|
+
class FunctionCalling(Actionable):
|
36
|
+
"""
|
37
|
+
A class for dynamically invoking functions based on various input types,
|
38
|
+
allowing for specification of the function and arguments through multiple
|
39
|
+
formats including tuples, dictionaries, ActionRequests, or JSON strings.
|
40
|
+
"""
|
41
|
+
|
42
|
+
def __init__(self, function: Callable, arguments: Dict[str, Any] = None):
|
43
|
+
"""
|
44
|
+
Initializes a new instance of FunctionCalling with the given function
|
45
|
+
and optional arguments.
|
46
|
+
|
47
|
+
Args:
|
48
|
+
function (Callable): The function to be called.
|
49
|
+
arguments (Dict[str, Any]): Arguments to pass to the function.
|
50
|
+
Defaults to an empty dictionary.
|
51
|
+
"""
|
52
|
+
self.function = function
|
53
|
+
self.arguments = arguments or {}
|
54
|
+
|
55
|
+
@property
|
56
|
+
def func_name(self) -> str:
|
57
|
+
"""
|
58
|
+
Returns the name of the function.
|
59
|
+
|
60
|
+
Returns:
|
61
|
+
str: The function's name.
|
62
|
+
"""
|
63
|
+
return self.function.__name__
|
64
|
+
|
65
|
+
@singledispatchmethod
|
66
|
+
@classmethod
|
67
|
+
def create(cls, func_call: Any) -> "FunctionCalling":
|
68
|
+
"""
|
69
|
+
Creates an instance of FunctionCalling based on the type of input.
|
70
|
+
|
71
|
+
Args:
|
72
|
+
func_call (Any): The function call description, which can be a tuple, dict,
|
73
|
+
ActionRequest, or JSON string.
|
74
|
+
|
75
|
+
Returns:
|
76
|
+
FunctionCalling: An instance of FunctionCalling prepared to invoke
|
77
|
+
the specified function.
|
78
|
+
|
79
|
+
Raises:
|
80
|
+
TypeError: If the input type is not supported.
|
81
|
+
"""
|
82
|
+
raise TypeError(f"Unsupported type {type(func_call)}")
|
83
|
+
|
84
|
+
@create.register(tuple)
|
85
|
+
def _(cls, function_calling: tuple) -> "FunctionCalling":
|
86
|
+
if len(function_calling) == 2:
|
87
|
+
return cls(function=function_calling[0], arguments=function_calling[1])
|
88
|
+
else:
|
89
|
+
raise ValueError(f"Invalid function call {function_calling}")
|
90
|
+
|
91
|
+
@create.register(dict)
|
92
|
+
def _(cls, function_calling: Dict[str, Any]) -> "FunctionCalling":
|
93
|
+
if len(function_calling) == 2 and (
|
94
|
+
{"function", "arguments"} <= function_calling.keys()
|
95
|
+
):
|
96
|
+
return cls.create(
|
97
|
+
(function_calling["function"], function_calling["arguments"])
|
98
|
+
)
|
99
|
+
raise ValueError(f"Invalid function call {function_calling}")
|
100
|
+
|
101
|
+
@create.register(ActionRequest)
|
102
|
+
def _(cls, function_calling: ActionRequest) -> "FunctionCalling":
|
103
|
+
return cls.create((function_calling.function, function_calling.arguments))
|
104
|
+
|
105
|
+
@create.register(str)
|
106
|
+
def _(cls, function_calling: str) -> "FunctionCalling":
|
107
|
+
_call = None
|
108
|
+
try:
|
109
|
+
_call = ParseUtil.fuzzy_parse_json(function_calling)
|
110
|
+
except Exception as e:
|
111
|
+
raise ValueError(f"Invalid function call {function_calling}") from e
|
112
|
+
|
113
|
+
if isinstance(_call, dict):
|
114
|
+
return cls.create(_call)
|
115
|
+
raise ValueError(f"Invalid function call {function_calling}")
|
116
|
+
|
117
|
+
async def invoke(self) -> Any:
|
118
|
+
"""
|
119
|
+
Asynchronously invokes the stored function with the provided arguments.
|
120
|
+
|
121
|
+
Returns:
|
122
|
+
Any: The result of the function call.
|
123
|
+
"""
|
124
|
+
return await call_handler(self.function, **self.arguments)
|
125
|
+
|
126
|
+
def __str__(self) -> str:
|
127
|
+
"""
|
128
|
+
Returns a string representation of the function call.
|
129
|
+
|
130
|
+
Returns:
|
131
|
+
str: String representation of the function call.
|
132
|
+
"""
|
133
|
+
return f"{self.func_name}({self.arguments})"
|
134
|
+
|
135
|
+
def __repr__(self) -> str:
|
136
|
+
return self.__str__()
|
@@ -0,0 +1 @@
|
|
1
|
+
# TODO
|
@@ -0,0 +1,109 @@
|
|
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
|
+
|
17
|
+
from pydantic import Field
|
18
|
+
|
19
|
+
from lionagi.core.collections.abc import Actionable
|
20
|
+
from lionagi.core.generic.node import Node
|
21
|
+
from .tool import Tool
|
22
|
+
|
23
|
+
|
24
|
+
class DirectiveSelection(Node, Actionable):
|
25
|
+
"""
|
26
|
+
Represents a directive selection node which can be invoked to perform an action.
|
27
|
+
|
28
|
+
Attributes:
|
29
|
+
directive (str): The action to be performed, with a default value of "chat".
|
30
|
+
directive_kwargs (dict): The arguments for the action.
|
31
|
+
|
32
|
+
Methods:
|
33
|
+
invoke(): An asynchronous method to perform the action defined by the directive.
|
34
|
+
"""
|
35
|
+
|
36
|
+
directive: str = Field(
|
37
|
+
"chat", description="The action to be performed", alias="action_type"
|
38
|
+
)
|
39
|
+
directive_kwargs: dict = Field(
|
40
|
+
default_factory=dict,
|
41
|
+
description="The arguments for the action",
|
42
|
+
alias="action_arguments",
|
43
|
+
)
|
44
|
+
|
45
|
+
async def invoke(self):
|
46
|
+
"""
|
47
|
+
Perform the action defined by the directive.
|
48
|
+
|
49
|
+
This method is intended to be overridden by subclasses to provide specific
|
50
|
+
implementation details for the action.
|
51
|
+
"""
|
52
|
+
pass
|
53
|
+
|
54
|
+
|
55
|
+
class ActionNode(DirectiveSelection):
|
56
|
+
"""
|
57
|
+
Represents an action node that can invoke actions within a branch using tools and instructions.
|
58
|
+
|
59
|
+
Attributes:
|
60
|
+
tools (list[Tool] | Tool | None): The tools to be used in the action.
|
61
|
+
instruction (Node): The instruction for the action.
|
62
|
+
|
63
|
+
Methods:
|
64
|
+
invoke(branch, context=None): An asynchronous method to invoke the action
|
65
|
+
within the given branch.
|
66
|
+
"""
|
67
|
+
|
68
|
+
tools: list[Tool] | Tool | None = Field(
|
69
|
+
default_factory=list,
|
70
|
+
description="The tools to be used in the action",
|
71
|
+
alias="tool",
|
72
|
+
)
|
73
|
+
instruction: Node = Field(
|
74
|
+
..., description="The instruction for the action", alias="instruct"
|
75
|
+
)
|
76
|
+
|
77
|
+
async def invoke(self, branch, context=None):
|
78
|
+
"""
|
79
|
+
Invoke the action within the given branch.
|
80
|
+
|
81
|
+
Args:
|
82
|
+
branch: The branch in which to perform the action.
|
83
|
+
context: Optional; Additional context for the action.
|
84
|
+
|
85
|
+
Returns:
|
86
|
+
The result of the action, depending on the directive.
|
87
|
+
|
88
|
+
Raises:
|
89
|
+
ValueError: If the directive is not "chat" or "direct".
|
90
|
+
"""
|
91
|
+
if self.directive == "chat":
|
92
|
+
return await branch.chat(
|
93
|
+
instruction=self.instruction.instruct,
|
94
|
+
tools=self.tools,
|
95
|
+
**self.directive_kwargs,
|
96
|
+
)
|
97
|
+
elif self.directive == "direct":
|
98
|
+
if self.tools:
|
99
|
+
self.directive_kwargs["allow_action"] = True
|
100
|
+
return await branch.direct(
|
101
|
+
instruction=self.instruction.instruct,
|
102
|
+
context=context,
|
103
|
+
tools=self.tools,
|
104
|
+
**self.directive_kwargs,
|
105
|
+
)
|
106
|
+
else:
|
107
|
+
raise ValueError(
|
108
|
+
'Invalid directive, valid directives are: "chat", "direct"'
|
109
|
+
)
|