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.
Files changed (393) hide show
  1. praisonai/__init__.py +54 -0
  2. praisonai/__main__.py +15 -0
  3. praisonai/acp/__init__.py +54 -0
  4. praisonai/acp/config.py +159 -0
  5. praisonai/acp/server.py +587 -0
  6. praisonai/acp/session.py +219 -0
  7. praisonai/adapters/__init__.py +50 -0
  8. praisonai/adapters/readers.py +395 -0
  9. praisonai/adapters/rerankers.py +315 -0
  10. praisonai/adapters/retrievers.py +394 -0
  11. praisonai/adapters/vector_stores.py +409 -0
  12. praisonai/agent_scheduler.py +337 -0
  13. praisonai/agents_generator.py +903 -0
  14. praisonai/api/call.py +292 -0
  15. praisonai/auto.py +1197 -0
  16. praisonai/capabilities/__init__.py +275 -0
  17. praisonai/capabilities/a2a.py +140 -0
  18. praisonai/capabilities/assistants.py +283 -0
  19. praisonai/capabilities/audio.py +320 -0
  20. praisonai/capabilities/batches.py +469 -0
  21. praisonai/capabilities/completions.py +336 -0
  22. praisonai/capabilities/container_files.py +155 -0
  23. praisonai/capabilities/containers.py +93 -0
  24. praisonai/capabilities/embeddings.py +158 -0
  25. praisonai/capabilities/files.py +467 -0
  26. praisonai/capabilities/fine_tuning.py +293 -0
  27. praisonai/capabilities/guardrails.py +182 -0
  28. praisonai/capabilities/images.py +330 -0
  29. praisonai/capabilities/mcp.py +190 -0
  30. praisonai/capabilities/messages.py +270 -0
  31. praisonai/capabilities/moderations.py +154 -0
  32. praisonai/capabilities/ocr.py +217 -0
  33. praisonai/capabilities/passthrough.py +204 -0
  34. praisonai/capabilities/rag.py +207 -0
  35. praisonai/capabilities/realtime.py +160 -0
  36. praisonai/capabilities/rerank.py +165 -0
  37. praisonai/capabilities/responses.py +266 -0
  38. praisonai/capabilities/search.py +109 -0
  39. praisonai/capabilities/skills.py +133 -0
  40. praisonai/capabilities/vector_store_files.py +334 -0
  41. praisonai/capabilities/vector_stores.py +304 -0
  42. praisonai/capabilities/videos.py +141 -0
  43. praisonai/chainlit_ui.py +304 -0
  44. praisonai/chat/__init__.py +106 -0
  45. praisonai/chat/app.py +125 -0
  46. praisonai/cli/__init__.py +26 -0
  47. praisonai/cli/app.py +213 -0
  48. praisonai/cli/commands/__init__.py +75 -0
  49. praisonai/cli/commands/acp.py +70 -0
  50. praisonai/cli/commands/completion.py +333 -0
  51. praisonai/cli/commands/config.py +166 -0
  52. praisonai/cli/commands/debug.py +142 -0
  53. praisonai/cli/commands/diag.py +55 -0
  54. praisonai/cli/commands/doctor.py +166 -0
  55. praisonai/cli/commands/environment.py +179 -0
  56. praisonai/cli/commands/lsp.py +112 -0
  57. praisonai/cli/commands/mcp.py +210 -0
  58. praisonai/cli/commands/profile.py +457 -0
  59. praisonai/cli/commands/run.py +228 -0
  60. praisonai/cli/commands/schedule.py +150 -0
  61. praisonai/cli/commands/serve.py +97 -0
  62. praisonai/cli/commands/session.py +212 -0
  63. praisonai/cli/commands/traces.py +145 -0
  64. praisonai/cli/commands/version.py +101 -0
  65. praisonai/cli/configuration/__init__.py +18 -0
  66. praisonai/cli/configuration/loader.py +353 -0
  67. praisonai/cli/configuration/paths.py +114 -0
  68. praisonai/cli/configuration/schema.py +164 -0
  69. praisonai/cli/features/__init__.py +268 -0
  70. praisonai/cli/features/acp.py +236 -0
  71. praisonai/cli/features/action_orchestrator.py +546 -0
  72. praisonai/cli/features/agent_scheduler.py +773 -0
  73. praisonai/cli/features/agent_tools.py +474 -0
  74. praisonai/cli/features/agents.py +375 -0
  75. praisonai/cli/features/at_mentions.py +471 -0
  76. praisonai/cli/features/auto_memory.py +182 -0
  77. praisonai/cli/features/autonomy_mode.py +490 -0
  78. praisonai/cli/features/background.py +356 -0
  79. praisonai/cli/features/base.py +168 -0
  80. praisonai/cli/features/capabilities.py +1326 -0
  81. praisonai/cli/features/checkpoints.py +338 -0
  82. praisonai/cli/features/code_intelligence.py +652 -0
  83. praisonai/cli/features/compaction.py +294 -0
  84. praisonai/cli/features/compare.py +534 -0
  85. praisonai/cli/features/cost_tracker.py +514 -0
  86. praisonai/cli/features/debug.py +810 -0
  87. praisonai/cli/features/deploy.py +517 -0
  88. praisonai/cli/features/diag.py +289 -0
  89. praisonai/cli/features/doctor/__init__.py +63 -0
  90. praisonai/cli/features/doctor/checks/__init__.py +24 -0
  91. praisonai/cli/features/doctor/checks/acp_checks.py +240 -0
  92. praisonai/cli/features/doctor/checks/config_checks.py +366 -0
  93. praisonai/cli/features/doctor/checks/db_checks.py +366 -0
  94. praisonai/cli/features/doctor/checks/env_checks.py +543 -0
  95. praisonai/cli/features/doctor/checks/lsp_checks.py +199 -0
  96. praisonai/cli/features/doctor/checks/mcp_checks.py +349 -0
  97. praisonai/cli/features/doctor/checks/memory_checks.py +268 -0
  98. praisonai/cli/features/doctor/checks/network_checks.py +251 -0
  99. praisonai/cli/features/doctor/checks/obs_checks.py +328 -0
  100. praisonai/cli/features/doctor/checks/performance_checks.py +235 -0
  101. praisonai/cli/features/doctor/checks/permissions_checks.py +259 -0
  102. praisonai/cli/features/doctor/checks/selftest_checks.py +322 -0
  103. praisonai/cli/features/doctor/checks/serve_checks.py +426 -0
  104. praisonai/cli/features/doctor/checks/skills_checks.py +231 -0
  105. praisonai/cli/features/doctor/checks/tools_checks.py +371 -0
  106. praisonai/cli/features/doctor/engine.py +266 -0
  107. praisonai/cli/features/doctor/formatters.py +310 -0
  108. praisonai/cli/features/doctor/handler.py +397 -0
  109. praisonai/cli/features/doctor/models.py +264 -0
  110. praisonai/cli/features/doctor/registry.py +239 -0
  111. praisonai/cli/features/endpoints.py +1019 -0
  112. praisonai/cli/features/eval.py +560 -0
  113. praisonai/cli/features/external_agents.py +231 -0
  114. praisonai/cli/features/fast_context.py +410 -0
  115. praisonai/cli/features/flow_display.py +566 -0
  116. praisonai/cli/features/git_integration.py +651 -0
  117. praisonai/cli/features/guardrail.py +171 -0
  118. praisonai/cli/features/handoff.py +185 -0
  119. praisonai/cli/features/hooks.py +583 -0
  120. praisonai/cli/features/image.py +384 -0
  121. praisonai/cli/features/interactive_runtime.py +585 -0
  122. praisonai/cli/features/interactive_tools.py +380 -0
  123. praisonai/cli/features/interactive_tui.py +603 -0
  124. praisonai/cli/features/jobs.py +632 -0
  125. praisonai/cli/features/knowledge.py +531 -0
  126. praisonai/cli/features/lite.py +244 -0
  127. praisonai/cli/features/lsp_cli.py +225 -0
  128. praisonai/cli/features/mcp.py +169 -0
  129. praisonai/cli/features/message_queue.py +587 -0
  130. praisonai/cli/features/metrics.py +211 -0
  131. praisonai/cli/features/n8n.py +673 -0
  132. praisonai/cli/features/observability.py +293 -0
  133. praisonai/cli/features/ollama.py +361 -0
  134. praisonai/cli/features/output_style.py +273 -0
  135. praisonai/cli/features/package.py +631 -0
  136. praisonai/cli/features/performance.py +308 -0
  137. praisonai/cli/features/persistence.py +636 -0
  138. praisonai/cli/features/profile.py +226 -0
  139. praisonai/cli/features/profiler/__init__.py +81 -0
  140. praisonai/cli/features/profiler/core.py +558 -0
  141. praisonai/cli/features/profiler/optimizations.py +652 -0
  142. praisonai/cli/features/profiler/suite.py +386 -0
  143. praisonai/cli/features/profiling.py +350 -0
  144. praisonai/cli/features/queue/__init__.py +73 -0
  145. praisonai/cli/features/queue/manager.py +395 -0
  146. praisonai/cli/features/queue/models.py +286 -0
  147. praisonai/cli/features/queue/persistence.py +564 -0
  148. praisonai/cli/features/queue/scheduler.py +484 -0
  149. praisonai/cli/features/queue/worker.py +372 -0
  150. praisonai/cli/features/recipe.py +1723 -0
  151. praisonai/cli/features/recipes.py +449 -0
  152. praisonai/cli/features/registry.py +229 -0
  153. praisonai/cli/features/repo_map.py +860 -0
  154. praisonai/cli/features/router.py +466 -0
  155. praisonai/cli/features/sandbox_executor.py +515 -0
  156. praisonai/cli/features/serve.py +829 -0
  157. praisonai/cli/features/session.py +222 -0
  158. praisonai/cli/features/skills.py +856 -0
  159. praisonai/cli/features/slash_commands.py +650 -0
  160. praisonai/cli/features/telemetry.py +179 -0
  161. praisonai/cli/features/templates.py +1384 -0
  162. praisonai/cli/features/thinking.py +305 -0
  163. praisonai/cli/features/todo.py +334 -0
  164. praisonai/cli/features/tools.py +680 -0
  165. praisonai/cli/features/tui/__init__.py +83 -0
  166. praisonai/cli/features/tui/app.py +580 -0
  167. praisonai/cli/features/tui/cli.py +566 -0
  168. praisonai/cli/features/tui/debug.py +511 -0
  169. praisonai/cli/features/tui/events.py +99 -0
  170. praisonai/cli/features/tui/mock_provider.py +328 -0
  171. praisonai/cli/features/tui/orchestrator.py +652 -0
  172. praisonai/cli/features/tui/screens/__init__.py +50 -0
  173. praisonai/cli/features/tui/screens/main.py +245 -0
  174. praisonai/cli/features/tui/screens/queue.py +174 -0
  175. praisonai/cli/features/tui/screens/session.py +124 -0
  176. praisonai/cli/features/tui/screens/settings.py +148 -0
  177. praisonai/cli/features/tui/widgets/__init__.py +56 -0
  178. praisonai/cli/features/tui/widgets/chat.py +261 -0
  179. praisonai/cli/features/tui/widgets/composer.py +224 -0
  180. praisonai/cli/features/tui/widgets/queue_panel.py +200 -0
  181. praisonai/cli/features/tui/widgets/status.py +167 -0
  182. praisonai/cli/features/tui/widgets/tool_panel.py +248 -0
  183. praisonai/cli/features/workflow.py +720 -0
  184. praisonai/cli/legacy.py +236 -0
  185. praisonai/cli/main.py +5559 -0
  186. praisonai/cli/schedule_cli.py +54 -0
  187. praisonai/cli/state/__init__.py +31 -0
  188. praisonai/cli/state/identifiers.py +161 -0
  189. praisonai/cli/state/sessions.py +313 -0
  190. praisonai/code/__init__.py +93 -0
  191. praisonai/code/agent_tools.py +344 -0
  192. praisonai/code/diff/__init__.py +21 -0
  193. praisonai/code/diff/diff_strategy.py +432 -0
  194. praisonai/code/tools/__init__.py +27 -0
  195. praisonai/code/tools/apply_diff.py +221 -0
  196. praisonai/code/tools/execute_command.py +275 -0
  197. praisonai/code/tools/list_files.py +274 -0
  198. praisonai/code/tools/read_file.py +206 -0
  199. praisonai/code/tools/search_replace.py +248 -0
  200. praisonai/code/tools/write_file.py +217 -0
  201. praisonai/code/utils/__init__.py +46 -0
  202. praisonai/code/utils/file_utils.py +307 -0
  203. praisonai/code/utils/ignore_utils.py +308 -0
  204. praisonai/code/utils/text_utils.py +276 -0
  205. praisonai/db/__init__.py +64 -0
  206. praisonai/db/adapter.py +531 -0
  207. praisonai/deploy/__init__.py +62 -0
  208. praisonai/deploy/api.py +231 -0
  209. praisonai/deploy/docker.py +454 -0
  210. praisonai/deploy/doctor.py +367 -0
  211. praisonai/deploy/main.py +327 -0
  212. praisonai/deploy/models.py +179 -0
  213. praisonai/deploy/providers/__init__.py +33 -0
  214. praisonai/deploy/providers/aws.py +331 -0
  215. praisonai/deploy/providers/azure.py +358 -0
  216. praisonai/deploy/providers/base.py +101 -0
  217. praisonai/deploy/providers/gcp.py +314 -0
  218. praisonai/deploy/schema.py +208 -0
  219. praisonai/deploy.py +185 -0
  220. praisonai/endpoints/__init__.py +53 -0
  221. praisonai/endpoints/a2u_server.py +410 -0
  222. praisonai/endpoints/discovery.py +165 -0
  223. praisonai/endpoints/providers/__init__.py +28 -0
  224. praisonai/endpoints/providers/a2a.py +253 -0
  225. praisonai/endpoints/providers/a2u.py +208 -0
  226. praisonai/endpoints/providers/agents_api.py +171 -0
  227. praisonai/endpoints/providers/base.py +231 -0
  228. praisonai/endpoints/providers/mcp.py +263 -0
  229. praisonai/endpoints/providers/recipe.py +206 -0
  230. praisonai/endpoints/providers/tools_mcp.py +150 -0
  231. praisonai/endpoints/registry.py +131 -0
  232. praisonai/endpoints/server.py +161 -0
  233. praisonai/inbuilt_tools/__init__.py +24 -0
  234. praisonai/inbuilt_tools/autogen_tools.py +117 -0
  235. praisonai/inc/__init__.py +2 -0
  236. praisonai/inc/config.py +96 -0
  237. praisonai/inc/models.py +155 -0
  238. praisonai/integrations/__init__.py +56 -0
  239. praisonai/integrations/base.py +303 -0
  240. praisonai/integrations/claude_code.py +270 -0
  241. praisonai/integrations/codex_cli.py +255 -0
  242. praisonai/integrations/cursor_cli.py +195 -0
  243. praisonai/integrations/gemini_cli.py +222 -0
  244. praisonai/jobs/__init__.py +67 -0
  245. praisonai/jobs/executor.py +425 -0
  246. praisonai/jobs/models.py +230 -0
  247. praisonai/jobs/router.py +314 -0
  248. praisonai/jobs/server.py +186 -0
  249. praisonai/jobs/store.py +203 -0
  250. praisonai/llm/__init__.py +66 -0
  251. praisonai/llm/registry.py +382 -0
  252. praisonai/mcp_server/__init__.py +152 -0
  253. praisonai/mcp_server/adapters/__init__.py +74 -0
  254. praisonai/mcp_server/adapters/agents.py +128 -0
  255. praisonai/mcp_server/adapters/capabilities.py +168 -0
  256. praisonai/mcp_server/adapters/cli_tools.py +568 -0
  257. praisonai/mcp_server/adapters/extended_capabilities.py +462 -0
  258. praisonai/mcp_server/adapters/knowledge.py +93 -0
  259. praisonai/mcp_server/adapters/memory.py +104 -0
  260. praisonai/mcp_server/adapters/prompts.py +306 -0
  261. praisonai/mcp_server/adapters/resources.py +124 -0
  262. praisonai/mcp_server/adapters/tools_bridge.py +280 -0
  263. praisonai/mcp_server/auth/__init__.py +48 -0
  264. praisonai/mcp_server/auth/api_key.py +291 -0
  265. praisonai/mcp_server/auth/oauth.py +460 -0
  266. praisonai/mcp_server/auth/oidc.py +289 -0
  267. praisonai/mcp_server/auth/scopes.py +260 -0
  268. praisonai/mcp_server/cli.py +852 -0
  269. praisonai/mcp_server/elicitation.py +445 -0
  270. praisonai/mcp_server/icons.py +302 -0
  271. praisonai/mcp_server/recipe_adapter.py +573 -0
  272. praisonai/mcp_server/recipe_cli.py +824 -0
  273. praisonai/mcp_server/registry.py +703 -0
  274. praisonai/mcp_server/sampling.py +422 -0
  275. praisonai/mcp_server/server.py +490 -0
  276. praisonai/mcp_server/tasks.py +443 -0
  277. praisonai/mcp_server/transports/__init__.py +18 -0
  278. praisonai/mcp_server/transports/http_stream.py +376 -0
  279. praisonai/mcp_server/transports/stdio.py +132 -0
  280. praisonai/persistence/__init__.py +84 -0
  281. praisonai/persistence/config.py +238 -0
  282. praisonai/persistence/conversation/__init__.py +25 -0
  283. praisonai/persistence/conversation/async_mysql.py +427 -0
  284. praisonai/persistence/conversation/async_postgres.py +410 -0
  285. praisonai/persistence/conversation/async_sqlite.py +371 -0
  286. praisonai/persistence/conversation/base.py +151 -0
  287. praisonai/persistence/conversation/json_store.py +250 -0
  288. praisonai/persistence/conversation/mysql.py +387 -0
  289. praisonai/persistence/conversation/postgres.py +401 -0
  290. praisonai/persistence/conversation/singlestore.py +240 -0
  291. praisonai/persistence/conversation/sqlite.py +341 -0
  292. praisonai/persistence/conversation/supabase.py +203 -0
  293. praisonai/persistence/conversation/surrealdb.py +287 -0
  294. praisonai/persistence/factory.py +301 -0
  295. praisonai/persistence/hooks/__init__.py +18 -0
  296. praisonai/persistence/hooks/agent_hooks.py +297 -0
  297. praisonai/persistence/knowledge/__init__.py +26 -0
  298. praisonai/persistence/knowledge/base.py +144 -0
  299. praisonai/persistence/knowledge/cassandra.py +232 -0
  300. praisonai/persistence/knowledge/chroma.py +295 -0
  301. praisonai/persistence/knowledge/clickhouse.py +242 -0
  302. praisonai/persistence/knowledge/cosmosdb_vector.py +438 -0
  303. praisonai/persistence/knowledge/couchbase.py +286 -0
  304. praisonai/persistence/knowledge/lancedb.py +216 -0
  305. praisonai/persistence/knowledge/langchain_adapter.py +291 -0
  306. praisonai/persistence/knowledge/lightrag_adapter.py +212 -0
  307. praisonai/persistence/knowledge/llamaindex_adapter.py +256 -0
  308. praisonai/persistence/knowledge/milvus.py +277 -0
  309. praisonai/persistence/knowledge/mongodb_vector.py +306 -0
  310. praisonai/persistence/knowledge/pgvector.py +335 -0
  311. praisonai/persistence/knowledge/pinecone.py +253 -0
  312. praisonai/persistence/knowledge/qdrant.py +301 -0
  313. praisonai/persistence/knowledge/redis_vector.py +291 -0
  314. praisonai/persistence/knowledge/singlestore_vector.py +299 -0
  315. praisonai/persistence/knowledge/surrealdb_vector.py +309 -0
  316. praisonai/persistence/knowledge/upstash_vector.py +266 -0
  317. praisonai/persistence/knowledge/weaviate.py +223 -0
  318. praisonai/persistence/migrations/__init__.py +10 -0
  319. praisonai/persistence/migrations/manager.py +251 -0
  320. praisonai/persistence/orchestrator.py +406 -0
  321. praisonai/persistence/state/__init__.py +21 -0
  322. praisonai/persistence/state/async_mongodb.py +200 -0
  323. praisonai/persistence/state/base.py +107 -0
  324. praisonai/persistence/state/dynamodb.py +226 -0
  325. praisonai/persistence/state/firestore.py +175 -0
  326. praisonai/persistence/state/gcs.py +155 -0
  327. praisonai/persistence/state/memory.py +245 -0
  328. praisonai/persistence/state/mongodb.py +158 -0
  329. praisonai/persistence/state/redis.py +190 -0
  330. praisonai/persistence/state/upstash.py +144 -0
  331. praisonai/persistence/tests/__init__.py +3 -0
  332. praisonai/persistence/tests/test_all_backends.py +633 -0
  333. praisonai/profiler.py +1214 -0
  334. praisonai/recipe/__init__.py +134 -0
  335. praisonai/recipe/bridge.py +278 -0
  336. praisonai/recipe/core.py +893 -0
  337. praisonai/recipe/exceptions.py +54 -0
  338. praisonai/recipe/history.py +402 -0
  339. praisonai/recipe/models.py +266 -0
  340. praisonai/recipe/operations.py +440 -0
  341. praisonai/recipe/policy.py +422 -0
  342. praisonai/recipe/registry.py +849 -0
  343. praisonai/recipe/runtime.py +214 -0
  344. praisonai/recipe/security.py +711 -0
  345. praisonai/recipe/serve.py +859 -0
  346. praisonai/recipe/server.py +613 -0
  347. praisonai/scheduler/__init__.py +45 -0
  348. praisonai/scheduler/agent_scheduler.py +552 -0
  349. praisonai/scheduler/base.py +124 -0
  350. praisonai/scheduler/daemon_manager.py +225 -0
  351. praisonai/scheduler/state_manager.py +155 -0
  352. praisonai/scheduler/yaml_loader.py +193 -0
  353. praisonai/scheduler.py +194 -0
  354. praisonai/setup/__init__.py +1 -0
  355. praisonai/setup/build.py +21 -0
  356. praisonai/setup/post_install.py +23 -0
  357. praisonai/setup/setup_conda_env.py +25 -0
  358. praisonai/setup.py +16 -0
  359. praisonai/templates/__init__.py +116 -0
  360. praisonai/templates/cache.py +364 -0
  361. praisonai/templates/dependency_checker.py +358 -0
  362. praisonai/templates/discovery.py +391 -0
  363. praisonai/templates/loader.py +564 -0
  364. praisonai/templates/registry.py +511 -0
  365. praisonai/templates/resolver.py +206 -0
  366. praisonai/templates/security.py +327 -0
  367. praisonai/templates/tool_override.py +498 -0
  368. praisonai/templates/tools_doctor.py +256 -0
  369. praisonai/test.py +105 -0
  370. praisonai/train.py +562 -0
  371. praisonai/train_vision.py +306 -0
  372. praisonai/ui/agents.py +824 -0
  373. praisonai/ui/callbacks.py +57 -0
  374. praisonai/ui/chainlit_compat.py +246 -0
  375. praisonai/ui/chat.py +532 -0
  376. praisonai/ui/code.py +717 -0
  377. praisonai/ui/colab.py +474 -0
  378. praisonai/ui/colab_chainlit.py +81 -0
  379. praisonai/ui/components/aicoder.py +284 -0
  380. praisonai/ui/context.py +283 -0
  381. praisonai/ui/database_config.py +56 -0
  382. praisonai/ui/db.py +294 -0
  383. praisonai/ui/realtime.py +488 -0
  384. praisonai/ui/realtimeclient/__init__.py +756 -0
  385. praisonai/ui/realtimeclient/tools.py +242 -0
  386. praisonai/ui/sql_alchemy.py +710 -0
  387. praisonai/upload_vision.py +140 -0
  388. praisonai/version.py +1 -0
  389. praisonai-3.0.0.dist-info/METADATA +3493 -0
  390. praisonai-3.0.0.dist-info/RECORD +393 -0
  391. praisonai-3.0.0.dist-info/WHEEL +5 -0
  392. praisonai-3.0.0.dist-info/entry_points.txt +4 -0
  393. praisonai-3.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,270 @@
1
+ """
2
+ Messages Capabilities Module
3
+
4
+ Provides Anthropic-style messages API functionality via LiteLLM.
5
+ """
6
+
7
+ from dataclasses import dataclass, field
8
+ from typing import Optional, Any, Dict, List
9
+
10
+
11
+ @dataclass
12
+ class MessageResult:
13
+ """Result from message operations."""
14
+ id: str
15
+ content: Optional[List[Dict[str, Any]]] = None
16
+ role: str = "assistant"
17
+ model: Optional[str] = None
18
+ stop_reason: Optional[str] = None
19
+ usage: Optional[Dict[str, int]] = None
20
+ metadata: Dict[str, Any] = field(default_factory=dict)
21
+
22
+
23
+ @dataclass
24
+ class TokenCountResult:
25
+ """Result from token counting."""
26
+ input_tokens: int
27
+ model: Optional[str] = None
28
+ metadata: Dict[str, Any] = field(default_factory=dict)
29
+
30
+
31
+ def messages_create(
32
+ messages: List[Dict[str, Any]],
33
+ model: str = "claude-3-5-sonnet-20241022",
34
+ max_tokens: int = 1024,
35
+ system: Optional[str] = None,
36
+ temperature: float = 1.0,
37
+ tools: Optional[List[Dict[str, Any]]] = None,
38
+ timeout: float = 600.0,
39
+ api_key: Optional[str] = None,
40
+ api_base: Optional[str] = None,
41
+ metadata: Optional[Dict[str, Any]] = None,
42
+ **kwargs
43
+ ) -> MessageResult:
44
+ """
45
+ Create a message using Anthropic-style API.
46
+
47
+ Args:
48
+ messages: List of messages
49
+ model: Model to use (e.g., "claude-3-5-sonnet-20241022")
50
+ max_tokens: Maximum tokens to generate
51
+ system: System prompt
52
+ temperature: Sampling temperature
53
+ tools: List of tools
54
+ timeout: Request timeout in seconds
55
+ api_key: Optional API key override
56
+ api_base: Optional API base URL override
57
+ metadata: Optional metadata for tracing
58
+
59
+ Returns:
60
+ MessageResult with response
61
+
62
+ Example:
63
+ >>> result = messages_create([{"role": "user", "content": "Hello"}])
64
+ >>> print(result.content)
65
+ """
66
+ import litellm
67
+
68
+ # Convert to LiteLLM format
69
+ litellm_messages = []
70
+ if system:
71
+ litellm_messages.append({"role": "system", "content": system})
72
+ litellm_messages.extend(messages)
73
+
74
+ call_kwargs = {
75
+ 'model': model,
76
+ 'messages': litellm_messages,
77
+ 'max_tokens': max_tokens,
78
+ 'temperature': temperature,
79
+ 'timeout': timeout,
80
+ }
81
+
82
+ if tools:
83
+ call_kwargs['tools'] = tools
84
+ if api_key:
85
+ call_kwargs['api_key'] = api_key
86
+ if api_base:
87
+ call_kwargs['api_base'] = api_base
88
+
89
+ call_kwargs.update(kwargs)
90
+
91
+ if metadata:
92
+ call_kwargs['metadata'] = metadata
93
+
94
+ response = litellm.completion(**call_kwargs)
95
+
96
+ choice = response.choices[0] if response.choices else None
97
+ message = choice.message if choice else None
98
+
99
+ # Convert to Anthropic-style content blocks
100
+ content = None
101
+ if message and message.content:
102
+ content = [{"type": "text", "text": message.content}]
103
+
104
+ usage = None
105
+ if hasattr(response, 'usage') and response.usage:
106
+ usage = {
107
+ 'input_tokens': getattr(response.usage, 'prompt_tokens', 0),
108
+ 'output_tokens': getattr(response.usage, 'completion_tokens', 0),
109
+ }
110
+
111
+ return MessageResult(
112
+ id=getattr(response, 'id', ''),
113
+ content=content,
114
+ role=getattr(message, 'role', 'assistant') if message else 'assistant',
115
+ model=getattr(response, 'model', model),
116
+ stop_reason=getattr(choice, 'finish_reason', None) if choice else None,
117
+ usage=usage,
118
+ metadata=metadata or {},
119
+ )
120
+
121
+
122
+ async def amessages_create(
123
+ messages: List[Dict[str, Any]],
124
+ model: str = "claude-3-5-sonnet-20241022",
125
+ max_tokens: int = 1024,
126
+ system: Optional[str] = None,
127
+ temperature: float = 1.0,
128
+ tools: Optional[List[Dict[str, Any]]] = None,
129
+ timeout: float = 600.0,
130
+ api_key: Optional[str] = None,
131
+ api_base: Optional[str] = None,
132
+ metadata: Optional[Dict[str, Any]] = None,
133
+ **kwargs
134
+ ) -> MessageResult:
135
+ """
136
+ Async: Create a message using Anthropic-style API.
137
+
138
+ See messages_create() for full documentation.
139
+ """
140
+ import litellm
141
+
142
+ litellm_messages = []
143
+ if system:
144
+ litellm_messages.append({"role": "system", "content": system})
145
+ litellm_messages.extend(messages)
146
+
147
+ call_kwargs = {
148
+ 'model': model,
149
+ 'messages': litellm_messages,
150
+ 'max_tokens': max_tokens,
151
+ 'temperature': temperature,
152
+ 'timeout': timeout,
153
+ }
154
+
155
+ if tools:
156
+ call_kwargs['tools'] = tools
157
+ if api_key:
158
+ call_kwargs['api_key'] = api_key
159
+ if api_base:
160
+ call_kwargs['api_base'] = api_base
161
+
162
+ call_kwargs.update(kwargs)
163
+
164
+ if metadata:
165
+ call_kwargs['metadata'] = metadata
166
+
167
+ response = await litellm.acompletion(**call_kwargs)
168
+
169
+ choice = response.choices[0] if response.choices else None
170
+ message = choice.message if choice else None
171
+
172
+ content = None
173
+ if message and message.content:
174
+ content = [{"type": "text", "text": message.content}]
175
+
176
+ usage = None
177
+ if hasattr(response, 'usage') and response.usage:
178
+ usage = {
179
+ 'input_tokens': getattr(response.usage, 'prompt_tokens', 0),
180
+ 'output_tokens': getattr(response.usage, 'completion_tokens', 0),
181
+ }
182
+
183
+ return MessageResult(
184
+ id=getattr(response, 'id', ''),
185
+ content=content,
186
+ role=getattr(message, 'role', 'assistant') if message else 'assistant',
187
+ model=getattr(response, 'model', model),
188
+ stop_reason=getattr(choice, 'finish_reason', None) if choice else None,
189
+ usage=usage,
190
+ metadata=metadata or {},
191
+ )
192
+
193
+
194
+ def count_tokens(
195
+ messages: List[Dict[str, Any]],
196
+ model: str = "gpt-4o-mini",
197
+ system: Optional[str] = None,
198
+ api_key: Optional[str] = None,
199
+ metadata: Optional[Dict[str, Any]] = None,
200
+ **kwargs
201
+ ) -> TokenCountResult:
202
+ """
203
+ Count tokens in messages.
204
+
205
+ Args:
206
+ messages: List of messages
207
+ model: Model to use for tokenization
208
+ system: System prompt
209
+ api_key: Optional API key override
210
+ metadata: Optional metadata for tracing
211
+
212
+ Returns:
213
+ TokenCountResult with token count
214
+
215
+ Example:
216
+ >>> result = count_tokens([{"role": "user", "content": "Hello"}])
217
+ >>> print(result.input_tokens)
218
+ """
219
+ import litellm
220
+
221
+ all_messages = []
222
+ if system:
223
+ all_messages.append({"role": "system", "content": system})
224
+ all_messages.extend(messages)
225
+
226
+ try:
227
+ token_count = litellm.token_counter(model=model, messages=all_messages)
228
+ except Exception:
229
+ # Fallback: estimate tokens
230
+ text = ""
231
+ for msg in all_messages:
232
+ content = msg.get("content", "")
233
+ if isinstance(content, str):
234
+ text += content
235
+ elif isinstance(content, list):
236
+ for item in content:
237
+ if isinstance(item, dict) and item.get("type") == "text":
238
+ text += item.get("text", "")
239
+ # Rough estimate: 4 chars per token
240
+ token_count = len(text) // 4
241
+
242
+ return TokenCountResult(
243
+ input_tokens=token_count,
244
+ model=model,
245
+ metadata=metadata or {},
246
+ )
247
+
248
+
249
+ async def acount_tokens(
250
+ messages: List[Dict[str, Any]],
251
+ model: str = "gpt-4o-mini",
252
+ system: Optional[str] = None,
253
+ api_key: Optional[str] = None,
254
+ metadata: Optional[Dict[str, Any]] = None,
255
+ **kwargs
256
+ ) -> TokenCountResult:
257
+ """
258
+ Async: Count tokens in messages.
259
+
260
+ See count_tokens() for full documentation.
261
+ """
262
+ # Token counting is synchronous, just wrap it
263
+ return count_tokens(
264
+ messages=messages,
265
+ model=model,
266
+ system=system,
267
+ api_key=api_key,
268
+ metadata=metadata,
269
+ **kwargs
270
+ )
@@ -0,0 +1,154 @@
1
+ """
2
+ Moderations Capabilities Module
3
+
4
+ Provides content moderation functionality via LiteLLM.
5
+ """
6
+
7
+ from dataclasses import dataclass, field
8
+ from typing import Optional, Union, List, Any, Dict
9
+
10
+
11
+ @dataclass
12
+ class ModerationResult:
13
+ """Result from content moderation."""
14
+ flagged: bool
15
+ categories: Dict[str, bool] = field(default_factory=dict)
16
+ category_scores: Dict[str, float] = field(default_factory=dict)
17
+ model: Optional[str] = None
18
+ metadata: Dict[str, Any] = field(default_factory=dict)
19
+
20
+
21
+ def moderate(
22
+ input: Union[str, List[str]],
23
+ model: str = "omni-moderation-latest",
24
+ timeout: float = 600.0,
25
+ api_key: Optional[str] = None,
26
+ api_base: Optional[str] = None,
27
+ metadata: Optional[Dict[str, Any]] = None,
28
+ **kwargs
29
+ ) -> List[ModerationResult]:
30
+ """
31
+ Check content for policy violations.
32
+
33
+ Args:
34
+ input: Text or list of texts to moderate
35
+ model: Model name (e.g., "text-moderation-latest", "text-moderation-stable")
36
+ timeout: Request timeout in seconds
37
+ api_key: Optional API key override
38
+ api_base: Optional API base URL override
39
+ metadata: Optional metadata for tracing
40
+
41
+ Returns:
42
+ List of ModerationResult objects
43
+
44
+ Example:
45
+ >>> results = moderate("Some text to check")
46
+ >>> if results[0].flagged:
47
+ ... print("Content flagged!")
48
+ """
49
+ import litellm
50
+
51
+ call_kwargs = {
52
+ 'input': input,
53
+ 'model': model,
54
+ 'timeout': timeout,
55
+ }
56
+
57
+ if api_key:
58
+ call_kwargs['api_key'] = api_key
59
+ if api_base:
60
+ call_kwargs['api_base'] = api_base
61
+
62
+ call_kwargs.update(kwargs)
63
+
64
+ if metadata:
65
+ call_kwargs['metadata'] = metadata
66
+
67
+ response = litellm.moderation(**call_kwargs)
68
+
69
+ results = []
70
+ if hasattr(response, 'results'):
71
+ for item in response.results:
72
+ categories = {}
73
+ category_scores = {}
74
+
75
+ if hasattr(item, 'categories'):
76
+ for cat_name in dir(item.categories):
77
+ if not cat_name.startswith('_'):
78
+ categories[cat_name] = getattr(item.categories, cat_name, False)
79
+
80
+ if hasattr(item, 'category_scores'):
81
+ for cat_name in dir(item.category_scores):
82
+ if not cat_name.startswith('_'):
83
+ category_scores[cat_name] = getattr(item.category_scores, cat_name, 0.0)
84
+
85
+ results.append(ModerationResult(
86
+ flagged=getattr(item, 'flagged', False),
87
+ categories=categories,
88
+ category_scores=category_scores,
89
+ model=model,
90
+ metadata=metadata or {},
91
+ ))
92
+
93
+ return results
94
+
95
+
96
+ async def amoderate(
97
+ input: Union[str, List[str]],
98
+ model: str = "text-moderation-latest",
99
+ timeout: float = 600.0,
100
+ api_key: Optional[str] = None,
101
+ api_base: Optional[str] = None,
102
+ metadata: Optional[Dict[str, Any]] = None,
103
+ **kwargs
104
+ ) -> List[ModerationResult]:
105
+ """
106
+ Async: Check content for policy violations.
107
+
108
+ See moderate() for full documentation.
109
+ """
110
+ import litellm
111
+
112
+ call_kwargs = {
113
+ 'input': input,
114
+ 'model': model,
115
+ 'timeout': timeout,
116
+ }
117
+
118
+ if api_key:
119
+ call_kwargs['api_key'] = api_key
120
+ if api_base:
121
+ call_kwargs['api_base'] = api_base
122
+
123
+ call_kwargs.update(kwargs)
124
+
125
+ if metadata:
126
+ call_kwargs['metadata'] = metadata
127
+
128
+ response = await litellm.amoderation(**call_kwargs)
129
+
130
+ results = []
131
+ if hasattr(response, 'results'):
132
+ for item in response.results:
133
+ categories = {}
134
+ category_scores = {}
135
+
136
+ if hasattr(item, 'categories'):
137
+ for cat_name in dir(item.categories):
138
+ if not cat_name.startswith('_'):
139
+ categories[cat_name] = getattr(item.categories, cat_name, False)
140
+
141
+ if hasattr(item, 'category_scores'):
142
+ for cat_name in dir(item.category_scores):
143
+ if not cat_name.startswith('_'):
144
+ category_scores[cat_name] = getattr(item.category_scores, cat_name, 0.0)
145
+
146
+ results.append(ModerationResult(
147
+ flagged=getattr(item, 'flagged', False),
148
+ categories=categories,
149
+ category_scores=category_scores,
150
+ model=model,
151
+ metadata=metadata or {},
152
+ ))
153
+
154
+ return results
@@ -0,0 +1,217 @@
1
+ """
2
+ OCR Capabilities Module
3
+
4
+ Provides optical character recognition functionality via LiteLLM.
5
+ """
6
+
7
+ from dataclasses import dataclass, field
8
+ from typing import Optional, Union, List, Any, Dict
9
+
10
+
11
+ @dataclass
12
+ class OCRResult:
13
+ """Result from OCR processing."""
14
+ text: str
15
+ pages: Optional[List[Dict[str, Any]]] = None
16
+ model: Optional[str] = None
17
+ usage: Optional[Dict[str, int]] = None
18
+ metadata: Dict[str, Any] = field(default_factory=dict)
19
+
20
+
21
+ def ocr(
22
+ document: Union[str, Dict[str, str]],
23
+ model: str = "mistral/mistral-ocr-latest",
24
+ include_image_base64: bool = False,
25
+ pages: Optional[List[int]] = None,
26
+ image_limit: Optional[int] = None,
27
+ timeout: float = 600.0,
28
+ api_key: Optional[str] = None,
29
+ api_base: Optional[str] = None,
30
+ metadata: Optional[Dict[str, Any]] = None,
31
+ **kwargs
32
+ ) -> OCRResult:
33
+ """
34
+ Extract text from documents or images using OCR.
35
+
36
+ Args:
37
+ document: Document URL, file path, or dict with type and URL
38
+ - String: treated as URL or file path
39
+ - Dict: {"type": "document_url", "document_url": "https://..."} or
40
+ {"type": "image_url", "image_url": "https://..."}
41
+ model: Model name (e.g., "mistral/mistral-ocr-latest")
42
+ include_image_base64: Whether to include base64 images in response
43
+ pages: Specific pages to process (for PDFs)
44
+ image_limit: Maximum number of images to process
45
+ timeout: Request timeout in seconds
46
+ api_key: Optional API key override
47
+ api_base: Optional API base URL override
48
+ metadata: Optional metadata for tracing
49
+
50
+ Returns:
51
+ OCRResult with extracted text
52
+
53
+ Example:
54
+ >>> result = ocr("https://example.com/document.pdf")
55
+ >>> print(result.text)
56
+
57
+ >>> result = ocr({"type": "image_url", "image_url": "https://example.com/image.png"})
58
+ """
59
+ import litellm
60
+
61
+ # Handle document input
62
+ doc_input = document
63
+ if isinstance(document, str):
64
+ # Check if it's a URL or file path
65
+ if document.startswith(('http://', 'https://')):
66
+ if document.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.webp')):
67
+ doc_input = {"type": "image_url", "image_url": document}
68
+ else:
69
+ doc_input = {"type": "document_url", "document_url": document}
70
+ else:
71
+ # Local file - read and encode as base64
72
+ import base64
73
+ with open(document, 'rb') as f:
74
+ content = base64.b64encode(f.read()).decode('utf-8')
75
+ if document.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.webp')):
76
+ doc_input = {"type": "image_url", "image_url": f"data:image/png;base64,{content}"}
77
+ else:
78
+ doc_input = {"type": "document_url", "document_url": f"data:application/pdf;base64,{content}"}
79
+
80
+ call_kwargs = {
81
+ 'model': model,
82
+ 'document': doc_input,
83
+ 'timeout': timeout,
84
+ }
85
+
86
+ if include_image_base64:
87
+ call_kwargs['include_image_base64'] = include_image_base64
88
+ if pages:
89
+ call_kwargs['pages'] = pages
90
+ if image_limit:
91
+ call_kwargs['image_limit'] = image_limit
92
+ if api_key:
93
+ call_kwargs['api_key'] = api_key
94
+ if api_base:
95
+ call_kwargs['api_base'] = api_base
96
+
97
+ call_kwargs.update(kwargs)
98
+
99
+ if metadata:
100
+ call_kwargs['metadata'] = metadata
101
+
102
+ response = litellm.ocr(**call_kwargs)
103
+
104
+ # Extract text from pages
105
+ text_parts = []
106
+ pages_data = []
107
+ if hasattr(response, 'pages'):
108
+ for page in response.pages:
109
+ page_text = getattr(page, 'markdown', '') or getattr(page, 'text', '')
110
+ text_parts.append(page_text)
111
+ pages_data.append({
112
+ 'index': getattr(page, 'index', 0),
113
+ 'markdown': getattr(page, 'markdown', ''),
114
+ 'images': getattr(page, 'images', []),
115
+ })
116
+
117
+ usage = None
118
+ if hasattr(response, 'usage_info'):
119
+ usage = {
120
+ 'pages_processed': getattr(response.usage_info, 'pages_processed', 0),
121
+ 'doc_size_bytes': getattr(response.usage_info, 'doc_size_bytes', 0),
122
+ }
123
+
124
+ return OCRResult(
125
+ text='\n\n'.join(text_parts),
126
+ pages=pages_data if pages_data else None,
127
+ model=model,
128
+ usage=usage,
129
+ metadata=metadata or {},
130
+ )
131
+
132
+
133
+ async def aocr(
134
+ document: Union[str, Dict[str, str]],
135
+ model: str = "mistral/mistral-ocr-latest",
136
+ include_image_base64: bool = False,
137
+ pages: Optional[List[int]] = None,
138
+ image_limit: Optional[int] = None,
139
+ timeout: float = 600.0,
140
+ api_key: Optional[str] = None,
141
+ api_base: Optional[str] = None,
142
+ metadata: Optional[Dict[str, Any]] = None,
143
+ **kwargs
144
+ ) -> OCRResult:
145
+ """
146
+ Async: Extract text from documents or images using OCR.
147
+
148
+ See ocr() for full documentation.
149
+ """
150
+ import litellm
151
+
152
+ doc_input = document
153
+ if isinstance(document, str):
154
+ if document.startswith(('http://', 'https://')):
155
+ if document.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.webp')):
156
+ doc_input = {"type": "image_url", "image_url": document}
157
+ else:
158
+ doc_input = {"type": "document_url", "document_url": document}
159
+ else:
160
+ import base64
161
+ with open(document, 'rb') as f:
162
+ content = base64.b64encode(f.read()).decode('utf-8')
163
+ if document.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.webp')):
164
+ doc_input = {"type": "image_url", "image_url": f"data:image/png;base64,{content}"}
165
+ else:
166
+ doc_input = {"type": "document_url", "document_url": f"data:application/pdf;base64,{content}"}
167
+
168
+ call_kwargs = {
169
+ 'model': model,
170
+ 'document': doc_input,
171
+ 'timeout': timeout,
172
+ }
173
+
174
+ if include_image_base64:
175
+ call_kwargs['include_image_base64'] = include_image_base64
176
+ if pages:
177
+ call_kwargs['pages'] = pages
178
+ if image_limit:
179
+ call_kwargs['image_limit'] = image_limit
180
+ if api_key:
181
+ call_kwargs['api_key'] = api_key
182
+ if api_base:
183
+ call_kwargs['api_base'] = api_base
184
+
185
+ call_kwargs.update(kwargs)
186
+
187
+ if metadata:
188
+ call_kwargs['metadata'] = metadata
189
+
190
+ response = await litellm.aocr(**call_kwargs)
191
+
192
+ text_parts = []
193
+ pages_data = []
194
+ if hasattr(response, 'pages'):
195
+ for page in response.pages:
196
+ page_text = getattr(page, 'markdown', '') or getattr(page, 'text', '')
197
+ text_parts.append(page_text)
198
+ pages_data.append({
199
+ 'index': getattr(page, 'index', 0),
200
+ 'markdown': getattr(page, 'markdown', ''),
201
+ 'images': getattr(page, 'images', []),
202
+ })
203
+
204
+ usage = None
205
+ if hasattr(response, 'usage_info'):
206
+ usage = {
207
+ 'pages_processed': getattr(response.usage_info, 'pages_processed', 0),
208
+ 'doc_size_bytes': getattr(response.usage_info, 'doc_size_bytes', 0),
209
+ }
210
+
211
+ return OCRResult(
212
+ text='\n\n'.join(text_parts),
213
+ pages=pages_data if pages_data else None,
214
+ model=model,
215
+ usage=usage,
216
+ metadata=metadata or {},
217
+ )