lionagi 0.18.0__tar.gz → 0.18.2__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.18.0 → lionagi-0.18.2}/.coveragerc +0 -4
- {lionagi-0.18.0 → lionagi-0.18.2}/.github/workflows/codeql.yml +3 -3
- {lionagi-0.18.0 → lionagi-0.18.2}/AGENTS.md +6 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/PKG-INFO +6 -5
- {lionagi-0.18.0 → lionagi-0.18.2}/README.md +3 -3
- lionagi-0.18.2/benchmarks/comparisons/README.md +246 -0
- lionagi-0.18.2/benchmarks/comparisons/benchmark_detailed_20251015_141023.csv +901 -0
- lionagi-0.18.2/benchmarks/comparisons/benchmark_results_20251015_141023.json +18965 -0
- lionagi-0.18.2/benchmarks/comparisons/benchmark_summary_20251015_141023.csv +46 -0
- lionagi-0.18.2/benchmarks/comparisons/report.md +200 -0
- lionagi-0.18.2/cookbooks/006_operation_graphs_claim_extraction.ipynb +831 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/cookbooks/007_fan_out_in.py +5 -6
- lionagi-0.18.2/lionagi/__init__.py +141 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/_errors.py +0 -5
- lionagi-0.18.2/lionagi/adapters/spec_adapters/__init__.py +9 -0
- lionagi-0.18.2/lionagi/adapters/spec_adapters/_protocol.py +236 -0
- lionagi-0.18.2/lionagi/adapters/spec_adapters/pydantic_field.py +158 -0
- lionagi-0.18.2/lionagi/fields.py +83 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/__init__.py +3 -1
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/_async_call.py +2 -2
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/concurrency/primitives.py +4 -4
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/concurrency/task.py +1 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/fuzzy/_fuzzy_match.py +2 -2
- lionagi-0.18.2/lionagi/ln/types/__init__.py +51 -0
- lionagi-0.18.2/lionagi/ln/types/_sentinel.py +154 -0
- lionagi-0.18.0/lionagi/ln/types.py → lionagi-0.18.2/lionagi/ln/types/base.py +108 -168
- lionagi-0.18.2/lionagi/ln/types/operable.py +221 -0
- lionagi-0.18.2/lionagi/ln/types/spec.py +441 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/models/field_model.py +69 -7
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/models/hashable_model.py +2 -3
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/models/model_params.py +4 -3
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/ReAct/ReAct.py +1 -1
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/act/act.py +3 -3
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/builder.py +5 -7
- lionagi-0.18.2/lionagi/operations/fields.py +380 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/flow.py +4 -6
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/node.py +4 -4
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/operate/operate.py +123 -89
- lionagi-0.18.2/lionagi/operations/operate/operative.py +198 -0
- lionagi-0.18.2/lionagi/operations/operate/step.py +203 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/select/select.py +1 -1
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/select/utils.py +7 -1
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/types.py +7 -7
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/action/manager.py +5 -6
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/contracts.py +2 -2
- lionagi-0.18.2/lionagi/protocols/generic/__init__.py +24 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/generic/element.py +36 -127
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/generic/pile.py +9 -10
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/generic/progression.py +23 -22
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/graph/edge.py +6 -5
- lionagi-0.18.2/lionagi/protocols/ids.py +38 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/messages/__init__.py +3 -1
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/messages/base.py +7 -6
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/messages/instruction.py +0 -1
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/messages/message.py +2 -2
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/types.py +1 -11
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/connections/__init__.py +3 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/connections/providers/claude_code_cli.py +3 -2
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/hooks/_types.py +1 -1
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/hooks/_utils.py +1 -1
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/hooks/hook_event.py +3 -8
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/hooks/hook_registry.py +5 -5
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/hooks/hooked_event.py +61 -1
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/imodel.py +24 -20
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/third_party/claude_code.py +1 -2
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/third_party/openai_models.py +24 -22
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/token_calculator.py +1 -94
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/session/branch.py +26 -228
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/session/session.py +5 -90
- lionagi-0.18.2/lionagi/version.py +1 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/pyproject.toml +3 -2
- {lionagi-0.18.0 → lionagi-0.18.2}/uv.lock +9 -5
- lionagi-0.18.0/benchmarks/comparisons/README.md +0 -224
- lionagi-0.18.0/benchmarks/comparisons/benchmark_detailed_20250922_182217.csv +0 -901
- lionagi-0.18.0/benchmarks/comparisons/benchmark_results_20250922_182217.json +0 -18965
- lionagi-0.18.0/benchmarks/comparisons/benchmark_summary_20250922_182217.csv +0 -46
- lionagi-0.18.0/benchmarks/comparisons/report.md +0 -200
- lionagi-0.18.0/cookbooks/006_operation_graphs_claim_extraction.ipynb +0 -788
- lionagi-0.18.0/lionagi/__init__.py +0 -98
- lionagi-0.18.0/lionagi/fields/__init__.py +0 -47
- lionagi-0.18.0/lionagi/fields/action.py +0 -188
- lionagi-0.18.0/lionagi/fields/base.py +0 -153
- lionagi-0.18.0/lionagi/fields/code.py +0 -239
- lionagi-0.18.0/lionagi/fields/file.py +0 -234
- lionagi-0.18.0/lionagi/fields/instruct.py +0 -135
- lionagi-0.18.0/lionagi/fields/reason.py +0 -55
- lionagi-0.18.0/lionagi/fields/research.py +0 -52
- lionagi-0.18.0/lionagi/operations/brainstorm/brainstorm.py +0 -498
- lionagi-0.18.0/lionagi/operations/brainstorm/prompt.py +0 -11
- lionagi-0.18.0/lionagi/operations/instruct/instruct.py +0 -28
- lionagi-0.18.0/lionagi/operations/plan/__init__.py +0 -6
- lionagi-0.18.0/lionagi/operations/plan/plan.py +0 -386
- lionagi-0.18.0/lionagi/operations/plan/prompt.py +0 -25
- lionagi-0.18.0/lionagi/operations/utils.py +0 -45
- lionagi-0.18.0/lionagi/protocols/forms/base.py +0 -85
- lionagi-0.18.0/lionagi/protocols/forms/flow.py +0 -79
- lionagi-0.18.0/lionagi/protocols/forms/form.py +0 -86
- lionagi-0.18.0/lionagi/protocols/forms/report.py +0 -48
- lionagi-0.18.0/lionagi/protocols/ids.py +0 -81
- lionagi-0.18.0/lionagi/protocols/mail/__init__.py +0 -2
- lionagi-0.18.0/lionagi/protocols/mail/exchange.py +0 -220
- lionagi-0.18.0/lionagi/protocols/mail/mail.py +0 -51
- lionagi-0.18.0/lionagi/protocols/mail/mailbox.py +0 -103
- lionagi-0.18.0/lionagi/protocols/mail/manager.py +0 -218
- lionagi-0.18.0/lionagi/protocols/mail/package.py +0 -101
- lionagi-0.18.0/lionagi/protocols/operatives/__init__.py +0 -2
- lionagi-0.18.0/lionagi/protocols/operatives/operative.py +0 -362
- lionagi-0.18.0/lionagi/protocols/operatives/step.py +0 -227
- lionagi-0.18.0/lionagi/service/connections/mcp/__init__.py +0 -2
- lionagi-0.18.0/lionagi/service/connections/providers/__init__.py +0 -2
- lionagi-0.18.0/lionagi/tools/__init__.py +0 -2
- lionagi-0.18.0/lionagi/tools/file/__init__.py +0 -2
- lionagi-0.18.0/lionagi/version.py +0 -1
- {lionagi-0.18.0 → lionagi-0.18.2}/.env.example +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/.github/FUNDING.yml +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/.github/dependabot.yml +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/.github/workflows/benchmarks.yml +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/.github/workflows/ci.yml +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/.github/workflows/docs-deploy.yml +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/.github/workflows/refresh-bench-baselines.yml +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/.github/workflows/release.yml +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/.gitignore +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/.pre-commit-config.yaml +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/.python-version +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/CODE_OF_CONDUCT.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/CONTRIBUTING.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/LICENSE +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/assets/operation_builder.gif +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/benchmarks/README.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/benchmarks/baselines/.gitkeep +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/benchmarks/baselines/concurrency-asyncio.json +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/benchmarks/baselines/concurrency-trio.json +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/benchmarks/baselines/fuzzy.json +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/benchmarks/baselines/ln-asyncio.json +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/benchmarks/baselines/ln-trio.json +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/benchmarks/ci_compare.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/benchmarks/comparisons/benchmark_professional.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/benchmarks/comparisons/generate_benchmark_report.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/benchmarks/concurrency_bench.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/benchmarks/fuzzy_bench.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/benchmarks/ln_bench.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/cookbooks/001_branch_converse.ipynb +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/cookbooks/002_branch_interact.ipynb +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/cookbooks/003_branch_info.ipynb +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/cookbooks/004_conversation_patterns.ipynb +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/cookbooks/005_react_basics.ipynb +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/cookbooks/data/002_comedian.json +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/cookbooks/data/002_critic.json +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/cookbooks/data/006_lion_proof_ch2.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/cookbooks/using_claude_code/claude_proxy/README.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/cookbooks/using_claude_code/claude_proxy/claude_code_proxy.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/cookbooks/using_claude_code/claude_proxy/run_w_claude_code_proxy.ipynb +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/cookbooks/using_claude_code/using_claude_code.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/cookbooks/using_mcp/.mcp.json +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/cookbooks/using_mcp/README.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/cookbooks/using_mcp/react_mcp_with_schema.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/cookbooks/using_mcp/search_group.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/cookbooks/using_mcp/search_group_config.json +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/DOCUMENTATION_STANDARDS.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/advanced/custom-operations.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/advanced/error-handling.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/advanced/flow-composition.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/advanced/index.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/advanced/observability.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/advanced/performance.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/code-of-conduct.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/contributing.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/cookbook/brainstorming.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/cookbook/claim-extraction.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/cookbook/code-review-crew.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/cookbook/data-persistence.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/cookbook/hr-automation.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/cookbook/index.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/cookbook/research-synthesis.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/core-concepts/index.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/core-concepts/lionagi-philosophy.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/core-concepts/messages-and-memory.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/core-concepts/models-and-providers.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/core-concepts/operations.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/core-concepts/sessions-and-branches.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/core-concepts/tools-and-functions.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/for-ai-agents/claude-code-usage.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/for-ai-agents/index.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/for-ai-agents/orchestration-guide.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/for-ai-agents/pattern-selection.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/for-ai-agents/self-improvement.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/includes/abbreviations.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/index.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/integrations/databases.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/integrations/dspy-optimization.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/integrations/index.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/integrations/llamaindex-rag.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/integrations/llm-providers.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/integrations/mcp-servers.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/integrations/tools.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/integrations/vector-stores.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/patterns/conditional-flows.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/patterns/fan-out-in.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/patterns/index.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/patterns/react-with-rag.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/patterns/sequential-analysis.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/patterns/tournament-validation.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/problem-statement.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/quickstart/installation.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/quickstart/your-first-flow.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/reference/api/index.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/reference/changelog.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/reference/troubleshooting.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/docs/stylesheets/extra.css +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/_class_registry.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/_types.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/adapters/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/adapters/_utils.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/adapters/async_postgres_adapter.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/config.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/libs/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/libs/file/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/libs/file/chunk.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/libs/file/process.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/libs/schema/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/libs/schema/as_readable.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/libs/schema/breakdown_pydantic_annotation.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/libs/schema/extract_code_block.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/libs/schema/extract_docstring.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/libs/schema/function_to_schema.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/libs/schema/load_pydantic_model_from_schema.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/libs/schema/minimal_yaml.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/libs/validate/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/libs/validate/common_field_validators.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/libs/validate/to_num.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/libs/validate/validate_boolean.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/_hash.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/_json_dump.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/_list_call.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/_to_list.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/_utils.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/concurrency/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/concurrency/_compat.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/concurrency/cancel.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/concurrency/errors.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/concurrency/patterns.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/concurrency/resource_tracker.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/concurrency/utils.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/fuzzy/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/fuzzy/_extract_json.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/fuzzy/_fuzzy_json.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/fuzzy/_fuzzy_validate.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/fuzzy/_string_similarity.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/ln/fuzzy/_to_dict.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/models/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/models/operable_model.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/models/schema_model.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/ReAct/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/ReAct/utils.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/_visualize_graph.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/act/__init__.py +0 -0
- {lionagi-0.18.0/lionagi/operations/brainstorm → lionagi-0.18.2/lionagi/operations/chat}/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/chat/chat.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/communicate/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/communicate/communicate.py +0 -0
- {lionagi-0.18.0/lionagi/operations/chat → lionagi-0.18.2/lionagi/operations/interpret}/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/interpret/interpret.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/manager.py +0 -0
- {lionagi-0.18.0/lionagi/operations/instruct → lionagi-0.18.2/lionagi/operations/operate}/__init__.py +0 -0
- {lionagi-0.18.0/lionagi/operations/interpret → lionagi-0.18.2/lionagi/operations/parse}/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/operations/parse/parse.py +0 -0
- {lionagi-0.18.0/lionagi/operations/operate → lionagi-0.18.2/lionagi/operations/select}/__init__.py +0 -0
- {lionagi-0.18.0/lionagi/operations/parse → lionagi-0.18.2/lionagi/protocols}/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/_concepts.py +0 -0
- {lionagi-0.18.0/lionagi/operations/select → lionagi-0.18.2/lionagi/protocols/action}/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/action/function_calling.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/action/tool.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/generic/event.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/generic/log.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/generic/processor.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/graph/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/graph/graph.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/graph/node.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/messages/action_request.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/messages/action_response.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/messages/assistant_response.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/messages/manager.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/protocols/messages/system.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/py.typed +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/broadcaster.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/connections/api_calling.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/connections/endpoint.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/connections/endpoint_config.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/connections/header_factory.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/connections/match_endpoint.py +0 -0
- {lionagi-0.18.0/lionagi/protocols → lionagi-0.18.2/lionagi/service/connections/mcp}/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/connections/mcp/wrapper.py +0 -0
- {lionagi-0.18.0/lionagi/protocols/action → lionagi-0.18.2/lionagi/service/connections/providers}/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/connections/providers/anthropic_.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/connections/providers/exa_.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/connections/providers/nvidia_nim_.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/connections/providers/oai_.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/connections/providers/ollama_.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/connections/providers/perplexity_.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/hooks/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/manager.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/rate_limited_processor.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/resilience.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/third_party/README.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/third_party/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/third_party/anthropic_models.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/third_party/exa_models.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/service/third_party/pplx_models.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/session/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/session/prompts.py +0 -0
- {lionagi-0.18.0/lionagi/protocols/forms → lionagi-0.18.2/lionagi/tools}/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/tools/base.py +0 -0
- {lionagi-0.18.0/lionagi/protocols/generic → lionagi-0.18.2/lionagi/tools/file}/__init__.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/tools/file/reader.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/tools/types.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/lionagi/utils.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/main.py +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/mkdocs.yml +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/scripts/README.md +0 -0
- {lionagi-0.18.0 → lionagi-0.18.2}/scripts/update_openai_models.py +0 -0
|
@@ -5,11 +5,7 @@ concurrency = thread,multiprocessing
|
|
|
5
5
|
omit =
|
|
6
6
|
tests/*
|
|
7
7
|
lionagi/service/third_party/*
|
|
8
|
-
lionagi/operations/brainstorm/*
|
|
9
|
-
lionagi/operations/plan/*
|
|
10
|
-
lionagi/operations/select/*
|
|
11
8
|
lionagi/operations/_visualize_graph.py
|
|
12
|
-
lionagi/operations/types.py
|
|
13
9
|
lionagi/tools/file/reader.py
|
|
14
10
|
lionagi/tools/types.py
|
|
15
11
|
lionagi/_types.py
|
|
@@ -27,14 +27,14 @@ jobs:
|
|
|
27
27
|
uses: actions/checkout@v5
|
|
28
28
|
|
|
29
29
|
- name: Initialize CodeQL
|
|
30
|
-
uses: github/codeql-action/init@
|
|
30
|
+
uses: github/codeql-action/init@v4
|
|
31
31
|
with:
|
|
32
32
|
languages: ${{ matrix.language }}
|
|
33
33
|
|
|
34
34
|
- name: Autobuild
|
|
35
|
-
uses: github/codeql-action/autobuild@
|
|
35
|
+
uses: github/codeql-action/autobuild@v4
|
|
36
36
|
|
|
37
37
|
- name: Perform CodeQL Analysis
|
|
38
|
-
uses: github/codeql-action/analyze@
|
|
38
|
+
uses: github/codeql-action/analyze@v4
|
|
39
39
|
|
|
40
40
|
# filepath: .github/workflows/codeql-analysis.yml
|
|
@@ -1,31 +1,37 @@
|
|
|
1
1
|
# Repository Guidelines
|
|
2
2
|
|
|
3
3
|
## Project Structure & Module Organization
|
|
4
|
+
|
|
4
5
|
- Core runtime lives in `lionagi/` with subpackages for adapters, operations, session orchestration, protocol definitions, and tool integrations.
|
|
5
6
|
- Reusable assets, demos, and reference notebooks sit under `assets/`, `cookbooks/`, and `notebooks/`; automation scripts are in `scripts/`.
|
|
6
7
|
- Tests mirror the package layout in `tests/` (for example `tests/session/`, `tests/operations/`) with shared fixtures in `tests/fixtures/`.
|
|
7
8
|
- Documentation sources are maintained in `docs/` (MkDocs) and long-form guides in `CLAUDE.md`; published artifacts land in `site/` after builds.
|
|
8
9
|
|
|
9
10
|
## Build, Test, and Development Commands
|
|
11
|
+
|
|
10
12
|
- Install or update the environment with `uv sync --dev`; this pulls project and tooling dependencies from `pyproject.toml` / `uv.lock`.
|
|
11
13
|
- Run the full suite via `uv run pytest`; pass `-m "not slow"` or `-k session` to target subsets while retaining pytest defaults (parallel, strict markers).
|
|
12
14
|
- Format and lint before committing: `uv run black .`, `uv run ruff check lionagi tests`, and `pre-commit run --all-files` for the configured hook chain.
|
|
13
15
|
|
|
14
16
|
## Coding Style & Naming Conventions
|
|
17
|
+
|
|
15
18
|
- Follow Black’s 79-character line length and isort’s Black profile; keep imports grouped standard/third-party/local.
|
|
16
19
|
- Prefer explicit type hints and Pydantic models for structured data; name modules and directories in snake_case, classes in PascalCase, async coroutines with `_async` suffix when clarity helps.
|
|
17
20
|
- Avoid introducing new global state; prefer dependency injection through service or session layers within `lionagi/`.
|
|
18
21
|
|
|
19
22
|
## Testing Guidelines
|
|
23
|
+
|
|
20
24
|
- Place unit tests adjacent to the relevant module subtree (`tests/operations/test_branch.py`, etc.) using filenames that start with `test_` and classes prefixed `Test`.
|
|
21
25
|
- Leverage pytest markers declared in `pyproject.toml` (`unit`, `integration`, `slow`, `performance`); mark long-running or network-dependent flows to keep CI lean.
|
|
22
26
|
- Maintain coverage by extending fixtures and factories in `tests/fixtures/`; include regression cases for bugs and concurrency edge scenarios.
|
|
23
27
|
|
|
24
28
|
## Commit & Pull Request Guidelines
|
|
29
|
+
|
|
25
30
|
- Match the existing history: concise, sentence-case summaries in the imperative voice (e.g., `Improve session retry logic`).
|
|
26
31
|
- Each PR should describe scope, testing evidence (`uv run pytest` output, linting), linked GitHub issues, and screenshots or logs for UX-facing changes.
|
|
27
32
|
- Keep changesets focused, update `docs/` or `mkdocs.yml` alongside API changes, and request reviews once CI is green.
|
|
28
33
|
|
|
29
34
|
## Documentation & Configuration Notes
|
|
35
|
+
|
|
30
36
|
- Keep `.env.example` aligned with new configuration keys; avoid committing real secrets or API tokens.
|
|
31
37
|
- When altering public interfaces, update `docs/` and regenerate the MkDocs site with `uv run mkdocs build` to verify navigation.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lionagi
|
|
3
|
-
Version: 0.18.
|
|
3
|
+
Version: 0.18.2
|
|
4
4
|
Summary: An Intelligence Operating System.
|
|
5
5
|
Author-email: HaiyangLi <quantocean.li@gmail.com>
|
|
6
6
|
License: Apache License
|
|
@@ -227,7 +227,7 @@ Requires-Dist: json-repair>=0.40.0
|
|
|
227
227
|
Requires-Dist: msgspec>=0.18.0
|
|
228
228
|
Requires-Dist: pydantic-settings>=2.8.0
|
|
229
229
|
Requires-Dist: pydantic>=2.8.0
|
|
230
|
-
Requires-Dist: pydapter[pandas]>=1.
|
|
230
|
+
Requires-Dist: pydapter[pandas]>=1.2.0
|
|
231
231
|
Requires-Dist: python-dotenv>=1.1.0
|
|
232
232
|
Requires-Dist: tiktoken>=0.9.0
|
|
233
233
|
Provides-Extra: all
|
|
@@ -240,6 +240,7 @@ Requires-Dist: networkx>=3.0.0; extra == 'all'
|
|
|
240
240
|
Requires-Dist: ollama>=0.4.0; extra == 'all'
|
|
241
241
|
Requires-Dist: pydapter[postgres]; extra == 'all'
|
|
242
242
|
Requires-Dist: rich>=13.0.0; extra == 'all'
|
|
243
|
+
Requires-Dist: xmltodict>=0.12.0; extra == 'all'
|
|
243
244
|
Provides-Extra: graph
|
|
244
245
|
Requires-Dist: matplotlib>=3.7.0; extra == 'graph'
|
|
245
246
|
Requires-Dist: networkx>=3.0.0; extra == 'graph'
|
|
@@ -465,13 +466,13 @@ from lionagi.fields import LIST_INSTRUCT_FIELD_MODEL, Instruct
|
|
|
465
466
|
response3 = await orchestrator.operate(
|
|
466
467
|
instruct=Instruct(
|
|
467
468
|
instruction="create 4 research questions for parallel discovery",
|
|
468
|
-
guidance="put into `
|
|
469
|
+
guidance="put into `instruct_model` field as part of your structured result message",
|
|
469
470
|
context="I'd like to create an orchestration system for AI agents using lionagi"
|
|
470
471
|
),
|
|
471
472
|
field_models=[LIST_INSTRUCT_FIELD_MODEL],
|
|
472
473
|
)
|
|
473
474
|
|
|
474
|
-
len(response3.
|
|
475
|
+
len(response3.instruct_model) # should be 4
|
|
475
476
|
|
|
476
477
|
async def handle_instruct(instruct):
|
|
477
478
|
sub_branch = Branch(
|
|
@@ -482,7 +483,7 @@ async def handle_instruct(instruct):
|
|
|
482
483
|
|
|
483
484
|
# run in parallel across all instruct models
|
|
484
485
|
from lionagi.ln import alcall
|
|
485
|
-
responses = await alcall(response3.
|
|
486
|
+
responses = await alcall(response3.instruct_model, handle_instruct)
|
|
486
487
|
|
|
487
488
|
# now hand these reports back to the orchestrator
|
|
488
489
|
final_response = await orchestrator.communicate(
|
|
@@ -202,13 +202,13 @@ from lionagi.fields import LIST_INSTRUCT_FIELD_MODEL, Instruct
|
|
|
202
202
|
response3 = await orchestrator.operate(
|
|
203
203
|
instruct=Instruct(
|
|
204
204
|
instruction="create 4 research questions for parallel discovery",
|
|
205
|
-
guidance="put into `
|
|
205
|
+
guidance="put into `instruct_model` field as part of your structured result message",
|
|
206
206
|
context="I'd like to create an orchestration system for AI agents using lionagi"
|
|
207
207
|
),
|
|
208
208
|
field_models=[LIST_INSTRUCT_FIELD_MODEL],
|
|
209
209
|
)
|
|
210
210
|
|
|
211
|
-
len(response3.
|
|
211
|
+
len(response3.instruct_model) # should be 4
|
|
212
212
|
|
|
213
213
|
async def handle_instruct(instruct):
|
|
214
214
|
sub_branch = Branch(
|
|
@@ -219,7 +219,7 @@ async def handle_instruct(instruct):
|
|
|
219
219
|
|
|
220
220
|
# run in parallel across all instruct models
|
|
221
221
|
from lionagi.ln import alcall
|
|
222
|
-
responses = await alcall(response3.
|
|
222
|
+
responses = await alcall(response3.instruct_model, handle_instruct)
|
|
223
223
|
|
|
224
224
|
# now hand these reports back to the orchestrator
|
|
225
225
|
final_response = await orchestrator.communicate(
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# Agentic AI Framework Performance Benchmarks
|
|
2
|
+
|
|
3
|
+
Rigorous apples-to-apples performance comparison of major Python agentic AI
|
|
4
|
+
frameworks, focusing on real-world cold-start performance and memory efficiency.
|
|
5
|
+
|
|
6
|
+
## Executive Summary
|
|
7
|
+
|
|
8
|
+
- **LionAGI delivers 2× faster cold-start performance** than the next-best
|
|
9
|
+
framework (LangGraph) across composites, **up to 3.3× faster** on realistic
|
|
10
|
+
workloads, and **54% lower memory usage**.
|
|
11
|
+
|
|
12
|
+
### Key Results (20 runs per test • Python 3.10.15)
|
|
13
|
+
|
|
14
|
+
- **Cold Composite Performance** (geomean of medians; excludes imports): LionAGI
|
|
15
|
+
**153.6 ms** vs LangGraph **340.9 ms** → **LangGraph is 121.9% slower**
|
|
16
|
+
(**LionAGI is 2.2× faster**)
|
|
17
|
+
- **Memory Efficiency**: LionAGI **26.0 MB RSS** vs LangGraph 56.4 MB (**54%
|
|
18
|
+
lower**)
|
|
19
|
+
- **Consistency**: First-place performance in **4/4 cold-start categories**
|
|
20
|
+
- **Orchestrator Setup**: LionAGI **170.1 ms** vs LangGraph 329.0 ms (**93.4%
|
|
21
|
+
faster**)
|
|
22
|
+
- **Operational impact**: **~187 ms saved per cold start** vs LangGraph (≈ **3.1
|
|
23
|
+
min saved per 1k cold starts**)
|
|
24
|
+
|
|
25
|
+
## Headline Performance Metrics
|
|
26
|
+
|
|
27
|
+
### Cold Composite Performance (Geometric Mean of medians, excludes imports)
|
|
28
|
+
|
|
29
|
+
| Rank | Framework | Composite (ms) | RSS (MB) | USS (MB) | vs Best |
|
|
30
|
+
| ---- | -------------- | -------------- | -------- | -------- | ------------------ |
|
|
31
|
+
| 1 | **LionAGI** | 153.6 | 26.0 | 22.6 | — |
|
|
32
|
+
| 2 | LangGraph | 340.9 | 56.4 | 43.8 | **+121.9% slower** |
|
|
33
|
+
| 3 | AutoGen | 637.4 | 103.8 | 91.1 | **+314.9% slower** |
|
|
34
|
+
| 4 | LlamaIndex | 694.7 | 119.6 | 104.1 | **+352.2% slower** |
|
|
35
|
+
| 5 | LangChain Core | 1407.3 | 213.9 | 164.7 | **+816.0% slower** |
|
|
36
|
+
|
|
37
|
+
**Notes**
|
|
38
|
+
|
|
39
|
+
- Composite excludes `imports` because sub-millisecond baselines
|
|
40
|
+
(e.g., lazy imports) are dominated by timer granularity.
|
|
41
|
+
- Conservative composite (excluding `data_processing`): LionAGI **176.0 ms** vs LangGraph
|
|
42
|
+
**342.4 ms** → **LangGraph is 94.5% slower** (**LionAGI is 1.9× faster**).
|
|
43
|
+
|
|
44
|
+
## Detailed Benchmark Results
|
|
45
|
+
|
|
46
|
+
_Process isolation per run • Module cache cleared • CPU pinning enabled_
|
|
47
|
+
|
|
48
|
+
### Orchestrators (Cold) - Production-Ready State
|
|
49
|
+
|
|
50
|
+
| Framework | Median (ms) | P95 (ms) | Range | RSS (MB) | vs Best |
|
|
51
|
+
| -------------- | ----------- | -------- | ----------- | -------- | ------- |
|
|
52
|
+
| **LionAGI** | 170.1 | 177.4 | 165.5-207.6 | 26.9 | — |
|
|
53
|
+
| LangGraph | 329.0 | 339.9 | 324.7-392.6 | 53.4 | +93.4% |
|
|
54
|
+
| AutoGen | 668.4 | 713.8 | 618.9-788.3 | 105.9 | +292.9% |
|
|
55
|
+
| LlamaIndex | 713.7 | 763.8 | 703.5-870.2 | 130.5 | +319.6% |
|
|
56
|
+
| LangChain Core | 1329.7 | 1368.1 | 1315-1869 | 209.1 | +681.7% |
|
|
57
|
+
|
|
58
|
+
### Basic Primitives (Cold) - Core Building Blocks
|
|
59
|
+
|
|
60
|
+
| Framework | Median (ms) | P95 (ms) | Range | RSS (MB) | vs Best |
|
|
61
|
+
| -------------- | ----------- | -------- | ----------- | -------- | ------- |
|
|
62
|
+
| **LionAGI** | 182.7 | 222.7 | 176.8-224.6 | 28.2 | — |
|
|
63
|
+
| LangGraph | 368.2 | 837.7 | 336.3-1143 | 58.6 | +101.5% |
|
|
64
|
+
| AutoGen | 626.2 | 650.1 | 614.9-830.3 | 101.6 | +242.7% |
|
|
65
|
+
| LlamaIndex | 630.0 | 689.8 | 621.4-759.6 | 85.3 | +244.8% |
|
|
66
|
+
| LangChain Core | 1488.5 | 1685.7 | 1377-2258 | 216.5 | +714.7% |
|
|
67
|
+
|
|
68
|
+
### Workflow Setup (Cold) - Multi-Component Coordination
|
|
69
|
+
|
|
70
|
+
| Framework | Median (ms) | P95 (ms) | Range | RSS (MB) | vs Best |
|
|
71
|
+
| -------------- | ----------- | -------- | ----------- | -------- | ------- |
|
|
72
|
+
| **LionAGI** | 175.5 | 186.0 | 165.7-202.5 | 27.4 | — |
|
|
73
|
+
| LangGraph | 331.4 | 350.0 | 325.0-388.3 | 55.9 | +88.8% |
|
|
74
|
+
| AutoGen | 628.5 | 654.3 | 622.4-736.0 | 104.6 | +258.1% |
|
|
75
|
+
| LlamaIndex | 722.3 | 792.3 | 711.2-819.4 | 132.9 | +311.6% |
|
|
76
|
+
| LangChain Core | 1448.6 | 1624.8 | 1356-1989 | 214.0 | +725.4% |
|
|
77
|
+
|
|
78
|
+
### Data Processing (Cold) - Realistic Workload
|
|
79
|
+
|
|
80
|
+
| Framework | Median (ms) | P95 (ms) | Range | RSS (MB) | vs Best |
|
|
81
|
+
| -------------- | ----------- | -------- | ----------- | -------- | -------- |
|
|
82
|
+
| **LionAGI** | 102.1 | 112.9 | 99.2-122.8 | 21.7 | — |
|
|
83
|
+
| LangGraph | 336.5 | 346.4 | 329.8-362.2 | 57.8 | +229.6% |
|
|
84
|
+
| AutoGen | 627.4 | 736.6 | 614.5-765.3 | 103.2 | +514.5% |
|
|
85
|
+
| LlamaIndex | 717.0 | 753.6 | 702.3-883.2 | 129.5 | +602.3% |
|
|
86
|
+
| LangChain Core | 1367.9 | 1461.8 | 1338-1885 | 216.2 | +1239.8% |
|
|
87
|
+
|
|
88
|
+
## Performance Analysis
|
|
89
|
+
|
|
90
|
+
### Memory Efficiency
|
|
91
|
+
|
|
92
|
+
- **LionAGI**: 26.0 MB average RSS (22.6 MB USS) — **most memory efficient**
|
|
93
|
+
- **LangGraph**: 56.4 MB average RSS (**+116.9% vs LionAGI**)
|
|
94
|
+
- **AutoGen**: 103.8 MB average RSS (**+299.2%**)
|
|
95
|
+
- **LlamaIndex**: 119.6 MB average RSS (**+360.0%**)
|
|
96
|
+
- **LangChain Core**: 213.9 MB average RSS (**+722.7%**)
|
|
97
|
+
|
|
98
|
+
### Consistency & Reliability
|
|
99
|
+
|
|
100
|
+
- **Low variability**: See CSV for MAD/stdev; LionAGI shows tight ranges in
|
|
101
|
+
cold-path categories.
|
|
102
|
+
- **P95 performance**: Sub-230 ms P95 in all cold categories — exceptional
|
|
103
|
+
predictability.
|
|
104
|
+
- **Range stability**: Small min-max spans (typically <40ms) across cold
|
|
105
|
+
categories indicate highly predictable performance.
|
|
106
|
+
|
|
107
|
+
## Feature Parity Matrix
|
|
108
|
+
|
|
109
|
+
All frameworks tested with equivalent, normalized workloads:
|
|
110
|
+
|
|
111
|
+
| Framework | Object Built | Core-Only | LLM Used | Network | Notes |
|
|
112
|
+
| -------------- | ---------------------- | --------- | -------- | ------- | ------------------------- |
|
|
113
|
+
| LionAGI | Session() | Yes | None | No | Minimal runtime container |
|
|
114
|
+
| LangGraph | StateGraph.compile() | Yes | None | No | One-node identity graph |
|
|
115
|
+
| LangChain Core | PromptTemplate\|Lambda | Yes | None | No | LCEL chain, no community |
|
|
116
|
+
| LlamaIndex | SimpleChatEngine | Yes | MockLLM | No | Built-in mock, no network |
|
|
117
|
+
| AutoGen | ConversableAgent | Yes | None | No | LLM disabled |
|
|
118
|
+
|
|
119
|
+
## Methodology
|
|
120
|
+
|
|
121
|
+
### Measurement Approach
|
|
122
|
+
|
|
123
|
+
- **Cold Mode**: Full import + object construction (serverless scenario)
|
|
124
|
+
- **Process Isolation**: Fresh Python interpreter per measurement
|
|
125
|
+
- **Statistical Rigor**: Median, P95, MAD, trimmed mean for outlier resistance
|
|
126
|
+
- **Memory Tracking**: RSS (Resident Set Size) and USS (Unique Set Size)
|
|
127
|
+
|
|
128
|
+
### Environmental Controls
|
|
129
|
+
|
|
130
|
+
- CPU pinning for reduced scheduler noise
|
|
131
|
+
- Deterministic hashing (PYTHONHASHSEED=0)
|
|
132
|
+
- Module cache clearing between runs
|
|
133
|
+
- API keys blanked to prevent network calls
|
|
134
|
+
- 30-second timeout to prevent hangs
|
|
135
|
+
|
|
136
|
+
### Excluded from Headlines
|
|
137
|
+
|
|
138
|
+
- **Import-only tests**: Dominated by lazy loading and timer granularity
|
|
139
|
+
- **Sub-millisecond measurements**: Below meaningful timer resolution
|
|
140
|
+
|
|
141
|
+
## Reproducing Results
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
# Clone repository
|
|
145
|
+
git clone https://github.com/lion-agi/lionagi.git
|
|
146
|
+
cd lionagi/benchmarks/comparisons
|
|
147
|
+
|
|
148
|
+
# Install dependencies
|
|
149
|
+
uv add --dev langgraph langchain-core llama-index-core pyautogen psutil
|
|
150
|
+
# (Recommended) Pin exact versions for reproducibility
|
|
151
|
+
uv lock
|
|
152
|
+
# Or export a frozen requirements file:
|
|
153
|
+
uv export --frozen --format requirements.txt > bench.requirements.txt
|
|
154
|
+
|
|
155
|
+
# Run full benchmark (20 runs, ~15 minutes)
|
|
156
|
+
uv run python benchmark_professional.py --runs 20 --report
|
|
157
|
+
|
|
158
|
+
# Generate report
|
|
159
|
+
uv run python generate_benchmark_report.py
|
|
160
|
+
|
|
161
|
+
# Quick test (3 runs)
|
|
162
|
+
uv run python benchmark_professional.py --runs 3
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Environment & Versions
|
|
166
|
+
|
|
167
|
+
Test environment and package versions used for benchmarks:
|
|
168
|
+
|
|
169
|
+
```text
|
|
170
|
+
Hardware: Apple M2 Max, 32GB RAM
|
|
171
|
+
OS: macOS (Darwin 24.6.0)
|
|
172
|
+
Python: 3.10.15
|
|
173
|
+
LionAGI: v0.18.1
|
|
174
|
+
langgraph: 0.6.7
|
|
175
|
+
langchain-core: 0.3.76
|
|
176
|
+
llama-index-core: 0.14.2
|
|
177
|
+
pyautogen: 0.10.0
|
|
178
|
+
psutil: 7.1.0
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Use Case Recommendations
|
|
182
|
+
|
|
183
|
+
### When to Choose LionAGI
|
|
184
|
+
|
|
185
|
+
- **Serverless/Lambda Functions**: 153.6ms cold start vs 340.9ms+ for
|
|
186
|
+
alternatives
|
|
187
|
+
- **Memory-Constrained Environments**: 54% lower memory footprint than nearest
|
|
188
|
+
competitor
|
|
189
|
+
- **High-Frequency Operations**: Consistent sub-180ms initialization across all
|
|
190
|
+
workloads
|
|
191
|
+
- **Cost-Sensitive Deployments**: Lower memory = more concurrent executions per
|
|
192
|
+
node
|
|
193
|
+
|
|
194
|
+
### Framework Selection Guide
|
|
195
|
+
|
|
196
|
+
| Use Case | Recommended | Reasoning |
|
|
197
|
+
| --------------------- | ----------- | -------------------------------------- |
|
|
198
|
+
| Serverless/Lambda | LionAGI | Fastest cold start (153.6ms composite) |
|
|
199
|
+
| Memory-Limited | LionAGI | Lowest footprint (26.0MB) |
|
|
200
|
+
| State Machines | LangGraph | Purpose-built for graph workflows |
|
|
201
|
+
| Document RAG | LlamaIndex | Specialized document processing |
|
|
202
|
+
| Multi-Agent Chat | AutoGen | Conversation-focused patterns |
|
|
203
|
+
| Ecosystem Integration | LangChain | Extensive tool library |
|
|
204
|
+
|
|
205
|
+
## Summary
|
|
206
|
+
|
|
207
|
+
The benchmarks show LionAGI's performance characteristics in cold-start
|
|
208
|
+
scenarios:
|
|
209
|
+
|
|
210
|
+
- **2.2× faster** cold-start performance vs next-best across composites (121.9%
|
|
211
|
+
advantage)
|
|
212
|
+
- Up to **3.3× faster** on realistic data-processing workloads
|
|
213
|
+
- **54% lower memory usage** (26.0MB vs 56.4MB for LangGraph)
|
|
214
|
+
- **Consistent performance** with tight P95 bounds and low variance
|
|
215
|
+
- **Sub-180ms orchestrator initialization** at 170.1ms median
|
|
216
|
+
|
|
217
|
+
These characteristics are relevant for:
|
|
218
|
+
|
|
219
|
+
- Serverless and edge deployments where cold-start performance impacts costs
|
|
220
|
+
- Applications with memory constraints or high concurrency requirements
|
|
221
|
+
- Use cases requiring predictable performance characteristics
|
|
222
|
+
|
|
223
|
+
### Performance Evolution
|
|
224
|
+
|
|
225
|
+
**v0.18.1 Improvements** (Oct 2025 vs v0.17.7 Sept 2025):
|
|
226
|
+
|
|
227
|
+
- **47% faster** cold starts (238.8ms → 153.6ms composite)
|
|
228
|
+
- **37% lower memory** (41.2MB → 26.0MB RSS)
|
|
229
|
+
- **Doubled competitive advantage** (77.8% → 121.9% lead vs #2)
|
|
230
|
+
|
|
231
|
+
The v0.18.1 refactoring (removing ~10,000 LOC of unused code, simplifying type
|
|
232
|
+
system, consolidating architecture) delivered measurable performance gains while
|
|
233
|
+
improving code quality.
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
### Data Files
|
|
238
|
+
|
|
239
|
+
- **Summary**: `benchmark_summary_*.csv` - Statistical aggregates
|
|
240
|
+
- **Detailed**: `benchmark_detailed_*.csv` - Individual run data
|
|
241
|
+
- **Full Export**: `benchmark_results_*.json` - Complete metadata
|
|
242
|
+
- **Report**: `report.md` - Comprehensive analysis with full tables
|
|
243
|
+
|
|
244
|
+
_Last updated: October 15, 2025 • LionAGI v0.18.1 • Python 3.10.15_ _Benchmark
|
|
245
|
+
version: Apples-to-Apples Framework Benchmark v2.0_ _(composite excludes
|
|
246
|
+
imports; see Methodology)_
|