riffer 0.48.0 → 0.49.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 +4 -4
- data/.claude/rules/comments.md +2 -4
- data/.claude/rules/rbs-inline.md +2 -12
- data/.release-please-manifest.json +1 -1
- data/.rubocop.yml +5 -0
- data/CHANGELOG.md +19 -0
- data/docs/AGENTS.md +3 -5
- data/docs/AGENT_LIFECYCLE.md +13 -16
- data/docs/CONFIGURATION.md +22 -33
- data/docs/TOOL_ADVANCED.md +1 -3
- data/docs/TRACING.md +1 -1
- data/docs/providers/AMAZON_BEDROCK.md +31 -0
- data/docs/providers/OPENROUTER.md +18 -1
- data/docs-site/build.rb +0 -6
- data/docs-site/check.rb +1 -5
- data/lib/riffer/agent/config.rb +4 -45
- data/lib/riffer/agent/context.rb +2 -26
- data/lib/riffer/agent/outcome.rb +0 -20
- data/lib/riffer/agent/response.rb +0 -38
- data/lib/riffer/agent/run.rb +11 -43
- data/lib/riffer/agent/serializer.rb +10 -39
- data/lib/riffer/agent/session/repair.rb +3 -15
- data/lib/riffer/agent/session.rb +25 -38
- data/lib/riffer/agent/structured_output/result.rb +0 -8
- data/lib/riffer/agent/structured_output.rb +0 -7
- data/lib/riffer/agent.rb +10 -130
- data/lib/riffer/config/amazon_bedrock.rb +30 -0
- data/lib/riffer/config/anthropic.rb +21 -0
- data/lib/riffer/config/azure_open_ai.rb +30 -0
- data/lib/riffer/config/evals.rb +18 -0
- data/lib/riffer/config/files.rb +61 -0
- data/lib/riffer/config/gemini.rb +21 -0
- data/lib/riffer/config/mcp.rb +31 -0
- data/lib/riffer/config/open_ai.rb +30 -0
- data/lib/riffer/config/open_router.rb +21 -0
- data/lib/riffer/config/pricing/rates.rb +36 -0
- data/lib/riffer/config/pricing.rb +64 -0
- data/lib/riffer/config/skills.rb +38 -0
- data/lib/riffer/config/tracing.rb +43 -0
- data/lib/riffer/config.rb +3 -362
- data/lib/riffer/evals/evaluator.rb +1 -29
- data/lib/riffer/evals/evaluator_runner.rb +0 -15
- data/lib/riffer/evals/judge.rb +0 -8
- data/lib/riffer/evals/result.rb +1 -11
- data/lib/riffer/evals/run_result.rb +0 -12
- data/lib/riffer/evals/scenario_result.rb +0 -19
- data/lib/riffer/files/downloader.rb +2 -3
- data/lib/riffer/files/resolver.rb +2 -7
- data/lib/riffer/guardrail.rb +2 -22
- data/lib/riffer/guardrails/modification.rb +0 -8
- data/lib/riffer/guardrails/result.rb +0 -17
- data/lib/riffer/guardrails/runner.rb +2 -11
- data/lib/riffer/guardrails/tripwire.rb +0 -8
- data/lib/riffer/guardrails.rb +0 -2
- data/lib/riffer/helpers/boolean.rb +0 -4
- data/lib/riffer/helpers/call_or_value.rb +0 -3
- data/lib/riffer/helpers/deep_dup.rb +3 -8
- data/lib/riffer/helpers/dependencies.rb +0 -4
- data/lib/riffer/helpers/identifier.rb +3 -12
- data/lib/riffer/helpers/validate.rb +42 -0
- data/lib/riffer/mcp/authenticated_tool.rb +4 -12
- data/lib/riffer/mcp/client.rb +0 -7
- data/lib/riffer/mcp/manifest.rb +3 -7
- data/lib/riffer/mcp/registration.rb +0 -10
- data/lib/riffer/mcp/registry.rb +0 -9
- data/lib/riffer/mcp/search_tool.rb +0 -4
- data/lib/riffer/mcp/tool.rb +1 -4
- data/lib/riffer/mcp/tool_factory.rb +3 -6
- data/lib/riffer/mcp.rb +2 -23
- data/lib/riffer/messages/assistant/reasoning_part.rb +4 -21
- data/lib/riffer/messages/assistant/tool_call.rb +1 -9
- data/lib/riffer/messages/assistant.rb +1 -21
- data/lib/riffer/messages/base.rb +0 -12
- data/lib/riffer/messages/system.rb +0 -3
- data/lib/riffer/messages/tool.rb +0 -15
- data/lib/riffer/messages/user/file_part.rb +2 -30
- data/lib/riffer/messages/user.rb +0 -4
- data/lib/riffer/params/boolean.rb +1 -5
- data/lib/riffer/params/param.rb +3 -31
- data/lib/riffer/params.rb +8 -41
- data/lib/riffer/providers/amazon_bedrock.rb +101 -42
- data/lib/riffer/providers/anthropic.rb +9 -24
- data/lib/riffer/providers/azure_open_ai.rb +3 -8
- data/lib/riffer/providers/base.rb +7 -28
- data/lib/riffer/providers/finish_reason.rb +0 -6
- data/lib/riffer/providers/gemini/client.rb +4 -17
- data/lib/riffer/providers/gemini.rb +4 -10
- data/lib/riffer/providers/mock.rb +1 -26
- data/lib/riffer/providers/open_ai.rb +7 -17
- data/lib/riffer/providers/open_router.rb +105 -30
- data/lib/riffer/providers/repository.rb +2 -14
- data/lib/riffer/providers/token_usage.rb +5 -14
- data/lib/riffer/registrable.rb +11 -45
- data/lib/riffer/runner/fibers.rb +1 -6
- data/lib/riffer/runner/sequential.rb +0 -1
- data/lib/riffer/runner/threaded.rb +0 -3
- data/lib/riffer/runner.rb +0 -3
- data/lib/riffer/skills/activate_tool.rb +0 -3
- data/lib/riffer/skills/adapter.rb +0 -8
- data/lib/riffer/skills/backend.rb +2 -7
- data/lib/riffer/skills/config.rb +4 -20
- data/lib/riffer/skills/context.rb +0 -29
- data/lib/riffer/skills/filesystem_backend.rb +0 -7
- data/lib/riffer/skills/frontmatter.rb +2 -16
- data/lib/riffer/skills/markdown_adapter.rb +3 -6
- data/lib/riffer/skills/xml_adapter.rb +0 -3
- data/lib/riffer/stream_events/base.rb +0 -3
- data/lib/riffer/stream_events/finish_reason_done.rb +1 -6
- data/lib/riffer/stream_events/guardrail_modification.rb +0 -10
- data/lib/riffer/stream_events/guardrail_tripwire.rb +0 -10
- data/lib/riffer/stream_events/interrupt.rb +2 -12
- data/lib/riffer/stream_events/reasoning_delta.rb +0 -3
- data/lib/riffer/stream_events/reasoning_done.rb +1 -5
- data/lib/riffer/stream_events/skill_activation.rb +0 -3
- data/lib/riffer/stream_events/text_delta.rb +0 -2
- data/lib/riffer/stream_events/text_done.rb +0 -2
- data/lib/riffer/stream_events/token_usage_done.rb +0 -2
- data/lib/riffer/stream_events/tool_call_delta.rb +1 -5
- data/lib/riffer/stream_events/tool_call_done.rb +0 -5
- data/lib/riffer/stream_events/web_search_done.rb +0 -3
- data/lib/riffer/stream_events/web_search_status.rb +1 -5
- data/lib/riffer/testing/minitest.rb +4 -5
- data/lib/riffer/testing.rb +5 -38
- data/lib/riffer/tool.rb +2 -28
- data/lib/riffer/tools/response.rb +3 -32
- data/lib/riffer/tools/runtime/fibers.rb +0 -6
- data/lib/riffer/tools/runtime/inline.rb +0 -1
- data/lib/riffer/tools/runtime/threaded.rb +0 -6
- data/lib/riffer/tools/runtime.rb +5 -26
- data/lib/riffer/tools/toolable.rb +0 -37
- data/lib/riffer/tracing/capture.rb +3 -5
- data/lib/riffer/tracing/no_op.rb +0 -7
- data/lib/riffer/tracing/otel.rb +7 -16
- data/lib/riffer/tracing/stream_recorder.rb +0 -7
- data/lib/riffer/tracing.rb +4 -27
- data/lib/riffer/version.rb +1 -1
- data/lib/riffer.rb +2 -30
- data/sig/generated/riffer/agent/config.rbs +12 -48
- data/sig/generated/riffer/agent/context.rbs +2 -26
- data/sig/generated/riffer/agent/outcome.rbs +0 -20
- data/sig/generated/riffer/agent/response.rbs +1 -29
- data/sig/generated/riffer/agent/run.rbs +1 -27
- data/sig/generated/riffer/agent/serializer.rbs +2 -27
- data/sig/generated/riffer/agent/session/repair.rbs +2 -10
- data/sig/generated/riffer/agent/session.rbs +10 -36
- data/sig/generated/riffer/agent/structured_output/result.rbs +0 -7
- data/sig/generated/riffer/agent/structured_output.rbs +0 -7
- data/sig/generated/riffer/agent.rbs +5 -121
- data/sig/generated/riffer/config/amazon_bedrock.rbs +21 -0
- data/sig/generated/riffer/config/anthropic.rbs +15 -0
- data/sig/generated/riffer/config/azure_open_ai.rbs +21 -0
- data/sig/generated/riffer/config/evals.rbs +13 -0
- data/sig/generated/riffer/config/files.rbs +43 -0
- data/sig/generated/riffer/config/gemini.rbs +15 -0
- data/sig/generated/riffer/config/mcp.rbs +19 -0
- data/sig/generated/riffer/config/open_ai.rbs +21 -0
- data/sig/generated/riffer/config/open_router.rbs +15 -0
- data/sig/generated/riffer/config/pricing/rates.rbs +19 -0
- data/sig/generated/riffer/config/pricing.rbs +31 -0
- data/sig/generated/riffer/config/skills.rbs +19 -0
- data/sig/generated/riffer/config/tracing.rbs +25 -0
- data/sig/generated/riffer/config.rbs +2 -307
- data/sig/generated/riffer/evals/evaluator.rbs +0 -28
- data/sig/generated/riffer/evals/evaluator_runner.rbs +0 -14
- data/sig/generated/riffer/evals/judge.rbs +0 -7
- data/sig/generated/riffer/evals/result.rbs +1 -11
- data/sig/generated/riffer/evals/run_result.rbs +0 -12
- data/sig/generated/riffer/evals/scenario_result.rbs +0 -14
- data/sig/generated/riffer/files/resolver.rbs +0 -7
- data/sig/generated/riffer/guardrail.rbs +2 -22
- data/sig/generated/riffer/guardrails/modification.rbs +0 -6
- data/sig/generated/riffer/guardrails/result.rbs +0 -15
- data/sig/generated/riffer/guardrails/runner.rbs +0 -11
- data/sig/generated/riffer/guardrails/tripwire.rbs +0 -8
- data/sig/generated/riffer/guardrails.rbs +0 -2
- data/sig/generated/riffer/helpers/boolean.rbs +0 -4
- data/sig/generated/riffer/helpers/call_or_value.rbs +0 -3
- data/sig/generated/riffer/helpers/deep_dup.rbs +0 -8
- data/sig/generated/riffer/helpers/dependencies.rbs +0 -4
- data/sig/generated/riffer/helpers/identifier.rbs +0 -12
- data/sig/generated/riffer/helpers/validate.rbs +21 -0
- data/sig/generated/riffer/mcp/authenticated_tool.rbs +0 -5
- data/sig/generated/riffer/mcp/client.rbs +0 -7
- data/sig/generated/riffer/mcp/manifest.rbs +3 -7
- data/sig/generated/riffer/mcp/registration.rbs +0 -10
- data/sig/generated/riffer/mcp/registry.rbs +0 -9
- data/sig/generated/riffer/mcp/search_tool.rbs +0 -4
- data/sig/generated/riffer/mcp/tool.rbs +0 -4
- data/sig/generated/riffer/mcp/tool_factory.rbs +0 -6
- data/sig/generated/riffer/mcp.rbs +2 -22
- data/sig/generated/riffer/messages/assistant/reasoning_part.rbs +4 -17
- data/sig/generated/riffer/messages/assistant/tool_call.rbs +1 -9
- data/sig/generated/riffer/messages/assistant.rbs +10 -30
- data/sig/generated/riffer/messages/base.rbs +0 -12
- data/sig/generated/riffer/messages/system.rbs +0 -3
- data/sig/generated/riffer/messages/tool.rbs +0 -12
- data/sig/generated/riffer/messages/user/file_part.rbs +0 -30
- data/sig/generated/riffer/messages/user.rbs +0 -4
- data/sig/generated/riffer/params/boolean.rbs +1 -4
- data/sig/generated/riffer/params/param.rbs +0 -31
- data/sig/generated/riffer/params.rbs +4 -40
- data/sig/generated/riffer/providers/amazon_bedrock.rbs +29 -25
- data/sig/generated/riffer/providers/anthropic.rbs +0 -10
- data/sig/generated/riffer/providers/azure_open_ai.rbs +0 -8
- data/sig/generated/riffer/providers/base.rbs +0 -28
- data/sig/generated/riffer/providers/finish_reason.rbs +0 -6
- data/sig/generated/riffer/providers/gemini/client.rbs +4 -17
- data/sig/generated/riffer/providers/gemini.rbs +0 -6
- data/sig/generated/riffer/providers/mock.rbs +0 -26
- data/sig/generated/riffer/providers/open_ai.rbs +2 -9
- data/sig/generated/riffer/providers/open_router.rbs +33 -14
- data/sig/generated/riffer/providers/repository.rbs +2 -14
- data/sig/generated/riffer/providers/token_usage.rbs +5 -14
- data/sig/generated/riffer/registrable.rbs +0 -45
- data/sig/generated/riffer/runner/fibers.rbs +0 -6
- data/sig/generated/riffer/runner/sequential.rbs +0 -1
- data/sig/generated/riffer/runner/threaded.rbs +0 -3
- data/sig/generated/riffer/runner.rbs +0 -3
- data/sig/generated/riffer/skills/activate_tool.rbs +0 -3
- data/sig/generated/riffer/skills/adapter.rbs +0 -8
- data/sig/generated/riffer/skills/backend.rbs +2 -7
- data/sig/generated/riffer/skills/config.rbs +0 -20
- data/sig/generated/riffer/skills/context.rbs +0 -29
- data/sig/generated/riffer/skills/filesystem_backend.rbs +0 -7
- data/sig/generated/riffer/skills/frontmatter.rbs +2 -16
- data/sig/generated/riffer/skills/markdown_adapter.rbs +0 -6
- data/sig/generated/riffer/skills/xml_adapter.rbs +0 -3
- data/sig/generated/riffer/stream_events/base.rbs +0 -3
- data/sig/generated/riffer/stream_events/finish_reason_done.rbs +1 -6
- data/sig/generated/riffer/stream_events/guardrail_modification.rbs +0 -10
- data/sig/generated/riffer/stream_events/guardrail_tripwire.rbs +0 -10
- data/sig/generated/riffer/stream_events/interrupt.rbs +2 -10
- data/sig/generated/riffer/stream_events/reasoning_delta.rbs +0 -3
- data/sig/generated/riffer/stream_events/reasoning_done.rbs +1 -5
- data/sig/generated/riffer/stream_events/skill_activation.rbs +0 -3
- data/sig/generated/riffer/stream_events/text_delta.rbs +0 -2
- data/sig/generated/riffer/stream_events/text_done.rbs +0 -2
- data/sig/generated/riffer/stream_events/token_usage_done.rbs +0 -2
- data/sig/generated/riffer/stream_events/tool_call_delta.rbs +1 -5
- data/sig/generated/riffer/stream_events/tool_call_done.rbs +0 -5
- data/sig/generated/riffer/stream_events/web_search_done.rbs +0 -3
- data/sig/generated/riffer/stream_events/web_search_status.rbs +1 -5
- data/sig/generated/riffer/testing.rbs +0 -38
- data/sig/generated/riffer/tool.rbs +0 -27
- data/sig/generated/riffer/tools/response.rbs +3 -29
- data/sig/generated/riffer/tools/runtime/fibers.rbs +0 -5
- data/sig/generated/riffer/tools/runtime/inline.rbs +0 -1
- data/sig/generated/riffer/tools/runtime/threaded.rbs +0 -5
- data/sig/generated/riffer/tools/runtime.rbs +2 -24
- data/sig/generated/riffer/tools/toolable.rbs +0 -37
- data/sig/generated/riffer/tracing/capture.rbs +2 -5
- data/sig/generated/riffer/tracing/no_op.rbs +0 -7
- data/sig/generated/riffer/tracing/otel.rbs +7 -16
- data/sig/generated/riffer/tracing/stream_recorder.rbs +0 -2
- data/sig/generated/riffer/tracing.rbs +4 -23
- data/sig/generated/riffer.rbs +2 -29
- data/sig/manual/riffer/helpers/validate.rbs +5 -0
- metadata +30 -1
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
# Generated from lib/riffer/providers/finish_reason.rb with RBS::Inline
|
|
2
2
|
|
|
3
|
-
# Normalized reason an LLM call finished, paired with the provider's raw
|
|
4
|
-
# wire value. +reason+ carries the same meaning for every provider.
|
|
5
3
|
class Riffer::Providers::FinishReason
|
|
6
|
-
# The normalized vocabulary every provider maps into.
|
|
7
4
|
VALUES: Array[Symbol]
|
|
8
5
|
|
|
9
|
-
# The normalized reason.
|
|
10
6
|
attr_reader reason: Symbol
|
|
11
7
|
|
|
12
|
-
# The provider's raw finish-reason value, when one exists on the wire.
|
|
13
8
|
attr_reader raw: String?
|
|
14
9
|
|
|
15
|
-
# Raises Riffer::ArgumentError when +reason+ is outside VALUES.
|
|
16
10
|
# --
|
|
17
11
|
# : (reason: Symbol, ?raw: String?) -> void
|
|
18
12
|
def initialize: (reason: Symbol, ?raw: String?) -> void
|
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
# Generated from lib/riffer/providers/gemini/client.rb with RBS::Inline
|
|
2
2
|
|
|
3
|
-
#
|
|
4
|
-
#
|
|
5
|
-
# and assign it to <tt>Riffer.config.gemini.client</tt>. Any object
|
|
6
|
-
# implementing +post+ and +post_stream+ with these contracts works there —
|
|
7
|
-
# the class is a default implementation, not a required base.
|
|
8
|
-
#
|
|
9
|
-
# Riffer.configure do |config|
|
|
10
|
-
# config.gemini.client = Riffer::Providers::Gemini::Client.new(
|
|
11
|
-
# api_key: ENV["GEMINI_API_KEY"],
|
|
12
|
-
# read_timeout: 120
|
|
13
|
-
# )
|
|
14
|
-
# end
|
|
3
|
+
# <tt>Riffer.config.gemini.client</tt> accepts any object implementing +post+ and +post_stream+
|
|
4
|
+
# with these contracts; this class is the default, not a required base.
|
|
15
5
|
class Riffer::Providers::Gemini::Client
|
|
16
6
|
@proxy_port: Integer?
|
|
17
7
|
|
|
@@ -36,15 +26,12 @@ class Riffer::Providers::Gemini::Client
|
|
|
36
26
|
# : (?api_key: String?, ?base_url: String, ?open_timeout: Integer, ?read_timeout: Integer, ?write_timeout: Integer?, ?proxy_address: String?, ?proxy_port: Integer?) -> void
|
|
37
27
|
def initialize: (?api_key: String?, ?base_url: String, ?open_timeout: Integer, ?read_timeout: Integer, ?write_timeout: Integer?, ?proxy_address: String?, ?proxy_port: Integer?) -> void
|
|
38
28
|
|
|
39
|
-
#
|
|
40
|
-
# Raises Riffer::Error when the API responds with a non-success status.
|
|
29
|
+
# Raises Riffer::Error on a non-success status.
|
|
41
30
|
# --
|
|
42
31
|
# : (String, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
|
|
43
32
|
def post: (String, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
|
|
44
33
|
|
|
45
|
-
#
|
|
46
|
-
# they arrive. Raises Riffer::Error when the API responds with a
|
|
47
|
-
# non-success status.
|
|
34
|
+
# Raises Riffer::Error on a non-success status.
|
|
48
35
|
# --
|
|
49
36
|
# : (String, Hash[Symbol, untyped]) { (String) -> void } -> void
|
|
50
37
|
def post_stream: (String, Hash[Symbol, untyped]) { (String) -> void } -> void
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
# Generated from lib/riffer/providers/gemini.rb with RBS::Inline
|
|
2
2
|
|
|
3
|
-
# Google Gemini provider for Gemini models via the Gemini REST API.
|
|
4
3
|
class Riffer::Providers::Gemini < Riffer::Providers::Base
|
|
5
4
|
VALID_MODEL_PATTERN: Regexp
|
|
6
5
|
|
|
7
6
|
FINISH_REASONS: Hash[String, Symbol]
|
|
8
7
|
|
|
9
|
-
# The GenAI semconv well-known provider name.
|
|
10
8
|
# --
|
|
11
9
|
# : () -> String
|
|
12
10
|
def self.semconv_provider_name: () -> String
|
|
@@ -49,14 +47,10 @@ class Riffer::Providers::Gemini < Riffer::Providers::Base
|
|
|
49
47
|
# : (Hash[Symbol, untyped]) -> Riffer::Providers::FinishReason?
|
|
50
48
|
def extract_finish_reason: (Hash[Symbol, untyped]) -> Riffer::Providers::FinishReason?
|
|
51
49
|
|
|
52
|
-
# Gemini reports STOP even when the candidate carries functionCall parts,
|
|
53
|
-
# so tool-call presence overrides the raw value.
|
|
54
50
|
# --
|
|
55
51
|
# : (String?, tool_calls: bool) -> Riffer::Providers::FinishReason?
|
|
56
52
|
def build_finish_reason: (String?, tool_calls: bool) -> Riffer::Providers::FinishReason?
|
|
57
53
|
|
|
58
|
-
# Gemini reports thinking tokens outside +candidatesTokenCount+;
|
|
59
|
-
# TokenUsage's output includes them.
|
|
60
54
|
# --
|
|
61
55
|
# : (Hash[Symbol, untyped]) -> Riffer::Providers::TokenUsage
|
|
62
56
|
def build_token_usage: (Hash[Symbol, untyped]) -> Riffer::Providers::TokenUsage
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# Generated from lib/riffer/providers/mock.rb with RBS::Inline
|
|
2
2
|
|
|
3
|
-
# Mock provider for mocking LLM responses in tests; no external gems required.
|
|
4
3
|
class Riffer::Providers::Mock < Riffer::Providers::Base
|
|
5
4
|
@stubbed_responses: Array[Hash[Symbol, untyped]]
|
|
6
5
|
|
|
@@ -8,49 +7,24 @@ class Riffer::Providers::Mock < Riffer::Providers::Base
|
|
|
8
7
|
|
|
9
8
|
@responses: Array[Hash[Symbol, untyped]]
|
|
10
9
|
|
|
11
|
-
# Returns the skill adapter for the mock model — XML when the model name
|
|
12
|
-
# contains +claude+ (mirroring a real Claude provider), else Markdown.
|
|
13
10
|
# --
|
|
14
11
|
# : (?String?) -> singleton(Riffer::Skills::Adapter)
|
|
15
12
|
def self.skills_adapter: (?String?) -> singleton(Riffer::Skills::Adapter)
|
|
16
13
|
|
|
17
|
-
# The GenAI semconv well-known provider name.
|
|
18
14
|
# --
|
|
19
15
|
# : () -> String
|
|
20
16
|
def self.semconv_provider_name: () -> String
|
|
21
17
|
|
|
22
|
-
# Array of recorded method calls for assertions.
|
|
23
18
|
attr_reader calls: Array[Hash[Symbol, untyped]]
|
|
24
19
|
|
|
25
|
-
# +responses:+ pre-configures canned responses (same shape as
|
|
26
|
-
# +#stub_response+) for standalone use; agent tests queue responses on
|
|
27
|
-
# <tt>agent.provider</tt> via +#stub_response+ instead.
|
|
28
|
-
#
|
|
29
|
-
# Riffer::Providers::Mock.new(responses: [
|
|
30
|
-
# {content: "", tool_calls: [{name: "tool_a", arguments: "{}"}]},
|
|
31
|
-
# {content: "Final answer"}
|
|
32
|
-
# ])
|
|
33
|
-
#
|
|
34
20
|
# --
|
|
35
21
|
# : (?responses: Array[Hash[Symbol, untyped]]) -> void
|
|
36
22
|
def initialize: (?responses: Array[Hash[Symbol, untyped]]) -> void
|
|
37
23
|
|
|
38
|
-
# Stubs the next response; call repeatedly to queue several. +finish_reason+
|
|
39
|
-
# defaults to +:tool_calls+ when tool calls are present, else +:stop+.
|
|
40
|
-
#
|
|
41
|
-
# provider.stub_response("Hello")
|
|
42
|
-
# provider.stub_response("", tool_calls: [{name: "my_tool", arguments: '{"key":"value"}'}])
|
|
43
|
-
# provider.stub_response("Final response",
|
|
44
|
-
# token_usage: Riffer::Providers::TokenUsage.new(input_tokens: 10, output_tokens: 5))
|
|
45
|
-
# provider.stub_response("Truncated...", finish_reason: :length)
|
|
46
|
-
# provider.stub_response("Answer", reasoning: [{type: :text, text: "Thinking...", format: "mock-v1"}])
|
|
47
|
-
#
|
|
48
24
|
# --
|
|
49
25
|
# : (String, ?tool_calls: Array[Hash[Symbol, untyped]], ?token_usage: Riffer::Providers::TokenUsage?, ?finish_reason: Symbol?, ?reasoning: Array[Hash[Symbol, untyped] | Riffer::Messages::Assistant::ReasoningPart]) -> void
|
|
50
26
|
def stub_response: (String, ?tool_calls: Array[Hash[Symbol, untyped]], ?token_usage: Riffer::Providers::TokenUsage?, ?finish_reason: Symbol?, ?reasoning: Array[Hash[Symbol, untyped] | Riffer::Messages::Assistant::ReasoningPart]) -> void
|
|
51
27
|
|
|
52
|
-
# Clears all stubbed responses.
|
|
53
|
-
#
|
|
54
28
|
# --
|
|
55
29
|
# : () -> void
|
|
56
30
|
def clear_stubs: () -> void
|
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
# Generated from lib/riffer/providers/open_ai.rb with RBS::Inline
|
|
2
2
|
|
|
3
|
-
# OpenAI provider for GPT models. Requires the +openai+ gem.
|
|
4
3
|
class Riffer::Providers::OpenAI < Riffer::Providers::Base
|
|
5
4
|
WEB_SEARCH_TOOL_TYPE: String
|
|
6
5
|
|
|
7
|
-
# The Responses API has no finish_reason field
|
|
8
|
-
#
|
|
9
|
-
# with <tt>incomplete_details.reason</tt>, so that branch nests one level.
|
|
6
|
+
# The Responses API has no finish_reason field, and an +incomplete+ status is only meaningful
|
|
7
|
+
# together with <tt>incomplete_details.reason</tt>.
|
|
10
8
|
FINISH_REASONS: Hash[String, Symbol | Hash[String, Symbol]]
|
|
11
9
|
|
|
12
|
-
# The GenAI semconv well-known provider name.
|
|
13
10
|
# --
|
|
14
11
|
# : () -> String
|
|
15
12
|
def self.semconv_provider_name: () -> String
|
|
@@ -28,9 +25,6 @@ class Riffer::Providers::OpenAI < Riffer::Providers::Base
|
|
|
28
25
|
# : () -> untyped
|
|
29
26
|
def global_client: () -> untyped
|
|
30
27
|
|
|
31
|
-
# Compacted so an unset value stays absent: the SDK reads +OPENAI_API_KEY+ /
|
|
32
|
-
# +OPENAI_BASE_URL+ only for a missing argument, and an explicit nil would
|
|
33
|
-
# suppress that fallback.
|
|
34
28
|
# --
|
|
35
29
|
# : () -> untyped
|
|
36
30
|
def build_client: () -> untyped
|
|
@@ -59,7 +53,6 @@ class Riffer::Providers::OpenAI < Riffer::Providers::Base
|
|
|
59
53
|
# : (untyped) -> Riffer::Providers::FinishReason?
|
|
60
54
|
def build_finish_reason: (untyped) -> Riffer::Providers::FinishReason?
|
|
61
55
|
|
|
62
|
-
# The nested field that names the cause behind an ambiguous status.
|
|
63
56
|
# --
|
|
64
57
|
# : (untyped, String) -> String?
|
|
65
58
|
def finish_detail: (untyped, String) -> String?
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
# Generated from lib/riffer/providers/open_router.rb with RBS::Inline
|
|
2
2
|
|
|
3
|
-
# OpenRouter provider (https://openrouter.ai). Requires the +openai+ gem —
|
|
4
|
-
# OpenRouter exposes an OpenAI-compatible endpoint, so this reuses the OpenAI
|
|
5
|
-
# SDK with a +base_url+ override. +api_key+ resolves from config, then
|
|
6
|
-
# +OPENROUTER_API_KEY+.
|
|
7
3
|
class Riffer::Providers::OpenRouter < Riffer::Providers::Base
|
|
8
4
|
BASE_URL: String
|
|
9
5
|
|
|
10
6
|
FINISH_REASONS: Hash[String, Symbol]
|
|
11
7
|
|
|
12
|
-
|
|
8
|
+
REASONING_TYPES: Hash[String, Symbol]
|
|
9
|
+
|
|
10
|
+
# The +reasoning_details+ formats OpenRouter documents. Only parts tagged with
|
|
11
|
+
# one of them are replayed, so parts from other adapters, or with no format,
|
|
12
|
+
# never reach the request.
|
|
13
|
+
REASONING_FORMATS: Array[String]
|
|
14
|
+
|
|
13
15
|
# --
|
|
14
16
|
# : () -> String
|
|
15
17
|
def self.semconv_provider_name: () -> String
|
|
@@ -28,11 +30,6 @@ class Riffer::Providers::OpenRouter < Riffer::Providers::Base
|
|
|
28
30
|
# : () -> untyped
|
|
29
31
|
def global_client: () -> untyped
|
|
30
32
|
|
|
31
|
-
# Deliberately not compacted: this borrows the OpenAI SDK to talk to a
|
|
32
|
-
# different vendor, so omitting an unset +api_key+ would let the SDK fall
|
|
33
|
-
# back to +OPENAI_API_KEY+ and send an OpenAI credential to OpenRouter.
|
|
34
|
-
# Passing nil raises in the SDK instead. +OPENROUTER_API_KEY+ is read here
|
|
35
|
-
# rather than left to the SDK for the same reason.
|
|
36
33
|
# --
|
|
37
34
|
# : () -> untyped
|
|
38
35
|
def build_client: () -> untyped
|
|
@@ -57,14 +54,10 @@ class Riffer::Providers::OpenRouter < Riffer::Providers::Base
|
|
|
57
54
|
# : (untyped) -> Riffer::Providers::FinishReason?
|
|
58
55
|
def extract_finish_reason: (untyped) -> Riffer::Providers::FinishReason?
|
|
59
56
|
|
|
60
|
-
# +native+ is the upstream model's own finish reason, which OpenRouter
|
|
61
|
-
# reports alongside its normalized one; it wins as +raw+ when present.
|
|
62
57
|
# --
|
|
63
58
|
# : (untyped, ?native: untyped) -> Riffer::Providers::FinishReason?
|
|
64
59
|
def build_finish_reason: (untyped, ?native: untyped) -> Riffer::Providers::FinishReason?
|
|
65
60
|
|
|
66
|
-
# +native_finish_reason+ is outside the OpenAI schema, so it is only
|
|
67
|
-
# reachable through the SDK model's raw data hash.
|
|
68
61
|
# --
|
|
69
62
|
# : (untyped) -> untyped
|
|
70
63
|
def native_finish_reason: (untyped) -> untyped
|
|
@@ -77,6 +70,20 @@ class Riffer::Providers::OpenRouter < Riffer::Providers::Base
|
|
|
77
70
|
# : (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
|
|
78
71
|
def extract_tool_calls: (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
|
|
79
72
|
|
|
73
|
+
# --
|
|
74
|
+
# : (untyped) -> Array[Riffer::Messages::Assistant::ReasoningPart]
|
|
75
|
+
def extract_reasoning: (untyped) -> Array[Riffer::Messages::Assistant::ReasoningPart]
|
|
76
|
+
|
|
77
|
+
# The openai gem's typed models strip fields outside OpenAI's spec, so
|
|
78
|
+
# +reasoning_details+ is only reachable through the model's raw data hash.
|
|
79
|
+
# --
|
|
80
|
+
# : (untyped) -> Array[Hash[Symbol, untyped]]?
|
|
81
|
+
def reasoning_details: (untyped) -> Array[Hash[Symbol, untyped]]?
|
|
82
|
+
|
|
83
|
+
# --
|
|
84
|
+
# : (Hash[Symbol, untyped]) -> Riffer::Messages::Assistant::ReasoningPart?
|
|
85
|
+
def build_reasoning_part: (Hash[Symbol, untyped]) -> Riffer::Messages::Assistant::ReasoningPart?
|
|
86
|
+
|
|
80
87
|
# --
|
|
81
88
|
# : (Hash[Symbol, untyped], Riffer::Providers::_EventSink) -> void
|
|
82
89
|
def execute_stream: (Hash[Symbol, untyped], Riffer::Providers::_EventSink) -> void
|
|
@@ -93,6 +100,14 @@ class Riffer::Providers::OpenRouter < Riffer::Providers::Base
|
|
|
93
100
|
# : (untyped, state: Hash[Symbol, untyped], yielder: Riffer::Providers::_EventSink) -> void
|
|
94
101
|
def handle_reasoning_delta: (untyped, state: Hash[Symbol, untyped], yielder: Riffer::Providers::_EventSink) -> void
|
|
95
102
|
|
|
103
|
+
# OpenRouter streams one reasoning block as many fragments sharing an
|
|
104
|
+
# +index+: prose and payload arrive in pieces to concatenate, while the
|
|
105
|
+
# signature, id, and format arrive once, often on the last fragment. Keying
|
|
106
|
+
# on +type+ as well keeps index-less fragments of different kinds apart.
|
|
107
|
+
# --
|
|
108
|
+
# : (Hash[untyped, Hash[Symbol, untyped]], Hash[Symbol, untyped]) -> void
|
|
109
|
+
def accumulate_reasoning_detail: (Hash[untyped, Hash[Symbol, untyped]], Hash[Symbol, untyped]) -> void
|
|
110
|
+
|
|
96
111
|
# --
|
|
97
112
|
# : (untyped, state: Hash[Symbol, untyped], yielder: Riffer::Providers::_EventSink) -> void
|
|
98
113
|
def handle_tool_call_deltas: (untyped, state: Hash[Symbol, untyped], yielder: Riffer::Providers::_EventSink) -> void
|
|
@@ -113,6 +128,10 @@ class Riffer::Providers::OpenRouter < Riffer::Providers::Base
|
|
|
113
128
|
# : (Riffer::Messages::Assistant) -> Hash[Symbol, untyped]
|
|
114
129
|
def convert_assistant_to_chat_completions_format: (Riffer::Messages::Assistant) -> Hash[Symbol, untyped]
|
|
115
130
|
|
|
131
|
+
# --
|
|
132
|
+
# : (Riffer::Messages::Assistant::ReasoningPart) -> Hash[Symbol, untyped]
|
|
133
|
+
def convert_reasoning_part_to_detail: (Riffer::Messages::Assistant::ReasoningPart) -> Hash[Symbol, untyped]
|
|
134
|
+
|
|
116
135
|
# --
|
|
117
136
|
# : (Riffer::Messages::User::FilePart) -> Hash[Symbol, untyped]
|
|
118
137
|
def convert_file_part_to_chat_completions_format: (Riffer::Messages::User::FilePart) -> Hash[Symbol, untyped]
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
# Generated from lib/riffer/providers/repository.rb with RBS::Inline
|
|
2
2
|
|
|
3
|
-
# Resolves provider classes by identifier, combining the built-in REPO with
|
|
4
|
-
# consumer registrations added through +register+. Registration is not
|
|
5
|
-
# synchronized — register during boot, before concurrent generation begins.
|
|
6
3
|
module Riffer::Providers::Repository
|
|
7
4
|
@registrations: Hash[Symbol, ^() -> singleton(Riffer::Providers::Base)]
|
|
8
5
|
|
|
@@ -10,29 +7,20 @@ module Riffer::Providers::Repository
|
|
|
10
7
|
|
|
11
8
|
REPO: Hash[Symbol, ^() -> singleton(Riffer::Providers::Base)]
|
|
12
9
|
|
|
13
|
-
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
# Riffer::Providers::Repository.register(:jane) { MyApp::JaneProvider }
|
|
17
|
-
#
|
|
10
|
+
# Not synchronized — register during boot, before concurrent generation
|
|
11
|
+
# begins.
|
|
18
12
|
# --
|
|
19
13
|
# : ((String | Symbol)) { () -> singleton(Riffer::Providers::Base) } -> void
|
|
20
14
|
def register: (String | Symbol) { () -> singleton(Riffer::Providers::Base) } -> void
|
|
21
15
|
|
|
22
|
-
# Removes a custom registration by identifier, leaving any built-in of the
|
|
23
|
-
# same name intact.
|
|
24
16
|
# --
|
|
25
17
|
# : ((String | Symbol)) -> void
|
|
26
18
|
def unregister: (String | Symbol) -> void
|
|
27
19
|
|
|
28
|
-
# Finds a provider class by identifier, preferring a custom registration over
|
|
29
|
-
# a built-in of the same name.
|
|
30
|
-
#
|
|
31
20
|
# --
|
|
32
21
|
# : ((String | Symbol)) -> singleton(Riffer::Providers::Base)?
|
|
33
22
|
def find: (String | Symbol) -> singleton(Riffer::Providers::Base)?
|
|
34
23
|
|
|
35
|
-
# Returns the registry identifier for a provider class, or nil when unregistered.
|
|
36
24
|
# --
|
|
37
25
|
# : (singleton(Riffer::Providers::Base)) -> Symbol?
|
|
38
26
|
def key_for: (singleton(Riffer::Providers::Base)) -> Symbol?
|
|
@@ -1,46 +1,37 @@
|
|
|
1
1
|
# Generated from lib/riffer/providers/token_usage.rb with RBS::Inline
|
|
2
2
|
|
|
3
|
-
# Normalized token usage for an LLM API call. Buckets carry the same
|
|
4
|
-
# meaning for every provider.
|
|
5
3
|
class Riffer::Providers::TokenUsage
|
|
6
|
-
# Builds a TokenUsage from a hash, or returns +usage+ unchanged when it is
|
|
7
|
-
# already a TokenUsage.
|
|
8
4
|
# --
|
|
9
5
|
# : ((Hash[Symbol, untyped] | Riffer::Providers::TokenUsage)) -> Riffer::Providers::TokenUsage
|
|
10
6
|
def self.from_hash: (Hash[Symbol, untyped] | Riffer::Providers::TokenUsage) -> Riffer::Providers::TokenUsage
|
|
11
7
|
|
|
12
|
-
#
|
|
8
|
+
# Normalized across providers: includes cache reads and writes.
|
|
13
9
|
attr_reader input_tokens: Integer
|
|
14
10
|
|
|
15
|
-
#
|
|
11
|
+
# Includes reasoning/thinking tokens.
|
|
16
12
|
attr_reader output_tokens: Integer
|
|
17
13
|
|
|
18
|
-
# Subset of +input_tokens
|
|
14
|
+
# Subset of +input_tokens+.
|
|
19
15
|
attr_reader cache_write_tokens: Integer?
|
|
20
16
|
|
|
21
|
-
# Subset of +input_tokens
|
|
17
|
+
# Subset of +input_tokens+.
|
|
22
18
|
attr_reader cache_read_tokens: Integer?
|
|
23
19
|
|
|
24
|
-
#
|
|
20
|
+
# For observability, not billing.
|
|
25
21
|
attr_reader cost: Float?
|
|
26
22
|
|
|
27
23
|
# --
|
|
28
24
|
# : (input_tokens: Integer, output_tokens: Integer, ?cache_write_tokens: Integer?, ?cache_read_tokens: Integer?, ?cost: Float?) -> void
|
|
29
25
|
def initialize: (input_tokens: Integer, output_tokens: Integer, ?cache_write_tokens: Integer?, ?cache_read_tokens: Integer?, ?cost: Float?) -> void
|
|
30
26
|
|
|
31
|
-
# Returns the total number of tokens (input + output).
|
|
32
|
-
#
|
|
33
27
|
# --
|
|
34
28
|
# : () -> Integer
|
|
35
29
|
def total_tokens: () -> Integer
|
|
36
30
|
|
|
37
|
-
# Combines two TokenUsage objects for cumulative tracking.
|
|
38
|
-
#
|
|
39
31
|
# --
|
|
40
32
|
# : (Riffer::Providers::TokenUsage) -> Riffer::Providers::TokenUsage
|
|
41
33
|
def +: (Riffer::Providers::TokenUsage) -> Riffer::Providers::TokenUsage
|
|
42
34
|
|
|
43
|
-
# Converts the token usage to a hash; cache tokens and cost are omitted when nil.
|
|
44
35
|
# --
|
|
45
36
|
# : () -> Hash[Symbol, (Integer | Float)]
|
|
46
37
|
def to_h: () -> Hash[Symbol, Integer | Float]
|
|
@@ -1,68 +1,29 @@
|
|
|
1
1
|
# Generated from lib/riffer/registrable.rb with RBS::Inline
|
|
2
2
|
|
|
3
|
-
# Registry of a class's direct subclasses, keyed by identifier. Extend it
|
|
4
|
-
# onto a base class to look up subclasses in constant time via +find+ and +all+.
|
|
5
|
-
# Subclasses join implicitly by inheriting; +register+ adds one explicitly, for
|
|
6
|
-
# ephemeral classes a test suite builds and tears down. Registration is not
|
|
7
|
-
# synchronized — register during boot or from a single-threaded test, before
|
|
8
|
-
# concurrent lookups begin.
|
|
9
|
-
#
|
|
10
|
-
# class Riffer::Tool
|
|
11
|
-
# extend Riffer::Registrable
|
|
12
|
-
# end
|
|
13
|
-
#
|
|
14
|
-
# Riffer::Tool.find("weather_tool") # => WeatherTool
|
|
15
|
-
#
|
|
16
3
|
# @rbs module-self Class
|
|
17
4
|
module Riffer::Registrable : Class
|
|
18
5
|
@identifier_registry: Hash[String, Class]?
|
|
19
6
|
|
|
20
7
|
@explicit_registrations: Hash[String, Class]?
|
|
21
8
|
|
|
22
|
-
# Finds a registered subclass by identifier, or +nil+ when none matches.
|
|
23
|
-
# Implicit registration covers only *named direct* subclasses: grandchildren
|
|
24
|
-
# are not visible to a grandparent's +find+ (call +find+ on their direct
|
|
25
|
-
# parent instead), anonymous classes are never registered implicitly, and a
|
|
26
|
-
# subclass whose name no longer resolves back to it is dropped at the next
|
|
27
|
-
# registry rebuild. Duplicate identifiers raise
|
|
28
|
-
# Riffer::DuplicateIdentifierError at first lookup.
|
|
29
|
-
#
|
|
30
9
|
# --
|
|
31
10
|
# : (String | Symbol) -> Class?
|
|
32
11
|
def find: (String | Symbol) -> Class?
|
|
33
12
|
|
|
34
|
-
# Returns all registered subclasses, implicit and explicit. Carries the same
|
|
35
|
-
# registration rules as +find+.
|
|
36
|
-
#
|
|
37
13
|
# --
|
|
38
14
|
# : () -> Array[Class]
|
|
39
15
|
def all: () -> Array[Class]
|
|
40
16
|
|
|
41
|
-
# Registers a direct subclass under its +identifier+, whether or not it is
|
|
42
|
-
# named — unlike implicit registration, it survives a name that no longer
|
|
43
|
-
# resolves, so an ephemeral class stays findable until +unregister+. Prefer
|
|
44
|
-
# Riffer::Testing for ordinary test setup, which stubs and cleans up
|
|
45
|
-
# automatically.
|
|
46
|
-
#
|
|
47
|
-
# Raises Riffer::ArgumentError when the identifier is blank or the class is
|
|
48
|
-
# not a direct subclass, and Riffer::DuplicateIdentifierError when the
|
|
49
|
-
# identifier is already taken — including by this same class.
|
|
50
|
-
#
|
|
51
17
|
# --
|
|
52
18
|
# : (Class) -> void
|
|
53
19
|
def register: (Class) -> void
|
|
54
20
|
|
|
55
|
-
# Removes an explicit registration of +klass+, leaving implicit registrations
|
|
56
|
-
# untouched.
|
|
57
21
|
# --
|
|
58
22
|
# : (Class) -> void
|
|
59
23
|
def unregister: (Class) -> void
|
|
60
24
|
|
|
61
25
|
private
|
|
62
26
|
|
|
63
|
-
# Ruby invokes +inherited+ with +self+ bound to the direct superclass — the
|
|
64
|
-
# only registry the new subclass joins — so busting self's memo is exactly
|
|
65
|
-
# sufficient.
|
|
66
27
|
# --
|
|
67
28
|
# : (Class) -> void
|
|
68
29
|
def inherited: (Class) -> void
|
|
@@ -79,12 +40,6 @@ module Riffer::Registrable : Class
|
|
|
79
40
|
# : () -> Hash[String, Class]
|
|
80
41
|
def build_identifier_registry: () -> Hash[String, Class]
|
|
81
42
|
|
|
82
|
-
# Class#subclasses keeps returning superseded generations of a reloaded or
|
|
83
|
-
# stubbed class, so a subclass counts only while its own name still resolves
|
|
84
|
-
# back to it. An anonymous class has no name to resolve and is skipped even
|
|
85
|
-
# with an explicit identifier — the MCP factory and serializer shells
|
|
86
|
-
# synthesize short-lived anonymous classes whose registration would flake
|
|
87
|
-
# with GC timing.
|
|
88
43
|
# --
|
|
89
44
|
# : (Class) -> bool
|
|
90
45
|
def live?: (Class) -> bool
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
# Generated from lib/riffer/runner/fibers.rb with RBS::Inline
|
|
2
2
|
|
|
3
|
-
# Processes items concurrently using fibers via the +async+ gem.
|
|
4
|
-
# +max_concurrency+ caps simultaneous fibers via an <tt>Async::Semaphore</tt>.
|
|
5
|
-
# If multiple fibers raise, only the first exception is re-raised after all
|
|
6
|
-
# finish.
|
|
7
|
-
# Joins the current reactor task when one is already running, and otherwise
|
|
8
|
-
# starts its own.
|
|
9
3
|
class Riffer::Runner::Fibers < Riffer::Runner
|
|
10
4
|
@max_concurrency: Integer?
|
|
11
5
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# Generated from lib/riffer/runner/sequential.rb with RBS::Inline
|
|
2
2
|
|
|
3
|
-
# Processes items sequentially in the current thread — the default runner.
|
|
4
3
|
class Riffer::Runner::Sequential < Riffer::Runner
|
|
5
4
|
# --
|
|
6
5
|
# : (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
# Generated from lib/riffer/runner/threaded.rb with RBS::Inline
|
|
2
2
|
|
|
3
|
-
# Processes items concurrently using a thread pool of up to +max_concurrency+
|
|
4
|
-
# workers pulling from a shared queue, so a slow item doesn't block others. If
|
|
5
|
-
# multiple workers raise, only the first exception is re-raised after all finish.
|
|
6
3
|
class Riffer::Runner::Threaded < Riffer::Runner
|
|
7
4
|
@max_concurrency: Integer
|
|
8
5
|
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
# Generated from lib/riffer/runner.rb with RBS::Inline
|
|
2
2
|
|
|
3
|
-
# Generic concurrency primitive for batch execution. Subclasses implement
|
|
4
|
-
# +map+ to control how items are processed.
|
|
5
3
|
class Riffer::Runner
|
|
6
|
-
# Maps over items using the provided block.
|
|
7
4
|
# --
|
|
8
5
|
# : (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
|
|
9
6
|
def map: (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
# Generated from lib/riffer/skills/activate_tool.rb with RBS::Inline
|
|
2
2
|
|
|
3
|
-
# Tool the LLM calls to activate a skill and receive its instructions;
|
|
4
|
-
# registered automatically when an agent has skills configured.
|
|
5
3
|
class Riffer::Skills::ActivateTool < Riffer::Tool
|
|
6
|
-
# Activates a skill by name and returns its wrapped body, or a short pointer when the skill is already active.
|
|
7
4
|
# --
|
|
8
5
|
# : (context: Riffer::Agent::Context?, name: String) -> Riffer::Tools::Response
|
|
9
6
|
def call: (context: Riffer::Agent::Context?, name: String) -> Riffer::Tools::Response
|
|
@@ -1,28 +1,20 @@
|
|
|
1
1
|
# Generated from lib/riffer/skills/adapter.rb with RBS::Inline
|
|
2
2
|
|
|
3
|
-
# Interface for skill adapters — provider-specific rendering of the
|
|
4
|
-
# available-skills section in the system prompt. Subclass and override
|
|
5
|
-
# +render_catalog+; the activation tool is exposed via +#skill_activate_tool+
|
|
6
|
-
# for the rendered output.
|
|
7
3
|
class Riffer::Skills::Adapter
|
|
8
|
-
# The activation tool class for this adapter.
|
|
9
4
|
attr_reader skill_activate_tool: singleton(Riffer::Tool)
|
|
10
5
|
|
|
11
6
|
# --
|
|
12
7
|
# : (skill_activate_tool: singleton(Riffer::Tool)) -> void
|
|
13
8
|
def initialize: (skill_activate_tool: singleton(Riffer::Tool)) -> void
|
|
14
9
|
|
|
15
|
-
# Renders a skill catalog section for the system prompt.
|
|
16
10
|
# --
|
|
17
11
|
# : (Array[Riffer::Skills::Frontmatter]) -> String
|
|
18
12
|
def render_catalog: (Array[Riffer::Skills::Frontmatter]) -> String
|
|
19
13
|
|
|
20
|
-
# Renders an activated skill body wrapped in identifying tags.
|
|
21
14
|
# --
|
|
22
15
|
# : (Riffer::Skills::Frontmatter, String) -> String
|
|
23
16
|
def render_activation: (Riffer::Skills::Frontmatter, String) -> String
|
|
24
17
|
|
|
25
|
-
# The behavioral instructions rendered alongside the catalog.
|
|
26
18
|
# --
|
|
27
19
|
# : () -> String
|
|
28
20
|
def catalog_instructions: () -> String
|
|
@@ -1,21 +1,16 @@
|
|
|
1
1
|
# Generated from lib/riffer/skills/backend.rb with RBS::Inline
|
|
2
2
|
|
|
3
|
-
# Interface for skill storage backends. Subclass and implement +list_skills+
|
|
4
|
-
# and +read_skill+ for custom storage (database, S3, etc.); use
|
|
5
|
-
# Riffer::Skills::Frontmatter.parse on raw SKILL.md content.
|
|
6
3
|
class Riffer::Skills::Backend
|
|
7
4
|
SKILL_FILENAME: String
|
|
8
5
|
|
|
9
6
|
def initialize: () -> untyped
|
|
10
7
|
|
|
11
|
-
# Returns frontmatter for all available skills; called once at the start of
|
|
12
|
-
# generate/stream.
|
|
13
8
|
# --
|
|
14
9
|
# : () -> Array[Riffer::Skills::Frontmatter]
|
|
15
10
|
def list_skills: () -> Array[Riffer::Skills::Frontmatter]
|
|
16
11
|
|
|
17
|
-
# Returns the
|
|
18
|
-
#
|
|
12
|
+
# Returns the SKILL.md body without frontmatter. Raises Riffer::ArgumentError
|
|
13
|
+
# if the skill is not found.
|
|
19
14
|
# --
|
|
20
15
|
# : (String) -> String
|
|
21
16
|
def read_skill: (String) -> String
|
|
@@ -1,12 +1,5 @@
|
|
|
1
1
|
# Generated from lib/riffer/skills/config.rb with RBS::Inline
|
|
2
2
|
|
|
3
|
-
# Configuration object for the skills block DSL.
|
|
4
|
-
#
|
|
5
|
-
# skills do
|
|
6
|
-
# backend Riffer::Skills::FilesystemBackend.new(".skills")
|
|
7
|
-
# adapter Riffer::Skills::XmlAdapter
|
|
8
|
-
# activate ["code-review"]
|
|
9
|
-
# end
|
|
10
3
|
class Riffer::Skills::Config
|
|
11
4
|
@backend: (Riffer::Skills::Backend | Proc)?
|
|
12
5
|
|
|
@@ -20,37 +13,24 @@ class Riffer::Skills::Config
|
|
|
20
13
|
# : () -> void
|
|
21
14
|
def initialize: () -> void
|
|
22
15
|
|
|
23
|
-
# Gets or sets the skills backend (a Backend or a +context+-resolved Proc).
|
|
24
16
|
# --
|
|
25
17
|
# : (?(Riffer::Skills::Backend | Proc)?) -> (Riffer::Skills::Backend | Proc)?
|
|
26
18
|
def backend: (?(Riffer::Skills::Backend | Proc)?) -> (Riffer::Skills::Backend | Proc)?
|
|
27
19
|
|
|
28
|
-
# Gets or sets a custom skill adapter class; defaults to the provider's
|
|
29
|
-
# preferred adapter.
|
|
30
20
|
# --
|
|
31
21
|
# : (?singleton(Riffer::Skills::Adapter)?) -> singleton(Riffer::Skills::Adapter)?
|
|
32
22
|
def adapter: (?singleton(Riffer::Skills::Adapter)?) -> singleton(Riffer::Skills::Adapter)?
|
|
33
23
|
|
|
34
|
-
# Gets or sets skill names to activate at startup (an array or a
|
|
35
|
-
# +context+-resolved Proc); activated skills' bodies are included in the
|
|
36
|
-
# system prompt without a tool call.
|
|
37
24
|
# --
|
|
38
25
|
# : (?(Array[String] | Proc)?) -> (Array[String] | Proc)?
|
|
39
26
|
def activate: (?(Array[String] | Proc)?) -> (Array[String] | Proc)?
|
|
40
27
|
|
|
41
|
-
# Gets or sets the per-agent skill activation tool override, or +nil+ when
|
|
42
|
-
# unset — the global fallback to <tt>Riffer.config.skills.default_activate_tool</tt>
|
|
43
|
-
# is applied by the agent at resolution, not here. Raises Riffer::ArgumentError
|
|
44
|
-
# on an invalid value.
|
|
45
28
|
# --
|
|
46
29
|
# : (?singleton(Riffer::Tool)?) -> singleton(Riffer::Tool)?
|
|
47
30
|
def activate_tool: (?singleton(Riffer::Tool)?) -> singleton(Riffer::Tool)?
|
|
48
31
|
|
|
49
32
|
private
|
|
50
33
|
|
|
51
|
-
# +dup+ would leave the copy sharing this one's activation list, so activating
|
|
52
|
-
# a skill on either would reach the other. DeepDup rebuilds the list and
|
|
53
|
-
# returns a Proc as-is, which has nothing to alias.
|
|
54
34
|
# --
|
|
55
35
|
# : (Riffer::Skills::Config) -> void
|
|
56
36
|
def initialize_copy: (Riffer::Skills::Config) -> void
|