Restore tracker mapping linking, drop only create
The tracker-mapping worker had been reduced to catalog resolution only, which removed not just the auto-creation of an org ThirdParty but also the auto-linking of an existing one. Only the creation needed to go: it raced the load-then-create check and produced duplicate vendors. Restore the full org ThirdParty resolution (exact common-id link, sibling direct-link, high-confidence heuristic, and the disambiguation agent) and remove only the CreateFromCommon branch and its categorisation gate. When nothing matches, the worker now leaves third_party_id unset rather than creating a vendor; creation happens exclusively through the explicit ImportFromCommon action. Drop the now-dead CreateFromCommon helper and rename match.go to common_match.go. Fix a latent test bug surfaced by actually running the DB-backed suite (skipped in CI without Postgres): the heuristic-match candidate lacked Level 1, so the level-filtered candidate loader excluded it and the old fallback create masked the miss. Signed-off-by: Émile Ré <emile@probo.com>
This commit is contained in:
@@ -22,25 +22,27 @@ import (
|
||||
"go.gearno.de/kit/log"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
"go.probo.inc/probo/pkg/cookiebanner"
|
||||
"go.probo.inc/probo/pkg/thirdparty"
|
||||
)
|
||||
|
||||
// buildTrackerAgents wires the two tracker agents from the probod
|
||||
// buildTrackerAgents wires the three tracker agents from the probod
|
||||
// config, each with its own LLM client and tuning: the tracker-mapping
|
||||
// agent (catalog identification) and the common-pattern enrichment agent
|
||||
// (description research). Both are opt-in: when
|
||||
// `llm.tracker-mapping.provider` is empty it returns zero configs (nil
|
||||
// LLM clients) so callers run without agent fallback.
|
||||
// agent (catalog identification), the common-pattern enrichment agent
|
||||
// (description research), and the third-party disambiguation agent. All
|
||||
// are opt-in: when `llm.tracker-mapping.provider` is empty it returns
|
||||
// zero configs (nil LLM clients) so callers run without agent fallback.
|
||||
//
|
||||
// The enrichment agent falls back to the tracker-mapping config when its
|
||||
// own provider slot is empty, so a deployment that configures only
|
||||
// `tracker-mapping` keeps wiring both agents.
|
||||
// The enrichment and disambiguation agents fall back to the
|
||||
// tracker-mapping config when their own provider slot is empty, so a
|
||||
// deployment that configures only `tracker-mapping` keeps wiring all
|
||||
// three agents.
|
||||
func (impl *Implm) buildTrackerAgents(
|
||||
l *log.Logger,
|
||||
tp trace.TracerProvider,
|
||||
r prometheus.Registerer,
|
||||
) (cookiebanner.TrackerMappingAgentConfig, cookiebanner.TrackerEnrichmentAgentConfig, error) {
|
||||
) (cookiebanner.TrackerMappingAgentConfig, cookiebanner.TrackerEnrichmentAgentConfig, thirdparty.DisambiguationAgentConfig, error) {
|
||||
if impl.cfg.Agents.TrackerMapping.Provider == "" {
|
||||
return cookiebanner.TrackerMappingAgentConfig{}, cookiebanner.TrackerEnrichmentAgentConfig{}, nil
|
||||
return cookiebanner.TrackerMappingAgentConfig{}, cookiebanner.TrackerEnrichmentAgentConfig{}, thirdparty.DisambiguationAgentConfig{}, nil
|
||||
}
|
||||
|
||||
firecrawlAPIKey := impl.cfg.Agents.Tools.FirecrawlAPIKey
|
||||
@@ -53,7 +55,7 @@ func (impl *Implm) buildTrackerAgents(
|
||||
r,
|
||||
)
|
||||
if err != nil {
|
||||
return cookiebanner.TrackerMappingAgentConfig{}, cookiebanner.TrackerEnrichmentAgentConfig{}, fmt.Errorf("cannot resolve tracker mapping agent client: %w", err)
|
||||
return cookiebanner.TrackerMappingAgentConfig{}, cookiebanner.TrackerEnrichmentAgentConfig{}, thirdparty.DisambiguationAgentConfig{}, fmt.Errorf("cannot resolve tracker mapping agent client: %w", err)
|
||||
}
|
||||
|
||||
mappingCfg := cookiebanner.TrackerMappingAgentConfig{
|
||||
@@ -79,7 +81,7 @@ func (impl *Implm) buildTrackerAgents(
|
||||
r,
|
||||
)
|
||||
if err != nil {
|
||||
return cookiebanner.TrackerMappingAgentConfig{}, cookiebanner.TrackerEnrichmentAgentConfig{}, fmt.Errorf("cannot resolve tracker enrichment agent client: %w", err)
|
||||
return cookiebanner.TrackerMappingAgentConfig{}, cookiebanner.TrackerEnrichmentAgentConfig{}, thirdparty.DisambiguationAgentConfig{}, fmt.Errorf("cannot resolve tracker enrichment agent client: %w", err)
|
||||
}
|
||||
|
||||
enrichmentCfg := cookiebanner.TrackerEnrichmentAgentConfig{
|
||||
@@ -92,5 +94,29 @@ func (impl *Implm) buildTrackerAgents(
|
||||
MaxTurns: impl.cfg.CommonPatternEnrichmentWorker.AgentMaxTurns,
|
||||
}
|
||||
|
||||
return mappingCfg, enrichmentCfg, nil
|
||||
disambiguationSlot := impl.cfg.Agents.ThirdPartyDisambiguation
|
||||
if disambiguationSlot.Provider == "" {
|
||||
disambiguationSlot = impl.cfg.Agents.TrackerMapping
|
||||
}
|
||||
|
||||
disambiguationAgentCfg, disambiguationClient, err := impl.resolveAgentClient(
|
||||
"third-party-disambiguation",
|
||||
disambiguationSlot,
|
||||
l,
|
||||
tp,
|
||||
r,
|
||||
)
|
||||
if err != nil {
|
||||
return cookiebanner.TrackerMappingAgentConfig{}, cookiebanner.TrackerEnrichmentAgentConfig{}, thirdparty.DisambiguationAgentConfig{}, fmt.Errorf("cannot resolve third party disambiguation agent client: %w", err)
|
||||
}
|
||||
|
||||
disambiguationCfg := thirdparty.DisambiguationAgentConfig{
|
||||
LLMClient: disambiguationClient,
|
||||
Model: disambiguationAgentCfg.ModelName,
|
||||
MaxTokens: disambiguationAgentCfg.MaxTokens,
|
||||
Temperature: disambiguationAgentCfg.Temperature,
|
||||
Timeout: time.Duration(impl.cfg.TrackerMappingWorker.DisambiguationAgentTimeout) * time.Second,
|
||||
}
|
||||
|
||||
return mappingCfg, enrichmentCfg, disambiguationCfg, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user