Source code for pydantic_ai_toolsets.toolsets._shared.linking

"""Cross-toolset linking infrastructure for creating references between toolset outputs."""

from __future__ import annotations

import time
from dataclasses import dataclass, field
from typing import Any

from ..meta_orchestrator.types import CrossToolsetLink, LinkType


[docs] @dataclass class LinkManager: """Manages cross-toolset links between outputs from different toolsets. This class provides a centralized way to create, track, and resolve links between items across different toolsets. Links can represent relationships like "refines", "explores", "synthesizes", or "references". Attributes: _links: Dictionary mapping link IDs to CrossToolsetLink objects _links_by_source: Dictionary mapping (toolset_id, item_id) to list of link IDs _links_by_target: Dictionary mapping (toolset_id, item_id) to list of link IDs Example: ```python from pydantic_ai_toolsets.toolsets._shared.linking import LinkManager link_manager = LinkManager() # Create a link link_id = link_manager.create_link( source_toolset="search", source_id="result_123", target_toolset="self_ask", target_id="question_456", link_type=LinkType.REFERENCES ) # Get all links for an item links = link_manager.get_links("search", "result_123") # Resolve a link link = link_manager.resolve_link(link_id) ``` """ _links: dict[str, CrossToolsetLink] = field(default_factory=dict) _links_by_source: dict[tuple[str, str], list[str]] = field(default_factory=dict) _links_by_target: dict[tuple[str, str], list[str]] = field(default_factory=dict)
[docs] def clear(self) -> None: """Clear all links.""" self._links.clear() self._links_by_source.clear() self._links_by_target.clear()
[docs] def get_statistics(self) -> dict[str, Any]: """Get statistics about links. Returns: Dictionary with link counts by type and total counts """ stats: dict[str, Any] = { "total_links": len(self._links), "links_by_type": {}, } for link in self._links.values(): link_type_str = link.link_type.value stats["links_by_type"][link_type_str] = stats["links_by_type"].get(link_type_str, 0) + 1 return stats