import Parallel from "parallel-web";
// Define your input and output types
interface CompanyInput {
company_name: string;
company_website: string;
}
interface CompanyOutput {
key_insights: string[];
market_position: string;
}
// Use SDK types for Task Group API
type TaskGroupObject = Parallel.Beta.TaskGroup;
type TaskGroupGetRunsResponse = Parallel.Beta.TaskGroupGetRunsResponse;
// Create reusable task specification using SDK types
const taskSpec: Parallel.TaskSpec = {
input_schema: {
type: "json",
json_schema: {
type: "object",
properties: {
company_name: {
type: "string",
description: "Name of the company",
},
company_website: {
type: "string",
description: "Company website URL",
},
},
required: ["company_name", "company_website"],
},
},
output_schema: {
type: "json",
json_schema: {
type: "object",
properties: {
key_insights: {
type: "array",
items: { type: "string" },
description: "Key business insights",
},
market_position: {
type: "string",
description: "Market positioning analysis",
},
},
required: ["key_insights", "market_position"],
},
},
};
async function waitForCompletion(
client: Parallel,
taskgroupId: string
): Promise<void> {
while (true) {
const response = await client.beta.taskGroup.retrieve(taskgroupId);
const status = response.status;
console.log("Status:", status.task_run_status_counts);
if (!status.is_active) {
console.log("All tasks completed!");
break;
}
await new Promise((resolve) => setTimeout(resolve, 10000));
}
}
async function getAllResults(
client: Parallel,
taskgroupId: string
): Promise<
Array<{ company: string; insights: string[]; market_position: string }>
> {
const results: Array<{
company: string;
insights: string[];
market_position: string;
}> = [];
const runStream = await client.beta.taskGroup.getRuns(taskgroupId, {
include_input: true,
include_output: true,
});
for await (const event of runStream) {
if (event.type === "task_run.state" && event.output) {
const input = event.input?.input as CompanyInput;
const output = (event.output as Parallel.TaskRunJsonOutput)
.content as CompanyOutput;
results.push({
company: input.company_name,
insights: output.key_insights,
market_position: output.market_position,
});
}
}
return results;
}
async function batchCompanyResearch(): Promise<
Array<{ company: string; insights: string[]; market_position: string }>
> {
const client = new Parallel({
apiKey: process.env.PARALLEL_API_KEY,
});
// Create task group
const groupResponse = await client.beta.taskGroup.create({});
const taskgroupId = groupResponse.taskgroup_id;
console.log(`Created taskgroup id ${taskgroupId}`);
// Define companies to research
const companies = [
{ company_name: "Stripe", company_website: "https://stripe.com" },
{ company_name: "Shopify", company_website: "https://shopify.com" },
{ company_name: "Salesforce", company_website: "https://salesforce.com" },
];
// Add Tasks to group
const runInputs: Array<Parallel.Beta.BetaRunInput> = companies.map(
(company) => ({
input: {
company_name: company.company_name,
company_website: company.company_website,
},
processor: "pro",
})
);
const response = await client.beta.taskGroup.addRuns(taskgroupId, {
default_task_spec: taskSpec,
inputs: runInputs,
});
console.log(
`Added ${response.run_ids.length} runs to taskgroup ${taskgroupId}`
);
// Wait for completion and get results
await waitForCompletion(client, taskgroupId);
const results = await getAllResults(client, taskgroupId);
console.log(`Successfully processed ${results.length} companies`);
return results;
}
// Run the batch job
const results = await batchCompanyResearch();