amd-gaia 0.14.3__py3-none-any.whl → 0.15.1__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.
- {amd_gaia-0.14.3.dist-info → amd_gaia-0.15.1.dist-info}/METADATA +223 -223
- amd_gaia-0.15.1.dist-info/RECORD +178 -0
- {amd_gaia-0.14.3.dist-info → amd_gaia-0.15.1.dist-info}/entry_points.txt +1 -0
- {amd_gaia-0.14.3.dist-info → amd_gaia-0.15.1.dist-info}/licenses/LICENSE.md +20 -20
- gaia/__init__.py +29 -29
- gaia/agents/__init__.py +19 -19
- gaia/agents/base/__init__.py +9 -9
- gaia/agents/base/agent.py +2177 -2177
- gaia/agents/base/api_agent.py +120 -120
- gaia/agents/base/console.py +1841 -1841
- gaia/agents/base/errors.py +237 -237
- gaia/agents/base/mcp_agent.py +86 -86
- gaia/agents/base/tools.py +83 -83
- gaia/agents/blender/agent.py +556 -556
- gaia/agents/blender/agent_simple.py +133 -135
- gaia/agents/blender/app.py +211 -211
- gaia/agents/blender/app_simple.py +41 -41
- gaia/agents/blender/core/__init__.py +16 -16
- gaia/agents/blender/core/materials.py +506 -506
- gaia/agents/blender/core/objects.py +316 -316
- gaia/agents/blender/core/rendering.py +225 -225
- gaia/agents/blender/core/scene.py +220 -220
- gaia/agents/blender/core/view.py +146 -146
- gaia/agents/chat/__init__.py +9 -9
- gaia/agents/chat/agent.py +835 -835
- gaia/agents/chat/app.py +1058 -1058
- gaia/agents/chat/session.py +508 -508
- gaia/agents/chat/tools/__init__.py +15 -15
- gaia/agents/chat/tools/file_tools.py +96 -96
- gaia/agents/chat/tools/rag_tools.py +1729 -1729
- gaia/agents/chat/tools/shell_tools.py +436 -436
- gaia/agents/code/__init__.py +7 -7
- gaia/agents/code/agent.py +549 -549
- gaia/agents/code/cli.py +377 -0
- gaia/agents/code/models.py +135 -135
- gaia/agents/code/orchestration/__init__.py +24 -24
- gaia/agents/code/orchestration/checklist_executor.py +1763 -1763
- gaia/agents/code/orchestration/checklist_generator.py +713 -713
- gaia/agents/code/orchestration/factories/__init__.py +9 -9
- gaia/agents/code/orchestration/factories/base.py +63 -63
- gaia/agents/code/orchestration/factories/nextjs_factory.py +118 -118
- gaia/agents/code/orchestration/factories/python_factory.py +106 -106
- gaia/agents/code/orchestration/orchestrator.py +841 -841
- gaia/agents/code/orchestration/project_analyzer.py +391 -391
- gaia/agents/code/orchestration/steps/__init__.py +67 -67
- gaia/agents/code/orchestration/steps/base.py +188 -188
- gaia/agents/code/orchestration/steps/error_handler.py +314 -314
- gaia/agents/code/orchestration/steps/nextjs.py +828 -828
- gaia/agents/code/orchestration/steps/python.py +307 -307
- gaia/agents/code/orchestration/template_catalog.py +469 -469
- gaia/agents/code/orchestration/workflows/__init__.py +14 -14
- gaia/agents/code/orchestration/workflows/base.py +80 -80
- gaia/agents/code/orchestration/workflows/nextjs.py +186 -186
- gaia/agents/code/orchestration/workflows/python.py +94 -94
- gaia/agents/code/prompts/__init__.py +11 -11
- gaia/agents/code/prompts/base_prompt.py +77 -77
- gaia/agents/code/prompts/code_patterns.py +2036 -2036
- gaia/agents/code/prompts/nextjs_prompt.py +40 -40
- gaia/agents/code/prompts/python_prompt.py +109 -109
- gaia/agents/code/schema_inference.py +365 -365
- gaia/agents/code/system_prompt.py +41 -41
- gaia/agents/code/tools/__init__.py +42 -42
- gaia/agents/code/tools/cli_tools.py +1138 -1138
- gaia/agents/code/tools/code_formatting.py +319 -319
- gaia/agents/code/tools/code_tools.py +769 -769
- gaia/agents/code/tools/error_fixing.py +1347 -1347
- gaia/agents/code/tools/external_tools.py +180 -180
- gaia/agents/code/tools/file_io.py +845 -845
- gaia/agents/code/tools/prisma_tools.py +190 -190
- gaia/agents/code/tools/project_management.py +1016 -1016
- gaia/agents/code/tools/testing.py +321 -321
- gaia/agents/code/tools/typescript_tools.py +122 -122
- gaia/agents/code/tools/validation_parsing.py +461 -461
- gaia/agents/code/tools/validation_tools.py +806 -806
- gaia/agents/code/tools/web_dev_tools.py +1758 -1758
- gaia/agents/code/validators/__init__.py +16 -16
- gaia/agents/code/validators/antipattern_checker.py +241 -241
- gaia/agents/code/validators/ast_analyzer.py +197 -197
- gaia/agents/code/validators/requirements_validator.py +145 -145
- gaia/agents/code/validators/syntax_validator.py +171 -171
- gaia/agents/docker/__init__.py +7 -7
- gaia/agents/docker/agent.py +642 -642
- gaia/agents/emr/__init__.py +8 -8
- gaia/agents/emr/agent.py +1506 -1506
- gaia/agents/emr/cli.py +1322 -1322
- gaia/agents/emr/constants.py +475 -475
- gaia/agents/emr/dashboard/__init__.py +4 -4
- gaia/agents/emr/dashboard/server.py +1974 -1974
- gaia/agents/jira/__init__.py +11 -11
- gaia/agents/jira/agent.py +894 -894
- gaia/agents/jira/jql_templates.py +299 -299
- gaia/agents/routing/__init__.py +7 -7
- gaia/agents/routing/agent.py +567 -570
- gaia/agents/routing/system_prompt.py +75 -75
- gaia/agents/summarize/__init__.py +11 -0
- gaia/agents/summarize/agent.py +885 -0
- gaia/agents/summarize/prompts.py +129 -0
- gaia/api/__init__.py +23 -23
- gaia/api/agent_registry.py +238 -238
- gaia/api/app.py +305 -305
- gaia/api/openai_server.py +575 -575
- gaia/api/schemas.py +186 -186
- gaia/api/sse_handler.py +373 -373
- gaia/apps/__init__.py +4 -4
- gaia/apps/llm/__init__.py +6 -6
- gaia/apps/llm/app.py +173 -169
- gaia/apps/summarize/app.py +116 -633
- gaia/apps/summarize/html_viewer.py +133 -133
- gaia/apps/summarize/pdf_formatter.py +284 -284
- gaia/audio/__init__.py +2 -2
- gaia/audio/audio_client.py +439 -439
- gaia/audio/audio_recorder.py +269 -269
- gaia/audio/kokoro_tts.py +599 -599
- gaia/audio/whisper_asr.py +432 -432
- gaia/chat/__init__.py +16 -16
- gaia/chat/app.py +430 -430
- gaia/chat/prompts.py +522 -522
- gaia/chat/sdk.py +1228 -1225
- gaia/cli.py +5481 -5621
- gaia/database/__init__.py +10 -10
- gaia/database/agent.py +176 -176
- gaia/database/mixin.py +290 -290
- gaia/database/testing.py +64 -64
- gaia/eval/batch_experiment.py +2332 -2332
- gaia/eval/claude.py +542 -542
- gaia/eval/config.py +37 -37
- gaia/eval/email_generator.py +512 -512
- gaia/eval/eval.py +3179 -3179
- gaia/eval/groundtruth.py +1130 -1130
- gaia/eval/transcript_generator.py +582 -582
- gaia/eval/webapp/README.md +167 -167
- gaia/eval/webapp/package-lock.json +875 -875
- gaia/eval/webapp/package.json +20 -20
- gaia/eval/webapp/public/app.js +3402 -3402
- gaia/eval/webapp/public/index.html +87 -87
- gaia/eval/webapp/public/styles.css +3661 -3661
- gaia/eval/webapp/server.js +415 -415
- gaia/eval/webapp/test-setup.js +72 -72
- gaia/llm/__init__.py +9 -2
- gaia/llm/base_client.py +60 -0
- gaia/llm/exceptions.py +12 -0
- gaia/llm/factory.py +70 -0
- gaia/llm/lemonade_client.py +3236 -3221
- gaia/llm/lemonade_manager.py +294 -294
- gaia/llm/providers/__init__.py +9 -0
- gaia/llm/providers/claude.py +108 -0
- gaia/llm/providers/lemonade.py +120 -0
- gaia/llm/providers/openai_provider.py +79 -0
- gaia/llm/vlm_client.py +382 -382
- gaia/logger.py +189 -189
- gaia/mcp/agent_mcp_server.py +245 -245
- gaia/mcp/blender_mcp_client.py +138 -138
- gaia/mcp/blender_mcp_server.py +648 -648
- gaia/mcp/context7_cache.py +332 -332
- gaia/mcp/external_services.py +518 -518
- gaia/mcp/mcp_bridge.py +811 -550
- gaia/mcp/servers/__init__.py +6 -6
- gaia/mcp/servers/docker_mcp.py +83 -83
- gaia/perf_analysis.py +361 -0
- gaia/rag/__init__.py +10 -10
- gaia/rag/app.py +293 -293
- gaia/rag/demo.py +304 -304
- gaia/rag/pdf_utils.py +235 -235
- gaia/rag/sdk.py +2194 -2194
- gaia/security.py +163 -163
- gaia/talk/app.py +289 -289
- gaia/talk/sdk.py +538 -538
- gaia/testing/__init__.py +87 -87
- gaia/testing/assertions.py +330 -330
- gaia/testing/fixtures.py +333 -333
- gaia/testing/mocks.py +493 -493
- gaia/util.py +46 -46
- gaia/utils/__init__.py +33 -33
- gaia/utils/file_watcher.py +675 -675
- gaia/utils/parsing.py +223 -223
- gaia/version.py +100 -100
- amd_gaia-0.14.3.dist-info/RECORD +0 -168
- gaia/agents/code/app.py +0 -266
- gaia/llm/llm_client.py +0 -729
- {amd_gaia-0.14.3.dist-info → amd_gaia-0.15.1.dist-info}/WHEEL +0 -0
- {amd_gaia-0.14.3.dist-info → amd_gaia-0.15.1.dist-info}/top_level.txt +0 -0
|
@@ -1,180 +1,180 @@
|
|
|
1
|
-
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
"""External MCP service tools for Code Agent.
|
|
4
|
-
|
|
5
|
-
Provides tools for:
|
|
6
|
-
- Context7: Documentation lookup and library reference search
|
|
7
|
-
- Perplexity: Web search for current information and best practices
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
import logging
|
|
11
|
-
from typing import Any, Dict, Optional
|
|
12
|
-
|
|
13
|
-
logger = logging.getLogger(__name__)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class ExternalToolsMixin:
|
|
17
|
-
"""Mixin providing external MCP service tools.
|
|
18
|
-
|
|
19
|
-
This mixin provides tools for:
|
|
20
|
-
- Searching library documentation (Context7)
|
|
21
|
-
- Searching the web for current information (Perplexity)
|
|
22
|
-
|
|
23
|
-
Tools provided:
|
|
24
|
-
- search_documentation: Search library documentation and code examples
|
|
25
|
-
- search_web: Search the web for current information
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
def register_external_tools(self) -> None:
|
|
29
|
-
"""Register all external service tools."""
|
|
30
|
-
from gaia.agents.base.tools import tool
|
|
31
|
-
from gaia.mcp.external_services import (
|
|
32
|
-
get_context7_service,
|
|
33
|
-
get_perplexity_service,
|
|
34
|
-
)
|
|
35
|
-
|
|
36
|
-
# ============================================================
|
|
37
|
-
# CONTEXT7 DOCUMENTATION SEARCH
|
|
38
|
-
# ============================================================
|
|
39
|
-
|
|
40
|
-
@tool
|
|
41
|
-
def search_documentation(
|
|
42
|
-
query: str, library: Optional[str] = None
|
|
43
|
-
) -> Dict[str, Any]:
|
|
44
|
-
"""Search library documentation and code examples using Context7.
|
|
45
|
-
|
|
46
|
-
IMPORTANT: This is an OPTIONAL tool that may not be available. If unavailable,
|
|
47
|
-
use your embedded knowledge from training data.
|
|
48
|
-
|
|
49
|
-
Use this tool when you need to look up:
|
|
50
|
-
- Library API documentation
|
|
51
|
-
- Code examples and usage patterns
|
|
52
|
-
- Best practices for specific libraries
|
|
53
|
-
- Function/class signatures and parameters
|
|
54
|
-
|
|
55
|
-
Args:
|
|
56
|
-
query: The search query or topic (e.g., "useState hook", "async/await")
|
|
57
|
-
library: Optional library name to search in (e.g., "react", "tensorflow", "fastapi").
|
|
58
|
-
If not specified, Context7 will search across relevant libraries.
|
|
59
|
-
|
|
60
|
-
Returns:
|
|
61
|
-
Dictionary containing:
|
|
62
|
-
- success: Whether the search was successful
|
|
63
|
-
- documentation: Retrieved documentation text with code examples
|
|
64
|
-
- error: Error message if search failed
|
|
65
|
-
- guidance: Helpful guidance when tool is unavailable
|
|
66
|
-
|
|
67
|
-
Example usage:
|
|
68
|
-
# Search React documentation for useState
|
|
69
|
-
result = search_documentation("useState hook", library="react")
|
|
70
|
-
|
|
71
|
-
# Search for general Python async patterns
|
|
72
|
-
result = search_documentation("async/await best practices")
|
|
73
|
-
"""
|
|
74
|
-
try:
|
|
75
|
-
logger.info(
|
|
76
|
-
f"Searching documentation: query='{query}', library={library}"
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
service = get_context7_service()
|
|
80
|
-
result = service.search_documentation(query, library)
|
|
81
|
-
|
|
82
|
-
# If Context7 is unavailable, provide helpful guidance
|
|
83
|
-
if result.get("unavailable"):
|
|
84
|
-
logger.info(
|
|
85
|
-
"Context7 not available - guiding LLM to use embedded knowledge"
|
|
86
|
-
)
|
|
87
|
-
return {
|
|
88
|
-
"success": False,
|
|
89
|
-
"documentation": "",
|
|
90
|
-
"error": "Context7 not available. Use your embedded knowledge for this pattern.",
|
|
91
|
-
"guidance": "Most common library patterns are in your training data. Try the standard approach first. If you encounter errors after 2 attempts, escalate to the user.",
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
if result.get("success"):
|
|
95
|
-
logger.info("Documentation search successful")
|
|
96
|
-
return {
|
|
97
|
-
"success": True,
|
|
98
|
-
"documentation": result.get("documentation", ""),
|
|
99
|
-
}
|
|
100
|
-
else:
|
|
101
|
-
error_msg = result.get("error", "Unknown error")
|
|
102
|
-
logger.warning(f"Documentation search failed: {error_msg}")
|
|
103
|
-
return {
|
|
104
|
-
"success": False,
|
|
105
|
-
"documentation": "",
|
|
106
|
-
"error": error_msg,
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
except Exception as e:
|
|
110
|
-
logger.error(f"Documentation search error: {e}", exc_info=True)
|
|
111
|
-
return {
|
|
112
|
-
"success": False,
|
|
113
|
-
"documentation": "",
|
|
114
|
-
"error": f"Search failed: {str(e)}",
|
|
115
|
-
"guidance": "The documentation search tool failed. Use your embedded knowledge for common patterns.",
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
# ============================================================
|
|
119
|
-
# PERPLEXITY WEB SEARCH
|
|
120
|
-
# ============================================================
|
|
121
|
-
|
|
122
|
-
@tool
|
|
123
|
-
def search_web(query: str) -> Dict[str, Any]:
|
|
124
|
-
"""Search the web for current information using Perplexity AI.
|
|
125
|
-
|
|
126
|
-
Use this tool when you need to look up:
|
|
127
|
-
- Current best practices or trends
|
|
128
|
-
- Recent updates or changes to libraries/frameworks
|
|
129
|
-
- Solutions to specific problems or errors
|
|
130
|
-
- Comparisons between different approaches
|
|
131
|
-
- Information not available in library documentation
|
|
132
|
-
|
|
133
|
-
Args:
|
|
134
|
-
query: The search query (e.g., "latest Python best practices 2025",
|
|
135
|
-
"how to fix CORS error in FastAPI")
|
|
136
|
-
|
|
137
|
-
Returns:
|
|
138
|
-
Dictionary containing:
|
|
139
|
-
- success: Whether the search was successful
|
|
140
|
-
- answer: Concise answer with relevant information
|
|
141
|
-
- error: Error message if search failed
|
|
142
|
-
|
|
143
|
-
Example usage:
|
|
144
|
-
# Search for current best practices
|
|
145
|
-
result = search_web("Python async best practices 2025")
|
|
146
|
-
|
|
147
|
-
# Search for error solutions
|
|
148
|
-
result = search_web("how to fix ModuleNotFoundError in Python")
|
|
149
|
-
|
|
150
|
-
Note:
|
|
151
|
-
Requires PERPLEXITY_API_KEY environment variable to be set.
|
|
152
|
-
"""
|
|
153
|
-
try:
|
|
154
|
-
logger.info(f"Searching web: query='{query}'")
|
|
155
|
-
|
|
156
|
-
service = get_perplexity_service()
|
|
157
|
-
result = service.search_web(query)
|
|
158
|
-
|
|
159
|
-
if result.get("success"):
|
|
160
|
-
logger.info("Web search successful")
|
|
161
|
-
return {
|
|
162
|
-
"success": True,
|
|
163
|
-
"answer": result.get("answer", ""),
|
|
164
|
-
}
|
|
165
|
-
else:
|
|
166
|
-
error_msg = result.get("error", "Unknown error")
|
|
167
|
-
logger.warning(f"Web search failed: {error_msg}")
|
|
168
|
-
return {
|
|
169
|
-
"success": False,
|
|
170
|
-
"answer": "",
|
|
171
|
-
"error": error_msg,
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
except Exception as e:
|
|
175
|
-
logger.error(f"Web search error: {e}", exc_info=True)
|
|
176
|
-
return {
|
|
177
|
-
"success": False,
|
|
178
|
-
"answer": "",
|
|
179
|
-
"error": f"Search failed: {str(e)}",
|
|
180
|
-
}
|
|
1
|
+
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
"""External MCP service tools for Code Agent.
|
|
4
|
+
|
|
5
|
+
Provides tools for:
|
|
6
|
+
- Context7: Documentation lookup and library reference search
|
|
7
|
+
- Perplexity: Web search for current information and best practices
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
from typing import Any, Dict, Optional
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ExternalToolsMixin:
|
|
17
|
+
"""Mixin providing external MCP service tools.
|
|
18
|
+
|
|
19
|
+
This mixin provides tools for:
|
|
20
|
+
- Searching library documentation (Context7)
|
|
21
|
+
- Searching the web for current information (Perplexity)
|
|
22
|
+
|
|
23
|
+
Tools provided:
|
|
24
|
+
- search_documentation: Search library documentation and code examples
|
|
25
|
+
- search_web: Search the web for current information
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def register_external_tools(self) -> None:
|
|
29
|
+
"""Register all external service tools."""
|
|
30
|
+
from gaia.agents.base.tools import tool
|
|
31
|
+
from gaia.mcp.external_services import (
|
|
32
|
+
get_context7_service,
|
|
33
|
+
get_perplexity_service,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
# ============================================================
|
|
37
|
+
# CONTEXT7 DOCUMENTATION SEARCH
|
|
38
|
+
# ============================================================
|
|
39
|
+
|
|
40
|
+
@tool
|
|
41
|
+
def search_documentation(
|
|
42
|
+
query: str, library: Optional[str] = None
|
|
43
|
+
) -> Dict[str, Any]:
|
|
44
|
+
"""Search library documentation and code examples using Context7.
|
|
45
|
+
|
|
46
|
+
IMPORTANT: This is an OPTIONAL tool that may not be available. If unavailable,
|
|
47
|
+
use your embedded knowledge from training data.
|
|
48
|
+
|
|
49
|
+
Use this tool when you need to look up:
|
|
50
|
+
- Library API documentation
|
|
51
|
+
- Code examples and usage patterns
|
|
52
|
+
- Best practices for specific libraries
|
|
53
|
+
- Function/class signatures and parameters
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
query: The search query or topic (e.g., "useState hook", "async/await")
|
|
57
|
+
library: Optional library name to search in (e.g., "react", "tensorflow", "fastapi").
|
|
58
|
+
If not specified, Context7 will search across relevant libraries.
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
Dictionary containing:
|
|
62
|
+
- success: Whether the search was successful
|
|
63
|
+
- documentation: Retrieved documentation text with code examples
|
|
64
|
+
- error: Error message if search failed
|
|
65
|
+
- guidance: Helpful guidance when tool is unavailable
|
|
66
|
+
|
|
67
|
+
Example usage:
|
|
68
|
+
# Search React documentation for useState
|
|
69
|
+
result = search_documentation("useState hook", library="react")
|
|
70
|
+
|
|
71
|
+
# Search for general Python async patterns
|
|
72
|
+
result = search_documentation("async/await best practices")
|
|
73
|
+
"""
|
|
74
|
+
try:
|
|
75
|
+
logger.info(
|
|
76
|
+
f"Searching documentation: query='{query}', library={library}"
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
service = get_context7_service()
|
|
80
|
+
result = service.search_documentation(query, library)
|
|
81
|
+
|
|
82
|
+
# If Context7 is unavailable, provide helpful guidance
|
|
83
|
+
if result.get("unavailable"):
|
|
84
|
+
logger.info(
|
|
85
|
+
"Context7 not available - guiding LLM to use embedded knowledge"
|
|
86
|
+
)
|
|
87
|
+
return {
|
|
88
|
+
"success": False,
|
|
89
|
+
"documentation": "",
|
|
90
|
+
"error": "Context7 not available. Use your embedded knowledge for this pattern.",
|
|
91
|
+
"guidance": "Most common library patterns are in your training data. Try the standard approach first. If you encounter errors after 2 attempts, escalate to the user.",
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if result.get("success"):
|
|
95
|
+
logger.info("Documentation search successful")
|
|
96
|
+
return {
|
|
97
|
+
"success": True,
|
|
98
|
+
"documentation": result.get("documentation", ""),
|
|
99
|
+
}
|
|
100
|
+
else:
|
|
101
|
+
error_msg = result.get("error", "Unknown error")
|
|
102
|
+
logger.warning(f"Documentation search failed: {error_msg}")
|
|
103
|
+
return {
|
|
104
|
+
"success": False,
|
|
105
|
+
"documentation": "",
|
|
106
|
+
"error": error_msg,
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
except Exception as e:
|
|
110
|
+
logger.error(f"Documentation search error: {e}", exc_info=True)
|
|
111
|
+
return {
|
|
112
|
+
"success": False,
|
|
113
|
+
"documentation": "",
|
|
114
|
+
"error": f"Search failed: {str(e)}",
|
|
115
|
+
"guidance": "The documentation search tool failed. Use your embedded knowledge for common patterns.",
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
# ============================================================
|
|
119
|
+
# PERPLEXITY WEB SEARCH
|
|
120
|
+
# ============================================================
|
|
121
|
+
|
|
122
|
+
@tool
|
|
123
|
+
def search_web(query: str) -> Dict[str, Any]:
|
|
124
|
+
"""Search the web for current information using Perplexity AI.
|
|
125
|
+
|
|
126
|
+
Use this tool when you need to look up:
|
|
127
|
+
- Current best practices or trends
|
|
128
|
+
- Recent updates or changes to libraries/frameworks
|
|
129
|
+
- Solutions to specific problems or errors
|
|
130
|
+
- Comparisons between different approaches
|
|
131
|
+
- Information not available in library documentation
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
query: The search query (e.g., "latest Python best practices 2025",
|
|
135
|
+
"how to fix CORS error in FastAPI")
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
Dictionary containing:
|
|
139
|
+
- success: Whether the search was successful
|
|
140
|
+
- answer: Concise answer with relevant information
|
|
141
|
+
- error: Error message if search failed
|
|
142
|
+
|
|
143
|
+
Example usage:
|
|
144
|
+
# Search for current best practices
|
|
145
|
+
result = search_web("Python async best practices 2025")
|
|
146
|
+
|
|
147
|
+
# Search for error solutions
|
|
148
|
+
result = search_web("how to fix ModuleNotFoundError in Python")
|
|
149
|
+
|
|
150
|
+
Note:
|
|
151
|
+
Requires PERPLEXITY_API_KEY environment variable to be set.
|
|
152
|
+
"""
|
|
153
|
+
try:
|
|
154
|
+
logger.info(f"Searching web: query='{query}'")
|
|
155
|
+
|
|
156
|
+
service = get_perplexity_service()
|
|
157
|
+
result = service.search_web(query)
|
|
158
|
+
|
|
159
|
+
if result.get("success"):
|
|
160
|
+
logger.info("Web search successful")
|
|
161
|
+
return {
|
|
162
|
+
"success": True,
|
|
163
|
+
"answer": result.get("answer", ""),
|
|
164
|
+
}
|
|
165
|
+
else:
|
|
166
|
+
error_msg = result.get("error", "Unknown error")
|
|
167
|
+
logger.warning(f"Web search failed: {error_msg}")
|
|
168
|
+
return {
|
|
169
|
+
"success": False,
|
|
170
|
+
"answer": "",
|
|
171
|
+
"error": error_msg,
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
except Exception as e:
|
|
175
|
+
logger.error(f"Web search error: {e}", exc_info=True)
|
|
176
|
+
return {
|
|
177
|
+
"success": False,
|
|
178
|
+
"answer": "",
|
|
179
|
+
"error": f"Search failed: {str(e)}",
|
|
180
|
+
}
|