Madras1 commited on
Commit
829f489
verified
1 Parent(s): 90e9ab6

Upload 18 files

Browse files
Files changed (2) hide show
  1. app.py +3 -1
  2. jade/webdev.py +118 -22
app.py CHANGED
@@ -144,6 +144,7 @@ class WebDevRequest(BaseModel):
144
  existing_code: str | None = None
145
  mode: str = "html" # "html" or "react"
146
  error_message: str | None = None # For agentic error fixing
 
147
 
148
  @app.post("/webdev/generate")
149
  async def handle_webdev(request: WebDevRequest):
@@ -152,7 +153,8 @@ async def handle_webdev(request: WebDevRequest):
152
  prompt=request.prompt,
153
  refine_code=request.existing_code,
154
  mode=request.mode,
155
- error_message=request.error_message
 
156
  )
157
  return result
158
  except Exception as e:
 
144
  existing_code: str | None = None
145
  mode: str = "html" # "html" or "react"
146
  error_message: str | None = None # For agentic error fixing
147
+ model: str | None = None # Model to use (e.g., "kimi-k2", "claude-sonnet")
148
 
149
  @app.post("/webdev/generate")
150
  async def handle_webdev(request: WebDevRequest):
 
153
  prompt=request.prompt,
154
  refine_code=request.existing_code,
155
  mode=request.mode,
156
+ error_message=request.error_message,
157
+ model=request.model
158
  )
159
  return result
160
  except Exception as e:
jade/webdev.py CHANGED
@@ -1,23 +1,80 @@
1
  """
2
  Jade Web Dev - Vibe Coder
3
  AI-powered web code generator with React/Sandpack support
 
4
  """
5
 
6
  import os
7
  import json
8
  import logging
9
  from groq import Groq
 
10
 
11
  logger = logging.getLogger("JadeWebDev")
12
 
13
  class WebDevAgent:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  def __init__(self):
15
  self.groq_api_key = os.getenv("GROQ_API_KEY")
16
- if not self.groq_api_key:
17
- logger.warning("GROQ_API_KEY not set. WebDev agent may fail.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
 
19
- self.client = Groq(api_key=self.groq_api_key)
20
- self.model = "moonshotai/kimi-k2-instruct-0905"
21
 
22
  # HTML mode prompt
23
  self.html_prompt = """You are an elite web developer AI creating stunning, FULLY FUNCTIONAL websites.
@@ -97,7 +154,46 @@ DESIGN:
97
 
98
  OUTPUT: Only the JSON object, nothing else."""
99
 
100
- def generate(self, prompt: str, refine_code: str = None, mode: str = "html", error_message: str = None) -> dict:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  """
102
  Generate or refine code based on prompt
103
 
@@ -106,11 +202,13 @@ OUTPUT: Only the JSON object, nothing else."""
106
  refine_code: Optional existing code to refine
107
  mode: "html" for HTML generation, "react" for React/Sandpack
108
  error_message: If provided, fix this error in the code
 
109
 
110
  Returns:
111
  dict with code/files and success status
112
  """
113
  try:
 
114
  system_prompt = self.react_prompt if mode == "react" else self.html_prompt
115
 
116
  if mode == "react":
@@ -143,18 +241,17 @@ Update the React app based on the feedback. Output the complete updated JSON."""
143
  else:
144
  user_message = f"Create a React app: {prompt}"
145
 
146
- response = self.client.chat.completions.create(
147
- model=self.model,
148
- messages=[
149
- {"role": "system", "content": system_prompt},
150
- {"role": "user", "content": user_message}
151
- ],
152
- temperature=0.5 if error_message else 0.7, # Lower temp for fixes
 
153
  max_tokens=16000
154
  )
155
 
156
- content = response.choices[0].message.content.strip()
157
-
158
  # Clean up markdown if present
159
  if content.startswith("```json"):
160
  content = content[7:]
@@ -203,18 +300,17 @@ Update the code based on the feedback. Output the complete updated HTML file."""
203
  else:
204
  user_message = f"Create a website: {prompt}"
205
 
206
- response = self.client.chat.completions.create(
207
- model=self.model,
208
- messages=[
209
- {"role": "system", "content": system_prompt},
210
- {"role": "user", "content": user_message}
211
- ],
 
212
  temperature=0.5 if error_message else 0.7,
213
  max_tokens=8000
214
  )
215
 
216
- code = response.choices[0].message.content.strip()
217
-
218
  # Clean up markdown
219
  if code.startswith("```html"):
220
  code = code[7:]
 
1
  """
2
  Jade Web Dev - Vibe Coder
3
  AI-powered web code generator with React/Sandpack support
4
+ Multi-model support: Groq + OpenRouter
5
  """
6
 
7
  import os
8
  import json
9
  import logging
10
  from groq import Groq
11
+ from openai import OpenAI
12
 
13
  logger = logging.getLogger("JadeWebDev")
14
 
15
  class WebDevAgent:
16
+ # Available models configuration
17
+ MODELS = {
18
+ "kimi-k2": {
19
+ "name": "Kimi K2",
20
+ "provider": "groq",
21
+ "model_id": "moonshotai/kimi-k2-instruct-0905",
22
+ "description": "R谩pido, bom para c贸digo"
23
+ },
24
+ "qwen-coder": {
25
+ "name": "Qwen Coder",
26
+ "provider": "groq",
27
+ "model_id": "qwen-2.5-coder-32b",
28
+ "description": "Especialista em c贸digo"
29
+ },
30
+ "llama-90b": {
31
+ "name": "Llama 3.3 70B",
32
+ "provider": "groq",
33
+ "model_id": "llama-3.3-70b-versatile",
34
+ "description": "Vers谩til, bom contexto"
35
+ },
36
+ "claude-sonnet": {
37
+ "name": "Claude Sonnet",
38
+ "provider": "openrouter",
39
+ "model_id": "anthropic/claude-sonnet-4",
40
+ "description": "Alta qualidade, longo contexto"
41
+ },
42
+ "deepseek-coder": {
43
+ "name": "DeepSeek Coder",
44
+ "provider": "openrouter",
45
+ "model_id": "deepseek/deepseek-coder",
46
+ "description": "Especialista c贸digo open-source"
47
+ },
48
+ "gpt-4o-mini": {
49
+ "name": "GPT-4o Mini",
50
+ "provider": "openrouter",
51
+ "model_id": "openai/gpt-4o-mini",
52
+ "description": "R谩pido e capaz"
53
+ }
54
+ }
55
+
56
  def __init__(self):
57
  self.groq_api_key = os.getenv("GROQ_API_KEY")
58
+ self.openrouter_api_key = os.getenv("OPENROUTER_API_KEY")
59
+
60
+ # Initialize clients
61
+ self.groq_client = None
62
+ self.openrouter_client = None
63
+
64
+ if self.groq_api_key:
65
+ self.groq_client = Groq(api_key=self.groq_api_key)
66
+ else:
67
+ logger.warning("GROQ_API_KEY not set.")
68
+
69
+ if self.openrouter_api_key:
70
+ self.openrouter_client = OpenAI(
71
+ base_url="https://openrouter.ai/api/v1",
72
+ api_key=self.openrouter_api_key
73
+ )
74
+ else:
75
+ logger.warning("OPENROUTER_API_KEY not set. Some models unavailable.")
76
 
77
+ self.default_model = "kimi-k2"
 
78
 
79
  # HTML mode prompt
80
  self.html_prompt = """You are an elite web developer AI creating stunning, FULLY FUNCTIONAL websites.
 
154
 
155
  OUTPUT: Only the JSON object, nothing else."""
156
 
157
+ def _call_model(self, model_key: str, messages: list, temperature: float = 0.7, max_tokens: int = 16000) -> str:
158
+ """Call the appropriate model based on provider"""
159
+ model_config = self.MODELS.get(model_key, self.MODELS[self.default_model])
160
+ provider = model_config["provider"]
161
+ model_id = model_config["model_id"]
162
+
163
+ if provider == "groq":
164
+ if not self.groq_client:
165
+ raise Exception("Groq client not available")
166
+ response = self.groq_client.chat.completions.create(
167
+ model=model_id,
168
+ messages=messages,
169
+ temperature=temperature,
170
+ max_tokens=max_tokens
171
+ )
172
+ elif provider == "openrouter":
173
+ if not self.openrouter_client:
174
+ # Fallback to Groq if OpenRouter not available
175
+ logger.warning(f"OpenRouter not available, falling back to Groq")
176
+ if not self.groq_client:
177
+ raise Exception("No API client available")
178
+ response = self.groq_client.chat.completions.create(
179
+ model=self.MODELS[self.default_model]["model_id"],
180
+ messages=messages,
181
+ temperature=temperature,
182
+ max_tokens=max_tokens
183
+ )
184
+ else:
185
+ response = self.openrouter_client.chat.completions.create(
186
+ model=model_id,
187
+ messages=messages,
188
+ temperature=temperature,
189
+ max_tokens=max_tokens
190
+ )
191
+ else:
192
+ raise Exception(f"Unknown provider: {provider}")
193
+
194
+ return response.choices[0].message.content.strip()
195
+
196
+ def generate(self, prompt: str, refine_code: str = None, mode: str = "html", error_message: str = None, model: str = None) -> dict:
197
  """
198
  Generate or refine code based on prompt
199
 
 
202
  refine_code: Optional existing code to refine
203
  mode: "html" for HTML generation, "react" for React/Sandpack
204
  error_message: If provided, fix this error in the code
205
+ model: Model key to use (e.g., "kimi-k2", "claude-sonnet")
206
 
207
  Returns:
208
  dict with code/files and success status
209
  """
210
  try:
211
+ model_key = model if model and model in self.MODELS else self.default_model
212
  system_prompt = self.react_prompt if mode == "react" else self.html_prompt
213
 
214
  if mode == "react":
 
241
  else:
242
  user_message = f"Create a React app: {prompt}"
243
 
244
+ messages = [
245
+ {"role": "system", "content": system_prompt},
246
+ {"role": "user", "content": user_message}
247
+ ]
248
+ content = self._call_model(
249
+ model_key,
250
+ messages,
251
+ temperature=0.5 if error_message else 0.7,
252
  max_tokens=16000
253
  )
254
 
 
 
255
  # Clean up markdown if present
256
  if content.startswith("```json"):
257
  content = content[7:]
 
300
  else:
301
  user_message = f"Create a website: {prompt}"
302
 
303
+ messages = [
304
+ {"role": "system", "content": system_prompt},
305
+ {"role": "user", "content": user_message}
306
+ ]
307
+ code = self._call_model(
308
+ model_key,
309
+ messages,
310
  temperature=0.5 if error_message else 0.7,
311
  max_tokens=8000
312
  )
313
 
 
 
314
  # Clean up markdown
315
  if code.startswith("```html"):
316
  code = code[7:]