Skip to content
This repository was archived by the owner on Jan 13, 2025. It is now read-only.

Conversation

@sauravpanda
Copy link
Member

@sauravpanda sauravpanda commented Dec 26, 2024

Comprehensive Enhancement of AI Search and Next.js Configuration

  • Purpose:
    Improve AI search capabilities and optimize Next.js configuration for better performance and functionality.
  • Key Changes:
    • Enhanced Next.js configuration with path resolution for @huggingface/transformers and disabled certain webpack aliases.
    • Enabled experimental ES module support in Next.js.
    • Updated package version from 1.0.52 to 1.0.53 and added several new dependencies.
    • Implemented a SQLite database for storing documentation content and embeddings, improving search efficiency.
    • Integrated a custom embedding generation process using Hugging Face Transformers, executed in a separate web worker.
    • Optimized AI response generation by combining relevant documents based on cosine similarity.
    • Improved UI/UX with loading indicators and better error handling during searches.
    • Refactored code to utilize React hooks and memoization for performance enhancements.
    • Added a new EmbeddingPipeline class for managing embedding processes.
    • Enhanced AI search logic to utilize embeddings for more accurate and context-aware responses.
  • Impact:
    These changes collectively enhance the accuracy, responsiveness, and overall user experience of the AI search functionality while ensuring Next.js is configured for optimal performance with the latest libraries.

✨ Generated with love by Kaizen ❤️

Original Description # Comprehensive Update on Next.js Configuration and AI Search Enhancements
  • **Purpose:
    **
    Consolidate improvements in Next.js configuration and enhance AI search functionality through embedding generation and database integration.
  • Key Changes:
    • Enhanced Next.js configuration with path resolution for @huggingface/transformers and disabled unnecessary aliases.
    • Enabled experimental ES module support in Next.js and updated package dependencies to improve compatibility.
    • Implemented a process to extract documentation content from JSON files and generate embeddings for efficient retrieval.
    • Integrated SQLite database for storing extracted content and embeddings, optimizing search performance.
    • Added EmbeddingPipeline class for efficient embedding generation and integrated cosine similarity for search relevance.
    • Improved AI search logic to leverage document embeddings for more accurate and contextual search results.
    • Introduced asynchronous processing for embedding generation to enhance performance.
    • Optimized AI response rendering with memoization for better user experience.
    • Enhanced error handling and response formatting in AI functionalities.
  • **Impact:
    **
    These changes collectively enhance the performance, accuracy, and usability of the AI search feature and improve the overall configuration of the Next.js application.

✨ Generated with love by Kaizen ❤️

Original Description # Enhance AI Search Functionality with Embeddings
  • ****Purpose:
    **
    **
    Introduce an embedding-based search feature to improve the relevance and accuracy of the AI-powered search functionality in the AkiraDocs documentation.
  • Key Changes:
    • Implemented a SQLite-based database to store the documentation content and corresponding embeddings.
    • Added an EmbeddingPipeline class to handle the generation of document embeddings using a pre-trained transformer model.
    • Integrated the embedding-based search logic, where the user's query is used to find the most relevant documents based on cosine similarity with the embeddings.
    • Optimized the AI response rendering by memoizing the ReactMarkdown component to prevent unnecessary re-renders.
    • Improved the overall user experience with better error handling and more informative loading states.
  • ****Impact:
    **
    **
    These changes significantly enhance the AI search functionality, providing users with more relevant and accurate results by leveraging document embeddings, leading to a better overall experience when searching the AkiraDocs documentation.

✨ Generated with love by Kaizen ❤️

Original Description # Comprehensive Update to Next.js Configuration and AI Search Functionality
  • ******Purpose:
    **
    **
    **
    Integrate enhancements to Next.js configuration and improve AI search performance through a new database approach.
  • Key Changes:
    • Updated Next.js configuration for better module resolution with path and URL imports.
    • Configured Webpack to resolve specific aliases and enabled experimental ES module support.
    • Added multiple new dependencies, including Hugging Face transformers and SQLite.
    • Replaced text file-based storage with a SQLite database for document embeddings.
    • Introduced a database worker for efficient query handling.
    • Developed a custom embedding generation process with progress reporting.
    • Optimized search performance using cosine similarity for relevance ranking.
    • Enhanced AI response formatting, including syntax highlighting for code snippets.
    • Implemented memoization in the Markdown rendering component to reduce re-renders.
  • ******Impact:
    **
    **
    **
    These updates are set to improve build processes, enhance AI search reliability, and deliver a better user experience with more accurate results.

✨ Generated with love by Kaizen ❤️

Original Description # Enhance Next.js Configuration and Expand Functionality
  • ********Purpose:
    **
    **
    **
    **
    Improve Next.js configuration, update dependencies, and introduce new capabilities for the project.
  • Key Changes:
    • Added path resolution for @huggingface/transformers and disabled sharp and onnxruntime-node aliases.
    • Enabled ES modules in the experimental section of the Next.js config.
    • Updated package.json to include new dependencies: @huggingface/transformers, @xenova/transformers, better-sqlite3, remark-gfm, sharp, sql.js-httpvfs, and sqlite-vss.
    • Implemented a document embedding generation pipeline using the Xenova/gte-small model.
    • Stored the generated document embeddings and content in a SQLite database.
    • Introduced a database worker to efficiently query the SQLite database.
    • Implemented a cosine similarity-based search algorithm to find the most relevant documents for a given query.
    • Optimized the AI search process by loading the database and initializing the embedding model asynchronously.
    • Improved the UI with a more informative loading state and better error handling.
  • ********Impact:
    **
    **
    **
    **
    These changes improve module resolution, expand the project's capabilities with new libraries, and enhance the AI search functionality, resulting in more accurate and responsive search results.

✨ Generated with love by Kaizen ❤️

Original Description # Comprehensive Update on Next.js Configuration and AI Search Enhancements
  • **********Purpose:
    **
    **
    **
    **
    **
    Streamline Next.js configuration and enhance AI search functionality through improved dependencies and document embeddings.
  • Key Changes:
    • Added aliases for sharp, onnxruntime-node, and resolved @huggingface/transformers to local paths for better module resolution.
    • Enabled experimental ES module support in Next.js configuration.
    • Updated package.json with new dependencies: @huggingface/transformers, @xenova/transformers, better-sqlite3, remark-gfm, sharp, sql.js-httpvfs, and sqlite-vss.
    • Implemented a document embedding pipeline using the Xenova/gte-small model for generating embeddings.
    • Stored document content and embeddings in a SQLite database for efficient retrieval.
    • Integrated embedding-based search into the AI functionality, optimizing search relevance through cosine similarity calculations.
    • Enhanced AI response formatting, including improved syntax highlighting for code snippets.
  • **********Impact:
    **
    **
    **
    **
    **
    These changes collectively enhance module handling, project performance, and the accuracy of AI search responses, leading to a more efficient and user-friendly experience.

✨ Generated with love by Kaizen ❤️

Original Description # Comprehensive Update on Next.js Configuration and AI Search Enhancements
  • ************Purpose:
    **
    **
    **
    **
    **
    **
    Consolidate improvements in Next.js configuration and introduce advanced AI search capabilities with embedding and database integration.
  • Key Changes:
    • Enhanced Next.js configuration with path and fileURLToPath utilities for accurate directory resolution.
    • Configured Webpack to alias dependencies and enabled experimental ES module externals.
    • Updated package.json to include essential new dependencies such as @huggingface/transformers and better-sqlite3.
    • Introduced EmbeddingPipeline class for embedding generation using transformer models.
    • Implemented SQLite database for document storage, including table creation and indexing.
    • Updated AI search functionality to leverage embeddings for improved relevance scoring.
    • Introduced a new dbWorker for asynchronous database interactions.
    • Enhanced error handling and loading states in the AI search component.
  • ************Impact:
    **
    **
    **
    **
    **
    **
    These updates collectively enhance the project's build process, dependency management, and significantly improve AI search capabilities through advanced document relevance and efficient storage.

✨ Generated with love by Kaizen ❤️

Original Description # Enhance Next.js Configuration and AI Search Functionality
  • **************Purpose:
    **
    **
    **
    **
    **
    **
    **
    Optimize the Next.js configuration for improved module resolution and ES module support, while also enhancing the AI search feature with a SQLite database and embedding-based document retrieval.
  • Key Changes:
    • Configured Webpack to handle specific dependencies (e.g., sharp, onnxruntime-node) and enable ES module support via esmExternals.
    • Set up aliases for @huggingface/transformers to resolve from the local node_modules directory.
    • Implemented a SQLite database to store document content and pre-computed embeddings.
    • Integrated the SQLite database and embedding generation (using Hugging Face transformers) into the AI search workflow, enabling efficient retrieval and ranking of relevant documents.
  • **************Impact:
    **
    **
    **
    **
    **
    **
    **
    These changes will improve the build performance, reduce the overall bundle size, and enhance the AI search experience by providing more accurate and relevant responses to user queries.

✨ Generated with love by Kaizen ❤️

Original Description ## 🔍 Description

Type

  • 🐛 Bug Fix
  • ✨ Feature
  • 📚 Documentation
  • 🔧 Other: _____

Checklist

  • Tested locally
  • Updated docs (if needed)
  • Added/updated tests (if needed)

@sauravpanda sauravpanda linked an issue Dec 26, 2024 that may be closed by this pull request
@vercel
Copy link

vercel bot commented Dec 26, 2024

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
akira-docs ✅ Ready (Inspect) Visit Preview 💬 Add feedback Dec 26, 2024 8:50am

Copy link
Contributor

@kaizen-bot kaizen-bot bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider implementing the following changes to improve the code.

Comment on lines +13 to +16
const worker = new Worker(
new URL('./embeddings.worker.ts', import.meta.url),
{ type: 'module' }
);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment: Potential performance issue with embedding generation

Solution: Modify the generateEmbedding function to use a singleton pattern for the embedding pipeline instance. This will ensure that the worker is only initialized once and reused for subsequent calls.
!! Make sure the following suggestion is correct before committing it !!

Suggested change
const worker = new Worker(
new URL('./embeddings.worker.ts', import.meta.url),
{ type: 'module' }
);
const embedder = await EmbeddingPipelineSingleton.getInstance(x =>{
self.postMessage({status: 'progress', progress: x});
});

Comment on lines +118 to +122
const allDocs = await worker.db.query(`
SELECT path, content, embedding
FROM documents
WHERE embedding IS NOT NULL
`);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment: Potential SQL injection vulnerability

Solution: Use parameterized queries or a query builder library to safely construct the SQL query and prevent SQL injection attacks.
!! Make sure the following suggestion is correct before committing it !!

Suggested change
const allDocs = await worker.db.query(`
SELECT path, content, embedding
FROM documents
WHERE embedding IS NOT NULL
`);
const allDocs = await worker.db.prepare(`
SELECT path, content, embedding
FROM documents
WHERE embedding IS NOT NULL
`).all();

<li key={index}>
<a
href={source.url}
href={`${window.location.origin}/en/${source.url.replace('*%20', '')}?utm_source=akiradocs`}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment: Potential security vulnerability in the AIResponseSources component

Solution: Use a more secure way to construct the URL for the source links, such as using the new URL() constructor and the process.env.NEXT_PUBLIC_BASE_URL environment variable.
!! Make sure the following suggestion is correct before committing it !!

Suggested change
href={`${window.location.origin}/en/${source.url.replace('*%20', '')}?utm_source=akiradocs`}
<a
href={new URL(`/en/${source.url.replace('*%20', '')}?utm_source=akiradocs`, process.env.NEXT_PUBLIC_BASE_URL).toString()}
target="_blank"
rel="noopener noreferrer"
className="text-sm text-indigo-600 dark:text-indigo-400 hover:underline"
>

Copy link
Contributor

@kaizen-bot kaizen-bot bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider implementing the following changes to improve the code.

Comment on lines +13 to +16
const worker = new Worker(
new URL('./embeddings.worker.ts', import.meta.url),
{ type: 'module' }
);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment: Potential performance issue with embedding extraction

Solution: Modify the generateEmbedding function to use a singleton pattern for the embedding pipeline instance. This will ensure that the same instance is reused across multiple requests, improving overall performance.
!! Make sure the following suggestion is correct before committing it !!

Suggested change
const worker = new Worker(
new URL('./embeddings.worker.ts', import.meta.url),
{ type: 'module' }
);
const embedderInstance = await EmbeddingPipelineSingleton.getInstance();
// Use embedderInstance to generate the embedding

Comment on lines +118 to +122
const allDocs = await worker.db.query(`
SELECT path, content, embedding
FROM documents
WHERE embedding IS NOT NULL
`);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment: Potential SQL injection vulnerability

Solution: Use parameterized queries or a query builder library to safely construct the SQL query and prevent SQL injection attacks.
!! Make sure the following suggestion is correct before committing it !!

Suggested change
const allDocs = await worker.db.query(`
SELECT path, content, embedding
FROM documents
WHERE embedding IS NOT NULL
`);
const allDocs = await worker.db.prepare(`
SELECT path, content, embedding
FROM documents
WHERE embedding IS NOT NULL
`).all();

[&>*:first-child]:mt-0
[&>p>strong]:block [&>p>strong]:mt-8 [&>p>strong]:mb-4 [&>p>strong]:text-lg
[&>p:has(>strong:only-child)]:m-0">
<MemoizedMarkdown content={response} />
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment: Potential XSS vulnerability in the AI response

Solution: Use a sanitization library like DOMPurify to sanitize the AI response before rendering it to the page, to prevent potential XSS attacks.
!! Make sure the following suggestion is correct before committing it !!

Suggested change
<MemoizedMarkdown content={response} />
import DOMPurify from 'dompurify';
<div dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(response)}}/>

Copy link
Contributor

@kaizen-bot kaizen-bot bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider implementing the following changes to improve the code.

Comment on lines +118 to +122
const allDocs = await worker.db.query(`
SELECT path, content, embedding
FROM documents
WHERE embedding IS NOT NULL
`);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment: Potential performance issue with database query

Solution: Consider adding pagination or limiting the number of results returned to improve performance. You could also explore indexing the embedding column to speed up the similarity score calculations.
!! Make sure the following suggestion is correct before committing it !!

Suggested change
const allDocs = await worker.db.query(`
SELECT path, content, embedding
FROM documents
WHERE embedding IS NOT NULL
`);
const allDocs = await worker.db.query(`
SELECT path, content, embedding
FROM documents
WHERE embedding IS NOT NULL
LIMIT 100
`);

Comment on lines +118 to +122
const allDocs = await worker.db.query(`
SELECT path, content, embedding
FROM documents
WHERE embedding IS NOT NULL
`);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment: Potential SQL injection vulnerability

Solution: Use parameterized queries or a query builder library to safely construct the SQL query and prevent SQL injection attacks.
!! Make sure the following suggestion is correct before committing it !!

Suggested change
const allDocs = await worker.db.query(`
SELECT path, content, embedding
FROM documents
WHERE embedding IS NOT NULL
`);
const allDocs = await worker.db.prepare(`
SELECT path, content, embedding
FROM documents
WHERE embedding IS NOT NULL
`).all();

Comment on lines +128 to +138
// Clean the embedding string and parse it
const cleanEmbeddingStr = doc.embedding.replace(/[\[\]]/g, ''); // Remove square brackets
const embeddingArray = cleanEmbeddingStr
.split(',')
.map((val: string) => {
const parsed = parseFloat(val.trim());
if (isNaN(parsed)) {
console.error(`Invalid embedding value found: "${val}"`);
}
return parsed;
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment: Potential performance issue with embedding parsing

Solution: Consider using a more efficient parsing method, such as splitting the string on commas and parsing the values directly, instead of the current approach of replacing brackets and splitting on commas.
!! Make sure the following suggestion is correct before committing it !!

Suggested change
// Clean the embedding string and parse it
const cleanEmbeddingStr = doc.embedding.replace(/[\[\]]/g, ''); // Remove square brackets
const embeddingArray = cleanEmbeddingStr
.split(',')
.map((val: string) => {
const parsed = parseFloat(val.trim());
if (isNaN(parsed)) {
console.error(`Invalid embedding value found: "${val}"`);
}
return parsed;
});
const embeddingArray = doc.embedding.split(',').map(parseFloat);


class EmbeddingPipelineSingleton {
static task: PipelineType = 'feature-extraction';
static model = 'sauravpanda/gte-small-onnx';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment: Potential security issue with hardcoded API key

Solution: Store the API key securely, such as in environment variables or a secure key management service, and load it dynamically at runtime. Avoid hardcoding sensitive information in the codebase.
!! Make sure the following suggestion is correct before committing it !!

Suggested change
static model = 'sauravpanda/gte-small-onnx';
static model = process.env.HUGGING_FACE_MODEL || 'sauravpanda/gte-small-onnx';

Comment on lines +21 to +24
serverMode: "full",
requestChunkSize: 4096,
url: "/context/docs.db"
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment: Potential security issue with hardcoded database path

Solution: Store the database path securely, such as in environment variables or a secure configuration service, and load it dynamically at runtime. Avoid hardcoding sensitive information in the codebase.
!! Make sure the following suggestion is correct before committing it !!

Suggested change
serverMode: "full",
requestChunkSize: 4096,
url: "/context/docs.db"
}
config:{
serverMode: "full",
requestChunkSize: 4096,
url: process.env.DATABASE_PATH || "/context/docs.db"
}

Copy link
Contributor

@kaizen-bot kaizen-bot bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider implementing the following changes to improve the code.

Comment on lines +118 to +121
const allDocs = await worker.db.query(`
SELECT path, content, embedding
FROM documents
WHERE embedding IS NOT NULL
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment: Potential SQL Injection Risk

Solution: Use parameterized queries to prevent SQL injection.
!! Make sure the following suggestion is correct before committing it !!

Suggested change
const allDocs = await worker.db.query(`
SELECT path, content, embedding
FROM documents
WHERE embedding IS NOT NULL
const allDocs = await worker.db.query(`
SELECT path, content, embedding
FROM documents
WHERE embedding IS NOT NULL
`,[]);

Comment on lines +129 to +130
const cleanEmbeddingStr = doc.embedding.replace(/[\[\]]/g, ''); // Remove square brackets
const embeddingArray = cleanEmbeddingStr
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment: Potential performance bottleneck in embedding generation.

Solution: Consider implementing a caching mechanism for embeddings to improve performance on repeated requests.
!! Make sure the following suggestion is correct before committing it !!

Suggested change
const cleanEmbeddingStr = doc.embedding.replace(/[\[\]]/g, ''); // Remove square brackets
const embeddingArray = cleanEmbeddingStr
const embedding = await cache.get(content) || await generateEmbedding(content);

Comment on lines +26 to +28

worker.addEventListener('error', (error) => {
reject(error);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment: Potential exposure of sensitive information in error logs.

Solution: Log only necessary information and avoid logging sensitive data.
!! Make sure the following suggestion is correct before committing it !!

Suggested change
worker.addEventListener('error', (error) => {
reject(error);
console.error('Error generating embedding:', error.message);

}
});

worker.addEventListener('error', (error) => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment: Potential exposure of sensitive data in error messages.

Solution: Sanitize error messages before logging to avoid exposing sensitive data.
!! Make sure the following suggestion is correct before committing it !!

Suggested change
worker.addEventListener('error', (error) => {
console.error('Error generating embedding: An error occurred.');

@kaizen-bot
Copy link
Contributor

kaizen-bot bot commented Dec 26, 2024

🔍 Code Review Summary

Attention Required: This push has potential issues. 🚨

Overview

  • Total Feedbacks: 5 (Critical: 5, Refinements: 0)
  • Files Affected: 3
  • Code Quality: [█████████████████░░░] 85% (Good)

🚨 Critical Issues

security (5 issues)

1. Potential SQL Injection Risk


📁 File: docs/src/lib/aisearch/dbWorker.ts
🔍 Reasoning:
The SQL query in docs/src/lib/aisearch/dbWorker.ts does not sanitize inputs, which could lead to SQL injection vulnerabilities.

💡 Solution:
Use parameterized queries to prevent SQL injection.

Current Code:

const allDocs = await worker.db.query(`SELECT path, content, embedding FROM documents WHERE embedding IS NOT NULL`);

Suggested Code:

const allDocs = await worker.db.query(`SELECT path, content, embedding FROM documents WHERE embedding IS NOT NULL`,[]);

2. Potential SQL Injection Risk


📁 File: docs/src/lib/aisearch/dbWorker.ts
🔍 Reasoning:
The SQL query in docs/src/lib/aisearch/dbWorker.ts does not use parameterized queries, which can lead to SQL injection vulnerabilities if user input is not properly sanitized.

💡 Solution:
Use parameterized queries to prevent SQL injection attacks.

Current Code:

const allDocs = await worker.db.query(`SELECT path, content, embedding FROM documents WHERE embedding IS NOT NULL`);

Suggested Code:

const allDocs = await worker.db.query(`SELECT path, content, embedding FROM documents WHERE embedding IS NOT NULL`,[]);

3. Database Connection Management


📁 File: docs/scripts/extract-docs-context.js
🔍 Reasoning:
The database connection is opened and closed multiple times without pooling, which can lead to performance issues under load.

💡 Solution:
Implement a connection pool for the SQLite database to manage connections more efficiently.

Current Code:

const db = sqlite3(dbPath);

Suggested Code:

    const db = sqlite3(dbPath,{fileMustExist: true}); // Consider using a connection pool.

4. Potential exposure of sensitive information in console logs.


📁 File: packages/akiradocs/scripts/extract-docs-context.js
🔍 Reasoning:
Logging sensitive information, such as error messages or embedding values, can expose the application to security risks, especially in production environments.

💡 Solution:
Remove or sanitize console logs that may expose sensitive information.

Current Code:

console.error('Error generating embedding:', error);

Suggested Code:

    console.error('Error generating embedding');

5. Database connection is not closed in all scenarios.


📁 File: packages/akiradocs/scripts/extract-docs-context.js
🔍 Reasoning:
If an error occurs during the database operations, the connection may not be closed, leading to potential resource leaks.

💡 Solution:
Ensure that the database connection is closed in a finally block to guarantee closure regardless of success or failure.

Current Code:

db.close();

Suggested Code:

    finally{db.close();}

Test Cases

18 file need updates to their tests. Run !unittest to generate create and update tests.


✨ Generated with love by Kaizen ❤️

Useful Commands
  • Feedback: Share feedback on kaizens performance with !feedback [your message]
  • Ask PR: Reply with !ask-pr [your question]
  • Review: Reply with !review
  • Update Tests: Reply with !unittest to create a PR with test changes

@sauravpanda sauravpanda merged commit 5278e0c into main Dec 26, 2024
8 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

add web rag system

2 participants