-
Notifications
You must be signed in to change notification settings - Fork 21
Llm integration POC #1028
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Llm integration POC #1028
Conversation
…s allowed token count. Make conflicting libraries pydantic-ai and ag-ui optional; disabling agent route if not installed. Make search routes async and fix small bugs in query building.
CodSpeed Performance ReportMerging #1028 will not alter performanceComparing Summary
|
…hestrator-core into llm-integration
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #1028 +/- ##
==========================================
- Coverage 85.14% 79.26% -5.89%
==========================================
Files 217 254 +37
Lines 10496 12543 +2047
Branches 1004 1232 +228
==========================================
+ Hits 8937 9942 +1005
- Misses 1305 2330 +1025
- Partials 254 271 +17 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
...migrations/versions/schema/2025-08-12_52b37b5b2714_search_index_model_for_llm_integration.py
Outdated
Show resolved
Hide resolved
orchestrator/search/docs/running_local_text_embedding_inference.md
Outdated
Show resolved
Hide resolved
…ndpoints for autocompleting paths and UI compatible operators per field type for frontend rendering.
… settings and instructions.
…ption records in response, improve highlighting
…hestrator-core into llm-integration
…d substring highlighting
3840906
to
e9597e1
Compare
…ith just a field name and value type. Support component contains/not contains filters.
except Exception as e: | ||
logger.warning(f"Failed to load schema for prompt: {e}") | ||
schema_info = " Schema temporarily unavailable" | ||
logger.error(f"Generated schema for agent prompt:\n{schema_info}") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think this is suppose to be an error log?
def _extract_matching_field_from_filters(filters: FilterTree) -> MatchingField | None: | ||
"""Extract the first path filter to use as matching field for structured searches. | ||
TODO: Should we allow a list of matched fields in the MatchingField model? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
what to do with this? new issue?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice, that's a lot of work 🔥
Overall structure of the code is good, that's why I was able to leave a lot of questions and small remarks. I mean this as a good thing :)
|
||
|
||
def build_agent_app() -> ASGIApp: | ||
if not app_settings.AGENT_MODEL or not app_settings.OPENAI_API_KEY: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These settings are strings that can't be None so by default it will be enabled. Since users need to configure the LLM setup, by default it should IMO be disabled with a bool variable like AGENT_ENABLED
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What kind of failures has this shown?
...migrations/versions/schema/2025-08-12_52b37b5b2714_search_index_model_for_llm_integration.py
Show resolved
Hide resolved
entity_scores.join(entity_highlights, entity_scores.c.entity_id == entity_highlights.c.entity_id) | ||
) | ||
).cte("ranked_results") | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could we split this function up in one for the DB interaction part which produces an output, and another function that performs the below computations based on the former's output? And preferably also some unittests for the latter
@@ -0,0 +1,447 @@ | |||
from abc import ABC, abstractmethod |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe split up into a package with a module for each retriever type, it's a lot of scrolling now :)
|
||
def _quantize_score_for_pagination(self, score_value: float) -> BindParameter[Decimal]: | ||
"""Convert score value to properly quantized Decimal parameter for pagination.""" | ||
pas_dec = Decimal(str(score_value)).quantize(Decimal("0.000000000001")) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should this change along with the SCORE_PRECISION if that ever changes?
If so maybe do something like f'{1 / 10**precision:.{precision}f}
|
||
if not matches: | ||
substring_pattern = re.escape(word) | ||
matches = list(re.finditer(substring_pattern, text, re.IGNORECASE)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If a resulting text has both word and substring matches, wouldn't we want to highlight the substring matches as well?
|
||
class TypeDefinition(BaseModel): | ||
operators: list[FilterOp] | ||
valueSchema: dict[FilterOp, ValueSchema] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is camelCase needed here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sharp one, no I think this is left over from something I tried with pydantic aliases to use camelCase in the response, but it was hard to keep that consistent for deep nested data.
#1069) * Refactor traverse.py to use model based traversal with typing introspection. Included with full unittest coverage * some fixes * move type mapping to types file and fix linting errors.
…e to content hash, add test coverage
…e to content hash, add test coverage
… check instead of relying on typehints
…subscription for traversal
…subscription for traversal
* Make the LLM module more configurable and do not install all deps straight away * Fix linting problems * Agentic app * Fixes * Simplify start up * lint issue * Added some initial documentation for the LLM module --------- Co-authored-by: Tim Frohlich <[email protected]>
pydantic-ai
andag-ui-protocol
need
pydantic >= 2.10
and>=2.11.2
respectively, this breaks some of the unit tests