Skip to content

Commit a5f584e

Browse files
strands langfuse demo
1 parent f201404 commit a5f584e

19 files changed

+1636
-0
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,8 @@ _site
33
.jekyll-cache
44
.jekyll-metadata
55
vendor
6+
7+
**/.DS_Store
8+
**/.env
9+
**/__pycache__
10+
**/.venv

strands-examples/app.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import asyncio
2+
from dotenv import load_dotenv
3+
import time
4+
5+
from strands import Agent
6+
import streamlit as st
7+
8+
load_dotenv()
9+
10+
async def main():
11+
12+
agent = Agent(
13+
callback_handler=None,
14+
model="us.amazon.nova-micro-v1:0",
15+
)
16+
17+
st.title("Strands App")
18+
19+
if 'messages' not in st.session_state:
20+
st.session_state['messages'] = []
21+
22+
for message in st.session_state['messages']:
23+
role = message["role"]
24+
content = message["content"]
25+
26+
with st.chat_message(role):
27+
st.markdown(content)
28+
29+
if prompt := st.chat_input("How can I help you..."):
30+
messages = []
31+
with st.chat_message("user"):
32+
st.markdown(prompt)
33+
messages.append(
34+
{
35+
"role": "user",
36+
"content": prompt,
37+
}
38+
)
39+
40+
with st.chat_message("assistant"):
41+
result = ""
42+
stream = agent.stream_async(prompt)
43+
placeholder = st.empty()
44+
async for chunk in stream:
45+
if 'data' in chunk:
46+
result += chunk['data']
47+
placeholder.markdown(result)
48+
time.sleep(0.05)
49+
50+
messages.append(
51+
{
52+
"role": "assistant",
53+
"content": result,
54+
}
55+
)
56+
st.session_state['messages'] += messages
57+
58+
asyncio.run(main())

strands-examples/k3s.yaml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
apiVersion: v1
2+
clusters:
3+
- cluster:
4+
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkekNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdGMyVnkKZG1WeUxXTmhRREUzTlRZd016WTRORFV3SGhjTk1qVXdPREkwTVRJd01EUTFXaGNOTXpVd09ESXlNVEl3TURRMQpXakFqTVNFd0h3WURWUVFEREJock0zTXRjMlZ5ZG1WeUxXTmhRREUzTlRZd016WTRORFV3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFTYzhSK0QzazhobHlKeVNZSVFtS0lPTS80V2d2SldTa25WU2t4MXNyTmkKc3lQMXEwR3ZRaHYwNWNhaVl3cTdrQzBuRUt2T0R4ZDR1U2QxOVAvbTFFeGxvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVXFuRGZhVS96ZjBNTFdJRm1WKzJICkdLZHZrSW93Q2dZSUtvWkl6ajBFQXdJRFNBQXdSUUlnSE5WTFNvSGN3RjlsdEFhTTUrc0ROb2dFMjRta0Y4UDYKRk1zQTRjdTRPMDBDSVFDb3liZnQ1VFJOYmIwWjB2azNKTGk5dU5sSVZCU1dxdHdLMm5JRVBseTJPQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
5+
server: https://127.0.0.1:6443
6+
name: default
7+
contexts:
8+
- context:
9+
cluster: default
10+
user: default
11+
name: default
12+
current-context: default
13+
kind: Config
14+
preferences: {}
15+
users:
16+
- name: default
17+
user:
18+
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrVENDQVRlZ0F3SUJBZ0lJTC8zZnREWHg5ejB3Q2dZSUtvWkl6ajBFQXdJd0l6RWhNQjhHQTFVRUF3d1kKYXpOekxXTnNhV1Z1ZEMxallVQXhOelUyTURNMk9EUTFNQjRYRFRJMU1EZ3lOREV5TURBME5Wb1hEVEkyTURneQpOREV5TURBME5Wb3dNREVYTUJVR0ExVUVDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhGVEFUQmdOVkJBTVRESE41CmMzUmxiVHBoWkcxcGJqQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJBMXRMUXFnRHFnTC85NW4KTm1IWmJhYkxvcjNHcXhlT25iRUJ0RkRhZ3d2TmQ5Q0RKVGlvVklkQWVoYUVJcU5yRE83cW8rUGlYQTY5cVdUWApNZTVJNVptalNEQkdNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBakFmCkJnTlZIU01FR0RBV2dCUUg0aEZTWEJTTjNjdmVyOE85WnlvQmhoUHFLVEFLQmdncWhrak9QUVFEQWdOSUFEQkYKQWlBNDQ1S1BFS3hHNUVwcE5TOFlFb0FIYWdEWXNRNXJFdkI1eVMyazhtbjl0d0loQUlGa1hVSXVEOFVOS0FiUwpTQXk0NjhLQVB2MUNVN3F1SkJHQVVra2xZSk1SCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkekNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdFkyeHAKWlc1MExXTmhRREUzTlRZd016WTRORFV3SGhjTk1qVXdPREkwTVRJd01EUTFXaGNOTXpVd09ESXlNVEl3TURRMQpXakFqTVNFd0h3WURWUVFEREJock0zTXRZMnhwWlc1MExXTmhRREUzTlRZd016WTRORFV3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFSRXBzMUZzN3dhSDVUSmxBbk9KY01LVEh3QzdwL0JxRGtWYVpuOHR3YksKWVJ6cEVtUWJiNHpOY3FRd3l0bEtiMTk0MlRYRU42eHFKOUNUSnhCRkczOC9vMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUIrSVJVbHdVamQzTDNxL0R2V2NxCkFZWVQ2aWt3Q2dZSUtvWkl6ajBFQXdJRFNBQXdSUUlnSWpjaitqcTU4NldSb3dIOGF2WDJ0Qm5pdk83T25MREkKYkZ2OG1EZUtWeW9DSVFDZjVxSUQvY3phN0JHMnYrWkRkUDY3aHZneFVDU3R3TWprcUVUQ0FPWEpWUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
19+
client-key-data: LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSUVBQk1pODZZZlhnKzkxKzg2MDJNaTFpVkVGQVpTbitEM053MWdNRllSekdvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFRFcwdENxQU9xQXYvM21jMllkbHRwc3VpdmNhckY0NmRzUUcwVU5xREM4MTMwSU1sT0toVQpoMEI2Rm9RaW8yc003dXFqNCtKY0RyMnBaTmN4N2tqbG1RPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo=

strands-examples/k8s_mcp_agent.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
from dotenv import load_dotenv
2+
import re
3+
4+
from mcp import stdio_client, StdioServerParameters
5+
from strands import Agent
6+
from strands.tools.mcp import MCPClient
7+
import streamlit as st
8+
9+
def remove_html_tags(text_with_html):
10+
text_with_out_html = re.sub(r"<[^>]+>", "", text_with_html)
11+
return text_with_out_html
12+
13+
async def stream_result(stream):
14+
result = ""
15+
placeholder = st.empty()
16+
async for chunk in stream:
17+
if 'data' in chunk:
18+
result += chunk['data']
19+
result = remove_html_tags(result)
20+
placeholder.write(result)
21+
22+
23+
class KubernetesMCPAgent:
24+
def __init__(self):
25+
load_dotenv()
26+
27+
server_params = {
28+
"command": "npx",
29+
"args": [
30+
"-y",
31+
"kubernetes-mcp-server@latest"
32+
],
33+
"env": {
34+
"KUBECONFIG": "k3s.yaml"
35+
}
36+
}
37+
38+
self.stdio_mcp_client = MCPClient(lambda: stdio_client(
39+
StdioServerParameters(
40+
**server_params
41+
)
42+
))
43+
44+
with self.stdio_mcp_client:
45+
# Get the tools from the MCP server
46+
tools = self.stdio_mcp_client.list_tools_sync()
47+
48+
# Create an agent with these tools
49+
self.agent = Agent(
50+
callback_handler=None,
51+
model="us.amazon.nova-micro-v1:0",
52+
tools=tools
53+
)
54+
55+
56+
async def send_prompt(self, prompt):
57+
with self.stdio_mcp_client:
58+
stream = self.agent.stream_async(prompt)
59+
await stream_result(stream)
60+
61+
62+
kubernetes_mcp_agent = KubernetesMCPAgent()

strands-examples/k8s_mcp_app.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import asyncio
2+
import streamlit as st
3+
from k8s_mcp_agent import kubernetes_mcp_agent
4+
5+
async def main():
6+
st.title("Kubernetes MCP App")
7+
8+
if prompt := st.chat_input("Chat with the Kubernetes API through MCP"):
9+
with st.chat_message("user"):
10+
st.write(prompt)
11+
with st.chat_message("assistant"):
12+
await kubernetes_mcp_agent.send_prompt(prompt)
13+
14+
asyncio.run(main())

strands-examples/requirements.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
python-dotenv==1.1.1
2+
starlette==0.47.2
3+
strands-agents[litellm]==1.0.1
4+
strands-agents-tools==0.2.1
5+
streamlit==1.47.1

strands-examples/result.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Here are the current times in the 5 different countries:
2+
3+
1. United States (Pacific Time): **2025-07-27T07:56:32.478020-07:00**
4+
2. United Kingdom (Greenwich Mean Time): **2025-07-27T15:56:32.477736+01:00**
5+
3. Japan (Japan Standard Time): **2025-07-27T23:56:32.478141+09:00**
6+
4. Australia (Australian Eastern Standard Time): **2025-07-28T00:56:32.477883+10:00**
7+
5. Brazil (Brazil Standard Time): **2025-07-27T11:56:32.478582-03:00**
8+
9+
Please note that these times are based on the specified timezones.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3.12

strands-examples/strands-langfuse-demo/README.md

Whitespace-only changes.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
apiVersion: v1
2+
clusters:
3+
- cluster:
4+
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJlRENDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdGMyVnkKZG1WeUxXTmhRREUzTlRZek1ESTJNVEV3SGhjTk1qVXdPREkzTVRNMU1ERXhXaGNOTXpVd09ESTFNVE0xTURFeApXakFqTVNFd0h3WURWUVFEREJock0zTXRjMlZ5ZG1WeUxXTmhRREUzTlRZek1ESTJNVEV3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFRbktxSVlnMXRQaERzNTJST0dTVXl5K2s5V1NTYUQ2TFV2QkttV3RQV1MKOWN5Y3dtTkMrRERKM1ZFbnc5VmJ3SHhVSnduZ1ByN1pXQitCbzBwZEJ1Zk9vMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVWJKNHRQME5LYzF0OFNYMEFyZG84Cis3VFYvTHd3Q2dZSUtvWkl6ajBFQXdJRFNRQXdSZ0loQUl0VkNXSTgxSVdWOENRaEhQMlgrL013MW5pWVlTT3EKRFRqa0RxRVhtbHlWQWlFQTIxY04vUnBnV21zbWs0ajRQenJ6d1IyZlFxTjdjTzJtd3Z4NWtSTE1ZbnM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
5+
server: https://127.0.0.1:6443
6+
name: default
7+
contexts:
8+
- context:
9+
cluster: default
10+
user: default
11+
name: default
12+
current-context: default
13+
kind: Config
14+
preferences: {}
15+
users:
16+
- name: default
17+
user:
18+
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrVENDQVRlZ0F3SUJBZ0lJSFRZa2lPdmVwNzh3Q2dZSUtvWkl6ajBFQXdJd0l6RWhNQjhHQTFVRUF3d1kKYXpOekxXTnNhV1Z1ZEMxallVQXhOelUyTXpBeU5qRXhNQjRYRFRJMU1EZ3lOekV6TlRBeE1Wb1hEVEkyTURneQpOekV6TlRBeE1Wb3dNREVYTUJVR0ExVUVDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhGVEFUQmdOVkJBTVRESE41CmMzUmxiVHBoWkcxcGJqQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJJMS8yclR1MGJveWZwMnMKMFVBM1N1K1ZkSFpGN0hnWGE0VHd3cXJSVm4wYVBNTzZncnVPOTlRSGtJNUNNTTZlV2hsWkZ3WUI0Vlp3cndUUAp6dnVBTDB5alNEQkdNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBakFmCkJnTlZIU01FR0RBV2dCVDNDclZmR29UZk5JelZUTm50YTFETDY3N2IwakFLQmdncWhrak9QUVFEQWdOSUFEQkYKQWlFQWpzWG1pZnljRnFXK0VYOW15NVRBZkJpT1oyL2JCRlpybEs2aytHUEJoNFlDSUgvY1dWWE1uSlBpWGR1ZwovSU9DZUVWZVJybGpGbVpqMU1DdDBrVG55YVNBCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJlRENDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdFkyeHAKWlc1MExXTmhRREUzTlRZek1ESTJNVEV3SGhjTk1qVXdPREkzTVRNMU1ERXhXaGNOTXpVd09ESTFNVE0xTURFeApXakFqTVNFd0h3WURWUVFEREJock0zTXRZMnhwWlc1MExXTmhRREUzTlRZek1ESTJNVEV3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFRYlpibUhYdzIrNDlXREkvNlRSczRHaXcrSEVmQmM2UGorYzllZFpYSjgKTEpienFKMWt5ZXUzMFByeVN1RlBQV1ZJdkhEanNVYVhreGZTc1Z6V25KaTBvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVTl3cTFYeHFFM3pTTTFVelo3V3RRCnkrdSsyOUl3Q2dZSUtvWkl6ajBFQXdJRFNRQXdSZ0loQU1pdWVWYlM4VHlvL1hnSW1iT3JudTJYa3B2bVFyRDcKeWIwc0x5QTN2cHpVQWlFQXZadWw3RnlkUFdPZFFoSHIvMzVEazdvaEU1QUxaaHVaZnVISGFIb3N6L289Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
19+
client-key-data: LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSUVtWXpXbXRlMFdicmVyNlJoNjl0T1ZVYUY4ZE5RS21KY3FTM1QwaEhiSllvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFalgvYXRPN1J1akorbmF6UlFEZEs3NVYwZGtYc2VCZHJoUERDcXRGV2ZSbzh3N3FDdTQ3MwoxQWVRamtJd3pwNWFHVmtYQmdIaFZuQ3ZCTS9PKzRBdlRBPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo=

0 commit comments

Comments
 (0)