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
praisonai/ui/db.py
ADDED
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sqlite3
|
|
3
|
+
import asyncio
|
|
4
|
+
import shutil
|
|
5
|
+
import logging
|
|
6
|
+
from sqlalchemy import text
|
|
7
|
+
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
|
|
8
|
+
from sqlalchemy.orm import sessionmaker
|
|
9
|
+
from sql_alchemy import SQLAlchemyDataLayer
|
|
10
|
+
import chainlit.data as cl_data
|
|
11
|
+
from chainlit.types import ThreadDict
|
|
12
|
+
from database_config import get_database_url_with_sqlite_override
|
|
13
|
+
from praisonai.ui.chainlit_compat import create_local_storage_client
|
|
14
|
+
|
|
15
|
+
def ensure_directories():
|
|
16
|
+
"""Ensure required directories exist"""
|
|
17
|
+
if "CHAINLIT_APP_ROOT" not in os.environ:
|
|
18
|
+
chainlit_root = os.path.join(os.path.expanduser("~"), ".praison")
|
|
19
|
+
os.environ["CHAINLIT_APP_ROOT"] = chainlit_root
|
|
20
|
+
else:
|
|
21
|
+
chainlit_root = os.environ["CHAINLIT_APP_ROOT"]
|
|
22
|
+
|
|
23
|
+
os.makedirs(chainlit_root, exist_ok=True)
|
|
24
|
+
os.makedirs(os.path.join(chainlit_root, ".files"), exist_ok=True)
|
|
25
|
+
|
|
26
|
+
# Copy public folder and chainlit.md if they don't exist
|
|
27
|
+
public_folder = os.path.join(os.path.dirname(__file__), "public")
|
|
28
|
+
config_folder = os.path.join(os.path.dirname(__file__), "config")
|
|
29
|
+
|
|
30
|
+
# Copy public folder
|
|
31
|
+
if not os.path.exists(os.path.join(chainlit_root, "public")):
|
|
32
|
+
if os.path.exists(public_folder):
|
|
33
|
+
shutil.copytree(public_folder, os.path.join(chainlit_root, "public"), dirs_exist_ok=True)
|
|
34
|
+
logging.info("Public folder copied successfully!")
|
|
35
|
+
else:
|
|
36
|
+
logging.info("Public folder not found in the package.")
|
|
37
|
+
|
|
38
|
+
# Copy all files from config folder to root if translations doesn't exist
|
|
39
|
+
if not os.path.exists(os.path.join(chainlit_root, "translations")):
|
|
40
|
+
os.makedirs(os.path.join(chainlit_root, "translations"), exist_ok=True)
|
|
41
|
+
|
|
42
|
+
if os.path.exists(config_folder):
|
|
43
|
+
for item in os.listdir(config_folder):
|
|
44
|
+
src_path = os.path.join(config_folder, item)
|
|
45
|
+
dst_path = os.path.join(chainlit_root, item)
|
|
46
|
+
if os.path.isfile(src_path):
|
|
47
|
+
shutil.copy2(src_path, dst_path)
|
|
48
|
+
logging.info(f"File {item} copied to root successfully!")
|
|
49
|
+
elif os.path.isdir(src_path):
|
|
50
|
+
if os.path.exists(dst_path):
|
|
51
|
+
shutil.rmtree(dst_path)
|
|
52
|
+
shutil.copytree(src_path, dst_path)
|
|
53
|
+
logging.info(f"Directory {item} copied to root successfully!")
|
|
54
|
+
else:
|
|
55
|
+
logging.info("Config folder not found in the package.")
|
|
56
|
+
|
|
57
|
+
# Create directories at module import time
|
|
58
|
+
ensure_directories()
|
|
59
|
+
|
|
60
|
+
class DatabaseManager(SQLAlchemyDataLayer):
|
|
61
|
+
def __init__(self):
|
|
62
|
+
# Check FORCE_SQLITE flag to bypass external database detection
|
|
63
|
+
self.database_url = get_database_url_with_sqlite_override()
|
|
64
|
+
|
|
65
|
+
if self.database_url:
|
|
66
|
+
self.conninfo = self.database_url
|
|
67
|
+
else:
|
|
68
|
+
chainlit_root = os.environ["CHAINLIT_APP_ROOT"] # Now using CHAINLIT_APP_ROOT
|
|
69
|
+
self.db_path = os.path.join(chainlit_root, "database.sqlite")
|
|
70
|
+
self.conninfo = f"sqlite+aiosqlite:///{self.db_path}"
|
|
71
|
+
|
|
72
|
+
# Create local file storage client for element persistence
|
|
73
|
+
storage_client = create_local_storage_client()
|
|
74
|
+
|
|
75
|
+
# Initialize SQLAlchemyDataLayer with the connection info and storage client
|
|
76
|
+
super().__init__(conninfo=self.conninfo, storage_provider=storage_client)
|
|
77
|
+
|
|
78
|
+
async def create_schema_async(self):
|
|
79
|
+
"""Create the database schema for PostgreSQL"""
|
|
80
|
+
if not self.database_url:
|
|
81
|
+
return
|
|
82
|
+
engine = create_async_engine(self.database_url, echo=False)
|
|
83
|
+
async with engine.begin() as conn:
|
|
84
|
+
await conn.execute(text('''
|
|
85
|
+
CREATE TABLE IF NOT EXISTS users (
|
|
86
|
+
"id" TEXT PRIMARY KEY,
|
|
87
|
+
"identifier" TEXT NOT NULL UNIQUE,
|
|
88
|
+
"meta" TEXT NOT NULL DEFAULT '{}',
|
|
89
|
+
"createdAt" TEXT
|
|
90
|
+
);
|
|
91
|
+
'''))
|
|
92
|
+
await conn.execute(text('''
|
|
93
|
+
CREATE TABLE IF NOT EXISTS threads (
|
|
94
|
+
"id" TEXT PRIMARY KEY,
|
|
95
|
+
"createdAt" TEXT,
|
|
96
|
+
"name" TEXT,
|
|
97
|
+
"userId" TEXT,
|
|
98
|
+
"userIdentifier" TEXT,
|
|
99
|
+
"tags" TEXT DEFAULT '[]',
|
|
100
|
+
"meta" TEXT NOT NULL DEFAULT '{}',
|
|
101
|
+
FOREIGN KEY ("userId") REFERENCES users("id") ON DELETE CASCADE
|
|
102
|
+
);
|
|
103
|
+
'''))
|
|
104
|
+
await conn.execute(text('''
|
|
105
|
+
CREATE TABLE IF NOT EXISTS steps (
|
|
106
|
+
"id" TEXT PRIMARY KEY,
|
|
107
|
+
"name" TEXT NOT NULL,
|
|
108
|
+
"type" TEXT NOT NULL,
|
|
109
|
+
"threadId" TEXT NOT NULL,
|
|
110
|
+
"parentId" TEXT,
|
|
111
|
+
"disableFeedback" BOOLEAN NOT NULL DEFAULT FALSE,
|
|
112
|
+
"streaming" BOOLEAN NOT NULL DEFAULT FALSE,
|
|
113
|
+
"waitForAnswer" BOOLEAN DEFAULT FALSE,
|
|
114
|
+
"isError" BOOLEAN NOT NULL DEFAULT FALSE,
|
|
115
|
+
"meta" TEXT DEFAULT '{}',
|
|
116
|
+
"tags" TEXT DEFAULT '[]',
|
|
117
|
+
"input" TEXT,
|
|
118
|
+
"output" TEXT,
|
|
119
|
+
"createdAt" TEXT,
|
|
120
|
+
"startTime" TEXT,
|
|
121
|
+
"endTime" TEXT,
|
|
122
|
+
"generation" TEXT,
|
|
123
|
+
"showInput" TEXT,
|
|
124
|
+
"language" TEXT,
|
|
125
|
+
"indent" INT,
|
|
126
|
+
FOREIGN KEY ("threadId") REFERENCES threads("id") ON DELETE CASCADE
|
|
127
|
+
);
|
|
128
|
+
'''))
|
|
129
|
+
await conn.execute(text('''
|
|
130
|
+
CREATE TABLE IF NOT EXISTS elements (
|
|
131
|
+
"id" TEXT PRIMARY KEY,
|
|
132
|
+
"threadId" TEXT,
|
|
133
|
+
"type" TEXT,
|
|
134
|
+
"url" TEXT,
|
|
135
|
+
"chainlitKey" TEXT,
|
|
136
|
+
"name" TEXT NOT NULL,
|
|
137
|
+
"display" TEXT,
|
|
138
|
+
"objectKey" TEXT,
|
|
139
|
+
"size" TEXT,
|
|
140
|
+
"page" INT,
|
|
141
|
+
"language" TEXT,
|
|
142
|
+
"forId" TEXT,
|
|
143
|
+
"mime" TEXT,
|
|
144
|
+
FOREIGN KEY ("threadId") REFERENCES threads("id") ON DELETE CASCADE
|
|
145
|
+
);
|
|
146
|
+
'''))
|
|
147
|
+
await conn.execute(text('''
|
|
148
|
+
CREATE TABLE IF NOT EXISTS feedbacks (
|
|
149
|
+
"id" TEXT PRIMARY KEY,
|
|
150
|
+
"forId" TEXT NOT NULL,
|
|
151
|
+
"value" INT NOT NULL,
|
|
152
|
+
"threadId" TEXT,
|
|
153
|
+
"comment" TEXT
|
|
154
|
+
);
|
|
155
|
+
'''))
|
|
156
|
+
await conn.execute(text('''
|
|
157
|
+
CREATE TABLE IF NOT EXISTS settings (
|
|
158
|
+
"id" SERIAL PRIMARY KEY,
|
|
159
|
+
"key" TEXT UNIQUE,
|
|
160
|
+
"value" TEXT
|
|
161
|
+
);
|
|
162
|
+
'''))
|
|
163
|
+
await engine.dispose()
|
|
164
|
+
|
|
165
|
+
def create_schema_sqlite(self):
|
|
166
|
+
"""Create the database schema for SQLite"""
|
|
167
|
+
chainlit_root = os.environ["CHAINLIT_APP_ROOT"] # Now using CHAINLIT_APP_ROOT
|
|
168
|
+
self.db_path = os.path.join(chainlit_root, "database.sqlite")
|
|
169
|
+
conn = sqlite3.connect(self.db_path)
|
|
170
|
+
cursor = conn.cursor()
|
|
171
|
+
cursor.execute('''
|
|
172
|
+
CREATE TABLE IF NOT EXISTS users (
|
|
173
|
+
id TEXT PRIMARY KEY,
|
|
174
|
+
identifier TEXT NOT NULL UNIQUE,
|
|
175
|
+
meta TEXT NOT NULL DEFAULT '{}',
|
|
176
|
+
createdAt TEXT
|
|
177
|
+
);
|
|
178
|
+
''')
|
|
179
|
+
cursor.execute('''
|
|
180
|
+
CREATE TABLE IF NOT EXISTS threads (
|
|
181
|
+
id TEXT PRIMARY KEY,
|
|
182
|
+
createdAt TEXT,
|
|
183
|
+
name TEXT,
|
|
184
|
+
userId TEXT,
|
|
185
|
+
userIdentifier TEXT,
|
|
186
|
+
tags TEXT DEFAULT '[]',
|
|
187
|
+
meta TEXT NOT NULL DEFAULT '{}',
|
|
188
|
+
FOREIGN KEY (userId) REFERENCES users(id) ON DELETE CASCADE
|
|
189
|
+
);
|
|
190
|
+
''')
|
|
191
|
+
cursor.execute('''
|
|
192
|
+
CREATE TABLE IF NOT EXISTS steps (
|
|
193
|
+
id TEXT PRIMARY KEY,
|
|
194
|
+
name TEXT NOT NULL,
|
|
195
|
+
type TEXT NOT NULL,
|
|
196
|
+
threadId TEXT NOT NULL,
|
|
197
|
+
parentId TEXT,
|
|
198
|
+
disableFeedback BOOLEAN NOT NULL DEFAULT 0,
|
|
199
|
+
streaming BOOLEAN NOT NULL DEFAULT 0,
|
|
200
|
+
waitForAnswer BOOLEAN DEFAULT 0,
|
|
201
|
+
isError BOOLEAN NOT NULL DEFAULT 0,
|
|
202
|
+
meta TEXT DEFAULT '{}',
|
|
203
|
+
tags TEXT DEFAULT '[]',
|
|
204
|
+
input TEXT,
|
|
205
|
+
output TEXT,
|
|
206
|
+
createdAt TEXT,
|
|
207
|
+
startTime TEXT,
|
|
208
|
+
endTime TEXT,
|
|
209
|
+
generation TEXT,
|
|
210
|
+
showInput TEXT,
|
|
211
|
+
language TEXT,
|
|
212
|
+
indent INT,
|
|
213
|
+
FOREIGN KEY (threadId) REFERENCES threads(id) ON DELETE CASCADE
|
|
214
|
+
);
|
|
215
|
+
''')
|
|
216
|
+
cursor.execute('''
|
|
217
|
+
CREATE TABLE IF NOT EXISTS elements (
|
|
218
|
+
id TEXT PRIMARY KEY,
|
|
219
|
+
threadId TEXT,
|
|
220
|
+
type TEXT,
|
|
221
|
+
url TEXT,
|
|
222
|
+
chainlitKey TEXT,
|
|
223
|
+
name TEXT NOT NULL,
|
|
224
|
+
display TEXT,
|
|
225
|
+
objectKey TEXT,
|
|
226
|
+
size TEXT,
|
|
227
|
+
page INT,
|
|
228
|
+
language TEXT,
|
|
229
|
+
forId TEXT,
|
|
230
|
+
mime TEXT,
|
|
231
|
+
FOREIGN KEY (threadId) REFERENCES threads(id) ON DELETE CASCADE
|
|
232
|
+
);
|
|
233
|
+
''')
|
|
234
|
+
cursor.execute('''
|
|
235
|
+
CREATE TABLE IF NOT EXISTS feedbacks (
|
|
236
|
+
id TEXT PRIMARY KEY,
|
|
237
|
+
forId TEXT NOT NULL,
|
|
238
|
+
value INT NOT NULL,
|
|
239
|
+
threadId TEXT,
|
|
240
|
+
comment TEXT
|
|
241
|
+
);
|
|
242
|
+
''')
|
|
243
|
+
cursor.execute('''
|
|
244
|
+
CREATE TABLE IF NOT EXISTS settings (
|
|
245
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
246
|
+
key TEXT UNIQUE,
|
|
247
|
+
value TEXT
|
|
248
|
+
);
|
|
249
|
+
''')
|
|
250
|
+
conn.commit()
|
|
251
|
+
conn.close()
|
|
252
|
+
|
|
253
|
+
def initialize(self):
|
|
254
|
+
"""Initialize the database with schema based on the configuration"""
|
|
255
|
+
if self.database_url:
|
|
256
|
+
asyncio.run(self.create_schema_async())
|
|
257
|
+
else:
|
|
258
|
+
self.create_schema_sqlite()
|
|
259
|
+
|
|
260
|
+
async def save_setting(self, key: str, value: str):
|
|
261
|
+
"""Save a setting to the database"""
|
|
262
|
+
if self.database_url:
|
|
263
|
+
async with self.engine.begin() as conn:
|
|
264
|
+
await conn.execute(text("""
|
|
265
|
+
INSERT INTO settings ("key", "value") VALUES (:key, :value)
|
|
266
|
+
ON CONFLICT ("key") DO UPDATE SET "value" = EXCLUDED."value"
|
|
267
|
+
"""), {"key": key, "value": value})
|
|
268
|
+
else:
|
|
269
|
+
conn = sqlite3.connect(self.db_path)
|
|
270
|
+
cursor = conn.cursor()
|
|
271
|
+
cursor.execute(
|
|
272
|
+
"""
|
|
273
|
+
INSERT OR REPLACE INTO settings (id, key, value)
|
|
274
|
+
VALUES ((SELECT id FROM settings WHERE key = ?), ?, ?)
|
|
275
|
+
""",
|
|
276
|
+
(key, key, value),
|
|
277
|
+
)
|
|
278
|
+
conn.commit()
|
|
279
|
+
conn.close()
|
|
280
|
+
|
|
281
|
+
async def load_setting(self, key: str) -> str:
|
|
282
|
+
"""Load a setting from the database"""
|
|
283
|
+
if self.database_url:
|
|
284
|
+
async with self.engine.connect() as conn:
|
|
285
|
+
result = await conn.execute(text('SELECT "value" FROM settings WHERE "key" = :key'), {"key": key})
|
|
286
|
+
row = result.fetchone()
|
|
287
|
+
return row[0] if row else None
|
|
288
|
+
else:
|
|
289
|
+
conn = sqlite3.connect(self.db_path)
|
|
290
|
+
cursor = conn.cursor()
|
|
291
|
+
cursor.execute('SELECT value FROM settings WHERE key = ?', (key,))
|
|
292
|
+
result = cursor.fetchone()
|
|
293
|
+
conn.close()
|
|
294
|
+
return result[0] if result else None
|