Class: SolidAgent::AgentManifest::Parsers::CrewAIParser

Inherits:
BaseParser
  • Object
show all
Defined in:
lib/solid_agent/agent_manifest/parsers/crewai_parser.rb

Overview

CrewAIParser handles CrewAI's agents.yaml format.

CrewAI defines agents with role, goal, and backstory. This parser converts them to the unified Manifest format.

Examples:

agents.yaml

research_analyst:
  role: >
    Senior Research Analyst
  goal: >
    Uncover cutting-edge developments
  backstory: >
    You're a seasoned researcher...
  llm: claude-sonnet-4-20250514
  tools:
    - SerperDevTool

See Also:

Constant Summary

Constants inherited from BaseParser

BaseParser::FRONTMATTER_REGEX

Class Method Summary collapse

Methods inherited from BaseParser

parse

Class Method Details

.format_nameObject



27
28
29
# File 'lib/solid_agent/agent_manifest/parsers/crewai_parser.rb', line 27

def format_name
  :crewai
end

.parse_string(content) ⇒ Object

Raises:



31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/solid_agent/agent_manifest/parsers/crewai_parser.rb', line 31

def parse_string(content)
  data = YAML.safe_load(content, permitted_classes: [Symbol])

  raise ParseError, "Invalid CrewAI YAML: expected hash" unless data.is_a?(Hash)

  # CrewAI files can contain multiple agents
  agents = data.map do |agent_name, agent_data|
    parse_agent(agent_name.to_s, agent_data)
  end

  # If single agent, return it directly; otherwise return array
  agents.size == 1 ? agents.first : agents
end

.parse_with_tasks(agents_path, tasks_path = nil) ⇒ Array<Manifest>

Parse a file containing multiple agents

Parameters:

  • agents_path (String)

    Path to agents.yaml

  • tasks_path (String, nil) (defaults to: nil)

    Optional path to tasks.yaml

Returns:

  • (Array<Manifest>)

    Parsed manifests



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/solid_agent/agent_manifest/parsers/crewai_parser.rb', line 50

def parse_with_tasks(agents_path, tasks_path = nil)
  agents_content = File.read(agents_path, encoding: "UTF-8")
  result = parse_string(agents_content)

  # Ensure we have an array
  manifests = result.is_a?(Array) ? result : [result]

  # Optionally merge task information
  if tasks_path && File.exist?(tasks_path)
    tasks = YAML.safe_load(File.read(tasks_path, encoding: "UTF-8"))
    merge_tasks(manifests, tasks)
  end

  manifests
end