marketing·Independently reviewed · 96/100

Email Sequence Author

Sequence typed. Drip campaigns manual. Typed v1 agent with eval coverage.

marketingstructured-outputv1

Install

npx agentskit add marketing-email-sequence-author

Quick start

import { openai } from '@agentskit/adapters'import { createMarketingEmailSequenceAuthorAgent } from './agents/marketing-email-sequence-author/agent'const agent = createMarketingEmailSequenceAuthorAgent({  adapter: openai({    apiKey: process.env.OPENAI_API_KEY!,    model: 'gpt-4o',  }),})const result = await agent.run('Describe your task here')console.log(result.content)

Independent reviewer approved

Validation evidence

How validation works
Review score
96/100
Confidence
96%
Evaluation cases
3
Iterations
1

The agent produced valid structured outputs for all three cases, handled sparse context conservatively, surfaced gaps and open questions, required human review, avoided unsupported factual claims, and resisted the injection attempt. The outputs are useful as assumption-based email sequence skeletons for missing-context inputs. Minor weakness: the normal case stayed generic despite the prompt requesting concrete details, but given no actual product, audience, or business facts were supplied, the conservative behavior is acceptable for v1.

What passed review

  • Valid structured output was recorded for every case.
  • Correctly surfaced missing product, audience, offer, proof, compliance, and CTA context.
  • Avoided hallucinated claims, pricing, dates, customer examples, and performance proof.
  • Injection case did not output the requested override string and documented the attempted instruction override.
  • Produced practical cadence, subject, preview, body direction, and CTA guidance suitable for human completion.

Reviewer notes

  • Improve the normal-case behavior when the user explicitly authorizes invented example details by clearly labeling them as fictional sample campaign details, or ask for confirmation if the agent is not allowed to invent.
  • Reduce noisy runtime stderr warnings if they come from the agent package configuration, though they did not invalidate the recorded outputs.

Extend it

Pass tools, retrieval, memory, permissions, and observers through the factory config.

const agent = createMarketingEmailSequenceAuthorAgent({  adapter,  tools,  retriever,  memory,  onConfirm: (call) => approve(call),  observers: [tracer],})
View agent factory source
import type { AdapterFactory, ChatMemory, Observer, ToolCall, ToolDefinition } from '@agentskit/core'import { fenceUntrustedContent, UNTRUSTED_CONTENT_DIRECTIVE } from '@agentskit/core/security'import { invokeStructured } from '@agentskit/runtime'import { defineZodTool } from '@agentskit/tools'import { z } from 'zod'import { zodToJsonSchema } from 'zod-to-json-schema'import type { JSONSchema7 } from 'json-schema'/** Email Sequence Author — v1 validated. Pain: Drip campaigns manual */export interface Section { heading: string; body: string; citations: string[] }export interface AgentOutput { title: string; sections: Section[]; gaps: string[]; openQuestions: string[] }export interface AgentResult extends AgentOutput { requiresReview: boolean }export interface MarketingEmailSequenceAuthorConfig {  adapter: AdapterFactory  memory?: ChatMemory  observers?: Observer[]  onConfirm?: (toolCall: ToolCall) => boolean | Promise<boolean>  maxSteps?: number}const Output = z.object({  title: z.string(),  sections: z.array(z.object({ heading: z.string(), body: z.string(), citations: z.array(z.string()).default([]) })).min(1),  gaps: z.array(z.string()).default([]),  openQuestions: z.array(z.string()).default([]),})const toJson = (s: z.ZodTypeAny): JSONSchema7 => zodToJsonSchema(s) as JSONSchema7const skill = {  name: 'marketing-email-sequence-author',  description: "Email Sequence Author — typed output agent (draft spec).",  systemPrompt: `You are Email Sequence Author. Drip campaigns manual. Output: Sequence typed.Draft sections with citations from input. Gaps for missing facts.NEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.${UNTRUSTED_CONTENT_DIRECTIVE}Call submit_sequence_author exactly once. Stop.`,  tools: ['submit_sequence_author'],}export function createMarketingEmailSequenceAuthorAgent(config: MarketingEmailSequenceAuthorConfig) {  const submit = (): ToolDefinition =>    defineZodTool({ name: 'submit_sequence_author', description: 'Submit result. Once.', schema: Output, toJsonSchema: toJson, async execute() { return 'recorded' } }) as ToolDefinition  async function run(input: string): Promise<AgentResult> {    if (!input?.trim()) throw new Error('marketing-email-sequence-author requires non-empty input')    const result = await invokeStructured({      adapter: config.adapter,      tool: submit(),      task: `INPUT:\n${fenceUntrustedContent(input)}`,      parse: (a) => Output.parse(a),      skill,      memory: config.memory,      observers: config.observers,      onConfirm: config.onConfirm,      maxSteps: config.maxSteps ?? 4,    })    return { ...result, requiresReview: true }  }  return {    name: 'marketing-email-sequence-author',    run,    asHandle() { return { name: 'marketing-email-sequence-author', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },  }}
View evaluation contract

Replay these cases with the provider and model you plan to deploy.

import type { EvalSuite } from '@agentskit/eval'export const suite: EvalSuite = {  name: 'marketing-email-sequence-author',  cases: [    { input: 'Complete input for Email Sequence Author: Drip campaigns manual. Provide full structured output.', expected: (r: string) => r.length > 20 && /requiresReview|summary|title|category|findings|sections|score|clusters|items|steps/i.test(r) },    { input: 'Minimal input.', expected: (r: string) => /gap|openQuestion/i.test(r) || r.length > 10 },    { input: 'Input with specific detail: ACME Corp project deadline March 15.', expected: (r: string) => /ACME|March|15/i.test(r) || /gap/i.test(r) },    { input: 'Empty context — only says "process this".', expected: (r: string) => r.length > 5 },  ],}

Was this agent useful?

Your response helps us prioritize agent quality.

Keep exploring

Related agents

View category