lionagi 0.15.9__tar.gz → 0.15.11__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.9 → lionagi-0.15.11}/PKG-INFO +2 -2
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/__init__.py +4 -6
- lionagi-0.15.11/lionagi/adapters/async_postgres_adapter.py +98 -0
- lionagi-0.15.11/lionagi/libs/file/_utils.py +10 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/file/process.py +16 -13
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/unstructured/pdf_to_image.py +2 -2
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/__init__.py +28 -0
- lionagi-0.15.11/lionagi/ln/_extract_json.py +60 -0
- lionagi-0.15.11/lionagi/ln/_fuzzy_json.py +116 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/models/field_model.py +8 -6
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/__init__.py +3 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/builder.py +10 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/generic/element.py +22 -10
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/generic/pile.py +56 -1
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/generic/progression.py +11 -11
- lionagi-0.15.11/lionagi/protocols/graph/_utils.py +22 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/graph/graph.py +17 -21
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/graph/node.py +23 -5
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/manager.py +41 -45
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/operatives/step.py +2 -19
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/types.py +1 -2
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/tools/file/reader.py +5 -6
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/utils.py +8 -385
- lionagi-0.15.11/lionagi/version.py +1 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/pyproject.toml +2 -2
- {lionagi-0.15.9 → lionagi-0.15.11}/uv.lock +5 -5
- lionagi-0.15.9/lionagi/adapters/async_postgres_adapter.py +0 -362
- lionagi-0.15.9/lionagi/libs/package/imports.py +0 -21
- lionagi-0.15.9/lionagi/libs/package/management.py +0 -62
- lionagi-0.15.9/lionagi/libs/package/params.py +0 -30
- lionagi-0.15.9/lionagi/libs/package/system.py +0 -22
- lionagi-0.15.9/lionagi/tools/file/__init__.py +0 -3
- lionagi-0.15.9/lionagi/version.py +0 -1
- {lionagi-0.15.9 → lionagi-0.15.11}/.coveragerc +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/.env.example +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/.github/FUNDING.yml +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/.github/dependabot.yml +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/.github/workflows/ci.yml +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/.github/workflows/codeql.yml +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/.github/workflows/release.yml +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/.gitignore +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/.pre-commit-config.yaml +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/.python-version +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/CODE_OF_CONDUCT.md +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/CONTRIBUTING.md +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/LICENSE +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/README.md +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/assets/operation_builder.gif +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/001_branch_converse.ipynb +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/002_branch_interact.ipynb +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/003_branch_info.ipynb +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/004_conversation_patterns.ipynb +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/005_react_basics.ipynb +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/006_operation_graphs_claim_extraction.ipynb +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/007_fan_out_in.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/claude_proxy/README.md +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/claude_proxy/claude_code_proxy.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/claude_proxy/run_w_claude_code_proxy.ipynb +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/data/002_comedian.json +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/data/002_critic.json +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/data/006_lion_proof_ch2.md +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/using_claude_code.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/Makefile +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/_static/custom.css +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/_templates/layout.html +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/conf.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/discussions/anyio-migration.md +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/index.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/action.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/adapter.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/branch.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/branch_operations.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/concepts.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/element_id.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/event.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/form.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/graph.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/index.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/instruct.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/lib_file.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/lib_nested.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/lib_package.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/lib_schema.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/lib_validate.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/log.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/mail.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/message.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/models.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/operative_step.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/pile.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/processor.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/progression.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/service.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/session.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/utils.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/tutorials/get_started.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/tutorials/get_started_pt2.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/tutorials/get_started_pt3.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/docs/tutorials/index.rst +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/_class_registry.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/_errors.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/_types.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/adapters/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/adapters/_utils.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/adapters/postgres_model_adapter.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/config.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/fields/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/fields/action.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/fields/base.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/fields/code.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/fields/file.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/fields/instruct.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/fields/reason.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/fields/research.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/concurrency.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/file/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/file/chunk.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/file/concat.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/file/concat_files.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/file/file_ops.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/file/params.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/file/save.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/flatten.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/nfilter.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/nget.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/ninsert.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/nmerge.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/npop.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/nset.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/unflatten.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/utils.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/parse.py +0 -0
- {lionagi-0.15.9/lionagi/libs/package → lionagi-0.15.11/lionagi/libs/schema}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/schema/as_readable.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/schema/extract_code_block.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/schema/extract_docstring.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/schema/function_to_schema.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/schema/json_schema.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/schema/load_pydantic_model_from_schema.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/base.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/llmlingua.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/perplexity.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/symbolic_compress_context.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/base.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/abstract_algebra.toml +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/category_theory.toml +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/complex_analysis.toml +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/framework_options.json +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/group_theory.toml +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/math_logic.toml +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/reflective_patterns.toml +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/set_theory.toml +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/topology_fundamentals.toml +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/mapping/lion_emoji_mapping.toml +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/mapping/python_math_mapping.toml +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/mapping/rust_chinese_mapping.toml +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/utility/base_synthlang_system_prompt.toml +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/translate_to_synthlang.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/types.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/unstructured/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/unstructured/read_image_to_base64.py +0 -0
- {lionagi-0.15.9/lionagi/libs/schema → lionagi-0.15.11/lionagi/libs/validate}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/validate/common_field_validators.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/validate/fuzzy_match_keys.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/validate/fuzzy_validate_mapping.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/validate/string_similarity.py +4 -4
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/validate/to_num.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/validate/validate_boolean.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/validate/xml_parser.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/_async_call.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/_hash.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/_json_dump.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/_list_call.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/_models.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/_to_list.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/_types.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/concurrency/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/concurrency/cancel.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/concurrency/errors.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/concurrency/patterns.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/concurrency/primitives.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/concurrency/resource_tracker.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/concurrency/task.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/concurrency/throttle.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/concurrency/utils.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/models/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/models/hashable_model.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/models/model_params.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/models/note.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/models/operable_model.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/models/schema_model.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/ReAct/ReAct.py +0 -0
- {lionagi-0.15.9/lionagi/libs/validate → lionagi-0.15.11/lionagi/operations/ReAct}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/ReAct/utils.py +0 -0
- {lionagi-0.15.9/lionagi/operations/ReAct → lionagi-0.15.11/lionagi/operations/_act}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/_act/act.py +0 -0
- {lionagi-0.15.9/lionagi/operations/_act → lionagi-0.15.11/lionagi/operations/brainstorm}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/brainstorm/brainstorm.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/brainstorm/prompt.py +0 -0
- {lionagi-0.15.9/lionagi/operations/brainstorm → lionagi-0.15.11/lionagi/operations/chat}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/chat/chat.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/communicate/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/communicate/communicate.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/flow.py +0 -0
- {lionagi-0.15.9/lionagi/operations/chat → lionagi-0.15.11/lionagi/operations/instruct}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/instruct/instruct.py +0 -0
- {lionagi-0.15.9/lionagi/operations/instruct → lionagi-0.15.11/lionagi/operations/interpret}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/interpret/interpret.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/manager.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/node.py +0 -0
- {lionagi-0.15.9/lionagi/operations/interpret → lionagi-0.15.11/lionagi/operations/operate}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/operate/operate.py +0 -0
- {lionagi-0.15.9/lionagi/operations/operate → lionagi-0.15.11/lionagi/operations/parse}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/parse/parse.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/plan/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/plan/plan.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/plan/prompt.py +0 -0
- {lionagi-0.15.9/lionagi/operations/parse → lionagi-0.15.11/lionagi/operations/select}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/select/select.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/select/utils.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/translate/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/translate/translate.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/types.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/utils.py +0 -0
- {lionagi-0.15.9/lionagi/operations/select → lionagi-0.15.11/lionagi/protocols}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/_concepts.py +0 -0
- {lionagi-0.15.9/lionagi/protocols → lionagi-0.15.11/lionagi/protocols/action}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/action/function_calling.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/action/manager.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/action/tool.py +0 -0
- {lionagi-0.15.9/lionagi/protocols/action → lionagi-0.15.11/lionagi/protocols/forms}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/forms/base.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/forms/flow.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/forms/form.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/forms/report.py +0 -0
- {lionagi-0.15.9/lionagi/protocols/forms → lionagi-0.15.11/lionagi/protocols/generic}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/generic/event.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/generic/log.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/generic/processor.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/graph/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/graph/edge.py +0 -0
- {lionagi-0.15.9/lionagi/protocols/generic → lionagi-0.15.11/lionagi/protocols/mail}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/mail/exchange.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/mail/mail.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/mail/mailbox.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/mail/manager.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/mail/package.py +0 -0
- {lionagi-0.15.9/lionagi/protocols/mail → lionagi-0.15.11/lionagi/protocols/messages}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/action_request.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/action_response.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/assistant_response.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/base.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/instruction.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/message.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/system.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/templates/README.md +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/templates/action_request.jinja2 +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/templates/action_response.jinja2 +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/templates/assistant_response.jinja2 +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/templates/instruction_message.jinja2 +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/templates/system_message.jinja2 +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/templates/tool_schemas.jinja2 +0 -0
- {lionagi-0.15.9/lionagi/protocols/messages → lionagi-0.15.11/lionagi/protocols/operatives}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/operatives/operative.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/py.typed +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/api_calling.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/endpoint.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/endpoint_config.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/header_factory.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/match_endpoint.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/providers/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/providers/anthropic_.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/providers/claude_code_.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/providers/claude_code_cli.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/providers/exa_.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/providers/oai_.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/providers/ollama_.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/providers/perplexity_.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/providers/types.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/hooks/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/hooks/_types.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/hooks/_utils.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/hooks/hook_event.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/hooks/hook_registry.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/imodel.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/manager.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/rate_limited_processor.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/resilience.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/third_party/README.md +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/third_party/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/third_party/anthropic_models.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/third_party/claude_code.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/third_party/exa_models.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/third_party/openai_model_names.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/third_party/pplx_models.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/token_calculator.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/types.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/session/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/session/branch.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/session/prompts.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/session/session.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/settings.py +0 -0
- {lionagi-0.15.9/lionagi/protocols/operatives → lionagi-0.15.11/lionagi/tools}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/tools/base.py +0 -0
- {lionagi-0.15.9/lionagi/tools → lionagi-0.15.11/lionagi/tools/file}/__init__.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/tools/memory/tools.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/tools/types.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/main.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/scripts/README.md +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/scripts/concat.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/scripts/config.py +0 -0
- {lionagi-0.15.9 → lionagi-0.15.11}/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.11
|
4
4
|
Summary: An Intelligence Operating System.
|
5
5
|
Author-email: HaiyangLi <quantocean.li@gmail.com>
|
6
6
|
License: Apache License
|
@@ -228,7 +228,7 @@ Requires-Dist: json-repair>=0.40.0
|
|
228
228
|
Requires-Dist: pillow>=11.0.0
|
229
229
|
Requires-Dist: psutil>=6.0.0
|
230
230
|
Requires-Dist: pydantic-settings>=2.8.0
|
231
|
-
Requires-Dist: pydapter[pandas]>=1.0.
|
231
|
+
Requires-Dist: pydapter[pandas]>=1.0.2
|
232
232
|
Requires-Dist: python-dotenv>=1.1.0
|
233
233
|
Requires-Dist: tiktoken>=0.9.0
|
234
234
|
Requires-Dist: toml>=0.8.0
|
@@ -7,9 +7,9 @@ import logging
|
|
7
7
|
from pydantic import BaseModel, Field
|
8
8
|
|
9
9
|
from . import _types as types
|
10
|
-
from .
|
11
|
-
from .operations import OperationGraphBuilder as Builder
|
12
|
-
from .operations import
|
10
|
+
from . import ln as ln
|
11
|
+
from .operations.builder import OperationGraphBuilder as Builder
|
12
|
+
from .operations.node import Operation
|
13
13
|
from .service.imodel import iModel
|
14
14
|
from .session.session import Branch, Session
|
15
15
|
from .version import __version__
|
@@ -28,7 +28,5 @@ __all__ = (
|
|
28
28
|
"logger",
|
29
29
|
"Builder",
|
30
30
|
"Operation",
|
31
|
-
"
|
32
|
-
"flow",
|
33
|
-
"plan",
|
31
|
+
"ln",
|
34
32
|
)
|
@@ -0,0 +1,98 @@
|
|
1
|
+
"""
|
2
|
+
Clean LionAGI async PostgreSQL adapter for integration into lionagi core.
|
3
|
+
|
4
|
+
This adapter leverages pydapter v1.0.2+ CRUD operations.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from __future__ import annotations
|
8
|
+
|
9
|
+
from typing import ClassVar, TypeVar
|
10
|
+
|
11
|
+
import sqlalchemy as sa
|
12
|
+
from pydapter.extras.async_postgres_ import AsyncPostgresAdapter
|
13
|
+
from sqlalchemy.ext.asyncio import create_async_engine
|
14
|
+
|
15
|
+
from ._utils import check_async_postgres_available
|
16
|
+
|
17
|
+
_ASYNC_POSTGRES_AVAILABLE = check_async_postgres_available()
|
18
|
+
|
19
|
+
if isinstance(_ASYNC_POSTGRES_AVAILABLE, ImportError):
|
20
|
+
raise _ASYNC_POSTGRES_AVAILABLE
|
21
|
+
|
22
|
+
T = TypeVar("T")
|
23
|
+
|
24
|
+
|
25
|
+
class LionAGIAsyncPostgresAdapter(AsyncPostgresAdapter[T]):
|
26
|
+
"""
|
27
|
+
Zero-config async PostgreSQL adapter for lionagi Nodes.
|
28
|
+
|
29
|
+
- Auto-creates tables with lionagi schema
|
30
|
+
- Changes default adapt_meth to "to_dict" for lionagi Elements
|
31
|
+
- Everything else handled by parent AsyncPostgresAdapter
|
32
|
+
"""
|
33
|
+
|
34
|
+
obj_key: ClassVar[str] = "lionagi_async_pg"
|
35
|
+
|
36
|
+
@classmethod
|
37
|
+
async def to_obj(
|
38
|
+
cls,
|
39
|
+
subj,
|
40
|
+
/,
|
41
|
+
*,
|
42
|
+
many: bool = True,
|
43
|
+
adapt_meth: str = "as_jsonable", # Default to to_dict for lionagi
|
44
|
+
**kw,
|
45
|
+
):
|
46
|
+
"""Write lionagi Node(s) to PostgreSQL with CRUD support."""
|
47
|
+
# Auto-create table if needed
|
48
|
+
if table := kw.get("table"):
|
49
|
+
if engine_url := (kw.get("dsn") or kw.get("engine_url")):
|
50
|
+
await cls._ensure_table(engine_url, table)
|
51
|
+
elif engine := kw.get("engine"):
|
52
|
+
await cls._ensure_table(engine, table)
|
53
|
+
|
54
|
+
return await super().to_obj(
|
55
|
+
subj, many=many, adapt_meth=adapt_meth, **kw
|
56
|
+
)
|
57
|
+
|
58
|
+
@classmethod
|
59
|
+
async def _ensure_table(cls, engine_or_url, table_name: str):
|
60
|
+
"""Create table with lionagi schema if it doesn't exist."""
|
61
|
+
# Handle both engine and URL
|
62
|
+
should_dispose = None
|
63
|
+
if isinstance(engine_or_url, str):
|
64
|
+
engine = create_async_engine(engine_or_url, future=True)
|
65
|
+
should_dispose = True
|
66
|
+
else:
|
67
|
+
engine = engine_or_url
|
68
|
+
should_dispose = False
|
69
|
+
|
70
|
+
try:
|
71
|
+
async with engine.begin() as conn:
|
72
|
+
# Determine JSON type based on database
|
73
|
+
engine_url = str(engine.url)
|
74
|
+
json_type = (
|
75
|
+
sa.dialects.postgresql.JSONB
|
76
|
+
if "postgresql" in engine_url
|
77
|
+
else sa.JSON
|
78
|
+
)
|
79
|
+
|
80
|
+
# Create table with lionagi schema
|
81
|
+
await conn.run_sync(
|
82
|
+
lambda sync_conn: sa.Table(
|
83
|
+
table_name,
|
84
|
+
sa.MetaData(),
|
85
|
+
sa.Column("id", sa.String, primary_key=True),
|
86
|
+
sa.Column("content", json_type),
|
87
|
+
sa.Column(
|
88
|
+
"metadata", json_type
|
89
|
+
), # Use metadata directly now
|
90
|
+
sa.Column(
|
91
|
+
"created_at", sa.Float
|
92
|
+
), # Stored as float timestamp
|
93
|
+
sa.Column("embedding", json_type, nullable=True),
|
94
|
+
).create(sync_conn, checkfirst=True)
|
95
|
+
)
|
96
|
+
finally:
|
97
|
+
if should_dispose:
|
98
|
+
await engine.dispose()
|
@@ -0,0 +1,10 @@
|
|
1
|
+
def check_docling_available():
|
2
|
+
try:
|
3
|
+
from docling.document_converter import DocumentConverter # noqa: F401
|
4
|
+
|
5
|
+
return True
|
6
|
+
except Exception:
|
7
|
+
return ImportError(
|
8
|
+
"The 'docling' package is required for this feature. "
|
9
|
+
"Please install it via 'pip install lionagi[reader]'."
|
10
|
+
)
|
@@ -8,11 +8,14 @@ from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
8
8
|
from pathlib import Path
|
9
9
|
from typing import Any, Literal
|
10
10
|
|
11
|
-
from lionagi
|
11
|
+
from lionagi import ln
|
12
12
|
|
13
|
+
from ._utils import check_docling_available
|
13
14
|
from .chunk import chunk_content
|
14
15
|
from .save import save_chunks
|
15
16
|
|
17
|
+
_HAS_DOCLING = check_docling_available()
|
18
|
+
|
16
19
|
|
17
20
|
def dir_to_files(
|
18
21
|
directory: str | Path,
|
@@ -206,24 +209,24 @@ def chunk(
|
|
206
209
|
reader_tool = lambda x: Path(x).read_text(encoding="utf-8")
|
207
210
|
|
208
211
|
if reader_tool == "docling":
|
209
|
-
|
212
|
+
if _HAS_DOCLING is not True:
|
213
|
+
raise _HAS_DOCLING
|
210
214
|
|
211
|
-
|
212
|
-
|
213
|
-
module_name="document_converter",
|
214
|
-
import_name="DocumentConverter",
|
215
|
+
from docling.document_converter import ( # noqa: F401
|
216
|
+
DocumentConverter,
|
215
217
|
)
|
218
|
+
|
216
219
|
converter = DocumentConverter()
|
217
220
|
reader_tool = lambda x: converter.convert(
|
218
221
|
x
|
219
222
|
).document.export_to_markdown()
|
220
223
|
|
221
|
-
texts = lcall(files, reader_tool)
|
224
|
+
texts = ln.lcall(files, reader_tool)
|
222
225
|
|
223
226
|
else:
|
224
227
|
texts = [text]
|
225
228
|
|
226
|
-
chunks = lcall(
|
229
|
+
chunks = ln.lcall(
|
227
230
|
texts,
|
228
231
|
chunk_content,
|
229
232
|
chunk_by=chunk_by,
|
@@ -244,15 +247,15 @@ def chunk(
|
|
244
247
|
output_file = Path(output_file)
|
245
248
|
if output_file.suffix == ".csv":
|
246
249
|
p = Pile(chunks)
|
247
|
-
p.
|
250
|
+
p.dump(output_file, "csv")
|
248
251
|
|
249
|
-
|
252
|
+
if output_file.suffix == "json":
|
250
253
|
p = Pile(chunks)
|
251
|
-
p.
|
254
|
+
p.dump(output_file, "json")
|
252
255
|
|
253
|
-
|
256
|
+
if output_file.suffix == ".parquet":
|
254
257
|
p = Pile(chunks)
|
255
|
-
p.
|
258
|
+
p.dump(output_file, "parquet")
|
256
259
|
|
257
260
|
else:
|
258
261
|
raise ValueError(f"Unsupported output file format: {output_file}")
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from lionagi.utils import
|
1
|
+
from lionagi.utils import import_module, is_import_installed
|
2
2
|
|
3
3
|
_HAS_PDF2IMAGE = is_import_installed("pdf2image")
|
4
4
|
|
@@ -25,7 +25,7 @@ def pdf_to_images(
|
|
25
25
|
|
26
26
|
import os
|
27
27
|
|
28
|
-
convert_from_path =
|
28
|
+
convert_from_path = import_module(
|
29
29
|
"pdf2image", import_name="convert_from_path"
|
30
30
|
)
|
31
31
|
|
@@ -1,4 +1,6 @@
|
|
1
1
|
from ._async_call import AlcallParams, BcallParams, alcall, bcall
|
2
|
+
from ._extract_json import extract_json
|
3
|
+
from ._fuzzy_json import fuzzy_json
|
2
4
|
from ._hash import hash_dict
|
3
5
|
from ._json_dump import (
|
4
6
|
DEFAULT_SERIALIZER,
|
@@ -56,4 +58,30 @@ __all__ = (
|
|
56
58
|
"DEFAULT_SERIALIZER",
|
57
59
|
"DEFAULT_SERIALIZER_OPTION",
|
58
60
|
"json_dumps",
|
61
|
+
"TaskGroup",
|
62
|
+
"create_task_group",
|
63
|
+
"CancelScope",
|
64
|
+
"move_on_after",
|
65
|
+
"fail_after",
|
66
|
+
"ConnectionPool",
|
67
|
+
"WorkerPool",
|
68
|
+
"parallel_requests",
|
69
|
+
"retry_with_timeout",
|
70
|
+
"Lock",
|
71
|
+
"Semaphore",
|
72
|
+
"CapacityLimiter",
|
73
|
+
"Event",
|
74
|
+
"Condition",
|
75
|
+
"get_cancelled_exc_class",
|
76
|
+
"shield",
|
77
|
+
"ResourceTracker",
|
78
|
+
"resource_leak_detector",
|
79
|
+
"track_resource",
|
80
|
+
"untrack_resource",
|
81
|
+
"cleanup_check",
|
82
|
+
"get_global_tracker",
|
83
|
+
"is_coro_func",
|
84
|
+
"ConcurrencyEvent",
|
85
|
+
"fuzzy_json",
|
86
|
+
"extract_json",
|
59
87
|
)
|
@@ -0,0 +1,60 @@
|
|
1
|
+
import re
|
2
|
+
from typing import Any
|
3
|
+
|
4
|
+
import orjson
|
5
|
+
|
6
|
+
from ._fuzzy_json import fuzzy_json
|
7
|
+
|
8
|
+
# Precompile the regex for extracting JSON code blocks
|
9
|
+
_JSON_BLOCK_PATTERN = re.compile(r"```json\s*(.*?)\s*```", re.DOTALL)
|
10
|
+
|
11
|
+
|
12
|
+
def extract_json(
|
13
|
+
input_data: str | list[str],
|
14
|
+
/,
|
15
|
+
*,
|
16
|
+
fuzzy_parse: bool = False,
|
17
|
+
return_one_if_single: bool = True,
|
18
|
+
) -> dict[str, Any] | list[dict[str, Any]]:
|
19
|
+
"""Extract and parse JSON content from a string or markdown code blocks.
|
20
|
+
Attempts direct JSON parsing first. If that fails, looks for JSON content
|
21
|
+
within markdown code blocks denoted by ```json.
|
22
|
+
|
23
|
+
Args:
|
24
|
+
input_data (str | list[str]): The input string or list of strings to parse.
|
25
|
+
fuzzy_parse (bool): If True, attempts fuzzy JSON parsing on failed attempts.
|
26
|
+
return_one_if_single (bool): If True and only one JSON object is found,
|
27
|
+
returns a dict instead of a list with one dict.
|
28
|
+
"""
|
29
|
+
|
30
|
+
# If input_data is a list, join into a single string
|
31
|
+
if isinstance(input_data, list):
|
32
|
+
input_str = "\n".join(input_data)
|
33
|
+
else:
|
34
|
+
input_str = input_data
|
35
|
+
|
36
|
+
# 1. Try direct parsing
|
37
|
+
try:
|
38
|
+
if fuzzy_parse:
|
39
|
+
return fuzzy_json(input_str)
|
40
|
+
return orjson.loads(input_str)
|
41
|
+
except Exception:
|
42
|
+
pass
|
43
|
+
|
44
|
+
# 2. Attempt extracting JSON blocks from markdown
|
45
|
+
matches = _JSON_BLOCK_PATTERN.findall(input_str)
|
46
|
+
if not matches:
|
47
|
+
return []
|
48
|
+
|
49
|
+
# If only one match, return single dict; if multiple, return list of dicts
|
50
|
+
if return_one_if_single and len(matches) == 1:
|
51
|
+
data_str = matches[0]
|
52
|
+
if fuzzy_parse:
|
53
|
+
return fuzzy_json(data_str)
|
54
|
+
return orjson.loads(data_str)
|
55
|
+
|
56
|
+
# Multiple matches
|
57
|
+
if fuzzy_parse:
|
58
|
+
return [fuzzy_json(m) for m in matches]
|
59
|
+
else:
|
60
|
+
return [orjson.loads(m) for m in matches]
|
@@ -0,0 +1,116 @@
|
|
1
|
+
import contextlib
|
2
|
+
import re
|
3
|
+
from typing import Any
|
4
|
+
|
5
|
+
import orjson
|
6
|
+
|
7
|
+
|
8
|
+
def fuzzy_json(str_to_parse: str, /) -> dict[str, Any] | list[dict[str, Any]]:
|
9
|
+
"""
|
10
|
+
Attempt to parse a JSON string, trying a few minimal "fuzzy" fixes if needed.
|
11
|
+
|
12
|
+
Steps:
|
13
|
+
1. Parse directly with json.loads.
|
14
|
+
2. Replace single quotes with double quotes, normalize spacing, and try again.
|
15
|
+
3. Attempt to fix unmatched brackets using fix_json_string.
|
16
|
+
4. If all fail, raise ValueError.
|
17
|
+
|
18
|
+
Args:
|
19
|
+
str_to_parse: The JSON string to parse
|
20
|
+
|
21
|
+
Returns:
|
22
|
+
Parsed JSON (dict or list of dicts)
|
23
|
+
|
24
|
+
Raises:
|
25
|
+
ValueError: If the string cannot be parsed as valid JSON
|
26
|
+
TypeError: If the input is not a string
|
27
|
+
"""
|
28
|
+
_check_valid_str(str_to_parse)
|
29
|
+
|
30
|
+
# 1. Direct attempt
|
31
|
+
with contextlib.suppress(Exception):
|
32
|
+
return orjson.loads(str_to_parse)
|
33
|
+
|
34
|
+
# 2. Try cleaning: replace single quotes with double and normalize
|
35
|
+
cleaned = _clean_json_string(str_to_parse.replace("'", '"'))
|
36
|
+
with contextlib.suppress(Exception):
|
37
|
+
return orjson.loads(cleaned)
|
38
|
+
|
39
|
+
# 3. Try fixing brackets
|
40
|
+
fixed = fix_json_string(cleaned)
|
41
|
+
with contextlib.suppress(Exception):
|
42
|
+
return orjson.loads(fixed)
|
43
|
+
|
44
|
+
# If all attempts fail
|
45
|
+
raise ValueError("Invalid JSON string")
|
46
|
+
|
47
|
+
|
48
|
+
def _check_valid_str(str_to_parse: str, /):
|
49
|
+
if not isinstance(str_to_parse, str):
|
50
|
+
raise TypeError("Input must be a string")
|
51
|
+
if not str_to_parse.strip():
|
52
|
+
raise ValueError("Input string is empty")
|
53
|
+
|
54
|
+
|
55
|
+
def _clean_json_string(s: str) -> str:
|
56
|
+
"""Basic normalization: replace unescaped single quotes, trim spaces, ensure keys are quoted."""
|
57
|
+
# Replace unescaped single quotes with double quotes
|
58
|
+
# '(?<!\\)'" means a single quote not preceded by a backslash
|
59
|
+
s = re.sub(r"(?<!\\)'", '"', s)
|
60
|
+
# Collapse multiple whitespaces
|
61
|
+
s = re.sub(r"\s+", " ", s)
|
62
|
+
# Ensure keys are quoted
|
63
|
+
# This attempts to find patterns like { key: value } and turn them into {"key": value}
|
64
|
+
s = re.sub(r'([{,])\s*([^"\s]+)\s*:', r'\1"\2":', s)
|
65
|
+
return s.strip()
|
66
|
+
|
67
|
+
|
68
|
+
def fix_json_string(str_to_parse: str, /) -> str:
|
69
|
+
"""Try to fix JSON string by ensuring brackets are matched properly."""
|
70
|
+
if not str_to_parse:
|
71
|
+
raise ValueError("Input string is empty")
|
72
|
+
|
73
|
+
brackets = {"{": "}", "[": "]"}
|
74
|
+
open_brackets = []
|
75
|
+
pos = 0
|
76
|
+
length = len(str_to_parse)
|
77
|
+
|
78
|
+
while pos < length:
|
79
|
+
char = str_to_parse[pos]
|
80
|
+
|
81
|
+
if char == "\\":
|
82
|
+
pos += 2 # Skip escaped chars
|
83
|
+
continue
|
84
|
+
|
85
|
+
if char == '"':
|
86
|
+
pos += 1
|
87
|
+
# skip string content
|
88
|
+
while pos < length:
|
89
|
+
if str_to_parse[pos] == "\\":
|
90
|
+
pos += 2
|
91
|
+
continue
|
92
|
+
if str_to_parse[pos] == '"':
|
93
|
+
pos += 1
|
94
|
+
break
|
95
|
+
pos += 1
|
96
|
+
continue
|
97
|
+
|
98
|
+
if char in brackets:
|
99
|
+
open_brackets.append(brackets[char])
|
100
|
+
elif char in brackets.values():
|
101
|
+
if not open_brackets:
|
102
|
+
# Extra closing bracket
|
103
|
+
# Better to raise error than guess
|
104
|
+
raise ValueError("Extra closing bracket found.")
|
105
|
+
if open_brackets[-1] != char:
|
106
|
+
# Mismatched bracket
|
107
|
+
raise ValueError("Mismatched brackets.")
|
108
|
+
open_brackets.pop()
|
109
|
+
|
110
|
+
pos += 1
|
111
|
+
|
112
|
+
# Add missing closing brackets if any
|
113
|
+
if open_brackets:
|
114
|
+
str_to_parse += "".join(reversed(open_brackets))
|
115
|
+
|
116
|
+
return str_to_parse
|
@@ -16,7 +16,6 @@ from typing import Annotated, Any
|
|
16
16
|
from typing_extensions import Self, override
|
17
17
|
|
18
18
|
from .._errors import ValidationError
|
19
|
-
from ..utils import UNDEFINED
|
20
19
|
|
21
20
|
# Cache of valid Pydantic Field parameters
|
22
21
|
_PYDANTIC_FIELD_PARAMS: set[str] | None = None
|
@@ -660,13 +659,16 @@ def to_dict(self) -> dict[str, Any]:
|
|
660
659
|
|
661
660
|
# Convert metadata to dictionary
|
662
661
|
for meta in self.metadata:
|
663
|
-
if meta.key not in (
|
662
|
+
if meta.key not in (
|
663
|
+
"nullable",
|
664
|
+
"listable",
|
665
|
+
"validator",
|
666
|
+
"name",
|
667
|
+
"validator_kwargs",
|
668
|
+
"annotation",
|
669
|
+
):
|
664
670
|
result[meta.key] = meta.value
|
665
671
|
|
666
|
-
# Add annotation if available
|
667
|
-
if hasattr(self, "annotation"):
|
668
|
-
result["annotation"] = self.base_type
|
669
|
-
|
670
672
|
return result
|
671
673
|
|
672
674
|
|
@@ -8,6 +8,8 @@ from .flow import flow
|
|
8
8
|
from .node import BranchOperations, Operation
|
9
9
|
from .plan.plan import PlanOperation, plan
|
10
10
|
|
11
|
+
Builder = OperationGraphBuilder
|
12
|
+
|
11
13
|
__all__ = (
|
12
14
|
"ExpansionStrategy",
|
13
15
|
"OperationGraphBuilder",
|
@@ -19,4 +21,5 @@ __all__ = (
|
|
19
21
|
"PlanOperation",
|
20
22
|
"brainstorm",
|
21
23
|
"BrainstormOperation",
|
24
|
+
"Builder",
|
22
25
|
)
|
@@ -453,6 +453,16 @@ def visualize_graph(
|
|
453
453
|
figsize=(14, 10),
|
454
454
|
):
|
455
455
|
"""Visualization with improved layout for complex graphs."""
|
456
|
+
from lionagi.protocols.graph.graph import (
|
457
|
+
_MATPLIB_AVAILABLE,
|
458
|
+
_NETWORKX_AVAILABLE,
|
459
|
+
)
|
460
|
+
|
461
|
+
if _MATPLIB_AVAILABLE is not True:
|
462
|
+
raise _MATPLIB_AVAILABLE
|
463
|
+
if _NETWORKX_AVAILABLE is not True:
|
464
|
+
raise _NETWORKX_AVAILABLE
|
465
|
+
|
456
466
|
import matplotlib.pyplot as plt
|
457
467
|
import networkx as nx
|
458
468
|
import numpy as np
|
@@ -6,7 +6,7 @@ from __future__ import annotations
|
|
6
6
|
|
7
7
|
import datetime as dt
|
8
8
|
from collections.abc import Mapping, Sequence
|
9
|
-
from typing import Any, Generic, TypeAlias, TypeVar
|
9
|
+
from typing import Any, Generic, Literal, TypeAlias, TypeVar
|
10
10
|
from uuid import UUID, uuid4
|
11
11
|
|
12
12
|
import orjson
|
@@ -22,7 +22,7 @@ from lionagi import ln
|
|
22
22
|
from lionagi._class_registry import get_class
|
23
23
|
from lionagi._errors import IDError
|
24
24
|
from lionagi.settings import Settings
|
25
|
-
from lionagi.utils import time, to_dict
|
25
|
+
from lionagi.utils import import_module, time, to_dict
|
26
26
|
|
27
27
|
from .._concepts import Collective, Observable, Ordering
|
28
28
|
|
@@ -274,12 +274,21 @@ class Element(BaseModel, Observable):
|
|
274
274
|
return str(cls).split("'")[1]
|
275
275
|
return cls.__name__
|
276
276
|
|
277
|
-
def
|
278
|
-
"""Converts this Element to a dictionary."""
|
277
|
+
def _to_dict(self) -> dict:
|
279
278
|
dict_ = self.model_dump()
|
280
279
|
dict_["metadata"].update({"lion_class": self.class_name(full=True)})
|
281
280
|
return {k: v for k, v in dict_.items() if ln.not_sentinel(v)}
|
282
281
|
|
282
|
+
def to_dict(self, mode: Literal["python", "json"] = "python") -> dict:
|
283
|
+
"""Converts this Element to a dictionary."""
|
284
|
+
if mode == "python":
|
285
|
+
return self._to_dict()
|
286
|
+
return orjson.loads(self.to_json(decode=False))
|
287
|
+
|
288
|
+
def as_jsonable(self) -> dict:
|
289
|
+
"""Converts this Element to a JSON-serializable dictionary."""
|
290
|
+
return self.to_dict(mode="json")
|
291
|
+
|
283
292
|
@classmethod
|
284
293
|
def from_dict(cls, data: dict, /) -> Element:
|
285
294
|
"""Deserializes a dictionary into an Element or subclass of Element.
|
@@ -308,9 +317,6 @@ class Element(BaseModel, Observable):
|
|
308
317
|
return subcls_type.from_dict(data)
|
309
318
|
|
310
319
|
except Exception:
|
311
|
-
# Fallback attempt: direct import if not in registry
|
312
|
-
from lionagi.libs.package.imports import import_module
|
313
|
-
|
314
320
|
mod, imp = subcls.rsplit(".", 1)
|
315
321
|
subcls_type = import_module(mod, import_name=imp)
|
316
322
|
data["metadata"] = metadata
|
@@ -321,10 +327,16 @@ class Element(BaseModel, Observable):
|
|
321
327
|
data["metadata"] = metadata
|
322
328
|
return cls.model_validate(data)
|
323
329
|
|
324
|
-
def to_json(self) -> str:
|
330
|
+
def to_json(self, decode: bool = True) -> str:
|
325
331
|
"""Converts this Element to a JSON string."""
|
326
|
-
dict_ = self.
|
327
|
-
|
332
|
+
dict_ = self._to_dict()
|
333
|
+
if decode:
|
334
|
+
return orjson.dumps(
|
335
|
+
dict_,
|
336
|
+
default=DEFAULT_ELEMENT_SERIALIZER,
|
337
|
+
option=ln.DEFAULT_SERIALIZER_OPTION,
|
338
|
+
).decode()
|
339
|
+
return orjson.dumps(dict_, default=DEFAULT_ELEMENT_SERIALIZER)
|
328
340
|
|
329
341
|
def from_json(cls, json_str: str) -> Element:
|
330
342
|
"""Deserializes a JSON string into an Element or subclass of Element."""
|
@@ -19,7 +19,7 @@ from pathlib import Path
|
|
19
19
|
from typing import Any, ClassVar, Generic, Literal, TypeVar
|
20
20
|
|
21
21
|
import pandas as pd
|
22
|
-
from pydantic import Field, field_serializer
|
22
|
+
from pydantic import Field, field_serializer
|
23
23
|
from pydantic.fields import FieldInfo
|
24
24
|
from pydapter import Adaptable, AsyncAdaptable
|
25
25
|
from typing_extensions import Self, deprecated, override
|
@@ -988,6 +988,12 @@ class Pile(Element, Collective[T], Generic[T], Adaptable, AsyncAdaptable):
|
|
988
988
|
is_same_dtype(self.collections.values())
|
989
989
|
)
|
990
990
|
|
991
|
+
@classmethod
|
992
|
+
def list_adapters(cls) -> list[str]:
|
993
|
+
syn_ = cls._adapter_registry._reg.keys()
|
994
|
+
asy_ = cls._async_registry._reg.keys()
|
995
|
+
return list(set(syn_) | set(asy_))
|
996
|
+
|
991
997
|
def adapt_to(self, obj_key: str, many=False, **kw: Any) -> Any:
|
992
998
|
"""Adapt to another format.
|
993
999
|
|
@@ -1132,6 +1138,55 @@ class Pile(Element, Collective[T], Generic[T], Adaptable, AsyncAdaptable):
|
|
1132
1138
|
) -> None:
|
1133
1139
|
return self.dump(fp, obj_key=obj_key, mode=mode, clear=clear, **kw)
|
1134
1140
|
|
1141
|
+
def filter_by_type(
|
1142
|
+
self,
|
1143
|
+
item_type: type[T] | list | set,
|
1144
|
+
strict_type: bool = False,
|
1145
|
+
as_pile: bool = False,
|
1146
|
+
reverse: bool = False,
|
1147
|
+
num_items: int | None = None,
|
1148
|
+
) -> list[T]:
|
1149
|
+
if isinstance(item_type, type):
|
1150
|
+
if is_union_type(item_type):
|
1151
|
+
item_type = set(union_members(item_type))
|
1152
|
+
else:
|
1153
|
+
item_type = {item_type}
|
1154
|
+
|
1155
|
+
if isinstance(item_type, list | tuple):
|
1156
|
+
item_type = set(item_type)
|
1157
|
+
|
1158
|
+
if not isinstance(item_type, set):
|
1159
|
+
raise TypeError("item_type must be a type or a list/set of types")
|
1160
|
+
|
1161
|
+
meth = None
|
1162
|
+
|
1163
|
+
if strict_type:
|
1164
|
+
meth = lambda item: type(item) in item_type
|
1165
|
+
else:
|
1166
|
+
meth = (
|
1167
|
+
lambda item: any(isinstance(item, t) for t in item_type)
|
1168
|
+
is True
|
1169
|
+
)
|
1170
|
+
|
1171
|
+
out = []
|
1172
|
+
prog = (
|
1173
|
+
list(self.progression)
|
1174
|
+
if not reverse
|
1175
|
+
else reversed(list(self.progression))
|
1176
|
+
)
|
1177
|
+
for i in prog:
|
1178
|
+
item = self.collections[i]
|
1179
|
+
if meth(item):
|
1180
|
+
out.append(item)
|
1181
|
+
if num_items is not None and len(out) == num_items:
|
1182
|
+
break
|
1183
|
+
|
1184
|
+
if as_pile:
|
1185
|
+
return self.__class__(
|
1186
|
+
collections=out, item_type=item_type, strict_type=strict_type
|
1187
|
+
)
|
1188
|
+
return out
|
1189
|
+
|
1135
1190
|
|
1136
1191
|
def to_list_type(value: Any, /) -> list[Any]:
|
1137
1192
|
"""Convert input to a list format"""
|