From 6c4c45e83ff01433e1ff182a4dbb3a77aeeda7c4 Mon Sep 17 00:00:00 2001 From: Grayson Chen Date: Mon, 31 Mar 2025 13:48:08 +0800 Subject: [PATCH 1/2] feat: Add metadata transformation with agent name support and ActiveSupport dependency --- lib/ruby-openai-swarm.rb | 2 +- lib/ruby-openai-swarm/core.rb | 7 +++++-- lib/ruby-openai-swarm/version.rb | 2 +- ruby-openai-swarm.gemspec | 1 + 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/ruby-openai-swarm.rb b/lib/ruby-openai-swarm.rb index 9ad1352..e0142c3 100644 --- a/lib/ruby-openai-swarm.rb +++ b/lib/ruby-openai-swarm.rb @@ -15,7 +15,7 @@ require 'ruby-openai-swarm/memories/entity_store' require 'ruby-openai-swarm/memories/core_memory_function' require 'ruby-openai-swarm/memories/field' - +require 'active_support/core_ext/hash/deep_transform_values' module OpenAISwarm class Error < StandardError; diff --git a/lib/ruby-openai-swarm/core.rb b/lib/ruby-openai-swarm/core.rb index da2053a..662bc69 100644 --- a/lib/ruby-openai-swarm/core.rb +++ b/lib/ruby-openai-swarm/core.rb @@ -58,8 +58,11 @@ def get_chat_completion(agent_tracker, history, context_variables, model_overrid # Add metadata if provided # Add support for LiteLLM observability with Langfuse - # See: https://docs.litellm.ai/docs/observability/langfuse_integration - create_params[:metadata] = metadata if metadata + # See: https://docs.litellm.ai/docs/observability/langfuse_integration + if metadata && metadata.is_a?(Hash) + metadata_hash = metadata.deep_transform_values { |val| val.to_s.to_sym == :var_agent_name ? agent&.name : val } + create_params[:metadata] = metadata_hash + end # TODO: https://platform.openai.com/docs/guides/function-calling/how-do-functions-differ-from-tools # create_params[:functions] = tools unless tools.empty? diff --git a/lib/ruby-openai-swarm/version.rb b/lib/ruby-openai-swarm/version.rb index 74b78ac..e12bd5a 100644 --- a/lib/ruby-openai-swarm/version.rb +++ b/lib/ruby-openai-swarm/version.rb @@ -1,3 +1,3 @@ module OpenAISwarm - VERSION = "0.5.2" + VERSION = "0.5.3" end diff --git a/ruby-openai-swarm.gemspec b/ruby-openai-swarm.gemspec index b097eb2..d730866 100644 --- a/ruby-openai-swarm.gemspec +++ b/ruby-openai-swarm.gemspec @@ -23,6 +23,7 @@ Gem::Specification.new do |spec| spec.require_paths = ["lib"] spec.add_dependency "ruby-openai", ">= 7.3", "< 9.0" spec.add_dependency "ostruct" + spec.add_dependency "activesupport" spec.add_development_dependency "rspec", "~> 3.0" spec.add_development_dependency "rake", "~> 13.0" spec.add_development_dependency "pry" From 9eb0a989a94f8d266376211f2b704982535dcf69 Mon Sep 17 00:00:00 2001 From: Grayson Chen Date: Mon, 31 Mar 2025 13:54:14 +0800 Subject: [PATCH 2/2] fix: Correct metadata agent name transformation from :var_agent_name to :agent_name and add test --- lib/ruby-openai-swarm/core.rb | 2 +- spec/lib/ruby-openai-swarm/core_spec.rb | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/ruby-openai-swarm/core.rb b/lib/ruby-openai-swarm/core.rb index 662bc69..ae3a782 100644 --- a/lib/ruby-openai-swarm/core.rb +++ b/lib/ruby-openai-swarm/core.rb @@ -60,7 +60,7 @@ def get_chat_completion(agent_tracker, history, context_variables, model_overrid # Add support for LiteLLM observability with Langfuse # See: https://docs.litellm.ai/docs/observability/langfuse_integration if metadata && metadata.is_a?(Hash) - metadata_hash = metadata.deep_transform_values { |val| val.to_s.to_sym == :var_agent_name ? agent&.name : val } + metadata_hash = metadata.deep_transform_values { |val| val.to_s.to_sym == :agent_name ? agent&.name : val } create_params[:metadata] = metadata_hash end diff --git a/spec/lib/ruby-openai-swarm/core_spec.rb b/spec/lib/ruby-openai-swarm/core_spec.rb index 192b695..66e37eb 100644 --- a/spec/lib/ruby-openai-swarm/core_spec.rb +++ b/spec/lib/ruby-openai-swarm/core_spec.rb @@ -48,6 +48,25 @@ ) end + it 'transforms var_agent_name in metadata to actual agent name' do + core = described_class.new(client) + metadata_with_var = { user_id: 123, agent_name: :agent_name } + + expect(client).to receive(:chat) do |params| + expect(params[:parameters][:metadata]).to eq({ + user_id: 123, + agent_name: "TestAgent" + }) + chat_response + end + + core.run( + agent: agent, + messages: messages, + metadata: metadata_with_var + ) + end + it 'works without metadata' do core = described_class.new(client)