@@ -64,6 +64,18 @@ interface UseWikiGenerationReturn {
6464 isRegenerating : string | null ;
6565}
6666
67+ const CONCURRENCY_BY_PROVIDER : Record < string , number > = {
68+ 'google' : 5 , // Flash 2.5 is fast with high rate limits
69+ 'openai' : 3 , // GPT models have moderate rate limits
70+ 'openrouter' : 2 , // Rate limits vary
71+ 'ollama' : 1 , // Local models are CPU/GPU bound
72+ 'bedrock' : 3 ,
73+ 'azure' : 3 ,
74+ 'dashscope' : 2 ,
75+ } ;
76+
77+ const DEFAULT_CONCURRENCY = 3 ;
78+
6779export function useWikiGeneration ( params : UseWikiGenerationParams ) : UseWikiGenerationReturn {
6880 const {
6981 effectiveRepoInfo,
@@ -96,6 +108,10 @@ export function useWikiGeneration(params: UseWikiGenerationParams): UseWikiGener
96108 const [ structureRequestInProgress , setStructureRequestInProgress ] = useState ( false ) ;
97109 const [ isRegenerating , setIsRegenerating ] = useState < string | null > ( null ) ;
98110
111+ // Ref to track generatedPages without causing callback re-creation
112+ const generatedPagesRef = useRef ( generatedPages ) ;
113+ useEffect ( ( ) => { generatedPagesRef . current = generatedPages ; } , [ generatedPages ] ) ;
114+
99115 // Template configuration loaded from backend
100116 const templateConfigRef = useRef < TemplateConfig | null > ( null ) ;
101117
@@ -125,7 +141,7 @@ export function useWikiGeneration(params: UseWikiGenerationParams): UseWikiGener
125141 const generatePageContent = useCallback ( async ( page : WikiPage , owner : string , repo : string ) => {
126142 return new Promise < void > ( async ( resolve ) => {
127143 try {
128- if ( generatedPages [ page . id ] ?. content ) {
144+ if ( generatedPagesRef . current [ page . id ] ?. content ) {
129145 resolve ( ) ;
130146 return ;
131147 }
@@ -403,7 +419,7 @@ Remember:
403419 setLoadingMessage ( undefined ) ;
404420 }
405421 } ) ;
406- } , [ generatedPages , currentToken , effectiveRepoInfo , selectedProviderState , selectedModelState , isCustomSelectedModelState , customSelectedModelState , modelExcludedDirs , modelExcludedFiles , language , activeContentRequests , generateFileUrl , modelIncludedDirs , modelIncludedFiles , setError , setLoadingMessage ] ) ;
422+ } , [ currentToken , effectiveRepoInfo , selectedProviderState , selectedModelState , isCustomSelectedModelState , customSelectedModelState , modelExcludedDirs , modelExcludedFiles , language , activeContentRequests , generateFileUrl , modelIncludedDirs , modelIncludedFiles , setError , setLoadingMessage ] ) ;
407423
408424 // Determine the wiki structure from repository data
409425 const determineWikiStructure = useCallback ( async ( fileTree : string , readme : string , owner : string , repo : string ) => {
@@ -940,16 +956,16 @@ IMPORTANT:
940956 setGenerationPhase ( 'generating' ) ;
941957 console . log ( `Starting generation for ${ pages . length } pages with controlled concurrency` ) ;
942958
943- const MAX_CONCURRENT = 3 ;
959+ const maxConcurrent = CONCURRENCY_BY_PROVIDER [ selectedProviderState ] || DEFAULT_CONCURRENCY ;
944960 const queue = [ ...pages ] ;
945961 let activeRequests = 0 ;
946962
947963 const processQueue = ( ) => {
948- while ( queue . length > 0 && activeRequests < MAX_CONCURRENT ) {
964+ while ( queue . length > 0 && activeRequests < maxConcurrent ) {
949965 const page = queue . shift ( ) ;
950966 if ( page ) {
951967 activeRequests ++ ;
952- console . log ( `Starting page ${ page . title } (${ activeRequests } active, ${ queue . length } remaining)` ) ;
968+ console . log ( `Starting page ${ page . title } (${ activeRequests } active, ${ queue . length } remaining, concurrency= ${ maxConcurrent } )` ) ;
953969
954970 generatePageContent ( page , owner , repo )
955971 . finally ( ( ) => {
@@ -962,7 +978,7 @@ IMPORTANT:
962978 setIsLoading ( false ) ;
963979 setLoadingMessage ( undefined ) ;
964980 } else {
965- if ( queue . length > 0 && activeRequests < MAX_CONCURRENT ) {
981+ if ( queue . length > 0 && activeRequests < maxConcurrent ) {
966982 processQueue ( ) ;
967983 }
968984 }
0 commit comments