Module: Anthropic::Helpers::InputSchema::SupportedSchemas

Defined in:
lib/anthropic/helpers/input_schema/supported_schemas.rb

Class Method Summary collapse

Class Method Details

.transform_schema!(schema) ⇒ Hash{Symbol=>Object}

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Parameters:

  • schema (Hash{Symbol=>Object})

Returns:

  • (Hash{Symbol=>Object})


57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/anthropic/helpers/input_schema/supported_schemas.rb', line 57

def transform_schema!(schema)
  defs = schema[:$defs].to_h

  # rubocop:disable Metrics/BlockLength
  xform = ->(s) do
    case s
    in {type: "string" | ["string", "null"], format: "date-time" | "time" | "date" | "duration" | "email" | "hostname" | "uri" | "ipv4" | "ipv6" | "uuid"} | {type: "array", minItems: 0 | 1}
      # these are the currently supported cases
      next

    in {oneOf: Array => schemas, **rest}
      {anyOf: schemas, **rest}

    in {allOf: Array => schemas}
      derefed = schemas.lazy.grep(Hash).map do
        ref = _1[:$ref].to_s.delete_prefix("#/$defs/")
        defs.fetch(ref, _1)
      end
      merged = {}.merge!(*derefed)
      if (doc = xform.call(merged))
        merged.store(:$ref, true)

        schemas.reject! do |s|
          next unless s.is_a?(Hash)
          s.delete(:description)
          s.select! { merged.key?(_1) }
          s.empty?
        end
        schemas << {description: doc}
      end
    in {type: "integer" | "number" | "string" | ["integer", "null"] | ["number", "null"] | ["string", "null"], **unsupported}
      describe!(s, unsupported: unsupported.except(:enum))
    in {type: "array",  **unsupported}
      describe!(s, unsupported: unsupported.except(:items))
    in {type: "object", **unsupported}
      unsupported.delete(:additionalProperties) if unsupported[:additionalProperties] == false
      describe!(s, unsupported: unsupported.except(:required, :properties))
    else
    end
  end
  # rubocop:enable Metrics/BlockLength

  walk_once(schema, &xform)
  schema
end