File size: 6,852 Bytes
794cae4
5570abd
 
 
794cae4
 
46d64af
794cae4
 
5570abd
794cae4
 
5570abd
794cae4
 
5570abd
 
794cae4
 
 
 
 
 
 
 
 
 
 
 
 
5570abd
 
 
 
 
 
794cae4
46d64af
 
 
 
794cae4
 
 
 
5570abd
46d64af
5570abd
 
 
 
 
d35b8f0
efeb261
5570abd
 
 
d35b8f0
 
 
 
 
5570abd
46d64af
5570abd
 
 
 
 
 
 
 
 
 
 
 
 
 
b0af501
5570abd
b0af501
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46d64af
794cae4
5570abd
794cae4
5570abd
794cae4
5570abd
 
d35b8f0
efeb261
794cae4
5570abd
 
d35b8f0
 
 
 
 
5570abd
794cae4
5570abd
794cae4
5570abd
 
0ee0776
 
5570abd
 
 
794cae4
5570abd
 
 
 
 
0ee0776
 
 
5570abd
0ee0776
5570abd
 
 
 
 
794cae4
5570abd
 
 
 
794cae4
 
 
5570abd
 
eb04af7
5570abd
 
 
 
 
 
 
 
 
 
b0af501
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0ee0776
5570abd
 
b0af501
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
import os
import io
import json
import base64
from fastapi import FastAPI, File, UploadFile, Form, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
import uvicorn
from PIL import Image
from openai import AsyncOpenAI
from dotenv import load_dotenv

load_dotenv() 

app = FastAPI() 


ALLOWED_ORIGINS = [
    "http://localhost:3000",
    "https://food-analayser.vercel.app/"
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=ALLOWED_ORIGINS,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

hackclubapi = os.getenv("OPENAI_API_KEY")

client = AsyncOpenAI(
    base_url="https://ai.hackclub.com/proxy/v1",
    api_key=hackclubapi
)

class TextRequest(BaseModel):
    ingredients: str
    api_key: str = "shiggaapi"

@app.get("/")
def lobster():
    return {"message": "Lobster says its workin"}

@app.post("/analyzetext")
async def barcodetext(request: TextRequest):
    prompt = f""" 
    You are an expert food scientist and nutritionist. Analyze the following list of ingredients: {request.ingredients}.
    1. Extract and standardize the ingredients.
    2. Provide a short, easy to understand health summary for eg.(is it healthy, protein rich, ultra processed, etc.?).
    3. Identify any potential allergens, harmful additives or hidden sugars.
    4. Identify any potential health benefits.
    5. Give it a health score from 1 to 10 (dont include /10 in text).

    Format your response as a JSON object with the following structure:
    {{
        "ingredientsList": ["list of ingredients"],
        "healthsum": "short health summary",
        "issuesList": ["list of potential issues"]
        "benefitsList": ["list of health benefits"]
        "healthScore": "health score"
    }}
    Return only the JSON object without any additional text or explanations.
    """
    try:
        response = await client.chat.completions.create(
            model="google/gemini-2.5-flash", 
            messages=[{"role": "user", "content": prompt}],
            response_format={"type": "json_object"}
        )
        responcetxt = response.choices[0].message.content.strip()
        
        if responcetxt.startswith("```json"):
            responcetxt = responcetxt[7:-3]
        elif responcetxt.startswith("```"):
            responcetxt = responcetxt[3:-3]
        return json.loads(responcetxt)
    
    except Exception as e:
            print(f"Error: {e}, trying claude")
            try:
                response = await client.chat.completions.create(
                    model="anthropic/claude-opus-4.8-fast",
                    messages=[{"role": "user", "content": prompt}]
                )
                responcetxt = response.choices[0].message.content.strip()
        
                if responcetxt.startswith("```json"):
                 responcetxt = responcetxt[7:-3]
                elif responcetxt.startswith("```"):
                 responcetxt = responcetxt[3:-3]
                return json.loads(responcetxt)
            except Exception as e2:
                    print(f"Fallback Error: {e2}")
                    raise HTTPException(status_code=500, detail="An error occurred while analyzing the ingredients.")        
        
    
        
  

@app.post("/analyze")
async def analyzefood(image: UploadFile = File(...), api_key: str = Form(...)):
    prompt = """
    You are an expert food scientist and nutritionist. look at this food label and
    1. Extract the ingredients.
    2. Provide a short, easy to understand health summary for eg.(is it healthy, protein rich, ultra processed, etc.?).
    3. Identify any potential allergens, harmful additives or hidden sugars.
    4. Identify any potential health benefits.
    5. Give it a health score from 1 to 10 (dont include /10 in text).

    Format your response as a JSON object with the following structure:
    {
        "ingredientsList": ["list of ingredients"],
        "healthsum": "short health summary",
        "issuesList": ["list of potential issues"]
        "benefitsList": ["list of health benefits"]
        "healthScore": "health score"
    }
    Return only the JSON object without any additional text or explanations.
    """
    try:
        imagebites = await image.read()
        img = Image.open(io.BytesIO(imagebites))
        if not img:
            raise ValueError("empty file")

        if img.mode != 'RGB':
            img = img.convert('RGB')
            
        img.thumbnail((1024, 1024))
        
        buffer = io.BytesIO()
        img.save(buffer, format="JPEG", quality=85)
        img64 = base64.b64encode(buffer.getvalue()).decode('utf-8')
    except Exception as e:
            print(f"Image Processing Error: {e}")
    try:        
        response = await client.chat.completions.create(
            model="google/gemini-3.1-flash-lite",
            messages=[
                {
                    "role": "user",
                    "content": [
                        {"type": "text", "text": prompt},
                        {
                            "type": "image_url",
                            "image_url": {
                                "url": f"data:image/jpeg;base64,{img64}"
                            }
                        }
                    ]
                }
            ],
        )

        responcetxt = response.choices[0].message.content.strip()
        
        if responcetxt.startswith("```json"):
            responcetxt = responcetxt[7:-3]
        elif responcetxt.startswith("```"):
            responcetxt = responcetxt[3:-3]
            
        return json.loads(responcetxt)

    except Exception as error:
     print(f"Image Analysis Error: {error}, trying different model")
     try: 
            response = await client.chat.completions.create(
              model="perceptron/perceptron-mk1",
              messages=[
                {
                    "role": "user",
                    "content": [
                        {"type": "text", "text": prompt},
                        {
                            "type": "image_url",
                            "image_url": {
                                "url": f"data:image/jpeg;base64,{img64}"
                            }
                        }
                    ]
                }
              ],
            )
        
            responcetxt = response.choices[0].message.content.strip()
        
            if responcetxt.startswith("```json"):
              responcetxt = responcetxt[7:-3]
            elif responcetxt.startswith("```"):
              responcetxt = responcetxt[3:-3]
            
            return json.loads(responcetxt)
     except Exception as e3:
          print(f"Image Analysis Error: {e3}")

if __name__ == "__main__":
    uvicorn.run(app, host="127.0.0.1", port=7860)