riffer 0.27.2 → 0.29.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/architecture.md +18 -11
- data/.agents/code-style.md +1 -1
- data/.agents/rbs-inline.md +2 -2
- data/.agents/testing.md +9 -5
- data/.release-please-manifest.json +1 -1
- data/AGENTS.md +17 -10
- data/CHANGELOG.md +31 -0
- data/README.md +17 -18
- data/Steepfile +7 -1
- data/docs/03_AGENTS.md +34 -3
- data/docs/04_AGENT_LIFECYCLE.md +134 -86
- data/docs/05_AGENT_LOOP.md +2 -2
- data/docs/06_TOOLS.md +9 -4
- data/docs/07_TOOL_ADVANCED.md +23 -19
- data/docs/08_MESSAGES.md +28 -31
- data/docs/09_STREAM_EVENTS.md +1 -1
- data/docs/10_CONFIGURATION.md +25 -15
- data/docs/providers/01_PROVIDERS.md +6 -0
- data/docs/providers/06_MOCK_PROVIDER.md +2 -1
- data/docs/providers/07_CUSTOM_PROVIDERS.md +4 -4
- data/docs/providers/08_GEMINI.md +2 -2
- data/docs/providers/09_OPENROUTER.md +242 -0
- data/lib/riffer/agent/config.rb +173 -0
- data/lib/riffer/agent/context.rb +125 -0
- data/lib/riffer/agent/response.rb +11 -2
- data/lib/riffer/agent/run.rb +308 -0
- data/lib/riffer/agent/session/repair.rb +112 -0
- data/lib/riffer/agent/session.rb +268 -0
- data/lib/riffer/{structured_output → agent/structured_output}/result.rb +1 -1
- data/lib/riffer/{structured_output.rb → agent/structured_output.rb} +4 -4
- data/lib/riffer/agent.rb +246 -684
- data/lib/riffer/config.rb +56 -7
- data/lib/riffer/evals/evaluator.rb +13 -3
- data/lib/riffer/evals/judge.rb +2 -2
- data/lib/riffer/evals/run_result.rb +2 -1
- data/lib/riffer/evals/scenario_result.rb +2 -1
- data/lib/riffer/guardrails/runner.rb +3 -2
- data/lib/riffer/helpers/call_or_value.rb +16 -0
- data/lib/riffer/helpers.rb +0 -1
- data/lib/riffer/mcp/authenticated_tool.rb +4 -0
- data/lib/riffer/mcp/client.rb +1 -1
- data/lib/riffer/mcp/registration.rb +2 -3
- data/lib/riffer/mcp/registry.rb +3 -1
- data/lib/riffer/mcp/tool_factory.rb +5 -0
- data/lib/riffer/messages/assistant.rb +9 -3
- data/lib/riffer/messages/base.rb +22 -0
- data/lib/riffer/messages/converter.rb +6 -6
- data/lib/riffer/{file_part.rb → messages/file_part.rb} +5 -5
- data/lib/riffer/messages/tool.rb +1 -1
- data/lib/riffer/messages/user.rb +4 -4
- data/lib/riffer/{boolean.rb → params/boolean.rb} +3 -3
- data/lib/riffer/{param.rb → params/param.rb} +6 -6
- data/lib/riffer/params.rb +27 -21
- data/lib/riffer/providers/amazon_bedrock.rb +19 -20
- data/lib/riffer/providers/anthropic.rb +27 -28
- data/lib/riffer/providers/base.rb +10 -9
- data/lib/riffer/providers/gemini.rb +15 -12
- data/lib/riffer/providers/mock.rb +41 -13
- data/lib/riffer/providers/open_ai.rb +24 -22
- data/lib/riffer/providers/open_router.rb +318 -0
- data/lib/riffer/providers/repository.rb +1 -0
- data/lib/riffer/{token_usage.rb → providers/token_usage.rb} +4 -4
- data/lib/riffer/providers.rb +1 -0
- data/lib/riffer/runner/fibers.rb +4 -3
- data/lib/riffer/runner/sequential.rb +1 -1
- data/lib/riffer/runner/threaded.rb +1 -1
- data/lib/riffer/runner.rb +1 -1
- data/lib/riffer/skills/activate_tool.rb +4 -3
- data/lib/riffer/skills/config.rb +1 -1
- data/lib/riffer/skills/context.rb +3 -3
- data/lib/riffer/skills/filesystem_backend.rb +7 -5
- data/lib/riffer/skills/markdown_adapter.rb +1 -1
- data/lib/riffer/skills/xml_adapter.rb +1 -1
- data/lib/riffer/stream_events/interrupt.rb +10 -3
- data/lib/riffer/stream_events/token_usage_done.rb +2 -2
- data/lib/riffer/stream_events/web_search_status.rb +1 -1
- data/lib/riffer/tool.rb +3 -3
- data/lib/riffer/{tool_runtime → tools/runtime}/fibers.rb +2 -2
- data/lib/riffer/{tool_runtime → tools/runtime}/inline.rb +1 -1
- data/lib/riffer/{tool_runtime → tools/runtime}/threaded.rb +2 -2
- data/lib/riffer/{tool_runtime.rb → tools/runtime.rb} +21 -15
- data/lib/riffer/{toolable.rb → tools/toolable.rb} +12 -9
- data/lib/riffer/version.rb +1 -1
- data/lib/riffer.rb +2 -1
- data/sig/generated/riffer/agent/config.rbs +119 -0
- data/sig/generated/riffer/agent/context.rbs +91 -0
- data/sig/generated/riffer/agent/response.rbs +10 -2
- data/sig/generated/riffer/agent/run.rbs +144 -0
- data/sig/generated/riffer/agent/session/repair.rbs +51 -0
- data/sig/generated/riffer/agent/session.rbs +145 -0
- data/sig/generated/riffer/{structured_output → agent/structured_output}/result.rbs +2 -2
- data/sig/generated/riffer/{structured_output.rbs → agent/structured_output.rbs} +6 -6
- data/sig/generated/riffer/agent.rbs +154 -225
- data/sig/generated/riffer/config.rbs +50 -5
- data/sig/generated/riffer/evals/judge.rbs +2 -2
- data/sig/generated/riffer/helpers/call_or_value.rbs +9 -0
- data/sig/generated/riffer/helpers.rbs +0 -1
- data/sig/generated/riffer/messages/assistant.rbs +7 -3
- data/sig/generated/riffer/messages/base.rbs +18 -0
- data/sig/generated/riffer/messages/converter.rbs +4 -4
- data/sig/generated/riffer/{file_part.rbs → messages/file_part.rbs} +5 -5
- data/sig/generated/riffer/messages/user.rbs +4 -4
- data/sig/generated/riffer/params/boolean.rbs +10 -0
- data/sig/generated/riffer/{param.rbs → params/param.rbs} +3 -3
- data/sig/generated/riffer/params.rbs +15 -15
- data/sig/generated/riffer/providers/amazon_bedrock.rbs +22 -22
- data/sig/generated/riffer/providers/anthropic.rbs +4 -4
- data/sig/generated/riffer/providers/base.rbs +10 -10
- data/sig/generated/riffer/providers/gemini.rbs +4 -4
- data/sig/generated/riffer/providers/mock.rbs +25 -5
- data/sig/generated/riffer/providers/open_ai.rbs +4 -4
- data/sig/generated/riffer/providers/open_router.rbs +85 -0
- data/sig/generated/riffer/{token_usage.rbs → providers/token_usage.rbs} +5 -5
- data/sig/generated/riffer/providers.rbs +1 -0
- data/sig/generated/riffer/runner/fibers.rbs +2 -2
- data/sig/generated/riffer/runner/sequential.rbs +2 -2
- data/sig/generated/riffer/runner/threaded.rbs +2 -2
- data/sig/generated/riffer/runner.rbs +2 -2
- data/sig/generated/riffer/skills/activate_tool.rbs +4 -3
- data/sig/generated/riffer/skills/config.rbs +1 -1
- data/sig/generated/riffer/skills/context.rbs +2 -2
- data/sig/generated/riffer/stream_events/interrupt.rbs +7 -2
- data/sig/generated/riffer/stream_events/token_usage_done.rbs +3 -3
- data/sig/generated/riffer/tool.rbs +5 -5
- data/sig/generated/riffer/{tool_runtime → tools/runtime}/fibers.rbs +3 -3
- data/sig/generated/riffer/{tool_runtime → tools/runtime}/inline.rbs +2 -2
- data/sig/generated/riffer/{tool_runtime → tools/runtime}/threaded.rbs +3 -3
- data/sig/generated/riffer/{tool_runtime.rbs → tools/runtime.rbs} +19 -13
- data/sig/generated/riffer/{toolable.rbs → tools/toolable.rbs} +6 -6
- data/sig/stubs/agent_ivars.rbs +7 -0
- data/sig/stubs/async.rbs +24 -0
- data/sig/stubs/aws-sdk-core/seahorse_request_context.rbs +7 -0
- data/sig/stubs/aws-sdk-core/static_token_provider.rbs +5 -0
- data/sig/stubs/extend_self.rbs +11 -0
- data/sig/stubs/lib_ivars.rbs +101 -0
- data/sig/stubs/mcp_sdk.rbs +22 -0
- data/sig/stubs/provider_ivars.rbs +36 -0
- data/sig/stubs/provider_sdk_methods.rbs +50 -0
- data/sig/stubs/zeitwerk.rbs +12 -0
- metadata +54 -33
- data/lib/riffer/core.rb +0 -28
- data/lib/riffer/helpers/validations.rb +0 -18
- data/sig/generated/riffer/boolean.rbs +0 -10
- data/sig/generated/riffer/core.rbs +0 -19
- data/sig/generated/riffer/helpers/validations.rbs +0 -12
|
@@ -28,6 +28,24 @@ class Riffer::Messages::Base
|
|
|
28
28
|
# : () -> Symbol
|
|
29
29
|
def role: () -> Symbol
|
|
30
30
|
|
|
31
|
+
# Whether this message carries pending tool calls. Defaults to +false+;
|
|
32
|
+
# +Riffer::Messages::Assistant+ overrides this when its +tool_calls+
|
|
33
|
+
# array is non-empty.
|
|
34
|
+
#
|
|
35
|
+
# --
|
|
36
|
+
# : () -> bool
|
|
37
|
+
def has_tool_calls?: () -> bool
|
|
38
|
+
|
|
39
|
+
# Merges another same-role message into this one.
|
|
40
|
+
#
|
|
41
|
+
# Raises NotImplementedError unless implemented by subclass. Mergeable
|
|
42
|
+
# message types (+User+, +Assistant+, +System+) override this; +Tool+
|
|
43
|
+
# messages are never merged.
|
|
44
|
+
#
|
|
45
|
+
# --
|
|
46
|
+
# : (untyped) -> Riffer::Messages::Base
|
|
47
|
+
def +: (untyped) -> Riffer::Messages::Base
|
|
48
|
+
|
|
31
49
|
private
|
|
32
50
|
|
|
33
51
|
# : () -> String?
|
|
@@ -12,18 +12,18 @@ module Riffer::Messages::Converter
|
|
|
12
12
|
# : ((Hash[Symbol, untyped] | Riffer::Messages::Base)) -> Riffer::Messages::Base
|
|
13
13
|
def convert_to_message_object: (Hash[Symbol, untyped] | Riffer::Messages::Base) -> Riffer::Messages::Base
|
|
14
14
|
|
|
15
|
-
# Converts a hash or FilePart object to a Riffer::FilePart.
|
|
15
|
+
# Converts a hash or FilePart object to a Riffer::Messages::FilePart.
|
|
16
16
|
#
|
|
17
17
|
# Accepts:
|
|
18
|
-
# - +Riffer::FilePart+ objects (passed through)
|
|
18
|
+
# - +Riffer::Messages::FilePart+ objects (passed through)
|
|
19
19
|
# - <tt>{url: "https://...", media_type: "..."}</tt> (URL source)
|
|
20
20
|
# - <tt>{data: "...", media_type: "..."}</tt> (raw base64)
|
|
21
21
|
#
|
|
22
22
|
# Raises Riffer::ArgumentError if the hash format is invalid.
|
|
23
23
|
#
|
|
24
24
|
# --
|
|
25
|
-
# : ((Hash[Symbol, untyped] | Riffer::FilePart)) -> Riffer::FilePart
|
|
26
|
-
def convert_to_file_part: (Hash[Symbol, untyped] | Riffer::FilePart) -> Riffer::FilePart
|
|
25
|
+
# : ((Hash[Symbol, untyped] | Riffer::Messages::FilePart)) -> Riffer::Messages::FilePart
|
|
26
|
+
def convert_to_file_part: (Hash[Symbol, untyped] | Riffer::Messages::FilePart) -> Riffer::Messages::FilePart
|
|
27
27
|
|
|
28
28
|
private
|
|
29
29
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Generated from lib/riffer/file_part.rb with RBS::Inline
|
|
1
|
+
# Generated from lib/riffer/messages/file_part.rb with RBS::Inline
|
|
2
2
|
|
|
3
3
|
# Represents a file attachment (image or document) in a conversation.
|
|
4
4
|
#
|
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
# - URLs (stored and passed to providers that support them via +from_url+)
|
|
7
7
|
# - Raw base64 data (via +new+)
|
|
8
8
|
#
|
|
9
|
-
# file = Riffer::FilePart.from_url("https://example.com/doc.pdf", media_type: "application/pdf")
|
|
9
|
+
# file = Riffer::Messages::FilePart.from_url("https://example.com/doc.pdf", media_type: "application/pdf")
|
|
10
10
|
# file.url? # => true
|
|
11
11
|
# file.document? # => true
|
|
12
|
-
class Riffer::FilePart
|
|
12
|
+
class Riffer::Messages::FilePart
|
|
13
13
|
MEDIA_TYPES: Hash[String, String]
|
|
14
14
|
|
|
15
15
|
SUPPORTED_MEDIA_TYPES: Array[String]
|
|
@@ -39,8 +39,8 @@ class Riffer::FilePart
|
|
|
39
39
|
# Raises Riffer::ArgumentError if media_type cannot be detected.
|
|
40
40
|
#
|
|
41
41
|
# --
|
|
42
|
-
# : (String, ?media_type: String?) -> Riffer::FilePart
|
|
43
|
-
def self.from_url: (String, ?media_type: String?) -> Riffer::FilePart
|
|
42
|
+
# : (String, ?media_type: String?) -> Riffer::Messages::FilePart
|
|
43
|
+
def self.from_url: (String, ?media_type: String?) -> Riffer::Messages::FilePart
|
|
44
44
|
|
|
45
45
|
# Returns the base64-encoded data, or nil for URL-only sources.
|
|
46
46
|
attr_reader data: String?
|
|
@@ -7,16 +7,16 @@
|
|
|
7
7
|
# msg.content # => "Hello!"
|
|
8
8
|
#
|
|
9
9
|
# msg = Riffer::Messages::User.new("Describe this image", files: [file_part])
|
|
10
|
-
# msg.files # => [#<Riffer::FilePart ...>]
|
|
10
|
+
# msg.files # => [#<Riffer::Messages::FilePart ...>]
|
|
11
11
|
class Riffer::Messages::User < Riffer::Messages::Base
|
|
12
12
|
# File attachments for this message.
|
|
13
|
-
attr_reader files: Array[Riffer::FilePart]
|
|
13
|
+
attr_reader files: Array[Riffer::Messages::FilePart]
|
|
14
14
|
|
|
15
15
|
# Initializes a user message.
|
|
16
16
|
#
|
|
17
17
|
# --
|
|
18
|
-
# : (String, ?id: String?, ?files: Array[Riffer::FilePart]) -> void
|
|
19
|
-
def initialize: (String, ?id: String?, ?files: Array[Riffer::FilePart]) -> void
|
|
18
|
+
# : (String, ?id: String?, ?files: Array[Riffer::Messages::FilePart]) -> void
|
|
19
|
+
def initialize: (String, ?id: String?, ?files: Array[Riffer::Messages::FilePart]) -> void
|
|
20
20
|
|
|
21
21
|
# --
|
|
22
22
|
# : () -> Symbol
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Generated from lib/riffer/params/boolean.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
# Riffer::Params::Boolean is a sentinel type for declaring boolean parameters.
|
|
4
|
+
#
|
|
5
|
+
# Ruby has no +Boolean+ class (+true+ is +TrueClass+, +false+ is +FalseClass+).
|
|
6
|
+
# Use this module wherever you need a single type that means "boolean":
|
|
7
|
+
#
|
|
8
|
+
# required :verbose, Riffer::Params::Boolean
|
|
9
|
+
module Riffer::Params::Boolean
|
|
10
|
+
end
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# Generated from lib/riffer/param.rb with RBS::Inline
|
|
1
|
+
# Generated from lib/riffer/params/param.rb with RBS::Inline
|
|
2
2
|
|
|
3
|
-
# Riffer::Param represents a single parameter definition.
|
|
3
|
+
# Riffer::Params::Param represents a single parameter definition.
|
|
4
4
|
#
|
|
5
5
|
# Handles type validation and JSON Schema generation for individual parameters.
|
|
6
|
-
class Riffer::Param
|
|
6
|
+
class Riffer::Params::Param
|
|
7
7
|
# Maps Ruby types to JSON Schema type strings
|
|
8
8
|
TYPE_MAPPINGS: Hash[Module, String]
|
|
9
9
|
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
# optional :units, String, default: "celsius", enum: ["celsius", "fahrenheit"]
|
|
11
11
|
# end
|
|
12
12
|
class Riffer::Params
|
|
13
|
-
attr_reader parameters: Array[Riffer::Param]
|
|
13
|
+
attr_reader parameters: Array[Riffer::Params::Param]
|
|
14
14
|
|
|
15
15
|
# --
|
|
16
16
|
# : () -> void
|
|
@@ -19,14 +19,14 @@ class Riffer::Params
|
|
|
19
19
|
# Defines a required parameter.
|
|
20
20
|
#
|
|
21
21
|
# --
|
|
22
|
-
# : (Symbol, Class, ?description: String?, ?enum: Array[untyped]?, ?of: Class?) ?{ () -> void } -> void
|
|
23
|
-
def required: (Symbol, Class, ?description: String?, ?enum: Array[untyped]?, ?of: Class?) ?{ () -> void } -> void
|
|
22
|
+
# : (Symbol, Class, ?description: String?, ?enum: Array[untyped]?, ?of: Class?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
|
|
23
|
+
def required: (Symbol, Class, ?description: String?, ?enum: Array[untyped]?, ?of: Class?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
|
|
24
24
|
|
|
25
25
|
# Defines an optional parameter.
|
|
26
26
|
#
|
|
27
27
|
# --
|
|
28
|
-
# : (Symbol, Class, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?of: Class?) ?{ () -> void } -> void
|
|
29
|
-
def optional: (Symbol, Class, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?of: Class?) ?{ () -> void } -> void
|
|
28
|
+
# : (Symbol, Class, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?of: Class?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
|
|
29
|
+
def optional: (Symbol, Class, ?description: String?, ?enum: Array[untyped]?, ?default: untyped, ?of: Class?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> void
|
|
30
30
|
|
|
31
31
|
# Validates arguments against parameter definitions.
|
|
32
32
|
#
|
|
@@ -49,22 +49,22 @@ class Riffer::Params
|
|
|
49
49
|
private
|
|
50
50
|
|
|
51
51
|
# --
|
|
52
|
-
# : (Class, Class?) ?{ () -> void } -> Riffer::Params?
|
|
53
|
-
def build_nested: (Class, Class?) ?{ () -> void } -> Riffer::Params?
|
|
52
|
+
# : (Class, Class?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> Riffer::Params?
|
|
53
|
+
def build_nested: (Class, Class?) ?{ (Riffer::Params) [self: Riffer::Params] -> void } -> Riffer::Params?
|
|
54
54
|
|
|
55
55
|
# --
|
|
56
|
-
# : (Riffer::Param, untyped, Array[String]) -> untyped
|
|
57
|
-
def validate_nested: (Riffer::Param, untyped, Array[String]) -> untyped
|
|
56
|
+
# : (Riffer::Params::Param, untyped, Array[String]) -> untyped
|
|
57
|
+
def validate_nested: (Riffer::Params::Param, untyped, Array[String]) -> untyped
|
|
58
58
|
|
|
59
59
|
# --
|
|
60
|
-
# : (Riffer::Param, Hash[Symbol, untyped], Array[String]) -> Hash[Symbol, untyped]
|
|
61
|
-
def validate_nested_hash: (Riffer::Param, Hash[Symbol, untyped], Array[String]) -> Hash[Symbol, untyped]
|
|
60
|
+
# : (Riffer::Params::Param, Hash[Symbol, untyped], Array[String]) -> Hash[Symbol, untyped]
|
|
61
|
+
def validate_nested_hash: (Riffer::Params::Param, Hash[Symbol, untyped], Array[String]) -> Hash[Symbol, untyped]
|
|
62
62
|
|
|
63
63
|
# --
|
|
64
|
-
# : (Riffer::Param, Array[untyped], Array[String]) -> Array[untyped]
|
|
65
|
-
def validate_nested_array_of_objects: (Riffer::Param, Array[untyped], Array[String]) -> Array[untyped]
|
|
64
|
+
# : (Riffer::Params::Param, Array[untyped], Array[String]) -> Array[untyped]
|
|
65
|
+
def validate_nested_array_of_objects: (Riffer::Params::Param, Array[untyped], Array[String]) -> Array[untyped]
|
|
66
66
|
|
|
67
67
|
# --
|
|
68
|
-
# : (Riffer::Param, Array[untyped], Array[String]) -> void
|
|
69
|
-
def validate_typed_array: (Riffer::Param, Array[untyped], Array[String]) -> void
|
|
68
|
+
# : (Riffer::Params::Param, Array[untyped], Array[String]) -> void
|
|
69
|
+
def validate_typed_array: (Riffer::Params::Param, Array[untyped], Array[String]) -> void
|
|
70
70
|
end
|
|
@@ -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]) -> Aws::BedrockRuntime::
|
|
38
|
-
def execute_generate: (Hash[Symbol, untyped]) -> Aws::BedrockRuntime::
|
|
37
|
+
# : (Hash[Symbol, untyped]) -> Aws::BedrockRuntime::Client::_ConverseResponseSuccess
|
|
38
|
+
def execute_generate: (Hash[Symbol, untyped]) -> Aws::BedrockRuntime::Client::_ConverseResponseSuccess
|
|
39
39
|
|
|
40
40
|
# --
|
|
41
|
-
# : (Aws::BedrockRuntime::
|
|
42
|
-
def extract_token_usage: (Aws::BedrockRuntime::
|
|
41
|
+
# : (Aws::BedrockRuntime::Client::_ConverseResponseSuccess) -> Riffer::Providers::TokenUsage?
|
|
42
|
+
def extract_token_usage: (Aws::BedrockRuntime::Client::_ConverseResponseSuccess) -> Riffer::Providers::TokenUsage?
|
|
43
43
|
|
|
44
44
|
# --
|
|
45
|
-
# : (Aws::BedrockRuntime::
|
|
46
|
-
def extract_content: (Aws::BedrockRuntime::
|
|
45
|
+
# : (Aws::BedrockRuntime::Client::_ConverseResponseSuccess) -> String
|
|
46
|
+
def extract_content: (Aws::BedrockRuntime::Client::_ConverseResponseSuccess) -> String
|
|
47
47
|
|
|
48
48
|
# --
|
|
49
|
-
# : (Aws::BedrockRuntime::
|
|
50
|
-
def extract_tool_calls: (Aws::BedrockRuntime::
|
|
49
|
+
# : (Aws::BedrockRuntime::Client::_ConverseResponseSuccess) -> Array[Riffer::Messages::Assistant::ToolCall]
|
|
50
|
+
def extract_tool_calls: (Aws::BedrockRuntime::Client::_ConverseResponseSuccess) -> 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
|
-
# : (Aws::BedrockRuntime::Types::ContentBlockStartEvent, state: Hash[Symbol, untyped], yielder: Enumerator
|
|
71
|
-
def handle_content_block_start_tool_use: (Aws::BedrockRuntime::Types::ContentBlockStartEvent, state: Hash[Symbol, untyped], yielder: Enumerator
|
|
70
|
+
# : (Aws::BedrockRuntime::Types::ContentBlockStartEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
71
|
+
def handle_content_block_start_tool_use: (Aws::BedrockRuntime::Types::ContentBlockStartEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
72
72
|
|
|
73
73
|
# --
|
|
74
|
-
# : (Aws::BedrockRuntime::Types::ContentBlockDeltaEvent, state: Hash[Symbol, untyped], yielder: Enumerator
|
|
75
|
-
def handle_content_block_delta_text_delta: (Aws::BedrockRuntime::Types::ContentBlockDeltaEvent, state: Hash[Symbol, untyped], yielder: Enumerator
|
|
74
|
+
# : (Aws::BedrockRuntime::Types::ContentBlockDeltaEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
75
|
+
def handle_content_block_delta_text_delta: (Aws::BedrockRuntime::Types::ContentBlockDeltaEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
76
76
|
|
|
77
77
|
# --
|
|
78
|
-
# : (Aws::BedrockRuntime::Types::ContentBlockDeltaEvent, state: Hash[Symbol, untyped], yielder: Enumerator
|
|
79
|
-
def handle_content_block_delta_tool_use: (Aws::BedrockRuntime::Types::ContentBlockDeltaEvent, state: Hash[Symbol, untyped], yielder: Enumerator
|
|
78
|
+
# : (Aws::BedrockRuntime::Types::ContentBlockDeltaEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
79
|
+
def handle_content_block_delta_tool_use: (Aws::BedrockRuntime::Types::ContentBlockDeltaEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
80
80
|
|
|
81
81
|
# --
|
|
82
|
-
# : (Aws::BedrockRuntime::Types::ContentBlockStopEvent, state: Hash[Symbol, untyped], yielder: Enumerator
|
|
83
|
-
def handle_content_block_stop_text_delta: (Aws::BedrockRuntime::Types::ContentBlockStopEvent, state: Hash[Symbol, untyped], yielder: Enumerator
|
|
82
|
+
# : (Aws::BedrockRuntime::Types::ContentBlockStopEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
83
|
+
def handle_content_block_stop_text_delta: (Aws::BedrockRuntime::Types::ContentBlockStopEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
84
84
|
|
|
85
85
|
# --
|
|
86
|
-
# : (Aws::BedrockRuntime::Types::ContentBlockStopEvent, state: Hash[Symbol, untyped], yielder: Enumerator
|
|
87
|
-
def handle_content_block_stop_tool_use: (Aws::BedrockRuntime::Types::ContentBlockStopEvent, state: Hash[Symbol, untyped], yielder: Enumerator
|
|
86
|
+
# : (Aws::BedrockRuntime::Types::ContentBlockStopEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
87
|
+
def handle_content_block_stop_tool_use: (Aws::BedrockRuntime::Types::ContentBlockStopEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
88
88
|
|
|
89
89
|
# --
|
|
90
|
-
# : (Aws::BedrockRuntime::Types::ConverseStreamMetadataEvent, state: Hash[Symbol, untyped], yielder: Enumerator
|
|
91
|
-
def handle_metadata_usage: (Aws::BedrockRuntime::Types::ConverseStreamMetadataEvent, state: Hash[Symbol, untyped], yielder: Enumerator
|
|
90
|
+
# : (Aws::BedrockRuntime::Types::ConverseStreamMetadataEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
91
|
+
def handle_metadata_usage: (Aws::BedrockRuntime::Types::ConverseStreamMetadataEvent, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
92
92
|
|
|
93
93
|
# --
|
|
94
94
|
# : (Array[Riffer::Messages::Base]) -> Hash[Symbol, untyped]
|
|
@@ -103,8 +103,8 @@ class Riffer::Providers::AmazonBedrock < Riffer::Providers::Base
|
|
|
103
103
|
def append_tool_result: (Array[Hash[Symbol, untyped]], Riffer::Messages::Tool) -> void
|
|
104
104
|
|
|
105
105
|
# --
|
|
106
|
-
# : (Riffer::FilePart) -> Hash[Symbol, untyped]
|
|
107
|
-
def convert_file_part_to_bedrock_format: (Riffer::FilePart) -> Hash[Symbol, untyped]
|
|
106
|
+
# : (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
|
|
107
|
+
def convert_file_part_to_bedrock_format: (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
|
|
108
108
|
|
|
109
109
|
BEDROCK_FORMAT_MAP: Hash[String, String]
|
|
110
110
|
|
|
@@ -31,8 +31,8 @@ class Riffer::Providers::Anthropic < Riffer::Providers::Base
|
|
|
31
31
|
def execute_generate: (Hash[Symbol, untyped]) -> Anthropic::Models::Message
|
|
32
32
|
|
|
33
33
|
# --
|
|
34
|
-
# : (Anthropic::Models::Message) -> Riffer::TokenUsage?
|
|
35
|
-
def extract_token_usage: (Anthropic::Models::Message) -> Riffer::TokenUsage?
|
|
34
|
+
# : (Anthropic::Models::Message) -> Riffer::Providers::TokenUsage?
|
|
35
|
+
def extract_token_usage: (Anthropic::Models::Message) -> Riffer::Providers::TokenUsage?
|
|
36
36
|
|
|
37
37
|
# --
|
|
38
38
|
# : (Anthropic::Models::Message) -> String
|
|
@@ -99,8 +99,8 @@ class Riffer::Providers::Anthropic < Riffer::Providers::Base
|
|
|
99
99
|
def convert_assistant_to_anthropic_format: (Riffer::Messages::Assistant) -> Hash[Symbol, untyped]
|
|
100
100
|
|
|
101
101
|
# --
|
|
102
|
-
# : (Riffer::FilePart) -> Hash[Symbol, untyped]
|
|
103
|
-
def convert_file_part_to_anthropic_format: (Riffer::FilePart) -> Hash[Symbol, untyped]
|
|
102
|
+
# : (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
|
|
103
|
+
def convert_file_part_to_anthropic_format: (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
|
|
104
104
|
|
|
105
105
|
# --
|
|
106
106
|
# : (singleton(Riffer::Tool)) -> Hash[Symbol, untyped]
|
|
@@ -35,14 +35,14 @@ class Riffer::Providers::Base
|
|
|
35
35
|
# Generates text using the provider.
|
|
36
36
|
#
|
|
37
37
|
# --
|
|
38
|
-
# : (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::FilePart]?, **untyped) -> Riffer::Messages::Assistant
|
|
39
|
-
def generate_text: (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::FilePart]?, **untyped) -> Riffer::Messages::Assistant
|
|
38
|
+
# : (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::Messages::FilePart]?, **untyped) -> Riffer::Messages::Assistant
|
|
39
|
+
def generate_text: (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::Messages::FilePart]?, **untyped) -> Riffer::Messages::Assistant
|
|
40
40
|
|
|
41
41
|
# Streams text from the provider.
|
|
42
42
|
#
|
|
43
43
|
# --
|
|
44
|
-
# : (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::FilePart]?, **untyped) -> Enumerator[Riffer::StreamEvents::Base, void]
|
|
45
|
-
def stream_text: (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::FilePart]?, **untyped) -> Enumerator[Riffer::StreamEvents::Base, void]
|
|
44
|
+
# : (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::Messages::FilePart]?, **untyped) -> Enumerator[Riffer::StreamEvents::Base, void]
|
|
45
|
+
def stream_text: (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::Messages::FilePart]?, **untyped) -> Enumerator[Riffer::StreamEvents::Base, void]
|
|
46
46
|
|
|
47
47
|
private
|
|
48
48
|
|
|
@@ -51,8 +51,8 @@ class Riffer::Providers::Base
|
|
|
51
51
|
def encode_tool_name: (String) -> String
|
|
52
52
|
|
|
53
53
|
# --
|
|
54
|
-
# : (String, tools: Array[Riffer::Tool]) -> String
|
|
55
|
-
def decode_tool_name: (String, tools: Array[Riffer::Tool]) -> String
|
|
54
|
+
# : (String, tools: Array[singleton(Riffer::Tool)]) -> String
|
|
55
|
+
def decode_tool_name: (String, tools: Array[singleton(Riffer::Tool)]) -> String
|
|
56
56
|
|
|
57
57
|
# --
|
|
58
58
|
# : (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
|
|
@@ -67,8 +67,8 @@ class Riffer::Providers::Base
|
|
|
67
67
|
def execute_stream: (Hash[Symbol, untyped], Enumerator::Yielder) -> void
|
|
68
68
|
|
|
69
69
|
# --
|
|
70
|
-
# : (untyped) -> Riffer::TokenUsage?
|
|
71
|
-
def extract_token_usage: (untyped) -> Riffer::TokenUsage?
|
|
70
|
+
# : (untyped) -> Riffer::Providers::TokenUsage?
|
|
71
|
+
def extract_token_usage: (untyped) -> Riffer::Providers::TokenUsage?
|
|
72
72
|
|
|
73
73
|
# --
|
|
74
74
|
# : (untyped) -> String
|
|
@@ -95,8 +95,8 @@ class Riffer::Providers::Base
|
|
|
95
95
|
def validate_input!: (prompt: String?, system: String?, messages: Array[Hash[Symbol | String, untyped] | Riffer::Messages::Base]?) -> void
|
|
96
96
|
|
|
97
97
|
# --
|
|
98
|
-
# : (prompt: String?, system: String?, messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?files: Array[Hash[Symbol, untyped] | Riffer::FilePart]?) -> Array[Riffer::Messages::Base]
|
|
99
|
-
def normalize_messages: (prompt: String?, system: String?, messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?files: Array[Hash[Symbol, untyped] | Riffer::FilePart]?) -> Array[Riffer::Messages::Base]
|
|
98
|
+
# : (prompt: String?, system: String?, messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?files: Array[Hash[Symbol, untyped] | Riffer::Messages::FilePart]?) -> Array[Riffer::Messages::Base]
|
|
99
|
+
def normalize_messages: (prompt: String?, system: String?, messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?files: Array[Hash[Symbol, untyped] | Riffer::Messages::FilePart]?) -> Array[Riffer::Messages::Base]
|
|
100
100
|
|
|
101
101
|
# --
|
|
102
102
|
# : (Array[Riffer::Messages::Base]) -> void
|
|
@@ -35,8 +35,8 @@ class Riffer::Providers::Gemini < Riffer::Providers::Base
|
|
|
35
35
|
def extract_tool_calls: (Hash[Symbol, untyped]) -> Array[Riffer::Messages::Assistant::ToolCall]
|
|
36
36
|
|
|
37
37
|
# --
|
|
38
|
-
# : (Hash[Symbol, untyped]) -> Riffer::TokenUsage?
|
|
39
|
-
def extract_token_usage: (Hash[Symbol, untyped]) -> Riffer::TokenUsage?
|
|
38
|
+
# : (Hash[Symbol, untyped]) -> Riffer::Providers::TokenUsage?
|
|
39
|
+
def extract_token_usage: (Hash[Symbol, untyped]) -> Riffer::Providers::TokenUsage?
|
|
40
40
|
|
|
41
41
|
# --
|
|
42
42
|
# : (Hash[Symbol, untyped], Enumerator::Yielder) -> void
|
|
@@ -51,8 +51,8 @@ class Riffer::Providers::Gemini < Riffer::Providers::Base
|
|
|
51
51
|
def convert_assistant_to_gemini_format: (Riffer::Messages::Assistant) -> Hash[Symbol, untyped]
|
|
52
52
|
|
|
53
53
|
# --
|
|
54
|
-
# : (Riffer::FilePart) -> Hash[Symbol, untyped]
|
|
55
|
-
def convert_file_part_to_gemini_format: (Riffer::FilePart) -> Hash[Symbol, untyped]
|
|
54
|
+
# : (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
|
|
55
|
+
def convert_file_part_to_gemini_format: (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
|
|
56
56
|
|
|
57
57
|
# --
|
|
58
58
|
# : (singleton(Riffer::Tool)) -> Hash[Symbol, untyped]
|
|
@@ -21,6 +21,17 @@ class Riffer::Providers::Mock < Riffer::Providers::Base
|
|
|
21
21
|
|
|
22
22
|
# Initializes the mock provider.
|
|
23
23
|
#
|
|
24
|
+
# +responses:+ accepts an array of response hashes in the same shape
|
|
25
|
+
# +#stub_response+ takes — raw +tool_calls:+ hashes are normalised to
|
|
26
|
+
# +Riffer::Messages::Assistant::ToolCall+ instances. This is the canonical
|
|
27
|
+
# way to pre-configure canned LLM responses on an agent via
|
|
28
|
+
# +provider_options responses: [...]+.
|
|
29
|
+
#
|
|
30
|
+
# Riffer::Providers::Mock.new(responses: [
|
|
31
|
+
# {content: "", tool_calls: [{name: "tool_a", arguments: "{}"}]},
|
|
32
|
+
# {content: "Final answer"}
|
|
33
|
+
# ])
|
|
34
|
+
#
|
|
24
35
|
# --
|
|
25
36
|
# : (**untyped) -> void
|
|
26
37
|
def initialize: (**untyped) -> void
|
|
@@ -31,11 +42,11 @@ class Riffer::Providers::Mock < Riffer::Providers::Base
|
|
|
31
42
|
#
|
|
32
43
|
# provider.stub_response("Hello")
|
|
33
44
|
# provider.stub_response("", tool_calls: [{name: "my_tool", arguments: '{"key":"value"}'}])
|
|
34
|
-
# provider.stub_response("Final response", token_usage: Riffer::TokenUsage.new(input_tokens: 10, output_tokens: 5))
|
|
45
|
+
# provider.stub_response("Final response", token_usage: Riffer::Providers::TokenUsage.new(input_tokens: 10, output_tokens: 5))
|
|
35
46
|
#
|
|
36
47
|
# --
|
|
37
|
-
# : (String, ?tool_calls: Array[Hash[Symbol, untyped]], ?token_usage: Riffer::TokenUsage?) -> void
|
|
38
|
-
def stub_response: (String, ?tool_calls: Array[Hash[Symbol, untyped]], ?token_usage: Riffer::TokenUsage?) -> void
|
|
48
|
+
# : (String, ?tool_calls: Array[Hash[Symbol, untyped]], ?token_usage: Riffer::Providers::TokenUsage?) -> void
|
|
49
|
+
def stub_response: (String, ?tool_calls: Array[Hash[Symbol, untyped]], ?token_usage: Riffer::Providers::TokenUsage?) -> void
|
|
39
50
|
|
|
40
51
|
# Clears all stubbed responses.
|
|
41
52
|
#
|
|
@@ -45,6 +56,15 @@ class Riffer::Providers::Mock < Riffer::Providers::Base
|
|
|
45
56
|
|
|
46
57
|
private
|
|
47
58
|
|
|
59
|
+
# Normalises a response hash into Mock's internal format. Accepts the
|
|
60
|
+
# +#stub_response+ kwargs shape (+content:+, +tool_calls:+, +token_usage:+)
|
|
61
|
+
# or a pre-built hash with already-converted ToolCall instances. Raw
|
|
62
|
+
# +tool_calls:+ hashes are wrapped in +Riffer::Messages::Assistant::ToolCall+.
|
|
63
|
+
#
|
|
64
|
+
# --
|
|
65
|
+
# : (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
|
|
66
|
+
def normalize_response: (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
|
|
67
|
+
|
|
48
68
|
# --
|
|
49
69
|
# : (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
|
|
50
70
|
def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
|
|
@@ -54,8 +74,8 @@ class Riffer::Providers::Mock < Riffer::Providers::Base
|
|
|
54
74
|
def execute_generate: (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
|
|
55
75
|
|
|
56
76
|
# --
|
|
57
|
-
# : (untyped) -> Riffer::TokenUsage?
|
|
58
|
-
def extract_token_usage: (untyped) -> Riffer::TokenUsage?
|
|
77
|
+
# : (untyped) -> Riffer::Providers::TokenUsage?
|
|
78
|
+
def extract_token_usage: (untyped) -> Riffer::Providers::TokenUsage?
|
|
59
79
|
|
|
60
80
|
# --
|
|
61
81
|
# : (untyped) -> String
|
|
@@ -23,8 +23,8 @@ class Riffer::Providers::OpenAI < Riffer::Providers::Base
|
|
|
23
23
|
def execute_generate: (Hash[Symbol, untyped]) -> OpenAI::Models::Responses::Response
|
|
24
24
|
|
|
25
25
|
# --
|
|
26
|
-
# : (OpenAI::Models::Responses::Response) -> Riffer::TokenUsage?
|
|
27
|
-
def extract_token_usage: (OpenAI::Models::Responses::Response) -> Riffer::TokenUsage?
|
|
26
|
+
# : (OpenAI::Models::Responses::Response) -> Riffer::Providers::TokenUsage?
|
|
27
|
+
def extract_token_usage: (OpenAI::Models::Responses::Response) -> Riffer::Providers::TokenUsage?
|
|
28
28
|
|
|
29
29
|
# --
|
|
30
30
|
# : (OpenAI::Models::Responses::Response) -> String
|
|
@@ -87,8 +87,8 @@ class Riffer::Providers::OpenAI < Riffer::Providers::Base
|
|
|
87
87
|
def convert_assistant_to_openai_format: (Riffer::Messages::Assistant) -> (Hash[Symbol, untyped] | Array[Hash[Symbol, untyped]])
|
|
88
88
|
|
|
89
89
|
# --
|
|
90
|
-
# : (Riffer::FilePart) -> Hash[Symbol, untyped]
|
|
91
|
-
def convert_file_part_to_openai_format: (Riffer::FilePart) -> Hash[Symbol, untyped]
|
|
90
|
+
# : (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
|
|
91
|
+
def convert_file_part_to_openai_format: (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
|
|
92
92
|
|
|
93
93
|
# --
|
|
94
94
|
# : (singleton(Riffer::Tool)) -> Hash[Symbol, untyped]
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Generated from lib/riffer/providers/open_router.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
# OpenRouter provider for the OpenRouter unified gateway (https://openrouter.ai).
|
|
4
|
+
#
|
|
5
|
+
# Requires the +openai+ gem to be installed. OpenRouter exposes an
|
|
6
|
+
# OpenAI-compatible Chat Completions endpoint, so this provider reuses
|
|
7
|
+
# the OpenAI Ruby SDK with a +base_url+ override.
|
|
8
|
+
#
|
|
9
|
+
# The +api_key+ falls back to <tt>Riffer.config.openrouter.api_key</tt>
|
|
10
|
+
# and then to +OPENROUTER_API_KEY+.
|
|
11
|
+
class Riffer::Providers::OpenRouter < Riffer::Providers::Base
|
|
12
|
+
BASE_URL: String
|
|
13
|
+
|
|
14
|
+
# Initializes the OpenRouter provider.
|
|
15
|
+
#
|
|
16
|
+
# --
|
|
17
|
+
# : (?api_key: String?, **untyped) -> void
|
|
18
|
+
def initialize: (?api_key: String?, **untyped) -> void
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
# --
|
|
23
|
+
# : (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
|
|
24
|
+
def build_request_params: (Array[Riffer::Messages::Base], String?, Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
|
|
25
|
+
|
|
26
|
+
# --
|
|
27
|
+
# : (Hash[Symbol, untyped]) -> OpenAI::Models::Chat::ChatCompletion
|
|
28
|
+
def execute_generate: (Hash[Symbol, untyped]) -> OpenAI::Models::Chat::ChatCompletion
|
|
29
|
+
|
|
30
|
+
# --
|
|
31
|
+
# : (OpenAI::Models::Chat::ChatCompletion) -> Riffer::Providers::TokenUsage?
|
|
32
|
+
def extract_token_usage: (OpenAI::Models::Chat::ChatCompletion) -> Riffer::Providers::TokenUsage?
|
|
33
|
+
|
|
34
|
+
# --
|
|
35
|
+
# : (OpenAI::Models::Chat::ChatCompletion) -> String
|
|
36
|
+
def extract_content: (OpenAI::Models::Chat::ChatCompletion) -> String
|
|
37
|
+
|
|
38
|
+
# --
|
|
39
|
+
# : (OpenAI::Models::Chat::ChatCompletion) -> Array[Riffer::Messages::Assistant::ToolCall]
|
|
40
|
+
def extract_tool_calls: (OpenAI::Models::Chat::ChatCompletion) -> Array[Riffer::Messages::Assistant::ToolCall]
|
|
41
|
+
|
|
42
|
+
# --
|
|
43
|
+
# : (Hash[Symbol, untyped], Enumerator::Yielder) -> void
|
|
44
|
+
def execute_stream: (Hash[Symbol, untyped], Enumerator::Yielder) -> void
|
|
45
|
+
|
|
46
|
+
# --
|
|
47
|
+
# : (OpenAI::Models::Chat::ChatCompletionChunk, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
48
|
+
def handle_stream_chunk: (OpenAI::Models::Chat::ChatCompletionChunk, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
49
|
+
|
|
50
|
+
# --
|
|
51
|
+
# : (OpenAI::Models::Chat::ChatCompletionChunk::Choice::Delta, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
52
|
+
def handle_text_delta: (OpenAI::Models::Chat::ChatCompletionChunk::Choice::Delta, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
53
|
+
|
|
54
|
+
# --
|
|
55
|
+
# : (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
56
|
+
def handle_reasoning_delta: (untyped, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
57
|
+
|
|
58
|
+
# --
|
|
59
|
+
# : (OpenAI::Models::Chat::ChatCompletionChunk::Choice::Delta, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
60
|
+
def handle_tool_call_deltas: (OpenAI::Models::Chat::ChatCompletionChunk::Choice::Delta, state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
61
|
+
|
|
62
|
+
# --
|
|
63
|
+
# : (state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
64
|
+
def emit_tool_call_done_events: (state: Hash[Symbol, untyped], yielder: Enumerator::Yielder) -> void
|
|
65
|
+
|
|
66
|
+
# --
|
|
67
|
+
# : (OpenAI::Models::Chat::ChatCompletionChunk::Choice) -> bool
|
|
68
|
+
def finish_reason_is_tool_calls?: (OpenAI::Models::Chat::ChatCompletionChunk::Choice) -> bool
|
|
69
|
+
|
|
70
|
+
# --
|
|
71
|
+
# : (Array[Riffer::Messages::Base]) -> Array[Hash[Symbol, untyped]]
|
|
72
|
+
def convert_messages_to_chat_completions_format: (Array[Riffer::Messages::Base]) -> Array[Hash[Symbol, untyped]]
|
|
73
|
+
|
|
74
|
+
# --
|
|
75
|
+
# : (Riffer::Messages::Assistant) -> Hash[Symbol, untyped]
|
|
76
|
+
def convert_assistant_to_chat_completions_format: (Riffer::Messages::Assistant) -> Hash[Symbol, untyped]
|
|
77
|
+
|
|
78
|
+
# --
|
|
79
|
+
# : (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
|
|
80
|
+
def convert_file_part_to_chat_completions_format: (Riffer::Messages::FilePart) -> Hash[Symbol, untyped]
|
|
81
|
+
|
|
82
|
+
# --
|
|
83
|
+
# : (singleton(Riffer::Tool)) -> Hash[Symbol, untyped]
|
|
84
|
+
def convert_tool_to_chat_completions_format: (singleton(Riffer::Tool)) -> Hash[Symbol, untyped]
|
|
85
|
+
end
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
# Generated from lib/riffer/token_usage.rb with RBS::Inline
|
|
1
|
+
# Generated from lib/riffer/providers/token_usage.rb with RBS::Inline
|
|
2
2
|
|
|
3
3
|
# Represents token usage data from an LLM API call.
|
|
4
4
|
#
|
|
5
5
|
# Tracks input tokens, output tokens, and optional cache statistics.
|
|
6
6
|
#
|
|
7
|
-
# token_usage = Riffer::TokenUsage.new(input_tokens: 100, output_tokens: 50)
|
|
7
|
+
# token_usage = Riffer::Providers::TokenUsage.new(input_tokens: 100, output_tokens: 50)
|
|
8
8
|
# token_usage.total_tokens # => 150
|
|
9
9
|
#
|
|
10
10
|
# combined = token_usage1 + token_usage2 # Combine multiple token usage objects
|
|
11
|
-
class Riffer::TokenUsage
|
|
11
|
+
class Riffer::Providers::TokenUsage
|
|
12
12
|
# Number of tokens in the input/prompt.
|
|
13
13
|
attr_reader input_tokens: Integer
|
|
14
14
|
|
|
@@ -34,8 +34,8 @@ class Riffer::TokenUsage
|
|
|
34
34
|
# Combines two TokenUsage objects for cumulative tracking.
|
|
35
35
|
#
|
|
36
36
|
# --
|
|
37
|
-
# : (Riffer::TokenUsage) -> Riffer::TokenUsage
|
|
38
|
-
def +: (Riffer::TokenUsage) -> Riffer::TokenUsage
|
|
37
|
+
# : (Riffer::Providers::TokenUsage) -> Riffer::Providers::TokenUsage
|
|
38
|
+
def +: (Riffer::Providers::TokenUsage) -> Riffer::Providers::TokenUsage
|
|
39
39
|
|
|
40
40
|
# Converts the token usage to a hash representation.
|
|
41
41
|
#
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
# - Riffer::Providers::OpenAI - OpenAI GPT models
|
|
7
7
|
# - Riffer::Providers::AzureOpenAI - Azure OpenAI GPT models
|
|
8
8
|
# - Riffer::Providers::AmazonBedrock - AWS Bedrock models
|
|
9
|
+
# - Riffer::Providers::OpenRouter - OpenRouter unified gateway
|
|
9
10
|
# - Riffer::Providers::Mock - Mock provider for testing
|
|
10
11
|
module Riffer::Providers
|
|
11
12
|
end
|
|
@@ -22,6 +22,6 @@ class Riffer::Runner::Fibers < Riffer::Runner
|
|
|
22
22
|
def initialize: (?max_concurrency: Integer?) -> void
|
|
23
23
|
|
|
24
24
|
# --
|
|
25
|
-
# : (Array[untyped], context:
|
|
26
|
-
def map: (Array[untyped], context:
|
|
25
|
+
# : (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
|
|
26
|
+
def map: (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
|
|
27
27
|
end
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
# This is the default runner used when no concurrency is needed.
|
|
6
6
|
class Riffer::Runner::Sequential < Riffer::Runner
|
|
7
7
|
# --
|
|
8
|
-
# : (Array[untyped], context:
|
|
9
|
-
def map: (Array[untyped], context:
|
|
8
|
+
# : (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
|
|
9
|
+
def map: (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
|
|
10
10
|
end
|
|
@@ -21,6 +21,6 @@ class Riffer::Runner::Threaded < Riffer::Runner
|
|
|
21
21
|
def initialize: (?max_concurrency: Integer) -> void
|
|
22
22
|
|
|
23
23
|
# --
|
|
24
|
-
# : (Array[untyped], context:
|
|
25
|
-
def map: (Array[untyped], context:
|
|
24
|
+
# : (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
|
|
25
|
+
def map: (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
|
|
26
26
|
end
|
|
@@ -17,6 +17,6 @@ class Riffer::Runner
|
|
|
17
17
|
# Raises NotImplementedError if not implemented by subclass.
|
|
18
18
|
#
|
|
19
19
|
# --
|
|
20
|
-
# : (Array[untyped], context:
|
|
21
|
-
def map: (Array[untyped], context:
|
|
20
|
+
# : (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
|
|
21
|
+
def map: (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
|
|
22
22
|
end
|
|
@@ -9,10 +9,11 @@
|
|
|
9
9
|
class Riffer::Skills::ActivateTool < Riffer::Tool
|
|
10
10
|
# Activates a skill by name and returns its body.
|
|
11
11
|
#
|
|
12
|
-
# [context]
|
|
12
|
+
# [context] the agent's +Riffer::Agent::Context+, exposing +#skills+
|
|
13
|
+
# (a +Riffer::Skills::Context+).
|
|
13
14
|
# [name] the skill name to activate.
|
|
14
15
|
#
|
|
15
16
|
# --
|
|
16
|
-
# : (context:
|
|
17
|
-
def call: (context:
|
|
17
|
+
# : (context: Riffer::Agent::Context?, name: String) -> Riffer::Tools::Response
|
|
18
|
+
def call: (context: Riffer::Agent::Context?, name: String) -> Riffer::Tools::Response
|
|
18
19
|
end
|