from flask import Flask, redirect, request, session, url_for import os from authlib.integrations.flask_client import OAuth from langchain.llms.huggingface_hub import HuggingFaceHub from langchain.prompts import ChatPromptTemplate from langchain.schema import StrOutputParser from langchain.schema.runnable import Runnable from langchain.schema.runnable.config import RunnableConfig import chainlit as cl app = Flask(__name__) app.secret_key = 'YourSecretKey' # Change this to a real secret key for production # OAuth setup with Authlib oauth = OAuth(app) oauth.register( name='oauth_provider', client_id=os.getenv("OAUTH_CLIENT_ID"), client_secret=os.getenv("OAUTH_CLIENT_SECRET"), authorize_url=os.getenv("OPENID_PROVIDER_URL") + '/authorize', access_token_url=os.getenv("OPENID_PROVIDER_URL") + '/token', client_kwargs={'scope': os.getenv("OAUTH_SCOPES").split(',')}, redirect_uri=f"https://{os.getenv('SPACE_HOST')}/login/callback" ) print(f"REDIRECT URI: https://{os.getenv('SPACE_HOST')}/login/callback") # Instantiate the LLM llm = HuggingFaceHub( model_kwargs={"max_length": 500}, repo_id="google/flan-t5-xxl", huggingfacehub_api_token=os.getenv("HUGGINGFACE_API_TOKEN"), ) # Initialize ChainLit with LLM def initialize_chainlit(): add_llm_provider( LangchainGenericProvider( id=llm._llm_type, name="HuggingFaceHub", llm=llm, is_chat=False, ) ) # Setup chainlit callbacks @cl.on_chat_start async def on_chat_start(): prompt = ChatPromptTemplate.from_messages([("human", "{question}")]) runnable = prompt | llm | StrOutputParser() cl.user_session.set("runnable", runnable) @cl.on_message async def on_message(message: cl.Message): runnable = cl.user_session.get("runnable") # type: Runnable msg = cl.Message(content="") async for chunk in runnable.astream( {"question": message.content}, config=RunnableConfig(callbacks=[cl.LangchainCallbackHandler()]), ): await msg.stream_token(chunk) await msg.send() @app.route('/') def home(): return 'Home - Login with OAuth Provider' @app.route('/login') def login(): redirect_uri = url_for('authorize', _external=True) return oauth.oauth_provider.authorize_redirect(redirect_uri) @app.route('/login/callback') def authorize(): print('Logged in and language model initialized. Proceed with operations.') token = oauth.oauth_provider.authorize_access_token() # Initialize ChainLit or perform actions based on the authenticated user initialize_chainlit() return 'Logged in and language model initialized. Proceed with operations.' if __name__ == "__main__": app.run(debug=True)