Spaces:
Running
Running
Commit Β·
43efb12
1
Parent(s): 4ed28a0
Fix HF Spaces streaming timeouts and error handling
Browse files
codesentry-backend/agents/fix_agent.py
CHANGED
|
@@ -124,6 +124,8 @@ class FixAgent:
|
|
| 124 |
self.client = AsyncOpenAI(
|
| 125 |
base_url=vllm_base_url,
|
| 126 |
api_key=api_key,
|
|
|
|
|
|
|
| 127 |
)
|
| 128 |
|
| 129 |
# βββββββββββββββββββββββββββββββββββββββββ
|
|
|
|
| 124 |
self.client = AsyncOpenAI(
|
| 125 |
base_url=vllm_base_url,
|
| 126 |
api_key=api_key,
|
| 127 |
+
timeout=60.0,
|
| 128 |
+
max_retries=1,
|
| 129 |
)
|
| 130 |
|
| 131 |
# βββββββββββββββββββββββββββββββββββββββββ
|
codesentry-backend/agents/orchestrator.py
CHANGED
|
@@ -42,7 +42,7 @@ logger = logging.getLogger(__name__)
|
|
| 42 |
# Config from environment
|
| 43 |
VLLM_BASE_URL = os.getenv("VLLM_BASE_URL", "http://localhost:8080/v1")
|
| 44 |
MODEL_NAME = os.getenv("MODEL_NAME", "Qwen/Qwen2.5-Coder-32B-Instruct")
|
| 45 |
-
LLM_API_KEY = os.getenv("LLM_API_KEY", "not-needed-local")
|
| 46 |
USE_LLM = os.getenv("USE_LLM", "true").lower() == "true"
|
| 47 |
|
| 48 |
|
|
|
|
| 42 |
# Config from environment
|
| 43 |
VLLM_BASE_URL = os.getenv("VLLM_BASE_URL", "http://localhost:8080/v1")
|
| 44 |
MODEL_NAME = os.getenv("MODEL_NAME", "Qwen/Qwen2.5-Coder-32B-Instruct")
|
| 45 |
+
LLM_API_KEY = os.getenv("LLM_API_KEY") or os.getenv("GROQ_API_KEY", "not-needed-local")
|
| 46 |
USE_LLM = os.getenv("USE_LLM", "true").lower() == "true"
|
| 47 |
|
| 48 |
|
codesentry-backend/agents/performance_agent.py
CHANGED
|
@@ -83,6 +83,8 @@ class PerformanceAgent:
|
|
| 83 |
self.client = AsyncOpenAI(
|
| 84 |
base_url=vllm_base_url,
|
| 85 |
api_key=api_key,
|
|
|
|
|
|
|
| 86 |
)
|
| 87 |
|
| 88 |
# βββββββββββββββββββββββββββββββββββββββββ
|
|
|
|
| 83 |
self.client = AsyncOpenAI(
|
| 84 |
base_url=vllm_base_url,
|
| 85 |
api_key=api_key,
|
| 86 |
+
timeout=60.0,
|
| 87 |
+
max_retries=1,
|
| 88 |
)
|
| 89 |
|
| 90 |
# βββββββββββββββββββββββββββββββββββββββββ
|
codesentry-backend/agents/security_agent.py
CHANGED
|
@@ -81,6 +81,8 @@ class SecurityAgent:
|
|
| 81 |
self.client = AsyncOpenAI(
|
| 82 |
base_url=vllm_base_url,
|
| 83 |
api_key=api_key,
|
|
|
|
|
|
|
| 84 |
)
|
| 85 |
|
| 86 |
# ββββββββββββββββββββββββββββββββββββββββββ
|
|
|
|
| 81 |
self.client = AsyncOpenAI(
|
| 82 |
base_url=vllm_base_url,
|
| 83 |
api_key=api_key,
|
| 84 |
+
timeout=60.0,
|
| 85 |
+
max_retries=1,
|
| 86 |
)
|
| 87 |
|
| 88 |
# ββββββββββββββββββββββββββββββββββββββββββ
|
codesentry-frontend/src/components/AnalysisView.jsx
CHANGED
|
@@ -20,7 +20,7 @@ function formatTime(ms) {
|
|
| 20 |
export default function AnalysisView() {
|
| 21 |
const {
|
| 22 |
scanStatus, agents, findings, fixes, elapsedTime,
|
| 23 |
-
summary, setView, resetScan, amdMetrics,
|
| 24 |
} = useScan();
|
| 25 |
|
| 26 |
const feedRef = useRef(null);
|
|
@@ -155,7 +155,7 @@ export default function AnalysisView() {
|
|
| 155 |
<span className="findings-count mono">{findings.length} findings</span>
|
| 156 |
</div>
|
| 157 |
|
| 158 |
-
{findings.length === 0 && (
|
| 159 |
<div className="empty-state">
|
| 160 |
<div className="icon">π</div>
|
| 161 |
<p>Waiting for agents to report findings...</p>
|
|
@@ -167,6 +167,19 @@ export default function AnalysisView() {
|
|
| 167 |
</div>
|
| 168 |
)}
|
| 169 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 170 |
<div className="findings-feed">
|
| 171 |
{findings.map((finding, index) => (
|
| 172 |
<FindingCard
|
|
|
|
| 20 |
export default function AnalysisView() {
|
| 21 |
const {
|
| 22 |
scanStatus, agents, findings, fixes, elapsedTime,
|
| 23 |
+
summary, setView, resetScan, amdMetrics, error
|
| 24 |
} = useScan();
|
| 25 |
|
| 26 |
const feedRef = useRef(null);
|
|
|
|
| 155 |
<span className="findings-count mono">{findings.length} findings</span>
|
| 156 |
</div>
|
| 157 |
|
| 158 |
+
{findings.length === 0 && scanStatus !== SCAN_STATUS.ERROR && (
|
| 159 |
<div className="empty-state">
|
| 160 |
<div className="icon">π</div>
|
| 161 |
<p>Waiting for agents to report findings...</p>
|
|
|
|
| 167 |
</div>
|
| 168 |
)}
|
| 169 |
|
| 170 |
+
{scanStatus === SCAN_STATUS.ERROR && (
|
| 171 |
+
<div className="error-banner glass-card" style={{ borderColor: 'rgba(2ef4, 63, 94, 0.5)', background: 'rgba(225, 29, 72, 0.1)' }}>
|
| 172 |
+
<div className="completion-icon">β</div>
|
| 173 |
+
<div className="completion-content">
|
| 174 |
+
<h4 style={{ color: '#fb7185' }}>Analysis Failed</h4>
|
| 175 |
+
<p>{error || "An unknown error occurred during the analysis stream."}</p>
|
| 176 |
+
</div>
|
| 177 |
+
<button className="btn btn-ghost" onClick={resetScan}>
|
| 178 |
+
Try Again
|
| 179 |
+
</button>
|
| 180 |
+
</div>
|
| 181 |
+
)}
|
| 182 |
+
|
| 183 |
<div className="findings-feed">
|
| 184 |
{findings.map((finding, index) => (
|
| 185 |
<FindingCard
|