import asyncio
import base64
import logging
from pathlib import Path
import streamlit as st
from dotenv import load_dotenv
from camel.agents import ChatAgent
from camel.logger import set_log_level
from camel.models import ModelFactory
from camel.toolkits import MCPToolkit
from camel.types import ModelPlatformType, ModelType
logging.getLogger("asyncio").setLevel(logging.CRITICAL)
st.set_page_config(page_title="Chat with your Repo", layout="wide")
ROOT = Path(__file__).resolve().parents[2]
ROOT = Path(__file__).resolve().parent
ASSETS = ROOT / "assets"
with open(ASSETS / "logo_camel_ai.png", "rb") as f:
camel_b64 = base64.b64encode(f.read()).decode()
with open(ASSETS / "logo_github.jpg", "rb") as f:
gh_b64 = base64.b64encode(f.read()).decode()
st.markdown(
f"""
<div style='text-align:center; margin-bottom:2rem;'>
<h1>Chat with any Github Repo</h1>
<img src='data:image/png;base64,{camel_b64}' width='80' style='margin:0 20px;'>
<img src='data:image/png;base64,{gh_b64}' width='80' style='margin:0 20px;'>
<p style='font-size:14px; color:gray;'>Powered by Camel-AI & Git-Ingest MCP</p>
</div>
""",
unsafe_allow_html=True,
)
load_dotenv()
set_log_level("DEBUG")
if 'repo_url' not in st.session_state:
st.session_state['repo_url'] = ''
if 'messages' not in st.session_state:
st.session_state['messages'] = []
st.sidebar.header("Repository")
repo = st.sidebar.text_input("GitHub Repo URL", st.session_state['repo_url'])
if st.sidebar.button("Set Repo"):
st.session_state['repo_url'] = repo.strip()
st.session_state['messages'] = []
if not st.session_state['repo_url']:
st.info("Please set a GitHub repository URL in the sidebar to start.")
st.stop()
for msg in st.session_state['messages']:
if msg['role'] == 'user':
st.chat_message('user').markdown(msg['content'])
else:
st.chat_message('assistant').markdown(msg['content'])
if user_input := st.chat_input("Ask a question about the repo…"):
st.session_state['messages'].append(
{'role': 'user', 'content': user_input}
)
st.chat_message('user').markdown(user_input)
async def query_agent(question: str):
config_path = Path(__file__).parent / "mcp_servers_config.json"
toolkit = MCPToolkit(config_path=str(config_path))
await toolkit.connect()
tools = list(toolkit.get_tools())
agent = ChatAgent(
system_message=f"You are a GitHub repo assistant. Repository: {st.session_state['repo_url']}",
model=ModelFactory.create(
model_platform=ModelPlatformType.OPENAI,
model_type=ModelType.GPT_4O,
model_config_dict={"temperature": 0},
),
tools=tools,
)
prompt = f"{question}\nRepository: {st.session_state['repo_url']}"
response = await agent.astep(prompt)
await toolkit.disconnect()
return response.msgs[0].content
with st.spinner("Thinking…"):
answer = asyncio.run(query_agent(user_input))
st.session_state['messages'].append(
{'role': 'assistant', 'content': answer}
)
st.chat_message('assistant').markdown(answer)
st.markdown(
"""
<hr>
<p style='text-align:center; color:gray; font-size:0.8rem;'>Powered by Camel-AI & GitHub MCP</p>
""",
unsafe_allow_html=True,
)