diff options
| author | Adam Malczewski <[email protected]> | 2026-04-28 14:11:16 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-04-28 14:11:16 +0900 |
| commit | 07277435c0688ad9f5fa682633b86b99ef5bb854 (patch) | |
| tree | 3e650e97bcbd229f942330542a333dcad1844542 /lib/dispatch/adapter | |
| download | dispatch-adapter-interface-07277435c0688ad9f5fa682633b86b99ef5bb854.tar.gz dispatch-adapter-interface-07277435c0688ad9f5fa682633b86b99ef5bb854.zip | |
update
Diffstat (limited to 'lib/dispatch/adapter')
| -rw-r--r-- | lib/dispatch/adapter/interface.rb | 17 | ||||
| -rw-r--r-- | lib/dispatch/adapter/interface/base.rb | 31 | ||||
| -rw-r--r-- | lib/dispatch/adapter/interface/errors.rb | 30 | ||||
| -rw-r--r-- | lib/dispatch/adapter/interface/message.rb | 31 | ||||
| -rw-r--r-- | lib/dispatch/adapter/interface/model_info.rb | 17 | ||||
| -rw-r--r-- | lib/dispatch/adapter/interface/response.rb | 23 | ||||
| -rw-r--r-- | lib/dispatch/adapter/interface/tool_definition.rb | 7 | ||||
| -rw-r--r-- | lib/dispatch/adapter/interface/version.rb | 9 |
8 files changed, 165 insertions, 0 deletions
diff --git a/lib/dispatch/adapter/interface.rb b/lib/dispatch/adapter/interface.rb new file mode 100644 index 0000000..54692c0 --- /dev/null +++ b/lib/dispatch/adapter/interface.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +require_relative "interface/version" + +require_relative "interface/errors" +require_relative "interface/message" +require_relative "interface/response" +require_relative "interface/tool_definition" +require_relative "interface/model_info" +require_relative "interface/base" + +module Dispatch + module Adapter + module Interface + end + end +end diff --git a/lib/dispatch/adapter/interface/base.rb b/lib/dispatch/adapter/interface/base.rb new file mode 100644 index 0000000..4b7a6ed --- /dev/null +++ b/lib/dispatch/adapter/interface/base.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module Dispatch + module Adapter + class Base + def chat(_messages, system: nil, tools: [], stream: false, max_tokens: nil, thinking: nil, &_block) + raise NotImplementedError, "#{self.class}#chat must be implemented" + end + + def model_name + raise NotImplementedError, "#{self.class}#model_name must be implemented" + end + + def count_tokens(_messages, system: nil, tools: []) # rubocop:disable Lint/UnusedMethodArgument + -1 + end + + def list_models + raise NotImplementedError, "#{self.class}#list_models must be implemented" + end + + def provider_name + self.class.name + end + + def max_context_tokens + nil + end + end + end +end diff --git a/lib/dispatch/adapter/interface/errors.rb b/lib/dispatch/adapter/interface/errors.rb new file mode 100644 index 0000000..86f9c14 --- /dev/null +++ b/lib/dispatch/adapter/interface/errors.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module Dispatch + module Adapter + class Error < StandardError + attr_reader :status_code, :provider + + def initialize(message = nil, status_code: nil, provider: nil) + @status_code = status_code + @provider = provider + super(message) + end + end + + class AuthenticationError < Error; end + + class RateLimitError < Error + attr_reader :retry_after + + def initialize(message = nil, status_code: nil, provider: nil, retry_after: nil) + @retry_after = retry_after + super(message, status_code:, provider:) + end + end + + class ServerError < Error; end + class RequestError < Error; end + class ConnectionError < Error; end + end +end diff --git a/lib/dispatch/adapter/interface/message.rb b/lib/dispatch/adapter/interface/message.rb new file mode 100644 index 0000000..eb51c99 --- /dev/null +++ b/lib/dispatch/adapter/interface/message.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module Dispatch + module Adapter + Message = Struct.new(:role, :content, keyword_init: true) + + TextBlock = Struct.new(:type, :text, keyword_init: true) do + def initialize(text:, type: "text") + super(type:, text:) + end + end + + ImageBlock = Struct.new(:type, :source, :media_type, keyword_init: true) do + def initialize(source:, media_type:, type: "image") + super(type:, source:, media_type:) + end + end + + ToolUseBlock = Struct.new(:type, :id, :name, :arguments, keyword_init: true) do + def initialize(id:, name:, arguments:, type: "tool_use") + super(type:, id:, name:, arguments:) + end + end + + ToolResultBlock = Struct.new(:type, :tool_use_id, :content, :is_error, keyword_init: true) do + def initialize(tool_use_id:, content:, is_error: false, type: "tool_result") + super(type:, tool_use_id:, content:, is_error:) + end + end + end +end diff --git a/lib/dispatch/adapter/interface/model_info.rb b/lib/dispatch/adapter/interface/model_info.rb new file mode 100644 index 0000000..8ba2977 --- /dev/null +++ b/lib/dispatch/adapter/interface/model_info.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module Dispatch + module Adapter + ModelInfo = Struct.new( + :id, :name, :max_context_tokens, + :supports_vision, :supports_tool_use, :supports_streaming, + :premium_request_multiplier, + keyword_init: true + ) do + def initialize(id:, name:, max_context_tokens:, supports_vision:, supports_tool_use:, supports_streaming:, + premium_request_multiplier: nil) + super + end + end + end +end diff --git a/lib/dispatch/adapter/interface/response.rb b/lib/dispatch/adapter/interface/response.rb new file mode 100644 index 0000000..b4ba3eb --- /dev/null +++ b/lib/dispatch/adapter/interface/response.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module Dispatch + module Adapter + Response = Struct.new(:content, :tool_calls, :model, :stop_reason, :usage, keyword_init: true) do + def initialize(model:, stop_reason:, usage:, content: nil, tool_calls: []) + super + end + end + + Usage = Struct.new(:input_tokens, :output_tokens, :cache_read_tokens, :cache_creation_tokens, keyword_init: true) do + def initialize(input_tokens:, output_tokens:, cache_read_tokens: 0, cache_creation_tokens: 0) + super + end + end + + StreamDelta = Struct.new(:type, :text, :tool_call_id, :tool_name, :argument_delta, keyword_init: true) do + def initialize(type:, text: nil, tool_call_id: nil, tool_name: nil, argument_delta: nil) + super + end + end + end +end diff --git a/lib/dispatch/adapter/interface/tool_definition.rb b/lib/dispatch/adapter/interface/tool_definition.rb new file mode 100644 index 0000000..7b435a3 --- /dev/null +++ b/lib/dispatch/adapter/interface/tool_definition.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Dispatch + module Adapter + ToolDefinition = Struct.new(:name, :description, :parameters, keyword_init: true) + end +end diff --git a/lib/dispatch/adapter/interface/version.rb b/lib/dispatch/adapter/interface/version.rb new file mode 100644 index 0000000..0a53b34 --- /dev/null +++ b/lib/dispatch/adapter/interface/version.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module Dispatch + module Adapter + module Interface + VERSION = "0.1.0" + end + end +end |
