diff --git a/docs/docs/get-started/quickstart.mdx b/docs/docs/get-started/quickstart.mdx index 424b5910..993d9739 100644 --- a/docs/docs/get-started/quickstart.mdx +++ b/docs/docs/get-started/quickstart.mdx @@ -55,3 +55,336 @@ In this example, you'll try a different LLM to demonstrate how the Agent's respo ## Integrate OpenRAG into your application +:::tip +Ensure the `openrag-backend` container has port 8000 exposed in your `docker-compose.yml`: + +```yaml +openrag-backend: + ports: + - "8000:8000" +``` +::: + +OpenRAG provides a REST API that you can call from Python, TypeScript, or any HTTP client to chat with your documents. + +These example requests are run assuming OpenRAG is in "no-auth" mode. +For complete API documentation, including authentication, request and response parameters, and example requests, see the API documentation. + +### Chat with your documents + +Prompt OpenRAG at the `/chat` API endpoint. + + + + +```python +import requests + +url = "http://localhost:8000/chat" +payload = { + "prompt": "What documents are available to you?", + "previous_response_id": None +} + +response = requests.post(url, json=payload) +print("OpenRAG Response:", response.json()) +``` + + + + +```typescript +import fetch from 'node-fetch'; + +const response = await fetch("http://localhost:8000/chat", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + prompt: "What documents are available to you?", + previous_response_id: null + }) +}); + +const data = await response.json(); +console.log("OpenRAG Response:", data); +``` + + + + +```bash +curl -X POST "http://localhost:8000/chat" \ + -H "Content-Type: application/json" \ + -d '{ + "prompt": "What documents are available to you?", + "previous_response_id": null + }' +``` + + + + +
+Response + +``` +{ + "response": "I have access to a wide range of documents depending on the context and the tools enabled in this environment. Specifically, I can search for and retrieve documents related to various topics such as technical papers, articles, manuals, guides, knowledge base entries, and other text-based resources. If you specify a particular subject or type of document you're interested in, I can try to locate relevant materials for you. Let me know what you need!", + "response_id": "resp_68d3fdbac93081958b8781b97919fe7007f98bd83932fa1a" +} +``` + +
+ +### Search your documents + +Search your document knowledge base at the `/search` endpoint. + + + + +```python +import requests + +url = "http://localhost:8000/search" +payload = {"query": "healthcare data quality", "limit": 5} + +response = requests.post(url, json=payload) +results = response.json() + +print("Search Results:") +for result in results.get("results", []): + print(f"- {result.get('filename')}: {result.get('text', '')[:100]}...") +``` + + + + +```typescript +const response = await fetch("http://localhost:8000/search", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + query: "healthcare data quality", + limit: 5 + }) +}); + +const results = await response.json(); +console.log("Search Results:"); +results.results?.forEach((result, index) => { + const filename = result.filename || 'Unknown'; + const text = result.text?.substring(0, 100) || ''; + console.log(`${index + 1}. ${filename}: ${text}...`); +}); +``` + + + + +```bash +curl -X POST "http://localhost:8000/search" \ + -H "Content-Type: application/json" \ + -d '{"query": "healthcare data quality", "limit": 5}' +``` + + + + + +
+Example response + +``` +Found 5 results +1. 2506.08231v1.pdf: variables with high performance metrics. These variables might also require fewer replication analys... +2. 2506.08231v1.pdf: on EHR data and may lack the clinical domain knowledge needed to perform well on the tasks where EHR... +3. 2506.08231v1.pdf: Abstract Large language models (LLMs) are increasingly used to extract clinical data from electronic... +4. 2506.08231v1.pdf: these multidimensional assessments, the framework not only quantifies accuracy, but can also be appl... +5. 2506.08231v1.pdf: observed in only the model metrics, but not the abstractor metrics, it indicates that model errors m... +``` + +
+ +### Use chat and search together + +Create a complete chat application that combines an interactive terminal chat with session continuity and search functionality. + + + + +```python +import requests + +# Configuration +OPENRAG_BASE_URL = "http://localhost:8000" +CHAT_URL = f"{OPENRAG_BASE_URL}/chat" +SEARCH_URL = f"{OPENRAG_BASE_URL}/search" +DEFAULT_SEARCH_LIMIT = 5 + +def chat_with_openrag(message, previous_response_id=None): + try: + response = requests.post(CHAT_URL, json={ + "prompt": message, + "previous_response_id": previous_response_id + }) + response.raise_for_status() + data = response.json() + return data.get("response"), data.get("response_id") + except Exception as e: + return f"Error: {str(e)}", None + +def search_documents(query, limit=DEFAULT_SEARCH_LIMIT): + try: + response = requests.post(SEARCH_URL, json={ + "query": query, + "limit": limit + }) + response.raise_for_status() + data = response.json() + return data.get("results", []) + except Exception as e: + return [] + +# Interactive chat with session continuity and search +previous_response_id = None +while True: + question = input("Your question (or 'search ' to search): ").strip() + if question.lower() in ['quit', 'exit', 'q']: + break + if not question: + continue + + if question.lower().startswith('search '): + query = question[7:].strip() + print("Searching documents...") + results = search_documents(query) + print(f"\nFound {len(results)} results:") + for i, result in enumerate(results, 1): + filename = result.get('filename', 'Unknown') + text = result.get('text', '')[:100] + print(f"{i}. {filename}: {text}...") + print() + else: + print("OpenRAG is thinking...") + result, response_id = chat_with_openrag(question, previous_response_id) + print(f"OpenRAG: {result}\n") + previous_response_id = response_id +``` + + + + +```ts +import fetch from 'node-fetch'; + +// Configuration +const OPENRAG_BASE_URL = "http://localhost:8000"; +const CHAT_URL = `${OPENRAG_BASE_URL}/chat`; +const SEARCH_URL = `${OPENRAG_BASE_URL}/search`; +const DEFAULT_SEARCH_LIMIT = 5; + +async function chatWithOpenRAG(message: string, previousResponseId?: string | null) { + try { + const response = await fetch(CHAT_URL, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + prompt: message, + previous_response_id: previousResponseId + }) + }); + const data = await response.json(); + return [data.response || "No response received", data.response_id || null]; + } catch (error) { + return [`Error: ${error}`, null]; + } +} + +async function searchDocuments(query: string, limit: number = DEFAULT_SEARCH_LIMIT) { + try { + const response = await fetch(SEARCH_URL, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ query, limit }) + }); + const data = await response.json(); + return data.results || []; + } catch (error) { + return []; + } +} + +// Interactive chat with session continuity and search +let previousResponseId = null; +const readline = require('readline'); +const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); + +const askQuestion = () => { + rl.question("Your question (or 'search ' to search): ", async (question) => { + if (question.toLowerCase() === 'quit' || question.toLowerCase() === 'exit' || question.toLowerCase() === 'q') { + console.log("Goodbye!"); + rl.close(); + return; + } + if (!question.trim()) { + askQuestion(); + return; + } + + if (question.toLowerCase().startsWith('search ')) { + const query = question.substring(7).trim(); + console.log("Searching documents..."); + const results = await searchDocuments(query); + console.log(`\nFound ${results.length} results:`); + results.forEach((result, i) => { + const filename = result.filename || 'Unknown'; + const text = result.text?.substring(0, 100) || ''; + console.log(`${i + 1}. ${filename}: ${text}...`); + }); + console.log(); + } else { + console.log("OpenRAG is thinking..."); + const [result, responseId] = await chatWithOpenRAG(question, previousResponseId); + console.log(`\nOpenRAG: ${result}\n`); + previousResponseId = responseId; + } + askQuestion(); + }); +}; + +console.log("OpenRAG Chat Interface"); +console.log("Ask questions about your documents. Type 'quit' to exit."); +console.log("Use 'search ' to search documents directly.\n"); +askQuestion(); +``` + + + + +
+Example response + +``` +Your question (or 'search ' to search): search healthcare +Searching documents... + +Found 5 results: +1. 2506.08231v1.pdf: variables with high performance metrics. These variables might also require fewer replication analys... +2. 2506.08231v1.pdf: on EHR data and may lack the clinical domain knowledge needed to perform well on the tasks where EHR... +3. 2506.08231v1.pdf: Abstract Large language models (LLMs) are increasingly used to extract clinical data from electronic... +4. 2506.08231v1.pdf: Acknowledgements Darren Johnson for support in publication planning and management. The authors used... +5. 2506.08231v1.pdf: Ensuring Reliability of Curated EHR-Derived Data: The Validation of Accuracy for LLM/ML-Extracted In... + +Your question (or 'search ' to search): what's the weather today? +OpenRAG is thinking... +OpenRAG: I don't have access to real-time weather data. Could you please provide me with your location? Then I can help you find the weather information. + +Your question (or 'search ' to search): newark nj +OpenRAG is thinking... +``` + +
+## Next steps + +TBD \ No newline at end of file