aixtools 0.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.

Potentially problematic release.


This version of aixtools might be problematic. Click here for more details.

Files changed (88) hide show
  1. aixtools/.chainlit/config.toml +113 -0
  2. aixtools/.chainlit/translations/bn.json +214 -0
  3. aixtools/.chainlit/translations/en-US.json +214 -0
  4. aixtools/.chainlit/translations/gu.json +214 -0
  5. aixtools/.chainlit/translations/he-IL.json +214 -0
  6. aixtools/.chainlit/translations/hi.json +214 -0
  7. aixtools/.chainlit/translations/ja.json +214 -0
  8. aixtools/.chainlit/translations/kn.json +214 -0
  9. aixtools/.chainlit/translations/ml.json +214 -0
  10. aixtools/.chainlit/translations/mr.json +214 -0
  11. aixtools/.chainlit/translations/nl.json +214 -0
  12. aixtools/.chainlit/translations/ta.json +214 -0
  13. aixtools/.chainlit/translations/te.json +214 -0
  14. aixtools/.chainlit/translations/zh-CN.json +214 -0
  15. aixtools/__init__.py +11 -0
  16. aixtools/_version.py +34 -0
  17. aixtools/a2a/app.py +126 -0
  18. aixtools/a2a/google_sdk/__init__.py +0 -0
  19. aixtools/a2a/google_sdk/card.py +27 -0
  20. aixtools/a2a/google_sdk/pydantic_ai_adapter/agent_executor.py +199 -0
  21. aixtools/a2a/google_sdk/pydantic_ai_adapter/storage.py +26 -0
  22. aixtools/a2a/google_sdk/remote_agent_connection.py +88 -0
  23. aixtools/a2a/google_sdk/utils.py +59 -0
  24. aixtools/a2a/utils.py +115 -0
  25. aixtools/agents/__init__.py +12 -0
  26. aixtools/agents/agent.py +164 -0
  27. aixtools/agents/agent_batch.py +71 -0
  28. aixtools/agents/prompt.py +97 -0
  29. aixtools/app.py +143 -0
  30. aixtools/chainlit.md +14 -0
  31. aixtools/compliance/__init__.py +9 -0
  32. aixtools/compliance/private_data.py +138 -0
  33. aixtools/context.py +17 -0
  34. aixtools/db/__init__.py +17 -0
  35. aixtools/db/database.py +110 -0
  36. aixtools/db/vector_db.py +115 -0
  37. aixtools/google/client.py +25 -0
  38. aixtools/log_view/__init__.py +17 -0
  39. aixtools/log_view/app.py +195 -0
  40. aixtools/log_view/display.py +285 -0
  41. aixtools/log_view/export.py +51 -0
  42. aixtools/log_view/filters.py +41 -0
  43. aixtools/log_view/log_utils.py +26 -0
  44. aixtools/log_view/node_summary.py +229 -0
  45. aixtools/logfilters/__init__.py +7 -0
  46. aixtools/logfilters/context_filter.py +67 -0
  47. aixtools/logging/__init__.py +30 -0
  48. aixtools/logging/log_objects.py +227 -0
  49. aixtools/logging/logging_config.py +161 -0
  50. aixtools/logging/mcp_log_models.py +102 -0
  51. aixtools/logging/mcp_logger.py +172 -0
  52. aixtools/logging/model_patch_logging.py +87 -0
  53. aixtools/logging/open_telemetry.py +36 -0
  54. aixtools/mcp/__init__.py +9 -0
  55. aixtools/mcp/client.py +375 -0
  56. aixtools/mcp/example_client.py +30 -0
  57. aixtools/mcp/example_server.py +22 -0
  58. aixtools/mcp/fast_mcp_log.py +31 -0
  59. aixtools/mcp/faulty_mcp.py +319 -0
  60. aixtools/model_patch/model_patch.py +63 -0
  61. aixtools/server/__init__.py +29 -0
  62. aixtools/server/app_mounter.py +90 -0
  63. aixtools/server/path.py +72 -0
  64. aixtools/server/utils.py +70 -0
  65. aixtools/server/workspace_privacy.py +65 -0
  66. aixtools/testing/__init__.py +9 -0
  67. aixtools/testing/aix_test_model.py +149 -0
  68. aixtools/testing/mock_tool.py +66 -0
  69. aixtools/testing/model_patch_cache.py +279 -0
  70. aixtools/tools/doctor/__init__.py +3 -0
  71. aixtools/tools/doctor/tool_doctor.py +61 -0
  72. aixtools/tools/doctor/tool_recommendation.py +44 -0
  73. aixtools/utils/__init__.py +35 -0
  74. aixtools/utils/chainlit/cl_agent_show.py +82 -0
  75. aixtools/utils/chainlit/cl_utils.py +168 -0
  76. aixtools/utils/config.py +131 -0
  77. aixtools/utils/config_util.py +69 -0
  78. aixtools/utils/enum_with_description.py +37 -0
  79. aixtools/utils/files.py +17 -0
  80. aixtools/utils/persisted_dict.py +99 -0
  81. aixtools/utils/utils.py +167 -0
  82. aixtools/vault/__init__.py +7 -0
  83. aixtools/vault/vault.py +137 -0
  84. aixtools-0.0.0.dist-info/METADATA +669 -0
  85. aixtools-0.0.0.dist-info/RECORD +88 -0
  86. aixtools-0.0.0.dist-info/WHEEL +5 -0
  87. aixtools-0.0.0.dist-info/entry_points.txt +2 -0
  88. aixtools-0.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,214 @@
1
+ {
2
+ "common": {
3
+ "actions": {
4
+ "cancel": "\u0c30\u0c26\u0c4d\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
5
+ "confirm": "\u0c28\u0c3f\u0c30\u0c4d\u0c27\u0c3e\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
6
+ "continue": "\u0c15\u0c4a\u0c28\u0c38\u0c3e\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
7
+ "goBack": "\u0c35\u0c46\u0c28\u0c15\u0c4d\u0c15\u0c3f \u0c35\u0c46\u0c33\u0c4d\u0c33\u0c02\u0c21\u0c3f",
8
+ "reset": "\u0c30\u0c40\u0c38\u0c46\u0c1f\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
9
+ "submit": "\u0c38\u0c2e\u0c30\u0c4d\u0c2a\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f"
10
+ },
11
+ "status": {
12
+ "loading": "\u0c32\u0c4b\u0c21\u0c4d \u0c05\u0c35\u0c41\u0c24\u0c4b\u0c02\u0c26\u0c3f...",
13
+ "error": {
14
+ "default": "\u0c32\u0c4b\u0c2a\u0c02 \u0c38\u0c02\u0c2d\u0c35\u0c3f\u0c02\u0c1a\u0c3f\u0c02\u0c26\u0c3f",
15
+ "serverConnection": "\u0c38\u0c30\u0c4d\u0c35\u0c30\u0c4d\u200c\u0c28\u0c3f \u0c1a\u0c47\u0c30\u0c41\u0c15\u0c4b\u0c32\u0c47\u0c15\u0c2a\u0c4b\u0c2f\u0c3e\u0c2e\u0c41"
16
+ }
17
+ }
18
+ },
19
+ "auth": {
20
+ "login": {
21
+ "title": "\u0c2f\u0c3e\u0c2a\u0c4d\u200c\u0c28\u0c3f \u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c32\u0c3e\u0c17\u0c3f\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
22
+ "form": {
23
+ "email": {
24
+ "label": "\u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c1a\u0c3f\u0c30\u0c41\u0c28\u0c3e\u0c2e\u0c3e",
25
+ "required": "\u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c24\u0c2a\u0c4d\u0c2a\u0c28\u0c3f\u0c38\u0c30\u0c3f"
26
+ },
27
+ "password": {
28
+ "label": "\u0c2a\u0c3e\u0c38\u0c4d\u200c\u0c35\u0c30\u0c4d\u0c21\u0c4d",
29
+ "required": "\u0c2a\u0c3e\u0c38\u0c4d\u200c\u0c35\u0c30\u0c4d\u0c21\u0c4d \u0c24\u0c2a\u0c4d\u0c2a\u0c28\u0c3f\u0c38\u0c30\u0c3f"
30
+ },
31
+ "actions": {
32
+ "signin": "\u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f"
33
+ },
34
+ "alternativeText": {
35
+ "or": "\u0c32\u0c47\u0c26\u0c3e"
36
+ }
37
+ },
38
+ "errors": {
39
+ "default": "\u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c32\u0c47\u0c15\u0c2a\u0c4b\u0c2f\u0c3e\u0c2e\u0c41",
40
+ "signin": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
41
+ "oauthSignin": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
42
+ "redirectUriMismatch": "\u0c30\u0c40\u0c21\u0c48\u0c30\u0c46\u0c15\u0c4d\u0c1f\u0c4d URI oauth \u0c2f\u0c3e\u0c2a\u0c4d \u0c15\u0c3e\u0c28\u0c4d\u0c2b\u0c3f\u0c17\u0c30\u0c47\u0c37\u0c28\u0c4d\u200c\u0c24\u0c4b \u0c38\u0c30\u0c3f\u0c2a\u0c4b\u0c32\u0c21\u0c02 \u0c32\u0c47\u0c26\u0c41",
43
+ "oauthCallback": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
44
+ "oauthCreateAccount": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
45
+ "emailCreateAccount": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
46
+ "callback": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
47
+ "oauthAccountNotLinked": "\u0c2e\u0c40 \u0c17\u0c41\u0c30\u0c4d\u0c24\u0c3f\u0c02\u0c2a\u0c41\u0c28\u0c41 \u0c28\u0c3f\u0c30\u0c4d\u0c27\u0c3e\u0c30\u0c3f\u0c02\u0c1a\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f, \u0c2e\u0c40\u0c30\u0c41 \u0c2e\u0c4a\u0c26\u0c1f \u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c3f\u0c28 \u0c05\u0c26\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
48
+ "emailSignin": "\u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c2a\u0c02\u0c2a\u0c21\u0c02 \u0c38\u0c3e\u0c27\u0c4d\u0c2f\u0c02 \u0c15\u0c3e\u0c32\u0c47\u0c26\u0c41",
49
+ "emailVerify": "\u0c26\u0c2f\u0c1a\u0c47\u0c38\u0c3f \u0c2e\u0c40 \u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d\u200c\u0c28\u0c3f \u0c27\u0c43\u0c35\u0c40\u0c15\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f, \u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c2a\u0c02\u0c2a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f",
50
+ "credentialsSignin": "\u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c35\u0c3f\u0c2b\u0c32\u0c2e\u0c48\u0c02\u0c26\u0c3f. \u0c2e\u0c40\u0c30\u0c41 \u0c05\u0c02\u0c26\u0c3f\u0c02\u0c1a\u0c3f\u0c28 \u0c35\u0c3f\u0c35\u0c30\u0c3e\u0c32\u0c41 \u0c38\u0c30\u0c48\u0c28\u0c35\u0c47\u0c28\u0c3e \u0c05\u0c28\u0c3f \u0c24\u0c28\u0c3f\u0c16\u0c40 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
51
+ "sessionRequired": "\u0c08 \u0c2a\u0c47\u0c1c\u0c40\u0c28\u0c3f \u0c2f\u0c3e\u0c15\u0c4d\u0c38\u0c46\u0c38\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c26\u0c2f\u0c1a\u0c47\u0c38\u0c3f \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f"
52
+ }
53
+ },
54
+ "provider": {
55
+ "continue": "{{provider}}\u0c24\u0c4b \u0c15\u0c4a\u0c28\u0c38\u0c3e\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f"
56
+ }
57
+ },
58
+ "chat": {
59
+ "input": {
60
+ "placeholder": "\u0c2e\u0c40 \u0c38\u0c02\u0c26\u0c47\u0c36\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c07\u0c15\u0c4d\u0c15\u0c21 \u0c1f\u0c48\u0c2a\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f...",
61
+ "actions": {
62
+ "send": "\u0c38\u0c02\u0c26\u0c47\u0c36\u0c02 \u0c2a\u0c02\u0c2a\u0c02\u0c21\u0c3f",
63
+ "stop": "\u0c2a\u0c28\u0c3f \u0c06\u0c2a\u0c02\u0c21\u0c3f",
64
+ "attachFiles": "\u0c2b\u0c48\u0c32\u0c4d\u0c38\u0c4d \u0c1c\u0c4b\u0c21\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f"
65
+ }
66
+ },
67
+ "speech": {
68
+ "start": "\u0c30\u0c3f\u0c15\u0c3e\u0c30\u0c4d\u0c21\u0c3f\u0c02\u0c17\u0c4d \u0c2a\u0c4d\u0c30\u0c3e\u0c30\u0c02\u0c2d\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
69
+ "stop": "\u0c30\u0c3f\u0c15\u0c3e\u0c30\u0c4d\u0c21\u0c3f\u0c02\u0c17\u0c4d \u0c06\u0c2a\u0c02\u0c21\u0c3f",
70
+ "connecting": "\u0c05\u0c28\u0c41\u0c38\u0c02\u0c27\u0c3e\u0c28\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f"
71
+ },
72
+ "fileUpload": {
73
+ "dragDrop": "\u0c2b\u0c48\u0c32\u0c4d\u0c38\u0c4d\u200c\u0c28\u0c3f \u0c07\u0c15\u0c4d\u0c15\u0c21 \u0c21\u0c4d\u0c30\u0c3e\u0c17\u0c4d \u0c1a\u0c47\u0c38\u0c3f \u0c21\u0c4d\u0c30\u0c3e\u0c2a\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
74
+ "browse": "\u0c2b\u0c48\u0c32\u0c4d\u0c38\u0c4d \u0c2c\u0c4d\u0c30\u0c4c\u0c1c\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
75
+ "sizeLimit": "\u0c2a\u0c30\u0c3f\u0c2e\u0c3f\u0c24\u0c3f:",
76
+ "errors": {
77
+ "failed": "\u0c05\u0c2a\u0c4d\u200c\u0c32\u0c4b\u0c21\u0c4d \u0c35\u0c3f\u0c2b\u0c32\u0c2e\u0c48\u0c02\u0c26\u0c3f",
78
+ "cancelled": "\u0c05\u0c2a\u0c4d\u200c\u0c32\u0c4b\u0c21\u0c4d \u0c30\u0c26\u0c4d\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f"
79
+ }
80
+ },
81
+ "messages": {
82
+ "status": {
83
+ "using": "\u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f",
84
+ "used": "\u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f"
85
+ },
86
+ "actions": {
87
+ "copy": {
88
+ "button": "\u0c15\u0c4d\u0c32\u0c3f\u0c2a\u0c4d\u200c\u0c2c\u0c4b\u0c30\u0c4d\u0c21\u0c4d\u200c\u0c15\u0c3f \u0c15\u0c3e\u0c2a\u0c40 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
89
+ "success": "\u0c15\u0c3e\u0c2a\u0c40 \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f!"
90
+ }
91
+ },
92
+ "feedback": {
93
+ "positive": "\u0c38\u0c39\u0c3e\u0c2f\u0c15\u0c30\u0c02",
94
+ "negative": "\u0c38\u0c39\u0c3e\u0c2f\u0c15\u0c30\u0c02 \u0c15\u0c3e\u0c26\u0c41",
95
+ "edit": "\u0c05\u0c2d\u0c3f\u0c2a\u0c4d\u0c30\u0c3e\u0c2f\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c38\u0c35\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
96
+ "dialog": {
97
+ "title": "\u0c35\u0c4d\u0c2f\u0c3e\u0c16\u0c4d\u0c2f \u0c1c\u0c4b\u0c21\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
98
+ "submit": "\u0c05\u0c2d\u0c3f\u0c2a\u0c4d\u0c30\u0c3e\u0c2f\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c38\u0c2e\u0c30\u0c4d\u0c2a\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f"
99
+ },
100
+ "status": {
101
+ "updating": "\u0c28\u0c35\u0c40\u0c15\u0c30\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f",
102
+ "updated": "\u0c05\u0c2d\u0c3f\u0c2a\u0c4d\u0c30\u0c3e\u0c2f\u0c02 \u0c28\u0c35\u0c40\u0c15\u0c30\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f"
103
+ }
104
+ }
105
+ },
106
+ "history": {
107
+ "title": "\u0c1a\u0c3f\u0c35\u0c30\u0c3f \u0c07\u0c28\u0c4d\u200c\u0c2a\u0c41\u0c1f\u0c4d\u200c\u0c32\u0c41",
108
+ "empty": "\u0c16\u0c3e\u0c33\u0c40\u0c17\u0c3e \u0c09\u0c02\u0c26\u0c3f...",
109
+ "show": "\u0c1a\u0c30\u0c3f\u0c24\u0c4d\u0c30\u0c28\u0c41 \u0c1a\u0c42\u0c2a\u0c3f\u0c02\u0c1a\u0c41"
110
+ },
111
+ "settings": {
112
+ "title": "\u0c38\u0c46\u0c1f\u0c4d\u0c1f\u0c3f\u0c02\u0c17\u0c4d\u200c\u0c32 \u0c2a\u0c4d\u0c2f\u0c3e\u0c28\u0c46\u0c32\u0c4d"
113
+ },
114
+ "watermark": "\u0c24\u0c4b \u0c28\u0c3f\u0c30\u0c4d\u0c2e\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f"
115
+ },
116
+ "threadHistory": {
117
+ "sidebar": {
118
+ "title": "\u0c17\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d\u200c\u0c32\u0c41",
119
+ "filters": {
120
+ "search": "\u0c35\u0c46\u0c24\u0c15\u0c02\u0c21\u0c3f",
121
+ "placeholder": "Search conversations..."
122
+ },
123
+ "timeframes": {
124
+ "today": "\u0c08\u0c30\u0c4b\u0c1c\u0c41",
125
+ "yesterday": "\u0c28\u0c3f\u0c28\u0c4d\u0c28",
126
+ "previous7days": "\u0c17\u0c24 7 \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41",
127
+ "previous30days": "\u0c17\u0c24 30 \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41"
128
+ },
129
+ "empty": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d\u200c\u0c32\u0c41 \u0c15\u0c28\u0c41\u0c17\u0c4a\u0c28\u0c2c\u0c21\u0c32\u0c47\u0c26\u0c41",
130
+ "actions": {
131
+ "close": "\u0c38\u0c48\u0c21\u0c4d\u200c\u0c2c\u0c3e\u0c30\u0c4d \u0c2e\u0c42\u0c38\u0c3f\u0c35\u0c47\u0c2f\u0c02\u0c21\u0c3f",
132
+ "open": "\u0c38\u0c48\u0c21\u0c4d\u200c\u0c2c\u0c3e\u0c30\u0c4d \u0c24\u0c46\u0c30\u0c35\u0c02\u0c21\u0c3f"
133
+ }
134
+ },
135
+ "thread": {
136
+ "untitled": "\u0c2a\u0c47\u0c30\u0c41 \u0c32\u0c47\u0c28\u0c3f \u0c38\u0c02\u0c2d\u0c3e\u0c37\u0c23",
137
+ "menu": {
138
+ "rename": "Rename",
139
+ "delete": "Delete"
140
+ },
141
+ "actions": {
142
+ "delete": {
143
+ "title": "\u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c2a\u0c41\u0c28\u0c41 \u0c28\u0c3f\u0c30\u0c4d\u0c27\u0c3e\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
144
+ "description": "\u0c07\u0c26\u0c3f \u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d\u200c\u0c24\u0c4b \u0c2a\u0c3e\u0c1f\u0c41 \u0c26\u0c3e\u0c28\u0c3f \u0c38\u0c02\u0c26\u0c47\u0c36\u0c3e\u0c32\u0c28\u0c41 \u0c2e\u0c30\u0c3f\u0c2f\u0c41 \u0c05\u0c02\u0c36\u0c3e\u0c32\u0c28\u0c41 \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c38\u0c4d\u0c24\u0c41\u0c02\u0c26\u0c3f. \u0c08 \u0c1a\u0c30\u0c4d\u0c2f\u0c28\u0c41 \u0c30\u0c26\u0c4d\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c32\u0c47\u0c30\u0c41",
145
+ "success": "\u0c1a\u0c3e\u0c1f\u0c4d \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f",
146
+ "inProgress": "\u0c1a\u0c3e\u0c1f\u0c4d\u200c\u0c28\u0c3f \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f"
147
+ },
148
+ "rename": {
149
+ "title": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c2a\u0c47\u0c30\u0c41 \u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c02\u0c21\u0c3f",
150
+ "description": "\u0c08 \u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c15\u0c4b\u0c38\u0c02 \u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c2a\u0c47\u0c30\u0c41\u0c28\u0c41 \u0c28\u0c2e\u0c4b\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
151
+ "form": {
152
+ "name": {
153
+ "label": "\u0c2a\u0c47\u0c30\u0c41",
154
+ "placeholder": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c2a\u0c47\u0c30\u0c41\u0c28\u0c41 \u0c28\u0c2e\u0c4b\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f"
155
+ }
156
+ },
157
+ "success": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c2a\u0c47\u0c30\u0c41 \u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f!",
158
+ "inProgress": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c2a\u0c47\u0c30\u0c41 \u0c2e\u0c3e\u0c30\u0c41\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f"
159
+ }
160
+ }
161
+ }
162
+ },
163
+ "navigation": {
164
+ "header": {
165
+ "chat": "\u0c1a\u0c3e\u0c1f\u0c4d",
166
+ "readme": "\u0c1a\u0c26\u0c35\u0c02\u0c21\u0c3f",
167
+ "theme": {
168
+ "light": "Light Theme",
169
+ "dark": "Dark Theme",
170
+ "system": "Follow System"
171
+ }
172
+ },
173
+ "newChat": {
174
+ "button": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d",
175
+ "dialog": {
176
+ "title": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d \u0c38\u0c43\u0c37\u0c4d\u0c1f\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
177
+ "description": "\u0c07\u0c26\u0c3f \u0c2e\u0c40 \u0c2a\u0c4d\u0c30\u0c38\u0c4d\u0c24\u0c41\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d \u0c1a\u0c30\u0c3f\u0c24\u0c4d\u0c30\u0c28\u0c41 \u0c24\u0c41\u0c21\u0c3f\u0c1a\u0c3f\u0c35\u0c47\u0c38\u0c4d\u0c24\u0c41\u0c02\u0c26\u0c3f. \u0c2e\u0c40\u0c30\u0c41 \u0c15\u0c4a\u0c28\u0c38\u0c3e\u0c17\u0c3f\u0c02\u0c1a\u0c3e\u0c32\u0c28\u0c41\u0c15\u0c41\u0c02\u0c1f\u0c41\u0c28\u0c4d\u0c28\u0c3e\u0c30\u0c3e?",
178
+ "tooltip": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d"
179
+ }
180
+ },
181
+ "user": {
182
+ "menu": {
183
+ "settings": "\u0c38\u0c46\u0c1f\u0c4d\u0c1f\u0c3f\u0c02\u0c17\u0c4d\u200c\u0c32\u0c41",
184
+ "settingsKey": "S",
185
+ "apiKeys": "API \u0c15\u0c40\u0c32\u0c41",
186
+ "logout": "\u0c32\u0c3e\u0c17\u0c4d \u0c05\u0c35\u0c41\u0c1f\u0c4d"
187
+ }
188
+ }
189
+ },
190
+ "apiKeys": {
191
+ "title": "\u0c05\u0c35\u0c38\u0c30\u0c2e\u0c48\u0c28 API \u0c15\u0c40\u0c32\u0c41",
192
+ "description": "\u0c08 \u0c2f\u0c3e\u0c2a\u0c4d\u200c\u0c28\u0c3f \u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f, \u0c15\u0c3f\u0c02\u0c26\u0c3f API \u0c15\u0c40\u0c32\u0c41 \u0c05\u0c35\u0c38\u0c30\u0c02. \u0c15\u0c40\u0c32\u0c41 \u0c2e\u0c40 \u0c2a\u0c30\u0c3f\u0c15\u0c30\u0c02 \u0c2f\u0c4a\u0c15\u0c4d\u0c15 \u0c38\u0c4d\u0c25\u0c3e\u0c28\u0c3f\u0c15 \u0c28\u0c3f\u0c32\u0c4d\u0c35\u0c32\u0c4b \u0c28\u0c3f\u0c32\u0c4d\u0c35 \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c24\u0c3e\u0c2f\u0c3f.",
193
+ "success": {
194
+ "saved": "\u0c35\u0c3f\u0c1c\u0c2f\u0c35\u0c02\u0c24\u0c02\u0c17\u0c3e \u0c38\u0c47\u0c35\u0c4d \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f"
195
+ }
196
+ },
197
+ "alerts": {
198
+ "info": "Info",
199
+ "note": "Note",
200
+ "tip": "Tip",
201
+ "important": "Important",
202
+ "warning": "Warning",
203
+ "caution": "Caution",
204
+ "debug": "Debug",
205
+ "example": "Example",
206
+ "success": "Success",
207
+ "help": "Help",
208
+ "idea": "Idea",
209
+ "pending": "Pending",
210
+ "security": "Security",
211
+ "beta": "Beta",
212
+ "best-practice": "Best Practice"
213
+ }
214
+ }
@@ -0,0 +1,214 @@
1
+ {
2
+ "common": {
3
+ "actions": {
4
+ "cancel": "\u53d6\u6d88",
5
+ "confirm": "\u786e\u8ba4",
6
+ "continue": "\u7ee7\u7eed",
7
+ "goBack": "\u8fd4\u56de",
8
+ "reset": "\u91cd\u7f6e",
9
+ "submit": "\u63d0\u4ea4"
10
+ },
11
+ "status": {
12
+ "loading": "\u52a0\u8f7d\u4e2d...",
13
+ "error": {
14
+ "default": "\u53d1\u751f\u9519\u8bef",
15
+ "serverConnection": "\u65e0\u6cd5\u8fde\u63a5\u5230\u670d\u52a1\u5668"
16
+ }
17
+ }
18
+ },
19
+ "auth": {
20
+ "login": {
21
+ "title": "\u767b\u5f55\u4ee5\u8bbf\u95ee\u5e94\u7528",
22
+ "form": {
23
+ "email": {
24
+ "label": "\u7535\u5b50\u90ae\u7bb1",
25
+ "required": "\u90ae\u7bb1\u662f\u5fc5\u586b\u9879"
26
+ },
27
+ "password": {
28
+ "label": "\u5bc6\u7801",
29
+ "required": "\u5bc6\u7801\u662f\u5fc5\u586b\u9879"
30
+ },
31
+ "actions": {
32
+ "signin": "\u767b\u5f55"
33
+ },
34
+ "alternativeText": {
35
+ "or": "\u6216"
36
+ }
37
+ },
38
+ "errors": {
39
+ "default": "\u65e0\u6cd5\u767b\u5f55",
40
+ "signin": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
41
+ "oauthSignin": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
42
+ "redirectUriMismatch": "\u91cd\u5b9a\u5411URI\u4e0eOAuth\u5e94\u7528\u914d\u7f6e\u4e0d\u5339\u914d",
43
+ "oauthCallback": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
44
+ "oauthCreateAccount": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
45
+ "emailCreateAccount": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
46
+ "callback": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
47
+ "oauthAccountNotLinked": "\u4e3a\u786e\u8ba4\u60a8\u7684\u8eab\u4efd\uff0c\u8bf7\u4f7f\u7528\u539f\u59cb\u8d26\u53f7\u767b\u5f55",
48
+ "emailSignin": "\u90ae\u4ef6\u53d1\u9001\u5931\u8d25",
49
+ "emailVerify": "\u8bf7\u9a8c\u8bc1\u60a8\u7684\u90ae\u7bb1\uff0c\u65b0\u7684\u9a8c\u8bc1\u90ae\u4ef6\u5df2\u53d1\u9001",
50
+ "credentialsSignin": "\u767b\u5f55\u5931\u8d25\u3002\u8bf7\u68c0\u67e5\u60a8\u63d0\u4f9b\u7684\u4fe1\u606f\u662f\u5426\u6b63\u786e",
51
+ "sessionRequired": "\u8bf7\u767b\u5f55\u4ee5\u8bbf\u95ee\u6b64\u9875\u9762"
52
+ }
53
+ },
54
+ "provider": {
55
+ "continue": "\u7ee7\u7eed\u4f7f\u7528{{provider}}"
56
+ }
57
+ },
58
+ "chat": {
59
+ "input": {
60
+ "placeholder": "\u5728\u6b64\u8f93\u5165\u60a8\u7684\u6d88\u606f...",
61
+ "actions": {
62
+ "send": "\u53d1\u9001\u6d88\u606f",
63
+ "stop": "\u505c\u6b62\u4efb\u52a1",
64
+ "attachFiles": "\u9644\u52a0\u6587\u4ef6"
65
+ }
66
+ },
67
+ "speech": {
68
+ "start": "\u5f00\u59cb\u5f55\u97f3",
69
+ "stop": "\u505c\u6b62\u5f55\u97f3",
70
+ "connecting": "\u8fde\u63a5\u4e2d"
71
+ },
72
+ "fileUpload": {
73
+ "dragDrop": "\u5c06\u6587\u4ef6\u62d6\u653e\u5230\u8fd9\u91cc",
74
+ "browse": "\u6d4f\u89c8\u6587\u4ef6",
75
+ "sizeLimit": "\u9650\u5236\uff1a",
76
+ "errors": {
77
+ "failed": "\u4e0a\u4f20\u5931\u8d25",
78
+ "cancelled": "\u5df2\u53d6\u6d88\u4e0a\u4f20"
79
+ }
80
+ },
81
+ "messages": {
82
+ "status": {
83
+ "using": "\u4f7f\u7528\u4e2d",
84
+ "used": "\u5df2\u4f7f\u7528"
85
+ },
86
+ "actions": {
87
+ "copy": {
88
+ "button": "\u590d\u5236\u5230\u526a\u8d34\u677f",
89
+ "success": "\u5df2\u590d\u5236\uff01"
90
+ }
91
+ },
92
+ "feedback": {
93
+ "positive": "\u6709\u5e2e\u52a9",
94
+ "negative": "\u6ca1\u6709\u5e2e\u52a9",
95
+ "edit": "\u7f16\u8f91\u53cd\u9988",
96
+ "dialog": {
97
+ "title": "\u6dfb\u52a0\u8bc4\u8bba",
98
+ "submit": "\u63d0\u4ea4\u53cd\u9988"
99
+ },
100
+ "status": {
101
+ "updating": "\u66f4\u65b0\u4e2d",
102
+ "updated": "\u53cd\u9988\u5df2\u66f4\u65b0"
103
+ }
104
+ }
105
+ },
106
+ "history": {
107
+ "title": "\u6700\u8fd1\u8f93\u5165",
108
+ "empty": "\u7a7a\u7a7a\u5982\u4e5f...",
109
+ "show": "\u663e\u793a\u5386\u53f2"
110
+ },
111
+ "settings": {
112
+ "title": "\u8bbe\u7f6e\u9762\u677f"
113
+ },
114
+ "watermark": "\u6280\u672f\u652f\u6301"
115
+ },
116
+ "threadHistory": {
117
+ "sidebar": {
118
+ "title": "\u5386\u53f2\u5bf9\u8bdd",
119
+ "filters": {
120
+ "search": "\u641c\u7d22",
121
+ "placeholder": "\u641c\u7d22\u4f1a\u8bdd..."
122
+ },
123
+ "timeframes": {
124
+ "today": "\u4eca\u5929",
125
+ "yesterday": "\u6628\u5929",
126
+ "previous7days": "\u8fc7\u53bb7\u5929",
127
+ "previous30days": "\u8fc7\u53bb30\u5929"
128
+ },
129
+ "empty": "\u672a\u627e\u5230\u5bf9\u8bdd",
130
+ "actions": {
131
+ "close": "\u5173\u95ed\u4fa7\u8fb9\u680f",
132
+ "open": "\u6253\u5f00\u4fa7\u8fb9\u680f"
133
+ }
134
+ },
135
+ "thread": {
136
+ "untitled": "\u672a\u547d\u540d\u5bf9\u8bdd",
137
+ "menu": {
138
+ "rename": "\u91cd\u547d\u540d",
139
+ "delete": "\u5220\u9664"
140
+ },
141
+ "actions": {
142
+ "delete": {
143
+ "title": "\u786e\u8ba4\u5220\u9664",
144
+ "description": "\u8fd9\u5c06\u5220\u9664\u8be5\u5bf9\u8bdd\u53ca\u5176\u6240\u6709\u6d88\u606f\u548c\u5143\u7d20\u3002\u6b64\u64cd\u4f5c\u65e0\u6cd5\u64a4\u9500",
145
+ "success": "\u5bf9\u8bdd\u5df2\u5220\u9664",
146
+ "inProgress": "\u6b63\u5728\u5220\u9664\u5bf9\u8bdd"
147
+ },
148
+ "rename": {
149
+ "title": "\u91cd\u547d\u540d\u5bf9\u8bdd",
150
+ "description": "\u4e3a\u6b64\u5bf9\u8bdd\u8f93\u5165\u65b0\u540d\u79f0",
151
+ "form": {
152
+ "name": {
153
+ "label": "\u540d\u79f0",
154
+ "placeholder": "\u8f93\u5165\u65b0\u540d\u79f0"
155
+ }
156
+ },
157
+ "success": "\u5bf9\u8bdd\u5df2\u91cd\u547d\u540d\uff01",
158
+ "inProgress": "\u6b63\u5728\u91cd\u547d\u540d\u5bf9\u8bdd"
159
+ }
160
+ }
161
+ }
162
+ },
163
+ "navigation": {
164
+ "header": {
165
+ "chat": "\u804a\u5929",
166
+ "readme": "\u8bf4\u660e",
167
+ "theme": {
168
+ "light": "\u6d45\u8272\u4e3b\u9898",
169
+ "dark": "\u6df1\u8272\u4e3b\u9898",
170
+ "system": "\u8ddf\u968f\u7cfb\u7edf"
171
+ }
172
+ },
173
+ "newChat": {
174
+ "button": "\u65b0\u5efa\u5bf9\u8bdd",
175
+ "dialog": {
176
+ "title": "\u521b\u5efa\u65b0\u5bf9\u8bdd",
177
+ "description": "\u8fd9\u5c06\u6e05\u9664\u60a8\u5f53\u524d\u7684\u804a\u5929\u8bb0\u5f55\u3002\u786e\u5b9a\u8981\u7ee7\u7eed\u5417\uff1f",
178
+ "tooltip": "\u65b0\u5efa\u5bf9\u8bdd"
179
+ }
180
+ },
181
+ "user": {
182
+ "menu": {
183
+ "settings": "\u8bbe\u7f6e",
184
+ "settingsKey": "S",
185
+ "apiKeys": "API\u5bc6\u94a5",
186
+ "logout": "\u9000\u51fa\u767b\u5f55"
187
+ }
188
+ }
189
+ },
190
+ "apiKeys": {
191
+ "title": "\u6240\u9700API\u5bc6\u94a5",
192
+ "description": "\u4f7f\u7528\u6b64\u5e94\u7528\u9700\u8981\u4ee5\u4e0bAPI\u5bc6\u94a5\u3002\u8fd9\u4e9b\u5bc6\u94a5\u5b58\u50a8\u5728\u60a8\u8bbe\u5907\u7684\u672c\u5730\u5b58\u50a8\u4e2d\u3002",
193
+ "success": {
194
+ "saved": "\u4fdd\u5b58\u6210\u529f"
195
+ }
196
+ },
197
+ "alerts": {
198
+ "info": "\u4fe1\u606f",
199
+ "note": "\u6ce8\u91ca",
200
+ "tip": "\u63d0\u793a",
201
+ "important": "\u91cd\u8981",
202
+ "warning": "\u8b66\u544a",
203
+ "caution": "\u6ce8\u610f",
204
+ "debug": "\u8c03\u8bd5",
205
+ "example": "\u793a\u4f8b",
206
+ "success": "\u6210\u529f",
207
+ "help": "\u5e2e\u52a9",
208
+ "idea": "\u60f3\u6cd5",
209
+ "pending": "\u5f85\u5904\u7406",
210
+ "security": "\u5b89\u5168",
211
+ "beta": "\u6d4b\u8bd5",
212
+ "best-practice": "\u6700\u4f73\u5b9e\u8df5"
213
+ }
214
+ }
aixtools/__init__.py ADDED
@@ -0,0 +1,11 @@
1
+ """
2
+ AiXtools - Tools for AI exploration and debugging
3
+ """
4
+
5
+ try:
6
+ from ._version import version as __version__
7
+ except ImportError:
8
+ # Fallback for development installations
9
+ from importlib.metadata import version
10
+
11
+ __version__ = version("aixtools")
aixtools/_version.py ADDED
@@ -0,0 +1,34 @@
1
+ # file generated by setuptools-scm
2
+ # don't change, don't track in version control
3
+
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
12
+
13
+ TYPE_CHECKING = False
14
+ if TYPE_CHECKING:
15
+ from typing import Tuple
16
+ from typing import Union
17
+
18
+ VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
20
+ else:
21
+ VERSION_TUPLE = object
22
+ COMMIT_ID = object
23
+
24
+ version: str
25
+ __version__: str
26
+ __version_tuple__: VERSION_TUPLE
27
+ version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
30
+
31
+ __version__ = version = '0.0.0'
32
+ __version_tuple__ = version_tuple = (0, 0, 0)
33
+
34
+ __commit_id__ = commit_id = None
aixtools/a2a/app.py ADDED
@@ -0,0 +1,126 @@
1
+ """
2
+ This module provides functionality to convert a Pydantic AI Agent into a FastA2A application
3
+ """
4
+
5
+ import json
6
+ from functools import partial
7
+ from typing import assert_never
8
+
9
+ from fasta2a.applications import FastA2A
10
+ from fasta2a.broker import InMemoryBroker
11
+ from fasta2a.schema import Part, TaskSendParams
12
+ from fasta2a.storage import InMemoryStorage
13
+ from pydantic_ai import Agent
14
+ from pydantic_ai._a2a import AgentWorker, worker_lifespan
15
+ from pydantic_ai.messages import (
16
+ AudioUrl,
17
+ BinaryContent,
18
+ DocumentUrl,
19
+ ImageUrl,
20
+ ModelRequestPart,
21
+ UserPromptPart,
22
+ VideoUrl,
23
+ )
24
+ from starlette.applications import Starlette
25
+ from starlette.exceptions import HTTPException
26
+ from starlette.requests import Request
27
+ from starlette.responses import RedirectResponse
28
+
29
+ from aixtools.context import session_id_var, user_id_var
30
+
31
+
32
+ class AgentWorkerWithMetadataParser(AgentWorker):
33
+ """Custom AgentWorker class that extracts the session metadata from message metadata."""
34
+
35
+ async def run_task(self, params: TaskSendParams) -> None:
36
+ """
37
+ Extract session metadata from message and store them in context variables,
38
+ then call the parent class's run_task method.
39
+ """
40
+ # Load the task to extract metadata
41
+ task = await self.storage.load_task(params["id"])
42
+ if task:
43
+ # Extract headers from message metadata if available
44
+ if message := (task.get("history") or [None])[-1]:
45
+ metadata = message.get("metadata", {})
46
+ # Store in context variables
47
+ user_id_var.set(metadata.get("user_id", ""))
48
+ session_id_var.set(metadata.get("session_id", ""))
49
+ # Call the parent class's run_task method
50
+ return await super().run_task(params)
51
+
52
+
53
+ class AgentWorkerWithDataPartSupport(AgentWorkerWithMetadataParser):
54
+ """Custom agent worker that adds support for data parts in messages."""
55
+
56
+ def _request_parts_from_a2a(self, parts: list[Part]) -> list[ModelRequestPart]:
57
+ """
58
+ Clones underlying method with additional support for data parts.
59
+ TODO: remove once pydantic-ai supports data parts natively.
60
+ """
61
+ model_parts: list[ModelRequestPart] = []
62
+ for part in parts:
63
+ if part["kind"] == "text":
64
+ model_parts.append(UserPromptPart(content=part["text"]))
65
+ elif part["kind"] == "file":
66
+ file_content = part["file"]
67
+ if "bytes" in file_content:
68
+ data = file_content["bytes"].encode("utf-8")
69
+ mime_type = file_content.get("mime_type", "application/octet-stream")
70
+ content = BinaryContent(data=data, media_type=mime_type)
71
+ model_parts.append(UserPromptPart(content=[content]))
72
+ else:
73
+ url = file_content["uri"]
74
+ for url_cls in (DocumentUrl, AudioUrl, ImageUrl, VideoUrl):
75
+ content = url_cls(url=url)
76
+ try:
77
+ content.media_type
78
+ except ValueError: # pragma: no cover
79
+ continue
80
+ else:
81
+ break
82
+ else:
83
+ raise ValueError(f"Unsupported file type: {url}") # pragma: no cover
84
+ model_parts.append(UserPromptPart(content=[content]))
85
+ elif part["kind"] == "data":
86
+ content = json.dumps(part["data"])
87
+ model_parts.append(UserPromptPart(content=[content]))
88
+ else:
89
+ assert_never(part)
90
+ return model_parts
91
+
92
+
93
+ def agent_to_a2a(
94
+ agent: Agent, name: str, description: str, skills: list[dict], worker_class=AgentWorkerWithMetadataParser
95
+ ) -> FastA2A:
96
+ """Convert the agent to an A2A application taking care of session metadata extraction."""
97
+ storage = InMemoryStorage()
98
+ broker = InMemoryBroker()
99
+ worker = worker_class(broker=broker, storage=storage, agent=agent)
100
+ return FastA2A(
101
+ storage=storage,
102
+ broker=broker,
103
+ name=name,
104
+ description=description,
105
+ skills=skills,
106
+ url="",
107
+ lifespan=partial(worker_lifespan, worker=worker, agent=agent),
108
+ )
109
+
110
+
111
+ def fix_a2a_docs_pages(app: Starlette) -> None:
112
+ """
113
+ Fix the FastA2A documentation to point to the correct path.
114
+ This is a workaround for the issue with the FastA2A docs not being served correctly
115
+ when mounted as a sub-path.
116
+ """
117
+
118
+ async def redirect_to_sub_agent(request: Request):
119
+ """Redirect to proper sub-app using the Referer header to determine the path prefix."""
120
+ referer = request.headers.get("referer", "")
121
+ if referer.endswith("/docs"):
122
+ return RedirectResponse(url=f"{referer.rsplit('/', 1)[0]}{request.url.path}")
123
+ raise HTTPException(status_code=404)
124
+
125
+ app.router.add_route("/.well-known/agent.json", redirect_to_sub_agent, methods=["GET"])
126
+ app.router.add_route("/", redirect_to_sub_agent, methods=["POST"])
File without changes
@@ -0,0 +1,27 @@
1
+ import httpx
2
+ from a2a.client import A2ACardResolver
3
+ from a2a.types import AgentCard
4
+
5
+ from aixtools.logging.logging_config import get_logger
6
+
7
+ logger = get_logger(__name__)
8
+
9
+
10
+ async def get_agent_card(httpx_client: httpx.AsyncClient, agent_url: str) -> AgentCard:
11
+ resolver = A2ACardResolver(
12
+ httpx_client=httpx_client,
13
+ base_url=agent_url,
14
+ )
15
+
16
+ try:
17
+ _public_card = await resolver.get_agent_card() # Fetches from default public path
18
+ logger.info("Successfully fetched public agent card:")
19
+ logger.info(_public_card.model_dump_json(indent=2, exclude_none=True))
20
+ final_agent_card_to_use = _public_card
21
+ except Exception as e:
22
+ logger.error(f"Critical error fetching public agent card: {e}", exc_info=True)
23
+ raise RuntimeError("Failed to fetch the public agent card. Cannot continue.") from e
24
+
25
+ # Set the URL which is accessible from the container
26
+ final_agent_card_to_use.url = agent_url
27
+ return final_agent_card_to_use