hdsp-jupyter-extension 2.0.6__py3-none-any.whl → 2.0.8__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 (88) hide show
  1. agent_server/core/embedding_service.py +67 -46
  2. agent_server/core/rag_manager.py +31 -17
  3. agent_server/core/reflection_engine.py +0 -1
  4. agent_server/core/retriever.py +13 -8
  5. agent_server/core/vllm_embedding_service.py +243 -0
  6. agent_server/knowledge/watchdog_service.py +1 -1
  7. agent_server/langchain/ARCHITECTURE.md +1193 -0
  8. agent_server/langchain/agent.py +82 -588
  9. agent_server/langchain/custom_middleware.py +663 -0
  10. agent_server/langchain/executors/__init__.py +2 -7
  11. agent_server/langchain/executors/notebook_searcher.py +46 -38
  12. agent_server/langchain/hitl_config.py +71 -0
  13. agent_server/langchain/llm_factory.py +166 -0
  14. agent_server/langchain/logging_utils.py +223 -0
  15. agent_server/langchain/prompts.py +150 -0
  16. agent_server/langchain/state.py +16 -6
  17. agent_server/langchain/tools/__init__.py +19 -0
  18. agent_server/langchain/tools/file_tools.py +354 -114
  19. agent_server/langchain/tools/file_utils.py +334 -0
  20. agent_server/langchain/tools/jupyter_tools.py +18 -18
  21. agent_server/langchain/tools/lsp_tools.py +264 -0
  22. agent_server/langchain/tools/resource_tools.py +161 -0
  23. agent_server/langchain/tools/search_tools.py +198 -216
  24. agent_server/langchain/tools/shell_tools.py +54 -0
  25. agent_server/main.py +11 -1
  26. agent_server/routers/health.py +1 -1
  27. agent_server/routers/langchain_agent.py +1040 -289
  28. agent_server/routers/rag.py +8 -3
  29. hdsp_agent_core/models/rag.py +15 -1
  30. hdsp_agent_core/prompts/auto_agent_prompts.py +3 -3
  31. hdsp_agent_core/services/rag_service.py +6 -1
  32. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/build_log.json +1 -1
  33. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/package.json +3 -2
  34. hdsp_jupyter_extension-2.0.6.data/data/share/jupyter/labextensions/hdsp-agent/static/frontend_styles_index_js.02d346171474a0fb2dc1.js → hdsp_jupyter_extension-2.0.8.data/data/share/jupyter/labextensions/hdsp-agent/static/frontend_styles_index_js.8740a527757068814573.js +470 -7
  35. hdsp_jupyter_extension-2.0.8.data/data/share/jupyter/labextensions/hdsp-agent/static/frontend_styles_index_js.8740a527757068814573.js.map +1 -0
  36. hdsp_jupyter_extension-2.0.6.data/data/share/jupyter/labextensions/hdsp-agent/static/lib_index_js.a223ea20056954479ae9.js → hdsp_jupyter_extension-2.0.8.data/data/share/jupyter/labextensions/hdsp-agent/static/lib_index_js.e4ff4b5779b5e049f84c.js +3196 -441
  37. hdsp_jupyter_extension-2.0.8.data/data/share/jupyter/labextensions/hdsp-agent/static/lib_index_js.e4ff4b5779b5e049f84c.js.map +1 -0
  38. hdsp_jupyter_extension-2.0.6.data/data/share/jupyter/labextensions/hdsp-agent/static/remoteEntry.addf2fa038fa60304aa2.js → hdsp_jupyter_extension-2.0.8.data/data/share/jupyter/labextensions/hdsp-agent/static/remoteEntry.020cdb0b864cfaa4e41e.js +9 -7
  39. hdsp_jupyter_extension-2.0.8.data/data/share/jupyter/labextensions/hdsp-agent/static/remoteEntry.020cdb0b864cfaa4e41e.js.map +1 -0
  40. {hdsp_jupyter_extension-2.0.6.dist-info → hdsp_jupyter_extension-2.0.8.dist-info}/METADATA +2 -1
  41. {hdsp_jupyter_extension-2.0.6.dist-info → hdsp_jupyter_extension-2.0.8.dist-info}/RECORD +75 -69
  42. jupyter_ext/__init__.py +18 -0
  43. jupyter_ext/_version.py +1 -1
  44. jupyter_ext/handlers.py +1351 -58
  45. jupyter_ext/labextension/build_log.json +1 -1
  46. jupyter_ext/labextension/package.json +3 -2
  47. jupyter_ext/labextension/static/{frontend_styles_index_js.02d346171474a0fb2dc1.js → frontend_styles_index_js.8740a527757068814573.js} +470 -7
  48. jupyter_ext/labextension/static/frontend_styles_index_js.8740a527757068814573.js.map +1 -0
  49. jupyter_ext/labextension/static/{lib_index_js.a223ea20056954479ae9.js → lib_index_js.e4ff4b5779b5e049f84c.js} +3196 -441
  50. jupyter_ext/labextension/static/lib_index_js.e4ff4b5779b5e049f84c.js.map +1 -0
  51. jupyter_ext/labextension/static/{remoteEntry.addf2fa038fa60304aa2.js → remoteEntry.020cdb0b864cfaa4e41e.js} +9 -7
  52. jupyter_ext/labextension/static/remoteEntry.020cdb0b864cfaa4e41e.js.map +1 -0
  53. jupyter_ext/resource_usage.py +180 -0
  54. jupyter_ext/tests/test_handlers.py +58 -0
  55. agent_server/langchain/executors/jupyter_executor.py +0 -429
  56. agent_server/langchain/middleware/__init__.py +0 -36
  57. agent_server/langchain/middleware/code_search_middleware.py +0 -278
  58. agent_server/langchain/middleware/error_handling_middleware.py +0 -338
  59. agent_server/langchain/middleware/jupyter_execution_middleware.py +0 -301
  60. agent_server/langchain/middleware/rag_middleware.py +0 -227
  61. agent_server/langchain/middleware/validation_middleware.py +0 -240
  62. hdsp_jupyter_extension-2.0.6.data/data/share/jupyter/labextensions/hdsp-agent/static/frontend_styles_index_js.02d346171474a0fb2dc1.js.map +0 -1
  63. hdsp_jupyter_extension-2.0.6.data/data/share/jupyter/labextensions/hdsp-agent/static/lib_index_js.a223ea20056954479ae9.js.map +0 -1
  64. hdsp_jupyter_extension-2.0.6.data/data/share/jupyter/labextensions/hdsp-agent/static/remoteEntry.addf2fa038fa60304aa2.js.map +0 -1
  65. jupyter_ext/labextension/static/frontend_styles_index_js.02d346171474a0fb2dc1.js.map +0 -1
  66. jupyter_ext/labextension/static/lib_index_js.a223ea20056954479ae9.js.map +0 -1
  67. jupyter_ext/labextension/static/remoteEntry.addf2fa038fa60304aa2.js.map +0 -1
  68. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/etc/jupyter/jupyter_server_config.d/hdsp_jupyter_extension.json +0 -0
  69. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/install.json +0 -0
  70. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/static/node_modules_emotion_use-insertion-effect-with-fallbacks_dist_emotion-use-insertion-effect-wi-3ba6b80.c095373419d05e6f141a.js +0 -0
  71. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/static/node_modules_emotion_use-insertion-effect-with-fallbacks_dist_emotion-use-insertion-effect-wi-3ba6b80.c095373419d05e6f141a.js.map +0 -0
  72. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/static/node_modules_emotion_use-insertion-effect-with-fallbacks_dist_emotion-use-insertion-effect-wi-3ba6b81.61e75fb98ecff46cf836.js +0 -0
  73. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/static/node_modules_emotion_use-insertion-effect-with-fallbacks_dist_emotion-use-insertion-effect-wi-3ba6b81.61e75fb98ecff46cf836.js.map +0 -0
  74. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/static/style.js +0 -0
  75. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_babel_runtime_helpers_esm_extends_js-node_modules_emotion_serialize_dist-051195.e2553aab0c3963b83dd7.js +0 -0
  76. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_babel_runtime_helpers_esm_extends_js-node_modules_emotion_serialize_dist-051195.e2553aab0c3963b83dd7.js.map +0 -0
  77. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_cache_dist_emotion-cache_browser_development_esm_js.24edcc52a1c014a8a5f0.js +0 -0
  78. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_cache_dist_emotion-cache_browser_development_esm_js.24edcc52a1c014a8a5f0.js.map +0 -0
  79. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_react_dist_emotion-react_browser_development_esm_js.19ecf6babe00caff6b8a.js +0 -0
  80. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_react_dist_emotion-react_browser_development_esm_js.19ecf6babe00caff6b8a.js.map +0 -0
  81. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_styled_dist_emotion-styled_browser_development_esm_js.661fb5836f4978a7c6e1.js +0 -0
  82. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_styled_dist_emotion-styled_browser_development_esm_js.661fb5836f4978a7c6e1.js.map +0 -0
  83. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_mui_material_index_js.985697e0162d8d088ca2.js +0 -0
  84. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_mui_material_index_js.985697e0162d8d088ca2.js.map +0 -0
  85. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_mui_material_utils_createSvgIcon_js.1f5038488cdfd8b3a85d.js +0 -0
  86. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.8.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_mui_material_utils_createSvgIcon_js.1f5038488cdfd8b3a85d.js.map +0 -0
  87. {hdsp_jupyter_extension-2.0.6.dist-info → hdsp_jupyter_extension-2.0.8.dist-info}/WHEEL +0 -0
  88. {hdsp_jupyter_extension-2.0.6.dist-info → hdsp_jupyter_extension-2.0.8.dist-info}/licenses/LICENSE +0 -0
@@ -1,240 +0,0 @@
1
- """
2
- Validation Middleware
3
-
4
- Validates code before execution in Jupyter cells.
5
- Uses static analysis (AST, Ruff, Pyflakes) to detect issues.
6
- """
7
-
8
- import logging
9
- from typing import Any, Dict, Optional
10
-
11
- from agent_server.langchain.state import AgentRuntime, AgentState
12
-
13
- logger = logging.getLogger(__name__)
14
-
15
-
16
- class ValidationMiddleware:
17
- """
18
- Middleware that validates code before tool execution.
19
-
20
- This middleware:
21
- 1. Intercepts jupyter_cell tool calls
22
- 2. Validates the code using CodeValidator
23
- 3. Blocks execution if critical errors found
24
- 4. Provides fix suggestions when possible
25
-
26
- Uses @before_tool_call hook pattern from LangChain middleware.
27
- """
28
-
29
- def __init__(
30
- self,
31
- code_validator: Any = None,
32
- block_on_errors: bool = True,
33
- auto_fix: bool = False,
34
- enabled: bool = True,
35
- ):
36
- """
37
- Initialize validation middleware.
38
-
39
- Args:
40
- code_validator: CodeValidator instance
41
- block_on_errors: Block execution if errors found
42
- auto_fix: Attempt auto-fix for fixable issues
43
- enabled: Whether validation is enabled
44
- """
45
- self._validator = code_validator
46
- self._block_on_errors = block_on_errors
47
- self._auto_fix = auto_fix
48
- self._enabled = enabled
49
-
50
- @property
51
- def name(self) -> str:
52
- return "ValidationMiddleware"
53
-
54
- def _get_validator(self):
55
- """Lazy load code validator"""
56
- if self._validator is None:
57
- try:
58
- from agent_server.core.code_validator import CodeValidator
59
- self._validator = CodeValidator()
60
- except ImportError:
61
- logger.warning("CodeValidator not available")
62
- return None
63
- return self._validator
64
-
65
- def _extract_code_from_tool_call(
66
- self,
67
- tool_name: str,
68
- tool_input: Dict[str, Any],
69
- ) -> Optional[str]:
70
- """Extract code from tool call if applicable"""
71
- if tool_name != "jupyter_cell_tool":
72
- return None
73
-
74
- code = tool_input.get("code", "")
75
- if not code:
76
- return None
77
-
78
- return code
79
-
80
- def _validate_code(
81
- self,
82
- code: str,
83
- notebook_context: Dict[str, Any],
84
- ) -> Dict[str, Any]:
85
- """Validate code using CodeValidator"""
86
- validator = self._get_validator()
87
- if validator is None:
88
- return {
89
- "valid": True,
90
- "issues": [],
91
- "summary": "Validation skipped (validator not available)",
92
- }
93
-
94
- try:
95
- # Build context for validator
96
- ctx = {
97
- "definedVariables": notebook_context.get("defined_variables", []),
98
- "importedLibraries": notebook_context.get("imported_libraries", []),
99
- }
100
-
101
- # Reinitialize validator with context
102
- validator_with_ctx = type(validator)(notebook_context=ctx)
103
- result = validator_with_ctx.full_validation(code)
104
-
105
- return {
106
- "valid": result.is_valid,
107
- "issues": [issue.to_dict() for issue in result.issues],
108
- "has_errors": result.has_errors,
109
- "has_warnings": result.has_warnings,
110
- "summary": result.summary,
111
- "dependencies": result.dependencies.to_dict() if result.dependencies else None,
112
- }
113
- except Exception as e:
114
- logger.error(f"Validation failed: {e}")
115
- return {
116
- "valid": True, # Don't block on validation errors
117
- "issues": [],
118
- "summary": f"Validation error: {str(e)}",
119
- }
120
-
121
- async def before_tool_call(
122
- self,
123
- tool_name: str,
124
- tool_input: Dict[str, Any],
125
- state: AgentState,
126
- runtime: AgentRuntime,
127
- ) -> Optional[Dict[str, Any]]:
128
- """
129
- Hook called before each tool execution.
130
-
131
- Validates code for jupyter_cell tool calls.
132
-
133
- Args:
134
- tool_name: Name of the tool being called
135
- tool_input: Tool input parameters
136
- state: Current agent state
137
- runtime: Agent runtime context
138
-
139
- Returns:
140
- Modified tool input, or raises exception to block
141
- """
142
- if not self._enabled:
143
- return None
144
-
145
- code = self._extract_code_from_tool_call(tool_name, tool_input)
146
- if code is None:
147
- return None
148
-
149
- notebook_context = state.get("notebook_context", {})
150
- validation_result = self._validate_code(code, notebook_context)
151
-
152
- # Store validation result in state
153
- state["validation_result"] = validation_result
154
-
155
- if not validation_result.get("valid", True) and self._block_on_errors:
156
- # Get error details
157
- errors = [
158
- issue for issue in validation_result.get("issues", [])
159
- if issue.get("severity") == "error"
160
- ]
161
-
162
- if errors:
163
- error_messages = [
164
- f"- {e.get('category', 'error')}: {e.get('message', 'Unknown error')}"
165
- for e in errors[:5] # Limit to 5 errors
166
- ]
167
-
168
- logger.warning(f"Code validation failed: {len(errors)} errors")
169
-
170
- # Return modified result that includes validation feedback
171
- return {
172
- "code": code,
173
- "validation_failed": True,
174
- "validation_errors": error_messages,
175
- "original_input": tool_input,
176
- }
177
-
178
- # Log warnings but allow execution
179
- warnings = [
180
- issue for issue in validation_result.get("issues", [])
181
- if issue.get("severity") == "warning"
182
- ]
183
- if warnings:
184
- logger.info(f"Code validation: {len(warnings)} warnings")
185
-
186
- return None
187
-
188
- def format_validation_feedback(
189
- self,
190
- validation_result: Dict[str, Any],
191
- ) -> str:
192
- """
193
- Format validation result for feedback to the model.
194
-
195
- Args:
196
- validation_result: Validation result dict
197
-
198
- Returns:
199
- Formatted feedback string
200
- """
201
- if validation_result.get("valid", True):
202
- return ""
203
-
204
- lines = ["## Code Validation Issues"]
205
-
206
- for issue in validation_result.get("issues", [])[:10]:
207
- severity = issue.get("severity", "info")
208
- category = issue.get("category", "unknown")
209
- message = issue.get("message", "")
210
- line = issue.get("line")
211
-
212
- location = f"L{line}" if line else ""
213
- lines.append(f"- [{severity.upper()}] {category}{location}: {message}")
214
-
215
- lines.append("\nPlease fix these issues before execution.")
216
-
217
- return "\n".join(lines)
218
-
219
-
220
- def create_validation_middleware(
221
- block_on_errors: bool = True,
222
- auto_fix: bool = False,
223
- enabled: bool = True,
224
- ) -> ValidationMiddleware:
225
- """
226
- Factory function to create validation middleware.
227
-
228
- Args:
229
- block_on_errors: Block execution on validation errors
230
- auto_fix: Attempt auto-fix for issues
231
- enabled: Whether to enable validation
232
-
233
- Returns:
234
- Configured ValidationMiddleware instance
235
- """
236
- return ValidationMiddleware(
237
- block_on_errors=block_on_errors,
238
- auto_fix=auto_fix,
239
- enabled=enabled,
240
- )