riffer 0.29.0 → 0.30.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/.agents/rbs-inline.md +51 -0
- data/.release-please-manifest.json +1 -1
- data/CHANGELOG.md +18 -0
- data/README.md +1 -0
- data/Steepfile +2 -1
- data/docs/01_OVERVIEW.md +1 -0
- data/docs/03_AGENTS.md +1 -1
- data/docs/15_SERIALIZATION.md +103 -0
- data/lib/riffer/agent/config.rb +2 -2
- data/lib/riffer/agent/context.rb +2 -0
- data/lib/riffer/agent/response.rb +2 -0
- data/lib/riffer/agent/run.rb +2 -1
- data/lib/riffer/agent/serializer.rb +215 -0
- data/lib/riffer/agent/session.rb +2 -0
- data/lib/riffer/agent.rb +84 -18
- data/lib/riffer/evals/evaluator.rb +5 -0
- data/lib/riffer/evals/judge.rb +5 -0
- data/lib/riffer/mcp/client.rb +2 -0
- data/lib/riffer/mcp/registration.rb +4 -0
- data/lib/riffer/mcp/registry.rb +3 -0
- data/lib/riffer/messages/file_part.rb +2 -0
- data/lib/riffer/params/param.rb +84 -4
- data/lib/riffer/params.rb +34 -3
- data/lib/riffer/providers/amazon_bedrock.rb +28 -21
- data/lib/riffer/providers/anthropic.rb +13 -9
- data/lib/riffer/providers/base.rb +2 -0
- data/lib/riffer/providers/gemini.rb +4 -0
- data/lib/riffer/providers/mock.rb +4 -0
- data/lib/riffer/providers/open_ai.rb +10 -7
- data/lib/riffer/providers/open_router.rb +25 -18
- data/lib/riffer/runner/fibers.rb +2 -0
- data/lib/riffer/runner/threaded.rb +2 -0
- data/lib/riffer/skills/config.rb +5 -0
- data/lib/riffer/skills/context.rb +3 -0
- data/lib/riffer/skills/filesystem_backend.rb +3 -0
- data/lib/riffer/tools/response.rb +2 -0
- data/lib/riffer/tools/runtime.rb +2 -0
- data/lib/riffer/tools/toolable.rb +7 -0
- data/lib/riffer/version.rb +1 -1
- data/lib/riffer.rb +2 -0
- data/sig/_private/anthropic.rbs +16 -0
- data/sig/_private/openai.rbs +29 -0
- data/sig/_private/riffer/providers/amazon_bedrock.rbs +4 -0
- data/sig/_private/riffer/providers/anthropic.rbs +4 -0
- data/sig/_private/riffer/providers/open_ai.rbs +4 -0
- data/sig/_private/riffer/providers/open_router.rbs +4 -0
- data/sig/generated/riffer/agent/config.rbs +3 -3
- data/sig/generated/riffer/agent/context.rbs +2 -0
- data/sig/generated/riffer/agent/response.rbs +2 -0
- data/sig/generated/riffer/agent/serializer.rbs +132 -0
- data/sig/generated/riffer/agent/session.rbs +2 -0
- data/sig/generated/riffer/agent.rbs +67 -11
- data/sig/generated/riffer/evals/evaluator.rbs +8 -0
- data/sig/generated/riffer/evals/judge.rbs +8 -0
- data/sig/generated/riffer/mcp/client.rbs +2 -0
- data/sig/generated/riffer/mcp/registration.rbs +6 -0
- data/sig/generated/riffer/mcp/registry.rbs +4 -0
- data/sig/generated/riffer/messages/file_part.rbs +2 -0
- data/sig/generated/riffer/params/param.rbs +46 -5
- data/sig/generated/riffer/params.rbs +25 -6
- data/sig/generated/riffer/providers/amazon_bedrock.rbs +20 -20
- data/sig/generated/riffer/providers/anthropic.rbs +10 -10
- data/sig/generated/riffer/providers/base.rbs +2 -0
- data/sig/generated/riffer/providers/gemini.rbs +6 -0
- data/sig/generated/riffer/providers/mock.rbs +6 -0
- data/sig/generated/riffer/providers/open_ai.rbs +8 -8
- data/sig/generated/riffer/providers/open_router.rbs +16 -16
- data/sig/generated/riffer/runner/fibers.rbs +2 -0
- data/sig/generated/riffer/runner/threaded.rbs +2 -0
- data/sig/generated/riffer/skills/config.rbs +8 -0
- data/sig/generated/riffer/skills/context.rbs +4 -0
- data/sig/generated/riffer/skills/filesystem_backend.rbs +4 -0
- data/sig/generated/riffer/tools/response.rbs +2 -0
- data/sig/generated/riffer/tools/runtime.rbs +2 -0
- data/sig/generated/riffer/tools/toolable.rbs +12 -0
- data/sig/generated/riffer.rbs +2 -0
- data/sig/manifest.yaml +3 -0
- data/sig/manual/riffer/agent/run.rbs +5 -0
- data/sig/manual/riffer/agent/serializer.rbs +5 -0
- data/sig/manual/riffer/helpers/call_or_value.rbs +5 -0
- data/sig/manual/riffer/tools/toolable.rbs +6 -0
- metadata +20 -11
- data/sig/stubs/agent_ivars.rbs +0 -7
- data/sig/stubs/extend_self.rbs +0 -11
- data/sig/stubs/lib_ivars.rbs +0 -101
- data/sig/stubs/provider_ivars.rbs +0 -36
- data/sig/stubs/provider_sdk_methods.rbs +0 -50
- /data/sig/{stubs → _private}/async.rbs +0 -0
- /data/sig/{stubs → _private}/aws-sdk-core/seahorse_request_context.rbs +0 -0
- /data/sig/{stubs → _private}/aws-sdk-core/static_token_provider.rbs +0 -0
- /data/sig/{stubs/mcp_sdk.rbs → _private/mcp.rbs} +0 -0
- /data/sig/{stubs → _private}/zeitwerk.rbs +0 -0
|
@@ -14,6 +14,14 @@
|
|
|
14
14
|
# judge_model "anthropic/claude-opus-4-5-20251101"
|
|
15
15
|
# end
|
|
16
16
|
class Riffer::Evals::Evaluator
|
|
17
|
+
self.@instructions: String?
|
|
18
|
+
|
|
19
|
+
self.@higher_is_better: bool?
|
|
20
|
+
|
|
21
|
+
self.@judge_model: String?
|
|
22
|
+
|
|
23
|
+
@judge: Riffer::Evals::Judge?
|
|
24
|
+
|
|
17
25
|
# Gets or sets the evaluation instructions (criteria and scoring rubric).
|
|
18
26
|
#
|
|
19
27
|
# --
|
|
@@ -15,6 +15,14 @@
|
|
|
15
15
|
# result[:score] # => 0.85
|
|
16
16
|
# result[:reason] # => "The response is relevant..."
|
|
17
17
|
class Riffer::Evals::Judge
|
|
18
|
+
@provider_options: Hash[Symbol, untyped]
|
|
19
|
+
|
|
20
|
+
@provider_instance: Riffer::Providers::Base?
|
|
21
|
+
|
|
22
|
+
@provider_name: String?
|
|
23
|
+
|
|
24
|
+
@model_name: String?
|
|
25
|
+
|
|
18
26
|
# Internal tool for structured evaluation output.
|
|
19
27
|
class EvaluationTool < Riffer::Tool
|
|
20
28
|
# --
|
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
class Riffer::Mcp::Client
|
|
15
15
|
include Riffer::Helpers::Dependencies
|
|
16
16
|
|
|
17
|
+
@client: untyped
|
|
18
|
+
|
|
17
19
|
# --
|
|
18
20
|
# : (endpoint: String, ?headers: (Hash[String, String] | Proc), ?client: untyped?) -> void
|
|
19
21
|
def initialize: (endpoint: String, ?headers: Hash[String, String] | Proc, ?client: untyped?) -> void
|
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
# Created when a server is registered. Discovers tools via the MCP
|
|
6
6
|
# +tools/list+ call, then generates tool classes.
|
|
7
7
|
class Riffer::Mcp::Registration
|
|
8
|
+
@cancelled: bool
|
|
9
|
+
|
|
10
|
+
@tools: Array[singleton(Riffer::Tool)]
|
|
11
|
+
|
|
12
|
+
@mutex: Thread::Mutex
|
|
13
|
+
|
|
8
14
|
# The manifest that describes this server.
|
|
9
15
|
attr_reader manifest: Riffer::Mcp::Manifest
|
|
10
16
|
|
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
#
|
|
5
5
|
# Keyed by manifest name. All public methods are mutex-guarded.
|
|
6
6
|
module Riffer::Mcp::Registry
|
|
7
|
+
self.@mutex: Thread::Mutex
|
|
8
|
+
|
|
9
|
+
self.@store: Hash[String, Riffer::Mcp::Registration]
|
|
10
|
+
|
|
7
11
|
# Registers an MCP server and starts async tool discovery.
|
|
8
12
|
#
|
|
9
13
|
# Accepts a Manifest instance or a hash of manifest keyword arguments.
|
|
@@ -8,11 +8,16 @@ class Riffer::Params::Param
|
|
|
8
8
|
TYPE_MAPPINGS: Hash[Module, String]
|
|
9
9
|
|
|
10
10
|
# Primitive types allowed for the <tt>of:</tt> keyword on Array params
|
|
11
|
-
PRIMITIVE_TYPES: Array[
|
|
11
|
+
PRIMITIVE_TYPES: Array[Module]
|
|
12
|
+
|
|
13
|
+
# Maps JSON Schema type strings back to Ruby types. The inverse of
|
|
14
|
+
# TYPE_MAPPINGS, collapsing the three boolean spellings onto
|
|
15
|
+
# Riffer::Params::Boolean. Used by +from_json_schema+.
|
|
16
|
+
JSON_TYPE_MAPPINGS: Hash[String, Module]
|
|
12
17
|
|
|
13
18
|
attr_reader name: Symbol
|
|
14
19
|
|
|
15
|
-
attr_reader type:
|
|
20
|
+
attr_reader type: Module
|
|
16
21
|
|
|
17
22
|
attr_reader required: bool
|
|
18
23
|
|
|
@@ -22,13 +27,44 @@ class Riffer::Params::Param
|
|
|
22
27
|
|
|
23
28
|
attr_reader default: untyped
|
|
24
29
|
|
|
25
|
-
attr_reader item_type:
|
|
30
|
+
attr_reader item_type: Module?
|
|
26
31
|
|
|
27
32
|
attr_reader nested_params: Riffer::Params?
|
|
28
33
|
|
|
29
34
|
# --
|
|
30
|
-
#
|
|
31
|
-
|
|
35
|
+
# Reconstructs a Param from a single JSON Schema property.
|
|
36
|
+
#
|
|
37
|
+
# [name] the parameter name (Symbol).
|
|
38
|
+
# [schema] the property's JSON Schema (Symbol-keyed).
|
|
39
|
+
# [required] whether the property appeared in the parent's +required+ list.
|
|
40
|
+
#
|
|
41
|
+
# Raises Riffer::ArgumentError on a type outside the Params-expressible subset.
|
|
42
|
+
#
|
|
43
|
+
# --
|
|
44
|
+
# : (Symbol, Hash[Symbol, untyped], required: bool) -> Riffer::Params::Param
|
|
45
|
+
def self.from_json_schema: (Symbol, Hash[Symbol, untyped], required: bool) -> Riffer::Params::Param
|
|
46
|
+
|
|
47
|
+
# Resolves the +[item_type, nested_params]+ pair for a reconstructed Param:
|
|
48
|
+
# a nested Params for object / array-of-object schemas, an +item_type+ for
|
|
49
|
+
# typed primitive arrays, and +nil+ for everything else.
|
|
50
|
+
#
|
|
51
|
+
# --
|
|
52
|
+
# : (Module, Hash[Symbol, untyped]) -> [Module?, Riffer::Params?]
|
|
53
|
+
def self.resolve_nesting: (Module, Hash[Symbol, untyped]) -> [ Module?, Riffer::Params? ]
|
|
54
|
+
|
|
55
|
+
# Resolves a JSON Schema +type+ (a String, or a <tt>[type, "null"]</tt>
|
|
56
|
+
# union) back to its Ruby type. Returns a Module because
|
|
57
|
+
# Riffer::Params::Boolean is a Module, not a Class — the same widening the
|
|
58
|
+
# +type+ attribute uses. Raises Riffer::ArgumentError on a type outside the
|
|
59
|
+
# Params-expressible subset (the block runs only for an unmapped type).
|
|
60
|
+
#
|
|
61
|
+
# --
|
|
62
|
+
# : (untyped) -> Module
|
|
63
|
+
def self.json_type_to_ruby: (untyped) -> Module
|
|
64
|
+
|
|
65
|
+
# --
|
|
66
|
+
# : (name: Symbol, type: Module, required: bool, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?item_type: Module?, ?nested_params: Riffer::Params?) -> void
|
|
67
|
+
def initialize: (name: Symbol, type: Module, required: bool, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?item_type: Module?, ?nested_params: Riffer::Params?) -> void
|
|
32
68
|
|
|
33
69
|
# Validates that a value matches the expected type.
|
|
34
70
|
#
|
|
@@ -52,6 +88,11 @@ class Riffer::Params::Param
|
|
|
52
88
|
# constraint from the null type, since providers like Anthropic reject
|
|
53
89
|
# <tt>{"type": ["string", "null"], "enum": [...]}</tt>.
|
|
54
90
|
#
|
|
91
|
+
# In non-strict mode a +default+ is emitted when set (a standard JSON
|
|
92
|
+
# Schema keyword), making the schema a lossless source for
|
|
93
|
+
# +Riffer::Params.from_json_schema+. Strict mode omits it, since strict
|
|
94
|
+
# providers reject the keyword.
|
|
95
|
+
#
|
|
55
96
|
# --
|
|
56
97
|
# : (?strict: bool) -> Hash[Symbol, untyped]
|
|
57
98
|
def to_json_schema: (?strict: bool) -> Hash[Symbol, untyped]
|
|
@@ -16,17 +16,36 @@ class Riffer::Params
|
|
|
16
16
|
# : () -> void
|
|
17
17
|
def initialize: () -> void
|
|
18
18
|
|
|
19
|
+
# Reconstructs a Params from a JSON Schema object (the inverse of
|
|
20
|
+
# +to_json_schema(strict: false)+).
|
|
21
|
+
#
|
|
22
|
+
# Accepts the Symbol-keyed object schema produced by +to_json_schema+
|
|
23
|
+
# (property-name keys may be String or Symbol — both are normalized).
|
|
24
|
+
# Reconstructs types, +required+, +description+, +enum+, +default+,
|
|
25
|
+
# typed-array +item_type+, and nested object/array Params recursively.
|
|
26
|
+
#
|
|
27
|
+
# Round-trips losslessly with +to_json_schema(strict: false)+ over the
|
|
28
|
+
# Params-expressible subset of JSON Schema. Raises Riffer::ArgumentError
|
|
29
|
+
# on a schema using features outside that subset.
|
|
30
|
+
#
|
|
31
|
+
# schema = params.to_json_schema(strict: false)
|
|
32
|
+
# Riffer::Params.from_json_schema(schema) # => equivalent Riffer::Params
|
|
33
|
+
#
|
|
34
|
+
# --
|
|
35
|
+
# : (Hash[Symbol, untyped]) -> Riffer::Params
|
|
36
|
+
def self.from_json_schema: (Hash[Symbol, untyped]) -> Riffer::Params
|
|
37
|
+
|
|
19
38
|
# Defines a required parameter.
|
|
20
39
|
#
|
|
21
40
|
# --
|
|
22
|
-
# : (Symbol,
|
|
23
|
-
def required: (Symbol,
|
|
41
|
+
# : (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?of: Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
|
|
42
|
+
def required: (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?of: Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
|
|
24
43
|
|
|
25
44
|
# Defines an optional parameter.
|
|
26
45
|
#
|
|
27
46
|
# --
|
|
28
|
-
# : (Symbol,
|
|
29
|
-
def optional: (Symbol,
|
|
47
|
+
# : (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?of: Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
|
|
48
|
+
def optional: (Symbol, Module, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?of: Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
|
|
30
49
|
|
|
31
50
|
# Validates arguments against parameter definitions.
|
|
32
51
|
#
|
|
@@ -49,8 +68,8 @@ class Riffer::Params
|
|
|
49
68
|
private
|
|
50
69
|
|
|
51
70
|
# --
|
|
52
|
-
# : (
|
|
53
|
-
def build_nested: (
|
|
71
|
+
# : (Module, Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> Riffer::Params?
|
|
72
|
+
def build_nested: (Module, Module?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> Riffer::Params?
|
|
54
73
|
|
|
55
74
|
# --
|
|
56
75
|
# : (Riffer::Params::Param, untyped, Array[String]) -> untyped
|
|
@@ -34,20 +34,20 @@ class Riffer::Providers::AmazonBedrock < Riffer::Providers::Base
|
|
|
34
34
|
def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
|
|
35
35
|
|
|
36
36
|
# --
|
|
37
|
-
# : (Hash[Symbol, untyped]) ->
|
|
38
|
-
def execute_generate: (Hash[Symbol, untyped]) ->
|
|
37
|
+
# : (Hash[Symbol, untyped]) -> untyped
|
|
38
|
+
def execute_generate: (Hash[Symbol, untyped]) -> untyped
|
|
39
39
|
|
|
40
40
|
# --
|
|
41
|
-
# : (
|
|
42
|
-
def extract_token_usage: (
|
|
41
|
+
# : (untyped) -> Riffer::Providers::TokenUsage?
|
|
42
|
+
def extract_token_usage: (untyped) -> Riffer::Providers::TokenUsage?
|
|
43
43
|
|
|
44
44
|
# --
|
|
45
|
-
# : (
|
|
46
|
-
def extract_content: (
|
|
45
|
+
# : (untyped) -> String
|
|
46
|
+
def extract_content: (untyped) -> String
|
|
47
47
|
|
|
48
48
|
# --
|
|
49
|
-
# : (
|
|
50
|
-
def extract_tool_calls: (
|
|
49
|
+
# : (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
|
|
50
|
+
def extract_tool_calls: (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
|
|
51
51
|
|
|
52
52
|
# --
|
|
53
53
|
# : (Hash[Symbol, untyped], Enumerator::Yielder) -> void
|
|
@@ -67,28 +67,28 @@ class Riffer::Providers::AmazonBedrock < Riffer::Providers::Base
|
|
|
67
67
|
def raise_if_stream_exception!: (untyped) -> void
|
|
68
68
|
|
|
69
69
|
# --
|
|
70
|
-
# : (
|
|
71
|
-
def handle_content_block_start_tool_use: (
|
|
70
|
+
# : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
71
|
+
def handle_content_block_start_tool_use: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
72
72
|
|
|
73
73
|
# --
|
|
74
|
-
# : (
|
|
75
|
-
def handle_content_block_delta_text_delta: (
|
|
74
|
+
# : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
75
|
+
def handle_content_block_delta_text_delta: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
76
76
|
|
|
77
77
|
# --
|
|
78
|
-
# : (
|
|
79
|
-
def handle_content_block_delta_tool_use: (
|
|
78
|
+
# : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
79
|
+
def handle_content_block_delta_tool_use: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
80
80
|
|
|
81
81
|
# --
|
|
82
|
-
# : (
|
|
83
|
-
def handle_content_block_stop_text_delta: (
|
|
82
|
+
# : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
83
|
+
def handle_content_block_stop_text_delta: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
84
84
|
|
|
85
85
|
# --
|
|
86
|
-
# : (
|
|
87
|
-
def handle_content_block_stop_tool_use: (
|
|
86
|
+
# : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
87
|
+
def handle_content_block_stop_tool_use: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
88
88
|
|
|
89
89
|
# --
|
|
90
|
-
# : (
|
|
91
|
-
def handle_metadata_usage: (
|
|
90
|
+
# : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
91
|
+
def handle_metadata_usage: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
92
92
|
|
|
93
93
|
# --
|
|
94
94
|
# : (Array[Riffer::Messages::Base]) -> Hash[Symbol, untyped]
|
|
@@ -27,20 +27,20 @@ class Riffer::Providers::Anthropic < Riffer::Providers::Base
|
|
|
27
27
|
def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
|
|
28
28
|
|
|
29
29
|
# --
|
|
30
|
-
# : (Hash[Symbol, untyped]) ->
|
|
31
|
-
def execute_generate: (Hash[Symbol, untyped]) ->
|
|
30
|
+
# : (Hash[Symbol, untyped]) -> untyped
|
|
31
|
+
def execute_generate: (Hash[Symbol, untyped]) -> untyped
|
|
32
32
|
|
|
33
33
|
# --
|
|
34
|
-
# : (
|
|
35
|
-
def extract_token_usage: (
|
|
34
|
+
# : (untyped) -> Riffer::Providers::TokenUsage?
|
|
35
|
+
def extract_token_usage: (untyped) -> Riffer::Providers::TokenUsage?
|
|
36
36
|
|
|
37
37
|
# --
|
|
38
|
-
# : (
|
|
39
|
-
def extract_content: (
|
|
38
|
+
# : (untyped) -> String
|
|
39
|
+
def extract_content: (untyped) -> String
|
|
40
40
|
|
|
41
41
|
# --
|
|
42
|
-
# : (
|
|
43
|
-
def extract_tool_calls: (
|
|
42
|
+
# : (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
|
|
43
|
+
def extract_tool_calls: (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
|
|
44
44
|
|
|
45
45
|
# --
|
|
46
46
|
# : (Hash[Symbol, untyped], Enumerator::Yielder) -> void
|
|
@@ -87,8 +87,8 @@ class Riffer::Providers::Anthropic < Riffer::Providers::Base
|
|
|
87
87
|
def handle_content_block_stop_web_search_result: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
88
88
|
|
|
89
89
|
# --
|
|
90
|
-
# : (untyped, accumulated_message:
|
|
91
|
-
def handle_message_stop: (untyped, accumulated_message:
|
|
90
|
+
# : (untyped, accumulated_message: untyped, yielder: Enumerator::Yielder) -> void
|
|
91
|
+
def handle_message_stop: (untyped, accumulated_message: untyped, yielder: Enumerator::Yielder) -> void
|
|
92
92
|
|
|
93
93
|
# --
|
|
94
94
|
# : (Array[Riffer::Messages::Base]) -> Hash[Symbol, untyped]
|
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
# [extract_content] extract text content from the SDK response
|
|
15
15
|
# [extract_tool_calls] extract tool calls from the SDK response
|
|
16
16
|
class Riffer::Providers::Base
|
|
17
|
+
@current_tools: Array[singleton(Riffer::Tool)]
|
|
18
|
+
|
|
17
19
|
include Riffer::Helpers::Dependencies
|
|
18
20
|
|
|
19
21
|
include Riffer::Messages::Converter
|
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
# Google Gemini provider for Gemini models via the Gemini REST API.
|
|
4
4
|
class Riffer::Providers::Gemini < Riffer::Providers::Base
|
|
5
|
+
@read_timeout: Integer
|
|
6
|
+
|
|
7
|
+
@open_timeout: Integer
|
|
8
|
+
|
|
9
|
+
@api_key: String?
|
|
10
|
+
|
|
5
11
|
BASE_URI: URI::Generic
|
|
6
12
|
|
|
7
13
|
VALID_MODEL_PATTERN: Regexp
|
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
#
|
|
5
5
|
# No external gems required.
|
|
6
6
|
class Riffer::Providers::Mock < Riffer::Providers::Base
|
|
7
|
+
@stubbed_responses: Array[Hash[Symbol, untyped]]
|
|
8
|
+
|
|
9
|
+
@current_index: Integer
|
|
10
|
+
|
|
11
|
+
@responses: Array[Hash[Symbol, untyped]]
|
|
12
|
+
|
|
7
13
|
# Returns the preferred skill adapter for the given mock model.
|
|
8
14
|
#
|
|
9
15
|
# Mock is used to stand in for any real provider in tests, so the model
|
|
@@ -19,20 +19,20 @@ class Riffer::Providers::OpenAI < Riffer::Providers::Base
|
|
|
19
19
|
def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
|
|
20
20
|
|
|
21
21
|
# --
|
|
22
|
-
# : (Hash[Symbol, untyped]) ->
|
|
23
|
-
def execute_generate: (Hash[Symbol, untyped]) ->
|
|
22
|
+
# : (Hash[Symbol, untyped]) -> untyped
|
|
23
|
+
def execute_generate: (Hash[Symbol, untyped]) -> untyped
|
|
24
24
|
|
|
25
25
|
# --
|
|
26
|
-
# : (
|
|
27
|
-
def extract_token_usage: (
|
|
26
|
+
# : (untyped) -> Riffer::Providers::TokenUsage?
|
|
27
|
+
def extract_token_usage: (untyped) -> Riffer::Providers::TokenUsage?
|
|
28
28
|
|
|
29
29
|
# --
|
|
30
|
-
# : (
|
|
31
|
-
def extract_content: (
|
|
30
|
+
# : (untyped) -> String
|
|
31
|
+
def extract_content: (untyped) -> String
|
|
32
32
|
|
|
33
33
|
# --
|
|
34
|
-
# : (
|
|
35
|
-
def extract_tool_calls: (
|
|
34
|
+
# : (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
|
|
35
|
+
def extract_tool_calls: (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
|
|
36
36
|
|
|
37
37
|
# --
|
|
38
38
|
# : (Hash[Symbol, untyped], Enumerator::Yielder) -> void
|
|
@@ -24,48 +24,48 @@ class Riffer::Providers::OpenRouter < Riffer::Providers::Base
|
|
|
24
24
|
def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
|
|
25
25
|
|
|
26
26
|
# --
|
|
27
|
-
# : (Hash[Symbol, untyped]) ->
|
|
28
|
-
def execute_generate: (Hash[Symbol, untyped]) ->
|
|
27
|
+
# : (Hash[Symbol, untyped]) -> untyped
|
|
28
|
+
def execute_generate: (Hash[Symbol, untyped]) -> untyped
|
|
29
29
|
|
|
30
30
|
# --
|
|
31
|
-
# : (
|
|
32
|
-
def extract_token_usage: (
|
|
31
|
+
# : (untyped) -> Riffer::Providers::TokenUsage?
|
|
32
|
+
def extract_token_usage: (untyped) -> Riffer::Providers::TokenUsage?
|
|
33
33
|
|
|
34
34
|
# --
|
|
35
|
-
# : (
|
|
36
|
-
def extract_content: (
|
|
35
|
+
# : (untyped) -> String
|
|
36
|
+
def extract_content: (untyped) -> String
|
|
37
37
|
|
|
38
38
|
# --
|
|
39
|
-
# : (
|
|
40
|
-
def extract_tool_calls: (
|
|
39
|
+
# : (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
|
|
40
|
+
def extract_tool_calls: (untyped) -> Array[Riffer::Messages::Assistant::ToolCall]
|
|
41
41
|
|
|
42
42
|
# --
|
|
43
43
|
# : (Hash[Symbol, untyped], Enumerator::Yielder) -> void
|
|
44
44
|
def execute_stream: (Hash[Symbol, untyped], Enumerator::Yielder) -> void
|
|
45
45
|
|
|
46
46
|
# --
|
|
47
|
-
# : (
|
|
48
|
-
def handle_stream_chunk: (
|
|
47
|
+
# : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
48
|
+
def handle_stream_chunk: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
49
49
|
|
|
50
50
|
# --
|
|
51
|
-
# : (
|
|
52
|
-
def handle_text_delta: (
|
|
51
|
+
# : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
52
|
+
def handle_text_delta: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
53
53
|
|
|
54
54
|
# --
|
|
55
55
|
# : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
56
56
|
def handle_reasoning_delta: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
57
57
|
|
|
58
58
|
# --
|
|
59
|
-
# : (
|
|
60
|
-
def handle_tool_call_deltas: (
|
|
59
|
+
# : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
60
|
+
def handle_tool_call_deltas: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
61
61
|
|
|
62
62
|
# --
|
|
63
63
|
# : (state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
64
64
|
def emit_tool_call_done_events: (state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
65
65
|
|
|
66
66
|
# --
|
|
67
|
-
# : (
|
|
68
|
-
def finish_reason_is_tool_calls?: (
|
|
67
|
+
# : (untyped) -> bool
|
|
68
|
+
def finish_reason_is_tool_calls?: (untyped) -> bool
|
|
69
69
|
|
|
70
70
|
# --
|
|
71
71
|
# : (Array[Riffer::Messages::Base]) -> Array[Hash[Symbol, untyped]]
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# runner = Riffer::Runner::Fibers.new
|
|
13
13
|
# runner.map(items) { |item| expensive_operation(item) }
|
|
14
14
|
class Riffer::Runner::Fibers < Riffer::Runner
|
|
15
|
+
@max_concurrency: Integer?
|
|
16
|
+
|
|
15
17
|
include Riffer::Helpers::Dependencies
|
|
16
18
|
|
|
17
19
|
# [max_concurrency] maximum number of fibers to run simultaneously.
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# runner = Riffer::Runner::Threaded.new(max_concurrency: 3)
|
|
13
13
|
# runner.map(items) { |item| expensive_operation(item) }
|
|
14
14
|
class Riffer::Runner::Threaded < Riffer::Runner
|
|
15
|
+
@max_concurrency: Integer
|
|
16
|
+
|
|
15
17
|
DEFAULT_MAX_CONCURRENCY: Integer
|
|
16
18
|
|
|
17
19
|
# [max_concurrency] maximum number of threads to run simultaneously.
|
|
@@ -10,6 +10,14 @@
|
|
|
10
10
|
# activate ["code-review"]
|
|
11
11
|
# end
|
|
12
12
|
class Riffer::Skills::Config
|
|
13
|
+
@backend: (Riffer::Skills::Backend | Proc)?
|
|
14
|
+
|
|
15
|
+
@adapter: singleton(Riffer::Skills::Adapter)?
|
|
16
|
+
|
|
17
|
+
@activate: (Array[String] | Proc)?
|
|
18
|
+
|
|
19
|
+
@activate_tool: singleton(Riffer::Tool)?
|
|
20
|
+
|
|
13
21
|
# Creates a new Config with all options unset.
|
|
14
22
|
#
|
|
15
23
|
# --
|
|
@@ -10,6 +10,10 @@
|
|
|
10
10
|
#
|
|
11
11
|
# See Riffer::Skills::Backend, Riffer::Skills::Frontmatter.
|
|
12
12
|
class Riffer::Skills::Context
|
|
13
|
+
@backend: Riffer::Skills::Backend
|
|
14
|
+
|
|
15
|
+
@activated: Hash[String, String]
|
|
16
|
+
|
|
13
17
|
# Skill catalog indexed by name.
|
|
14
18
|
attr_reader skills: Hash[String, Riffer::Skills::Frontmatter]
|
|
15
19
|
|
|
@@ -9,6 +9,10 @@
|
|
|
9
9
|
# backend.list_skills # => [Riffer::Skills::Frontmatter, ...]
|
|
10
10
|
# backend.read_skill("code-review") # => "Full skill instructions..."
|
|
11
11
|
class Riffer::Skills::FilesystemBackend < Riffer::Skills::Backend
|
|
12
|
+
@paths: Array[String]
|
|
13
|
+
|
|
14
|
+
@skills_cache: Hash[String, String]?
|
|
15
|
+
|
|
12
16
|
# Creates a new FilesystemBackend.
|
|
13
17
|
#
|
|
14
18
|
# [paths] one or more directory paths to scan for skills.
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
# runtime = Riffer::Tools::Runtime::Inline.new
|
|
12
12
|
# results = runtime.execute(tool_calls, tools: tools, context: context)
|
|
13
13
|
class Riffer::Tools::Runtime
|
|
14
|
+
@runner: Riffer::Runner
|
|
15
|
+
|
|
14
16
|
# [runner] the concurrency runner to use for batch execution.
|
|
15
17
|
#
|
|
16
18
|
# Subclasses must provide a runner; instantiating Riffer::Tools::Runtime directly
|
|
@@ -21,6 +21,18 @@
|
|
|
21
21
|
# end
|
|
22
22
|
# end
|
|
23
23
|
module Riffer::Tools::Toolable
|
|
24
|
+
@kind: Symbol?
|
|
25
|
+
|
|
26
|
+
@params_builder: Riffer::Params?
|
|
27
|
+
|
|
28
|
+
@timeout: (Integer | Float)?
|
|
29
|
+
|
|
30
|
+
@identifier: String?
|
|
31
|
+
|
|
32
|
+
@description: String?
|
|
33
|
+
|
|
34
|
+
self.@extenders: Array[Module]?
|
|
35
|
+
|
|
24
36
|
DEFAULT_TIMEOUT: Integer
|
|
25
37
|
|
|
26
38
|
# Tracks all classes that extend Toolable.
|
data/sig/generated/riffer.rbs
CHANGED
data/sig/manifest.yaml
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# Toolable is extended onto tool classes; its instance methods run as class
|
|
2
|
+
# methods on the extender, which is also extended with ClassNameConverter
|
|
3
|
+
# (see Toolable.extended). The include models that method availability for Steep.
|
|
4
|
+
module Riffer::Tools::Toolable
|
|
5
|
+
include Riffer::Helpers::ClassNameConverter
|
|
6
|
+
end
|