Add per-section TG classifications
This commit is contained in:
@@ -44,6 +44,7 @@ type config struct {
|
||||
|
||||
type pendingMessage struct {
|
||||
ID int64
|
||||
SectionID int64
|
||||
Text string
|
||||
Vertical string
|
||||
SectionSlug string
|
||||
@@ -142,7 +143,7 @@ func (c *classifier) runOnce(ctx context.Context) (int, error) {
|
||||
}
|
||||
}
|
||||
|
||||
if err := c.saveVerdict(ctx, msg.ID, key, verdict); err != nil {
|
||||
if err := c.saveVerdict(ctx, msg, key, verdict); err != nil {
|
||||
slog.Warn("save_verdict_failed", "message_id", msg.ID, "error", err)
|
||||
continue
|
||||
}
|
||||
@@ -155,20 +156,19 @@ func (c *classifier) loadPending(ctx context.Context) ([]pendingMessage, error)
|
||||
rows, err := c.db.Query(ctx, `
|
||||
SELECT
|
||||
m.id,
|
||||
s.id,
|
||||
m.text,
|
||||
c.vertical,
|
||||
s.slug,
|
||||
COALESCE(s.department_id, ''),
|
||||
COALESCE(m.extracted, '{}'::jsonb)::text
|
||||
COALESCE(mc.verdict, '{}'::jsonb)::text
|
||||
FROM messages m
|
||||
JOIN channels c ON c.id = m.channel_id
|
||||
JOIN channels src ON src.id = m.channel_id
|
||||
JOIN channels c ON c.id = src.id OR c.source_channel_id = src.id
|
||||
JOIN sections s ON s.id = c.section_id
|
||||
LEFT JOIN message_classifications mc ON mc.message_id = m.id AND mc.section_id = s.id
|
||||
WHERE m.text IS NOT NULL
|
||||
AND (
|
||||
(c.vertical = 'hr' AND (m.extracted IS NULL OR m.extracted->'hr_lead' IS NULL))
|
||||
OR
|
||||
(c.vertical <> 'hr' AND (m.extracted IS NULL OR m.extracted->'lead' IS NULL))
|
||||
)
|
||||
AND mc.id IS NULL
|
||||
ORDER BY m.id DESC
|
||||
LIMIT $1
|
||||
`, c.cfg.ClassifyBatchSize)
|
||||
@@ -181,7 +181,7 @@ func (c *classifier) loadPending(ctx context.Context) ([]pendingMessage, error)
|
||||
for rows.Next() {
|
||||
var msg pendingMessage
|
||||
var extractedText string
|
||||
if err := rows.Scan(&msg.ID, &msg.Text, &msg.Vertical, &msg.SectionSlug, &msg.DepartmentID, &extractedText); err != nil {
|
||||
if err := rows.Scan(&msg.ID, &msg.SectionID, &msg.Text, &msg.Vertical, &msg.SectionSlug, &msg.DepartmentID, &extractedText); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := json.Unmarshal([]byte(extractedText), &msg.Extracted); err != nil {
|
||||
@@ -284,8 +284,19 @@ func (c *classifier) resolvePrompt(ctx context.Context, vertical, departmentID,
|
||||
return defaultPrompt(vertical), nil
|
||||
}
|
||||
|
||||
func (c *classifier) saveVerdict(ctx context.Context, id int64, key string, verdict json.RawMessage) error {
|
||||
func (c *classifier) saveVerdict(ctx context.Context, msg pendingMessage, key string, verdict json.RawMessage) error {
|
||||
_, err := c.db.Exec(ctx, `
|
||||
INSERT INTO message_classifications (message_id, section_id, vertical, verdict, updated_at)
|
||||
VALUES ($1, $2, $3, $4::jsonb, now())
|
||||
ON CONFLICT ON CONSTRAINT uq_message_classification_section DO UPDATE
|
||||
SET vertical = EXCLUDED.vertical,
|
||||
verdict = EXCLUDED.verdict,
|
||||
updated_at = now()
|
||||
`, msg.ID, msg.SectionID, msg.Vertical, string(verdict))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = c.db.Exec(ctx, `
|
||||
UPDATE messages
|
||||
SET extracted = jsonb_set(
|
||||
CASE WHEN jsonb_typeof(extracted) = 'object' THEN extracted ELSE '{}'::jsonb END,
|
||||
@@ -294,7 +305,7 @@ func (c *classifier) saveVerdict(ctx context.Context, id int64, key string, verd
|
||||
true
|
||||
)
|
||||
WHERE id = $1
|
||||
`, id, key, string(verdict))
|
||||
`, msg.ID, key, string(verdict))
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user