curl --request POST \
--url https://api.example.com/qa/stream \
--header 'Content-Type: application/json' \
--data '
{
"question_lecture": "<string>",
"question_title": "<string>",
"question_body": "<string>"
}
'{
"token": "<string>",
"done": true,
"confidence": 123,
"citations": [
{}
],
"latency_ms": 123,
"retrieval_accuracy": 123,
"hallucination_flag": true
}curl --request POST \
--url https://api.example.com/qa/stream \
--header 'Content-Type: application/json' \
--data '
{
"question_lecture": "<string>",
"question_title": "<string>",
"question_body": "<string>"
}
'{
"token": "<string>",
"done": true,
"confidence": 123,
"citations": [
{}
],
"latency_ms": 123,
"retrieval_accuracy": 123,
"hallucination_flag": true
}Documentation Index
Fetch the complete documentation index at: https://mintlify.com/RaviTejaMedarametla/Data-Science-AI-Portfolio/llms.txt
Use this file to discover all available pages before exploring further.
POST /qa/stream
min_length=1Example: “Visual Analytics”min_length=1Example: “Bar vs Line charts”min_length=1Example: “When should I use bar charts versus line charts for showing trends over time?”text/event-stream with Server-Sent Events (SSE).
data: {"token": "When"}
data: {"token": " comparing"}
data: {"token": " trends"}
data: {"done": true, "confidence": 0.8752, "citations": [...], "latency_ms": 2341.23, "retrieval_accuracy": 1.0, "hallucination_flag": false}
true in the final event. Signals end of stream.[Section: <section>, Lecture: <lecture>]curl -X POST "http://localhost:8001/qa/stream" \
-H "Content-Type: application/json" \
-H "accept: text/event-stream" \
-N \
-d '{
"question_lecture": "Visual Analytics",
"question_title": "Bar vs Line charts",
"question_body": "When should I use bar charts versus line charts for showing trends over time in Tableau?"
}'
import requests
import json
url = "http://localhost:8001/qa/stream"
payload = {
"question_lecture": "Visual Analytics",
"question_title": "Bar vs Line charts",
"question_body": "When should I use bar charts versus line charts for showing trends over time?"
}
with requests.post(url, json=payload, stream=True) as response:
for line in response.iter_lines():
if line:
# Remove 'data: ' prefix
if line.startswith(b'data: '):
data = json.loads(line[6:])
if 'token' in data:
print(data['token'], end='', flush=True)
elif data.get('done'):
print("\n\nMetrics:")
print(f"Confidence: {data['confidence']}")
print(f"Citations: {len(data['citations'])}")
print(f"Latency: {data['latency_ms']}ms")
print(f"Retrieval Accuracy: {data['retrieval_accuracy']}")
print(f"Hallucination: {data['hallucination_flag']}")
data: {"token": "Line"}
data: {"token": " charts"}
data: {"token": " are"}
data: {"token": " generally"}
data: {"token": " better"}
data: {"token": " for"}
data: {"token": " showing"}
data: {"token": " trends"}
data: {"token": " over"}
data: {"token": " time"}
data: {"token": " because"}
data: {"token": " they"}
data: {"token": " emphasize"}
data: {"token": " continuity"}
data: {"token": " and"}
data: {"token": " flow"}
data: {"token": "."}
data: {"token": " Bar"}
data: {"token": " charts"}
data: {"token": " are"}
data: {"token": " better"}
data: {"token": " for"}
data: {"token": " comparing"}
data: {"token": " discrete"}
data: {"token": " categories"}
data: {"token": "."}
data: {"token": "\n\n"}
data: {"token": "Citations"}
data: {"token": ":"}
data: {"token": "\n"}
data: {"token": "-"}
data: {"token": " ["}
data: {"token": "Section"}
data: {"token": ":"}
data: {"token": " Visual"}
data: {"token": " Analytics"}
data: {"token": ","}
data: {"token": " Lecture"}
data: {"token": ":"}
data: {"token": " Building"}
data: {"token": " charts"}
data: {"token": "]"}
data: {"done": true, "confidence": 0.8234, "citations": ["[Section: Visual Analytics, Lecture: Building charts]"], "latency_ms": 2145.6789, "retrieval_accuracy": 1.0, "hallucination_flag": false}
src/qa_api.py:329-331
Request Model: QARequest (src/qa_api.py:32-35)
class QARequest(BaseModel):
question_lecture: str = Field(..., min_length=1)
question_title: str = Field(..., min_length=1)
question_body: str = Field(..., min_length=1)
_stream_tokens() (src/qa_api.py:282-327)
question = f"Lecture: {req.question_lecture}\nTitle: {req.question_title}\nBody: {req.question_body}"
full_text = []
async for chunk in llm.astream(messages):
token = chunk.content if hasattr(chunk, "content") else str(chunk)
if token:
full_text.append(token)
yield f"data: {json.dumps({'token': token})}\n\n".encode("utf-8")
await asyncio.sleep(0)
data: <JSON>
OPENAI_API_KEY not configured:
data: {"token": "I don't have enough context to answer confidently."}
data: {"token": "I don't have enough context to answer confidently."}
const eventSource = new EventSource('/qa/stream', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
question_lecture: 'Visual Analytics',
question_title: 'Bar vs Line charts',
question_body: 'When should I use bar charts versus line charts?'
})
});
let answerElement = document.getElementById('answer');
eventSource.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.token) {
answerElement.textContent += data.token;
} else if (data.done) {
console.log('Stream complete', data);
document.getElementById('confidence').textContent = data.confidence;
document.getElementById('citations').textContent = data.citations.join(', ');
eventSource.close();
}
};
eventSource.onerror = (error) => {
console.error('Stream error', error);
eventSource.close();
};
import { useState } from 'react';
function QAStream() {
const [answer, setAnswer] = useState('');
const [metrics, setMetrics] = useState(null);
const askQuestion = async () => {
const response = await fetch('/qa/stream', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
question_lecture: 'Visual Analytics',
question_title: 'Bar vs Line charts',
question_body: 'When should I use bar charts versus line charts?'
})
});
const reader = response.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value);
const lines = chunk.split('\n\n');
for (const line of lines) {
if (line.startsWith('data: ')) {
const data = JSON.parse(line.slice(6));
if (data.token) {
setAnswer(prev => prev + data.token);
} else if (data.done) {
setMetrics(data);
}
}
}
}
};
return (
<div>
<button onClick={askQuestion}>Ask Question</button>
<div>{answer}</div>
{metrics && (
<div>
<p>Confidence: {metrics.confidence}</p>
<p>Citations: {metrics.citations.length}</p>
</div>
)}
</div>
);
}
_update_monitoring(latency_ms, retrieval_accuracy, hallucination_flag)
GET /monitoring endpoint.