open-notebook/api/episode_profiles_service.py
LUIS NOVO ab5560c9a2 refactor: reorganize folder structure for better maintainability
Changes:
- Move migrations/ under open_notebook/database/migrations/
- Extract AI models to open_notebook/ai/ (Model, ModelManager, provision)
- Extract podcasts to open_notebook/podcasts/ (EpisodeProfile, SpeakerProfile, PodcastEpisode)
- Reorganize prompts to mirror graphs structure (chat/, source_chat/)

This improves code organization by:
- Consolidating database concerns (migrations now with database code)
- Separating AI infrastructure from domain entities
- Isolating podcast feature into its own module
- Creating consistent prompt/graph naming conventions

All 52 tests pass.
2026-01-03 14:04:27 -03:00

104 lines
No EOL
4.1 KiB
Python

"""
Episode profiles service layer using API.
"""
from typing import List
from loguru import logger
from api.client import api_client
from open_notebook.podcasts.models import EpisodeProfile
class EpisodeProfilesService:
"""Service layer for episode profiles operations using API."""
def __init__(self):
logger.info("Using API for episode profiles operations")
def get_all_episode_profiles(self) -> List[EpisodeProfile]:
"""Get all episode profiles."""
profiles_data = api_client.get_episode_profiles()
# Convert API response to EpisodeProfile objects
profiles = []
for profile_data in profiles_data:
profile = EpisodeProfile(
name=profile_data["name"],
description=profile_data.get("description", ""),
speaker_config=profile_data["speaker_config"],
outline_provider=profile_data["outline_provider"],
outline_model=profile_data["outline_model"],
transcript_provider=profile_data["transcript_provider"],
transcript_model=profile_data["transcript_model"],
default_briefing=profile_data["default_briefing"],
num_segments=profile_data["num_segments"]
)
profile.id = profile_data["id"]
profiles.append(profile)
return profiles
def get_episode_profile(self, profile_name: str) -> EpisodeProfile:
"""Get a specific episode profile by name."""
profile_response = api_client.get_episode_profile(profile_name)
profile_data = profile_response if isinstance(profile_response, dict) else profile_response[0]
profile = EpisodeProfile(
name=profile_data["name"],
description=profile_data.get("description", ""),
speaker_config=profile_data["speaker_config"],
outline_provider=profile_data["outline_provider"],
outline_model=profile_data["outline_model"],
transcript_provider=profile_data["transcript_provider"],
transcript_model=profile_data["transcript_model"],
default_briefing=profile_data["default_briefing"],
num_segments=profile_data["num_segments"]
)
profile.id = profile_data["id"]
return profile
def create_episode_profile(
self,
name: str,
description: str = "",
speaker_config: str = "",
outline_provider: str = "",
outline_model: str = "",
transcript_provider: str = "",
transcript_model: str = "",
default_briefing: str = "",
num_segments: int = 5,
) -> EpisodeProfile:
"""Create a new episode profile."""
profile_response = api_client.create_episode_profile(
name=name,
description=description,
speaker_config=speaker_config,
outline_provider=outline_provider,
outline_model=outline_model,
transcript_provider=transcript_provider,
transcript_model=transcript_model,
default_briefing=default_briefing,
num_segments=num_segments,
)
profile_data = profile_response if isinstance(profile_response, dict) else profile_response[0]
profile = EpisodeProfile(
name=profile_data["name"],
description=profile_data.get("description", ""),
speaker_config=profile_data["speaker_config"],
outline_provider=profile_data["outline_provider"],
outline_model=profile_data["outline_model"],
transcript_provider=profile_data["transcript_provider"],
transcript_model=profile_data["transcript_model"],
default_briefing=profile_data["default_briefing"],
num_segments=profile_data["num_segments"]
)
profile.id = profile_data["id"]
return profile
def delete_episode_profile(self, profile_id: str) -> bool:
"""Delete an episode profile."""
api_client.delete_episode_profile(profile_id)
return True
# Global service instance
episode_profiles_service = EpisodeProfilesService()