Class: Anthropic::BetaRefusalFallbackMiddleware::BlockTracker

Inherits:
Object
  • Object
show all
Defined in:
lib/anthropic/helpers/refusal_fallback.rb

Overview

Block bookkeeping for one stream of the splice: accumulates each content block from its deltas (for the continuation prefill), shifts wire indices by index_base so they stay monotonic across hops, and tracks which blocks are still open so a refusal that cuts mid-block can close them.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(index_base = 0) ⇒ BlockTracker

Returns a new instance of BlockTracker.

Parameters:

  • index_base (Integer) (defaults to: 0)


561
562
563
564
565
566
# File 'lib/anthropic/helpers/refusal_fallback.rb', line 561

def initialize(index_base = 0)
  @index_base = index_base
  @next_index = index_base
  @blocks = []
  @open = []
end

Instance Attribute Details

#next_indexInteger (readonly)

Returns one past the highest shifted block index seen.

Returns:

  • (Integer)

    one past the highest shifted block index seen



558
559
560
# File 'lib/anthropic/helpers/refusal_fallback.rb', line 558

def next_index
  @next_index
end

Instance Method Details

#close_open_blocks(y) ⇒ Object

Parameters:

  • y (Enumerator::Yielder)


593
594
595
596
597
598
599
600
601
602
603
# File 'lib/anthropic/helpers/refusal_fallback.rb', line 593

def close_open_blocks(y)
  @open.each do |index|
    y << "event: content_block_stop\ndata: #{JSON.generate(
      {
        type: 'content_block_stop',
        index: index
      }
    )}\n\n"
  end
  @open.clear
end

#content_blocksArray<Hash>

Returns the accumulated content blocks, in start order.

Returns:

  • (Array<Hash>)

    the accumulated content blocks, in start order



569
# File 'lib/anthropic/helpers/refusal_fallback.rb', line 569

def content_blocks = @blocks.map { _1[:block] }

#delta(event) ⇒ Object

Parameters:

  • event (Hash)


580
581
582
583
# File 'lib/anthropic/helpers/refusal_fallback.rb', line 580

def delta(event)
  apply_delta(event["index"], event["delta"])
  event["index"] += @index_base
end

#start(event) ⇒ Object

Parameters:

  • event (Hash)


572
573
574
575
576
577
# File 'lib/anthropic/helpers/refusal_fallback.rb', line 572

def start(event)
  @blocks << {index: event["index"], block: deep_dup(event["content_block"])}
  event["index"] += @index_base
  @open << event["index"]
  @next_index = [@next_index, event["index"] + 1].max
end

#stop(event) ⇒ Object

Parameters:

  • event (Hash)


586
587
588
589
590
# File 'lib/anthropic/helpers/refusal_fallback.rb', line 586

def stop(event)
  event["index"] += @index_base
  @open.delete(event["index"])
  @next_index = [@next_index, event["index"] + 1].max
end