Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -38,7 +38,7 @@ from pydantic_ai.models.openai import OpenAIModel
|
|
38 |
model = OpenAIModel(
|
39 |
'gemma-2-2b-it',
|
40 |
base_url='http://localhost:1234/v1',
|
41 |
-
api_key='
|
42 |
)
|
43 |
model11 = OpenAIModel(
|
44 |
'mistral-7b-instruct-v0.3',
|
@@ -46,6 +46,7 @@ model11 = OpenAIModel(
|
|
46 |
api_key='your-local-api-key',
|
47 |
)
|
48 |
|
|
|
49 |
# Model Pydantic untuk Sales Order
|
50 |
class product1(BaseModel):
|
51 |
ds_productCode: Optional[str] = "" #str = Field(..., min_length=1, max_length=20)
|
@@ -74,20 +75,20 @@ class SalesOrder(BaseModel):
|
|
74 |
ds_shippingAddress: Optional[str] = ""
|
75 |
ds_totalAmount:Optional[float] = 0
|
76 |
#ds_paymentTerms: Optional[str] = ""
|
77 |
-
|
78 |
#agent= Agent('gemini-1.5-flash', result_type=SalesOrder)
|
79 |
|
80 |
# # Create a system prompt to guide the model
|
81 |
SYSTEM_PROMPT = """
|
82 |
-
|
83 |
"""
|
84 |
#agent3 = Agent(model=ollama_model, result_type=PetList, retries=3, system_prompt=SYSTEM_PROMPT)
|
85 |
#agent3 = Agent(model=ollama_model, retries=3, system_prompt=SYSTEM_PROMPT)
|
86 |
|
87 |
|
88 |
-
|
89 |
-
agent = Agent('gemini-1.5-flash') # OK-
|
90 |
-
#agent = Agent(model) # OK-
|
91 |
|
92 |
|
93 |
|
@@ -125,7 +126,7 @@ async def get_db(request: Request) -> Database:
|
|
125 |
async def get_chat(database: Database = Depends(get_db)) -> Response:
|
126 |
msgs = await database.get_messages()
|
127 |
return Response(
|
128 |
-
b'\n'.join(json.dumps(
|
129 |
media_type='text/plain',
|
130 |
)
|
131 |
|
@@ -133,7 +134,6 @@ async def get_chat(database: Database = Depends(get_db)) -> Response:
|
|
133 |
|
134 |
class ChatMessage(TypedDict):
|
135 |
"""Format of messages sent to the browser."""
|
136 |
-
|
137 |
role: Literal['user', 'model']
|
138 |
timestamp: str
|
139 |
content: str
|
@@ -157,9 +157,10 @@ def to_chat_message(m: ModelMessage) -> ChatMessage:
|
|
157 |
}
|
158 |
raise UnexpectedModelBehavior(f'Unexpected message type for chat app: {m}')
|
159 |
|
160 |
-
def to_ds_message(m: ModelMessage) ->
|
161 |
-
|
162 |
if isinstance(m, ModelRequest):
|
|
|
163 |
if isinstance(first_part, UserPromptPart):
|
164 |
return {
|
165 |
'role': 'user',
|
@@ -167,15 +168,16 @@ def to_ds_message(m: ModelMessage) -> SalesOrder:
|
|
167 |
'content': first_part.content,
|
168 |
}
|
169 |
elif isinstance(m, ModelResponse):
|
|
|
170 |
if isinstance(first_part, TextPart):
|
171 |
return {
|
172 |
'role': 'model',
|
173 |
'timestamp': m.timestamp.isoformat(),
|
174 |
'content': first_part.content,
|
175 |
}
|
176 |
-
raise UnexpectedModelBehavior(f'Unexpected message type for chat app: {m}')
|
177 |
|
178 |
-
def to_form_message(m: ModelMessage) ->
|
179 |
first_part = m.parts[0]
|
180 |
if isinstance(m, ModelResponse):
|
181 |
if isinstance(first_part, TextPart):
|
@@ -220,8 +222,9 @@ async def post_chat(
|
|
220 |
#Nama pembeli: Bu Lurah, alamat Bekasi Barat, hari ini membeli Teh Putih dua kaleng harga 110000 per kaleng, juga membeli Teh Hitam 3 kaleng, harga per kaleng 60000. Ongkos kirim ke Bekasi Barat sebesar 36 ribu
|
221 |
#nama pembeli Mas Anang alamat di Jalan Cisitu no.5 Bandung, membeli Chocobar 5 batang harga 15 ribu per batang, dan membeli Rice Cracker 4 buah harga 20 ribu per buah, ongkos kirim ke Jalan Cisitu no.5 sebesar 7 ribu rupiah
|
222 |
try:
|
223 |
-
prompt2=f"Ekstrak data Sales Order dari teks: {prompt1}. Format output yang diinginkan hanya berupa JSON saja sesuai class Sales Order. Tidak usah ada penjelasan lain. Sekali lagi: Output hanya JSON saja. Hari ini adalah tanggal {date.today()}. untuk Nomor Sales Order pasangkan dengan key ds_salesOrderId, untuk Tanggal Sales pasangkan dengan key ds_salesDate, untuk Nama Customer pasangkan dengan Key ds_customerName, untuk Alamat Customer pasangkan dengan key ds_customerAddress, untuk Daftar Item Barang pasangkan dengan key ds_items, untuk Kode Barang pasangkan dengan key ds_productCode, untuk Nama Barang pasangkan dengan key ds_productName, untuk Quantity pasangkan dengan key ds_quantity, untuk Unit Price pasangkan dengan key ds_unitPrice, untuk Total Nilai Per Baris Barang pasangkan dengan key ds_itemAmt. Setelah Daftar Item Barang, selanjutnya untuk Ongkos Kirim pasangkan dengan key ds_shippingCost, untuk Alamat Pengiriman pasangkan dengan key ds_shippingAddress, untuk Total Nilai Sales Order pasangkan dengan key ds_totalAmount"
|
224 |
-
#prompt2=f"Ekstrak data Sales Order dari teks: {prompt1}. Hari ini adalah tanggal {date.today()}"
|
|
|
225 |
yield (
|
226 |
json.dumps(
|
227 |
{
|
@@ -232,15 +235,26 @@ async def post_chat(
|
|
232 |
).encode('utf-8')
|
233 |
+ b'\n'
|
234 |
)
|
235 |
-
messages = await database.get_messages()
|
236 |
-
async with agent.run_stream(prompt2
|
237 |
async for text in result.stream(debounce_by=0.1):
|
238 |
m = ModelResponse.from_text(content=text, timestamp=result.timestamp())
|
239 |
yield json.dumps(to_ds_message(m)).encode('utf-8') + b'\n'
|
240 |
|
241 |
##print(result.usage())
|
242 |
-
await database.add_messages(result.new_messages_json())
|
243 |
darso = json.loads(result.new_messages_json())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
244 |
darso1= darso[1]
|
245 |
#print("1|", darso1)
|
246 |
darso2= json.loads(json.dumps(darso1))
|
@@ -418,8 +432,10 @@ async def post_chat(
|
|
418 |
</form>
|
419 |
"""
|
420 |
m = ModelResponse.from_text(content=formDs, timestamp=result.timestamp())
|
421 |
-
yield json.dumps(
|
422 |
-
print("OK")
|
|
|
|
|
423 |
##print(len(items))
|
424 |
#darso7 = SalesOrder.model_validate(darso6)
|
425 |
#print("[--",darso7.ds_customerName,"--]")
|
@@ -435,11 +451,10 @@ async def post_chat(
|
|
435 |
print(">>>", prompt, "<<<")
|
436 |
return StreamingResponse(ds_messages(prompt), media_type='text/plain')
|
437 |
elif prompt[0] != "@" :
|
438 |
-
print("biasa")
|
439 |
-
#return StreamingResponse(stream_messages(), media_type='text/plain')
|
440 |
return StreamingResponse(ds_messages(prompt), media_type='text/plain')
|
441 |
print("** selesai **")
|
442 |
-
return StreamingResponse(
|
443 |
|
444 |
P = ParamSpec('P')
|
445 |
R = TypeVar('R')
|
@@ -520,7 +535,6 @@ class Database:
|
|
520 |
*args, # type: ignore
|
521 |
)
|
522 |
|
523 |
-
|
524 |
if __name__ == '__main__':
|
525 |
import uvicorn
|
526 |
uvicorn.run(
|
|
|
38 |
model = OpenAIModel(
|
39 |
'gemma-2-2b-it',
|
40 |
base_url='http://localhost:1234/v1',
|
41 |
+
api_key='your-local-api-key',
|
42 |
)
|
43 |
model11 = OpenAIModel(
|
44 |
'mistral-7b-instruct-v0.3',
|
|
|
46 |
api_key='your-local-api-key',
|
47 |
)
|
48 |
|
49 |
+
#DeepSeek Key: sk-694660c67c3947e4853019473f30240d https://api.deepseek.com
|
50 |
# Model Pydantic untuk Sales Order
|
51 |
class product1(BaseModel):
|
52 |
ds_productCode: Optional[str] = "" #str = Field(..., min_length=1, max_length=20)
|
|
|
75 |
ds_shippingAddress: Optional[str] = ""
|
76 |
ds_totalAmount:Optional[float] = 0
|
77 |
#ds_paymentTerms: Optional[str] = ""
|
78 |
+
os.environ['GEMINI_API_KEY'] = 'AIzaSyAsVIHsPIIfDBTb2K6VNdNlMt05t8x3mtE'
|
79 |
#agent= Agent('gemini-1.5-flash', result_type=SalesOrder)
|
80 |
|
81 |
# # Create a system prompt to guide the model
|
82 |
SYSTEM_PROMPT = """
|
83 |
+
Anda adalah asisten yang ahli melakukan ekstrak data SalesOrder dari teks user. Format output yang diinginkan hanya berupa JSON saja sesuai class SalesOrder. Tidak usah ada penjelasan lain. Sekali lagi: Output hanya JSON saja. Untuk Nomor Sales Order pasangkan dengan key ds_salesOrderId, untuk Tanggal Sales pasangkan dengan key ds_salesDate, untuk Nama Customer pasangkan dengan Key ds_customerName, untuk Alamat Customer pasangkan dengan key ds_customerAddress, untuk Daftar Item Barang pasangkan dengan key ds_items, untuk Kode Barang pasangkan dengan key ds_productCode, untuk Nama Barang pasangkan dengan key ds_productName, untuk Quantity pasangkan dengan key ds_quantity, untuk Unit Price pasangkan dengan key ds_unitPrice, untuk Total Nilai Per Baris Barang pasangkan dengan key ds_itemAmt, untuk Ongkos Kirim pasangkan dengan key ds_shippingCost, untuk Alamat Pengiriman pasangkan dengan key ds_shippingAddress, untuk Total Nilai Sales Order pasangkan dengan key ds_totalAmount
|
84 |
"""
|
85 |
#agent3 = Agent(model=ollama_model, result_type=PetList, retries=3, system_prompt=SYSTEM_PROMPT)
|
86 |
#agent3 = Agent(model=ollama_model, retries=3, system_prompt=SYSTEM_PROMPT)
|
87 |
|
88 |
|
89 |
+
#INI SAJA. SALAH SATU
|
90 |
+
agent = Agent('gemini-1.5-flash', system_prompt=SYSTEM_PROMPT) # OK-Gemini
|
91 |
+
#agent = Agent(model) # OK-Lokal
|
92 |
|
93 |
|
94 |
|
|
|
126 |
async def get_chat(database: Database = Depends(get_db)) -> Response:
|
127 |
msgs = await database.get_messages()
|
128 |
return Response(
|
129 |
+
b'\n'.join(json.dumps(to_ds_message(m)).encode('utf-8') for m in msgs),
|
130 |
media_type='text/plain',
|
131 |
)
|
132 |
|
|
|
134 |
|
135 |
class ChatMessage(TypedDict):
|
136 |
"""Format of messages sent to the browser."""
|
|
|
137 |
role: Literal['user', 'model']
|
138 |
timestamp: str
|
139 |
content: str
|
|
|
157 |
}
|
158 |
raise UnexpectedModelBehavior(f'Unexpected message type for chat app: {m}')
|
159 |
|
160 |
+
def to_ds_message(m: ModelMessage) -> ChatMessage:
|
161 |
+
|
162 |
if isinstance(m, ModelRequest):
|
163 |
+
first_part = m.parts[1]
|
164 |
if isinstance(first_part, UserPromptPart):
|
165 |
return {
|
166 |
'role': 'user',
|
|
|
168 |
'content': first_part.content,
|
169 |
}
|
170 |
elif isinstance(m, ModelResponse):
|
171 |
+
first_part = m.parts[0]
|
172 |
if isinstance(first_part, TextPart):
|
173 |
return {
|
174 |
'role': 'model',
|
175 |
'timestamp': m.timestamp.isoformat(),
|
176 |
'content': first_part.content,
|
177 |
}
|
178 |
+
raise UnexpectedModelBehavior(f'Unexpected ds-message type for chat app: {m}')
|
179 |
|
180 |
+
def to_form_message(m: ModelMessage) -> ChatMessage:
|
181 |
first_part = m.parts[0]
|
182 |
if isinstance(m, ModelResponse):
|
183 |
if isinstance(first_part, TextPart):
|
|
|
222 |
#Nama pembeli: Bu Lurah, alamat Bekasi Barat, hari ini membeli Teh Putih dua kaleng harga 110000 per kaleng, juga membeli Teh Hitam 3 kaleng, harga per kaleng 60000. Ongkos kirim ke Bekasi Barat sebesar 36 ribu
|
223 |
#nama pembeli Mas Anang alamat di Jalan Cisitu no.5 Bandung, membeli Chocobar 5 batang harga 15 ribu per batang, dan membeli Rice Cracker 4 buah harga 20 ribu per buah, ongkos kirim ke Jalan Cisitu no.5 sebesar 7 ribu rupiah
|
224 |
try:
|
225 |
+
#prompt2=f"Ekstrak data Sales Order dari teks: {prompt1}. Format output yang diinginkan hanya berupa JSON saja sesuai class Sales Order. Tidak usah ada penjelasan lain. Sekali lagi: Output hanya JSON saja. Hari ini adalah tanggal {date.today()}. untuk Nomor Sales Order pasangkan dengan key ds_salesOrderId, untuk Tanggal Sales pasangkan dengan key ds_salesDate, untuk Nama Customer pasangkan dengan Key ds_customerName, untuk Alamat Customer pasangkan dengan key ds_customerAddress, untuk Daftar Item Barang pasangkan dengan key ds_items, untuk Kode Barang pasangkan dengan key ds_productCode, untuk Nama Barang pasangkan dengan key ds_productName, untuk Quantity pasangkan dengan key ds_quantity, untuk Unit Price pasangkan dengan key ds_unitPrice, untuk Total Nilai Per Baris Barang pasangkan dengan key ds_itemAmt. Setelah Daftar Item Barang, selanjutnya untuk Ongkos Kirim pasangkan dengan key ds_shippingCost, untuk Alamat Pengiriman pasangkan dengan key ds_shippingAddress, untuk Total Nilai Sales Order pasangkan dengan key ds_totalAmount"
|
226 |
+
#prompt2=f"Ekstrak data Sales Order dari teks: {prompt1}. Hari ini adalah tanggal {date.today()}"
|
227 |
+
prompt2=f"{prompt1}. Hari ini adalah tanggal {date.today()}"
|
228 |
yield (
|
229 |
json.dumps(
|
230 |
{
|
|
|
235 |
).encode('utf-8')
|
236 |
+ b'\n'
|
237 |
)
|
238 |
+
#messages = await database.get_messages()
|
239 |
+
async with agent.run_stream(prompt2) as result:
|
240 |
async for text in result.stream(debounce_by=0.1):
|
241 |
m = ModelResponse.from_text(content=text, timestamp=result.timestamp())
|
242 |
yield json.dumps(to_ds_message(m)).encode('utf-8') + b'\n'
|
243 |
|
244 |
##print(result.usage())
|
245 |
+
#await database.add_messages(result.new_messages_json())
|
246 |
darso = json.loads(result.new_messages_json())
|
247 |
+
#print(darso)
|
248 |
+
darso0= darso[0]
|
249 |
+
#darso0.pop(darso0['parts'][0])
|
250 |
+
#print("00|------------------")
|
251 |
+
#print("01|", darso0 )
|
252 |
+
#print("01a|", darso0['parts'][0] )
|
253 |
+
#print("01b|", darso0['parts'][1] )
|
254 |
+
darso0['parts'][0] = darso0['parts'][1]
|
255 |
+
#print("01?|", darso0 )
|
256 |
+
#print("01??|", darso )
|
257 |
+
#print("02|------------------")
|
258 |
darso1= darso[1]
|
259 |
#print("1|", darso1)
|
260 |
darso2= json.loads(json.dumps(darso1))
|
|
|
432 |
</form>
|
433 |
"""
|
434 |
m = ModelResponse.from_text(content=formDs, timestamp=result.timestamp())
|
435 |
+
yield json.dumps(to_ds_message(m)).encode('utf-8') + b'\n'
|
436 |
+
print("OK:")
|
437 |
+
#await database.add_messages(result.new_messages_json())
|
438 |
+
await database.add_messages(json.dumps(darso))
|
439 |
##print(len(items))
|
440 |
#darso7 = SalesOrder.model_validate(darso6)
|
441 |
#print("[--",darso7.ds_customerName,"--]")
|
|
|
451 |
print(">>>", prompt, "<<<")
|
452 |
return StreamingResponse(ds_messages(prompt), media_type='text/plain')
|
453 |
elif prompt[0] != "@" :
|
454 |
+
#print("biasa")
|
|
|
455 |
return StreamingResponse(ds_messages(prompt), media_type='text/plain')
|
456 |
print("** selesai **")
|
457 |
+
return StreamingResponse(ds_messages(prompt), media_type='text/plain')
|
458 |
|
459 |
P = ParamSpec('P')
|
460 |
R = TypeVar('R')
|
|
|
535 |
*args, # type: ignore
|
536 |
)
|
537 |
|
|
|
538 |
if __name__ == '__main__':
|
539 |
import uvicorn
|
540 |
uvicorn.run(
|