summary
¶
Full name: tenets.models.summary
summary¶
Summary models for file condensation.
This module defines data structures for managing file summaries when content needs to be condensed to fit within token limits.
Classes¶
SummaryStrategy¶
SummarySectiondataclass
¶
SummarySection(name: str, content: str, line_start: int = 0, line_end: int = 0, importance: float = 1.0, preserved_fully: bool = True, tokens: int = 0, metadata: Dict[str, Any] = dict())
A section within a file summary.
Represents a specific section of code that was extracted for inclusion in the summary.
ATTRIBUTE | DESCRIPTION |
---|---|
name | Section name (e.g., "imports", "class_definitions") TYPE: |
content | Section content TYPE: |
line_start | Starting line in original file TYPE: |
line_end | Ending line in original file TYPE: |
importance | Importance score (0-1) TYPE: |
preserved_fully | Whether section was preserved in full TYPE: |
tokens | Token count for this section TYPE: |
metadata | Additional section metadata |
Functions¶
truncate¶
Truncate section to fit within token limit.
Source code in tenets/models/summary.py
def truncate(self, max_tokens: int) -> "SummarySection":
"""Truncate section to fit within token limit."""
if self.tokens <= max_tokens:
return self
# Calculate approximate character limit
char_limit = (max_tokens * 4) - 50 # Leave buffer for ellipsis
if len(self.content) <= char_limit:
return self
# Truncate content
truncated_content = self.content[:char_limit] + "\n... [truncated]"
return SummarySection(
name=self.name,
content=truncated_content,
line_start=self.line_start,
line_end=self.line_start + truncated_content.count("\n"),
importance=self.importance,
preserved_fully=False,
tokens=max_tokens,
metadata={**self.metadata, "truncated": True},
)
to_dict¶
from_dictclassmethod
¶
FileSummarydataclass
¶
FileSummary(content: str = '', was_summarized: bool = True, original_tokens: int = 0, summary_tokens: int = 0, original_lines: int = 0, summary_lines: int = 0, preserved_sections: List[str] = list(), ignored_sections: List[str] = list(), sections: List[SummarySection] = list(), strategy: str = 'extract', compression_ratio: float = 0.0, instructions: List[str] = list(), metadata: Dict[str, Any] = dict(), file_path: Optional[str] = None, path: Optional[str] = None, summary: Optional[str] = None, token_count: int = 0, timestamp: datetime = datetime.now())
Summary of a file's content.
Represents a condensed version of a file when the full content would exceed token limits. Contains sections, metadata, and instructions for AI assistants.
ATTRIBUTE | DESCRIPTION |
---|---|
content | Summarized content TYPE: |
was_summarized | Whether content was summarized TYPE: |
original_tokens | Token count of original TYPE: |
summary_tokens | Token count of summary TYPE: |
original_lines | Line count of original TYPE: |
summary_lines | Line count of summary TYPE: |
preserved_sections | Sections that were preserved |
ignored_sections | Sections that were omitted |
sections | List of summary sections TYPE: |
strategy | Strategy used for summarization TYPE: |
compression_ratio | Ratio of summary to original TYPE: |
instructions | Instructions for AI about summary |
metadata | Additional metadata |
file_path | Original file path |
timestamp | When summary was created TYPE: |
Compatibility | TYPE: |
- | legacy alias for file_path TYPE: |
- | legacy alias for content TYPE: |
- | legacy alias for summary_tokens TYPE: |
Functions¶
add_instruction¶
add_default_instructions¶
Add default instructions based on summary characteristics.
Source code in tenets/models/summary.py
def add_default_instructions(self) -> None:
"""Add default instructions based on summary characteristics."""
if self.file_path:
self.add_instruction(
f"This is a summary of {self.file_path} "
f"({self.original_lines} lines → {self.summary_lines} lines)"
)
if self.compression_ratio < 0.5 and self.original_tokens > 0:
self.add_instruction(
f"Significant compression applied ({self.compression_ratio:.1%} of original). "
f"Request full file if more detail needed."
)
if self.ignored_sections:
self.add_instruction(
f"Omitted sections: {', '.join(self.ignored_sections)}. "
f"Request specific sections if needed."
)
add_metadata¶
add_section¶
Add a section to the summary.
Source code in tenets/models/summary.py
def add_section(self, section: SummarySection) -> None:
"""Add a section to the summary."""
self.sections.append(section)
self.summary_tokens += section.tokens
self.token_count = self.summary_tokens
if section.preserved_fully:
self.preserved_sections.append(section.name)
else:
if section.name not in self.ignored_sections:
self.ignored_sections.append(section.name)
get_section¶
merge_sections¶
Merge all sections into final content.
Source code in tenets/models/summary.py
def merge_sections(self) -> str:
"""Merge all sections into final content."""
if not self.sections:
return self.content
merged = []
for section in self.sections:
if section.name:
merged.append(f"# {section.name}")
merged.append(section.content)
merged.append("") # Empty line between sections
self.content = "\n".join(merged)
return self.content
to_dict¶
Convert to dictionary representation.
Source code in tenets/models/summary.py
def to_dict(self) -> Dict[str, Any]:
"""Convert to dictionary representation."""
return {
"content": self.content,
"was_summarized": self.was_summarized,
"original_tokens": self.original_tokens,
"summary_tokens": self.summary_tokens,
"original_lines": self.original_lines,
"summary_lines": self.summary_lines,
"preserved_sections": self.preserved_sections,
"ignored_sections": self.ignored_sections,
"sections": [s.to_dict() for s in self.sections],
"strategy": self.strategy,
"compression_ratio": self.compression_ratio,
"instructions": self.instructions,
"metadata": self.metadata,
"file_path": self.file_path,
"timestamp": self.timestamp.isoformat(),
}
from_dictclassmethod
¶
Create from dictionary.
Source code in tenets/models/summary.py
@classmethod
def from_dict(cls, data: Dict[str, Any]) -> "FileSummary":
"""Create from dictionary."""
if "timestamp" in data and isinstance(data["timestamp"], str):
data["timestamp"] = datetime.fromisoformat(data["timestamp"])
if "sections" in data:
data["sections"] = [
SummarySection.from_dict(s) if isinstance(s, dict) else s for s in data["sections"]
]
return cls(**data)
ProjectSummarydataclass
¶
ProjectSummary(name: str, description: str = '', structure: Dict[str, Any] = dict(), key_files: List[str] = list(), key_directories: List[str] = list(), technologies: List[str] = list(), frameworks: List[str] = list(), patterns: List[str] = list(), dependencies: List[str] = list(), statistics: Dict[str, Any] = dict(), recent_activity: Dict[str, Any] = dict(), team_info: Dict[str, Any] = dict(), metadata: Dict[str, Any] = dict(), timestamp: datetime = datetime.now())
Summary of an entire project.
High-level summary for initial context or overview, providing a bird's eye view of the project structure and characteristics.
ATTRIBUTE | DESCRIPTION |
---|---|
name | Project name TYPE: |
description | Project description TYPE: |
structure | Project structure overview |
key_files | Most important files |
key_directories | Important directories |
technologies | Technologies used |
frameworks | Frameworks detected |
patterns | Architectural patterns detected |
dependencies | Key dependencies |
statistics | Project statistics |
recent_activity | Recent development activity |
team_info | Team/contributor information |
metadata | Additional metadata |
timestamp | When summary was created TYPE: |
Functions¶
add_technology¶
add_framework¶
add_pattern¶
update_statistics¶
to_markdown¶
Generate markdown representation of project summary.
Source code in tenets/models/summary.py
def to_markdown(self) -> str:
"""Generate markdown representation of project summary."""
lines = [f"# Project: {self.name}", ""]
if self.description:
lines.extend([self.description, ""])
# Technologies and frameworks
if self.technologies or self.frameworks:
lines.append("## Technologies & Frameworks")
if self.technologies:
lines.append(f"**Technologies:** {', '.join(self.technologies)}")
if self.frameworks:
lines.append(f"**Frameworks:** {', '.join(self.frameworks)}")
lines.append("")
# Key structure
if self.key_directories:
lines.append("## Key Directories")
for dir in self.key_directories[:10]: # Top 10
lines.append(f"- `{dir}`")
lines.append("")
if self.key_files:
lines.append("## Key Files")
for file in self.key_files[:10]: # Top 10
lines.append(f"- `{file}`")
lines.append("")
# Statistics
if self.statistics:
lines.append("## Statistics")
for key, value in self.statistics.items():
if isinstance(value, dict):
lines.append(f"**{key}:**")
for k, v in value.items():
lines.append(f" - {k}: {v}")
else:
lines.append(f"- **{key}:** {value}")
lines.append("")
# Patterns
if self.patterns:
lines.append("## Architectural Patterns")
for pattern in self.patterns:
lines.append(f"- {pattern}")
lines.append("")
return "\n".join(lines)
to_dict¶
Convert to dictionary representation.
Source code in tenets/models/summary.py
def to_dict(self) -> Dict[str, Any]:
"""Convert to dictionary representation."""
return {
"name": self.name,
"description": self.description,
"structure": self.structure,
"key_files": self.key_files,
"key_directories": self.key_directories,
"technologies": self.technologies,
"frameworks": self.frameworks,
"patterns": self.patterns,
"dependencies": self.dependencies,
"statistics": self.statistics,
"recent_activity": self.recent_activity,
"team_info": self.team_info,
"metadata": self.metadata,
"timestamp": self.timestamp.isoformat(),
}
from_dictclassmethod
¶
Create from dictionary.