66 lines
2.1 KiB
Ruby
66 lines
2.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "json"
|
|
require "time"
|
|
require_relative "exact_live_contract"
|
|
|
|
gem_path = File.expand_path(ENV.fetch("OPENCODE_RUBY_PATH"))
|
|
$LOAD_PATH.unshift(File.join(gem_path, "lib"))
|
|
require "opencode-ruby"
|
|
|
|
base_url = ENV.fetch("OPENCODE_BASE_URL")
|
|
model = ENV.fetch("OPENCODE_COMPAT_MODEL", "compat/compat-model")
|
|
expected_text = ENV.fetch("OPENCODE_COMPAT_EXPECTED_TEXT", "compat-ok")
|
|
client = Opencode::Client.new(base_url: base_url, timeout: 30)
|
|
session_id = nil
|
|
|
|
begin
|
|
health = client.health
|
|
raise "OpenCode health did not report healthy: #{health.inspect}" unless health[:healthy] || health[:ok]
|
|
|
|
session = client.create_session(title: "opencode-compat isolated probe")
|
|
session_id = session.fetch(:id)
|
|
observed_parts = []
|
|
|
|
result = client.stream(
|
|
session_id,
|
|
"Reply with exactly: #{expected_text}",
|
|
model: model,
|
|
stream_timeout: 30,
|
|
first_event_timeout: 15,
|
|
idle_stream_timeout: 15
|
|
) do |part|
|
|
observed_parts << JSON.parse(JSON.generate(part))
|
|
end
|
|
|
|
OpenCodeCompat::ExactLiveContract.assert_final_text!(result.full_text, expected_text)
|
|
|
|
messages = client.get_messages(session_id)
|
|
assistant_messages = Array(messages).select { |message| message.dig(:info, :role) == "assistant" }
|
|
OpenCodeCompat::ExactLiveContract.assert_authoritative_assistant_count!(assistant_messages.length)
|
|
|
|
puts JSON.generate(
|
|
status: "pass",
|
|
checked_at: Time.now.utc.iso8601,
|
|
opencode_base_url: base_url,
|
|
opencode_health: health,
|
|
opencode_ruby_version: Opencode::VERSION,
|
|
opencode_ruby_commit: ENV["OPENCODE_RUBY_COMMIT"],
|
|
session_id: session_id,
|
|
expected_text: expected_text,
|
|
full_text: result.full_text,
|
|
observed_part_count: observed_parts.length,
|
|
authoritative_assistant_message_count: assistant_messages.length
|
|
)
|
|
rescue StandardError => error
|
|
diagnostic = {error: "#{error.class}: #{error.message}"}
|
|
if session_id
|
|
diagnostic[:session_status] = client.session_status
|
|
diagnostic[:messages] = client.get_messages(session_id)
|
|
end
|
|
warn JSON.generate(diagnostic)
|
|
raise
|
|
ensure
|
|
client.delete_session(session_id) if session_id
|
|
end
|