From 56355c9f4c04784cfb374124f1a6ad0e84ca4953 Mon Sep 17 00:00:00 2001 From: Shantanu Vishwanadha Date: Thu, 4 Jul 2024 11:10:51 +0530 Subject: [PATCH 1/3] Added temporal-worfklow-samples --- temporal-workflow-blog/README.md | 170 ++++++++++++++++++ temporal-workflow-blog/package.json | 46 +++++ .../src/activities/index.ts | 8 + temporal-workflow-blog/src/client.ts | 25 +++ temporal-workflow-blog/src/logging.ts | 50 ++++++ temporal-workflow-blog/src/worker.ts | 55 ++++++ temporal-workflow-blog/src/workflows/index.ts | 11 ++ temporal-workflow-blog/tsconfig.json | 12 ++ 8 files changed, 377 insertions(+) create mode 100644 temporal-workflow-blog/README.md create mode 100644 temporal-workflow-blog/package.json create mode 100644 temporal-workflow-blog/src/activities/index.ts create mode 100644 temporal-workflow-blog/src/client.ts create mode 100644 temporal-workflow-blog/src/logging.ts create mode 100644 temporal-workflow-blog/src/worker.ts create mode 100644 temporal-workflow-blog/src/workflows/index.ts create mode 100644 temporal-workflow-blog/tsconfig.json diff --git a/temporal-workflow-blog/README.md b/temporal-workflow-blog/README.md new file mode 100644 index 0000000..9ef2687 --- /dev/null +++ b/temporal-workflow-blog/README.md @@ -0,0 +1,170 @@ +# Customer Logger demo + +This project demonstrates how to capture log entries produced by Workers, Workflows and Activities, and process them +using a third party logging libraries (in this case, the [Winston](https://github.com/winstonjs/winston) package). + +The [Logging docs](https://docs.temporal.io/dev-guide/typescript/observability#logging) explain some of the code in this sample. + +### Running this sample + +1. `temporal server start-dev` to start [Temporal Server](https://github.com/temporalio/cli/#installation). +1. `npm install` to install dependencies. +1. `npm run start.watch` to start the Worker. +1. In another shell, `npm run workflow` to run the Workflow. + +
+ +Sample worker output + + +``` +2023-09-05T18:19:39.646Z [worker] info: Creating worker { + options: { + namespace: 'default', + identity: '1234@MyComputer', + useVersioning: false, + buildId: undefined, + shutdownGraceTime: 0, + maxConcurrentLocalActivityExecutions: 100, + enableNonLocalActivities: true, + maxConcurrentWorkflowTaskPolls: 10, + maxConcurrentActivityTaskPolls: 10, + stickyQueueScheduleToStartTimeout: '10s', + maxHeartbeatThrottleInterval: '60s', + defaultHeartbeatThrottleInterval: '30s', + isolateExecutionTimeout: '5s', + workflowThreadPoolSize: 2, + maxCachedWorkflows: 914, + showStackTraceSources: false, + debugMode: false, + workflowsPath: '/Users/user/samples-typescript/custom-logger/src/workflows/index.ts', + activities: { greet: [AsyncFunction: greet] }, + taskQueue: 'custom-logger', + maxConcurrentWorkflowTaskExecutions: 40, + maxConcurrentActivityTaskExecutions: 100, + shutdownGraceTimeMs: 0, + shutdownForceTimeMs: undefined, + stickyQueueScheduleToStartTimeoutMs: 10000, + isolateExecutionTimeoutMs: 5000, + maxHeartbeatThrottleIntervalMs: 60000, + defaultHeartbeatThrottleIntervalMs: 30000, + loadedDataConverter: { + payloadConverter: DefaultPayloadConverter { + converterByEncoding: Map(3) { + 'binary/null' => [UndefinedPayloadConverter], + 'binary/plain' => [BinaryPayloadConverter], + 'json/plain' => [JsonPayloadConverter] + }, + converters: [ + [UndefinedPayloadConverter], + [BinaryPayloadConverter], + [JsonPayloadConverter] + ] + }, + failureConverter: DefaultFailureConverter { + options: { encodeCommonAttributes: false } + }, + payloadCodecs: [] + } + } +} +2023-09-05T18:19:40.084Z [worker] info: asset workflow-bundle-95e3c04c487ab5112957.js 755 KiB [emitted] [immutable] (name: main) +2023-09-05T18:19:40.084Z [worker] info: runtime modules 937 bytes 4 modules +2023-09-05T18:19:40.084Z [worker] info: modules by path ./node_modules/@temporalio/ 182 KiB +2023-09-05T18:19:40.084Z [worker] info: modules by path ./node_modules/@temporalio/common/lib/ 77.9 KiB 21 modules +2023-09-05T18:19:40.084Z [worker] info: modules by path ./node_modules/@temporalio/workflow/ 102 KiB +2023-09-05T18:19:40.084Z [worker] info: ./node_modules/@temporalio/workflow/lib/worker-interface.js 11 KiB [built] [code generated] +2023-09-05T18:19:40.084Z [worker] info: + 13 modules +2023-09-05T18:19:40.084Z [worker] info: ./node_modules/@temporalio/worker/lib/workflow-log-interceptor.js 2.42 KiB [built] [code generated] +2023-09-05T18:19:40.084Z [worker] info: modules by path ./src/workflows/ 878 bytes +2023-09-05T18:19:40.084Z [worker] info: ./src/workflows/index-autogenerated-entrypoint.cjs 597 bytes [built] [code generated] +2023-09-05T18:19:40.084Z [worker] info: ./src/workflows/index.ts 281 bytes [built] [code generated] +2023-09-05T18:19:40.084Z [worker] info: __temporal_custom_payload_converter (ignored) 15 bytes [built] [code generated] +2023-09-05T18:19:40.084Z [worker] info: __temporal_custom_failure_converter (ignored) 15 bytes [built] [code generated] +2023-09-05T18:19:40.084Z [worker] info: ./node_modules/long/umd/index.js 43.1 KiB [built] [code generated] +2023-09-05T18:19:40.084Z [worker] info: ./node_modules/ms/dist/index.cjs 3.41 KiB [built] [code generated] +2023-09-05T18:19:40.084Z [worker] info: webpack 5.88.2 compiled successfully in 264 ms +2023-09-05T18:19:40.085Z [worker] info: Workflow bundle created { size: '0.74MB' } +2023-09-05T18:19:40.165Z [worker] info: Initializing worker +2023-09-05T18:19:40.166Z [worker] info: Worker state changed { state: 'RUNNING' } +2023-09-05T18:19:51.963Z [worker] debug: New WFT +2023-09-05T18:19:51.963Z [worker] debug: Applying new workflow task from server +2023-09-05T18:19:51.963Z [worker] debug: Driven WF start +2023-09-05T18:19:51.963Z [worker] debug: Sending activation to lang +2023-09-05T18:19:51.987Z [workflow] debug: Workflow started { + namespace: 'default', + taskQueue: 'custom-logger', + workflowId: 'workflow-2YriOlmgK2vMT-rhRFQQp', + runId: 'fa0b415b-ef89-434d-839c-ec031d31668e', + workflowType: 'logSampleWorkflow' +} +2023-09-05T18:19:51.987Z [worker] debug: wf bridge iteration fetch +2023-09-05T18:19:51.987Z [worker] debug: handling command +2023-09-05T18:19:51.987Z [worker] debug: prepared commands +2023-09-05T18:19:51.987Z [worker] debug: Sending responses to server +2023-09-05T18:19:51.989Z [worker] debug: Server returned 1 fewer activities for eager execution than we requested +2023-09-05T18:19:51.989Z [worker] debug: Marking WFT completed +2023-09-05T18:19:51.994Z [workflow] debug: Activity started { + isLocal: false, + attempt: 1, + namespace: 'default', + taskToken: 'CiRjZGNlMGM2Mi1mYzdjLTQyODctOGM2MC1kNWYwOWIzNDhjMWESHndvcmtmbG93LTJZcmlPbG1nSzJ2TVQtcmhSRlFRcBokZmEwYjQxNWItZWY4OS00MzRkLTgzOWMtZWMwMzFkMzE2NjhlIAUoATIBMUIFZ3JlZXRKCAgBEPKUQxgB', + workflowId: 'workflow-2YriOlmgK2vMT-rhRFQQp', + workflowRunId: 'fa0b415b-ef89-434d-839c-ec031d31668e', + workflowType: 'logSampleWorkflow', + activityId: '1', + activityType: 'greet', + taskQueue: 'custom-logger' +} +2023-09-05T18:19:51.994Z [activity] info: Log from activity { + isLocal: false, + attempt: 1, + namespace: 'default', + taskToken: 'CiRjZGNlMGM2Mi1mYzdjLTQyODctOGM2MC1kNWYwOWIzNDhjMWESHndvcmtmbG93LTJZcmlPbG1nSzJ2TVQtcmhSRlFRcBokZmEwYjQxNWItZWY4OS00MzRkLTgzOWMtZWMwMzFkMzE2NjhlIAUoATIBMUIFZ3JlZXRKCAgBEPKUQxgB', + workflowId: 'workflow-2YriOlmgK2vMT-rhRFQQp', + workflowRunId: 'fa0b415b-ef89-434d-839c-ec031d31668e', + workflowType: 'logSampleWorkflow', + activityId: '1', + activityType: 'greet', + taskQueue: 'custom-logger', + name: 'Temporal' +} +2023-09-05T18:19:51.994Z [activity] debug: Activity completed { + isLocal: false, + attempt: 1, + namespace: 'default', + taskToken: 'CiRjZGNlMGM2Mi1mYzdjLTQyODctOGM2MC1kNWYwOWIzNDhjMWESHndvcmtmbG93LTJZcmlPbG1nSzJ2TVQtcmhSRlFRcBokZmEwYjQxNWItZWY4OS00MzRkLTgzOWMtZWMwMzFkMzE2NjhlIAUoATIBMUIFZ3JlZXRKCAgBEPKUQxgB', + workflowId: 'workflow-2YriOlmgK2vMT-rhRFQQp', + workflowRunId: 'fa0b415b-ef89-434d-839c-ec031d31668e', + workflowType: 'logSampleWorkflow', + activityId: '1', + activityType: 'greet', + taskQueue: 'custom-logger', + durationMs: 0 +} +2023-09-05T18:19:51.999Z [workerd] debug: New WFT +2023-09-05T18:19:51.999Z [workerd] debug: Applying new workflow task from server +2023-09-05T18:19:51.999Z [workerd] debug: Sending activation to lang +2023-09-05T18:19:52.001Z [workflow] info: Greeted { + namespace: 'default', + taskQueue: 'custom-logger', + workflowId: 'workflow-2YriOlmgK2vMT-rhRFQQp', + runId: 'fa0b415b-ef89-434d-839c-ec031d31668e', + workflowType: 'logSampleWorkflow', + greeting: 'Hello, Temporal!' +} +2023-09-05T18:19:52.001Z [workflow] debug: Workflow completed { + namespace: 'default', + taskQueue: 'custom-logger', + workflowId: 'workflow-2YriOlmgK2vMT-rhRFQQp', + runId: 'fa0b415b-ef89-434d-839c-ec031d31668e', + workflowType: 'logSampleWorkflow' +} +2023-09-05T18:19:52.001Z [worker] debug: wf bridge iteration fetch +2023-09-05T18:19:52.001Z [worker] debug: handling command +2023-09-05T18:19:52.001Z [worker] debug: prepared commands +2023-09-05T18:19:52.001Z [worker] debug: Sending responses to server +2023-09-05T18:19:52.004Z [worker] debug: Marking WFT completed +``` + +
diff --git a/temporal-workflow-blog/package.json b/temporal-workflow-blog/package.json new file mode 100644 index 0000000..209c4bf --- /dev/null +++ b/temporal-workflow-blog/package.json @@ -0,0 +1,46 @@ +{ + "name": "temporal-custom-logger", + "version": "0.1.0", + "private": true, + "scripts": { + "build": "tsc --build", + "build.watch": "tsc --build --watch", + "lint": "eslint .", + "start": "ts-node src/worker.ts", + "start.watch": "nodemon src/worker.ts", + "workflow": "ts-node src/client.ts" + }, + "nodemonConfig": { + "execMap": { + "ts": "ts-node" + }, + "ext": "ts", + "watch": [ + "src" + ] + }, + "dependencies": { + "@temporalio/activity": "^1.9.0", + "@temporalio/client": "^1.9.0", + "@temporalio/worker": "^1.9.0", + "@temporalio/workflow": "^1.9.0", + "nanoid": "3.x", + "parseable-winston": "^1.0.1", + "triple-beam": "^1.3.0", + "winston": "^3.3.3" + }, + "devDependencies": { + "@tsconfig/node16": "^1.0.0", + "@types/node": "^16.11.43", + "@types/triple-beam": "^1.3.2", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^7.32.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-deprecation": "^1.2.1", + "nodemon": "^2.0.12", + "prettier": "^2.8.8", + "ts-node": "^10.2.1", + "typescript": "^4.4.2" + } +} diff --git a/temporal-workflow-blog/src/activities/index.ts b/temporal-workflow-blog/src/activities/index.ts new file mode 100644 index 0000000..e0e71b4 --- /dev/null +++ b/temporal-workflow-blog/src/activities/index.ts @@ -0,0 +1,8 @@ +import { log } from '@temporalio/activity'; + +// @@@SNIPSTART typescript-activity-use-injected-logger +export async function greet(name: string): Promise { + log.info('Log from activity', { name }); + return `Hello, ${name}!`; +} +// @@@SNIPEND diff --git a/temporal-workflow-blog/src/client.ts b/temporal-workflow-blog/src/client.ts new file mode 100644 index 0000000..2a416ec --- /dev/null +++ b/temporal-workflow-blog/src/client.ts @@ -0,0 +1,25 @@ +import { nanoid } from 'nanoid'; +import { Connection, Client } from '@temporalio/client'; +import { logSampleWorkflow } from './workflows'; + +async function run() { + const connection = await Connection.connect(); // Connect to localhost with default ConnectionOptions. + // In production, pass options to the Connection constructor to configure TLS and other settings. + // This is optional but we leave this here to remind you there is a gRPC connection being established. + + const client = new Client({ + connection, + // In production you will likely specify `namespace` here; it is 'default' if omitted + }); + + // Invoke the `logSampleWorkflow` Workflow, only resolved when the workflow completes + await client.workflow.execute(logSampleWorkflow, { + taskQueue: 'custom-logger', + workflowId: 'workflow-' + nanoid(), + }); +} + +run().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/temporal-workflow-blog/src/logging.ts b/temporal-workflow-blog/src/logging.ts new file mode 100644 index 0000000..79c84f5 --- /dev/null +++ b/temporal-workflow-blog/src/logging.ts @@ -0,0 +1,50 @@ +import winston from 'winston'; +import util from 'util'; +import { ParseableTransport } from 'parseable-winston'; +import { LEVEL, SPLAT, MESSAGE } from 'triple-beam'; + +// There's nothing Temporal specific in this file. +// It is just a helper to create a Winston logger with some reasonable settings. + +const parseable = new ParseableTransport({ + url: process.env.PARSEABLE_LOGS_URL, + username: process.env.PARSEABLE_LOGS_USERNAME, + password: process.env.PARSEABLE_LOGS_PASSWORD, + logstream: process.env.PARSEABLE_LOGS_LOGSTREAM, // The logstream name + tags: { tag1: 'tagValue' } // optional tags to be added with each ingestion +}) + + +export interface LoggerOptions { + isProduction: boolean; + logFilePath: string; +} + +/** Turns a given timestamp or current Date to an ISO date string */ +function getDateStr(timestamp?: number): string { + return timestamp ? new Date(timestamp).toJSON() : new Date().toJSON(); +} + +/** Format function for logging in development */ +const devLogFormat = winston.format.printf(({ level, message, label, timestamp, ...rest }) => { + // The type signature in winston is wrong + const { [LEVEL]: _lvl, [SPLAT]: _splt, [MESSAGE]: _msg, ...restNoSymbols } = rest as Record; + return Object.keys(restNoSymbols).length === 0 + ? `${getDateStr(timestamp)} [${label}] ${level}: ${message}` + : `${getDateStr(timestamp)} [${label}] ${level}: ${message} ${util.inspect(restNoSymbols, false, 4, true)}`; +}); + + + +/** Create a winston logger from given options */ +export function createLogger({ isProduction, logFilePath }: LoggerOptions): winston.Logger { + return winston.createLogger({ + level: 'debug', + format: isProduction ? winston.format.json() : winston.format.combine(winston.format.colorize(), devLogFormat), + // transports: [ + // isProduction ? new winston.transports.File({ filename: logFilePath }) : new winston.transports.Console(), + // ], + transports: [parseable], + + }); +} diff --git a/temporal-workflow-blog/src/worker.ts b/temporal-workflow-blog/src/worker.ts new file mode 100644 index 0000000..060c371 --- /dev/null +++ b/temporal-workflow-blog/src/worker.ts @@ -0,0 +1,55 @@ +import { DefaultLogger, makeTelemetryFilterString, Runtime, Worker } from '@temporalio/worker'; +import * as activities from './activities'; +import { createLogger } from './logging'; + +const winstonLogger = createLogger({ + isProduction: process.env.NODE_ENV === 'test', + logFilePath: process.env.WORKER_LOG_PATH || '/var/log/worker.log', +}); + + +async function main() { + // @@@SNIPSTART typescript-core-telemetry-options + // Configure Rust Core runtime to export SDK logs + Runtime.install({ + // Install a logger to collect logs generated by Node.js Workers and Rust Core. + // Note: In production, WARN should generally be enough. DEBUG is quite verbose. + logger: new DefaultLogger('DEBUG', (entry) => { + winstonLogger.log({ + label: entry.meta?.activityId ? 'activity' : entry.meta?.workflowId ? 'workflow' : 'worker', + level: entry.level.toLowerCase(), + message: entry.message, + timestamp: Number(entry.timestampNanos / 1_000_000n), + ...entry.meta, + }); + }), + // Telemetry options control how logs are exported out of Rust Core. + telemetryOptions: { + logging: { + // By default, Core logs go directly to console. Setting the `forward` property here (to an + // empty object) enables forwarding of logs from Rust Core to the Node.js logger. + forward: {}, + // This filter determines which logs should be forwarded from Rust Core to the Node.js logger. + // Note: In production, WARN should generally be enough. DEBUG is quite verbose. + filter: makeTelemetryFilterString({ core: 'DEBUG' }), + }, + }, + }); + // @@@SNIPEND + + // Create a worker that uses the Runtime instance installed above + const worker = await Worker.create({ + workflowsPath: require.resolve('./workflows'), + activities, + taskQueue: 'custom-logger', + }); + await worker.run(); +} + +main().then( + () => void process.exit(0), + (err) => { + winstonLogger.error('Process failed', err); + process.exit(1); + } +); diff --git a/temporal-workflow-blog/src/workflows/index.ts b/temporal-workflow-blog/src/workflows/index.ts new file mode 100644 index 0000000..be48b06 --- /dev/null +++ b/temporal-workflow-blog/src/workflows/index.ts @@ -0,0 +1,11 @@ +import { log, proxyActivities } from '@temporalio/workflow'; +import type * as activities from '../activities'; + +const { greet } = proxyActivities({ + startToCloseTimeout: '5 minutes', +}); + +export async function logSampleWorkflow(): Promise { + const greeting = await greet('Temporal'); + log.info('Greeted', { greeting }); +} diff --git a/temporal-workflow-blog/tsconfig.json b/temporal-workflow-blog/tsconfig.json new file mode 100644 index 0000000..6ff187f --- /dev/null +++ b/temporal-workflow-blog/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node16/tsconfig.json", + "version": "4.4.2", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "./src", + "outDir": "./lib" + }, + "include": ["src/**/*.ts"] +} From 389f97d3b15a293ed38eb6b12faf4eeae8763a49 Mon Sep 17 00:00:00 2001 From: Shantanu Vishwanadha Date: Wed, 17 Jul 2024 19:36:31 +0530 Subject: [PATCH 2/3] Added ragbot code --- ragchatbot/app.py | 122 ++++++++++++++++++++++++++++++++++++ ragchatbot/requirements.txt | 6 ++ 2 files changed, 128 insertions(+) create mode 100644 ragchatbot/app.py create mode 100644 ragchatbot/requirements.txt diff --git a/ragchatbot/app.py b/ragchatbot/app.py new file mode 100644 index 0000000..07da5ba --- /dev/null +++ b/ragchatbot/app.py @@ -0,0 +1,122 @@ +import streamlit as st +import PyPDF2 +import os +import logging +from langchain.text_splitter import RecursiveCharacterTextSplitter +from langchain.embeddings import OpenAIEmbeddings +from langchain.vectorstores import FAISS +from langchain.chains import ConversationalRetrievalChain +from langchain.chat_models import ChatOpenAI +import requests +import json +from datetime import datetime +import pickle + +# Set up logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +# Parseable configuration +PARSEABLE_URL = "https://demo.parseable.com/api/v1/logstream" +PARSEABLE_STREAM = "ragbot" + +# OpenAI API key (replace with your actual key) +os.environ["OPENAI_API_KEY"] = "sk-proj-XHGQTzi8jMDxzFllbFO2T3BlbkFJWazqHICsuXMUgGB0z29g" + +# File to store chat history +CHAT_HISTORY_FILE = "chat_history.pkl" + +def send_log_to_parseable(log_data): + headers = { + "Content-Type": "application/json", + "Authorization": "Basic YWRtaW46YWRtaW4=" # Basic auth with username and password + } + try: + response = requests.post(f"{PARSEABLE_URL}/{PARSEABLE_STREAM}", headers=headers, json=log_data) + response.raise_for_status() + logger.info("Log sent to Parseable successfully") + except requests.exceptions.RequestException as e: + logger.error(f"Failed to send log to Parseable: {e}") + +def extract_text_from_pdf(pdf_file): + pdf_reader = PyPDF2.PdfReader(pdf_file) + text = "" + for page in pdf_reader.pages: + text += page.extract_text() + return text + +def create_vector_store(text): + text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200) + chunks = text_splitter.split_text(text) + + embeddings = OpenAIEmbeddings() + vector_store = FAISS.from_texts(chunks, embeddings) + + return vector_store + +def create_conversation_chain(vector_store): + llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0) + conversation_chain = ConversationalRetrievalChain.from_llm( + llm=llm, + retriever=vector_store.as_retriever(), + return_source_documents=True + ) + return conversation_chain + +def load_chat_history(): + if os.path.exists(CHAT_HISTORY_FILE): + with open(CHAT_HISTORY_FILE, 'rb') as f: + return pickle.load(f) + return [] + +def save_chat_history(chat_history): + with open(CHAT_HISTORY_FILE, 'wb') as f: + pickle.dump(chat_history, f) + +def main(): + st.title("RAG Conversation Bot with PDF Upload") + + st.write("Note: Chat history is stored locally on your device.") + + uploaded_file = st.file_uploader("Choose a PDF file", type="pdf") + + if uploaded_file is not None: + text = extract_text_from_pdf(uploaded_file) + vector_store = create_vector_store(text) + conversation_chain = create_conversation_chain(vector_store) + + st.success("PDF uploaded and processed successfully!") + + chat_history = load_chat_history() + + for message in chat_history: + st.write(f"{'User' if message['is_user'] else 'Bot'}: {message['text']}") + + user_question = st.text_input("Ask a question about the PDF:") + + if user_question: + start_time = datetime.now() + result = conversation_chain({"question": user_question, "chat_history": [(msg['text'], '') for msg in chat_history if not msg['is_user']]}) + end_time = datetime.now() + + answer = result["answer"] + st.write("Bot:", answer) + + chat_history.append({"is_user": True, "text": user_question}) + chat_history.append({"is_user": False, "text": answer}) + save_chat_history(chat_history) + + # Prepare log data + log_data = { + "timestamp": datetime.now().isoformat(), + "pdf_name": uploaded_file.name, + "question": user_question, + "answer": answer, + "processing_time_ms": (end_time - start_time).total_seconds() * 1000 + } + + # Send log to Parseable + send_log_to_parseable(log_data) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/ragchatbot/requirements.txt b/ragchatbot/requirements.txt new file mode 100644 index 0000000..3be241b --- /dev/null +++ b/ragchatbot/requirements.txt @@ -0,0 +1,6 @@ +streamlit +PyPDF2 +langchain +openai +faiss-cpu +requests \ No newline at end of file From 24103fa1e659478da8ecae1501b9a8305f5d9257 Mon Sep 17 00:00:00 2001 From: Shantanu Vishwanadha Date: Wed, 17 Jul 2024 19:37:50 +0530 Subject: [PATCH 3/3] remvoed key --- ragchatbot/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ragchatbot/app.py b/ragchatbot/app.py index 07da5ba..6c7fc61 100644 --- a/ragchatbot/app.py +++ b/ragchatbot/app.py @@ -21,7 +21,7 @@ PARSEABLE_STREAM = "ragbot" # OpenAI API key (replace with your actual key) -os.environ["OPENAI_API_KEY"] = "sk-proj-XHGQTzi8jMDxzFllbFO2T3BlbkFJWazqHICsuXMUgGB0z29g" +os.environ["OPENAI_API_KEY"] = "" # File to store chat history CHAT_HISTORY_FILE = "chat_history.pkl"