Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
6311b70
initial onyx changes
joachim-danswer Dec 16, 2024
11ce2a6
fix: update staged changes
hagen-danswer Dec 16, 2024
82914ad
fixed key issue
hagen-danswer Dec 16, 2024
ff03d71
brough over joachim changes
hagen-danswer Dec 17, 2024
1f88b60
Now using result objects
hagen-danswer Dec 17, 2024
2f2b9a8
fixed expanded retrieval subgraph
hagen-danswer Dec 17, 2024
442c947
got answer subgraph working
hagen-danswer Dec 17, 2024
d66180f
Cleanup
hagen-danswer Dec 18, 2024
e76cbec
main graph works
hagen-danswer Dec 18, 2024
fd694be
query->question
hagen-danswer Dec 18, 2024
8399d2e
mypy fixed
hagen-danswer Dec 18, 2024
50a216f
naming and comments
hagen-danswer Dec 18, 2024
9d3220f
explicitly ingest state from retrieval
hagen-danswer Dec 18, 2024
0c75ca0
renames
hagen-danswer Dec 18, 2024
bca02eb
figured it out
hagen-danswer Dec 18, 2024
2d6f746
made query expansion explicit
hagen-danswer Dec 18, 2024
ffc81f6
seperate edge for initial retrieval
hagen-danswer Dec 18, 2024
c759fb5
Merge pull request #3505 from onyx-dot-app/fix-the-states
hagen-danswer Dec 18, 2024
cebe237
renamed PrimaryState to CoreState
hagen-danswer Dec 19, 2024
34aa054
added chunk_ids and stats to QueryResult
hagen-danswer Dec 19, 2024
2a3328f
initial_test_flow
joachim-danswer Dec 20, 2024
f4c826c
regression-test graph vs regulat graph
joachim-danswer Dec 20, 2024
fa48101
improvements
joachim-danswer Dec 24, 2024
ca3f3be
initial mypy changes
joachim-danswer Dec 25, 2024
c4af11c
core mypy resolutions
joachim-danswer Dec 26, 2024
2192813
tmp_state_model_sep
joachim-danswer Dec 26, 2024
901d8c2
further clean-up
joachim-danswer Dec 26, 2024
cc76486
added streaming and small fixes
joachim-danswer Dec 28, 2024
0333ff6
left or right
joachim-danswer Dec 29, 2024
568bc16
all 3 options
joachim-danswer Dec 29, 2024
683978d
base functioning
joachim-danswer Dec 29, 2024
6989441
pre-metrics clean-up
joachim-danswer Dec 30, 2024
6dc81bb
fixed stats
joachim-danswer Dec 30, 2024
821b226
removed test file
joachim-danswer Dec 30, 2024
d68cf98
nodes in one file plus some mypy fixes
evan-onyx Dec 30, 2024
d6a385b
merging in testing changes
evan-onyx Dec 30, 2024
11db964
no more dummy plus nodes files
evan-onyx Dec 30, 2024
d7812ee
my happy about graph building
evan-onyx Dec 30, 2024
38a616c
basic support for accessing langgraph through the UI
evan-onyx Dec 31, 2024
dd64c3a
ugly but workable calling langgraph from the UI
evan-onyx Dec 31, 2024
121827e
initial end-to-end functioning
joachim-danswer Jan 2, 2025
d773163
unorganized streaming of all relevant info
evan-onyx Jan 2, 2025
6020758
remove need for refined subgraph
joachim-danswer Jan 2, 2025
a206723
moved object dependencies out of refined subgraph
joachim-danswer Jan 3, 2025
13a5a86
removed refined_search subgraph
joachim-danswer Jan 3, 2025
72e56aa
assistant persona - untested
joachim-danswer Jan 3, 2025
46850cc
removal of print statements
joachim-danswer Jan 3, 2025
6422ad9
print statements removed (and files saved)
joachim-danswer Jan 3, 2025
328f475
persistence of metrics
joachim-danswer Jan 5, 2025
ae65c73
WIP, deleted persistence code, partway through streaming code
evan-onyx Jan 5, 2025
d35aa1e
question numbers & expanded_retrieval results
joachim-danswer Jan 5, 2025
e468cac
merged logging and WIP streaming
evan-onyx Jan 5, 2025
dd2c942
new columns
joachim-danswer Jan 5, 2025
695d07f
non-duplicated work changes, plus finished v1 of backend streaming
evan-onyx Jan 6, 2025
2f7f491
persistence sans Citations
joachim-danswer Jan 6, 2025
6c0d051
merged
joachim-danswer Jan 6, 2025
d697ad0
renamed tables + additional logging
joachim-danswer Jan 6, 2025
0ff44c7
agent metric column rename
joachim-danswer Jan 6, 2025
239f2f2
cleanup plus get-chat-session API v1
evan-onyx Jan 7, 2025
3a38407
added type to ChatPacket
evan-onyx Jan 7, 2025
7898f38
refactor and separate id fields
evan-onyx Jan 7, 2025
fd11916
extra info logging and allow_refinement flag
joachim-danswer Jan 7, 2025
f250775
merge
joachim-danswer Jan 7, 2025
462db23
updated run_graph to stream out answer tokens
joachim-danswer Jan 7, 2025
8650b8f
main nodes/edges function renaming
joachim-danswer Jan 7, 2025
295417f
more renamings..
joachim-danswer Jan 7, 2025
ef67f9c
more renamings
joachim-danswer Jan 7, 2025
682b145
add message history to pro search config
evan-onyx Jan 7, 2025
1996e22
remove duplication of Main State keys + SubQuestion citation
joachim-danswer Jan 7, 2025
8054285
Merge branch 'search_2_0_evan_refactor_api' of https://github.com/ony…
evan-onyx Jan 7, 2025
5788902
tiny testing change
evan-onyx Jan 7, 2025
1849069
merge with main
evan-onyx Jan 8, 2025
7ce0436
main merge
evan-onyx Jan 8, 2025
79e7b73
minor cleanup in preparation for Answer rework
evan-onyx Jan 8, 2025
4c19b19
initial agent citation_processing
joachim-danswer Jan 8, 2025
0bc3bb5
more minor cleanup
evan-onyx Jan 9, 2025
969d027
merge
evan-onyx Jan 9, 2025
0d059cf
small fix
joachim-danswer Jan 9, 2025
8045d52
minor bug fix
evan-onyx Jan 9, 2025
44ccb5e
Merge branch 'search_2_0_evan_refactor_api' of https://github.com/ony…
evan-onyx Jan 9, 2025
6ff439c
Added link for document citations
joachim-danswer Jan 9, 2025
df75a31
yield docs after deduping and reranking, yield initial question docs
evan-onyx Jan 9, 2025
5f3e877
Merge branch 'search_2_0_evan_refactor_api' of https://github.com/ony…
evan-onyx Jan 9, 2025
686eddf
code cleanup
evan-onyx Jan 9, 2025
685f12c
sub-question citation processing
joachim-danswer Jan 9, 2025
d379453
Creation of AgentAnswerPiece class
joachim-danswer Jan 9, 2025
aee625d
agent logging level change
joachim-danswer Jan 9, 2025
4ab99fb
created pro_search_a directory
joachim-danswer Jan 9, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@
.vscode/
*.sw?
/backend/tests/regression/answer_quality/search_test_config.yaml
/web/test-results/
/web/test-results/
backend/onyx/agent_search/main/test_data.json
backend/tests/regression/answer_quality/test_data.json
6 changes: 6 additions & 0 deletions .vscode/env_template.txt
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,9 @@ BING_API_KEY=<REPLACE THIS>
# Enable the full set of Danswer Enterprise Edition features
# NOTE: DO NOT ENABLE THIS UNLESS YOU HAVE A PAID ENTERPRISE LICENSE (or if you are using this for local testing/development)
ENABLE_PAID_ENTERPRISE_EDITION_FEATURES=False

# Agent Search configs # TODO: Remove give proper namings
AGENT_RETRIEVAL_STATS=False # Note: This setting will incur substantial re-ranking effort
AGENT_RERANKING_STATS=True
AGENT_MAX_QUERY_RETRIEVAL_RESULTS=20
AGENT_RERANKING_MAX_QUERY_RETRIEVAL_RESULTS=20
29 changes: 29 additions & 0 deletions backend/alembic/versions/1adf5ea20d2b_agent_doc_result_col.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
"""agent_doc_result_col

Revision ID: 1adf5ea20d2b
Revises: e9cf2bd7baed
Create Date: 2025-01-05 13:14:58.344316

"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

# revision identifiers, used by Alembic.
revision = "1adf5ea20d2b"
down_revision = "e9cf2bd7baed"
branch_labels = None
depends_on = None


def upgrade() -> None:
# Add the new column with JSONB type
op.add_column(
"sub_question",
sa.Column("sub_question_doc_results", postgresql.JSONB(), nullable=True),
)


def downgrade() -> None:
# Drop the column
op.drop_column("sub_question", "sub_question_doc_results")
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
"""agent_metric_col_rename__s

Revision ID: 925b58bd75b6
Revises: 9787be927e58
Create Date: 2025-01-06 11:20:26.752441

"""
from alembic import op


# revision identifiers, used by Alembic.
revision = "925b58bd75b6"
down_revision = "9787be927e58"
branch_labels = None
depends_on = None


def upgrade() -> None:
# Rename columns using PostgreSQL syntax
op.alter_column(
"agent__search_metrics", "base_duration_s", new_column_name="base_duration__s"
)
op.alter_column(
"agent__search_metrics", "full_duration_s", new_column_name="full_duration__s"
)


def downgrade() -> None:
# Revert the column renames
op.alter_column(
"agent__search_metrics", "base_duration__s", new_column_name="base_duration_s"
)
op.alter_column(
"agent__search_metrics", "full_duration__s", new_column_name="full_duration_s"
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
"""agent_metric_table_renames__agent__

Revision ID: 9787be927e58
Revises: bceb76d618ec
Create Date: 2025-01-06 11:01:44.210160

"""
from alembic import op


# revision identifiers, used by Alembic.
revision = "9787be927e58"
down_revision = "bceb76d618ec"
branch_labels = None
depends_on = None


def upgrade() -> None:
# Rename table from agent_search_metrics to agent__search_metrics
op.rename_table("agent_search_metrics", "agent__search_metrics")


def downgrade() -> None:
# Rename table back from agent__search_metrics to agent_search_metrics
op.rename_table("agent__search_metrics", "agent_search_metrics")
42 changes: 42 additions & 0 deletions backend/alembic/versions/98a5008d8711_agent_tracking.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
"""agent_tracking

Revision ID: 98a5008d8711
Revises: 2955778aa44c
Create Date: 2025-01-04 14:41:52.732238

"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

# revision identifiers, used by Alembic.
revision = "98a5008d8711"
down_revision = "2955778aa44c"
branch_labels = None
depends_on = None


def upgrade() -> None:
op.create_table(
"agent_search_metrics",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("user_id", postgresql.UUID(as_uuid=True), nullable=True),
sa.Column("persona_id", sa.Integer(), nullable=True),
sa.Column("agent_type", sa.String(), nullable=False),
sa.Column("start_time", sa.DateTime(timezone=True), nullable=False),
sa.Column("base_duration_s", sa.Float(), nullable=False),
sa.Column("full_duration_s", sa.Float(), nullable=False),
sa.Column("base_metrics", postgresql.JSONB(), nullable=True),
sa.Column("refined_metrics", postgresql.JSONB(), nullable=True),
sa.Column("all_metrics", postgresql.JSONB(), nullable=True),
sa.ForeignKeyConstraint(
["persona_id"],
["persona.id"],
),
sa.ForeignKeyConstraint(["user_id"], ["user.id"], ondelete="CASCADE"),
sa.PrimaryKeyConstraint("id"),
)


def downgrade() -> None:
op.drop_table("agent_search_metrics")
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
"""agent_table_renames__agent__

Revision ID: bceb76d618ec
Revises: c0132518a25b
Create Date: 2025-01-06 10:50:48.109285

"""
from alembic import op


# revision identifiers, used by Alembic.
revision = "bceb76d618ec"
down_revision = "c0132518a25b"
branch_labels = None
depends_on = None


def upgrade() -> None:
op.drop_constraint(
"sub_query__search_doc_sub_query_id_fkey",
"sub_query__search_doc",
type_="foreignkey",
)
op.drop_constraint(
"sub_query__search_doc_search_doc_id_fkey",
"sub_query__search_doc",
type_="foreignkey",
)
# Rename tables
op.rename_table("sub_query", "agent__sub_query")
op.rename_table("sub_question", "agent__sub_question")
op.rename_table("sub_query__search_doc", "agent__sub_query__search_doc")

# Update both foreign key constraints for agent__sub_query__search_doc

# Create new foreign keys with updated names
op.create_foreign_key(
"agent__sub_query__search_doc_sub_query_id_fkey",
"agent__sub_query__search_doc",
"agent__sub_query",
["sub_query_id"],
["id"],
)
op.create_foreign_key(
"agent__sub_query__search_doc_search_doc_id_fkey",
"agent__sub_query__search_doc",
"search_doc", # This table name doesn't change
["search_doc_id"],
["id"],
)


def downgrade() -> None:
# Update foreign key constraints for sub_query__search_doc
op.drop_constraint(
"agent__sub_query__search_doc_sub_query_id_fkey",
"agent__sub_query__search_doc",
type_="foreignkey",
)
op.drop_constraint(
"agent__sub_query__search_doc_search_doc_id_fkey",
"agent__sub_query__search_doc",
type_="foreignkey",
)

# Rename tables back
op.rename_table("agent__sub_query__search_doc", "sub_query__search_doc")
op.rename_table("agent__sub_question", "sub_question")
op.rename_table("agent__sub_query", "sub_query")

op.create_foreign_key(
"sub_query__search_doc_sub_query_id_fkey",
"sub_query__search_doc",
"sub_query",
["sub_query_id"],
["id"],
)
op.create_foreign_key(
"sub_query__search_doc_search_doc_id_fkey",
"sub_query__search_doc",
"search_doc", # This table name doesn't change
["search_doc_id"],
["id"],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
"""agent_table_changes_rename_level

Revision ID: c0132518a25b
Revises: 1adf5ea20d2b
Create Date: 2025-01-05 16:38:37.660152

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = "c0132518a25b"
down_revision = "1adf5ea20d2b"
branch_labels = None
depends_on = None


def upgrade() -> None:
# Add level and level_question_nr columns with NOT NULL constraint
op.add_column(
"sub_question",
sa.Column("level", sa.Integer(), nullable=False, server_default="0"),
)
op.add_column(
"sub_question",
sa.Column(
"level_question_nr", sa.Integer(), nullable=False, server_default="0"
),
)

# Remove the server_default after the columns are created
op.alter_column("sub_question", "level", server_default=None)
op.alter_column("sub_question", "level_question_nr", server_default=None)


def downgrade() -> None:
# Remove the columns
op.drop_column("sub_question", "level_question_nr")
op.drop_column("sub_question", "level")
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
"""create pro search persistence tables

Revision ID: e9cf2bd7baed
Revises: 98a5008d8711
Create Date: 2025-01-02 17:55:56.544246

"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects.postgresql import UUID


# revision identifiers, used by Alembic.
revision = "e9cf2bd7baed"
down_revision = "98a5008d8711"
branch_labels = None
depends_on = None


def upgrade() -> None:
# Create sub_question table
op.create_table(
"sub_question",
sa.Column("id", sa.Integer, primary_key=True),
sa.Column("primary_question_id", sa.Integer, sa.ForeignKey("chat_message.id")),
sa.Column(
"chat_session_id", UUID(as_uuid=True), sa.ForeignKey("chat_session.id")
),
sa.Column("sub_question", sa.Text),
sa.Column(
"time_created", sa.DateTime(timezone=True), server_default=sa.func.now()
),
sa.Column("sub_answer", sa.Text),
)

# Create sub_query table
op.create_table(
"sub_query",
sa.Column("id", sa.Integer, primary_key=True),
sa.Column("parent_question_id", sa.Integer, sa.ForeignKey("sub_question.id")),
sa.Column(
"chat_session_id", UUID(as_uuid=True), sa.ForeignKey("chat_session.id")
),
sa.Column("sub_query", sa.Text),
sa.Column(
"time_created", sa.DateTime(timezone=True), server_default=sa.func.now()
),
)

# Create sub_query__search_doc association table
op.create_table(
"sub_query__search_doc",
sa.Column(
"sub_query_id", sa.Integer, sa.ForeignKey("sub_query.id"), primary_key=True
),
sa.Column(
"search_doc_id",
sa.Integer,
sa.ForeignKey("search_doc.id"),
primary_key=True,
),
)


def downgrade() -> None:
op.drop_table("sub_query__search_doc")
op.drop_table("sub_query")
op.drop_table("sub_question")
2 changes: 2 additions & 0 deletions backend/ee/onyx/server/query_and_chat/chat_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ def handle_simplified_chat_message(
chunks_below=0,
full_doc=chat_message_req.full_doc,
structured_response_format=chat_message_req.structured_response_format,
use_pro_search=chat_message_req.use_pro_search,
)

packets = stream_chat_message_objects(
Expand Down Expand Up @@ -301,6 +302,7 @@ def handle_send_message_simple_with_history(
chunks_below=0,
full_doc=req.full_doc,
structured_response_format=req.structured_response_format,
use_pro_search=req.use_pro_search,
)

packets = stream_chat_message_objects(
Expand Down
8 changes: 8 additions & 0 deletions backend/ee/onyx/server/query_and_chat/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ class BasicCreateChatMessageRequest(ChunkContext):
# https://platform.openai.com/docs/guides/structured-outputs/introduction
structured_response_format: dict | None = None

# If True, uses pro search instead of basic search
use_pro_search: bool = False


class BasicCreateChatMessageWithHistoryRequest(ChunkContext):
# Last element is the new query. All previous elements are historical context
Expand All @@ -71,6 +74,8 @@ class BasicCreateChatMessageWithHistoryRequest(ChunkContext):
# only works if using an OpenAI model. See the following for more details:
# https://platform.openai.com/docs/guides/structured-outputs/introduction
structured_response_format: dict | None = None
# If True, uses pro search instead of basic search
use_pro_search: bool = False


class SimpleDoc(BaseModel):
Expand Down Expand Up @@ -123,6 +128,9 @@ class OneShotQARequest(ChunkContext):
# If True, skips generative an AI response to the search query
skip_gen_ai_answer_generation: bool = False

# If True, uses pro search instead of basic search
use_pro_search: bool = False

@model_validator(mode="after")
def check_persona_fields(self) -> "OneShotQARequest":
if self.persona_override_config is None and self.persona_id is None:
Expand Down
Loading
Loading