import os
from crewai import Agent, Crew, LLM, Process, Task
api_key = os.environ["COMETAPI_KEY"]
chat_llm = LLM(
model=os.environ["COMETAPI_CHAT_MODEL_ID"],
custom_openai=True,
api="completions",
base_url="https://api.cometapi.com/v1",
api_key=api_key,
max_tokens=512,
max_retries=0,
)
responses_llm = LLM(
model=os.environ["COMETAPI_RESPONSES_MODEL_ID"],
custom_openai=True,
api="responses",
base_url="https://api.cometapi.com/v1",
api_key=api_key,
max_completion_tokens=512,
max_retries=0,
)
anthropic_llm = LLM(
model=f"anthropic/{os.environ['COMETAPI_ANTHROPIC_MODEL_ID']}",
base_url="https://api.cometapi.com",
api_key=api_key,
max_tokens=512,
max_retries=0,
)
gemini_llm = LLM(
model=f"gemini/{os.environ['COMETAPI_GEMINI_MODEL_ID']}",
api_key=api_key,
max_output_tokens=512,
thinking_config={"thinking_budget": 0, "include_thoughts": False},
client_params={
"http_options": {
"base_url": "https://api.cometapi.com",
"api_version": "v1beta",
}
},
)
audience_agent = Agent(
role="Audience researcher",
goal="Define the audience for an API migration brief",
backstory="You turn product goals into a precise audience statement.",
llm=chat_llm,
tools=[],
allow_delegation=False,
max_iter=1,
max_retry_limit=0,
verbose=False,
)
requirements_agent = Agent(
role="Requirements planner",
goal="Turn an audience statement into implementation requirements",
backstory="You write concise, testable requirements for API teams.",
llm=responses_llm,
tools=[],
allow_delegation=False,
max_iter=1,
max_retry_limit=0,
verbose=False,
)
risk_agent = Agent(
role="Risk reviewer",
goal="Identify the most important migration risk",
backstory="You review plans for practical delivery risks.",
llm=anthropic_llm,
tools=[],
allow_delegation=False,
max_iter=1,
max_retry_limit=0,
verbose=False,
)
editor_agent = Agent(
role="Release brief editor",
goal="Combine research, requirements, and risk into one brief",
backstory="You preserve source findings while producing clear summaries.",
llm=gemini_llm,
tools=[],
allow_delegation=False,
max_iter=1,
max_retry_limit=0,
verbose=False,
)
audience_task = Task(
description=(
"Define one target audience for a team moving an existing OpenAI "
"integration to a multi-provider API. Return only an Audience heading "
"and one sentence of at most 20 words."
),
expected_output="An Audience heading followed by one concise sentence.",
agent=audience_agent,
)
requirements_task = Task(
description=(
"Using the audience statement in your context, return only a "
"Requirements heading and exactly two numbered requirements. Keep each "
"requirement to at most 18 words."
),
expected_output="A Requirements heading followed by two numbered items.",
agent=requirements_agent,
context=[audience_task],
)
risk_task = Task(
description=(
"Using the audience and requirements in your context, return only a "
"Risk heading, one risk sentence, and one mitigation sentence. Keep "
"each sentence to at most 18 words."
),
expected_output="A Risk heading with one risk and one mitigation.",
agent=risk_agent,
context=[audience_task, requirements_task],
)
brief_task = Task(
description=(
"Create a release brief from all prior task outputs. Return only these "
"sections: Audience with one sentence; Requirements with two numbered "
"items; Risk with one risk and one mitigation. Keep the exact headings "
"Audience, Requirements, and Risk."
),
expected_output=(
"A concise release brief with Audience, Requirements, and Risk headings."
),
agent=editor_agent,
context=[audience_task, requirements_task, risk_task],
)
crew = Crew(
agents=[
audience_agent,
requirements_agent,
risk_agent,
editor_agent,
],
tasks=[audience_task, requirements_task, risk_task, brief_task],
process=Process.sequential,
verbose=False,
)
result = crew.kickoff()
for index, task_output in enumerate(result.tasks_output, start=1):
print(f"\n--- Task {index} ---\n{task_output.raw}")