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.