Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 7 additions & 6 deletions actionagent/app/services/action_agent/agent_registrar.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,10 @@ module ActionAgent
# metrics can hang off.
#
# Identity is (account, service_name, agent_class, agent_action) — one agent
# per action, not per class. Clara.respond (admin assistant, every MCP tool,
# ~$0.03/run) and Clara.title (no tools, temperature 0.2, ~$0.0004/run) are
# different agents that share a class name because one app method spawns both.
# per action, not per class. Assistant.respond (admin assistant, every MCP
# tool, ~$0.03/run) and Assistant.title (no tools, temperature 0.2,
# ~$0.0004/run) are different agents that share a class name because one app
# method spawns both.
# Collapsing them would blend a $0.03 agent with a $0.0004 one into a single
# meaningless cost-per-run.
#
Expand Down Expand Up @@ -60,7 +61,7 @@ def action_name
@trace.agent_action.presence
end

# Name carries the action so the two Claras are distinguishable anywhere a
# Name carries the action so the two agents are distinguishable anywhere a
# bare agent name is shown.
def display_name
action_name ? "#{agent_class}.#{action_name}" : agent_class
Expand Down Expand Up @@ -138,8 +139,8 @@ def observed_slug(_owner)

# Config we can only learn by watching: the model actually used, the
# instructions actually sent (when content capture is on), and the tools
# actually called — which is how Clara.respond acquires a tool list while
# Clara.title correctly stays empty.
# actually called — which is how Assistant.respond acquires a tool list while
# Assistant.title correctly stays empty.
def llm_attribute(key)
spans.filter_map { |span| span.dig("attributes", key).presence }.first
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -312,8 +312,8 @@ export default function InteractionsView({ agentId = null, embedded = false }) {
}
}, [sortBy]);

// Group by Agent.action, not by agent class. Clara.respond (admin assistant,
// full tool access, ~$0.03/run) and Clara.title (no tools, temperature 0.2,
// Group by Agent.action, not by agent class. Assistant.respond (admin assistant,
// full tool access, ~$0.03/run) and Assistant.title (no tools, temperature 0.2,
// ~$0.0004/run) are different agents that share a class name because one app
// method spawns both; interleaving their streams hides that.
const agentGroups = useMemo(() => {
Expand Down Expand Up @@ -533,7 +533,7 @@ export default function InteractionsView({ agentId = null, embedded = false }) {
<div className="space-y-8">
{agentGroups.map((group) => (
<div key={group.key} className="space-y-4">
{/* Agent header — Clara.respond and Clara.title are different
{/* Agent header — Assistant.respond and Assistant.title are different
agents (different instructions, tools, cost), so their streams
are grouped rather than interleaved. */}
<div className="flex items-baseline justify-between">
Expand Down
10 changes: 5 additions & 5 deletions docs/framework/self-hosted-observability.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,15 +99,15 @@ to the full URL, as shown below, and `resolved_endpoint` returns that.)
# A path on your main app:
mount ActionAgent::Engine => "/activeagents"

# Or the root of a dedicated subdomain, e.g. activeagents.combinaut.com:
# Or the root of a dedicated subdomain, e.g. activeagents.example.com:
constraints subdomain: "activeagents" do
mount ActionAgent::Engine => "/", as: :active_agent_subdomain
end
```

With the subdomain mount, the dashboard lives at
`https://activeagents.combinaut.com/` and remote apps post traces to
`https://activeagents.combinaut.com/api/traces`.
`https://activeagents.example.com/` and remote apps post traces to
`https://activeagents.example.com/api/traces`.

## Authentication (required in production)

Expand Down Expand Up @@ -161,7 +161,7 @@ mount:
production:
telemetry:
enabled: true
endpoint: https://activeagents.combinaut.com/api/traces
endpoint: https://activeagents.example.com/api/traces
api_key: <%= Rails.application.credentials.dig(:active_agent, :ingest_api_key) %>
```

Expand Down Expand Up @@ -202,7 +202,7 @@ gem "activeagents-telemetry-ruby_llm"
```ruby
# config/initializers/ruby_llm_telemetry.rb
ActiveAgents::Telemetry::RubyLLM.subscribe!(
endpoint: "https://activeagents.combinaut.com/api/traces",
endpoint: "https://activeagents.example.com/api/traces",
api_key: Rails.application.credentials.dig(:active_agent, :ingest_api_key),
service_name: "billing-app"
)
Expand Down