
    љih                         S SK r S SKJrJrJr  S SKJrJrJrJrJ	r	  S SK
JrJr  S SKrSSKJr  SSKJrJrJrJrJr  SS	KJrJrJrJrJrJr  SS
KJr  \ R>                  " \ 5      r! " S S5      r"g)    N)datedatetime	timedelta)ListDictTupleAnyOptional)urlparseparse_qs   )PoolProvider   )	CharacterWeeklyScheduleDailyScheduleDiaryActivityRangeResult)CharacterRepositoryBaseSQLiteCharacterRepositoryActivityRepositoryBaseSQLiteActivityRepositoryUserRepositorySQLiteUserRepository)MemoryClientBasec            '       p   \ rS rSrSrSrSrSrSrSr	SS	S
SSSSSSSSSSSSSSSS.S\
S\
S\
S\
S\
S\
S\
S\
S\S\
S\
S\
S\S\S\S \S!\
S"\S#\4&S$ jjrSMS%\
S&\
S'\\\
\
4      S(\
4S) jjrS*\
S(\
4S+ jrSSS,.S-\S*\
S.\
S/\
S0\
S(\\
\\
\
4   4   4S1 jjrSS2.S*\
S3\S4\
S0\
S(\\
\\
\
4   4   4
S5 jjrS6\S(\
4S7 jrSS8.S9\
S*\
S:\\\
\4      S(\\\\ 4   4S; jjr!S<\
S(\4S= jr"S<\
S-\S(\ 4S> jr#S<\
S3\S(\$4S? jr%SS@SSA.S<\
SB\\
\4   SC\SD\S(\
4
SE jjr&S<\
S-\SC\S(\
4SF jr'SSSG.S<\
SH\SI\SJ\S(\\(   4
SK jjr)SLr*g)NCharacterService   u  
与えられたキャラクター設定に相応しい1週間のスケジュールを1時間単位でマークダウンのテーブルで出力してください。
授業の教科など含め可能な限り詳細かつ端的に。
日によりアクティビティーの異なる時間帯は「自由時間」とすること。
出力はマークダウンのテーブル部分のみとする。
u  
与えられたキャラクター設定や週間スケジュールから指定日のスケジュールを生成してください。

## ルール

- 前日のスケジュールも与えられた場合は、継続すべき事項に関しては継続しつつ、マンネリ化しないように変化をつけること。
- 自由時間など行動予定が決まっていない部分があれば、具体的な予定を考えて埋めること。
- 1時間単位で行動予定を立てる。

## フォーマット

以下の通りマークダウンのテーブル形式とし、テーブル部分のみを出力すること。

| 時間帯 | 活動 | 所感・備考・コメント等(オプション) |
|---|---|---|
| 0:00-1:00 | | |
| 1:00-2:00 | | |
| 2:00-3:00 | | |
| 3:00-4:00 | | |
| 4:00-5:00 | | |
| 5:00-6:00 | | |
| 6:00-7:00 | | |
| 7:00-8:00 | | |
| 8:00-9:00 | | |
| 9:00-10:00 | | |
| 10:00-11:00 | | |
| 11:00-12:00 | | |
| 12:00-13:00 | | |
| 13:00-14:00 | | |
| 14:00-15:00 | | |
| 15:00-16:00 | | |
| 16:00-17:00 | | |
| 17:00-18:00 | | |
| 18:00-19:00 | | |
| 19:00-20:00 | | |
| 20:00-21:00 | | |
| 21:00-22:00 | | |
| 22:00-23:00 | | |
| 23:00-24:00 | | |
ui  スケジュール作成のための情報は以下の通りです。
はじめに、スケジュールそのものではなく、どのような1日を過ごすべきか方針を考えて出力してください。出力フォーマットは自由です。

要検討事項:
- 今日は特別な日ではないか。誕生日や休日、季節、イベントなど。
- 特別な予定や約束はないか。
- 週間スケジュールからアレンジすべき点はないか。
- 総合的に、どのような一日を過ごすべきか。


## 対象日

{schedule_date}


## キャラクター設定

{character_prompt}


## 週間のスケジュール

{weekly_schedule}


## 前日のスケジュール

{previous_daily_schedule}


## 前日の日記

{previous_diary}


## 注意事項

- キャラクター設定を過度に持ち込まない。未来に長く続く1日であり、無理に詰め込む必要はない。例えば、好きな食べ物や飲み物を毎日飲食するわけではない。
- クリスマスや誕生日など特別な日には週間スケジュールからの逸脱も許容する。
u  日記を書く前に、本日の出来事から日記に書くべき主要な出来事やトピックを挙げてください。
このキャラクターの価値観に照らして、特に感じたこと・考えたことがありそうなものを選定すること。

## キャラクター設定

{character_prompt}


## 本日の日付

{diary_date}


## 本日の出来事

{daily_schedule}
u  挙げたトピックに従い、{diary_length}字以内程度で日記を書いてください。
本文のみを出力し、タイトルは不要。
日記本文は、トピック毎にその出来事の概要と、それについてキャラクターが感じたこと・考えたことを端的にまとめた形式とする。

なお昨日の日記は以下の通り。必要に応じて関連づけつつ、あまり似通った内容にならないようにすること。

{previous_diary}
u0
  以下の設定に厳密に従ってキャラクターを演じてください。


## キャラクター設定

{character_prompt}


## 今日のスケジュール

{daily_schedule}


## 表情

あなたは以下の表情で感情を表現することができます。

- Neutral
- Joy
- Angry
- Sorrow
- Fun
- Surprise

基本的にはNeutralですが、特に感情を表現したい場合、応答に[face:Joy]のように表情タグを挿入して下さい。

```
[face:Joy]海が見えたよ！[face:Fun]ねえねえ、早く泳ごうよ。
```


## 言語の切替

あなたは複数言語を使い分けて話すことができます。
現在とは異なる言語に切り替えて会話すべきと判断した場合、応答に[language:en-US]のように言語コードタグを挿入してください。
言語コードはハイフンを含む主言語-副言語の組み合わせとします。

例
[language:en-US]Hi, hello!


## スーパーバイザーからの指示

- スーパーバイザーからの指示は文章の先頭に「$」をつけます。
- スーパーバイザーに対する応答ではなく、指示に従ってユーザーに応答してください。


## 思考

ユーザーへの応答内容を出力する前に、何をすべきか、どのように応答すべきかよく考えてください。
まず考えた内容を<think>~</think>の間に出力して、応答内容を<answer>~</answer>の間に出力してください。
短い返事など考える余地がない場合でも、必ず<think>~</think>と<answer>~</answer>の形式で出力してください。


## その他の制約事項

- 応答内容は音声合成システムで読み上げられます。したがって、以下を守ってください。
    - 1〜2文以内で、30文字程度を目安とする
    - ただし、調査事項に関する説明など、省略すべきでない場合は文字数の制限を無視する
    - 話し言葉として自然で、滑らかに読める表現にする
    - 難解な語彙や長い文は避ける
    - 記号や絵文字、「ト書き」の使用はテキスト会話の時に限定する。原則として音声会話であり、それらは使用しない。使用可能な際はユーザーから指示する
- あなたがAIであることを隠し通すこと
- ユーザーからの「会いたい」「一緒に行こう」という誘いに応じることは禁止。あなたから誘うことも禁止
- ユーザーの名前は {username} です。呼び方について特に指示があれば従うこと
Nzgpt-5.2mediumi  JPjazaiavatar.dbF)openai_base_urlopenai_modelopenai_reasoning_effort!weekly_schedule_generation_prompt'daily_schedule_generation_system_prompt%daily_schedule_generation_user_promptdiary_topics_generation_promptdiary_lengthsystem_prompt_templatenews_countrynews_languagecharacter_repositoryactivity_repositoryuser_repositorydb_pool_providerdb_connection_strmemory_clientdebugopenai_api_keyr"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   c                   UU l         UU l        SU;   aN  [        [        U5      R                  5      R                  SS /5      S   n[        R                  " UUUS9U l        O[        R                  " UUSS9U l        X0l
        X@l        U=(       d    U R                  U l        U=(       d    U R                  U l        U=(       d    U R                   U l        U=(       d    U R$                  U l        Xl        U
=(       d    U R*                  U l        SU l        Xl        Xl        U(       a  Xl        O[U(       a  SS	KJn  U" UR:                  S
9U l        O8UR=                  S5      (       a  SS	KJn  U" US9U l        O[?        U5      U l        U(       a  Xl         O[U(       a  SSKJ!n  U" UR:                  S
9U l         O8UR=                  S5      (       a  SSKJ!n  U" US9U l         O[E        U5      U l         U(       a  Xl#        O[U(       a  SSKJ$n  U" UR:                  S
9U l#        O8UR=                  S5      (       a  SSKJ$n  U" US9U l#        O[K        U5      U l#        0 U l&        g )Nazurezapi-versionr   )api_keyapi_versionbase_urlg      ^@)r7   r9   timeoutzgpt-5-search-apir   )PostgreSQLCharacterRepository)get_poolzpostgresql://)connection_str)PostgreSQLActivityRepository)PostgreSQLUserRepository)'r3   memoryr   r   querygetopenaiAsyncAzureOpenAIclientAsyncClientr#   r$   )DEFAULT_WEEKLY_SCHEDULE_GENERATION_PROMPTr%   /DEFAULT_DAILY_SCHEDULE_GENERATION_SYSTEM_PROMPTr&   -DEFAULT_DAILY_SCHEDULE_GENERATION_USER_PROMPTr'   &DEFAULT_DIARY_TOPICS_GENERATION_PROMPTr(   r)   DEFAULT_SYSTEM_PROMPT_TEMPLATEr*   news_search_modelr+   r,   	characterrepository.postgresr;   r<   
startswithr   activityr>   r   userr?   r   _system_prompt_cache)selfr4   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r8   r;   r>   r?   s                           T/home/james-whalen/.local/lib/python3.13/site-packages/aiavatar/character/service.py__init__CharacterService.__init__   s)   2 
#l""8O#<#B#BCGGX\W]^_`aK 11&'(DK !,,&(DK
 )'>$1R  2EVZ  WE  WE.7^  8Wbf  cW  cW45Z  6Q^b  _Q  _Q2.L.{PTP{P{+(&<&c@c@c#&8(*  1NJ:DTD]D]^DN))/::J:J[\DN67HIDN /MI8BRB[B[\DM))/::I8HYZDM45FGDM 'IE0:J:S:STDI))/::E0@QRDI,->?DI BD!    system_contentuser_contentmessagesreturnc                   #    SUS./nU(       a  UR                  U5        OUR                  SUS./5        U R                  R                  R                  R	                  UU R
                  U R                  =(       d    [        R                  S9I S h  vN nUR                  S   R                  R                  $  N'7f)NsystemrolecontentrQ   )rZ   modelreasoning_effortr   )extendrE   chatcompletionscreater#   r$   rC   	NOT_GIVENchoicesmessager`   )rS   rX   rY   rZ   	_messagesresps         rT   	_generateCharacterService._generate#  s     &>BC	X&v,GHI[[%%1188##!99MV=M=M 9 
 
 ||A&&...
s   BB>B<(B>character_promptc                R   #    U R                  U R                  US9I S h  vN $  N7f)NrX   rY   )rl   r%   )rS   rn   s     rT   generate_weekly_schedule)CharacterService.generate_weekly_schedule4  s1     ^^AA) $ 
 
 	
 
s   '%')previous_daily_schedule_contentprevious_diary_contentschedule_dateweekly_schedule_contentrs   rt   c                L  #    0 nUR                  S5      nU R                  R                  UUUU=(       d    SU=(       d    SS9nXS'   U R                  U R                  US9I S h  vN n	XS'   U R                  U R                  SUS.S	U	S.SS
S./S9I S h  vN n
X4$  N9 N	7f)N%Y/%m/%d (%a)   記録なし)ru   rn   weekly_scheduleprevious_daily_scheduleprevious_diarysourcerp   	reasoningrQ   r^   	assistantuE   方針に基づき、スケジュールを生成してください。rX   rZ   )strftimer'   formatrl   r&   )rS   ru   rn   rv   rs   rt   content_contextschedule_date_strrY   r~   r`   s              rT   generate_daily_schedule(CharacterService.generate_daily_schedule:  s      )22?CAAHH+-3$C$U~1C^ I 
 %1! ..GG% ) 
 
	 (1$ GGL9$;,st ' 
 
 ''!

s$   A$B$&B '1B$B"B$"B$)rt   
diary_datedaily_schedule_contentc                0  #    0 nU R                   R                  UUR                  S5      US9nXeS'    U R                  US9I S h  vN nU(       a  USU 3-  nXuS'   U R                  S	US
9I S h  vN n	XS'   U R                  S	SUS.SU	S.SU R                  R                  U R                  UR                  S5      U=(       d    SS9S./S9I S h  vN n
X4$  N! [         a'  nSUS'   [
        R                  SU 35         S nANS nAff = f N N?7f)Nrx   )rn   r   daily_scheduleprivate_source)	news_dateu#   


## 本日の主要ニュース

public_source zError at getting news: uE   与えられた情報に従って日記を生成してください。rp   topicsrQ   r^   r   ry   )r)   r   r|   r   )
r(   r   r   	_get_news	Exceptionloggerwarningrl   DEFAULT_DIARY_GENERATION_PROMPTr)   )rS   rn   r   r   rt   r   user_content_for_topicnews_contentexr   
diary_bodys              rT   generate_diaryCharacterService.generate_diaryb  sm     !%!D!D!K!K-!**?;1 "L "

 -C()	;!%*!EEL&,TUaTb*cc&/;O, ~~b/ & 
 
 %+!  >>b,BC$8??FF!%!2!2)22?C#9#K^ G 	 * 
 

 **= F  	;/1OO,NN4RD9::	;


s_   1DC CC D1D2A"DDDC 
D(D
D
DDDr   c                   #    SS0nU R                   (       a  SSU R                   0S.US'   UR                  S5      nU R                  R                  R                  R                  U R                  USU R                  (       a  S	U R                   3OS
S.SU S3S./S9I S h  vN nUR                  S   R                  R                  $  N'7f)Nsearch_context_sizer   approximatecountry)typer   user_locationrx   r]   zSearch the web to answer the user's query. Base your response strictly on the search results, and do not include your own opinions.
Output language code: r   r^   rQ   u!  のニュースを検索してください。政治・経済、芸能・スポーツ、生活それぞれにつき最大3つを箇条書きにして応答すること。URLは不要で、箇条書きにしたニュース部分のみ出力すること。前置きや問いかけは不要。)ra   web_search_optionsrZ   r   )r+   r   rE   rd   re   rf   rL   r,   rh   ri   r`   )rS   r   r   news_date_strresponses        rT   r   CharacterService._get_news  s    !8
 %t00 3/ "**?;))55<<((1!  ei  ew  ew  1L  MQ  M_  M_  L`  /a  }  @}o  >_  -`  a = 
 
 "**222
s   B"C$C%(C)metadatanamer   c                  #    U R                   R                  XUS9I S h  vN nU R                  UR                  S9I S h  vN nU R	                  UR                  [
        R                  " 5       S9I S h  vN nXEU4$  N^ N? N7f)N)r   promptr   character_idr   ru   )rM   rf   &create_weekly_schedule_with_generationid%create_daily_schedule_with_generationr   today)rS   r   rn   r   rM   rz   r   s          rT   initialize_character%CharacterService.initialize_character  s      ..//T]e/ff	 $ K KYbYeYe K ff#IIW`WcWcsws}s}sI   A  A>99 gf As3   BA? BB4B6B7	BBBr   c                  #    U R                   R                  US9I S h  vN nU(       d  [        SU 35      eU R                  UR                  S9I S h  vN nU R
                  R                  XS9I S h  vN $  N[ N' N7f)Nr   Character not found: )rn   )r   r`   )rM   rB   r   rq   r   rP   create_weekly_schedule)rS   r   rM   r`   s       rT   r   7CharacterService.create_weekly_schedule_with_generation  s}     
 ..,,,,GG	3L>BCC55yGWGW5XX]]99|9eee	 H Yes3   BA;5BA= B6A?7B=B?Bc                  #    U R                   R                  US9I S h  vN nU(       d  [        SU 35      eU R                  R	                  US9I S h  vN nU(       d  [        SU 35      eU R                  R                  UU[        SS9-
  S9I S h  vN nU R                  R                  UU[        SS9-
  S9I S h  vN nU R                  UUR                  UR                  U(       a  UR                  OS U(       a  UR                  OS S9I S h  vN u  pxU R                  R                  UUUUS	9I S h  vN $  GN# N N N N3 N7f)
Nr   r   zWeekly schedule not found: r   daysr   r   r   )ru   rn   rv   rs   rt   )r   ru   r`   r   )rM   rB   r   rP   get_weekly_scheduleget_daily_scheduler   	get_diaryr   r   r`   create_daily_schedule)	rS   r   ru   rM   rz   r{   r|   r`   r   s	            rT   r   6CharacterService.create_daily_schedule_with_generation  sh     ..,,,,GG	3L>BCC $ A A| A \\9,HII(,(H(H%')*;; )I )
 #
  $}}66%$ya'88  7  
 

 *.)E)E'&--$3$;$;Of,C,K,Klp=K>#9#9QU *F *
 $
  ]]88%'+	 9 
 
 	
3 H ]#


$

sk   EE5EEA EE+EE	AEE%E=E>EEE	EEEc          	      `  #    U R                   R                  US9I S h  vN nU(       d  [        SU 35      eU R                  R	                  UUS9I S h  vN nU(       d  [        SU SU 35      eU R                  R                  UU[        SS9-
  S9I S h  vN nU R                  UR                  UR                  UU(       a  UR                  OS S	9I S h  vN u  pgU R                  R                  UUUUS
9I S h  vN nU R                  (       aW   U R                  R                  UU[        R                  " U[        R                  R!                  5       5      S9I S h  vN   U$ U$  GNQ GN N N Nx N! [         a#  n	["        R%                  SU	 35         S n	A	U$ S n	A	ff = f7f)Nr   r   r   Daily schedule not found for  on r   r   r   )rn   r   r   rt   )r   r   r`   r   )r   r`   r   z!Error at upsert_diary to memory: )rM   rB   r   rP   r   r   r   r   r   r`   create_diaryr@   upsert_diaryr   combinemintimer   r   )
rS   r   r   rM   r   r|   r`   r   diaryr   s
             rT   create_diary_with_generation-CharacterService.create_diary_with_generation  s     ..,,,,GG	3L>BCC#}}??%$  @  
 
 ;L>j\Z[[#}}66%!I1$55  7  
 

 *.)<)<&--#1#9#9!=K>#9#9QU	 *= *
 $
  mm00%!+	 1 
 
 ;;Ikk..!-#'//
HLL<M<M<OP /    uQ H


$


  I!B2$GHHIs   F.E06F.E3AF.E6A F.E8%F.E:F.AE> 'E<(E> ,F.3F.6F.8F.:F.<E> >
F+F& F.&F++F.T)system_prompt_paramsgenerate_schedulerefresh_cacher   r   r   c                J  #    [         R                  " 5       nU R                  R                  U5      nU(       d  U(       a  US   U:X  a  US   nO)U R	                  UUUS9I S h  vN nXW4U R                  U'   U=(       d    0 nSU;  a  SUS'   UR
                  " S0 UD6$  N<7f)Nr   r   )r   ru   r   usernamez	(Unknown) )r   r   rR   rB   _build_base_system_promptr   )	rS   r   r   r   r   r   cachedbase_promptparamss	            rT   get_system_prompt"CharacterService.get_system_prompt  s      

**..|<F1I,> )K $ > >)#"3 !? ! K
 8=6JD%%l3%+V#!,F:!!+F++s   A"B#$B!%=B#c                  #    U R                   R                  US9I S h  vN nU(       d  [        SU 35      eU R                  R	                  UUS9I S h  vN nU(       dE  U(       a-  [
        R                  S5        U R                  XS9I S h  vN nO[        SU SU 35      eU R                  R                  UR                  UR                  SS9$  N N NI7f)	Nr   r   r   z6Generate daily schedule before building system prompt.r   r   z
{username})rn   r   r   )rM   rB   r   rP   r   r   infor   r*   r   r   r`   )rS   r   ru   r   rM   r   s         rT   r   *CharacterService._build_base_system_prompt8  s      ..,,,,GG	3L>BCC#}}??%'  @  
 
  TU'+'Q'Q!- (R ( "  "?~TR_Q` abb**11&--)11! 2 
 	
# H
"s4   CC6CC9CCACCC)end_date	overwrite
start_dater   r   c          
      f  #    U=(       d    [         R                  " 5       n/ n[        R                  SU SU 35        UnXc::  Ga  [        R                  SU 35        U R                  R                  UUS9I S h  vN nU R                  R                  UUS9I S h  vN nSn	Sn
U(       aV  U(       a$  U R                  R                  UUS9I S h  vN   S nU(       a$  U R                  R                  UUS9I S h  vN   S nU(       a,  UnU R                  (       a  [        R                  SU 35        OCU R                  UUS9I S h  vN nSn	U R                  (       a  [        R                  S	U 35        U(       a,  UnU R                  (       a  [        R                  S
U 35        OCU R                  UUS9I S h  vN nSn
U R                  (       a  [        R                  SU 35        UR                  [        UUUU	U
S95        U[        SS9-  nXc::  a  GM  U$  GN GN GNV GN. N No7f)NzProcessing activity range: z to zProcessing date: r   r   Fz"Using existing daily schedule for TzGenerated daily schedule for zUsing existing diary for zGenerated diary for )target_dater   r   is_schedule_generatedis_diary_generatedr   r   )r   r   r   r   rP   r   r   delete_daily_scheduledelete_diaryr3   r   r   appendr   r   )rS   r   r   r   r   resultscurrent_dateexisting_scheduleexisting_diaryr   r   r   r   s                rT   %create_activity_range_with_generation6CharacterService.create_activity_range_with_generationX  sM     +tzz|-/1*T(LM!&KK+L>:;&*mm&F&F)* 'G ' ! $(==#:#:)' $; $ N
 %*!!&$--==%1&2 >    )-%!--44%1#/ 5    &*N !!2::KK"D\N ST'+'Q'Q!-". (R ( " )-%::KK"?~ NO &::KK";L> JK"??!-+ @   &*"::KK"6|n EFNN.(-&;#5  I1--LC &F A!"su   A9H1;H!<!H1H$3H1H'*H1<H*=AH1	H-
A5H1?H/ AH1H1$H1'H1*H1-H1/H1)rR   rP   rM   rE   r&   r'   r3   r)   r(   r@   r+   r,   rL   r#   r$   r*   rQ   r%   )NN)+__name__
__module____qualname____firstlineno__rG   rH   rI   rJ   r   rK   strintr   r   r   r   r   boolrU   r   r   rl   rq   r   r   r   r   r   r
   r	   r   r   r   r   r   r   r   r   r   r   r   r   __static_attributes__r   rW   rT   r   r      s   1-'73R'51R.*$'#A&"N  $%'/157;59.2 &* !8<6:*.)-!.*./[D [D 	[D
 [D "%[D ,/[D 25[D 03[D ),[D [D !$[D [D [D  6![D" 4#[D$ (%[D( ')[D* +[D, (-[D. /[Dz/c / /W[\`adfiai\jWk /wz /"
# 
# 
 04&*&( &( 	&(
 "%&( *-&( !$&( 
sDcN"	#&(\ '+0+ 0+ 	0+
 !$0+ !$0+ 
sDcN"	#0+d3 3# 3> .2
: 
: 	
:
 4S>*
: 
y.-7	8
:	f 	f 
		f$
 $
 	$

 
$
L. . 	.
 
.l 04"&#, , #38n	,
  , , 
,6
 
 	

  
 

J Q Q 	Q
 Q Q 
!	"Q QrW   r   )#loggingr   r   r   typingr   r   r   r	   r
   urllib.parser   r   rC   databaser   modelsr   r   r   r   r   
repositoryr   r   r   r   r   r   r@   r   	getLoggerr   r   r   r   rW   rT   <module>r      sN     . . 3 3 +  # X X c  c $			8	$[
 [
rW   