"
+ ],
+ "text/plain": [
+ " id \\\n",
+ "0 ART-17711_KNOWLEDGE_NODE-0 \n",
+ "1 ART-17711_KNOWLEDGE_NODE-1 \n",
+ "2 ART-17650_KNOWLEDGE_NODE-0 \n",
+ "3 ART-17650_KNOWLEDGE_NODE-1 \n",
+ "4 ART-17650_KNOWLEDGE_NODE-2 \n",
+ "\n",
+ " text \\\n",
+ "0 b'We ran into a case where an AirSync was star... \n",
+ "1 access.\\n\\nOnce Person A was re-added with the... \n",
+ "2 b\"American cybersecurity leader unifies securi... \n",
+ "3 DevRev\\n======================================... \n",
+ "4 solutions help organisations build and deploy ... \n",
+ "\n",
+ " title \n",
+ "0 Sync fails when original sync owners loses per... \n",
+ "1 Sync fails when original sync owners loses per... \n",
+ "2 American cybersecurity leader unifies security... \n",
+ "3 American cybersecurity leader unifies security... \n",
+ "4 American cybersecurity leader unifies security... "
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Convert to DataFrame and display\n",
+ "knowledge_df = knowledge_base[\"corpus\"].to_pandas()\n",
+ "knowledge_df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'id': 'ART-17711_KNOWLEDGE_NODE-0',\n",
+ " 'text': \"b'We ran into a case where an AirSync was started by one person (Person A) and later failed. Another user (Person B) tried to click Retry, but it didn\\\\xe2\\\\x80\\\\x99t work. The logs showed 401 and 403 errors in communication between the snap-in and the snap-in manager.\\\\n\\\\nIt turned out that AirSync assigns the sync owner to whoever started it. Since Person A had been removed from the org or lost permissions, the retry failed \\\\xe2\\\\x80\\\\x94 the system still expected the original owner to have valid\",\n",
+ " 'title': 'Sync fails when original sync owners loses permissions'}"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Sample a single knowledge base chunk\n",
+ "knowledge_base[\"corpus\"][0]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 4. Dataset Summary"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "============================================================\n",
+ "DevRev Search Dataset Summary\n",
+ "============================================================\n",
+ "\n",
+ "Annotated Queries:\n",
+ "DatasetDict({\n",
+ " train: Dataset({\n",
+ " features: ['query_id', 'query', 'retrievals'],\n",
+ " num_rows: 291\n",
+ " })\n",
+ "})\n",
+ "\n",
+ "Test Queries:\n",
+ "DatasetDict({\n",
+ " test: Dataset({\n",
+ " features: ['query_id', 'query'],\n",
+ " num_rows: 92\n",
+ " })\n",
+ "})\n",
+ "\n",
+ "Knowledge Base:\n",
+ "DatasetDict({\n",
+ " corpus: Dataset({\n",
+ " features: ['id', 'text', 'title'],\n",
+ " num_rows: 65224\n",
+ " })\n",
+ "})\n",
+ "\n",
+ "============================================================\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(\"=\" * 60)\n",
+ "print(\"DevRev Search Dataset Summary\")\n",
+ "print(\"=\" * 60)\n",
+ "print(f\"\\nAnnotated Queries:\")\n",
+ "print(annotated_queries)\n",
+ "print(f\"\\nTest Queries:\")\n",
+ "print(test_queries)\n",
+ "print(f\"\\nKnowledge Base:\")\n",
+ "print(knowledge_base)\n",
+ "print(\"\\n\" + \"=\" * 60)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---\n",
+ "## 5. Index Knowledge Base with FAISS\n",
+ "\n",
+ "Using OpenAI text-embedding-3-small and FAISS for similarity search."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openai import OpenAI\n",
+ "import faiss\n",
+ "import numpy as np\n",
+ "from tqdm import tqdm\n",
+ "import time\n",
+ "import os\n",
+ "import json\n",
+ "import pickle"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Using model: text-embedding-3-small\n",
+ "Provider: OpenAI\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Initialize OpenAI client\n",
+ "# Set your API key as an environment variable: export OPENAI_API_KEY=\"your-key-here\"\n",
+ "OPENAI_API_KEY = os.environ.get(\"OPENAI_API_KEY\")\n",
+ "if not OPENAI_API_KEY:\n",
+ " raise ValueError(\"Please set OPENAI_API_KEY environment variable\")\n",
+ "\n",
+ "client = OpenAI(api_key=OPENAI_API_KEY)\n",
+ "\n",
+ "MODEL_ID = \"text-embedding-3-small\" # 1536 dimensions\n",
+ "print(f\"Using model: {MODEL_ID}\")\n",
+ "print(f\"Provider: OpenAI\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def get_embedding(text: str) -> np.ndarray:\n",
+ " \"\"\"Get embedding for a single text using OpenAI text-embedding-3.\"\"\"\n",
+ " response = client.embeddings.create(\n",
+ " model=MODEL_ID,\n",
+ " input=text\n",
+ " )\n",
+ " return np.array(response.data[0].embedding)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def get_embeddings_batch(texts: list) -> np.ndarray:\n",
+ " \"\"\"Get embeddings for a batch of texts using OpenAI text-embedding-3.\"\"\"\n",
+ " response = client.embeddings.create(\n",
+ " model=MODEL_ID,\n",
+ " input=texts\n",
+ " )\n",
+ " return np.array([d.embedding for d in response.data])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Loading weights: 100%|██████████| 103/103 [00:00<00:00, 1907.55it/s, Materializing param=pooler.dense.weight] \n",
+ "\u001b[1mBertModel LOAD REPORT\u001b[0m from: sentence-transformers/all-MiniLM-L6-v2\n",
+ "Key | Status | | \n",
+ "------------------------+------------+--+-\n",
+ "embeddings.position_ids | UNEXPECTED | | \n",
+ "\n",
+ "\u001b[3mNotes:\n",
+ "- UNEXPECTED\u001b[3m\t:can be ignored when loading from different task/architecture; not ok if you expect identical arch.\u001b[0m\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sentence_transformers import SentenceTransformer\n",
+ "import numpy as np\n",
+ "\n",
+ "model = SentenceTransformer(\"all-MiniLM-L6-v2\") # free, runs locally\n",
+ "\n",
+ "def get_embedding(text: str) -> np.ndarray:\n",
+ " return model.encode(text)\n",
+ "\n",
+ "def get_embeddings_batch(texts: list) -> np.ndarray:\n",
+ " return model.encode(texts)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Test embedding shape: (384,)\n",
+ "Embedding dimension: 384\n",
+ "First 5 values: [0.08429643 0.05795369 0.00449337 0.1058211 0.00708341]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Test the embedding API\n",
+ "test_embedding = get_embedding(\"This is a test sentence.\")\n",
+ "print(f\"Test embedding shape: {test_embedding.shape}\")\n",
+ "print(f\"Embedding dimension: {len(test_embedding)}\")\n",
+ "print(f\"First 5 values: {test_embedding[:5]}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Preparing documents: 100%|██████████| 65224/65224 [00:00<00:00, 118407.86it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Total documents: 65,224\n",
+ "\n",
+ "Sample document:\n",
+ "Sync fails when original sync owners loses permissions\n",
+ "\n",
+ "b'We ran into a case where an AirSync was started by one person (Person A) and later failed. Another user (Person B) tried to click Retry, but it didn\\xe2\\x80\\x99t work. The logs showed 401 and 403 errors in communication between the snap-in and the snap-in manager.\\n\\nIt turned out that AirSync assigns the sync owner to whoever started it. Since Person A had been removed from the org or lost permissions, the retry failed \\xe2\\x80\\x94 the s\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Prepare documents: concatenate title with text\n",
+ "corpus = knowledge_base[\"corpus\"]\n",
+ "\n",
+ "documents = []\n",
+ "doc_ids = []\n",
+ "doc_titles = []\n",
+ "doc_texts = []\n",
+ "\n",
+ "for item in tqdm(corpus, desc=\"Preparing documents\"):\n",
+ " # Concatenate title and text\n",
+ " doc_text = f\"{item['title']}\\n\\n{item['text']}\"\n",
+ " documents.append(doc_text)\n",
+ " doc_ids.append(item['id'])\n",
+ " doc_titles.append(item['title'])\n",
+ " doc_texts.append(item['text'])\n",
+ "\n",
+ "print(f\"\\nTotal documents: {len(documents):,}\")\n",
+ "print(f\"\\nSample document:\")\n",
+ "print(documents[0][:500])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def get_all_embeddings(texts, batch_size=100, max_retries=3):\n",
+ " \"\"\"Get embeddings for all texts using OpenAI batch API.\"\"\"\n",
+ " all_embeddings = []\n",
+ " \n",
+ " for i in tqdm(range(0, len(texts), batch_size), desc=\"Generating embeddings\"):\n",
+ " batch = texts[i:i + batch_size]\n",
+ " \n",
+ " # Truncate texts if too long (OpenAI has ~8K token limit)\n",
+ " batch = [text[:8000] if len(text) > 8000 else text for text in batch]\n",
+ " \n",
+ " retries = 0\n",
+ " while retries < max_retries:\n",
+ " try:\n",
+ " embeddings = get_embeddings_batch(batch)\n",
+ " all_embeddings.append(embeddings)\n",
+ " break\n",
+ " except Exception as e:\n",
+ " retries += 1\n",
+ " if retries >= max_retries:\n",
+ " print(f\"Error embedding batch {i}: {e}\")\n",
+ " all_embeddings.append(np.zeros((len(batch), 1536)))\n",
+ " else:\n",
+ " print(f\"Retry {retries} for batch {i}...\")\n",
+ " time.sleep(2)\n",
+ " \n",
+ " time.sleep(0.1) # Rate limiting\n",
+ " \n",
+ " return np.vstack(all_embeddings)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Generating embeddings for knowledge base...\n",
+ "Total documents: 65,224\n",
+ "Using batch processing for efficiency...\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Generating embeddings: 100%|██████████| 66/66 [01:41<00:00, 1.54s/it]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Embeddings shape: (65224, 384)\n",
+ "Embeddings saved to embeddings.npy\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Generate embeddings for all documents\n",
+ "print(\"Generating embeddings for knowledge base...\")\n",
+ "print(f\"Total documents: {len(documents):,}\")\n",
+ "print(\"Using batch processing for efficiency...\")\n",
+ "\n",
+ "# For testing, use a subset (uncomment for all documents)\n",
+ "# documents_to_embed = documents[:100] # Test with first 100 docs\n",
+ "documents_to_embed = documents # All documents\n",
+ "\n",
+ "embeddings = get_all_embeddings(documents_to_embed, batch_size=1000)\n",
+ "print(f\"\\nEmbeddings shape: {embeddings.shape}\")\n",
+ "\n",
+ "# Save embeddings\n",
+ "np.save(\"embeddings.npy\", embeddings)\n",
+ "print(\"Embeddings saved to embeddings.npy\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Load embeddings if already saved\n",
+ "# embeddings = np.load(\"embeddings.npy\")\n",
+ "# print(f\"Loaded embeddings shape: {embeddings.shape}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "",
+ "evalue": "",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31mThe Kernel crashed while executing code in the current cell or a previous cell. \n",
+ "\u001b[1;31mPlease review the code in the cell(s) to identify a possible cause of the failure. \n",
+ "\u001b[1;31mClick here for more info. \n",
+ "\u001b[1;31mView Jupyter log for further details."
+ ]
+ }
+ ],
+ "source": [
+ "# Create FAISS index\n",
+ "embedding_dim = embeddings.shape[1]\n",
+ "print(f\"Creating FAISS index with dimension: {embedding_dim}\")\n",
+ "\n",
+ "# Normalize embeddings for cosine similarity\n",
+ "embeddings_normalized = embeddings.copy().astype('float32')\n",
+ "faiss.normalize_L2(embeddings_normalized)\n",
+ "\n",
+ "# Create the index using IndexFlatIP for inner product (cosine similarity with normalized vectors)\n",
+ "index = faiss.IndexFlatIP(embedding_dim)\n",
+ "index.add(embeddings_normalized)\n",
+ "\n",
+ "print(f\"Index created with {index.ntotal:,} vectors\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "✓ Index saved to faiss_index/knowledge_base.index\n",
+ "✓ Document mapping saved to faiss_index/doc_mapping.pkl\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Save the index and document mapping\n",
+ "INDEX_DIR = \"faiss_index\"\n",
+ "os.makedirs(INDEX_DIR, exist_ok=True)\n",
+ "\n",
+ "# Save FAISS index\n",
+ "faiss.write_index(index, os.path.join(INDEX_DIR, \"knowledge_base.index\"))\n",
+ "\n",
+ "# Save document mapping\n",
+ "with open(os.path.join(INDEX_DIR, \"doc_mapping.pkl\"), \"wb\") as f:\n",
+ " pickle.dump({\n",
+ " \"doc_ids\": doc_ids,\n",
+ " \"documents\": documents,\n",
+ " \"doc_titles\": doc_titles,\n",
+ " \"doc_texts\": doc_texts\n",
+ " }, f)\n",
+ "\n",
+ "print(f\"✓ Index saved to {INDEX_DIR}/knowledge_base.index\")\n",
+ "print(f\"✓ Document mapping saved to {INDEX_DIR}/doc_mapping.pkl\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 6. Search the Knowledge Base"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def search(query: str, k: int = 5):\n",
+ " \"\"\"Search the knowledge base for relevant documents.\"\"\"\n",
+ " query_embedding = get_embedding(query).astype('float32')\n",
+ " query_embedding = query_embedding.reshape(1, -1)\n",
+ " faiss.normalize_L2(query_embedding)\n",
+ " \n",
+ " scores, indices = index.search(query_embedding, k)\n",
+ " \n",
+ " results = []\n",
+ " for i, (score, idx) in enumerate(zip(scores[0], indices[0])):\n",
+ " results.append({\n",
+ " \"rank\": i + 1,\n",
+ " \"score\": float(score),\n",
+ " \"id\": doc_ids[idx],\n",
+ " \"title\": doc_titles[idx],\n",
+ " \"text\": doc_texts[idx]\n",
+ " })\n",
+ " \n",
+ " return results"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query: How do I set up AirSync?\n",
+ "============================================================\n",
+ "\n",
+ "[Rank 1] Score: 0.6888\n",
+ "Doc ID: ART-17212_KNOWLEDGE_NODE-5\n",
+ "Title: AirSync snap-in template | DevRev | Docs\n",
+ "Text: snap-in. Inside, the `functions/` subfolder includes the logic for retrieving external sync units, extracting data from and loading data to external systems, and mapping between them.\\n\\nWas this page helpful?\\n\\nYesNo\\n\\n[Previous](/airsync/getting-started)[#### Local development\\n\\nNext](/airsync/...\n",
+ "----------------------------------------\n",
+ "\n",
+ "[Rank 2] Score: 0.6721\n",
+ "Doc ID: ART-2045_KNOWLEDGE_NODE-29\n",
+ "Title: AirSync | Snap-ins | DevRev\n",
+ "Text: Setting up a new AirSync\\n\\n![]()\\n\\nFor best results, AirSyncs should be done using an administrator account on the external source. This ensures all necessary permissions are available to complete the import successfully.\\n\\nWhether you want to perform only a one-time import or set up an ongoing s...\n",
+ "----------------------------------------\n",
+ "\n",
+ "[Rank 3] Score: 0.6712\n",
+ "Doc ID: ART-2047_KNOWLEDGE_NODE-29\n",
+ "Title: Salesforce AirSync | AirSync | Snap-ins | DevRev\n",
+ "Text: editions include **Enterprise**, **Unlimited**, **Developer**, and **Performance**. Additionally, the **Professional** edition is supported if API access has been purchased as an add-on.\\n\\n![]()\\n\\nTo ensure a successful import, it\\'s important to verify that the Salesforce user has \"View All Data\"...\n",
+ "----------------------------------------\n",
+ "\n",
+ "[Rank 4] Score: 0.6654\n",
+ "Doc ID: ART-2047_KNOWLEDGE_NODE-39\n",
+ "Title: Salesforce AirSync | AirSync | Snap-ins | DevRev\n",
+ "Text: created in the specified Salesforce account the next time the Sync from [DevRev to Salesforce](#sync-to-salesforce) runs. This can be triggered manually or automatically through a Periodic Sync. Future syncs keeps this item updated on both sides after it has been created in Salesforce.\\n\\n### Histor...\n",
+ "----------------------------------------\n",
+ "\n",
+ "[Rank 5] Score: 0.6582\n",
+ "Doc ID: ART-17227_KNOWLEDGE_NODE-1\n",
+ "Title: Deploy to organization | DevRev | Docs\n",
+ "Text: and fill in the required variables.\\n2. Deploy a draft version of your snap-in to your organization by using `make deploy`.\\n3. Install the snap-in in your DevRev by going to **Settings** > **Snap-ins** > **Install snap-in**.\\n4. Set up the connection under **Settings** > **Integrations** > **AirSyn...\n",
+ "----------------------------------------\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Test search with a sample query\n",
+ "query = \"How do I set up AirSync?\"\n",
+ "results = search(query, k=5)\n",
+ "\n",
+ "print(f\"Query: {query}\")\n",
+ "print(\"=\" * 60)\n",
+ "\n",
+ "for r in results:\n",
+ " print(f\"\\n[Rank {r['rank']}] Score: {r['score']:.4f}\")\n",
+ " print(f\"Doc ID: {r['id']}\")\n",
+ " print(f\"Title: {r['title']}\")\n",
+ " print(f\"Text: {r['text'][:300]}...\")\n",
+ " print(\"-\" * 40)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---\n",
+ "## 7. Run Evaluation on Test Queries\n",
+ "\n",
+ "Run search against all test queries and save results in the same format as annotated_queries."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Processing test queries: 100%|██████████| 92/92 [00:00<00:00, 106.21it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Processed 92 test queries\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Run search on all test queries - DIRECT VERSION (no dependency on search function)\n",
+ "TOP_K = 10 # Number of retrievals per query\n",
+ "\n",
+ "# Get corpus data for lookups\n",
+ "corpus_data = knowledge_base[\"corpus\"]\n",
+ "\n",
+ "test_results = []\n",
+ "\n",
+ "for item in tqdm(test_queries[\"test\"], desc=\"Processing test queries\"):\n",
+ " query_id = item[\"query_id\"]\n",
+ " query = item[\"query\"]\n",
+ " \n",
+ " # Get query embedding directly\n",
+ " query_embedding = get_embedding(query).astype('float32').reshape(1, -1)\n",
+ " faiss.normalize_L2(query_embedding)\n",
+ " \n",
+ " # Search FAISS index\n",
+ " scores, indices = index.search(query_embedding, TOP_K)\n",
+ " \n",
+ " # Format retrievals using corpus data directly\n",
+ " retrievals = []\n",
+ " for idx in indices[0]:\n",
+ " doc = corpus_data[int(idx)]\n",
+ " retrievals.append({\n",
+ " \"id\": doc[\"id\"],\n",
+ " \"text\": doc[\"text\"],\n",
+ " \"title\": doc[\"title\"]\n",
+ " })\n",
+ " \n",
+ " test_results.append({\n",
+ " \"query_id\": query_id,\n",
+ " \"query\": query,\n",
+ " \"retrievals\": retrievals\n",
+ " })\n",
+ "\n",
+ "print(f\"\\nProcessed {len(test_results)} test queries\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Sample result:\n",
+ "{\n",
+ " \"query_id\": \"a97f93d2-410a-431f-ae9a-1e23ed35d74c\",\n",
+ " \"query\": \"end customer organization name not appearing in ticket or conversation\",\n",
+ " \"retrievals\": [\n",
+ " {\n",
+ " \"id\": \"ART-1978_KNOWLEDGE_NODE-44\",\n",
+ " \"text\": \"URL and not on the support portal of some other customer.\\\\n* Customer admin isn't able to see all the tickets of the organization.\\\\n\\\\n + This could happen if the customer isn't logged in on the correct URL. If the customer is logged in on the correct URL, then check if there are any tickets that are reported by the other customers in that organization or not. Check if the customer is added as a customer admin or not by logging in to your DevRev application.\\\\n* You are not able to add customer\",\n",
+ " \"title\": \"Customer portal | Computer for Support Teams | DevRev\"\n",
+ " },\n",
+ " {\n",
+ " \"id\": \"ART-6174_KNOWLEDGE_NODE-27\",\n",
+ " \"text\": \"happens automatically:\\\\n\\\\n* The original conversation moves to *Archived* stage and cannot be reopened.\\\\n* A new ticket is created with:\\\\n + All internal discussions and customer messages copied from the conversation\\\\n + Equivalent metadata as the conversation, including source channel, customer account information, and external members added as **reported by** on the ticket\\\\n + An AI-generated ticket title and description based on customer messages\\\\n\\\\nConvert conversations to\",\n",
+ " \"title\": \"Conversation to ticket conversion | Conversations | Computer for Support Teams | DevRev\"\n",
+ " },\n",
+ " {\n",
+ " \"id\": \"ART-42\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Preview a sample result\n",
+ "import json\n",
+ "print(\"Sample result:\")\n",
+ "print(json.dumps(test_results[0], indent=2, default=str)[:1500])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "✓ Results saved to test_queries_results.json\n",
+ " - 92 queries\n",
+ " - 10 retrievals per query\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Save results to JSON file\n",
+ "OUTPUT_FILE = \"test_queries_results.json\"\n",
+ "\n",
+ "with open(OUTPUT_FILE, \"w\") as f:\n",
+ " json.dump(test_results, f, indent=2)\n",
+ "\n",
+ "print(f\"✓ Results saved to {OUTPUT_FILE}\")\n",
+ "print(f\" - {len(test_results)} queries\")\n",
+ "print(f\" - {TOP_K} retrievals per query\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "✓ Results also saved to test_queries_results.parquet\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Also save as a parquet file for easier loading\n",
+ "results_df = pd.DataFrame(test_results)\n",
+ "results_df.to_parquet(\"test_queries_results.parquet\", index=False)\n",
+ "print(\"✓ Results also saved to test_queries_results.parquet\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "============================================================\n",
+ "Test Queries Results Summary\n",
+ "============================================================\n",
+ "Total queries: 92\n",
+ "Retrievals per query: 10\n",
+ "\n",
+ "Output files:\n",
+ " - test_queries_results.json\n",
+ " - test_queries_results.parquet\n",
+ "\n",
+ "Format matches annotated_queries structure:\n",
+ " - query_id: string\n",
+ " - query: string\n",
+ " - retrievals: list of {id, text, title}\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Display results summary\n",
+ "print(\"=\" * 60)\n",
+ "print(\"Test Queries Results Summary\")\n",
+ "print(\"=\" * 60)\n",
+ "print(f\"Total queries: {len(test_results)}\")\n",
+ "print(f\"Retrievals per query: {TOP_K}\")\n",
+ "print(f\"\\nOutput files:\")\n",
+ "print(f\" - test_queries_results.json\")\n",
+ "print(f\" - test_queries_results.parquet\")\n",
+ "print(\"\\nFormat matches annotated_queries structure:\")\n",
+ "print(\" - query_id: string\")\n",
+ "print(\" - query: string\")\n",
+ "print(\" - retrievals: list of {id, text, title}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 8. Load Saved Index (Optional)\n",
+ "Use this to load a previously saved index without re-embedding."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Load saved index and mapping\n",
+ "# INDEX_DIR = \"faiss_index\"\n",
+ "# index = faiss.read_index(os.path.join(INDEX_DIR, \"knowledge_base.index\"))\n",
+ "# with open(os.path.join(INDEX_DIR, \"doc_mapping.pkl\"), \"rb\") as f:\n",
+ "# mapping = pickle.load(f)\n",
+ "# doc_ids = mapping[\"doc_ids\"]\n",
+ "# documents = mapping[\"documents\"]\n",
+ "# doc_titles = mapping[\"doc_titles\"]\n",
+ "# doc_texts = mapping[\"doc_texts\"]\n",
+ "# print(f\"Loaded index with {index.ntotal:,} vectors\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---\n",
+ "## 9. Enhanced Search Pipeline\n",
+ "\n",
+ "**Target: match Rank 3 open-source entry — `snowflake-arctic-embed-l-v2.0-bm25-zerank-1-small`**\n",
+ "\n",
+ "| Stage | What | Why |\n",
+ "|-------|------|-----|\n",
+ "| **Text Cleaning** | Remove `b'...'` byte artifacts, normalize unicode | Cleaner text → better embeddings & BM25 |\n",
+ "| **Stronger Embeddings** | `snowflake-arctic-embed-l-v2.0` (1024-dim, multilingual) | Exact model used by Rank 3 open-source entry |\n",
+ "| **Hybrid Retrieval** | Dense + BM25 with Reciprocal Rank Fusion | Catches both semantic and keyword matches |\n",
+ "| **Cross-Encoder Reranking** | `zeroentropy/zerank-1-small` (Apache 2.0) | Exact reranker used by all Top-4 entries |\n",
+ "\n",
+ "**Leaderboard gap (all values in %):**\n",
+ "\n",
+ "| Metric | You (current) | Rank 3 open-source | Gap |\n",
+ "|--------|:---:|:---:|:---:|\n",
+ "| Precision@10 | 16.56 | 26.63 | -10.07 pts |\n",
+ "| Recall@10 | 20.98 | 36.09 | -15.11 pts |\n",
+ "\n",
+ "> **Note on metrics:** The leaderboard evaluates on `test_queries` (92 held-out queries submitted to DevRev). Your local evaluation uses `annotated_queries` as a proxy. Local numbers will differ slightly from leaderboard numbers but track the same trend."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/macbookpro/Desktop/DevRev_search/.venv/lib/python3.14/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
+ " from .autonotebook import tqdm as notebook_tqdm\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Device selected: MPS\n",
+ "Apple Silicon MPS enabled — GPU acceleration active.\n"
+ ]
+ }
+ ],
+ "source": [
+ "import subprocess\n",
+ "subprocess.check_call([\"pip\", \"install\", \"-q\", \"rank_bm25\"])\n",
+ "\n",
+ "import re, ast, torch\n",
+ "from rank_bm25 import BM25Okapi\n",
+ "from sentence_transformers import SentenceTransformer, CrossEncoder\n",
+ "from collections import defaultdict\n",
+ "\n",
+ "# Auto-select best available device: MPS (Apple Silicon) > CUDA > CPU\n",
+ "if torch.backends.mps.is_available():\n",
+ " DEVICE = \"mps\"\n",
+ "elif torch.cuda.is_available():\n",
+ " DEVICE = \"cuda\"\n",
+ "else:\n",
+ " DEVICE = \"cpu\"\n",
+ "\n",
+ "print(f\"Device selected: {DEVICE.upper()}\")\n",
+ "if DEVICE == \"mps\":\n",
+ " print(\"Apple Silicon MPS enabled — GPU acceleration active.\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 9.1 Evaluation Metrics\n",
+ "Measure Recall@K, Precision@K, and MRR against annotated golden retrievals."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Evaluation function ready (metrics in %, matching leaderboard scale).\n"
+ ]
+ }
+ ],
+ "source": [
+ "def evaluate_retrieval(predictions, ground_truth, k_values=[1, 3, 5, 10]):\n",
+ " \"\"\"\n",
+ " Evaluate retrieval quality: Recall@K, Precision@K, MRR.\n",
+ " Returns metrics in PERCENTAGE form (0-100) to match leaderboard scale.\n",
+ " \"\"\"\n",
+ " gt_map = {g[\"query_id\"]: set(r[\"id\"] for r in g[\"retrievals\"]) for g in ground_truth}\n",
+ "\n",
+ " metrics = {}\n",
+ " for k in k_values:\n",
+ " recalls, precisions = [], []\n",
+ " for pred in predictions:\n",
+ " golden_ids = gt_map.get(pred[\"query_id\"], set())\n",
+ " if not golden_ids:\n",
+ " continue\n",
+ " predicted_ids = [r[\"id\"] for r in pred[\"retrievals\"][:k]]\n",
+ " hits = sum(1 for pid in predicted_ids if pid in golden_ids)\n",
+ " recalls.append(hits / len(golden_ids))\n",
+ " precisions.append(hits / k)\n",
+ " metrics[f\"Recall@{k}\"] = 100 * sum(recalls) / len(recalls) if recalls else 0\n",
+ " metrics[f\"Precision@{k}\"] = 100 * sum(precisions) / len(precisions) if precisions else 0\n",
+ "\n",
+ " mrrs = []\n",
+ " for pred in predictions:\n",
+ " golden_ids = gt_map.get(pred[\"query_id\"], set())\n",
+ " if not golden_ids:\n",
+ " continue\n",
+ " for rank, r in enumerate(pred[\"retrievals\"], 1):\n",
+ " if r[\"id\"] in golden_ids:\n",
+ " mrrs.append(1.0 / rank)\n",
+ " break\n",
+ " else:\n",
+ " mrrs.append(0.0)\n",
+ " metrics[\"MRR\"] = 100 * sum(mrrs) / len(mrrs) if mrrs else 0\n",
+ "\n",
+ " return metrics\n",
+ "\n",
+ "print(\"Evaluation function ready (metrics in %, matching leaderboard scale).\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Evaluating baseline (all-MiniLM-L6-v2 + FAISS flat)...\n"
+ ]
+ },
+ {
+ "ename": "NameError",
+ "evalue": "name 'knowledge_base' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
+ "\u001b[31mNameError\u001b[39m Traceback (most recent call last)",
+ "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[3]\u001b[39m\u001b[32m, line 4\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;66;03m# Evaluate current baseline (all-MiniLM-L6-v2 + FAISS)\u001b[39;00m\n\u001b[32m 2\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33m\"\u001b[39m\u001b[33mEvaluating baseline (all-MiniLM-L6-v2 + FAISS flat)...\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m----> \u001b[39m\u001b[32m4\u001b[39m corpus_data = \u001b[43mknowledge_base\u001b[49m[\u001b[33m\"\u001b[39m\u001b[33mcorpus\u001b[39m\u001b[33m\"\u001b[39m]\n\u001b[32m 5\u001b[39m ground_truth = [\u001b[38;5;28mdict\u001b[39m(item) \u001b[38;5;28;01mfor\u001b[39;00m item \u001b[38;5;129;01min\u001b[39;00m annotated_queries[\u001b[33m\"\u001b[39m\u001b[33mtrain\u001b[39m\u001b[33m\"\u001b[39m]]\n\u001b[32m 7\u001b[39m baseline_results = []\n",
+ "\u001b[31mNameError\u001b[39m: name 'knowledge_base' is not defined"
+ ]
+ }
+ ],
+ "source": [
+ "# Evaluate current baseline (all-MiniLM-L6-v2 + FAISS)\n",
+ "print(\"Evaluating baseline (all-MiniLM-L6-v2 + FAISS flat)...\")\n",
+ "\n",
+ "corpus_data = knowledge_base[\"corpus\"]\n",
+ "ground_truth = [dict(item) for item in annotated_queries[\"train\"]]\n",
+ "\n",
+ "baseline_results = []\n",
+ "for item in tqdm(annotated_queries[\"train\"], desc=\"Baseline eval\"):\n",
+ " query_emb = get_embedding(item[\"query\"]).astype('float32').reshape(1, -1)\n",
+ " faiss.normalize_L2(query_emb)\n",
+ " scores, indices = index.search(query_emb, 10)\n",
+ "\n",
+ " retrievals = []\n",
+ " for idx in indices[0]:\n",
+ " doc = corpus_data[int(idx)]\n",
+ " retrievals.append({\"id\": doc[\"id\"], \"text\": doc[\"text\"], \"title\": doc[\"title\"]})\n",
+ " baseline_results.append({\n",
+ " \"query_id\": item[\"query_id\"],\n",
+ " \"query\": item[\"query\"],\n",
+ " \"retrievals\": retrievals,\n",
+ " })\n",
+ "\n",
+ "baseline_metrics = evaluate_retrieval(baseline_results, ground_truth)\n",
+ "print(\"\\n=== BASELINE Performance (%, matching leaderboard scale) ===\")\n",
+ "for k, v in sorted(baseline_metrics.items()):\n",
+ " print(f\" {k:15s}: {v:6.2f}%\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 9.2 Text Cleaning\n",
+ "Many knowledge base entries have raw byte-string wrappers (`b'...'`) and escaped unicode. Clean these for better embedding and BM25 quality."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Cleaned 65,224 documents\n",
+ "\n",
+ "BEFORE: Sync fails when original sync owners loses permissions\n",
+ "\n",
+ "b'We ran into a case where an AirSync was started by one person (Person A) and later failed. Another user (Person B) tried to click Retry, but i\n",
+ "\n",
+ "AFTER: Sync fails when original sync owners loses permissions\n",
+ "\n",
+ "We ran into a case where an AirSync was started by one person (Person A) and later failed. Another user (Person B) tried to click Retry, but it \n"
+ ]
+ }
+ ],
+ "source": [
+ "def clean_text(text: str) -> str:\n",
+ " \"\"\"Remove byte-string wrappers, decode escaped unicode, normalize whitespace.\"\"\"\n",
+ " if isinstance(text, str) and (text.startswith(\"b'\") or text.startswith('b\"')):\n",
+ " try:\n",
+ " evaluated = ast.literal_eval(text)\n",
+ " if isinstance(evaluated, bytes):\n",
+ " text = evaluated.decode(\"utf-8\", errors=\"replace\")\n",
+ " except (ValueError, SyntaxError):\n",
+ " text = text[2:-1]\n",
+ "\n",
+ " text = text.replace(\"\\\\n\", \"\\n\")\n",
+ " text = re.sub(r\"\\\\x[0-9a-fA-F]{2}\", \" \", text)\n",
+ " text = re.sub(r\"\\n{3,}\", \"\\n\\n\", text)\n",
+ " text = re.sub(r\" {2,}\", \" \", text)\n",
+ " return text.strip()\n",
+ "\n",
+ "\n",
+ "cleaned_documents = []\n",
+ "cleaned_texts = []\n",
+ "for title, raw_text in zip(doc_titles, doc_texts):\n",
+ " ct = clean_text(raw_text)\n",
+ " cleaned_texts.append(ct)\n",
+ " cleaned_documents.append(f\"{title}\\n\\n{ct}\")\n",
+ "\n",
+ "print(f\"Cleaned {len(cleaned_documents):,} documents\")\n",
+ "print(f\"\\nBEFORE: {documents[0][:200]}\")\n",
+ "print(f\"\\nAFTER: {cleaned_documents[0][:200]}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 9.3 Stronger Dense Embedding Model\n",
+ "Replace `all-MiniLM-L6-v2` (384-dim) with `Snowflake/snowflake-arctic-embed-l-v2.0` (1024-dim) — the exact embedding model used by the Rank 3 open-source leaderboard entry.\n",
+ "\n",
+ "Snowflake Arctic Embed v2 uses `prompt_name=\"query\"` for query encoding (vs document encoding), which is handled automatically by the SentenceTransformers integration."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Loading Snowflake/snowflake-arctic-embed-l-v2.0 on MPS...\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Loading weights: 100%|██████████| 391/391 [00:00<00:00, 1633.57it/s, Materializing param=pooler.dense.weight] \n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Embedding dimension: 1024\n",
+ "Model device: mps:0\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sentence_transformers import SentenceTransformer\n",
+ "\n",
+ "DENSE_MODEL_NAME = \"Snowflake/snowflake-arctic-embed-l-v2.0\"\n",
+ "print(f\"Loading {DENSE_MODEL_NAME} on {DEVICE.upper()}...\")\n",
+ "dense_model = SentenceTransformer(DENSE_MODEL_NAME, device=DEVICE)\n",
+ "print(f\"Embedding dimension: {dense_model.get_sentence_embedding_dimension()}\")\n",
+ "print(f\"Model device: {next(dense_model.parameters()).device}\")\n",
+ "\n",
+ "\n",
+ "def get_dense_embedding(text: str, is_query: bool = False) -> np.ndarray:\n",
+ " if is_query:\n",
+ " return dense_model.encode(text, prompt_name=\"query\", normalize_embeddings=True)\n",
+ " return dense_model.encode(text, normalize_embeddings=True)\n",
+ "\n",
+ "\n",
+ "def get_dense_embeddings_batch(texts: list, is_query: bool = False, batch_size: int = 64) -> np.ndarray:\n",
+ " if is_query:\n",
+ " return dense_model.encode(texts, prompt_name=\"query\", normalize_embeddings=True,\n",
+ " batch_size=batch_size, show_progress_bar=True)\n",
+ " return dense_model.encode(texts, normalize_embeddings=True, batch_size=batch_size, show_progress_bar=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Generating snowflake-arctic-embed-l-v2.0 embeddings for 65,224 documents...\n",
+ "(~10-15 min on CPU / ~3-5 min on Apple Silicon MPS)\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Batches: 100%|██████████| 1020/1020 [39:27<00:00, 2.32s/it]\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Embeddings shape: (65224, 1024)\n",
+ "Saved to embeddings_snowflake.npy\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(f\"Generating snowflake-arctic-embed-l-v2.0 embeddings for {len(cleaned_documents):,} documents...\")\n",
+ "print(\"(~10-15 min on CPU / ~3-5 min on Apple Silicon MPS)\")\n",
+ "\n",
+ "dense_embeddings = get_dense_embeddings_batch(cleaned_documents, is_query=False, batch_size=64)\n",
+ "print(f\"\\nEmbeddings shape: {dense_embeddings.shape}\")\n",
+ "\n",
+ "np.save(\"embeddings_snowflake.npy\", dense_embeddings)\n",
+ "print(\"Saved to embeddings_snowflake.npy\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 9.4 Build FAISS Dense Index + BM25 Sparse Index\n",
+ "Two complementary retrieval paths:\n",
+ "- **Dense (FAISS)** — semantic similarity via BGE embeddings\n",
+ "- **Sparse (BM25)** — keyword/term frequency matching"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "FAISS index: 65,224 vectors, dim=1024\n",
+ "Building BM25 index...\n",
+ "BM25 index: 65,224 documents\n"
+ ]
+ }
+ ],
+ "source": [
+ "# --- Dense FAISS index ---\n",
+ "dense_dim = dense_embeddings.shape[1]\n",
+ "enhanced_index = faiss.IndexFlatIP(dense_dim)\n",
+ "enhanced_index.add(dense_embeddings.astype(\"float32\"))\n",
+ "print(f\"FAISS index: {enhanced_index.ntotal:,} vectors, dim={dense_dim}\")\n",
+ "\n",
+ "# --- BM25 sparse index ---\n",
+ "print(\"Building BM25 index...\")\n",
+ "tokenized_docs = [doc.lower().split() for doc in cleaned_documents]\n",
+ "bm25_index = BM25Okapi(tokenized_docs)\n",
+ "print(f\"BM25 index: {len(tokenized_docs):,} documents\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 9.5 Cross-Encoder Reranker — zerank-1-small\n",
+ "`zeroentropy/zerank-1-small` is the exact reranker used by all top-4 leaderboard entries. It's open-source (Apache 2.0) and outperforms Cohere Rerank-3.5 on BEIR benchmarks.\n",
+ "\n",
+ "A cross-encoder scores (query, document) pairs jointly — far more accurate than bi-encoder cosine similarity, but only feasible on a small candidate pool. We apply it to the top-50 fused candidates from hybrid retrieval."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Note: you may need to restart the kernel to use updated packages.\n",
+ "accelerate available: True\n",
+ "Loading reranker: zeroentropy/zerank-1-small on CPU...\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Loading weights: 100%|██████████| 310/310 [00:00<00:00, 1714.72it/s, Materializing param=model.norm.weight] \n",
+ "\u001b[1mQwen3ForSequenceClassification LOAD REPORT\u001b[0m from: zeroentropy/zerank-1-small\n",
+ "Key | Status | \n",
+ "-------------+---------+-\n",
+ "score.weight | MISSING | \n",
+ "\n",
+ "\u001b[3mNotes:\n",
+ "- MISSING\u001b[3m\t:those params were newly initialized because missing from the checkpoint. Consider training on your downstream task.\u001b[0m\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Reranker loaded.\n"
+ ]
+ }
+ ],
+ "source": [
+ "%pip install -q protobuf\n",
+ "\n",
+ "import torch\n",
+ "from sentence_transformers import CrossEncoder\n",
+ "\n",
+ "# is_accelerate_available() uses @lru_cache — clear it so the post-install\n",
+ "# state of accelerate is detected fresh on the next call.\n",
+ "from transformers.utils import is_accelerate_available\n",
+ "is_accelerate_available.cache_clear()\n",
+ "print(f\"accelerate available: {is_accelerate_available()}\")\n",
+ "\n",
+ "# Remove any leftover global default device from previous cell runs.\n",
+ "torch.set_default_device(None)\n",
+ "\n",
+ "RERANKER_MODEL = \"zeroentropy/zerank-1-small\"\n",
+ "print(f\"Loading reranker: {RERANKER_MODEL} on CPU...\")\n",
+ "# local_files_only=True avoids ConnectErrors — model is already cached locally.\n",
+ "reranker = CrossEncoder(\n",
+ " RERANKER_MODEL,\n",
+ " trust_remote_code=True,\n",
+ " device=\"cpu\",\n",
+ " local_files_only=True,\n",
+ ")\n",
+ "print(\"Reranker loaded.\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 9.6 Hybrid Search + Rerank Pipeline\n",
+ "Three-stage retrieval:\n",
+ "1. **Retrieve** top-100 from Dense (FAISS) and top-100 from BM25\n",
+ "2. **Fuse** via Reciprocal Rank Fusion (RRF)\n",
+ "3. **Rerank** top-50 fused candidates with cross-encoder → return top-K"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "All prerequisites satisfied. Ready to build hybrid search pipeline.\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Prerequisites check — run this before the hybrid search function\n",
+ "_missing = []\n",
+ "if \"dense_model\" not in dir(): _missing.append(\"dense_model → run cell 9.3 (Load snowflake model)\")\n",
+ "if \"get_dense_embedding\" not in dir(): _missing.append(\"get_dense_embedding → run cell 9.3 (Load snowflake model)\")\n",
+ "if \"cleaned_documents\" not in dir(): _missing.append(\"cleaned_documents → run cell 9.2 (Text cleaning)\")\n",
+ "if \"enhanced_index\" not in dir(): _missing.append(\"enhanced_index → run cell 9.4 (Build FAISS + BM25 indices)\")\n",
+ "if \"bm25_index\" not in dir(): _missing.append(\"bm25_index → run cell 9.4 (Build FAISS + BM25 indices)\")\n",
+ "if \"reranker\" not in dir(): _missing.append(\"reranker → run cell 9.5 (Load zerank-1-small)\")\n",
+ "if \"corpus_data\" not in dir(): _missing.append(\"corpus_data → run cell 9.7 baseline eval (defines corpus_data)\")\n",
+ "\n",
+ "if _missing:\n",
+ " raise RuntimeError(\n",
+ " \"Missing prerequisites — please run these cells first:\\n \" + \"\\n \".join(_missing)\n",
+ " )\n",
+ "print(\"All prerequisites satisfied. Ready to build hybrid search pipeline.\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Loading weights: 100%|██████████| 310/310 [00:00<00:00, 2233.24it/s, Materializing param=model.norm.weight] \n"
+ ]
+ }
+ ],
+ "source": [
+ "def hybrid_search_rerank(\n",
+ " query: str,\n",
+ " top_k: int = 10,\n",
+ " dense_candidates: int = 100,\n",
+ " bm25_candidates: int = 100,\n",
+ " rerank_pool: int = 50,\n",
+ " rrf_k: int = 60,\n",
+ "):\n",
+ " \"\"\"\n",
+ " Stage 1: Dense + BM25 retrieval\n",
+ " Stage 2: Reciprocal Rank Fusion\n",
+ " Stage 3: Cross-encoder reranking\n",
+ " \"\"\"\n",
+ " # --- Stage 1A: Dense retrieval ---\n",
+ " q_emb = get_dense_embedding(query, is_query=True).astype(\"float32\").reshape(1, -1)\n",
+ " dense_scores, dense_indices = enhanced_index.search(q_emb, dense_candidates)\n",
+ "\n",
+ " # --- Stage 1B: BM25 retrieval ---\n",
+ " bm25_scores = bm25_index.get_scores(query.lower().split())\n",
+ " bm25_top = np.argsort(bm25_scores)[::-1][:bm25_candidates]\n",
+ "\n",
+ " # --- Stage 2: Reciprocal Rank Fusion ---\n",
+ " rrf_scores = defaultdict(float)\n",
+ " for rank, idx in enumerate(dense_indices[0]):\n",
+ " rrf_scores[int(idx)] += 1.0 / (rrf_k + rank + 1)\n",
+ " for rank, idx in enumerate(bm25_top):\n",
+ " rrf_scores[int(idx)] += 1.0 / (rrf_k + rank + 1)\n",
+ "\n",
+ " fused = sorted(rrf_scores.items(), key=lambda x: x[1], reverse=True)[:rerank_pool]\n",
+ " candidate_indices = [idx for idx, _ in fused]\n",
+ "\n",
+ " # --- Stage 3: Cross-encoder reranking ---\n",
+ " pairs = [(query, cleaned_documents[idx]) for idx in candidate_indices]\n",
+ " rerank_scores = reranker.predict(pairs)\n",
+ "\n",
+ " scored = sorted(zip(candidate_indices, rerank_scores), key=lambda x: x[1], reverse=True)\n",
+ "\n",
+ " results = []\n",
+ " for idx, score in scored[:top_k]:\n",
+ " doc = corpus_data[idx]\n",
+ " results.append({\n",
+ " \"id\": doc[\"id\"],\n",
+ " \"text\": doc[\"text\"],\n",
+ " \"title\": doc[\"title\"],\n",
+ " })\n",
+ " return results\n",
+ "\n",
+ "\n",
+ "# Quick sanity test\n",
+ "test_result = hybrid_search_rerank(\"How do I set up AirSync?\", top_k=3)\n",
+ "for i, r in enumerate(test_result, 1):\n",
+ " print(f\"[{i}] {r['title']}\")\n",
+ " print(f\" {r['text'][:120]}...\")\n",
+ " print()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 9.7 Evaluate Enhanced Pipeline vs Baseline\n",
+ "Run the full enhanced pipeline on all 291 annotated queries and compare head-to-head."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Evaluating enhanced pipeline on annotated queries...\n",
+ "(~2-4 min: 291 queries × reranking 50 candidates each)\n",
+ "\n"
+ ]
+ },
+ {
+ "ename": "NameError",
+ "evalue": "name 'tqdm' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
+ "\u001b[31mNameError\u001b[39m Traceback (most recent call last)",
+ "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[2]\u001b[39m\u001b[32m, line 5\u001b[39m\n\u001b[32m 2\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33m\"\u001b[39m\u001b[33m(~2-4 min: 291 queries × reranking 50 candidates each)\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33m\"\u001b[39m)\n\u001b[32m 4\u001b[39m enhanced_eval_results = []\n\u001b[32m----> \u001b[39m\u001b[32m5\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m item \u001b[38;5;129;01min\u001b[39;00m \u001b[43mtqdm\u001b[49m(annotated_queries[\u001b[33m\"\u001b[39m\u001b[33mtrain\u001b[39m\u001b[33m\"\u001b[39m], desc=\u001b[33m\"\u001b[39m\u001b[33mEnhanced eval\u001b[39m\u001b[33m\"\u001b[39m):\n\u001b[32m 6\u001b[39m retrievals = hybrid_search_rerank(item[\u001b[33m\"\u001b[39m\u001b[33mquery\u001b[39m\u001b[33m\"\u001b[39m], top_k=\u001b[32m10\u001b[39m)\n\u001b[32m 7\u001b[39m enhanced_eval_results.append({\n\u001b[32m 8\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mquery_id\u001b[39m\u001b[33m\"\u001b[39m: item[\u001b[33m\"\u001b[39m\u001b[33mquery_id\u001b[39m\u001b[33m\"\u001b[39m],\n\u001b[32m 9\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mquery\u001b[39m\u001b[33m\"\u001b[39m: item[\u001b[33m\"\u001b[39m\u001b[33mquery\u001b[39m\u001b[33m\"\u001b[39m],\n\u001b[32m 10\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mretrievals\u001b[39m\u001b[33m\"\u001b[39m: retrievals,\n\u001b[32m 11\u001b[39m })\n",
+ "\u001b[31mNameError\u001b[39m: name 'tqdm' is not defined"
+ ]
+ }
+ ],
+ "source": [
+ "print(\"Evaluating enhanced pipeline on annotated queries...\")\n",
+ "print(\"(~2-4 min: 291 queries × reranking 50 candidates each)\\n\")\n",
+ "\n",
+ "enhanced_eval_results = []\n",
+ "for item in tqdm(annotated_queries[\"train\"], desc=\"Enhanced eval\"):\n",
+ " retrievals = hybrid_search_rerank(item[\"query\"], top_k=10)\n",
+ " enhanced_eval_results.append({\n",
+ " \"query_id\": item[\"query_id\"],\n",
+ " \"query\": item[\"query\"],\n",
+ " \"retrievals\": retrievals,\n",
+ " })\n",
+ "\n",
+ "enhanced_metrics = evaluate_retrieval(enhanced_eval_results, ground_truth)\n",
+ "\n",
+ "# Leaderboard reference targets (open-source entries, in %)\n",
+ "LEADERBOARD = {\n",
+ " \"Rank 3 OS (snowflake+zerank)\": {\"Precision@10\": 26.63, \"Recall@10\": 36.09},\n",
+ " \"Rank 4 OS (GTE-Qwen2+zerank)\": {\"Precision@10\": 26.85, \"Recall@10\": 35.08},\n",
+ "}\n",
+ "\n",
+ "print(\"\\n\" + \"=\" * 80)\n",
+ "print(f\"{'METRIC':<16} {'BASELINE':>10} {'ENHANCED':>10} {'DELTA':>8} {'Rank3 OS':>10} {'Gap to R3':>10}\")\n",
+ "print(\"=\" * 80)\n",
+ "for k in sorted(baseline_metrics.keys()):\n",
+ " b = baseline_metrics[k]\n",
+ " e = enhanced_metrics[k]\n",
+ " delta = e - b\n",
+ " r3 = LEADERBOARD[\"Rank 3 OS (snowflake+zerank)\"].get(k, None)\n",
+ " gap_str = f\"{e - r3:+.2f}\" if r3 is not None else \" —\"\n",
+ " r3_str = f\"{r3:.2f}%\" if r3 is not None else \" —\"\n",
+ " arrow = \"+\" if delta > 0 else \"\"\n",
+ " print(f\" {k:<14} {b:>9.2f}% {e:>9.2f}% {arrow}{delta:>7.2f} {r3_str:>10} {gap_str:>10}\")\n",
+ "print(\"=\" * 80)\n",
+ "print(\"\\nAll values in % — same scale as the leaderboard.\")\n",
+ "print(\"Leaderboard evaluates on TEST QUERIES (92 held-out); this eval uses annotated_queries (291) as proxy.\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 9.8 Generate Final Submission — Test Queries\n",
+ "Run the enhanced pipeline on all 92 held-out test queries and save in the required format."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running enhanced pipeline on 92 test queries...\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Test queries: 100%|██████████| 92/92 [00:51<00:00, 1.80it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "==================================================\n",
+ "Results saved to test_queries_results_enhanced.json\n",
+ " Queries: 92\n",
+ " Per query: 10 retrievals\n",
+ "==================================================\n",
+ "Also saved to test_queries_results_enhanced.parquet\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(\"Running enhanced pipeline on 92 test queries...\")\n",
+ "\n",
+ "enhanced_test_results = []\n",
+ "for item in tqdm(test_queries[\"test\"], desc=\"Test queries\"):\n",
+ " retrievals = hybrid_search_rerank(item[\"query\"], top_k=10)\n",
+ " enhanced_test_results.append({\n",
+ " \"query_id\": item[\"query_id\"],\n",
+ " \"query\": item[\"query\"],\n",
+ " \"retrievals\": retrievals,\n",
+ " })\n",
+ "\n",
+ "OUTPUT_FILE = \"test_queries_results_enhanced.json\"\n",
+ "with open(OUTPUT_FILE, \"w\") as f:\n",
+ " json.dump(enhanced_test_results, f, indent=2)\n",
+ "\n",
+ "print(f\"\\n{'=' * 50}\")\n",
+ "print(f\"Results saved to {OUTPUT_FILE}\")\n",
+ "print(f\" Queries: {len(enhanced_test_results)}\")\n",
+ "print(f\" Per query: 10 retrievals\")\n",
+ "print(f\"{'=' * 50}\")\n",
+ "\n",
+ "results_df = pd.DataFrame(enhanced_test_results)\n",
+ "results_df.to_parquet(\"test_queries_results_enhanced.parquet\", index=False)\n",
+ "print(\"Also saved to test_queries_results_enhanced.parquet\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Sample enhanced result:\n",
+ "\n",
+ "{\n",
+ " \"query_id\": \"a97f93d2-410a-431f-ae9a-1e23ed35d74c\",\n",
+ " \"query\": \"end customer organization name not appearing in ticket or conversation\",\n",
+ " \"retrievals\": [\n",
+ " {\n",
+ " \"id\": \"ART-3207_KNOWLEDGE_NODE-53\",\n",
+ " \"text\": \"can click **Accept invite**.\\\\n\\\\n4. Verify configuration\\\\n-----------------------\\\\n\\\\n1. Send an email to the configured support email address.\\\\n2. Confirm that a ticket or conversation is created in the DevRev app.\\\\n3. Add a comment to the ticket or conversation and verify that it is received at the email address that sent the original message.\\\\n\\\\nTroubleshooting deliverability\\\\n\\\\nWhile the DevRev app ensures that emails are sent, the deliverability of the emails to the end customers is\",\n",
+ " \"title\": \"Email snap-in configuration | Email | Integrate | Snap-ins | DevRev\"\n",
+ " },\n",
+ " {\n",
+ " \"id\": \"ART-6174_KNOWLEDGE_NODE-29\",\n",
+ " \"text\": \"rules\\\\n\\\\nWorkflows enable seamless handovers from automated conversations to your support teams when necessary.\\\\n\\\\nPlug widget end-user experience\\\\n-------------------------------\\\\n\\\\nWhen a conversation is converted to a ticket in the Plug widget:\\\\n\\\\n* The ticket number and basic details appear in the same conversation pane.\\\\n* Users can click **Details** to view complete ticket information.\\\\n* If the **Tickets** tab is enabled in Plug, users can track their ticket status\",\n",
+ " \"title\": \"Conversation to ticket conversion | Conversations | Computer for Support Teams | DevRev\"\n",
+ " },\n",
+ " {\n",
+ " \"id\":\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Preview first enhanced result\n",
+ "print(\"Sample enhanced result:\\n\")\n",
+ "print(json.dumps(enhanced_test_results[0], indent=2, default=str)[:1500])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 9.9 Load Saved Enhanced Embeddings (Optional)\n",
+ "Skip re-embedding if you've already generated and saved `embeddings_bge_large.npy`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Uncomment to load pre-saved embeddings instead of re-generating:\n",
+ "# dense_embeddings = np.load(\"embeddings_snowflake.npy\")\n",
+ "# print(f\"Loaded embeddings: {dense_embeddings.shape}\")\n",
+ "# Then re-run cells 9.4 onward (skip 9.3 embedding generation)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": ".venv",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.14.3"
+ }
},
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from datasets import load_dataset\n",
- "import pandas as pd"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 1. Load Annotated Queries\n",
- "Queries paired with annotated (golden) article chunks for training/validation."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Load annotated queries\n",
- "annotated_queries = load_dataset(\"devrev/search\", \"annotated_queries\")\n",
- "print(annotated_queries)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Convert to DataFrame and display\n",
- "annotated_df = annotated_queries[\"train\"].to_pandas()\n",
- "annotated_df.head()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Sample a single annotated query example\n",
- "annotated_queries[\"train\"][0]"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 2. Load Test Queries\n",
- "Held-out queries used for evaluation."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Load test queries\n",
- "test_queries = load_dataset(\"devrev/search\", \"test_queries\")\n",
- "print(test_queries)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Convert to DataFrame and display\n",
- "test_df = test_queries[\"test\"].to_pandas()\n",
- "test_df.head()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Sample a single test query example\n",
- "test_queries[\"test\"][0]"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 3. Load Knowledge Base\n",
- "Article chunks from DevRev's customer-facing support documentation."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Load knowledge base\n",
- "knowledge_base = load_dataset(\"devrev/search\", \"knowledge_base\")\n",
- "print(knowledge_base)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Convert to DataFrame and display\n",
- "knowledge_df = knowledge_base[\"corpus\"].to_pandas()\n",
- "knowledge_df.head()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Sample a single knowledge base chunk\n",
- "knowledge_base[\"corpus\"][0]"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 4. Dataset Summary"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "print(\"=\" * 60)\n",
- "print(\"DevRev Search Dataset Summary\")\n",
- "print(\"=\" * 60)\n",
- "print(f\"\\nAnnotated Queries:\")\n",
- "print(annotated_queries)\n",
- "print(f\"\\nTest Queries:\")\n",
- "print(test_queries)\n",
- "print(f\"\\nKnowledge Base:\")\n",
- "print(knowledge_base)\n",
- "print(\"\\n\" + \"=\" * 60)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "---\n",
- "## 5. Index Knowledge Base with FAISS\n",
- "\n",
- "Using OpenAI text-embedding-3-small and FAISS for similarity search."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from openai import OpenAI\n",
- "import faiss\n",
- "import numpy as np\n",
- "from tqdm import tqdm\n",
- "import time\n",
- "import os\n",
- "import json\n",
- "import pickle"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Initialize OpenAI client\n",
- "# Set your API key as an environment variable: export OPENAI_API_KEY=\"your-key-here\"\n",
- "OPENAI_API_KEY = os.environ.get(\"OPENAI_API_KEY\")\n",
- "if not OPENAI_API_KEY:\n",
- " raise ValueError(\"Please set OPENAI_API_KEY environment variable\")\n",
- "\n",
- "client = OpenAI(api_key=OPENAI_API_KEY)\n",
- "\n",
- "MODEL_ID = \"text-embedding-3-small\" # 1536 dimensions\n",
- "print(f\"Using model: {MODEL_ID}\")\n",
- "print(f\"Provider: OpenAI\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "def get_embedding(text: str) -> np.ndarray:\n",
- " \"\"\"Get embedding for a single text using OpenAI text-embedding-3.\"\"\"\n",
- " response = client.embeddings.create(\n",
- " model=MODEL_ID,\n",
- " input=text\n",
- " )\n",
- " return np.array(response.data[0].embedding)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "def get_embeddings_batch(texts: list) -> np.ndarray:\n",
- " \"\"\"Get embeddings for a batch of texts using OpenAI text-embedding-3.\"\"\"\n",
- " response = client.embeddings.create(\n",
- " model=MODEL_ID,\n",
- " input=texts\n",
- " )\n",
- " return np.array([d.embedding for d in response.data])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Test the embedding API\n",
- "test_embedding = get_embedding(\"This is a test sentence.\")\n",
- "print(f\"Test embedding shape: {test_embedding.shape}\")\n",
- "print(f\"Embedding dimension: {len(test_embedding)}\")\n",
- "print(f\"First 5 values: {test_embedding[:5]}\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Prepare documents: concatenate title with text\n",
- "corpus = knowledge_base[\"corpus\"]\n",
- "\n",
- "documents = []\n",
- "doc_ids = []\n",
- "doc_titles = []\n",
- "doc_texts = []\n",
- "\n",
- "for item in tqdm(corpus, desc=\"Preparing documents\"):\n",
- " # Concatenate title and text\n",
- " doc_text = f\"{item['title']}\\n\\n{item['text']}\"\n",
- " documents.append(doc_text)\n",
- " doc_ids.append(item['id'])\n",
- " doc_titles.append(item['title'])\n",
- " doc_texts.append(item['text'])\n",
- "\n",
- "print(f\"\\nTotal documents: {len(documents):,}\")\n",
- "print(f\"\\nSample document:\")\n",
- "print(documents[0][:500])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "def get_all_embeddings(texts, batch_size=100, max_retries=3):\n",
- " \"\"\"Get embeddings for all texts using OpenAI batch API.\"\"\"\n",
- " all_embeddings = []\n",
- " \n",
- " for i in tqdm(range(0, len(texts), batch_size), desc=\"Generating embeddings\"):\n",
- " batch = texts[i:i + batch_size]\n",
- " \n",
- " # Truncate texts if too long (OpenAI has ~8K token limit)\n",
- " batch = [text[:8000] if len(text) > 8000 else text for text in batch]\n",
- " \n",
- " retries = 0\n",
- " while retries < max_retries:\n",
- " try:\n",
- " embeddings = get_embeddings_batch(batch)\n",
- " all_embeddings.append(embeddings)\n",
- " break\n",
- " except Exception as e:\n",
- " retries += 1\n",
- " if retries >= max_retries:\n",
- " print(f\"Error embedding batch {i}: {e}\")\n",
- " all_embeddings.append(np.zeros((len(batch), 1536)))\n",
- " else:\n",
- " print(f\"Retry {retries} for batch {i}...\")\n",
- " time.sleep(2)\n",
- " \n",
- " time.sleep(0.1) # Rate limiting\n",
- " \n",
- " return np.vstack(all_embeddings)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Generate embeddings for all documents\n",
- "print(\"Generating embeddings for knowledge base...\")\n",
- "print(f\"Total documents: {len(documents):,}\")\n",
- "print(\"Using batch processing for efficiency...\")\n",
- "\n",
- "# For testing, use a subset (uncomment for all documents)\n",
- "# documents_to_embed = documents[:100] # Test with first 100 docs\n",
- "documents_to_embed = documents # All documents\n",
- "\n",
- "embeddings = get_all_embeddings(documents_to_embed, batch_size=1000)\n",
- "print(f\"\\nEmbeddings shape: {embeddings.shape}\")\n",
- "\n",
- "# Save embeddings\n",
- "np.save(\"embeddings.npy\", embeddings)\n",
- "print(\"Embeddings saved to embeddings.npy\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Load embeddings if already saved\n",
- "# embeddings = np.load(\"embeddings.npy\")\n",
- "# print(f\"Loaded embeddings shape: {embeddings.shape}\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Create FAISS index\n",
- "embedding_dim = embeddings.shape[1]\n",
- "print(f\"Creating FAISS index with dimension: {embedding_dim}\")\n",
- "\n",
- "# Normalize embeddings for cosine similarity\n",
- "embeddings_normalized = embeddings.copy().astype('float32')\n",
- "faiss.normalize_L2(embeddings_normalized)\n",
- "\n",
- "# Create the index using IndexFlatIP for inner product (cosine similarity with normalized vectors)\n",
- "index = faiss.IndexFlatIP(embedding_dim)\n",
- "index.add(embeddings_normalized)\n",
- "\n",
- "print(f\"Index created with {index.ntotal:,} vectors\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Save the index and document mapping\n",
- "INDEX_DIR = \"faiss_index\"\n",
- "os.makedirs(INDEX_DIR, exist_ok=True)\n",
- "\n",
- "# Save FAISS index\n",
- "faiss.write_index(index, os.path.join(INDEX_DIR, \"knowledge_base.index\"))\n",
- "\n",
- "# Save document mapping\n",
- "with open(os.path.join(INDEX_DIR, \"doc_mapping.pkl\"), \"wb\") as f:\n",
- " pickle.dump({\n",
- " \"doc_ids\": doc_ids,\n",
- " \"documents\": documents,\n",
- " \"doc_titles\": doc_titles,\n",
- " \"doc_texts\": doc_texts\n",
- " }, f)\n",
- "\n",
- "print(f\"\u2713 Index saved to {INDEX_DIR}/knowledge_base.index\")\n",
- "print(f\"\u2713 Document mapping saved to {INDEX_DIR}/doc_mapping.pkl\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 6. Search the Knowledge Base"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "def search(query: str, k: int = 5):\n",
- " \"\"\"Search the knowledge base for relevant documents.\"\"\"\n",
- " query_embedding = get_embedding(query).astype('float32')\n",
- " query_embedding = query_embedding.reshape(1, -1)\n",
- " faiss.normalize_L2(query_embedding)\n",
- " \n",
- " scores, indices = index.search(query_embedding, k)\n",
- " \n",
- " results = []\n",
- " for i, (score, idx) in enumerate(zip(scores[0], indices[0])):\n",
- " results.append({\n",
- " \"rank\": i + 1,\n",
- " \"score\": float(score),\n",
- " \"id\": doc_ids[idx],\n",
- " \"title\": doc_titles[idx],\n",
- " \"text\": doc_texts[idx]\n",
- " })\n",
- " \n",
- " return results"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Test search with a sample query\n",
- "query = \"How do I set up AirSync?\"\n",
- "results = search(query, k=5)\n",
- "\n",
- "print(f\"Query: {query}\")\n",
- "print(\"=\" * 60)\n",
- "\n",
- "for r in results:\n",
- " print(f\"\\n[Rank {r['rank']}] Score: {r['score']:.4f}\")\n",
- " print(f\"Doc ID: {r['id']}\")\n",
- " print(f\"Title: {r['title']}\")\n",
- " print(f\"Text: {r['text'][:300]}...\")\n",
- " print(\"-\" * 40)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "---\n",
- "## 7. Run Evaluation on Test Queries\n",
- "\n",
- "Run search against all test queries and save results in the same format as annotated_queries."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Run search on all test queries - DIRECT VERSION (no dependency on search function)\n",
- "TOP_K = 10 # Number of retrievals per query\n",
- "\n",
- "# Get corpus data for lookups\n",
- "corpus_data = knowledge_base[\"corpus\"]\n",
- "\n",
- "test_results = []\n",
- "\n",
- "for item in tqdm(test_queries[\"test\"], desc=\"Processing test queries\"):\n",
- " query_id = item[\"query_id\"]\n",
- " query = item[\"query\"]\n",
- " \n",
- " # Get query embedding directly\n",
- " query_embedding = get_embedding(query).astype('float32').reshape(1, -1)\n",
- " faiss.normalize_L2(query_embedding)\n",
- " \n",
- " # Search FAISS index\n",
- " scores, indices = index.search(query_embedding, TOP_K)\n",
- " \n",
- " # Format retrievals using corpus data directly\n",
- " retrievals = []\n",
- " for idx in indices[0]:\n",
- " doc = corpus_data[int(idx)]\n",
- " retrievals.append({\n",
- " \"id\": doc[\"id\"],\n",
- " \"text\": doc[\"text\"],\n",
- " \"title\": doc[\"title\"]\n",
- " })\n",
- " \n",
- " test_results.append({\n",
- " \"query_id\": query_id,\n",
- " \"query\": query,\n",
- " \"retrievals\": retrievals\n",
- " })\n",
- "\n",
- "print(f\"\\nProcessed {len(test_results)} test queries\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Preview a sample result\n",
- "import json\n",
- "print(\"Sample result:\")\n",
- "print(json.dumps(test_results[0], indent=2, default=str)[:1500])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Save results to JSON file\n",
- "OUTPUT_FILE = \"test_queries_results.json\"\n",
- "\n",
- "with open(OUTPUT_FILE, \"w\") as f:\n",
- " json.dump(test_results, f, indent=2)\n",
- "\n",
- "print(f\"\u2713 Results saved to {OUTPUT_FILE}\")\n",
- "print(f\" - {len(test_results)} queries\")\n",
- "print(f\" - {TOP_K} retrievals per query\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Also save as a parquet file for easier loading\n",
- "results_df = pd.DataFrame(test_results)\n",
- "results_df.to_parquet(\"test_queries_results.parquet\", index=False)\n",
- "print(\"\u2713 Results also saved to test_queries_results.parquet\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Display results summary\n",
- "print(\"=\" * 60)\n",
- "print(\"Test Queries Results Summary\")\n",
- "print(\"=\" * 60)\n",
- "print(f\"Total queries: {len(test_results)}\")\n",
- "print(f\"Retrievals per query: {TOP_K}\")\n",
- "print(f\"\\nOutput files:\")\n",
- "print(f\" - test_queries_results.json\")\n",
- "print(f\" - test_queries_results.parquet\")\n",
- "print(\"\\nFormat matches annotated_queries structure:\")\n",
- "print(\" - query_id: string\")\n",
- "print(\" - query: string\")\n",
- "print(\" - retrievals: list of {id, text, title}\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 8. Load Saved Index (Optional)\n",
- "Use this to load a previously saved index without re-embedding."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Load saved index and mapping\n",
- "# INDEX_DIR = \"faiss_index\"\n",
- "# index = faiss.read_index(os.path.join(INDEX_DIR, \"knowledge_base.index\"))\n",
- "# with open(os.path.join(INDEX_DIR, \"doc_mapping.pkl\"), \"rb\") as f:\n",
- "# mapping = pickle.load(f)\n",
- "# doc_ids = mapping[\"doc_ids\"]\n",
- "# documents = mapping[\"documents\"]\n",
- "# doc_titles = mapping[\"doc_titles\"]\n",
- "# doc_texts = mapping[\"doc_texts\"]\n",
- "# print(f\"Loaded index with {index.ntotal:,} vectors\")"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": ".venv",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.14.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 4
-}
\ No newline at end of file
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/run_pipeline.py b/run_pipeline.py
new file mode 100644
index 0000000..bdb4dad
--- /dev/null
+++ b/run_pipeline.py
@@ -0,0 +1,303 @@
+"""
+Section 10 — Multi-Query Triple-Path Hybrid Retrieval Pipeline
+Loads saved artefacts (embeddings, FAISS index) and generates the final submission.
+"""
+
+import os
+# Prevent tokenizer / OMP forking that causes segfaults on macOS
+os.environ.setdefault("TOKENIZERS_PARALLELISM", "false")
+os.environ.setdefault("OMP_NUM_THREADS", "1")
+# Disable MPS watermark — avoids OOM from stale MPS allocations across runs
+# MPS watermark disabled to avoid stale-allocation OOM if MPS is used elsewhere
+os.environ.setdefault("PYTORCH_MPS_HIGH_WATERMARK_RATIO", "0.0")
+
+import re, ast, json, time
+import numpy as np
+import faiss
+import torch
+from collections import defaultdict
+from tqdm import tqdm
+
+# ── Device ──────────────────────────────────────────────────────────────────
+if torch.backends.mps.is_available():
+ DEVICE = "mps"
+elif torch.cuda.is_available():
+ DEVICE = "cuda"
+else:
+ DEVICE = "cpu"
+print(f"Device: {DEVICE.upper()}")
+
+# ── Packages ─────────────────────────────────────────────────────────────────
+try:
+ from rank_bm25 import BM25Okapi
+except ImportError:
+ import subprocess; subprocess.check_call(["pip", "install", "-q", "rank_bm25"])
+ from rank_bm25 import BM25Okapi
+
+try:
+ import accelerate # noqa
+except ImportError:
+ import subprocess; subprocess.check_call(["pip", "install", "-q", "accelerate"])
+
+try:
+ import protobuf # noqa
+except ImportError:
+ import subprocess; subprocess.check_call(["pip", "install", "-q", "protobuf"])
+
+from sentence_transformers import SentenceTransformer, CrossEncoder
+from transformers.utils import is_accelerate_available
+is_accelerate_available.cache_clear()
+torch.set_default_device(None)
+
+# ── Load Dataset ─────────────────────────────────────────────────────────────
+print("\n[1/8] Loading datasets...")
+from datasets import load_dataset
+knowledge_base = load_dataset("devrev/search", "knowledge_base")
+annotated_queries = load_dataset("devrev/search", "annotated_queries")
+test_queries = load_dataset("devrev/search", "test_queries")
+corpus_data = knowledge_base["corpus"]
+ground_truth = [dict(item) for item in annotated_queries["train"]]
+print(f" Knowledge base: {len(corpus_data):,} docs")
+print(f" Annotated queries: {len(ground_truth)}")
+print(f" Test queries: {len(test_queries['test'])}")
+
+# ── Text Cleaning ─────────────────────────────────────────────────────────────
+print("\n[2/8] Cleaning corpus text...")
+doc_ids, doc_titles, doc_texts = [], [], []
+for item in corpus_data:
+ doc_ids.append(item["id"])
+ doc_titles.append(item["title"])
+ doc_texts.append(item["text"])
+
+def clean_text(text: str) -> str:
+ if isinstance(text, str) and (text.startswith("b'") or text.startswith('b"')):
+ try:
+ evaluated = ast.literal_eval(text)
+ if isinstance(evaluated, bytes):
+ text = evaluated.decode("utf-8", errors="replace")
+ except (ValueError, SyntaxError):
+ text = text[2:-1]
+ text = text.replace("\\n", "\n")
+ text = re.sub(r"\\x[0-9a-fA-F]{2}", " ", text)
+ text = re.sub(r"\n{3,}", "\n\n", text)
+ text = re.sub(r" {2,}", " ", text)
+ return text.strip()
+
+cleaned_texts = [clean_text(t) for t in doc_texts]
+cleaned_documents = [f"{title}\n\n{ct}" for title, ct in zip(doc_titles, cleaned_texts)]
+print(f" Cleaned {len(cleaned_documents):,} documents")
+
+# ── Snowflake Embedding Model ─────────────────────────────────────────────────
+print("\n[3/8] Loading snowflake-arctic-embed-l-v2.0 (CPU)...")
+dense_model = SentenceTransformer("Snowflake/snowflake-arctic-embed-l-v2.0", device="cpu")
+print(f" Dim: {dense_model.get_sentence_embedding_dimension()}, Device: {next(dense_model.parameters()).device}")
+
+def get_dense_embedding(text: str, is_query: bool = False) -> np.ndarray:
+ if is_query:
+ return dense_model.encode(text, prompt_name="query", normalize_embeddings=True)
+ return dense_model.encode(text, normalize_embeddings=True)
+
+# ── Load Saved Embeddings + Build FAISS Index ─────────────────────────────────
+print("\n[4/8] Loading saved embeddings and building FAISS index...")
+dense_embeddings = np.load("embeddings_snowflake.npy")
+print(f" Embeddings shape: {dense_embeddings.shape}")
+
+enhanced_index = faiss.IndexFlatIP(dense_embeddings.shape[1])
+enhanced_index.add(dense_embeddings.astype("float32"))
+print(f" FAISS index: {enhanced_index.ntotal:,} vectors")
+
+# ── BM25 Indices ──────────────────────────────────────────────────────────────
+print("\n[5/8] Building BM25 indices...")
+tokenized_docs = [doc.lower().split() for doc in cleaned_documents]
+bm25_index = BM25Okapi(tokenized_docs)
+tokenized_titles = [title.lower().split() for title in doc_titles]
+title_bm25_index = BM25Okapi(tokenized_titles)
+print(f" Full-text BM25: {len(tokenized_docs):,} docs")
+print(f" Title-only BM25: {len(tokenized_titles):,} docs")
+
+# ── Reranker (BERT-based, fast on CPU, no MPS memory issues) ─────────────────
+print("\n[6/8] Loading reranker on CPU...")
+reranker = CrossEncoder("cross-encoder/ms-marco-MiniLM-L-6-v2", device="cpu")
+_ = reranker.predict([("warmup query", "quick warmup doc")], show_progress_bar=False)
+print(" Warmup done.")
+print(" Reranker loaded.")
+
+RERANK_DOC_CHARS = 600 # truncate long docs before reranking
+
+# ── Query Expansion (rule-based; no external API needed) ─────────────────────
+# Generates lightweight semantic variations using simple transformations
+def expand_query(query: str) -> list:
+ variants = [query]
+ q = query.strip()
+
+ # Variation 1: rephrase imperatives as questions and vice versa
+ lower = q.lower()
+ if lower.startswith("how to "):
+ variants.append("steps to " + q[7:])
+ elif lower.startswith("how do i "):
+ variants.append("guide for " + q[9:])
+ elif lower.startswith("what is "):
+ variants.append(q[8:] + " definition and overview")
+ elif lower.startswith("what are "):
+ variants.append(q[9:] + " list and examples")
+ else:
+ variants.append("how to " + q)
+
+ # Variation 2: append common DevRev context terms based on keywords
+ kw_map = {
+ "api": "REST API integration endpoint",
+ "webhook": "webhook event notification callback",
+ "snap-in": "snap-in plugin DevRev app",
+ "auth": "authentication token OAuth",
+ "deploy": "deployment configuration setup",
+ "error": "error troubleshooting fix",
+ "account": "account settings management",
+ "data": "data export import sync",
+ }
+ extra = next((v for k, v in kw_map.items() if k in lower), "")
+ if extra:
+ variants.append(f"{q} {extra}")
+
+ return list(dict.fromkeys(variants))[:3] # deduplicate, keep ≤3
+
+# ── Multi-Query Triple-Path Pipeline ─────────────────────────────────────────
+def multi_query_triple_path_rerank(
+ query: str,
+ top_k: int = 10,
+ dense_candidates: int = 100,
+ bm25_candidates: int = 100,
+ title_bm25_candidates: int = 50,
+ rerank_pool: int = 60,
+ rrf_k: int = 60,
+ title_rrf_weight: float = 2.0,
+):
+ query_variants = expand_query(query)
+ rrf_scores = defaultdict(float)
+
+ for q in query_variants:
+ tokens = q.lower().split()
+
+ # Path A — Dense
+ q_emb = get_dense_embedding(q, is_query=True).astype("float32").reshape(1, -1)
+ _, dense_indices = enhanced_index.search(q_emb, dense_candidates)
+ for rank, idx in enumerate(dense_indices[0]):
+ rrf_scores[int(idx)] += 1.0 / (rrf_k + rank + 1)
+
+ # Path B — Full-text BM25
+ bm25_sc = bm25_index.get_scores(tokens)
+ for rank, idx in enumerate(np.argsort(bm25_sc)[::-1][:bm25_candidates]):
+ rrf_scores[int(idx)] += 1.0 / (rrf_k + rank + 1)
+
+ # Path C — Title-only BM25 (2× weight)
+ title_sc = title_bm25_index.get_scores(tokens)
+ for rank, idx in enumerate(np.argsort(title_sc)[::-1][:title_bm25_candidates]):
+ rrf_scores[int(idx)] += title_rrf_weight / (rrf_k + rank + 1)
+
+ fused = sorted(rrf_scores.items(), key=lambda x: x[1], reverse=True)[:rerank_pool]
+ candidate_indices = [idx for idx, _ in fused]
+
+ pairs = [(query, cleaned_documents[idx][:RERANK_DOC_CHARS]) for idx in candidate_indices]
+ rerank_sc = reranker.predict(pairs, batch_size=32, show_progress_bar=False)
+ scored = sorted(zip(candidate_indices, rerank_sc), key=lambda x: x[1], reverse=True)
+
+ results = []
+ for idx, _ in scored[:top_k]:
+ doc = corpus_data[idx]
+ results.append({"id": doc["id"], "text": doc["text"], "title": doc["title"]})
+ return results
+
+# ── Evaluation Helper ─────────────────────────────────────────────────────────
+def evaluate_retrieval(predictions, ground_truth, k_values=[1, 3, 5, 10]):
+ gt_map = {g["query_id"]: set(r["id"] for r in g["retrievals"]) for g in ground_truth}
+ metrics = {}
+ for k in k_values:
+ recalls, precisions = [], []
+ for pred in predictions:
+ golden_ids = gt_map.get(pred["query_id"], set())
+ if not golden_ids:
+ continue
+ predicted_ids = [r["id"] for r in pred["retrievals"][:k]]
+ hits = sum(1 for pid in predicted_ids if pid in golden_ids)
+ recalls.append(hits / len(golden_ids))
+ precisions.append(hits / k)
+ metrics[f"Recall@{k}"] = 100 * sum(recalls) / len(recalls) if recalls else 0
+ metrics[f"Precision@{k}"] = 100 * sum(precisions) / len(precisions) if precisions else 0
+ mrrs = []
+ for pred in predictions:
+ golden_ids = gt_map.get(pred["query_id"], set())
+ if not golden_ids:
+ continue
+ for rank, r in enumerate(pred["retrievals"], 1):
+ if r["id"] in golden_ids:
+ mrrs.append(1.0 / rank)
+ break
+ else:
+ mrrs.append(0.0)
+ metrics["MRR"] = 100 * sum(mrrs) / len(mrrs) if mrrs else 0
+ return metrics
+
+# ── Sanity Test ───────────────────────────────────────────────────────────────
+print("\n[7/8] Sanity test (1 query)...")
+t0 = time.time()
+test_r = multi_query_triple_path_rerank("How do I set up AirSync?", top_k=3)
+print(f" Done in {time.time()-t0:.1f}s")
+for i, r in enumerate(test_r, 1):
+ print(f" [{i}] {r['title']}")
+
+# ── Run on All 92 Test Queries ────────────────────────────────────────────────
+print("\n[8/8] Running pipeline on all 92 test queries...")
+s10_test_results = []
+for item in tqdm(test_queries["test"], desc="Test queries"):
+ retrievals = multi_query_triple_path_rerank(item["query"], top_k=10)
+ s10_test_results.append({
+ "query_id": item["query_id"],
+ "query": item["query"],
+ "retrievals": retrievals,
+ })
+
+OUTPUT_FILE = "test_queries_results_s10_multiquery.json"
+with open(OUTPUT_FILE, "w") as f:
+ json.dump(s10_test_results, f, indent=2)
+
+import pandas as pd
+pd.DataFrame(s10_test_results).to_parquet(
+ "test_queries_results_s10_multiquery.parquet", index=False
+)
+
+print(f"\n{'='*55}")
+print(f"Submission saved: {OUTPUT_FILE}")
+print(f" Queries: {len(s10_test_results)}")
+print(f" Per query: 10 retrievals")
+print(f" Pipeline: Multi-query(x3) + Triple-path RRF + zerank")
+print(f"{'='*55}")
+
+print("\nDone! Submit: test_queries_results_s10_multiquery.json")
+
+# ── Optional: Eval on Annotated Queries (set RUN_EVAL=1 to enable) ────────────
+if os.environ.get("RUN_EVAL") == "1":
+ print("\n[OPTIONAL] Evaluating on annotated queries (~90 min)...")
+ eval_results = []
+ for item in tqdm(annotated_queries["train"], desc="Eval"):
+ retrievals = multi_query_triple_path_rerank(item["query"], top_k=10)
+ eval_results.append({"query_id": item["query_id"], "query": item["query"], "retrievals": retrievals})
+
+ metrics = evaluate_retrieval(eval_results, ground_truth)
+
+ LEADERBOARD_REF = {
+ "Rank 1 (gemini+zerank, closed)": {"Precision@10": 26.85, "Recall@10": 36.50},
+ "Rank 2 OS (Qwen3-8B+zerank)": {"Precision@10": 26.63, "Recall@10": 36.09},
+ "Rank 3 OS (snowflake+zerank)": {"Precision@10": 26.63, "Recall@10": 36.09},
+ }
+
+ print(f"\n{'='*65}")
+ print(f" {'METRIC':<16} {'OURS':>10} {'Rank 1 target':>14} {'Gap':>8}")
+ print(f"{'='*65}")
+ for k in ["Precision@10", "Recall@10", "MRR", "Precision@5", "Recall@5"]:
+ v = metrics.get(k, 0)
+ r1 = LEADERBOARD_REF["Rank 1 (gemini+zerank, closed)"].get(k)
+ gap = f"{v - r1:+.2f}" if r1 else "—"
+ r1s = f"{r1:.2f}%" if r1 else "—"
+ print(f" {k:<16} {v:>9.2f}% {r1s:>14} {gap:>8}")
+ print(f"{'='*65}")
+else:
+ print("\nSkipping annotated-query eval (run with RUN_EVAL=1 to enable).")
diff --git a/test_queries_results.json b/test_queries_results.json
index 74c199a..7653747 100644
--- a/test_queries_results.json
+++ b/test_queries_results.json
@@ -4,13 +4,13 @@
"query": "end customer organization name not appearing in ticket or conversation",
"retrievals": [
{
- "id": "ART-1981_KNOWLEDGE_NODE-30",
- "text": "conversation of which you are not the owner, let the owner know to respond. It's beneficial to retain the same point of contact for the duration of the conversation unless the owner refers some another user.\\n* If the conversation has a customer org that's unidentified or is new, add yourself (the customer experience engineer) as the owner of the ticket. Try to find the appropriate owner for the customer org and update the customer record accordingly.\\n* Change the stage of the conversation to",
- "title": "Support best practices | Computer for Support Teams | DevRev"
+ "id": "ART-2002_KNOWLEDGE_NODE-25",
+ "text": "about the customer initiating the conversation. Similarly, tickets on DevRev can capture who the ticket was reported by (or reported for).\\n\\nConcepts\\n--------\\n\\nCustomer identity in DevRev includes the following important constructs:\\n\\n* **External User/contact**: Your end user or customer or users associated with organization Accounts or Workspaces.\\n* **Account/workspace**: Any logical grouping that an external user is part of. It could represent a customer account for your B2B product",
+ "title": "Contacts | Computer for Growth Teams | DevRev"
},
{
- "id": "ART-1981_KNOWLEDGE_NODE-34",
- "text": "ticket.\\n* Make sure all tickets have the customer org field populated.\\n* Cancel any internal ticket without a customer org that has been created by a developer. Ask them to create an issue instead.\\n* If a customer raises a feature request that aligns with the product strategy, but needs significant development effort and will not be delivered in the near future, move it to the *accepted* stage, rather than keeping the ticket open. Inform the customer accordingly.\\n* If a customer reports a",
+ "id": "ART-1981_KNOWLEDGE_NODE-30",
+ "text": "conversation of which you are not the owner, let the owner know to respond. It's beneficial to retain the same point of contact for the duration of the conversation unless the owner refers some another user.\\n* If the conversation has a customer org that's unidentified or is new, add yourself (the customer experience engineer) as the owner of the ticket. Try to find the appropriate owner for the customer org and update the customer record accordingly.\\n* Change the stage of the conversation to",
"title": "Support best practices | Computer for Support Teams | DevRev"
},
{
@@ -19,39 +19,39 @@
"title": "Customer email notifications | Computer by DevRev | DevRev"
},
{
- "id": "ART-1953_KNOWLEDGE_NODE-29",
- "text": "[support@yourdomain.com](mailto:support@yourdomain.com)\\n* **Subject**: \"You are missing messages from \"\\n\\nReply to the customer on a ticket\\n---------------------------------\\n\\n* **Trigger**: When a reply is made to a customer on a ticket.\\n* **Action**: The system sends out a notification to the customer with the reply message.\\n* **Sender**: {Company\\\\_Name} [support@yourdomain.com](mailto:support@yourdomain.com)\\n* **Subject**: \"[{Company\\\\_Name}] Update on TKT-XXX\"\\n\\nTicket",
- "title": "Customer email notifications | Computer by DevRev | DevRev"
+ "id": "ART-1974_KNOWLEDGE_NODE-33",
+ "text": "have been addressed.\\n\\n A conversation set to *resolved* still shows in the end-user's widget. If they respond again, it reopens the conversation and set the status to *needs response*.\\n* *Archived*\\n\\n The final stage for conversation.\\n\\n[PreviousTicket-Team Performance](/docs/dashboards/ticket-team-performance)[NextConversation to ticket conversion](/docs/product/conversation-ticket)\\n\\n#### On this page\\n\\n* [Stages](#stages)\\n\\n[Enterprise grade security to protect customer",
+ "title": "Conversations | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1953_KNOWLEDGE_NODE-5",
- "text": "ticket conversion](/docs/product/conversation-ticket)\\n + [Tickets](/docs/product/tickets)\\n + [Routing](/docs/product/routing)\\n + [Support best practices](/docs/product/support-bp)\\n + [Customer portal](/docs/product/support-portal)\\n + [Questions & answers](/docs/product/qa)\\n + [Knowledge Base](/docs/product/knowledge-base)\\n\\n - [Articles](/docs/product/articles)\\n - [Collections](/docs/product/collection)\\n + [Turing AI agent](/docs/product/conversational-bot)\\n\\n - [Best",
- "title": "Customer email notifications | Computer by DevRev | DevRev"
+ "id": "ART-1978_KNOWLEDGE_NODE-44",
+ "text": "URL and not on the support portal of some other customer.\\n* Customer admin isn't able to see all the tickets of the organization.\\n\\n + This could happen if the customer isn't logged in on the correct URL. If the customer is logged in on the correct URL, then check if there are any tickets that are reported by the other customers in that organization or not. Check if the customer is added as a customer admin or not by logging in to your DevRev application.\\n* You are not able to add customer",
+ "title": "Customer portal | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1979_KNOWLEDGE_NODE-63",
- "text": "support tickets on behalf of customers\\xe2\\x80\\x94without granting customers access to these tickets. This feature enables internal collaboration while keeping the ticket invisible to the customer until explicitly made external.\\n\\nEven if a ticket contains customer-related information (such as the customer workspace or the **Reported by** field), it remains inaccessible to the customer unless it is explicitly converted into an external ticket. The **Customer Messages** tab is unavailable for",
- "title": "Tickets | Computer for Support Teams | DevRev"
+ "id": "ART-4271_KNOWLEDGE_NODE-29",
+ "text": "end user.\\n\\n## Why you should convert a Conversation to a Ticket\\n\\nConsider converting a conversation to a ticket in these scenarios:\\n\\n * **Complex issues** : When a customer inquiry requires in-depth investigation that can't be resolved in a quick conversation.\\n * **Cross-team collaboration** : Issues requiring input from multiple departments or specialists.\\n * **Escalation needs** : When a conversation needs to be escalated to a higher support tier.\\n * **Feature requests** :",
+ "title": "Convert Conversations to Tickets | Conversations | Support | DevRev"
},
{
- "id": "ART-1978_KNOWLEDGE_NODE-44",
- "text": "URL and not on the support portal of some other customer.\\n* Customer admin isn't able to see all the tickets of the organization.\\n\\n + This could happen if the customer isn't logged in on the correct URL. If the customer is logged in on the correct URL, then check if there are any tickets that are reported by the other customers in that organization or not. Check if the customer is added as a customer admin or not by logging in to your DevRev application.\\n* You are not able to add customer",
- "title": "Customer portal | Computer for Support Teams | DevRev"
+ "id": "ART-6174_KNOWLEDGE_NODE-30",
+ "text": "there.\\n\\n![]()\\n\\nSlack end-user experience\\n-------------------------\\n\\nWhen a conversation is converted to a ticket in Slack:\\n\\n* Ticket information appears within the same thread.\\n* All subsequent messages sync with the newly created ticket.\\n* The transition is seamless for the end user.\\n\\nConversation conversion scenarios\\n---------------------------------\\n\\nConsider converting a conversation to a ticket in these scenarios:\\n\\n* Complex issues requiring in-depth investigation\\n*",
+ "title": "Conversation to ticket conversion | Conversations | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1953_KNOWLEDGE_NODE-36",
- "text": "conversation](#ticket-linked-to-a-conversation)\\n* [Change of stage of a ticket/conversation](#change-of-stage-of-a-ticketconversation)\\n* [CSAT survey for conversation/ticket](#csat-survey-for-conversationticket)\\n* [Auto customer reply](#auto-customer-reply)\\n* [Auto reply on email](#auto-reply-on-email)\\n\\n[Enterprise grade security to protect customer data\\n\\nLearn more about it.\\n\\n![]()](/blog/soc-compliance)\\n\\nComputer\\n\\n* [Meet Computer](/meet-computer)\\n* [How Computer",
- "title": "Customer email notifications | Computer by DevRev | DevRev"
+ "id": "ART-16806_KNOWLEDGE_NODE-27",
+ "text": "Internal Ticket** from the **Ticket Creation** dropdown.\\n* **Focused UI:** The **Customer Messages** tab is disabled on internal tickets to prevent unintended communication.\\n\\nThis feature supports internal workflows while giving you control over when customer engagement begins.\\n\\n![]()\\xc2\\xa0For more information about *Conversation and Ticket Workflows*, refer to the following articles: \\xe2\\x80\\xa3 [Auto parts to conversation | Automate | Snap-ins](/docs/automations/auto-parts)",
+ "title": "July 2025 | Changelog | DevRev"
},
{
- "id": "ART-1953_KNOWLEDGE_NODE-24",
- "text": "conversation](#reply-to-the-customer-on-a-conversation)\\n* [Reply to the customer on a ticket](#reply-to-the-customer-on-a-ticket)\\n* [Ticket linked to a conversation](#ticket-linked-to-a-conversation)\\n* [Change of stage of a ticket/conversation](#change-of-stage-of-a-ticketconversation)\\n* [CSAT survey for conversation/ticket](#csat-survey-for-conversationticket)\\n* [Auto customer reply](#auto-customer-reply)\\n* [Auto reply on email](#auto-reply-on-email)\\n\\n1. [Documentation](/docs)\\n3.",
- "title": "Customer email notifications | Computer by DevRev | DevRev"
+ "id": "ART-1947_KNOWLEDGE_NODE-35",
+ "text": "relate.\\n\\n```\\nBuild\\n\\n\\n\\nSupport\\n\\n\\n\\nWork required\\n\\n\\n\\nResolved\\n\\n\\n\\nResolved\\n\\n\\n\\nWork required\\n\\n\\n\\nResolved\\n\\n\\n\\nWon\\'t fix\\n\\n\\n\\nDuplicate\\n\\n\\n\\nCustomer\\n\\n\\n\\nConversation\\n\\n\\n\\nTicket\\n\\n\\n\\nClose\\n\\n\\n\\nClose\\n\\n\\n\\nIssue\\n\\n\\n\\nIn development\\n\\n\\n\\nClose\\n```\\n\\nWork item linkage\\n-----------------\\n\\nOnce your organization has implemented a mechanism for customers to start conversations, all customer conversations can be tracked within DevRev and any",
+ "title": "Apps | Computer by DevRev | DevRev"
},
{
- "id": "ART-1953_KNOWLEDGE_NODE-31",
- "text": "stage of a ticket/conversation\\n----------------------------------------\\n\\n* **Trigger**: When there\\'s a change of stage in a ticket or conversation.\\n* **Action**: The system sends out a notification detailing the Ticket/Conversation number and stage change.\\n* **Sender**: {Company\\\\_Name} [support@yourdomain.com](mailto:support@yourdomain.com)\\n* **Subject**:\\n + For ticket: \"[{Company\\\\_Name}] Update on TKT-XXX - Ticket Title\"\"\"\\n + For conversations:",
- "title": "Customer email notifications | Computer by DevRev | DevRev"
+ "id": "ART-1986_KNOWLEDGE_NODE-38",
+ "text": "ticket is moved to the Closed state | The ticket was moved to Awaiting Customer Response state | The ticket moves to any state except Closed |\\n\\n**Conversations**\\n\\n| Metric | Default conditions | Start event | End event | Pause event | Resume event |\\n| --- | --- | --- | --- | --- | --- |\\n| First response time | The first message sent by a customer | Conversation created | * The agent replied to the conversation * The conversation is moved to Waiting on User/Resolved * The conversation is",
+ "title": "Service-level agreement | Computer for Support Teams | DevRev"
}
]
},
@@ -60,54 +60,54 @@
"query": "Android SDK session generated with Unknown user",
"retrievals": [
{
- "id": "ART-2898_KNOWLEDGE_NODE-10",
- "text": "identification\\n\\nThe anonymous identification method allows you to create an anonymous user with an optional or random user identifier, ensuring that no other data is stored or associated with the user.\\n\\n###### Kotlin\\n\\n###### Java\\n\\n[code]\\n\\n 1| DevRev.identifyAnonymousUser( \\n ---|--- \\n 2| userId: String \\n 3| )\\n[/code] \\n \\n### Unverified identification\\n\\nThe unverified identification method identifies users with a unique identifier, but it does not verify their",
- "title": "Android integration \u2014 DevRev | Docs"
+ "id": "ART-4255_KNOWLEDGE_NODE-18",
+ "text": "method.\\n\\n#####\\n\\nThis feature only stores a monitoring permission flag and does not provide any user interface or dialog.\\n\\n### Session recording\\n\\nYou can enable session recording to capture user interactions with your app.\\n\\n#####\\n\\nThe session recording feature is opt-out and is enabled by default.\\n\\nHere are the available methods to help you control the session recording feature:\\n\\nAction| Kotlin (`DevRev`)| Java (`DevRevObservabilityExtKt`) \\n---|---|--- \\nStarts the session",
+ "title": "DevRev SDK for Android \u2014 DevRev | Docs"
},
{
- "id": "ART-15513_KNOWLEDGE_NODE-1",
- "text": "[Exchange your AAT for a session token](/sdks/android/features#exchange-your-aat-for-a-session-token)\\n* [Identify the verified user](/sdks/android/features#identify-the-verified-user)\\n* [Updating the user](/sdks/android/features#updating-the-user)\\n* [Logout](/sdks/android/features#logout)\\n* [Identity model](/sdks/android/features#identity-model)\\n* [Properties](/sdks/android/features#properties)\\n* [User traits](/sdks/android/features#user-traits)\\n* [Organization",
- "title": "Features | DevRev | Docs"
+ "id": "ART-2898_KNOWLEDGE_NODE-17",
+ "text": "DevRev SDK offers session analytics features to help you understand how users interact with your app.\\n\\n### Opt in or out\\n\\nEnd users can opt in or out of the session analytics feature, enabling them to control whether their interactions are tracked for analytics.\\n\\n###### Kotlin\\n\\n###### Java\\n\\n[code]\\n\\n 1| DevRev.stopAllMonitoring() \\n ---|---\\n[/code] \\n \\nThis method terminates and deletes the current session recording and also disables future session recording by our SDK for",
+ "title": "Android integration \u2014 DevRev | Docs"
},
{
- "id": "ART-2898_KNOWLEDGE_NODE-1",
- "text": "identification](/public/sdks/mobile/android#unverified-identification)\\n * [Update user information](/public/sdks/mobile/android#update-user-information)\\n * [PLuG support chat](/public/sdks/mobile/android#plug-support-chat)\\n * [Analytics](/public/sdks/mobile/android#analytics)\\n * [Session analytics](/public/sdks/mobile/android#session-analytics)\\n * [Opt in or out](/public/sdks/mobile/android#opt-in-or-out)\\n * [Session recording](/public/sdks/mobile/android#session-recording)\\n *",
- "title": "Android integration \u2014 DevRev | Docs"
+ "id": "ART-4255_KNOWLEDGE_NODE-17",
+ "text": "analytics.\\n\\n###### Kotlin\\n\\n###### Java\\n\\n[code]\\n\\n 1| DevRev.stopAllMonitoring() \\n ---|---\\n[/code] \\n \\nThis method terminates and deletes the current session recording and also disables future session recording by our SDK for this user.\\n\\n###### Kotlin\\n\\n###### Java\\n\\n[code]\\n\\n 1| DevRev.resumeAllMonitoring() \\n ---|---\\n[/code] \\n \\nIf session recording was disabled for the user using the `stopAllMonitoring()` method, you can enable recording at runtime with this",
+ "title": "DevRev SDK for Android \u2014 DevRev | Docs"
},
{
- "id": "ART-15506_KNOWLEDGE_NODE-29",
- "text": "window.plugSDK.shutdown(); |\\n| 6 | } |\\n| 7 | window.plugSDK.init({ |\\n| 8 | app_id: appId, |\\n| 9 | |\\n| 10 | // Pass the session details |\\n| 11 | session_recording_options: { |\\n| 12 | sessionDetails: { |\\n| 13 | sessionId: sessionId, |\\n| 14 | tabId: tabId, |\\n| 15 | }, |\\n| 16 | }, |\\n| 17 | |\\n| 18 | // With session token |\\n| 19 | session_token: sessionToken, |\\n| 20 | // Or without session token |\\n| 21 | identity: {}, |\\n| 22 | }); |\\n```\\n\\nWas this page",
- "title": "Identify your users with Plug | DevRev | Docs"
+ "id": "ART-4255_KNOWLEDGE_NODE-1",
+ "text": "information](/public/sdks/android#update-user-information)\\n * [PLuG support chat](/public/sdks/android#plug-support-chat)\\n * [Analytics](/public/sdks/android#analytics)\\n * [Session analytics](/public/sdks/android#session-analytics)\\n * [Opt in or out](/public/sdks/android#opt-in-or-out)\\n * [Session recording](/public/sdks/android#session-recording)\\n * [Session properties](/public/sdks/android#session-properties)\\n * [Timers](/public/sdks/android#timers)\\n * [Screen",
+ "title": "DevRev SDK for Android \u2014 DevRev | Docs"
},
{
- "id": "ART-4255_KNOWLEDGE_NODE-10",
- "text": "DevRev.identifyAnonymousUser( \\n ---|--- \\n 2| userId: String \\n 3| )\\n[/code] \\n \\n### Unverified identification\\n\\nThe unverified identification method identifies users with a unique identifier, but it does not verify their identity with the DevRev backend.\\n\\n###### Kotlin\\n\\n###### Java\\n\\n[code]\\n\\n 1| DevRev.identifyUnverifiedUser( \\n ---|--- \\n 2| identity: Identity \\n 3| )\\n[/code] \\n \\nThe function accepts the `Identity` object, where the user",
+ "id": "ART-4255_KNOWLEDGE_NODE-20",
+ "text": "session. The properties are defined as a hashmap of string values.\\n\\n###### Kotlin\\n\\n###### Java\\n\\n[code]\\n\\n 1| DevRev.addSessionProperties(properties: HashMap) \\n ---|---\\n[/code] \\n \\nTo clear the session properties in scenarios such as user logout or when the session ends, use the following method:\\n\\n###### Kotlin\\n\\n###### Java\\n\\n[code]\\n\\n 1| DevRev.clearSessionProperties() \\n ---|---\\n[/code] \\n \\n### Timers\\n\\nThe DevRev SDK offers a timer mechanism",
"title": "DevRev SDK for Android \u2014 DevRev | Docs"
},
{
- "id": "ART-15506_KNOWLEDGE_NODE-4",
- "text": "RevUser Session Token(5) Return Session Token(6) Call plugSDK.init() with token\\n\\nGenerate an application access token\\n------------------------------------\\n\\n1. In DevRev, go to **Settings > Support > Plug Tokens** through the settings icon on the top-left corner.\\n2. Under the **Application access tokens** panel, click **New token** and copy the token that\\xe2\\x80\\x99s displayed.\\n\\n##### \\n\\nEnsure you copy your access token, as you cannot view it again.\\n\\nGenerate a session",
- "title": "Identify your users with Plug | DevRev | Docs"
+ "id": "ART-2895_KNOWLEDGE_NODE-2",
+ "text": "view their past conversations. Identifying your users also enables more personalized engagement.\\n\\nIn this flow, you have to generate a session token for every user who visits your website. The session token identifies the customer when they interact with the widget. The session token is generated using the application access token and customer information. It should be generated on your website\\xe2\\x80\\x99s back end since the app token needs to be kept hidden.\\n\\nTo identify logged-in users,",
+ "title": "Identify your users with PLuG \u2014 DevRev | Docs"
},
{
- "id": "ART-4255_KNOWLEDGE_NODE-1",
- "text": "information](/public/sdks/android#update-user-information)\\n * [PLuG support chat](/public/sdks/android#plug-support-chat)\\n * [Analytics](/public/sdks/android#analytics)\\n * [Session analytics](/public/sdks/android#session-analytics)\\n * [Opt in or out](/public/sdks/android#opt-in-or-out)\\n * [Session recording](/public/sdks/android#session-recording)\\n * [Session properties](/public/sdks/android#session-properties)\\n * [Timers](/public/sdks/android#timers)\\n * [Screen",
+ "id": "ART-4255_KNOWLEDGE_NODE-16",
+ "text": "---|---\\n[/code] \\n \\nFor example:\\n\\n###### Kotlin\\n\\n###### Java\\n\\n[code]\\n\\n 1| DevRev.trackEvent(name = \"open-message-screen\", properties = {\"id\": \"message-1337\"}) \\n ---|---\\n[/code] \\n \\n## Session analytics\\n\\nThe DevRev SDK offers session analytics features to help you understand how users interact with your app.\\n\\n### Opt in or out\\n\\nEnd users can opt in or out of the session analytics feature, enabling them to control whether their interactions are tracked for",
"title": "DevRev SDK for Android \u2014 DevRev | Docs"
},
{
- "id": "ART-4255_KNOWLEDGE_NODE-33",
- "text": "\\n**Solution** : Confirm that user identification is performed before using the `showSupport()` function or XML button.\\n\\n * **Issue** : Incorrect operation due to `App ID` and `secret` misconfiguration. \\n**Solution** : Ensure correct functionality by double-checking that both `App ID` and `secret` values are accurately configured in your application or sample app.\\n\\nWas this page helpful?YesNo\\n\\n[DevRev SDK for iOSUp Next](/public/sdks/ios)\\n\\n[Built",
+ "id": "ART-4255_KNOWLEDGE_NODE-9",
+ "text": "organization, and account traits. These fields must be configured through the DevRev app before they can be utilized. For more information, refer to [Object customization](https://devrev.ai/docs/product/object-customization).\\n\\n### Anonymous identification\\n\\nThe anonymous identification method allows you to create an anonymous user with an optional or random user identifier, ensuring that no other data is stored or associated with the user.\\n\\n###### Kotlin\\n\\n###### Java\\n\\n[code]\\n\\n 1|",
"title": "DevRev SDK for Android \u2014 DevRev | Docs"
},
{
- "id": "ART-4255_KNOWLEDGE_NODE-8",
- "text": "Identification\\n\\nTo use certain features of the DevRev SDK, user identification is required. You can select from the following methods to identify users within your application:\\n\\n#####\\n\\nThe identification function should be placed appropriately in your app after the user logs in. If you have the user information available at app launch, call the function after the `DevRev.configure(context, appID)` method.\\n\\n#####\\n\\nThe `Identity` structure allows for custom fields in the user,",
- "title": "DevRev SDK for Android \u2014 DevRev | Docs"
+ "id": "ART-15509_KNOWLEDGE_NODE-5",
+ "text": "(True or False) |\\n| `session_recording_key` | Identifies your session recording account and is required to enable the SDK session recording features. | String |\\n| `enable_session_recording` | Instructs the widget to determine whether to start the session recording. | Boolean (True or False) |\\n| `session_token` | Identifies the user interacting with your app. | String |\\n| `primary_text_color` | The color of the launcher, button text for new tickets and conversations, conversation user text,",
+ "title": "Methods | DevRev | Docs"
},
{
- "id": "ART-2898_KNOWLEDGE_NODE-9",
- "text": "in your app after the user logs in. If you have the user information available at app launch, call the function after the `DevRev.configure(context, appID)` method.\\n\\n#####\\n\\nThe `Identity` structure allows for custom fields in the user, organization, and account traits. These fields must be configured through the DevRev app before they can be utilized. For more information, refer to [Object customization](https://devrev.ai/docs/product/object-customization).\\n\\n### Anonymous",
- "title": "Android integration \u2014 DevRev | Docs"
+ "id": "ART-12460_KNOWLEDGE_NODE-14",
+ "text": "map. You can track these events using the following function:\\n\\n#####\\n\\nThis functionality requires the SDK to be configured and the user to be identified, whether they are unverified or anonymous.\\n\\n[code]\\n\\n 1| DevRev.trackEvent(name, properties, successCallback, errorCallback) \\n ---|---\\n[/code] \\n \\n## Session analytics\\n\\nThe DevRev SDK offers session analytics features to help you understand how users interact with your app.\\n\\n### Opting-in or out\\n\\nSession analytics",
+ "title": "Features \u2014 DevRev | Docs"
}
]
},
@@ -121,49 +121,49 @@
"title": "Customer email notifications | Computer by DevRev | DevRev"
},
{
- "id": "ART-1979_KNOWLEDGE_NODE-36",
- "text": "contact](https://docs.devrev.ai/product/plug) must be created first for any emails to be added as subscribers.\\n* **Needs response**: Set to true whenever a new customer message is received on the ticket to ensure that no customer messages are missed. If a particular customer message does not need a response, the **Needs response** toggle can be turned off by the user. Turning off the **Needs response** toggle does not affect the SLA metrics.\\n\\nThese attributes can be effectively used in",
- "title": "Tickets | Computer for Support Teams | DevRev"
+ "id": "ART-1953_KNOWLEDGE_NODE-24",
+ "text": "conversation](#reply-to-the-customer-on-a-conversation)\\n* [Reply to the customer on a ticket](#reply-to-the-customer-on-a-ticket)\\n* [Ticket linked to a conversation](#ticket-linked-to-a-conversation)\\n* [Change of stage of a ticket/conversation](#change-of-stage-of-a-ticketconversation)\\n* [CSAT survey for conversation/ticket](#csat-survey-for-conversationticket)\\n* [Auto customer reply](#auto-customer-reply)\\n* [Auto reply on email](#auto-reply-on-email)\\n\\n1. [Documentation](/docs)\\n3.",
+ "title": "Customer email notifications | Computer by DevRev | DevRev"
},
{
- "id": "ART-1986_KNOWLEDGE_NODE-37",
- "text": "a customer * The ticket was created by a customer experience engineer but reported by a customer | A new comment on the ticket by the customer after the customer experience engineer replied | * The agent added a comment to the customer chat * The ticket is moved to Awaiting Customer Response, or the ticket is closed | | |\\n| Full resolution time | * Ticket created by a customer * The ticket was created by a customer experience engineer but reported by a customer | Ticket created | The",
- "title": "Service-level agreement | Computer for Support Teams | DevRev"
+ "id": "ART-2027_KNOWLEDGE_NODE-36",
+ "text": "Receives Replies From | Thread is visible in portal |\\n| --- | --- | --- | --- |\\n| Email to support | [support@yourcompany.com](mailto:support@yourcompany.com) | [support@yourcompany.com](mailto:support@yourcompany.com) | Yes |\\n| Ticket via Customer Portal or Plug widget (Channel on ticket = Plug or Portal) | Ticket form on Customer Portal or conversation converted to ticket from Plug widget | - If Channel is set as email in the config, replies are sent via the configured email address. -",
+ "title": "Email | Integrate | Snap-ins | DevRev"
},
{
- "id": "ART-1979_KNOWLEDGE_NODE-61",
- "text": "following scenarios can lead to the creation of follow up ticket:\\n\\n* Customers communicated on an archived/immutable ticket from any channel such as email.\\n* Customer communicated on a merged ticket and the primary ticket is also archived.\\n\\nAfter creation of a follow up ticket the customer messages will reflect only on the new followup ticket and the customer will continue to see response on the same thread in channels like email & slack. The user can continue responding on the new follow",
+ "id": "ART-1979_KNOWLEDGE_NODE-36",
+ "text": "contact](https://docs.devrev.ai/product/plug) must be created first for any emails to be added as subscribers.\\n* **Needs response**: Set to true whenever a new customer message is received on the ticket to ensure that no customer messages are missed. If a particular customer message does not need a response, the **Needs response** toggle can be turned off by the user. Turning off the **Needs response** toggle does not affect the SLA metrics.\\n\\nThese attributes can be effectively used in",
"title": "Tickets | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1953_KNOWLEDGE_NODE-5",
- "text": "ticket conversion](/docs/product/conversation-ticket)\\n + [Tickets](/docs/product/tickets)\\n + [Routing](/docs/product/routing)\\n + [Support best practices](/docs/product/support-bp)\\n + [Customer portal](/docs/product/support-portal)\\n + [Questions & answers](/docs/product/qa)\\n + [Knowledge Base](/docs/product/knowledge-base)\\n\\n - [Articles](/docs/product/articles)\\n - [Collections](/docs/product/collection)\\n + [Turing AI agent](/docs/product/conversational-bot)\\n\\n - [Best",
- "title": "Customer email notifications | Computer by DevRev | DevRev"
+ "id": "ART-2027_KNOWLEDGE_NODE-32",
+ "text": "**Subscribers** field.\\n\\n *Is able to:* View the ticket on DevRev and receive in-app notifications.\\n* Without DevRev account\\n\\n *Added to:* **Email members** field as subscriber.\\n\\n *Is able to:* Reply to the ticket via email.\\n\\nEmail deliverability status\\n\\nThe sender of an email is able to view the status of an email. Additionally, the sender can view if their email has bounced, along with details about the bounce event.\\n\\nBelow are the various possible states of an email.\\n\\n* *In",
+ "title": "Email | Integrate | Snap-ins | DevRev"
},
{
- "id": "ART-2027_KNOWLEDGE_NODE-36",
- "text": "Receives Replies From | Thread is visible in portal |\\n| --- | --- | --- | --- |\\n| Email to support | [support@yourcompany.com](mailto:support@yourcompany.com) | [support@yourcompany.com](mailto:support@yourcompany.com) | Yes |\\n| Ticket via Customer Portal or Plug widget (Channel on ticket = Plug or Portal) | Ticket form on Customer Portal or conversation converted to ticket from Plug widget | - If Channel is set as email in the config, replies are sent via the configured email address. -",
+ "id": "ART-2027_KNOWLEDGE_NODE-28",
+ "text": "email address that messages to it create either a conversation or a ticket, but not both simultaneously. Whether to create a conversation or a ticket depends on the nature of the emails received at a specific email address.\\n\\nRead more about [conversations](../product/conversation) and [tickets](../product/tickets) to decide which is more suitable for your use case.\\n\\nWhen needed, you can link a conversation to a ticket. This is particularly useful if you decide to use conversations for all",
"title": "Email | Integrate | Snap-ins | DevRev"
},
{
- "id": "ART-1953_KNOWLEDGE_NODE-24",
- "text": "conversation](#reply-to-the-customer-on-a-conversation)\\n* [Reply to the customer on a ticket](#reply-to-the-customer-on-a-ticket)\\n* [Ticket linked to a conversation](#ticket-linked-to-a-conversation)\\n* [Change of stage of a ticket/conversation](#change-of-stage-of-a-ticketconversation)\\n* [CSAT survey for conversation/ticket](#csat-survey-for-conversationticket)\\n* [Auto customer reply](#auto-customer-reply)\\n* [Auto reply on email](#auto-reply-on-email)\\n\\n1. [Documentation](/docs)\\n3.",
- "title": "Customer email notifications | Computer by DevRev | DevRev"
+ "id": "ART-2027_KNOWLEDGE_NODE-31",
+ "text": "to the ticket via email. They cannot view the ticket on the portal, as they are added to the **Email members** field but not to the **Reported by** field.\\n\\nEmployees\\n\\n* With DevRev account (added to email thread)\\n\\n *Added to:* **To**, **CC**, or **Email members** field.\\n\\n *Is able to:* View the ticket on DevRev, reply via email, and receive in-app notifications. If they make changes to ticket attributes, they remain subscribers.\\n* Manually added subscribers\\n\\n *Added to:*",
+ "title": "Email | Integrate | Snap-ins | DevRev"
},
{
- "id": "ART-1979_KNOWLEDGE_NODE-52",
- "text": "don\\xe2\\x80\\x99t forget to give \\xf0\\x9f\\x91\\x8d on the suggestion if you like it or \\xf0\\x9f\\x91\\x8e to dislike it.\\n\\n![]()\\n\\nDuplicate ticket merging\\n------------------------\\n\\nDuplicate tickets in a support system pose a significant challenge by creating inefficiencies, increasing the workload for support agents, and negatively impacting user experience. These tickets often result from user frustration or misunderstandings of the resolution process, leading to confusion and disrupting",
- "title": "Tickets | Computer for Support Teams | DevRev"
+ "id": "ART-2027_KNOWLEDGE_NODE-27",
+ "text": "track interactions (**Support > Inbox** for conversations and **Support > Tickets** for tickets). All replies are sent from your organization\\xe2\\x80\\x99s own email addresses, maintaining a professional and personalized customer experience that strengthens your brand and fosters better engagement. This method builds trust with mailbox providers and recipients across any email service, reducing spam flags and protecting your brand identity by adhering to DMARC standards.\\n\\nYou can choose for an",
+ "title": "Email | Integrate | Snap-ins | DevRev"
},
{
- "id": "ART-1953_KNOWLEDGE_NODE-35",
- "text": "installed [Auto-reply snap-in](https://docs.devrev.ai/automations/auto-reply).\\n\\n[PreviousUpdates](/docs/product/updates)[NextRoles](/docs/product/roles)\\n\\n#### On this page\\n\\n* [White-label customer email notifications](#whitelabel-customer-email-notifications)\\n* [Reply to the customer on a conversation](#reply-to-the-customer-on-a-conversation)\\n* [Reply to the customer on a ticket](#reply-to-the-customer-on-a-ticket)\\n* [Ticket linked to a",
- "title": "Customer email notifications | Computer by DevRev | DevRev"
+ "id": "ART-2027_KNOWLEDGE_NODE-30",
+ "text": "or @mentioned in the DevRev app.\\n\\n *Is able to:* View the ticket on the portal and reply via email as an email member.\\n* A customer admin for the same workspace\\n\\n *Added to:* **Customer Admins** group.\\n\\n *Is able to:* View the ticket on the portal once their workspace is updated on the ticket.\\n* An end user outside original sender's organization\\n\\n *Added to:* **To** or **CC** fields in the email thread, or mentioned in the DevRev app (adds them to **CC**).\\n\\n *Is able to:* Reply",
+ "title": "Email | Integrate | Snap-ins | DevRev"
},
{
- "id": "ART-1979_KNOWLEDGE_NODE-47",
- "text": "validate the fix with the user and then to *resolved*. If the user wants to cancel the ticket then the stage moves to *canceled*.\\n\\n**Closed**\\n\\n* *Canceled* (C)\\n\\n The ticket is determined to be invalid either by the user or the customer experience engineer. In certain scenarios, a ticket may have been created by accident and may be canceled by the creator. In other scenarios, garbage tickets may be created through automation or because of spam. Automation or the customer experience",
- "title": "Tickets | Computer for Support Teams | DevRev"
+ "id": "ART-2027_KNOWLEDGE_NODE-26",
+ "text": "configuration instructions, refer to [Email snap-in configuration](/docs/integrations/email-config).\\n\\nFor more information, refer to the [Email snap-in](/marketplace/email-with-tickets) on the DevRev marketplace.\\n\\nConversation and ticket creation for emails\\n-------------------------------------------\\n\\nWhen an email is received, DevRev checks if the sender is linked to your workspace and creates a conversation or ticket. If a sender is not recognized, DevRev creates a new user profile to",
+ "title": "Email | Integrate | Snap-ins | DevRev"
}
]
},
@@ -172,54 +172,54 @@
"query": "manage access and privileges in DevRev",
"retrievals": [
{
- "id": "ART-1958_KNOWLEDGE_NODE-24",
- "text": "policies](#mfz-policies)\\n* [Sharing](#sharing)\\n* [Vista privileges](#vista-privileges)\\n\\n1. [Documentation](/docs)\\n3. [Computer by DevRev](/docs/intro)\\n[Access control](/docs/product/access-control)\\n\\nAccess control\\n==============\\n\\nAccess control in DevRev is a system that authorizes an actor to perform actions on different targets within the application. In this context, an actor is any entity that interacts with the app, such as an organization member, a customer, a system user, or a",
+ "id": "ART-1955_KNOWLEDGE_NODE-80",
+ "text": "team, includes privileges to manage customer inquiries and escalations.\\n\\n**Privileges:**\\n\\n* *Group Reader:* Contains read privileges on all groups.\\n\\n Privileges: group object ['READ']\\n* *Ticket Interactor:* Contains privileges on tickets for default group 'Support'.\\n\\n Privileges: ticket object ['CREATE', 'READ', 'UPDATE', 'DELETE']\\n* *Conversation Admin:* Contains privileges on conversations.\\n\\n Privileges: conversation object ['READ', 'UPDATE', 'DELETE',",
+ "title": "Default privileges by group | Roles | Computer by DevRev | DevRev"
+ },
+ {
+ "id": "ART-1958_KNOWLEDGE_NODE-33",
+ "text": "privileges by group](/docs/product/privs)[NextObject customization](/docs/product/object-customization)\\n\\n#### On this page\\n\\n* [Privilege determination](#privilege-determination)\\n* [Granting access permissions](#granting-access-permissions)\\n* [MFZ policies](#mfz-policies)\\n* [Sharing](#sharing)\\n* [Vista privileges](#vista-privileges)\\n\\n[Enterprise grade security to protect customer data\\n\\nLearn more about it.\\n\\n![]()](/blog/soc-compliance)\\n\\nComputer\\n\\n* [Meet",
"title": "Access control | Computer by DevRev | DevRev"
},
{
- "id": "ART-1955_KNOWLEDGE_NODE-46",
- "text": "admins on revus.\\n\\n Privileges: revu object ['CREATE', 'READ', 'UPDATE', 'DELETE']\\n* *devo Admin:* Contains privileges for admins on devos.\\n\\n Privileges: devo object ['CREATE', 'READ', 'UPDATE', 'DELETE']\\n* *flow Admin:* Contains privileges for admins on flows.\\n\\n Privileges: flow object ['CREATE', 'READ', 'UPDATE', 'DELETE']\\n* *webhook Admin:* Contains privileges for admins on webhooks.\\n\\n Privileges: webhook object ['CREATE', 'READ', 'UPDATE', 'DELETE']\\n* *product Admin:*",
+ "id": "ART-1955_KNOWLEDGE_NODE-28",
+ "text": "tickets.\\n\\n Privileges: ticket object ['CREATE']\\n* *Customer Ticket Field Access:* Contains the field access on tickets\\n\\n Privileges: ticket object None\\n* *Self RevOrg Viewer:* Contains privileges on revOrgs for revUsers to view there workspace.\\n\\n Privileges: revo object ['READ']\\n* *Self RevOrg RevUsers Viewer:* Contains privileges on revUsers for revUsers to view there workspace revUsers.\\n\\n Privileges: revu object ['READ']\\n* *Self RevUsers Viewer:* Contains privileges on",
"title": "Default privileges by group | Roles | Computer by DevRev | DevRev"
},
{
- "id": "ART-1963_KNOWLEDGE_NODE-1",
- "text": "[Groups](/docs/product/groups)\\n + [Parts & trails](/docs/product/parts)\\n + [Vistas](/docs/product/vistas)\\n\\n - [Vista Reports](/docs/product/vista-reports)\\n - [Board view](/docs/product/board-view)\\n + [Tasks](/docs/product/tasks)\\n + [Updates](/docs/product/updates)\\n + [Customer email notifications](/docs/product/customer-emails)\\n + [Roles](/docs/product/roles)\\n\\n - [Default privileges by group](/docs/product/privs)\\n + [Access control](/docs/product/access-control)\\n +",
- "title": "Accessing DevRev | Computer by DevRev | DevRev"
+ "id": "ART-1955_KNOWLEDGE_NODE-74",
+ "text": "for members of the default group 'Members'.\\n\\n Privileges: revu object ['CREATE', 'READ', 'UPDATE', 'DELETE']\\n* *Dataset Admin:* Contains privileges on datasets for Admins.\\n\\n Privileges: dataset object ['CREATE', 'READ', 'UPDATE', 'DELETE']\\n* *Quote Admin:* Contains admin privileges for quote.\\n\\n Privileges: quote object ['CREATE', 'READ', 'UPDATE', 'DELETE']\\n* *Account Internal Field Access:* Field Access Role for Internal Users\\n\\n Privileges: account object None\\n* *Ticket Admin",
+ "title": "Default privileges by group | Roles | Computer by DevRev | DevRev"
},
{
- "id": "ART-1958_KNOWLEDGE_NODE-23",
- "text": "2025](/docs/changelog/_2025-06-01)\\n + [May 2025](/docs/changelog/_2025-05-01)\\n + [March and April 2025](/docs/changelog/_2025-04-01)\\n + [February 2025](/docs/changelog/_2025-02-01)\\n* [Developer \\xe2\\x86\\x97\\xef\\xb8\\x8f](https://developer.devrev.ai/)\\n* [DevRevU \\xe2\\x86\\x97\\xef\\xb8\\x8f](/docs/DevRevU)\\n\\n + [Product demos](/docs/DevRevU/demos)\\n\\nOn this page\\n\\n* [Privilege determination](#privilege-determination)\\n* [Granting access permissions](#granting-access-permissions)\\n* [MFZ",
+ "id": "ART-1958_KNOWLEDGE_NODE-25",
+ "text": "service account.\\n\\nWhen an actor attempts to carry out an action, such as creating an issue, the access control system checks the actor\\'s role to determine if the actor has the necessary privileges to perform the desired action.\\n\\nPrivilege determination\\n-----------------------\\n\\nEach role consists of two essential parts: caveats and privileges. *Caveats* represent specific conditions that must be met for the role to be applicable. *Privileges* outline the actions or operations that the",
"title": "Access control | Computer by DevRev | DevRev"
},
{
- "id": "ART-1955_KNOWLEDGE_NODE-66",
- "text": "Privileges: devu object ['CREATE', 'READ', 'UPDATE', 'DELETE']\\n* *revu Admin:* Contains privileges for admins on revus.\\n\\n Privileges: revu object ['CREATE', 'READ', 'UPDATE', 'DELETE']\\n* *devo Admin:* Contains privileges for admins on devos.\\n\\n Privileges: devo object ['CREATE', 'READ', 'UPDATE', 'DELETE']\\n* *flow Admin:* Contains privileges for admins on flows.\\n\\n Privileges: flow object ['CREATE', 'READ', 'UPDATE', 'DELETE']\\n* *webhook Admin:* Contains privileges for admins on",
- "title": "Default privileges by group | Roles | Computer by DevRev | DevRev"
- },
- {
- "id": "ART-1955_KNOWLEDGE_NODE-93",
- "text": "Teams](/for-support-teams)\\n* [For Builders](/for-builders)\\n* [For Customers](/for-customers)\\n* [For User Insights](/for-user-insights)\\n* [Marketplace](https://marketplace.devrev.ai/)\\n\\nResources\\n\\n* [Blog](/blog)\\n* [Our Customers](/case-study)\\n* [Snap-In Extensions](https://developer.devrev.ai/public/snapin-development/concepts)\\n* [DevRevU training](/docs/DevRevU)\\n* [Documentation](https://docs.devrev.ai/)\\n* [API References](https://docs.devrev.ai/api/)\\n\\nCompany\\n\\n*",
- "title": "Default privileges by group | Roles | Computer by DevRev | DevRev"
+ "id": "ART-1958_KNOWLEDGE_NODE-26",
+ "text": "actor is granted when those caveats are satisfied. If at least one role provides the necessary privilege, for example, the create privilege, the actor is granted permission to proceed with the action, allowing them to create the issue.\\n\\nThe process of checking access is as follows:\\n\\n1. Fetch all the user\\'s [groups](./groups).\\n2. Fetch [roles](./roles) associated with the particular target from the user groups, which in this case would be the \"Issue\".\\n3. The system evaluates the caveats",
+ "title": "Access control | Computer by DevRev | DevRev"
},
{
- "id": "ART-1955_KNOWLEDGE_NODE-29",
- "text": "revUsers for revUsers to view there revUsers with same email.\\n\\n Privileges: revu object ['READ']\\n* *RevUser License Viewer:* A role that enables a user to view licenses assigned to them.\\n\\n Privileges: license\\\\_assignment object ['READ']\\n\\n\\xe2\\x80\\x9cPlatform Users\\xe2\\x80\\x9d group\\n----------------------\\n\\nGroup for all internal employees, includes default privileges to do common operations.\\n\\n**Privileges:**\\n\\n* *Devu Self Interactor:* Contains privileges on user for members of",
+ "id": "ART-1955_KNOWLEDGE_NODE-39",
+ "text": "Privileges: dataset object ['CREATE']\\n* *Dataset Owner:* A role that allows the creator to view, edit and delete a dataset\\n\\n Privileges: dataset object ['READ', 'UPDATE', 'DELETE']\\n\\n\\xe2\\x80\\x9cAdmins\\xe2\\x80\\x9d group\\n--------------\\n\\nGroup for all organization admins, includes the necessary privileges to manage the platform configuration, integrations, and other administrative items. Only an admin can promote another user to admin.\\n\\n**Privileges:**\\n\\n* *Issue Interactor:* Contains",
"title": "Default privileges by group | Roles | Computer by DevRev | DevRev"
},
{
- "id": "ART-1955_KNOWLEDGE_NODE-87",
- "text": "['CREATE', 'READ', 'UPDATE', 'DELETE']\\n* *credit revuser admin:* Contains workspace billing admin privileges for credit.\\n\\n Privileges: credit object ['CREATE', 'READ', 'UPDATE', 'DELETE']\\n* *RevOrg Billing Admin AccountCommerceDetails Manager:* Contains workspace billing admin privileges for accountCommerceDetails objects.\\n\\n Privileges: account\\\\_commerce\\\\_details object ['READ', 'UPDATE']\\n* *RevOrg Billing Admin License Assignment Manager:* Contains workspace billing admin privileges",
+ "id": "ART-1955_KNOWLEDGE_NODE-59",
+ "text": "['UPDATE']\\n* *Portal Preferences Update:* A role that allows a user to update portal preferences.\\n\\n Privileges: portal\\\\_preferences object ['UPDATE']\\n* *Service Account Manager:* A role that allows a user to delete and update a service account\\n\\n Privileges: svcacc object ['DELETE', 'UPDATE']\\n\\n\\xe2\\x80\\x9cSystems\\xe2\\x80\\x9d group\\n---------------\\n\\nGroup for admin privileged service accounts, includes the necessary privileges to manage the platform configuration, integrations, and",
"title": "Default privileges by group | Roles | Computer by DevRev | DevRev"
},
{
- "id": "ART-1955_KNOWLEDGE_NODE-95",
- "text": "Status](/status)\\n\\n\\xc2\\xa9 2025 DevRev Inc.\"",
+ "id": "ART-1955_KNOWLEDGE_NODE-3",
+ "text": "management](/docs/product/workflow-management)\\n - [Workflow nodes](/docs/product/workflow-nodes)\\n - [Troubleshooting](/docs/product/troubleshooting-workflows)\\n + [Templates](/docs/product/template)\\n + [Accessing DevRev](/docs/product/ui)\\n + [External identity provider setup](/docs/product/sso-saml)\\n + [Remote MCP server](/docs/product/remote-mcp)\\n* [Computer for Support Teams](/docs/product/support)\\n\\n + [Inbox](/docs/product/inbox)\\n + [Support",
"title": "Default privileges by group | Roles | Computer by DevRev | DevRev"
},
{
- "id": "ART-1955_KNOWLEDGE_NODE-55",
- "text": "Contact Admin field access role\\n\\n Privileges: revu object None\\n* *Vista Creator:* A role that allows a user to create a vista\\n\\n Privileges: vista object ['CREATE']\\n* *Vista Owner:* A role that allows the creator to view, edit and delete a vista\\n\\n Privileges: vista object ['READ', 'UPDATE', 'DELETE']\\n* *Issue Admin Field Access:* Issue admin field access role\\n\\n Privileges: issue object None\\n* *Dashboard Admin:* A role that allows CRUDL operations to admins\\n\\n Privileges:",
- "title": "Default privileges by group | Roles | Computer by DevRev | DevRev"
+ "id": "ART-1948_KNOWLEDGE_NODE-27",
+ "text": "default.\\n\\nAdmins have the authority to configure access for different user groups by assigning or revoking roles. These roles determine the level of permissions and privileges granted to a group, allowing them to perform particular tasks or access specific features.\\n\\nOnly an admin can grant admin privileges to another user.\\n\\nCreating a new group\\n--------------------\\n\\nYou need to be an admin to create a group.\\n\\n1. Go to [**Settings > User Management >",
+ "title": "Groups | Computer by DevRev | DevRev"
}
]
},
@@ -228,54 +228,54 @@
"query": "SSO setup SAML IDP metadata connection string Google Workspace",
"retrievals": [
{
- "id": "ART-1966_KNOWLEDGE_NODE-39",
- "text": "authentication methods to enforce SSO-only login. This is commonly done to ensure all users authenticate through your organization\\'s identity provider.\\n\\n**Common scenario**: If users were previously logging in with Google OAuth and you\\'ve now enabled SSO, you can disable Google authentication to force all users to use SSO.\\n\\nFirst, get the Google OAuth connection ID:\\n\\n```\\n```\\n1 curl --location --request GET \\'https://api.devrev.ai/dev-orgs.auth-connections.list\\' \\\\\\n\\n\\n\\n2 --header",
+ "id": "ART-1966_KNOWLEDGE_NODE-42",
+ "text": "process from your identity provider\\'s portal. The latter is not supported on DevRev.\\n\\nA workaround for supporting IDP-initiated SSO is to bookmark your DevRev workspace URL (that is https://app.devrev.ai/) in your IDP. With only SSO Auth connection enabled, the experience would be as seamless as SP-initiated SSO.\\n\\n### Parameter reference\\n\\n* : Your Personal Access Token with admin permissions\\n* : Your DevRev organization ID (from the initial API",
"title": "External identity provider setup | Computer by DevRev | DevRev"
},
{
- "id": "ART-1005_KNOWLEDGE_NODE-13",
- "text": "model\\n\\n\\nWhat did we choose?\\nGoogle Workspace (Gsuite)\\n\\nWhy did we choose this?\\nAs mentioned in the IdP section above, I\\xe2\\x80\\x99ve worked a lot with Exchange, Sharepoint, and other Microsoft products and I like the simplicity of the Google Workspace solution. Does it have all of the features of Microsoft 360? No, but it gives us enough of what we need and integrates beautifully with Okta. If we had gone Azure AD on the IdP front, that obviously would have impacted this choice.\\n\\nWhat",
- "title": "Choosing the Right Systems For Your Startup"
+ "id": "ART-16086_KNOWLEDGE_NODE-6",
+ "text": "bases\\n\\n8. Conclusion\\n\\nThe SSO Setup Agent offers a fully guided, interactive setup for configuring SSO, with support for both SAML and OIDC. It includes validation, previews, and uses workflow-based skills to automate the process with minimal user intervention.'",
+ "title": "Single Sign On Configuration 3P Node"
},
{
- "id": "ART-1966_KNOWLEDGE_NODE-29",
- "text": "are some common examples:\\n\\nAzure ADGoogle WorkspaceJump CloudOkta\\n\\n1. Log in to Azure Active Directory and select **Enterprise applications > + New application**.\\n2. Search for \"Azure AD SAML Toolkit\" in the **Browse Azure AD Gallery** and select it.\\n3. Enter DevRev as the name and click **Create**.\\n4. Select **Single sign-on > SAML**.\\n5. Edit the **Basic SAML Configuration** and enter the following parameters.\\n\\n * **Identifier** (Entity ID):",
+ "id": "ART-1966_KNOWLEDGE_NODE-39",
+ "text": "authentication methods to enforce SSO-only login. This is commonly done to ensure all users authenticate through your organization\\'s identity provider.\\n\\n**Common scenario**: If users were previously logging in with Google OAuth and you\\'ve now enabled SSO, you can disable Google authentication to force all users to use SSO.\\n\\nFirst, get the Google OAuth connection ID:\\n\\n```\\n```\\n1 curl --location --request GET \\'https://api.devrev.ai/dev-orgs.auth-connections.list\\' \\\\\\n\\n\\n\\n2 --header",
"title": "External identity provider setup | Computer by DevRev | DevRev"
},
{
- "id": "ART-1966_KNOWLEDGE_NODE-20",
- "text": "Datacenter AirSync](/docs/integrations/confluence-datacenter)\\n - [Google Docs](/docs/integrations/google-doc)\\n - [Google Drive](/docs/integrations/google-drive)\\n - [Gmail AirSync](/docs/integrations/gmail-airdrop)\\n - [Monday.com AirSync](/docs/integrations/monday)\\n - [Intercom AirSync](/docs/integrations/intercom)\\n - [Figma AirSync](/docs/integrations/figma-airdrop)\\n - [ServiceNow AirSync](/docs/integrations/servicenow)\\n - [ServiceNow KB",
- "title": "External identity provider setup | Computer by DevRev | DevRev"
+ "id": "ART-15701_KNOWLEDGE_NODE-16",
+ "text": "created\\n\\nEnter the SSO URL in case you have configured SAML login as identity management in amazon connect instance.\\n\\nEnter the complete S3 Bucket names and path for call recording and transcript. The complete bucket names and path can be found here. Copy the complete path directly.\\n\\nSelect Invite All checkbox if you would like to invite all the support agents to DevRev workspace if not present.\\n\\nClick on install snap-in.\\n\\nAfter the snap-in status shows Active, go to the configured",
+ "title": "Amazon Connect Telephony Integration Guide"
},
{
- "id": "ART-1966_KNOWLEDGE_NODE-35",
- "text": "false,\\n\\n\\n\\n6 \"type\": \"samlp\",\\n\\n\\n\\n7 \"sign_in_endpoint\": \"\",\\n\\n\\n\\n8 \"connection_name\": \"\",\\n\\n\\n\\n9 }\\n\\n\\n\\n10 }\\n```\\n\\nShow more\\n```\\n\\nImportant\\n\\n* The connection\\\\_name must follow the naming pattern described earlier.\\n* Save the id field from the response\\xe2\\x80\\x94you need it for the next step.\\n* The connection is created with enabled: false by default for security.\\n\\n### Step 2: Enable the authentication connection\\n\\nAfter",
- "title": "External identity provider setup | Computer by DevRev | DevRev"
+ "id": "ART-16086_KNOWLEDGE_NODE-2",
+ "text": "and back-and-forth coordination The absence of a guided experience adds unnecessary friction to an otherwise smooth onboarding process. The proposed agentic skill aims to eliminate these barriers with a step-by-step SSO setup flow embedded directly within DevRev.\\n\\n3.System Specifications\\n\\nSupports both SAML and OIDC connection types.\\n\\nInteractive, step-by-step setup via agent conversation.\\n\\nCollects essential inputs from the user based on the selected connection type:-For SAML: sign-in",
+ "title": "Single Sign On Configuration 3P Node"
},
{
- "id": "ART-1966_KNOWLEDGE_NODE-34",
- "text": "application/json\\' \\\\\\n\\n\\n\\n4 --data-raw \\'{\\n\\n\\n\\n5 \"type\": \"samlp\",\\n\\n\\n\\n6 \"sign_in_endpoint\": \"\",\\n\\n\\n\\n7 \"signing_cert\": \"\",\\n\\n\\n\\n8 \"connection_name\": \"\",\\n\\n\\n\\n9 \"display_name\": \"\"\\n\\n\\n\\n10 }\\'\\n```\\n\\nShow more\\n```\\n\\n**Expected successful response:**\\n\\n```\\n```\\n1 {\\n\\n\\n\\n2 \"auth_connection\": {\\n\\n\\n\\n3 \"id\": \"con_12345678\",\\n\\n\\n\\n4 \"display_name\": \"\",\\n\\n\\n\\n5 \"enabled\":",
- "title": "External identity provider setup | Computer by DevRev | DevRev"
+ "id": "ART-16086_KNOWLEDGE_NODE-3",
+ "text": "endpoint and signing certificate (with optional metadata URL parsing).-For OIDC: issuer URL, client ID, and client secret.\\n\\nAllows users to provide a display name and choose to enter a connection name or auto-generate one based on DevRev org ID.\\n\\nValidates all mandatory fields and ensures completeness before proceeding.\\n\\nDisplays a summary of the configuration for user confirmation before connection creation.\\n\\nCreates the SSO connection using DevRev APIs.\\n\\nOptionally enables the",
+ "title": "Single Sign On Configuration 3P Node"
},
{
- "id": "ART-1966_KNOWLEDGE_NODE-30",
- "text": "urn:auth0:tf-devrev-prod:\\n * **Reply URL** (Assertion Consumer Service URL): https://auth.devrev.ai/login/callback?connection=\\n * **Sign on URL**: https://app.devrev.ai/\\n\\n ![]()\\n\\n The must be the same in both parameters and follow the naming pattern described earlier.\\n6. Go to **Copy > SAML Certificates** and save the **App Federation Metadata URL**.\\n7. In the Azure portal, go to the application named",
+ "id": "ART-1966_KNOWLEDGE_NODE-29",
+ "text": "are some common examples:\\n\\nAzure ADGoogle WorkspaceJump CloudOkta\\n\\n1. Log in to Azure Active Directory and select **Enterprise applications > + New application**.\\n2. Search for \"Azure AD SAML Toolkit\" in the **Browse Azure AD Gallery** and select it.\\n3. Enter DevRev as the name and click **Create**.\\n4. Select **Single sign-on > SAML**.\\n5. Edit the **Basic SAML Configuration** and enter the following parameters.\\n\\n * **Identifier** (Entity ID):",
"title": "External identity provider setup | Computer by DevRev | DevRev"
},
{
- "id": "ART-4275_KNOWLEDGE_NODE-27",
- "text": "Documentation](https://support.google.com/cloudidentity/answer/10070793).\\n* Enable contact sharing in directory settings, following guidelines provided by Google.\\n* Ensure the following scopes are added:\\n\\n + https://www.googleapis.com/auth/cloud-identity.groups.readonly: Required\\n for groups and group members.\\n + https://www.googleapis.com/auth/directory.readonly: Required for the People\\n API.\\n\\nThese steps are necessary only if a non-admin initiates the import before an\\nadmin",
- "title": "Google Docs | AirSync | Snap-ins | DevRev"
+ "id": "ART-16086_KNOWLEDGE_NODE-4",
+ "text": "connection post-creation via a toggle.\\n\\nProvides contextual guidance and error handling throughout the setup flow.\\n\\n4. Architecture\\n\\nPlease refer the below attachment\\n\\n5. Detailed Design\\n\\nPlease refer the below attachment\\n\\n6.API Endpoints\\n\\nEndpoint\\n\\nMethod\\n\\nInclude Internal\\n\\nDescription\\n\\n/auth-tokens.create\\n\\nPost\\n\\nNo\\n\\nCreates an auth token\\n\\n/auth-connections.create\\n\\nPost\\n\\nNo\\n\\nCreates a new SSO connection (SAML or",
+ "title": "Single Sign On Configuration 3P Node"
},
{
- "id": "ART-15369_KNOWLEDGE_NODE-3",
- "text": "encapsulating the configuration parameters for a Google Apps\\nauthentication connection.\\n\\nShow 5 properties\\n\\nOR\\n\\noidcobjectRequired\\n\\nObject encapsulating the configuration parameters for an OIDC\\nauthentication connection.\\n\\nShow 5 properties\\n\\nOR\\n\\noktaobjectRequired\\n\\nObject encapsulating the configuration parameters for an Okta\\nauthentication connection.\\n\\nShow 5 properties\\n\\nOR\\n\\nsamlpobjectRequired\\n\\nObject encapsulating the configuration parameters for a",
- "title": "Create Dev Orgs Auth Connection | DevRev | Docs"
+ "id": "ART-1966_KNOWLEDGE_NODE-41",
+ "text": "}\\'\\n```\\n\\nShow more\\n```\\n\\nImportant considerations: When disabling other authentication methods:\\n\\n* **Test SSO first**: Ensure SSO is working correctly before disabling alternatives.\\n* **Admin access**: Make sure at least one admin can access the system via SSO.\\n\\nIDP initiated SSO (Optional)\\n----------------------------\\n\\nDevRev supports SP-initiated SSO, which means users always start the authentication process from DevRev. IDP initiated SSO means users start the authentication",
+ "title": "External identity provider setup | Computer by DevRev | DevRev"
},
{
- "id": "ART-1966_KNOWLEDGE_NODE-40",
- "text": "\\'Authorization: Bearer \\'\\n```\\n```\\n\\nLook for the Google OAuth connection in the response and note its id field.\\n\\nDisable Google authentication:\\n\\n```\\n```\\n1 curl --location --request POST \\'https://api.devrev.ai/dev-orgs.auth-connections.toggle\\' \\\\\\n\\n\\n\\n2 --header \\'Authorization: Bearer \\' \\\\\\n\\n\\n\\n3 --header \\'Content-Type: application/json\\' \\\\\\n\\n\\n\\n4 --data-raw \\'{\\n\\n\\n\\n5 \"id\": \"\",\\n\\n\\n\\n6 \"toggle\": \"disable\"\\n\\n\\n\\n7",
- "title": "External identity provider setup | Computer by DevRev | DevRev"
+ "id": "ART-1560_KNOWLEDGE_NODE-177",
+ "text": "Apps\\n\\nObject encapsulating the configuration parameters for a Google Apps authentication connection.\\n\\nShow 6 properties\\nOR\\nNone Show 4 properties\\nOR\\nOidc\\n\\nObject encapsulating the configuration parameters for an OIDC authentication connection.\\n\\nShow 6 properties\\nOR\\nSamlp\\n\\nObject encapsulating the configuration parameters for a SAML authentication connection.\\n\\nShow 5 properties\\nOR\\nWaad\\n\\nObject encapsulating the configuration parameters for an Azure AD authentication",
+ "title": "Assign (Beta) \u2014 DevRev | Docs"
}
]
},
@@ -284,54 +284,54 @@
"query": "restrict users from linking opportunities and meetings",
"retrievals": [
{
- "id": "ART-15404_KNOWLEDGE_NODE-7",
- "text": "Error\\n\\n401\\n\\nUnauthorized Error\\n\\n403\\n\\nForbidden Error\\n\\n429\\n\\nToo Many Requests Error\\n\\n500\\n\\nInternal Server Error\\n\\n503\\n\\nService Unavailable Error\\n\\nWas this page helpful?\\n\\nYesNo\\n\\n[Previous](/api-reference/links/list-post)[#### Count Meetings\\n\\nNext](/api-reference/meetings/count)[Built with](https://buildwithfern.com/?utm_campaign=buildWith&utm_medium=docs&utm_source=developer.devrev.ai)'",
- "title": "Replace Links | DevRev | Docs"
+ "id": "ART-1997_KNOWLEDGE_NODE-30",
+ "text": "opportunities to signal the necessary development work for closing the opportunity. Likewise, linked conversations represent dialogues between a sales representative and a customer concerning the opportunity's closure.\\n\\nOpportunities incorporate a discussion timeline to support real-time collaboration in advancing an opportunity. They play a pivotal role in prioritizing development enhancements.\\n\\n\\xf0\\x9f\\x91\\xa5 Contact\\n---------\\n\\nA contact record represents individual prospects or",
+ "title": "Computer for Growth Teams | DevRev"
},
{
- "id": "ART-13009_KNOWLEDGE_NODE-3",
- "text": "meeting.\\n\\nlinks.targetstringOptional`format: \"id\"`\\n\\nFilters for target id in links associated with the meeting.\\n\\nlinks.target_object_typestringOptional`format: \"text\"`\\n\\nFilters for target object type in links associated with the meeting.\\n\\nmemberslist of stringsOptional\\n\\nFilter for meeting on specified Member Ids.\\n\\nmodeenumOptional\\n\\nThe iteration mode to use, otherwise if not set, then \\xe2\\x80\\x9cafter\\xe2\\x80\\x9d is used.\\n\\nAllowed values: afterbefore\\n\\norganizerlist of",
- "title": "List Meetings \u2014 DevRev | Docs"
+ "id": "ART-15664_KNOWLEDGE_NODE-13",
+ "text": "\\n\\nYou may want to restrict links to specific subtypes of objects. For example, only allowing issues\\nof a particular subtype to be linked to tickets.\\n\\n```\\n| | |\\n| --- | --- |\\n| $ | curl --location \\'https://api.devrev.ai/link-types.custom.create\\' \\\\ |\\n| > | --header \\'Content-Type: application/json\\' \\\\ |\\n| > | --header \\'Authorization: Bearer \\' \\\\ |\\n| > | --data \\'{ |\\n| > | \"name\": \"Link between social media issues and tickets\", |\\n| > | \"source_types\": [ |\\n| > | { |\\n|",
+ "title": "Links | DevRev | Docs"
},
{
- "id": "ART-3008_KNOWLEDGE_NODE-2",
- "text": "meeting.\\n\\nlinks.targetstringOptional`format: \"id\"`\\n\\nFilters for target id in links associated with the meeting.\\n\\nlinks.target_object_typestringOptional`format: \"text\"`\\n\\nFilters for target object type in links associated with the meeting.\\n\\nmemberslist of stringsOptional\\n\\nFilter for meeting on specified Member Ids.\\n\\nmodeenumOptional\\n\\nThe iteration mode to use, otherwise if not set, then \\xe2\\x80\\x9cafter\\xe2\\x80\\x9d is used.\\n\\nAllowed values: afterbefore\\n\\norganizerlist of",
- "title": "List Meetings (Beta) \u2014 DevRev | Docs"
+ "id": "ART-3006_KNOWLEDGE_NODE-2",
+ "text": "the provided external_ref(s).\\n\\nlimitintegerOptional\\n\\nThe maximum number of meetings to return.\\n\\nlinkslist of objectsOptional\\n\\nFilters for links associated with the meeting.\\n\\nShow 3 properties\\n\\nmemberslist of stringsOptional\\n\\nFilter for meeting on specified Member Ids.\\n\\nmodeenumOptional\\n\\nAllowed values: afterbefore\\n\\nThe iteration mode to use. If \\xe2\\x80\\x9cafter\\xe2\\x80\\x9d, then entries after the provided cursor will be returned, or if no cursor is provided, then from the",
+ "title": "List Meetings (POST) (Beta) \u2014 DevRev | Docs"
},
{
- "id": "ART-13009_KNOWLEDGE_NODE-2",
- "text": "stringsOptional\\n\\nFilters for meetings created by the specified user(s).\\n\\ncursorstringOptional`format: \"text\"`\\n\\nThe cursor to resume iteration from. If not provided, then iteration starts from the beginning.\\n\\nexternal_reflist of stringsOptional\\n\\nFilters for meetings with the provided external_ref(s).\\n\\nlimitintegerOptional\\n\\nThe maximum number of meetings to return.\\n\\nlinks.link_typestringOptional`format: \"text\"`\\n\\nFilters for link type in links associated with the",
- "title": "List Meetings \u2014 DevRev | Docs"
+ "id": "ART-12471_KNOWLEDGE_NODE-5",
+ "text": "by `created_by`, `name`, and `sync_metadata` fields to [`/groups.list`](/beta/api-reference/groups/list-post)\\n\\n### Links\\n\\n* Added `custom_link_type` property to link objects in [`/links.create`](/beta/api-reference/links/create) and related endpoints\\n\\n### Meetings\\n\\n* Added `sync_metadata` property to meeting objects in [`/meetings.create`](/beta/api-reference/meetings/create) and related endpoints\\n\\n### Opportunities\\n\\n* Added `contacts` property to opportunity objects in work-related",
+ "title": "May 19, 2025 | DevRev | Docs"
},
{
- "id": "ART-15422_KNOWLEDGE_NODE-5",
- "text": "return.\\n\\nlinks.link\\\\_typestringOptional`format: \"text\"`\\n\\nFilters for link type in links associated with the meeting.\\n\\nlinks.targetstringOptional`format: \"id\"`\\n\\nFilters for target id in links associated with the meeting.\\n\\nlinks.target\\\\_object\\\\_typestringOptional`format: \"text\"`\\n\\nFilters for target object type in links associated with the meeting.\\n\\nmemberslist of stringsOptional\\n\\nFilter for meeting on specified Member Ids.\\n\\nmodeenumOptional\\n\\nThe iteration mode to use,",
- "title": "List Meetings | DevRev | Docs"
+ "id": "ART-3197_KNOWLEDGE_NODE-11",
+ "text": "by `created_by`, `name`, and `sync_metadata` fields to [`/groups.list`](/beta/api-reference/groups/list-post)\\n\\n### Links\\n\\n* Added `custom_link_type` property to link objects in [`/links.create`](/beta/api-reference/links/create) and related endpoints\\n\\n### Meetings\\n\\n* Added `sync_metadata` property to meeting objects in [`/meetings.create`](/beta/api-reference/meetings/create) and related endpoints\\n\\n### Opportunities\\n\\n* Added `contacts` property to opportunity objects in work-related",
+ "title": "Changelog | DevRev | Docs"
},
{
- "id": "ART-1834_KNOWLEDGE_NODE-456",
- "text": "set, then \"after\" is used.\\nAllowed values: after before\\nopportunity.account string Optional\\nFilters for opportunities belonging to any of the provided accounts.\\nopportunity.contacts string Optional\\nFilters for opportunities with any of the provided contacts.\\nopportunity.subtype string Optional\\nFilters for opportunity with any of the provided subtypes.\\nowned_by string Optional\\nFilters for work owned by any of these users.\\nreported_by string Optional\\nFilters for work reported by any of",
- "title": "Delete \u2014 DevRev | Docs"
+ "id": "ART-13005_KNOWLEDGE_NODE-2",
+ "text": "stringsOptional\\n\\nFilters for meetings created by the specified user(s).\\n\\nexternal_reflist of stringsOptional\\n\\nFilters for meetings with the provided external_ref(s).\\n\\nlinks.link_typestringOptional`format: \"text\"`\\n\\nFilters for link type in links associated with the meeting.\\n\\nlinks.targetstringOptional`format: \"id\"`\\n\\nFilters for target id in links associated with the meeting.\\n\\nlinks.target_object_typestringOptional`format: \"text\"`\\n\\nFilters for target object type in links",
+ "title": "Count Meetings \u2014 DevRev | Docs"
},
{
- "id": "ART-3008_KNOWLEDGE_NODE-1",
- "text": "user(s).\\n\\ncursorstringOptional`format: \"text\"`\\n\\nThe cursor to resume iteration from. If not provided, then iteration starts from the beginning.\\n\\ncustom_fieldsobjectOptional\\n\\nFilters for meeting on custom fields.\\n\\nexternal_reflist of stringsOptional\\n\\nFilters for meetings with the provided external_ref(s).\\n\\nlimitintegerOptional\\n\\nThe maximum number of meetings to return.\\n\\nlinks.link_typestringOptional`format: \"text\"`\\n\\nFilters for link type in links associated with the",
- "title": "List Meetings (Beta) \u2014 DevRev | Docs"
+ "id": "ART-15416_KNOWLEDGE_NODE-2",
+ "text": "created by the specified user(s).\\n\\nexternal\\\\_reflist of stringsOptional\\n\\nFilters for meetings with the provided external\\\\_ref(s).\\n\\nlinks.link\\\\_typestringOptional`format: \"text\"`\\n\\nFilters for link type in links associated with the meeting.\\n\\nlinks.targetstringOptional`format: \"id\"`\\n\\nFilters for target id in links associated with the meeting.\\n\\nlinks.target\\\\_object\\\\_typestringOptional`format: \"text\"`\\n\\nFilters for target object type in links associated with the",
+ "title": "Count Meetings | DevRev | Docs"
},
{
- "id": "ART-1575_KNOWLEDGE_NODE-449",
- "text": "opportunities with any of the provided contacts.\\nopportunity.subtype string Optional\\nFilters for opportunity with any of the provided subtypes.\\nowned_by string Optional\\nFilters for work owned by any of these users.\\nreported_by string Optional\\nFilters for work reported by any of these users.\\nsort_by string Optional\\nFields to sort the work items by and the direction to sort them.\\nstage.name string Optional\\nFilters for records in the provided stage(s) by name.\\nstaged_info.is_staged",
- "title": "Delete \u2014 DevRev | Docs"
+ "id": "ART-13009_KNOWLEDGE_NODE-2",
+ "text": "stringsOptional\\n\\nFilters for meetings created by the specified user(s).\\n\\ncursorstringOptional`format: \"text\"`\\n\\nThe cursor to resume iteration from. If not provided, then iteration starts from the beginning.\\n\\nexternal_reflist of stringsOptional\\n\\nFilters for meetings with the provided external_ref(s).\\n\\nlimitintegerOptional\\n\\nThe maximum number of meetings to return.\\n\\nlinks.link_typestringOptional`format: \"text\"`\\n\\nFilters for link type in links associated with the",
+ "title": "List Meetings \u2014 DevRev | Docs"
},
{
- "id": "ART-1821_KNOWLEDGE_NODE-446",
- "text": "opportunities with any of the provided contacts.\\nopportunity.subtype string Optional\\nFilters for opportunity with any of the provided subtypes.\\nowned_by string Optional\\nFilters for work owned by any of these users.\\nreported_by string Optional\\nFilters for work reported by any of these users.\\nsort_by string Optional\\nFields to sort the work items by and the direction to sort them.\\nstage.name string Optional\\nFilters for records in the provided stage(s) by name.\\nstaged_info.is_staged",
- "title": "Delete \u2014 DevRev | Docs"
+ "id": "ART-3003_KNOWLEDGE_NODE-1",
+ "text": "user(s).\\n\\ncustom_fieldsobjectOptional\\n\\nFilters for meeting on custom fields.\\n\\nexternal_reflist of stringsOptional\\n\\nFilters for meetings with the provided external_ref(s).\\n\\nlinks.link_typestringOptional`format: \"text\"`\\n\\nFilters for link type in links associated with the meeting.\\n\\nlinks.targetstringOptional`format: \"id\"`\\n\\nFilters for target id in links associated with the meeting.\\n\\nlinks.target_object_typestringOptional`format: \"text\"`\\n\\nFilters for target object type in links",
+ "title": "Count Meetings (Beta) \u2014 DevRev | Docs"
},
{
- "id": "ART-15416_KNOWLEDGE_NODE-2",
- "text": "created by the specified user(s).\\n\\nexternal\\\\_reflist of stringsOptional\\n\\nFilters for meetings with the provided external\\\\_ref(s).\\n\\nlinks.link\\\\_typestringOptional`format: \"text\"`\\n\\nFilters for link type in links associated with the meeting.\\n\\nlinks.targetstringOptional`format: \"id\"`\\n\\nFilters for target id in links associated with the meeting.\\n\\nlinks.target\\\\_object\\\\_typestringOptional`format: \"text\"`\\n\\nFilters for target object type in links associated with the",
- "title": "Count Meetings | DevRev | Docs"
+ "id": "ART-3008_KNOWLEDGE_NODE-1",
+ "text": "user(s).\\n\\ncursorstringOptional`format: \"text\"`\\n\\nThe cursor to resume iteration from. If not provided, then iteration starts from the beginning.\\n\\ncustom_fieldsobjectOptional\\n\\nFilters for meeting on custom fields.\\n\\nexternal_reflist of stringsOptional\\n\\nFilters for meetings with the provided external_ref(s).\\n\\nlimitintegerOptional\\n\\nThe maximum number of meetings to return.\\n\\nlinks.link_typestringOptional`format: \"text\"`\\n\\nFilters for link type in links associated with the",
+ "title": "List Meetings (Beta) \u2014 DevRev | Docs"
}
]
},
@@ -340,18 +340,18 @@
"query": "connect WhatsApp Business with DevRev",
"retrievals": [
{
- "id": "ART-2029_KNOWLEDGE_NODE-25",
- "text": "for you to manage all your customer conversations in one place. By adding WhatsApp to DevRev, you can streamline your support and offer a smoother experience to your customers.\\n\\nFor detailed information about WhatsApp for Business, refer to [WhatsApp Business Platform - Documentation](https://developers.facebook.com/docs/whatsapp/overview)\\n\\nPrerequisites\\n-------------\\n\\n1. **Create a business account:** Ensure you have a [Business Account](https://business.facebook.com/overview) in Meta",
+ "id": "ART-2029_KNOWLEDGE_NODE-27",
+ "text": "work with 360dialog for WhatsApp Integration. If you have an existing WhatsApp for Business Account, follow the steps to [migrate to 360dialog](https://docs.360dialog.com/partner/account-setup/migrating-phone-numbers).\\n\\nInstalling the WhatsApp snap-in\\n-------------------------------\\n\\nTo use this snap-in, you\\'ll need to connect your WhatsApp with Business API with DevRev.\\n\\n1. Install [WhatsApp](/marketplace/whatsapp) from the DevRev marketplace.\\n2. Select the workspace to install the",
"title": "WhatsApp | Integrate | Snap-ins | DevRev"
},
{
- "id": "ART-2029_KNOWLEDGE_NODE-30",
- "text": "phone number to sync WhatsApp messages sent to the business with DevRev Inbox.\\n4. **Register for WhatsApp webhook:** In the **Discussion** tab, enter **/whatsapp** to register to the WhatsApp webhook URL to receive WhatsApp messages in the DevRev Inbox.\\n5. **Use template messages:** As per WhatsApp policies, template messages are required to communicate with customers once 24 hours have passed since their last message. To ensure continuity in customer conversations, the following template",
+ "id": "ART-2029_KNOWLEDGE_NODE-29",
+ "text": "Install the WhatsApp snap-in from the marketplace as mentioned above.\\n2. **Create a connection:** In the **Connections** tab, add your existing connection or create a new connection.\\n * Give your connection a name, and ensure that you completed the required steps in the prerequisites.\\n * Click **Connect**.\\n * Open the dialog and follow the process to finish creating a connection.\\n\\n ![]()\\n3. **Configure business phone number:** In the **Configuration** tab, enter the business",
"title": "WhatsApp | Integrate | Snap-ins | DevRev"
},
{
- "id": "ART-2029_KNOWLEDGE_NODE-27",
- "text": "work with 360dialog for WhatsApp Integration. If you have an existing WhatsApp for Business Account, follow the steps to [migrate to 360dialog](https://docs.360dialog.com/partner/account-setup/migrating-phone-numbers).\\n\\nInstalling the WhatsApp snap-in\\n-------------------------------\\n\\nTo use this snap-in, you\\'ll need to connect your WhatsApp with Business API with DevRev.\\n\\n1. Install [WhatsApp](/marketplace/whatsapp) from the DevRev marketplace.\\n2. Select the workspace to install the",
+ "id": "ART-2029_KNOWLEDGE_NODE-30",
+ "text": "phone number to sync WhatsApp messages sent to the business with DevRev Inbox.\\n4. **Register for WhatsApp webhook:** In the **Discussion** tab, enter **/whatsapp** to register to the WhatsApp webhook URL to receive WhatsApp messages in the DevRev Inbox.\\n5. **Use template messages:** As per WhatsApp policies, template messages are required to communicate with customers once 24 hours have passed since their last message. To ensure continuity in customer conversations, the following template",
"title": "WhatsApp | Integrate | Snap-ins | DevRev"
},
{
@@ -360,34 +360,34 @@
"title": "WhatsApp | Integrate | Snap-ins | DevRev"
},
{
- "id": "ART-2029_KNOWLEDGE_NODE-28",
- "text": "snap-in, confirm installation, and click **Deploy snap-in**.\\n\\nLimitations\\n-----------\\n\\n* Group Conversations are not supported by WhatsApp for Business API.\\n* If you do not respond to the customer\\xe2\\x80\\x99s message within 24 hours, you can only respond to the conversation using Meta-approved template messages.\\n\\nSet up the snap-in\\n------------------\\n\\nFollow these steps to ensure WhatsApp messages sent to your business are synced with the DevRev Inbox.\\n\\n1. **Install the snap-in:**",
+ "id": "ART-2029_KNOWLEDGE_NODE-25",
+ "text": "for you to manage all your customer conversations in one place. By adding WhatsApp to DevRev, you can streamline your support and offer a smoother experience to your customers.\\n\\nFor detailed information about WhatsApp for Business, refer to [WhatsApp Business Platform - Documentation](https://developers.facebook.com/docs/whatsapp/overview)\\n\\nPrerequisites\\n-------------\\n\\n1. **Create a business account:** Ensure you have a [Business Account](https://business.facebook.com/overview) in Meta",
"title": "WhatsApp | Integrate | Snap-ins | DevRev"
},
{
- "id": "ART-2029_KNOWLEDGE_NODE-29",
- "text": "Install the WhatsApp snap-in from the marketplace as mentioned above.\\n2. **Create a connection:** In the **Connections** tab, add your existing connection or create a new connection.\\n * Give your connection a name, and ensure that you completed the required steps in the prerequisites.\\n * Click **Connect**.\\n * Open the dialog and follow the process to finish creating a connection.\\n\\n ![]()\\n3. **Configure business phone number:** In the **Configuration** tab, enter the business",
- "title": "WhatsApp | Integrate | Snap-ins | DevRev"
+ "id": "ART-2002_KNOWLEDGE_NODE-35",
+ "text": "integrations like [Slack](/marketplace/slack), [Email for conversations](https://marketplace.devrev.ai/marketplace/devrev-plug-with-email), [WhatsApp](/marketplace/whatsapp) are additional channels available with DevRev's omnichannel support offering.\\nIntegrating these channels automatically brings customer identity to DevRev.\\n\\n[PreviousOpportunities](/docs/product/opportunity)[NextAccount and contact import](/docs/product/account-contact-import)\\n\\n#### On this page\\n\\n*",
+ "title": "Contacts | Computer for Growth Teams | DevRev"
},
{
- "id": "ART-2029_KNOWLEDGE_NODE-26",
- "text": "Business Manager. For detailed information, refer to [creating a Business Account](https://m.facebook.com/help/1710077379203657) in Meta Business Manager.\\n2. **Number compatibility:** Ensure the designated number isn\\'t linked to another WhatsApp account. If it is, either delete that account or [migrate your number](https://developers.facebook.com/docs/whatsapp/cloud-api/get-started/migrate-existing-whatsapp-number-to-a-business-account/) to a business account.\\n3. **Partner integration:** We",
+ "id": "ART-2029_KNOWLEDGE_NODE-28",
+ "text": "snap-in, confirm installation, and click **Deploy snap-in**.\\n\\nLimitations\\n-----------\\n\\n* Group Conversations are not supported by WhatsApp for Business API.\\n* If you do not respond to the customer\\xe2\\x80\\x99s message within 24 hours, you can only respond to the conversation using Meta-approved template messages.\\n\\nSet up the snap-in\\n------------------\\n\\nFollow these steps to ensure WhatsApp messages sent to your business are synced with the DevRev Inbox.\\n\\n1. **Install the snap-in:**",
"title": "WhatsApp | Integrate | Snap-ins | DevRev"
},
{
- "id": "ART-2029_KNOWLEDGE_NODE-23",
- "text": "2025](/docs/changelog/_2025-06-01)\\n + [May 2025](/docs/changelog/_2025-05-01)\\n + [March and April 2025](/docs/changelog/_2025-04-01)\\n + [February 2025](/docs/changelog/_2025-02-01)\\n* [Developer \\xe2\\x86\\x97\\xef\\xb8\\x8f](https://developer.devrev.ai/)\\n* [DevRevU \\xe2\\x86\\x97\\xef\\xb8\\x8f](/docs/DevRevU)\\n\\n + [Product demos](/docs/DevRevU/demos)\\n\\nOn this page\\n\\n* [Prerequisites](#prerequisites)\\n* [Installing the WhatsApp snap-in](#installing-the-whatsapp-snapin)\\n*",
- "title": "WhatsApp | Integrate | Snap-ins | DevRev"
+ "id": "ART-15716_KNOWLEDGE_NODE-20",
+ "text": "them, reach out to DevRev support with details (article titles, migration date, etc.) for assistance.\\n\\nSupport for Incoming Text Messages (SMS and WhatsApp)\\n\\nYes, DevRev does allow for incoming text messages\\xe2\\x80\\x94if you use a supported SMS integration.\\n\\nThe main provider currently supported is Exotel. When you connect your Exotel account to DevRev, customers can send SMS to your Exotel number, and those messages will show up as conversations in your DevRev inbox.\\n\\nWhatsApp is also",
+ "title": "Support queries related playbook"
},
{
- "id": "ART-2029_KNOWLEDGE_NODE-0",
- "text": "b'WhatsApp | Integrate | Snap-ins | DevRev\\n\\n* Computer\\n* Resources\\n* [Our Customers](/case-study)\\n\\n[Login](https://app.devrev.ai/login)[Book a demo](/request-a-demo)\\n\\nComputer\\n\\nResources\\n\\n[Our Customers](/case-study)\\n\\n[Login](https://app.devrev.ai/login)[Book a demo](/request-a-demo)\\n\\nSearch\\n\\n`CTRL`\\xc2\\xa0+\\xc2\\xa0`K`\\n\\n* [Introduction](/docs)\\n* [Computer by DevRev](/docs/intro)\\n\\n + [Core concepts](/docs/product/core)\\n + [Apps](/docs/product/apps)\\n +",
+ "id": "ART-2029_KNOWLEDGE_NODE-26",
+ "text": "Business Manager. For detailed information, refer to [creating a Business Account](https://m.facebook.com/help/1710077379203657) in Meta Business Manager.\\n2. **Number compatibility:** Ensure the designated number isn\\'t linked to another WhatsApp account. If it is, either delete that account or [migrate your number](https://developers.facebook.com/docs/whatsapp/cloud-api/get-started/migrate-existing-whatsapp-number-to-a-business-account/) to a business account.\\n3. **Partner integration:** We",
"title": "WhatsApp | Integrate | Snap-ins | DevRev"
},
{
- "id": "ART-2002_KNOWLEDGE_NODE-27",
- "text": "Plug, email, and WhatsApp) can be matched to the right customer record.\\n\\n![]()\\n\\nYou can create a contact using DevRev's rev-users.create API. Follow the [Create accounts and contacts in DevRev](https://developer.devrev.ai/beta/guides/create-accounts-and-contacts-in-dev-rev) tutorial.\\n\\n### Bulk import customer records\\n\\nTo bulk import customer records, see [Account and contact import](/docs/product/account-contact-import).\\n\\nYou can also use [AirSync](https://docs.devrev.ai/import) to",
- "title": "Contacts | Computer for Growth Teams | DevRev"
+ "id": "ART-15792_KNOWLEDGE_NODE-1",
+ "text": "to create comprehensive business intelligence:\\n\\nUnified data integration: The platform connects to existing business systems including Salesforce, Jira, and Google Workspace through their bidirectional synchronization engine called DevRev Airdrop. This eliminates the data silos that typically prevent AI from accessing complete business context.\\n\\nKnowledge graph architecture: DevRev organizes all connected information into a patented Knowledge Graph, which creates a living network of data",
+ "title": "DevRev Products and Agents"
}
]
},
@@ -396,52 +396,52 @@
"query": "API for Incident Ticket creation",
"retrievals": [
{
- "id": "ART-4127_KNOWLEDGE_NODE-0",
- "text": "b'Create Incident | DevRev | Docs\\n\\n[![]()![]()](https://developer.devrev.ai/)\\n\\nBeta\\n\\nBeta\\n\\nBeta\\n\\nSearch\\n\\n`/`\\n\\n[API Reference](/beta/api-reference/accounts/create)[incidents](/beta/api-reference/incidents/create)\\n\\nCreate Incident\\n===============\\n\\nBeta\\n\\nCopy page\\n\\nPOST\\n\\nhttps://api.devrev.ai/incidents.create\\n\\nPOST\\n\\n/incidents.create\\n\\ncURL\\n\\n```\\n| | |\\n| --- | --- |\\n| $ | curl -X POST https://api.devrev.ai/incidents.create \\\\ |\\n| > | -H \"Authorization: Bearer",
- "title": "Create Incident | DevRev | Docs"
+ "id": "ART-1562_KNOWLEDGE_NODE-244",
+ "text": "owner.\\n\\nResponse.\\n\\nThis endpoint returns an object.\\ngroup object\\nShow 11 properties\\nAPI Reference operate Incidents Create.\\n\\nPOST https://api.devrev.ai / incidents.create\\n\\nCreates an incident.\\n\\nRequest.\\n\\nThis endpoint expects an object.\\ntitle string Required\\n\\nTitle of the incident.\\n\\nacknowledged_date datetime Optional\\n\\nTimestamp when the incident was acknowledged.\\n\\napplies_to_parts list of strings Optional\\n\\nParts to which the incident is applicable to.\\n\\nartifacts",
+ "title": "Get (Beta) \u2014 DevRev | Docs"
},
{
- "id": "ART-4127_KNOWLEDGE_NODE-1",
- "text": "\" \\\\ |\\n| > | -H \"Content-Type: application/json\" \\\\ |\\n| > | -d \\'{ |\\n| > | \"title\": \"string\" |\\n| > | }\\' |\\n```\\n\\n[Try it](/beta/api-reference/incidents/create?explorer=true)\\n\\n201Created\\n\\n```\\n| | |\\n| --- | --- |\\n| 1 | { |\\n| 2 | \"incident\": { |\\n| 3 | \"id\": \"string\", |\\n| 4 | \"title\": \"string\", |\\n| 5 | \"acknowledged_date\": \"2023-01-01T12:00:00.000Z\", |\\n| 6 | \"actual_close_date\": \"2023-01-01T12:00:00.000Z\", |\\n| 7 | \"applies_to_parts\": [ |\\n| 8 | { |\\n| 9 | \"display_id\":",
- "title": "Create Incident | DevRev | Docs"
+ "id": "ART-1551_KNOWLEDGE_NODE-244",
+ "text": "owner.\\n\\nResponse.\\n\\nThis endpoint returns an object.\\ngroup object\\nShow 11 properties\\nAPI Reference operate Incidents Create.\\n\\nPOST https://api.devrev.ai / incidents.create\\n\\nCreates an incident.\\n\\nRequest.\\n\\nThis endpoint expects an object.\\ntitle string Required\\n\\nTitle of the incident.\\n\\nacknowledged_date datetime Optional\\n\\nTimestamp when the incident was acknowledged.\\n\\napplies_to_parts list of strings Optional\\n\\nParts to which the incident is applicable to.\\n\\nartifacts",
+ "title": "Update (Beta) \u2014 DevRev | Docs"
},
{
- "id": "ART-12390_KNOWLEDGE_NODE-29",
- "text": "Ticket | Creates a new ticket in DevRev. | * Ticket details like title, body, applies\\\\_to\\\\_part, etc. * subtype: (Optional) Ticket subtype * apps: (Optional) Related apps * app\\\\_custom\\\\_fields: (Optional) Custom fields | Created ticket object |\\n| Convert Conversation To Ticket | Converts a conversation to a ticket. | * conversation\\\\_id: ID of the conversation to convert | ticket\\\\_id: ID of the created ticket |\\n\\nObject retrieval\\n----------------\\n\\n| Operation | Description | Input",
- "title": "Workflow action library | Workflows | Computer by DevRev | DevRev"
+ "id": "ART-1545_KNOWLEDGE_NODE-244",
+ "text": "owner.\\n\\nResponse.\\n\\nThis endpoint returns an object.\\ngroup object\\nShow 11 properties\\nAPI Reference operate Incidents Create.\\n\\nPOST https://api.devrev.ai / incidents.create\\n\\nCreates an incident.\\n\\nRequest.\\n\\nThis endpoint expects an object.\\ntitle string Required\\n\\nTitle of the incident.\\n\\nacknowledged_date datetime Optional\\n\\nTimestamp when the incident was acknowledged.\\n\\napplies_to_parts list of strings Optional\\n\\nParts to which the incident is applicable to.\\n\\nartifacts",
+ "title": "Create (Beta) \u2014 DevRev | Docs"
},
{
- "id": "ART-4126_KNOWLEDGE_NODE-0",
- "text": "b'Get Incident (POST) | DevRev | Docs\\n\\n[![]()![]()](https://developer.devrev.ai/)\\n\\nBeta\\n\\nBeta\\n\\nBeta\\n\\nSearch\\n\\n`/`\\n\\n[API Reference](/beta/api-reference/accounts/create)[incidents](/beta/api-reference/incidents/create)\\n\\nGet Incident (POST)\\n===================\\n\\nBeta\\n\\nCopy page\\n\\nPOST\\n\\nhttps://api.devrev.ai/incidents.get\\n\\nPOST\\n\\n/incidents.get\\n\\ncURL\\n\\n```\\n| | |\\n| --- | --- |\\n| $ | curl -X POST https://api.devrev.ai/incidents.get \\\\ |\\n| > | -H \"Authorization: Bearer",
- "title": "Get Incident (POST) | DevRev | Docs"
+ "id": "ART-1785_KNOWLEDGE_NODE-163",
+ "text": "owner.\\nResponse.\\n\\nThis endpoint returns an object.\\ngroup object\\nShow 11 properties\\nAPI Reference operate Incidents Create.\\n\\nPOST https:// api.devrev.ai / incidents.create\\nCreates an incident.\\nRequest.\\n\\nThis endpoint expects an object.\\ntitle string Required\\nTitle of the incident.\\nacknowledged_date datetime Optional\\nTimestamp when the incident was acknowledged.\\napplies_to_parts list of strings Optional\\nParts to which the incident is applicable to.\\nartifacts list of strings",
+ "title": "Create \u2014 DevRev | Docs"
},
{
- "id": "ART-4127_KNOWLEDGE_NODE-15",
- "text": "\"string\" |\\n| 258 | } |\\n| 259 | ], |\\n| 260 | \"target_close_date\": \"2023-01-01T12:00:00.000Z\" |\\n| 261 | } |\\n| 262 | } |\\n```\\n\\nCreates an incident.\\n\\n### Headers\\n\\nAuthorizationstringRequired\\n\\nBearer authentication of the form `Bearer `, where token is your auth token.\\n\\n### Request\\n\\nThis endpoint expects an object.\\n\\ntitlestringRequired`format: \"text\"`\\n\\nTitle of the incident.\\n\\nacknowledged\\\\_datestringOptional`format: \"date-time\"`\\n\\nTimestamp when the incident was",
- "title": "Create Incident | DevRev | Docs"
+ "id": "ART-1300_KNOWLEDGE_NODE-166",
+ "text": "Create.\\n\\nPOST https:// api.devrev.ai / incidents.create\\nCreates an incident.\\nRequest.\\n\\nThis endpoint expects an object.\\ntitle string Required\\nTitle of the incident.\\nacknowledged_date datetime Optional\\nTimestamp when the incident was acknowledged.\\napplies_to_parts list of strings Optional\\nParts to which the incident is applicable to.\\nartifacts list of strings Optional\\nArtifacts attached to the incident.\\nbody string Optional\\nBody of the incident.\\ncustom_fields map from strings to",
+ "title": "Create \u2014 DevRev | Docs"
},
{
- "id": "ART-4133_KNOWLEDGE_NODE-0",
- "text": "b'Update Incident | DevRev | Docs\\n\\n[![]()![]()](https://developer.devrev.ai/)\\n\\nBeta\\n\\nBeta\\n\\nBeta\\n\\nSearch\\n\\n`/`\\n\\n[API Reference](/beta/api-reference/accounts/create)[incidents](/beta/api-reference/incidents/create)\\n\\nUpdate Incident\\n===============\\n\\nBeta\\n\\nCopy page\\n\\nPOST\\n\\nhttps://api.devrev.ai/incidents.update\\n\\nPOST\\n\\n/incidents.update\\n\\ncURL\\n\\n```\\n| | |\\n| --- | --- |\\n| $ | curl -X POST https://api.devrev.ai/incidents.update \\\\ |\\n| > | -H \"Authorization: Bearer",
- "title": "Update Incident | DevRev | Docs"
+ "id": "ART-1801_KNOWLEDGE_NODE-168",
+ "text": "Create.\\n\\nPOST https:// api.devrev.ai / incidents.create\\nCreates an incident.\\nRequest.\\n\\nThis endpoint expects an object.\\ntitle string Required\\nTitle of the incident.\\nacknowledged_date datetime Optional\\nTimestamp when the incident was acknowledged.\\napplies_to_parts list of strings Optional\\nParts to which the incident is applicable to.\\nartifacts list of strings Optional\\nArtifacts attached to the incident.\\nbody string Optional\\nBody of the incident.\\ncustom_fields map from strings to",
+ "title": "Get \u2014 DevRev | Docs"
},
{
- "id": "ART-2033_KNOWLEDGE_NODE-5",
- "text": "ticket conversion](/docs/product/conversation-ticket)\\n + [Tickets](/docs/product/tickets)\\n + [Routing](/docs/product/routing)\\n + [Support best practices](/docs/product/support-bp)\\n + [Customer portal](/docs/product/support-portal)\\n + [Questions & answers](/docs/product/qa)\\n + [Knowledge Base](/docs/product/knowledge-base)\\n\\n - [Articles](/docs/product/articles)\\n - [Collections](/docs/product/collection)\\n + [Turing AI agent](/docs/product/conversational-bot)\\n\\n - [Best",
- "title": "Instabug | Integrate | Snap-ins | DevRev"
+ "id": "ART-1788_KNOWLEDGE_NODE-166",
+ "text": "Create.\\n\\nPOST https:// api.devrev.ai / incidents.create\\nCreates an incident.\\nRequest.\\n\\nThis endpoint expects an object.\\ntitle string Required\\nTitle of the incident.\\nacknowledged_date datetime Optional\\nTimestamp when the incident was acknowledged.\\napplies_to_parts list of strings Optional\\nParts to which the incident is applicable to.\\nartifacts list of strings Optional\\nArtifacts attached to the incident.\\nbody string Optional\\nBody of the incident.\\ncustom_fields map from strings to",
+ "title": "Get Post \u2014 DevRev | Docs"
},
{
- "id": "ART-1801_KNOWLEDGE_NODE-168",
+ "id": "ART-1803_KNOWLEDGE_NODE-167",
"text": "Create.\\n\\nPOST https:// api.devrev.ai / incidents.create\\nCreates an incident.\\nRequest.\\n\\nThis endpoint expects an object.\\ntitle string Required\\nTitle of the incident.\\nacknowledged_date datetime Optional\\nTimestamp when the incident was acknowledged.\\napplies_to_parts list of strings Optional\\nParts to which the incident is applicable to.\\nartifacts list of strings Optional\\nArtifacts attached to the incident.\\nbody string Optional\\nBody of the incident.\\ncustom_fields map from strings to",
- "title": "Get \u2014 DevRev | Docs"
+ "title": "List \u2014 DevRev | Docs"
},
{
- "id": "ART-4128_KNOWLEDGE_NODE-0",
- "text": "b'Get Incident | DevRev | Docs\\n\\n[![]()![]()](https://developer.devrev.ai/)\\n\\nBeta\\n\\nBeta\\n\\nBeta\\n\\nSearch\\n\\n`/`\\n\\n[API Reference](/beta/api-reference/accounts/create)[incidents](/beta/api-reference/incidents/create)\\n\\nGet Incident\\n============\\n\\nBeta\\n\\nCopy page\\n\\nGET\\n\\nhttps://api.devrev.ai/incidents.get\\n\\nGET\\n\\n/incidents.get\\n\\n```\\n| | |\\n| --- | --- |\\n| $ | curl -G https://api.devrev.ai/incidents.get \\\\ |\\n| > | -H \"Authorization: Bearer \" \\\\ |\\n| > | -d id=id",
- "title": "Get Incident | DevRev | Docs"
+ "id": "ART-1781_KNOWLEDGE_NODE-164",
+ "text": "Create.\\n\\nPOST https:// api.devrev.ai / incidents.create\\nCreates an incident.\\nRequest.\\n\\nThis endpoint expects an object.\\ntitle string Required\\nTitle of the incident.\\nacknowledged_date datetime Optional\\nTimestamp when the incident was acknowledged.\\napplies_to_parts list of strings Optional\\nParts to which the incident is applicable to.\\nartifacts list of strings Optional\\nArtifacts attached to the incident.\\nbody string Optional\\nBody of the incident.\\ncustom_fields map from strings to",
+ "title": "List \u2014 DevRev | Docs"
},
{
- "id": "ART-1803_KNOWLEDGE_NODE-167",
+ "id": "ART-1789_KNOWLEDGE_NODE-166",
"text": "Create.\\n\\nPOST https:// api.devrev.ai / incidents.create\\nCreates an incident.\\nRequest.\\n\\nThis endpoint expects an object.\\ntitle string Required\\nTitle of the incident.\\nacknowledged_date datetime Optional\\nTimestamp when the incident was acknowledged.\\napplies_to_parts list of strings Optional\\nParts to which the incident is applicable to.\\nartifacts list of strings Optional\\nArtifacts attached to the incident.\\nbody string Optional\\nBody of the incident.\\ncustom_fields map from strings to",
"title": "List \u2014 DevRev | Docs"
}
@@ -452,44 +452,44 @@
"query": "mark fields as readable from backend",
"retrievals": [
{
- "id": "ART-17232_KNOWLEDGE_NODE-8",
- "text": "fields |\\n\\n### Custom and stock fields transformation methods\\n\\n| Method | Description | Requirements |\\n| --- | --- | --- |\\n| `use_rich_text` | Produces a rich text field | External field must be of type `rich_text` |\\n\\n### Constructed custom fields transformation methods\\n\\n| Method | Description | Requirements |\\n| --- | --- | --- |\\n| `construct_text_field` | Produces a text field | External field must be of type text |\\n\\n### Universal transformation method\\n\\n| Method | Description |",
- "title": "Mapping reasons | DevRev | Docs"
+ "id": "ART-17219_KNOWLEDGE_NODE-28",
+ "text": "to a ticket.\\nAssigning a `reference_type` helps AirSync correctly handle such fields in case the end-user\\ndecides to filter some of the parent records out.\\n\\n[8](/airsync/metadata-extraction#define-field-attributes)\\n\\n### Define field attributes\\n\\nExternal system fields that shouldn\\xe2\\x80\\x99t be mapped in reverse should be marked as `is_read_only`.\\nDepending on their purpose, you can also mark fields as `is_indexed`, `is_identifier`, `is_filterable`,\\n`is_write_only`, etc. By default,",
+ "title": "Metadata extraction | DevRev | Docs"
},
{
- "id": "ART-17230_KNOWLEDGE_NODE-0",
- "text": "b'Rich text fields | DevRev | Docs\\n\\n[![]()![]()](https://developer.devrev.ai/)\\n\\nPublic\\n\\nPublic\\n\\nSearch\\n\\n`/`\\n\\nOn this page\\n\\n* [Rich text mentions](/airsync/data-model/rich-text-fields#rich-text-mentions)\\n* [Importing articles](/airsync/data-model/rich-text-fields#importing-articles)\\n* [Managing permissions](/airsync/data-model/rich-text-fields#managing-permissions)\\n* [Inline attachments](/airsync/data-model/rich-text-fields#inline-attachments)\\n* [Links to other",
- "title": "Rich text fields | DevRev | Docs"
+ "id": "ART-15487_KNOWLEDGE_NODE-35",
+ "text": "groupable. Requires `is_filterable` to be true.\\n* `order`: The order in which the field appears in the side panel.\\n* `is_read_only`: Whether the field is read-only in the UI. Once the object is created, this\\n field cannot be updated in the UI.\\n* `group_name`: The group title under which field(s) appear in the side panel. In the\\n example below, the fields are grouped under groups titled **Group 1** and **Group 2**.\\n\\n ![]()\\n* `unit`: The unit for the field. For example, days, kg. The",
+ "title": "Object customization | DevRev | Docs"
},
{
- "id": "ART-15510_KNOWLEDGE_NODE-17",
- "text": "server. Input views such as password text fields are automatically masked.\\n\\nWhile the auto-masking feature is sufficient for most situations, you can manually mark or unmark additional views as sensitive.\\n\\nTo mark elements as sensitive inside a web view (`WebView`), apply the `devrev-mask` CSS class. To unmark them, use `devrev-unmask`.\\n\\n* Mark an element as masked:\\n\\n ```\\n | | |\\n | --- | --- |\\n | 1 | |\\n ```\\n* Mark an element as",
- "title": "Features | DevRev | Docs"
+ "id": "ART-1645_KNOWLEDGE_NODE-37",
+ "text": "`is_filterable` to be true.\\n\\n * `is_groupable`: Whether the field is groupable. Requires `is_filterable` to be true.\\n\\n * `order`: The order in which the field appears in the side panel.\\n\\n * `is_read_only`: Whether the field is read-only in the UI. Once the object is created, this field cannot be updated in the UI.\\n\\n * `group_name`: The group title under which field(s) appear in the side panel. In the example below, the fields are grouped under groups titled **Group 1** and **Group",
+ "title": "Object customization (Beta) \u2014 DevRev | Docs"
},
{
- "id": "ART-17230_KNOWLEDGE_NODE-5",
- "text": "about products, services, and processes.\\nThey support both Markdown and HTML formats.\\n\\nArticles can include mentions to artifacts and other articles. Inline attachments must map to artifacts,\\nand article links must map to articles.\\n\\n### Managing permissions\\n\\nArticle permissions are managed through the `shared_with` field, which can reference users, groups, and platform groups.\\nRefer to the [permissions](/public/airsync/data-model/permissions) for more details.\\n\\n### Inline",
- "title": "Rich text fields | DevRev | Docs"
+ "id": "ART-17219_KNOWLEDGE_NODE-23",
+ "text": "fields\\xe2\\x80\\x99 set of possible values can often be customizable.\\nA good practice is to retrieve the set of possible values for all enum fields from the external\\nsystem\\xe2\\x80\\x99s APIs in each sync run. You can mark specific enum values as deprecated using the `is_deprecated` property.\\n\\n**`ID` (primary key) of the record, `created_date`, and `modified_date` must not be declared.**\\n\\nExample:\\n\\n```\\n| | |\\n| --- | --- |\\n| 1 | { |\\n| 2 | \"schema_version\": \"v0.2.0\", |\\n| 3 |",
+ "title": "Metadata extraction | DevRev | Docs"
},
{
- "id": "ART-17230_KNOWLEDGE_NODE-14",
- "text": "\\xe2\\x80\\x9cdocuments\\xe2\\x80\\x9d).\\nThe platform replaces the mention with the corresponding DevRev article ID and adds the appropriate href attribute.\\n\\nWas this page helpful?\\n\\nYesNo\\n\\n[Previous](/airsync/supported-object-types)[#### Permissions\\n\\nNext](/airsync/data-model/permissions)[Built with](https://buildwithfern.com/?utm_campaign=buildWith&utm_medium=docs&utm_source=developer.devrev.ai)'",
+ "id": "ART-17230_KNOWLEDGE_NODE-5",
+ "text": "about products, services, and processes.\\nThey support both Markdown and HTML formats.\\n\\nArticles can include mentions to artifacts and other articles. Inline attachments must map to artifacts,\\nand article links must map to articles.\\n\\n### Managing permissions\\n\\nArticle permissions are managed through the `shared_with` field, which can reference users, groups, and platform groups.\\nRefer to the [permissions](/public/airsync/data-model/permissions) for more details.\\n\\n### Inline",
"title": "Rich text fields | DevRev | Docs"
},
{
- "id": "ART-12453_KNOWLEDGE_NODE-23",
- "text": "provides an auto-masking feature that masks data before sending to the server. Input views such as text fields, text views, and web views are automatically masked.\\n\\nWhile the auto-masking feature may be sufficient for most situations, you can manually mark additional views as sensitive using the following method:\\n\\n[code]\\n\\n 1| DevRev.markSensitiveViews(_:) \\n ---|---\\n[/code] \\n \\nIf any previously masked views need to be unmasked, you can use the following method:\\n\\n[code]\\n\\n",
- "title": "Features \u2014 DevRev | Docs"
+ "id": "ART-1290_KNOWLEDGE_NODE-167",
+ "text": "is generated.\\n\\nInherited from [Hideable](/snapin-development/references/snapkit#hideable):\\n\\n* `hidden` (optional): Indicates whether the element is hidden. You can use this to pass values to the backend without showing them to the user.\\n\\n**Allowed element types**\\n\\n* [Input](/snapin-development/references/snapkit#input)\\n* [Checkboxes](/snapin-development/references/snapkit#checkboxes)\\n* [Radio buttons](/snapin-development/references/snapkit#radio-buttons)\\n* [Static",
+ "title": "Snapkit | DevRev | Docs"
},
{
- "id": "ART-12456_KNOWLEDGE_NODE-18",
- "text": "protect sensitive data, the DevRev SDK provides an auto-masking feature that masks data before sending to the server. Input views such as text fields, text views, and web views are automatically masked.\\n\\nWhile the auto-masking feature may be sufficient for most situations, you can manually mark additional views as sensitive using the following method:\\n\\n[code]\\n\\n 1| DevRev.markSensitiveViews(tags: any[]) \\n ---|---\\n[/code] \\n \\nIf any previously masked views need to be unmasked,",
- "title": "Features \u2014 DevRev | Docs"
+ "id": "ART-16579_KNOWLEDGE_NODE-32",
+ "text": "\"foo-bar\"), |\\n| 4 | ), |\\n| 5 | ) |\\n```\\n\\n### Mask elements inside web views\\n\\nInput views such as password text fields are automatically masked in web views.\\n\\nTo mark elements as sensitive inside a web view (`WebView`), apply the `devrev-mask` CSS class. To unmark them, use `devrev-unmask`.\\n\\n* Mark an element as masked:\\n\\n ```\\n | | |\\n | --- | --- |\\n | 1 | |\\n ```\\n* Mark an element as unmasked:\\n\\n ```\\n | | |\\n | --- | ---",
+ "title": "Features | DevRev | Docs"
},
{
- "id": "ART-17230_KNOWLEDGE_NODE-7",
- "text": "src=\"don:core:dvrv-us-1:devo/0:artifact/1\" alt=\"Alt Text\"/> |\\n```\\n\\nThe following Markdown example shows an inline attachment:\\n\\n```\\n| | |\\n| --- | --- |\\n| 1 |  |\\n```\\n\\nLet\\xe2\\x80\\x99s say the content of your external system looks like this:\\n\\n```\\n| | |\\n| --- | --- |\\n| 1 |
|\\n| 2 | This is an article with one image. |\\n| 3 |
|\\n| 4 |
|\\n| 5 | OTP: 12345 |\\n ```\\n* Mark an element as",
+ "title": "Features | DevRev | Docs"
},
{
"id": "ART-17230_KNOWLEDGE_NODE-1",
@@ -497,8 +497,8 @@
"title": "Rich text fields | DevRev | Docs"
},
{
- "id": "ART-15513_KNOWLEDGE_NODE-36",
- "text": "Input views such as text fields, text views, and web views are automatically masked.\\n\\nWhile the auto-masking feature may be sufficient for most situations, you can manually mark/unmark additional views as sensitive.\\n\\nThe SDK provides two approaches to manually mask or unmask your views, using a set of predefined tags or using the API methods.\\n\\n#### Mask using predefined tags\\n\\n##### \\n\\nUse the tag method only when you don\\xe2\\x80\\x99t have any other tag already applied to your UI",
+ "id": "ART-15507_KNOWLEDGE_NODE-37",
+ "text": "DevRev.setInScreenTransitioning(true) |\\n| 3 | |\\n| 4 | // Mark the transition as ended. |\\n| 5 | DevRev.setInScreenTransitioning(false) |\\n```\\n\\nPush notifications\\n------------------\\n\\nYou can configure your app to receive push notifications from the DevRev SDK. The SDK is able to handle push notifications and execute actions based on the notification\\xe2\\x80\\x99s content.\\n\\nThe DevRev backend sends push notifications to your app to notify users about new messages in the Plug support",
"title": "Features | DevRev | Docs"
}
]
@@ -513,48 +513,48 @@
"title": "Turing AI agent | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1987_KNOWLEDGE_NODE-24",
- "text": "(Beta)](#goaloriented-mode-beta)\\n\\n1. [Documentation](/docs)\\n3. [Computer for Support Teams](/docs/product/support)\\n[Turing AI agent](/docs/product/conversational-bot)\\n\\nComputer for Your Customers and Turing\\n======================================\\n\\nUsing Turing, Computer can be used to deflect user queries in conversation or to suggest articles from your knowledge base for resolving tickets. It will try to answer customer queries based on the articles and QA pairs provided in the",
+ "id": "ART-1987_KNOWLEDGE_NODE-27",
+ "text": "automatically replies to the user query before it gets assigned to support. It goes through the knowledge base (articles and QAs), generates an answer, and checks with the user if the answer is useful or not.\\n\\n* If Computer doesn't understand the query, it gives the user an option to rephrase the question and ask again.\\n* If the user marks the answer as useful, Computer asks the user if they have more questions, then resolves the conversation.\\n* If the user marks the answer as not useful,",
"title": "Turing AI agent | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1987_KNOWLEDGE_NODE-28",
- "text": "Computer either creates a ticket or routes the conversation using the relevant routing rule.\\n\\n![]()\\n\\nGoal-oriented mode (Beta)\\n-------------------------\\n\\nThe goal-oriented agent allows users to create complete workflows triggered by their actions.\\n\\nGoal-oriented mode is currently in beta. Contact our support team for more information.\\n\\n[PreviousCollections](/docs/product/collection)[NextBest practices for documentation that supports AI](/docs/product/writing-bp)\\n\\n#### On this",
+ "id": "ART-1987_KNOWLEDGE_NODE-25",
+ "text": "Knowledge base, while keeping a support agent subscribed to conversations. If it cannot answer a certain query or you request it to connect to the team, it will redirect it to the default owner of the conversation.\\n\\nWhen looking for a source to inform its answer, it will prioritize the QA pairs, which are intended to serve as definitive answers to commonly repeated questions.\\n\\n![]()\\n\\nFor Computer to suggest articles, you need to add articles to your DevRev instance. Refer to",
"title": "Turing AI agent | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1987_KNOWLEDGE_NODE-23",
- "text": "2025](/docs/changelog/_2025-06-01)\\n + [May 2025](/docs/changelog/_2025-05-01)\\n + [March and April 2025](/docs/changelog/_2025-04-01)\\n + [February 2025](/docs/changelog/_2025-02-01)\\n* [Developer \\xe2\\x86\\x97\\xef\\xb8\\x8f](https://developer.devrev.ai/)\\n* [DevRevU \\xe2\\x86\\x97\\xef\\xb8\\x8f](/docs/DevRevU)\\n\\n + [Product demos](/docs/DevRevU/demos)\\n\\nOn this page\\n\\n* [Suggest-only mode](#suggestonly-mode)\\n* [Content-powered mode](#contentpowered-mode)\\n* [Goal-oriented mode",
+ "id": "ART-1987_KNOWLEDGE_NODE-28",
+ "text": "Computer either creates a ticket or routes the conversation using the relevant routing rule.\\n\\n![]()\\n\\nGoal-oriented mode (Beta)\\n-------------------------\\n\\nThe goal-oriented agent allows users to create complete workflows triggered by their actions.\\n\\nGoal-oriented mode is currently in beta. Contact our support team for more information.\\n\\n[PreviousCollections](/docs/product/collection)[NextBest practices for documentation that supports AI](/docs/product/writing-bp)\\n\\n#### On this",
"title": "Turing AI agent | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1987_KNOWLEDGE_NODE-0",
- "text": "b\"Turing AI agent | Computer for Support Teams | DevRev\\n\\n* Computer\\n* Resources\\n* [Our Customers](/case-study)\\n\\n[Login](https://app.devrev.ai/login)[Book a demo](/request-a-demo)\\n\\nComputer\\n\\nResources\\n\\n[Our Customers](/case-study)\\n\\n[Login](https://app.devrev.ai/login)[Book a demo](/request-a-demo)\\n\\nSearch\\n\\n`CMD`\\xc2\\xa0+\\xc2\\xa0`K`\\n\\n* [Introduction](/docs)\\n* [Computer by DevRev](/docs/intro)\\n\\n + [Core concepts](/docs/product/core)\\n + [Apps](/docs/product/apps)\\n +",
+ "id": "ART-1987_KNOWLEDGE_NODE-16",
+ "text": "+ [Integrate](/docs/integrate)\\n\\n - [Bitbucket](/docs/integrations/bitbucket)\\n - [Calendly](/docs/integrations/calendly)\\n - [Coralogix security integration](/docs/integrations/coralogix)\\n - [Datadog](/docs/integrations/datadog)\\n - [Google Calendar AirSync](/docs/integrations/google-calendar-airdrop)\\n - [Email](/docs/integrations/email)\\n\\n * [Email snap-in configuration](/docs/integrations/email-config)\\n - [Exotel](/docs/integrations/exotel)\\n -",
"title": "Turing AI agent | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1987_KNOWLEDGE_NODE-12",
- "text": "Node](/docs/automations/search-node)\\n - [Sentiment evaluator](/docs/automations/sentiment-evaluator)\\n - [Subtype Migration](/docs/automations/subtype-migration)\\n - [Real-time sentiment evaluator](/docs/automations/realtime-sentiment-evaluator)\\n - [Send customized emails](/docs/automations/send-emails)\\n - [StageFlow automator](/docs/automations/stageflow-automator)\\n - [Smart issue creator](/docs/automations/smart-issue-creator)\\n - [Set user preference for",
+ "id": "ART-1987_KNOWLEDGE_NODE-24",
+ "text": "(Beta)](#goaloriented-mode-beta)\\n\\n1. [Documentation](/docs)\\n3. [Computer for Support Teams](/docs/product/support)\\n[Turing AI agent](/docs/product/conversational-bot)\\n\\nComputer for Your Customers and Turing\\n======================================\\n\\nUsing Turing, Computer can be used to deflect user queries in conversation or to suggest articles from your knowledge base for resolving tickets. It will try to answer customer queries based on the articles and QA pairs provided in the",
"title": "Turing AI agent | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1987_KNOWLEDGE_NODE-29",
- "text": "page\\n\\n* [Suggest-only mode](#suggestonly-mode)\\n* [Content-powered mode](#contentpowered-mode)\\n* [Goal-oriented mode (Beta)](#goaloriented-mode-beta)\\n\\n[Enterprise grade security to protect customer data\\n\\nLearn more about it.\\n\\n![]()](/blog/soc-compliance)\\n\\nComputer\\n\\n* [Meet Computer](/meet-computer)\\n* [How Computer works](/how-computer-works)\\n\\nApps\\n\\n* [For Support Teams](/for-support-teams)\\n* [For Builders](/for-builders)\\n* [For Customers](/for-customers)\\n* [For User",
+ "id": "ART-1987_KNOWLEDGE_NODE-7",
+ "text": "[Roadmap](/docs/product/roadmap)\\n + [Build best practices](/docs/product/build-bp)\\n + [Build snap-ins](/docs/product/snapins-build)\\n* [Computer for Your Customers](/docs/plug)\\n\\n + [Plug widget customization](/docs/plug/customize)\\n + [Session analytics](/docs/plug/session-analytics-intro)\\n\\n - [Computer for User Insights](/docs/plug/observability)\\n - [Session recording options](/docs/plug/session-recording)\\n - [Cross-domain session",
"title": "Turing AI agent | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1987_KNOWLEDGE_NODE-25",
- "text": "Knowledge base, while keeping a support agent subscribed to conversations. If it cannot answer a certain query or you request it to connect to the team, it will redirect it to the default owner of the conversation.\\n\\nWhen looking for a source to inform its answer, it will prioritize the QA pairs, which are intended to serve as definitive answers to commonly repeated questions.\\n\\n![]()\\n\\nFor Computer to suggest articles, you need to add articles to your DevRev instance. Refer to",
- "title": "Turing AI agent | Computer for Support Teams | DevRev"
+ "id": "ART-1984_KNOWLEDGE_NODE-17",
+ "text": "AirSync](/docs/integrations/google-calendar-airdrop)\\n - [Email](/docs/integrations/email)\\n\\n * [Email snap-in configuration](/docs/integrations/email-config)\\n - [Exotel](/docs/integrations/exotel)\\n - [Slack](/docs/integrations/slack)\\n - [WhatsApp](/docs/integrations/whatsapp)\\n - [GitHub](/docs/integrations/github)\\n - [GitLab](/docs/integrations/gitlab)\\n - [Harness](/docs/integrations/harness)\\n - [Marker.io](/docs/integrations/marker-io)\\n -",
+ "title": "Best practices for documentation that supports AI | Turing AI agent | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1987_KNOWLEDGE_NODE-31",
- "text": "Program](/partners)\\n* [Startups Program](/startups)\\n* [Gr.ai.ce](/graice)\\n\\n* [Security](https://security.devrev.ai/)\\n* [SLA](/legal/sla)\\n* [DPA](/legal/dpa)\\n* [Subprocessors](/security/sub-processors)\\n* [Cookie Policy](/legal/cookie-policy)\\n* [Privacy Policy](/legal/privacy-policy)\\n* [Terms of Service](/legal/terms-of-service)\\n\\n[System Status](/status)\\n\\n\\xc2\\xa9 2025 DevRev Inc.\\n\\n![]()\"",
+ "id": "ART-1987_KNOWLEDGE_NODE-3",
+ "text": "- [Workflow nodes](/docs/product/workflow-nodes)\\n - [Troubleshooting](/docs/product/troubleshooting-workflows)\\n + [Templates](/docs/product/template)\\n + [Accessing DevRev](/docs/product/ui)\\n + [External identity provider setup](/docs/product/sso-saml)\\n + [Remote MCP server](/docs/product/remote-mcp)\\n* [Computer for Support Teams](/docs/product/support)\\n\\n + [Inbox](/docs/product/inbox)\\n + [Support analytics](/docs/product/support-analytics)\\n\\n - [Conversation",
"title": "Turing AI agent | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1987_KNOWLEDGE_NODE-30",
- "text": "Insights](/for-user-insights)\\n* [Marketplace](https://marketplace.devrev.ai/)\\n\\nResources\\n\\n* [Blog](/blog)\\n* [Our Customers](/case-study)\\n* [Snap-In Extensions](https://developer.devrev.ai/public/snapin-development/concepts)\\n* [DevRevU training](/docs/DevRevU)\\n* [Documentation](https://docs.devrev.ai/)\\n* [API References](https://docs.devrev.ai/api/)\\n\\nCompany\\n\\n* [About](/about)\\n* [Events](/events)\\n* [Careers](/careers)\\n* [What Why How](/what-why-how)\\n\\nInitiatives\\n\\n* [Partner",
+ "id": "ART-1987_KNOWLEDGE_NODE-6",
+ "text": "practices for documentation that supports AI](/docs/product/writing-bp)\\n + [Commands](/docs/product/commands)\\n + [Service-level agreement](/docs/product/sla)\\n + [Operational-level agreement](/docs/product/ola)\\n + [Support snap-ins](/docs/product/snapins-support)\\n* [Computer for Builders](/docs/product/build)\\n\\n + [Issues](/docs/product/issues)\\n + [Now, Next, Later](/docs/product/nnl)\\n + [Sprint mode](/docs/product/sprint)\\n + [Enhancements](/docs/product/enhancements)\\n +",
"title": "Turing AI agent | Computer for Support Teams | DevRev"
}
]
@@ -564,54 +564,54 @@
"query": "how to make MIS report with available data on DevRev",
"retrievals": [
{
- "id": "ART-1963_KNOWLEDGE_NODE-15",
- "text": "[Custom field migration](/docs/automations/custom-field-migration)\\n - [Slack scraper](/docs/automations/slack-scraper)\\n - [Slack Broadcaster](/docs/automations/slack-broadcaster)\\n - [Reported by enricher](/docs/automations/ticket-reported-by)\\n - [Ticket approval workflow](/docs/automations/ticket-approval-workflow)\\n - [Ticket linked issues comment sync](/docs/automations/ticket-linked-issues-comment-sync)\\n - [Slack message agent](/docs/automations/slack-message-agent)\\n",
- "title": "Accessing DevRev | Computer by DevRev | DevRev"
+ "id": "ART-1952_KNOWLEDGE_NODE-27",
+ "text": "bring in data from other sources as well.\\n\\nDiscover\\n--------\\n\\nTo get started, click the \\xe2\\x9a\\xa1 button on a vista. The following options are available:\\n\\n* Create New Report\\n* View Past Reports: Created by me or shared with me\\n\\nYou can also search for reports and find more on the **Explore** page.\\n\\n![]()\\n\\n### Create\\n\\nYou can create your own reports by adding a name, description, and creating widgets. Here, you'll also be able to preview your report and make any necessary",
+ "title": "Vista Reports | Vistas | Computer by DevRev | DevRev"
},
{
- "id": "ART-1963_KNOWLEDGE_NODE-4",
- "text": "insights](/docs/dashboards/conversation-insights)\\n - [Conversation-SLA Analytics](/docs/dashboards/conversation-sla-analytics)\\n - [Conversation-Team Performance](/docs/dashboards/conversation-team-performance)\\n - [Ticket insights](/docs/dashboards/ticket-insights)\\n - [Ticket-SLA Analytics](/docs/dashboards/ticket-sla-analytics)\\n - [Ticket-Team Performance](/docs/dashboards/ticket-team-performance)\\n + [Conversations](/docs/product/conversation)\\n\\n - [Conversation to",
- "title": "Accessing DevRev | Computer by DevRev | DevRev"
+ "id": "ART-4272_KNOWLEDGE_NODE-30",
+ "text": "report\\n\\nAccess detailed information about the initial import and any subsequent syncs performed.\\n\\n* Delete import\\n\\nRemove the import and all data imported from OneDrive into DevRev.\\n\\n* Edit connection\\n\\nChange the connection used for subsequent actions. This is useful if a connection becomes inactive or the user who established it is no longer available.\\n\\nSync to DevRev\\n--------------\\n\\nAfter a successful import from OneDrive, you can choose to sync the imported data with DevRev.",
+ "title": "OneDrive AirSync | AirSync | Snap-ins | DevRev"
},
{
- "id": "ART-2046_KNOWLEDGE_NODE-15",
- "text": "[Operational SLA Metrics](/docs/automations/operational-sla-metrics)\\n - [Custom field migration](/docs/automations/custom-field-migration)\\n - [Slack scraper](/docs/automations/slack-scraper)\\n - [Slack Broadcaster](/docs/automations/slack-broadcaster)\\n - [Reported by enricher](/docs/automations/ticket-reported-by)\\n - [Ticket approval workflow](/docs/automations/ticket-approval-workflow)\\n - [Ticket linked issues comment",
- "title": "DevRev for Jira app | Jira Software AirSync | AirSync | Snap-ins | DevRev"
+ "id": "ART-4966_KNOWLEDGE_NODE-28",
+ "text": "of available sync units, select the project you want to import and specify the DevRev part to use for the imported content.\\n 11. After extraction, you are prompted to map fields via the UI. Once done, the data is transformed and loaded into DevRev.\\n\\nThe import duration depends on the size of your Zoho Projects data. Projects with a few dozen items import quickly, while large projects may take hours. DevRev honors Zoho API rate limits and automatically resumes if interrupted.\\n\\n## Post",
+ "title": "Zoho Projects Airdrop | Airdrop | Snap-ins | DevRev"
},
{
- "id": "ART-15792_KNOWLEDGE_NODE-9",
- "text": "information sharing and reporting by converging support, product and user data in one shared view.\\n\\nAutomated knowledge base management: AI agents remember successful resolutions and instantly apply them to future issues, reducing customer wait time.\\n\\nSource: [DevRev Support](https://devrev.ai/support)BuildWhat is DevRev Build?\\n\\nDevRev Build is a full-featured product development platform built for modern businesses and trusted by leading organizations\\n\\nKey Features:\\n\\nAuto-generate",
- "title": "DevRev Products and Agents"
+ "id": "ART-4275_KNOWLEDGE_NODE-32",
+ "text": "Google Docs with the corresponding items previously imported into DevRev. It also creates new items in DevRev for any document in Google Docs after the last sync or import.\\n* View Report\\n\\n This option allows you to access detailed information about the initial import and any subsequent syncs performed.\\n* Delete Import\\n\\n If you want to remove the import and all data that were imported from Google Docs into DevRev, you can use this option.\\n* Edit Connection\\n\\n Use this option to change",
+ "title": "Google Docs | AirSync | Snap-ins | DevRev"
},
{
- "id": "ART-1952_KNOWLEDGE_NODE-27",
- "text": "bring in data from other sources as well.\\n\\nDiscover\\n--------\\n\\nTo get started, click the \\xe2\\x9a\\xa1 button on a vista. The following options are available:\\n\\n* Create New Report\\n* View Past Reports: Created by me or shared with me\\n\\nYou can also search for reports and find more on the **Explore** page.\\n\\n![]()\\n\\n### Create\\n\\nYou can create your own reports by adding a name, description, and creating widgets. Here, you'll also be able to preview your report and make any necessary",
- "title": "Vista Reports | Vistas | Computer by DevRev | DevRev"
+ "id": "ART-4215_KNOWLEDGE_NODE-35",
+ "text": "Notion with corresponding items in DevRev. New\\nitems created in Notion after the last sync are also imported.\\n\\n### \\xf0\\x9f\\x93\\x8a View Report\\n\\nAccess a report of the initial import and any subsequent syncs.\\n\\n### \\xf0\\x9f\\x97\\x91\\xef\\xb8\\x8f Delete Import\\n\\nRemove all imported data from DevRev.\\n\\n### \\xe2\\x9a\\x99\\xef\\xb8\\x8f Edit Connection\\n\\nUpdate the connection used for syncing or importing.\\n\\n---\\n\\n### Sync to DevRev\\n\\nTo perform a one-time sync:\\n\\n1. Go to **Settings** >",
+ "title": "Notion AirSync | AirSync | Snap-ins | DevRev"
},
{
- "id": "ART-3208_KNOWLEDGE_NODE-31",
- "text": "Select the import you want to view.\\n3. Select the context menu (\\xe2\\x8b\\xae) > **View Report**.\\n\\n### Periodic sync\\n\\nAfter successfully importing to DevRev, you have the option to enable a periodic sync. This allows for automatic synchronization with DevRev on a regular basis. By default, the sync occurs once an hour.\\n\\nTo configure periodic sync, follow these steps:\\n\\n1. Go to **Settings** > **Integrations** > **AirSyncs**.\\n2. Locate the previously imported project.\\n3. Select the",
- "title": "DevRev AirSync | AirSync | Snap-ins | DevRev"
+ "id": "ART-17215_KNOWLEDGE_NODE-7",
+ "text": "to be imported to DevRev. At this point, the DevRev app prompts the user to select an external sync unit from the list.\\n3. The snap-in then extracts data from the external system.\\n4. Afterwards, the DevRev app requests the mapping of data from the external system to DevRev. The user can decide which fields from each system should match.\\n5. Once mapping is complete, the snap-in saves the data to DevRev.\\n6. Finally, the snap-in streams any possible attachments from the external system to",
+ "title": "Local development | DevRev | Docs"
},
{
- "id": "ART-2046_KNOWLEDGE_NODE-4",
- "text": "analytics](/docs/product/support-analytics)\\n\\n - [Conversation insights](/docs/dashboards/conversation-insights)\\n - [Conversation-SLA Analytics](/docs/dashboards/conversation-sla-analytics)\\n - [Conversation-Team Performance](/docs/dashboards/conversation-team-performance)\\n - [Ticket insights](/docs/dashboards/ticket-insights)\\n - [Ticket-SLA Analytics](/docs/dashboards/ticket-sla-analytics)\\n - [Ticket-Team Performance](/docs/dashboards/ticket-team-performance)\\n +",
- "title": "DevRev for Jira app | Jira Software AirSync | AirSync | Snap-ins | DevRev"
+ "id": "ART-16263_KNOWLEDGE_NODE-35",
+ "text": "import, you can:\\n\\n### \\xf0\\x9f\\x94\\x81 Sync to DevRev\\n\\nPush updates or new content from Confluence into DevRev:\\n\\n* Go to **Settings** > **Integrations** > **AirSyncs**.\\n* Find the imported space.\\n* Click **\\xe2\\x87\\x86 > \\xe2\\x87\\xbe From Confluence to DevRev**.\\n\\n> \\xe2\\x9a\\xa0\\xef\\xb8\\x8f A sync may overwrite any edits made in DevRev to previously imported items.\\n\\n### \\xf0\\x9f\\x93\\x84 View report\\n\\nAccess a detailed report of the initial import and any subsequent syncs.\\n\\n###",
+ "title": "Confluence Datacenter AirSync | AirSync | Snap-ins | DevRev"
},
{
- "id": "ART-738_KNOWLEDGE_NODE-8",
- "text": "purchase a product, you consider the need, cost, runway, future needs, etc.\\n\\nNow, say you want to prioritize which work you should focus on and deliver in the next sprint. You\\xe2\\x80\\x99d need information about other items in-flight, staff workload, customer impact of items, dependent opportunities, and a lot of additional data.\\n\\nWith DevRev, we have the full context and can use that to feed into the models. With the other point systems, you\\xe2\\x80\\x99d need to consolidate somewhere",
- "title": "DevRev | Built for AI (not by AI... yet)"
+ "id": "ART-16615_KNOWLEDGE_NODE-32",
+ "text": "when working with sparse data distributions.\\n\\n[PreviousVista Reports](/docs/product/vista-reports)[NextTasks](/docs/product/tasks)\\n\\n#### On this page\\n\\n* [How to use it](#how-to-use-it)\\n* [Set up your board](#set-up-your-board)\\n* [Work with Cards](#work-with-cards)\\n* [Customize your view](#customize-your-view)\\n* [Best practices](#best-practices)\\n\\n[Enterprise grade security to protect customer data\\n\\nLearn more about it.\\n\\n![]()](/blog/soc-compliance)\\n\\nComputer\\n\\n* [Meet",
+ "title": "Board view | Vistas | Computer by DevRev | DevRev"
},
{
- "id": "ART-15687_KNOWLEDGE_NODE-26",
- "text": "For example, to find opportunities data, search for opportunity and select the dim\\\\_opportunity dataset.\\n4. Write a SQL query and run it.\\n\\nTesting your query in Notebook ensures you have the correct dataset for your visualization.\\n\\n* **Access the widget builder**:\\n\\nGo to the widget builder by modifying your DevRev workspace URL. For example, your\\\\_workspace\\\\_slug/widget-preview.\\nThe builder provides a boilerplate code that you can modify.\\n\\n![]()\\n\\n* **Define your dataset (Oasis",
- "title": "Dashboards | Computer by DevRev | DevRev"
+ "id": "ART-2044_KNOWLEDGE_NODE-27",
+ "text": "ITSM/CSM to DevRev, you can choose to\\nimport your ServiceNow data into DevRev. The import is a 1-time bulk import of\\nyour ServiceNow data into DevRev. Once this import is complete, several options\\nare made available for that project.\\n\\n![]()\\n\\nFor best results, AirSyncs should be done using an administrator account on the external source. This ensures all necessary permissions are available to complete the import successfully.\\n\\nTo import from ServiceNow, navigate to **Settings** >",
+ "title": "ServiceNow AirSync | AirSync | Snap-ins | DevRev"
},
{
- "id": "ART-15792_KNOWLEDGE_NODE-11",
- "text": "to maintain visibility of resource allocation even as you scale\\n\\nProduct 360 Analytics: Enhance customer experience, product velocity, and developer productivity with robust Product 360 analytics\\n\\nCustomer-focused Development: Make development customer-focused with sprints that adapt to customer requirements\\n\\nSource: [DevRev Build](https://devrev.ai/build)User ObservabilityWhat is DevRev User Observability?\\n\\nDevRev User Observability helps you gain a clear window into your user journeys",
- "title": "DevRev Products and Agents"
+ "id": "ART-16192_KNOWLEDGE_NODE-32",
+ "text": "options available for the imported account:\\n\\n* Sync to DevRev\\n\\n This option allows you to synchronize any modifications made in ServiceNow KB with the corresponding items previously imported into DevRev. It also creates new items in DevRev for any new item or article created in ServiceNow KB after the last sync or import.\\n* View Report\\n\\n This option allows you to access detailed information about the initial import and any subsequent syncs performed.\\n* Delete Import\\n\\n If you want",
+ "title": "ServiceNow KB AirSync | AirSync | Snap-ins | DevRev"
}
]
},
@@ -624,15 +624,25 @@
"text": "objects of type\\n **Issue** or **Ticket** are created in DevRev.\\n2. **Text command**: This manual trigger is achieved by utilizing a slash\\n command in the **Discussions** tab of the objects that support this feature.\\n\\n#### Action\\n\\nTo implement the desired action of adding a comment to the object timeline, it\\nis essential to identify the appropriate [API]\\nfor this task. In this scenario, the `/timeline-entries.create` API is the\\ndesignated choice for executing the action of adding a",
"title": "Snap-in triggered by a DevRev event | DevRev | Docs"
},
+ {
+ "id": "ART-1485_KNOWLEDGE_NODE-10",
+ "text": "invoke the snap-in, two distinct triggers are implemented:\\n\\n 1. **Creation of work item** : This trigger is activated when new objects of type **Issue** or **Ticket** are created in DevRev.\\n\\n 2. **Text command** : This manual trigger is achieved by utilizing a slash command in the **Discussions** tab of the objects that support this feature.\\n\\n#### Action\\n\\nTo implement the desired action of adding a comment to the object timeline, it is essential to identify the appropriate [API] for",
+ "title": "Snap-in triggered by a DevRev event \u2014 DevRev | Docs"
+ },
{
"id": "ART-1265_KNOWLEDGE_NODE-9",
"text": "timeline of an issue/ticket using the `timeline-entries.create` API with different visibilities. You can now use this to create comments on timeline using automation or manually based on your use case.\\n\\nWas this page helpful?\\n\\nYesNo\\n\\n[Previous](/guides/webhooks)[#### Object customization\\n\\nNext](/guides/object-customization)[Built with](https://buildwithfern.com/?utm_campaign=buildWith&utm_medium=docs&utm_source=developer.devrev.ai)\\n\\n![]()'",
"title": "Restricted messages on a timeline | DevRev | Docs"
},
{
- "id": "ART-1425_KNOWLEDGE_NODE-2",
- "text": "id=don:core:dvrv-us-1:devo/example:ticket/123:comment/comment-id\\n[/code] \\n \\nTry it\\n\\n200getExample\\n\\n[code]\\n\\n 1| { \\n ---|--- \\n 2| \"timeline_entry\": { \\n 3| \"created_by\": { \\n 4| \"display_id\": \"foo\", \\n 5| \"id\": \"foo\", \\n 6| \"display_name\": \"foo\", \\n 7| \"display_picture\": { \\n 8| \"display_id\": \"foo\", \\n 9| \"id\": \"foo\", \\n 10| \"file\": { \\n 11| \"type\": \"foo\", \\n 12|",
- "title": "Get Timeline Entry \u2014 DevRev | Docs"
+ "id": "ART-1471_KNOWLEDGE_NODE-1",
+ "text": "timeline of an object by using the `timeline-entries-create` API. These messages are only visible to the specific users you give access to.\\n\\nThe [timeline entries](/public/api-reference/timeline-entries/create) API is used to create discussions (comments) on the timeline of an object such as a ticket or issue. These messages can be sent by users or by a bot. You can use this to send any information about a customer like their last logged in date and time, the last page they visited, or an",
+ "title": "Restricted messages on a timeline \u2014 DevRev | Docs"
+ },
+ {
+ "id": "ART-1485_KNOWLEDGE_NODE-19",
+ "text": "comment on a DevRev work item created. \\n 5| - name: function_2 \\n 6| description: \\n 7| Function to create a timeline entry comment on a DevRev work item on which \\n 8| comment is added.\\n[/code] \\n \\n[6](/public/snapin-development/tutorials/triggered-event#automations)\\n\\n### Automations\\n\\nWith the building blocks in place, the final piece of the puzzle involves defining automations. These automations encapsulate a trigger and a corresponding function that",
+ "title": "Snap-in triggered by a DevRev event \u2014 DevRev | Docs"
},
{
"id": "ART-1471_KNOWLEDGE_NODE-9",
@@ -640,34 +650,24 @@
"title": "Restricted messages on a timeline \u2014 DevRev | Docs"
},
{
- "id": "ART-4184_KNOWLEDGE_NODE-28",
- "text": "relationships.\\n\\n![]()\\n\\n* Comments synchronize only between directly linked items.\\n* Editing a comment after synchronization does not update the synchronized copies.\\n* Ticket threads are not fully supported yet. DevRev supports only one level of nesting; threaded comments in tickets are supported as flat items.\\n\\n[PreviousTicket approval workflow](/docs/automations/ticket-approval-workflow)[NextSlack message agent](/docs/automations/slack-message-agent)\\n\\n#### On this page\\n\\n* [Key",
- "title": "Ticket linked issues comment sync | Automate | Snap-ins | DevRev"
+ "id": "ART-1473_KNOWLEDGE_NODE-25",
+ "text": "append the commit message to the body of the comment \\n 18| let bodyComment = \"\"; \\n 19| for (const commit of commits) { \\n 20| bodyComment += commit.message + \"\\\\n\"; \\n 21| } \\n 22| \\n 23| // Prepare the body for creating a timeline comment \\n 24| const body = { \\n 25| body: bodyComment, \\n 26| object: partID, \\n 27| type: \"timeline_comment\", \\n 28| }; \\n 29| \\n 30| // Create a timeline comment using the DevRev",
+ "title": "Snap-in triggered by an external source \u2014 DevRev | Docs"
},
{
- "id": "ART-1227_KNOWLEDGE_NODE-6",
- "text": "|\\n```\\n\\nCreates a new entry on an object\\'s timeline.\\n\\n### Headers\\n\\nAuthorizationstringRequired\\n\\nBearer authentication of the form `Bearer `, where token is your auth token.\\n\\n### Request\\n\\nThis endpoint expects an object.\\n\\ntimeline\\\\_commentobjectRequired\\n\\nShow 9 properties\\n\\n### Response\\n\\nThe response to creating a timeline entry for an object.\\n\\ntimeline\\\\_entryobject\\n\\nShow 1 variants\\n\\n### Errors\\n\\n400\\n\\nBad Request Error\\n\\n401\\n\\nUnauthorized",
- "title": "Create Timeline Entry | DevRev | Docs"
+ "id": "ART-1265_KNOWLEDGE_NODE-1",
+ "text": "page\\n\\nIntroduction\\n------------\\n\\nIn this tutorial, you\\xe2\\x80\\x99ll learn how to send restricted visibility messages on the timeline of an object by using the `timeline-entries-create` API. These messages are only visible to the specific users you give access to.\\n\\nThe [timeline entries](/api-reference/timeline-entries/create) API is used to create discussions (comments) on the timeline of an object such as a ticket or issue. These messages can be sent by users or by a bot.\\nYou can use",
+ "title": "Restricted messages on a timeline | DevRev | Docs"
},
{
- "id": "ART-4184_KNOWLEDGE_NODE-13",
- "text": "creator](/docs/automations/smart-issue-creator)\\n - [Set user preference for group](/docs/automations/set-user-preference)\\n - [SLA status change Slack notifier](/docs/automations/sla-change-notifier)\\n - [Slash commands](/docs/automations/slash-commands)\\n - [Spam Shield](/docs/automations/spam-shield)\\n - [Subtype Migration](/docs/automations/subtype-migration)\\n - [Ticket age in engineering](/docs/automations/ticket-age-in-engineering)\\n - [Ticket issue field",
+ "id": "ART-4184_KNOWLEDGE_NODE-2",
+ "text": "control](/docs/product/access-control)\\n + [Object customization](/docs/product/object-customization)\\n + [Glossary \\xe2\\x86\\x97\\xef\\xb8\\x8f](https://support.devrev.ai/devrev/article/ART-16784-glossary)\\n + [Search](/docs/product/search)\\n + [Workflows](/docs/product/workflow-engine)\\n\\n - [Workflow action library](/docs/product/action-library)\\n - [Triggers](/docs/product/trigger-library)\\n - [Conversational workflows](/docs/product/conversational-workflows)\\n - [Workflow",
"title": "Ticket linked issues comment sync | Automate | Snap-ins | DevRev"
},
{
- "id": "ART-4184_KNOWLEDGE_NODE-24",
- "text": "[Product demos](/docs/DevRevU/demos)\\n\\nOn this page\\n\\n* [Key features](#key-features)\\n* [Installation and configuration](#installation-and-configuration)\\n* [Prerequisites](#prerequisites)\\n* [Setup steps](#setup-steps)\\n\\n1. [Documentation](/docs)\\n3. [Snap-ins](/docs/snapins)\\n[Automate](/docs/automate)\\n[Ticket linked issues comment sync](/docs/automations/ticket-linked-issues-comment-sync)\\n\\nTicket linked issues comment sync\\n=================================\\n\\nThe **Ticket Linked",
- "title": "Ticket linked issues comment sync | Automate | Snap-ins | DevRev"
- },
- {
- "id": "ART-1227_KNOWLEDGE_NODE-1",
- "text": "\\\\ |\\n| > | -H \"Authorization: Bearer \" \\\\ |\\n| > | -H \"Content-Type: application/json\" \\\\ |\\n| > | -d \\'{}\\' |\\n```\\n\\n[Try it](/api-reference/timeline-entries/create?explorer=true)\\n\\n201Created\\n\\n```\\n| | |\\n| --- | --- |\\n| 1 | { |\\n| 2 | \"timeline_entry\": { |\\n| 3 | \"created_by\": { |\\n| 4 | \"display_id\": \"string\", |\\n| 5 | \"id\": \"string\", |\\n| 6 | \"display_name\": \"string\", |\\n| 7 | \"display_picture\": { |\\n| 8 | \"display_id\": \"string\", |\\n| 9 | \"id\": \"string\", |\\n| 10 | \"file\": {",
- "title": "Create Timeline Entry | DevRev | Docs"
- },
- {
- "id": "ART-1435_KNOWLEDGE_NODE-2",
- "text": "\"Content-Type: application/json\" \\\\ \\n >| -d \\'{ \\n >| \"id\": \"don:core:dvrv-us-1:devo/example:ticket/123:comment/comment-id\" \\n >| }\\'\\n[/code] \\n \\nTry it\\n\\n200timelineEntriesGetPostExample\\n\\n[code]\\n\\n 1| { \\n ---|--- \\n 2| \"timeline_entry\": { \\n 3| \"created_by\": { \\n 4| \"display_id\": \"foo\", \\n 5| \"id\": \"foo\", \\n 6| \"display_name\": \"foo\", \\n 7| \"display_picture\": { \\n 8| \"display_id\": \"foo\", \\n",
- "title": "Get Timeline Entry (POST) \u2014 DevRev | Docs"
+ "id": "ART-1485_KNOWLEDGE_NODE-21",
+ "text": "within the manifest file:\\n[code]\\n\\n 1| commands: \\n ---|--- \\n 2| - name: comment_here \\n 3| namespace: devrev \\n 4| description: Command to trigger function to add comment to this work item. \\n 5| surfaces: \\n 6| - surface: discussions \\n 7| object_types: \\n 8| - issue \\n 9| - ticket \\n 10| usage_hint: \"Command to add comment to this work item.\" \\n 11| function: function_2\\n[/code] \\n",
+ "title": "Snap-in triggered by a DevRev event \u2014 DevRev | Docs"
}
]
},
@@ -675,11 +675,6 @@
"query_id": "3abb74c9-639f-4252-955c-3cfaa8bf6795",
"query": "DevRev Bot groups created from airdrops",
"retrievals": [
- {
- "id": "ART-1591_KNOWLEDGE_NODE-149",
- "text": "groups based on the group type.\\nAllowed values: dynamic static\\ningestion_source \"airdrop\" or \"scim\" Optional\\nFilter groups by ingestion source(s).\\nAllowed values: airdrop scim\\nis_default boolean Optional\\nWhether to fetch default or custom groups.\\nlimit integer Optional\\nThe maximum number of groups to return. The default is \\'50\\'.\\nmember_type \"dev_user\" or \"rev_user\" Optional\\nFilters the groups on basis of member type.\\nAllowed values: dev_user rev_user\\nmode \"after\" or \"before\"",
- "title": "Create \u2014 DevRev | Docs"
- },
{
"id": "ART-1605_KNOWLEDGE_NODE-149",
"text": "groups based on the group type.\\nAllowed values: dynamic static\\ningestion_source \"airdrop\" or \"scim\" Optional\\nFilter groups by ingestion source(s).\\nAllowed values: airdrop scim\\nis_default boolean Optional\\nWhether to fetch default or custom groups.\\nlimit integer Optional\\nThe maximum number of groups to return. The default is \\'50\\'.\\nmember_type \"dev_user\" or \"rev_user\" Optional\\nFilters the groups on basis of member type.\\nAllowed values: dev_user rev_user\\nmode \"after\" or \"before\"",
@@ -696,34 +691,39 @@
"title": "Create \u2014 DevRev | Docs"
},
{
- "id": "ART-1822_KNOWLEDGE_NODE-149",
+ "id": "ART-1832_KNOWLEDGE_NODE-149",
"text": "groups based on the group type.\\nAllowed values: dynamic static\\ningestion_source \"airdrop\" or \"scim\" Optional\\nFilter groups by ingestion source(s).\\nAllowed values: airdrop scim\\nis_default boolean Optional\\nWhether to fetch default or custom groups.\\nlimit integer Optional\\nThe maximum number of groups to return. The default is \\'50\\'.\\nmember_type \"dev_user\" or \"rev_user\" Optional\\nFilters the groups on basis of member type.\\nAllowed values: dev_user rev_user\\nmode \"after\" or \"before\"",
"title": "Create \u2014 DevRev | Docs"
},
{
- "id": "ART-1832_KNOWLEDGE_NODE-149",
+ "id": "ART-1591_KNOWLEDGE_NODE-149",
"text": "groups based on the group type.\\nAllowed values: dynamic static\\ningestion_source \"airdrop\" or \"scim\" Optional\\nFilter groups by ingestion source(s).\\nAllowed values: airdrop scim\\nis_default boolean Optional\\nWhether to fetch default or custom groups.\\nlimit integer Optional\\nThe maximum number of groups to return. The default is \\'50\\'.\\nmember_type \"dev_user\" or \"rev_user\" Optional\\nFilters the groups on basis of member type.\\nAllowed values: dev_user rev_user\\nmode \"after\" or \"before\"",
"title": "Create \u2014 DevRev | Docs"
},
{
- "id": "ART-1300_KNOWLEDGE_NODE-153",
- "text": "iteration starts from the beginning.\\ngroup_type \"dynamic\" or \"static\" Optional\\nFilters the groups based on the group type.\\nAllowed values: dynamic static\\ningestion_source \"airdrop\" or \"scim\" Optional\\nFilter groups by ingestion source(s).\\nAllowed values: airdrop scim\\nis_default boolean Optional\\nWhether to fetch default or custom groups.\\nlimit integer Optional\\nThe maximum number of groups to return. The default is \\'50\\'.\\nmember_type \"dev_user\" or \"rev_user\" Optional\\nFilters the",
+ "id": "ART-1822_KNOWLEDGE_NODE-149",
+ "text": "groups based on the group type.\\nAllowed values: dynamic static\\ningestion_source \"airdrop\" or \"scim\" Optional\\nFilter groups by ingestion source(s).\\nAllowed values: airdrop scim\\nis_default boolean Optional\\nWhether to fetch default or custom groups.\\nlimit integer Optional\\nThe maximum number of groups to return. The default is \\'50\\'.\\nmember_type \"dev_user\" or \"rev_user\" Optional\\nFilters the groups on basis of member type.\\nAllowed values: dev_user rev_user\\nmode \"after\" or \"before\"",
"title": "Create \u2014 DevRev | Docs"
},
{
- "id": "ART-1637_KNOWLEDGE_NODE-149",
- "text": "groups based on the group type.\\nAllowed values: dynamic static\\ningestion_source \"airdrop\" or \"scim\" Optional\\nFilter groups by ingestion source(s).\\nAllowed values: airdrop scim\\nis_default boolean Optional\\nWhether to fetch default or custom groups.\\nlimit integer Optional\\nThe maximum number of groups to return. The default is \\'50\\'.\\nmember_type \"dev_user\" or \"rev_user\" Optional\\nFilters the groups on basis of member type.\\nAllowed values: dev_user rev_user\\nmode \"after\" or \"before\"",
- "title": "Delete \u2014 DevRev | Docs"
+ "id": "ART-4078_KNOWLEDGE_NODE-7",
+ "text": "[Marketplace](https://marketplace.devrev.ai/)\\n\\nPlatform\\n\\n * [Airdrop](https://devrev.ai/airdrop)\\n * [Analytics](https://devrev.ai/analytics)\\n * [Workflow Engine](https://devrev.ai/workflow-engine)\\n * [Turing AI](https://devrev.ai/turing-ai)\\n\\nResources\\n\\n * [Pricing](https://devrev.ai/pricing/support)\\n * [Blog](https://devrev.ai/blog)\\n * [Events](https://devrev.ai/events)\\n * [News](https://devrev.ai/blog?category=news)\\n * [Case Studies](https://devrev.ai/case-study)\\n *",
+ "title": "Create Group \u2014 DevRev | Docs"
},
{
- "id": "ART-1821_KNOWLEDGE_NODE-149",
- "text": "groups based on the group type.\\nAllowed values: dynamic static\\ningestion_source \"airdrop\" or \"scim\" Optional\\nFilter groups by ingestion source(s).\\nAllowed values: airdrop scim\\nis_default boolean Optional\\nWhether to fetch default or custom groups.\\nlimit integer Optional\\nThe maximum number of groups to return. The default is \\'50\\'.\\nmember_type \"dev_user\" or \"rev_user\" Optional\\nFilters the groups on basis of member type.\\nAllowed values: dev_user rev_user\\nmode \"after\" or \"before\"",
- "title": "Delete \u2014 DevRev | Docs"
+ "id": "ART-10699_KNOWLEDGE_NODE-1",
+ "text": "These permissions will only take effect for the issue subtypes that were imported from the selected project. When group memberships or permission scheme change in Jira, the next sync will bring these changes to DevRev, and in this mode, it's advisable to make any manual changes to group memberships or the permission scheme in the external system, as the permissions, groups and group memberships are only synced to DevRev, never from DevRev to Jira.When deselecting a single one of these during",
+ "title": "Airdropping permissions and groups from Jira"
},
{
- "id": "ART-1824_KNOWLEDGE_NODE-149",
- "text": "groups based on the group type.\\nAllowed values: dynamic static\\ningestion_source \"airdrop\" or \"scim\" Optional\\nFilter groups by ingestion source(s).\\nAllowed values: airdrop scim\\nis_default boolean Optional\\nWhether to fetch default or custom groups.\\nlimit integer Optional\\nThe maximum number of groups to return. The default is \\'50\\'.\\nmember_type \"dev_user\" or \"rev_user\" Optional\\nFilters the groups on basis of member type.\\nAllowed values: dev_user rev_user\\nmode \"after\" or \"before\"",
- "title": "Delete \u2014 DevRev | Docs"
+ "id": "ART-1948_KNOWLEDGE_NODE-22",
+ "text": "AirSync](/docs/integrations/gitbook)\\n - [DevRev AirSync](/docs/integrations/devrev-airdrop)\\n - [GitHub Issues AirSync](/docs/integrations/github-airdrop)\\n - [Paligo AirSync](/docs/integrations/paligo)\\n - [Jira Service Management AirSync](/docs/integrations/jsm)\\n - [BrowserStack AirSync](/docs/integrations/browserstack)\\n* [Changelog](/docs/changelog)\\n\\n + [August 2025](/docs/changelog/latest)\\n + [July 2025](/docs/changelog/_2025-07-01)\\n + [June",
+ "title": "Groups | Computer by DevRev | DevRev"
+ },
+ {
+ "id": "ART-10699_KNOWLEDGE_NODE-0",
+ "text": "b\"After data extraction is completed a mapping step is required. In this mapping screen, the Jira snap-in offers to import groups, group members and authorization policies (which are taken from the Jira project permission scheme) alongside other items. If you wish direct manual control over the permissions for the imported items in DevRev you will want to deselect them. If however you wish to import the permission scheme for CRUD operations on the imported issues, you can leave them selected.",
+ "title": "Airdropping permissions and groups from Jira"
}
]
},
@@ -731,40 +731,30 @@
"query_id": "a15290e1-d40b-4422-b5ea-170576843e89",
"query": "SLA for Next Response stop when stage is moved back to Awaiting Customer",
"retrievals": [
- {
- "id": "ART-1974_KNOWLEDGE_NODE-28",
- "text": "transitions from *new* to *waiting on user*. When a customer responds back to support, the stage transitions to *needs response*.\\n\\n Towards the end of the conversation when the resolution is expected to be valid, the customer experience engineer asks the customer to acknowledge their concerns have been resolved. When the customer experience engineer asks this question the stage transitions to *waiting on user*, and if they validate it moves to *needs response* for the customer experience",
- "title": "Conversations | Computer for Support Teams | DevRev"
- },
{
"id": "ART-1979_KNOWLEDGE_NODE-43",
"text": "*awaiting customer response* until the customer responds.\\n\\n In certain scenarios, the customer experience engineer may be able to resolve the customer's concern. If that's the case, they would ask the customer if their resolution has resolved their concern and the stage would move to the *awaiting customer response*. Once the concern is resolved and the customer acknowledges the resolution, the stage may move to *resolved*. If the concern isn't resolved, the stage may change back to *work in",
"title": "Tickets | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1974_KNOWLEDGE_NODE-32",
- "text": "have been completed the stage transitions to *needs response* to bring to the customer experience engineer's attention. Upon review they may put the conversation back on *hold* to re-escalate the item. If the dependencies seem to be resolved the customer experience engineer responds to the customer and the stage transitions to *waiting on user*.\\n\\n**Closed**\\n\\n* *Resolved* (R)\\n\\n The final target stage for conversations. It means that the customer's concerns which led to the conversation",
- "title": "Conversations | Computer for Support Teams | DevRev"
- },
- {
- "id": "ART-1974_KNOWLEDGE_NODE-30",
- "text": "stage.\\n* *Needs response* (NR)\\n\\n The customer has responded; the customer experience engineer needs to review the item and respond or resolve the issue if the user requests or validates the fix. When a customer experience engineer responds the stage transitions to *waiting on user*.\\n\\n In certain cases it may be necessary to escalate the item internally where the conversation may depend on tickets, issues, or a response from someone other than themselves. In this case the stage",
+ "id": "ART-1974_KNOWLEDGE_NODE-28",
+ "text": "transitions from *new* to *waiting on user*. When a customer responds back to support, the stage transitions to *needs response*.\\n\\n Towards the end of the conversation when the resolution is expected to be valid, the customer experience engineer asks the customer to acknowledge their concerns have been resolved. When the customer experience engineer asks this question the stage transitions to *waiting on user*, and if they validate it moves to *needs response* for the customer experience",
"title": "Conversations | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1986_KNOWLEDGE_NODE-40",
- "text": "conversation moves to any stage except Waiting on User |\\n\\nViewing SLAs\\n------------\\n\\nThe SLA targets applied to a particular conversation can be viewed in the **Inbox** and the **Conversation Detailed** view. For a ticket in any of the ticket vistas.\\n\\nWhen there are two active metrics, vista displays the one closest to the breach. In the case of a conversation where both the first response and full resolution metrics are active, and the first response is due in five minutes but the full",
+ "id": "ART-1986_KNOWLEDGE_NODE-34",
+ "text": "target defined in the policy.\\n* *Breached*: The time spent by the SLA metric is greater than or equal to the breach target defined in the policy.\\n* *Paused*: The metric is currently paused based on some conditions. For example, when a ticket moves to awaiting customer response.\\n* *Completed*: The conversation or ticket has reached the completion condition.\\n\\nBased on business hours defined for an organization, *Active/Close to breach/Breached* metrics can change schedules. Metrics move out",
"title": "Service-level agreement | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1986_KNOWLEDGE_NODE-38",
- "text": "ticket is moved to the Closed state | The ticket was moved to Awaiting Customer Response state | The ticket moves to any state except Closed |\\n\\n**Conversations**\\n\\n| Metric | Default conditions | Start event | End event | Pause event | Resume event |\\n| --- | --- | --- | --- | --- | --- |\\n| First response time | The first message sent by a customer | Conversation created | * The agent replied to the conversation * The conversation is moved to Waiting on User/Resolved * The conversation is",
- "title": "Service-level agreement | Computer for Support Teams | DevRev"
+ "id": "ART-2009_KNOWLEDGE_NODE-28",
+ "text": "ticket's stage when linked issue is linked or unlinked.\\n* Close pending tickets if they have remained in the *Awaiting customer response* stage for longer than x days.\\n* Update ticket's stage to waiting on user when user reverts on new conversation.\\n* Update ticket's stage to *Accepted* and notify owner and customers when an enhancement in ideation stage is linked.\\n* Update a spam conversation's stage to *Suspended*.\\n* Update a spam ticket's stage to",
+ "title": "Convergence | Automate | Snap-ins | DevRev"
},
{
- "id": "ART-1986_KNOWLEDGE_NODE-41",
- "text": "resolution is due in one day, the vista displays five minutes. In the case where the first response isn't provided within five minutes, the timer displays negative values (such as -10m), which indicates that it's been 10 minutes since the first response was due. Conversations or tickets can also be grouped by SLA stages.\\n\\nIn the **Detailed View**, all metrics applied to the ticket or conversation can be viewed along with their current stage.\\n\\nFiltering tickets by Next SLA",
- "title": "Service-level agreement | Computer for Support Teams | DevRev"
+ "id": "ART-1981_KNOWLEDGE_NODE-28",
+ "text": "new conversation. Respond within 1 hour to new messages on existing conversations. Change the stage of conversation to *awaiting customer response* as soon as you have responded.\\n* In **Updates**, filter by **Type** > **Mentioned**. Respond to those updates first.\\n* Create a ticket if you aren't able to resolve the conversation in 20 minutes. As soon as the ticket is opened, move it to the *escalate* stage. The owner of the ticket is the owner of the customer org where the conversation",
+ "title": "Support best practices | Computer for Support Teams | DevRev"
},
{
"id": "ART-1981_KNOWLEDGE_NODE-27",
@@ -772,14 +762,24 @@
"title": "Support best practices | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1986_KNOWLEDGE_NODE-39",
- "text": "marked as spam | | |\\n| Next response time | | A new message on the conversation with the customer after the customer experience engineer replied | * The agent replied to the conversation * The conversation is moved to Waiting on User/Resolved * The conversation is marked as spam | | |\\n| Full resolution time | | Conversation created | * The conversation has moved to the Resolved/Archived * The conversation is marked as spam | The conversation is moved to Waiting on User | The",
- "title": "Service-level agreement | Computer for Support Teams | DevRev"
+ "id": "ART-1979_KNOWLEDGE_NODE-46",
+ "text": "resolved the customer's concern the stage can move to *resolved*.\\n* Awaiting development (AD)\\n\\n The issues on which the user's concern relies for resolution are planned but not active, when development on the issue begins the stage transitions to *In development*.\\n* In development (ID)\\n\\n The issues on which the user's concern relies for resolution are actively being worked on. Once the development process begins, the stage may go from *in development* to *awaiting customer response* to",
+ "title": "Tickets | Computer for Support Teams | DevRev"
},
{
"id": "ART-1979_KNOWLEDGE_NODE-44",
"text": "progress* as the customer experience engineer continues to work on it.\\n* *Awaiting product assist* (APA)\\n\\n The customer experience engineer is waiting for a response or feedback from someone internally. They may need to escalate the ticket. There may be a corresponding [issue](./issues) created to fix the defect, which would transition the stage to *awaiting development*.\\n* Awaiting customer response (ACR)\\n\\n The customer experience engineer requires more detail or another response from",
"title": "Tickets | Computer for Support Teams | DevRev"
+ },
+ {
+ "id": "ART-1979_KNOWLEDGE_NODE-45",
+ "text": "a user. In certain cases where the ticket depends on some fix (issues) the stage may go from *in development* to *awaiting customer response* when the corresponding issues have been resolved and the fix needs to be validated with the user.\\n\\n In certain cases, the customer experience engineer may be able to solve directly (without any required issues) which may change the stage from *work in progress* to *awaiting customer response* to validate they have solved the problem. If either has",
+ "title": "Tickets | Computer for Support Teams | DevRev"
+ },
+ {
+ "id": "ART-1986_KNOWLEDGE_NODE-38",
+ "text": "ticket is moved to the Closed state | The ticket was moved to Awaiting Customer Response state | The ticket moves to any state except Closed |\\n\\n**Conversations**\\n\\n| Metric | Default conditions | Start event | End event | Pause event | Resume event |\\n| --- | --- | --- | --- | --- | --- |\\n| First response time | The first message sent by a customer | Conversation created | * The agent replied to the conversation * The conversation is moved to Waiting on User/Resolved * The conversation is",
+ "title": "Service-level agreement | Computer for Support Teams | DevRev"
}
]
},
@@ -793,49 +793,49 @@
"title": "February 2025 | Changelog | DevRev"
},
{
- "id": "ART-2017_KNOWLEDGE_NODE-12",
- "text": "sync](/docs/automations/org-tags-sync)\\n - [Search Node](/docs/automations/search-node)\\n - [Sentiment evaluator](/docs/automations/sentiment-evaluator)\\n - [Subtype Migration](/docs/automations/subtype-migration)\\n - [Real-time sentiment evaluator](/docs/automations/realtime-sentiment-evaluator)\\n - [Send customized emails](/docs/automations/send-emails)\\n - [StageFlow automator](/docs/automations/stageflow-automator)\\n - [Smart issue",
- "title": "SLA status change Slack notifier | Automate | Snap-ins | DevRev"
+ "id": "ART-16749_KNOWLEDGE_NODE-0",
+ "text": "b'This error usually occurs when the mapping request is sent with stale data. It happens when the blueprint or status version in your browser is outdated compared to the server.\\n\\nTo confirm:\\n\\nOpen the Network tab in your browser\\xe2\\x80\\x99s developer tools.\\n\\nCheck the response to the low-code POST request.\\n\\nResponse should look like this:{\\n \"message\": \"recipe-manager-RecipeManagerInvalidArgument-Unspecified: blueprint or status version changed: was 9_9 on the server and 8_8 in the",
+ "title": "Troubleshooting Airdrop Mapping Error: \u201cSomething Went Wrong\u201d"
},
{
- "id": "ART-2017_KNOWLEDGE_NODE-16",
- "text": "sync](/docs/automations/ticket-linked-issues-comment-sync)\\n - [Slack message agent](/docs/automations/slack-message-agent)\\n + [Integrate](/docs/integrate)\\n\\n - [Bitbucket](/docs/integrations/bitbucket)\\n - [Calendly](/docs/integrations/calendly)\\n - [Coralogix security integration](/docs/integrations/coralogix)\\n - [Datadog](/docs/integrations/datadog)\\n - [Google Calendar AirSync](/docs/integrations/google-calendar-airdrop)\\n - [Email](/docs/integrations/email)\\n\\n",
- "title": "SLA status change Slack notifier | Automate | Snap-ins | DevRev"
+ "id": "ART-2035_KNOWLEDGE_NODE-54",
+ "text": "given DevRev user - Can be used to later send direct messages to the user on the Slack using Send message to Slack node. | - Slack connection - DevRev user id | - Slack user id |\\n| Start Thread Sync | - Set up 2 way message synchronization between a Slack thread and a DevRev object discussion. | - Slack connection - DevRev Object ID - Slack channel ID - Slack thread ID (message ID of parent message, returned by send message to Slack workflow node) | N/A |\\n| Start Channel Sync | -",
+ "title": "Slack | Integrate | Snap-ins | DevRev"
},
{
- "id": "ART-2035_KNOWLEDGE_NODE-48",
- "text": "channel.\\n\\n1. **Sync messages with the thread (for incidents created from Slack)**\\n\\n* Works only for incidents created from Slack.\\n* It syncs messages with the originating thread, similar to ticket and issue work items.\\n\\n1. **Sync messages with the notification thread**\\n\\n* Syncs with the thread of the incident notification sent on the channel mentioned in the **Channel ID to send incident notifications** configuration.\\n* Works for all incidents irrespective of source channel or",
+ "id": "ART-2035_KNOWLEDGE_NODE-51",
+ "text": "Slack.\\n\\nFor example:\\n\\n* /devrev view TKT-#\\n* /devrev view ISS-#\\n\\nThese commands open the specific object mentioned in the command.\\n\\nCreating custom workflows\\n-------------------------\\n\\nThe users can configure their own workflows around Slack using DevRev's workflow engine.\\n\\n| Workflow Action | Description | Inputs | Outputs |\\n| --- | --- | --- | --- |\\n| Send message on Slack | - Use this workflow node to send a message to any Slack channel as long as the DevRev app has access to",
"title": "Slack | Integrate | Snap-ins | DevRev"
},
{
- "id": "ART-4199_KNOWLEDGE_NODE-13",
- "text": "group](/docs/automations/set-user-preference)\\n - [SLA status change Slack notifier](/docs/automations/sla-change-notifier)\\n - [Slash commands](/docs/automations/slash-commands)\\n - [Spam Shield](/docs/automations/spam-shield)\\n - [Subtype Migration](/docs/automations/subtype-migration)\\n - [Ticket age in engineering](/docs/automations/ticket-age-in-engineering)\\n - [Ticket issue field migrator](/docs/automations/ticket-issue-field-migrator)\\n - [Ticket",
+ "id": "ART-4199_KNOWLEDGE_NODE-2",
+ "text": "[Object customization](/docs/product/object-customization)\\n + [Glossary \\xe2\\x86\\x97\\xef\\xb8\\x8f](https://support.devrev.ai/devrev/article/ART-16784-glossary)\\n + [Search](/docs/product/search)\\n + [Workflows](/docs/product/workflow-engine)\\n\\n - [Workflow action library](/docs/product/action-library)\\n - [Triggers](/docs/product/trigger-library)\\n - [Conversational workflows](/docs/product/conversational-workflows)\\n - [Workflow management](/docs/product/workflow-management)\\n",
"title": "Slack message agent | Automate | Snap-ins | DevRev"
},
{
- "id": "ART-4199_KNOWLEDGE_NODE-10",
- "text": "data](/docs/automations/bulk-delete)\\n - [Bulk work item uploader](/docs/automations/bulk-upload)\\n - [Commands surface expander](/docs/automations/commands-surface-expander)\\n - [Convergence](/docs/automations/converge)\\n - [Conversation reminder](/docs/automations/conversation-reminder)\\n - [CSAT on conversation](/docs/automations/csat-conv)\\n - [CSAT on ticket](/docs/automations/csat-tickets)\\n - [CSV work item uploader](/docs/automations/csv-work-item-uploader)\\n -",
- "title": "Slack message agent | Automate | Snap-ins | DevRev"
+ "id": "ART-10697_KNOWLEDGE_NODE-27",
+ "text": "bidirectional synchronization between DevRev objects and Slack channels.\\n* A workflow node has been added to create a Slack channel and automatically invite specified users.\\n* A random wait time (1-20 seconds) has been added before creating a conversation to prevent duplicate conversations on WhatsApp when messages are sent rapidly.\\n* Customer identification in Slack has been enhanced by resolving users via their Slack ID when their email is hidden.\\n* An optional field has been added to the",
+ "title": "February 2025 | Changelog | DevRev"
},
{
- "id": "ART-4199_KNOWLEDGE_NODE-28",
- "text": "**Trigger URL** that is displayed.\\n6. Paste the Trigger URL under **Enable Events** in the custom Slack bot.\\n\\n[PreviousTicket linked issues comment sync](/docs/automations/ticket-linked-issues-comment-sync)[NextIntegrate](/docs/integrate)\\n\\n#### On this page\\n\\n* [Install](#install)\\n* [Configure the custom Slack bot](#configure-the-custom-slack-bot)\\n* [Configure DevRev](#configure-devrev)\\n\\n[Enterprise grade security to protect customer data\\n\\nLearn more about",
- "title": "Slack message agent | Automate | Snap-ins | DevRev"
+ "id": "ART-12390_KNOWLEDGE_NODE-16",
+ "text": "sync](/docs/automations/ticket-linked-issues-comment-sync)\\n - [Slack message agent](/docs/automations/slack-message-agent)\\n + [Integrate](/docs/integrate)\\n\\n - [Bitbucket](/docs/integrations/bitbucket)\\n - [Calendly](/docs/integrations/calendly)\\n - [Coralogix security integration](/docs/integrations/coralogix)\\n - [Datadog](/docs/integrations/datadog)\\n - [Google Calendar AirSync](/docs/integrations/google-calendar-airdrop)\\n - [Email](/docs/integrations/email)\\n\\n",
+ "title": "Workflow action library | Workflows | Computer by DevRev | DevRev"
},
{
- "id": "ART-4199_KNOWLEDGE_NODE-17",
- "text": "[Slack](/docs/integrations/slack)\\n - [WhatsApp](/docs/integrations/whatsapp)\\n - [GitHub](/docs/integrations/github)\\n - [GitLab](/docs/integrations/gitlab)\\n - [Harness](/docs/integrations/harness)\\n - [Marker.io](/docs/integrations/marker-io)\\n - [Instabug](/docs/integrations/instabug)\\n - [Qase](/docs/integrations/qase)\\n - [Tracxn Integration](/docs/integrations/tracxn-integration)\\n - [Twilio](/docs/integrations/twilio)\\n - [Glean](/docs/integrations/glean)\\n",
+ "id": "ART-4199_KNOWLEDGE_NODE-3",
+ "text": "- [Workflow nodes](/docs/product/workflow-nodes)\\n - [Troubleshooting](/docs/product/troubleshooting-workflows)\\n + [Templates](/docs/product/template)\\n + [Accessing DevRev](/docs/product/ui)\\n + [External identity provider setup](/docs/product/sso-saml)\\n + [Remote MCP server](/docs/product/remote-mcp)\\n* [Computer for Support Teams](/docs/product/support)\\n\\n + [Inbox](/docs/product/inbox)\\n + [Support analytics](/docs/product/support-analytics)\\n\\n - [Conversation",
"title": "Slack message agent | Automate | Snap-ins | DevRev"
},
{
- "id": "ART-2017_KNOWLEDGE_NODE-25",
- "text": "ticket\\'s owner and subscribers, when a ticket\\'s resolution time SLA changes into the *Warning* or *Breached* stage.\\n\\n![]()\\n\\nFor more information, refer to the\\n[SLA status change Slack notifier snap-in](/marketplace/sla-status-change-slack-notifier) on the DevRev\\nmarketplace.\\n\\nInstallation\\n------------\\n\\n1. Create a Slack app for your workspace in .\\n2. In App features, generate bot token in **OAuth & Permissions**.\\n3. Grant the app bot the following",
- "title": "SLA status change Slack notifier | Automate | Snap-ins | DevRev"
+ "id": "ART-4199_KNOWLEDGE_NODE-15",
+ "text": "[Custom field migration](/docs/automations/custom-field-migration)\\n - [Slack scraper](/docs/automations/slack-scraper)\\n - [Slack Broadcaster](/docs/automations/slack-broadcaster)\\n - [Reported by enricher](/docs/automations/ticket-reported-by)\\n - [Ticket approval workflow](/docs/automations/ticket-approval-workflow)\\n - [Ticket linked issues comment sync](/docs/automations/ticket-linked-issues-comment-sync)\\n - [Slack message agent](/docs/automations/slack-message-agent)\\n",
+ "title": "Slack message agent | Automate | Snap-ins | DevRev"
},
{
- "id": "ART-4199_KNOWLEDGE_NODE-27",
- "text": "message.channels.\\n7. Add this custom app and the **DevRev Slack Bot** into the Slack channel from which you want to create the DevRev object.\\n\\nConfigure DevRev\\n----------------\\n\\n1. Add the Slack Signing Secret and Slack Bot Token copied from the custom Slack bot app.\\n2. Add the channel IDs for either incidents, tickets or issues.\\n3. Click the respective buttons to enable the sync between threads.\\n4. Select the part ID to associate a particular part.\\n5. Click **Save** and copy the",
- "title": "Slack message agent | Automate | Snap-ins | DevRev"
+ "id": "ART-12394_KNOWLEDGE_NODE-16",
+ "text": "sync](/docs/automations/ticket-linked-issues-comment-sync)\\n - [Slack message agent](/docs/automations/slack-message-agent)\\n + [Integrate](/docs/integrate)\\n\\n - [Bitbucket](/docs/integrations/bitbucket)\\n - [Calendly](/docs/integrations/calendly)\\n - [Coralogix security integration](/docs/integrations/coralogix)\\n - [Datadog](/docs/integrations/datadog)\\n - [Google Calendar AirSync](/docs/integrations/google-calendar-airdrop)\\n - [Email](/docs/integrations/email)\\n\\n",
+ "title": "Workflow management | Workflows | Computer by DevRev | DevRev"
}
]
},
@@ -844,54 +844,54 @@
"query": "change and customize chat design",
"retrievals": [
{
- "id": "ART-12974_KNOWLEDGE_NODE-2",
- "text": "{ \\n ---|--- \\n 2| \"chat\": { \\n 3| \"type\": \"foo\" \\n 4| } \\n 5| }\\n[/code] \\n \\n[Create Code ChangeUp Next](/public/api-reference/code-changes/create)\\n\\n[Built with](https://buildwithfern.com/?utm_campaign=buildWith&utm_medium=docs&utm_source=developer.devrev.ai)\\n\\n[Enterprise grade security to protect customer dataLearn more about it.](https://devrev.ai/blog/soc-compliance)\\n\\nProduct\\n\\n * [Build](https://devrev.ai/build)\\n *",
- "title": "Update Chat \u2014 DevRev | Docs"
+ "id": "ART-2059_KNOWLEDGE_NODE-6",
+ "text": "to the Customize documentation.\\n\\nAlternatively, for the most comprehensive customizations, refer to our SDK functions here.\\n\\nIntegration code.\\n\\nTo get the PLuG chat widget to appear on your website and web app, copy and paste the snippet below on every page where you want the widget to appear for website visitors.\\n\\nUnique app ID.\\n\\nMake sure to replace the app ID with your app ID which identifies your PLuG chat widget. You can access your app ID from your DevRev account by following",
+ "title": "Install PLuG chat on your website"
},
{
- "id": "ART-15306_KNOWLEDGE_NODE-3",
- "text": "Change\\n\\nNext](/api-reference/code-changes/create)[Built with](https://buildwithfern.com/?utm_campaign=buildWith&utm_medium=docs&utm_source=developer.devrev.ai)'",
- "title": "Update Chat | DevRev | Docs"
+ "id": "ART-3109_KNOWLEDGE_NODE-29",
+ "text": "go to **Settings > Support > Plug Chat > Layout** through the settings icon on the top-left corner.\\n2. Select **Add a Card** and enter a title, description, image, and redirect URL.\\n3. Click **Save and Publish** in the top-right corner. The new card is visible in your Plug widget.\\n\\nWant to add more personalization to your Plug widget? Create your own. Visit [SDK Methods and Customization](https://developer.devrev.ai/sdks/web/customize) to create your own Plug from the ground",
+ "title": "Plug widget customization | Computer for Your Customers | DevRev"
},
{
- "id": "ART-2059_KNOWLEDGE_NODE-5",
- "text": "Jul 06 to Jul 19, 2023 Jun 20 to Jul 05, 2023 Jun 05 to Jun 19, 2023 May 22 to Jun 05, 2023 Apr 22 to May 22, 2023\\n\\nDeveloper DevRevU\\n\\nOn this page\\nIntegration code Unique app ID Setup for HTML Setup for React\\nInstall PLuG chat on your website.\\n\\nThere are two primary methods to customize PLuG chat. The easiest way is to do so through the app by navigating to Settings > Support > PLuG Settings > Configuration, Styling and Layout Tabs.. For detailed descriptions of the parameters, refer",
+ "id": "ART-2059_KNOWLEDGE_NODE-4",
+ "text": "PLuG chat on your website Install PLuG search on your website Identify your users with PLuG Customize Nudges SDK\\n\\nChangelog\\n\\nSeptember 01 to September 30 August 01 to August 31 July 01 to July 31, 2024 June 01 to June 28, 2024 May 01 to May 31, 2024 April 01 to April 29, 2024 Mar 01 to Mar 29, 2024 Feb 10 to Feb 29, 2024 Jan 09, 2024 to Feb 09, 2024 Dec 08, 2023 to Jan 08, 2024 Nov 10 to Dec 07, 2023 Oct 13 to Nov 09, 2023 Sep 15 to Oct 12, 2023 Aug 17 to Sep 14, 2023 Jul 20 to Aug 16, 2023",
"title": "Install PLuG chat on your website"
},
{
- "id": "ART-15306_KNOWLEDGE_NODE-0",
- "text": "b'Update Chat | DevRev | Docs\\n\\n[![]()![]()](https://developer.devrev.ai/)\\n\\nPublic\\n\\nPublic\\n\\nSearch\\n\\n`/`\\n\\n[API Reference](/api-reference/getting-started)[chats](/api-reference/chats/create)\\n\\nUpdate Chat\\n===========\\n\\nCopy page\\n\\nPOST\\n\\nhttps://api.devrev.ai/chats.update\\n\\nPOST\\n\\n/chats.update\\n\\n```\\n| | |\\n| --- | --- |\\n| $ | curl -X POST https://api.devrev.ai/chats.update \\\\ |\\n| > | -H \"Authorization: Bearer \" \\\\ |\\n| > | -H \"Content-Type: application/json\" \\\\ |\\n|",
- "title": "Update Chat | DevRev | Docs"
+ "id": "ART-3109_KNOWLEDGE_NODE-25",
+ "text": "Plug widget to reflect your unique identity truly.\\n\\nTo configure the appearance of your Plug widget, open your DevRev app and navigate to **Settings > Support > Plug Chat > Configuration, Styling, and Layout**.\\n\\n### Configuration\\n\\n* Hide Plug widget: Hide the Plug Widget on specific URLs by clicking **+ Rule** and adding the URLs you want to configure.\\n\\n### Styling\\n\\n* Launcher logo: The image that's visible as your widget icon. A 20-pixel square image is recommended.\\n* Alignment: The",
+ "title": "Plug widget customization | Computer for Your Customers | DevRev"
},
{
- "id": "ART-12971_KNOWLEDGE_NODE-3",
- "text": ">| ] \\n >| }\\'\\n[/code] \\n \\nTry it\\n\\n201chatsCreateExample\\n\\n[code]\\n\\n 1| { \\n ---|--- \\n 2| \"chat\": { \\n 3| \"type\": \"foo\" \\n 4| } \\n 5| }\\n[/code] \\n \\n[Get ChatUp Next](/public/api-reference/chats/get)\\n\\n[Built with](https://buildwithfern.com/?utm_campaign=buildWith&utm_medium=docs&utm_source=developer.devrev.ai)\\n\\n[Enterprise grade security to protect customer dataLearn more about it.](https://devrev.ai/blog/soc-compliance)\\n\\nProduct\\n\\n *",
- "title": "Create Chat \u2014 DevRev | Docs"
+ "id": "ART-2059_KNOWLEDGE_NODE-5",
+ "text": "Jul 06 to Jul 19, 2023 Jun 20 to Jul 05, 2023 Jun 05 to Jun 19, 2023 May 22 to Jun 05, 2023 Apr 22 to May 22, 2023\\n\\nDeveloper DevRevU\\n\\nOn this page\\nIntegration code Unique app ID Setup for HTML Setup for React\\nInstall PLuG chat on your website.\\n\\nThere are two primary methods to customize PLuG chat. The easiest way is to do so through the app by navigating to Settings > Support > PLuG Settings > Configuration, Styling and Layout Tabs.. For detailed descriptions of the parameters, refer",
+ "title": "Install PLuG chat on your website"
},
{
- "id": "ART-12974_KNOWLEDGE_NODE-9",
- "text": "demo](https://devrev.ai/request-a-demo)\\n\\n'",
- "title": "Update Chat \u2014 DevRev | Docs"
+ "id": "ART-12449_KNOWLEDGE_NODE-16",
+ "text": "this stage, your app is fully configured to utilize all functionalities of the DevRev SDK. Pressing the support button directs the user to the chat interface, enabling effective interaction and support.\\n\\n### In-app link handling\\n\\nThe DevRev SDK provides a mechanism to handle links opened from within any screen that is part of the DevRev SDK.\\n\\nYou can fully customize the link handling behavior by setting the specialized in-app link handler. That way you can decide what should happen when a",
+ "title": "Features \u2014 DevRev | Docs"
},
{
- "id": "ART-15301_KNOWLEDGE_NODE-3",
- "text": "with](https://buildwithfern.com/?utm_campaign=buildWith&utm_medium=docs&utm_source=developer.devrev.ai)'",
- "title": "Create Chat | DevRev | Docs"
+ "id": "ART-2665_KNOWLEDGE_NODE-31",
+ "text": "interactions occurring within the chat widget and search agent should be captured or not. | True |\\n| sessionDetails.sessionId | Field to pass session ID of the previous session to link. | null |\\n| sessionDetails.tabId | Field to pass the tab ID of the previous session to link. | null |\\n| maskTextFn | An option to customize the logic for masking sensitive text during session recording. This function accepts a callback that receives the text content and allows you to define how the text should",
+ "title": "Session recording options | Session analytics | Computer for Your Customers | DevRev"
},
{
- "id": "ART-3109_KNOWLEDGE_NODE-29",
- "text": "go to **Settings > Support > Plug Chat > Layout** through the settings icon on the top-left corner.\\n2. Select **Add a Card** and enter a title, description, image, and redirect URL.\\n3. Click **Save and Publish** in the top-right corner. The new card is visible in your Plug widget.\\n\\nWant to add more personalization to your Plug widget? Create your own. Visit [SDK Methods and Customization](https://developer.devrev.ai/sdks/web/customize) to create your own Plug from the ground",
- "title": "Plug widget customization | Computer for Your Customers | DevRev"
+ "id": "ART-12974_KNOWLEDGE_NODE-2",
+ "text": "{ \\n ---|--- \\n 2| \"chat\": { \\n 3| \"type\": \"foo\" \\n 4| } \\n 5| }\\n[/code] \\n \\n[Create Code ChangeUp Next](/public/api-reference/code-changes/create)\\n\\n[Built with](https://buildwithfern.com/?utm_campaign=buildWith&utm_medium=docs&utm_source=developer.devrev.ai)\\n\\n[Enterprise grade security to protect customer dataLearn more about it.](https://devrev.ai/blog/soc-compliance)\\n\\nProduct\\n\\n * [Build](https://devrev.ai/build)\\n *",
+ "title": "Update Chat \u2014 DevRev | Docs"
},
{
- "id": "ART-2897_KNOWLEDGE_NODE-7",
- "text": "button text for new tickets and conversations, conversation user text, and more. It must be a valid hex color code, such as `#f0f0f0`.| String \\n`session_recording_options`| Options for recording observability sessions.| Refer to [Session recording options](https://devrev.ai/docs/plug/session-recording) \\n`accent_color`| The accent color of the PLuG affects the launcher, new ticket and conversation buttons, conversation user text, and more.| String \\n`custom_launcher_selector`| A CSS",
- "title": "Methods \u2014 DevRev | Docs"
+ "id": "ART-15306_KNOWLEDGE_NODE-3",
+ "text": "Change\\n\\nNext](/api-reference/code-changes/create)[Built with](https://buildwithfern.com/?utm_campaign=buildWith&utm_medium=docs&utm_source=developer.devrev.ai)'",
+ "title": "Update Chat | DevRev | Docs"
},
{
- "id": "ART-12971_KNOWLEDGE_NODE-9",
- "text": "Status](https://devrev.ai/status)\\n\\n\\xc2\\xa9 2025 DevRev Inc.\\n\\n'",
- "title": "Create Chat \u2014 DevRev | Docs"
+ "id": "ART-15301_KNOWLEDGE_NODE-1",
+ "text": "> | -d \\'{ |\\n| > | \"users\": [ |\\n| > | \"DEVU-12345\" |\\n| > | ] |\\n| > | }\\' |\\n```\\n\\n[Try it](/api-reference/chats/create?explorer=true)\\n\\n201Created\\n\\n```\\n| | |\\n| --- | --- |\\n| 1 | { |\\n| 2 | \"chat\": { |\\n| 3 | \"type\": \"string\" |\\n| 4 | } |\\n| 5 | } |\\n```\\n\\nCreates a new chat, or optionally opens an existing one.\\n\\n### Headers\\n\\nAuthorizationstringRequired\\n\\nBearer authentication of the form `Bearer `, where token is your auth token.\\n\\n### Request\\n\\nThis endpoint expects",
+ "title": "Create Chat | DevRev | Docs"
}
]
},
@@ -900,9 +900,9 @@
"query": "Vista export as CSV error invalid_field sort_groups_by",
"retrievals": [
{
- "id": "ART-1949_KNOWLEDGE_NODE-27",
- "text": "bar.\\n\\n![]()\\n\\nTo export vistas to CSV or JSON, click **Actions** and select the format in which you want to export the vista. This allows you to export this data with the filters applied (segmented by owners or some filters). Cross-functional teams can collaborate on this data or import it into other platforms.\\n\\nDelete a vista\\n--------------\\n\\n1. Select the vista you want to delete from **My list** and click the edit button next to the name of your vista.\\n2. Click **Remove access**.\\n3.",
- "title": "Vistas | Computer by DevRev | DevRev"
+ "id": "ART-1302_KNOWLEDGE_NODE-161",
+ "text": "will always be returned in the specified sort-by order.\\nsort_by list of strings Optional\\nComma-separated fields to sort the groups by.\\nResponse.\\n\\nThis endpoint returns an object.\\ngroups list of objects\\nThe list of groups.\\nShow 11 properties\\nnext_cursor string Optional\\nThe cursor used to iterate subsequent results in accordance to the sort order. If not set, then no later elements exist.\\nprev_cursor string Optional\\nThe cursor used to iterate preceding results in accordance to the",
+ "title": "Export \u2014 DevRev | Docs"
},
{
"id": "ART-15481_KNOWLEDGE_NODE-6",
@@ -910,44 +910,44 @@
"title": "List Vistas Groups | DevRev | Docs"
},
{
- "id": "ART-1302_KNOWLEDGE_NODE-161",
- "text": "will always be returned in the specified sort-by order.\\nsort_by list of strings Optional\\nComma-separated fields to sort the groups by.\\nResponse.\\n\\nThis endpoint returns an object.\\ngroups list of objects\\nThe list of groups.\\nShow 11 properties\\nnext_cursor string Optional\\nThe cursor used to iterate subsequent results in accordance to the sort order. If not set, then no later elements exist.\\nprev_cursor string Optional\\nThe cursor used to iterate preceding results in accordance to the",
+ "id": "ART-1652_KNOWLEDGE_NODE-150",
+ "text": "Optional\\nThe iteration mode to use, otherwise if not set, then \"after\" is used.\\nAllowed values: after before\\nsort_by string Optional\\nComma-separated fields to sort the groups by.\\nResponse.\\n\\nThis endpoint returns an object.\\ngroups list of objects\\nThe list of groups.\\nShow 11 properties\\nnext_cursor string Optional\\nThe cursor used to iterate subsequent results in accordance to the sort order. If not set, then no later elements exist.\\nprev_cursor string Optional\\nThe cursor used to",
"title": "Export \u2014 DevRev | Docs"
},
+ {
+ "id": "ART-1303_KNOWLEDGE_NODE-155",
+ "text": "Optional\\nThe iteration mode to use, otherwise if not set, then \"after\" is used.\\nAllowed values: after before\\nsort_by string Optional\\nComma-separated fields to sort the groups by.\\nResponse.\\n\\nThis endpoint returns an object.\\ngroups list of objects\\nThe list of groups.\\nShow 11 properties\\nnext_cursor string Optional\\nThe cursor used to iterate subsequent results in accordance to the sort order. If not set, then no later elements exist.\\nprev_cursor string Optional\\nThe cursor used to",
+ "title": "Export Post \u2014 DevRev | Docs"
+ },
+ {
+ "id": "ART-1639_KNOWLEDGE_NODE-150",
+ "text": "Optional\\nThe iteration mode to use, otherwise if not set, then \"after\" is used.\\nAllowed values: after before\\nsort_by string Optional\\nComma-separated fields to sort the groups by.\\nResponse.\\n\\nThis endpoint returns an object.\\ngroups list of objects\\nThe list of groups.\\nShow 11 properties\\nnext_cursor string Optional\\nThe cursor used to iterate subsequent results in accordance to the sort order. If not set, then no later elements exist.\\nprev_cursor string Optional\\nThe cursor used to",
+ "title": "Export Post \u2014 DevRev | Docs"
+ },
{
"id": "ART-15481_KNOWLEDGE_NODE-5",
"text": "stringsOptional\\n\\nComma-separated fields to sort the objects by.\\n\\nstatelist of enumsOptional\\n\\nDenotes the state of the vista group item.\\n\\nAllowed values:activecompletedplanned\\n\\ntypelist of enumsOptional\\n\\nFilters for vista group items of the specific type.\\n\\nAllowed values:curateddynamic\\n\\n### Response\\n\\nThe response to listing the vistas group items.\\n\\nnext\\\\_cursorstring or null`format: \"text\"`\\n\\nThe cursor used to iterate subsequent results in accordance to the\\nsort order. If",
"title": "List Vistas Groups | DevRev | Docs"
},
{
- "id": "ART-15481_KNOWLEDGE_NODE-1",
- "text": "it](/api-reference/vistas/groups-list?explorer=true)\\n\\n200Retrieved\\n\\n```\\n| | |\\n| --- | --- |\\n| 1 | { |\\n| 2 | \"next_cursor\": \"string\", |\\n| 3 | \"prev_cursor\": \"string\", |\\n| 4 | \"vista_group\": [ |\\n| 5 | { |\\n| 6 | \"end_date\": \"2023-01-01T12:00:00.000Z\", |\\n| 7 | \"id\": \"string\", |\\n| 8 | \"name\": \"string\", |\\n| 9 | \"parent\": { |\\n| 10 | \"type\": \"string\", |\\n| 11 | \"display_id\": \"string\", |\\n| 12 | \"flavor\": \"nnl\", |\\n| 13 | \"id\": \"VISTA-12345\", |\\n| 14 | \"name\": \"string\" |\\n| 15 | },",
- "title": "List Vistas Groups | DevRev | Docs"
+ "id": "ART-1302_KNOWLEDGE_NODE-157",
+ "text": "integer Optional\\nThe maximum number of groups to return. The default is \\'50\\'.\\nmember_type \"dev_user\" or \"rev_user\" Optional\\nFilters the groups on basis of member type.\\nAllowed values: dev_user rev_user\\nmode \"after\" or \"before\" Optional\\nThe iteration mode to use, otherwise if not set, then \"after\" is used.\\nAllowed values: after before\\nsort_by string Optional\\nComma-separated fields to sort the groups by.\\nResponse.\\n\\nThis endpoint returns an object.\\ngroups list of objects\\nThe list",
+ "title": "Export \u2014 DevRev | Docs"
},
{
- "id": "ART-15479_KNOWLEDGE_NODE-1",
- "text": "|\\n```\\n\\n[Try it](/api-reference/vistas/groups-get?explorer=true)\\n\\n200Retrieved\\n\\n```\\n| | |\\n| --- | --- |\\n| 1 | { |\\n| 2 | \"vista_group\": { |\\n| 3 | \"end_date\": \"2023-01-01T12:00:00.000Z\", |\\n| 4 | \"id\": \"string\", |\\n| 5 | \"name\": \"string\", |\\n| 6 | \"parent\": { |\\n| 7 | \"type\": \"string\", |\\n| 8 | \"display_id\": \"string\", |\\n| 9 | \"flavor\": \"nnl\", |\\n| 10 | \"id\": \"VISTA-12345\", |\\n| 11 | \"name\": \"string\" |\\n| 12 | }, |\\n| 13 | \"start_date\": \"2023-01-01T12:00:00.000Z\", |\\n| 14 | \"state\":",
- "title": "Get Vistas Group | DevRev | Docs"
+ "id": "ART-1949_KNOWLEDGE_NODE-27",
+ "text": "bar.\\n\\n![]()\\n\\nTo export vistas to CSV or JSON, click **Actions** and select the format in which you want to export the vista. This allows you to export this data with the filters applied (segmented by owners or some filters). Cross-functional teams can collaborate on this data or import it into other platforms.\\n\\nDelete a vista\\n--------------\\n\\n1. Select the vista you want to delete from **My list** and click the edit button next to the name of your vista.\\n2. Click **Remove access**.\\n3.",
+ "title": "Vistas | Computer by DevRev | DevRev"
},
{
- "id": "ART-15463_KNOWLEDGE_NODE-1",
- "text": "|\\n| > | -H \"Content-Type: application/json\" \\\\ |\\n| > | -d \\'{ |\\n| > | \"id\": \"string\" |\\n| > | }\\' |\\n```\\n\\n[Try it](/api-reference/vistas/groups-get-post?explorer=true)\\n\\n200Successful\\n\\n```\\n| | |\\n| --- | --- |\\n| 1 | { |\\n| 2 | \"vista_group\": { |\\n| 3 | \"end_date\": \"2023-01-01T12:00:00.000Z\", |\\n| 4 | \"id\": \"string\", |\\n| 5 | \"name\": \"string\", |\\n| 6 | \"parent\": { |\\n| 7 | \"type\": \"string\", |\\n| 8 | \"display_id\": \"string\", |\\n| 9 | \"flavor\": \"nnl\", |\\n| 10 | \"id\": \"VISTA-12345\", |\\n|",
- "title": "Get Vistas Group (POST) | DevRev | Docs"
+ "id": "ART-15467_KNOWLEDGE_NODE-9",
+ "text": "etc.\\n\\nShow 14 enum values\\n\\nshared\\\\_withlist of objectsOptional\\n\\nFilter for vistas accessible to the input members.\\n\\nShow 2 properties\\n\\nskip\\\\_itemsbooleanOptional\\n\\nDenotes whether to skip items of vista\\\\_group\\\\_item in response.\\n\\nsort\\\\_bylist of stringsOptional\\n\\nFields to sort the vistas by and the direction to sort them.\\n\\nstatelist of enumsOptional\\n\\nDenotes the state of the vista group item.\\n\\nAllowed values:activecompletedplanned\\n\\n### Response\\n\\nThe response to",
+ "title": "List Vistas (POST) | DevRev | Docs"
},
{
"id": "ART-15465_KNOWLEDGE_NODE-6",
"text": "values:afterbefore\\n\\nmodified\\\\_dateobjectOptional\\n\\nProvides ways to specify date ranges on objects.\\n\\nShow 2 variants\\n\\nparent\\\\_idlist of stringsOptional\\n\\nParent ID of the vista group item.\\n\\nsort\\\\_bylist of stringsOptional\\n\\nComma-separated fields to sort the objects by.\\n\\nstart\\\\_dateobjectOptional\\n\\nProvides ways to specify date ranges on objects.\\n\\nShow 2 variants\\n\\nstatelist of enumsOptional\\n\\nDenotes the state of the vista group item.\\n\\nAllowed",
"title": "List Vistas Groups (POST) | DevRev | Docs"
- },
- {
- "id": "ART-15465_KNOWLEDGE_NODE-5",
- "text": "information about a list of vista groups.\\n\\nmodeenumOptional\\n\\nThe iteration mode to use. If \\xe2\\x80\\x9cafter\\xe2\\x80\\x9d, then entries after the provided\\ncursor will be returned, or if no cursor is provided, then from the\\nbeginning. If \\xe2\\x80\\x9cbefore\\xe2\\x80\\x9d, then entries before the provided cursor will be\\nreturned, or if no cursor is provided, then from the end. Entries will\\nalways be returned in the specified sort-by order.\\n\\nAllowed",
- "title": "List Vistas Groups (POST) | DevRev | Docs"
- },
- {
- "id": "ART-15465_KNOWLEDGE_NODE-1",
- "text": "\" \\\\ |\\n| > | -H \"Content-Type: application/json\" \\\\ |\\n| > | -d \\'{}\\' |\\n```\\n\\n[Try it](/api-reference/vistas/groups-list-post?explorer=true)\\n\\n200Successful\\n\\n```\\n| | |\\n| --- | --- |\\n| 1 | { |\\n| 2 | \"next_cursor\": \"string\", |\\n| 3 | \"prev_cursor\": \"string\", |\\n| 4 | \"vista_group\": [ |\\n| 5 | { |\\n| 6 | \"end_date\": \"2023-01-01T12:00:00.000Z\", |\\n| 7 | \"id\": \"string\", |\\n| 8 | \"name\": \"string\", |\\n| 9 | \"parent\": { |\\n| 10 | \"type\": \"string\", |\\n| 11 | \"display_id\": \"string\",",
- "title": "List Vistas Groups (POST) | DevRev | Docs"
}
]
},
@@ -956,54 +956,54 @@
"query": "accounts.export API filter by created date after",
"retrievals": [
{
- "id": "ART-1254_KNOWLEDGE_NODE-7",
- "text": "\"date-time\"`\\n\\nFilters for objects created after the provided timestamp (inclusive).\\n\\nmodified\\\\_date.beforestringOptional`format: \"date-time\"`\\n\\nFilters for objects created before the provided timestamp\\n(inclusive).\\n\\nsort\\\\_bylist of stringsOptional\\n\\nFields to sort the accounts by and the direction to sort them in.\\n\\nstagelist of stringsOptional\\n\\nFilters for accounts on specified stages.\\n\\ntierlist of stringsOptional\\n\\nTier of the accounts to be filtered.\\n\\nwebsiteslist of",
- "title": "Export Accounts | DevRev | Docs"
+ "id": "ART-1301_KNOWLEDGE_NODE-8",
+ "text": "\" : \" value \" 3 }\\nAPI Reference accounts Export.\\n\\nGET https:// api.devrev.ai / accounts.export\\nExports a collection of accounts.\\nQuery parameters.\\n\\ncreated_by string Optional\\nFilters for accounts created by the specified user(s).\\ncreated_date.after datetime Optional\\nFilters for objects created after the provided timestamp (inclusive).\\ncreated_date.before datetime Optional\\nFilters for objects created before the provided timestamp (inclusive).\\ncustom_fields map from strings to any",
+ "title": "Delete \u2014 DevRev | Docs"
},
{
- "id": "ART-1254_KNOWLEDGE_NODE-6",
- "text": "provided timestamp (inclusive).\\n\\ncreated\\\\_date.beforestringOptional`format: \"date-time\"`\\n\\nFilters for objects created before the provided timestamp\\n(inclusive).\\n\\ndisplay\\\\_namelist of stringsOptional\\n\\nArray of display names of accounts to be filtered.\\n\\nexternal\\\\_refslist of stringsOptional\\n\\nArray of references of accounts to be filtered.\\n\\nfirstintegerOptional`>=1``<=500`\\n\\nThe number of accounts to return. The default is \\'50\\'.\\n\\nmodified\\\\_date.afterstringOptional`format:",
- "title": "Export Accounts | DevRev | Docs"
+ "id": "ART-1302_KNOWLEDGE_NODE-8",
+ "text": "\" : \" value \" 3 }\\nAPI Reference accounts Export.\\n\\nGET https:// api.devrev.ai / accounts.export\\nExports a collection of accounts.\\nQuery parameters.\\n\\ncreated_by string Optional\\nFilters for accounts created by the specified user(s).\\ncreated_date.after datetime Optional\\nFilters for objects created after the provided timestamp (inclusive).\\ncreated_date.before datetime Optional\\nFilters for objects created before the provided timestamp (inclusive).\\ncustom_fields map from strings to any",
+ "title": "Export \u2014 DevRev | Docs"
},
{
- "id": "ART-1449_KNOWLEDGE_NODE-2",
- "text": "user(s).\\n\\ncreated_date.afterstringOptional`format: \"date-time\"`\\n\\nFilters for objects created after the provided timestamp (inclusive).\\n\\ncreated_date.beforestringOptional`format: \"date-time\"`\\n\\nFilters for objects created before the provided timestamp (inclusive).\\n\\ndisplay_namelist of stringsOptional\\n\\nArray of display names of accounts to be filtered.\\n\\nexternal_refslist of stringsOptional\\n\\nArray of references of accounts to be filtered.\\n\\nfirstintegerOptional`>=1``<=500`\\n\\nThe",
- "title": "Export Accounts \u2014 DevRev | Docs"
+ "id": "ART-1652_KNOWLEDGE_NODE-3",
+ "text": "delete.\\nResponse.\\n\\nThis endpoint returns a map from strings to any.\\nAPI Reference accounts Export.\\n\\nGET https:// api.devrev.ai / accounts.export\\nExports a collection of accounts.\\nQuery parameters.\\n\\ncreated_by string Optional\\nFilters for accounts created by the specified user(s).\\ncreated_date.after datetime Optional\\nFilters for objects created after the provided timestamp (inclusive).\\ncreated_date.before datetime Optional\\nFilters for objects created before the provided timestamp",
+ "title": "Export \u2014 DevRev | Docs"
},
{
- "id": "ART-1652_KNOWLEDGE_NODE-12",
- "text": "objects created after the provided timestamp (inclusive).\\nmodified_date.before datetime Optional\\nFilters for objects created before the provided timestamp (inclusive).\\nowned_by string Optional\\nFilters for accounts owned by the specified user(s).\\nsort_by string Optional\\nFields to sort the accounts by and the direction to sort them in.\\nstage string Optional\\nFilters for accounts on specified stages.\\ntags string Optional\\nList of tags to be filtered.\\nResponse.\\n\\nThis endpoint returns an",
- "title": "Export \u2014 DevRev | Docs"
+ "id": "ART-1653_KNOWLEDGE_NODE-3",
+ "text": "delete.\\nResponse.\\n\\nThis endpoint returns a map from strings to any.\\nAPI Reference accounts Export.\\n\\nGET https:// api.devrev.ai / accounts.export\\nExports a collection of accounts.\\nQuery parameters.\\n\\ncreated_by string Optional\\nFilters for accounts created by the specified user(s).\\ncreated_date.after datetime Optional\\nFilters for objects created after the provided timestamp (inclusive).\\ncreated_date.before datetime Optional\\nFilters for objects created before the provided timestamp",
+ "title": "Get \u2014 DevRev | Docs"
},
{
- "id": "ART-1303_KNOWLEDGE_NODE-6",
- "text": "exported accounts.\\nShow 18 properties\\nGET / accounts.export\\n$ curl -G https://api.devrev.ai/accounts.export \\\\ > -H \" Authorization: Bearer \" \\\\ > --data-urlencode created_date.after=2023-01-01T12:00:00Z \\\\ > --data-urlencode created_date.before=2023-01-01T12:00:00Z \\\\ > --data-urlencode modified_date.after=2023-01-01T12:00:00Z \\\\ > --data-urlencode modified_date.before=2023-01-01T12:00:00Z\\n200 Retrieved 1 { 2 \" accounts \" : [ 3 { 4 \" created_date \" : \" 2023-01-01T12:00:00Z \" , 5 \"",
- "title": "Export Post \u2014 DevRev | Docs"
+ "id": "ART-1779_KNOWLEDGE_NODE-3",
+ "text": "delete.\\nResponse.\\n\\nThis endpoint returns a map from strings to any.\\nAPI Reference accounts Export.\\n\\nGET https:// api.devrev.ai / accounts.export\\nExports a collection of accounts.\\nQuery parameters.\\n\\ncreated_by string Optional\\nFilters for accounts created by the specified user(s).\\ncreated_date.after datetime Optional\\nFilters for objects created after the provided timestamp (inclusive).\\ncreated_date.before datetime Optional\\nFilters for objects created before the provided timestamp",
+ "title": "Get \u2014 DevRev | Docs"
},
{
- "id": "ART-1652_KNOWLEDGE_NODE-10",
- "text": "Optional\\nFilters for accounts created by the specified user(s).\\ncreated_date.after datetime Optional\\nFilters for objects created after the provided timestamp (inclusive).\\ncreated_date.before datetime Optional\\nFilters for objects created before the provided timestamp (inclusive).\\ncursor string Optional\\nThe cursor to resume iteration from. If not provided, then iteration starts from the beginning.\\ncustom_fields map from strings to any Optional\\nFilters for custom fields.\\ndisplay_name",
- "title": "Export \u2014 DevRev | Docs"
+ "id": "ART-1831_KNOWLEDGE_NODE-3",
+ "text": "delete.\\nResponse.\\n\\nThis endpoint returns a map from strings to any.\\nAPI Reference accounts Export.\\n\\nGET https:// api.devrev.ai / accounts.export\\nExports a collection of accounts.\\nQuery parameters.\\n\\ncreated_by string Optional\\nFilters for accounts created by the specified user(s).\\ncreated_date.after datetime Optional\\nFilters for objects created after the provided timestamp (inclusive).\\ncreated_date.before datetime Optional\\nFilters for objects created before the provided timestamp",
+ "title": "Get \u2014 DevRev | Docs"
},
{
- "id": "ART-1303_KNOWLEDGE_NODE-15",
- "text": "Optional\\nFilters for accounts created by the specified user(s).\\ncreated_date.after datetime Optional\\nFilters for objects created after the provided timestamp (inclusive).\\ncreated_date.before datetime Optional\\nFilters for objects created before the provided timestamp (inclusive).\\ncursor string Optional\\nThe cursor to resume iteration from. If not provided, then iteration starts from the beginning.\\ncustom_fields map from strings to any Optional\\nFilters for custom fields.\\ndisplay_name",
- "title": "Export Post \u2014 DevRev | Docs"
+ "id": "ART-1787_KNOWLEDGE_NODE-3",
+ "text": "delete.\\nResponse.\\n\\nThis endpoint returns a map from strings to any.\\nAPI Reference accounts Export.\\n\\nGET https:// api.devrev.ai / accounts.export\\nExports a collection of accounts.\\nQuery parameters.\\n\\ncreated_by string Optional\\nFilters for accounts created by the specified user(s).\\ncreated_date.after datetime Optional\\nFilters for objects created after the provided timestamp (inclusive).\\ncreated_date.before datetime Optional\\nFilters for objects created before the provided timestamp",
+ "title": "Get \u2014 DevRev | Docs"
},
{
- "id": "ART-1639_KNOWLEDGE_NODE-10",
- "text": "Optional\\nFilters for accounts created by the specified user(s).\\ncreated_date.after datetime Optional\\nFilters for objects created after the provided timestamp (inclusive).\\ncreated_date.before datetime Optional\\nFilters for objects created before the provided timestamp (inclusive).\\ncursor string Optional\\nThe cursor to resume iteration from. If not provided, then iteration starts from the beginning.\\ncustom_fields map from strings to any Optional\\nFilters for custom fields.\\ndisplay_name",
- "title": "Export Post \u2014 DevRev | Docs"
+ "id": "ART-1588_KNOWLEDGE_NODE-3",
+ "text": "delete.\\nResponse.\\n\\nThis endpoint returns a map from strings to any.\\nAPI Reference accounts Export.\\n\\nGET https:// api.devrev.ai / accounts.export\\nExports a collection of accounts.\\nQuery parameters.\\n\\ncreated_by string Optional\\nFilters for accounts created by the specified user(s).\\ncreated_date.after datetime Optional\\nFilters for objects created after the provided timestamp (inclusive).\\ncreated_date.before datetime Optional\\nFilters for objects created before the provided timestamp",
+ "title": "Get \u2014 DevRev | Docs"
},
{
- "id": "ART-1303_KNOWLEDGE_NODE-17",
- "text": "objects created after the provided timestamp (inclusive).\\nmodified_date.before datetime Optional\\nFilters for objects created before the provided timestamp (inclusive).\\nowned_by string Optional\\nFilters for accounts owned by the specified user(s).\\nsort_by string Optional\\nFields to sort the accounts by and the direction to sort them in.\\nstage string Optional\\nFilters for accounts on specified stages.\\ntags string Optional\\nList of tags to be filtered.\\nResponse.\\n\\nThis endpoint returns an",
- "title": "Export Post \u2014 DevRev | Docs"
+ "id": "ART-1823_KNOWLEDGE_NODE-3",
+ "text": "delete.\\nResponse.\\n\\nThis endpoint returns a map from strings to any.\\nAPI Reference accounts Export.\\n\\nGET https:// api.devrev.ai / accounts.export\\nExports a collection of accounts.\\nQuery parameters.\\n\\ncreated_by string Optional\\nFilters for accounts created by the specified user(s).\\ncreated_date.after datetime Optional\\nFilters for objects created after the provided timestamp (inclusive).\\ncreated_date.before datetime Optional\\nFilters for objects created before the provided timestamp",
+ "title": "Get \u2014 DevRev | Docs"
},
{
- "id": "ART-1639_KNOWLEDGE_NODE-12",
- "text": "objects created after the provided timestamp (inclusive).\\nmodified_date.before datetime Optional\\nFilters for objects created before the provided timestamp (inclusive).\\nowned_by string Optional\\nFilters for accounts owned by the specified user(s).\\nsort_by string Optional\\nFields to sort the accounts by and the direction to sort them in.\\nstage string Optional\\nFilters for accounts on specified stages.\\ntags string Optional\\nList of tags to be filtered.\\nResponse.\\n\\nThis endpoint returns an",
- "title": "Export Post \u2014 DevRev | Docs"
+ "id": "ART-1833_KNOWLEDGE_NODE-3",
+ "text": "delete.\\nResponse.\\n\\nThis endpoint returns a map from strings to any.\\nAPI Reference accounts Export.\\n\\nGET https:// api.devrev.ai / accounts.export\\nExports a collection of accounts.\\nQuery parameters.\\n\\ncreated_by string Optional\\nFilters for accounts created by the specified user(s).\\ncreated_date.after datetime Optional\\nFilters for objects created after the provided timestamp (inclusive).\\ncreated_date.before datetime Optional\\nFilters for objects created before the provided timestamp",
+ "title": "Get \u2014 DevRev | Docs"
}
]
},
@@ -1012,54 +1012,54 @@
"query": "Sales One App not visible after login",
"retrievals": [
{
- "id": "ART-17569_KNOWLEDGE_NODE-1",
- "text": "message in the UI if they try to access an uninstalled app: \\xe2\\x80\\x9cWe can\\xe2\\x80\\x99t authorize you because of an OAuth error. For more information, contact your Salesforce administrator.\\xe2\\x80\\x9d and the OAUTH_APPROVAL_ERROR_GENERIC message.\"\\n\\nDue to this, customers may experience issues when trying to create a new Salesforce connection and install the DevRev app on their Salesforce instance.\\n\\nRead more about this on the shared article above. Follow the next steps to enable the",
+ "id": "ART-17569_KNOWLEDGE_NODE-0",
+ "text": "b'\"Starting in early September 2025, Salesforce will restrict the use of uninstalled connected apps. This usage restriction will block end users from using uninstalled connected apps. This change is part of Salesforce\\'s commitment to making our products and services secure-by-default.\"\\n\\n[Prepare for Connected App Usage Restrictions Change](https://help.salesforce.com/s/articleView?id=005132365&type=1)\\n\\n\"If API Access control isn\\xe2\\x80\\x99t enabled, end users see the following error",
"title": "Issues with Salesforce OAuth connection"
},
{
- "id": "ART-2019_KNOWLEDGE_NODE-0",
- "text": "b'Product\\nPlatform\\nSolutions\\nMarketplace\\nCompany\\nResources\\nPricing\\n\\nLogin Book a demo\\n\\nProduct\\n\\nPlatform\\n\\nSolutions\\n\\nMarketplace\\n\\nCompany\\n\\nResources\\n\\nPricing\\n\\nLogin Book a demo\\nSearch\\nCTRL + K\\n\\nIntroduction\\nAgentOS platform\\n\\nCore concepts\\nApps\\nGroups\\nParts & trails\\nVistas\\n\\nVista Reports\\n\\nTasks\\nUpdates\\nCustomer email notifications\\nRoles\\n\\nDefault privileges by group\\n\\nAccess control\\nObject customization\\nGlossary\\nSearch\\nWorkflow\\nTemplates\\nAccessing",
- "title": "Smart sprint | Automate | Snap-ins | DevRev"
+ "id": "ART-984_KNOWLEDGE_NODE-25",
+ "text": "for sales visibility (or at least notifications).\\n\\nThe key is that some level of integration is necessary between systems to provide visibility without requiring people to\\nlook in different places unless you have a platform that handles these in a converged manner.\\n\\nWhy change\\n\\nThis will help facilitate the following:\\n\\n\\n Interactions are coordinated and consistent\\n Hand-offs are handled correctly\\n Customers won\\xe2\\x80\\x99t get tossed around or told different things by different",
+ "title": "Why you Should be Looking at Support Differently"
},
{
- "id": "ART-1947_KNOWLEDGE_NODE-1",
- "text": "[Groups](/docs/product/groups)\\n + [Parts & trails](/docs/product/parts)\\n + [Vistas](/docs/product/vistas)\\n\\n - [Vista Reports](/docs/product/vista-reports)\\n - [Board view](/docs/product/board-view)\\n + [Tasks](/docs/product/tasks)\\n + [Updates](/docs/product/updates)\\n + [Customer email notifications](/docs/product/customer-emails)\\n + [Roles](/docs/product/roles)\\n\\n - [Default privileges by group](/docs/product/privs)\\n + [Access control](/docs/product/access-control)\\n +",
- "title": "Apps | Computer by DevRev | DevRev"
+ "id": "ART-1978_KNOWLEDGE_NODE-41",
+ "text": "If no such contact is found, JIT provisioning automatically creates a user account, allowing immediate access to the portal. This means users can sign up and log in without manual contact creation within the app.\\n* **Existing contacts without mapped accounts**: If a user is already a contact within the app but does not have a mapped account, they can still log in and create a ticket. In this scenario, the login is performed under the default workspace assigned to the contact.\\n* **Account",
+ "title": "Customer portal | Computer for Support Teams | DevRev"
},
{
- "id": "ART-12458_KNOWLEDGE_NODE-1",
- "text": "__\\n\\n[Pricing](https://devrev.ai/pricing)\\n\\n[Login](https://app.devrev.ai/login)[Book a demo](https://devrev.ai/request-a-demo)\\n\\nOn this page\\n\\n * [Troubleshooting](/public/sdks/react-native/troubleshooting#troubleshooting)\\n\\n[SDKs](/public/sdks)[DevRev SDK for React Native and Expo](/public/sdks/react-native/quickstart)\\n\\n#\\n\\nTroubleshooting\\n\\n * **Issue** : Support chat won\\xe2\\x80\\x99t show. **Solution** : Ensure you have correctly called one of the identification methods:",
- "title": "Troubleshooting \u2014 DevRev | Docs"
+ "id": "ART-15510_KNOWLEDGE_NODE-4",
+ "text": "features of the DevRev SDK, user identification is required.\\n\\nThe identification function should be placed appropriately in your app after the user logs in. If you have the user information available at app launch, call the function after the `DevRev.configure(appID)` method.\\n\\n##### \\n\\nOn iOS, if you haven\\xe2\\x80\\x99t previously identified the user, the DevRev SDK will automatically create an anonymous user for you immediately after the SDK is configured.\\n\\n##### \\n\\nThe `Identity`",
+ "title": "Features | DevRev | Docs"
},
{
- "id": "ART-3109_KNOWLEDGE_NODE-1",
- "text": "[Apps](/docs/product/apps)\\n + [Groups](/docs/product/groups)\\n + [Parts & trails](/docs/product/parts)\\n + [Vistas](/docs/product/vistas)\\n\\n - [Vista Reports](/docs/product/vista-reports)\\n - [Board view](/docs/product/board-view)\\n + [Tasks](/docs/product/tasks)\\n + [Updates](/docs/product/updates)\\n + [Customer email notifications](/docs/product/customer-emails)\\n + [Roles](/docs/product/roles)\\n\\n - [Default privileges by group](/docs/product/privs)\\n + [Access",
- "title": "Plug widget customization | Computer for Your Customers | DevRev"
+ "id": "ART-15515_KNOWLEDGE_NODE-5",
+ "text": "page\\n\\nIdentification\\n--------------\\n\\nTo access certain features of the DevRev SDK, user identification is required.\\n\\nThe identification function should be placed appropriately in your app after the user logs in. If you have the user information available at app launch, call the function after the `DevRev.configure(appID:)` method.\\n\\n##### \\n\\nIf you haven\\xe2\\x80\\x99t previously identified the user, the DevRev SDK will automatically create an anonymous user for you immediately after the",
+ "title": "Features | DevRev | Docs"
},
{
- "id": "ART-1968_KNOWLEDGE_NODE-1",
- "text": "[Apps](/docs/product/apps)\\n + [Groups](/docs/product/groups)\\n + [Parts & trails](/docs/product/parts)\\n + [Vistas](/docs/product/vistas)\\n\\n - [Vista Reports](/docs/product/vista-reports)\\n - [Board view](/docs/product/board-view)\\n + [Tasks](/docs/product/tasks)\\n + [Updates](/docs/product/updates)\\n + [Customer email notifications](/docs/product/customer-emails)\\n + [Roles](/docs/product/roles)\\n\\n - [Default privileges by group](/docs/product/privs)\\n + [Access",
- "title": "Conversation insights | Support analytics | Computer for Support Teams | DevRev"
+ "id": "ART-12604_KNOWLEDGE_NODE-0",
+ "text": "b\"DevRev Careers | Sales Development Representative \\n\\n* Product\\n* Platform\\n* Marketplace\\n* Company\\n* Resources\\n\\n[Login](https://app.devrev.ai/login)[Book a demo](/request-a-demo)\\n\\nProduct\\n\\nPlatform\\n\\nMarketplace\\n\\nCompany\\n\\nResources\\n\\n[Login](https://app.devrev.ai/login)[Book a demo](/request-a-demo)\\n\\ncareers\\n\\nSales Development Representative\\n================================\\n\\nBengaluru, Karnataka,",
+ "title": "DevRev Careers | Sales Development Representative"
},
{
- "id": "ART-16263_KNOWLEDGE_NODE-37",
- "text": "Confluence links (anonymous content cannot be tracked or mapped)\\n\\nEnabling the upload app button\\n------------------------------\\n\\nIf you do not see the **Upload App** button in Confluence Datacenter, it may be due to permission restrictions or feature disablement by your admin. To enable it:\\n\\n1. Ensure you are logged in as a **Confluence Administrator**.\\n2. Go to **Administration > Add-ons > Upload App**.\\n3. If the button is still not available:\\n * Contact your system administrator",
- "title": "Confluence Datacenter AirSync | AirSync | Snap-ins | DevRev"
+ "id": "ART-16579_KNOWLEDGE_NODE-6",
+ "text": "of the DevRev SDK, user identification is required.\\n\\nThe identification function should be placed appropriately in your app after the user logs in. If you have the user information available at app launch, call the function after the `DevRev.configure(appID)` method.\\n\\n##### \\n\\nOn iOS, if you haven\\xe2\\x80\\x99t previously identified the user, the DevRev SDK will automatically create an anonymous user for you immediately after the SDK is configured.\\n\\n##### \\n\\nThe `Identity` structure",
+ "title": "Features | DevRev | Docs"
},
{
- "id": "ART-2059_KNOWLEDGE_NODE-0",
- "text": "b'Product Platform Solutions Marketplace Company Resources Pricing\\n\\nLogin Book a demo\\nProduct Platform Solutions Marketplace Company Resources Pricing\\nLogin Book a demo\\nSearch CTRL + K\\n\\nIntroduction AgentOS platform\\n\\nCore concepts Apps Groups Parts & trails Vistas Vista Reports\\nTasks Updates Customer email notifications Roles Default privileges by group\\nAccess control Object customization Glossary Search People insights Workflow Templates Accessing DevRev External identity provider",
- "title": "Install PLuG chat on your website"
+ "id": "ART-2901_KNOWLEDGE_NODE-9",
+ "text": "configure the SDK at the app\\xe2\\x80\\x99s entry point or initial view.\\n\\n## Identification\\n\\nTo access certain features of the DevRev SDK, user identification is required.\\n\\nThe identification function should be placed appropriately in your app after the user logs in. If you have the user information available at app launch, call the function after the `DevRev.configure(appID:)` method.\\n\\n#####\\n\\nIf you haven\\xe2\\x80\\x99t previously identified the user, the DevRev SDK will automatically",
+ "title": "iOS integration \u2014 DevRev | Docs"
},
{
- "id": "ART-4186_KNOWLEDGE_NODE-1",
- "text": "[Apps](/docs/product/apps)\\n + [Groups](/docs/product/groups)\\n + [Parts & trails](/docs/product/parts)\\n + [Vistas](/docs/product/vistas)\\n\\n - [Vista Reports](/docs/product/vista-reports)\\n - [Board view](/docs/product/board-view)\\n + [Tasks](/docs/product/tasks)\\n + [Updates](/docs/product/updates)\\n + [Customer email notifications](/docs/product/customer-emails)\\n + [Roles](/docs/product/roles)\\n\\n - [Default privileges by group](/docs/product/privs)\\n + [Access",
- "title": "Computer for User Insights | Session analytics | Computer for Your Customers | DevRev"
+ "id": "ART-17569_KNOWLEDGE_NODE-1",
+ "text": "message in the UI if they try to access an uninstalled app: \\xe2\\x80\\x9cWe can\\xe2\\x80\\x99t authorize you because of an OAuth error. For more information, contact your Salesforce administrator.\\xe2\\x80\\x9d and the OAUTH_APPROVAL_ERROR_GENERIC message.\"\\n\\nDue to this, customers may experience issues when trying to create a new Salesforce connection and install the DevRev app on their Salesforce instance.\\n\\nRead more about this on the shared article above. Follow the next steps to enable the",
+ "title": "Issues with Salesforce OAuth connection"
},
{
- "id": "ART-1477_KNOWLEDGE_NODE-20",
- "text": "it.](https://devrev.ai/blog/soc-compliance)\\n\\nProduct\\n\\n * [Build](https://devrev.ai/build)\\n * [Support](https://devrev.ai/support)\\n * [Search](https://devrev.ai/search)\\n * [PLuG - User Engagement](https://devrev.ai/plug-user-engagement)\\n * [PLuG - User Observability](https://devrev.ai/plug-observability)\\n * [Marketplace](https://marketplace.devrev.ai/)\\n\\nPlatform\\n\\n * [Airdrop](https://devrev.ai/airdrop)\\n * [Analytics](https://devrev.ai/analytics)\\n * [Workflow",
- "title": "Snap-in V1 manifest \u2014 DevRev | Docs"
+ "id": "ART-12606_KNOWLEDGE_NODE-0",
+ "text": "b\"DevRev Careers | Revenue: Sales Development Representative\\n\\n* Product\\n* Platform\\n* Marketplace\\n* Company\\n* Resources\\n\\n[Login](https://app.devrev.ai/login)[Book a demo](/request-a-demo)\\n\\nProduct\\n\\nPlatform\\n\\nMarketplace\\n\\nCompany\\n\\nResources\\n\\n[Login](https://app.devrev.ai/login)[Book a demo](/request-a-demo)\\n\\ncareers\\n\\nRevenue: Sales Development Representative\\n=========================================\\n\\nBuenos Aires,",
+ "title": "DevRev Careers | Revenue: Sales Development Representative"
}
]
},
@@ -1072,25 +1072,35 @@
"text": "analytics](/docs/product/support-analytics)\\n\\n - [Conversation insights](/docs/dashboards/conversation-insights)\\n - [Conversation-SLA Analytics](/docs/dashboards/conversation-sla-analytics)\\n - [Conversation-Team Performance](/docs/dashboards/conversation-team-performance)\\n - [Ticket insights](/docs/dashboards/ticket-insights)\\n - [Ticket-SLA Analytics](/docs/dashboards/ticket-sla-analytics)\\n - [Ticket-Team Performance](/docs/dashboards/ticket-team-performance)\\n +",
"title": "Ticket linked issues comment sync | Automate | Snap-ins | DevRev"
},
+ {
+ "id": "ART-1975_KNOWLEDGE_NODE-28",
+ "text": "conversations against standalone tickets.\\n* **Tickets linked to issues**\\n\\n The percentage of tickets linked to product issues.\\n* **Active tickets by owner**\\n\\n The number of Open or In Progress tickets grouped by owner.\\n* **Tickets created vs. closed**\\n\\n The trend of tickets created against those closed.\\n\\nCustomer satisfaction (CSAT)\\n----------------------------\\n\\n* **CSAT score distribution**\\n\\n A distribution of customer satisfaction scores on tickets.\\n\\nTime spent per",
+ "title": "Ticket insights | Support analytics | Computer for Support Teams | DevRev"
+ },
{
"id": "ART-1972_KNOWLEDGE_NODE-16",
"text": "sync](/docs/automations/ticket-linked-issues-comment-sync)\\n - [Slack message agent](/docs/automations/slack-message-agent)\\n + [Integrate](/docs/integrate)\\n\\n - [Bitbucket](/docs/integrations/bitbucket)\\n - [Calendly](/docs/integrations/calendly)\\n - [Coralogix security integration](/docs/integrations/coralogix)\\n - [Datadog](/docs/integrations/datadog)\\n - [Google Calendar AirSync](/docs/integrations/google-calendar-airdrop)\\n - [Email](/docs/integrations/email)\\n\\n",
"title": "Ticket-SLA Analytics | Support analytics | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1979_KNOWLEDGE_NODE-39",
- "text": "other tickets or issues that relate to this ticket, click **Link Records** and select the relevant items.\\n7. If you would like to immediately create another ticket, select **Create multiple**.\\n8. Click **Create**.\\n\\nIf a ticket is created from an existing conversation, then the ticket's title and description are populated automatically from the conversation.\\n\\n![]()\\n\\nYou can create a child issue by clicking **+ Link issue** > **Add a child issue**. You can link the other existing issue as",
- "title": "Tickets | Computer for Support Teams | DevRev"
+ "id": "ART-1972_KNOWLEDGE_NODE-15",
+ "text": "[Operational SLA Metrics](/docs/automations/operational-sla-metrics)\\n - [Custom field migration](/docs/automations/custom-field-migration)\\n - [Slack scraper](/docs/automations/slack-scraper)\\n - [Slack Broadcaster](/docs/automations/slack-broadcaster)\\n - [Reported by enricher](/docs/automations/ticket-reported-by)\\n - [Ticket approval workflow](/docs/automations/ticket-approval-workflow)\\n - [Ticket linked issues comment",
+ "title": "Ticket-SLA Analytics | Support analytics | Computer for Support Teams | DevRev"
},
{
- "id": "ART-15664_KNOWLEDGE_NODE-17",
- "text": "exhaustive list.\\n\\n### Links from tickets\\n\\nLinks from tickets\\n\\ntarget\\n\\nsource\\n\\nis dependent on\\n\\nis related to\\n\\nis related to\\n\\nis parent of\\n\\nis merged into\\n\\nticket\\n\\nissue\\n\\nticket\\n\\narticle\\n\\n##### \\n\\nOnly ticket \\xe2\\x86\\x92 issue is allowed for creating a link with \\xe2\\x80\\x9cis dependent on\\xe2\\x80\\x9d. Creating the link in reverse (issue \\xe2\\x86\\x92 ticket) is not possible; however, you can swap the source and target objects to achieve the same result.\\n\\n### Links",
- "title": "Links | DevRev | Docs"
+ "id": "ART-1447_KNOWLEDGE_NODE-2",
+ "text": "[Support](https://devrev.ai/support)\\n * [Search](https://devrev.ai/search)\\n * [PLuG - User Engagement](https://devrev.ai/plug-user-engagement)\\n * [PLuG - User Observability](https://devrev.ai/plug-observability)\\n * [Marketplace](https://marketplace.devrev.ai/)\\n\\nPlatform\\n\\n * [Airdrop](https://devrev.ai/airdrop)\\n * [Analytics](https://devrev.ai/analytics)\\n * [Workflow Engine](https://devrev.ai/workflow-engine)\\n * [Turing AI](https://devrev.ai/turing-ai)\\n\\nResources\\n\\n *",
+ "title": "Tickets and issues \u2014 DevRev | Docs"
},
{
- "id": "ART-1002_KNOWLEDGE_NODE-3",
- "text": "systems being used for engineering work are commonly abused by sales, marketing and support teams. For example, a sales rep may create an issue for a developer for a customer request. In the case of support, you\\xe2\\x80\\x99ll commonly see a ton of duplicate issues when only one was really necessary. This leads to a lot of noise for developers, and devalues the notion of an \\xe2\\x80\\x9cissue\\xe2\\x80\\x9d. By keeping a clear line between tickets and issues, we ensure the following:\\n\\n\\n issues",
- "title": "Tickets, Issues: When to Use Each"
+ "id": "ART-16189_KNOWLEDGE_NODE-7",
+ "text": "Computer CX Agent for in-app customer support\\n* Deployed advanced dashboards and analytics with Computer for User Insights\\n\\nA major breakthrough was the ability to sync issues **both ways** between JIRA and DevRev, streamlining collaboration:\\n\\nBeing able to link issues from JIRA back to DevRev, not just the other way around, is a huge time saver. We reduced our backlog by about a hundred tickets through this cleanup. We've come a long way, and efficiency has really been going",
+ "title": "FOSSA\u2019s Unified Support Strategy for Elevated Customer Experience"
+ },
+ {
+ "id": "ART-15716_KNOWLEDGE_NODE-8",
+ "text": "for TicketsWe have a summarize option (it would resemble sparkle symbol) in the top right corner of the ticket view, which uses the ticket content to summarize the ticket\\n\\n7. Difference between Issues and Tickets\\n\\nTickets\\xc2\\xa0are for customer support\\xe2\\x80\\x94tracking requests, problems, or questions from customers or prospects.\\n\\nIssues\\xc2\\xa0are internal work items for developers\\xe2\\x80\\x94used to improve the product, fix bugs, or implement features. Issues can be linked to",
+ "title": "Support queries related playbook"
},
{
"id": "ART-4184_KNOWLEDGE_NODE-15",
@@ -1098,24 +1108,14 @@
"title": "Ticket linked issues comment sync | Automate | Snap-ins | DevRev"
},
{
- "id": "ART-2012_KNOWLEDGE_NODE-4",
- "text": "Analytics](/docs/dashboards/ticket-sla-analytics?)\\n * [Ticket-Team Performance](/docs/dashboards/ticket-team-performance?)\\n\\n * [Conversations](/docs/product/conversation?)\\n\\n * [Convert Conversations to Tickets](/docs/product/Conversation-Tickets?)\\n\\n * [Tickets](/docs/product/tickets?)\\n * [Routing](/docs/product/routing?)\\n * [Support best practices](/docs/product/support-bp?)\\n * [Customer portal](/docs/product/support-portal?)\\n * [Questions &",
- "title": "Follow-up ticket | Automate | Snap-ins | DevRev"
- },
- {
- "id": "ART-1975_KNOWLEDGE_NODE-28",
- "text": "conversations against standalone tickets.\\n* **Tickets linked to issues**\\n\\n The percentage of tickets linked to product issues.\\n* **Active tickets by owner**\\n\\n The number of Open or In Progress tickets grouped by owner.\\n* **Tickets created vs. closed**\\n\\n The trend of tickets created against those closed.\\n\\nCustomer satisfaction (CSAT)\\n----------------------------\\n\\n* **CSAT score distribution**\\n\\n A distribution of customer satisfaction scores on tickets.\\n\\nTime spent per",
- "title": "Ticket insights | Support analytics | Computer for Support Teams | DevRev"
- },
- {
- "id": "ART-15664_KNOWLEDGE_NODE-14",
- "text": "> | \"leaf_type\": \"issue\", |\\n| > | \"subtype\": \"social_media\" |\\n| > | } |\\n| > | ], |\\n| > | \"target_types\": [ |\\n| > | { |\\n| > | \"leaf_type\": \"ticket\" |\\n| > | } |\\n| > | ], |\\n| > | \"forward_name\": \"is related to\", |\\n| > | \"backward_name\": \"is related to\" |\\n| > | }\\' |\\n```\\n\\nThis configuration:\\n\\n* Allows issues of subtype \\xe2\\x80\\x9csocial\\\\_media\\xe2\\x80\\x9d to be linked to tickets\\n* Rejects attempts to link issues with no subtype or with other subtypes\\n\\n##### \\n\\nThe subtype",
- "title": "Links | DevRev | Docs"
+ "id": "ART-1979_KNOWLEDGE_NODE-60",
+ "text": "tickets\\n-----------------\\n\\nFollow up tickets allow support teams to seamlessly address unresolved issues, recurring problems, or additional concerns without losing context. By linking follow-up tickets to the original ticket(archived/immutable), teams can track ongoing issues more effectively, minimize duplicate work and enhance customer experience. A follow-up ticket is a new ticket that is created and linked when a customer responds in reference to an archived/immutable ticket. The",
+ "title": "Tickets | Computer for Support Teams | DevRev"
},
{
- "id": "ART-4184_KNOWLEDGE_NODE-5",
- "text": "[Conversations](/docs/product/conversation)\\n\\n - [Conversation to ticket conversion](/docs/product/conversation-ticket)\\n + [Tickets](/docs/product/tickets)\\n + [Routing](/docs/product/routing)\\n + [Support best practices](/docs/product/support-bp)\\n + [Customer portal](/docs/product/support-portal)\\n + [Questions & answers](/docs/product/qa)\\n + [Knowledge Base](/docs/product/knowledge-base)\\n\\n - [Articles](/docs/product/articles)\\n - [Collections](/docs/product/collection)\\n",
- "title": "Ticket linked issues comment sync | Automate | Snap-ins | DevRev"
+ "id": "ART-1947_KNOWLEDGE_NODE-25",
+ "text": "systems, important details that help define the *why* behind work is lost.\\n\\n\\xf0\\x9f\\x8e\\xa5 Video: Convergence: Bringing work together\\n\\nBy linking work items\\xe2\\x80\\x94conversations and tickets for support, issues and enhancements for build\\xe2\\x80\\x94together, DevRev preserves context. That context defines the problem and requirements for anyone who works on this issue. Moreover, both tickets and issues are always associated with [parts](/docs/product/parts), tying them to the overall",
+ "title": "Apps | Computer by DevRev | DevRev"
}
]
},
@@ -1124,54 +1124,54 @@
"query": "Data residency compliance for international customers",
"retrievals": [
{
- "id": "ART-888_KNOWLEDGE_NODE-42",
- "text": "spaces under your sole control.How we transfer information we collect internationallyInternational transfers of information we collectWe collect information globally and may transfer, process and store your information outside of your country of residence, to wherever we or our third-party service providers operate for the purpose of providing you the Services. Whenever we transfer your information, we take steps to protect it.International transfers within the DevRev Companies: To facilitate",
- "title": "Privacy Policy"
+ "id": "ART-12476_KNOWLEDGE_NODE-1",
+ "text": "designed to meet GDPR and SOC 2 compliance requirements, with controls in place to support your data privacy needs.\\n\\nAdvanced enterprise login: Seamless SAML compliance for all enterprise logins regardless of your SSO provider.\\n\\nRegional data residency options: We offer data residency options in Europe, Australia, US East (Virginia), and India, with logical data isolation and access control features.\\n\\nSelf-serve user management: Easily add or remove users from your workspace and manage",
+ "title": "The Future of Sessions - Powered By DevRev"
},
{
- "id": "ART-4174_KNOWLEDGE_NODE-11",
- "text": "(EEA) is adequately protected, even when transferred to countries that may not offer an equivalent level of data protection.\\n\\n### UK-Specific Clauses\\n\\nFollowing Brexit, we also apply tailored safeguards for personal data transferred from the United Kingdom. We leverage the UK\\xe2\\x80\\x99s International Data Transfer Addendum to the EU SCCs, which ensures compliance with UK-specific data transfer requirements and aligns with the standards established by the UK\\xe2\\x80\\x99s Information",
- "title": "Data Processing Agreement | DevRev"
+ "id": "ART-15620_KNOWLEDGE_NODE-15",
+ "text": "Mature partner ecosystem and app marketplace development\\n\\nIntercom Weakness : Limited data residency options (US, EU, AU only) restricting BFSI adoption\\n\\nDevRev Opportunity : Address geographic compliance requirements Intercom cannot serve Scalability Comparison\\n\\nIntercom Challenge : Users report scaling difficulties requiring costly upgrades and custom development\\n\\nDevRev Advantage : Unlimited scale and customizability providing enterprise flexibility\\n\\nMarket Perception : Intercom\\'s",
+ "title": "Intercom - Competitive - for the PLuG on website"
},
{
- "id": "ART-4174_KNOWLEDGE_NODE-12",
- "text": "Commissioner\\xe2\\x80\\x99s Office (ICO).\\n\\n### United States Data Transfer Mechanisms\\n\\nFor personal data transfers to the United States, DevRev employs recognized contractual frameworks and implements additional measures, as necessary, to safeguard your information in accordance with evolving U.S. data protection guidelines. We work to align with relevant standards and best practices to address regulatory considerations around cross-border data transfers.\\n\\n### What about Personal Data use",
- "title": "Data Processing Agreement | DevRev"
+ "id": "ART-888_KNOWLEDGE_NODE-44",
+ "text": "protection clauses, which have been largely adopted by countries worldwide or other appropriate legal mechanisms to safeguard the transfer.International transfers to third parties: Some of the third parties described in this privacy policy, which provide services to us under contract, are based in other countries that may not have equivalent privacy and data protection laws to the country in which you reside. When we share information of customers in the European Economic Area, the UK, or",
+ "title": "Privacy Policy"
},
{
- "id": "ART-4183_KNOWLEDGE_NODE-1",
- "text": "More](https://cdn.sanity.io/files/umrbtih2/development/8c3ab1aef7fee37a816c3116a89b08b5db2ba541.pdf)\\n\\nDeveloping and maintaining an incident response plan that includes subprocessors\\xe2\\x80\\x99 roles in managing data breaches.\\n\\n![]()\\n\\nChoose another country or region to see content specific to your location.\\n\\n\\xf0\\x9f\\x8c\\x8e English\\xf0\\x9f\\x87\\xaf\\xf0\\x9f\\x87\\xb5 Japanese\\n\\n[Enterprise grade security to protect customer data\\n\\nLearn more about",
- "title": "Security Subprocessors - GDPR Compliance | DevRev"
+ "id": "ART-15620_KNOWLEDGE_NODE-19",
+ "text": "Customers Facing Scale Issues : Organizations outgrowing Intercom\\'s capabilities and experiencing costly upgrade requirements\\n\\nEnterprise Prospects : Companies needing data residency options beyond US/EU/AU limitations\\n\\nAI-Forward Organizations : Teams seeking sophisticated AI capabilities beyond basic chatbot functionality\\n\\nCost-Conscious SMBs : Smaller companies frustrated with Intercom\\'s expensive per-resolution pricing\\n\\nTechnical Product Companies : Organizations needing deep",
+ "title": "Intercom - Competitive - for the PLuG on website"
},
{
- "id": "ART-4174_KNOWLEDGE_NODE-10",
- "text": "data privacy laws. To support this commitment, we use industry-standard frameworks and legal instruments to facilitate the lawful and secure transfer of personal data across borders.\\n\\n### EU Standard Contractual Clauses (SCCs)\\n\\nFor data transfers involving EU-based users, DevRev relies on the EU Standard Contractual Clauses (SCCs). These clauses, approved by the European Commission, provide contractual safeguards to ensure that personal data transferred outside the European Economic Area",
+ "id": "ART-4174_KNOWLEDGE_NODE-8",
+ "text": "we implement to keep your data secure, such as encryption, access controls, and regular security audits.\\n* **Data Subject Rights:** Information on how we support you in responding to requests from individuals to exercise their rights under data protection laws.\\n* **Data Transfer:** Terms regarding international data transfers, ensuring compliance with GDPR and other regulatory frameworks.\\n* **Subprocessors:** A list of any third parties we partner we engage in order to process data on your",
"title": "Data Processing Agreement | DevRev"
},
{
- "id": "ART-888_KNOWLEDGE_NODE-43",
- "text": "our global operations, we transfer information globally and allow access to that information from countries in which the DevRev owned or operated companies and have operations for the purposes described in this policy. These countries may not have equivalent privacy and data protection laws to the laws of many of the countries where our customers and users are based. When we share information about you within and among DevRev corporate affiliates, we make use of standard contractual data",
+ "id": "ART-888_KNOWLEDGE_NODE-42",
+ "text": "spaces under your sole control.How we transfer information we collect internationallyInternational transfers of information we collectWe collect information globally and may transfer, process and store your information outside of your country of residence, to wherever we or our third-party service providers operate for the purpose of providing you the Services. Whenever we transfer your information, we take steps to protect it.International transfers within the DevRev Companies: To facilitate",
"title": "Privacy Policy"
},
{
- "id": "ART-4174_KNOWLEDGE_NODE-9",
- "text": "behalf, as well as explanations on how such parties safeguard your data.\\n* **Standard Contractual clauses and other country specific clauses:** Our DPA also includes the EU Commission's Standard Contractual clausesand other country specific clauses for transferring and processing data outside of the EEA, UK and USA.\\n\\n### How does DevRev handle International Data transfers?\\n\\nAt DevRev, we understand the importance of securely managing international data transfers in compliance with global",
+ "id": "ART-4174_KNOWLEDGE_NODE-11",
+ "text": "(EEA) is adequately protected, even when transferred to countries that may not offer an equivalent level of data protection.\\n\\n### UK-Specific Clauses\\n\\nFollowing Brexit, we also apply tailored safeguards for personal data transferred from the United Kingdom. We leverage the UK\\xe2\\x80\\x99s International Data Transfer Addendum to the EU SCCs, which ensures compliance with UK-specific data transfer requirements and aligns with the standards established by the UK\\xe2\\x80\\x99s Information",
"title": "Data Processing Agreement | DevRev"
},
{
- "id": "ART-4174_KNOWLEDGE_NODE-8",
- "text": "we implement to keep your data secure, such as encryption, access controls, and regular security audits.\\n* **Data Subject Rights:** Information on how we support you in responding to requests from individuals to exercise their rights under data protection laws.\\n* **Data Transfer:** Terms regarding international data transfers, ensuring compliance with GDPR and other regulatory frameworks.\\n* **Subprocessors:** A list of any third parties we partner we engage in order to process data on your",
+ "id": "ART-4174_KNOWLEDGE_NODE-9",
+ "text": "behalf, as well as explanations on how such parties safeguard your data.\\n* **Standard Contractual clauses and other country specific clauses:** Our DPA also includes the EU Commission's Standard Contractual clausesand other country specific clauses for transferring and processing data outside of the EEA, UK and USA.\\n\\n### How does DevRev handle International Data transfers?\\n\\nAt DevRev, we understand the importance of securely managing international data transfers in compliance with global",
"title": "Data Processing Agreement | DevRev"
},
{
- "id": "ART-4174_KNOWLEDGE_NODE-15",
- "text": "the GDPR as well as any other specific local legal requirements.\\n\\n### What about data security?\\n\\nWe have implemented industry standard organisational and other security like SOC-II certification to keep your data safe.\\n\\nYou can find out more about the security measures we employ by following this [link](https://security.devrev.ai/).\\n\\n### Reach out to us with any additional questions.\\n\\nShould you have any additional questions about privacy and data processing at DevRev, our data",
- "title": "Data Processing Agreement | DevRev"
+ "id": "ART-15620_KNOWLEDGE_NODE-22",
+ "text": "orchestration vs. limited chatbot functionality\\n\\nGeographic Flexibility : Broader data residency options vs. limited regional availability Market Positioning Strategy Against Intercom\\'s Strengths\\n\\nOmnichannel Presence : Acknowledge multichannel value while emphasizing AI quality over quantity\\n\\nVisual Intelligence : Develop competitive visual AI capabilities for image understanding\\n\\nMarketing Integration : Consider support-marketing workflow integration for comprehensive",
+ "title": "Intercom - Competitive - for the PLuG on website"
},
{
- "id": "ART-4183_KNOWLEDGE_NODE-4",
- "text": "Policy](/legal/cookie-policy)\\n* [Privacy Policy](/legal/privacy-policy)\\n* [Terms of Service](/legal/terms-of-service)\\n\\n[System Status](/status)\\n\\n\\xc2\\xa9 2025 DevRev Inc.'",
- "title": "Security Subprocessors - GDPR Compliance | DevRev"
+ "id": "ART-15620_KNOWLEDGE_NODE-4",
+ "text": "Mature partner ecosystem and app marketplace\\n\\nImplementation : Out-of-the-box offerings for Zendesk or Salesforce\\n\\nWeakness : Slow and clunky deployment for other systems of record Enterprise Readiness\\n\\nPosition : Capable but with geographic limitations\\n\\nStrength : Building mature partner ecosystem for enterprise use cases\\n\\nCritical Limitation : Fin data residency only available in US, EU, and Australia\\n\\nImpact : Major barrier for BFSI companies due to government regulations",
+ "title": "Intercom - Competitive - for the PLuG on website"
}
]
},
@@ -1180,54 +1180,54 @@
"query": "declarative pathing within the bot",
"retrievals": [
{
- "id": "ART-1950_KNOWLEDGE_NODE-5",
- "text": "ticket conversion](/docs/product/conversation-ticket)\\n + [Tickets](/docs/product/tickets)\\n + [Routing](/docs/product/routing)\\n + [Support best practices](/docs/product/support-bp)\\n + [Customer portal](/docs/product/support-portal)\\n + [Questions & answers](/docs/product/qa)\\n + [Knowledge Base](/docs/product/knowledge-base)\\n\\n - [Articles](/docs/product/articles)\\n - [Collections](/docs/product/collection)\\n + [Turing AI agent](/docs/product/conversational-bot)\\n\\n - [Best",
- "title": "Parts & trails | Computer by DevRev | DevRev"
+ "id": "ART-16689_KNOWLEDGE_NODE-5",
+ "text": "DevRev, tailoring the product to their workflows.\\n* **Embedded deeply configurable, data\\xe2\\x80\\x91driven UIs -** layouts, components, and visualizations can be reshaped end\\xe2\\x80\\x91to\\xe2\\x80\\x91end via declarative configuration.\\n\\n\\xe2\\x80\\xa6and we\\xe2\\x80\\x99re just getting started. If you care deeply about **craftsmanship**, **modular UI architecture**, and **world\\xe2\\x80\\x91class developer experience**, this is your playground.\\n\\n---\\n\\n### What You\\xe2\\x80\\x99ll Do\\n\\n*",
+ "title": "DevRev Careers | Member of Technical Staff"
},
{
- "id": "ART-12391_KNOWLEDGE_NODE-6",
- "text": "+ [Turing AI agent](/docs/product/conversational-bot)\\n\\n - [Best practices for documentation that supports AI](/docs/product/writing-bp)\\n + [Commands](/docs/product/commands)\\n + [Service-level agreement](/docs/product/sla)\\n + [Operational-level agreement](/docs/product/ola)\\n + [Support snap-ins](/docs/product/snapins-support)\\n* [Computer for Builders](/docs/product/build)\\n\\n + [Issues](/docs/product/issues)\\n + [Now, Next, Later](/docs/product/nnl)\\n + [Sprint",
- "title": "Conversational workflows | Workflows | Computer by DevRev | DevRev"
+ "id": "ART-2133_KNOWLEDGE_NODE-54",
+ "text": "we\\xe2\\x80\\x99ve mentioned before, this improves \\xef\\xac\\x82ow and deep work durations during the day in the life of a knowledge worker.\\n\\nThe Essential Methodology also argues for reducing human work by getting intelligent bots to look up legacy systems, execute work\\xef\\xac\\x82ows, and notify people. Goal orientation in AI bots entails routing natural language intent to bot skills, which in turn have deterministic work\\xef\\xac\\x82ows attached to them.\\n\\nPage 14 of 16\\n\\nThe Essential",
+ "title": "The Essential Methodology: Less but Better"
},
{
- "id": "ART-1996_KNOWLEDGE_NODE-5",
- "text": "ticket conversion](/docs/product/conversation-ticket)\\n + [Tickets](/docs/product/tickets)\\n + [Routing](/docs/product/routing)\\n + [Support best practices](/docs/product/support-bp)\\n + [Customer portal](/docs/product/support-portal)\\n + [Questions & answers](/docs/product/qa)\\n + [Knowledge Base](/docs/product/knowledge-base)\\n\\n - [Articles](/docs/product/articles)\\n - [Collections](/docs/product/collection)\\n + [Turing AI agent](/docs/product/conversational-bot)\\n\\n - [Best",
- "title": "Roadmap | Computer for Builders | DevRev"
+ "id": "ART-17649_KNOWLEDGE_NODE-4",
+ "text": "sophisticated routing mechanisms\\n* Custom views and dashboards for different stakeholders\\n* Deterministic bot flow to guide customers through support experiences\\n* Comprehensive e2e testing to ensure reliability\\n\\n#### *We needed different instances on different paths of our website with separate memory and appearances. DevRev's architecture made this possible through multiple dev organizations.*\\xe2\\x80\\x9d\\n\\nThe impact\\n----------\\n\\n### Multiple customized support channels\\n\\nDevRev",
+ "title": "Leading APAC fintech transforms support with multi-instance AI solution"
},
{
- "id": "ART-1987_KNOWLEDGE_NODE-28",
- "text": "Computer either creates a ticket or routes the conversation using the relevant routing rule.\\n\\n![]()\\n\\nGoal-oriented mode (Beta)\\n-------------------------\\n\\nThe goal-oriented agent allows users to create complete workflows triggered by their actions.\\n\\nGoal-oriented mode is currently in beta. Contact our support team for more information.\\n\\n[PreviousCollections](/docs/product/collection)[NextBest practices for documentation that supports AI](/docs/product/writing-bp)\\n\\n#### On this",
- "title": "Turing AI agent | Computer for Support Teams | DevRev"
+ "id": "ART-1954_KNOWLEDGE_NODE-35",
+ "text": "determined by the type of action, rather than solely by the actor performing the action.\\n\\nExamples:\\n\\n* If mentions are set to **Important** and a bot's notifications are set to **Others**, then bot mentions will only appear in the **Others** tab.\\n* If mentions are set to **Important** and a bot's notifications are also set to **Important**, then bot mentions will appear in the **Important** tab.\\n* If mentions are set to **Others** and a bot's notifications are set to **Important**, then",
+ "title": "Updates | Computer by DevRev | DevRev"
},
{
- "id": "ART-1950_KNOWLEDGE_NODE-6",
- "text": "practices for documentation that supports AI](/docs/product/writing-bp)\\n + [Commands](/docs/product/commands)\\n + [Service-level agreement](/docs/product/sla)\\n + [Operational-level agreement](/docs/product/ola)\\n + [Support snap-ins](/docs/product/snapins-support)\\n* [Computer for Builders](/docs/product/build)\\n\\n + [Issues](/docs/product/issues)\\n + [Now, Next, Later](/docs/product/nnl)\\n + [Sprint mode](/docs/product/sprint)\\n + [Enhancements](/docs/product/enhancements)\\n +",
- "title": "Parts & trails | Computer by DevRev | DevRev"
+ "id": "ART-12582_KNOWLEDGE_NODE-5",
+ "text": "and build quicker solutions\\n * Support DevRev users round the clock on different levels of queries\\n * Build Q&A pairs for the bot and think innovatively to empower the bot\\n * Understand customer signals, collaborate with customer success teams to avoid churn\\n * Ability to converse profoundly and suggest value add features to help customers enhance their business goals.\\n * Collaborate with cross functional teams like Sales, customer success, product, engineering and bots engineering.\\n",
+ "title": "DevRev Careers | Customer Support Engineering"
},
{
- "id": "ART-12394_KNOWLEDGE_NODE-6",
- "text": "+ [Turing AI agent](/docs/product/conversational-bot)\\n\\n - [Best practices for documentation that supports AI](/docs/product/writing-bp)\\n + [Commands](/docs/product/commands)\\n + [Service-level agreement](/docs/product/sla)\\n + [Operational-level agreement](/docs/product/ola)\\n + [Support snap-ins](/docs/product/snapins-support)\\n* [Computer for Builders](/docs/product/build)\\n\\n + [Issues](/docs/product/issues)\\n + [Now, Next, Later](/docs/product/nnl)\\n + [Sprint",
- "title": "Workflow management | Workflows | Computer by DevRev | DevRev"
+ "id": "ART-17649_KNOWLEDGE_NODE-3",
+ "text": "both agents and customers\\n* Complex requirements spanned agent, customer, and manager experiences\\n* Need for sophisticated routing, views, dashboards, and deterministic bot flows\\n\\nThe solution: switching to DevRev\\n---------------------------------\\n\\nThe company chose DevRev for its Computer capabilities and customization features:\\n\\n* Implementation of multiple dev organizations within DevRev\\n* Complete replacement of their previous Intercom-based support system\\n* Implementation of",
+ "title": "Leading APAC fintech transforms support with multi-instance AI solution"
},
{
- "id": "ART-12391_KNOWLEDGE_NODE-29",
- "text": "type that causes the agent to pause (for example, DevUser). |\\n| additional\\\\_context (optional) | String | Additional context you want to pass to the agent for more personalized responses. You can also use variables from previous steps here. |\\n\\n![]()\\n\\n* Each button creates a corresponding output port in the workflow.\\n* When a button is clicked, the original message is updated to remove the\\n buttons.\\n* A confirmation message is added showing which option was",
- "title": "Conversational workflows | Workflows | Computer by DevRev | DevRev"
+ "id": "ART-1954_KNOWLEDGE_NODE-36",
+ "text": "bot mentions will still appear in the **Others** tab.\\n\\nFollow conversations\\n--------------------\\n\\nTo receive updates about conversations in the Plug inbox, you must be a member of the support group. To manage membership of the support group go to [**Settings** > **Groups**](https://app.devrev.ai/devrev/settings/groups).\\n\\nFor more information about groups, refer to [Groups](/docs/product/groups).\\n\\nDaily email digest\\n------------------\\n\\nDevRev sends a daily email digest with a summary",
+ "title": "Updates | Computer by DevRev | DevRev"
},
{
- "id": "ART-12390_KNOWLEDGE_NODE-6",
- "text": "+ [Turing AI agent](/docs/product/conversational-bot)\\n\\n - [Best practices for documentation that supports AI](/docs/product/writing-bp)\\n + [Commands](/docs/product/commands)\\n + [Service-level agreement](/docs/product/sla)\\n + [Operational-level agreement](/docs/product/ola)\\n + [Support snap-ins](/docs/product/snapins-support)\\n* [Computer for Builders](/docs/product/build)\\n\\n + [Issues](/docs/product/issues)\\n + [Now, Next, Later](/docs/product/nnl)\\n + [Sprint",
- "title": "Workflow action library | Workflows | Computer by DevRev | DevRev"
+ "id": "ART-2017_KNOWLEDGE_NODE-26",
+ "text": "permissions: channel-read, groups-read, user.profile:read, users:read, users.read:email, chat-write, and userGroup-read.\\n4. Invite the bot to the workspace.\\n5. Save the bot access token as connection (snap-in secret) in DevRev app.\\n6. Invite the bot to the channels where the messages will be sent.\\n7. In the DevRev app, setup the connection in **Settings** > **Snap-ins** > **Connections** on top.\\n\\n * Search and choose an existing connection or create a new one by clicking **+",
+ "title": "SLA status change Slack notifier | Automate | Snap-ins | DevRev"
},
{
- "id": "ART-1950_KNOWLEDGE_NODE-12",
- "text": "Node](/docs/automations/search-node)\\n - [Sentiment evaluator](/docs/automations/sentiment-evaluator)\\n - [Subtype Migration](/docs/automations/subtype-migration)\\n - [Real-time sentiment evaluator](/docs/automations/realtime-sentiment-evaluator)\\n - [Send customized emails](/docs/automations/send-emails)\\n - [StageFlow automator](/docs/automations/stageflow-automator)\\n - [Smart issue creator](/docs/automations/smart-issue-creator)\\n - [Set user preference for",
- "title": "Parts & trails | Computer by DevRev | DevRev"
+ "id": "ART-12613_KNOWLEDGE_NODE-7",
+ "text": "requirements\\n* Should be comfortable in writing customizations using the below mentioned languages\\n* Ability to think outside the box and build quicker solutions\\n* Support DevRev users round the clock on different levels of queries\\n* Build Q&A pairs for the bot and think innovatively to empower the bot\\n* Understand customer signals, collaborate with customer success teams to avoid churn\\n* Ability to converse profoundly and suggest value add features to help customers enhance their",
+ "title": "DevRev Careers | Software Engineer - Applied AI Support"
},
{
- "id": "ART-1950_KNOWLEDGE_NODE-25",
- "text": "be recursively made of smaller parts. Events and work items must be related to parts. In general, parts are the core objects that almost all other objects are linked to, which helps enforce the notion of tying everything back to the product or service.\\n\\n\\xf0\\x9f\\x8e\\xa5 Video: Trails\\n\\n*Trails* is an extensible interface that allows you to view and manage your part hierarchy and related items. Think of it like a graph canvas that\\'s rendering linkages among items\\xe2\\x80\\x94including",
- "title": "Parts & trails | Computer by DevRev | DevRev"
+ "id": "ART-968_KNOWLEDGE_NODE-3",
+ "text": "Slack user group as shown.\\n\\n\\xe2\\x97\\x8b Prerequisites:\\n1. A custom application has to be created in Slack by enabling read and write\\npermission to user groups and chat(to post messages to Slack) respectively.\\n> Steps to create and install the app at https://api.slack.com/apps are shown in the\\nvideo attached here. Ensure to copy the Bot Oauth token generated at the time of\\ninstalling the app to the Slack marketplace.\\n2. Please ensure to invite the created app/bot to the channel where",
+ "title": "Rocketium: On call Tagging - Slack"
}
]
},
@@ -1236,54 +1236,54 @@
"query": "resolution time grouped by Priority and Customer segment",
"retrievals": [
{
- "id": "ART-1986_KNOWLEDGE_NODE-41",
- "text": "resolution is due in one day, the vista displays five minutes. In the case where the first response isn't provided within five minutes, the timer displays negative values (such as -10m), which indicates that it's been 10 minutes since the first response was due. Conversations or tickets can also be grouped by SLA stages.\\n\\nIn the **Detailed View**, all metrics applied to the ticket or conversation can be viewed along with their current stage.\\n\\nFiltering tickets by Next SLA",
- "title": "Service-level agreement | Computer for Support Teams | DevRev"
+ "id": "ART-15716_KNOWLEDGE_NODE-36",
+ "text": "the Dashboards section.\\n\\nAdd a widget for \\xe2\\x80\\x9cTicket Resolution Time\\xe2\\x80\\x9d or \\xe2\\x80\\x9cAverage Time to Resolution.\\xe2\\x80\\x9d\\n\\nConfigure the widget to display data by agent, team, or time period.\\n\\nUse filters to focus on specific ticket types, priorities, or customer segments.\\n\\nFor more granular analysis, use a table or chart widget with custom SQL or filters.\\n\\nThis will help you monitor and improve your team\\xe2\\x80\\x99s responsiveness.5. Configuring branding of the",
+ "title": "Support queries related playbook"
},
{
- "id": "ART-1003_KNOWLEDGE_NODE-20",
- "text": "AverageResolutionTime\\nFROM tickets t\\nWHERE t.status = 'resolved'\\nAND EXTRACT(@period FROM t.created_at) = EXTRACT(@period FROM CURRENT_DATE);\\n-- NOTE: Replace @period with 'DAY', 'WEEK', 'MONTH', or 'QUARTER'.\\n\\n\\nCustomer Satisfaction Score (CSAT)\\n\\n\\n Definition\\n \\n A metric that gauges customer satisfaction with the support provided, typically collected through surveys.\\n \\n \\n Calculation\\n \\n (Number of satisfied responses) / (Total number of responses) * 100\\n",
+ "id": "ART-1003_KNOWLEDGE_NODE-19",
+ "text": "t.created_at) = EXTRACT(@period FROM CURRENT_DATE);\\n-- NOTE: Replace @period with 'DAY', 'WEEK', 'MONTH', or 'QUARTER'.\\n\\n\\nAverage Resolution Time (ART)\\n\\n\\n Definition\\n \\n The average time it takes to resolve a customer issue from the moment it\\xe2\\x80\\x99s reported.\\n \\n \\n Calculation\\n \\n (Sum of resolution times for all resolved tickets) / (Total number of resolved tickets)\\n \\n \\n\\n\\nSELECT AVG(TIMESTAMPDIFF(MINUTE, t.created_at, t.resolved_at)) AS",
"title": "Understanding a Support Lead's Pain Points and KPIs"
},
{
- "id": "ART-1039_KNOWLEDGE_NODE-3",
- "text": "high-quality video experiences became undeniable.\\n\\nThe Challenge\\n-------------\\n\\nProviding exceptional customer support means connecting with your customers wherever they are, in real-time. As companies scale, it becomes increasingly difficult to provide the same high standard of service to a growing number of customers \\xe2\\x80\\x94 without breaking the bank. In today\\xe2\\x80\\x99s crowded marketplace where it\\xe2\\x80\\x99s possible to get a SaaS company up and running in less than a day,",
- "title": "100ms delivers differentiated customer support through a unified channel"
+ "id": "ART-1004_KNOWLEDGE_NODE-7",
+ "text": "time it takes for a specific support engineer to resolve a customer issue from the moment it\\xe2\\x80\\x99s reported.\\n \\n \\n Calculation\\n \\n (Sum of resolution times for all resolved tickets by the engineer) / (Total number of resolved tickets by the engineer)\\n \\n \\n\\n\\nSELECT engineer_id, AVG(TIMESTAMPDIFF(MINUTE, t.created_at, t.resolved_at)) AS IndividualAverageResolutionTime\\nFROM tickets t\\nWHERE t.status = 'resolved'\\nAND EXTRACT(@period FROM t.created_at) =",
+ "title": "Understanding a Support Engineer's Pain Points and KPIs"
},
{
- "id": "ART-1039_KNOWLEDGE_NODE-15",
- "text": "[SLA](/legal/sla)\\n* [DPA](/legal/dpa)\\n* [Subprocessors](/security/sub-processors)\\n* [Cookie Policy](/legal/cookie-policy)\\n* [Privacy Policy](/legal/privacy-policy)\\n* [Terms of Service](/legal/terms-of-service)\\n\\n[System Status](/status)\\n\\n\\xc2\\xa9 2025 DevRev Inc.'",
- "title": "100ms delivers differentiated customer support through a unified channel"
+ "id": "ART-1970_KNOWLEDGE_NODE-26",
+ "text": "Conversations with SLA breaches with breach type for ticket owners.\\n* **SLA breaches w.r.t. Customer Tier**\\n\\n Number of Conversations with SLA breaches per owner.\\n* **Average Resolution Time**\\n\\n Indicates the average time taken to resolve requests for each conversation owner.\\n\\n[PreviousConversation-SLA Analytics](/docs/dashboards/conversation-sla-analytics)[NextTicket insights](/docs/dashboards/ticket-insights)\\n\\n[Enterprise grade security to protect customer data\\n\\nLearn more about",
+ "title": "Conversation-Team Performance | Support analytics | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1986_KNOWLEDGE_NODE-39",
- "text": "marked as spam | | |\\n| Next response time | | A new message on the conversation with the customer after the customer experience engineer replied | * The agent replied to the conversation * The conversation is moved to Waiting on User/Resolved * The conversation is marked as spam | | |\\n| Full resolution time | | Conversation created | * The conversation has moved to the Resolved/Archived * The conversation is marked as spam | The conversation is moved to Waiting on User | The",
- "title": "Service-level agreement | Computer for Support Teams | DevRev"
+ "id": "ART-2695_KNOWLEDGE_NODE-27",
+ "text": "**Metrics**. Install the [OLA metrics for issues](https://marketplace.devrev.ai/ola-metric-on-issues) snap-in as prompted to access the **Issue Resolution Time** metric, see [Defining OLA Metrics](#defining-ola-metrics) for details.\\n3. Click **Continue**.\\n\\nYou can set breach and warning targets for **Issue Resolution Time** by selecting between calendar or business hours for calculation. Multiple policies can be created within an OLA, and they are applied based on priority if an issue meets",
+ "title": "Operational-level agreement | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1039_KNOWLEDGE_NODE-5",
- "text": "problem was interacting with our customers and really understanding the urgency of every conversation. We had over 300 Slack Connect channels for our users. The conversations could go from design discussions to finding bugs to architecture, and there was no way to delineate these conversations from ones where a customer is saying, \\xe2\\x80\\x98I\\xe2\\x80\\x99m having an outage right now. I need urgent help\\xe2\\x80\\x9d.\\n\\nManaging and prioritizing customer conversations and requests in Slack was a",
- "title": "100ms delivers differentiated customer support through a unified channel"
+ "id": "ART-1707_KNOWLEDGE_NODE-11",
+ "text": "country or region to see content specific to your location.\\n\\n\\xf0\\x9f\\x8c\\x8e English\\xf0\\x9f\\x87\\xaf\\xf0\\x9f\\x87\\xb5 Japanese\\n\\n[Enterprise grade security to protect customer data\\n\\nLearn more about it.\\n\\n![]()](/blog/soc-compliance)\\n\\nComputer\\n\\n* [Meet Computer](/meet-computer)\\n* [How Computer works](/how-computer-works)\\n\\nApps\\n\\n* [For Support Teams](/for-support-teams)\\n* [For Builders](/for-builders)\\n* [For Customers](/for-customers)\\n* [For User",
+ "title": "ICICI Prudential Life Insurance uses DevRev to slash resolution time by 95%"
},
{
- "id": "ART-2133_KNOWLEDGE_NODE-21",
- "text": "customer at a much deeper level.\\n\\nTime Travel Establishing the history of a customer \\xe2\\x80\\x93 events, changes to records, versions, time logs\\xe2\\x80\\xa6 essentially traveling back in time \\xe2\\x80\\x93 is one of the hardest things in customer relationship management. Support, product management, and other business-to-business conversations\\n\\nPage 7 of 16\\n\\nThe Essential Methodology\\n\\nLess But Better\\n\\nare otherwise mostly point-in- time, with a lot of recency bias that results in",
- "title": "The Essential Methodology: Less but Better"
+ "id": "ART-1035_KNOWLEDGE_NODE-10",
+ "text": "resolution time by 95%](/case-study/icici-prudential-life)\\n\\nChoose another country or region to see content specific to your location.\\n\\n\\xf0\\x9f\\x8c\\x8e English\\xf0\\x9f\\x87\\xaf\\xf0\\x9f\\x87\\xb5 Japanese\\n\\n[Enterprise grade security to protect customer data\\n\\nLearn more about it.\\n\\n![]()](/blog/soc-compliance)\\n\\nComputer\\n\\n* [Meet Computer](/meet-computer)\\n* [How Computer works](/how-computer-works)\\n\\nApps\\n\\n* [For Support Teams](/for-support-teams)\\n* [For",
+ "title": "Goodmeetings uses PLuG to reduce ticket resolution time"
},
{
- "id": "ART-1003_KNOWLEDGE_NODE-19",
- "text": "t.created_at) = EXTRACT(@period FROM CURRENT_DATE);\\n-- NOTE: Replace @period with 'DAY', 'WEEK', 'MONTH', or 'QUARTER'.\\n\\n\\nAverage Resolution Time (ART)\\n\\n\\n Definition\\n \\n The average time it takes to resolve a customer issue from the moment it\\xe2\\x80\\x99s reported.\\n \\n \\n Calculation\\n \\n (Sum of resolution times for all resolved tickets) / (Total number of resolved tickets)\\n \\n \\n\\n\\nSELECT AVG(TIMESTAMPDIFF(MINUTE, t.created_at, t.resolved_at)) AS",
- "title": "Understanding a Support Lead's Pain Points and KPIs"
+ "id": "ART-1030_KNOWLEDGE_NODE-13",
+ "text": "scale](/case-study/skedulo)[![]()\\n\\n3 min read ICICI Prudential Life Insurance uses DevRev to slash resolution time by 95%](/case-study/icici-prudential-life)\\n\\nChoose another country or region to see content specific to your location.\\n\\n\\xf0\\x9f\\x8c\\x8e English\\xf0\\x9f\\x87\\xaf\\xf0\\x9f\\x87\\xb5 Japanese\\n\\n[Enterprise grade security to protect customer data\\n\\nLearn more about it.\\n\\n![]()](/blog/soc-compliance)\\n\\nComputer\\n\\n* [Meet Computer](/meet-computer)\\n* [How Computer",
+ "title": "Jar improves customer insights and increased conversion rates using DevRev"
},
{
- "id": "ART-970_KNOWLEDGE_NODE-47",
- "text": "customers, including their support interactions, engagements, and product usage.\\n Consider the possibilities of identifying and prioritizing high-impact items based on their revenue implications.\\n\\n\\nSupport Engineer:\\n\\n\\n How would your approach change if you knew about potential opportunities or deals with the customer?\\n Imagine not having to engage in the tedious task of copying and pasting between engineering issues and your tickets.\\n What if you could effortlessly track the status",
- "title": "The Story"
+ "id": "ART-1870_KNOWLEDGE_NODE-13",
+ "text": "stakeholders see issue status in real time\\n* Teams consistently meet resolution time targets\\n* Customers receive faster resolutions and clearer communication\\n* Support operations grow smoothly with the business\\n\\nWe're a DevRev client, and it has been a game-changer for us.\\n\\n![]()\\n\\nTasso ArgyrosFounder & CEO, ActionIQ\\n\\nThe results\\n\\nSummary\\n\\nRapid resolution time\\n\\nBetter alignment between engineering and support teams cut median incident resolution times by 67% and reduced",
+ "title": "Unifying teams: How ActionIQ transformed support with integration"
},
{
- "id": "ART-1004_KNOWLEDGE_NODE-7",
- "text": "time it takes for a specific support engineer to resolve a customer issue from the moment it\\xe2\\x80\\x99s reported.\\n \\n \\n Calculation\\n \\n (Sum of resolution times for all resolved tickets by the engineer) / (Total number of resolved tickets by the engineer)\\n \\n \\n\\n\\nSELECT engineer_id, AVG(TIMESTAMPDIFF(MINUTE, t.created_at, t.resolved_at)) AS IndividualAverageResolutionTime\\nFROM tickets t\\nWHERE t.status = 'resolved'\\nAND EXTRACT(@period FROM t.created_at) =",
- "title": "Understanding a Support Engineer's Pain Points and KPIs"
+ "id": "ART-1707_KNOWLEDGE_NODE-3",
+ "text": "overseeing the entire customer lifecycle. However, the app encountered technical issues that were affecting sales performance.\\n\\nAdditionally, the support team needed help grasping the issues reported by sales representatives. When they needed more information, the sales reps were often occupied with calls or unavailable to elaborate, leading to further delays in resolving these issues.\\n\\n### Blindspots in troubleshooting issues\\n\\nThe issue of limited ticket details extended from the support",
+ "title": "ICICI Prudential Life Insurance uses DevRev to slash resolution time by 95%"
}
]
},
@@ -1292,54 +1292,54 @@
"query": "add attributes in MSAT snap-in",
"retrievals": [
{
- "id": "ART-1846_KNOWLEDGE_NODE-8",
- "text": "example of a snap-kit JSON:\\n\\n```\\n| | |\\n| --- | --- |\\n| 1 | { |\\n| 2 | \"snap_kit_body\": { |\\n| 3 | \"body\": { |\\n| 4 | \"snaps\": [ |\\n| 5 | { |\\n| 6 | \"elements\": [ |\\n| 7 | { |\\n| 8 | \"action_id\": \"user_snap_kit_action\", |\\n| 9 | \"action_type\": \"remote\", |\\n| 10 | \"elements\": [ |\\n| 11 | { |\\n| 12 | \"element\": { |\\n| 13 | \"action_id\": \"select\", |\\n| 14 | \"action_type\": \"client\", |\\n| 15 | \"initial_selected_option\": { |\\n| 16 | \"text\": { |\\n| 17 | \"text\": \"Ticket\", |\\n| 18 | \"type\":",
- "title": "Customizing snap-in configuration | DevRev | Docs"
+ "id": "ART-1472_KNOWLEDGE_NODE-10",
+ "text": "outline the structure of the snap-in, the initial step is to define key attributes in the snap-in\\xe2\\x80\\x99s manifest. Begin by specifying the name, description, and account display name for the snap-in.\\n\\n[code]\\n\\n 1| version: \"2\" \\n ---|--- \\n 2| name: \"GitHub issue creator\" \\n 3| description: \"Replicate DevRev issues in GitHub.\" \\n 4| \\n 5| service_account: \\n 6| display_name: GitHub Issue Creator\\n[/code] \\n",
+ "title": "Using a snap-in to perform an external action \u2014 DevRev | Docs"
+ },
+ {
+ "id": "ART-1276_KNOWLEDGE_NODE-6",
+ "text": "manifest\\n\\nTo outline the structure of the snap-in, the initial step is to define key attributes in the snap-in\\xe2\\x80\\x99s manifest. Begin by specifying the name, description, and account display name for the snap-in.\\n\\n```\\n| | |\\n| --- | --- |\\n| 1 | version: \"2\" |\\n| 2 | name: \"GitHub issue creator\" |\\n| 3 | description: \"Replicate DevRev issues in GitHub.\" |\\n| 4 | |\\n| 5 | service_account: |\\n| 6 | display_name: GitHub Issue Creator",
+ "title": "Using a snap-in to perform an external action | DevRev | Docs"
},
{
"id": "ART-1278_KNOWLEDGE_NODE-6",
"text": "discussion tab of the specified Product\\nsection. The configuration for this action can be customized through the input\\nparameters of the snap-in.\\n\\n[2](/snapin-development/tutorials/triggered-external-source#creating-the-snap-in)\\n\\n### Creating the snap-in\\n\\n#### Updating the manifest\\n\\nTo outline the structure of the snap-in, the initial step is to define key\\nattributes in the snap-in\\xe2\\x80\\x99s manifest. Begin by specifying the name, description,\\nand account display name for the",
"title": "Snap-in triggered by an external source | DevRev | Docs"
},
- {
- "id": "ART-1846_KNOWLEDGE_NODE-19",
- "text": "change in future updates.\\n\\nFor more details on the snap-kit JSON format and available elements, refer to the [DevRev Snap-kit documentation](/snapin-development/references/snapkit).\\n\\nWas this page helpful?\\n\\nYesNo\\n\\n[Previous](/snapin-development/references/snap-in-resources)[#### Development best practices\\n\\nNext](/snapin-development/best-practices)[Built with](https://buildwithfern.com/?utm_campaign=buildWith&utm_medium=docs&utm_source=developer.devrev.ai)'",
- "title": "Customizing snap-in configuration | DevRev | Docs"
- },
- {
- "id": "ART-1847_KNOWLEDGE_NODE-9",
- "text": "JSON:\\n\\n[code]\\n\\n 1| { \\n ---|--- \\n 2| \"snap_kit_body\": { \\n 3| \"body\": { \\n 4| \"snaps\": [ \\n 5| { \\n 6| \"elements\": [ \\n 7| { \\n 8| \"action_id\": \"user_snap_kit_action\", \\n 9| \"action_type\": \"remote\", \\n 10| \"elements\": [ \\n 11| { \\n 12| \"element\": { \\n 13| \"action_id\": \"select\", \\n 14|",
- "title": "Customizing snap-in configuration \u2014 DevRev | Docs"
- },
{
"id": "ART-1473_KNOWLEDGE_NODE-9",
"text": "displaying them on the discussion tab of the specified Product section. The configuration for this action can be customized through the input parameters of the snap-in.\\n\\n[2](/public/snapin-development/tutorials/triggered-external-source#creating-the-snap-in)\\n\\n### Creating the snap-in\\n\\n#### Updating the manifest\\n\\nTo outline the structure of the snap-in, the initial step is to define key attributes in the snap-in\\xe2\\x80\\x99s manifest. Begin by specifying the name, description, and",
"title": "Snap-in triggered by an external source \u2014 DevRev | Docs"
},
{
- "id": "ART-1846_KNOWLEDGE_NODE-1",
- "text": "(beta)](/snapin-development/references/customizing-snap-in-configuration#update-snap-in-inputs-beta)\\n* [Request payload](/snapin-development/references/customizing-snap-in-configuration#request-payload)\\n* [Response](/snapin-development/references/customizing-snap-in-configuration#response)\\n* [Success response](/snapin-development/references/customizing-snap-in-configuration#success-response)\\n* [Error",
- "title": "Customizing snap-in configuration | DevRev | Docs"
+ "id": "ART-1485_KNOWLEDGE_NODE-11",
+ "text": "this task. In this scenario, the `/timeline-entries.create` API is the designated choice for executing the action of adding a text comment from the snap-in. To accomplish this task, the DevRev SDK is employed.\\n\\n[2](/public/snapin-development/tutorials/triggered-event#creating-the-snap-in)\\n\\n### Creating the snap-in\\n\\n#### Updating the manifest\\n\\nThe next step involves updating the manifest to define key attributes of the snap-in. This includes deciding on the name and providing a",
+ "title": "Snap-in triggered by a DevRev event \u2014 DevRev | Docs"
},
{
- "id": "ART-1276_KNOWLEDGE_NODE-6",
- "text": "manifest\\n\\nTo outline the structure of the snap-in, the initial step is to define key attributes in the snap-in\\xe2\\x80\\x99s manifest. Begin by specifying the name, description, and account display name for the snap-in.\\n\\n```\\n| | |\\n| --- | --- |\\n| 1 | version: \"2\" |\\n| 2 | name: \"GitHub issue creator\" |\\n| 3 | description: \"Replicate DevRev issues in GitHub.\" |\\n| 4 | |\\n| 5 | service_account: |\\n| 6 | display_name: GitHub Issue Creator",
- "title": "Using a snap-in to perform an external action | DevRev | Docs"
+ "id": "ART-1277_KNOWLEDGE_NODE-7",
+ "text": "text comment from the\\nsnap-in. To accomplish this task, the DevRev SDK is employed.\\n\\n[2](/snapin-development/tutorials/triggered-event#creating-the-snap-in)\\n\\n### Creating the snap-in\\n\\n#### Updating the manifest\\n\\nThe next step involves updating the manifest to define key attributes of\\nthe snap-in. This includes deciding on the name and providing a descriptive\\noverview that is visible to users, offering context about the snap-in\\xe2\\x80\\x99s\\npurpose.\\n\\n```\\n| | |\\n| --- | --- |\\n|",
+ "title": "Snap-in triggered by a DevRev event | DevRev | Docs"
},
{
- "id": "ART-1472_KNOWLEDGE_NODE-10",
- "text": "outline the structure of the snap-in, the initial step is to define key attributes in the snap-in\\xe2\\x80\\x99s manifest. Begin by specifying the name, description, and account display name for the snap-in.\\n\\n[code]\\n\\n 1| version: \"2\" \\n ---|--- \\n 2| name: \"GitHub issue creator\" \\n 3| description: \"Replicate DevRev issues in GitHub.\" \\n 4| \\n 5| service_account: \\n 6| display_name: GitHub Issue Creator\\n[/code] \\n",
+ "id": "ART-1472_KNOWLEDGE_NODE-29",
+ "text": "documentation](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens).\\n\\n#### Step 2: Add PAT to DevRev connections\\n\\nAdd the generated PAT as a snap-in secret in DevRev. This secret is used during the installation of the snap-in. Ensure that the secret is shared within the organization to allow the snap-in to access it.\\n\\n#### Step 3: Install the snap-in\\n\\nDuring the installation of the snap-in, utilize the shared secret to",
"title": "Using a snap-in to perform an external action \u2014 DevRev | Docs"
},
{
- "id": "ART-1847_KNOWLEDGE_NODE-2",
- "text": "(beta)](/public/snapin-development/references/customizing-snap-in-configuration#update-snap-in-inputs-beta)\\n * [Request payload](/public/snapin-development/references/customizing-snap-in-configuration#request-payload)\\n * [Response](/public/snapin-development/references/customizing-snap-in-configuration#response)\\n * [Success response](/public/snapin-development/references/customizing-snap-in-configuration#success-response)\\n * [Error",
- "title": "Customizing snap-in configuration \u2014 DevRev | Docs"
+ "id": "ART-1276_KNOWLEDGE_NODE-24",
+ "text": "Token (PAT) by following the steps outlined in the [GitHub documentation](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens).\\n\\n#### Step 2: Add PAT to DevRev connections\\n\\nAdd the generated PAT as a snap-in secret in DevRev. This secret is used during the installation of the snap-in. Ensure that the secret is shared within the organization to allow the snap-in to access it.\\n\\n#### Step 3: Install the snap-in\\n\\nDuring the",
+ "title": "Using a snap-in to perform an external action | DevRev | Docs"
},
{
- "id": "ART-1296_KNOWLEDGE_NODE-9",
- "text": "changed. Any existing function can be removed. A new function can be added. |\\n| Commands | For existing commands: - All properties can be changed. Any existing command can be removed. A new command can be added. |\\n| Snap-kit actions | For existing snap-kit-actions: - The description can be changed. - The function can be changed. Any existing snap-kit-action can be removed. A new snap-kit-action can be added. |\\n| Service account | The display name of the service",
- "title": "Upgrade snap-ins | DevRev | Docs"
+ "id": "ART-1472_KNOWLEDGE_NODE-28",
+ "text": "itself. Before installing the snap-in, it\\xe2\\x80\\x99s essential to set up a GitHub Personal Access Token (PAT) and add it to the connections in DevRev as a snap-in secret. Ensure that the secret is shared within the organization so that the snap-in can utilize it.\\n\\nFollow these steps to install the snap-in in your organization:\\n\\n#### Step 1: Create a GitHub personal access token\\n\\nGenerate a GitHub Personal Access Token (PAT) by following the steps outlined in the [GitHub",
+ "title": "Using a snap-in to perform an external action \u2014 DevRev | Docs"
+ },
+ {
+ "id": "ART-1276_KNOWLEDGE_NODE-23",
+ "text": "involve creating the snap-in version and subsequently creating the snap-in itself. Before installing the snap-in, it\\xe2\\x80\\x99s essential to set up a GitHub Personal Access Token (PAT) and add it to the connections in DevRev as a snap-in secret. Ensure that the secret is shared within the organization so that the snap-in can utilize it.\\n\\nFollow these steps to install the snap-in in your organization:\\n\\n#### Step 1: Create a GitHub personal access token\\n\\nGenerate a GitHub Personal Access",
+ "title": "Using a snap-in to perform an external action | DevRev | Docs"
}
]
},
@@ -1348,19 +1348,14 @@
"query": "Slack bot not working after multiple test tickets",
"retrievals": [
{
- "id": "ART-4021_KNOWLEDGE_NODE-5",
- "text": "ticket conversion](/docs/product/conversation-ticket)\\n + [Tickets](/docs/product/tickets)\\n + [Routing](/docs/product/routing)\\n + [Support best practices](/docs/product/support-bp)\\n + [Customer portal](/docs/product/support-portal)\\n + [Questions & answers](/docs/product/qa)\\n + [Knowledge Base](/docs/product/knowledge-base)\\n\\n - [Articles](/docs/product/articles)\\n - [Collections](/docs/product/collection)\\n + [Turing AI agent](/docs/product/conversational-bot)\\n\\n - [Best",
- "title": "Slack scraper | Automate | Snap-ins | DevRev"
- },
- {
- "id": "ART-12395_KNOWLEDGE_NODE-5",
- "text": "ticket conversion](/docs/product/conversation-ticket)\\n + [Tickets](/docs/product/tickets)\\n + [Routing](/docs/product/routing)\\n + [Support best practices](/docs/product/support-bp)\\n + [Customer portal](/docs/product/support-portal)\\n + [Questions & answers](/docs/product/qa)\\n + [Knowledge Base](/docs/product/knowledge-base)\\n\\n - [Articles](/docs/product/articles)\\n - [Collections](/docs/product/collection)\\n + [Turing AI agent](/docs/product/conversational-bot)\\n\\n - [Best",
- "title": "Slack Broadcaster | Automate | Snap-ins | DevRev"
+ "id": "ART-2035_KNOWLEDGE_NODE-36",
+ "text": "Slack Channel ID in the **Channel ID to send conversation notifications** snap-in configuration as the target to post notifications.\\n\\n* Any new message within tickets in the customer messages panel is also subjected to the same automation.\\n* To prevent notification overload, each conversation or ticket is subject to a five minute cooldown period between notifications. Multiple consecutive messages within this window will not trigger additional notifications.\\n* Notification threads are not",
+ "title": "Slack | Integrate | Snap-ins | DevRev"
},
{
- "id": "ART-4199_KNOWLEDGE_NODE-5",
- "text": "ticket conversion](/docs/product/conversation-ticket)\\n + [Tickets](/docs/product/tickets)\\n + [Routing](/docs/product/routing)\\n + [Support best practices](/docs/product/support-bp)\\n + [Customer portal](/docs/product/support-portal)\\n + [Questions & answers](/docs/product/qa)\\n + [Knowledge Base](/docs/product/knowledge-base)\\n\\n - [Articles](/docs/product/articles)\\n - [Collections](/docs/product/collection)\\n + [Turing AI agent](/docs/product/conversational-bot)\\n\\n - [Best",
- "title": "Slack message agent | Automate | Snap-ins | DevRev"
+ "id": "ART-968_KNOWLEDGE_NODE-1",
+ "text": "stays in Slack and doesn\\xe2\\x80\\x99t extend to DevRev tickets.\\n\\n\\xe2\\x97\\x8f Solution:\\nDeveloped by: Hariharan\\nStatus: Tested and verified.\\nCustomer Approval: Approved\\n\\xe2\\x97\\x8b Brief:\\nCustom Snap-in connected with a custom Slack application that would automatically tag\\nthe on-call members upon ticket creation at Slack.\\n\\n\\xe2\\x97\\x8b Description:\\nA custom application in Slack marketplace is to be created which would perform the\\ntagging by referencing the group members in Slack.",
+ "title": "Rocketium: On call Tagging - Slack"
},
{
"id": "ART-4199_KNOWLEDGE_NODE-28",
@@ -1368,34 +1363,39 @@
"title": "Slack message agent | Automate | Snap-ins | DevRev"
},
{
- "id": "ART-2035_KNOWLEDGE_NODE-5",
- "text": "ticket conversion](/docs/product/conversation-ticket)\\n + [Tickets](/docs/product/tickets)\\n + [Routing](/docs/product/routing)\\n + [Support best practices](/docs/product/support-bp)\\n + [Customer portal](/docs/product/support-portal)\\n + [Questions & answers](/docs/product/qa)\\n + [Knowledge Base](/docs/product/knowledge-base)\\n\\n - [Articles](/docs/product/articles)\\n - [Collections](/docs/product/collection)\\n + [Turing AI agent](/docs/product/conversational-bot)\\n\\n - [Best",
- "title": "Slack | Integrate | Snap-ins | DevRev"
+ "id": "ART-2017_KNOWLEDGE_NODE-25",
+ "text": "ticket\\'s owner and subscribers, when a ticket\\'s resolution time SLA changes into the *Warning* or *Breached* stage.\\n\\n![]()\\n\\nFor more information, refer to the\\n[SLA status change Slack notifier snap-in](/marketplace/sla-status-change-slack-notifier) on the DevRev\\nmarketplace.\\n\\nInstallation\\n------------\\n\\n1. Create a Slack app for your workspace in .\\n2. In App features, generate bot token in **OAuth & Permissions**.\\n3. Grant the app bot the following",
+ "title": "SLA status change Slack notifier | Automate | Snap-ins | DevRev"
},
{
- "id": "ART-12395_KNOWLEDGE_NODE-13",
- "text": "group](/docs/automations/set-user-preference)\\n - [SLA status change Slack notifier](/docs/automations/sla-change-notifier)\\n - [Slash commands](/docs/automations/slash-commands)\\n - [Spam Shield](/docs/automations/spam-shield)\\n - [Subtype Migration](/docs/automations/subtype-migration)\\n - [Ticket age in engineering](/docs/automations/ticket-age-in-engineering)\\n - [Ticket issue field migrator](/docs/automations/ticket-issue-field-migrator)\\n - [Ticket",
- "title": "Slack Broadcaster | Automate | Snap-ins | DevRev"
+ "id": "ART-4271_KNOWLEDGE_NODE-31",
+ "text": "AI-handled conversation reaches its capability limits and needs human expertise.\\n * **Extended troubleshooting** : Issues requiring multiple steps or follow-ups over time.\\n\\n## Key information\\n\\n * **Channel support** : Currently, the conversion feature is only available for PLuG and Slack conversations. Other channels still use the traditional **Link Ticket** functionality.\\n\\n * **CSAT surveys** : CSAT surveys are not sent when a conversation is converted to a ticket. Surveys are only",
+ "title": "Convert Conversations to Tickets | Conversations | Support | DevRev"
},
{
- "id": "ART-12395_KNOWLEDGE_NODE-14",
- "text": "Immutability](/docs/automations/ticket-immutability)\\n - [Ticket email notifier](/docs/automations/ticket-email-notifier)\\n - [Task tracker](/docs/automations/task-tracker)\\n - [Ticket Tagger](/docs/automations/ticket-tagger)\\n - [Tracxn sync](/docs/automations/tracxn-sync)\\n - [User group validator](/docs/automations/user-group-validator)\\n - [Work duration](/docs/automations/work-duration)\\n - [Operational SLA Metrics](/docs/automations/operational-sla-metrics)\\n -",
- "title": "Slack Broadcaster | Automate | Snap-ins | DevRev"
+ "id": "ART-4199_KNOWLEDGE_NODE-27",
+ "text": "message.channels.\\n7. Add this custom app and the **DevRev Slack Bot** into the Slack channel from which you want to create the DevRev object.\\n\\nConfigure DevRev\\n----------------\\n\\n1. Add the Slack Signing Secret and Slack Bot Token copied from the custom Slack bot app.\\n2. Add the channel IDs for either incidents, tickets or issues.\\n3. Click the respective buttons to enable the sync between threads.\\n4. Select the part ID to associate a particular part.\\n5. Click **Save** and copy the",
+ "title": "Slack message agent | Automate | Snap-ins | DevRev"
},
{
- "id": "ART-4199_KNOWLEDGE_NODE-14",
- "text": "Immutability](/docs/automations/ticket-immutability)\\n - [Ticket email notifier](/docs/automations/ticket-email-notifier)\\n - [Task tracker](/docs/automations/task-tracker)\\n - [Ticket Tagger](/docs/automations/ticket-tagger)\\n - [Tracxn sync](/docs/automations/tracxn-sync)\\n - [User group validator](/docs/automations/user-group-validator)\\n - [Work duration](/docs/automations/work-duration)\\n - [Operational SLA Metrics](/docs/automations/operational-sla-metrics)\\n -",
- "title": "Slack message agent | Automate | Snap-ins | DevRev"
+ "id": "ART-1035_KNOWLEDGE_NODE-8",
+ "text": "Benefits\\n------------\\n\\n* Ability to push Slack threads directly into tickets using DevRev integration DevRev PLuG widget as a live help chat, replacing multiple tools\\n* DevRev Marketplace for snap-ins to push meeting action items and summaries into DevRev directly as ticket\\n* Use of [generative AI in customer support](/blog/generative-ai-for-customer-support) for tracking and building intelligence in knowledge base\\x08\\n* Improved customer experience due to increased efficiency and",
+ "title": "Goodmeetings uses PLuG to reduce ticket resolution time"
},
{
- "id": "ART-4199_KNOWLEDGE_NODE-13",
- "text": "group](/docs/automations/set-user-preference)\\n - [SLA status change Slack notifier](/docs/automations/sla-change-notifier)\\n - [Slash commands](/docs/automations/slash-commands)\\n - [Spam Shield](/docs/automations/spam-shield)\\n - [Subtype Migration](/docs/automations/subtype-migration)\\n - [Ticket age in engineering](/docs/automations/ticket-age-in-engineering)\\n - [Ticket issue field migrator](/docs/automations/ticket-issue-field-migrator)\\n - [Ticket",
- "title": "Slack message agent | Automate | Snap-ins | DevRev"
+ "id": "ART-2035_KNOWLEDGE_NODE-37",
+ "text": "synchronized between DevRev and Slack.\\n\\nWork management using Slack\\n---------------------------\\n\\n### DevRev Tickets and Slack\\n\\nThe Slack snap-in allows users to create tickets directly from Slack. There are multiple ways to initiate ticket creation from any channel:\\n\\n* **Use the command:** Run /devrev create-ticket.\\n* **Message action:** Select **Create a new ticket** from the message actions.\\n* **Convert a Conversation:** Transform an ongoing conversation into a ticket. This is",
+ "title": "Slack | Integrate | Snap-ins | DevRev"
},
{
- "id": "ART-4021_KNOWLEDGE_NODE-13",
- "text": "group](/docs/automations/set-user-preference)\\n - [SLA status change Slack notifier](/docs/automations/sla-change-notifier)\\n - [Slash commands](/docs/automations/slash-commands)\\n - [Spam Shield](/docs/automations/spam-shield)\\n - [Subtype Migration](/docs/automations/subtype-migration)\\n - [Ticket age in engineering](/docs/automations/ticket-age-in-engineering)\\n - [Ticket issue field migrator](/docs/automations/ticket-issue-field-migrator)\\n - [Ticket",
+ "id": "ART-4021_KNOWLEDGE_NODE-5",
+ "text": "ticket conversion](/docs/product/conversation-ticket)\\n + [Tickets](/docs/product/tickets)\\n + [Routing](/docs/product/routing)\\n + [Support best practices](/docs/product/support-bp)\\n + [Customer portal](/docs/product/support-portal)\\n + [Questions & answers](/docs/product/qa)\\n + [Knowledge Base](/docs/product/knowledge-base)\\n\\n - [Articles](/docs/product/articles)\\n - [Collections](/docs/product/collection)\\n + [Turing AI agent](/docs/product/conversational-bot)\\n\\n - [Best",
"title": "Slack scraper | Automate | Snap-ins | DevRev"
+ },
+ {
+ "id": "ART-968_KNOWLEDGE_NODE-0",
+ "text": "b'Rocketium: Slack - On-call Tagging\\n\\n\\xe2\\x97\\x8f Problem statement:\\n\\xe2\\x97\\x8b Rocketium\\xe2\\x80\\x99s CS team creates tickets in DevRev from a specific Slack channel for their\\non-call team to address and work on them.\\n\\xe2\\x97\\x8b Currently, the users are required to manually tag the on-call Slack group members in\\nthe ticket description as shown in the image below.\\n\\n\\xe2\\x97\\x8b The requirement is to automatically tag the members without manual intervention.\\nNote: The requirement",
+ "title": "Rocketium: On call Tagging - Slack"
}
]
},
@@ -1403,20 +1403,25 @@
"query_id": "17d61e6f-209e-43f7-bac4-61f02c5a63f1",
"query": "customizar severity de los tickets",
"retrievals": [
+ {
+ "id": "ART-1649_KNOWLEDGE_NODE-468",
+ "text": "associated with any of the provided Rev organizations.\\nticket.severity enum Optional\\nFilters for tickets with any of the provided severities.\\nAllowed values: blocker high low medium\\nticket.sla_summary.stage enum Optional\\nFilters for records with any of the provided SLA stages.\\nAllowed values: breached completed paused running warning\\nticket.source_channel string Optional\\nFilters for tickets with any of the provided source channels.\\nticket.subtype string Optional\\nFilters for tickets",
+ "title": "Create \u2014 DevRev | Docs"
+ },
+ {
+ "id": "ART-1649_KNOWLEDGE_NODE-455",
+ "text": "associated with any of the provided Rev organizations.\\nticket.severity enum Optional\\nFilters for tickets with any of the provided severities.\\nAllowed values: blocker high low medium\\nticket.sla_summary.stage enum Optional\\nFilters for records with any of the provided SLA stages.\\nAllowed values: breached completed paused running warning\\nticket.source_channel string Optional\\nFilters for tickets with any of the provided source channels.\\nticket.subtype string Optional\\nFilters for tickets",
+ "title": "Create \u2014 DevRev | Docs"
+ },
{
"id": "ART-1551_KNOWLEDGE_NODE-506",
"text": "organizations.\\n\\nticket.severity enum Optional\\n\\nFilters for tickets with any of the provided severities.\\n\\nAllowed values: blocker high low medium\\nticket.sla_summary.stage enum Optional\\n\\nFilters for records with any of the provided SLA stages.\\n\\nAllowed values: breached completed paused running warning\\nticket.source_channel string Optional\\n\\nFilters for tickets with any of the provided source channels.\\n\\nticket.subtype string Optional\\n\\nFilters for tickets with any of the provided",
"title": "Update (Beta) \u2014 DevRev | Docs"
},
{
- "id": "ART-1834_KNOWLEDGE_NODE-447",
- "text": "organizations.\\nticket.severity enum Optional\\nFilters for tickets with any of the provided severities.\\nAllowed values: blocker high low medium\\nticket.sla_summary.stage enum Optional\\nFilters for records with any of the provided SLA stages.\\nAllowed values: breached completed paused running warning\\nticket.source_channel string Optional\\nFilters for tickets with any of the provided source channels.\\nticket.subtype string Optional\\nFilters for tickets with any of the provided subtypes.\\ntype",
- "title": "Delete \u2014 DevRev | Docs"
- },
- {
- "id": "ART-1651_KNOWLEDGE_NODE-455",
- "text": "the provided severities.\\nAllowed values: blocker high low medium\\nticket.sla_summary.stage enum Optional\\nFilters for records with any of the provided SLA stages.\\nAllowed values: breached completed paused running warning\\nticket.source_channel string Optional\\nFilters for tickets with any of the provided source channels.\\nticket.subtype string Optional\\nFilters for tickets with any of the provided subtypes.\\ntype enum Optional\\nFilters for work of the provided types.\\nAllowed values: issue",
- "title": "Create \u2014 DevRev | Docs"
+ "id": "ART-1562_KNOWLEDGE_NODE-507",
+ "text": "organizations.\\n\\nticket.severity enum Optional\\n\\nFilters for tickets with any of the provided severities.\\n\\nAllowed values: blocker high low medium\\nticket.sla_summary.stage enum Optional\\n\\nFilters for records with any of the provided SLA stages.\\n\\nAllowed values: breached completed paused running warning\\nticket.source_channel string Optional\\n\\nFilters for tickets with any of the provided source channels.\\n\\nticket.subtype string Optional\\n\\nFilters for tickets with any of the provided",
+ "title": "Get (Beta) \u2014 DevRev | Docs"
},
{
"id": "ART-1979_KNOWLEDGE_NODE-29",
@@ -1424,34 +1429,29 @@
"title": "Tickets | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1633_KNOWLEDGE_NODE-454",
- "text": "the provided severities.\\nAllowed values: blocker high low medium\\nticket.sla_summary.stage enum Optional\\nFilters for records with any of the provided SLA stages.\\nAllowed values: breached completed paused running warning\\nticket.source_channel string Optional\\nFilters for tickets with any of the provided source channels.\\nticket.subtype string Optional\\nFilters for tickets with any of the provided subtypes.\\ntype enum Optional\\nFilters for work of the provided types.\\nAllowed values: issue",
- "title": "List \u2014 DevRev | Docs"
- },
- {
- "id": "ART-1654_KNOWLEDGE_NODE-466",
- "text": "the provided severities.\\nAllowed values: blocker high low medium\\nticket.sla_summary.stage enum Optional\\nFilters for records with any of the provided SLA stages.\\nAllowed values: breached completed paused running warning\\nticket.source_channel string Optional\\nFilters for tickets with any of the provided source channels.\\nticket.subtype string Optional\\nFilters for tickets with any of the provided subtypes.\\ntype enum Optional\\nFilters for work of the provided types.\\nAllowed values: issue",
- "title": "List \u2014 DevRev | Docs"
+ "id": "ART-1564_KNOWLEDGE_NODE-506",
+ "text": "organizations.\\n\\nticket.severity enum Optional\\n\\nFilters for tickets with any of the provided severities.\\n\\nAllowed values: blocker high low medium\\nticket.sla_summary.stage enum Optional\\n\\nFilters for records with any of the provided SLA stages.\\n\\nAllowed values: breached completed paused running warning\\nticket.source_channel string Optional\\n\\nFilters for tickets with any of the provided source channels.\\n\\nticket.subtype string Optional\\n\\nFilters for tickets with any of the provided",
+ "title": "List (Beta) \u2014 DevRev | Docs"
},
{
- "id": "ART-1651_KNOWLEDGE_NODE-468",
- "text": "Optional\\nFilters for tickets with any of the provided severities.\\nAllowed values: blocker high low medium\\nticket.sla_summary.stage enum Optional\\nFilters for records with any of the provided SLA stages.\\nAllowed values: breached completed paused running warning\\nticket.source_channel string Optional\\nFilters for tickets with any of the provided source channels.\\nticket.subtype string Optional\\nFilters for tickets with any of the provided subtypes.\\ntype enum Optional\\nFilters for work of the",
- "title": "Create \u2014 DevRev | Docs"
+ "id": "ART-1834_KNOWLEDGE_NODE-447",
+ "text": "organizations.\\nticket.severity enum Optional\\nFilters for tickets with any of the provided severities.\\nAllowed values: blocker high low medium\\nticket.sla_summary.stage enum Optional\\nFilters for records with any of the provided SLA stages.\\nAllowed values: breached completed paused running warning\\nticket.source_channel string Optional\\nFilters for tickets with any of the provided source channels.\\nticket.subtype string Optional\\nFilters for tickets with any of the provided subtypes.\\ntype",
+ "title": "Delete \u2014 DevRev | Docs"
},
{
- "id": "ART-1824_KNOWLEDGE_NODE-447",
- "text": "the provided severities.\\nAllowed values: blocker high low medium\\nticket.sla_summary.stage enum Optional\\nFilters for records with any of the provided SLA stages.\\nAllowed values: breached completed paused running warning\\nticket.source_channel string Optional\\nFilters for tickets with any of the provided source channels.\\nticket.subtype string Optional\\nFilters for tickets with any of the provided subtypes.\\ntype enum Optional\\nFilters for work of the provided types.\\nAllowed values: issue",
- "title": "Delete \u2014 DevRev | Docs"
+ "id": "ART-1641_KNOWLEDGE_NODE-474",
+ "text": "organizations.\\nticket.severity enum Optional\\nFilters for tickets with any of the provided severities.\\nAllowed values: blocker high low medium\\nticket.sla_summary.stage enum Optional\\nFilters for records with any of the provided SLA stages.\\nAllowed values: breached completed paused running warning\\nticket.source_channel string Optional\\nFilters for tickets with any of the provided source channels.\\nticket.subtype string Optional\\nFilters for tickets with any of the provided subtypes.\\ntype",
+ "title": "Get Post \u2014 DevRev | Docs"
},
{
- "id": "ART-1829_KNOWLEDGE_NODE-463",
- "text": "the provided severities.\\nAllowed values: blocker high low medium\\nticket.sla_summary.stage enum Optional\\nFilters for records with any of the provided SLA stages.\\nAllowed values: breached completed paused running warning\\nticket.source_channel string Optional\\nFilters for tickets with any of the provided source channels.\\nticket.subtype string Optional\\nFilters for tickets with any of the provided subtypes.\\ntype enum Optional\\nFilters for work of the provided types.\\nAllowed values: issue",
- "title": "Delete \u2014 DevRev | Docs"
+ "id": "ART-1605_KNOWLEDGE_NODE-448",
+ "text": "response.\\nticket.rev_org string Optional\\nFilters for tickets that are associated with any of the provided Rev organizations.\\nticket.severity enum Optional\\nFilters for tickets with any of the provided severities.\\nAllowed values: blocker high low medium\\nticket.sla_summary.stage enum Optional\\nFilters for records with any of the provided SLA stages.\\nAllowed values: breached completed paused running warning\\nticket.source_channel string Optional\\nFilters for tickets with any of the provided",
+ "title": "Create \u2014 DevRev | Docs"
},
{
- "id": "ART-1837_KNOWLEDGE_NODE-447",
- "text": "associated with any of the provided Rev organizations.\\nticket.severity enum Optional\\nFilters for tickets with any of the provided severities.\\nAllowed values: blocker high low medium\\nticket.sla_summary.stage enum Optional\\nFilters for records with any of the provided SLA stages.\\nAllowed values: breached completed paused running warning\\nticket.source_channel string Optional\\nFilters for tickets with any of the provided source channels.\\nticket.subtype string Optional\\nFilters for tickets",
- "title": "Update \u2014 DevRev | Docs"
+ "id": "ART-1785_KNOWLEDGE_NODE-446",
+ "text": "response.\\nticket.rev_org string Optional\\nFilters for tickets that are associated with any of the provided Rev organizations.\\nticket.severity enum Optional\\nFilters for tickets with any of the provided severities.\\nAllowed values: blocker high low medium\\nticket.sla_summary.stage enum Optional\\nFilters for records with any of the provided SLA stages.\\nAllowed values: breached completed paused running warning\\nticket.source_channel string Optional\\nFilters for tickets with any of the provided",
+ "title": "Create \u2014 DevRev | Docs"
}
]
},
@@ -1460,54 +1460,54 @@
"query": "support engineer typing indicator in ticket conversation",
"retrievals": [
{
- "id": "ART-6174_KNOWLEDGE_NODE-13",
- "text": "creator](/docs/automations/smart-issue-creator)\\n - [Set user preference for group](/docs/automations/set-user-preference)\\n - [SLA status change Slack notifier](/docs/automations/sla-change-notifier)\\n - [Slash commands](/docs/automations/slash-commands)\\n - [Spam Shield](/docs/automations/spam-shield)\\n - [Subtype Migration](/docs/automations/subtype-migration)\\n - [Ticket age in engineering](/docs/automations/ticket-age-in-engineering)\\n - [Ticket issue field",
- "title": "Conversation to ticket conversion | Conversations | Computer for Support Teams | DevRev"
+ "id": "ART-1947_KNOWLEDGE_NODE-32",
+ "text": "same conversation. This means you do not need to ask your external users to write in separately about each topic they\\'d like to discuss, while the workspace can still track each item separately.\\n\\nIn the DevRev app, a support engineer can create a ticket based on a conversation they had with someone using the Plug widget. This ticket and conversation are linked.\\n\\nA ticket should describe what the external user is experiencing in a language that\\'s familiar to them. Developer-specific",
+ "title": "Apps | Computer by DevRev | DevRev"
},
{
- "id": "ART-1960_KNOWLEDGE_NODE-41",
- "text": "*[ticket](#ticket)*\\n: Read more about\\xc2\\xa0[*task*](https://docs.devrev.ai/product/core)\\n\\nticket\\n\\n: A record of a customer\\'s request for assistance or support.\\n: When a customer contacts a company with a problem or issue, the company creates a ticket to track the request and ensure that it is addressed in a timely and satisfactory manner. Also known as a \"customer ticket\" or \"support ticket\".\\n: Terms related to\\xc2\\xa0*ticket*:\\n\\n * *[conversation](#conversation)*\\n *",
- "title": "Glossary | Computer by DevRev | DevRev"
+ "id": "ART-984_KNOWLEDGE_NODE-10",
+ "text": "indicator to the customer that the vendor obviously has some problems internally. Do you think the customer will be happy? Do you think the customer will trust what the sales rep says in the future? Simply put, no.\\n\\nNow, let\\xe2\\x80\\x99s handle this a little differently and look at the result\\xe2\\x80\\xa6\\n\\nIn this scenario, let\\xe2\\x80\\x99s say the customer files the same ticket and asks their sales rep for an update. The support engineer working on the ticket and the sales rep communicate",
+ "title": "Why you Should be Looking at Support Differently"
},
{
- "id": "ART-1979_KNOWLEDGE_NODE-42",
- "text": "it's automatically put into the *queued* stage, which indicates that it needs to be picked up by a customer experience engineer.\\n\\n**In-progress**\\n\\n* *Work in progress* (WIP)\\n\\n Work on the concern reported by the user has begun. When a customer experience engineer starts work on a ticket, the ticket's stage changes to *work in progress*. When they require more information, they may ask the customer for additional detail (such as logs or context), in which case the stage would change to",
- "title": "Tickets | Computer for Support Teams | DevRev"
+ "id": "ART-1004_KNOWLEDGE_NODE-12",
+ "text": "The percentage of support tickets resolved by a support engineer during the first interaction with the customer, which can indicate the engineer\\xe2\\x80\\x99s efficiency and problem-solving abilities.\\n \\n \\n Calculation\\n \\n (Total number of tickets resolved on first contact by the engineer) / (Total number of tickets handled by the engineer) * 100\\n \\n \\n\\n\\nTraining Hours per Employee\\n\\n\\n Definition\\n \\n The average number of training hours completed by a",
+ "title": "Understanding a Support Engineer's Pain Points and KPIs"
},
{
- "id": "ART-1969_KNOWLEDGE_NODE-28",
- "text": "engineers. To get a list of the available commands, type / in a conversation response text box.\\n\\n\\xf0\\x9f\\x8e\\xab Tickets\\n---------\\n\\nThe benefit of Computer by DevRev is that conversations can be linked to support [tickets](../product/tickets), and tickets can be linked to build issues. This [linkage](../product/apps) means that all work can be traced back to customer concerns or requests.\\n\\nSlash commands are available in tickets to provide AI assistance to customer experience engineers.",
- "title": "Computer for Support Teams | DevRev"
+ "id": "ART-1004_KNOWLEDGE_NODE-8",
+ "text": "EXTRACT(@period FROM CURRENT_DATE)\\nGROUP BY engineer_id;\\n-- NOTE: Replace @period with 'DAY', 'WEEK', 'MONTH', or 'QUARTER'.\\n\\n\\nIndividual Ticket Volume\\n\\n\\n Definition\\n \\n The number of support tickets handled by a specific engineer, which can help identify workload distribution and skill set alignment.\\n \\n \\n Calculation\\n \\n Total number of tickets handled by the engineer during a specific period\\n \\n \\n\\n\\nSELECT engineer_id, COUNT(*) AS TicketVolume\\nFROM",
+ "title": "Understanding a Support Engineer's Pain Points and KPIs"
},
{
- "id": "ART-1979_KNOWLEDGE_NODE-38",
- "text": "the top-right corner of your screen.\\n3. Add a title and description for your new ticket. You can also attach files related to the ticket in the description.\\n4. Select which part of the company/product this ticket is related to.\\n\\n ![]()\\n5. Enter other attributes for the ticket: change the assignee or accept the default; enter the severity; add any relevant tags to help employees identify any relevant traits of the ticket; select the workspace that the ticket pertains to.\\n6. If there are",
- "title": "Tickets | Computer for Support Teams | DevRev"
+ "id": "ART-6174_KNOWLEDGE_NODE-13",
+ "text": "creator](/docs/automations/smart-issue-creator)\\n - [Set user preference for group](/docs/automations/set-user-preference)\\n - [SLA status change Slack notifier](/docs/automations/sla-change-notifier)\\n - [Slash commands](/docs/automations/slash-commands)\\n - [Spam Shield](/docs/automations/spam-shield)\\n - [Subtype Migration](/docs/automations/subtype-migration)\\n - [Ticket age in engineering](/docs/automations/ticket-age-in-engineering)\\n - [Ticket issue field",
+ "title": "Conversation to ticket conversion | Conversations | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1977_KNOWLEDGE_NODE-13",
- "text": "creator](/docs/automations/smart-issue-creator)\\n - [Set user preference for group](/docs/automations/set-user-preference)\\n - [SLA status change Slack notifier](/docs/automations/sla-change-notifier)\\n - [Slash commands](/docs/automations/slash-commands)\\n - [Spam Shield](/docs/automations/spam-shield)\\n - [Subtype Migration](/docs/automations/subtype-migration)\\n - [Ticket age in engineering](/docs/automations/ticket-age-in-engineering)\\n - [Ticket issue field",
- "title": "Ticket-Team Performance | Support analytics | Computer for Support Teams | DevRev"
+ "id": "ART-984_KNOWLEDGE_NODE-9",
+ "text": "support ticket to get an update on the status of this feature as well as asks their rep what is going on. In most cases the rep and support engineer don\\xe2\\x80\\x99t communicate or have the context of what the other is doing (let alone access to the other\\xe2\\x80\\x99s system). The support engineer may respond saying that feature is a long ways away, while the rep may say it\\xe2\\x80\\x99s \\xe2\\x80\\x9ccoming soon\\xe2\\x80\\x9d.\\n\\nThis lack of coordination leads to contradiction and a clear",
+ "title": "Why you Should be Looking at Support Differently"
},
{
- "id": "ART-6174_KNOWLEDGE_NODE-36",
- "text": "Status](/status)\\n\\n\\xc2\\xa9 2025 DevRev Inc.\\n\\n![]()\\n\\n![]()\"",
- "title": "Conversation to ticket conversion | Conversations | Computer for Support Teams | DevRev"
+ "id": "ART-1974_KNOWLEDGE_NODE-31",
+ "text": "transitions to *hold* since the customer experience engineer is blocked by a dependent item.\\n\\n Conversations which need a response from the customer experience engineer shows a **Reply** button in the inbox.\\n* *Hold* (H)\\n\\n The resolution is waiting on some dependent item. Dependencies may include review from someone other than the customer experience engineer (for example, SME, manager, PM, developer) or the completion of other work items (tickets or issues).\\n\\n When the dependencies",
+ "title": "Conversations | Computer for Support Teams | DevRev"
},
{
- "id": "ART-2019_KNOWLEDGE_NODE-3",
- "text": "reminder\\nCSAT on conversation\\nCSAT on ticket\\nDescope identity validation\\nFollow-up ticket\\nHTTP archive file upload & sanitization\\nLink preview\\nOrg tags sync\\nSentiment evaluator\\nStageFlow automator\\nSmart issue creator\\nSet user preference for group\\nSmart import KBs\\nSLA status change Slack notifier\\nSlash commands\\nSmart sprint\\nSpam Shield\\nTicket age in engineering\\nTicket issue field migrator\\nTicket email notifier\\nTask tracker\\nTicket Tagger\\nWork duration\\nOperational SLA",
- "title": "Smart sprint | Automate | Snap-ins | DevRev"
+ "id": "ART-1974_KNOWLEDGE_NODE-30",
+ "text": "stage.\\n* *Needs response* (NR)\\n\\n The customer has responded; the customer experience engineer needs to review the item and respond or resolve the issue if the user requests or validates the fix. When a customer experience engineer responds the stage transitions to *waiting on user*.\\n\\n In certain cases it may be necessary to escalate the item internally where the conversation may depend on tickets, issues, or a response from someone other than themselves. In this case the stage",
+ "title": "Conversations | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1979_KNOWLEDGE_NODE-41",
- "text": "progress\\n\\n\\n\\nOpen\\n\\n\\n\\nEscalate\\n\\n\\n\\nValidate the fix\\n\\n\\n\\nAdditional detail needed\\n\\n\\n\\nCustomer responds\\n\\n\\n\\nStart\\n\\n\\n\\nFeature request accepted\\n\\n\\n\\nResolved\\n\\n\\n\\nNot valid\\n\\n\\n\\nQueued\\n\\n\\n\\nWork in progress\\n\\n\\n\\nAwaiting product assist\\n\\n\\n\\nAwaiting development\\n\\n\\n\\nAwating customer response\\n\\n\\n\\nIn development\\n\\n\\n\\nAccepted\\n\\n\\n\\nResolved\\n\\n\\n\\nCanceled\\n```\\n\\n**Open**\\n\\n* *Queued* (Q)\\n The initial stage for all tickets. When a new ticket is created,",
- "title": "Tickets | Computer for Support Teams | DevRev"
+ "id": "ART-6174_KNOWLEDGE_NODE-14",
+ "text": "migrator](/docs/automations/ticket-issue-field-migrator)\\n - [Ticket Immutability](/docs/automations/ticket-immutability)\\n - [Ticket email notifier](/docs/automations/ticket-email-notifier)\\n - [Task tracker](/docs/automations/task-tracker)\\n - [Ticket Tagger](/docs/automations/ticket-tagger)\\n - [Tracxn sync](/docs/automations/tracxn-sync)\\n - [User group validator](/docs/automations/user-group-validator)\\n - [Work duration](/docs/automations/work-duration)\\n -",
+ "title": "Conversation to ticket conversion | Conversations | Computer for Support Teams | DevRev"
},
{
- "id": "ART-1979_KNOWLEDGE_NODE-45",
- "text": "a user. In certain cases where the ticket depends on some fix (issues) the stage may go from *in development* to *awaiting customer response* when the corresponding issues have been resolved and the fix needs to be validated with the user.\\n\\n In certain cases, the customer experience engineer may be able to solve directly (without any required issues) which may change the stage from *work in progress* to *awaiting customer response* to validate they have solved the problem. If either has",
- "title": "Tickets | Computer for Support Teams | DevRev"
+ "id": "ART-6174_KNOWLEDGE_NODE-3",
+ "text": "management](/docs/product/workflow-management)\\n - [Workflow nodes](/docs/product/workflow-nodes)\\n - [Troubleshooting](/docs/product/troubleshooting-workflows)\\n + [Templates](/docs/product/template)\\n + [Accessing DevRev](/docs/product/ui)\\n + [External identity provider setup](/docs/product/sso-saml)\\n + [Remote MCP server](/docs/product/remote-mcp)\\n* [Computer for Support Teams](/docs/product/support)\\n\\n + [Inbox](/docs/product/inbox)\\n + [Support",
+ "title": "Conversation to ticket conversion | Conversations | Computer for Support Teams | DevRev"
}
]
},
@@ -1516,54 +1516,54 @@
"query": "update the name that a broadcast on an incident comes from when pushed to a ticket",
"retrievals": [
{
- "id": "ART-4133_KNOWLEDGE_NODE-18",
- "text": "incident was mitigated.\\n\\nowned\\\\_byobjectOptional\\n\\nShow 1 properties\\n\\npiaobjectOptional\\n\\nShow 1 properties\\n\\nplaybooksobjectOptional\\n\\nShow 1 properties\\n\\nrelated\\\\_docsobjectOptional\\n\\nShow 1 properties\\n\\nreported\\\\_bylongOptional\\n\\nThe entity that first reported the incident.\\n\\nseveritylongOptional\\n\\nSeverity of the incident.\\n\\nstageobjectOptional\\n\\nUpdate object for Stage.\\n\\nShow 2 properties\\n\\nstage\\\\_validation\\\\_optionslist of enumsOptional\\n\\nThe type of stage",
- "title": "Update Incident | DevRev | Docs"
+ "id": "ART-1979_KNOWLEDGE_NODE-26",
+ "text": "associated with a part (product or service) and can come from both internal and external users. Tickets are also used to communicate progress to the user or other impacted party.\\n\\nThere may be cases where mass communications (broadcast) are necessary in the event of lots of impacted or related parties (such as service status updates). In this scenario, the ticket would be used to broadcast and handle communications among multiple parties, including across multiple workspaces. Broadcast can",
+ "title": "Tickets | Computer for Support Teams | DevRev"
},
{
- "id": "ART-4133_KNOWLEDGE_NODE-1",
- "text": "\" \\\\ |\\n| > | -H \"Content-Type: application/json\" \\\\ |\\n| > | -d \\'{ |\\n| > | \"id\": \"string\" |\\n| > | }\\' |\\n```\\n\\n[Try it](/beta/api-reference/incidents/update?explorer=true)\\n\\n200Successful\\n\\n```\\n| | |\\n| --- | --- |\\n| 1 | { |\\n| 2 | \"incident\": { |\\n| 3 | \"id\": \"string\", |\\n| 4 | \"title\": \"string\", |\\n| 5 | \"acknowledged_date\": \"2023-01-01T12:00:00.000Z\", |\\n| 6 | \"actual_close_date\": \"2023-01-01T12:00:00.000Z\", |\\n| 7 | \"applies_to_parts\": [ |\\n| 8 | { |\\n| 9 | \"display_id\":",
- "title": "Update Incident | DevRev | Docs"
+ "id": "ART-1953_KNOWLEDGE_NODE-29",
+ "text": "[support@yourdomain.com](mailto:support@yourdomain.com)\\n* **Subject**: \"You are missing messages from \"\\n\\nReply to the customer on a ticket\\n---------------------------------\\n\\n* **Trigger**: When a reply is made to a customer on a ticket.\\n* **Action**: The system sends out a notification to the customer with the reply message.\\n* **Sender**: {Company\\\\_Name} [support@yourdomain.com](mailto:support@yourdomain.com)\\n* **Subject**: \"[{Company\\\\_Name}] Update on TKT-XXX\"\\n\\nTicket",
+ "title": "Customer email notifications | Computer by DevRev | DevRev"
},
{
- "id": "ART-4133_KNOWLEDGE_NODE-5",
- "text": "|\\n| 67 | \"display_id\": \"string\", |\\n| 68 | \"identified_date\": \"2023-01-01T12:00:00.000Z\", |\\n| 69 | \"impact\": { |\\n| 70 | \"count\": { |\\n| 71 | \"id\": 1, |\\n| 72 | \"label\": \"string\", |\\n| 73 | \"ordinal\": 1, |\\n| 74 | \"value\": null |\\n| 75 | }, |\\n| 76 | \"customer_ids\": [ |\\n| 77 | { |\\n| 78 | \"id\": \"string\", |\\n| 79 | \"display_id\": \"string\", |\\n| 80 | \"display_name\": \"string\" |\\n| 81 | } |\\n| 82 | ] |\\n| 83 | }, |\\n| 84 | \"mitigated_date\": \"2023-01-01T12:00:00.000Z\", |\\n| 85 | \"modified_by\": {",
+ "id": "ART-4133_KNOWLEDGE_NODE-19",
+ "text": "validations options when updating the stage or\\nthe stage diagram of an incident.\\n\\nAllowed values:allow\\\\_invalid\\\\_transition\\n\\nstaged\\\\_infoobjectOptional\\n\\nUpdate object for StagedInfo.\\n\\nShow 4 properties\\n\\nsync\\\\_metadataobjectOptional\\n\\nShow 4 properties\\n\\ntagsobjectOptional\\n\\nShow 1 properties\\n\\ntarget\\\\_close\\\\_datestringOptional`format: \"date-time\"`\\n\\nTimestamp when the incident is expected to be resolved.\\n\\ntitlestringOptional`format: \"text\"`\\n\\nTitle of the",
"title": "Update Incident | DevRev | Docs"
},
{
- "id": "ART-4133_KNOWLEDGE_NODE-15",
- "text": "\"string\" |\\n| 258 | } |\\n| 259 | ], |\\n| 260 | \"target_close_date\": \"2023-01-01T12:00:00.000Z\" |\\n| 261 | } |\\n| 262 | } |\\n```\\n\\nUpdates an incident.\\n\\n### Headers\\n\\nAuthorizationstringRequired\\n\\nBearer authentication of the form `Bearer `, where token is your auth token.\\n\\n### Request\\n\\nThis endpoint expects an object.\\n\\nidstringRequired`format: \"id\"`\\n\\nThe ID of the incident to be updated.\\n\\nacknowledged\\\\_datestringOptional`format: \"date-time\"`\\n\\nTimestamp when the incident",
- "title": "Update Incident | DevRev | Docs"
+ "id": "ART-2913_KNOWLEDGE_NODE-30",
+ "text": "incident notes.\\n* **Update PagerDuty Incident Name**: Toggle whether PagerDuty incident titles\\n should be updated with the respective DevRev incident's ID.\\n\\n The format is: **[INC-XXX] - Original Incident Title**.\\n* **Default PagerDuty Service Runnable Part** (optional): Specify the default\\n runnable part to be used when no impacted part is selected on incident\\n creation.\\n\\n Select a runnable part that is mapped to a PagerDuty service.\\n* **Default PagerDuty Escalation Policy ID**",
+ "title": "PagerDuty | Integrate | Snap-ins | DevRev"
},
{
- "id": "ART-4127_KNOWLEDGE_NODE-5",
- "text": "|\\n| 67 | \"display_id\": \"string\", |\\n| 68 | \"identified_date\": \"2023-01-01T12:00:00.000Z\", |\\n| 69 | \"impact\": { |\\n| 70 | \"count\": { |\\n| 71 | \"id\": 1, |\\n| 72 | \"label\": \"string\", |\\n| 73 | \"ordinal\": 1, |\\n| 74 | \"value\": null |\\n| 75 | }, |\\n| 76 | \"customer_ids\": [ |\\n| 77 | { |\\n| 78 | \"id\": \"string\", |\\n| 79 | \"display_id\": \"string\", |\\n| 80 | \"display_name\": \"string\" |\\n| 81 | } |\\n| 82 | ] |\\n| 83 | }, |\\n| 84 | \"mitigated_date\": \"2023-01-01T12:00:00.000Z\", |\\n| 85 | \"modified_by\": {",
- "title": "Create Incident | DevRev | Docs"
+ "id": "ART-1801_KNOWLEDGE_NODE-195",
+ "text": "Update.\\n\\nPOST https:// api.devrev.ai / incidents.update\\nUpdates an incident.\\nRequest.\\n\\nThis endpoint expects an object.\\nid string Required\\nThe ID of the incident to be updated.\\nacknowledged_date datetime Optional\\nTimestamp when the incident was acknowledged.\\napplies_to_parts object Optional\\nShow property\\nartifacts object Optional\\nShow property\\nbody string Optional\\nBody of the incident.\\ncustom_fields map from strings to any Optional\\nApplication-defined custom",
+ "title": "Get \u2014 DevRev | Docs"
},
{
- "id": "ART-1551_KNOWLEDGE_NODE-275",
- "text": "Optional\\n\\nTimestamp when the incident was mitigated.\\n\\nowned_by object Optional\\nShow property\\npia object Optional\\nShow property\\nplaybooks object Optional\\nShow property\\nrelated_docs object Optional\\nShow property\\nreported_by long Optional\\n\\nThe entity that first reported the incident.\\n\\nseverity long Optional\\n\\nSeverity of the incident.\\n\\nsource long Optional\\n\\nSource of where the incident was created. Only sys users and service accounts are supposed to set this field.\\n\\nstage",
- "title": "Update (Beta) \u2014 DevRev | Docs"
+ "id": "ART-1308_KNOWLEDGE_NODE-196",
+ "text": "Optional\\nSeverity of the incident.\\nsource long Optional\\nSource of where the incident was created. Only sys users and service accounts are supposed to set this field.\\nstage object Optional\\nUpdate object for Stage.\\nShow 2 properties\\nstakeholders object Optional\\nShow property\\ntags object Optional\\nShow property\\ntarget_close_date datetime Optional\\nTimestamp when the incident is expected to be resolved.\\ntitle string Optional\\nTitle of the incident.\\nResponse.\\n\\nThis endpoint returns an",
+ "title": "Update \u2014 DevRev | Docs"
},
{
- "id": "ART-4127_KNOWLEDGE_NODE-10",
- "text": "\"string\" |\\n| 166 | }, |\\n| 167 | \"sync_metadata\": { |\\n| 168 | \"external_reference\": \"string\", |\\n| 169 | \"origin_system\": \"string\" |\\n| 170 | }, |\\n| 171 | \"title\": \"string\" |\\n| 172 | } |\\n| 173 | ], |\\n| 174 | \"reported_by\": { |\\n| 175 | \"id\": 1, |\\n| 176 | \"label\": \"string\", |\\n| 177 | \"ordinal\": 1, |\\n| 178 | \"value\": null |\\n| 179 | }, |\\n| 180 | \"severity\": { |\\n| 181 | \"id\": 1, |\\n| 182 | \"label\": \"string\", |\\n| 183 | \"ordinal\": 1, |\\n| 184 | \"value\": null |\\n| 185 | }, |\\n| 186 |",
- "title": "Create Incident | DevRev | Docs"
+ "id": "ART-1300_KNOWLEDGE_NODE-193",
+ "text": "Update.\\n\\nPOST https:// api.devrev.ai / incidents.update\\nUpdates an incident.\\nRequest.\\n\\nThis endpoint expects an object.\\nid string Required\\nThe ID of the incident to be updated.\\nacknowledged_date datetime Optional\\nTimestamp when the incident was acknowledged.\\napplies_to_parts object Optional\\nShow property\\nartifacts object Optional\\nShow property\\nbody string Optional\\nBody of the incident.\\ncustom_fields map from strings to any Optional\\nApplication-defined custom",
+ "title": "Create \u2014 DevRev | Docs"
},
{
- "id": "ART-4133_KNOWLEDGE_NODE-10",
- "text": "\"string\" |\\n| 166 | }, |\\n| 167 | \"sync_metadata\": { |\\n| 168 | \"external_reference\": \"string\", |\\n| 169 | \"origin_system\": \"string\" |\\n| 170 | }, |\\n| 171 | \"title\": \"string\" |\\n| 172 | } |\\n| 173 | ], |\\n| 174 | \"reported_by\": { |\\n| 175 | \"id\": 1, |\\n| 176 | \"label\": \"string\", |\\n| 177 | \"ordinal\": 1, |\\n| 178 | \"value\": null |\\n| 179 | }, |\\n| 180 | \"severity\": { |\\n| 181 | \"id\": 1, |\\n| 182 | \"label\": \"string\", |\\n| 183 | \"ordinal\": 1, |\\n| 184 | \"value\": null |\\n| 185 | }, |\\n| 186 |",
+ "id": "ART-4133_KNOWLEDGE_NODE-7",
+ "text": "104 | { |\\n| 105 | \"display_id\": \"string\", |\\n| 106 | \"id\": \"string\", |\\n| 107 | \"display_name\": \"string\", |\\n| 108 | \"display_picture\": { |\\n| 109 | \"display_id\": \"string\", |\\n| 110 | \"id\": \"string\", |\\n| 111 | \"file\": { |\\n| 112 | \"type\": \"string\", |\\n| 113 | \"name\": \"string\", |\\n| 114 | \"size\": 1 |\\n| 115 | } |\\n| 116 | }, |\\n| 117 | \"email\": \"string\", |\\n| 118 | \"full_name\": \"string\", |\\n| 119 | \"state\": \"active\" |\\n| 120 | } |\\n| 121 | ], |\\n| 122 | \"pia\": [ |\\n| 123 | { |\\n| 124 | \"id\":",
"title": "Update Incident | DevRev | Docs"
},
{
- "id": "ART-4133_KNOWLEDGE_NODE-17",
- "text": "included in the\\nspecifier, it remains unchanged. For surfaces with human interactors,\\nit is recommended to provide tenant\\\\_fragment: true and\\nvalidate\\\\_required\\\\_fields: true.\\n\\nShow 5 properties\\n\\nexternal\\\\_source\\\\_dataobjectOptional\\n\\nShow 3 properties\\n\\nidentified\\\\_datestringOptional`format: \"date-time\"`\\n\\nTime when the incident was identified/reported.\\n\\nimpactobjectOptional\\n\\nShow 2 properties\\n\\nmitigated\\\\_datestringOptional`format: \"date-time\"`\\n\\nTimestamp when the",
- "title": "Update Incident | DevRev | Docs"
+ "id": "ART-1483_KNOWLEDGE_NODE-8",
+ "text": "the snap-in should create a work-item of type ticket when triggered. To do that, use the [DevRev TypeScript SDK](https://www.npmjs.com/package/@devrev/typescript-sdk) to make API calls for creating the ticket.\\n\\n[2](/public/snapin-development/tutorials/timer-ticket-creator#creating-the-snap-in)\\n\\n### Creating the snap-in\\n\\n#### Updating the manifest\\n\\nUpdate the manifest file to reflect the objective. Update the name, the description, and the service account\\xe2\\x80\\x99s display name to",
+ "title": "Using a snap-in to perform a DevRev action \u2014 DevRev | Docs"
},
{
- "id": "ART-4133_KNOWLEDGE_NODE-19",
- "text": "validations options when updating the stage or\\nthe stage diagram of an incident.\\n\\nAllowed values:allow\\\\_invalid\\\\_transition\\n\\nstaged\\\\_infoobjectOptional\\n\\nUpdate object for StagedInfo.\\n\\nShow 4 properties\\n\\nsync\\\\_metadataobjectOptional\\n\\nShow 4 properties\\n\\ntagsobjectOptional\\n\\nShow 1 properties\\n\\ntarget\\\\_close\\\\_datestringOptional`format: \"date-time\"`\\n\\nTimestamp when the incident is expected to be resolved.\\n\\ntitlestringOptional`format: \"text\"`\\n\\nTitle of the",
- "title": "Update Incident | DevRev | Docs"
+ "id": "ART-1979_KNOWLEDGE_NODE-27",
+ "text": "also be used to engage customers for feedback/ideas (such as new feature ideas). Scoping is important for broadcast tickets as there needs to be a differentiation between broadcast (all revs) vs. multicast (particular revs).\\n\\nViews of tickets can be found under **Support** in the DevRev app.\\n\\n![]()\\n\\nYou can export views to CSV or JSON by selecting **Actions** in the upper-right corner and choosing the format.\\n\\nAttributes\\n----------\\n\\nTickets have attributes that can be used to filter",
+ "title": "Tickets | Computer for Support Teams | DevRev"
}
]
},
@@ -1572,14 +1572,9 @@
"query": "search functionality on tickets and issues deprecated",
"retrievals": [
{
- "id": "ART-1959_KNOWLEDGE_NODE-29",
- "text": "in:title crm |\\n| - | Acts as an exclusion in search results. \"-\" can be used for the same purpose. | type:issue -crm type:issue in:title -crm |\\n| state | Filters results based on the stage: open, closed, or in\\\\_progress. | state:open state:closed state:in\\\\_progress |\\n| severity | Filters out tickets with the desired severity level. Supports: blocker, high, medium, low. | severity:high type:ticket -severity:low (filters all tickets excluding the ones with low severity)",
- "title": "Search | Computer by DevRev | DevRev"
- },
- {
- "id": "ART-1959_KNOWLEDGE_NODE-28",
- "text": "of the ticket/issue/enhancement or title. | in:title crm in:title \"crm exp\" in:title crm exp in:body \"bot issues\" |\\n| type: