Files
AI_NovelGenerator/__pycache__/novel_generator.cpython-310.pyc
T

111 lines
11 KiB
Plaintext
Raw Normal View History

2025-01-29 20:33:20 +08:00
o
2025-01-30 10:21:38 +08:00
ŠCšgp;ã@ddlZddlZddlmZmZmZzddlmZWney)ddlmZYnwddl m
2025-01-29 20:33:20 +08:00
Z
ddl m Z m
Z
mZddl mZddlmZddlmZdd lmZmZmZmZdd
2025-01-29 20:33:20 +08:00
lmZmZmZmZmZmZm Z m!Z!m"Z"ej#ej$d d d
Z%de&de&dee&defddZ'de&de&deefddZ(de&de&de&ddfddZ)d/de&de&de&de*de&f
ddZ+GdddeƒZ,de&de&d e&d!e&d"e&d#e*d$e*d%e&ddfd&d'„Z-d(e&d)e&de&de&d*e&d+e*d%e&d$e*d,e&de&fd-d.„Z.dS)0éN)ÚDictÚListÚOptional)Ú TypedDict)Ú
ChatOpenAI)Ú
StateGraphÚSTARTÚEND)ÚOpenAIEmbeddings)ÚChroma©ÚDocument)Ú read_fileÚappend_text_to_fileÚclear_file_contentÚsave_string_to_txt) Ú
set_promptÚcharacter_promptÚdark_lines_promptÚfinalize_setting_promptÚnovel_directory_promptÚsummary_promptÚupdate_character_state_promptÚchapter_outline_promptÚchapter_write_promptz'%(asctime)s [%(levelname)s] %(message)s)ÚlevelÚformatÚ vectorstoreÚapi_keyÚbase_urlÚtextsÚreturncCs6t||d}dd|Dƒ}tj||td}| ¡|S)
åˆå§‹åŒ–并返回一个Chromaå‘é‡åº“,将传入的文本进行嵌入并ä¿å­˜åˆ°æœ¬åœ°ç›®å½•。
如果ä¸å­˜åœ¨è¯¥ç›®å½•,会自动创建。
©Zopenai_api_keyZopenai_api_basecSsg|]}t|dqS)©Z page_contentr )Ú.0Úr&ú;c:\Users\xieli\Desktop\AI_NovelGenerator\novel_generator.pyÚ
<listcomp>*sz%init_vector_store.<locals>.<listcomp>)Z embeddingÚpersist_directory)r
r Zfrom_documentsÚVECTOR_STORE_DIRÚpersist)rrr Ú
embeddingsZ documentsrr&r&r'Úinit_vector_store!sþýr-cCs(tj t¡sdSt||d}tt|dS)u;读å–已存在的å‘é‡åº“。若ä¸å­˜åœ¨åˆ™è¿”回 None。Nr")r)Zembedding_function)ÚosÚpathÚexistsr*r
r )rrr,r&r&r'Úload_vector_store4s þ r1Ú new_chaptercCsLt||ƒ}|st d¡t|||gƒdSt|d}| |g¡| ¡dS)uf将最新章节文本æ’入到å‘é‡åº“里,用于åŽç»­æ£€ç´¢å‚考。若库ä¸å­˜åœ¨åˆ™åˆå§‹åŒ–。z6Vector store does not exist. Initializing a new one...Nr#)r1ÚloggingÚinfor-r
Z
add_documentsr+)rrr2ÚstoreZnew_docr&r&r'Úupdate_vector_store?s


  r6éÚqueryÚkcCsBt||ƒ}|st d¡dS|j||d}d dd|Dƒ¡}|S)uˆ
从å‘é‡åº“中检索与 query 最相关的 k æ¡æ–‡æœ¬ï¼Œæ‹¼æŽ¥åŽè¿”回。
2025-01-29 20:33:20 +08:00
è‹¥å‘é‡åº“ä¸å­˜åœ¨åˆ™è¿”回空字符串。
z0Vector store not found. Returning empty context.Ú©r9Ú
cSsg|]}|jqSr&r#)r$Údr&r&r'r(Vsz:get_relevant_context_from_vector_store.<locals>.<listcomp>)r1r3ÚwarningZsimilarity_searchÚjoin)rrr8r9r5ZdocsZcombinedr&r&r'Ú&get_relevant_context_from_vector_storeLs

r@c@sVeZdZUeed<eed<eed<eed<eed<eed<eed<eed<eed <d
S) Ú OverallStateÚtopicÚgenreÚnumber_of_chaptersÚ word_numberÚnovel_setting_baseÚcharacter_settingÚ
dark_linesÚfinal_novel_settingÚnovel_directoryN)Ú__name__Ú
__module__Ú __qualname__ÚstrÚ__annotations__Úintr&r&r&r'rA\s
 rAÚ llm_modelrBrCrDrEÚfilepathctj|ddt|||ddtdtttfffdd }dtdtttfffdd „ } dtdtttfffd
d }
dtdtttfffd d
} dtdtttfffdd } ttƒ}
|
 d|¡|
 d| ¡|
 d|
¡|
 d| ¡|
 d| ¡|
 t d¡|
 dd¡|
 dd¡|
 dd¡|
 dd¡|
 dt
¡|
  ¡}||||dœ}|  |¡}|s¸t
 d¡dS| dd¡}| dd¡}|rÈ|sÏt
 d¡dStj |d¡}tj |d¡}dtdtfdd „}||ƒ}||ƒ}t||ƒt||ƒt
 d!¡dS)"uØ
使用多步æµç¨‹ï¼Œç”Ÿæˆ Novel_setting.txt 与 Novel_directory.txt å¹¶ä¿å­˜åˆ° filepath。
:param api_key: OpenAI API key
:param base_url: OpenAI API base url
:param llm_model: 所使用的 LLM 模型åç§°
:param topic: å°è¯´ä¸»é¢˜
:param genre: å°è¯´ç±»åž‹
:param number_of_chapters: 章节数
:param word_number: å•章目标字数
:param filepath: å­˜æ”¾ç”Ÿæˆæ–‡ä»¶çš„目录路径
Úexist_ok)ÚmodelrrÚstater!csPtj|d|d|d|dd}ˆ |¡}|s!t d¡ddiSd|j ¡iS) NrBrCrDrE©rBrCrDrEz#generate_base_setting: No response.rFr:)rrÚinvoker3r>ÚcontentÚstrip©rVÚpromptÚresponse©rUr&r'Úgenerate_base_setting‡sü

2025-01-30 10:21:38 +08:00
z=Novel_novel_directory_generate.<locals>.generate_base_settingcó>tj|dd}ˆ |¡}|st d¡ddiSd|j ¡iS)NrF)Ú
2025-01-29 20:33:20 +08:00
novel_settingz(generate_character_setting: No response.rGr:)rrrXr3r>rYrZr[r^r&r'Úgenerate_character_setting”óÿ

zBNovel_novel_directory_generate.<locals>.generate_character_settingcr`)NrG)Zcharacter_infoz!generate_dark_lines: No response.rHr:)rrrXr3r>rYrZr[r^r&r'Úgenerate_dark_linesžrcz;Novel_novel_directory_generate.<locals>.generate_dark_linescsJtj|d|d|dd}ˆ |¡}|st d¡ddiSd|j ¡iS)NrFrGrH)rFrGrHz$finalize_novel_setting: No response.rIr:)rrrXr3r>rYrZr[r^r&r'Úfinalize_novel_setting¨sý

2025-01-29 20:33:20 +08:00
z>Novel_novel_directory_generate.<locals>.finalize_novel_settingcsDtj|d|dd}ˆ |¡}|st d¡ddiSd|j ¡iS)NrIrD)rIrDz&generate_novel_directory: No response.rJr:)rrrXr3r>rYrZr[r^r&r'Úgenerate_novel_directory´sþ
2025-01-30 10:21:38 +08:00

z@Novel_novel_directory_generate.<locals>.generate_novel_directoryr_rbrdrerfrWuGNovel_novel_directory_generate: invoke() 结果为空,生æˆå¤±è´¥ã€‚NrIr:rJu@生æˆå¤±è´¥ï¼šç¼ºå°‘ final_novel_setting 或 novel_directory。zNovel_setting.txtzNovel_directory.txtÚtxtcSs| dd¡ dd¡S)#r:Ú*)Úreplace)rgr&r&r'Ú
clean_textész2Novel_novel_directory_generate.<locals>.clean_textz4Novel settings and directory generated successfully.)r.ÚmakedirsrrArrNrZadd_nodeZadd_edgerr ÚcompilerXr3r>Úgetr/r?rr4)rrrQrBrCrDrErRr_rbrdrerfZgraphÚappZ input_paramsÚresultrIZfinal_novel_directoryZ filename_setZfilename_novel_directoryrkZfinal_novel_setting_cleanedZfinal_novel_directory_cleanedr&r^r'ÚNovel_novel_directory_generatehs\ý


            ü

  


rqÚnovel_settingsÚnovel_novel_directoryÚ
model_nameÚ novel_numberÚ lastchapterc tj|ddt|||ddtj |d¡} tj| ddtj | d|d¡}
tj |d¡} tj |d ¡} tj |d
2025-01-30 10:21:38 +08:00
¡}
t| ƒ}t|
ƒ}d td td
tffdd }| ¡r\|||ƒ}n|}d tdtd
tffdd }| ¡ru|||ƒ}n|}t||ddd}dtdtdtdt dtd
2025-01-29 20:33:20 +08:00
tf fdd }||||||ƒ}dtdtdtdtdt dtd
tffdd „ }|||||||ƒ}|rët
||
2025-01-29 20:33:20 +08:00
ƒt | ƒt
|| ƒt | ƒt
|| ƒt |
ƒt
2025-01-29 20:33:20 +08:00
||
ƒt |||ƒt
 d!|d"¡|St
 d!|d#¡|S)$uŽ
多步æµç¨‹:
1) æ›´æ–°/创建全局摘è¦
2) æ›´æ–°/生æˆè§’è‰²çŠ¶æ€æ–‡æ¡£
2025-01-29 20:33:20 +08:00
3) å‘釿£€ç´¢èŽ·å–往期上下文
4) 大纲 -> 正文
5) 写入 chapter_{novel_number}.txt, 更新 last_chapter.txt
6) æ›´æ–°å‘é‡åº“
2025-01-29 20:33:20 +08:00
:param novel_settings: 最终的作å“设定(字符串)