In this post, I explain how the Agent Development Kit (ADK) can be used to develop a Multi-Agent System with practical examples. I use the ADK Golang toolkit, and the use case is building a multi-agent newsroom that is capable of researching trends, writing content, handling SEO, and publishing blog posts or newsletters.

Before diving into the development, let’s first understand the basics of AI Agents, Multi-Agent Systems, and the Agent Development Kit (ADK). You can read more about ADK here

Newsroom: Multi-Agent Content Production Platform

What is an Agent?

An AI Agent is a software system designed to act autonomously to make decisions, create plans, and take actions to achieve or complete a goal or task. We can take the example of a solo full-stack developer building a web application.

What the developer does alone:

  • Requirements - Define what the app should do
  • System design - Create the architecture and data flow
  • Coding - Build the UI, backend APIs, and database logic
  • Testing & debugging - Test the application and fix bugs
  • Deployment - Deploy the app

What is a Multi-Agent System (MAS)?

A Multi-Agent System (MAS) is a collection of autonomous AI agents that interact and collaborate with each other to achieve or complete complex goals or tasks. It behaves like a team with distributed decision-making and actions to tackle complex problems.

A good analogy is a Scrum team working on building a web application.

The Scrum team:

  • Product Owner - Defines what the app should do and prioritizes tasks
  • Scrum Master - Coordinates with stakeholders, tracks progress, and supports the team
  • Architect - Designs the system architecture, introduces technologies and tools, and defines design principles and standards
  • Frontend Developer - Build the UI
  • Backend Developer - Build backend APIs
  • QA Engineer - Handles testing
  • DevOps Engineer - Deploy the app

In many scenarios, team members can work in parallel, sequentially, or even in isolation to achieve the shared goal of building the application.

What is Agent Development Kit (ADK) ?

Here is the definition from ADK Documentation

Agent Development Kit (ADK) is a flexible and modular framework for developing and deploying AI agents. While optimized for Gemini and the Google ecosystem, ADK is model-agnostic, deployment-agnostic, and is built for compatibility with other frameworks. ADK was designed to make agent development feel more like software development, to make it easier for developers to create, deploy, and orchestrate agentic architectures that range from simple tasks to complex workflows.

Lets dive in to the implementation

As mentioned earlier, this example focuses on a newsroom with multiple AI agents. For this Multi-Agent System (MAS), I use a Workflow Agent of type Sequential Agent. You can find more details here


List of AI Agents (According to execution order)

  1. Trend Detection Agent - Identifies trending topics and analyzes their potential
  2. Outline Agent - Creates structured article outlines from detected trends
  3. Writer Agent - Writes full articles based on the outlines
  4. SEO Agent - Optimizes content for search engines
  5. Editor Agent - Reviews and polishes content for publication quality
  6. Publisher Agent - Publishes content

Specilised tools created for Agents

  • generate_meta_tags - Generate meta tags
  • check_grammar - Grammar checking
  • publish_article - Publish to platform

Architecture

The system uses a sequential workflow pattern, where each agent processes the output of the previous agent through shared state:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
User Input
Trend Detection Agent → detected_trends
Outline Agent → article_outline
Writer Agent → draft_article
SEO Agent → seo_optimized
Editor Agent → edited_article
Publisher Agent → published_article
Final Output

Project Structure

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
newsroom/
├── main.go                 # Application entry point
├── go.mod                  # Go module definition
├── agents/                 # Agents
   ├── editor.go     # Editor
   ├── outline.go    # Outline
   ├── publisher.go  # Publisher
   ├── seo.go        # SEO
   ├── trend.go      # Trend Detection
   └── writer.go     # Writer
├── pipeline/
   └── newsroom.go         # Sequential pipeline orchestration
└── tools/                  # Custom tools for agents
    ├── editor.go           # Content editing
    ├── publisher.go        # Publishing
    └── seo.go              # SEO

Creating an AI Agent with the Google Search Tool

Here, I create the Trend Detection Agent (agents/trend.go), which is equipped with the Google Search Tool to analyze trends. A few other agents are equipped with custom function tools that I created, which you can find in the GitHub repository.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package agents

import (
	"context"

	"google.golang.org/adk/agent"
	"google.golang.org/adk/agent/llmagent"
	"google.golang.org/adk/model"
	"google.golang.org/adk/tool"
	"google.golang.org/adk/tool/geminitool"
)

const TrendAgentInstruction = `You are the Trend Detection Agent for an AI Newsroom.
Your role is to identify and analyze current trending topics that would make compelling content.

Your responsibilities:
1. Monitor and identify emerging trends in the specified industry or category
2. Analyze trend momentum and potential audience interest
3. Evaluate the newsworthiness and timeliness of topics
4. Provide structured trend data for the content pipeline

When detecting trends, consider:
- Social media buzz and engagement
- Search volume trends
- Industry news and developments
- Seasonal and timely events

Output your findings as structured JSON with:
- topic: The main topic title
- keywords: Related keywords for the topic
- trend_score: A score from 0-1 indicating trend strength
- rationale: Brief explanation of why this topic is trending

After analysis, save your findings to the 'detected_trends' state key for the next agent.`

func NewTrendDetectionAgent(ctx context.Context, m model.LLM) (agent.Agent, error) {
	return llmagent.New(llmagent.Config{
		Name:        "trend_detection_agent",
		Model:       m,
		Description: "Detects and analyzes trending topics for content creation",
		Instruction: TrendAgentInstruction,
		OutputKey:   "detected_trends",
		Tools: []tool.Tool{
			geminitool.GoogleSearch{},
		},
	})
}

Creating the Sequential Pipeline for Orchestration

This is where the Workflow Agent (type: Sequential Agent) is defined to orchestrate the pipeline (pipeline/newsroom.go).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package pipeline

import (
	"context"

	"newsroom/agents"

	"google.golang.org/adk/agent"
	"google.golang.org/adk/agent/workflowagents/sequentialagent"
	"google.golang.org/adk/model"
)

func NewNewsroomPipeline(ctx context.Context, m model.LLM) (agent.Agent, error) {
	trendAgent, err := agents.NewTrendDetectionAgent(ctx, m)
	if err != nil {
		return nil, err
	}

	outlineAgent, err := agents.NewOutlineAgent(ctx, m)
	if err != nil {
		return nil, err
	}

	writerAgent, err := agents.NewWriterAgent(ctx, m)
	if err != nil {
		return nil, err
	}

	seoAgent, err := agents.NewSEOAgent(ctx, m)
	if err != nil {
		return nil, err
	}

	editorAgent, err := agents.NewEditorAgent(ctx, m)
	if err != nil {
		return nil, err
	}

	publisherAgent, err := agents.NewPublisherAgent(ctx, m)
	if err != nil {
		return nil, err
	}

	pipeline, err := sequentialagent.New(sequentialagent.Config{
		AgentConfig: agent.Config{
			Name:        "newsroom_pipeline",
			Description: "AI Newsroom content production pipeline that produces blog posts or newsletters",
			SubAgents: []agent.Agent{
				trendAgent,
				outlineAgent,
				writerAgent,
				seoAgent,
				editorAgent,
				publisherAgent,
			},
		},
	})
	if err != nil {
		return nil, err
	}

	return pipeline, nil
}

Application entry point main.go

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package main

import (
	"context"
	"log"
	"os"

	"newsroom/pipeline"

	"google.golang.org/adk/agent"
	"google.golang.org/adk/cmd/launcher"
	"google.golang.org/adk/cmd/launcher/full"
	"google.golang.org/adk/model/gemini"
	"google.golang.org/genai"
)

func main() {
	ctx := context.Background()

	apiKey := os.Getenv("GOOGLE_API_KEY")
	if apiKey == "" {
		log.Fatal("GOOGLE_API_KEY environment variable is required")
	}

	model, err := gemini.NewModel(ctx, "gemini-2.5-flash", &genai.ClientConfig{
		APIKey: apiKey,
	})
	if err != nil {
		log.Fatalf("Failed to create model: %v", err)
	}

	newsroomPipeline, err := pipeline.NewNewsroomPipeline(ctx, model)
	if err != nil {
		log.Fatalf("Failed to create newsroom pipeline: %v", err)
	}

	config := &launcher.Config{
		AgentLoader: agent.NewSingleLoader(newsroomPipeline),
	}

	l := full.NewLauncher()
	if err = l.Execute(ctx, config, os.Args[1:]); err != nil {
		log.Fatalf("Run failed: %v\n\n%s", err, l.CommandLineSyntax())
	}
}

Github

https://github.com/duladissa/newsroom

Demo