Skip to content
Kward Search API index

Class: Kward::PluginChatCapabilities

Inherits:
Object
  • Object
show all
Defined in:
lib/kward/plugins/chat_contract.rb

Overview

Versioned capabilities declared by a plugin-owned chat type.

Constant Summary collapse

API_VERSION =
1
ATTACHMENT_TYPES =
%i[image].freeze
KEYS =
%i[attachments steering transcript_paging].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(api_version:, capabilities:, declared:) ⇒ PluginChatCapabilities

Returns a new instance of PluginChatCapabilities.



26
27
28
29
30
31
32
33
34
# File 'lib/kward/plugins/chat_contract.rb', line 26

def initialize(api_version:, capabilities:, declared:)
  @declared = declared
  @api_version = normalize_api_version(api_version)
  values = normalize_capabilities(capabilities)
  @attachments = normalize_attachments(values.fetch(:attachments, [])).freeze
  @steering = normalize_boolean(values.fetch(:steering, false), :steering)
  @transcript_paging = normalize_boolean(values.fetch(:transcript_paging, false), :transcript_paging)
  freeze
end

Instance Attribute Details

#api_version ⇒ Object (readonly)

Returns the value of attribute api_version.



9
10
11
# File 'lib/kward/plugins/chat_contract.rb', line 9

def api_version
  @api_version
end

#attachments ⇒ Object (readonly)

Returns the value of attribute attachments.



9
10
11
# File 'lib/kward/plugins/chat_contract.rb', line 9

def attachments
  @attachments
end

Class Method Details

.build(api:, capabilities:) ⇒ Object

Raises:

  • (ArgumentError)


11
12
13
14
15
16
# File 'lib/kward/plugins/chat_contract.rb', line 11

def self.build(api:, capabilities:)
  return legacy if api.nil? && capabilities.nil?
  raise ArgumentError, "Plugin chat api and capabilities are required together" if api.nil? || capabilities.nil?

  new(api_version: api, capabilities: capabilities, declared: true)
end

.legacy ⇒ Object



18
19
20
21
22
23
24
# File 'lib/kward/plugins/chat_contract.rb', line 18

def self.legacy
  @legacy ||= new(
    api_version: nil,
    capabilities: { attachments: ATTACHMENT_TYPES, steering: nil, transcript_paging: nil },
    declared: false
  )
end

Instance Method Details

#allows_attachment?(type) ⇒ Boolean

Returns:

  • (Boolean)


48
49
50
# File 'lib/kward/plugins/chat_contract.rb', line 48

def allows_attachment?(type)
  attachments.include?(type.to_sym)
end

#declared? ⇒ Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/kward/plugins/chat_contract.rb', line 36

def declared?
  @declared
end

#steering? ⇒ Boolean

Returns:

  • (Boolean)


40
41
42
# File 'lib/kward/plugins/chat_contract.rb', line 40

def steering?
  @steering == true
end

#to_h ⇒ Object



52
53
54
55
56
57
58
59
60
61
# File 'lib/kward/plugins/chat_contract.rb', line 52

def to_h
  return {} unless declared?

  {
    api_version: api_version,
    attachments: attachments.map(&:to_s).freeze,
    steering: steering?,
    transcript_paging: transcript_paging?
  }.freeze
end

#transcript_paging? ⇒ Boolean

Returns:

  • (Boolean)


44
45
46
# File 'lib/kward/plugins/chat_contract.rb', line 44

def transcript_paging?
  @transcript_paging == true
end

#validate_driver!(driver) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/kward/plugins/chat_contract.rb', line 63

def validate_driver!(driver)
  return driver unless declared?

  missing = %i[messages submit descriptor supports_steering? assistant_label].reject { |method| driver.respond_to?(method) }
  unless missing.empty?
    raise ArgumentError, "Plugin chat driver is missing required methods: #{missing.join(', ')}"
  end
  if driver.supports_steering? != steering?
    raise ArgumentError, "Plugin chat steering capability does not match driver.supports_steering?"
  end
  if transcript_paging? && !driver.respond_to?(:transcript_page)
    raise ArgumentError, "Plugin chat declares transcript paging but driver does not implement transcript_page"
  end

  driver
end