( transcript: TranscriptSegment[], options: GenerateTopicsOptions, provider: ProviderKey )
| 754 | } |
| 755 | |
| 756 | async function generateProviderBackedTopicsFromTranscript( |
| 757 | transcript: TranscriptSegment[], |
| 758 | options: GenerateTopicsOptions, |
| 759 | provider: ProviderKey |
| 760 | ): Promise<ProviderBackedTopicGenerationResult> { |
| 761 | const { |
| 762 | videoInfo, |
| 763 | chunkDurationSeconds = DEFAULT_CHUNK_DURATION_SECONDS, |
| 764 | chunkOverlapSeconds = DEFAULT_CHUNK_OVERLAP_SECONDS, |
| 765 | maxTopics = 5, |
| 766 | theme, |
| 767 | excludeTopicKeys, |
| 768 | mode = 'smart', |
| 769 | fastModel: fastModelOverride, |
| 770 | proModel: proModelOverride, |
| 771 | language |
| 772 | } = options; |
| 773 | |
| 774 | const providerModelDefaults = getProviderModelDefaults(provider); |
| 775 | const fastModel = fastModelOverride ?? providerModelDefaults.fastModel; |
| 776 | const proModel = proModelOverride ?? providerModelDefaults.proModel; |
| 777 | const forceFullTranscript = |
| 778 | getProviderBehavior(provider).forceFullTranscriptTopicGeneration; |
| 779 | const requestedTopics = Math.max(1, Math.min(maxTopics, 5)); |
| 780 | const isSmartMode = mode === 'smart'; |
| 781 | const transcriptWithTimestamps = formatTranscriptWithTimestamps(transcript); |
| 782 | const videoDurationSeconds = |
| 783 | transcript.length > 0 |
| 784 | ? transcript[transcript.length - 1].start + |
| 785 | transcript[transcript.length - 1].duration |
| 786 | : 0; |
| 787 | const isShortVideo = videoDurationSeconds <= 30 * 60; |
| 788 | const smartModeModel = getProviderBackedTopicModel({ |
| 789 | provider, |
| 790 | mode, |
| 791 | transcript, |
| 792 | fastModel, |
| 793 | proModel |
| 794 | }); |
| 795 | |
| 796 | let topicsArray: ParsedTopic[] = []; |
| 797 | let candidateTopics: CandidateTopic[] = []; |
| 798 | const excludedKeys = excludeTopicKeys ?? new Set<string>(); |
| 799 | let resolvedModel = isSmartMode ? smartModeModel : fastModel; |
| 800 | |
| 801 | if (isSmartMode || forceFullTranscript) { |
| 802 | const singlePassModel = isSmartMode ? smartModeModel : fastModel; |
| 803 | resolvedModel = singlePassModel; |
| 804 | |
| 805 | const smartTopics = await runSinglePassTopicGeneration( |
| 806 | transcript, |
| 807 | transcriptWithTimestamps, |
| 808 | singlePassModel, |
| 809 | provider, |
| 810 | theme, |
| 811 | language |
| 812 | ); |
| 813 |
no test coverage detected