mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-03 12:34:37 +00:00
* feat: add monitor * feat: fix tab * feat: work * feat: not reliable monitor * feat: enhance monitoring page layout with integrated filters and refresh button * feat: add support for runner recording * feat: add jump button & alignment * feat: new * fix: not show query variables in local agent * fix: pnpm lint and python ruff check * fix: ruff fromat * chore: remove unnecessary migration * style: optimize monitoring page layout and fix sticky filter issues - Enhanced metric cards with gradient backgrounds and hover effects - Increased traffic chart height from 200px to 300px - Adjusted grid layout and spacing for better visual appeal - Fixed sticky filter area to properly cover parent padding without transparent gaps - Used negative margins and positioning to eliminate scrolling artifacts - Matched padding/margins with other pages (pipelines, bots) for consistency - Removed duplicate title/subtitle from page content - Added cursor-pointer styling to tab triggers - Removed border between tab list and tab content Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * fix: apply prettier formatting to monitoring components - Fixed indentation and spacing in MetricCard.tsx - Fixed formatting in TrafficChart.tsx - Applied prettier formatting to page.tsx Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat: update HomeSidebar to trigger action on child selection and localize monitoring titles * refactor: streamline LLM and embedding invocation methods * feat: add embedding model monitor * fix: database version * chore: simplify pnpm-lock.yaml formatting --------- Co-authored-by: Junyan Qin <rockchinq@gmail.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
56 lines
2.1 KiB
Python
56 lines
2.1 KiB
Python
from __future__ import annotations
|
|
import uuid
|
|
from typing import List
|
|
from langbot.pkg.rag.knowledge.services.base_service import BaseService
|
|
from langbot.pkg.entity.persistence import rag as persistence_rag
|
|
from langbot.pkg.core import app
|
|
from langbot.pkg.provider.modelmgr.requester import RuntimeEmbeddingModel
|
|
import sqlalchemy
|
|
|
|
|
|
class Embedder(BaseService):
|
|
def __init__(self, ap: app.Application) -> None:
|
|
super().__init__()
|
|
self.ap = ap
|
|
|
|
async def embed_and_store(
|
|
self, kb_id: str, file_id: str, chunks: List[str], embedding_model: RuntimeEmbeddingModel
|
|
) -> list[persistence_rag.Chunk]:
|
|
# save chunk to db
|
|
chunk_entities: list[persistence_rag.Chunk] = []
|
|
chunk_ids: list[str] = []
|
|
|
|
for chunk_text in chunks:
|
|
chunk_uuid = str(uuid.uuid4())
|
|
chunk_ids.append(chunk_uuid)
|
|
chunk_entity = persistence_rag.Chunk(uuid=chunk_uuid, file_id=file_id, text=chunk_text)
|
|
chunk_entities.append(chunk_entity)
|
|
|
|
chunk_dicts = [
|
|
self.ap.persistence_mgr.serialize_model(persistence_rag.Chunk, chunk) for chunk in chunk_entities
|
|
]
|
|
|
|
await self.ap.persistence_mgr.execute_async(sqlalchemy.insert(persistence_rag.Chunk).values(chunk_dicts))
|
|
|
|
# get embeddings (batch size limit: 64 for OpenAI)
|
|
MAX_BATCH_SIZE = 64
|
|
embeddings_list: list[list[float]] = []
|
|
|
|
for i in range(0, len(chunks), MAX_BATCH_SIZE):
|
|
batch = chunks[i : i + MAX_BATCH_SIZE]
|
|
batch_embeddings = await embedding_model.provider.invoke_embedding(
|
|
model=embedding_model,
|
|
input_text=batch,
|
|
extra_args={}, # TODO: add extra args
|
|
knowledge_base_id=kb_id,
|
|
call_type='embedding',
|
|
)
|
|
embeddings_list.extend(batch_embeddings)
|
|
|
|
# save embeddings to vdb
|
|
await self.ap.vector_db_mgr.vector_db.add_embeddings(kb_id, chunk_ids, embeddings_list, chunk_dicts)
|
|
|
|
self.ap.logger.info(f'Successfully saved {len(chunk_entities)} embeddings to Knowledge Base.')
|
|
|
|
return chunk_entities
|