lionagi 0.15.8__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.8 → lionagi-0.15.11}/.github/workflows/ci.yml +2 -2
- {lionagi-0.15.8 → lionagi-0.15.11}/.github/workflows/codeql.yml +1 -1
- {lionagi-0.15.8 → lionagi-0.15.11}/.github/workflows/release.yml +2 -2
- {lionagi-0.15.8 → lionagi-0.15.11}/PKG-INFO +2 -2
- {lionagi-0.15.8 → 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.8 → lionagi-0.15.11}/lionagi/libs/file/process.py +16 -13
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/file/save.py +3 -2
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/schema/load_pydantic_model_from_schema.py +2 -1
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/unstructured/pdf_to_image.py +2 -2
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/__init__.py +38 -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.11/lionagi/ln/_json_dump.py +75 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/_models.py +0 -1
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/models/field_model.py +8 -6
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/__init__.py +3 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/builder.py +10 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/generic/element.py +56 -53
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/generic/event.py +46 -67
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/generic/pile.py +56 -1
- {lionagi-0.15.8 → 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.8 → lionagi-0.15.11}/lionagi/protocols/graph/graph.py +17 -21
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/graph/node.py +23 -5
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/manager.py +41 -45
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/message.py +3 -1
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/operatives/step.py +2 -19
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/types.py +1 -2
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/providers/claude_code_.py +9 -7
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/third_party/claude_code.py +3 -2
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/session/session.py +14 -2
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/tools/file/reader.py +5 -6
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/utils.py +8 -385
- lionagi-0.15.11/lionagi/version.py +1 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/pyproject.toml +2 -2
- {lionagi-0.15.8 → lionagi-0.15.11}/uv.lock +5 -5
- lionagi-0.15.8/.github/workflows/docs.yml +0 -58
- lionagi-0.15.8/lionagi/adapters/async_postgres_adapter.py +0 -362
- lionagi-0.15.8/lionagi/libs/package/imports.py +0 -21
- lionagi-0.15.8/lionagi/libs/package/management.py +0 -62
- lionagi-0.15.8/lionagi/libs/package/params.py +0 -30
- lionagi-0.15.8/lionagi/libs/package/system.py +0 -22
- lionagi-0.15.8/lionagi/tools/file/__init__.py +0 -3
- lionagi-0.15.8/lionagi/version.py +0 -1
- {lionagi-0.15.8 → lionagi-0.15.11}/.coveragerc +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/.env.example +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/.github/FUNDING.yml +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/.github/dependabot.yml +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/.gitignore +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/.pre-commit-config.yaml +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/.python-version +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/CODE_OF_CONDUCT.md +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/CONTRIBUTING.md +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/LICENSE +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/README.md +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/assets/operation_builder.gif +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/001_branch_converse.ipynb +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/002_branch_interact.ipynb +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/003_branch_info.ipynb +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/004_conversation_patterns.ipynb +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/005_react_basics.ipynb +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/006_operation_graphs_claim_extraction.ipynb +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/007_fan_out_in.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/claude_proxy/README.md +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/claude_proxy/claude_code_proxy.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/claude_proxy/run_w_claude_code_proxy.ipynb +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/data/002_comedian.json +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/data/002_critic.json +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/data/006_lion_proof_ch2.md +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/using_claude_code.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/Makefile +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/_static/custom.css +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/_templates/layout.html +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/conf.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/discussions/anyio-migration.md +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/index.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/action.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/adapter.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/branch.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/branch_operations.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/concepts.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/element_id.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/event.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/form.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/graph.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/index.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/instruct.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/lib_file.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/lib_nested.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/lib_package.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/lib_schema.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/lib_validate.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/log.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/mail.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/message.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/models.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/operative_step.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/pile.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/processor.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/progression.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/service.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/session.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/utils.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/tutorials/get_started.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/tutorials/get_started_pt2.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/tutorials/get_started_pt3.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/docs/tutorials/index.rst +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/_class_registry.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/_errors.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/_types.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/adapters/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/adapters/_utils.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/adapters/postgres_model_adapter.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/config.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/fields/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/fields/action.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/fields/base.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/fields/code.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/fields/file.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/fields/instruct.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/fields/reason.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/fields/research.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/concurrency.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/file/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/file/chunk.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/file/concat.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/file/concat_files.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/file/file_ops.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/file/params.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/flatten.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/nfilter.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/nget.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/ninsert.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/nmerge.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/npop.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/nset.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/unflatten.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/utils.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/parse.py +0 -0
- {lionagi-0.15.8/lionagi/libs/package → lionagi-0.15.11/lionagi/libs/schema}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/schema/as_readable.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/schema/extract_code_block.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/schema/extract_docstring.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/schema/function_to_schema.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/schema/json_schema.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/base.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/llmlingua.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/perplexity.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/symbolic_compress_context.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/base.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/abstract_algebra.toml +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/category_theory.toml +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/complex_analysis.toml +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/framework_options.json +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/group_theory.toml +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/math_logic.toml +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/reflective_patterns.toml +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/set_theory.toml +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/topology_fundamentals.toml +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/mapping/lion_emoji_mapping.toml +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/mapping/python_math_mapping.toml +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/mapping/rust_chinese_mapping.toml +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/utility/base_synthlang_system_prompt.toml +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/translate_to_synthlang.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/types.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/unstructured/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/unstructured/read_image_to_base64.py +0 -0
- {lionagi-0.15.8/lionagi/libs/schema → lionagi-0.15.11/lionagi/libs/validate}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/validate/common_field_validators.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/validate/fuzzy_match_keys.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/validate/fuzzy_validate_mapping.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/validate/string_similarity.py +4 -4
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/validate/to_num.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/validate/validate_boolean.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/validate/xml_parser.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/_async_call.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/_hash.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/_list_call.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/_to_list.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/_types.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/concurrency/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/concurrency/cancel.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/concurrency/errors.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/concurrency/patterns.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/concurrency/primitives.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/concurrency/resource_tracker.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/concurrency/task.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/concurrency/throttle.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/concurrency/utils.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/models/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/models/hashable_model.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/models/model_params.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/models/note.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/models/operable_model.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/models/schema_model.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/ReAct/ReAct.py +0 -0
- {lionagi-0.15.8/lionagi/libs/validate → lionagi-0.15.11/lionagi/operations/ReAct}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/ReAct/utils.py +0 -0
- {lionagi-0.15.8/lionagi/operations/ReAct → lionagi-0.15.11/lionagi/operations/_act}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/_act/act.py +0 -0
- {lionagi-0.15.8/lionagi/operations/_act → lionagi-0.15.11/lionagi/operations/brainstorm}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/brainstorm/brainstorm.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/brainstorm/prompt.py +0 -0
- {lionagi-0.15.8/lionagi/operations/brainstorm → lionagi-0.15.11/lionagi/operations/chat}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/chat/chat.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/communicate/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/communicate/communicate.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/flow.py +0 -0
- {lionagi-0.15.8/lionagi/operations/chat → lionagi-0.15.11/lionagi/operations/instruct}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/instruct/instruct.py +0 -0
- {lionagi-0.15.8/lionagi/operations/instruct → lionagi-0.15.11/lionagi/operations/interpret}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/interpret/interpret.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/manager.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/node.py +0 -0
- {lionagi-0.15.8/lionagi/operations/interpret → lionagi-0.15.11/lionagi/operations/operate}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/operate/operate.py +0 -0
- {lionagi-0.15.8/lionagi/operations/operate → lionagi-0.15.11/lionagi/operations/parse}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/parse/parse.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/plan/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/plan/plan.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/plan/prompt.py +0 -0
- {lionagi-0.15.8/lionagi/operations/parse → lionagi-0.15.11/lionagi/operations/select}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/select/select.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/select/utils.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/translate/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/translate/translate.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/types.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/utils.py +0 -0
- {lionagi-0.15.8/lionagi/operations/select → lionagi-0.15.11/lionagi/protocols}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/_concepts.py +0 -0
- {lionagi-0.15.8/lionagi/protocols → lionagi-0.15.11/lionagi/protocols/action}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/action/function_calling.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/action/manager.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/action/tool.py +0 -0
- {lionagi-0.15.8/lionagi/protocols/action → lionagi-0.15.11/lionagi/protocols/forms}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/forms/base.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/forms/flow.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/forms/form.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/forms/report.py +0 -0
- {lionagi-0.15.8/lionagi/protocols/forms → lionagi-0.15.11/lionagi/protocols/generic}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/generic/log.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/generic/processor.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/graph/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/graph/edge.py +0 -0
- {lionagi-0.15.8/lionagi/protocols/generic → lionagi-0.15.11/lionagi/protocols/mail}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/mail/exchange.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/mail/mail.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/mail/mailbox.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/mail/manager.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/mail/package.py +0 -0
- {lionagi-0.15.8/lionagi/protocols/mail → lionagi-0.15.11/lionagi/protocols/messages}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/action_request.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/action_response.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/assistant_response.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/base.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/instruction.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/system.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/templates/README.md +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/templates/action_request.jinja2 +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/templates/action_response.jinja2 +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/templates/assistant_response.jinja2 +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/templates/instruction_message.jinja2 +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/templates/system_message.jinja2 +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/templates/tool_schemas.jinja2 +0 -0
- {lionagi-0.15.8/lionagi/protocols/messages → lionagi-0.15.11/lionagi/protocols/operatives}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/operatives/operative.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/py.typed +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/api_calling.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/endpoint.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/endpoint_config.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/header_factory.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/match_endpoint.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/providers/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/providers/anthropic_.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/providers/claude_code_cli.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/providers/exa_.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/providers/oai_.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/providers/ollama_.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/providers/perplexity_.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/providers/types.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/hooks/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/hooks/_types.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/hooks/_utils.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/hooks/hook_event.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/hooks/hook_registry.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/imodel.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/manager.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/rate_limited_processor.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/resilience.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/third_party/README.md +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/third_party/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/third_party/anthropic_models.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/third_party/exa_models.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/third_party/openai_model_names.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/third_party/pplx_models.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/token_calculator.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/types.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/session/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/session/branch.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/session/prompts.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/settings.py +0 -0
- {lionagi-0.15.8/lionagi/protocols/operatives → lionagi-0.15.11/lionagi/tools}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/tools/base.py +0 -0
- {lionagi-0.15.8/lionagi/tools → lionagi-0.15.11/lionagi/tools/file}/__init__.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/tools/memory/tools.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/tools/types.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/main.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/scripts/README.md +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/scripts/concat.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/scripts/config.py +0 -0
- {lionagi-0.15.8 → lionagi-0.15.11}/scripts/update_openai_models.py +0 -0
@@ -16,7 +16,7 @@ jobs:
|
|
16
16
|
matrix:
|
17
17
|
python-version: ['3.10', '3.11', '3.12', '3.13']
|
18
18
|
steps:
|
19
|
-
- uses: actions/checkout@
|
19
|
+
- uses: actions/checkout@v5
|
20
20
|
- name: Set up Python ${{ matrix.python-version }}
|
21
21
|
uses: actions/setup-python@v5
|
22
22
|
with:
|
@@ -59,7 +59,7 @@ jobs:
|
|
59
59
|
contents: read
|
60
60
|
packages: write
|
61
61
|
steps:
|
62
|
-
- uses: actions/checkout@
|
62
|
+
- uses: actions/checkout@v5
|
63
63
|
- name: Set up Python
|
64
64
|
uses: actions/setup-python@v5
|
65
65
|
with:
|
@@ -14,7 +14,7 @@ jobs:
|
|
14
14
|
matrix:
|
15
15
|
python-version: ['3.10', '3.11', '3.12', '3.13']
|
16
16
|
steps:
|
17
|
-
- uses: actions/checkout@
|
17
|
+
- uses: actions/checkout@v5
|
18
18
|
- name: Set up Python ${{ matrix.python-version }}
|
19
19
|
uses: actions/setup-python@v5
|
20
20
|
with:
|
@@ -39,7 +39,7 @@ jobs:
|
|
39
39
|
needs: test
|
40
40
|
runs-on: ubuntu-latest
|
41
41
|
steps:
|
42
|
-
- uses: actions/checkout@
|
42
|
+
- uses: actions/checkout@v5
|
43
43
|
- name: Set up Python
|
44
44
|
uses: actions/setup-python@v5
|
45
45
|
with:
|
@@ -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}")
|
@@ -2,7 +2,6 @@
|
|
2
2
|
#
|
3
3
|
# SPDX-License-Identifier: Apache-2.0
|
4
4
|
|
5
|
-
import json
|
6
5
|
import logging
|
7
6
|
from pathlib import Path
|
8
7
|
from typing import Any
|
@@ -78,6 +77,8 @@ def save_chunks(
|
|
78
77
|
random_hash_digits: int,
|
79
78
|
) -> None:
|
80
79
|
"""Helper function to save chunks to files."""
|
80
|
+
from lionagi import ln
|
81
|
+
|
81
82
|
output_path = Path(output_dir)
|
82
83
|
for i, chunk in enumerate(chunks):
|
83
84
|
file_path = create_path(
|
@@ -88,7 +89,7 @@ def save_chunks(
|
|
88
89
|
random_hash_digits=random_hash_digits,
|
89
90
|
)
|
90
91
|
save_to_file(
|
91
|
-
|
92
|
+
ln.json_dumps(chunk),
|
92
93
|
directory=file_path.parent,
|
93
94
|
filename=file_path.name,
|
94
95
|
verbose=verbose,
|
@@ -11,6 +11,7 @@ from typing import Any, TypeVar
|
|
11
11
|
|
12
12
|
from pydantic import BaseModel, PydanticUserError
|
13
13
|
|
14
|
+
from lionagi import ln
|
14
15
|
from lionagi.utils import is_import_installed
|
15
16
|
|
16
17
|
_HAS_DATAMODEL_CODE_GENERATOR = is_import_installed("datamodel_code_generator")
|
@@ -98,7 +99,7 @@ def load_pydantic_model_from_schema(
|
|
98
99
|
sanitized_title # Update the name to use
|
99
100
|
)
|
100
101
|
schema_dict = schema
|
101
|
-
schema_input_data =
|
102
|
+
schema_input_data = ln.json_dumps(schema_dict)
|
102
103
|
except TypeError as e:
|
103
104
|
error_msg = "Invalid dictionary provided for schema"
|
104
105
|
raise ValueError(error_msg) from e
|
@@ -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,5 +1,13 @@
|
|
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
|
5
|
+
from ._json_dump import (
|
6
|
+
DEFAULT_SERIALIZER,
|
7
|
+
DEFAULT_SERIALIZER_OPTION,
|
8
|
+
get_orjson_default,
|
9
|
+
json_dumps,
|
10
|
+
)
|
3
11
|
from ._list_call import LcallParams, lcall
|
4
12
|
from ._models import DataClass, Params
|
5
13
|
from ._to_list import ToListParams, to_list
|
@@ -46,4 +54,34 @@ __all__ = (
|
|
46
54
|
"bcall",
|
47
55
|
"AlcallParams",
|
48
56
|
"BcallParams",
|
57
|
+
"get_orjson_default",
|
58
|
+
"DEFAULT_SERIALIZER",
|
59
|
+
"DEFAULT_SERIALIZER_OPTION",
|
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",
|
49
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
|
@@ -0,0 +1,75 @@
|
|
1
|
+
import datetime as dt
|
2
|
+
import decimal
|
3
|
+
from collections.abc import Callable
|
4
|
+
from pathlib import Path
|
5
|
+
from uuid import UUID
|
6
|
+
|
7
|
+
import orjson
|
8
|
+
|
9
|
+
|
10
|
+
def _get_default_serializers():
|
11
|
+
return {
|
12
|
+
dt.datetime: lambda o: o.isoformat(),
|
13
|
+
Path: lambda o: str(o),
|
14
|
+
UUID: lambda o: str(o),
|
15
|
+
decimal.Decimal: lambda o: str(o),
|
16
|
+
set: lambda o: list(o),
|
17
|
+
frozenset: lambda o: list(o),
|
18
|
+
}
|
19
|
+
|
20
|
+
|
21
|
+
def _get_default_serializer_order():
|
22
|
+
return [dt.datetime, Path, UUID, decimal.Decimal, set, frozenset]
|
23
|
+
|
24
|
+
|
25
|
+
def get_orjson_default(
|
26
|
+
order: list[type] = None,
|
27
|
+
additional: dict[type, Callable] = None,
|
28
|
+
extend_default: bool = True,
|
29
|
+
) -> Callable:
|
30
|
+
"""get the default function for orjson.dumps
|
31
|
+
Args:
|
32
|
+
order: order of types to check. Defaults to None.
|
33
|
+
additional: additional serializers
|
34
|
+
extend_default: when order is provided, whether to extend the default order or replace it.
|
35
|
+
"""
|
36
|
+
dict_ = _get_default_serializers()
|
37
|
+
dict_.update(additional or {})
|
38
|
+
order_ = _get_default_serializer_order()
|
39
|
+
|
40
|
+
if order:
|
41
|
+
if len(additional or {}) > 0 and extend_default:
|
42
|
+
order_.extend([k for k in order if k not in order_])
|
43
|
+
else:
|
44
|
+
order_ = list(order)
|
45
|
+
else:
|
46
|
+
if len(additional or {}) > 0:
|
47
|
+
order_.extend([k for k in additional.keys() if k not in order_])
|
48
|
+
|
49
|
+
def default(obj):
|
50
|
+
for t in order_:
|
51
|
+
if isinstance(obj, t) and t in dict_:
|
52
|
+
return dict_[t](obj)
|
53
|
+
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
|
54
|
+
|
55
|
+
return default
|
56
|
+
|
57
|
+
|
58
|
+
DEFAULT_SERIALIZER = get_orjson_default()
|
59
|
+
DEFAULT_SERIALIZER_OPTION = (
|
60
|
+
orjson.OPT_INDENT_2
|
61
|
+
| orjson.OPT_SORT_KEYS
|
62
|
+
| orjson.OPT_APPEND_NEWLINE
|
63
|
+
| orjson.OPT_SERIALIZE_DATACLASS
|
64
|
+
)
|
65
|
+
|
66
|
+
|
67
|
+
def json_dumps(d_, decode=True, /) -> str:
|
68
|
+
by_ = orjson.dumps(
|
69
|
+
d_,
|
70
|
+
default=DEFAULT_SERIALIZER,
|
71
|
+
option=DEFAULT_SERIALIZER_OPTION,
|
72
|
+
)
|
73
|
+
if decode:
|
74
|
+
return by_.decode("utf-8")
|
75
|
+
return by_
|
@@ -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
|
)
|