
    j)                       d Z ddlmZ ddlZddlZddlZddlZddlZddl	m
Z
 dZ e
d      ZdZh dZg d	g d	g d
g dg d
g dg dg dg dg dg ddZh dZdddddddddd	Zd Zd Zd  Zd! Zd" Zd# Zd$ Zd% Zd& Zd' Zd( Zd) Zd* Zy)+zlRead-only multi-source retrieval with rank fusion.
No writes to knowledge.db, Obsidian, Graphiti or queues.
    )annotationsN)Pathz+/opt/struktur/youtube-research/knowledge.dbz/opt/obsidian-vaultzhttp://127.0.0.1:8644>%      fürorandaufausdasderdieeinforhowistmitourtheundunsvonwaswiewirdoeseinehaveintoodersindthatthiswhatwithabouteinemeineneinertheirwhich)	agent
autonomousagentenlong-runningreliability
monitoringrecoverycontexttoken)r*   r+   subagentskillsworkflowr/   )r*   agentsr3   r4   r5   r/   )r-   dauerbetriebr/   r0   r.   )costr2   budgetrate
modellwahl)
provenienzsourceevidenceaudittraceability)wissensbasis	knowledgeragobsidian	retrieval)failurer0   r/   retryr.   )	guardrail
validationerrorr0   )autonome	autonomenr,   agentensystemz
ki-agentenlangfristigkostennachvollziehbarkeitwissenu
   ausfällenfehlverhalten>      stück   lüftung   lüftungsgerät   lüftungsgeräte   auftragsbestätigungeisenheinzmengekundenangebotauftragprojektangeboteprojekterechnungsmartfanverkauft
bestellungg?g      ?gffffff?g?      ?g?g?g      ?g333333?)	AUFTRAGSBESTAETIGUNGRECHNUNG
BESTELLUNGPROJEKTDATENTECHNISCHE_UNTERLAGEANGEBOTINBETRIEBNAHMEEMAILSONSTIGc                    t        j                  d| j                               D cg c]  }|t        vs| c}d d S c c}w )Nu   [\wÄÖÜäöüß-]{3,}   )refindalllowerSTOP)qxs     /home/hermes/knowledge_query.pytokensrx      s9    "**-G	"RdQVW_cVcqdehfhiids   ??c                    t        |       }g }|D ]'  }|j                  t        j                  |g              ) t	        t
        j                  ||z               d d S )N   )rx   extend	EXPANSIONgetlistdictfromkeys)ru   baseextrats       rw   expandedr      sO    Qir
1QY]]1R011T]]4:&',,    c                 B    t        j                  dt         ddd      S )Nzfile:z?mode=roT   )uritimeout)sqlite3connectDB r   rw   ror      s    5H!5$qI
Ir   c           	        t        |       }dj                  d |D              xs d}t               }t        j                  |_        	 |j                  d|f      j                         }t        |      D cg c]  \  }}t        ||dz   d       c}}|j                          S c c}}w # t        j                  $ r g cY |j                          S w xY w# |j                          w xY w)N OR c              3  L   K   | ]  }d |j                  d d      z   d z     yw"z""Nreplace.0rv   s     rw   	<genexpr>zfts.<locals>.<genexpr>   %     !J!#aiiD&9"9#"=!J   "$"wissen"zSELECT v.id,v.youtube_id,v.title,v.channel,v.summary,v.published_at,(-bm25(videos_fts)) score FROM videos_fts JOIN videos v ON videos_fts.rowid=v.id WHERE videos_fts MATCH ? ORDER BY score DESC LIMIT 30   SOURCEranksource_kindr   joinr   r   Rowrow_factoryexecutefetchall	enumerater   closeErrorru   tsexprcrowsirv   s          rw   ftsr      s   QKfkk!Jr!JJXj\^\`Z[pwp{p{bcboyy  b  dh  cj  k  t  t  v$  qz  {  q@  A  jm  jk  lm  @D  EF  LM  NO  LO  \d  @e  A	
 ARi	
  	
6   /B, 7B&B, &B, ,CC CC C)c           	        t        |       }dj                  d |D              xs d}t               }t        j                  |_        	 |j                  d|f      j                         }t        |      D cg c]  \  }}t        ||dz   d       c}}|j                          S c c}}w # t        j                  $ r g cY |j                          S w xY w# |j                          w xY w)Nr   c              3  L   K   | ]  }d |j                  d d      z   d z     ywr   r   r   s     rw   r   zkfts.<locals>.<genexpr>   r   r   r   zSELECT rowid,doc_id,source_identity,project,document_type,original_path,content,(-bm25(kdata_fts)) score FROM kdata_fts WHERE kdata_fts MATCH ? ORDER BY score DESC LIMIT 30r   r   r   r   r   s          rw   kftsr      s   QKfkk!Jr!JJXj\^\`Z[pwp{p{bcboyy  D  FJ  EL  M  V  V  X$  S\  ]a  Sb  ac  LO  LM  NO  bf  gh  no  pq  nq  ~F  bG  ac	
 acRi	
  	
r   c           	       
 t        |       }dj                  d |D              xs d}t               }t        j                  |_        	 |j                  d| d|D cg c]  }d| d
 c}      j                         }g }|D ]  }t        |      }|j                  d      xs dj                         
t        
fd	|D              |d
<   t        |j                  d      xs d      j                  d      rdnd|d<   ddddddj                  |j                  d      d      |d<   |j                  |        |j                  d d       t!        |d d       D 	cg c]  \  }	}t        ||	dz          c}}	|j#                          S c c}w c c}}	w # t        j$                  $ r g cY |j#                          S w xY w# |j#                          w xY w)Nr   c              3      K   | ]  }d   yw)zstatement LIKE ?Nr   )r   _s     rw   r   zkus.<locals>.<genexpr>    s     $DA%7$Ds   z1=1zSELECT id,statement,source_identity,source_version_id,source_locator,evidence_class,review_state,gold_state,legacy_placeholder,content_version_hash FROM knowledge_units WHERE legacy_placeholder=0 AND review_state NOT IN ('REJECTED','LEGACY') AND ()%	statement c              3  @   K   | ]  }j                  |        y wN)count)r   r   lows     rw   r   zkus.<locals>.<genexpr>$   s     HbZ[STHbs   	relevancesource_identity)zk-daten:youtube:r   DERIVEDr   g?g333333?re   ?gffffff?)	GESICHERTu
   BESTÄTIGT	PLAUSIBELUNSICHERu   WIDERSPRÜCHLICHevidence_classquality_weightc                "    | d   | d   z  | d   fS )Nr   r   idr   rv   s    rw   <lambda>zkus.<locals>.<lambda>%   s    ;*:(;;AdGD r   Tkeyreverse   r   r   )r   r   r   r   r   r   r   r   r   r}   rs   sumstr
startswithappendsortr   r   r   )ru   r   clausesr   rv   r   outrdr   r   s             @rw   kusr      s   QK$D$DDMQSQUqelepepWXWdyy  M  NU  MV  VW  Z  np  [q  ij  ^_  `a  _b  bc  \d  [q  r  {  {  }$  CE  B ta	!W1155%+224cSHb_aHbEban  BE  FG  FK  FK  L]  F^  Fd  bd  Be  Bp  Bp  qH  BIu}  OXdefsdt  {~  LO  \_  kn  BD  nE  nI  nI  JK  JO  JO  P`  Ja  bd  ne  Z[  \l  Zm  gj  gq  gq  rs  gtt((DT(R&/CR&9	:sq$qac
	:	
 [q 
;Ri	
  	
sC   	F F
*C7F !F;F F G/G GG Gc           	     4   t         j                  j                  t        dz   t	        j
                  | dd      j                         ddid      }	 t         j                  j                  |d	      5 }t	        j                  |j                               }d d d        g }t        j                  d
g       d      D ];  \  }}|j                  |j                  dd      |j                  d      d|dd       = |S # 1 sw Y   gxY w# t        $ r g cY S w xY w)Nz/search   )querylimitContent-Typeapplication/jsonPOSTmethodr   r   resultsr   factr   scorezgraphiti:/searchUNKNOWN)r   r   r=   r   r   )urllibrequestRequestGRAPHjsondumpsencodeurlopenloadsreadr   r}   r   	Exception)ru   reqr   r   r   r   rv   s          rw   graphr   )   s   ^^E)ODJJ"7M,N,U,U,WYghzX{  DJ  K~~c"-ITZZ5I1I#quuYr*1-  icaszz!%%rBR[\[`[`ah[i  tF  NO  ^g  ;h  0i  i	* JI 	)s+   !D	 3$C=A%D	 =DD	 	DDc           	        t        |       }g }t        t        dz  j                  d            D ]n  }|j	                  dd      t        fd|D              }|s-|j                  dt        |j                  t                    z   t        |      d d |d	d
       p t        t        |d d            D cg c]  \  }}t        ||dz          c}}S # t
        $ r Y w xY wc c}}w )N	SolutionszNutzwert-Sprint-*.mdutf8r   )encodingerrorsc              3  \   K   | ]#  }j                         j                  |       % y wr   )rs   r   )r   rv   r   s     rw   r   zobs.<locals>.<genexpr>6   s      	)!'')//!
	)s   ),z	obsidian:  SYNTHETIC_TEST)r   pathtextr   r   c                    | d   S )Nr   r   r   s    rw   r   zobs.<locals>.<lambda>8   s
    q~ r   Tr   r   r   )r   sortedVAULTglob	read_textOSErrorr   r   r   relative_tor   r   )ru   r   r   prelr   rv   r   s          @rw   obsr  1   s    QKR
%#))*@A
B \Q	V95a		)b	))#{3q}}U7K3L'LTWXYTZbcdieibjwz  JZ  [  
\	\
 &/vc>U^b/c%decaaQqS	ee 
 	fs   C<C)	C&%C&c                    g }t               }| D ]1  } ||      }||v r|j                  |       |j                  |       3 |S r   )setaddr   )r   r   r   seenrv   ks         rw   _deduper  9   sJ    ce
 QF!$Yx((1+szz!} 	r   c                v   | j                  d      r| d   S | j                  d      s| j                  d      r0dt        | j                  d      xs | j                  d            z   S | j                  d      rdt        | d         z   S dt        | j                  d      xs | j                  d	            z   S )
Nr   
youtube_idr   r   r   z	graphiti:zunknown:rowidr   )r}   r   r   s    rw   	_identityr  @   s    EE
A&7$88EE,155;jQUU<=P=_TUTYTYZ^T_9`.`'`EE&MS6^333quuW~6v777r   c                :   t               }t        j                  |_        	 |j	                  d| f      j                         }d|r|d   nd i|j                          S # t        j                  $ r i cY |j                          S w xY w# |j                          w xY w)NzAselect document_type from kdata_documents where source_identity=?document_typer   )r   r   r   r   r   fetchoner   r   )identityr   r   s      rw   _source_metar  E   s    4w{{IIQS[R]^ggi!  tC  LM  DE  FG  DH  SW  sX	
 	Ri	
  	
s#   +A B2B BB Bc                	   | xs dj                         }|st        d      t        |      t        |      t	        |      t        |      t        |      d}t        |d   t              |d<   t        |d   t              |d<   t        |d   d       |d<   t        |d   d	       |d<   t        |d
   t              |d
<   g }|j                         D ]  \  }}|D ]  }|dk(  rt        t        |            t        z  s%t        |      }||d<   t        |      |d<   |j                  dd      |d<   |j                  d      xs t        |d         j                  d      |d<   ddt!        |j                  dd            z   z  |d<   |d   dk(  rd|d<   n6|d   dk(  rd|d<   n(t"        j                  |j                  d      d      |d<   |d   |d   z  |d<   |j%                  |          i }|D ]  }|d   }||vs|d   ||   d   kD  s|||<   ! t'        |j)                         d d      }	|	d d }
g }|
D ]  }|d   dk(  r*|j                  d        d!|j                  d"      xs d }nf|d   dk(  r|j                  d#d      d d$ }nH|d   dk(  r|j                  d%d      }n-|d   d
k(  r|j                  d&d      }n|j                  d'd      }|j%                  d(|d    d)|d    d*|d    d+|j                  d       d,|j                  d       d-|d   d.d/|d   d.d0|         d1j+                  |      d d2 }t-        ||t/        |
            \  }}|
D cg c]  }|d   	 }}|rd3nt/        t        |            d4k\  rd5nd6}g }|
D ]  }|j%                  |d   |d   |d   |j                  d      |j                  d      |j                  d7      |j                  d      |j                  d      |j                  d       |j                  d8      xs |j                  d9      |j                  d:      |j                  d%      |j                  d'      d;        |||||t        |      t1        |      |j                         D ci c]  \  }}|t/        |       c}}t/        |
      t/        t        |            |d<d=S c c}w c c}}w )>Nr   zquestion darf nicht leer sein)fts5
kdata_fts5knowledge_unitsgraphitirD   r  r  r  c                F    | j                  d      | j                  d      fS )Nr   r   r}   r   s    rw   r   zask.<locals>.<lambda>O   sQ      fg  fk  fk  l}  f~  @  D  D  EP  Q  eR r   r  c                $    | j                  d      S )Nr   r!  r   s    rw   r   zask.<locals>.<lambda>O   s'      FG  FK  FK  LR  FS r   rD   layerr   r   r   r  r   <   r     	rrf_scorer   g?quality_multiplierr   r   re   fusion_scorec                T    | d   | j                  dd      | j                  dd       fS )Nr(  r   r   r   r%  r!  r   s    rw   r   zask.<locals>.<lambda>`   s2    !N*;AEEBRST<UWXW\W\]cdgWhVh)i r   Tr   r   titlez | summarycontenti  r   r  r   [|z|kind=z|doc=z|rank=z|rrf=z.6fz|fusion=z]
z

i]  insufficient   	supportedmediumr   original_pathr   source_locator)r#  r   r   r  r   	raw_scorer&  r(  r*  r3  r4  r   r   )rx   expanded_tokensraw_candidate_countsfinal_context_countdistinct_source_countfinal_context)answersourcesr>   
confidencewarningrE   )strip
ValueErrorr   r   r   r   r  r  r  itemsr  rx   KDATA_TRIGGERSr   r}   r  float
DOC_WEIGHTr   r  valuesr   synthlenr   )questionru   rawallrowsr#  r   rv   bestr  fusedr1   blockspayloadcontext_textr;  r>  
identitiesr=  r<  vs                       rw   askrR  K   s   N	
:;
;Va3q6USTXadefaghS[+Vws<GXYb?cS->  }D  EH  IZ  E[  \R  }Sehize{  el  mp  q{  m|  }S  eT  UX  Yc  Ud  fm  nq  r|  n}  ~G  fH  VY  Zd  Ve	99; 	OZU4 Oa\3vay>N#BH	!W1ajYq\"3 4TUTYTYZghqTr1]CS  HI  HM  HM  N]  H^  HY  bn  op  qB  oC  bD  bH  bH  IX  bYtu  wF  uGRaeeF3/0011[>(("!,@*A	-)#SQ';%< *quu_/Ec J
{^A&:$;;1^W^^A=NO	O 	
 JQ!d]a'Q(??QJ dkkm irvw	sBV
 GQwZAEE'N#33quuY7G7M26N!Oz<y)<Ud)Cz$$aeeK.Cgz:quuVB'7wuuVBw--!AgJ<q#4!5 6fQ}=M<NeTUTYTYZiTjSkkqrsrwrwx~r  rA  AF  GH  IT  GU  VY  FZ  Zb  cd  es  ct  ux  by  y|  }D  |E  F  GG kk&!&5)aS\2^e?fYZBS@T?fJ?f  FM  tB  cf  gj  ku  gv  cw  yz  cz  T_  @Hhr	
 tQ	..!G*q9J7KZ[\iZj{|  |A  |A  BQ  |R  Z[  Z_  Z_  `f  Zg  tu  ty  ty  zA  tB  OP  OT  OT  U`  Oa  qr  qv  qv  wE  qF  OP  OT  OT  U\  O]  no  ns  ns  tC  nD  nU  HI  HM  HM  NT  HU  gh  gl  gl  m}  g~  KL  KP  KP  Q\  K]  ef  ej  ej  kq  er  s  tt7cz\c  {A  BC  {D  W_  `a  Wb  OR  OX  OX  OZ  z[  HK  HI  JK  {|  }@  AB  }C  {C  z[  ru  v}  r~  WZ  [^  _i  [j  Wk  |C  qD  	E  E	 @g z[s   $SSc                   |syt               }|syt        j                  ddddddd	d
|  d| dgdd      j                         }t        j
                  j                  d|dd|z   dddd      }	 t        j
                  j                  |d      5 }t        j                  |j                               }d d d        d   d   d   j                  d      }t        |t              rdj                  d |D              }|yt        |      j                         d fS # 1 sw Y   ixY w# t         $ r!}	d t#        |	      j$                  fcY d }	~	S d }	~	ww xY w)!N)uE   Die vorhandenen Wissensquellen ermöglichen keine belastbare Antwort.insufficient_evidence)uN   Relevante Quellen wurden gefunden, aber die LLM-Synthese ist nicht verfügbar.llm_not_configuredzqwen/qwen3.7-flashg?r   systemu  Beantworte auf Deutsch streng quellengebunden. Kombiniere mehrere Belege. Kennzeichne Widersprüche und Unsicherheit. Behaupte nicht, dass Wissen im gesamten Bestand nicht existiert, wenn nur der aktuelle Kontext keinen Beleg enthält. Antworte direkt und erfinde nichts.)roler,  userzFrage: z

Material:
)modeltemperature
max_tokensmessagesF)ensure_asciiz-https://openrouter.ai/api/v1/chat/completionsr   zBearer zhttp://127.0.0.1:8655zHermes Knowledge Query)r   AuthorizationzHTTP-RefererzX-Titler   r   Z   r   choicesr   messager,  r   c              3  v   K   | ]1  }t        |t              r|j                  d d      n
t        |       3 yw)r  r   N)
isinstancer   r}   r   r   s     rw   r   zsynth.<locals>.<genexpr>x   s1     -ref*QtBTaeeF2.>Z]^_Z`.`-rs   79)z7Das Modell hat keine ausgabefertige Synthese geliefert.empty_model_contentznQuellen wurden gefunden, aber die LLM-Synthese ist fehlgeschlagen; es wird keine unbelegte Antwort ausgegeben.)envr   r   r   r   r   r   r   r   r   r}   rc  r~   r   r   r?  r   type__name__)
ru   ctxnr   bodyr   r   r   r,  es
             rw   rF  rF  o   s   	qUy
jj.Sdgo  {L  `M  V\  ip  qr  ps  sB  CF  BG  gH  NI  _J  K  Y^  _  f  f  h^^KDas  EN  OR  ER  by  D\  R]  ek  l`~~c"-ITZZ5I1I
I,q/)
$
(
(
3'bgg-rjq-r&rg_l	W			d	""	 JI
 	  `  O  PT  UV  PW  P`  P`  `  `  `s=   5!D. $D":AD. D. "D+'D. .	E7EEE)__doc__
__future__r   r   rq   r   urllib.errorr   urllib.requestpathlibr   r   r  r   rt   r|   rB  rD  rx   r   r   r   r   r   r   r  r  r  r  rR  rF  r   r   rw   <module>rq     s   # 2 2 2 0=R8S%[rUZ {}  Kr  }  PN  \^  mr  |i	  @
y
  C|  JC  TA  B	 d#'4TY]ux  DF  X[  dg  rt  u
 i- J	f8
#EH`r   