mirror of
https://github.com/open-webui/openapi-servers
synced 2025-06-26 18:17:04 +00:00
Summarizer FastAPI tool
This commit is contained in:
parent
134d4e6778
commit
e597b248da
37
servers/summarizer-tool/README.md
Normal file
37
servers/summarizer-tool/README.md
Normal file
@ -0,0 +1,37 @@
|
||||
# 📚 Local Summarizer Agent
|
||||
|
||||
This FastAPI server acts to summarize a given chunk of text.
|
||||
|
||||
It is assumed that you are running an ollama instance in an adjacent container with the default port available.
|
||||
|
||||
## 📦 Endpoints
|
||||
### POST /summarize/text
|
||||
Summarizes the given block of text
|
||||
|
||||
📥 Request
|
||||
|
||||
Body:
|
||||
```
|
||||
{
|
||||
'text':'Your blob of text here. It can be unlimited, but is recommended to be within the context window of the LLM you are asking for a summary from.'
|
||||
}
|
||||
```
|
||||
|
||||
📤 Response:
|
||||
|
||||
```
|
||||
{
|
||||
"status": "success",
|
||||
"summary": "A summary of your text."
|
||||
}
|
||||
```
|
||||
|
||||
### POST /summarize/chat
|
||||
Not yet implemented. Summarizes an exported Open WebUI chat JSON blob.
|
||||
|
||||
## 🧩 Environment Variables
|
||||
|Name|Description|Default|
|
||||
|---|---|---|
|
||||
|MODEL|The name of the model you are trying to reference. Should match the model in your ollama instance. | llama3|
|
||||
|MODEL_URL|The URL path to the model you are trying to access.|http://host.docker.internal:11434|
|
||||
|
0
servers/summarizer-tool/__init__.py
Normal file
0
servers/summarizer-tool/__init__.py
Normal file
22
servers/summarizer-tool/docker-compose.yml
Normal file
22
servers/summarizer-tool/docker-compose.yml
Normal file
@ -0,0 +1,22 @@
|
||||
services:
|
||||
summarizer:
|
||||
container_name: summarizer
|
||||
image: python:3-slim
|
||||
ports:
|
||||
- 16000:8000
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- MODEL=llama3
|
||||
- MODEL_URL=http://host.docker.internal:11434
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
volumes:
|
||||
- .:/app
|
||||
entrypoint: >
|
||||
sh -c "
|
||||
apt update &&
|
||||
apt install -y git &&
|
||||
cd /app &&
|
||||
pip install -r ./requirements.txt &&
|
||||
fastapi run
|
||||
"
|
28
servers/summarizer-tool/main.py
Normal file
28
servers/summarizer-tool/main.py
Normal file
@ -0,0 +1,28 @@
|
||||
from fastapi import FastAPI, HTTPException
|
||||
from pydantic import BaseModel
|
||||
from .summarizers.text_summarizer import TextSummarizer
|
||||
|
||||
app = FastAPI(
|
||||
title="Summarizing Server",
|
||||
version="1.0.0",
|
||||
description="Leverages an LLM to summarize data",
|
||||
)
|
||||
|
||||
summarizers = {
|
||||
'TEXT':TextSummarizer()
|
||||
}
|
||||
|
||||
|
||||
class TextRequest(BaseModel):
|
||||
text: str
|
||||
|
||||
@app.post("/summarize/text")
|
||||
def summarize_text(data: TextRequest):
|
||||
try:
|
||||
result = summarizers['TEXT'].summarize(data.text)
|
||||
if 'content' in result:
|
||||
return {"status": "success", "summary":result['content']}
|
||||
else:
|
||||
raise HTTPException(status_code=500, detail=str(result['error']))
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
38
servers/summarizer-tool/requirements.txt
Normal file
38
servers/summarizer-tool/requirements.txt
Normal file
@ -0,0 +1,38 @@
|
||||
annotated-types==0.7.0
|
||||
anyio==4.9.0
|
||||
certifi==2025.1.31
|
||||
charset-normalizer==3.4.1
|
||||
click==8.1.8
|
||||
dnspython==2.7.0
|
||||
email_validator==2.2.0
|
||||
fastapi==0.115.12
|
||||
fastapi-cli==0.0.7
|
||||
h11==0.14.0
|
||||
httpcore==1.0.8
|
||||
httptools==0.6.4
|
||||
httpx==0.28.1
|
||||
idna==3.10
|
||||
Jinja2==3.1.6
|
||||
markdown-it-py==3.0.0
|
||||
MarkupSafe==3.0.2
|
||||
mdurl==0.1.2
|
||||
pydantic==2.11.3
|
||||
pydantic_core==2.33.1
|
||||
Pygments==2.19.1
|
||||
python-dotenv==1.1.0
|
||||
python-multipart==0.0.20
|
||||
PyYAML==6.0.2
|
||||
requests==2.32.3
|
||||
rich==14.0.0
|
||||
rich-toolkit==0.14.1
|
||||
shellingham==1.5.4
|
||||
sniffio==1.3.1
|
||||
starlette==0.46.2
|
||||
typer==0.15.2
|
||||
typing-inspection==0.4.0
|
||||
typing_extensions==4.13.2
|
||||
urllib3==2.4.0
|
||||
uvicorn==0.34.1
|
||||
uvloop==0.21.0
|
||||
watchfiles==1.0.5
|
||||
websockets==15.0.1
|
0
servers/summarizer-tool/summarizers/__init__.py
Normal file
0
servers/summarizer-tool/summarizers/__init__.py
Normal file
7
servers/summarizer-tool/summarizers/base.py
Normal file
7
servers/summarizer-tool/summarizers/base.py
Normal file
@ -0,0 +1,7 @@
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
class BaseSummarizer(ABC):
|
||||
@abstractmethod
|
||||
def summarize(self, data: str) -> dict:
|
||||
"""Summarize data"""
|
||||
pass
|
57
servers/summarizer-tool/summarizers/text_summarizer.py
Normal file
57
servers/summarizer-tool/summarizers/text_summarizer.py
Normal file
@ -0,0 +1,57 @@
|
||||
import requests
|
||||
from .base import BaseSummarizer
|
||||
import os
|
||||
|
||||
MODEL_URL=os.environ.get('MODEL_URL')
|
||||
MODEL=os.environ.get('MODEL')
|
||||
SUMMARIZE_PROMPT = """You are the summarizing agent in a long chain of agents.
|
||||
It is your job to responsibly capture the entirety of what is being described in incoming documents.
|
||||
You can scrap small details, but you must make sure to hit all the major points.
|
||||
These documents will be used in RAG down the line.
|
||||
|
||||
|
||||
For example, given the following text:
|
||||
"I've got updates on the tiny brains if\nyou are not familiar with brain\norganoids they are tiny human brains\nthat we can grow from stem cells you can\ngrow them in a literal jar if you want\nto but you can also hook them up to a\ncomputer or llm since a company called\nfinal spark decided to release brain\norganoid computation for industrial use\n"
|
||||
|
||||
You would respond with
|
||||
|
||||
"The speaker is discussing human brain stem cells being grown for industrial use."
|
||||
|
||||
Another example:
|
||||
hi, i'\''m isopod (formerly hornet)\n \ni'\''m a software engineer\n \ni write code, make costumes, and write music
|
||||
|
||||
You would respond with
|
||||
Isopod, formerly hornet, is a software engineer who makes costumes and writes music.
|
||||
|
||||
You always sanitize data. You always remove \n. You never mention yourself in your summaries. You never infer, only summarize what is presented. You never describe the text as summarized: you always just give the summary.
|
||||
"""
|
||||
|
||||
class TextSummarizer(BaseSummarizer):
|
||||
def summarize(self, data):
|
||||
payload = {
|
||||
"model":MODEL,
|
||||
"system": SUMMARIZE_PROMPT,
|
||||
"prompt":data,
|
||||
"stream":False,
|
||||
"options":{
|
||||
"temperature":0.5
|
||||
}
|
||||
}
|
||||
url = MODEL_URL + '/api/generate'
|
||||
result = requests.post(url=url, json=payload)
|
||||
if result.status_code == 200:
|
||||
json_data = result.json()
|
||||
if 'response' in json_data:
|
||||
return {
|
||||
'type': 'text',
|
||||
'source': url,
|
||||
'content': json_data['response']
|
||||
}
|
||||
print(result.content)
|
||||
return {
|
||||
'type': 'text',
|
||||
'source': url,
|
||||
'error': result.status_code
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user