-
Notifications
You must be signed in to change notification settings - Fork 11
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
restructure gen/semdex features according to #314 #316
Conversation
The latest updates on your projects. Learn more about Vercel for Git ↗︎
1 Skipped Deployment
|
Caution Review failedThe pull request is closed. 📝 Walkthrough📝 WalkthroughWalkthroughThis pull request introduces a comprehensive refactoring of the semantic indexing and generative AI capabilities across the application. The changes involve restructuring the hydration, semdex, and generative services, introducing new interfaces and implementations for AI-powered content tagging, summarization, and recommendation. The modifications aim to create a more modular and flexible approach to handling semantic data and AI-generated content. Changes
Possibly Related PRs
Poem
Tip CodeRabbit's docstrings feature is now available as part of our Early Access Program! Simply use the command 📜 Recent review detailsConfiguration used: CodeRabbit UI ⛔ Files ignored due to path filters (5)
📒 Files selected for processing (39)
🔥 Files not summarized due to errors (1)
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
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.
Actionable comments posted: 5
🧹 Outside diff range and nitpick comments (39)
app/services/semdex/semdexer/weaviate_semdexer/mapping.go (1)
Line range hint
87-94
: Consider enhancing error handling and messagingThe error handling could be more robust and informative:
- Consider validating
s.cn
is initialized- Include more context in the error message (e.g., class name)
func (s *weaviateSemdexer) getFirstResult(wr *WeaviateResponse) (*WeaviateObject, error) { + if s.cn == nil { + return nil, fault.New("class name not initialized") + } + className := s.cn.String() - objects := wr.Get[s.cn.String()] + objects := wr.Get[className] if len(objects) != 1 { - return nil, fault.Newf("expected exactly one result, got %d", len(objects)) + return nil, fault.Newf("expected exactly one result for class %s, got %d", className, len(objects)) } return &objects[0], nil }app/services/semdex/semdex.go (3)
14-16
: Add documentation for new interfacesThe newly introduced interfaces
Semdexer
,Mutator
, andQuerier
lack documentation comments. Adding comments will improve code readability and help other developers understand their purposes.
29-29
: Clarify the usage of variadic parameters inGetMany
The
GetMany
method accepts a variadic slice ofids ...xid.ID
. Ensure that this aligns with the intended usage and consider providing examples or documentation on how to use this method effectively.
38-39
: Review return types inRecommender
interfaceIn the
Recommender
interface,Recommend
returnsdatagraph.ItemList
, whileRecommendRefs
returnsdatagraph.RefList
. Confirm that this distinction is intentional and consider unifying the return types for consistency.app/services/semdex/semdexer/weaviate_semdexer/recommend.go (4)
23-26
: Provide more context in error wrappingWhen wrapping errors with
fault.Wrap
, consider including additional context about where the error occurred to aid in debugging.
Line range hint
31-86
: Check for out-of-bounds access onresult
sliceIn the
RecommendRefs
method, accessingresult[0]
without checking ifresult
is not empty could cause an index out-of-range panic if the query returns no results. Add a check to ensureresult
has at least one element.Apply this diff to fix the issue:
result, err := w.wc.Data().ObjectsGetter(). WithClassName(w.cn.String()). WithVector(). WithID(wid). Do(ctx) if err != nil { return nil, fault.Wrap(err, fctx.With(ctx)) } +if len(result) == 0 { + return nil, fault.New("no objects found with the given ID") +} wobj := result[0]
Line range hint
37-40
: Consider makingWithCertainty
value configurableThe certainty value of
0.5
inWithCertainty(0.5)
is hardcoded. Consider making this value configurable to allow for flexibility based on different use cases or desired recommendation strictness.
Line range hint
50-63
: Enhance error handling for JSON unmarshallingWhen unmarshalling JSON into
WeaviateResponse
, ensure the JSON structure matches the expected format. In case of format changes or unexpected data, this could lead to errors. Implement more robust error handling or validation of the JSON structure.app/services/generative/tags.go (2)
Line range hint
16-31
: Simplify theSuggestTagsPrompt
template for clarityThe current prompt template might be too verbose or complex, which could confuse the AI model generating the tags. Simplify the instructions to focus on the main requirements.
Apply this diff to simplify the prompt:
Analyze the provided content and generate up to three relevant tags. Tags are either single words or multiple words separated only by a hyphen, no spaces. - It's very important that only tags that are relevant to the content are returned, any tags of low confidence MUST be omitted. Do not generate tags that are too vague or tags that are too specific and cannot easily be used in other contexts for other types of content. Generally avoid tags that are singular and not plural that too closely match phrases or words in the content. - Suggested Tags: Suggest any existing tags from the list above that best describe this content, prioritizing tags that closely match the main themes, ideas, or entities mentioned. - New Tags: If there are no suitable matches or if additional tags could enhance discoverability, suggest up to three new tags not found in the existing list. Ensure the tags are relevant, concise, and enhance content discoverability. + Only return tags that are highly relevant to the content. Exclude tags that are too vague or too specific. Avoid directly using phrases from the content. Output Format: Provide only a list of tags separated by commas with no additional text or symbols. Suggested tags should come first, followed by new tags, if any. Consider the following list of existing tags on the platform for context and prioritization: {{ .AvailableTags }} Content: {{ .Content }}
Line range hint
32-52
: Improve robustness when parsing AI-generated tagsWhen splitting the AI-generated result, the parsing might fail if the response format deviates slightly (e.g., missing spaces after commas). Improve the parsing logic to handle such cases.
Apply this diff to enhance parsing:
-resultStrings := strings.Split(result.Answer, ", ") +rawTags := strings.Split(result.Answer, ",") +tags := dt.Map(rawTags, func(s string) tag_ref.Name { + return tag_ref.NewName(strings.TrimSpace(s)) +})app/resources/datagraph/hydrate/hydrator.go (2)
Line range hint
71-86
: Ensure all goroutines exit properly to prevent deadlocksIn the
Hydrate
method, if an error is sent toerrChan
, the main goroutine reads it and returns early, but the spawned goroutines might still be running, leading to potential deadlocks. Use a context with cancellation to signal goroutines to exit when an error occurs.Consider applying this diff:
func (h *Hydrator) Hydrate(ctx context.Context, refs ...*datagraph.Ref) (datagraph.ItemList, error) { ... errChan := make(chan error, 1) + ctx, cancel := context.WithCancel(ctx) + defer cancel() wg := sync.WaitGroup{} ... go func() { wg.Wait() close(results) - close(errChan) }() select { case waitErr := <-errChan: + cancel() return nil, fault.Wrap(waitErr, fctx.With(ctx)) case <-ctx.Done(): return nil, ctx.Err() } }
Line range hint
99-104
: Simplify the sorting and mapping after hydrationThe sorting and mapping logic can be condensed for better readability.
Consider applying:
sort.Slice(hydrated, func(i, j int) bool { return hydrated[i].r > hydrated[j].r }) // Mapping items sorted := make(datagraph.ItemList, len(hydrated)) for i, item := range hydrated { sorted[i] = item.Item }app/services/semdex/semdexer/weaviate_semdexer/search.go (1)
Line range hint
59-59
: Use the provided context instead ofcontext.Background()
Using
context.Background()
inquery.Do()
prevents cancellation or timeout signals from being propagated. It's better to use the providedctx
to maintain proper context.Apply this diff to fix the issue:
-result, err := mergeErrors(query.Do(context.Background())) +result, err := mergeErrors(query.Do(ctx))app/services/semdex/semdexer/chromem_semdexer/chromem.go (4)
78-80
: Consider making the similarity threshold configurableThe similarity threshold of
0.2
is hardcoded in theSearch
method. Making it configurable would allow for greater flexibility in search results.
78-80
: Refactor to reduce code duplication betweenSearch
andSearchRefs
methodsBoth methods perform similar filtering and result mapping. Consider extracting the common logic into a helper function to improve maintainability.
Also applies to: 97-99
123-141
: Eliminate code duplication inRecommendRefs
andRecommend
methodsThe
RecommendRefs
andRecommend
methods share similar logic for retrieving and processing documents. Refactoring this shared logic into a separate function would enhance code reuse and readability.Also applies to: 144-167
Line range hint
214-247
: Ensure vectors are of equal length incosine
functionThe
cosine
function currently accepts vectors of different lengths, which is mathematically incorrect for cosine similarity calculations. Vectors must be of the same length.Apply this diff to enforce equal vector lengths:
-func cosine(a []float64, b []float64) (cosine float64, err error) { - c := 0 - la := len(a) - lb := len(b) - - if la > lb { - c = la - } else { - c = lb - } - - // Existing computation logic +func cosine(a []float64, b []float64) (float64, error) { + if len(a) != len(b) { + return 0.0, fault.New("vectors must be of the same length to compute cosine similarity") + } + sum := 0.0 + s1 := 0.0 + s2 := 0.0 + for i := 0; i < len(a); i++ { + sum += a[i] * b[i] + s1 += math.Pow(a[i], 2) + s2 += math.Pow(b[i], 2) + } + if s1 == 0 || s2 == 0 { + return 0.0, fault.New("cannot compute cosine similarity for zero vectors") + } + return sum / (math.Sqrt(s1) * math.Sqrt(s2)), nil }internal/infrastructure/ai/ai.go (2)
9-11
: Consider adding metadata fields to Result structThe Result struct could benefit from additional fields like completion tokens, model used, and latency for monitoring and debugging purposes.
type Result struct { Answer string + Tokens int + Model string + Latency float64 }
29-31
: Consider logging when disabled prompter is usedAdd debug logging to help diagnose when AI features are disabled.
func (d *Disabled) Prompt(ctx context.Context, input string) (*Result, error) { + // log.Debug().Msg("AI features are disabled") return nil, nil }
app/services/generative/generative.go (1)
26-42
: Consider adding configuration options for AI promptingWhile the implementation is clean, consider making the AI prompting behavior configurable through dependency injection.
type generator struct { prompter ai.Prompter + config GenerativeConfig } +type GenerativeConfig struct { + MaxTokens int + Temperature float64 + // Add other relevant AI configuration options +} -func newGenerator(prompter ai.Prompter) *generator { +func newGenerator(prompter ai.Prompter, config GenerativeConfig) *generator { - return &generator{prompter: prompter} + return &generator{ + prompter: prompter, + config: config, + } } func Build() fx.Option { return fx.Provide( fx.Annotate( newGenerator, fx.As(new(Tagger)), fx.As(new(Summariser)), + fx.ParamTags(`group:"ai_config"`), ), ) }app/services/tag/autotagger/tagger.go (1)
Line range hint
31-40
: Consider adding unit tests for tag suggestion behaviorThe change in tagging implementation warrants additional test coverage.
Would you like me to help generate unit tests for the new generative tagging implementation?
internal/infrastructure/ai/openai.go (1)
23-41
: Consider adding timeout and retry mechanismsThe
Prompt
method should implement:
- Request timeout configuration
- Retry mechanism for transient failures
- Rate limiting handling
Also, consider adding a maximum token limit parameter to prevent excessive API usage:
func (o *OpenAI) Prompt(ctx context.Context, input string) (*Result, error) { res, err := o.client.Chat.Completions.New(ctx, openai.ChatCompletionNewParams{ Model: openai.F(openai.ChatModelChatgpt4oLatest), + MaxTokens: openai.F(1000), // Adjust based on your needs Messages: openai.F([]openai.ChatCompletionMessageParamUnion{ openai.UserMessage(input), }), })
app/services/semdex/semdexer/semdexer.go (1)
23-25
: Enhance error message with configuration guidanceThe error message should provide more context about available language model providers.
if cfg.LanguageModelProvider == "" { - return nil, fault.New("semdex requires a language model provider to be enabled") + return nil, fault.New("semdex requires a language model provider to be enabled (supported: openai)") }app/services/semdex/disabled.go (1)
25-31
: Improve error messages for disabled search operationsThe panic messages "semdex disabled: searcher switch bug" in both
Search
andSearchRefs
methods could be more descriptive to help developers understand why these operations are not available.Consider updating the error messages to be more informative:
- panic("semdex disabled: searcher switch bug") + panic("search operations are not available: semantic indexing is disabled")app/services/semdex/semdexer/weaviate_semdexer/relevance.go (1)
Line range hint
39-44
: Consider enhancing error handling clarityThe current error handling relies on string matching which is fragile. Consider defining sentinel errors or using error codes for more robust error handling.
- if err.Error() == "vector not found" { + var vectorErr *weaviate_errors.WeaviateClientError + if errors.As(err, &vectorErr) && vectorErr.Code == "404" {app/services/semdex/semdexer/weaviate_semdexer/indexer.go (3)
Line range hint
27-28
: Consider documenting error handling behaviorThe error handling logic for non-existent objects combines two conditions. Consider adding a comment explaining this approach.
Line range hint
36-37
: Document content truncation rationaleThe content is truncated to 1000 characters without explanation. Consider adding a comment explaining this limitation or make it configurable.
- "content": content[:min(1000, len(content))], + // Weaviate has a limit on field size, truncating to 1000 chars + "content": content[:min(contentMaxLength, len(content))],
Line range hint
71-83
: Consider enhancing property comparisonThe current comparison function is rigid and doesn't handle potential nil values or type mismatches.
func compareIndexedContentProperties(a, b map[string]any) bool { + // Helper for safe string comparison + safeCompare := func(v1, v2 any) bool { + s1, ok1 := v1.(string) + s2, ok2 := v2.(string) + return ok1 && ok2 && s1 == s2 + } + - if a["name"] != b["name"] { + if !safeCompare(a["name"], b["name"]) { return false }app/services/semdex/index_job/indexer.go (1)
Line range hint
50-62
: Consider documenting the removal of retriever dependencyThe removal of the retriever parameter suggests a change in responsibility. Consider adding a comment explaining this architectural decision.
app/services/generative/summary.go (1)
14-30
: Consider adding template validation and error handlingThe template definition looks good, but there are a few considerations:
- The template is parsed at package initialization with
template.Must()
, which panics on error- The template lacks validation for empty or malformed input
Consider adding input validation and graceful error handling:
var SummarisePrompt = template.Must(template.New("").Parse(` +{{- if not .Content -}} +<p>No content available for summarization.</p> +{{- else -}} Write a short few paragraphs... {{ .Content }} +{{- end -}} `))app/services/thread/thread_semdex/reindexer.go (1)
57-57
: Consider batching GetMany calls for large datasetsWhile the change to use
semdexQuerier
is good, the implementation might benefit from batching for large datasets.Consider implementing batching to handle large sets of IDs:
- indexed, err := r.semdexQuerier.GetMany(ctx, uint(reindexChunk), keepIDs...) + var indexed []*datagraph.Ref + batchSize := 100 + for i := 0; i < len(keepIDs); i += batchSize { + end := i + batchSize + if end > len(keepIDs) { + end = len(keepIDs) + } + batch, err := r.semdexQuerier.GetMany(ctx, uint(batchSize), keepIDs[i:end]...) + if err != nil { + return fault.Wrap(err, fctx.With(ctx)) + } + indexed = append(indexed, batch...) + }app/services/system/instance_info/info.go (1)
63-65
: Consider adding a comment describing the GenAI capabilityFor consistency and clarity, consider adding a comment explaining what features are enabled when the LanguageModelProvider is configured.
+// Check if generative AI features are enabled through a language model provider if p.config.LanguageModelProvider != "" { caps = append(caps, CapabilityGenAI) }
web/src/components/library/LibraryPageTagsList/LibraryPageTagsList.tsx (1)
Line range hint
54-58
: Consider updating the error message to reflect GenAI usageNow that the feature uses generative AI instead of semantic indexing, the error message could be more specific about the AI-based tag suggestion.
- throw new Error( - "No tags could be suggested for this page. This may be due to the content being too short.", - ); + throw new Error( + "The AI model couldn't suggest tags for this page. This may be due to insufficient content for analysis.", + );internal/config/config.go (2)
50-51
: Document the supported language model providersThe
LanguageModelProvider
field lacks documentation about supported values. Consider adding comments to specify which providers are supported.
51-51
: Consider using a secrets manager for API keysStoring API keys in environment variables is common but consider supporting integration with secret management services for production deployments.
app/services/thread/thread_semdex/thread_semdex.go (1)
74-75
: Consider adding context cancellation handlingThe goroutines started in the lifecycle hooks should properly handle context cancellation to ensure clean shutdown.
go func() { + defer msg.Ack() + select { + case <-ctx.Done(): + return + case msg := <-sub: if err := re.indexThread(ctx, msg.Payload.ID); err != nil { l.Error("failed to index post", zap.Error(err)) } - msg.Ack() + } }()app/services/library/node_semdex/indexer.go (2)
28-31
: Consider retrying failed index operationsFor resilience, consider implementing retry logic with backoff for index operations, as external semantic index services might be temporarily unavailable.
Line range hint
84-88
: Add logging for successful deindex operationsConsider adding debug-level logging for successful deindex operations to aid in troubleshooting and monitoring.
err := i.semdexMutator.Delete(ctx, xid.ID(id)) if err != nil { return fault.Wrap(err, fctx.With(ctx)) } +i.logger.Debug("successfully deindexed node", zap.String("node_id", id.String()))
app/services/library/node_semdex/node_semdex.go (1)
43-53
: Well-structured separation of concernsThe restructuring of the semdexer improves the design by:
- Separating mutation and querying operations through distinct interfaces
- Moving summarization to a dedicated generative package
- Maintaining clear boundaries between semantic indexing and AI generation
This separation allows for better testing, maintenance, and future extensibility.
Consider documenting these interfaces in a README.md to help other developers understand the new architecture.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (5)
api/openapi.yaml
is excluded by!**/*.yaml
go.mod
is excluded by!**/*.mod
go.sum
is excluded by!**/*.sum
,!**/*.sum
web/package.json
is excluded by!**/*.json
web/yarn.lock
is excluded by!**/yarn.lock
,!**/*.lock
,!**/*.lock
📒 Files selected for processing (39)
app/resources/datagraph/hydrate/hydrator.go
(1 hunks)app/resources/resources.go
(2 hunks)app/services/generative/generative.go
(1 hunks)app/services/generative/summary.go
(1 hunks)app/services/generative/tags.go
(3 hunks)app/services/library/node_semdex/indexer.go
(2 hunks)app/services/library/node_semdex/node_semdex.go
(4 hunks)app/services/library/node_semdex/reindexer.go
(1 hunks)app/services/semdex/disabled.go
(1 hunks)app/services/semdex/index_job/indexer.go
(3 hunks)app/services/semdex/semdex.go
(1 hunks)app/services/semdex/semdexer/chromem_semdexer/chromem.go
(5 hunks)app/services/semdex/semdexer/refhydrate/semdex.go
(0 hunks)app/services/semdex/semdexer/semdexer.go
(3 hunks)app/services/semdex/semdexer/weaviate_semdexer/average.go
(0 hunks)app/services/semdex/semdexer/weaviate_semdexer/delete.go
(1 hunks)app/services/semdex/semdexer/weaviate_semdexer/indexer.go
(1 hunks)app/services/semdex/semdexer/weaviate_semdexer/mapping.go
(1 hunks)app/services/semdex/semdexer/weaviate_semdexer/recommend.go
(1 hunks)app/services/semdex/semdexer/weaviate_semdexer/relevance.go
(1 hunks)app/services/semdex/semdexer/weaviate_semdexer/retrieval.go
(1 hunks)app/services/semdex/semdexer/weaviate_semdexer/search.go
(2 hunks)app/services/semdex/semdexer/weaviate_semdexer/summarise.go
(0 hunks)app/services/semdex/semdexer/weaviate_semdexer/weaviate.go
(1 hunks)app/services/services.go
(2 hunks)app/services/system/instance_info/capabilities.go
(1 hunks)app/services/system/instance_info/info.go
(1 hunks)app/services/system/instance_info/instance_info_enum_gen.go
(2 hunks)app/services/tag/autotagger/tagger.go
(1 hunks)app/services/thread/thread_semdex/indexer.go
(2 hunks)app/services/thread/thread_semdex/reindexer.go
(1 hunks)app/services/thread/thread_semdex/thread_semdex.go
(3 hunks)app/transports/http/openapi/server_gen.go
(2 hunks)internal/config/config.go
(1 hunks)internal/infrastructure/ai/ai.go
(1 hunks)internal/infrastructure/ai/openai.go
(1 hunks)internal/infrastructure/infrastructure.go
(2 hunks)web/src/api/openapi-schema/instanceCapability.ts
(1 hunks)web/src/components/library/LibraryPageTagsList/LibraryPageTagsList.tsx
(1 hunks)
🔥 Files not summarized due to errors (1)
- app/transports/http/openapi/server_gen.go: Error: Server error: no LLM provider could handle the message
💤 Files with no reviewable changes (3)
- app/services/semdex/semdexer/weaviate_semdexer/average.go
- app/services/semdex/semdexer/weaviate_semdexer/summarise.go
- app/services/semdex/semdexer/refhydrate/semdex.go
🔇 Additional comments (34)
app/services/semdex/semdexer/weaviate_semdexer/mapping.go (1)
87-87
: LGTM: Method receiver change aligns with package refactoring
The change from *weaviateRefIndex
to *weaviateSemdexer
is consistent with the broader refactoring efforts in the semdex package.
app/transports/http/openapi/server_gen.go (2)
114-114
: LGTM! New instance capabilities added correctly.
The new capabilities GenAi
and Semdex
follow the existing naming conventions and align with the PR objectives of restructuring these features.
29933-30150
: Verify the encoded swagger specification content.
This large block of base64-encoded data appears to be an embedded swagger specification. While the encoding looks valid, it would be good to verify that the decoded content matches the expected API changes.
✅ Verification successful
Base64-encoded swagger specification appears to be valid
The file contains a valid OpenAPI/Swagger specification with references to GenAi and Semdex capabilities. The encoded content is properly structured with:
- Correct package declarations and imports
- Defined instance capabilities for
gen_ai
andsemdex
- Standard OpenAPI endpoint at
/openapi.json
- Base64 encoding with proper decoding setup in
GetSwagger()
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Decode and verify the swagger specification content
# Note: Using echo and base64 to safely decode without writing to disk
# Extract the base64 content (excluding quotes and concatenation)
echo "Decoding swagger specification to verify API changes for GenAi and Semdex..."
rg -U --multiline '^[\t ]*"([A-Za-z0-9+/=]+)",' app/transports/http/openapi/server_gen.go | \
sed 's/^[\t ]*"//;s/",$//' | \
base64 -d | \
grep -A 5 -B 5 'gen_ai\|semdex'
Length of output: 426
Script:
#!/bin/bash
# Try a different approach to decode and inspect the base64 content
# Using xxd to decode hex and search for relevant terms
# Extract and process the base64 content
rg -U --multiline '^[\t ]*"([A-Za-z0-9+/=]+)",' app/transports/http/openapi/server_gen.go | \
sed 's/^[\t ]*"//;s/",$//' | \
tr -d '\n' | \
xxd -r -p | \
strings | \
grep -A 5 -B 5 -i "genai\|semdex\|swagger\|openapi"
Length of output: 402
Script:
#!/bin/bash
# Try a simpler approach to inspect the file content
# Look for patterns in the raw file that might indicate API endpoints
rg -U "(?i)(genai|semdex|swagger|openapi|/api/v\d+)" app/transports/http/openapi/server_gen.go
Length of output: 2136
app/services/semdex/semdex.go (1)
19-23
: Ensure consistent error handling in Mutator
methods
Verify that the implementations of the Index
and Delete
methods in the Mutator
interface handle errors consistently and follow the project's error-handling conventions.
app/services/semdex/semdexer/weaviate_semdexer/search.go (1)
18-31
: Search method implementation looks good
The Search
method correctly retrieves references, hydrates them, and returns the result.
app/services/semdex/semdexer/weaviate_semdexer/delete.go (1)
11-11
: Update to receiver type aligns with refactoring
Changing the receiver type to weaviateSemdexer
in the Delete
method is consistent with the overall restructuring of the package.
app/services/system/instance_info/capabilities.go (1)
8-8
: Addition of capabilityGenAI
is appropriate
The new capability gen_ai
is correctly added to the list of capabilities, enhancing the system's ability to identify generative AI functionalities.
internal/infrastructure/ai/ai.go (1)
13-15
: LGTM! Clean interface design.
The Prompter interface follows the single responsibility principle with a clear, focused method signature.
app/services/semdex/semdexer/weaviate_semdexer/weaviate.go (2)
10-13
: LGTM! Clear struct definition with proper field organization.
The renamed struct better reflects its purpose, and the field organization follows a logical pattern.
17-24
: Verify hydrator integration across the codebase
The constructor changes look good, but we should verify the hydrator integration.
✅ Verification successful
Let me gather more information about the hydrator integration.
Let me try one more search to verify the hydrator integration.
Hydrator integration is properly implemented across the codebase
The hydrator is consistently integrated:
- Properly imported from
app/resources/datagraph/hydrate
package - Correctly initialized in both semdexer implementations (chromem and weaviate)
- Consistently used through
hydrator.Hydrate()
method calls with proper error handling
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check for consistent hydrator usage across the codebase
# Check for any remaining refhydrate references
echo "Checking for old refhydrate references:"
rg "refhydrate"
# Check for consistent hydrator parameter naming
echo "Checking hydrator parameter naming consistency:"
ast-grep --pattern 'func $_($$_, hydrator *hydrate.Hydrator)'
Length of output: 273
Script:
#!/bin/bash
# Check for hydrator usage patterns in the codebase
echo "Checking hydrator import and usage patterns:"
rg "hydrator" -A 2
# Check specifically for hydrate package imports
echo -e "\nChecking hydrate package imports:"
rg "\".*hydrate\""
# Look for hydrator struct field declarations
echo -e "\nChecking hydrator field declarations:"
ast-grep --pattern 'type $_ struct {
$$$
hydrator *hydrate.Hydrator
$$$
}'
Length of output: 69149
Script:
#!/bin/bash
# Check for hydrator method usage patterns
echo "Checking hydrator method usage:"
rg "hydrator\." -A 2
# Check for hydrate package imports
echo -e "\nChecking hydrate package imports:"
rg "\".*hydrate\"" --type go
# Check for hydrator initialization
echo -e "\nChecking hydrator initialization:"
rg "New.*hydrator" -A 2
Length of output: 2304
web/src/api/openapi-schema/instanceCapability.ts (1)
16-16
: Verify gen_ai capability integration
The capability addition looks good, but let's verify its integration with the backend.
app/services/generative/generative.go (2)
13-19
: Well-designed interfaces with clear responsibilities
The Tagger
and Summariser
interfaces are well-defined with focused methods that follow the single responsibility principle.
21-24
: Good practice: Compile-time interface compliance checks
Using compile-time checks to verify interface implementation is a robust practice that catches issues early.
app/services/thread/thread_semdex/indexer.go (2)
34-34
: Verify ID type conversion safety
The conversion of post.ID
to xid.ID
should be verified for safety.
✅ Verification successful
Based on the shell script results, I can now provide a definitive response about the ID type conversion safety:
ID type conversion is safe and consistent with the codebase design
The conversion of id
to xid.ID
in the indexer is safe because:
- The
post.ID
type is explicitly defined asxid.ID
inapp/resources/post/post.go:26
- This pattern of converting IDs to
xid.ID
is consistently used throughout the codebase for database operations - The conversion is a type-safe operation since both source and target types are the same underlying type
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for post.ID type definition and usage patterns
ast-grep --pattern 'type ID $$$'
# Search for xid.ID conversions
rg -A 2 'xid\.ID\('
Length of output: 33618
20-20
: Verify semdexMutator's error handling behavior
The change from indexer.Index
to semdexMutator.Index
might have different error handling characteristics.
✅ Verification successful
Let me gather more information about the error handling in the semdexMutator interface.
Let me try a different search pattern to find the interface definitions.
Based on the search results and previous outputs, I can now generate a final response:
Error handling behavior is consistent with previous implementation
The change to semdexMutator.Index
maintains consistent error handling patterns. Both the old implementation (weaviateSemdexer) and the new semdexMutator interface follow Go's standard error return pattern, and the error is properly propagated up the call stack. The implementations (including chromem and disabled variants) all properly handle and return errors.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for semdexMutator interface definition and implementation
ast-grep --pattern 'type semdexMutator interface {
$$$
Index($$$) error
$$$
}'
# Search for error handling patterns in semdexMutator implementations
rg -A 5 'func.*Index.*context.Context.*\).*error'
Length of output: 7985
Script:
#!/bin/bash
# Search for semdexMutator interface and its implementations
rg -A 10 'type semdexMutator'
# Search for the old indexer interface and its error handling
rg -A 10 'type.*[Ii]ndexer.*interface'
Length of output: 72
Script:
#!/bin/bash
# Search for interface definitions and implementations in the thread_semdex directory
rg -A 10 'interface' app/services/thread/thread_semdex/
# Search for the old implementation to compare error handling
fd indexer.go --exec rg -A 10 'func.*Index'
Length of output: 1588
app/services/tag/autotagger/tagger.go (1)
18-18
: Verify backward compatibility of the Tagger interface
The switch from semdex.Tagger
to generative.Tagger
might affect existing callers.
Also applies to: 23-23
app/services/semdex/semdexer/semdexer.go (1)
43-49
: Verify interface implementation completeness
The changes in interface annotations (Querier
, Mutator
, Searcher
) represent a significant change in the component's responsibilities.
✅ Verification successful
All interface implementations are properly implemented
Based on the search results, both implementations (weaviate_semdexer and chromem_semdexer) fully implement all required interfaces:
- Mutator (Index, Delete): ✓ Implemented in both
- Searcher (Search, SearchRefs): ✓ Implemented in both
- Recommender (Recommend, RecommendRefs): ✓ Implemented in both
- RelevanceScorer (ScoreRelevance): ✓ Implemented in both
- Querier (GetMany): ✓ Implemented in both
The interface annotations in the component accurately reflect its implemented responsibilities.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check if all required interface methods are implemented
ast-grep --pattern 'type $interface interface {
$$$
}' app/services/semdex/semdex.go
# Check implementations in semdexer implementations
ast-grep --pattern 'func \(.*\) $method\($$$\)' app/services/semdex/semdexer/chromem_semdexer/chromem_semdexer.go app/services/semdex/semdexer/weaviate_semdexer/weaviate_semdexer.go
Length of output: 500
Script:
#!/bin/bash
# First, let's find the actual implementation files
fd semdexer.go
# Then, let's check the interface definitions
rg -A 5 "type.*interface" app/services/semdex/semdex.go
# Finally, let's check the implementations in the found files
for file in $(fd semdexer.go); do
echo "=== Checking implementations in $file ==="
rg "^func \(.*\)" "$file"
done
Length of output: 1358
Script:
#!/bin/bash
# Let's find all Go files in the semdexer directory to locate implementations
fd "\.go$" app/services/semdex/semdexer/
# For each interface method, let's search for its implementation
echo "=== Searching for Index implementation ==="
rg "func.*Index\(ctx context\.Context, object datagraph\.Item\)" -A 2
echo "=== Searching for Delete implementation ==="
rg "func.*Delete\(ctx context\.Context, object xid\.ID\)" -A 2
echo "=== Searching for Search implementations ==="
rg "func.*Search\(ctx context\.Context" -A 2
echo "=== Searching for Recommend implementations ==="
rg "func.*Recommend\(ctx context\.Context" -A 2
echo "=== Searching for ScoreRelevance implementation ==="
rg "func.*ScoreRelevance\(ctx context\.Context" -A 2
echo "=== Searching for GetMany implementation ==="
rg "func.*GetMany\(ctx context\.Context" -A 2
Length of output: 10446
internal/infrastructure/infrastructure.go (1)
37-37
: Verify AI service dependencies
The AI service might depend on other infrastructure components. Ensure proper initialization order.
✅ Verification successful
AI service has no infrastructure dependencies
The AI service is self-contained and only depends on the application config. It:
- Takes only
config.Config
as a parameter - Has no imports from other infrastructure components
- Implements a simple factory pattern that returns either OpenAI client or disabled implementation
- Is properly positioned in the dependency injection setup
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check for potential dependencies in ai.New
ast-grep --pattern 'func New($$$) ($$$)' internal/infrastructure/ai/ai.go
# Check for usage of other infrastructure components
rg -l "infrastructure/(cache|db|logger)" internal/infrastructure/ai/
Length of output: 636
Script:
#!/bin/bash
# Check for dependencies in newOpenAI function
ast-grep --pattern 'func newOpenAI($$$) ($$$)' internal/infrastructure/ai/ai.go
# Check for any imports from infrastructure package
rg "^import \(" -A 10 internal/infrastructure/ai/ai.go
# Check if other components use AI service
rg "ai\.(New|Prompter)" internal/infrastructure/
Length of output: 491
app/services/system/instance_info/instance_info_enum_gen.go (2)
15-15
: LGTM: New capability declaration follows existing pattern
The addition of CapabilityGenAI
follows the established pattern for capability declarations.
58-59
: LGTM: NewCapability handler added correctly
The new case for capabilityGenAI
is properly integrated into the NewCapability function.
app/services/semdex/disabled.go (1)
13-15
: LGTM: Null object pattern implementation
The Disabled
struct with interface verification is correctly implemented.
app/services/semdex/semdexer/weaviate_semdexer/retrieval.go (1)
17-17
: LGTM: Receiver update aligns with refactoring
The change of receiver from *weaviateRefIndex
to *weaviateSemdexer
is consistent with the package restructuring.
app/services/semdex/semdexer/weaviate_semdexer/relevance.go (1)
17-17
: LGTM: Receiver type change aligns with the package restructuring
The change from weaviateRefIndex
to weaviateSemdexer
is consistent with the broader refactoring effort.
app/services/semdex/index_job/indexer.go (1)
34-34
: Verify the impact of interface change
The change from Indexer
to Mutator
interface might affect other components that depend on the removed functionality.
✅ Verification successful
Interface change is safe and correctly implemented
The change from Indexer
to Mutator
interface is a safe refactoring that maintains the same functionality. The Mutator
interface in semdex.go
defines the same core operations (Index
and Delete
) that were previously part of the Indexer
interface. All implementations, including the Weaviate implementation, properly implement these methods. The change appears to be part of a larger interface restructuring that better separates concerns between mutation and querying operations.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for any remaining references to the old Indexer interface
rg -l "semdex\.Indexer" --type go
# Search for potential interface implementations that might need updating
ast-grep --pattern 'type $name struct {
$$$
indexer $type
$$$
}'
Length of output: 108
Script:
#!/bin/bash
# Let's try a broader search for Indexer references and implementations
rg "Indexer" --type go -A 3
# Search for Mutator interface usage
rg "Mutator" --type go -A 3
# Look for any files in semdex directory
fd . "app/services/semdex" -t f -e go
Length of output: 23342
Script:
#!/bin/bash
# Let's check the semdex interface definition and its usage
cat app/services/semdex/semdex.go
# Check the implementation details
cat app/services/semdex/semdexer/weaviate_semdexer/indexer.go
Length of output: 3495
app/services/library/node_semdex/reindexer.go (1)
56-56
: Verify semdexQuerier implementation compatibility
The change from retriever
to semdexQuerier
looks good, but we should verify the interface compatibility.
✅ Verification successful
Interface compatibility verified successfully
The change from retriever
to semdexQuerier
is correct and compatible. The semdexQuerier
is of type semdex.Querier
which includes the required GetMany
method with the exact signature: GetMany(ctx context.Context, limit uint, ids ...xid.ID) (datagraph.RefList, error)
. The implementation is being used correctly in the reindexer.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check if semdexQuerier interface is implemented correctly
ast-grep --pattern 'type $_ interface {
GetMany(ctx context.Context, limit uint, ids ...xid.ID) ([]*datagraph.Ref, error)
$$$
}'
Length of output: 134
Script:
#!/bin/bash
# Let's try a broader search for GetMany method and interfaces
rg "GetMany.*context\.Context.*uint.*xid\.ID.*\[\]\*datagraph\.Ref" -A 2
# Also search for semdexQuerier definition
rg "type.*semdexQuerier" -A 5
# And check the actual implementation
ast-grep --pattern 'func ($_ $_) GetMany(ctx context.Context, $$$) ([]*datagraph.Ref, error) {
$$$
}'
Length of output: 212
Script:
#!/bin/bash
# Let's try simpler searches to find any mentions of GetMany and semdexQuerier
rg "GetMany" -A 2
# Search for semdexQuerier with more context
rg "semdexQuerier" -B 2 -A 2
# Look for any interface definitions in the same file
fd "reindexer.go" --exec cat {}
Length of output: 11124
Script:
#!/bin/bash
# Let's check the semdex package for the Querier interface definition
rg "type Querier interface" -A 5 app/services/semdex/
Length of output: 385
app/services/services.go (1)
19-19
: LGTM: Clean integration of generative service
The addition of the generative service and its build function is well-structured and properly placed alongside related services.
Also applies to: 61-61
app/services/system/instance_info/info.go (1)
63-65
: LGTM: Clean addition of GenAI capability check
The new capability check follows the established pattern and is properly placed in the capability determination flow.
web/src/components/library/LibraryPageTagsList/LibraryPageTagsList.tsx (1)
20-20
: LGTM: Updated capability check from semdex to gen_ai
The capability check has been properly updated to use the new gen_ai capability.
app/services/thread/thread_semdex/thread_semdex.go (1)
45-46
: Good refactoring of semantic indexing interfaces
The consolidation of separate indexer/deleter interfaces into a unified Mutator
and Querier
interface improves code organization and reduces interface complexity.
app/services/library/node_semdex/node_semdex.go (3)
14-14
: LGTM: Import changes align with the restructuring
The addition of the generative package import reflects the separation of concerns between semantic indexing and generative AI capabilities.
78-88
: LGTM: Clean initialization with preserved functionality
The initialization correctly maps all dependencies while maintaining the existing background processing capabilities.
67-69
: Verify dependency injection chain
The parameter changes align with the struct changes. Let's ensure all dependencies are properly configured.
✅ Verification successful
Dependencies are properly configured through dependency injection
The code review shows that the dependency injection is correctly set up:
- The
NodeSemdex
struct properly declares all required dependencies includingsemdex.Mutator
,semdex.Querier
, andgenerative.Summariser
. - The dependencies are injected through the
fx.Provide
mechanism in theBuild()
function. - The
newSemdexer
constructor is invoked viafx.Invoke
and receives all required dependencies. - Configuration check for
SemdexProvider
is present and maintained.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for providers of the new interfaces
rg -l "func New.*\(.*\).*semdex\.Mutator"
rg -l "func New.*\(.*\).*semdex\.Querier"
rg -l "func New.*\(.*\).*generative\.Summariser"
Length of output: 138
Script:
#!/bin/bash
# Let's try a different approach to find the dependency providers
# First, let's check the interface definitions
rg "type (Mutator|Querier) interface" -A 5
# Check for Summariser interface
rg "type Summariser interface" -A 5
# Look for any constructors or providers in the codebase
rg "func New.*Semdex" -A 5
rg "func New.*Provider" -A 5
# Check for wire provider sets or dependency injection configuration
fd -e go -x rg -l "provider\.NewSet|wire\.NewSet"
Length of output: 6756
Script:
#!/bin/bash
# Let's check for implementations of these interfaces
# Search for chromem semdexer implementation details
rg "type.*struct.*{" -A 5 app/services/semdex/semdexer/chromem_semdexer/chromem.go
# Check for any wire.Build calls that might show the dependency injection setup
fd -e go -x rg "wire\.Build" -A 10 {}
# Look for the actual implementation of the Summariser
rg "type generator struct" -A 5
rg "func NewGenerator" -A 5
# Check the node_semdex implementation
rg "type NodeSemdex struct" -A 10 app/services/library/node_semdex/node_semdex.go
Length of output: 737
Script:
#!/bin/bash
# Let's fix the syntax and try again
rg "type.*struct" -A 5 app/services/semdex/semdexer/chromem_semdexer/chromem.go
# Check the node_semdex implementation with a simpler pattern
rg "type NodeSemdex" -A 10 app/services/library/node_semdex/node_semdex.go
# Look for wire initialization
fd wire.go$ -x cat {}
# Check for the actual constructor of NodeSemdex
rg "func New.*NodeSemdex" -A 5 app/services/library/node_semdex/node_semdex.go
Length of output: 380
Script:
#!/bin/bash
# Let's check the entire node_semdex.go file content since it's the main file in question
cat app/services/library/node_semdex/node_semdex.go
# Also check for any provider implementations in the semdex package
rg "implements.*semdex\.(Mutator|Querier)"
rg "var.*_.*semdex\.(Mutator|Querier)"
# Look for any dependency injection setup files in the library directory
fd -e go -x rg -l "wire\.|provider\." app/services/library/
# Check for any provider implementations of Summariser
rg "implements.*generative\.Summariser"
rg "var.*_.*generative\.Summariser"
Length of output: 4288
app/resources/resources.go (2)
23-23
: LGTM: Import for hydration functionality
The addition of the hydrate package import aligns with the enhanced data processing capabilities mentioned in the AI summary.
96-96
: Verify hydrator integration
The hydrator is properly registered for dependency injection. Let's verify its usage across the codebase.
✅ Verification successful
Let me verify how the hydrator is being used in the implementations by checking the actual usage patterns.
Hydrator integration verified successfully
The hydrator is properly integrated and used consistently across the codebase:
- Used in both semdexer implementations (chromem and weaviate)
- Correctly injected via dependency injection
- Properly called with error handling in search and recommend operations
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for hydrator usage
rg "hydrate\." --type go -A 3
Length of output: 1733
Script:
#!/bin/bash
# Check hydrator usage in semdexer implementations
ast-grep --pattern 'type $_ struct {
hydrator *hydrate.Hydrator
$$$
}'
# Also check for actual method calls
rg "hydrator\." --type go -A 5
Length of output: 2120
func (w *weaviateSemdexer) Recommend(ctx context.Context, object datagraph.Item) (datagraph.ItemList, error) { | ||
refs, err := w.RecommendRefs(ctx, object) | ||
if err != nil { | ||
return nil, fault.Wrap(err, fctx.With(ctx)) | ||
} | ||
|
||
items, err := w.hydrator.Hydrate(ctx, refs...) | ||
if err != nil { | ||
return nil, fault.Wrap(err, fctx.With(ctx)) | ||
} | ||
|
||
return items, nil | ||
} |
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.
Handle potential nil or empty results from RecommendRefs
In the Recommend
method, after calling RecommendRefs
, there is no check to ensure that refs
is not nil or empty before proceeding to hydrate items. This could lead to a nil pointer dereference. Please add a check to handle empty results gracefully.
Apply this diff to handle empty refs
:
refs, err := w.RecommendRefs(ctx, object)
if err != nil {
return nil, fault.Wrap(err, fctx.With(ctx))
}
+if len(refs) == 0 {
+ return nil, nil // or handle as appropriate
+}
items, err := w.hydrator.Hydrate(ctx, refs...)
if err != nil {
return nil, fault.Wrap(err, fctx.With(ctx))
}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
func (w *weaviateSemdexer) Recommend(ctx context.Context, object datagraph.Item) (datagraph.ItemList, error) { | |
refs, err := w.RecommendRefs(ctx, object) | |
if err != nil { | |
return nil, fault.Wrap(err, fctx.With(ctx)) | |
} | |
items, err := w.hydrator.Hydrate(ctx, refs...) | |
if err != nil { | |
return nil, fault.Wrap(err, fctx.With(ctx)) | |
} | |
return items, nil | |
} | |
func (w *weaviateSemdexer) Recommend(ctx context.Context, object datagraph.Item) (datagraph.ItemList, error) { | |
refs, err := w.RecommendRefs(ctx, object) | |
if err != nil { | |
return nil, fault.Wrap(err, fctx.With(ctx)) | |
} | |
if len(refs) == 0 { | |
return nil, nil // or handle as appropriate | |
} | |
items, err := w.hydrator.Hydrate(ctx, refs...) | |
if err != nil { | |
return nil, fault.Wrap(err, fctx.With(ctx)) | |
} | |
return items, nil | |
} |
func New(cfg config.Config) (Prompter, error) { | ||
switch cfg.LanguageModelProvider { | ||
case "openai": | ||
return newOpenAI(cfg) | ||
|
||
default: | ||
return &Disabled{}, nil | ||
} | ||
} |
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.
🛠️ Refactor suggestion
Consider adding validation for empty provider configuration
The factory function should explicitly handle empty/whitespace provider values.
func New(cfg config.Config) (Prompter, error) {
+ if cfg.LanguageModelProvider == "" {
+ return &Disabled{}, nil
+ }
switch cfg.LanguageModelProvider {
case "openai":
return newOpenAI(cfg)
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
func New(cfg config.Config) (Prompter, error) { | |
switch cfg.LanguageModelProvider { | |
case "openai": | |
return newOpenAI(cfg) | |
default: | |
return &Disabled{}, nil | |
} | |
} | |
func New(cfg config.Config) (Prompter, error) { | |
if cfg.LanguageModelProvider == "" { | |
return &Disabled{}, nil | |
} | |
switch cfg.LanguageModelProvider { | |
case "openai": | |
return newOpenAI(cfg) | |
default: | |
return &Disabled{}, nil | |
} | |
} |
func newOpenAI(cfg config.Config) (*OpenAI, error) { | ||
client := openai.NewClient(option.WithAPIKey(cfg.OpenAIKey)) | ||
return &OpenAI{client: client}, nil | ||
} |
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.
Add configuration validation
The newOpenAI
function should validate that cfg.OpenAIKey
is not empty before creating the client.
func newOpenAI(cfg config.Config) (*OpenAI, error) {
+ if cfg.OpenAIKey == "" {
+ return nil, fault.New("OpenAI API key is required")
+ }
client := openai.NewClient(option.WithAPIKey(cfg.OpenAIKey))
return &OpenAI{client: client}, nil
}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
func newOpenAI(cfg config.Config) (*OpenAI, error) { | |
client := openai.NewClient(option.WithAPIKey(cfg.OpenAIKey)) | |
return &OpenAI{client: client}, nil | |
} | |
func newOpenAI(cfg config.Config) (*OpenAI, error) { | |
if cfg.OpenAIKey == "" { | |
return nil, fault.New("OpenAI API key is required") | |
} | |
client := openai.NewClient(option.WithAPIKey(cfg.OpenAIKey)) | |
return &OpenAI{client: client}, nil | |
} |
func (*Disabled) Recommend(ctx context.Context, object datagraph.Item) (datagraph.ItemList, error) { | ||
return nil, nil | ||
} | ||
|
||
func (*Disabled) RecommendRefs(ctx context.Context, object datagraph.Item) (datagraph.RefList, error) { | ||
return nil, nil | ||
} | ||
|
||
func (*Disabled) ScoreRelevance(ctx context.Context, object datagraph.Item, idx ...xid.ID) (map[xid.ID]float64, error) { | ||
return nil, nil | ||
} | ||
|
||
func (*Disabled) GetMany(ctx context.Context, limit uint, ids ...xid.ID) (datagraph.RefList, error) { | ||
return nil, nil | ||
} |
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.
🛠️ Refactor suggestion
Consider returning ErrDisabled instead of nil
The methods Recommend
, RecommendRefs
, ScoreRelevance
, and GetMany
return nil
values. Consider returning a sentinel error to make it explicit that these operations are disabled.
Consider adding an error variable and using it consistently:
+var ErrSemdexDisabled = errors.New("semantic indexing is disabled")
func (*Disabled) Recommend(ctx context.Context, object datagraph.Item) (datagraph.ItemList, error) {
- return nil, nil
+ return nil, ErrSemdexDisabled
}
Committable suggestion skipped: line range outside the PR's diff.
func (g *generator) Summarise(ctx context.Context, object datagraph.Item) (string, error) { | ||
template := strings.Builder{} | ||
err := SummarisePrompt.Execute(&template, map[string]any{ | ||
"Name": object.GetName(), | ||
"Content": object.GetContent().Plaintext(), | ||
}) | ||
if err != nil { | ||
return "", fault.Wrap(err, fctx.With(ctx)) | ||
} | ||
|
||
result, err := g.prompter.Prompt(ctx, template.String()) | ||
if err != nil { | ||
return "", fault.Wrap(err, fctx.With(ctx)) | ||
} | ||
|
||
return result.Answer, nil | ||
} |
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.
🛠️ Refactor suggestion
Add context timeout and error context enrichment
The implementation looks solid but could benefit from additional error handling and context management.
Consider these improvements:
func (g *generator) Summarise(ctx context.Context, object datagraph.Item) (string, error) {
+ if object == nil {
+ return "", fault.New("nil item provided")
+ }
+
+ // Add timeout to prevent long-running summarizations
+ ctx, cancel := context.WithTimeout(ctx, 30*time.Second)
+ defer cancel()
+
template := strings.Builder{}
err := SummarisePrompt.Execute(&template, map[string]any{
"Name": object.GetName(),
"Content": object.GetContent().Plaintext(),
})
if err != nil {
- return "", fault.Wrap(err, fctx.With(ctx))
+ return "", fault.Wrap(err, fctx.With(ctx,
+ fctx.String("item_name", object.GetName())))
}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
func (g *generator) Summarise(ctx context.Context, object datagraph.Item) (string, error) { | |
template := strings.Builder{} | |
err := SummarisePrompt.Execute(&template, map[string]any{ | |
"Name": object.GetName(), | |
"Content": object.GetContent().Plaintext(), | |
}) | |
if err != nil { | |
return "", fault.Wrap(err, fctx.With(ctx)) | |
} | |
result, err := g.prompter.Prompt(ctx, template.String()) | |
if err != nil { | |
return "", fault.Wrap(err, fctx.With(ctx)) | |
} | |
return result.Answer, nil | |
} | |
func (g *generator) Summarise(ctx context.Context, object datagraph.Item) (string, error) { | |
if object == nil { | |
return "", fault.New("nil item provided") | |
} | |
// Add timeout to prevent long-running summarizations | |
ctx, cancel := context.WithTimeout(ctx, 30*time.Second) | |
defer cancel() | |
template := strings.Builder{} | |
err := SummarisePrompt.Execute(&template, map[string]any{ | |
"Name": object.GetName(), | |
"Content": object.GetContent().Plaintext(), | |
}) | |
if err != nil { | |
return "", fault.Wrap(err, fctx.With(ctx, | |
fctx.String("item_name", object.GetName()))) | |
} | |
result, err := g.prompter.Prompt(ctx, template.String()) | |
if err != nil { | |
return "", fault.Wrap(err, fctx.With(ctx)) | |
} | |
return result.Answer, nil | |
} |
ab83f39
to
4256d5b
Compare
#314