riffer 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 55bd24093ac1af4a33163b95afc320f2f3326bf6105b8e55253e78bd0763551d
4
- data.tar.gz: dc70e95bb46d2a7b51840299a2da6a4f79a27421791a06d18255c655afcd4cfe
3
+ metadata.gz: 4097cc002e3ac3c06c0e354fddd33de5c5fb7b51ed53c6080478de972125b8b7
4
+ data.tar.gz: eed8cf5ed60830b206e00ef62640aa691aa9b32140c2ec5852b69d39fb775e5f
5
5
  SHA512:
6
- metadata.gz: 992ab0a333cedb5107bc90fcf00f0d48151ea4cb09ceadb455dd80c95d06fd00ba6e005405b844f2857619f3a549dd0c8ff82939ea764db0b280fa22643f8511
7
- data.tar.gz: 2de5d6c8add2a20442cf38d6d216384379fa270f115bc92cf81fa0ded554573de5a513694845615365fdb041308a8c2d830ab47044fbddf30e741c42107681c1
6
+ metadata.gz: f6d511f5de22e4a04521ac1c12e26aa7f508a6b0c2649e124447995c64a4b3d66a9a6cace08869db7f66c129bb38aa1f169fde5c42e3a6b8612be07b81e320d7
7
+ data.tar.gz: 03c5075c171920a16245b73ab1925a4013f029d5aabe686fdd3a904886c8113837c11a8584f4b1243517c7935f1ae8216882101d63803c1ad25c209353a64612
@@ -40,7 +40,7 @@ Adapters for LLM APIs. The base class uses a template-method pattern — `genera
40
40
 
41
41
  Providers are registered in `Riffer::Providers::Repository::REPO` with identifiers (e.g., `openai`, `amazon_bedrock`).
42
42
 
43
- Each provider declares a preferred skill adapter via `self.skills_adapter` (Markdown for most, XML for Anthropic).
43
+ Each provider declares a preferred skill adapter via `self.skills_adapter(model = nil)`. Default is Markdown; Anthropic returns XML; Amazon Bedrock returns XML when the model identifier matches an Anthropic model (e.g. `anthropic.claude-…` or `us.anthropic.claude-…`); Mock returns XML when the model name contains `claude`. The agent passes the resolved model identifier so proxy providers (Bedrock, Mock) can pick the right adapter without per-agent overrides.
44
44
 
45
45
  ### Skills (`lib/riffer/skills/`)
46
46
 
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "0.25.0"
2
+ ".": "0.26.0"
3
3
  }
data/CHANGELOG.md CHANGED
@@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.26.0](https://github.com/janeapp/riffer/compare/riffer/v0.25.0...riffer/v0.26.0) (2026-04-29)
9
+
10
+
11
+ ### Features
12
+
13
+ * model-aware skills adapter selection ([#232](https://github.com/janeapp/riffer/issues/232)) ([74a5323](https://github.com/janeapp/riffer/commit/74a5323945f3f6f30538d472400cc5fe27b588da))
14
+
8
15
  ## [0.25.0](https://github.com/janeapp/riffer/compare/riffer/v0.24.2...riffer/v0.25.0) (2026-04-29)
9
16
 
10
17
 
data/docs/13_SKILLS.md CHANGED
@@ -70,7 +70,7 @@ end
70
70
 
71
71
  ### Custom Adapter
72
72
 
73
- The adapter controls how the skill catalog is rendered in the system prompt and which tool the LLM calls to activate a skill. The adapter is auto-selected by provider (Markdown for most, XML for Anthropic). Override with:
73
+ The adapter controls how the skill catalog is rendered in the system prompt and which tool the LLM calls to activate a skill. The adapter is auto-selected by provider, with model-aware fallback for proxy providers — Markdown for most providers, XML for Anthropic, and XML for Anthropic models routed through Amazon Bedrock (e.g. `us.anthropic.claude-sonnet-4-6`). Override with:
74
74
 
75
75
  ```ruby
76
76
  skills do
data/lib/riffer/agent.rb CHANGED
@@ -799,7 +799,7 @@ class Riffer::Agent
799
799
  return nil if skills_list.empty?
800
800
 
801
801
  skills = skills_list.to_h { |s| [s.name, s] }
802
- adapter_class = self.class.skills.adapter || provider_class.skills_adapter
802
+ adapter_class = self.class.skills.adapter || provider_class.skills_adapter(@model_name)
803
803
  skill_activate_tool_class = self.class.skills.activate_tool || Riffer.config.skills.default_activate_tool
804
804
 
805
805
  skills_context = Riffer::Skills::Context.new(
@@ -9,6 +9,24 @@ require "base64"
9
9
  #
10
10
  # See https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/BedrockRuntime/Client.html
11
11
  class Riffer::Providers::AmazonBedrock < Riffer::Providers::Base
12
+ # Matches Anthropic models on Bedrock: bare ids like
13
+ # +anthropic.claude-3-5-sonnet-20241022-v2:0+ and cross-region prefixed
14
+ # ids like +us.anthropic.claude-sonnet-4-6+.
15
+ ANTHROPIC_MODEL_PATTERN = /(?:^|\.)anthropic\./ #: Regexp
16
+
17
+ # Returns the preferred skill adapter for the given Bedrock model.
18
+ #
19
+ # Bedrock hosts models from multiple vendors. Anthropic models prefer
20
+ # XML-rendered catalogs; everything else falls back to the default
21
+ # Markdown adapter.
22
+ #
23
+ #--
24
+ #: (?String?) -> singleton(Riffer::Skills::Adapter)
25
+ def self.skills_adapter(model = nil)
26
+ return Riffer::Skills::XmlAdapter if model && ANTHROPIC_MODEL_PATTERN.match?(model)
27
+ Riffer::Skills::MarkdownAdapter
28
+ end
29
+
12
30
  # Initializes the Amazon Bedrock provider.
13
31
  #
14
32
  #--
@@ -12,8 +12,8 @@ class Riffer::Providers::Anthropic < Riffer::Providers::Base
12
12
  # Returns the XML skill adapter for Anthropic/Claude.
13
13
  #
14
14
  #--
15
- #: () -> singleton(Riffer::Skills::Adapter)
16
- def self.skills_adapter
15
+ #: (?String?) -> singleton(Riffer::Skills::Adapter)
16
+ def self.skills_adapter(model = nil)
17
17
  Riffer::Skills::XmlAdapter
18
18
  end
19
19
 
@@ -24,11 +24,15 @@ class Riffer::Providers::Base
24
24
 
25
25
  # Returns the preferred skill adapter for this provider.
26
26
  #
27
- # Override in subclasses for provider-specific formats.
27
+ # Override in subclasses for provider-specific formats. Subclasses may
28
+ # introspect +model+ (the resolved model identifier, e.g. the part after
29
+ # +provider/+) to pick an adapter that matches the underlying model
30
+ # family — useful for proxy providers like Amazon Bedrock that host
31
+ # models from multiple vendors.
28
32
  #
29
33
  #--
30
- #: () -> singleton(Riffer::Skills::Adapter)
31
- def self.skills_adapter
34
+ #: (?String?) -> singleton(Riffer::Skills::Adapter)
35
+ def self.skills_adapter(model = nil)
32
36
  Riffer::Skills::MarkdownAdapter
33
37
  end
34
38
 
@@ -5,6 +5,21 @@
5
5
  #
6
6
  # No external gems required.
7
7
  class Riffer::Providers::Mock < Riffer::Providers::Base
8
+ # Returns the preferred skill adapter for the given mock model.
9
+ #
10
+ # Mock is used to stand in for any real provider in tests, so the model
11
+ # string itself is the only signal we have. When the model name contains
12
+ # +claude+ (e.g. +mock/claude-sonnet-4-6+), pick the XML adapter to
13
+ # mirror what a real Claude-backed provider would do; otherwise fall
14
+ # back to Markdown.
15
+ #
16
+ #--
17
+ #: (?String?) -> singleton(Riffer::Skills::Adapter)
18
+ def self.skills_adapter(model = nil)
19
+ return Riffer::Skills::XmlAdapter if model&.include?("claude")
20
+ Riffer::Skills::MarkdownAdapter
21
+ end
22
+
8
23
  # Array of recorded method calls for assertions.
9
24
  attr_reader :calls #: Array[Hash[Symbol, untyped]]
10
25
 
@@ -2,5 +2,5 @@
2
2
  # rbs_inline: enabled
3
3
 
4
4
  module Riffer
5
- VERSION = "0.25.0" #: String
5
+ VERSION = "0.26.0" #: String
6
6
  end
@@ -6,6 +6,21 @@
6
6
  #
7
7
  # See https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/BedrockRuntime/Client.html
8
8
  class Riffer::Providers::AmazonBedrock < Riffer::Providers::Base
9
+ # Matches Anthropic models on Bedrock: bare ids like
10
+ # +anthropic.claude-3-5-sonnet-20241022-v2:0+ and cross-region prefixed
11
+ # ids like +us.anthropic.claude-sonnet-4-6+.
12
+ ANTHROPIC_MODEL_PATTERN: Regexp
13
+
14
+ # Returns the preferred skill adapter for the given Bedrock model.
15
+ #
16
+ # Bedrock hosts models from multiple vendors. Anthropic models prefer
17
+ # XML-rendered catalogs; everything else falls back to the default
18
+ # Markdown adapter.
19
+ #
20
+ # --
21
+ # : (?String?) -> singleton(Riffer::Skills::Adapter)
22
+ def self.skills_adapter: (?String?) -> singleton(Riffer::Skills::Adapter)
23
+
9
24
  # Initializes the Amazon Bedrock provider.
10
25
  #
11
26
  # --
@@ -11,8 +11,8 @@ class Riffer::Providers::Anthropic < Riffer::Providers::Base
11
11
  # Returns the XML skill adapter for Anthropic/Claude.
12
12
  #
13
13
  # --
14
- # : () -> singleton(Riffer::Skills::Adapter)
15
- def self.skills_adapter: () -> singleton(Riffer::Skills::Adapter)
14
+ # : (?String?) -> singleton(Riffer::Skills::Adapter)
15
+ def self.skills_adapter: (?String?) -> singleton(Riffer::Skills::Adapter)
16
16
 
17
17
  # Initializes the Anthropic provider.
18
18
  #
@@ -22,11 +22,15 @@ class Riffer::Providers::Base
22
22
 
23
23
  # Returns the preferred skill adapter for this provider.
24
24
  #
25
- # Override in subclasses for provider-specific formats.
25
+ # Override in subclasses for provider-specific formats. Subclasses may
26
+ # introspect +model+ (the resolved model identifier, e.g. the part after
27
+ # +provider/+) to pick an adapter that matches the underlying model
28
+ # family — useful for proxy providers like Amazon Bedrock that host
29
+ # models from multiple vendors.
26
30
  #
27
31
  # --
28
- # : () -> singleton(Riffer::Skills::Adapter)
29
- def self.skills_adapter: () -> singleton(Riffer::Skills::Adapter)
32
+ # : (?String?) -> singleton(Riffer::Skills::Adapter)
33
+ def self.skills_adapter: (?String?) -> singleton(Riffer::Skills::Adapter)
30
34
 
31
35
  # Generates text using the provider.
32
36
  #
@@ -4,6 +4,18 @@
4
4
  #
5
5
  # No external gems required.
6
6
  class Riffer::Providers::Mock < Riffer::Providers::Base
7
+ # Returns the preferred skill adapter for the given mock model.
8
+ #
9
+ # Mock is used to stand in for any real provider in tests, so the model
10
+ # string itself is the only signal we have. When the model name contains
11
+ # +claude+ (e.g. +mock/claude-sonnet-4-6+), pick the XML adapter to
12
+ # mirror what a real Claude-backed provider would do; otherwise fall
13
+ # back to Markdown.
14
+ #
15
+ # --
16
+ # : (?String?) -> singleton(Riffer::Skills::Adapter)
17
+ def self.skills_adapter: (?String?) -> singleton(Riffer::Skills::Adapter)
18
+
7
19
  # Array of recorded method calls for assertions.
8
20
  attr_reader calls: Array[Hash[Symbol, untyped]]
9
21
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riffer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.25.0
4
+ version: 0.26.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jake Bottrall