@@ -120,9 +120,12 @@ type AssistantDraftStepResult struct {
120120}
121121
122122// AssistantDraftBlockResult is a chained native assistant proposal block.
123+ // Probs is nil unless the LTHN_MTP_CONF capture is armed (mtp_conf_diag.go):
124+ // per drafted position, the drafter's softmax probability of its own pick.
123125type AssistantDraftBlockResult struct {
124126 Tokens []int32
125127 Hidden []byte
128+ Probs []float32
126129}
127130
128131// AssistantVerifyResult reports target-side verification of a proposed
@@ -1210,6 +1213,10 @@ func (pair *AssistantPair) draftBlockFromSessionWithSuppress(target *ArchSession
12101213 } else {
12111214 tokens = target .mtpDraftTokenScratch (maxDraftTokens )
12121215 }
1216+ var confProbs []float32
1217+ if mtpConfEnabled () {
1218+ confProbs = make ([]float32 , 0 , maxDraftTokens )
1219+ }
12131220 fused := pair .fusedDraft ()
12141221 if fused != nil {
12151222 if err := fused .loadKV (targetKVs ); err != nil {
@@ -1263,6 +1270,9 @@ func (pair *AssistantPair) draftBlockFromSessionWithSuppress(target *ArchSession
12631270 nativeTraceLog (core .Sprintf ("mtp-diag draft step %d: tok=%d fwd=%.1fms head=%.1fms greedy=%.1fms normed{%s}\n " ,
12641271 len (tokens ), tok , fwdMs , headMs , greedyMs , mtpDiagBF16Stats (normed )))
12651272 }
1273+ if confProbs != nil {
1274+ confProbs = append (confProbs , mtpConfProb (logits , tok , suppress ))
1275+ }
12661276 stepToken , currentHidden = tok , nextHidden
12671277 } else {
12681278 projectedOut := target .mtpProjectionScratch (pair .Assistant .Arch .Hidden * bf16Size )
@@ -1279,6 +1289,9 @@ func (pair *AssistantPair) draftBlockFromSessionWithSuppress(target *ArchSession
12791289 nativeTraceLog (core .Sprintf ("mtp-diag draft step %d: tok=%d projected{%s} logits{%s}\n " ,
12801290 len (tokens ), step .Token , mtpDiagBF16Stats (projected ), mtpDiagBF16Stats (logitsOut )))
12811291 }
1292+ if confProbs != nil {
1293+ confProbs = append (confProbs , mtpConfProb (logitsOut , step .Token , suppress ))
1294+ }
12821295 stepToken , currentHidden = step .Token , step .Hidden
12831296 }
12841297 tokens = append (tokens , stepToken )
@@ -1287,7 +1300,7 @@ func (pair *AssistantPair) draftBlockFromSessionWithSuppress(target *ArchSession
12871300 if ! copyTokens {
12881301 target .mtpDraftTokens = tokens
12891302 }
1290- return AssistantDraftBlockResult {Tokens : tokens , Hidden : currentHidden }, nil
1303+ return AssistantDraftBlockResult {Tokens : tokens , Hidden : currentHidden , Probs : confProbs }, nil
12911304}
12921305
12931306func (pair * AssistantPair ) draftBlockSampledFromSessionWithSuppress (target * ArchSession , lastToken int32 , maxDraftTokens int , copyTokens bool , params model.SampleParams , sampler * model.Sampler ) (AssistantDraftBlockResult , error ) {
@@ -1765,6 +1778,13 @@ func (pair *AssistantPair) GenerateFromSessionEach(target *ArchSession, promptID
17651778 nativeTraceLog (core .Sprintf ("mtp-diag verify %d: draft=%.1fms verify=%.1fms last=%d block=%v accepted=%v replacement=%d allAccepted=%v\n " ,
17661779 result .TargetVerifyCalls , diagDraftMs , total - diagDraftMs , lastToken , block , verify .AcceptedTokens , verify .ReplacementToken , verify .AllAccepted ))
17671780 }
1781+ if draft .Probs != nil {
1782+ off := 0
1783+ if carryPresent {
1784+ off = 1
1785+ }
1786+ mtpConfRecordCycle (posBeforeVerify , off , draft .Probs , verify .AcceptedCount )
1787+ }
17681788 emitStart := 0
17691789 if carryPresent && len (verify .AcceptedTokens ) > 0 && verify .AcceptedTokens [0 ] == carryLead {
17701790 emitStart = 1
@@ -1801,7 +1821,7 @@ func (pair *AssistantPair) GenerateFromSessionEach(target *ArchSession, promptID
18011821 if verify .AllAccepted {
18021822 lowAcceptStreak = 0
18031823 carryLead = - 1
1804- if ! wasProbing && reng .needsDeepBootstrap (target .pos , len (result .Tokens ), maxNew ) {
1824+ if ! mtpConfForce && ! wasProbing && reng .needsDeepBootstrap (target .pos , len (result .Tokens ), maxNew ) {
18051825 if mtpDiagForTest {
18061826 nativeTraceLog (core .Sprintf ("mtp-diag reengage deep-bootstrap: pos=%d emitted=%d\n " , target .pos , len (result .Tokens )))
18071827 }
@@ -1819,7 +1839,7 @@ func (pair *AssistantPair) GenerateFromSessionEach(target *ArchSession, promptID
18191839 } else {
18201840 bail = reng .engagedCycle (newDrafts , time .Since (cycleT0 ).Seconds (), len (result .Tokens ))
18211841 }
1822- if bail {
1842+ if bail && ! mtpConfForce {
18231843 if done , perr := runPlainStretch (carryLead ); perr != nil {
18241844 return result , perr
18251845 } else if done {
@@ -1842,7 +1862,7 @@ func (pair *AssistantPair) GenerateFromSessionEach(target *ArchSession, promptID
18421862 }
18431863 // Give up on drafting only after the drafter has stayed weak for several
18441864 // consecutive blocks — one near-tie block is transient, not a mismatched pair.
1845- if ! stopped && len (result .Tokens ) < maxNew && lowAcceptStreak >= nativeAssistantLowAcceptPatience {
1865+ if ! mtpConfForce && ! stopped && len (result .Tokens ) < maxNew && lowAcceptStreak >= nativeAssistantLowAcceptPatience {
18461866 if mtpReengageDisabled {
18471867 if err := nativeAssistantFinishLowAcceptFromTargetCache (target , & result , replacement , maxNew , eosID , suppress , yield ); err != nil {
18481868 return result , err
@@ -1864,7 +1884,7 @@ func (pair *AssistantPair) GenerateFromSessionEach(target *ArchSession, promptID
18641884 if stopped {
18651885 break
18661886 }
1867- if ! wasProbing && reng .needsDeepBootstrap (target .pos , len (result .Tokens ), maxNew ) {
1887+ if ! mtpConfForce && ! wasProbing && reng .needsDeepBootstrap (target .pos , len (result .Tokens ), maxNew ) {
18681888 if mtpDiagForTest {
18691889 nativeTraceLog (core .Sprintf ("mtp-diag reengage deep-bootstrap: pos=%d emitted=%d\n " , target .pos , len (result .Tokens )))
18701890 }
@@ -1882,7 +1902,7 @@ func (pair *AssistantPair) GenerateFromSessionEach(target *ArchSession, promptID
18821902 } else {
18831903 bail = reng .engagedCycle (newDrafts + 1 , time .Since (cycleT0 ).Seconds (), len (result .Tokens ))
18841904 }
1885- if bail {
1905+ if bail && ! mtpConfForce {
18861906 if done , perr := runPlainStretch (replacement ); perr != nil {
18871907 return result , perr
18881908 } else if done {
@@ -2026,7 +2046,7 @@ func (pair *AssistantPair) GenerateSampledFromSessionEach(target *ArchSession, p
20262046 if verify .AllAccepted {
20272047 lowAcceptStreak = 0
20282048 carryLead = - 1
2029- if ! wasProbing && reng .needsDeepBootstrap (target .pos , len (result .Tokens ), maxNew ) {
2049+ if ! mtpConfForce && ! wasProbing && reng .needsDeepBootstrap (target .pos , len (result .Tokens ), maxNew ) {
20302050 if mtpDiagForTest {
20312051 nativeTraceLog (core .Sprintf ("mtp-diag reengage deep-bootstrap: pos=%d emitted=%d\n " , target .pos , len (result .Tokens )))
20322052 }
@@ -2044,7 +2064,7 @@ func (pair *AssistantPair) GenerateSampledFromSessionEach(target *ArchSession, p
20442064 } else {
20452065 bail = reng .engagedCycle (newDrafts , time .Since (cycleT0 ).Seconds (), len (result .Tokens ))
20462066 }
2047- if bail {
2067+ if bail && ! mtpConfForce {
20482068 if done , perr := runPlainStretch (carryLead ); perr != nil {
20492069 return result , perr
20502070 } else if done {
@@ -2082,7 +2102,7 @@ func (pair *AssistantPair) GenerateSampledFromSessionEach(target *ArchSession, p
20822102 }
20832103 // One weak block is a transient near-tie, not a mismatched pair — only fall
20842104 // back to plain target decode after several consecutive weak blocks.
2085- if ! stopped && len (result .Tokens ) < maxNew && lowAcceptStreak >= nativeAssistantLowAcceptPatience {
2105+ if ! mtpConfForce && ! stopped && len (result .Tokens ) < maxNew && lowAcceptStreak >= nativeAssistantLowAcceptPatience {
20862106 if mtpReengageDisabled {
20872107 var err error
20882108 history , err = nativeAssistantFinishLowAcceptSampledFromTargetCache (target , & result , replacement , maxNew , stopTokens , sampler , params , history , yield )
@@ -2107,7 +2127,7 @@ func (pair *AssistantPair) GenerateSampledFromSessionEach(target *ArchSession, p
21072127 if stopped {
21082128 break
21092129 }
2110- if ! wasProbing && reng .needsDeepBootstrap (target .pos , len (result .Tokens ), maxNew ) {
2130+ if ! mtpConfForce && ! wasProbing && reng .needsDeepBootstrap (target .pos , len (result .Tokens ), maxNew ) {
21112131 if mtpDiagForTest {
21122132 nativeTraceLog (core .Sprintf ("mtp-diag reengage deep-bootstrap: pos=%d emitted=%d\n " , target .pos , len (result .Tokens )))
21132133 }
@@ -2125,7 +2145,7 @@ func (pair *AssistantPair) GenerateSampledFromSessionEach(target *ArchSession, p
21252145 } else {
21262146 bail = reng .engagedCycle (newDrafts + 1 , time .Since (cycleT0 ).Seconds (), len (result .Tokens ))
21272147 }
2128- if bail {
2148+ if bail && ! mtpConfForce {
21292149 if done , perr := runPlainStretch (replacement ); perr != nil {
21302150 return result , perr
21312151 } else if done {
0 commit comments