deep-researcher / docs /deep-research-api-doc.md
Amiel's picture
Upload folder using huggingface_hub
676fc08 verified
# Deep Research API Documentation
## Overview
The Deep Research API provides a real-time interface for initiating and monitoring complex research tasks. Leveraging Server-Sent Events (SSE), it delivers updates, information, message, progress, and errors as they occur, allowing clients to receive continuous streams of data without polling.
## Protocol
This API uses **Server-Sent Events (SSE)** over HTTP. Clients should establish an HTTP connection and keep it open to receive a stream of events from the server.
## Data Format
All data sent via SSE adheres to the following structure:
```text
event: EventName
data: JSON_String
```
- `event`: Specifies the type of event being sent (e.g., `infor`, `message`, `reasoning`, `progress`, `error`).
- `data`: A string containing a JSON object relevant to the event type.
- A double newline (`\n\n`) signifies the end of an event block.
## API config
Recommended to use the API via `@microsoft/fetch-event-source`.
Endpoint: `/api/sse`
Method: `POST`
Body:
```typescript
interface Config {
// Research topic
query: string;
// AI provider, Possible values ​​include: google, openai, anthropic, deepseek, xai, mistral, azure, openrouter, openaicompatible, pollinations, ollama
provider: string;
// Thinking model id
thinkingModel: string;
// Task model id
taskModel: string;
// Search provider, Possible values ​​include: model, tavily, firecrawl, exa, bocha, searxng
searchProvider: string;
// Response Language, also affects the search language. (optional)
language?: string;
// Maximum number of search results. Default, `5` (optional)
maxResult?: number;
// Whether to include content-related images in the final report. Default, `true`. (optional)
enableCitationImage?: boolean;
// Whether to include citation links in search results and final reports. Default, `true`. (optional)
enableReferences?: boolean;
}
```
Headers:
```typescript
interface Headers {
"Content-Type": "application/json";
// If you set an access password
// Authorization: "Bearer YOUR_ACCESS_PASSWORD";
}
```
For specific usage parameter forms, see the [example code](#client-code-example).
## Response Events
The API streams data as a series of events. Each event has a type (`event`) and associated data (`data`).
### General Structure
```text
event: [event_type]
data: [JSON_payload]
```
### Event Types
The following event types are supported:
- `infor`
- `message`
- `reasoning`
- `progress`
- `error`
---
### `infor` Event
Sent at the beginning of the stream (or upon specific requests) to provide initial information about the API instance or the research session.
**Description:** Provides basic information about the running API instance.
**Data Structure (`data` field):** A JSON string representing the following structure:
| Parameter | Type | Description |
| :-------- | :----- | :------------------ |
| `name` | string | Project name |
| `version` | string | Current API version |
```typescript
interface InforEvent {
// Project name
name: string;
// Current API version
version: string;
}
```
**Example:**
```text
event: infor
data: {"name":"deep-research","version":"0.1.0"}
```
---
### `message` Event
Used to send text content of deep research to the client.
**Description:** Delivers textual messages during the research process.
**Data Structure (`data` field):** A JSON string representing the following structure:
| Parameter | Type | Description | Notes |
| :-------- | :----- | :------------------------------------- | :---------------------------------------------------- |
| `type` | string | Type of the message content | Currently only `"text"` is supported. |
| `text` | string | The message content (Markdown format). | Optional for future types, but required for `"text"`. |
```typescript
interface MessageEvent {
// Message type, currently only "text" is supported
type: "text";
// Textual data
text?: string;
}
```
**Example:**
```text
event: message
data: {"type":"text","text":"This is a **markdown** string."}
```
---
### `reasoning` Event
Used to send thinking content of deep research to the client. Some thinking models support output thinking process.
**Description:** Delivers textual messages during the research process.
**Data Structure (`data` field):** A JSON string representing the following structure:
| Parameter | Type | Description | Notes |
| :-------- | :----- | :--------------------------------------- | :------------------------------------ |
| `type` | string | Type of the reasoning content | Currently only `"text"` is supported. |
| `text` | string | The reasoning content (Markdown format). | Required for `"text"`. |
```typescript
interface ReasoningEvent {
// Reasoning type, currently only "text" is supported
type: "text";
// Textual data
text: string;
}
```
**Example:**
```text
event: message
data: {"type":"text","text":"Output thinking process"}
```
---
### `progress` Event
Communicates the current step and status of the research task execution. This is crucial for providing real-time feedback on the process flow.
**Description:** Indicates the progress of the research task, including the current step and its status (start or end).
**Data Structure (`data` field):** A JSON string representing the following structure:
| Parameter | Type | Description | Notes |
| :-------- | :------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------- |
| `step` | "report-plan" \| "serp-query" \| "task-list" \| "search-task" \| "final-report" | The identifier of the current step in the research process. | See "Possible `step` Values" below. |
| `status` | "start" \| "end" | The status of the current step. | Indicates if the step is starting or ending. See "Possible `status` Values" below. |
| `name` | string | A descriptive name for the specific instance of the step (e.g., for a specific search task). | Included only when `step` is `"search-task"`. |
| `data` | any | Optional data relevant to the step's outcome or details. | May be included when `status` is `"end"`. The content varies by step. |
```typescript
interface ProgressEvent {
// Current step
step:
| "report-plan"
| "serp-query"
| "task-list"
| "search-task"
| "final-report";
// Status of the step
status: "start" | "end";
// Name of the specific task (e.g., search query)
name?: string;
// Data related to the step's outcome or details
data?: any;
}
```
**Possible `step` Values:**
- `report-plan`: The system is generating or processing the overall report plan.
- `serp-query`: The system is performing a Search Engine Results Page (SERP) query.
- `task-list`: The system is generating or processing a list of specific research tasks.
- `search-task`: The system is executing a specific search task. This step includes the `name` parameter.
- `final-report`: The system is compiling or finalizing the comprehensive research report.
**Possible `status` Values:**
- `start`: Indicates that the specified `step` has just begun.
- `end`: Indicates that the specified `step` has just finished.
**Example:**
```text
event: progress
data: {"step":"search-task","status":"start","name":"AI trends for this year"}
event: progress
data: {"step":"search-task","status":"end","name":"AI trends for this year","data":{"results_count": 15}}
```
---
### `error` Event
Sent when an error occurs during the research process that prevents the task from completing successfully or requires user attention.
**Description:** Signals that an error has occurred.
**Data Structure (`data` field):** A JSON string typically containing information about the error. A common structure is:
| Parameter | Type | Description | Notes |
| :-------- | :----- | :----------------------------------------- | :---- |
| `message` | string | A human-readable description of the error. | |
```typescript
interface ErrorEvent {
// A human-readable description of the error.
message: string;
}
```
**Example:**
```text
event: error
data: {"message":"Invalid query parameters."}
```
---
## Error Handling
Clients should always listen for the `error` event. Upon receiving an `error` event, the client should typically display the error message to the user and may consider the current research task terminated unless otherwise specified by the API's behavior.
## Client Code Example
This example demonstrates how to connect to the SSE endpoint using `EventSource` API and listen for the defined event types, specifically focusing on displaying `message` events.
```typescript
import { fetchEventSource } from "@microsoft/fetch-event-source";
const ctrl = new AbortController();
let report = "";
fetchEventSource("/api/sse", {
method: "POST",
headers: {
"Content-Type": "application/json",
// If you set an access password
// Authorization: "Bearer YOUR_ACCESS_PASSWORD",
},
body: JSON.stringify({
query: "AI trends for this year",
provider: "google",
thinkingModel: "gemini-2.0-flash-thinking-exp",
taskModel: "gemini-2.0-flash-exp",
searchProvider: "model",
language: "en-US",
maxResult: 5,
enableCitationImage: true,
enableReferences: true,
}),
signal: ctrl.signal,
onmessage(msg) {
const msgData = JSON.parse(msg.data);
if (msg.event === "message") {
if (msgData.type === "text") {
report += msgData.text;
}
} else if (msg.event === "progress") {
console.log(
`[${data.step}]: ${msgData.name ? `${msgData.name} ` : ""}${
msgData.status
}`
);
if (msgData.data) console.log(msgData.data);
} else if (msg.event === "error") {
throw new Error(msgData.message);
}
},
onclose() {
console.log(report);
},
});
```