diff --git a/server.py b/server.py index e6797a67..4e36cd1e 100644 --- a/server.py +++ b/server.py @@ -1,11 +1,64 @@ from codeinterpreterapi import CodeInterpreterSession model = "claude-3-haiku-20240307" +model = "gemini-1.5-pro-latest" session = CodeInterpreterSession(model=model) try: + message = """SVG画像を自動生成するプログラムの要件を以下のように定義します。 + +目的: + +電子書籍のヘッダ画像を自動生成すること +別のコンテンツ生成プログラムが出力したSVGファイルを入力として受け取ること +入力SVGファイルを指定の要件に従って加工し、新たなSVGファイルとして出力すること +機能要件: + +グリッドレイアウト機能の実装 + +指定したグリッドサイズ(行数、列数)に基づいて要素を配置できるようにする +グリッドの各セルに対して要素を割り当てられるようにする +グリッドのサイズや間隔を柔軟に設定できるようにする +SVG要素の配置と編集 + +グリッド上の指定した位置にSVG要素(テキスト、図形、画像など)を配置できるようにする +配置する要素の属性(サイズ、色、フォントなど)を柔軟に設定できるようにする +既存のSVG要素を削除、移動、変更できるようにする +外部画像ファイルの読み込みと配置 + +PNGやJPEGなどの外部画像ファイルを読み込んでSVGファイルに埋め込めるようにする +読み込んだ画像をグリッド上の指定した位置に配置できるようにする +画像のサイズを変更できるようにする +SVGファイルの入出力 + +SVGファイルを入力として読み込み、加工後のSVGファイルを出力できるようにする +出力ファイルのファイル名やパスを指定できるようにする +非機能要件: + +Python3とsvgwriteライブラリを使用して実装すること +コードはモジュール化し、再利用性と保守性を高めること +エラーハンドリングを適切に行い、ログ出力を行うこと +コードにはコメントを付けて可読性を高めること +実装の進め方: + +svgwriteを使ったSVGファイルの基本的な読み込み、編集、出力の機能を実装する +グリッドレイアウト機能を実装し、要素を配置できるようにする +外部画像ファイルの読み込みと配置機能を実装する +入力SVGファイルを読み込んで、指定の要件に従って加工し、新たなSVGファイルを出力する一連の処理を実装する +細かい仕様について検討し、機能を拡張する +テストを行い、不具合を修正する +ドキュメントを整備し、コードをリファクタリングする +まずはこの要件定義に基づいて、各機能の実装に着手してください。実装方法や詳細な手順は、要件に合わせて適宜ご判断ください。 + + + +作業フォルダは/app/workを使ってください。 + +全ての処理は自動で実施して結果とプログラムだけ報告してください。 + + """ status = session.start_local() - result = session.generate_response("Plot the nvidea stock vs microsoft stock over the last 6 months.") + result = session.generate_response(message) result.show() except Exception as e: print(e) diff --git a/src/codeinterpreterapi/agents/agents.py b/src/codeinterpreterapi/agents/agents.py index 74b658da..db31a9f3 100644 --- a/src/codeinterpreterapi/agents/agents.py +++ b/src/codeinterpreterapi/agents/agents.py @@ -6,6 +6,7 @@ from langchain.memory.buffer import ConversationBufferMemory from langchain_core.prompts.chat import MessagesPlaceholder from langchain_experimental.plan_and_execute import PlanAndExecute, load_agent_executor, load_chat_planner +from langchain_google_genai import ChatGoogleGenerativeAI from langchain_openai import AzureChatOpenAI, ChatOpenAI from codeinterpreterapi.config import settings @@ -25,13 +26,20 @@ def choose_single_chat_agent( system_message=settings.SYSTEM_MESSAGE, extra_prompt_messages=[MessagesPlaceholder(variable_name="chat_history")], ) - elif isinstance(llm, BaseChatModel): + elif isinstance(llm, ChatGoogleGenerativeAI): print("choose_agent ConversationalChatAgent(ANTHROPIC)") return ConversationalChatAgent.from_llm_and_tools( llm=llm, tools=tools, system_message=settings.SYSTEM_MESSAGE.content.__str__(), ) + elif isinstance(llm, ChatGoogleGenerativeAI): + print("choose_agent ChatGoogleGenerativeAI(gemini-pro)") + return ConversationalChatAgent.from_llm_and_tools( + llm=llm, + tools=tools, + system_message=settings.SYSTEM_MESSAGE.content.__str__(), + ) else: print("choose_agent ConversationalAgent(default)") return ConversationalAgent.from_llm_and_tools( diff --git a/src/codeinterpreterapi/config.py b/src/codeinterpreterapi/config.py index 4c6f1a0c..e800c9bd 100644 --- a/src/codeinterpreterapi/config.py +++ b/src/codeinterpreterapi/config.py @@ -19,6 +19,7 @@ class CodeInterpreterAPISettings(BaseSettings): AZURE_API_BASE: Optional[str] = None AZURE_API_VERSION: Optional[str] = None AZURE_DEPLOYMENT_NAME: Optional[str] = None + GEMINI_API_KEY: Optional[SecretStr] = None ANTHROPIC_API_KEY: Optional[SecretStr] = None # LLM Settings diff --git a/src/codeinterpreterapi/llm/llm.py b/src/codeinterpreterapi/llm/llm.py index 1b240943..e495f466 100644 --- a/src/codeinterpreterapi/llm/llm.py +++ b/src/codeinterpreterapi/llm/llm.py @@ -24,15 +24,25 @@ def get_llm(self) -> BaseChatModel: timeout=settings.REQUEST_TIMEOUT, ) # type: ignore if settings.OPENAI_API_KEY: - from langchain_openai import ChatOpenAI + from langchain_openai import ChatGoogleGenerativeAI - return ChatOpenAI( + return ChatGoogleGenerativeAI( model=settings.MODEL, - api_key=settings.OPENAI_API_KEY, + api_key=settings.GEMINI_API_KEY, timeout=settings.REQUEST_TIMEOUT, temperature=settings.TEMPERATURE, max_retries=settings.MAX_RETRY, ) # type: ignore + if settings.GEMINI_API_KEY: + from langchain_google_genai import ChatGoogleGenerativeAI # type: ignore + + if "gemini" not in settings.MODEL: + print("Please set the gemini model in the settings.") + return ChatGoogleGenerativeAI( + model=settings.MODEL, + temperature=settings.TEMPERATURE, + google_api_key=settings.GEMINI_API_KEY, + ) if settings.ANTHROPIC_API_KEY: from langchain_anthropic import ChatAnthropic # type: ignore