This commit is contained in:
Daniel
2026-03-31 10:52:49 +08:00
parent c7788fdd92
commit c6fabe262c
4 changed files with 42 additions and 14 deletions

View File

@@ -1,3 +1,5 @@
from __future__ import annotations
from sqlalchemy import select from sqlalchemy import select
from sqlalchemy.orm import Session, selectinload from sqlalchemy.orm import Session, selectinload

View File

@@ -1,3 +1,5 @@
from __future__ import annotations
from sqlalchemy import select from sqlalchemy import select
from sqlalchemy.orm import Session, selectinload from sqlalchemy.orm import Session, selectinload

View File

@@ -2,6 +2,7 @@ from __future__ import annotations
import json import json
import math import math
import uuid
from collections import defaultdict from collections import defaultdict
from qdrant_client import QdrantClient, models from qdrant_client import QdrantClient, models
@@ -46,7 +47,7 @@ class LightRAGAdapter:
collection_name=self.settings.qdrant_collection, collection_name=self.settings.qdrant_collection,
points=[ points=[
models.PointStruct( models.PointStruct(
id=job.job_id, id=self._point_id(job.job_id),
vector=self._vectorize(payload["document"]), vector=self._vectorize(payload["document"]),
payload=payload, payload=payload,
) )
@@ -69,7 +70,7 @@ class LightRAGAdapter:
collection_name=self.settings.qdrant_collection, collection_name=self.settings.qdrant_collection,
points=[ points=[
models.PointStruct( models.PointStruct(
id=worker.worker_id, id=self._point_id(worker.worker_id),
vector=self._vectorize(payload["document"]), vector=self._vectorize(payload["document"]),
payload=payload, payload=payload,
) )
@@ -141,3 +142,7 @@ class LightRAGAdapter:
if chunk: if chunk:
tokens.append(chunk) tokens.append(chunk)
return tokens return tokens
def _point_id(self, entity_id: str) -> str:
# Qdrant v1.14 accepts point IDs as UUID or unsigned int.
return str(uuid.uuid5(uuid.NAMESPACE_URL, entity_id))

View File

@@ -1,5 +1,9 @@
const API_BASE = import.meta.env.VITE_API_BASE ?? "/api"; const API_BASE = import.meta.env.VITE_API_BASE ?? "/api";
type ExtractResponse<T> = { data: T };
type MatchResponse<T> = { items: T[] };
type ListResponse<T> = { items: T[] };
async function request<T>(path: string, init?: RequestInit): Promise<T> { async function request<T>(path: string, init?: RequestInit): Promise<T> {
const response = await fetch(`${API_BASE}${path}`, { const response = await fetch(`${API_BASE}${path}`, {
headers: { headers: {
@@ -16,18 +20,33 @@ async function request<T>(path: string, init?: RequestInit): Promise<T> {
} }
export const api = { export const api = {
health: () => request("/health"), health: () => request<unknown>("/health"),
extractJob: (text: string) => request("/poc/extract/job", { method: "POST", body: JSON.stringify({ text }) }), extractJob: (text: string) =>
extractWorker: (text: string) => request("/poc/extract/worker", { method: "POST", body: JSON.stringify({ text }) }), request<ExtractResponse<Record<string, unknown>>>("/poc/extract/job", {
ingestJob: (job: unknown) => request("/poc/ingest/job", { method: "POST", body: JSON.stringify({ job }) }), method: "POST",
ingestWorker: (worker: unknown) => request("/poc/ingest/worker", { method: "POST", body: JSON.stringify({ worker }) }), body: JSON.stringify({ text })
bootstrap: () => request("/poc/ingest/bootstrap", { method: "POST" }), }),
extractWorker: (text: string) =>
request<ExtractResponse<Record<string, unknown>>>("/poc/extract/worker", {
method: "POST",
body: JSON.stringify({ text })
}),
ingestJob: (job: unknown) => request<unknown>("/poc/ingest/job", { method: "POST", body: JSON.stringify({ job }) }),
ingestWorker: (worker: unknown) =>
request<unknown>("/poc/ingest/worker", { method: "POST", body: JSON.stringify({ worker }) }),
bootstrap: () => request<unknown>("/poc/ingest/bootstrap", { method: "POST" }),
matchWorkers: (job: unknown, top_n = 10) => matchWorkers: (job: unknown, top_n = 10) =>
request("/poc/match/workers", { method: "POST", body: JSON.stringify({ job, top_n }) }), request<MatchResponse<Record<string, unknown>>>("/poc/match/workers", {
method: "POST",
body: JSON.stringify({ job, top_n })
}),
matchJobs: (worker: unknown, top_n = 10) => matchJobs: (worker: unknown, top_n = 10) =>
request("/poc/match/jobs", { method: "POST", body: JSON.stringify({ worker, top_n }) }), request<MatchResponse<Record<string, unknown>>>("/poc/match/jobs", {
jobs: () => request("/poc/jobs"), method: "POST",
workers: () => request("/poc/workers"), body: JSON.stringify({ worker, top_n })
job: (jobId: string) => request(`/poc/jobs/${jobId}`), }),
worker: (workerId: string) => request(`/poc/workers/${workerId}`) jobs: () => request<ListResponse<Record<string, unknown>>>("/poc/jobs"),
workers: () => request<ListResponse<Record<string, unknown>>>("/poc/workers"),
job: (jobId: string) => request<Record<string, unknown>>(`/poc/jobs/${jobId}`),
worker: (workerId: string) => request<Record<string, unknown>>(`/poc/workers/${workerId}`)
}; };