
    1j                        d Z ddlmZ ddlZddlmZmZmZmZm	Z	  ej                  e      ZdZdZe dZddZdd	Z	 	 	 	 	 	 dd
Zddd	 	 	 	 	 	 	 	 	 	 	 ddZddZy)u  프롬프트 조립 순서 — 정적 앞, 가변 뒤 (축 A1).

설계 SOT: 프롬프트 최적화 뼈대 v2 의 "축 A1" — **같은 role 안에서 순서만**
바꾼다. role 이동·문구 수정·조각 삭제는 이 층의 일이 아니다(각각 축 A2·C).

바꾸는 것은 한 가지다. 지금은 호출마다 달라지는 조각(대상 이름·타입)이
user 프롬프트 맨 앞에 있어서, 뒤따르는 동일한 지시문이 접두부 재사용에서
벗어난다. 이 모듈은 그 조각을 뒤로 보내 앞쪽을 [정적 지시 → 프로젝트 단위
가변 → 호출 단위 가변] 순서로 만든다.

**무엇이 정적인지 어휘로 판단하지 않는다.** 템플릿을 두 번 렌더한다 —
한 번은 실제 값으로, 한 번은 표식 값으로. 표식이 들어간 문단만 "호출마다
변하는 문단"이고 나머지는 정적이다. 값의 글자를 찾아보는 방식은 쓸 수 없다
(예: `entity_type="prop"` 은 정적 지시문 안에도 그대로 나온다).

기본값은 무변화다. `prompt_assembly_reorder_steps` 목록에 없는 스텝은
기존 조립 결과와 글자 하나까지 같다.
    )annotationsN)CallableDictListSequenceTuplez

 PROMPT_VAR_c                    ddl m} t        |dd      xs d}| |j                  d      D ch c]#  }|j	                         s|j	                         % c}v S c c}w )uW   이 스텝이 재배열 대상인가 — `prompt_assembly_reorder_steps` 목록 기준.r   )settingsprompt_assembly_reorder_steps ,)app.core.configr   getattrsplitstrip)stepr   rawss       N/Users/manta/Documents/Projects/TheRoad-I1/backend/app/core/prompt_assembly.pyreorder_enabledr   #   sL    (
(;R
@
FBCsyy~C~!AGGI~CCCCs   AAc                J    | D ci c]  }|t          | t          c}S c c}w )N)_MARK_PREFIX_MARK)fieldsks     r   _mark_fieldsr   +   s,    4:;FqA,s5'**F;;;s    c                l    | di |} | di t        |      }|j                  t              }|j                  t              }t        |      t        |      k7  r$t	        dt        |       dt        |       d      g }g }t        ||      D ]   \  }}	t        |	v r|n|j                  |       " ||fS )u  렌더된 템플릿을 (정적 문단, 가변 문단) 으로 가른다.

    두 목록 모두 원래 상대 순서를 유지한다. 두 목록을 원래 자리대로 합치면
    `render(**fields)` 와 같다.

    값 자체에 문단 구분자가 들어오면 두 렌더의 문단 수가 어긋난다. 그때는
    어느 문단이 가변인지 확정할 수 없으므로 raise 한다 — 조용히 기존 순서로
    되돌리면 재배열했다는 기록이 거짓이 된다.
    uu   프롬프트 조립 재배열 불가 — 값에 문단 구분자가 들어 있어 문단 수가 어긋난다 (실제 u    vs 표식 ) )r   r   PARA_SEPlen
ValueErrorzipr   append)
renderr   renderedprobeparasprobe_parasstaticvariablepara
probe_paras
             r   split_variable_paragraphsr0   /   s     H*\&)*ENN8$E++h'K
5zS%%225e*[[IYHZZ[]
 	

 FH{3j!Z/VCCDI 48    r   )project_block
call_blockc                    |di |}t        |       s||z   |z   S t        ||      \  }}t        j                  |      |z   }|r|t        t        j                  |      z   z  }||z   S )uN  user 프롬프트 조립 — 재배열 대상이면 정적 문단을 앞으로 보낸다.

    Args:
        step: 스텝 이름 (플래그 목록과 대조)
        render: `**fields` 를 받아 템플릿을 렌더하는 호출체
        fields: 호출마다 변하는 템플릿 값
        project_block: 프로젝트·주행 단위로 고정인 덧붙임 블록
        call_block: 호출마다 변하는 덧붙임 블록

    OFF: `render(**fields) + project_block + call_block` — 기존 조립 그대로.
    ON:  [정적 문단] + project_block + [가변 문단] + call_block.
    r!   )r   r0   r"   join)	r   r'   r   r2   r3   baser,   r-   outs	            r   assemble_user_promptr8   N   ss    ( FD4 m#j000@FH
--
-
/Cx(--111r1   c                >    t        | j                  t                    S )u]   조립 결과의 문단 다중집합 — 재배열 전후 무손실 대조용(시험 전용).)sortedr   r"   )texts    r   paragraph_multisetr<   m   s    $**X&''r1   )r   strreturnbool)r   Dict[str, str]r>   r@   )r'   Callable[..., str]r   r@   r>   zTuple[List[str], List[str]])r   r=   r'   rA   r   r@   r2   r=   r3   r=   r>   r=   )r;   r=   r>   zSequence[str])__doc__
__future__r   loggingtypingr   r   r   r   r   	getLogger__name__loggerr"   r   r   r   r   r0   r8   r<   r!   r1   r   <module>rI      s   $ #  8 8			8	$  	$D< !H 
  	
   	>(r1   