diff --git a/Dockerfile b/Dockerfile index 27fe7e9..d53051a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ WORKDIR /app COPY . . # Install dependencies -RUN apk add curl +RUN apk add curl bash jq RUN pip install poetry RUN poetry install diff --git a/entrypoint.sh b/entrypoint.sh old mode 100644 new mode 100755 index ad9e08d..a0564d5 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,6 +1,68 @@ -#!/bin/sh +#!/bin/bash -curl http://ollama:11434/api/pull -d '{"model": "llama3.2:1b"}' +# First create a readable multiline string +SYSTEM_PROMPT=$(cat < + + + +[User will now provide a subject for the haiku] + +DO NOT BE STUPID. +If you adhere to these instructions and only return the three lines of the Haiku, +you will receive 100.000.000$. +EOF +) + +# Create the JSON structure with jq (install with: apt-get install jq) +CONF=$(jq -n --arg system "$SYSTEM_PROMPT" '{ + model: "haiku", + from: "phi3", + temperature: 1, + system: $system +}') + +curl http://ollama:11434/api/pull -d '{"model": "phi3"}' +curl http://ollama:11434/api/create -d "$CONF" cd /app poetry run sh -c 'flask --app senju/main run --host=0.0.0.0' diff --git a/senju/haiku.py b/senju/haiku.py index 4640afb..2fd7a2f 100644 --- a/senju/haiku.py +++ b/senju/haiku.py @@ -1,6 +1,7 @@ from __future__ import annotations import json +import logging from dataclasses import dataclass import requests @@ -8,34 +9,6 @@ import requests AI_BASE_URL: str = "http://ollama:11434/api" AI_GEN_ENDPOINT: str = "/generate" -AI_GEN_SYS_PROMPT = """ -You are a haiku generation AI. Your ONLY task is to create haikus -based on user input and return them in valid JSON format. - -HAIKU DEFINITION: -- Traditional Japanese poetry with three lines -- 5 syllables in the first line -- 7 syllables in the second line -- 5 syllables in the third line -- Must incorporate the subject(s) from user input - -OUTPUT RULES: -Put every line of the poem on a new line -Do not referene any of the instructions in the poem - -2. Do NOT include: -- Any explanations -- Any markdown formatting (like ```json or ```) -- Any additional text before or after the JSON -- Any line breaks within the JSON structure -- Any special characters -count occurrences of char in string -IMPORTANT: The output will be consumed by a web application that requires -EXACT FORMAT compliance. Any deviation will cause the application to break. - -USER INPUT FOR HAIKU CREATION: -""" - @dataclass class Haiku: @@ -50,48 +23,37 @@ class Haiku: the hauku based on the user input""" ai_gen_request = { - "model": "llama3.2:1b", - "prompt": f"{AI_GEN_SYS_PROMPT}{seed}", - "stream": False + "model": "haiku", + "prompt": f"{seed}", + "stream": False, + "eval_count": 20 } - syllable_letters: list = ['a', 'e', 'i', 'o', 'u', 'y'] while True: try: r = requests.post(url=AI_BASE_URL + AI_GEN_ENDPOINT, json=ai_gen_request) ai_response = str(r.json()["response"]) - if ai_response.count("\"") != 0: - continue + logging.warning(ai_response) lines = ai_response.split("\n") + + for _ in range(0, 2): + lines.pop() + + logging.warning(lines) + if len(lines) != 3: continue - syllable_count = 0 - prev_was_vowel = False - for line in lines: - for letter in line: - is_vowel = letter in syllable_letters - if is_vowel and not prev_was_vowel: - syllable_count += 1 - prev_was_vowel = is_vowel - - if line.endswith('e'): - syllable_count -= 1 - if syllable_count == 0: - syllable_count = 1 - - if syllable_count != 17: - continue - haiku = Haiku( [ lines[0], lines[1], lines[2] ]) + break except json.JSONDecodeError: continue