mirror of
https://github.com/Jeuners/astra-vision.git
synced 2026-09-09 15:02:35 +02:00
Zwei neue, sauber getrennte Fähigkeiten, jede in ihrem eigenen Modul: - astra/comfyui.py: async HTTP-Client für einen lokalen ComfyUI-Server (z-image-turbo-Workflow), kennt nichts von der Pipeline. - astra/documents.py: PDF-Textextraktion via pypdf, keine Netzwerkzugriffe. - astra/tools.py: verdrahtet generate_image als natives Ollama-Tool-Call — Qwen 3.5 unterstützt Tools und Vision bereits nativ laut `ollama show`. Dafür wurde astra/services.py so erweitert, dass NativeOllamaService Ollamas native tool_calls im Streaming-Response erkennt und als ChatCompletionChunk-Deltas an Pipecats bereits vorhandene, generische Function-Calling-Maschinerie (_process_context/run_function_calls) weiterreicht — die musste dafür nicht angefasst werden. trim_messages in core.py bewahrt jetzt Tool-Roundtrips und Bild-Anhänge vollständig statt sie auf role/content zu reduzieren. Neuer Upload-Button im UI (Bild oder PDF, während eines laufenden Gesprächs): PDFs gehen als Text, Bilder als Base64 über Qwens Vision in den Gesprächskontext ein. Generierte Bilder werden über /api/media/<id> ausgeliefert und per Datenkanal im Transkript angezeigt. Kompletter Function-Calling-Roundtrip end-to-end gegen echtes Ollama und echtes ComfyUI verifiziert (Modell ruft generate_image korrekt auf, Bild wird erzeugt und im media_store abgelegt). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LVgSHNHdRx3UNTBodFmhRA
27 lines
935 B
Python
27 lines
935 B
Python
from astra.documents import extract_pdf_text
|
|
|
|
# Minimal hand-built single-page PDF with a text-showing operator. pypdf
|
|
# recovers it via its xref-scanning fallback despite the bogus startxref
|
|
# offset, so no external PDF-writing dependency is needed for the fixture.
|
|
MINIMAL_PDF = b"""%PDF-1.1
|
|
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj
|
|
2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj
|
|
3 0 obj<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 4 0 R>>>>/MediaBox[0 0 200 200]/Contents 5 0 R>>endobj
|
|
4 0 obj<</Type/Font/Subtype/Type1/BaseFont/Helvetica>>endobj
|
|
5 0 obj<</Length 44>>stream
|
|
BT /F1 24 Tf 20 100 Td (Hallo Astra) Tj ET
|
|
endstream
|
|
endobj
|
|
trailer<</Size 6/Root 1 0 R>>
|
|
startxref
|
|
0
|
|
%%EOF"""
|
|
|
|
|
|
def test_extract_pdf_text_reads_page_content():
|
|
assert extract_pdf_text(MINIMAL_PDF) == "Hallo Astra"
|
|
|
|
|
|
def test_extract_pdf_text_respects_max_chars():
|
|
text = extract_pdf_text(MINIMAL_PDF, max_chars=5)
|
|
assert text == "Hallo"
|