From b1d16a8efd2f834cc2269b82c2a50973b8240bde Mon Sep 17 00:00:00 2001 From: Guillem Borrell Date: Sat, 18 May 2024 23:27:25 +0200 Subject: [PATCH] Now with a custom greeting --- requirements.in | 3 ++ src/hellocomputer/config.py | 12 ++++++ src/hellocomputer/main.py | 28 +++++++++++++ src/hellocomputer/static/.DS_Store | Bin 0 -> 6148 bytes src/hellocomputer/static/img/assistant.webp | Bin 0 -> 35182 bytes src/hellocomputer/static/index.html | 41 +++++++++++++++++--- src/hellocomputer/static/script.js | 31 ++++++++++++++- src/hellocomputer/static/style.css | 25 ++++++++++++ 8 files changed, 133 insertions(+), 7 deletions(-) create mode 100644 src/hellocomputer/config.py create mode 100644 src/hellocomputer/static/.DS_Store create mode 100644 src/hellocomputer/static/img/assistant.webp diff --git a/requirements.in b/requirements.in index 8048479..e6d6efa 100644 --- a/requirements.in +++ b/requirements.in @@ -1,2 +1,5 @@ langchain +langchain-community +openai fastapi +pydantic-settings diff --git a/src/hellocomputer/config.py b/src/hellocomputer/config.py new file mode 100644 index 0000000..6e90838 --- /dev/null +++ b/src/hellocomputer/config.py @@ -0,0 +1,12 @@ +from pydantic_settings import BaseSettings, SettingsConfigDict + + +class Settings(BaseSettings): + anyscale_api_key: str = "Awesome API" + gcs_access: str = "access" + gcs_secret: str = "secret" + + model_config = SettingsConfigDict(env_file=".env") + + +settings = Settings() diff --git a/src/hellocomputer/main.py b/src/hellocomputer/main.py index 9ff9e09..3396e20 100644 --- a/src/hellocomputer/main.py +++ b/src/hellocomputer/main.py @@ -1,8 +1,12 @@ from fastapi import FastAPI, status from fastapi.staticfiles import StaticFiles +from fastapi.responses import PlainTextResponse import hellocomputer from pathlib import Path from pydantic import BaseModel +from langchain_community.chat_models import ChatAnyscale +from langchain_core.messages import HumanMessage, SystemMessage +from .config import settings static_path = Path(hellocomputer.__file__).parent / "static" @@ -36,6 +40,30 @@ def get_health() -> HealthCheck: return HealthCheck(status="OK") +@app.get("/greetings", response_class=PlainTextResponse) +async def get_greeting() -> str: + model = "meta-llama/Meta-Llama-3-8B-Instruct" + chat = ChatAnyscale( + model_name=model, + temperature=0.5, + anyscale_api_key=settings.anyscale_api_key, + ) + + messages = [ + SystemMessage(content="You are a helpful AI that shares everything you know."), + HumanMessage( + content="Make a short presentation of yourself " + "as an assistant in Spanish in about 20 words. " + "You're capable of analyzing a file that a user " + "has previously uploaded." + ), + ] + + model_response = await chat.ainvoke(messages) + print(model_response.response_metadata) + return model_response.content + + app.mount( "/", StaticFiles(directory=static_path, html=True, packages=["bootstrap4"]), diff --git a/src/hellocomputer/static/.DS_Store b/src/hellocomputer/static/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..8f0779e67b341169b16b6f5abf8708cf286107d1 GIT binary patch literal 6148 zcmeHK-AcnS6i(c98AIrW!Y%{e4&0nSh&QFq7qFriDzl|y7Q1Gwo4pu=Uh50_BtDPl zBq=!TwTL?hlJEQ`%?Hg7V~l%?sK=PY7!%MCIVu%`?#j@XO-AH6Mm7x-6@v8#n{ydm3GB23jqjjTH5|(-p-o~SR z=F|Xap$_cX1l2+*6A*%5<%70-`CJL#Mr5_RhK;dD82zI&yh_1p0CR zbhT=V{e#1c>)}f>N!6R7lLOmYb}g3h4vJmPt3OKxd|z<68nzT68TI1|b5%O(~!$<@Sle zO*#0b&2udl22DBRdS)2M&RjlTxSk#SQl~TS8l;{WAO_YMs2S72^ZyEdnaW50dI?#? z05R~-7~u7RKk#5t_H6yJJUnY9v?pjNm{*_z0{Yq|01Vtm+B#_B5_QOPEfxlG6!hzI PK)MKMLZ~AKeu056pms@U literal 0 HcmV?d00001 diff --git a/src/hellocomputer/static/img/assistant.webp b/src/hellocomputer/static/img/assistant.webp new file mode 100644 index 0000000000000000000000000000000000000000..9ad3e0af38ed1dfb1e1ac2a0cdac5052f7b4c659 GIT binary patch literal 35182 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 literal 0 HcmV?d00001 diff --git a/src/hellocomputer/static/index.html b/src/hellocomputer/static/index.html index b1b40d2..e07d108 100644 --- a/src/hellocomputer/static/index.html +++ b/src/hellocomputer/static/index.html @@ -7,9 +7,6 @@ Chat Application - @@ -35,14 +32,43 @@ +
+ + + + +
-
Message 1
-
Message 2
-
Message 3
+
+ +
+
+ +
+
@@ -63,6 +89,9 @@ + diff --git a/src/hellocomputer/static/script.js b/src/hellocomputer/static/script.js index 42c0a74..a9c79d4 100644 --- a/src/hellocomputer/static/script.js +++ b/src/hellocomputer/static/script.js @@ -47,4 +47,33 @@ textarea.addEventListener('keypress', function (e) { e.preventDefault(); addUserMessage(); } -}); \ No newline at end of file +}); + +document.addEventListener("DOMContentLoaded", function () { + // Elements + const spinner = document.getElementById('spinner'); + const resultDiv = document.getElementById('result'); + + // Function to fetch greeting + async function fetchGreeting() { + try { + const response = await fetch('/greetings'); + if (!response.ok) { + throw new Error('Network response was not ok ' + response.statusText); + } + const data = await response.text(); + + // Hide spinner and display result + spinner.classList.add('hidden'); + resultDiv.classList.remove('hidden'); + resultDiv.textContent = data; + } catch (error) { + spinner.classList.add('hidden'); + resultDiv.classList.remove('hidden'); + resultDiv.textContent = 'Error: ' + error.message; + } + } + + // Call the function to fetch greeting + fetchGreeting(); +}); diff --git a/src/hellocomputer/static/style.css b/src/hellocomputer/static/style.css index aa33491..8345961 100644 --- a/src/hellocomputer/static/style.css +++ b/src/hellocomputer/static/style.css @@ -64,4 +64,29 @@ html { border-top: 1px solid #ddd; padding: 10px; box-sizing: border-box; +} + + +.spinner { + border: 4px solid #f3f3f3; + border-top: 4px solid #3498db; + border-radius: 50%; + width: 20px; + height: 20px; + animation: spin 2s linear infinite; + margin: auto; +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +.hidden { + display: none; } \ No newline at end of file