lionagi 0.14.8__tar.gz → 0.14.10__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.14.8 → lionagi-0.14.10}/PKG-INFO +6 -2
- {lionagi-0.14.8 → lionagi-0.14.10}/README.md +1 -1
- {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/007_fan_out_in.py +35 -7
- {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/claude_proxy/claude_code_proxy.py +2 -5
- lionagi-0.14.10/cookbooks/claude_proxy/run_w_claude_code_proxy.ipynb +100 -0
- lionagi-0.14.10/lionagi/_errors.py +148 -0
- lionagi-0.14.10/lionagi/_types.py +3 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/config.py +3 -1
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/fields/reason.py +1 -1
- lionagi-0.14.10/lionagi/libs/concurrency/throttle.py +79 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/parse.py +2 -1
- lionagi-0.14.10/lionagi/libs/unstructured/pdf_to_image.py +45 -0
- lionagi-0.14.10/lionagi/libs/unstructured/read_image_to_base64.py +33 -0
- lionagi-0.14.10/lionagi/libs/validate/to_num.py +378 -0
- lionagi-0.14.10/lionagi/libs/validate/xml_parser.py +203 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/models/operable_model.py +8 -3
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/flow.py +0 -1
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/generic/event.py +2 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/generic/log.py +26 -10
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/operatives/step.py +1 -1
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/types.py +9 -1
- lionagi-0.14.8/lionagi/service/types.py → lionagi-0.14.10/lionagi/service/__init__.py +6 -4
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/api_calling.py +57 -2
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/endpoint_config.py +1 -1
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/header_factory.py +4 -2
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/match_endpoint.py +10 -10
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/providers/anthropic_.py +5 -2
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/providers/claude_code_.py +13 -17
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/providers/claude_code_cli.py +51 -16
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/providers/exa_.py +5 -3
- lionagi-0.14.10/lionagi/service/connections/providers/oai_.py +200 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/providers/ollama_.py +38 -18
- lionagi-0.14.10/lionagi/service/connections/providers/perplexity_.py +51 -0
- lionagi-0.14.10/lionagi/service/connections/providers/types.py +30 -0
- lionagi-0.14.10/lionagi/service/hooks/__init__.py +25 -0
- lionagi-0.14.10/lionagi/service/hooks/_types.py +52 -0
- lionagi-0.14.10/lionagi/service/hooks/_utils.py +85 -0
- lionagi-0.14.10/lionagi/service/hooks/hook_event.py +67 -0
- lionagi-0.14.10/lionagi/service/hooks/hook_registry.py +221 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/imodel.py +120 -34
- lionagi-0.14.10/lionagi/service/third_party/__init__.py +0 -0
- lionagi-0.14.10/lionagi/service/third_party/claude_code.py +715 -0
- lionagi-0.14.10/lionagi/service/third_party/openai_model_names.py +198 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/third_party/pplx_models.py +16 -8
- lionagi-0.14.10/lionagi/service/types.py +41 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/session/branch.py +1 -4
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/tools/base.py +1 -3
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/tools/file/reader.py +1 -1
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/tools/memory/tools.py +2 -2
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/utils.py +12 -775
- lionagi-0.14.10/lionagi/version.py +1 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/pyproject.toml +10 -1
- lionagi-0.14.10/scripts/README.md +41 -0
- lionagi-0.14.10/scripts/update_openai_models.py +281 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/uv.lock +54 -126
- lionagi-0.14.8/cookbooks/claude_proxy/run_w_claude_code_proxy.ipynb +0 -217
- lionagi-0.14.8/lionagi/_errors.py +0 -39
- lionagi-0.14.8/lionagi/_types.py +0 -9
- lionagi-0.14.8/lionagi/service/__init__.py +0 -1
- lionagi-0.14.8/lionagi/service/connections/providers/_claude_code/__init__.py +0 -3
- lionagi-0.14.8/lionagi/service/connections/providers/_claude_code/models.py +0 -244
- lionagi-0.14.8/lionagi/service/connections/providers/_claude_code/stream_cli.py +0 -359
- lionagi-0.14.8/lionagi/service/connections/providers/oai_.py +0 -165
- lionagi-0.14.8/lionagi/service/connections/providers/perplexity_.py +0 -29
- lionagi-0.14.8/lionagi/service/third_party/openai_models.py +0 -18241
- lionagi-0.14.8/lionagi/version.py +0 -1
- lionagi-0.14.8/scripts/README.md +0 -15
- {lionagi-0.14.8 → lionagi-0.14.10}/.coveragerc +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/.env.example +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/.github/FUNDING.yml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/.github/dependabot.yml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/.github/workflows/ci.yml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/.github/workflows/codeql.yml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/.github/workflows/docs.yml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/.github/workflows/release.yml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/.gitignore +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/.pre-commit-config.yaml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/.python-version +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/CODE_OF_CONDUCT.md +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/CONTRIBUTING.md +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/LICENSE +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/assets/operation_builder.gif +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/001_branch_converse.ipynb +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/002_branch_interact.ipynb +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/003_branch_info.ipynb +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/004_conversation_patterns.ipynb +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/005_react_basics.ipynb +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/006_operation_graphs_claim_extraction.ipynb +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/claude_proxy/README.md +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/data/002_comedian.json +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/data/002_critic.json +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/data/006_lion_proof_ch2.md +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/using_claude_code.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/Makefile +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/_static/custom.css +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/_templates/layout.html +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/conf.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/discussions/anyio-migration.md +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/index.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/action.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/adapter.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/branch.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/branch_operations.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/concepts.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/element_id.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/event.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/form.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/graph.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/index.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/instruct.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/lib_file.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/lib_nested.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/lib_package.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/lib_schema.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/lib_validate.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/log.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/mail.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/message.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/models.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/operative_step.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/pile.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/processor.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/progression.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/service.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/session.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/utils.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/tutorials/get_started.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/tutorials/get_started_pt2.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/tutorials/get_started_pt3.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/docs/tutorials/index.rst +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/_class_registry.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/adapters/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/adapters/async_postgres_adapter.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/adapters/postgres_model_adapter.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/fields/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/fields/action.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/fields/base.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/fields/code.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/fields/file.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/fields/instruct.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/fields/research.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/concurrency/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/concurrency/cancel.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/concurrency/errors.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/concurrency/patterns.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/concurrency/primitives.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/concurrency/resource_tracker.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/concurrency/task.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/file/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/file/chunk.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/file/concat.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/file/concat_files.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/file/file_ops.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/file/params.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/file/process.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/file/save.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/hash/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/hash/hash_dict.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/hash/manager.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/flatten.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/nfilter.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/nget.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/ninsert.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/nmerge.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/npop.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/nset.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/unflatten.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/utils.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/package/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/package/imports.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/package/management.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/package/params.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/package/system.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/schema/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/schema/as_readable.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/schema/extract_code_block.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/schema/extract_docstring.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/schema/function_to_schema.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/schema/json_schema.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/schema/load_pydantic_model_from_schema.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/base.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/llmlingua.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/perplexity.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/symbolic_compress_context.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/base.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/frameworks/abstract_algebra.toml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/frameworks/category_theory.toml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/frameworks/complex_analysis.toml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/frameworks/framework_options.json +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/frameworks/group_theory.toml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/frameworks/math_logic.toml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/frameworks/reflective_patterns.toml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/frameworks/set_theory.toml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/frameworks/topology_fundamentals.toml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/mapping/lion_emoji_mapping.toml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/mapping/python_math_mapping.toml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/mapping/rust_chinese_mapping.toml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/utility/base_synthlang_system_prompt.toml +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/translate_to_synthlang.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/types.py +0 -0
- {lionagi-0.14.8/lionagi/operations/communicate → lionagi-0.14.10/lionagi/libs/unstructured}/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/validate/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/validate/common_field_validators.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/validate/fuzzy_match_keys.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/validate/fuzzy_validate_mapping.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/validate/string_similarity.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/validate/validate_boolean.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/models/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/models/field_model.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/models/hashable_model.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/models/model_params.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/models/note.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/models/schema_model.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/ReAct/ReAct.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/ReAct/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/ReAct/utils.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/_act/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/_act/act.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/brainstorm/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/brainstorm/brainstorm.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/brainstorm/prompt.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/builder.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/chat/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/chat/chat.py +0 -0
- {lionagi-0.14.8/lionagi/operations/translate → lionagi-0.14.10/lionagi/operations/communicate}/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/communicate/communicate.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/instruct/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/instruct/instruct.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/interpret/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/interpret/interpret.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/manager.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/node.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/operate/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/operate/operate.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/parse/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/parse/parse.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/plan/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/plan/plan.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/plan/prompt.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/select/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/select/select.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/select/utils.py +0 -0
- {lionagi-0.14.8/lionagi/service/third_party → lionagi-0.14.10/lionagi/operations/translate}/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/translate/translate.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/types.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/utils.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/_concepts.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/action/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/action/function_calling.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/action/manager.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/action/tool.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/forms/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/forms/base.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/forms/flow.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/forms/form.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/forms/report.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/generic/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/generic/element.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/generic/pile.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/generic/processor.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/generic/progression.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/graph/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/graph/edge.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/graph/graph.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/graph/node.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/mail/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/mail/exchange.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/mail/mail.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/mail/mailbox.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/mail/manager.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/mail/package.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/action_request.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/action_response.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/assistant_response.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/base.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/instruction.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/manager.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/message.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/system.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/templates/README.md +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/templates/action_request.jinja2 +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/templates/action_response.jinja2 +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/templates/assistant_response.jinja2 +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/templates/instruction_message.jinja2 +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/templates/system_message.jinja2 +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/templates/tool_schemas.jinja2 +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/operatives/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/operatives/operative.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/py.typed +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/endpoint.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/providers/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/manager.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/rate_limited_processor.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/resilience.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/third_party/README.md +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/third_party/anthropic_models.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/third_party/exa_models.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/token_calculator.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/session/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/session/prompts.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/session/session.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/settings.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/tools/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/tools/file/__init__.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/tools/types.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/main.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/scripts/concat.py +0 -0
- {lionagi-0.14.8 → lionagi-0.14.10}/scripts/config.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: lionagi
|
3
|
-
Version: 0.14.
|
3
|
+
Version: 0.14.10
|
4
4
|
Summary: An Intelligence Operating System.
|
5
5
|
Author-email: HaiyangLi <quantocean.li@gmail.com>, Liangbingyan Luo <llby_luo@outlook.com>
|
6
6
|
License: Apache License
|
@@ -264,6 +264,10 @@ Provides-Extra: sqlite
|
|
264
264
|
Requires-Dist: aiosqlite>=0.21.0; extra == 'sqlite'
|
265
265
|
Provides-Extra: tools
|
266
266
|
Requires-Dist: docling>=2.15.0; extra == 'tools'
|
267
|
+
Provides-Extra: unstructured
|
268
|
+
Requires-Dist: opencv-python>=4.2.0.34; extra == 'unstructured'
|
269
|
+
Provides-Extra: xml
|
270
|
+
Requires-Dist: xmltodict>=0.12.0; extra == 'xml'
|
267
271
|
Description-Content-Type: text/markdown
|
268
272
|
|
269
273
|

|
@@ -272,7 +276,7 @@ Description-Content-Type: text/markdown
|
|
272
276
|
|
273
277
|
[Documentation](https://lion-agi.github.io/lionagi/) |
|
274
278
|
[Discord](https://discord.gg/JDj9ENhUE8) |
|
275
|
-
[PyPI](https://pypi.org/project/lionagi/)
|
279
|
+
[PyPI](https://pypi.org/project/lionagi/)
|
276
280
|
|
277
281
|
# LION - Language InterOperable Network
|
278
282
|
|
@@ -1,5 +1,6 @@
|
|
1
|
-
from lionagi import Branch, Builder, Session, iModel
|
1
|
+
from lionagi import Branch, Builder, Operation, Session, iModel
|
2
2
|
from lionagi.fields import LIST_INSTRUCT_FIELD_MODEL, Instruct
|
3
|
+
from lionagi.protocols.types import AssistantResponse
|
3
4
|
|
4
5
|
CC_WORKSPACE = ".khive/workspace"
|
5
6
|
|
@@ -15,7 +16,6 @@ def create_cc(
|
|
15
16
|
provider="claude_code",
|
16
17
|
endpoint="query_cli",
|
17
18
|
model=model,
|
18
|
-
api_key="dummy_api_key",
|
19
19
|
ws=f"{CC_WORKSPACE}/{subdir}",
|
20
20
|
verbose_output=verbose_output,
|
21
21
|
add_dir="../../../",
|
@@ -26,7 +26,7 @@ def create_cc(
|
|
26
26
|
|
27
27
|
|
28
28
|
prompt = """
|
29
|
-
Task: Investigate the codebase in the specified directory and provide a comprehensive overview.
|
29
|
+
Task: Quickly Investigate the codebase in the specified directory and provide a comprehensive overview.
|
30
30
|
|
31
31
|
---START
|
32
32
|
read into the specified dir, glance over the key components and pay attention to architecture,
|
@@ -86,16 +86,44 @@ async def main():
|
|
86
86
|
)
|
87
87
|
research_nodes.append(node)
|
88
88
|
|
89
|
-
|
89
|
+
costs = 0
|
90
|
+
|
91
|
+
def get_context(node_id):
|
92
|
+
nonlocal costs
|
93
|
+
g = builder.get_graph()
|
94
|
+
node: Operation = g.internal_nodes[node_id]
|
95
|
+
branch = session.get_branch(node.branch_id, None)
|
96
|
+
if (
|
97
|
+
branch
|
98
|
+
and len(branch.messages) > 0
|
99
|
+
and isinstance(msg := branch.messages[-1], AssistantResponse)
|
100
|
+
):
|
101
|
+
costs += msg.model_response.get("total_cost_usd") or 0
|
102
|
+
return f"""
|
103
|
+
Response: {msg.model_response.get("result") or "Not available"}
|
104
|
+
Summary: {msg.model_response.get("summary") or "Not available"}
|
105
|
+
""".strip()
|
106
|
+
|
107
|
+
await session.flow(builder.get_graph())
|
108
|
+
ctx = [get_context(i) for i in research_nodes]
|
109
|
+
|
110
|
+
synthesis = builder.add_operation(
|
90
111
|
"communicate",
|
91
|
-
|
112
|
+
depends_on=research_nodes,
|
92
113
|
branch=orc_branch,
|
93
114
|
instruction="Synthesize the information from the researcher branches.",
|
115
|
+
context=[i for i in ctx if i is not None],
|
116
|
+
)
|
117
|
+
|
118
|
+
result3 = await session.flow(builder.get_graph())
|
119
|
+
result_synthesis = result3["operation_results"][synthesis]
|
120
|
+
|
121
|
+
builder.visualize(
|
122
|
+
"LionAGI codebase investigation: fan-out fan-in pattern with Claude Code"
|
94
123
|
)
|
95
124
|
|
96
|
-
result2 = await session.flow(builder.get_graph())
|
97
|
-
result_synthesis = result2["operation_results"][synthesis]
|
98
125
|
print(result_synthesis)
|
126
|
+
print(f"Flow total cost: ${costs:.4f}")
|
99
127
|
|
100
128
|
except Exception as e:
|
101
129
|
print(f"Error: {e}")
|
@@ -47,12 +47,10 @@ app = FastAPI(
|
|
47
47
|
def check_claude_code():
|
48
48
|
"""Verify Claude Code CLI is installed and accessible"""
|
49
49
|
try:
|
50
|
-
from lionagi.service.
|
51
|
-
CLAUDE,
|
52
|
-
)
|
50
|
+
from lionagi.service.third_party.claude_code import CLAUDE_CLI
|
53
51
|
|
54
52
|
result = subprocess.run(
|
55
|
-
[
|
53
|
+
[CLAUDE_CLI, "--version"], capture_output=True, text=True
|
56
54
|
)
|
57
55
|
if result.returncode != 0:
|
58
56
|
raise RuntimeError(
|
@@ -75,7 +73,6 @@ async def health_check():
|
|
75
73
|
|
76
74
|
@app.post("/v1/query")
|
77
75
|
async def query(request: ClaudeCodeRequest):
|
78
|
-
|
79
76
|
endpoint = ClaudeCodeCLIEndpoint()
|
80
77
|
try:
|
81
78
|
return await endpoint._call(payload={"request": request}, headers={})
|
@@ -0,0 +1,100 @@
|
|
1
|
+
{
|
2
|
+
"cells": [
|
3
|
+
{
|
4
|
+
"cell_type": "code",
|
5
|
+
"execution_count": null,
|
6
|
+
"id": "d2ceb407",
|
7
|
+
"metadata": {},
|
8
|
+
"outputs": [],
|
9
|
+
"source": [
|
10
|
+
"from lionagi.service.connections.endpoint_config import EndpointConfig\n",
|
11
|
+
"from lionagi.service.imodel import Endpoint\n",
|
12
|
+
"from lionagi.service.connections.providers.claude_code_cli import (\n",
|
13
|
+
" ClaudeCodeRequest,\n",
|
14
|
+
")\n",
|
15
|
+
"\n",
|
16
|
+
"claude_code_config = EndpointConfig(\n",
|
17
|
+
" name=\"claude_code_cli_proxy\",\n",
|
18
|
+
" provider=\"claude_code\",\n",
|
19
|
+
" base_url=\"http://localhost:8000/v1\",\n",
|
20
|
+
" endpoint=\"query\",\n",
|
21
|
+
" api_key=\"dummy_api_key\",\n",
|
22
|
+
" kwargs={\"model\": \"sonnet\"},\n",
|
23
|
+
")\n",
|
24
|
+
"claude_code = Endpoint(claude_code_config)"
|
25
|
+
]
|
26
|
+
},
|
27
|
+
{
|
28
|
+
"cell_type": "code",
|
29
|
+
"execution_count": null,
|
30
|
+
"id": "5fc216f4",
|
31
|
+
"metadata": {},
|
32
|
+
"outputs": [],
|
33
|
+
"source": [
|
34
|
+
"# prompt = \"reply in text only, Write a Python function to calculate the factorial of a number.\"\n",
|
35
|
+
"\n",
|
36
|
+
"# await claude_code.call(request=ClaudeCodeRequest(prompt=prompt))"
|
37
|
+
]
|
38
|
+
},
|
39
|
+
{
|
40
|
+
"cell_type": "code",
|
41
|
+
"execution_count": null,
|
42
|
+
"id": "4c173814",
|
43
|
+
"metadata": {},
|
44
|
+
"outputs": [],
|
45
|
+
"source": [
|
46
|
+
"from lionagi import iModel\n",
|
47
|
+
"\n",
|
48
|
+
"claude_code = iModel(endpoint=claude_code)"
|
49
|
+
]
|
50
|
+
},
|
51
|
+
{
|
52
|
+
"cell_type": "code",
|
53
|
+
"execution_count": null,
|
54
|
+
"id": "fe6dcca4",
|
55
|
+
"metadata": {},
|
56
|
+
"outputs": [],
|
57
|
+
"source": [
|
58
|
+
"result = await claude_code.invoke(\n",
|
59
|
+
" messages=[\n",
|
60
|
+
" {\n",
|
61
|
+
" \"role\": \"user\",\n",
|
62
|
+
" \"content\": \"reply in text only, Write a Python function to calculate the factorial of a number.\",\n",
|
63
|
+
" }\n",
|
64
|
+
" ]\n",
|
65
|
+
")"
|
66
|
+
]
|
67
|
+
},
|
68
|
+
{
|
69
|
+
"cell_type": "code",
|
70
|
+
"execution_count": null,
|
71
|
+
"id": "88db9e9a",
|
72
|
+
"metadata": {},
|
73
|
+
"outputs": [],
|
74
|
+
"source": [
|
75
|
+
"result.response"
|
76
|
+
]
|
77
|
+
}
|
78
|
+
],
|
79
|
+
"metadata": {
|
80
|
+
"kernelspec": {
|
81
|
+
"display_name": "lionagi",
|
82
|
+
"language": "python",
|
83
|
+
"name": "python3"
|
84
|
+
},
|
85
|
+
"language_info": {
|
86
|
+
"codemirror_mode": {
|
87
|
+
"name": "ipython",
|
88
|
+
"version": 3
|
89
|
+
},
|
90
|
+
"file_extension": ".py",
|
91
|
+
"mimetype": "text/x-python",
|
92
|
+
"name": "python",
|
93
|
+
"nbconvert_exporter": "python",
|
94
|
+
"pygments_lexer": "ipython3",
|
95
|
+
"version": "3.10.15"
|
96
|
+
}
|
97
|
+
},
|
98
|
+
"nbformat": 4,
|
99
|
+
"nbformat_minor": 5
|
100
|
+
}
|
@@ -0,0 +1,148 @@
|
|
1
|
+
# Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
|
2
|
+
#
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
4
|
+
|
5
|
+
from __future__ import annotations
|
6
|
+
|
7
|
+
from typing import Any, ClassVar
|
8
|
+
|
9
|
+
__all__ = (
|
10
|
+
"LionError",
|
11
|
+
"ValidationError",
|
12
|
+
"NotFoundError",
|
13
|
+
"ExistsError",
|
14
|
+
"ObservationError",
|
15
|
+
"ResourceError",
|
16
|
+
"RateLimitError",
|
17
|
+
"IDError",
|
18
|
+
"RelationError",
|
19
|
+
"OperationError",
|
20
|
+
"ExecutionError",
|
21
|
+
"ItemNotFoundError",
|
22
|
+
"ItemExistsError",
|
23
|
+
)
|
24
|
+
|
25
|
+
|
26
|
+
class LionError(Exception):
|
27
|
+
default_message: ClassVar[str] = "LionAGI error"
|
28
|
+
default_status_code: ClassVar[int] = 500
|
29
|
+
__slots__ = ("message", "details", "status_code")
|
30
|
+
|
31
|
+
def __init__(
|
32
|
+
self,
|
33
|
+
message: str | None = None,
|
34
|
+
*,
|
35
|
+
details: dict[str, Any] | None = None,
|
36
|
+
status_code: int | None = None,
|
37
|
+
cause: Exception | None = None,
|
38
|
+
):
|
39
|
+
super().__init__(message or self.default_message)
|
40
|
+
if cause:
|
41
|
+
self.__cause__ = cause # preserves traceback
|
42
|
+
self.message = message or self.default_message
|
43
|
+
self.details = details or {}
|
44
|
+
self.status_code = status_code or type(self).default_status_code
|
45
|
+
|
46
|
+
def to_dict(self, *, include_cause: bool = False) -> dict[str, Any]:
|
47
|
+
data = {
|
48
|
+
"error": self.__class__.__name__,
|
49
|
+
"message": self.message,
|
50
|
+
"status_code": self.status_code,
|
51
|
+
**({"details": self.details} if self.details else {}),
|
52
|
+
}
|
53
|
+
if include_cause and (cause := self.get_cause()):
|
54
|
+
data["cause"] = repr(cause)
|
55
|
+
return data
|
56
|
+
|
57
|
+
def get_cause(self) -> Exception | None:
|
58
|
+
"""Get the cause of this error, if any."""
|
59
|
+
return self.__cause__ if hasattr(self, "__cause__") else None
|
60
|
+
|
61
|
+
@classmethod
|
62
|
+
def from_value(
|
63
|
+
cls,
|
64
|
+
value: Any,
|
65
|
+
*,
|
66
|
+
expected: str | None = None,
|
67
|
+
message: str | None = None,
|
68
|
+
cause: Exception | None = None,
|
69
|
+
**extra: Any,
|
70
|
+
):
|
71
|
+
"""Create a ValidationError from a value with optional expected type and message."""
|
72
|
+
details = {
|
73
|
+
"value": value,
|
74
|
+
"type": type(value).__name__,
|
75
|
+
**({"expected": expected} if expected else {}),
|
76
|
+
**extra,
|
77
|
+
}
|
78
|
+
return cls(message=message, details=details, cause=cause)
|
79
|
+
|
80
|
+
|
81
|
+
class ValidationError(LionError):
|
82
|
+
"""Exception raised when validation fails."""
|
83
|
+
|
84
|
+
default_message = "Validation failed"
|
85
|
+
default_status_code = 422
|
86
|
+
__slots__ = ()
|
87
|
+
|
88
|
+
|
89
|
+
class NotFoundError(LionError):
|
90
|
+
"""Exception raised when an item is not found."""
|
91
|
+
|
92
|
+
default_message = "Item not found"
|
93
|
+
default_status_code = 404
|
94
|
+
__slots__ = ()
|
95
|
+
|
96
|
+
|
97
|
+
class ExistsError(LionError):
|
98
|
+
"""Exception raised when an item already exists."""
|
99
|
+
|
100
|
+
default_message = "Item already exists"
|
101
|
+
default_status_code = 409
|
102
|
+
__slots__ = ()
|
103
|
+
|
104
|
+
|
105
|
+
class ObservationError(LionError):
|
106
|
+
"""Exception raised when an observation fails."""
|
107
|
+
|
108
|
+
default_message = "Observation failed"
|
109
|
+
default_status_code = 500
|
110
|
+
__slots__ = ()
|
111
|
+
|
112
|
+
|
113
|
+
class ResourceError(LionError):
|
114
|
+
"""Exception raised when resource access fails."""
|
115
|
+
|
116
|
+
default_message = "Resource error"
|
117
|
+
default_status_code = 429
|
118
|
+
__slots__ = ()
|
119
|
+
|
120
|
+
|
121
|
+
class RateLimitError(LionError):
|
122
|
+
__slots__ = ("retry_after",) # one extra attr
|
123
|
+
default_message = "Rate limit exceeded"
|
124
|
+
default_status_code = 429
|
125
|
+
|
126
|
+
def __init__(self, retry_after: float, **kw):
|
127
|
+
super().__init__(**kw)
|
128
|
+
object.__setattr__(self, "retry_after", retry_after)
|
129
|
+
|
130
|
+
|
131
|
+
class IDError(LionError):
|
132
|
+
pass
|
133
|
+
|
134
|
+
|
135
|
+
class RelationError(LionError):
|
136
|
+
pass
|
137
|
+
|
138
|
+
|
139
|
+
class OperationError(LionError):
|
140
|
+
pass
|
141
|
+
|
142
|
+
|
143
|
+
class ExecutionError(LionError):
|
144
|
+
pass
|
145
|
+
|
146
|
+
|
147
|
+
ItemNotFoundError = NotFoundError
|
148
|
+
ItemExistsError = ExistsError
|
@@ -63,12 +63,14 @@ class AppSettings(BaseSettings, frozen=True):
|
|
63
63
|
GROQ_API_KEY: SecretStr | None = None
|
64
64
|
ANTHROPIC_API_KEY: SecretStr | None = None
|
65
65
|
|
66
|
+
OPENAI_DEFAULT_MODEL: str = "gpt-4.1-mini"
|
67
|
+
|
66
68
|
# defaults models
|
67
69
|
LIONAGI_EMBEDDING_PROVIDER: str = "openai"
|
68
70
|
LIONAGI_EMBEDDING_MODEL: str = "text-embedding-3-small"
|
69
71
|
|
70
72
|
LIONAGI_CHAT_PROVIDER: str = "openai"
|
71
|
-
LIONAGI_CHAT_MODEL: str = "gpt-4.1-
|
73
|
+
LIONAGI_CHAT_MODEL: str = "gpt-4.1-mini"
|
72
74
|
|
73
75
|
# default storage
|
74
76
|
LIONAGI_AUTO_STORE_EVENT: bool = False
|
@@ -0,0 +1,79 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import asyncio
|
4
|
+
import functools
|
5
|
+
from time import sleep, time
|
6
|
+
from typing import Any, Callable, TypeVar
|
7
|
+
|
8
|
+
T = TypeVar("T")
|
9
|
+
|
10
|
+
|
11
|
+
__all__ = ("Throttle",)
|
12
|
+
|
13
|
+
|
14
|
+
class Throttle:
|
15
|
+
"""
|
16
|
+
Provide a throttling mechanism for function calls.
|
17
|
+
|
18
|
+
When used as a decorator, it ensures that the decorated function can only
|
19
|
+
be called once per specified period. Subsequent calls within this period
|
20
|
+
are delayed to enforce this constraint.
|
21
|
+
|
22
|
+
Attributes:
|
23
|
+
period: The minimum time period (in seconds) between successive calls.
|
24
|
+
"""
|
25
|
+
|
26
|
+
def __init__(self, period: float) -> None:
|
27
|
+
"""
|
28
|
+
Initialize a new instance of Throttle.
|
29
|
+
|
30
|
+
Args:
|
31
|
+
period: The minimum time period (in seconds) between
|
32
|
+
successive calls.
|
33
|
+
"""
|
34
|
+
self.period = period
|
35
|
+
self.last_called = 0
|
36
|
+
|
37
|
+
def __call__(self, func: Callable[..., T]) -> Callable[..., T]:
|
38
|
+
"""
|
39
|
+
Decorate a synchronous function with the throttling mechanism.
|
40
|
+
|
41
|
+
Args:
|
42
|
+
func: The synchronous function to be throttled.
|
43
|
+
|
44
|
+
Returns:
|
45
|
+
The throttled synchronous function.
|
46
|
+
"""
|
47
|
+
|
48
|
+
@functools.wraps(func)
|
49
|
+
def wrapper(*args, **kwargs) -> Any:
|
50
|
+
elapsed = time() - self.last_called
|
51
|
+
if elapsed < self.period:
|
52
|
+
sleep(self.period - elapsed)
|
53
|
+
self.last_called = time()
|
54
|
+
return func(*args, **kwargs)
|
55
|
+
|
56
|
+
return wrapper
|
57
|
+
|
58
|
+
def __call_async__(
|
59
|
+
self, func: Callable[..., Callable[..., T]]
|
60
|
+
) -> Callable[..., Callable[..., T]]:
|
61
|
+
"""
|
62
|
+
Decorate an asynchronous function with the throttling mechanism.
|
63
|
+
|
64
|
+
Args:
|
65
|
+
func: The asynchronous function to be throttled.
|
66
|
+
|
67
|
+
Returns:
|
68
|
+
The throttled asynchronous function.
|
69
|
+
"""
|
70
|
+
|
71
|
+
@functools.wraps(func)
|
72
|
+
async def wrapper(*args, **kwargs) -> Any:
|
73
|
+
elapsed = time() - self.last_called
|
74
|
+
if elapsed < self.period:
|
75
|
+
await asyncio.sleep(self.period - elapsed)
|
76
|
+
self.last_called = time()
|
77
|
+
return await func(*args, **kwargs)
|
78
|
+
|
79
|
+
return wrapper
|
@@ -8,7 +8,8 @@ from lionagi.libs.schema.function_to_schema import function_to_schema
|
|
8
8
|
from lionagi.libs.validate.fuzzy_match_keys import fuzzy_match_keys
|
9
9
|
from lionagi.libs.validate.fuzzy_validate_mapping import fuzzy_validate_mapping
|
10
10
|
from lionagi.libs.validate.string_similarity import string_similarity
|
11
|
-
from lionagi.
|
11
|
+
from lionagi.libs.validate.to_num import to_num
|
12
|
+
from lionagi.utils import fuzzy_parse_json, to_dict, to_json
|
12
13
|
|
13
14
|
validate_keys = fuzzy_match_keys # for backward compatibility
|
14
15
|
validate_mapping = fuzzy_validate_mapping # for backward compatibility
|
@@ -0,0 +1,45 @@
|
|
1
|
+
from lionagi.utils import check_import, is_import_installed
|
2
|
+
|
3
|
+
_HAS_PDF2IMAGE = is_import_installed("pdf2image")
|
4
|
+
|
5
|
+
|
6
|
+
def pdf_to_images(
|
7
|
+
pdf_path: str, output_folder: str, dpi: int = 300, fmt: str = "jpeg"
|
8
|
+
) -> list:
|
9
|
+
"""
|
10
|
+
Convert a PDF file into images, one image per page.
|
11
|
+
|
12
|
+
Args:
|
13
|
+
pdf_path (str): Path to the input PDF file.
|
14
|
+
output_folder (str): Directory to save the output images.
|
15
|
+
dpi (int): Dots per inch (resolution) for conversion (default: 300).
|
16
|
+
fmt (str): Image format (default: 'jpeg'). Use 'png' if preferred.
|
17
|
+
|
18
|
+
Returns:
|
19
|
+
list: A list of file paths for the saved images.
|
20
|
+
"""
|
21
|
+
if not _HAS_PDF2IMAGE:
|
22
|
+
raise ModuleNotFoundError(
|
23
|
+
"pdf2image is not installed, please install it with `pip install lionagi[unstructured]`"
|
24
|
+
)
|
25
|
+
|
26
|
+
import os
|
27
|
+
|
28
|
+
convert_from_path = check_import(
|
29
|
+
"pdf2image", import_name="convert_from_path"
|
30
|
+
)
|
31
|
+
|
32
|
+
# Ensure the output folder exists
|
33
|
+
os.makedirs(output_folder, exist_ok=True)
|
34
|
+
|
35
|
+
# Convert PDF to a list of PIL Image objects
|
36
|
+
images = convert_from_path(pdf_path, dpi=dpi)
|
37
|
+
|
38
|
+
saved_paths = []
|
39
|
+
for i, image in enumerate(images):
|
40
|
+
# Construct the output file name
|
41
|
+
image_file = os.path.join(output_folder, f"page_{i + 1}.{fmt}")
|
42
|
+
image.save(image_file, fmt.upper())
|
43
|
+
saved_paths.append(image_file)
|
44
|
+
|
45
|
+
return saved_paths
|
@@ -0,0 +1,33 @@
|
|
1
|
+
from pathlib import Path
|
2
|
+
|
3
|
+
from lionagi.utils import is_import_installed
|
4
|
+
|
5
|
+
_HAS_OPENCV = is_import_installed("cv2")
|
6
|
+
|
7
|
+
|
8
|
+
__all__ = ("read_image_to_base64",)
|
9
|
+
|
10
|
+
|
11
|
+
def read_image_to_base64(image_path: str | Path) -> str:
|
12
|
+
if not _HAS_OPENCV:
|
13
|
+
raise ModuleNotFoundError(
|
14
|
+
"OpenCV is not installed, please install it with `pip install lionagi[unstructured]`"
|
15
|
+
)
|
16
|
+
|
17
|
+
import base64
|
18
|
+
|
19
|
+
import cv2
|
20
|
+
|
21
|
+
image_path = str(image_path)
|
22
|
+
image = cv2.imread(image_path, cv2.COLOR_BGR2RGB)
|
23
|
+
|
24
|
+
if image is None:
|
25
|
+
raise ValueError(f"Could not read image from path: {image_path}")
|
26
|
+
|
27
|
+
file_extension = "." + image_path.split(".")[-1]
|
28
|
+
|
29
|
+
success, buffer = cv2.imencode(file_extension, image)
|
30
|
+
if not success:
|
31
|
+
raise ValueError(f"Could not encode image to {file_extension} format.")
|
32
|
+
encoded_image = base64.b64encode(buffer).decode("utf-8")
|
33
|
+
return encoded_image
|