amd-gaia 0.15.0__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.15.0.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.15.0.dist-info → amd_gaia-0.15.1.dist-info}/entry_points.txt +1 -0
- {amd_gaia-0.15.0.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 -5632
- 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.15.0.dist-info/RECORD +0 -168
- gaia/agents/code/app.py +0 -266
- gaia/llm/llm_client.py +0 -723
- {amd_gaia-0.15.0.dist-info → amd_gaia-0.15.1.dist-info}/WHEEL +0 -0
- {amd_gaia-0.15.0.dist-info → amd_gaia-0.15.1.dist-info}/top_level.txt +0 -0
gaia/logger.py
CHANGED
|
@@ -1,189 +1,189 @@
|
|
|
1
|
-
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
|
|
4
|
-
import io
|
|
5
|
-
import logging
|
|
6
|
-
import subprocess
|
|
7
|
-
import sys
|
|
8
|
-
import warnings
|
|
9
|
-
from pathlib import Path
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def configure_console_encoding():
|
|
13
|
-
"""Configure console encoding to support Unicode characters on Windows."""
|
|
14
|
-
if sys.platform.startswith("win"):
|
|
15
|
-
try:
|
|
16
|
-
# Get the original stdout/stderr
|
|
17
|
-
original_stdout = sys.stdout
|
|
18
|
-
original_stderr = sys.stderr
|
|
19
|
-
|
|
20
|
-
# Wrap with UTF-8 encoding, using 'replace' error handling
|
|
21
|
-
sys.stdout = io.TextIOWrapper(
|
|
22
|
-
original_stdout.buffer,
|
|
23
|
-
encoding="utf-8",
|
|
24
|
-
errors="replace",
|
|
25
|
-
line_buffering=True,
|
|
26
|
-
)
|
|
27
|
-
sys.stderr = io.TextIOWrapper(
|
|
28
|
-
original_stderr.buffer,
|
|
29
|
-
encoding="utf-8",
|
|
30
|
-
errors="replace",
|
|
31
|
-
line_buffering=True,
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
# Also try to set the console code page to UTF-8
|
|
35
|
-
try:
|
|
36
|
-
subprocess.run(
|
|
37
|
-
["chcp", "65001"], capture_output=True, shell=True, check=False
|
|
38
|
-
)
|
|
39
|
-
except (subprocess.SubprocessError, OSError, FileNotFoundError):
|
|
40
|
-
pass # Ignore if chcp command fails
|
|
41
|
-
|
|
42
|
-
except Exception:
|
|
43
|
-
# If configuration fails, fall back to original streams
|
|
44
|
-
pass
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
class GaiaLogger:
|
|
48
|
-
def __init__(self, log_file="gaia.log"):
|
|
49
|
-
# Configure console encoding for Unicode support first
|
|
50
|
-
configure_console_encoding()
|
|
51
|
-
|
|
52
|
-
self.log_file = Path(log_file)
|
|
53
|
-
self.loggers = {}
|
|
54
|
-
|
|
55
|
-
# Filter warnings
|
|
56
|
-
warnings.filterwarnings(
|
|
57
|
-
"ignore", message="dropout option adds dropout after all but last"
|
|
58
|
-
)
|
|
59
|
-
warnings.filterwarnings(
|
|
60
|
-
"ignore", message="torch.nn.utils.weight_norm is deprecated"
|
|
61
|
-
)
|
|
62
|
-
|
|
63
|
-
# Define color codes
|
|
64
|
-
self.colors = {
|
|
65
|
-
"DEBUG": "\033[37m", # White
|
|
66
|
-
"INFO": "\033[37m", # White
|
|
67
|
-
"WARNING": "\033[33m", # Yellow
|
|
68
|
-
"ERROR": "\033[31m", # Red
|
|
69
|
-
"CRITICAL": "\033[41m", # Red background
|
|
70
|
-
"RESET": "\033[0m", # Reset color
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
# Base configuration
|
|
74
|
-
self.default_level = logging.INFO
|
|
75
|
-
|
|
76
|
-
# Create colored formatter for console and regular formatter for file
|
|
77
|
-
console_formatter = logging.Formatter(
|
|
78
|
-
"%(asctime)s | %(color)s%(levelname)s%(reset)s | %(name)s.%(funcName)s | %(filename)s:%(lineno)d | %(message)s",
|
|
79
|
-
datefmt="[%Y-%m-%d %H:%M:%S]",
|
|
80
|
-
)
|
|
81
|
-
file_formatter = logging.Formatter(
|
|
82
|
-
"[%(asctime)s] | %(levelname)s | %(name)s.%(funcName)s | %(filename)s:%(lineno)d | %(message)s"
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
# Create and configure handlers with Unicode support
|
|
86
|
-
console_handler = logging.StreamHandler(sys.stdout)
|
|
87
|
-
console_handler.setFormatter(console_formatter)
|
|
88
|
-
|
|
89
|
-
# Configure file handler with UTF-8 encoding
|
|
90
|
-
file_handler = logging.FileHandler(self.log_file, encoding="utf-8")
|
|
91
|
-
file_handler.setFormatter(file_formatter)
|
|
92
|
-
|
|
93
|
-
# Configure root logger
|
|
94
|
-
root_logger = logging.getLogger()
|
|
95
|
-
root_logger.setLevel(self.default_level)
|
|
96
|
-
root_logger.addHandler(console_handler)
|
|
97
|
-
root_logger.addHandler(file_handler)
|
|
98
|
-
|
|
99
|
-
# Add color filter to console handler
|
|
100
|
-
console_handler.addFilter(self.add_color_filter)
|
|
101
|
-
|
|
102
|
-
# Default levels for different modules
|
|
103
|
-
self.default_levels = {
|
|
104
|
-
"gaia.agents": logging.INFO,
|
|
105
|
-
"gaia.llm": logging.INFO,
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
# Suppress specific aiohttp.access log messages
|
|
109
|
-
aiohttp_access_logger = logging.getLogger("aiohttp.access")
|
|
110
|
-
aiohttp_access_logger.addFilter(self.filter_aiohttp_access)
|
|
111
|
-
|
|
112
|
-
# Suppress specific datasets log messages
|
|
113
|
-
datasets_logger = logging.getLogger("datasets")
|
|
114
|
-
datasets_logger.addFilter(self.filter_datasets)
|
|
115
|
-
|
|
116
|
-
# Suppress specific httpx log messages
|
|
117
|
-
httpx_logger = logging.getLogger("httpx")
|
|
118
|
-
httpx_logger.addFilter(self.filter_httpx)
|
|
119
|
-
|
|
120
|
-
# Suppress phonemizer warnings
|
|
121
|
-
phonemizer_logger = logging.getLogger("phonemizer")
|
|
122
|
-
phonemizer_logger.addFilter(self.filter_phonemizer)
|
|
123
|
-
|
|
124
|
-
def add_color_filter(self, record):
|
|
125
|
-
record.color = self.colors.get(record.levelname, "")
|
|
126
|
-
record.reset = self.colors["RESET"]
|
|
127
|
-
return True
|
|
128
|
-
|
|
129
|
-
def filter_aiohttp_access(self, record):
|
|
130
|
-
return not (
|
|
131
|
-
record.name == "aiohttp.access"
|
|
132
|
-
and "POST /stream_to_ui" in record.getMessage()
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
def filter_datasets(self, record):
|
|
136
|
-
return not (
|
|
137
|
-
"PyTorch version" in record.getMessage()
|
|
138
|
-
and "available." in record.getMessage()
|
|
139
|
-
)
|
|
140
|
-
|
|
141
|
-
def filter_httpx(self, record):
|
|
142
|
-
message = record.getMessage()
|
|
143
|
-
return not ("HTTP Request:" in message and "HTTP/1.1 200 OK" in message)
|
|
144
|
-
|
|
145
|
-
def filter_phonemizer(self, record):
|
|
146
|
-
message = record.getMessage()
|
|
147
|
-
return "words count mismatch" not in message
|
|
148
|
-
|
|
149
|
-
def get_logger(self, name):
|
|
150
|
-
if name not in self.loggers:
|
|
151
|
-
logger = logging.getLogger(name)
|
|
152
|
-
level = self._get_level_for_module(name)
|
|
153
|
-
logger.setLevel(level)
|
|
154
|
-
self.loggers[name] = logger
|
|
155
|
-
return self.loggers[name]
|
|
156
|
-
|
|
157
|
-
def _get_level_for_module(self, name):
|
|
158
|
-
for module, level in self.default_levels.items():
|
|
159
|
-
if module in name:
|
|
160
|
-
return level
|
|
161
|
-
return self.default_level
|
|
162
|
-
|
|
163
|
-
def set_level(self, name, level):
|
|
164
|
-
"""Set logging level for a logger name or prefix.
|
|
165
|
-
|
|
166
|
-
If name matches an existing logger exactly, update that logger.
|
|
167
|
-
Otherwise, set as default_level for future loggers matching the prefix.
|
|
168
|
-
Also updates all existing loggers that start with the given name prefix.
|
|
169
|
-
"""
|
|
170
|
-
# Update exact match if it exists
|
|
171
|
-
if name in self.loggers:
|
|
172
|
-
self.loggers[name].setLevel(level)
|
|
173
|
-
|
|
174
|
-
# Update all existing loggers that start with this prefix
|
|
175
|
-
for logger_name, logger in self.loggers.items():
|
|
176
|
-
if logger_name.startswith(name + ".") or logger_name == name:
|
|
177
|
-
logger.setLevel(level)
|
|
178
|
-
|
|
179
|
-
# Set as default for future loggers matching this prefix
|
|
180
|
-
self.default_levels[name] = level
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
# Create a global instance
|
|
184
|
-
log_manager = GaiaLogger()
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
# Convenience function to get a logger
|
|
188
|
-
def get_logger(name):
|
|
189
|
-
return log_manager.get_logger(name)
|
|
1
|
+
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
|
|
4
|
+
import io
|
|
5
|
+
import logging
|
|
6
|
+
import subprocess
|
|
7
|
+
import sys
|
|
8
|
+
import warnings
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def configure_console_encoding():
|
|
13
|
+
"""Configure console encoding to support Unicode characters on Windows."""
|
|
14
|
+
if sys.platform.startswith("win"):
|
|
15
|
+
try:
|
|
16
|
+
# Get the original stdout/stderr
|
|
17
|
+
original_stdout = sys.stdout
|
|
18
|
+
original_stderr = sys.stderr
|
|
19
|
+
|
|
20
|
+
# Wrap with UTF-8 encoding, using 'replace' error handling
|
|
21
|
+
sys.stdout = io.TextIOWrapper(
|
|
22
|
+
original_stdout.buffer,
|
|
23
|
+
encoding="utf-8",
|
|
24
|
+
errors="replace",
|
|
25
|
+
line_buffering=True,
|
|
26
|
+
)
|
|
27
|
+
sys.stderr = io.TextIOWrapper(
|
|
28
|
+
original_stderr.buffer,
|
|
29
|
+
encoding="utf-8",
|
|
30
|
+
errors="replace",
|
|
31
|
+
line_buffering=True,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
# Also try to set the console code page to UTF-8
|
|
35
|
+
try:
|
|
36
|
+
subprocess.run(
|
|
37
|
+
["chcp", "65001"], capture_output=True, shell=True, check=False
|
|
38
|
+
)
|
|
39
|
+
except (subprocess.SubprocessError, OSError, FileNotFoundError):
|
|
40
|
+
pass # Ignore if chcp command fails
|
|
41
|
+
|
|
42
|
+
except Exception:
|
|
43
|
+
# If configuration fails, fall back to original streams
|
|
44
|
+
pass
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class GaiaLogger:
|
|
48
|
+
def __init__(self, log_file="gaia.log"):
|
|
49
|
+
# Configure console encoding for Unicode support first
|
|
50
|
+
configure_console_encoding()
|
|
51
|
+
|
|
52
|
+
self.log_file = Path(log_file)
|
|
53
|
+
self.loggers = {}
|
|
54
|
+
|
|
55
|
+
# Filter warnings
|
|
56
|
+
warnings.filterwarnings(
|
|
57
|
+
"ignore", message="dropout option adds dropout after all but last"
|
|
58
|
+
)
|
|
59
|
+
warnings.filterwarnings(
|
|
60
|
+
"ignore", message="torch.nn.utils.weight_norm is deprecated"
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
# Define color codes
|
|
64
|
+
self.colors = {
|
|
65
|
+
"DEBUG": "\033[37m", # White
|
|
66
|
+
"INFO": "\033[37m", # White
|
|
67
|
+
"WARNING": "\033[33m", # Yellow
|
|
68
|
+
"ERROR": "\033[31m", # Red
|
|
69
|
+
"CRITICAL": "\033[41m", # Red background
|
|
70
|
+
"RESET": "\033[0m", # Reset color
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# Base configuration
|
|
74
|
+
self.default_level = logging.INFO
|
|
75
|
+
|
|
76
|
+
# Create colored formatter for console and regular formatter for file
|
|
77
|
+
console_formatter = logging.Formatter(
|
|
78
|
+
"%(asctime)s | %(color)s%(levelname)s%(reset)s | %(name)s.%(funcName)s | %(filename)s:%(lineno)d | %(message)s",
|
|
79
|
+
datefmt="[%Y-%m-%d %H:%M:%S]",
|
|
80
|
+
)
|
|
81
|
+
file_formatter = logging.Formatter(
|
|
82
|
+
"[%(asctime)s] | %(levelname)s | %(name)s.%(funcName)s | %(filename)s:%(lineno)d | %(message)s"
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
# Create and configure handlers with Unicode support
|
|
86
|
+
console_handler = logging.StreamHandler(sys.stdout)
|
|
87
|
+
console_handler.setFormatter(console_formatter)
|
|
88
|
+
|
|
89
|
+
# Configure file handler with UTF-8 encoding
|
|
90
|
+
file_handler = logging.FileHandler(self.log_file, encoding="utf-8")
|
|
91
|
+
file_handler.setFormatter(file_formatter)
|
|
92
|
+
|
|
93
|
+
# Configure root logger
|
|
94
|
+
root_logger = logging.getLogger()
|
|
95
|
+
root_logger.setLevel(self.default_level)
|
|
96
|
+
root_logger.addHandler(console_handler)
|
|
97
|
+
root_logger.addHandler(file_handler)
|
|
98
|
+
|
|
99
|
+
# Add color filter to console handler
|
|
100
|
+
console_handler.addFilter(self.add_color_filter)
|
|
101
|
+
|
|
102
|
+
# Default levels for different modules
|
|
103
|
+
self.default_levels = {
|
|
104
|
+
"gaia.agents": logging.INFO,
|
|
105
|
+
"gaia.llm": logging.INFO,
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
# Suppress specific aiohttp.access log messages
|
|
109
|
+
aiohttp_access_logger = logging.getLogger("aiohttp.access")
|
|
110
|
+
aiohttp_access_logger.addFilter(self.filter_aiohttp_access)
|
|
111
|
+
|
|
112
|
+
# Suppress specific datasets log messages
|
|
113
|
+
datasets_logger = logging.getLogger("datasets")
|
|
114
|
+
datasets_logger.addFilter(self.filter_datasets)
|
|
115
|
+
|
|
116
|
+
# Suppress specific httpx log messages
|
|
117
|
+
httpx_logger = logging.getLogger("httpx")
|
|
118
|
+
httpx_logger.addFilter(self.filter_httpx)
|
|
119
|
+
|
|
120
|
+
# Suppress phonemizer warnings
|
|
121
|
+
phonemizer_logger = logging.getLogger("phonemizer")
|
|
122
|
+
phonemizer_logger.addFilter(self.filter_phonemizer)
|
|
123
|
+
|
|
124
|
+
def add_color_filter(self, record):
|
|
125
|
+
record.color = self.colors.get(record.levelname, "")
|
|
126
|
+
record.reset = self.colors["RESET"]
|
|
127
|
+
return True
|
|
128
|
+
|
|
129
|
+
def filter_aiohttp_access(self, record):
|
|
130
|
+
return not (
|
|
131
|
+
record.name == "aiohttp.access"
|
|
132
|
+
and "POST /stream_to_ui" in record.getMessage()
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
def filter_datasets(self, record):
|
|
136
|
+
return not (
|
|
137
|
+
"PyTorch version" in record.getMessage()
|
|
138
|
+
and "available." in record.getMessage()
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
def filter_httpx(self, record):
|
|
142
|
+
message = record.getMessage()
|
|
143
|
+
return not ("HTTP Request:" in message and "HTTP/1.1 200 OK" in message)
|
|
144
|
+
|
|
145
|
+
def filter_phonemizer(self, record):
|
|
146
|
+
message = record.getMessage()
|
|
147
|
+
return "words count mismatch" not in message
|
|
148
|
+
|
|
149
|
+
def get_logger(self, name):
|
|
150
|
+
if name not in self.loggers:
|
|
151
|
+
logger = logging.getLogger(name)
|
|
152
|
+
level = self._get_level_for_module(name)
|
|
153
|
+
logger.setLevel(level)
|
|
154
|
+
self.loggers[name] = logger
|
|
155
|
+
return self.loggers[name]
|
|
156
|
+
|
|
157
|
+
def _get_level_for_module(self, name):
|
|
158
|
+
for module, level in self.default_levels.items():
|
|
159
|
+
if module in name:
|
|
160
|
+
return level
|
|
161
|
+
return self.default_level
|
|
162
|
+
|
|
163
|
+
def set_level(self, name, level):
|
|
164
|
+
"""Set logging level for a logger name or prefix.
|
|
165
|
+
|
|
166
|
+
If name matches an existing logger exactly, update that logger.
|
|
167
|
+
Otherwise, set as default_level for future loggers matching the prefix.
|
|
168
|
+
Also updates all existing loggers that start with the given name prefix.
|
|
169
|
+
"""
|
|
170
|
+
# Update exact match if it exists
|
|
171
|
+
if name in self.loggers:
|
|
172
|
+
self.loggers[name].setLevel(level)
|
|
173
|
+
|
|
174
|
+
# Update all existing loggers that start with this prefix
|
|
175
|
+
for logger_name, logger in self.loggers.items():
|
|
176
|
+
if logger_name.startswith(name + ".") or logger_name == name:
|
|
177
|
+
logger.setLevel(level)
|
|
178
|
+
|
|
179
|
+
# Set as default for future loggers matching this prefix
|
|
180
|
+
self.default_levels[name] = level
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
# Create a global instance
|
|
184
|
+
log_manager = GaiaLogger()
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
# Convenience function to get a logger
|
|
188
|
+
def get_logger(name):
|
|
189
|
+
return log_manager.get_logger(name)
|