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,276 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Text utility functions for PraisonAI Code module.
|
|
3
|
+
|
|
4
|
+
Provides utilities for text processing including:
|
|
5
|
+
- String normalization (smart quotes, unicode)
|
|
6
|
+
- HTML entity unescaping
|
|
7
|
+
- Similarity calculation using Levenshtein distance
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import html
|
|
11
|
+
import re
|
|
12
|
+
import unicodedata
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def normalize_string(text: str) -> str:
|
|
16
|
+
"""
|
|
17
|
+
Normalize a string for comparison.
|
|
18
|
+
|
|
19
|
+
Handles:
|
|
20
|
+
- Smart quotes to regular quotes
|
|
21
|
+
- Unicode normalization
|
|
22
|
+
- Consistent whitespace
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
text: The text to normalize
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
Normalized text string
|
|
29
|
+
"""
|
|
30
|
+
if not text:
|
|
31
|
+
return ""
|
|
32
|
+
|
|
33
|
+
# Unicode normalization (NFC form)
|
|
34
|
+
normalized = unicodedata.normalize('NFC', text)
|
|
35
|
+
|
|
36
|
+
# Replace smart quotes with regular quotes
|
|
37
|
+
quote_replacements = {
|
|
38
|
+
'\u2018': "'", # Left single quote
|
|
39
|
+
'\u2019': "'", # Right single quote
|
|
40
|
+
'\u201C': '"', # Left double quote
|
|
41
|
+
'\u201D': '"', # Right double quote
|
|
42
|
+
'\u2013': '-', # En dash
|
|
43
|
+
'\u2014': '-', # Em dash
|
|
44
|
+
'\u2026': '...', # Ellipsis
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
for smart, regular in quote_replacements.items():
|
|
48
|
+
normalized = normalized.replace(smart, regular)
|
|
49
|
+
|
|
50
|
+
return normalized
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def unescape_html_entities(text: str) -> str:
|
|
54
|
+
"""
|
|
55
|
+
Unescape HTML entities in text.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
text: Text with HTML entities
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
Text with entities converted to characters
|
|
62
|
+
|
|
63
|
+
Example:
|
|
64
|
+
>>> unescape_html_entities("<div>")
|
|
65
|
+
'<div>'
|
|
66
|
+
"""
|
|
67
|
+
if not text:
|
|
68
|
+
return ""
|
|
69
|
+
return html.unescape(text)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def levenshtein_distance(s1: str, s2: str) -> int:
|
|
73
|
+
"""
|
|
74
|
+
Calculate the Levenshtein distance between two strings.
|
|
75
|
+
|
|
76
|
+
This is the minimum number of single-character edits (insertions,
|
|
77
|
+
deletions, or substitutions) required to change one string into the other.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
s1: First string
|
|
81
|
+
s2: Second string
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
The edit distance between the strings
|
|
85
|
+
"""
|
|
86
|
+
if len(s1) < len(s2):
|
|
87
|
+
return levenshtein_distance(s2, s1)
|
|
88
|
+
|
|
89
|
+
if len(s2) == 0:
|
|
90
|
+
return len(s1)
|
|
91
|
+
|
|
92
|
+
previous_row = range(len(s2) + 1)
|
|
93
|
+
|
|
94
|
+
for i, c1 in enumerate(s1):
|
|
95
|
+
current_row = [i + 1]
|
|
96
|
+
for j, c2 in enumerate(s2):
|
|
97
|
+
# Cost is 0 if characters match, 1 otherwise
|
|
98
|
+
insertions = previous_row[j + 1] + 1
|
|
99
|
+
deletions = current_row[j] + 1
|
|
100
|
+
substitutions = previous_row[j] + (c1 != c2)
|
|
101
|
+
current_row.append(min(insertions, deletions, substitutions))
|
|
102
|
+
previous_row = current_row
|
|
103
|
+
|
|
104
|
+
return previous_row[-1]
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def get_similarity(original: str, search: str) -> float:
|
|
108
|
+
"""
|
|
109
|
+
Calculate similarity ratio between two strings using Levenshtein distance.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
original: The original string
|
|
113
|
+
search: The string to compare against
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
Similarity ratio from 0.0 (completely different) to 1.0 (identical)
|
|
117
|
+
"""
|
|
118
|
+
if not search:
|
|
119
|
+
return 0.0
|
|
120
|
+
|
|
121
|
+
# Normalize both strings for comparison
|
|
122
|
+
normalized_original = normalize_string(original)
|
|
123
|
+
normalized_search = normalize_string(search)
|
|
124
|
+
|
|
125
|
+
if normalized_original == normalized_search:
|
|
126
|
+
return 1.0
|
|
127
|
+
|
|
128
|
+
# Calculate Levenshtein distance
|
|
129
|
+
dist = levenshtein_distance(normalized_original, normalized_search)
|
|
130
|
+
|
|
131
|
+
# Calculate similarity ratio
|
|
132
|
+
max_length = max(len(normalized_original), len(normalized_search))
|
|
133
|
+
if max_length == 0:
|
|
134
|
+
return 1.0
|
|
135
|
+
|
|
136
|
+
return 1.0 - (dist / max_length)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def fuzzy_search(
|
|
140
|
+
lines: list,
|
|
141
|
+
search_chunk: str,
|
|
142
|
+
start_index: int,
|
|
143
|
+
end_index: int
|
|
144
|
+
) -> tuple:
|
|
145
|
+
"""
|
|
146
|
+
Perform a middle-out fuzzy search to find the best match for search_chunk.
|
|
147
|
+
|
|
148
|
+
Searches outward from the middle of the range to find the slice of lines
|
|
149
|
+
that is most similar to the search chunk.
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
lines: List of lines to search in
|
|
153
|
+
search_chunk: The text to search for
|
|
154
|
+
start_index: Start of search range (inclusive)
|
|
155
|
+
end_index: End of search range (exclusive)
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
Tuple of (best_score, best_match_index, best_match_content)
|
|
159
|
+
"""
|
|
160
|
+
best_score = 0.0
|
|
161
|
+
best_match_index = -1
|
|
162
|
+
best_match_content = ""
|
|
163
|
+
|
|
164
|
+
search_lines = search_chunk.split('\n')
|
|
165
|
+
search_len = len(search_lines)
|
|
166
|
+
|
|
167
|
+
if search_len == 0:
|
|
168
|
+
return (0.0, -1, "")
|
|
169
|
+
|
|
170
|
+
# Middle-out search from the midpoint
|
|
171
|
+
mid_point = (start_index + end_index) // 2
|
|
172
|
+
left_index = mid_point
|
|
173
|
+
right_index = mid_point + 1
|
|
174
|
+
|
|
175
|
+
while left_index >= start_index or right_index <= end_index - search_len:
|
|
176
|
+
# Check left side
|
|
177
|
+
if left_index >= start_index:
|
|
178
|
+
original_chunk = '\n'.join(lines[left_index:left_index + search_len])
|
|
179
|
+
similarity = get_similarity(original_chunk, search_chunk)
|
|
180
|
+
if similarity > best_score:
|
|
181
|
+
best_score = similarity
|
|
182
|
+
best_match_index = left_index
|
|
183
|
+
best_match_content = original_chunk
|
|
184
|
+
left_index -= 1
|
|
185
|
+
|
|
186
|
+
# Check right side
|
|
187
|
+
if right_index <= end_index - search_len:
|
|
188
|
+
original_chunk = '\n'.join(lines[right_index:right_index + search_len])
|
|
189
|
+
similarity = get_similarity(original_chunk, search_chunk)
|
|
190
|
+
if similarity > best_score:
|
|
191
|
+
best_score = similarity
|
|
192
|
+
best_match_index = right_index
|
|
193
|
+
best_match_content = original_chunk
|
|
194
|
+
right_index += 1
|
|
195
|
+
|
|
196
|
+
return (best_score, best_match_index, best_match_content)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def strip_markdown_code_fences(content: str) -> str:
|
|
200
|
+
"""
|
|
201
|
+
Strip markdown code fences from content.
|
|
202
|
+
|
|
203
|
+
Handles content that starts with ```language and ends with ```.
|
|
204
|
+
|
|
205
|
+
Args:
|
|
206
|
+
content: Content potentially wrapped in code fences
|
|
207
|
+
|
|
208
|
+
Returns:
|
|
209
|
+
Content with code fences removed
|
|
210
|
+
"""
|
|
211
|
+
if not content:
|
|
212
|
+
return ""
|
|
213
|
+
|
|
214
|
+
lines = content.split('\n')
|
|
215
|
+
|
|
216
|
+
# Check if starts with code fence
|
|
217
|
+
if lines and lines[0].strip().startswith('```'):
|
|
218
|
+
lines = lines[1:]
|
|
219
|
+
|
|
220
|
+
# Check if ends with code fence
|
|
221
|
+
if lines and lines[-1].strip() == '```':
|
|
222
|
+
lines = lines[:-1]
|
|
223
|
+
|
|
224
|
+
return '\n'.join(lines)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def get_indentation(line: str) -> str:
|
|
228
|
+
"""
|
|
229
|
+
Extract the leading whitespace (indentation) from a line.
|
|
230
|
+
|
|
231
|
+
Args:
|
|
232
|
+
line: The line to extract indentation from
|
|
233
|
+
|
|
234
|
+
Returns:
|
|
235
|
+
The leading whitespace string (tabs and/or spaces)
|
|
236
|
+
"""
|
|
237
|
+
match = re.match(r'^[\t ]*', line)
|
|
238
|
+
return match.group(0) if match else ""
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def preserve_indentation(original_lines: list, replacement_lines: list) -> list:
|
|
242
|
+
"""
|
|
243
|
+
Apply replacement lines while preserving the indentation from original.
|
|
244
|
+
|
|
245
|
+
Args:
|
|
246
|
+
original_lines: The original lines being replaced
|
|
247
|
+
replacement_lines: The new lines to insert
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
Replacement lines with adjusted indentation
|
|
251
|
+
"""
|
|
252
|
+
if not original_lines or not replacement_lines:
|
|
253
|
+
return replacement_lines
|
|
254
|
+
|
|
255
|
+
# Get base indentation from first original line
|
|
256
|
+
original_base_indent = get_indentation(original_lines[0])
|
|
257
|
+
|
|
258
|
+
# Get base indentation from first replacement line
|
|
259
|
+
replacement_base_indent = get_indentation(replacement_lines[0])
|
|
260
|
+
|
|
261
|
+
result = []
|
|
262
|
+
for line in replacement_lines:
|
|
263
|
+
current_indent = get_indentation(line)
|
|
264
|
+
content = line.lstrip()
|
|
265
|
+
|
|
266
|
+
# Calculate relative indentation
|
|
267
|
+
if len(current_indent) >= len(replacement_base_indent):
|
|
268
|
+
relative_indent = current_indent[len(replacement_base_indent):]
|
|
269
|
+
new_indent = original_base_indent + relative_indent
|
|
270
|
+
else:
|
|
271
|
+
# Line has less indentation than base, adjust accordingly
|
|
272
|
+
new_indent = original_base_indent[:max(0, len(original_base_indent) - (len(replacement_base_indent) - len(current_indent)))]
|
|
273
|
+
|
|
274
|
+
result.append(new_indent + content)
|
|
275
|
+
|
|
276
|
+
return result
|
praisonai/db/__init__.py
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""
|
|
2
|
+
PraisonAI Database - Ultra-simple persistence for agents.
|
|
3
|
+
|
|
4
|
+
RECOMMENDED (simplified import):
|
|
5
|
+
from praisonaiagents import Agent, db
|
|
6
|
+
# or: from praisonai import Agent, db
|
|
7
|
+
|
|
8
|
+
agent = Agent(
|
|
9
|
+
name="Assistant",
|
|
10
|
+
db=db(database_url="postgresql://localhost/mydb"),
|
|
11
|
+
session_id="my-session"
|
|
12
|
+
)
|
|
13
|
+
agent.chat("Hello!") # auto-persists + can resume
|
|
14
|
+
|
|
15
|
+
DEPRECATED (will be removed in v3.0):
|
|
16
|
+
from praisonai.db import PraisonDB # Use db(...) instead
|
|
17
|
+
|
|
18
|
+
Supported backends:
|
|
19
|
+
- PostgreSQL, MySQL, SQLite (conversation)
|
|
20
|
+
- Qdrant, ChromaDB, Pinecone (knowledge/vector)
|
|
21
|
+
- Redis, Memory (state)
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
import warnings
|
|
25
|
+
|
|
26
|
+
__all__ = [
|
|
27
|
+
"PraisonDB",
|
|
28
|
+
"PostgresDB",
|
|
29
|
+
"SQLiteDB",
|
|
30
|
+
"RedisDB",
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
# Deprecation warning message
|
|
34
|
+
_DEPRECATION_MSG = (
|
|
35
|
+
"Importing from 'praisonai.db' is deprecated and will be removed in v3.0. "
|
|
36
|
+
"Use the simplified import instead:\n"
|
|
37
|
+
" from praisonaiagents import Agent, db\n"
|
|
38
|
+
" # or: from praisonai import Agent, db\n"
|
|
39
|
+
"Then use: db=db(database_url='...')"
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
# Lazy imports to avoid loading heavy dependencies
|
|
43
|
+
def __getattr__(name: str):
|
|
44
|
+
if name == "PraisonDB":
|
|
45
|
+
warnings.warn(_DEPRECATION_MSG, DeprecationWarning, stacklevel=2)
|
|
46
|
+
from .adapter import PraisonDB
|
|
47
|
+
return PraisonDB
|
|
48
|
+
|
|
49
|
+
if name == "PostgresDB":
|
|
50
|
+
warnings.warn(_DEPRECATION_MSG, DeprecationWarning, stacklevel=2)
|
|
51
|
+
from .adapter import PostgresDB
|
|
52
|
+
return PostgresDB
|
|
53
|
+
|
|
54
|
+
if name == "SQLiteDB":
|
|
55
|
+
warnings.warn(_DEPRECATION_MSG, DeprecationWarning, stacklevel=2)
|
|
56
|
+
from .adapter import SQLiteDB
|
|
57
|
+
return SQLiteDB
|
|
58
|
+
|
|
59
|
+
if name == "RedisDB":
|
|
60
|
+
warnings.warn(_DEPRECATION_MSG, DeprecationWarning, stacklevel=2)
|
|
61
|
+
from .adapter import RedisDB
|
|
62
|
+
return RedisDB
|
|
63
|
+
|
|
64
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|