aixtools 0.2.19__tar.gz → 0.2.21__tar.gz

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 (102) hide show
  1. {aixtools-0.2.19 → aixtools-0.2.21}/PKG-INFO +1 -1
  2. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/_version.py +3 -3
  3. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/mcp/__init__.py +5 -1
  4. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/mcp/client.py +3 -1
  5. aixtools-0.2.19/aixtools/logging/mcp_middleware.py → aixtools-0.2.21/aixtools/mcp/middleware.py +1 -1
  6. aixtools-0.2.21/aixtools/mcp/server.py +72 -0
  7. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/utils/config.py +2 -0
  8. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools.egg-info/SOURCES.txt +2 -1
  9. {aixtools-0.2.19 → aixtools-0.2.21}/README.md +0 -0
  10. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/.chainlit/config.toml +0 -0
  11. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/.chainlit/translations/bn.json +0 -0
  12. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/.chainlit/translations/en-US.json +0 -0
  13. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/.chainlit/translations/gu.json +0 -0
  14. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/.chainlit/translations/he-IL.json +0 -0
  15. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/.chainlit/translations/hi.json +0 -0
  16. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/.chainlit/translations/ja.json +0 -0
  17. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/.chainlit/translations/kn.json +0 -0
  18. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/.chainlit/translations/ml.json +0 -0
  19. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/.chainlit/translations/mr.json +0 -0
  20. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/.chainlit/translations/nl.json +0 -0
  21. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/.chainlit/translations/ta.json +0 -0
  22. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/.chainlit/translations/te.json +0 -0
  23. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/.chainlit/translations/zh-CN.json +0 -0
  24. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/__init__.py +0 -0
  25. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/a2a/app.py +0 -0
  26. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/a2a/google_sdk/__init__.py +0 -0
  27. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/a2a/google_sdk/pydantic_ai_adapter/agent_executor.py +0 -0
  28. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/a2a/google_sdk/pydantic_ai_adapter/storage.py +0 -0
  29. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/a2a/google_sdk/remote_agent_connection.py +0 -0
  30. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/a2a/google_sdk/utils.py +0 -0
  31. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/a2a/utils.py +0 -0
  32. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/agents/__init__.py +0 -0
  33. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/agents/agent.py +0 -0
  34. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/agents/agent_batch.py +0 -0
  35. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/agents/nodes_to_md.py +0 -0
  36. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/agents/nodes_to_message.py +0 -0
  37. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/agents/nodes_to_str.py +0 -0
  38. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/agents/print_nodes.py +0 -0
  39. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/agents/prompt.py +0 -0
  40. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/app.py +0 -0
  41. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/auth/__init__.py +0 -0
  42. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/auth/auth.py +0 -0
  43. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/chainlit.md +0 -0
  44. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/compliance/__init__.py +0 -0
  45. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/compliance/private_data.py +0 -0
  46. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/context.py +0 -0
  47. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/db/__init__.py +0 -0
  48. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/db/database.py +0 -0
  49. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/db/vector_db.py +0 -0
  50. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/evals/__init__.py +0 -0
  51. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/evals/__main__.py +0 -0
  52. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/evals/dataset.py +0 -0
  53. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/evals/discovery.py +0 -0
  54. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/evals/run_evals.py +0 -0
  55. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/google/client.py +0 -0
  56. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/log_view/__init__.py +0 -0
  57. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/log_view/app.py +0 -0
  58. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/log_view/display.py +0 -0
  59. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/log_view/export.py +0 -0
  60. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/log_view/filters.py +0 -0
  61. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/log_view/log_utils.py +0 -0
  62. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/log_view/node_summary.py +0 -0
  63. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/logfilters/__init__.py +0 -0
  64. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/logfilters/context_filter.py +0 -0
  65. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/logging/__init__.py +0 -0
  66. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/logging/log_objects.py +0 -0
  67. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/logging/logging_config.py +0 -0
  68. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/logging/mcp_log_models.py +0 -0
  69. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/logging/mcp_logger.py +0 -0
  70. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/logging/model_patch_logging.py +0 -0
  71. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/logging/open_telemetry.py +0 -0
  72. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/mcp/example_client.py +0 -0
  73. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/mcp/example_server.py +0 -0
  74. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/mcp/exceptions.py +0 -0
  75. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/mcp/fast_mcp_log.py +0 -0
  76. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/mcp/faulty_mcp.py +0 -0
  77. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/model_patch/model_patch.py +0 -0
  78. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/server/__init__.py +0 -0
  79. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/server/app_mounter.py +0 -0
  80. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/server/path.py +0 -0
  81. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/server/utils.py +0 -0
  82. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/testing/__init__.py +0 -0
  83. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/testing/agent_mock.py +0 -0
  84. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/testing/aix_test_model.py +0 -0
  85. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/testing/mock_tool.py +0 -0
  86. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/testing/model_patch_cache.py +0 -0
  87. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/tools/doctor/__init__.py +0 -0
  88. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/tools/doctor/mcp_tool_doctor.py +0 -0
  89. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/tools/doctor/tool_doctor.py +0 -0
  90. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/tools/doctor/tool_recommendation.py +0 -0
  91. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/utils/__init__.py +0 -0
  92. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/utils/chainlit/cl_agent_show.py +0 -0
  93. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/utils/chainlit/cl_utils.py +0 -0
  94. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/utils/config_util.py +0 -0
  95. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/utils/enum_with_description.py +0 -0
  96. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/utils/files.py +0 -0
  97. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/utils/persisted_dict.py +0 -0
  98. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/utils/utils.py +0 -0
  99. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/vault/__init__.py +0 -0
  100. {aixtools-0.2.19 → aixtools-0.2.21}/aixtools/vault/vault.py +0 -0
  101. {aixtools-0.2.19 → aixtools-0.2.21}/pyproject.toml +0 -0
  102. {aixtools-0.2.19 → aixtools-0.2.21}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aixtools
3
- Version: 0.2.19
3
+ Version: 0.2.21
4
4
  Summary: Tools for AI exploration and debugging
5
5
  Requires-Python: >=3.11.2
6
6
  Description-Content-Type: text/markdown
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.2.19'
32
- __version_tuple__ = version_tuple = (0, 2, 19)
31
+ __version__ = version = '0.2.21'
32
+ __version_tuple__ = version_tuple = (0, 2, 21)
33
33
 
34
- __commit_id__ = commit_id = 'g09e184e90'
34
+ __commit_id__ = commit_id = 'gbbd8ec97d'
@@ -4,8 +4,12 @@ Model Context Protocol (MCP) implementation for AI agent communication.
4
4
 
5
5
  from aixtools.mcp.exceptions import AixToolError
6
6
  from aixtools.mcp.fast_mcp_log import FastMcpLog
7
+ from aixtools.mcp.middleware import AixErrorHandlingMiddleware
8
+ from aixtools.mcp.server import create_mcp_server
7
9
 
8
10
  __all__ = [
9
- "FastMcpLog",
11
+ "AixErrorHandlingMiddleware",
10
12
  "AixToolError",
13
+ "FastMcpLog",
14
+ "create_mcp_server",
11
15
  ]
@@ -23,6 +23,7 @@ from pydantic_ai.toolsets.abstract import ToolsetTool
23
23
  from aixtools.context import SessionIdTuple
24
24
  from aixtools.logging.logging_config import get_logger
25
25
  from aixtools.server.utils import create_session_headers
26
+ from aixtools.utils.config import MCP_TOOLS_MAX_RETRIES
26
27
 
27
28
  MCP_TOOL_CACHE_TTL = 300 # 5 minutes
28
29
  DEFAULT_MCP_CONNECTION_TIMEOUT = 30
@@ -87,6 +88,7 @@ def get_mcp_servers(
87
88
  mcp_configs: list[MCPConfig],
88
89
  session_id_tuple: SessionIdTuple,
89
90
  auth_token: str = None,
91
+ max_retries: int = MCP_TOOLS_MAX_RETRIES,
90
92
  *,
91
93
  timeout: float = DEFAULT_MCP_CONNECTION_TIMEOUT,
92
94
  ):
@@ -115,7 +117,7 @@ def get_mcp_servers(
115
117
  servers = []
116
118
  for config in mcp_configs:
117
119
  server = CachedMCPServerStreamableHTTP(
118
- url=config.url, headers=headers, timeout=timeout, read_timeout=config.read_timeout
120
+ url=config.url, headers=headers, timeout=timeout, read_timeout=config.read_timeout, max_retries=max_retries
119
121
  )
120
122
  logger.info("Using MCP server at %s", config.url)
121
123
  servers.append(server)
@@ -7,7 +7,7 @@ import traceback
7
7
  from fastmcp.server.middleware.error_handling import ErrorHandlingMiddleware
8
8
  from fastmcp.server.middleware.middleware import MiddlewareContext
9
9
 
10
- from aixtools.mcp import AixToolError
10
+ from aixtools.mcp.exceptions import AixToolError
11
11
 
12
12
 
13
13
  class AixErrorHandlingMiddleware(ErrorHandlingMiddleware):
@@ -0,0 +1,72 @@
1
+ """Utilities for FastMCP servers."""
2
+
3
+ from typing import Any
4
+
5
+ from fastmcp import FastMCP
6
+ from fastmcp.server.middleware.logging import LoggingMiddleware
7
+ from fastmcp.server.middleware.timing import TimingMiddleware
8
+ from fastmcp.utilities.types import NotSet
9
+
10
+ from aixtools.auth.auth import AccessTokenAuthProvider
11
+ from aixtools.logging.logging_config import get_logger
12
+ from aixtools.mcp.middleware import AixErrorHandlingMiddleware
13
+
14
+
15
+ def create_mcp_server(
16
+ *,
17
+ name: str,
18
+ instructions: str | None = None,
19
+ **kwargs: Any,
20
+ ) -> FastMCP:
21
+ """
22
+ MCP server instance with preconfigured auth and middleware.
23
+
24
+ All FastMCP constructor parameters are supported via **kwargs.
25
+
26
+ Args:
27
+ name: Server name
28
+ instructions: Optional server instructions
29
+ **kwargs: All other FastMCP constructor parameters:
30
+ - version: str | None
31
+ - auth: AuthProvider | None (AccessTokenAuthProvider if not set, pass None to disable)
32
+ - middleware: list[Middleware] | None (custom middleware if not set, pass None to disable)
33
+ - lifespan: Callable | None
34
+ - tool_serializer: Callable[[Any], str] | None
35
+ - cache_expiration_seconds: float | None
36
+ - on_duplicate_tools: DuplicateBehavior | None
37
+ - on_duplicate_resources: DuplicateBehavior | None
38
+ - on_duplicate_prompts: DuplicateBehavior | None
39
+ - resource_prefix_format: Literal["protocol", "path"] | None
40
+ - mask_error_details: bool | None
41
+ - tools: list[Tool | Callable] | None
42
+ - tool_transformations: dict[str, ToolTransformConfig] | None
43
+ - dependencies: list[str] | None
44
+ - include_tags: set[str] | None
45
+ - exclude_tags: set[str] | None
46
+ - include_fastmcp_meta: bool | None
47
+
48
+ Returns:
49
+ Configured FastMCP server instance
50
+ """
51
+ middleware = kwargs.pop("middleware", NotSet)
52
+ auth = kwargs.pop("auth", NotSet)
53
+
54
+ if middleware is NotSet:
55
+ middleware = [
56
+ LoggingMiddleware(include_payloads=True, logger=get_logger("middleware.log")),
57
+ AixErrorHandlingMiddleware(include_traceback=True, logger=get_logger("middleware.err")),
58
+ TimingMiddleware(logger=get_logger("middleware.timing")),
59
+ ]
60
+
61
+ if auth is NotSet:
62
+ auth = AccessTokenAuthProvider()
63
+
64
+ mcp_args = {
65
+ "name": name,
66
+ "instructions": instructions,
67
+ "auth": auth,
68
+ "middleware": middleware,
69
+ **kwargs,
70
+ }
71
+
72
+ return FastMCP(**mcp_args)
@@ -144,3 +144,5 @@ SKIP_MCP_AUTHORIZATION = str2bool(get_variable_env("SKIP_MCP_AUTHORIZATION", Tru
144
144
  APP_DEFAULT_SCOPE = get_variable_env("APP_DEFAULT_SCOPE", allow_empty=True)
145
145
 
146
146
  AUTH_TEST_TOKEN = get_variable_env("AUTH_TEST_TOKEN", allow_empty=True)
147
+
148
+ MCP_TOOLS_MAX_RETRIES = int(get_variable_env("MCP_TOOLS_MAX_RETRIES", default=10))
@@ -61,7 +61,6 @@ aixtools/logging/log_objects.py
61
61
  aixtools/logging/logging_config.py
62
62
  aixtools/logging/mcp_log_models.py
63
63
  aixtools/logging/mcp_logger.py
64
- aixtools/logging/mcp_middleware.py
65
64
  aixtools/logging/model_patch_logging.py
66
65
  aixtools/logging/open_telemetry.py
67
66
  aixtools/mcp/__init__.py
@@ -71,6 +70,8 @@ aixtools/mcp/example_server.py
71
70
  aixtools/mcp/exceptions.py
72
71
  aixtools/mcp/fast_mcp_log.py
73
72
  aixtools/mcp/faulty_mcp.py
73
+ aixtools/mcp/middleware.py
74
+ aixtools/mcp/server.py
74
75
  aixtools/model_patch/model_patch.py
75
76
  aixtools/server/__init__.py
76
77
  aixtools/server/app_mounter.py
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes