참고소스 수정본
This commit is contained in:
152
참고/instructor-main/examples/extract-table/run_vision.py
Normal file
152
참고/instructor-main/examples/extract-table/run_vision.py
Normal file
@@ -0,0 +1,152 @@
|
||||
from openai import OpenAI
|
||||
from io import StringIO
|
||||
from typing import Annotated, Any
|
||||
from pydantic import (
|
||||
BaseModel,
|
||||
BeforeValidator,
|
||||
PlainSerializer,
|
||||
InstanceOf,
|
||||
WithJsonSchema,
|
||||
)
|
||||
import instructor
|
||||
import pandas as pd
|
||||
from rich.console import Console
|
||||
|
||||
console = Console()
|
||||
client = instructor.from_openai(
|
||||
client=OpenAI(),
|
||||
mode=instructor.Mode.TOOLS,
|
||||
)
|
||||
|
||||
|
||||
def md_to_df(data: Any) -> Any:
|
||||
if isinstance(data, str):
|
||||
return (
|
||||
pd.read_csv(
|
||||
StringIO(data), # Get rid of whitespaces
|
||||
sep="|",
|
||||
index_col=1,
|
||||
)
|
||||
.dropna(axis=1, how="all")
|
||||
.iloc[1:]
|
||||
.map(lambda x: x.strip())
|
||||
) # type: ignore
|
||||
return data
|
||||
|
||||
|
||||
MarkdownDataFrame = Annotated[
|
||||
InstanceOf[pd.DataFrame],
|
||||
BeforeValidator(md_to_df),
|
||||
PlainSerializer(lambda x: x.to_markdown()),
|
||||
WithJsonSchema(
|
||||
{
|
||||
"type": "string",
|
||||
"description": """
|
||||
The markdown representation of the table,
|
||||
each one should be tidy, do not try to join tables
|
||||
that should be separate""",
|
||||
}
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
class Table(BaseModel):
|
||||
caption: str
|
||||
dataframe: MarkdownDataFrame
|
||||
|
||||
|
||||
class MultipleTables(BaseModel):
|
||||
tables: list[Table]
|
||||
|
||||
|
||||
example = MultipleTables(
|
||||
tables=[
|
||||
Table(
|
||||
caption="This is a caption",
|
||||
dataframe=pd.DataFrame(
|
||||
{
|
||||
"Chart A": [10, 40],
|
||||
"Chart B": [20, 50],
|
||||
"Chart C": [30, 60],
|
||||
}
|
||||
),
|
||||
)
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
def extract(url: str) -> MultipleTables:
|
||||
return client.chat.completions.create(
|
||||
model="gpt-4-turbo",
|
||||
max_tokens=4000,
|
||||
response_model=MultipleTables,
|
||||
messages=[
|
||||
{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{
|
||||
"type": "image_url",
|
||||
"image_url": {"url": url},
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": """
|
||||
First, analyze the image to determine the most appropriate headers for the tables.
|
||||
Generate a descriptive h1 for the overall image, followed by a brief summary of the data it contains.
|
||||
For each identified table, create an informative h2 title and a concise description of its contents.
|
||||
Finally, output the markdown representation of each table.
|
||||
|
||||
|
||||
Make sure to escape the markdown table properly, and make sure to include the caption and the dataframe.
|
||||
including escaping all the newlines and quotes. Only return a markdown table in dataframe, nothing else.
|
||||
""",
|
||||
},
|
||||
],
|
||||
}
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
urls = [
|
||||
"https://a.storyblok.com/f/47007/2400x1260/f816b031cb/uk-ireland-in-three-charts_chart_a.png/m/2880x0",
|
||||
"https://a.storyblok.com/f/47007/2400x2000/bf383abc3c/231031_uk-ireland-in-three-charts_table_v01_b.png/m/2880x0",
|
||||
]
|
||||
|
||||
for url in urls:
|
||||
for table in extract(url).tables:
|
||||
console.print(table.caption, "\n", table.dataframe)
|
||||
"""
|
||||
Growth in app installations and sessions across different app categories in Q3 2022 compared to Q2 2022 for Ireland and U.K.
|
||||
Install Growth (%) Session Growth (%)
|
||||
Category
|
||||
Education 7 6
|
||||
Games 13 3
|
||||
Social 4 -3
|
||||
Utilities 6 -0.4
|
||||
Top 10 Grossing Android Apps in Ireland, October 2023
|
||||
App Name Category
|
||||
Rank
|
||||
1 Google One Productivity
|
||||
2 Disney+ Entertainment
|
||||
3 TikTok - Videos, Music & LIVE Entertainment
|
||||
4 Candy Crush Saga Games
|
||||
5 Tinder: Dating, Chat & Friends Social networking
|
||||
6 Coin Master Games
|
||||
7 Roblox Games
|
||||
8 Bumble - Dating & Make Friends Dating
|
||||
9 Royal Match Games
|
||||
10 Spotify: Music and Podcasts Music & Audio
|
||||
Top 10 Grossing iOS Apps in Ireland, October 2023
|
||||
App Name Category
|
||||
Rank
|
||||
1 Tinder: Dating, Chat & Friends Social networking
|
||||
2 Disney+ Entertainment
|
||||
3 YouTube: Watch, Listen, Stream Entertainment
|
||||
4 Audible: Audio Entertainment Entertainment
|
||||
5 Candy Crush Saga Games
|
||||
6 TikTok - Videos, Music & LIVE Entertainment
|
||||
7 Bumble - Dating & Make Friends Dating
|
||||
8 Roblox Games
|
||||
9 LinkedIn: Job Search & News Business
|
||||
10 Duolingo - Language Lessons Education
|
||||
"""
|
||||
@@ -0,0 +1,126 @@
|
||||
from openai import OpenAI
|
||||
from io import StringIO
|
||||
from typing import Annotated, Any
|
||||
from pydantic import (
|
||||
BaseModel,
|
||||
BeforeValidator,
|
||||
PlainSerializer,
|
||||
InstanceOf,
|
||||
WithJsonSchema,
|
||||
)
|
||||
import instructor
|
||||
import pandas as pd
|
||||
from langsmith.wrappers import wrap_openai
|
||||
from langsmith import traceable
|
||||
|
||||
|
||||
client = wrap_openai(OpenAI())
|
||||
client = instructor.from_openai(
|
||||
client, mode=instructor.processing.function_calls.Mode.MD_JSON
|
||||
)
|
||||
|
||||
|
||||
def md_to_df(data: Any) -> Any:
|
||||
if isinstance(data, str):
|
||||
return (
|
||||
pd.read_csv(
|
||||
StringIO(data), # Get rid of whitespaces
|
||||
sep="|",
|
||||
index_col=1,
|
||||
)
|
||||
.dropna(axis=1, how="all")
|
||||
.iloc[1:]
|
||||
.map(lambda x: x.strip())
|
||||
)
|
||||
return data
|
||||
|
||||
|
||||
MarkdownDataFrame = Annotated[
|
||||
InstanceOf[pd.DataFrame],
|
||||
BeforeValidator(md_to_df),
|
||||
PlainSerializer(lambda x: x.to_markdown()),
|
||||
WithJsonSchema(
|
||||
{
|
||||
"type": "string",
|
||||
"description": """
|
||||
The markdown representation of the table,
|
||||
each one should be tidy, do not try to join tables
|
||||
that should be separate""",
|
||||
}
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
class Table(BaseModel):
|
||||
caption: str
|
||||
dataframe: MarkdownDataFrame
|
||||
|
||||
|
||||
class MultipleTables(BaseModel):
|
||||
tables: list[Table]
|
||||
|
||||
|
||||
example = MultipleTables(
|
||||
tables=[
|
||||
Table(
|
||||
caption="This is a caption",
|
||||
dataframe=pd.DataFrame(
|
||||
{
|
||||
"Chart A": [10, 40],
|
||||
"Chart B": [20, 50],
|
||||
"Chart C": [30, 60],
|
||||
}
|
||||
),
|
||||
)
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
@traceable(name="extract-table")
|
||||
def extract(url: str) -> MultipleTables:
|
||||
tables = client.chat.completions.create(
|
||||
model="gpt-4-vision-preview",
|
||||
max_tokens=4000,
|
||||
response_model=MultipleTables,
|
||||
messages=[
|
||||
{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": f"Describe this data accurately as a table in markdown format. {example.model_dump_json(indent=2)}",
|
||||
},
|
||||
{
|
||||
"type": "image_url",
|
||||
"image_url": {"url": url},
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": """
|
||||
First take a moment to reason about the best set of headers for the tables.
|
||||
Write a good h1 for the image above. Then follow up with a short description of the what the data is about.
|
||||
Then for each table you identified, write a h2 tag that is a descriptive title of the table.
|
||||
Then follow up with a short description of the what the data is about.
|
||||
Lastly, produce the markdown table for each table you identified.
|
||||
|
||||
|
||||
Make sure to escape the markdown table properly, and make sure to include the caption and the dataframe.
|
||||
including escaping all the newlines and quotes. Only return a markdown table in dataframe, nothing else.
|
||||
""",
|
||||
},
|
||||
],
|
||||
}
|
||||
],
|
||||
)
|
||||
return tables.model_dump()
|
||||
|
||||
|
||||
urls = [
|
||||
"https://a.storyblok.com/f/47007/2400x1260/f816b031cb/uk-ireland-in-three-charts_chart_a.png/m/2880x0",
|
||||
"https://a.storyblok.com/f/47007/2400x2000/bf383abc3c/231031_uk-ireland-in-three-charts_table_v01_b.png/m/2880x0",
|
||||
]
|
||||
|
||||
|
||||
for url in urls:
|
||||
tables = extract(url)
|
||||
print(tables)
|
||||
89
참고/instructor-main/examples/extract-table/run_vision_org.py
Normal file
89
참고/instructor-main/examples/extract-table/run_vision_org.py
Normal file
@@ -0,0 +1,89 @@
|
||||
from openai import OpenAI
|
||||
from pydantic import BaseModel, Field
|
||||
from rich.console import Console
|
||||
|
||||
import instructor
|
||||
|
||||
console = Console()
|
||||
client = instructor.from_openai(
|
||||
client=OpenAI(),
|
||||
mode=instructor.Mode.TOOLS,
|
||||
)
|
||||
|
||||
|
||||
class People(BaseModel):
|
||||
id: str
|
||||
name: str
|
||||
role: str
|
||||
reports: list[str] = Field(
|
||||
default_factory=list, description="People who report to this person"
|
||||
)
|
||||
manages: list[str] = Field(
|
||||
default_factory=list, description="People who this person manages"
|
||||
)
|
||||
|
||||
|
||||
class Organization(BaseModel):
|
||||
people: list[People]
|
||||
|
||||
|
||||
def extract(url: str):
|
||||
return client.chat.completions.create_partial(
|
||||
model="gpt-4-turbo",
|
||||
max_tokens=4000,
|
||||
response_model=Organization,
|
||||
messages=[
|
||||
{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{
|
||||
"type": "image_url",
|
||||
"image_url": {"url": url},
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": """
|
||||
Analyze the organizational chart image and extract the relevant information to reconstruct the hierarchy.
|
||||
|
||||
Create a list of People objects, where each person has the following attributes:
|
||||
- id: A unique identifier for the person
|
||||
- name: The person's name
|
||||
- role: The person's role or position in the organization
|
||||
- reports: A list of IDs of people who report directly to this person
|
||||
- manages: A list of IDs of people who this person manages
|
||||
|
||||
Ensure that the relationships between people are accurately captured in the reports and manages attributes.
|
||||
|
||||
Return the list of People objects as the people attribute of an Organization object.
|
||||
""",
|
||||
},
|
||||
],
|
||||
}
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
console.print(
|
||||
extract(
|
||||
"https://www.mindmanager.com/static/mm/images/features/org-chart/hierarchical-chart.png"
|
||||
)
|
||||
)
|
||||
"""
|
||||
Organization(
|
||||
people=[
|
||||
People(id='A1', name='Adele Morana', role='Founder, Chairman & CEO', reports=[], manages=['B1', 'C1', 'D1']),
|
||||
People(id='B1', name='Winston Cole', role='COO', reports=['A1'], manages=['E1']),
|
||||
People(id='C1', name='Marcus Kim', role='CFO', reports=['A1'], manages=['F1']),
|
||||
People(id='D1', name='Karin Ludovicicus', role='CPO', reports=['A1'], manages=['G1']),
|
||||
People(id='E1', name='Lea Erastos', role='Chief Business Officer', reports=['B1'], manages=['H1', 'I1']),
|
||||
People(id='F1', name='John McKinley', role='Chief Accounting Officer', reports=['C1'], manages=[]),
|
||||
People(id='G1', name='Ayda Williams', role='VP, Global Customer & Business Marketing', reports=['D1'], manages=['J1', 'K1']),
|
||||
People(id='H1', name='Zahida Mahtab', role='VP, Global Affairs & Communication', reports=['E1'], manages=[]),
|
||||
People(id='I1', name='Adelaide Zhu', role='VP, Central Services', reports=['E1'], manages=[]),
|
||||
People(id='J1', name='Gabriel Drummond', role='VP, Investor Relations', reports=['G1'], manages=[]),
|
||||
People(id='K1', name='Nicholas Brambilla', role='VP, Company Brand', reports=['G1'], manages=[]),
|
||||
People(id='L1', name='Felice Vasili', role='VP Finance', reports=['C1'], manages=[]),
|
||||
People(id='M1', name='Sandra Herminius', role='VP, Product Marketing', reports=['D1'], manages=[])
|
||||
]
|
||||
)
|
||||
"""
|
||||
@@ -0,0 +1,115 @@
|
||||
from openai import OpenAI
|
||||
from io import StringIO
|
||||
from typing import Annotated, Any
|
||||
from pydantic import (
|
||||
BaseModel,
|
||||
BeforeValidator,
|
||||
PlainSerializer,
|
||||
InstanceOf,
|
||||
WithJsonSchema,
|
||||
)
|
||||
import instructor
|
||||
import pandas as pd
|
||||
from rich.console import Console
|
||||
|
||||
console = Console()
|
||||
client = instructor.from_openai(
|
||||
client=OpenAI(),
|
||||
mode=instructor.Mode.TOOLS,
|
||||
)
|
||||
|
||||
|
||||
def md_to_df(data: Any) -> Any:
|
||||
if isinstance(data, str):
|
||||
return (
|
||||
pd.read_csv(
|
||||
StringIO(data), # Get rid of whitespaces
|
||||
sep="|",
|
||||
index_col=1,
|
||||
)
|
||||
.dropna(axis=1, how="all")
|
||||
.iloc[1:]
|
||||
.map(lambda x: x.strip())
|
||||
) # type: ignore
|
||||
return data
|
||||
|
||||
|
||||
MarkdownDataFrame = Annotated[
|
||||
InstanceOf[pd.DataFrame],
|
||||
BeforeValidator(md_to_df),
|
||||
PlainSerializer(lambda x: x.to_markdown()),
|
||||
WithJsonSchema(
|
||||
{
|
||||
"type": "string",
|
||||
"description": """
|
||||
The markdown representation of the table,
|
||||
each one should be tidy, do not try to join tables
|
||||
that should be separate""",
|
||||
}
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
class Table(BaseModel):
|
||||
caption: str
|
||||
dataframe: MarkdownDataFrame
|
||||
|
||||
|
||||
def extract(url: str):
|
||||
return client.chat.completions.create(
|
||||
model="gpt-4-turbo",
|
||||
max_tokens=4000,
|
||||
response_model=Table,
|
||||
messages=[
|
||||
{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{
|
||||
"type": "image_url",
|
||||
"image_url": {"url": url},
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": """
|
||||
Analyze the organizational chart image and extract the relevant information to reconstruct the hierarchy.
|
||||
|
||||
Create a list of People objects, where each person has the following attributes:
|
||||
- id: A unique identifier for the person
|
||||
- name: The person's name
|
||||
- role: The person's role or position in the organization
|
||||
- manager_name: The name of the person who manages this person
|
||||
- manager_role: The role of the person who manages this person
|
||||
|
||||
Ensure that the relationships between people are accurately captured in the reports and manages attributes.
|
||||
|
||||
Return the list of People objects as the people attribute of an Organization object.
|
||||
""",
|
||||
},
|
||||
],
|
||||
}
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
print(
|
||||
extract(
|
||||
"https://www.mindmanager.com/static/mm/images/features/org-chart/hierarchical-chart.png"
|
||||
).model_dump()["dataframe"]
|
||||
)
|
||||
"""
|
||||
| id | name | role | manager_name | manager_role |
|
||||
|-------:|:-------------------|:-----------------------------------------|:------------------|:-----------------------------|
|
||||
| 1 | Adele Morana | Founder, Chairman & CEO | | |
|
||||
| 2 | Winston Cole | COO | Adele Morana | Founder, Chairman & CEO |
|
||||
| 3 | Marcus Kim | CFO | Adele Morana | Founder, Chairman & CEO |
|
||||
| 4 | Karin Ludovicus | CPO | Adele Morana | Founder, Chairman & CEO |
|
||||
| 5 | Lea Erastos | Chief Business Officer | Winston Cole | COO |
|
||||
| 6 | John McKinley | Chief Accounting Officer | Winston Cole | COO |
|
||||
| 7 | Zahida Mahtab | VP, Global Affairs & Communication | Winston Cole | COO |
|
||||
| 8 | Adelaide Zhu | VP, Central Services | Winston Cole | COO |
|
||||
| 9 | Gabriel Drummond | VP, Investor Relations | Marcus Kim | CFO |
|
||||
| 10 | Felicie Vasili | VP, Finance | Marcus Kim | CFO |
|
||||
| 11 | Ayda Williams | VP, Global Customer & Business Marketing | Karin Ludovicius | CPO |
|
||||
| 12 | Nicholas Brambilla | VP, Company Brand | Karin Ludovicius | CPO |
|
||||
| 13 | Sandra Herminius | VP, Product Marketing | Karin Ludovicius | CPO |
|
||||
"""
|
||||
@@ -0,0 +1,65 @@
|
||||
from pydantic import BaseModel, model_validator
|
||||
from openai import OpenAI
|
||||
import instructor
|
||||
|
||||
|
||||
client = instructor.from_openai(
|
||||
client=OpenAI(),
|
||||
mode=instructor.Mode.TOOLS,
|
||||
)
|
||||
|
||||
|
||||
class Item(BaseModel):
|
||||
name: str
|
||||
price: float
|
||||
quantity: int
|
||||
|
||||
|
||||
class Receipt(BaseModel):
|
||||
items: list[Item]
|
||||
total: float
|
||||
|
||||
@model_validator(mode="after")
|
||||
def check_total(cls, values: "Receipt"):
|
||||
items = values.items
|
||||
total = values.total
|
||||
calculated_total = sum(item.price * item.quantity for item in items)
|
||||
if calculated_total != total:
|
||||
raise ValueError(
|
||||
f"Total {total} does not match the sum of item prices {calculated_total}"
|
||||
)
|
||||
return values
|
||||
|
||||
|
||||
def extract(url: str) -> Receipt:
|
||||
return client.chat.completions.create(
|
||||
model="gpt-4o",
|
||||
max_tokens=4000,
|
||||
response_model=Receipt,
|
||||
messages=[
|
||||
{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{
|
||||
"type": "image_url",
|
||||
"image_url": {"url": url},
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Analyze the image and return the items in the receipt and the total amount.",
|
||||
},
|
||||
],
|
||||
}
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
# URLs of images containing receipts. Exhibits the use of the model validator to check the total amount.
|
||||
urls = [
|
||||
"https://templates.mediamodifier.com/645124ff36ed2f5227cbf871/supermarket-receipt-template.jpg",
|
||||
"https://ocr.space/Content/Images/receipt-ocr-original.jpg",
|
||||
]
|
||||
|
||||
for url in urls:
|
||||
receipt = extract(url)
|
||||
print(receipt)
|
||||
106
참고/instructor-main/examples/extract-table/test.py
Normal file
106
참고/instructor-main/examples/extract-table/test.py
Normal file
@@ -0,0 +1,106 @@
|
||||
from pydantic import BaseModel
|
||||
|
||||
from openai import OpenAI
|
||||
import instructor
|
||||
|
||||
client = OpenAI()
|
||||
|
||||
client = instructor.from_openai(client)
|
||||
|
||||
|
||||
class User(BaseModel):
|
||||
name: str
|
||||
email: str
|
||||
|
||||
|
||||
class MeetingInfo(BaseModel):
|
||||
user: User
|
||||
date: str
|
||||
location: str
|
||||
budget: int
|
||||
deadline: str
|
||||
|
||||
|
||||
data = """
|
||||
Jason Liu jason@gmail.com
|
||||
Meeting Date: 2024-01-01
|
||||
Meeting Location: 1234 Main St
|
||||
Meeting Budget: $1000
|
||||
Meeting Deadline: 2024-01-31
|
||||
"""
|
||||
stream1 = client.chat.completions.create_partial(
|
||||
model="gpt-4",
|
||||
response_model=MeetingInfo,
|
||||
messages=[
|
||||
{
|
||||
"role": "user",
|
||||
"content": f"Get the information about the meeting and the users {data}",
|
||||
},
|
||||
],
|
||||
stream=True,
|
||||
) # type: ignore
|
||||
|
||||
for message in stream1:
|
||||
print(message)
|
||||
"""
|
||||
ser={} date=None location=None budget=None deadline=None
|
||||
user={} date=None location=None budget=None deadline=None
|
||||
user={} date=None location=None budget=None deadline=None
|
||||
user={} date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name=None, email=None) date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name=None, email=None) date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name=None, email=None) date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name=None, email=None) date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name=None, email=None) date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name=None, email=None) date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email=None) date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email=None) date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email=None) date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email=None) date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email=None) date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email=None) date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email=None) date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email=None) date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email=None) date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date=None location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location=None budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=None deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=100 deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=1000 deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=1000 deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=1000 deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=1000 deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=1000 deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=1000 deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=1000 deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=1000 deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=1000 deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=1000 deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=1000 deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=1000 deadline=None
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=1000 deadline='2024-01-31'
|
||||
user=PartialUser(name='Jason Liu', email='jason@gmail.com') date='2024-01-01' location='1234 Main St' budget=1000 deadline='2024-01-31'
|
||||
"""
|
||||
Reference in New Issue
Block a user