Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 44 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,48 @@
# Environment variables
.env
.env.*

# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg

# Node
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# IDE
.idea/
.vscode/
*.swp
*.swo

# OS
.DS_Store
Thumbs.db

# Project specific
data/
embedding_model/*
!embedding_model/.ignore
.DS_Store
*.log
17 changes: 12 additions & 5 deletions chains.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from langchain_openai import ChatOpenAI
from langchain_ollama import ChatOllama
from langchain_aws import ChatBedrock
from langchain_google_genai import ChatGoogleGenerativeAI

from langchain_neo4j import Neo4jVector

Expand Down Expand Up @@ -81,18 +82,24 @@ def load_llm(llm_name: str, logger=BaseLogger(), config={}):
model_kwargs={"temperature": 0.0, "max_tokens_to_sample": 1024},
streaming=True,
)

elif llm_name.startswith("gemini"):
logger.info(f"LLM: Using Gemini: {llm_name}")
return ChatGoogleGenerativeAI(
model=llm_name,
temperature=0,
streaming=True,
convert_system_message_to_human=True
)
elif len(llm_name):
logger.info(f"LLM: Using Ollama: {llm_name}")
return ChatOllama(
temperature=0,
base_url=config["ollama_base_url"],
model=llm_name,
streaming=True,
# seed=2,
top_k=10, # A higher value (100) will give more diverse answers, while a lower value (10) will be more conservative.
top_p=0.3, # Higher value (0.95) will lead to more diverse text, while a lower value (0.5) will generate more focused text.
num_ctx=3072, # Sets the size of the context window used to generate the next token.
top_k=10,
top_p=0.3,
num_ctx=3072,
)
logger.info("LLM: Using GPT-3.5")
return ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo", streaming=True)
Expand Down
28 changes: 8 additions & 20 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ services:
environment:
- NEO4J_AUTH=${NEO4J_USERNAME-neo4j}/${NEO4J_PASSWORD-password}
- NEO4J_PLUGINS=["apoc"]
- NEO4J_db_tx__log_rotation_retention__policy=false
- NEO4J_db_tx__log_rotation__retention__policy=false
- NEO4J_dbms_security_procedures_unrestricted=apoc.*
healthcheck:
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider localhost:7474 || exit 1"]
Expand All @@ -62,8 +62,7 @@ services:
- NEO4J_USERNAME=${NEO4J_USERNAME-neo4j}
- OPENAI_API_KEY=${OPENAI_API_KEY-}
- GOOGLE_API_KEY=${GOOGLE_API_KEY-}
- OLLAMA_BASE_URL=${OLLAMA_BASE_URL-http://host.docker.internal:11434}
- EMBEDDING_MODEL=${EMBEDDING_MODEL-sentence_transformer}
- EMBEDDING_MODEL=${EMBEDDING_MODEL-google-genai-embedding-001}
- LANGCHAIN_ENDPOINT=${LANGCHAIN_ENDPOINT-"https://api.smith.langchain.com"}
- LANGCHAIN_TRACING_V2=${LANGCHAIN_TRACING_V2-false}
- LANGCHAIN_PROJECT=${LANGCHAIN_PROJECT}
Expand All @@ -76,8 +75,6 @@ services:
depends_on:
database:
condition: service_healthy
pull-model:
condition: service_completed_successfully
x-develop:
watch:
- action: rebuild
Expand All @@ -104,9 +101,8 @@ services:
- NEO4J_USERNAME=${NEO4J_USERNAME-neo4j}
- OPENAI_API_KEY=${OPENAI_API_KEY-}
- GOOGLE_API_KEY=${GOOGLE_API_KEY-}
- OLLAMA_BASE_URL=${OLLAMA_BASE_URL-http://host.docker.internal:11434}
- LLM=${LLM-llama2}
- EMBEDDING_MODEL=${EMBEDDING_MODEL-sentence_transformer}
- LLM=${LLM-gemini-pro}
- EMBEDDING_MODEL=${EMBEDDING_MODEL-google-genai-embedding-001}
- LANGCHAIN_ENDPOINT=${LANGCHAIN_ENDPOINT-"https://api.smith.langchain.com"}
- LANGCHAIN_TRACING_V2=${LANGCHAIN_TRACING_V2-false}
- LANGCHAIN_PROJECT=${LANGCHAIN_PROJECT}
Expand All @@ -119,8 +115,6 @@ services:
depends_on:
database:
condition: service_healthy
pull-model:
condition: service_completed_successfully
x-develop:
watch:
- action: rebuild
Expand All @@ -143,9 +137,8 @@ services:
- NEO4J_USERNAME=${NEO4J_USERNAME-neo4j}
- OPENAI_API_KEY=${OPENAI_API_KEY-}
- GOOGLE_API_KEY=${GOOGLE_API_KEY-}
- OLLAMA_BASE_URL=${OLLAMA_BASE_URL-http://host.docker.internal:11434}
- LLM=${LLM-llama2}
- EMBEDDING_MODEL=${EMBEDDING_MODEL-sentence_transformer}
- LLM=${LLM-gemini-pro}
- EMBEDDING_MODEL=${EMBEDDING_MODEL-google-genai-embedding-001}
- LANGCHAIN_ENDPOINT=${LANGCHAIN_ENDPOINT-"https://api.smith.langchain.com"}
- LANGCHAIN_TRACING_V2=${LANGCHAIN_TRACING_V2-false}
- LANGCHAIN_PROJECT=${LANGCHAIN_PROJECT}
Expand All @@ -158,8 +151,6 @@ services:
depends_on:
database:
condition: service_healthy
pull-model:
condition: service_completed_successfully
x-develop:
watch:
- action: rebuild
Expand All @@ -184,9 +175,8 @@ services:
- NEO4J_USERNAME=${NEO4J_USERNAME-neo4j}
- OPENAI_API_KEY=${OPENAI_API_KEY}
- GOOGLE_API_KEY=${GOOGLE_API_KEY}
- OLLAMA_BASE_URL=${OLLAMA_BASE_URL-http://host.docker.internal:11434}
- LLM=${LLM-llama2}
- EMBEDDING_MODEL=${EMBEDDING_MODEL-sentence_transformer}
- LLM=${LLM-gemini-pro}
- EMBEDDING_MODEL=${EMBEDDING_MODEL-google-genai-embedding-001}
- LANGCHAIN_ENDPOINT=${LANGCHAIN_ENDPOINT-"https://api.smith.langchain.com"}
- LANGCHAIN_TRACING_V2=${LANGCHAIN_TRACING_V2-false}
- LANGCHAIN_PROJECT=${LANGCHAIN_PROJECT}
Expand All @@ -199,8 +189,6 @@ services:
depends_on:
database:
condition: service_healthy
pull-model:
condition: service_completed_successfully
x-develop:
watch:
- action: rebuild
Expand Down
189 changes: 189 additions & 0 deletions front-end/app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
from flask import Flask, render_template, request, jsonify
import os
from dotenv import load_dotenv
import openai
import google.generativeai as genai
import anthropic
from langchain_community.llms import Ollama

app = Flask(__name__)
load_dotenv()

# Model configurations
MODEL_CONFIGS = {
'openai': {
'name': 'OpenAI',
'models': [
'gpt-4-turbo-preview',
'gpt-4',
'gpt-3.5-turbo',
'gpt-3.5-turbo-16k'
],
'api_key_env': 'OPENAI_API_KEY'
},
'gemini': {
'name': 'Google Gemini',
'models': [
'gemini-pro',
'gemini-pro-vision',
'gemini-2.0-flash'

],
'api_key_env': 'GOOGLE_API_KEY'
},
'claude': {
'name': 'Anthropic Claude',
'models': [
'claude-3-opus-20240229',
'claude-3-sonnet-20240229',
'claude-3-haiku-20240307'
],
'api_key_env': 'ANTHROPIC_API_KEY'
},
'ollama': {
'name': 'Ollama',
'models': [
'llama2',
'llama2:13b',
'llama2:70b',
'mistral',
'mistral-openorca',
'codellama',
'codellama:13b',
'codellama:34b',
'neural-chat',
'starling-lm',
'dolphin-phi',
'orca-mini',
'vicuna',
'wizard-vicuna-uncensored'
],
'api_key_env': None
},
'cohere': {
'name': 'Cohere',
'models': [
'command',
'command-light',
'command-r',
'command-r-plus'
],
'api_key_env': 'COHERE_API_KEY'
},
'huggingface': {
'name': 'Hugging Face',
'models': [
'meta-llama/Llama-2-7b-chat-hf',
'meta-llama/Llama-2-13b-chat-hf',
'meta-llama/Llama-2-70b-chat-hf',
'mistralai/Mistral-7B-Instruct-v0.2',
'google/flan-t5-xxl',
'google/flan-ul2'
],
'api_key_env': 'HUGGINGFACE_API_KEY'
}
}

def get_available_models():
available_models = []
for provider, config in MODEL_CONFIGS.items():
if config['api_key_env'] is None or os.getenv(config['api_key_env']):
available_models.append({
'provider': provider,
'name': config['name'],
'models': config['models']
})
return available_models

@app.route('/')
def index():
return render_template('index.html')

@app.route('/api/models')
def get_models():
return jsonify(get_available_models())

@app.route('/api/chat', methods=['POST'])
def chat():
data = request.json
message = data.get('message')
model = data.get('model')
provider = data.get('provider')
temperature = float(data.get('temperature', 0.7))
max_tokens = int(data.get('max_tokens', 2000))

if not message or not model or not provider:
return jsonify({'error': 'Missing required parameters'}), 400

try:
if provider == 'openai':
client = openai.OpenAI(api_key=os.getenv('OPENAI_API_KEY'))
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": message}],
temperature=temperature,
max_tokens=max_tokens
)
return jsonify({'response': response.choices[0].message.content})

elif provider == 'gemini':
genai.configure(api_key=os.getenv('GOOGLE_API_KEY'))
model = genai.GenerativeModel(model)
response = model.generate_content(
message,
generation_config=genai.types.GenerationConfig(
temperature=temperature,
max_output_tokens=max_tokens
)
)
return jsonify({'response': response.text})

elif provider == 'claude':
client = anthropic.Anthropic(api_key=os.getenv('ANTHROPIC_API_KEY'))
response = client.messages.create(
model=model,
max_tokens=max_tokens,
temperature=temperature,
messages=[{"role": "user", "content": message}]
)
return jsonify({'response': response.content[0].text})

elif provider == 'ollama':
llm = Ollama(
model=model,
temperature=temperature,
num_predict=max_tokens
)
response = llm.invoke(message)
return jsonify({'response': response})

elif provider == 'cohere':
import cohere
co = cohere.Client(os.getenv('COHERE_API_KEY'))
response = co.generate(
prompt=message,
model=model,
temperature=temperature,
max_tokens=max_tokens
)
return jsonify({'response': response.generations[0].text})

elif provider == 'huggingface':
from huggingface_hub import InferenceClient
client = InferenceClient(token=os.getenv('HUGGINGFACE_API_KEY'))
response = client.text_generation(
message,
model=model,
max_new_tokens=max_tokens,
temperature=temperature
)
return jsonify({'response': response})

else:
return jsonify({'error': 'Unsupported provider'}), 400

except Exception as e:
return jsonify({'error': str(e)}), 500

if __name__ == '__main__':
app.run(debug=True, port=5001)
Loading