lionagi 0.17.5__tar.gz → 0.17.6__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.17.5 → lionagi-0.17.6}/.github/workflows/benchmarks.yml +1 -1
- {lionagi-0.17.5 → lionagi-0.17.6}/.github/workflows/ci.yml +2 -2
- {lionagi-0.17.5 → lionagi-0.17.6}/.github/workflows/docs-deploy.yml +1 -1
- {lionagi-0.17.5 → lionagi-0.17.6}/.github/workflows/refresh-bench-baselines.yml +1 -1
- {lionagi-0.17.5 → lionagi-0.17.6}/.github/workflows/release.yml +2 -2
- {lionagi-0.17.5 → lionagi-0.17.6}/.gitignore +2 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/PKG-INFO +2 -2
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/config.py +26 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/fields/action.py +5 -3
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/file/chunk.py +3 -14
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/file/process.py +10 -92
- lionagi-0.17.6/lionagi/libs/schema/breakdown_pydantic_annotation.py +45 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/_async_call.py +6 -6
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/fuzzy/_fuzzy_match.py +3 -6
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/fuzzy/_fuzzy_validate.py +3 -4
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/fuzzy/_string_similarity.py +11 -5
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/fuzzy/_to_dict.py +19 -19
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/types.py +15 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/operate/operate.py +7 -11
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/parse/parse.py +5 -3
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/generic/element.py +3 -6
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/generic/event.py +1 -1
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/mail/package.py +2 -2
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/instruction.py +9 -1
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/operatives/operative.py +4 -3
- lionagi-0.17.6/lionagi/service/broadcaster.py +61 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/api_calling.py +21 -140
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/hooks/__init__.py +2 -10
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/hooks/_types.py +1 -0
- lionagi-0.17.6/lionagi/service/hooks/hooked_event.py +142 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/imodel.py +2 -2
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/session/branch.py +46 -169
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/session/session.py +1 -44
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/tools/file/reader.py +6 -4
- lionagi-0.17.6/lionagi/utils.py +247 -0
- lionagi-0.17.6/lionagi/version.py +1 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/pyproject.toml +2 -2
- {lionagi-0.17.5 → lionagi-0.17.6}/uv.lock +13 -10
- lionagi-0.17.5/lionagi/libs/file/_utils.py +0 -10
- lionagi-0.17.5/lionagi/libs/file/concat.py +0 -121
- lionagi-0.17.5/lionagi/libs/file/concat_files.py +0 -85
- lionagi-0.17.5/lionagi/libs/file/file_ops.py +0 -118
- lionagi-0.17.5/lionagi/libs/file/save.py +0 -103
- lionagi-0.17.5/lionagi/ln/concurrency/throttle.py +0 -83
- lionagi-0.17.5/lionagi/settings.py +0 -71
- lionagi-0.17.5/lionagi/utils.py +0 -578
- lionagi-0.17.5/lionagi/version.py +0 -1
- {lionagi-0.17.5 → lionagi-0.17.6}/.coveragerc +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/.env.example +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/.github/FUNDING.yml +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/.github/dependabot.yml +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/.github/workflows/codeql.yml +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/.pre-commit-config.yaml +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/.python-version +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/CODE_OF_CONDUCT.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/CONTRIBUTING.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/LICENSE +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/README.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/assets/operation_builder.gif +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/README.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/baselines/.gitkeep +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/baselines/concurrency-asyncio.json +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/baselines/concurrency-trio.json +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/baselines/fuzzy.json +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/baselines/ln-asyncio.json +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/baselines/ln-trio.json +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/ci_compare.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/concurrency_bench.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/fuzzy_bench.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/ln_bench.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/001_branch_converse.ipynb +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/002_branch_interact.ipynb +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/003_branch_info.ipynb +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/004_conversation_patterns.ipynb +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/005_react_basics.ipynb +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/006_operation_graphs_claim_extraction.ipynb +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/007_fan_out_in.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/data/002_comedian.json +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/data/002_critic.json +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/data/006_lion_proof_ch2.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/using_claude_code/claude_proxy/README.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/using_claude_code/claude_proxy/claude_code_proxy.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/using_claude_code/claude_proxy/run_w_claude_code_proxy.ipynb +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/using_claude_code/using_claude_code.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/using_mcp/.mcp.json +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/using_mcp/README.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/using_mcp/react_mcp_with_schema.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/using_mcp/search_group.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/using_mcp/search_group_config.json +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/DOCUMENTATION_STANDARDS.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/advanced/custom-operations.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/advanced/error-handling.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/advanced/flow-composition.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/advanced/index.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/advanced/observability.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/advanced/performance.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/code-of-conduct.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/comparisons/langgraph.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/contributing.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/cookbook/brainstorming.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/cookbook/claim-extraction.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/cookbook/code-review-crew.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/cookbook/data-persistence.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/cookbook/hr-automation.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/cookbook/index.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/cookbook/research-synthesis.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/core-concepts/index.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/core-concepts/lionagi-philosophy.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/core-concepts/messages-and-memory.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/core-concepts/models-and-providers.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/core-concepts/operations.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/core-concepts/sessions-and-branches.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/core-concepts/tools-and-functions.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/for-ai-agents/claude-code-usage.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/for-ai-agents/index.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/for-ai-agents/orchestration-guide.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/for-ai-agents/pattern-selection.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/for-ai-agents/self-improvement.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/includes/abbreviations.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/index.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/integrations/databases.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/integrations/dspy-optimization.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/integrations/index.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/integrations/llamaindex-rag.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/integrations/llm-providers.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/integrations/mcp-servers.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/integrations/tools.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/integrations/vector-stores.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/marketing/language-interoperability-manifesto.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/migration/from-autogen.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/migration/from-crewai.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/migration/from-langchain.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/migration/index.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/patterns/conditional-flows.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/patterns/fan-out-in.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/patterns/index.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/patterns/react-with-rag.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/patterns/sequential-analysis.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/patterns/tournament-validation.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/problem-statement.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/quickstart/claude-code-integration.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/quickstart/index.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/quickstart/installation.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/quickstart/orchestration-first.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/quickstart/your-first-flow.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/reference/api/index.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/reference/changelog.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/reference/troubleshooting.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/stylesheets/extra.css +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/thinking-in-lionagi/branches-as-agents.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/thinking-in-lionagi/builder-pattern.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/thinking-in-lionagi/graphs-over-chains.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/thinking-in-lionagi/index.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/docs/thinking-in-lionagi/why-lionagi.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/_class_registry.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/_errors.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/_types.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/adapters/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/adapters/_utils.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/adapters/async_postgres_adapter.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/fields/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/fields/base.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/fields/code.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/fields/file.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/fields/instruct.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/fields/reason.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/fields/research.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/file/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/schema/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/schema/as_readable.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/schema/extract_code_block.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/schema/extract_docstring.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/schema/function_to_schema.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/schema/load_pydantic_model_from_schema.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/validate/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/validate/common_field_validators.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/validate/to_num.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/validate/validate_boolean.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/_hash.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/_json_dump.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/_list_call.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/_to_list.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/_utils.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/concurrency/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/concurrency/_compat.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/concurrency/cancel.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/concurrency/errors.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/concurrency/patterns.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/concurrency/primitives.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/concurrency/resource_tracker.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/concurrency/task.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/concurrency/utils.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/fuzzy/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/fuzzy/_extract_json.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/fuzzy/_fuzzy_json.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/models/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/models/field_model.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/models/hashable_model.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/models/model_params.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/models/operable_model.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/models/schema_model.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/ReAct/ReAct.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/ReAct/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/ReAct/utils.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/_act/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/_act/act.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/_visualize_graph.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/brainstorm/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/brainstorm/brainstorm.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/brainstorm/prompt.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/builder.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/chat/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/chat/chat.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/communicate/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/communicate/communicate.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/flow.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/instruct/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/instruct/instruct.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/interpret/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/interpret/interpret.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/manager.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/node.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/operate/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/parse/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/plan/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/plan/plan.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/plan/prompt.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/select/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/select/select.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/select/utils.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/types.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/utils.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/_concepts.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/action/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/action/function_calling.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/action/manager.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/action/tool.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/contracts.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/forms/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/forms/base.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/forms/flow.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/forms/form.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/forms/report.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/generic/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/generic/log.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/generic/pile.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/generic/processor.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/generic/progression.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/graph/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/graph/edge.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/graph/graph.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/graph/node.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/ids.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/mail/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/mail/exchange.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/mail/mail.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/mail/mailbox.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/mail/manager.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/action_request.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/action_response.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/assistant_response.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/base.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/manager.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/message.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/system.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/templates/README.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/templates/action_request.jinja2 +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/templates/action_response.jinja2 +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/templates/assistant_response.jinja2 +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/templates/instruction_message.jinja2 +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/templates/system_message.jinja2 +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/templates/tool_schemas.jinja2 +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/operatives/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/operatives/step.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/types.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/py.typed +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/endpoint.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/endpoint_config.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/header_factory.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/match_endpoint.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/mcp/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/mcp/wrapper.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/providers/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/providers/anthropic_.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/providers/claude_code_cli.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/providers/exa_.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/providers/nvidia_nim_.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/providers/oai_.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/providers/ollama_.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/providers/perplexity_.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/providers/types.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/hooks/_utils.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/hooks/hook_event.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/hooks/hook_registry.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/manager.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/rate_limited_processor.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/resilience.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/third_party/README.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/third_party/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/third_party/anthropic_models.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/third_party/claude_code.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/third_party/exa_models.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/third_party/openai_model_names.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/third_party/pplx_models.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/token_calculator.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/types.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/session/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/session/prompts.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/tools/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/tools/base.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/tools/file/__init__.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/tools/types.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/main.py +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/mkdocs.yml +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/scripts/README.md +0 -0
- {lionagi-0.17.5 → lionagi-0.17.6}/scripts/update_openai_models.py +0 -0
@@ -18,7 +18,7 @@ jobs:
|
|
18
18
|
steps:
|
19
19
|
- uses: actions/checkout@v5
|
20
20
|
- name: Set up Python ${{ matrix.python-version }}
|
21
|
-
uses: actions/setup-python@
|
21
|
+
uses: actions/setup-python@v6
|
22
22
|
with:
|
23
23
|
python-version: ${{ matrix.python-version }}
|
24
24
|
|
@@ -59,7 +59,7 @@ jobs:
|
|
59
59
|
steps:
|
60
60
|
- uses: actions/checkout@v5
|
61
61
|
- name: Set up Python
|
62
|
-
uses: actions/setup-python@
|
62
|
+
uses: actions/setup-python@v6
|
63
63
|
with:
|
64
64
|
python-version: "3.12"
|
65
65
|
|
@@ -16,7 +16,7 @@ jobs:
|
|
16
16
|
steps:
|
17
17
|
- uses: actions/checkout@v5
|
18
18
|
- name: Set up Python ${{ matrix.python-version }}
|
19
|
-
uses: actions/setup-python@
|
19
|
+
uses: actions/setup-python@v6
|
20
20
|
with:
|
21
21
|
python-version: ${{ matrix.python-version }}
|
22
22
|
|
@@ -41,7 +41,7 @@ jobs:
|
|
41
41
|
steps:
|
42
42
|
- uses: actions/checkout@v5
|
43
43
|
- name: Set up Python
|
44
|
-
uses: actions/setup-python@
|
44
|
+
uses: actions/setup-python@v6
|
45
45
|
with:
|
46
46
|
python-version: "3.12"
|
47
47
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: lionagi
|
3
|
-
Version: 0.17.
|
3
|
+
Version: 0.17.6
|
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: msgspec>=0.18.0
|
229
229
|
Requires-Dist: pydantic-settings>=2.8.0
|
230
230
|
Requires-Dist: pydantic>=2.8.0
|
231
|
-
Requires-Dist: pydapter>=1.1.1
|
231
|
+
Requires-Dist: pydapter[pandas]>=1.1.1
|
232
232
|
Requires-Dist: python-dotenv>=1.1.0
|
233
233
|
Requires-Dist: tiktoken>=0.9.0
|
234
234
|
Provides-Extra: all
|
@@ -83,6 +83,17 @@ class AppSettings(BaseSettings, frozen=True):
|
|
83
83
|
LIONAGI_QDRANT_URL: str = "http://localhost:6333"
|
84
84
|
LIONAGI_DEFAULT_QDRANT_COLLECTION: str = "event_logs"
|
85
85
|
|
86
|
+
# Log configuration
|
87
|
+
LOG_PERSIST_DIR: str = "./data/logs"
|
88
|
+
LOG_SUBFOLDER: str | None = None
|
89
|
+
LOG_CAPACITY: int = 50
|
90
|
+
LOG_EXTENSION: str = ".json"
|
91
|
+
LOG_USE_TIMESTAMP: bool = True
|
92
|
+
LOG_HASH_DIGITS: int = 5
|
93
|
+
LOG_FILE_PREFIX: str = "log"
|
94
|
+
LOG_AUTO_SAVE_ON_EXIT: bool = True
|
95
|
+
LOG_CLEAR_AFTER_DUMP: bool = True
|
96
|
+
|
86
97
|
# Class variable to store the singleton instance
|
87
98
|
_instance: ClassVar[Any] = None
|
88
99
|
|
@@ -119,6 +130,21 @@ class AppSettings(BaseSettings, frozen=True):
|
|
119
130
|
|
120
131
|
return str(secret)
|
121
132
|
|
133
|
+
@property
|
134
|
+
def LOG_CONFIG(self) -> dict[str, Any]:
|
135
|
+
"""Get LOG configuration dict compatible with old Settings.Config.LOG format."""
|
136
|
+
return {
|
137
|
+
"persist_dir": self.LOG_PERSIST_DIR,
|
138
|
+
"subfolder": self.LOG_SUBFOLDER,
|
139
|
+
"capacity": self.LOG_CAPACITY,
|
140
|
+
"extension": self.LOG_EXTENSION,
|
141
|
+
"use_timestamp": self.LOG_USE_TIMESTAMP,
|
142
|
+
"hash_digits": self.LOG_HASH_DIGITS,
|
143
|
+
"file_prefix": self.LOG_FILE_PREFIX,
|
144
|
+
"auto_save_on_exit": self.LOG_AUTO_SAVE_ON_EXIT,
|
145
|
+
"clear_after_dump": self.LOG_CLEAR_AFTER_DUMP,
|
146
|
+
}
|
147
|
+
|
122
148
|
|
123
149
|
# Create a singleton instance
|
124
150
|
settings = AppSettings()
|
@@ -11,8 +11,8 @@ from lionagi.libs.validate.common_field_validators import (
|
|
11
11
|
validate_boolean_field,
|
12
12
|
validate_nullable_string_field,
|
13
13
|
)
|
14
|
+
from lionagi.ln import extract_json, to_dict, to_list
|
14
15
|
from lionagi.models import FieldModel, HashableModel
|
15
|
-
from lionagi.utils import to_dict, to_json, to_list
|
16
16
|
|
17
17
|
__all__ = (
|
18
18
|
"ActionRequestModel",
|
@@ -27,11 +27,13 @@ def parse_action_request(content: str | dict) -> list[dict]:
|
|
27
27
|
json_blocks = [content.model_dump()]
|
28
28
|
|
29
29
|
elif isinstance(content, str):
|
30
|
-
json_blocks =
|
30
|
+
json_blocks = extract_json(content, fuzzy_parse=True)
|
31
31
|
if not json_blocks:
|
32
32
|
pattern2 = r"```python\s*(.*?)\s*```"
|
33
33
|
_d = re.findall(pattern2, content, re.DOTALL)
|
34
|
-
json_blocks = [
|
34
|
+
json_blocks = [
|
35
|
+
extract_json(match, fuzzy_parse=True) for match in _d
|
36
|
+
]
|
35
37
|
json_blocks = to_list(json_blocks, dropna=True)
|
36
38
|
|
37
39
|
print(json_blocks)
|
@@ -28,12 +28,6 @@ def chunk_by_chars(
|
|
28
28
|
|
29
29
|
Raises:
|
30
30
|
ValueError: If an error occurs during the chunking process.
|
31
|
-
|
32
|
-
Examples:
|
33
|
-
>>> text = "This is a sample text for chunking."
|
34
|
-
>>> chunks = chunk_by_chars(text, chunk_size=10, overlap=0.2)
|
35
|
-
>>> print(chunks)
|
36
|
-
['This is a ', 'a sample ', 'le text fo', 'for chunki', 'king.']
|
37
31
|
"""
|
38
32
|
try:
|
39
33
|
n_chunks = math.ceil(len(text) / chunk_size)
|
@@ -112,12 +106,6 @@ def chunk_by_tokens(
|
|
112
106
|
|
113
107
|
Raises:
|
114
108
|
ValueError: If an error occurs during the chunking process.
|
115
|
-
|
116
|
-
Examples:
|
117
|
-
>>> tokens = ["This", "is", "a", "sample", "text", "for", "chunking."]
|
118
|
-
>>> chunks = chunk_by_tokens(tokens, chunk_size=3, overlap=0.2)
|
119
|
-
>>> print(chunks)
|
120
|
-
['This is a', 'a sample text', 'text for chunking.']
|
121
109
|
"""
|
122
110
|
try:
|
123
111
|
n_chunks = math.ceil(len(tokens) / chunk_size)
|
@@ -166,7 +154,9 @@ def _chunk_token_two_parts(
|
|
166
154
|
) -> list[str | list[str]]:
|
167
155
|
"""Handle chunking for two parts."""
|
168
156
|
chunks = [tokens[: chunk_size + overlap_size]]
|
169
|
-
|
157
|
+
# When residue == 0, we have perfect division, create the second chunk
|
158
|
+
# When residue > threshold, the leftover is big enough for a second chunk
|
159
|
+
if residue == 0 or residue > threshold:
|
170
160
|
chunks.append(tokens[chunk_size - overlap_size :])
|
171
161
|
else:
|
172
162
|
return _process_single_chunk(tokens, return_tokens)
|
@@ -237,7 +227,6 @@ def chunk_content(
|
|
237
227
|
metadata (Dict[str, Any]): Metadata to be included with each chunk.
|
238
228
|
kwargs for tokenizer, if needed.
|
239
229
|
|
240
|
-
|
241
230
|
Returns:
|
242
231
|
List[Dict[str, Any]]: A list of dictionaries, each representing a chunk with metadata.
|
243
232
|
"""
|
@@ -9,12 +9,9 @@ from pathlib import Path
|
|
9
9
|
from typing import Any, Literal
|
10
10
|
|
11
11
|
from lionagi import ln
|
12
|
+
from lionagi.utils import is_import_installed
|
12
13
|
|
13
|
-
from ._utils import check_docling_available
|
14
14
|
from .chunk import chunk_content
|
15
|
-
from .save import save_chunks
|
16
|
-
|
17
|
-
_HAS_DOCLING = check_docling_available()
|
18
15
|
|
19
16
|
|
20
17
|
def dir_to_files(
|
@@ -90,82 +87,6 @@ def dir_to_files(
|
|
90
87
|
raise ValueError(f"Error processing directory {directory}: {e}") from e
|
91
88
|
|
92
89
|
|
93
|
-
def file_to_chunks(
|
94
|
-
file_path: str | Path,
|
95
|
-
chunk_by: Literal["chars", "tokens"] = "chars",
|
96
|
-
chunk_size: int = 1500,
|
97
|
-
overlap: float = 0.1,
|
98
|
-
threshold: int = 200,
|
99
|
-
encoding: str = "utf-8",
|
100
|
-
custom_metadata: dict[str, Any] | None = None,
|
101
|
-
output_dir: str | Path | None = None,
|
102
|
-
verbose: bool = False,
|
103
|
-
timestamp: bool = True,
|
104
|
-
random_hash_digits: int = 4,
|
105
|
-
as_node: bool = False,
|
106
|
-
) -> list[dict[str, Any]]:
|
107
|
-
"""
|
108
|
-
Process a file and split its content into chunks.
|
109
|
-
|
110
|
-
This function reads a file, splits its content into chunks using the provided
|
111
|
-
chunking function, and optionally saves the chunks to separate files.
|
112
|
-
|
113
|
-
Args:
|
114
|
-
file_path (Union[str, Path]): Path to the file to be processed.
|
115
|
-
chunk_func (Callable): Function to use for chunking the content.
|
116
|
-
chunk_size (int): The target size for each chunk.
|
117
|
-
overlap (float): The fraction of overlap between chunks.
|
118
|
-
threshold (int): The minimum size for the last chunk.
|
119
|
-
encoding (str): File encoding to use when reading the file.
|
120
|
-
custom_metadata (Optional[Dict[str, Any]]): Additional metadata to include with each chunk.
|
121
|
-
output_dir (Optional[Union[str, Path]]): Directory to save output chunks (if provided).
|
122
|
-
verbose (bool): If True, print verbose output.
|
123
|
-
timestamp (bool): If True, include timestamp in output filenames.
|
124
|
-
random_hash_digits (int): Number of random hash digits to include in output filenames.
|
125
|
-
|
126
|
-
Returns:
|
127
|
-
List[Dict[str, Any]]: A list of dictionaries, each representing a chunk with metadata.
|
128
|
-
|
129
|
-
Raises:
|
130
|
-
ValueError: If there's an error processing the file.
|
131
|
-
"""
|
132
|
-
try:
|
133
|
-
if isinstance(file_path, str):
|
134
|
-
file_path = Path(file_path)
|
135
|
-
|
136
|
-
text = file_path.read_text(encoding=encoding)
|
137
|
-
|
138
|
-
metadata = {
|
139
|
-
"file_path": str(file_path),
|
140
|
-
"file_name": file_path.name,
|
141
|
-
"file_size": file_path.stat().st_size,
|
142
|
-
**(custom_metadata or {}),
|
143
|
-
}
|
144
|
-
|
145
|
-
chunks = chunk_content(
|
146
|
-
text,
|
147
|
-
chunk_by=chunk_by,
|
148
|
-
chunk_size=chunk_size,
|
149
|
-
overlap=overlap,
|
150
|
-
threshold=threshold,
|
151
|
-
metadata=metadata,
|
152
|
-
as_node=as_node,
|
153
|
-
)
|
154
|
-
|
155
|
-
if output_dir:
|
156
|
-
save_chunks(
|
157
|
-
chunks=chunks,
|
158
|
-
output_dir=output_dir,
|
159
|
-
verbose=verbose,
|
160
|
-
timestamp=timestamp,
|
161
|
-
random_hash_digits=random_hash_digits,
|
162
|
-
)
|
163
|
-
|
164
|
-
return chunks
|
165
|
-
except Exception as e:
|
166
|
-
raise ValueError(f"Error processing file {file_path}: {e}") from e
|
167
|
-
|
168
|
-
|
169
90
|
def chunk(
|
170
91
|
*,
|
171
92
|
text: str | None = None,
|
@@ -209,12 +130,12 @@ def chunk(
|
|
209
130
|
reader_tool = lambda x: Path(x).read_text(encoding="utf-8")
|
210
131
|
|
211
132
|
if reader_tool == "docling":
|
212
|
-
if
|
213
|
-
raise
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
133
|
+
if not is_import_installed("docling"):
|
134
|
+
raise ImportError(
|
135
|
+
"The 'docling' package is required for this feature. "
|
136
|
+
"Please install it via 'pip install lionagi[reader]'."
|
137
|
+
)
|
138
|
+
from docling.document_converter import DocumentConverter
|
218
139
|
|
219
140
|
converter = DocumentConverter()
|
220
141
|
reader_tool = lambda x: converter.convert(
|
@@ -235,7 +156,7 @@ def chunk(
|
|
235
156
|
threshold=threshold,
|
236
157
|
metadata=metadata,
|
237
158
|
as_node=True,
|
238
|
-
|
159
|
+
output_flatten=True,
|
239
160
|
tokenizer=tokenizer or str.split,
|
240
161
|
)
|
241
162
|
if threshold:
|
@@ -248,15 +169,12 @@ def chunk(
|
|
248
169
|
if output_file.suffix == ".csv":
|
249
170
|
p = Pile(chunks)
|
250
171
|
p.dump(output_file, "csv")
|
251
|
-
|
252
|
-
if output_file.suffix == "json":
|
172
|
+
elif output_file.suffix == ".json":
|
253
173
|
p = Pile(chunks)
|
254
174
|
p.dump(output_file, "json")
|
255
|
-
|
256
|
-
if output_file.suffix == ".parquet":
|
175
|
+
elif output_file.suffix == ".parquet":
|
257
176
|
p = Pile(chunks)
|
258
177
|
p.dump(output_file, "parquet")
|
259
|
-
|
260
178
|
else:
|
261
179
|
raise ValueError(f"Unsupported output file format: {output_file}")
|
262
180
|
|
@@ -0,0 +1,45 @@
|
|
1
|
+
from inspect import isclass
|
2
|
+
from typing import Any, get_args, get_origin
|
3
|
+
|
4
|
+
from pydantic import BaseModel
|
5
|
+
|
6
|
+
|
7
|
+
def breakdown_pydantic_annotation(
|
8
|
+
model: type[BaseModel],
|
9
|
+
max_depth: int | None = None,
|
10
|
+
current_depth: int = 0,
|
11
|
+
) -> dict[str, Any]:
|
12
|
+
if not _is_pydantic_model(model):
|
13
|
+
raise TypeError("Input must be a Pydantic model")
|
14
|
+
|
15
|
+
if max_depth is not None and current_depth >= max_depth:
|
16
|
+
raise RecursionError("Maximum recursion depth reached")
|
17
|
+
|
18
|
+
out: dict[str, Any] = {}
|
19
|
+
for k, v in model.__annotations__.items():
|
20
|
+
origin = get_origin(v)
|
21
|
+
if _is_pydantic_model(v):
|
22
|
+
out[k] = breakdown_pydantic_annotation(
|
23
|
+
v, max_depth, current_depth + 1
|
24
|
+
)
|
25
|
+
elif origin is list:
|
26
|
+
args = get_args(v)
|
27
|
+
if args and _is_pydantic_model(args[0]):
|
28
|
+
out[k] = [
|
29
|
+
breakdown_pydantic_annotation(
|
30
|
+
args[0], max_depth, current_depth + 1
|
31
|
+
)
|
32
|
+
]
|
33
|
+
else:
|
34
|
+
out[k] = [args[0] if args else Any]
|
35
|
+
else:
|
36
|
+
out[k] = v
|
37
|
+
|
38
|
+
return out
|
39
|
+
|
40
|
+
|
41
|
+
def _is_pydantic_model(x: Any) -> bool:
|
42
|
+
try:
|
43
|
+
return isclass(x) and issubclass(x, BaseModel)
|
44
|
+
except TypeError:
|
45
|
+
return False
|
@@ -43,7 +43,7 @@ async def alcall(
|
|
43
43
|
output_unique: bool = False,
|
44
44
|
output_flatten_tuple_set: bool = False,
|
45
45
|
delay_before_start: float = 0,
|
46
|
-
|
46
|
+
retry_initial_delay: float = 0,
|
47
47
|
retry_backoff: float = 1,
|
48
48
|
retry_default: Any = Unset,
|
49
49
|
retry_timeout: float = None,
|
@@ -143,7 +143,7 @@ async def alcall(
|
|
143
143
|
|
144
144
|
async def execute_task(i: Any, index: int) -> Any:
|
145
145
|
attempts = 0
|
146
|
-
current_delay =
|
146
|
+
current_delay = retry_initial_delay
|
147
147
|
while True:
|
148
148
|
try:
|
149
149
|
result = await call_func(i)
|
@@ -223,10 +223,10 @@ async def bcall(
|
|
223
223
|
output_unique: bool = False,
|
224
224
|
output_flatten_tuple_set: bool = False,
|
225
225
|
delay_before_start: float = 0,
|
226
|
-
|
226
|
+
retry_initial_delay: float = 0,
|
227
227
|
retry_backoff: float = 1,
|
228
228
|
retry_default: Any = Unset,
|
229
|
-
retry_timeout: float =
|
229
|
+
retry_timeout: float = None,
|
230
230
|
retry_attempts: int = 0,
|
231
231
|
max_concurrent: int | None = None,
|
232
232
|
throttle_period: float | None = None,
|
@@ -248,7 +248,7 @@ async def bcall(
|
|
248
248
|
output_unique=output_unique,
|
249
249
|
output_flatten_tuple_set=output_flatten_tuple_set,
|
250
250
|
delay_before_start=delay_before_start,
|
251
|
-
|
251
|
+
retry_initial_delay=retry_initial_delay,
|
252
252
|
retry_backoff=retry_backoff,
|
253
253
|
retry_default=retry_default,
|
254
254
|
retry_timeout=retry_timeout,
|
@@ -279,7 +279,7 @@ class AlcallParams(Params):
|
|
279
279
|
|
280
280
|
# retry and timeout
|
281
281
|
delay_before_start: float
|
282
|
-
|
282
|
+
retry_initial_delay: float
|
283
283
|
retry_backoff: float
|
284
284
|
retry_default: Any
|
285
285
|
retry_timeout: float
|
@@ -1,8 +1,7 @@
|
|
1
|
-
from collections.abc import Sequence
|
2
1
|
from dataclasses import dataclass
|
3
2
|
from typing import Any, ClassVar, Literal
|
4
3
|
|
5
|
-
from ..types import
|
4
|
+
from ..types import KeysLike, Params, Unset
|
6
5
|
from ._string_similarity import (
|
7
6
|
SIMILARITY_ALGO_MAP,
|
8
7
|
SIMILARITY_TYPE,
|
@@ -21,7 +20,7 @@ HandleUnmatched = Literal["ignore", "raise", "remove", "fill", "force"]
|
|
21
20
|
|
22
21
|
def fuzzy_match_keys(
|
23
22
|
d_: dict[str, Any],
|
24
|
-
keys:
|
23
|
+
keys: KeysLike,
|
25
24
|
/,
|
26
25
|
*,
|
27
26
|
similarity_algo: SIMILARITY_TYPE | SimilarityFunc = "jaro_winkler",
|
@@ -166,7 +165,5 @@ class FuzzyMatchKeysParams(Params):
|
|
166
165
|
fill_mapping: dict[str, Any] | Any = Unset
|
167
166
|
strict: bool = False
|
168
167
|
|
169
|
-
def __call__(
|
170
|
-
self, d_: dict[str, Any], keys: Sequence[str] | KeysDict
|
171
|
-
) -> dict[str, Any]:
|
168
|
+
def __call__(self, d_: dict[str, Any], keys: KeysLike) -> dict[str, Any]:
|
172
169
|
return fuzzy_match_keys(d_, keys, **self.default_kw())
|
@@ -1,9 +1,9 @@
|
|
1
|
-
from collections.abc import Callable
|
1
|
+
from collections.abc import Callable
|
2
2
|
from typing import TYPE_CHECKING, Any, Literal
|
3
3
|
|
4
4
|
from lionagi._errors import ValidationError
|
5
5
|
|
6
|
-
from ..types import
|
6
|
+
from ..types import KeysLike
|
7
7
|
from ._extract_json import extract_json
|
8
8
|
from ._fuzzy_match import FuzzyMatchKeysParams, fuzzy_match_keys
|
9
9
|
from ._string_similarity import SIMILARITY_TYPE
|
@@ -56,7 +56,7 @@ def fuzzy_validate_pydantic(
|
|
56
56
|
|
57
57
|
def fuzzy_validate_mapping(
|
58
58
|
d: Any,
|
59
|
-
keys:
|
59
|
+
keys: KeysLike,
|
60
60
|
/,
|
61
61
|
*,
|
62
62
|
similarity_algo: (
|
@@ -110,7 +110,6 @@ def fuzzy_validate_mapping(
|
|
110
110
|
# Try converting to dictionary
|
111
111
|
try:
|
112
112
|
if isinstance(d, str):
|
113
|
-
# First try to_json for JSON strings and code blocks
|
114
113
|
try:
|
115
114
|
json_result = extract_json(
|
116
115
|
d, fuzzy_parse=True, return_one_if_single=True
|
@@ -2,11 +2,13 @@
|
|
2
2
|
#
|
3
3
|
# SPDX-License-Identifier: Apache-2.0
|
4
4
|
|
5
|
-
from collections.abc import Callable
|
5
|
+
from collections.abc import Callable
|
6
6
|
from dataclasses import dataclass
|
7
|
-
from
|
8
|
-
|
9
|
-
|
7
|
+
from typing import TYPE_CHECKING, Literal
|
8
|
+
|
9
|
+
if TYPE_CHECKING:
|
10
|
+
from collections.abc import Sequence
|
11
|
+
|
10
12
|
|
11
13
|
__all__ = ("string_similarity",)
|
12
14
|
|
@@ -157,6 +159,8 @@ def levenshtein_distance(a: str, b: str) -> int:
|
|
157
159
|
int: Minimum number of single-character edits needed to change one
|
158
160
|
string into the other
|
159
161
|
"""
|
162
|
+
from itertools import product
|
163
|
+
|
160
164
|
if not a:
|
161
165
|
return len(b)
|
162
166
|
if not b:
|
@@ -213,6 +217,8 @@ def sequence_matcher_similarity(s1: str, s2: str) -> float:
|
|
213
217
|
Returns:
|
214
218
|
float: Similarity score between 0 and 1
|
215
219
|
"""
|
220
|
+
from difflib import SequenceMatcher
|
221
|
+
|
216
222
|
return SequenceMatcher(None, s1, s2).ratio()
|
217
223
|
|
218
224
|
|
@@ -249,7 +255,7 @@ class MatchResult:
|
|
249
255
|
|
250
256
|
def string_similarity(
|
251
257
|
word: str,
|
252
|
-
correct_words: Sequence[str],
|
258
|
+
correct_words: "Sequence[str]",
|
253
259
|
algorithm: SIMILARITY_TYPE | Callable[[str, str], float] = "jaro_winkler",
|
254
260
|
threshold: float = 0.0,
|
255
261
|
case_sensitive: bool = False,
|