lionagi 0.15.1__tar.gz → 0.15.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {lionagi-0.15.1 → lionagi-0.15.3}/PKG-INFO +2 -2
- {lionagi-0.15.1 → lionagi-0.15.3}/README.md +1 -1
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/builder.py +4 -2
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/flow.py +147 -36
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/node.py +3 -2
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/generic/event.py +2 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/connections/api_calling.py +1 -1
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/connections/endpoint.py +2 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/session/session.py +25 -0
- lionagi-0.15.3/lionagi/version.py +1 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/pyproject.toml +1 -1
- {lionagi-0.15.1 → lionagi-0.15.3}/uv.lock +1 -1
- lionagi-0.15.1/lionagi/version.py +0 -1
- {lionagi-0.15.1 → lionagi-0.15.3}/.coveragerc +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/.env.example +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/.github/FUNDING.yml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/.github/dependabot.yml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/.github/workflows/ci.yml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/.github/workflows/codeql.yml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/.github/workflows/docs.yml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/.github/workflows/release.yml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/.gitignore +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/.pre-commit-config.yaml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/.python-version +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/CODE_OF_CONDUCT.md +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/CONTRIBUTING.md +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/LICENSE +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/assets/operation_builder.gif +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/cookbooks/001_branch_converse.ipynb +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/cookbooks/002_branch_interact.ipynb +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/cookbooks/003_branch_info.ipynb +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/cookbooks/004_conversation_patterns.ipynb +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/cookbooks/005_react_basics.ipynb +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/cookbooks/006_operation_graphs_claim_extraction.ipynb +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/cookbooks/007_fan_out_in.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/cookbooks/claude_proxy/README.md +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/cookbooks/claude_proxy/claude_code_proxy.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/cookbooks/claude_proxy/run_w_claude_code_proxy.ipynb +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/cookbooks/data/002_comedian.json +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/cookbooks/data/002_critic.json +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/cookbooks/data/006_lion_proof_ch2.md +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/cookbooks/using_claude_code.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/Makefile +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/_static/custom.css +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/_templates/layout.html +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/conf.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/discussions/anyio-migration.md +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/index.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/action.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/adapter.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/branch.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/branch_operations.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/concepts.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/element_id.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/event.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/form.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/graph.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/index.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/instruct.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/lib_file.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/lib_nested.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/lib_package.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/lib_schema.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/lib_validate.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/log.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/mail.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/message.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/models.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/operative_step.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/pile.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/processor.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/progression.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/service.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/session.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/modules/utils.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/tutorials/get_started.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/tutorials/get_started_pt2.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/tutorials/get_started_pt3.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/docs/tutorials/index.rst +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/_class_registry.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/_errors.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/_types.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/adapters/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/adapters/async_postgres_adapter.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/adapters/postgres_model_adapter.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/config.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/fields/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/fields/action.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/fields/base.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/fields/code.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/fields/file.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/fields/instruct.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/fields/reason.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/fields/research.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/concurrency.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/file/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/file/chunk.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/file/concat.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/file/concat_files.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/file/file_ops.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/file/params.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/file/process.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/file/save.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/nested/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/nested/flatten.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/nested/nfilter.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/nested/nget.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/nested/ninsert.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/nested/nmerge.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/nested/npop.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/nested/nset.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/nested/unflatten.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/nested/utils.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/package/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/package/imports.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/package/management.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/package/params.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/package/system.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/parse.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/schema/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/schema/as_readable.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/schema/extract_code_block.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/schema/extract_docstring.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/schema/function_to_schema.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/schema/json_schema.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/schema/load_pydantic_model_from_schema.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/base.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/llmlingua.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/perplexity.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/symbolic_compress_context.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/synthlang.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/synthlang_/base.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/synthlang_/resources/frameworks/abstract_algebra.toml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/synthlang_/resources/frameworks/category_theory.toml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/synthlang_/resources/frameworks/complex_analysis.toml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/synthlang_/resources/frameworks/framework_options.json +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/synthlang_/resources/frameworks/group_theory.toml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/synthlang_/resources/frameworks/math_logic.toml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/synthlang_/resources/frameworks/reflective_patterns.toml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/synthlang_/resources/frameworks/set_theory.toml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/synthlang_/resources/frameworks/topology_fundamentals.toml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/synthlang_/resources/mapping/lion_emoji_mapping.toml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/synthlang_/resources/mapping/python_math_mapping.toml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/synthlang_/resources/mapping/rust_chinese_mapping.toml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/synthlang_/resources/utility/base_synthlang_system_prompt.toml +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/synthlang_/translate_to_synthlang.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/token_transform/types.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/unstructured/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/unstructured/pdf_to_image.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/unstructured/read_image_to_base64.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/validate/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/validate/common_field_validators.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/validate/fuzzy_match_keys.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/validate/fuzzy_validate_mapping.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/validate/string_similarity.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/validate/to_num.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/validate/validate_boolean.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/libs/validate/xml_parser.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/ln/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/ln/_async_call.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/ln/_hash.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/ln/_list_call.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/ln/_models.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/ln/_to_list.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/ln/_types.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/ln/concurrency/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/ln/concurrency/cancel.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/ln/concurrency/errors.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/ln/concurrency/patterns.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/ln/concurrency/primitives.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/ln/concurrency/resource_tracker.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/ln/concurrency/task.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/ln/concurrency/throttle.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/ln/concurrency/utils.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/models/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/models/field_model.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/models/hashable_model.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/models/model_params.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/models/note.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/models/operable_model.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/models/schema_model.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/ReAct/ReAct.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/ReAct/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/ReAct/utils.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/_act/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/_act/act.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/brainstorm/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/brainstorm/brainstorm.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/brainstorm/prompt.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/chat/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/chat/chat.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/communicate/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/communicate/communicate.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/instruct/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/instruct/instruct.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/interpret/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/interpret/interpret.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/manager.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/operate/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/operate/operate.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/parse/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/parse/parse.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/plan/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/plan/plan.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/plan/prompt.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/select/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/select/select.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/select/utils.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/translate/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/translate/translate.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/types.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/operations/utils.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/_concepts.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/action/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/action/function_calling.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/action/manager.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/action/tool.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/forms/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/forms/base.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/forms/flow.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/forms/form.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/forms/report.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/generic/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/generic/element.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/generic/log.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/generic/pile.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/generic/processor.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/generic/progression.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/graph/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/graph/edge.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/graph/graph.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/graph/node.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/mail/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/mail/exchange.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/mail/mail.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/mail/mailbox.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/mail/manager.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/mail/package.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/messages/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/messages/action_request.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/messages/action_response.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/messages/assistant_response.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/messages/base.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/messages/instruction.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/messages/manager.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/messages/message.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/messages/system.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/messages/templates/README.md +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/messages/templates/action_request.jinja2 +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/messages/templates/action_response.jinja2 +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/messages/templates/assistant_response.jinja2 +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/messages/templates/instruction_message.jinja2 +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/messages/templates/system_message.jinja2 +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/messages/templates/tool_schemas.jinja2 +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/operatives/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/operatives/operative.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/operatives/step.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/protocols/types.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/py.typed +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/connections/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/connections/endpoint_config.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/connections/header_factory.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/connections/match_endpoint.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/connections/providers/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/connections/providers/anthropic_.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/connections/providers/claude_code_.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/connections/providers/claude_code_cli.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/connections/providers/exa_.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/connections/providers/oai_.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/connections/providers/ollama_.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/connections/providers/perplexity_.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/connections/providers/types.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/hooks/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/hooks/_types.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/hooks/_utils.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/hooks/hook_event.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/hooks/hook_registry.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/imodel.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/manager.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/rate_limited_processor.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/resilience.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/third_party/README.md +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/third_party/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/third_party/anthropic_models.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/third_party/claude_code.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/third_party/exa_models.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/third_party/openai_model_names.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/third_party/pplx_models.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/token_calculator.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/service/types.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/session/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/session/branch.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/session/prompts.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/settings.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/tools/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/tools/base.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/tools/file/__init__.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/tools/file/reader.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/tools/memory/tools.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/tools/types.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/lionagi/utils.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/main.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/scripts/README.md +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/scripts/concat.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/scripts/config.py +0 -0
- {lionagi-0.15.1 → lionagi-0.15.3}/scripts/update_openai_models.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: lionagi
|
3
|
-
Version: 0.15.
|
3
|
+
Version: 0.15.3
|
4
4
|
Summary: An Intelligence Operating System.
|
5
5
|
Author-email: HaiyangLi <quantocean.li@gmail.com>
|
6
6
|
License: Apache License
|
@@ -497,7 +497,7 @@ We welcome issues, ideas, and pull requests:
|
|
497
497
|
|
498
498
|
```
|
499
499
|
@software{Li_LionAGI_2023,
|
500
|
-
author = {Haiyang Li
|
500
|
+
author = {Haiyang Li},
|
501
501
|
month = {12},
|
502
502
|
year = {2023},
|
503
503
|
title = {LionAGI: Towards Automated General Intelligence},
|
@@ -225,7 +225,7 @@ We welcome issues, ideas, and pull requests:
|
|
225
225
|
|
226
226
|
```
|
227
227
|
@software{Li_LionAGI_2023,
|
228
|
-
author = {Haiyang Li
|
228
|
+
author = {Haiyang Li},
|
229
229
|
month = {12},
|
230
230
|
year = {2023},
|
231
231
|
title = {LionAGI: Towards Automated General Intelligence},
|
@@ -253,9 +253,11 @@ class OperationGraphBuilder:
|
|
253
253
|
if not sources:
|
254
254
|
raise ValueError("No source nodes for aggregation")
|
255
255
|
|
256
|
-
# Add aggregation metadata
|
256
|
+
# Add aggregation metadata - convert IDType to strings for JSON serialization
|
257
257
|
agg_params = {
|
258
|
-
"aggregation_sources":
|
258
|
+
"aggregation_sources": [
|
259
|
+
str(s) for s in sources
|
260
|
+
], # Convert IDType to strings
|
259
261
|
"aggregation_count": len(sources),
|
260
262
|
**parameters,
|
261
263
|
}
|
@@ -58,6 +58,7 @@ class DependencyAwareExecutor:
|
|
58
58
|
self.results = {}
|
59
59
|
self.completion_events = {} # operation_id -> Event
|
60
60
|
self.operation_branches = {} # operation_id -> Branch
|
61
|
+
self.skipped_operations = set() # Track skipped operations
|
61
62
|
|
62
63
|
# Initialize completion events for all operations
|
63
64
|
# and check for already completed operations
|
@@ -76,6 +77,9 @@ class DependencyAwareExecutor:
|
|
76
77
|
if not self.graph.is_acyclic():
|
77
78
|
raise ValueError("Graph must be acyclic for flow execution")
|
78
79
|
|
80
|
+
# Validate edge conditions before execution
|
81
|
+
self._validate_edge_conditions()
|
82
|
+
|
79
83
|
# Pre-allocate ALL branches upfront to avoid any locking during execution
|
80
84
|
await self._preallocate_all_branches()
|
81
85
|
|
@@ -94,13 +98,25 @@ class DependencyAwareExecutor:
|
|
94
98
|
if isinstance(node, Operation):
|
95
99
|
await tg.start_soon(self._execute_operation, node, limiter)
|
96
100
|
|
97
|
-
# Return results
|
98
|
-
|
99
|
-
|
101
|
+
# Return results - only include actually completed operations
|
102
|
+
completed_ops = [
|
103
|
+
op_id
|
104
|
+
for op_id in self.results.keys()
|
105
|
+
if op_id not in self.skipped_operations
|
106
|
+
]
|
107
|
+
|
108
|
+
result = {
|
109
|
+
"completed_operations": completed_ops,
|
100
110
|
"operation_results": self.results,
|
101
111
|
"final_context": self.context,
|
112
|
+
"skipped_operations": list(self.skipped_operations),
|
102
113
|
}
|
103
114
|
|
115
|
+
# Validate results before returning
|
116
|
+
self._validate_execution_results(result)
|
117
|
+
|
118
|
+
return result
|
119
|
+
|
104
120
|
async def _preallocate_all_branches(self):
|
105
121
|
"""Pre-allocate ALL branches including for context inheritance to eliminate runtime locking."""
|
106
122
|
operations_needing_branches = []
|
@@ -193,6 +209,23 @@ class DependencyAwareExecutor:
|
|
193
209
|
return
|
194
210
|
|
195
211
|
try:
|
212
|
+
# Check if this operation should be skipped due to edge conditions
|
213
|
+
should_execute = await self._check_edge_conditions(operation)
|
214
|
+
|
215
|
+
if not should_execute:
|
216
|
+
# Mark as skipped
|
217
|
+
operation.execution.status = EventStatus.SKIPPED
|
218
|
+
self.skipped_operations.add(operation.id)
|
219
|
+
|
220
|
+
if self.verbose:
|
221
|
+
print(
|
222
|
+
f"Skipping operation due to edge conditions: {str(operation.id)[:8]}"
|
223
|
+
)
|
224
|
+
|
225
|
+
# Signal completion so dependent operations can proceed
|
226
|
+
self.completion_events[operation.id].set()
|
227
|
+
return
|
228
|
+
|
196
229
|
# Wait for dependencies
|
197
230
|
await self._wait_for_dependencies(operation)
|
198
231
|
|
@@ -235,9 +268,56 @@ class DependencyAwareExecutor:
|
|
235
268
|
print(f"Operation {str(operation.id)[:8]} failed: {e}")
|
236
269
|
|
237
270
|
finally:
|
238
|
-
# Signal completion regardless of success/failure
|
271
|
+
# Signal completion regardless of success/failure/skip
|
239
272
|
self.completion_events[operation.id].set()
|
240
273
|
|
274
|
+
async def _check_edge_conditions(self, operation: Operation) -> bool:
|
275
|
+
"""
|
276
|
+
Check if operation should execute based on edge conditions.
|
277
|
+
|
278
|
+
Returns True if at least one valid path exists to this operation,
|
279
|
+
or if there are no incoming edges (head nodes).
|
280
|
+
Returns False if all incoming edges have failed conditions.
|
281
|
+
"""
|
282
|
+
# Get all incoming edges
|
283
|
+
incoming_edges = [
|
284
|
+
edge
|
285
|
+
for edge in self.graph.internal_edges.values()
|
286
|
+
if edge.tail == operation.id
|
287
|
+
]
|
288
|
+
|
289
|
+
# If no incoming edges, this is a head node - always execute
|
290
|
+
if not incoming_edges:
|
291
|
+
return True
|
292
|
+
|
293
|
+
# Check each incoming edge
|
294
|
+
has_valid_path = False
|
295
|
+
|
296
|
+
for edge in incoming_edges:
|
297
|
+
# Wait for the head operation to complete first
|
298
|
+
if edge.head in self.completion_events:
|
299
|
+
await self.completion_events[edge.head].wait()
|
300
|
+
|
301
|
+
# Check if the head operation was skipped
|
302
|
+
if edge.head in self.skipped_operations:
|
303
|
+
continue # This path is not valid
|
304
|
+
|
305
|
+
# Build context for edge condition evaluation
|
306
|
+
result_value = self.results.get(edge.head)
|
307
|
+
if result_value is not None and not isinstance(
|
308
|
+
result_value, (str, int, float, bool)
|
309
|
+
):
|
310
|
+
result_value = to_dict(result_value, recursive=True)
|
311
|
+
|
312
|
+
ctx = {"result": result_value, "context": self.context}
|
313
|
+
|
314
|
+
# Use edge.check_condition() which handles None conditions
|
315
|
+
if await edge.check_condition(ctx):
|
316
|
+
has_valid_path = True
|
317
|
+
break # At least one valid path found
|
318
|
+
|
319
|
+
return has_valid_path
|
320
|
+
|
241
321
|
async def _wait_for_dependencies(self, operation: Operation):
|
242
322
|
"""Wait for all dependencies to complete."""
|
243
323
|
# Special handling for aggregations
|
@@ -248,10 +328,14 @@ class DependencyAwareExecutor:
|
|
248
328
|
f"Aggregation {str(operation.id)[:8]} waiting for {len(sources)} sources"
|
249
329
|
)
|
250
330
|
|
251
|
-
# Wait for ALL sources
|
252
|
-
for
|
253
|
-
|
254
|
-
|
331
|
+
# Wait for ALL sources (sources are now strings from builder.py)
|
332
|
+
for source_id_str in sources:
|
333
|
+
# Convert string back to IDType for lookup
|
334
|
+
# Check all operations to find matching ID
|
335
|
+
for op_id in self.completion_events.keys():
|
336
|
+
if str(op_id) == source_id_str:
|
337
|
+
await self.completion_events[op_id].wait()
|
338
|
+
break
|
255
339
|
|
256
340
|
# Regular dependency checking
|
257
341
|
predecessors = self.graph.get_predecessors(operation)
|
@@ -262,32 +346,6 @@ class DependencyAwareExecutor:
|
|
262
346
|
)
|
263
347
|
await self.completion_events[pred.id].wait()
|
264
348
|
|
265
|
-
# Check edge conditions
|
266
|
-
incoming_edges = [
|
267
|
-
edge
|
268
|
-
for edge in self.graph.internal_edges.values()
|
269
|
-
if edge.tail == operation.id
|
270
|
-
]
|
271
|
-
|
272
|
-
for edge in incoming_edges:
|
273
|
-
# Wait for head to complete
|
274
|
-
if edge.head in self.completion_events:
|
275
|
-
await self.completion_events[edge.head].wait()
|
276
|
-
|
277
|
-
# Evaluate edge condition
|
278
|
-
if edge.condition is not None:
|
279
|
-
result_value = self.results.get(edge.head)
|
280
|
-
if result_value is not None and not isinstance(
|
281
|
-
result_value, (str, int, float, bool)
|
282
|
-
):
|
283
|
-
result_value = to_dict(result_value, recursive=True)
|
284
|
-
|
285
|
-
ctx = {"result": result_value, "context": self.context}
|
286
|
-
if not await edge.condition.apply(ctx):
|
287
|
-
raise ValueError(
|
288
|
-
f"Edge condition not satisfied for {str(operation.id)[:8]}"
|
289
|
-
)
|
290
|
-
|
291
349
|
def _prepare_operation(self, operation: Operation):
|
292
350
|
"""Prepare operation with context and branch assignment."""
|
293
351
|
# Update operation context with predecessors
|
@@ -295,13 +353,18 @@ class DependencyAwareExecutor:
|
|
295
353
|
if predecessors:
|
296
354
|
pred_context = {}
|
297
355
|
for pred in predecessors:
|
356
|
+
# Skip if predecessor was skipped
|
357
|
+
if pred.id in self.skipped_operations:
|
358
|
+
continue
|
359
|
+
|
298
360
|
if pred.id in self.results:
|
299
361
|
result = self.results[pred.id]
|
300
362
|
if result is not None and not isinstance(
|
301
363
|
result, (str, int, float, bool)
|
302
364
|
):
|
303
365
|
result = to_dict(result, recursive=True)
|
304
|
-
|
366
|
+
# Use string representation of IDType for JSON serialization
|
367
|
+
pred_context[f"{str(pred.id)}_result"] = result
|
305
368
|
|
306
369
|
if "context" not in operation.parameters:
|
307
370
|
operation.parameters["context"] = pred_context
|
@@ -364,7 +427,12 @@ class DependencyAwareExecutor:
|
|
364
427
|
):
|
365
428
|
branch._message_manager.pile.clear()
|
366
429
|
for msg in primary_branch._message_manager.pile:
|
367
|
-
|
430
|
+
if hasattr(msg, "clone"):
|
431
|
+
branch._message_manager.pile.append(
|
432
|
+
msg.clone()
|
433
|
+
)
|
434
|
+
else:
|
435
|
+
branch._message_manager.pile.append(msg)
|
368
436
|
|
369
437
|
# Clear the pending flag
|
370
438
|
branch.metadata["pending_context_inheritance"] = False
|
@@ -386,6 +454,49 @@ class DependencyAwareExecutor:
|
|
386
454
|
return self._default_branch
|
387
455
|
return self.session.default_branch
|
388
456
|
|
457
|
+
def _validate_edge_conditions(self):
|
458
|
+
"""Validate that all edge conditions are properly configured."""
|
459
|
+
for edge in self.graph.internal_edges.values():
|
460
|
+
if edge.condition is not None:
|
461
|
+
# Ensure condition is an EdgeCondition instance
|
462
|
+
from lionagi.protocols.graph.edge import EdgeCondition
|
463
|
+
|
464
|
+
if not isinstance(edge.condition, EdgeCondition):
|
465
|
+
raise TypeError(
|
466
|
+
f"Edge {edge.id} has invalid condition type: {type(edge.condition)}. "
|
467
|
+
"Must be EdgeCondition or None."
|
468
|
+
)
|
469
|
+
|
470
|
+
# Ensure condition has apply method
|
471
|
+
if not hasattr(edge.condition, "apply"):
|
472
|
+
raise AttributeError(
|
473
|
+
f"Edge {edge.id} condition missing 'apply' method."
|
474
|
+
)
|
475
|
+
|
476
|
+
def _validate_execution_results(self, results: dict[str, Any]):
|
477
|
+
"""Validate execution results for consistency."""
|
478
|
+
completed = set(results.get("completed_operations", []))
|
479
|
+
skipped = set(results.get("skipped_operations", []))
|
480
|
+
|
481
|
+
# Check for operations in both lists
|
482
|
+
overlap = completed & skipped
|
483
|
+
if overlap:
|
484
|
+
raise RuntimeError(
|
485
|
+
f"Operations {overlap} appear in both completed and skipped lists! "
|
486
|
+
"This indicates a bug in edge condition handling."
|
487
|
+
)
|
488
|
+
|
489
|
+
# Verify skipped operations have proper status
|
490
|
+
for node in self.graph.internal_nodes.values():
|
491
|
+
if isinstance(node, Operation) and node.id in skipped:
|
492
|
+
if node.execution.status != EventStatus.SKIPPED:
|
493
|
+
# Log warning but don't fail - status might not be perfectly synced
|
494
|
+
if self.verbose:
|
495
|
+
print(
|
496
|
+
f"Warning: Skipped operation {node.id} has status "
|
497
|
+
f"{node.execution.status} instead of SKIPPED"
|
498
|
+
)
|
499
|
+
|
389
500
|
|
390
501
|
async def flow(
|
391
502
|
session: Session,
|
@@ -3,6 +3,7 @@ import logging
|
|
3
3
|
from typing import Any, Literal
|
4
4
|
from uuid import UUID
|
5
5
|
|
6
|
+
from anyio import get_cancelled_exc_class
|
6
7
|
from pydantic import BaseModel, Field
|
7
8
|
|
8
9
|
from lionagi.protocols.types import ID, Event, EventStatus, IDType, Node
|
@@ -87,9 +88,9 @@ class Operation(Node, Event):
|
|
87
88
|
self.execution.response = response
|
88
89
|
self.execution.status = EventStatus.COMPLETED
|
89
90
|
|
90
|
-
except
|
91
|
+
except get_cancelled_exc_class():
|
91
92
|
self.execution.error = "Operation cancelled"
|
92
|
-
self.execution.status = EventStatus.
|
93
|
+
self.execution.status = EventStatus.CANCELLED
|
93
94
|
raise
|
94
95
|
|
95
96
|
except Exception as e:
|
@@ -32,12 +32,14 @@ class EventStatus(str, Enum):
|
|
32
32
|
PROCESSING: Action is currently being executed.
|
33
33
|
COMPLETED: Action completed successfully.
|
34
34
|
FAILED: Action failed during execution.
|
35
|
+
SKIPPED: Action was skipped due to unmet conditions.
|
35
36
|
"""
|
36
37
|
|
37
38
|
PENDING = "pending"
|
38
39
|
PROCESSING = "processing"
|
39
40
|
COMPLETED = "completed"
|
40
41
|
FAILED = "failed"
|
42
|
+
SKIPPED = "skipped"
|
41
43
|
CANCELLED = "cancelled"
|
42
44
|
ABORTED = "aborted"
|
43
45
|
|
@@ -197,7 +197,7 @@ class APICalling(Event):
|
|
197
197
|
|
198
198
|
except get_cancelled_exc_class():
|
199
199
|
self.execution.error = "API call cancelled"
|
200
|
-
self.execution.status = EventStatus.
|
200
|
+
self.execution.status = EventStatus.CANCELLED
|
201
201
|
raise
|
202
202
|
|
203
203
|
except Exception as e:
|
@@ -86,6 +86,31 @@ class Session(Node, Communicatable, Relational):
|
|
86
86
|
):
|
87
87
|
self._operation_manager.register(operation, func, update=update)
|
88
88
|
|
89
|
+
def operation(self, name: str = None, *, update: bool = False):
|
90
|
+
"""
|
91
|
+
Decorator to automatically register functions as operations.
|
92
|
+
|
93
|
+
Args:
|
94
|
+
name: Operation name. If None, uses the function's __name__.
|
95
|
+
update: Whether to update if operation already exists.
|
96
|
+
|
97
|
+
Usage:
|
98
|
+
@session.operation()
|
99
|
+
async def read_issue():
|
100
|
+
...
|
101
|
+
|
102
|
+
@session.operation("custom_name")
|
103
|
+
async def some_function():
|
104
|
+
...
|
105
|
+
"""
|
106
|
+
|
107
|
+
def decorator(func: Callable) -> Callable:
|
108
|
+
operation_name = name if name is not None else func.__name__
|
109
|
+
self.register_operation(operation_name, func, update=update)
|
110
|
+
return func
|
111
|
+
|
112
|
+
return decorator
|
113
|
+
|
89
114
|
@model_validator(mode="after")
|
90
115
|
def _add_mail_sources(self) -> Self:
|
91
116
|
if self.default_branch is None:
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.15.3"
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.15.1"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|