| import uuid |
| from datetime import datetime |
| from typing import Any, Optional, Union |
|
|
| from metagpt.actions.action import Action |
| from metagpt.actions.action_output import ActionOutput |
| from pydantic import BaseModel, Field, field_validator |
|
|
| from message_enum import SentenceType |
|
|
|
|
| class SentenceValue(BaseModel): |
| answer: str |
|
|
|
|
| class Sentence(BaseModel): |
| type: str |
| id: Optional[str] = None |
| value: SentenceValue |
| is_finished: Optional[bool] = None |
|
|
| @field_validator("id", mode="before") |
| @classmethod |
| def validate_credits(cls, v): |
| if isinstance(v, str): |
| return v |
| return str(v) |
|
|
|
|
| class Sentences(BaseModel): |
| id: Optional[str] = None |
| action: Optional[str] = None |
| role: Optional[str] = None |
| skill: Optional[str] = None |
| description: Optional[str] = None |
| timestamp: str = Field(default_factory=lambda: datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f%z")) |
| status: str |
| contents: list[dict] |
|
|
|
|
| class NewMsg(BaseModel): |
| """Chat with MetaGPT""" |
|
|
| query: str = Field(description="Problem description") |
| config: dict[str, Any] = Field(description="Configuration information") |
|
|
|
|
| class LLMAPIkeyTest(BaseModel): |
| """APIkey""" |
|
|
| api_key: str = Field(description="API Key") |
| llm_type: str = Field(description="Model Type") |
|
|
|
|
| class ErrorInfo(BaseModel): |
| error: str = None |
| traceback: str = None |
|
|
|
|
| class ThinkActStep(BaseModel): |
| id: str |
| status: str |
| title: str |
| timestamp: str = Field(default_factory=lambda: datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f%z")) |
| description: str |
| content: Sentence = None |
|
|
| @field_validator("id", mode="before") |
| @classmethod |
| def validate_credits(cls, v): |
| if isinstance(v, str): |
| return v |
| return str(v) |
|
|
|
|
| class ThinkActPrompt(BaseModel): |
| message_id: int = None |
| timestamp: str = Field(default_factory=lambda: datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f%z")) |
| step: ThinkActStep = None |
| skill: Optional[str] = None |
| role: Optional[str] = None |
|
|
| def update_think(self, tc_id, action: Action): |
| self.step = ThinkActStep( |
| id=str(tc_id), |
| status="running", |
| title=action.desc, |
| description=action.desc, |
| ) |
|
|
| def update_act(self, message: Union[ActionOutput, str], is_finished: bool = True): |
| if is_finished: |
| self.step.status = "finish" |
| self.step.content = Sentence( |
| type=SentenceType.TEXT.value, |
| id=str(1), |
| value=SentenceValue(answer=message.content if is_finished else message), |
| is_finished=is_finished, |
| ) |
|
|
| @staticmethod |
| def guid32(): |
| return str(uuid.uuid4()).replace("-", "")[0:32] |
|
|
| @property |
| def prompt(self): |
| return self.json(exclude_unset=True) |
|
|
|
|
| class MessageJsonModel(BaseModel): |
| steps: list[Sentences] |
| qa_type: str |
| created_at: datetime = Field(default_factory=datetime.now) |
| query_time: datetime = Field(default_factory=datetime.now) |
| answer_time: datetime = Field(default_factory=datetime.now) |
| score: Optional[int] = None |
| feedback: Optional[str] = None |
|
|
| def add_think_act(self, think_act_prompt: ThinkActPrompt): |
| s = Sentences( |
| action=think_act_prompt.step.title, |
| skill=think_act_prompt.skill, |
| description=think_act_prompt.step.description, |
| timestamp=think_act_prompt.timestamp, |
| status=think_act_prompt.step.status, |
| contents=[think_act_prompt.step.content.dict()], |
| ) |
| self.steps.append(s) |
|
|
| @property |
| def prompt(self): |
| return self.json(exclude_unset=True) |
|
|