Diese Woche am beliebtesten

Vertiefendes Material

KI Hausarzt

Virtueller Hausarzt Chat

Mit dieser PHP-Datei erhältst du einen virtuellen Chat, der als erfahrener Hausarzt agiert. Nutzer können gesundheitliche Fragen stellen und erhalten ausführliche, verständliche Antworten. Die Antworten enthalten Hinweise zu Symptomen, Vorsorge, möglichen Ursachen und medizinischen Empfehlungen, ohne echte Diagnosen zu ersetzen.

Funktionen:

  • Echtzeit-Chat mit GPT-API-Anbindung
  • Ausführliche, strukturierte Antworten wie von einem Hausarzt mit jahrzehntelanger Erfahrung
  • Speicherung der Chat-Historie in einer SQLite-Datenbank
  • Anzeige der Antworten chronologisch mit Zeitstempel
  • Einfache Web-Oberfläche, sofort einsatzbereit

Hinweise:

  • Der Chat ersetzt keine ärztliche Untersuchung oder professionelle Diagnose
  • Antworten dienen nur zur Orientierung und allgemeinen Information
  • Bei akuten gesundheitlichen Problemen sollte immer ein echter Arzt konsultiert werden
<?php
define('DB_FILE', __DIR__ . '/doctor_chat.sqlite');
define('OPENAI_API_KEY', 'DEIN_OPENAI_API_KEY_HIER');

// DB für Chat-Historie
$db = new SQLite3(DB_FILE);
$db->exec("CREATE TABLE IF NOT EXISTS messages (
    id INTEGER PRIMARY KEY,
    role TEXT,
    message TEXT,
    created_at INTEGER
)");

function jsonResponse($data,$code=200){
    http_response_code($code);
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode($data);
    exit;
}

function escape($str){ return htmlspecialchars($str,ENT_QUOTES,'UTF-8'); }

function callGPT($userMessage){
    $prompt = "Du bist ein erfahrener Hausarzt mit jahrzehntelanger Erfahrung. Antworte ausführlich, verständlich und freundlich. Gib Hinweise zu möglichen Ursachen, Vorsorge, Symptomen und medizinischen Empfehlungen, ohne echte Diagnosen zu ersetzen.";
    $data = [
        'model' => 'gpt-4',
        'messages' => [
            ['role'=>'system','content'=>$prompt],
            ['role'=>'user','content'=>$userMessage]
        ],
        'max_tokens' => 600,
        'temperature' => 0.3
    ];

    $ch = curl_init('https://api.openai.com/v1/chat/completions');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
        'Authorization: Bearer '.OPENAI_API_KEY
    ]);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    $result = curl_exec($ch);
    curl_close($ch);

    $resData = json_decode($result,true);
    return $resData['choices'][0]['message']['content'] ?? 'Fehler bei der Antwortgenerierung';
}

if($_SERVER['REQUEST_METHOD']==='POST' && isset($_GET['action']) && $_GET['action']==='send'){
    $msg = trim($_POST['message'] ?? '');
    if(!$msg) jsonResponse(['error'=>'Keine Nachricht eingegeben'],400);

    $stmt=$db->prepare('INSERT INTO messages (role,message,created_at) VALUES (:role,:message,:created_at)');
    $stmt->bindValue(':role','user',SQLITE3_TEXT);
    $stmt->bindValue(':message',$msg,SQLITE3_TEXT);
    $stmt->bindValue(':created_at',time(),SQLITE3_INTEGER);
    $stmt->execute();

    $reply = callGPT($msg);
    $stmt2=$db->prepare('INSERT INTO messages (role,message,created_at) VALUES (:role,:message,:created_at)');
    $stmt2->bindValue(':role','doctor',SQLITE3_TEXT);
    $stmt2->bindValue(':message',$reply,SQLITE3_TEXT);
    $stmt2->bindValue(':created_at',time(),SQLITE3_INTEGER);
    $stmt2->execute();

    jsonResponse(['reply'=>$reply]);
}

if(isset($_GET['action']) && $_GET['action']==='history'){
    $res = $db->query('SELECT * FROM messages ORDER BY created_at ASC');
    $msgs=[];
    while($row=$res->fetchArray(SQLITE3_ASSOC)){
        $msgs[]=[
            'role'=>$row['role'],
            'message'=>escape($row['message']),
            'time'=>date('d.m.Y H:i',$row['created_at'])
        ];
    }
    jsonResponse($msgs);
}

?>
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Dreamcodes - Virtueller Hausarzt Chat</title>
<style>
:root{--bg:#0f1724;--card:#0b1220;--accent:#7c3aed;--muted:#9aa4b2;--glass: rgba(255,255,255,0.03);}
body{font-family:Inter, sans-serif;background:linear-gradient(180deg,var(--bg),#071028);color:#e6eef8;margin:0;padding:40px;}
.container{max-width:900px;margin:0 auto}
.card{background:linear-gradient(180deg,var(--card),#071022);padding:28px;border-radius:16px;box-shadow:0 10px 30px rgba(2,6,23,0.7);margin-bottom:24px}
h1{font-size:24px;margin:0 0 8px}
.inputtext{background:transparent;border:1px solid rgba(255,255,255,0.04);padding:8px 10px;border-radius:8px;color:inherit;width:100%;margin-bottom:10px}
.btn{background:var(--accent);color:white;padding:10px 14px;border-radius:10px;border:none;cursor:pointer;font-weight:600}
.message{padding:12px;margin-bottom:12px;background:rgba(255,255,255,0.02);border-radius:10px}
.message.user{background:rgba(124,58,237,0.2)}
.message.doctor{background:rgba(43,181,140,0.2)}
.message-meta{font-size:13px;color:var(--muted)}
footer{margin-top:18px;text-align:center;color:var(--muted);font-size:13px}
.thin{opacity:0.8}
</style>
</head>
<body>
<div class="container">
<div class="card">
<h1>Dreamcodes - Virtueller Hausarzt Chat</h1>
<textarea id="userMsg" class="inputtext" placeholder="Schreibe deine gesundheitliche Frage hier..."></textarea>
<button id="sendBtn" class="btn">Absenden</button>
<div id="error" style="color:#ffb4b4;margin-top:10px"></div>
</div>
<div id="chat"></div>
<footer><div class="thin">Powered by Dreamcodes.NET</div></footer>
</div>
<script>
async function fetchHistory(){
    const resp=await fetch('?action=history');
    const data=await resp.json();
    const chat=document.getElementById('chat');
    chat.innerHTML='';
    data.forEach(m=>{
        const div=document.createElement('div');
        div.className='card message '+m.role;
        div.innerHTML=`<div class='message-meta'>${m.role==='user'?'Du':'Hausarzt'} - ${m.time}</div><p>${m.message}</p>`;
        chat.appendChild(div);
    });
    chat.scrollTop=chat.scrollHeight;
}

document.getElementById('sendBtn').addEventListener('click',async()=>{
    const msg=document.getElementById('userMsg').value;
    if(!msg) return;
    document.getElementById('error').textContent='';
    const fd=new FormData(); fd.append('message',msg);
    try{
        const resp=await fetch('?action=send',{method:'POST',body:fd});
        const data=await resp.json();
        if(data.error){ document.getElementById('error').textContent=data.error; return; }
        document.getElementById('userMsg').value='';
        fetchHistory();
    }catch(e){document.getElementById('error').textContent='Netzwerkfehler'}
});

fetchHistory();
</script>
</body>
</html>
Dreamcodes Redaktion
Dreamcodes Redaktion
Jeder Inhalt auf Dreamcodes entsteht mit einem klaren Anspruch: geprüfte Praxis statt schneller Theorie. Was hier veröffentlicht wird, basiert auf Best Practices, echten Projekterfahrungen und technischem Verständnis, das über das Offensichtliche hinausgeht. Unser Ziel ist ein Fundament, auf dem du aufbauen kannst, nicht eines, das beim ersten produktiven Einsatz bricht. Wie du die Inhalte integrierst, absicherst und in deinen Kontext überträgst, liegt bei dir. Die fachliche Grundlage liefern wir, die Verantwortung für den Einsatz bleibt deine.
Vorheriges Tutorial
Nächstes Tutorial

Vielleicht einen Blick WERT?