Rabbook

FastAPI + RAG
{% if message %}
{{ message }}
{% endif %} {% if error %}
{{ error }}
{% endif %}

Ask a Question

Filters & Options
{% if answer %}

Answer

{{ answer }}
{% endif %} {% if citations %}

Cited Sources

{% for item in citations %}
[{{ item.number }}] {{ item.source }} {% if item.page is not none %}p.{{ item.page }}{% endif %}
Retrieval: {{ item.retrieval_score }} Rerank: {{ item.rerank_score }}
{{ item.content }}
{% endfor %}
{% endif %} {% if sources %}

Retrieved Chunks

{% for item in sources %}
{{ item.source }} {% if item.page is not none %}p.{{ item.page }}{% endif %}
Retrieval: {{ item.retrieval_score }} Rerank: {{ item.rerank_score }}
{{ item.content }}
{% endfor %}
{% endif %}

Chat History {% if history_items %}{{ history_items|length }}{% endif %}

{% if history_items %}
{% for item in history_items %}
{{ item.created_at }}

{{ item.query }}

{% if item.selected_file or item.selected_file_type or item.page_start or item.page_end %}

file={{ item.selected_file if item.selected_file else 'all' }}, type={{ item.selected_file_type if item.selected_file_type else 'all' }}, pages={{ item.page_start if item.page_start else 'start' }}-{{ item.page_end if item.page_end else 'end' }}

{% endif %}
{{ item.answer }}
{% if item.citations %}
{% for citation in item.citations %} [{{ citation.number }}] {{ citation.source }}{% if citation.page is not none %}, p.{{ citation.page }}{% endif %} {% endfor %}
{% endif %}
{% endfor %}
{% else %}

No chat history yet. Ask a question to get started.

{% endif %}

Saved Notes {% if saved_notes %}{{ saved_notes|length }}{% endif %}

{% if saved_notes %}
{% for note in saved_notes %}
{{ note.saved_at }}

{{ note.query }}

{{ note.answer }}
{% if note.citations %}
{% for item in note.citations %} [{{ item.number }}] {{ item.source }}{% if item.page is not none %}, p.{{ item.page }}{% endif %} {% endfor %}
{% endif %}
{% endfor %}
{% else %}

No saved notes yet.

{% endif %}
{% if debug_data %}

Debug Retrieval Flow

Queries: {{ debug_data.stage_counts.search_queries }}
Dense Hits: {{ debug_data.dense_total_hits }}
BM25 Hits: {{ debug_data.bm25_total_hits }}
Fused: {{ debug_data.stage_counts.fused_candidates }}
Top Hits: {{ debug_data.stage_counts.final_hits }}
Expanded Context: {{ debug_data.stage_counts.expanded_context }}
{% if debug_data.grounding %}

Grounding Status

    {% if debug_data.pipeline_mode %}
  • Pipeline Mode: {{ debug_data.pipeline_mode }}
  • {% endif %} {% if debug_data.next_action %}
  • Next Action: {{ debug_data.next_action }}
  • {% endif %} {% if debug_data.decision_reason %}
  • Decision Reason: {{ debug_data.decision_reason }}
  • {% endif %} {% if debug_data.retry_count %}
  • Retry Count: {{ debug_data.retry_count }} / 2
  • {% endif %} {% if debug_data.refined_query %}
  • Refined Query: {{ debug_data.refined_query }}
  • {% endif %} {% if debug_data.web_research_performed %}
  • Web Research: Performed
  • {% endif %} {% if debug_data.web_docs_ingested is not none %}
  • Web Docs Ingested: {{ debug_data.web_docs_ingested }}
  • {% endif %}
  • Metadata Filter: {% if debug_data.metadata_filter %} file={{ debug_data.metadata_filter.file_name if debug_data.metadata_filter.file_name else 'all' }}, type={{ debug_data.metadata_filter.file_type if debug_data.metadata_filter.file_type else 'all' }}, pages= {% if debug_data.metadata_filter.page_range %} {{ debug_data.metadata_filter.page_range.start if debug_data.metadata_filter.page_range.start is not none else 'start' }}-{{ debug_data.metadata_filter.page_range.end if debug_data.metadata_filter.page_range.end is not none else 'end' }} {% else %}all{% endif %} {% else %}All documents{% endif %}
  • Result: {{ 'PASS' if debug_data.grounding.passed else 'FAIL' }}
  • Failed At: {{ debug_data.grounding.stage }}
  • Reason: {{ debug_data.grounding.reason }}
  • Top Rerank Score: {{ debug_data.grounding.top_rerank_score if debug_data.grounding.top_rerank_score is not none else 'n/a' }}
  • Retrieved Chunks: {{ debug_data.grounding.retrieved_count if debug_data.grounding.retrieved_count is not none else 'n/a' }}
  • Expanded Chunks: {{ debug_data.grounding.expanded_count if debug_data.grounding.expanded_count is not none else 'n/a' }}
{% endif %}

Search Queries

    {% for query_item in debug_data.search_queries %}
  • {{ query_item }}
  • {% endfor %}

Dense Hits

{% for query_item, hits in debug_data.dense_hits.items() %}

{{ query_item }}

    {% for hit in hits %}
  • {{ hit.chunk_id }} | {{ hit.source }} | page {{ hit.page if hit.page is not none else 'n/a' }} | {{ hit.score }}
    {{ hit.preview }}
  • {% endfor %}
{% endfor %}

BM25 Hits

{% for query_item, hits in debug_data.bm25_hits.items() %}

{{ query_item }}

    {% for hit in hits %}
  • {{ hit.chunk_id }} | {{ hit.source }} | page {{ hit.page if hit.page is not none else 'n/a' }} | {{ hit.score }}
    {{ hit.preview }}
  • {% endfor %}
{% endfor %}

Fused Candidates

    {% for hit in debug_data.fused_hits %}
  • {{ hit.chunk_id }} | {{ hit.source }} | page {{ hit.page if hit.page is not none else 'n/a' }} | {{ hit.score }}
    {{ hit.preview }}
  • {% endfor %}

Final Reranked Hits

    {% for hit in debug_data.reranked_hits %}
  • {{ hit.chunk_id }} | {{ hit.source }} | page {{ hit.page if hit.page is not none else 'n/a' }} | {{ hit.score }}
    {{ hit.preview }}
  • {% endfor %}

Expanded Context Sent To LLM

    {% for hit in debug_data.expanded_hits %}
  • {{ hit.chunk_id }} | {{ hit.source }} | page {{ hit.page if hit.page is not none else 'n/a' }} | {{ hit.score }}
    {{ hit.preview }}
  • {% endfor %}
{% endif %}