Files
accessibility-console/src/AI/GeminiFixer.php
T

60 lines
1.8 KiB
PHP
Raw Normal View History

2026-05-13 09:10:43 +03:00
<?php
namespace YakNet\AccessibilityConsole\AI;
use Gemini;
use YakNet\AccessibilityConsole\Core\Violation;
class GeminiFixer
{
private ?\Gemini\Client $client = null;
public function __construct(private readonly ?string $apiKey)
{
2026-05-13 12:46:26 +03:00
if ($this->apiKey) {
try {
$this->client = \Gemini::client($this->apiKey);
} catch (\Throwable) {
$this->client = null;
}
2026-05-13 09:10:43 +03:00
}
}
public function suggestFix(Violation $violation): ?string
{
2026-05-13 12:46:26 +03:00
if (!$this->apiKey) {
return "Hata: GEMINI_API_KEY bulunamadı.";
}
2026-05-13 09:10:43 +03:00
if (!$this->client) {
2026-05-13 12:46:26 +03:00
return "Hata: Gemini istemcisi başlatılamadı. Kütüphane eksik olabilir.";
2026-05-13 09:10:43 +03:00
}
$prompt = <<<PROMPT
You are a WCAG 2.1 Accessibility expert.
A scanner found an error in this HTML snippet:
Snippet: {$violation->htmlSnippet}
Error: {$violation->message}
Severity: {$violation->severity->value}
Standard: {$violation->standard->value}
Please provide ONLY the fixed version of the HTML snippet.
Do not explain, do not add markdown code blocks, just return the corrected HTML.
If the error is about missing 'alt' text, add a meaningful alt text based on context.
If it's about ARIA roles, add the correct ones.
PROMPT;
try {
2026-05-13 12:46:26 +03:00
// Stable model: gemini-1.5-flash
$result = $this->client->generativeModel('gemini-1.5-flash')->generateContent($prompt);
2026-05-13 09:10:43 +03:00
$suggestion = trim($result->text());
// Clean up if AI included markdown blocks anyway
$suggestion = preg_replace('/^```html\s*|\s*```$/i', '', $suggestion);
return $suggestion;
} catch (\Throwable $e) {
2026-05-13 12:21:24 +03:00
return "AI Düzeltme Hatası: " . $e->getMessage();
2026-05-13 09:10:43 +03:00
}
}
}