PraisonAI 3.0.0__py3-none-any.whl
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.
- praisonai/__init__.py +54 -0
- praisonai/__main__.py +15 -0
- praisonai/acp/__init__.py +54 -0
- praisonai/acp/config.py +159 -0
- praisonai/acp/server.py +587 -0
- praisonai/acp/session.py +219 -0
- praisonai/adapters/__init__.py +50 -0
- praisonai/adapters/readers.py +395 -0
- praisonai/adapters/rerankers.py +315 -0
- praisonai/adapters/retrievers.py +394 -0
- praisonai/adapters/vector_stores.py +409 -0
- praisonai/agent_scheduler.py +337 -0
- praisonai/agents_generator.py +903 -0
- praisonai/api/call.py +292 -0
- praisonai/auto.py +1197 -0
- praisonai/capabilities/__init__.py +275 -0
- praisonai/capabilities/a2a.py +140 -0
- praisonai/capabilities/assistants.py +283 -0
- praisonai/capabilities/audio.py +320 -0
- praisonai/capabilities/batches.py +469 -0
- praisonai/capabilities/completions.py +336 -0
- praisonai/capabilities/container_files.py +155 -0
- praisonai/capabilities/containers.py +93 -0
- praisonai/capabilities/embeddings.py +158 -0
- praisonai/capabilities/files.py +467 -0
- praisonai/capabilities/fine_tuning.py +293 -0
- praisonai/capabilities/guardrails.py +182 -0
- praisonai/capabilities/images.py +330 -0
- praisonai/capabilities/mcp.py +190 -0
- praisonai/capabilities/messages.py +270 -0
- praisonai/capabilities/moderations.py +154 -0
- praisonai/capabilities/ocr.py +217 -0
- praisonai/capabilities/passthrough.py +204 -0
- praisonai/capabilities/rag.py +207 -0
- praisonai/capabilities/realtime.py +160 -0
- praisonai/capabilities/rerank.py +165 -0
- praisonai/capabilities/responses.py +266 -0
- praisonai/capabilities/search.py +109 -0
- praisonai/capabilities/skills.py +133 -0
- praisonai/capabilities/vector_store_files.py +334 -0
- praisonai/capabilities/vector_stores.py +304 -0
- praisonai/capabilities/videos.py +141 -0
- praisonai/chainlit_ui.py +304 -0
- praisonai/chat/__init__.py +106 -0
- praisonai/chat/app.py +125 -0
- praisonai/cli/__init__.py +26 -0
- praisonai/cli/app.py +213 -0
- praisonai/cli/commands/__init__.py +75 -0
- praisonai/cli/commands/acp.py +70 -0
- praisonai/cli/commands/completion.py +333 -0
- praisonai/cli/commands/config.py +166 -0
- praisonai/cli/commands/debug.py +142 -0
- praisonai/cli/commands/diag.py +55 -0
- praisonai/cli/commands/doctor.py +166 -0
- praisonai/cli/commands/environment.py +179 -0
- praisonai/cli/commands/lsp.py +112 -0
- praisonai/cli/commands/mcp.py +210 -0
- praisonai/cli/commands/profile.py +457 -0
- praisonai/cli/commands/run.py +228 -0
- praisonai/cli/commands/schedule.py +150 -0
- praisonai/cli/commands/serve.py +97 -0
- praisonai/cli/commands/session.py +212 -0
- praisonai/cli/commands/traces.py +145 -0
- praisonai/cli/commands/version.py +101 -0
- praisonai/cli/configuration/__init__.py +18 -0
- praisonai/cli/configuration/loader.py +353 -0
- praisonai/cli/configuration/paths.py +114 -0
- praisonai/cli/configuration/schema.py +164 -0
- praisonai/cli/features/__init__.py +268 -0
- praisonai/cli/features/acp.py +236 -0
- praisonai/cli/features/action_orchestrator.py +546 -0
- praisonai/cli/features/agent_scheduler.py +773 -0
- praisonai/cli/features/agent_tools.py +474 -0
- praisonai/cli/features/agents.py +375 -0
- praisonai/cli/features/at_mentions.py +471 -0
- praisonai/cli/features/auto_memory.py +182 -0
- praisonai/cli/features/autonomy_mode.py +490 -0
- praisonai/cli/features/background.py +356 -0
- praisonai/cli/features/base.py +168 -0
- praisonai/cli/features/capabilities.py +1326 -0
- praisonai/cli/features/checkpoints.py +338 -0
- praisonai/cli/features/code_intelligence.py +652 -0
- praisonai/cli/features/compaction.py +294 -0
- praisonai/cli/features/compare.py +534 -0
- praisonai/cli/features/cost_tracker.py +514 -0
- praisonai/cli/features/debug.py +810 -0
- praisonai/cli/features/deploy.py +517 -0
- praisonai/cli/features/diag.py +289 -0
- praisonai/cli/features/doctor/__init__.py +63 -0
- praisonai/cli/features/doctor/checks/__init__.py +24 -0
- praisonai/cli/features/doctor/checks/acp_checks.py +240 -0
- praisonai/cli/features/doctor/checks/config_checks.py +366 -0
- praisonai/cli/features/doctor/checks/db_checks.py +366 -0
- praisonai/cli/features/doctor/checks/env_checks.py +543 -0
- praisonai/cli/features/doctor/checks/lsp_checks.py +199 -0
- praisonai/cli/features/doctor/checks/mcp_checks.py +349 -0
- praisonai/cli/features/doctor/checks/memory_checks.py +268 -0
- praisonai/cli/features/doctor/checks/network_checks.py +251 -0
- praisonai/cli/features/doctor/checks/obs_checks.py +328 -0
- praisonai/cli/features/doctor/checks/performance_checks.py +235 -0
- praisonai/cli/features/doctor/checks/permissions_checks.py +259 -0
- praisonai/cli/features/doctor/checks/selftest_checks.py +322 -0
- praisonai/cli/features/doctor/checks/serve_checks.py +426 -0
- praisonai/cli/features/doctor/checks/skills_checks.py +231 -0
- praisonai/cli/features/doctor/checks/tools_checks.py +371 -0
- praisonai/cli/features/doctor/engine.py +266 -0
- praisonai/cli/features/doctor/formatters.py +310 -0
- praisonai/cli/features/doctor/handler.py +397 -0
- praisonai/cli/features/doctor/models.py +264 -0
- praisonai/cli/features/doctor/registry.py +239 -0
- praisonai/cli/features/endpoints.py +1019 -0
- praisonai/cli/features/eval.py +560 -0
- praisonai/cli/features/external_agents.py +231 -0
- praisonai/cli/features/fast_context.py +410 -0
- praisonai/cli/features/flow_display.py +566 -0
- praisonai/cli/features/git_integration.py +651 -0
- praisonai/cli/features/guardrail.py +171 -0
- praisonai/cli/features/handoff.py +185 -0
- praisonai/cli/features/hooks.py +583 -0
- praisonai/cli/features/image.py +384 -0
- praisonai/cli/features/interactive_runtime.py +585 -0
- praisonai/cli/features/interactive_tools.py +380 -0
- praisonai/cli/features/interactive_tui.py +603 -0
- praisonai/cli/features/jobs.py +632 -0
- praisonai/cli/features/knowledge.py +531 -0
- praisonai/cli/features/lite.py +244 -0
- praisonai/cli/features/lsp_cli.py +225 -0
- praisonai/cli/features/mcp.py +169 -0
- praisonai/cli/features/message_queue.py +587 -0
- praisonai/cli/features/metrics.py +211 -0
- praisonai/cli/features/n8n.py +673 -0
- praisonai/cli/features/observability.py +293 -0
- praisonai/cli/features/ollama.py +361 -0
- praisonai/cli/features/output_style.py +273 -0
- praisonai/cli/features/package.py +631 -0
- praisonai/cli/features/performance.py +308 -0
- praisonai/cli/features/persistence.py +636 -0
- praisonai/cli/features/profile.py +226 -0
- praisonai/cli/features/profiler/__init__.py +81 -0
- praisonai/cli/features/profiler/core.py +558 -0
- praisonai/cli/features/profiler/optimizations.py +652 -0
- praisonai/cli/features/profiler/suite.py +386 -0
- praisonai/cli/features/profiling.py +350 -0
- praisonai/cli/features/queue/__init__.py +73 -0
- praisonai/cli/features/queue/manager.py +395 -0
- praisonai/cli/features/queue/models.py +286 -0
- praisonai/cli/features/queue/persistence.py +564 -0
- praisonai/cli/features/queue/scheduler.py +484 -0
- praisonai/cli/features/queue/worker.py +372 -0
- praisonai/cli/features/recipe.py +1723 -0
- praisonai/cli/features/recipes.py +449 -0
- praisonai/cli/features/registry.py +229 -0
- praisonai/cli/features/repo_map.py +860 -0
- praisonai/cli/features/router.py +466 -0
- praisonai/cli/features/sandbox_executor.py +515 -0
- praisonai/cli/features/serve.py +829 -0
- praisonai/cli/features/session.py +222 -0
- praisonai/cli/features/skills.py +856 -0
- praisonai/cli/features/slash_commands.py +650 -0
- praisonai/cli/features/telemetry.py +179 -0
- praisonai/cli/features/templates.py +1384 -0
- praisonai/cli/features/thinking.py +305 -0
- praisonai/cli/features/todo.py +334 -0
- praisonai/cli/features/tools.py +680 -0
- praisonai/cli/features/tui/__init__.py +83 -0
- praisonai/cli/features/tui/app.py +580 -0
- praisonai/cli/features/tui/cli.py +566 -0
- praisonai/cli/features/tui/debug.py +511 -0
- praisonai/cli/features/tui/events.py +99 -0
- praisonai/cli/features/tui/mock_provider.py +328 -0
- praisonai/cli/features/tui/orchestrator.py +652 -0
- praisonai/cli/features/tui/screens/__init__.py +50 -0
- praisonai/cli/features/tui/screens/main.py +245 -0
- praisonai/cli/features/tui/screens/queue.py +174 -0
- praisonai/cli/features/tui/screens/session.py +124 -0
- praisonai/cli/features/tui/screens/settings.py +148 -0
- praisonai/cli/features/tui/widgets/__init__.py +56 -0
- praisonai/cli/features/tui/widgets/chat.py +261 -0
- praisonai/cli/features/tui/widgets/composer.py +224 -0
- praisonai/cli/features/tui/widgets/queue_panel.py +200 -0
- praisonai/cli/features/tui/widgets/status.py +167 -0
- praisonai/cli/features/tui/widgets/tool_panel.py +248 -0
- praisonai/cli/features/workflow.py +720 -0
- praisonai/cli/legacy.py +236 -0
- praisonai/cli/main.py +5559 -0
- praisonai/cli/schedule_cli.py +54 -0
- praisonai/cli/state/__init__.py +31 -0
- praisonai/cli/state/identifiers.py +161 -0
- praisonai/cli/state/sessions.py +313 -0
- praisonai/code/__init__.py +93 -0
- praisonai/code/agent_tools.py +344 -0
- praisonai/code/diff/__init__.py +21 -0
- praisonai/code/diff/diff_strategy.py +432 -0
- praisonai/code/tools/__init__.py +27 -0
- praisonai/code/tools/apply_diff.py +221 -0
- praisonai/code/tools/execute_command.py +275 -0
- praisonai/code/tools/list_files.py +274 -0
- praisonai/code/tools/read_file.py +206 -0
- praisonai/code/tools/search_replace.py +248 -0
- praisonai/code/tools/write_file.py +217 -0
- praisonai/code/utils/__init__.py +46 -0
- praisonai/code/utils/file_utils.py +307 -0
- praisonai/code/utils/ignore_utils.py +308 -0
- praisonai/code/utils/text_utils.py +276 -0
- praisonai/db/__init__.py +64 -0
- praisonai/db/adapter.py +531 -0
- praisonai/deploy/__init__.py +62 -0
- praisonai/deploy/api.py +231 -0
- praisonai/deploy/docker.py +454 -0
- praisonai/deploy/doctor.py +367 -0
- praisonai/deploy/main.py +327 -0
- praisonai/deploy/models.py +179 -0
- praisonai/deploy/providers/__init__.py +33 -0
- praisonai/deploy/providers/aws.py +331 -0
- praisonai/deploy/providers/azure.py +358 -0
- praisonai/deploy/providers/base.py +101 -0
- praisonai/deploy/providers/gcp.py +314 -0
- praisonai/deploy/schema.py +208 -0
- praisonai/deploy.py +185 -0
- praisonai/endpoints/__init__.py +53 -0
- praisonai/endpoints/a2u_server.py +410 -0
- praisonai/endpoints/discovery.py +165 -0
- praisonai/endpoints/providers/__init__.py +28 -0
- praisonai/endpoints/providers/a2a.py +253 -0
- praisonai/endpoints/providers/a2u.py +208 -0
- praisonai/endpoints/providers/agents_api.py +171 -0
- praisonai/endpoints/providers/base.py +231 -0
- praisonai/endpoints/providers/mcp.py +263 -0
- praisonai/endpoints/providers/recipe.py +206 -0
- praisonai/endpoints/providers/tools_mcp.py +150 -0
- praisonai/endpoints/registry.py +131 -0
- praisonai/endpoints/server.py +161 -0
- praisonai/inbuilt_tools/__init__.py +24 -0
- praisonai/inbuilt_tools/autogen_tools.py +117 -0
- praisonai/inc/__init__.py +2 -0
- praisonai/inc/config.py +96 -0
- praisonai/inc/models.py +155 -0
- praisonai/integrations/__init__.py +56 -0
- praisonai/integrations/base.py +303 -0
- praisonai/integrations/claude_code.py +270 -0
- praisonai/integrations/codex_cli.py +255 -0
- praisonai/integrations/cursor_cli.py +195 -0
- praisonai/integrations/gemini_cli.py +222 -0
- praisonai/jobs/__init__.py +67 -0
- praisonai/jobs/executor.py +425 -0
- praisonai/jobs/models.py +230 -0
- praisonai/jobs/router.py +314 -0
- praisonai/jobs/server.py +186 -0
- praisonai/jobs/store.py +203 -0
- praisonai/llm/__init__.py +66 -0
- praisonai/llm/registry.py +382 -0
- praisonai/mcp_server/__init__.py +152 -0
- praisonai/mcp_server/adapters/__init__.py +74 -0
- praisonai/mcp_server/adapters/agents.py +128 -0
- praisonai/mcp_server/adapters/capabilities.py +168 -0
- praisonai/mcp_server/adapters/cli_tools.py +568 -0
- praisonai/mcp_server/adapters/extended_capabilities.py +462 -0
- praisonai/mcp_server/adapters/knowledge.py +93 -0
- praisonai/mcp_server/adapters/memory.py +104 -0
- praisonai/mcp_server/adapters/prompts.py +306 -0
- praisonai/mcp_server/adapters/resources.py +124 -0
- praisonai/mcp_server/adapters/tools_bridge.py +280 -0
- praisonai/mcp_server/auth/__init__.py +48 -0
- praisonai/mcp_server/auth/api_key.py +291 -0
- praisonai/mcp_server/auth/oauth.py +460 -0
- praisonai/mcp_server/auth/oidc.py +289 -0
- praisonai/mcp_server/auth/scopes.py +260 -0
- praisonai/mcp_server/cli.py +852 -0
- praisonai/mcp_server/elicitation.py +445 -0
- praisonai/mcp_server/icons.py +302 -0
- praisonai/mcp_server/recipe_adapter.py +573 -0
- praisonai/mcp_server/recipe_cli.py +824 -0
- praisonai/mcp_server/registry.py +703 -0
- praisonai/mcp_server/sampling.py +422 -0
- praisonai/mcp_server/server.py +490 -0
- praisonai/mcp_server/tasks.py +443 -0
- praisonai/mcp_server/transports/__init__.py +18 -0
- praisonai/mcp_server/transports/http_stream.py +376 -0
- praisonai/mcp_server/transports/stdio.py +132 -0
- praisonai/persistence/__init__.py +84 -0
- praisonai/persistence/config.py +238 -0
- praisonai/persistence/conversation/__init__.py +25 -0
- praisonai/persistence/conversation/async_mysql.py +427 -0
- praisonai/persistence/conversation/async_postgres.py +410 -0
- praisonai/persistence/conversation/async_sqlite.py +371 -0
- praisonai/persistence/conversation/base.py +151 -0
- praisonai/persistence/conversation/json_store.py +250 -0
- praisonai/persistence/conversation/mysql.py +387 -0
- praisonai/persistence/conversation/postgres.py +401 -0
- praisonai/persistence/conversation/singlestore.py +240 -0
- praisonai/persistence/conversation/sqlite.py +341 -0
- praisonai/persistence/conversation/supabase.py +203 -0
- praisonai/persistence/conversation/surrealdb.py +287 -0
- praisonai/persistence/factory.py +301 -0
- praisonai/persistence/hooks/__init__.py +18 -0
- praisonai/persistence/hooks/agent_hooks.py +297 -0
- praisonai/persistence/knowledge/__init__.py +26 -0
- praisonai/persistence/knowledge/base.py +144 -0
- praisonai/persistence/knowledge/cassandra.py +232 -0
- praisonai/persistence/knowledge/chroma.py +295 -0
- praisonai/persistence/knowledge/clickhouse.py +242 -0
- praisonai/persistence/knowledge/cosmosdb_vector.py +438 -0
- praisonai/persistence/knowledge/couchbase.py +286 -0
- praisonai/persistence/knowledge/lancedb.py +216 -0
- praisonai/persistence/knowledge/langchain_adapter.py +291 -0
- praisonai/persistence/knowledge/lightrag_adapter.py +212 -0
- praisonai/persistence/knowledge/llamaindex_adapter.py +256 -0
- praisonai/persistence/knowledge/milvus.py +277 -0
- praisonai/persistence/knowledge/mongodb_vector.py +306 -0
- praisonai/persistence/knowledge/pgvector.py +335 -0
- praisonai/persistence/knowledge/pinecone.py +253 -0
- praisonai/persistence/knowledge/qdrant.py +301 -0
- praisonai/persistence/knowledge/redis_vector.py +291 -0
- praisonai/persistence/knowledge/singlestore_vector.py +299 -0
- praisonai/persistence/knowledge/surrealdb_vector.py +309 -0
- praisonai/persistence/knowledge/upstash_vector.py +266 -0
- praisonai/persistence/knowledge/weaviate.py +223 -0
- praisonai/persistence/migrations/__init__.py +10 -0
- praisonai/persistence/migrations/manager.py +251 -0
- praisonai/persistence/orchestrator.py +406 -0
- praisonai/persistence/state/__init__.py +21 -0
- praisonai/persistence/state/async_mongodb.py +200 -0
- praisonai/persistence/state/base.py +107 -0
- praisonai/persistence/state/dynamodb.py +226 -0
- praisonai/persistence/state/firestore.py +175 -0
- praisonai/persistence/state/gcs.py +155 -0
- praisonai/persistence/state/memory.py +245 -0
- praisonai/persistence/state/mongodb.py +158 -0
- praisonai/persistence/state/redis.py +190 -0
- praisonai/persistence/state/upstash.py +144 -0
- praisonai/persistence/tests/__init__.py +3 -0
- praisonai/persistence/tests/test_all_backends.py +633 -0
- praisonai/profiler.py +1214 -0
- praisonai/recipe/__init__.py +134 -0
- praisonai/recipe/bridge.py +278 -0
- praisonai/recipe/core.py +893 -0
- praisonai/recipe/exceptions.py +54 -0
- praisonai/recipe/history.py +402 -0
- praisonai/recipe/models.py +266 -0
- praisonai/recipe/operations.py +440 -0
- praisonai/recipe/policy.py +422 -0
- praisonai/recipe/registry.py +849 -0
- praisonai/recipe/runtime.py +214 -0
- praisonai/recipe/security.py +711 -0
- praisonai/recipe/serve.py +859 -0
- praisonai/recipe/server.py +613 -0
- praisonai/scheduler/__init__.py +45 -0
- praisonai/scheduler/agent_scheduler.py +552 -0
- praisonai/scheduler/base.py +124 -0
- praisonai/scheduler/daemon_manager.py +225 -0
- praisonai/scheduler/state_manager.py +155 -0
- praisonai/scheduler/yaml_loader.py +193 -0
- praisonai/scheduler.py +194 -0
- praisonai/setup/__init__.py +1 -0
- praisonai/setup/build.py +21 -0
- praisonai/setup/post_install.py +23 -0
- praisonai/setup/setup_conda_env.py +25 -0
- praisonai/setup.py +16 -0
- praisonai/templates/__init__.py +116 -0
- praisonai/templates/cache.py +364 -0
- praisonai/templates/dependency_checker.py +358 -0
- praisonai/templates/discovery.py +391 -0
- praisonai/templates/loader.py +564 -0
- praisonai/templates/registry.py +511 -0
- praisonai/templates/resolver.py +206 -0
- praisonai/templates/security.py +327 -0
- praisonai/templates/tool_override.py +498 -0
- praisonai/templates/tools_doctor.py +256 -0
- praisonai/test.py +105 -0
- praisonai/train.py +562 -0
- praisonai/train_vision.py +306 -0
- praisonai/ui/agents.py +824 -0
- praisonai/ui/callbacks.py +57 -0
- praisonai/ui/chainlit_compat.py +246 -0
- praisonai/ui/chat.py +532 -0
- praisonai/ui/code.py +717 -0
- praisonai/ui/colab.py +474 -0
- praisonai/ui/colab_chainlit.py +81 -0
- praisonai/ui/components/aicoder.py +284 -0
- praisonai/ui/context.py +283 -0
- praisonai/ui/database_config.py +56 -0
- praisonai/ui/db.py +294 -0
- praisonai/ui/realtime.py +488 -0
- praisonai/ui/realtimeclient/__init__.py +756 -0
- praisonai/ui/realtimeclient/tools.py +242 -0
- praisonai/ui/sql_alchemy.py +710 -0
- praisonai/upload_vision.py +140 -0
- praisonai/version.py +1 -0
- praisonai-3.0.0.dist-info/METADATA +3493 -0
- praisonai-3.0.0.dist-info/RECORD +393 -0
- praisonai-3.0.0.dist-info/WHEEL +5 -0
- praisonai-3.0.0.dist-info/entry_points.txt +4 -0
- praisonai-3.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Dict, Any, Callable, Optional, Union
|
|
3
|
+
import asyncio
|
|
4
|
+
|
|
5
|
+
logger = logging.getLogger(__name__)
|
|
6
|
+
|
|
7
|
+
class CallbackManager:
|
|
8
|
+
"""Manages callbacks for the PraisonAI UI"""
|
|
9
|
+
|
|
10
|
+
def __init__(self):
|
|
11
|
+
self._callbacks: Dict[str, Dict[str, Union[Callable, bool]]] = {}
|
|
12
|
+
|
|
13
|
+
def register(self, name: str, callback: Callable, is_async: bool = False) -> None:
|
|
14
|
+
"""Register a callback function"""
|
|
15
|
+
self._callbacks[name] = {
|
|
16
|
+
'func': callback,
|
|
17
|
+
'is_async': is_async
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async def call(self, name: str, **kwargs) -> None:
|
|
21
|
+
"""Call a registered callback"""
|
|
22
|
+
if name not in self._callbacks:
|
|
23
|
+
logger.warning(f"No callback registered for {name}")
|
|
24
|
+
return
|
|
25
|
+
|
|
26
|
+
callback_info = self._callbacks[name]
|
|
27
|
+
func = callback_info['func']
|
|
28
|
+
is_async = callback_info['is_async']
|
|
29
|
+
|
|
30
|
+
try:
|
|
31
|
+
if is_async:
|
|
32
|
+
await func(**kwargs)
|
|
33
|
+
else:
|
|
34
|
+
if asyncio.iscoroutinefunction(func):
|
|
35
|
+
await func(**kwargs)
|
|
36
|
+
else:
|
|
37
|
+
await asyncio.get_event_loop().run_in_executor(None, lambda: func(**kwargs))
|
|
38
|
+
except Exception as e:
|
|
39
|
+
logger.error(f"Error in callback {name}: {str(e)}")
|
|
40
|
+
|
|
41
|
+
# Global callback manager instance
|
|
42
|
+
callback_manager = CallbackManager()
|
|
43
|
+
|
|
44
|
+
def register_callback(name: str, callback: Callable, is_async: bool = False) -> None:
|
|
45
|
+
"""Register a callback with the global callback manager"""
|
|
46
|
+
callback_manager.register(name, callback, is_async)
|
|
47
|
+
|
|
48
|
+
async def trigger_callback(name: str, **kwargs) -> None:
|
|
49
|
+
"""Trigger a callback from the global callback manager"""
|
|
50
|
+
await callback_manager.call(name, **kwargs)
|
|
51
|
+
|
|
52
|
+
# Decorator for registering callbacks
|
|
53
|
+
def callback(name: str, is_async: bool = False):
|
|
54
|
+
def decorator(func):
|
|
55
|
+
register_callback(name, func, is_async)
|
|
56
|
+
return func
|
|
57
|
+
return decorator
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Chainlit compatibility shim for PraisonAI.
|
|
3
|
+
|
|
4
|
+
This module provides forward/backward compatible imports for Chainlit internals
|
|
5
|
+
that may change between versions. It handles:
|
|
6
|
+
- EXPIRY_TIME / storage_expiry_time constant (renamed/removed in various versions)
|
|
7
|
+
- BaseStorageClient class location (moved from storage_clients.base to data.base)
|
|
8
|
+
- BaseDataLayer abstract methods (close() added in 2.9.4, may be removed later)
|
|
9
|
+
- LocalFileStorageClient for default element persistence
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
from praisonai.ui.chainlit_compat import get_expiry_seconds, BaseStorageClient
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import os
|
|
16
|
+
import logging
|
|
17
|
+
from typing import Any, Dict, Optional, Type, Union
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
# Default expiry time in seconds (1 hour) - used if Chainlit doesn't provide one
|
|
22
|
+
DEFAULT_EXPIRY_SECONDS = 3600
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def get_expiry_seconds() -> int:
|
|
26
|
+
"""
|
|
27
|
+
Get the storage expiry time in seconds.
|
|
28
|
+
|
|
29
|
+
Tries to retrieve from Chainlit's configuration in a version-compatible way.
|
|
30
|
+
Falls back to DEFAULT_EXPIRY_SECONDS if not available.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
int: Expiry time in seconds
|
|
34
|
+
"""
|
|
35
|
+
# First check environment variable (highest priority)
|
|
36
|
+
env_expiry = os.getenv("STORAGE_EXPIRY_TIME")
|
|
37
|
+
if env_expiry is not None:
|
|
38
|
+
try:
|
|
39
|
+
return int(env_expiry)
|
|
40
|
+
except ValueError:
|
|
41
|
+
pass
|
|
42
|
+
|
|
43
|
+
# Try to import from Chainlit (version-compatible)
|
|
44
|
+
# Try multiple known locations across Chainlit versions
|
|
45
|
+
|
|
46
|
+
# Chainlit 2.9.x: storage_expiry_time in storage_clients.base
|
|
47
|
+
try:
|
|
48
|
+
from chainlit.data.storage_clients.base import storage_expiry_time
|
|
49
|
+
return storage_expiry_time
|
|
50
|
+
except ImportError:
|
|
51
|
+
pass
|
|
52
|
+
|
|
53
|
+
# Older versions: EXPIRY_TIME (uppercase) in storage_clients.base
|
|
54
|
+
try:
|
|
55
|
+
from chainlit.data.storage_clients.base import EXPIRY_TIME
|
|
56
|
+
return EXPIRY_TIME
|
|
57
|
+
except ImportError:
|
|
58
|
+
pass
|
|
59
|
+
|
|
60
|
+
# Fallback to default
|
|
61
|
+
return DEFAULT_EXPIRY_SECONDS
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def get_base_storage_client() -> Optional[Type]:
|
|
65
|
+
"""
|
|
66
|
+
Get the BaseStorageClient class from Chainlit.
|
|
67
|
+
|
|
68
|
+
Handles multiple import locations across Chainlit versions:
|
|
69
|
+
- chainlit.data.base (latest/development)
|
|
70
|
+
- chainlit.data.storage_clients.base (2.9.x)
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
Type: BaseStorageClient class, or None if not available
|
|
74
|
+
"""
|
|
75
|
+
# Try latest location first (chainlit.data.base)
|
|
76
|
+
try:
|
|
77
|
+
from chainlit.data.base import BaseStorageClient
|
|
78
|
+
return BaseStorageClient
|
|
79
|
+
except ImportError:
|
|
80
|
+
pass
|
|
81
|
+
|
|
82
|
+
# Try 2.9.x location
|
|
83
|
+
try:
|
|
84
|
+
from chainlit.data.storage_clients.base import BaseStorageClient
|
|
85
|
+
return BaseStorageClient
|
|
86
|
+
except ImportError:
|
|
87
|
+
pass
|
|
88
|
+
|
|
89
|
+
return None
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def get_base_data_layer() -> Optional[Type]:
|
|
93
|
+
"""
|
|
94
|
+
Get the BaseDataLayer class from Chainlit.
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
Type: BaseDataLayer class, or None if not available
|
|
98
|
+
"""
|
|
99
|
+
try:
|
|
100
|
+
from chainlit.data.base import BaseDataLayer
|
|
101
|
+
return BaseDataLayer
|
|
102
|
+
except ImportError:
|
|
103
|
+
pass
|
|
104
|
+
|
|
105
|
+
try:
|
|
106
|
+
from chainlit.data import BaseDataLayer
|
|
107
|
+
return BaseDataLayer
|
|
108
|
+
except ImportError:
|
|
109
|
+
pass
|
|
110
|
+
|
|
111
|
+
return None
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def base_data_layer_has_close() -> bool:
|
|
115
|
+
"""
|
|
116
|
+
Check if BaseDataLayer has a close() method.
|
|
117
|
+
|
|
118
|
+
This method was added in Chainlit 2.9.4 but may be removed in future versions.
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
bool: True if close() method exists, False otherwise
|
|
122
|
+
"""
|
|
123
|
+
base_class = get_base_data_layer()
|
|
124
|
+
if base_class is None:
|
|
125
|
+
return False
|
|
126
|
+
|
|
127
|
+
import inspect
|
|
128
|
+
# Check if close is an abstract method or regular method
|
|
129
|
+
for name, method in inspect.getmembers(base_class):
|
|
130
|
+
if name == 'close':
|
|
131
|
+
return True
|
|
132
|
+
return False
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
# For backward compatibility, expose EXPIRY_TIME as an alias
|
|
136
|
+
# This allows existing code to import it without changes
|
|
137
|
+
EXPIRY_TIME = get_expiry_seconds()
|
|
138
|
+
|
|
139
|
+
# Re-export BaseStorageClient for convenience
|
|
140
|
+
# Try multiple locations for compatibility
|
|
141
|
+
BaseStorageClient = None
|
|
142
|
+
try:
|
|
143
|
+
from chainlit.data.base import BaseStorageClient
|
|
144
|
+
except ImportError:
|
|
145
|
+
try:
|
|
146
|
+
from chainlit.data.storage_clients.base import BaseStorageClient
|
|
147
|
+
except ImportError:
|
|
148
|
+
BaseStorageClient = None
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
class LocalFileStorageClient:
|
|
152
|
+
"""
|
|
153
|
+
A simple local file storage client for persisting elements to disk.
|
|
154
|
+
|
|
155
|
+
This provides a default storage implementation when no cloud storage
|
|
156
|
+
(S3, Azure, etc.) is configured. Files are stored in the CHAINLIT_APP_ROOT/.files directory.
|
|
157
|
+
"""
|
|
158
|
+
|
|
159
|
+
def __init__(self, storage_dir: Optional[str] = None):
|
|
160
|
+
"""
|
|
161
|
+
Initialize the local file storage client.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
storage_dir: Directory to store files. Defaults to CHAINLIT_APP_ROOT/.files
|
|
165
|
+
"""
|
|
166
|
+
if storage_dir:
|
|
167
|
+
self.storage_dir = storage_dir
|
|
168
|
+
else:
|
|
169
|
+
chainlit_root = os.environ.get("CHAINLIT_APP_ROOT", os.path.join(os.path.expanduser("~"), ".praison"))
|
|
170
|
+
self.storage_dir = os.path.join(chainlit_root, ".files")
|
|
171
|
+
|
|
172
|
+
os.makedirs(self.storage_dir, exist_ok=True)
|
|
173
|
+
logger.debug(f"LocalFileStorageClient initialized with storage_dir: {self.storage_dir}")
|
|
174
|
+
|
|
175
|
+
async def upload_file(
|
|
176
|
+
self,
|
|
177
|
+
object_key: str,
|
|
178
|
+
data: Union[bytes, str],
|
|
179
|
+
mime: str = "application/octet-stream",
|
|
180
|
+
overwrite: bool = True,
|
|
181
|
+
) -> Dict[str, Any]:
|
|
182
|
+
"""
|
|
183
|
+
Upload a file to local storage.
|
|
184
|
+
|
|
185
|
+
Args:
|
|
186
|
+
object_key: The key/path for the file
|
|
187
|
+
data: The file content (bytes or string)
|
|
188
|
+
mime: MIME type of the file
|
|
189
|
+
overwrite: Whether to overwrite existing files
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
Dict with object_key and url
|
|
193
|
+
"""
|
|
194
|
+
import aiofiles
|
|
195
|
+
|
|
196
|
+
# Create full path
|
|
197
|
+
file_path = os.path.join(self.storage_dir, object_key)
|
|
198
|
+
|
|
199
|
+
# Create parent directories if needed
|
|
200
|
+
os.makedirs(os.path.dirname(file_path), exist_ok=True)
|
|
201
|
+
|
|
202
|
+
# Check if file exists and overwrite is False
|
|
203
|
+
if not overwrite and os.path.exists(file_path):
|
|
204
|
+
logger.warning(f"File {object_key} already exists and overwrite=False")
|
|
205
|
+
return {"object_key": object_key, "url": f"file://{file_path}"}
|
|
206
|
+
|
|
207
|
+
# Write the file
|
|
208
|
+
try:
|
|
209
|
+
if isinstance(data, str):
|
|
210
|
+
async with aiofiles.open(file_path, 'w') as f:
|
|
211
|
+
await f.write(data)
|
|
212
|
+
else:
|
|
213
|
+
async with aiofiles.open(file_path, 'wb') as f:
|
|
214
|
+
await f.write(data)
|
|
215
|
+
|
|
216
|
+
logger.debug(f"Uploaded file to {file_path}")
|
|
217
|
+
return {"object_key": object_key, "url": f"file://{file_path}"}
|
|
218
|
+
except Exception as e:
|
|
219
|
+
logger.error(f"Failed to upload file {object_key}: {e}")
|
|
220
|
+
return {}
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def create_local_storage_client(storage_dir: Optional[str] = None) -> LocalFileStorageClient:
|
|
224
|
+
"""
|
|
225
|
+
Create a LocalFileStorageClient instance.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
storage_dir: Optional directory for file storage
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
LocalFileStorageClient instance
|
|
232
|
+
"""
|
|
233
|
+
return LocalFileStorageClient(storage_dir=storage_dir)
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
__all__ = [
|
|
237
|
+
'get_expiry_seconds',
|
|
238
|
+
'get_base_storage_client',
|
|
239
|
+
'get_base_data_layer',
|
|
240
|
+
'base_data_layer_has_close',
|
|
241
|
+
'EXPIRY_TIME',
|
|
242
|
+
'BaseStorageClient',
|
|
243
|
+
'LocalFileStorageClient',
|
|
244
|
+
'create_local_storage_client',
|
|
245
|
+
'DEFAULT_EXPIRY_SECONDS',
|
|
246
|
+
]
|