lionagi 0.8.7__tar.gz → 0.8.8__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.8.7 → lionagi-0.8.8}/PKG-INFO +6 -3
- {lionagi-0.8.7 → lionagi-0.8.8}/README.md +4 -1
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/generic/event.py +10 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/generic/processor.py +10 -2
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/endpoints/base.py +139 -26
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/endpoints/chat_completion.py +10 -4
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/endpoints/rate_limited_processor.py +17 -6
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/imodel.py +65 -11
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/session/branch.py +2 -0
- lionagi-0.8.8/lionagi/tools/file/__init__.py +0 -0
- {lionagi-0.8.7/lionagi/tools → lionagi-0.8.8/lionagi/tools/file}/reader.py +1 -1
- lionagi-0.8.8/lionagi/tools/types.py +3 -0
- lionagi-0.8.8/lionagi/version.py +1 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/pyproject.toml +3 -2
- {lionagi-0.8.7 → lionagi-0.8.8}/uv.lock +57 -76
- lionagi-0.8.7/lionagi/tools/types.py +0 -3
- lionagi-0.8.7/lionagi/version.py +0 -1
- {lionagi-0.8.7 → lionagi-0.8.8}/.env.example +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/.github/FUNDING.yml +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/.github/dependabot.yml +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/.github/workflows/ci.yml +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/.github/workflows/codeql.yml +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/.github/workflows/docs.yml +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/.github/workflows/release.yml +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/.gitignore +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/.pre-commit-config.yaml +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/CODE_OF_CONDUCT.md +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/CONTRIBUTING.md +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/LICENSE +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/cookbooks/ch01_get_started.md +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/cookbooks/ch02_concepts.md +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/dev_tools/count_code_base_lines.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/Makefile +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/_static/custom.css +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/_templates/layout.html +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/conf.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/index.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/action.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/adapter.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/branch.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/branch_operations.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/concepts.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/element_id.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/event.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/form.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/graph.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/index.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/instruct.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/lib_file.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/lib_nested.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/lib_package.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/lib_schema.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/lib_validate.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/log.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/mail.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/message.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/models.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/operative_step.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/pile.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/processor.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/progression.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/service.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/session.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/modules/utils.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/tutorials/get_started.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/tutorials/get_started_pt2.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/tutorials/get_started_pt3.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/docs/tutorials/index.rst +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/_class_registry.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/_errors.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/_types.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/file/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/file/chunk.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/file/file_ops.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/file/params.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/file/process.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/file/save.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/nested/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/nested/flatten.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/nested/nfilter.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/nested/nget.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/nested/ninsert.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/nested/nmerge.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/nested/npop.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/nested/nset.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/nested/unflatten.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/nested/utils.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/package/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/package/imports.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/package/management.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/package/params.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/package/system.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/parse.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/schema/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/schema/as_readable.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/schema/extract_code_block.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/schema/extract_docstring.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/schema/function_to_schema.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/schema/json_schema.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/token_transform/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/token_transform/llmlingua.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/token_transform/perplexity.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/token_transform/synthlang.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/validate/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/validate/common_field_validators.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/validate/fuzzy_match_keys.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/validate/fuzzy_validate_mapping.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/validate/string_similarity.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/libs/validate/validate_boolean.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/ReAct/ReAct.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/ReAct/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/ReAct/utils.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/_act/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/_act/act.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/brainstorm/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/brainstorm/brainstorm.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/brainstorm/prompt.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/chat/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/chat/chat.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/communicate/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/communicate/communicate.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/instruct/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/instruct/instruct.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/interpret/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/interpret/interpret.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/manager.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/operate/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/operate/operate.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/parse/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/parse/parse.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/plan/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/plan/plan.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/plan/prompt.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/select/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/select/select.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/select/utils.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/translate/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/translate/translate.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/types.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operations/utils.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/action/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/action/function_calling.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/action/manager.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/action/request_response_model.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/action/tool.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/action/utils.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/forms/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/forms/base.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/forms/flow.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/forms/form.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/forms/report.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/instruct/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/instruct/base.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/instruct/instruct.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/instruct/instruct_collection.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/instruct/node.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/instruct/prompts.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/instruct/reason.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/manager.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/models/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/models/field_model.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/models/model_params.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/models/note.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/models/operable_model.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/models/schema_model.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/operative.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/step.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/strategies/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/strategies/base.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/strategies/concurrent.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/strategies/concurrent_chunk.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/strategies/concurrent_sequential_chunk.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/strategies/params.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/strategies/sequential.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/strategies/sequential_chunk.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/strategies/sequential_concurrent_chunk.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/strategies/utils.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/operatives/types.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/_concepts.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/adapters/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/adapters/adapter.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/adapters/json_adapter.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/adapters/pandas_/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/adapters/pandas_/csv_adapter.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/adapters/pandas_/excel_adapter.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/adapters/pandas_/pd_dataframe_adapter.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/adapters/pandas_/pd_series_adapter.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/adapters/types.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/generic/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/generic/element.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/generic/log.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/generic/pile.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/generic/progression.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/graph/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/graph/edge.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/graph/graph.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/graph/node.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/mail/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/mail/exchange.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/mail/mail.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/mail/mailbox.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/mail/manager.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/mail/package.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/messages/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/messages/action_request.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/messages/action_response.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/messages/assistant_response.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/messages/base.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/messages/instruction.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/messages/manager.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/messages/message.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/messages/system.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/messages/templates/README.md +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/messages/templates/action_request.jinja2 +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/messages/templates/action_response.jinja2 +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/messages/templates/assistant_response.jinja2 +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/messages/templates/instruction_message.jinja2 +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/messages/templates/system_message.jinja2 +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/messages/templates/tool_schemas.jinja2 +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/protocols/types.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/endpoints/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/endpoints/match_endpoint.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/endpoints/token_calculator.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/manager.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/providers/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/providers/anthropic_/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/providers/anthropic_/messages.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/providers/exa_/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/providers/exa_/models.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/providers/exa_/search.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/providers/exa_/types.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/providers/groq_/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/providers/groq_/chat_completions.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/providers/openai_/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/providers/openai_/chat_completions.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/providers/openrouter_/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/providers/openrouter_/chat_completions.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/providers/perplexity_/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/providers/perplexity_/chat_completions.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/providers/perplexity_/models.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/providers/types.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/service/types.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/session/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/session/session.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/settings.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/tools/__init__.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/tools/base.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/lionagi/utils.py +0 -0
- {lionagi-0.8.7 → lionagi-0.8.8}/prompts/doc_style.md +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: lionagi
|
3
|
-
Version: 0.8.
|
3
|
+
Version: 0.8.8
|
4
4
|
Summary: An Intelligence Operating System.
|
5
5
|
Author-email: HaiyangLi <quantocean.li@gmail.com>
|
6
6
|
License: Apache License
|
@@ -222,11 +222,11 @@ Requires-Python: >=3.10
|
|
222
222
|
Requires-Dist: aiocache>=0.12.0
|
223
223
|
Requires-Dist: aiohttp>=3.11.0
|
224
224
|
Requires-Dist: jinja2>=3.1.0
|
225
|
-
Requires-Dist: litellm>=1.55.3
|
226
225
|
Requires-Dist: pandas>=2.0.0
|
227
226
|
Requires-Dist: pillow>=10.0.0
|
228
227
|
Requires-Dist: pydantic>=2.0.0
|
229
228
|
Requires-Dist: python-dotenv>=1.0.1
|
229
|
+
Requires-Dist: tiktoken>=0.8.0
|
230
230
|
Description-Content-Type: text/markdown
|
231
231
|
|
232
232
|

|
@@ -256,11 +256,14 @@ pip install lionagi
|
|
256
256
|
```
|
257
257
|
|
258
258
|
Dependencies:
|
259
|
-
•
|
259
|
+
• aiocahce
|
260
|
+
• aiohttp
|
260
261
|
• jinja2
|
261
262
|
• pandas
|
262
263
|
• pillow
|
264
|
+
• pydantic
|
263
265
|
• python-dotenv
|
266
|
+
• tiktoken
|
264
267
|
|
265
268
|
## Quick Start
|
266
269
|
```python
|
@@ -86,6 +86,7 @@ class Event(Element):
|
|
86
86
|
"""
|
87
87
|
|
88
88
|
execution: Execution = Field(default_factory=Execution)
|
89
|
+
streaming: bool = False
|
89
90
|
|
90
91
|
@field_serializer("execution")
|
91
92
|
def _serialize_execution(self, val: Execution) -> dict:
|
@@ -160,6 +161,15 @@ class Event(Element):
|
|
160
161
|
"""
|
161
162
|
raise NotImplementedError("Override in subclass.")
|
162
163
|
|
164
|
+
async def stream(self) -> None:
|
165
|
+
"""Performs the event action asynchronously, streaming results.
|
166
|
+
|
167
|
+
Raises:
|
168
|
+
NotImplementedError: This base method must be overridden by
|
169
|
+
subclasses.
|
170
|
+
"""
|
171
|
+
raise NotImplementedError("Override in subclass.")
|
172
|
+
|
163
173
|
@classmethod
|
164
174
|
def from_dict(cls, data: dict) -> "Event":
|
165
175
|
"""Not implemented. Events cannot be fully recreated once done.
|
@@ -31,6 +31,7 @@ class Processor(Observer):
|
|
31
31
|
self,
|
32
32
|
queue_capacity: int,
|
33
33
|
capacity_refresh_time: float,
|
34
|
+
concurrency_limit: int,
|
34
35
|
) -> None:
|
35
36
|
"""Initializes a Processor instance.
|
36
37
|
|
@@ -56,6 +57,10 @@ class Processor(Observer):
|
|
56
57
|
self._available_capacity = queue_capacity
|
57
58
|
self._execution_mode = False
|
58
59
|
self._stop_event = asyncio.Event()
|
60
|
+
if concurrency_limit:
|
61
|
+
self._concurrency_sem = asyncio.Semaphore(concurrency_limit)
|
62
|
+
else:
|
63
|
+
self._concurrency_sem = None
|
59
64
|
|
60
65
|
@property
|
61
66
|
def available_capacity(self) -> int:
|
@@ -144,8 +149,11 @@ class Processor(Observer):
|
|
144
149
|
next_event = await self.dequeue()
|
145
150
|
|
146
151
|
if await self.request_permission(**next_event.request):
|
147
|
-
|
148
|
-
|
152
|
+
|
153
|
+
if next_event.streaming:
|
154
|
+
task = asyncio.create_task(next_event.stream())
|
155
|
+
else:
|
156
|
+
task = asyncio.create_task(next_event.invoke())
|
149
157
|
tasks.add(task)
|
150
158
|
|
151
159
|
prev_event = next_event
|
@@ -3,13 +3,16 @@
|
|
3
3
|
# SPDX-License-Identifier: Apache-2.0
|
4
4
|
|
5
5
|
import asyncio
|
6
|
+
import json
|
6
7
|
import logging
|
7
8
|
from abc import ABC
|
9
|
+
from collections.abc import AsyncGenerator
|
8
10
|
from typing import Any, Literal
|
9
11
|
|
10
12
|
import aiohttp
|
11
13
|
from aiocache import cached
|
12
|
-
from pydantic import BaseModel, ConfigDict, Field
|
14
|
+
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
15
|
+
from typing_extensions import Self
|
13
16
|
|
14
17
|
from lionagi._errors import ExecutionError, RateLimitError
|
15
18
|
from lionagi.protocols.generic.event import Event, EventStatus
|
@@ -347,6 +350,12 @@ class APICalling(Event):
|
|
347
350
|
is_cached: bool = Field(default=False, exclude=True)
|
348
351
|
should_invoke_endpoint: bool = Field(default=True, exclude=True)
|
349
352
|
|
353
|
+
@model_validator(mode="after")
|
354
|
+
def _validate_streaming(self) -> Self:
|
355
|
+
if self.payload.get("stream") is True:
|
356
|
+
self.streaming = True
|
357
|
+
return self
|
358
|
+
|
350
359
|
@property
|
351
360
|
def required_tokens(self) -> int | None:
|
352
361
|
"""int | None: The number of tokens required for this request."""
|
@@ -442,10 +451,91 @@ class APICalling(Event):
|
|
442
451
|
"""
|
443
452
|
return await self._inner(**kwargs)
|
444
453
|
|
445
|
-
async def
|
454
|
+
async def _stream(
|
455
|
+
self,
|
456
|
+
verbose: bool = True,
|
457
|
+
output_file: str = None,
|
458
|
+
with_response_header: bool = False,
|
459
|
+
) -> AsyncGenerator:
|
460
|
+
async with aiohttp.ClientSession() as client:
|
461
|
+
async with client.request(
|
462
|
+
method=self.endpoint.method.upper(),
|
463
|
+
url=self.endpoint.full_url,
|
464
|
+
headers=self.headers,
|
465
|
+
json=self.payload,
|
466
|
+
) as response:
|
467
|
+
if response.status != 200:
|
468
|
+
try:
|
469
|
+
error_text = await response.json()
|
470
|
+
except Exception:
|
471
|
+
error_text = await response.text()
|
472
|
+
raise aiohttp.ClientResponseError(
|
473
|
+
request_info=response.request_info,
|
474
|
+
history=response.history,
|
475
|
+
status=response.status,
|
476
|
+
message=f"{error_text}",
|
477
|
+
headers=response.headers,
|
478
|
+
)
|
479
|
+
|
480
|
+
file_handle = None
|
481
|
+
|
482
|
+
if output_file:
|
483
|
+
try:
|
484
|
+
file_handle = open(output_file, "w")
|
485
|
+
except Exception as e:
|
486
|
+
raise ValueError(
|
487
|
+
f"Invalid to output the response "
|
488
|
+
f"to {output_file}. Error:{e}"
|
489
|
+
)
|
490
|
+
|
491
|
+
try:
|
492
|
+
async for chunk in response.content:
|
493
|
+
chunk_str = chunk.decode("utf-8")
|
494
|
+
chunk_list = chunk_str.split("data:")
|
495
|
+
for c in chunk_list:
|
496
|
+
c = c.strip()
|
497
|
+
if c and c != "[DONE]":
|
498
|
+
try:
|
499
|
+
if file_handle:
|
500
|
+
file_handle.write(c + "\n")
|
501
|
+
c_dict = json.loads(c)
|
502
|
+
if verbose:
|
503
|
+
if c_dict.get("choices"):
|
504
|
+
if content := c_dict["choices"][0][
|
505
|
+
"delta"
|
506
|
+
].get("content"):
|
507
|
+
print(
|
508
|
+
content, end="", flush=True
|
509
|
+
)
|
510
|
+
yield c_dict
|
511
|
+
except json.JSONDecodeError:
|
512
|
+
yield c
|
513
|
+
except asyncio.CancelledError as e:
|
514
|
+
raise e
|
515
|
+
|
516
|
+
if with_response_header:
|
517
|
+
yield response.headers
|
518
|
+
|
519
|
+
finally:
|
520
|
+
if file_handle:
|
521
|
+
file_handle.close()
|
522
|
+
|
523
|
+
async def stream(
|
524
|
+
self,
|
525
|
+
verbose: bool = True,
|
526
|
+
output_file: str = None,
|
527
|
+
with_response_header: bool = False,
|
528
|
+
**kwargs,
|
529
|
+
) -> AsyncGenerator:
|
446
530
|
"""Performs a streaming request, if supported by the endpoint.
|
447
531
|
|
448
532
|
Args:
|
533
|
+
verbose (bool):
|
534
|
+
If True, prints the response content to the console.
|
535
|
+
output_file (str):
|
536
|
+
If set, writes the response content to this file. (only applies to non-endpoint invoke)
|
537
|
+
with_response_header (bool):
|
538
|
+
If True, yields the response headers as well. (only applies to non-endpoint invoke)
|
449
539
|
**kwargs: Additional parameters for the streaming call.
|
450
540
|
|
451
541
|
Yields:
|
@@ -456,23 +546,39 @@ class APICalling(Event):
|
|
456
546
|
"""
|
457
547
|
start = asyncio.get_event_loop().time()
|
458
548
|
response = []
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
549
|
+
e1 = None
|
550
|
+
try:
|
551
|
+
if self.should_invoke_endpoint and self.endpoint.is_streamable:
|
552
|
+
async for i in self.endpoint._stream(
|
553
|
+
self.payload, self.headers, **kwargs
|
554
|
+
):
|
555
|
+
content = i.choices[0].delta.content
|
556
|
+
if verbose:
|
557
|
+
if content is not None:
|
558
|
+
print(content, end="", flush=True)
|
559
|
+
response.append(i)
|
560
|
+
yield i
|
561
|
+
else:
|
562
|
+
async for i in self._stream(
|
563
|
+
verbose=verbose,
|
564
|
+
output_file=output_file,
|
565
|
+
with_response_header=with_response_header,
|
566
|
+
):
|
567
|
+
response.append(i)
|
568
|
+
yield i
|
569
|
+
except Exception as e:
|
570
|
+
e1 = e
|
571
|
+
finally:
|
572
|
+
self.execution.duration = asyncio.get_event_loop().time() - start
|
573
|
+
if not response and e1:
|
574
|
+
self.execution.error = str(e1)
|
575
|
+
self.execution.status = EventStatus.FAILED
|
576
|
+
logging.error(
|
577
|
+
f"API call to {self.endpoint.full_url} failed: {e1}"
|
578
|
+
)
|
579
|
+
else:
|
580
|
+
self.execution.response = response
|
581
|
+
self.execution.status = EventStatus.COMPLETED
|
476
582
|
|
477
583
|
async def invoke(self) -> None:
|
478
584
|
"""Invokes the API call, updating the execution state with results.
|
@@ -483,9 +589,10 @@ class APICalling(Event):
|
|
483
589
|
"""
|
484
590
|
start = asyncio.get_event_loop().time()
|
485
591
|
kwargs = {"headers": self.headers, "json": self.payload}
|
592
|
+
response = None
|
593
|
+
e1 = None
|
486
594
|
|
487
595
|
try:
|
488
|
-
response = None
|
489
596
|
if self.should_invoke_endpoint and self.endpoint.is_invokeable:
|
490
597
|
response = await self.endpoint.invoke(
|
491
598
|
payload=self.payload,
|
@@ -498,14 +605,20 @@ class APICalling(Event):
|
|
498
605
|
else:
|
499
606
|
response = await self._inner(**kwargs)
|
500
607
|
|
501
|
-
self.execution.duration = asyncio.get_event_loop().time() - start
|
502
|
-
self.execution.response = response
|
503
|
-
self.execution.status = EventStatus.COMPLETED
|
504
608
|
except Exception as e:
|
609
|
+
e1 = e
|
610
|
+
|
611
|
+
finally:
|
505
612
|
self.execution.duration = asyncio.get_event_loop().time() - start
|
506
|
-
|
507
|
-
|
508
|
-
|
613
|
+
if not response and e1:
|
614
|
+
self.execution.error = str(e1)
|
615
|
+
self.execution.status = EventStatus.FAILED
|
616
|
+
logging.error(
|
617
|
+
f"API call to {self.endpoint.full_url} failed: {e1}"
|
618
|
+
)
|
619
|
+
else:
|
620
|
+
self.execution.response = response
|
621
|
+
self.execution.status = EventStatus.COMPLETED
|
509
622
|
|
510
623
|
def __str__(self) -> str:
|
511
624
|
return (
|
@@ -27,10 +27,13 @@ class ChatCompletionEndPoint(EndPoint):
|
|
27
27
|
headers: dict,
|
28
28
|
**kwargs,
|
29
29
|
):
|
30
|
-
import
|
30
|
+
from lionagi.libs.package.imports import check_import
|
31
|
+
|
32
|
+
check_import("litellm")
|
33
|
+
import litellm # type: ignore
|
31
34
|
|
32
35
|
litellm.drop_params = True
|
33
|
-
from litellm import acompletion
|
36
|
+
from litellm import acompletion # type: ignore
|
34
37
|
|
35
38
|
provider = self.config.provider
|
36
39
|
|
@@ -64,10 +67,13 @@ class ChatCompletionEndPoint(EndPoint):
|
|
64
67
|
headers: dict,
|
65
68
|
**kwargs,
|
66
69
|
) -> AsyncGenerator:
|
67
|
-
import
|
70
|
+
from lionagi.libs.package.imports import check_import
|
71
|
+
|
72
|
+
check_import("litellm")
|
73
|
+
import litellm # type: ignore
|
68
74
|
|
69
75
|
litellm.drop_params = True
|
70
|
-
from litellm import acompletion
|
76
|
+
from litellm import acompletion # type: ignore
|
71
77
|
|
72
78
|
provider = self.config.provider
|
73
79
|
|
@@ -28,8 +28,13 @@ class RateLimitedAPIProcessor(Processor):
|
|
28
28
|
interval: float | None = None,
|
29
29
|
limit_requests: int = None,
|
30
30
|
limit_tokens: int = None,
|
31
|
+
concurrency_limit: int | None = None,
|
31
32
|
):
|
32
|
-
super().__init__(
|
33
|
+
super().__init__(
|
34
|
+
queue_capacity=queue_capacity,
|
35
|
+
capacity_refresh_time=capacity_refresh_time,
|
36
|
+
concurrency_limit=concurrency_limit,
|
37
|
+
)
|
33
38
|
self.limit_tokens = limit_tokens
|
34
39
|
self.limit_requests = limit_requests
|
35
40
|
self.interval = interval or self.capacity_refresh_time
|
@@ -37,6 +42,9 @@ class RateLimitedAPIProcessor(Processor):
|
|
37
42
|
self.available_token = self.limit_tokens
|
38
43
|
self._rate_limit_replenisher_task: asyncio.Task | None = None
|
39
44
|
self._lock: asyncio.Lock = asyncio.Lock()
|
45
|
+
self._concurrency_sem = asyncio.Semaphore(
|
46
|
+
concurrency_limit or queue_capacity
|
47
|
+
)
|
40
48
|
|
41
49
|
async def start_replenishing(self):
|
42
50
|
"""Start replenishing rate limit capacities at regular intervals."""
|
@@ -74,6 +82,7 @@ class RateLimitedAPIProcessor(Processor):
|
|
74
82
|
interval: float | None = None,
|
75
83
|
limit_requests: int = None,
|
76
84
|
limit_tokens: int = None,
|
85
|
+
concurrency_limit: int | None = None,
|
77
86
|
) -> Self:
|
78
87
|
self = cls(
|
79
88
|
interval=interval,
|
@@ -81,6 +90,7 @@ class RateLimitedAPIProcessor(Processor):
|
|
81
90
|
capacity_refresh_time=capacity_refresh_time,
|
82
91
|
limit_requests=limit_requests,
|
83
92
|
limit_tokens=limit_tokens,
|
93
|
+
concurrency_limit=concurrency_limit,
|
84
94
|
)
|
85
95
|
self._rate_limit_replenisher_task = asyncio.create_task(
|
86
96
|
self.start_replenishing()
|
@@ -126,6 +136,7 @@ class RateLimitedAPIExecutor(Executor):
|
|
126
136
|
limit_requests: int = None,
|
127
137
|
limit_tokens: int = None,
|
128
138
|
strict_event_type: bool = False,
|
139
|
+
concurrency_limit: int | None = None,
|
129
140
|
):
|
130
141
|
config = {
|
131
142
|
"queue_capacity": queue_capacity,
|
@@ -133,13 +144,13 @@ class RateLimitedAPIExecutor(Executor):
|
|
133
144
|
"interval": interval,
|
134
145
|
"limit_requests": limit_requests,
|
135
146
|
"limit_tokens": limit_tokens,
|
147
|
+
"concurrency_limit": concurrency_limit,
|
136
148
|
}
|
137
|
-
|
149
|
+
super().__init__(
|
150
|
+
processor_config=config, strict_event_type=strict_event_type
|
151
|
+
)
|
138
152
|
self.config = config
|
139
153
|
self.interval = interval
|
140
154
|
self.limit_requests = limit_requests
|
141
155
|
self.limit_tokens = limit_tokens
|
142
|
-
|
143
|
-
super().__init__(
|
144
|
-
processor_config=config, strict_event_type=strict_event_type
|
145
|
-
)
|
156
|
+
self.concurrency_limit = concurrency_limit or queue_capacity
|
@@ -2,11 +2,16 @@
|
|
2
2
|
#
|
3
3
|
# SPDX-License-Identifier: Apache-2.0
|
4
4
|
|
5
|
+
import asyncio
|
5
6
|
import os
|
6
7
|
import warnings
|
8
|
+
from collections.abc import AsyncGenerator, Callable
|
7
9
|
|
8
10
|
from pydantic import BaseModel
|
9
11
|
|
12
|
+
from lionagi.protocols.generic.event import EventStatus
|
13
|
+
from lionagi.utils import is_coro_func
|
14
|
+
|
10
15
|
from .endpoints.base import APICalling, EndPoint
|
11
16
|
from .endpoints.match_endpoint import match_endpoint
|
12
17
|
from .endpoints.rate_limited_processor import RateLimitedAPIExecutor
|
@@ -54,7 +59,9 @@ class iModel:
|
|
54
59
|
interval: float | None = None,
|
55
60
|
limit_requests: int = None,
|
56
61
|
limit_tokens: int = None,
|
57
|
-
invoke_with_endpoint: bool =
|
62
|
+
invoke_with_endpoint: bool = False,
|
63
|
+
concurrency_limit: int | None = None,
|
64
|
+
streaming_process_func: Callable = None,
|
58
65
|
**kwargs,
|
59
66
|
) -> None:
|
60
67
|
"""Initializes the iModel instance.
|
@@ -88,6 +95,9 @@ class iModel:
|
|
88
95
|
invoke_with_endpoint (bool, optional):
|
89
96
|
If True, the endpoint is actually invoked. If False,
|
90
97
|
calls might be mocked or cached.
|
98
|
+
concurrency_limit (int | None, optional):
|
99
|
+
Maximum number of streaming concurrent requests allowed.
|
100
|
+
only applies to streaming requests.
|
91
101
|
**kwargs:
|
92
102
|
Additional keyword arguments, such as `model`, or any other
|
93
103
|
provider-specific fields.
|
@@ -144,7 +154,14 @@ class iModel:
|
|
144
154
|
interval=interval,
|
145
155
|
limit_requests=limit_requests,
|
146
156
|
limit_tokens=limit_tokens,
|
157
|
+
concurrency_limit=concurrency_limit,
|
147
158
|
)
|
159
|
+
if not streaming_process_func and hasattr(
|
160
|
+
self.endpoint, "process_chunk"
|
161
|
+
):
|
162
|
+
self.streaming_process_func = self.endpoint.process_chunk
|
163
|
+
else:
|
164
|
+
self.streaming_process_func = streaming_process_func
|
148
165
|
|
149
166
|
def create_api_calling(self, **kwargs) -> APICalling:
|
150
167
|
"""Constructs an `APICalling` object from endpoint-specific payload.
|
@@ -179,9 +196,12 @@ class iModel:
|
|
179
196
|
chunk:
|
180
197
|
A portion of the streamed data returned by the API.
|
181
198
|
"""
|
182
|
-
|
199
|
+
if self.streaming_process_func and not isinstance(chunk, APICalling):
|
200
|
+
if is_coro_func(self.streaming_process_func):
|
201
|
+
return await self.streaming_process_func(chunk)
|
202
|
+
return self.streaming_process_func(chunk)
|
183
203
|
|
184
|
-
async def stream(self, **kwargs) ->
|
204
|
+
async def stream(self, api_call=None, **kwargs) -> AsyncGenerator:
|
185
205
|
"""Performs a streaming API call with the given arguments.
|
186
206
|
|
187
207
|
Args:
|
@@ -193,14 +213,38 @@ class iModel:
|
|
193
213
|
An APICalling instance upon success, or None if something
|
194
214
|
goes wrong.
|
195
215
|
"""
|
196
|
-
|
216
|
+
if api_call is None:
|
197
217
|
kwargs["stream"] = True
|
198
218
|
api_call = self.create_api_calling(**kwargs)
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
219
|
+
await self.executor.append(api_call)
|
220
|
+
|
221
|
+
if (
|
222
|
+
self.executor.processor is None
|
223
|
+
or self.executor.processor.is_stopped()
|
224
|
+
):
|
225
|
+
await self.executor.start()
|
226
|
+
|
227
|
+
if self.executor.processor._concurrency_sem:
|
228
|
+
async with self.executor.processor._concurrency_sem:
|
229
|
+
try:
|
230
|
+
async for i in api_call.stream():
|
231
|
+
result = await self.process_chunk(i)
|
232
|
+
if result:
|
233
|
+
yield result
|
234
|
+
except Exception as e:
|
235
|
+
raise ValueError(f"Failed to stream API call: {e}")
|
236
|
+
finally:
|
237
|
+
yield self.executor.pile.pop(api_call.id)
|
238
|
+
else:
|
239
|
+
try:
|
240
|
+
async for i in api_call.stream():
|
241
|
+
result = await self.process_chunk(i)
|
242
|
+
if result:
|
243
|
+
yield result
|
244
|
+
except Exception as e:
|
245
|
+
raise ValueError(f"Failed to stream API call: {e}")
|
246
|
+
finally:
|
247
|
+
yield self.executor.pile.pop(api_call.id)
|
204
248
|
|
205
249
|
async def invoke(
|
206
250
|
self, api_call: APICalling = None, **kwargs
|
@@ -232,10 +276,20 @@ class iModel:
|
|
232
276
|
|
233
277
|
await self.executor.append(api_call)
|
234
278
|
await self.executor.forward()
|
235
|
-
|
236
|
-
|
279
|
+
ctr = 0
|
280
|
+
while api_call.status not in (
|
281
|
+
EventStatus.COMPLETED,
|
282
|
+
EventStatus.FAILED,
|
283
|
+
):
|
284
|
+
if ctr > 100:
|
285
|
+
break
|
286
|
+
await self.executor.forward()
|
287
|
+
ctr += 1
|
288
|
+
await asyncio.sleep(0.1)
|
237
289
|
except Exception as e:
|
238
290
|
raise ValueError(f"Failed to invoke API call: {e}")
|
291
|
+
finally:
|
292
|
+
return self.executor.pile.pop(api_call.id)
|
239
293
|
|
240
294
|
@property
|
241
295
|
def allowed_roles(self) -> set[str]:
|
@@ -577,6 +577,7 @@ class Branch(Element, Communicatable, Relational):
|
|
577
577
|
request_options: type[BaseModel] = None,
|
578
578
|
description: str = None,
|
579
579
|
update: bool = False,
|
580
|
+
**kwargs,
|
580
581
|
):
|
581
582
|
if not imodel:
|
582
583
|
imodel = iModel(
|
@@ -591,6 +592,7 @@ class Branch(Element, Communicatable, Relational):
|
|
591
592
|
limit_requests=limit_requests,
|
592
593
|
limit_tokens=limit_tokens,
|
593
594
|
invoke_with_endpoint=invoke_with_endpoint,
|
595
|
+
**kwargs,
|
594
596
|
)
|
595
597
|
|
596
598
|
if not update and name in self.tools:
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.8.8"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "lionagi"
|
3
|
-
version = "0.8.
|
3
|
+
version = "0.8.8"
|
4
4
|
description = "An Intelligence Operating System."
|
5
5
|
authors = [
|
6
6
|
{ name = "HaiyangLi", email = "quantocean.li@gmail.com" },
|
@@ -11,11 +11,11 @@ dependencies = [
|
|
11
11
|
"aiocache>=0.12.0",
|
12
12
|
"aiohttp>=3.11.0",
|
13
13
|
"jinja2>=3.1.0",
|
14
|
-
"litellm>=1.55.3",
|
15
14
|
"pandas>=2.0.0",
|
16
15
|
"pillow>=10.0.0",
|
17
16
|
"pydantic>=2.0.0",
|
18
17
|
"python-dotenv>=1.0.1",
|
18
|
+
"tiktoken>=0.8.0",
|
19
19
|
]
|
20
20
|
license = {file = "LICENSE"}
|
21
21
|
classifiers=[
|
@@ -49,6 +49,7 @@ dev = [
|
|
49
49
|
]
|
50
50
|
tools = [
|
51
51
|
"docling>=2.15.1",
|
52
|
+
"litellm>=1.59.5",
|
52
53
|
]
|
53
54
|
|
54
55
|
[tool.black]
|