Module: DatagroutConduit

Defined in:
lib/datagrout_conduit.rb,
lib/datagrout_conduit/oauth.rb,
lib/datagrout_conduit/types.rb,
lib/datagrout_conduit/client.rb,
lib/datagrout_conduit/errors.rb,
lib/datagrout_conduit/version.rb,
lib/datagrout_conduit/identity.rb,
lib/datagrout_conduit/registration.rb,
lib/datagrout_conduit/transport/ws.rb,
lib/datagrout_conduit/transport/mcp.rb,
lib/datagrout_conduit/transport/base.rb,
lib/datagrout_conduit/namespaces/flow.rb,
lib/datagrout_conduit/namespaces/logic.rb,
lib/datagrout_conduit/namespaces/prism.rb,
lib/datagrout_conduit/namespaces/warden.rb,
lib/datagrout_conduit/transport/jsonrpc.rb,
lib/datagrout_conduit/namespaces/ephemerals.rb,
lib/datagrout_conduit/namespaces/deliverables.rb

Defined Under Namespace

Modules: McpCodes, OAuth, Transport Classes: AuthError, Byok, Client, ConfigError, ConnectionError, CreditEstimate, DeliverablesNamespace, DiscoverResult, DiscoveredTool, EphemeralsNamespace, Error, FlowNamespace, GuideOption, GuideState, GuidedSession, Identity, InitializationError, InvalidArgumentsError, LogicNamespace, McpError, NotInitializedError, PrismNamespace, RateLimitedError, Receipt, Registration, RegistrationResponse, ResourceNotFoundError, TimeoutError, Tool, ToolMeta, ToolNotFoundError, WardenNamespace

Constant Summary collapse

DG_CA_URL =
Registration::DG_CA_URL
DG_SUBSTRATE_ENDPOINT =
Registration::DG_SUBSTRATE_ENDPOINT
VERSION =
"0.4.0"

Class Method Summary collapse

Class Method Details

.dg_url?(url) ⇒ Boolean

Returns true when url points at a DataGrout-managed endpoint.

Used to decide whether to auto-enable mTLS discovery and the intelligent interface, and whether to warn when DG-specific methods are called against a non-DG server.

Returns:

  • (Boolean)


32
33
34
35
36
# File 'lib/datagrout_conduit.rb', line 32

def self.dg_url?(url)
  url.to_s.include?("datagrout.ai") ||
    url.to_s.include?("datagrout.dev") ||
    ENV.key?("CONDUIT_IS_DG")
end

.extract_meta(result) ⇒ Object

Extract DataGrout metadata from a tool-call result hash.

Checks sources in priority order:

  1. result[“datagrout”] — rich format

  2. result / result — legacy

  3. result — compact inline (synthesized)

Returns nil when no metadata is found.



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/datagrout_conduit/types.rb', line 101

def self.extract_meta(result)
  return nil unless result.is_a?(Hash)

  # 1. Rich: _meta.datagrout (string or symbol keys)
  rich = result.dig("_meta", "datagrout") || result.dig(:_meta, :datagrout)
  if rich.is_a?(Hash) && (rich["receipt"] || rich[:receipt])
    return ToolMeta.from_hash(rich.transform_keys(&:to_s))
  end

  # 2. Legacy: _datagrout or bare _meta (string or symbol keys)
  %w[_datagrout _meta].each do |key|
    legacy = result[key] || result[key.to_sym]
    if legacy.is_a?(Hash) && (legacy["receipt"] || legacy[:receipt])
      return ToolMeta.from_hash(legacy.transform_keys(&:to_s))
    end
  end

  # 3. Compact: _dg (string or symbol keys)
  dg = result["_dg"] || result[:_dg]
  if dg.is_a?(Hash)
    credits = dg["credits"] || {}
    breakdown = {}
    breakdown["premium"] = credits["premium"] if credits.key?("premium")
    breakdown["llm"] = credits["llm"] if credits.key?("llm")

    return ToolMeta.new(
      receipt: Receipt.new(
        receipt_id: nil,
        timestamp: nil,
        estimated_credits: (credits["estimated"] || 0.0).to_f,
        actual_credits: (credits["charged"] || 0.0).to_f,
        net_credits: (credits["charged"] || 0.0).to_f,
        savings: 0.0,
        savings_bonus: 0.0,
        balance_after: credits["remaining"]&.to_f,
        breakdown: breakdown,
        byok: Byok.new(enabled: false, discount_applied: 0.0, discount_rate: 0.0)
      ),
      credit_estimate: nil
    )
  end

  warn "[conduit] No DataGrout metadata found in tool result. " \
       "Cost tracking data is unavailable. Enable 'Include DG Inline' " \
       "or 'Include DataGrout Metadata' in your server settings."
  nil
end