Skip to main content
This guide shows you how to work with inline citations in Knowledge Graph responses. Inline citations show which specific sources support each part of the response, enabling you to verify information and trace claims back to their origins.

Response with inline citations

Below is an example of a response from a Knowledge Graph that includes inline citations:
Acme Corp's flagship product line includes three
main categories: industrial tools, consumer
electronics, and automotive parts. The industrial
tools division offers precision manufacturing
equipment with advanced automation capabilities
[Acme-Product-Catalog.pdf](a1b2c3d4-e5f6-7890-abcd-ef1234567890).

Corresponding references array

Below is the corresponding references object that contains a direct snippet from the source file that was used to support the response:
{"files": [
  {
    "text": "Industrial Tools Division: Our precision manufacturing equipment features advanced automation capabilities with real-time monitoring systems that reduce operational downtime by up to 40% through predictive maintenance algorithms.",
    "fileId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "score": 0.95,
    "page": 12,
    "cite": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
  }
]}

Enable inline citations

To enable inline citations in Knowledge Graph responses, set inline_citations: true in your query_config parameter when making direct Knowledge Graph queries via the /v1/graphs/question endpoint.
curl --location --request POST 'https://api.writer.com/v1/graphs/question' \
  --header "Authorization: Bearer $WRITER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data-raw '{
    "graph_ids": ["<GRAPH_ID>"],
    "question": "What are the key features of our product?",
    "query_config": {
      "inline_citations": true
    }
  }'

Citation format and correlation

Citation format

Inline citations appear in the answer from the LLM as [source_name](identifier), where:
  • source_name is the display name of the source: either the filename for files, or the page title for web sources
  • identifier is the unique identifier used to correlate with the references array
The identifier format depends on the source type:
  • File sources: Uses the cite field value, for example, [document.pdf](a1b2c3d4-e5f6-7890-abcd-ef1234567890)
  • Web sources: Uses the url field value, for example, [Web Page Title](https://example.com/page)

Correlate citations with references

Inline citations correspond to entries in the references object. Correlation differs by source type:
  • File sources: Citations use the cite field from the file reference object as their identifier
  • Web sources: Citations use the url field from the web reference object as their identifier
Example correlation: Here’s an example showing how inline citations correlate with the references array for both file and web sources: Response text:
Acme Corp's flagship product line includes three main categories: industrial tools, consumer electronics, and automotive parts.
The industrial tools division offers precision manufacturing equipment with advanced automation capabilities
[Acme-Product-Catalog.pdf](a1b2c3d4-e5f6-7890-abcd-ef1234567890). According to recent industry analysis,
smart manufacturing adoption has increased by 40% across similar companies [Industry Trends Report](https://example.com/industry-trends).
References object:
{
  "files": [
    {
      "text": "Industrial Tools Division: Our precision manufacturing equipment features advanced automation capabilities with real-time monitoring systems that reduce operational downtime by up to 40% through predictive maintenance algorithms.",
      "fileId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "score": 0.95,
      "page": 12,
      "cite": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
    }
  ],
  "web": [
    {
      "text": "Smart manufacturing adoption rates have increased by 40% across mid-size manufacturing companies, driven by automation and IoT integration.",
      "url": "https://example.com/industry-trends",
      "title": "Industry Trends Report",
      "score": 0.88
    }
  ]
}
Citation mapping:
  • Citation [Acme-Product-Catalog.pdf](a1b2c3d4-e5f6-7890-abcd-ef1234567890) uses the cite field from the file reference object
  • Citation [Industry Trends Report](https://example.com/industry-trends) uses the url field from the web reference object
When working with inline citations in SDK responses, you can programmatically link citation IDs to their corresponding source text. This enables you to build applications that display citations with their source material.

Extract and correlate citations

These code samples demonstrate how to extract inline citations from Knowledge Graph responses and correlate them with their source material. The code parses citation markers in the answer text (like [filename](citation-id)) and matches them to the corresponding source text in the references object. Using similar patterns, you can extract citations and build applications that display citations with their source material.
from writerai import Writer
import re

# Initialize the Writer client
client = Writer()

# Query Knowledge Graph with inline citations
response = client.graphs.question(
    graph_ids=["<GRAPH_ID>"],
    question="What are the key features of our product?",
    query_config={
        "inline_citations": True
    }
)

def extract_citations_with_sources(answer_text, references):
    '''Extract citations from answer text and link them to source material.
    
    This function parses inline citations from Knowledge Graph responses and correlates
    them with their source material from the references object.
    
    Args:
        answer_text (str): The response text containing inline citations
        references (object): The references object containing files and web sources
        
    Returns:
        list: Array of citation objects with source text and metadata
    '''
    # Use regex to find all citations in the format [display_text](identifier)
    # This pattern matches markdown-style links like [filename](citation-id)
    citation_pattern = r'\[([^\]]+)\]\(([^)]+)\)'
    citations = re.findall(citation_pattern, answer_text)
    
    citation_data = []
    
    # Process each citation found in the answer text
    for display_text, identifier in citations:
        # Initialize citation info structure
        citation_info = {
            "display_text": display_text,  # The text shown in the citation (e.g., filename)
            "identifier": identifier,  # The unique citation ID
            "source_text": None,  # The actual source text
            "source_type": None   # The source type: "file" or "web"
        }
        
        # Search through file references to find matching citation
        if references and hasattr(references, 'files') and references.files:
            for file_ref in references.files:
                # Match citation ID with the 'cite' field in file references
                if hasattr(file_ref, 'cite') and file_ref.cite == identifier:
                    citation_info["source_text"] = file_ref.text  # Extract source text snippet
                    citation_info["source_type"] = "file"  # Mark as file source
                    citation_info["file_id"] = file_ref.file_id  # Store file ID for reference
                    citation_info["page"] = file_ref.page  # Store page number if available
                    break
        
        # Search through web references to find matching citation
        if references and hasattr(references, 'web') and references.web:
            for web_ref in references.web:
                # Match citation ID with the 'url' field in web references
                if hasattr(web_ref, 'url') and web_ref.url == identifier:
                    citation_info["source_text"] = web_ref.text  # Extract source text snippet
                    citation_info["source_type"] = "web"  # Mark as web source
                    citation_info["url"] = web_ref.url  # Store URL for reference
                    citation_info["title"] = web_ref.title  # Store page title
                    break
        
        citation_data.append(citation_info)
    
    return citation_data

# Extract citations with their source text
# This processes the response and creates a structured list of citations with their source material
citations = extract_citations_with_sources(response.answer, response.references)

# Display citations with source material
# Loop through each citation and print its details along with the source text
for citation in citations:
    print(f"Citation: [{citation['display_text']}]({citation['identifier']})")
    print(f"Source type: {citation['source_type']}")
    print(f"Source text: {citation['source_text']}")
    
    # Show additional metadata based on source type
    if citation['source_type'] == 'file':
        print(f"File ID: {citation['file_id']}, Page: {citation['page']}")
    elif citation['source_type'] == 'web':
        print(f"URL: {citation['url']}, Title: {citation['title']}")
    
    print("-" * 50)  # Separator between citations

Response format

Knowledge Graph responses include a references object with files and web arrays. The files array contains file reference objects for file-based sources, and the web array contains web reference objects for web-based sources.

File sources

File sources appear in the references.files array.
FieldTypeDescription
textstringThe actual text snippet from the source document that supports the response
fileIdstringUnique identifier for the source file
scorenumberInternal score used during the retrieval process for ranking and selecting relevant snippets
pageintegerPage number where the snippet was found in the source document
citestringUnique identifier used in inline citations within the response text

Web sources

Web sources appear in the references.web array.
FieldTypeDescription
textstringThe exact text snippet from the web source that was used to support the response
urlstringThe URL of the web page where this content was found
titlestringThe title of the web page where this content was found
scorenumberInternal score used during the retrieval process for ranking and selecting relevant snippets

Streaming responses

When using streaming responses with Knowledge Graph tools, the references object containing sources and citations appears in the last chunk of the stream. This means:
  • Content chunks: The response text with inline citations is streamed progressively
  • Final chunk: Contains the graph data with the complete references object
  • Citation processing: You need to collect all chunks and process the final one to access source text

Stream responses with SDKs

from writerai import Writer

# Initialize the Writer client
client = Writer()

# Configure Knowledge Graph tool with inline citations
tools = [{
    "type": "graph",
    "function": {
        "description": "Search company knowledge base",
        "graph_ids": ["<GRAPH_ID>"],
        "subqueries": True,
        "query_config": {
            "inline_citations": True
        }
    }
}]

messages = [{'role': 'user', 'content': 'What are the key features of our product?'}]

# Stream the response
stream = client.chat.chat(
    model="palmyra-x5",
    messages=messages,
    tools=tools,
    tool_choice="auto",
    stream=True
)

# Collect streaming content and references
references = None

for chunk in stream:
    if chunk.choices[0].delta.content is not None:
        # Stream content progressively
        content = chunk.choices[0].delta.content
        print(content, end='', flush=True)
    
    # Check for graph data in the message
    if hasattr(chunk.choices[0], 'message') and chunk.choices[0].message:
        if hasattr(chunk.choices[0].message, 'graph_data') and chunk.choices[0].message.graph_data:
            # References are in the graph_data.references object
            references = chunk.choices[0].message.graph_data.references

print("\nFile references:", references.files)
print("\nWeb references:", references.web)

Next steps

I