Module: AgentHarness::Extensions::Compatibility

Defined in:
lib/agent_harness/extensions.rb

Constant Summary collapse

HARNESS_CAPABILITIES =
{
  message_hooks: true,
  response_hooks: true,
  system_prompt_additions: true
}.freeze

Class Method Summary collapse

Class Method Details

.capability_supported?(provider, capability) ⇒ Boolean

Returns:

  • (Boolean)


157
158
159
160
161
162
163
164
165
166
167
168
# File 'lib/agent_harness/extensions.rb', line 157

def capability_supported?(provider, capability)
  return HARNESS_CAPABILITIES.fetch(capability) if HARNESS_CAPABILITIES.key?(capability)

  case capability
  when :chat
    provider.supports_chat?
  when :text_mode
    provider.supports_text_mode?
  else
    !!provider.capabilities[capability]
  end
end

.check!(provider:, extension:, strict: true) ⇒ Object



143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/agent_harness/extensions.rb', line 143

def check!(provider:, extension:, strict: true)
  compatibility = report(provider: provider, extension: extension)
  return compatibility if compatibility.compatible?
  return compatibility unless strict

  raise ExtensionCompatibilityError.new(
    "Extension '#{extension.name}' is not compatible with provider '#{provider.class.provider_name}': " \
    "missing provider capabilities: #{compatibility.missing_provider_capabilities.inspect}",
    provider: provider.class.provider_name,
    extension: extension.name,
    report: compatibility.to_h
  )
end

.report(provider:, extension:) ⇒ Object



130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/agent_harness/extensions.rb', line 130

def report(provider:, extension:)
  required = Array(extension.required_provider_capabilities).map(&:to_sym)
  missing = required.reject { |capability| capability_supported?(provider, capability) }
  unsupported = Array(extension.unsupported_features).map(&:to_sym)

  CompatibilityReport.new(
    extension: extension,
    provider: provider,
    missing_provider_capabilities: missing,
    unsupported_features: unsupported
  )
end