| import os |
| import gradio as gr |
| from anthropic import Anthropic |
|
|
|
|
| client = Anthropic() |
| os.environ["ANTHROPIC_API_KEY"] = os.getenv("ANTHROPIC_API_KEY") |
| MODEL_NAME = "claude-3-opus-20240229" |
|
|
| |
| tools = [ |
| { |
| "name": "interactions_schema", |
| "description": "Record from an interview transcript of an interaction between a Technical Assistance Provider (TAP) and a producer the information about the people involved in the interview and important information discussed during the interaction using a well-structured JSON", |
| "input_schema": { |
| "type": "object", |
| "description": "Key summary information from an interaction (phone call, in person discussion, or post-conversation summary) with a producer by a technical assistance provider", |
| "items": { |
| "type": "object", |
| "description": "A single summarized interaction", |
| "properties": { |
| "people": { |
| "type": ["array", "null"], |
| "description": "An array of people involved in or mentioned in this interaction", |
| "items": { |
| "type": "object", |
| "description": "An individual person and their role", |
| "properties": { |
| "name": { |
| "type": "string", |
| "description": "Name of this person", |
| }, |
| "role": { |
| "type": ["string", "null"], |
| "enum": ["partner", "staff", "agronomist", "other"], |
| "description": "Role of this person", |
| } |
| }, |
| "additionalProperties": False, |
| "required": [ |
| "name", |
| "role" |
| ] |
| } |
| }, |
| "date": { |
| "anyOf": [ |
| { |
| "type": "null" |
| }, |
| { |
| "type": "string", |
| "format": "date", |
| "description": "Date of the interaction", |
| }, |
| ] |
| }, |
| "next_meeting": { |
| "anyOf": [ |
| { |
| "type": "null" |
| }, |
| { |
| "type": "string", |
| "format": "date", |
| "description": "Proposed date for the next interaction", |
| }, |
| ] |
| }, |
| "next_steps": { |
| "type": ["array", "null"], |
| "description": "Array containing a list of next steps from the interaction", |
| "items": { |
| "type": ["string", "null"], |
| "description": "An individual next step", |
| } |
| }, |
| "summary": { |
| "type": ["string", "null"], |
| "description": "A summary of the interaction", |
| } |
| }, |
| "additionalProperties": False, |
| "required": [ |
| "people", |
| "date", |
| "next_meeting", |
| "next_steps", |
| "summary" |
| ] |
| } |
| } |
| }, |
| { |
| "name": "plantings_and_fields_schema", |
| "description": "Record from an interview transcript of an interaction between a Technical Assistance Provider (TAP) and a producer the information regarding the crops planted, information regarding the fields the crops were planted on, and information regarding the activities that took place on the fields using a well-structured JSON", |
| "input_schema": { |
| "type": "object", |
| "description": "An array of the producer's fields and their plantings. Also includes the list of logs which are associated with those plantings", |
| "items": { |
| "type": "object", |
| "description": "An individual field", |
| "properties": { |
| "name": { |
| "type": "string", |
| "description": "The name of the field", |
| }, |
| "description": { |
| "type": ["string", "null"], |
| "description": "The description of the field", |
| }, |
| "plantings": { |
| "type": "array", |
| "description": "An array of all the plantings which have occurred on this field", |
| "items": { |
| "type": "object", |
| "description": "An individual planting", |
| "properties": { |
| "name": { |
| "type": ["string", "null"], |
| "description": "The name of the planting", |
| }, |
| "status": { |
| "anyOf": [ |
| { |
| "type": "null" |
| }, |
| { |
| "type": "string", |
| "enum": ["active", "archived"], |
| "description": "The status of the planting. \"active\" is a planting which is currently still in the field. \"archived\" is a planting which is no longer in the field (has been terminated or harvested)", |
| }, |
| ] |
| }, |
| "crop": { |
| "type": "array", |
| "items": { |
| "type": ["string", "null"], |
| "description": "An array of the crops in this planting", |
| } |
| }, |
| "variety": { |
| "type": "array", |
| "items": { |
| "type": ["string", "null"], |
| "description": "An array of the varieties in this planting", |
| } |
| }, |
| "logs": { |
| "type": ["array", "null"], |
| "description": "An array of all logs that are associated with this individual planting", |
| "items": { |
| "type": "object", |
| "description": "An individual log", |
| "properties": { |
| "convention": { |
| "anyOf": [ |
| { |
| "type": "null" |
| }, |
| { |
| "type": "string", |
| "enum": ["log--activity", "log--observation", "log--activity--flaming", "log--activity--grazing", "log--activity--mowing", "log--activity--solarization", "log--activity--termination", "log--activity--tillage", "log--harvest--harvest", "log--input--herbicide_or_pesticide", "log--input--irrigation", "log--input--lime", "log--input--organic_matter", "log--input--seed_treatment", "log--input--seedling_treatment", "log--lab_test--modus_lab_test", "log--seeding--seeding", "log--transplanting--transplanting"], |
| "description": "This log's convention (ie this log's category or type)", |
| }, |
| ] |
| }, |
| "date": { |
| "anyOf": [ |
| { |
| "type": "null" |
| }, |
| { |
| "type": "string", |
| "format": "date", |
| "description": "The date of this log", |
| }, |
| ] |
| }, |
| "description": { |
| "type": ["string", "null"], |
| "description": "A description of the details of the log", |
| } |
| }, |
| "additionalProperties": False, |
| "required": [ |
| "convention", |
| "description", |
| "date" |
| ] |
| } |
| }, |
| "soil": { |
| "type": ["object", "null"], |
| "description": "Information about the soil associated with or observed during the time of this planting", |
| "properties": { |
| "description": { |
| "type": ["string", "null"], |
| "description": "A general description of the soil", |
| }, |
| "structure": { |
| "anyOf": [ |
| { |
| "type": "null" |
| }, |
| { |
| "type": "array", |
| "items": { |
| "type": "string", |
| "enum": ["clay", "sandy clay", "silty clay", "sandy clay loam", "silty clay loam", "clay loam", "sandy loam", "silt loam", "loam", "loamy sand", "sand", "silt"], |
| "description": "The structure of the soil using options from the major soil texture classes (sand, clay, silt)" |
| } |
| } |
| ] |
| }, |
| "biology": { |
| "type": ["string", "null"], |
| "description": "Biological activity levels of the soil, including fluffiness, worms and bugs, and other evidence of soil biological activity", |
| } |
| }, |
| "additionalProperties": False, |
| "required": [ |
| "description", |
| "structure", |
| "biology" |
| ] |
| }, |
| "yield": { |
| "type": ["object", "null"], |
| "properties": { |
| "quantity": { |
| "type": ["string", "null"], |
| "description": "A description of the the total yield (harvested amount) from this planting, including units when available", |
| }, |
| "quality": { |
| "type": ["string", "null"], |
| "description": "The product quality of the harvest. For example, small or large fruits, sweet or tart flavor, easily molding or containing mold, high number of product seconds, etc.", |
| } |
| }, |
| "additionalProperties": False, |
| "required": [ |
| "quantity", |
| "quality" |
| ] |
| } |
| }, |
| "additionalProperties": False, |
| "required": [ |
| "name", |
| "status", |
| "crop", |
| "variety", |
| "logs", |
| "soil", |
| "yield" |
| ] |
| } |
| } |
| }, |
| "additionalProperties": False, |
| "required": [ |
| "name", |
| "description", |
| "plantings" |
| ] |
| } |
| } |
| }, |
| { |
| "name": "trials_and_treatments_schema", |
| "description": "Record from an interview transcript of an interaction between a Technical Assistance Provider (TAP) and a producer the information surrounding the scientific experiment that was performed using a well-structured JSON", |
| "input_schema": { |
| "type": "object", |
| "description": "An array of on-farm trials (ie experiments) performed by producers with support from staff, agronomists and others", |
| "items": { |
| "type": "object", |
| "description": "An individual trial", |
| "properties": { |
| "name": { |
| "type": ["string", "null"], |
| "description": "The name of this trial" |
| }, |
| "description": { |
| "type": ["string", "null"], |
| "description": "A description of this trial" |
| }, |
| "treatments": { |
| "type": "array", |
| "description": "An array of different treatments (strips or blocks with the same conditions applied) performed by the partner", |
| "items": { |
| "type": "object", |
| "description": "An individual treatment", |
| "properties": { |
| "name": { |
| "type": ["string", "null"], |
| "description": "The treatment name" |
| }, |
| "description": { |
| "type": ["string", "null"], |
| "description": "The treatment description, including the conditions within this treatment" |
| }, |
| "crops": { |
| "type": ["array", "null"], |
| "description": "An array of crops being tested in this treatment", |
| "items": { |
| "type": "string", |
| "description": "An individual crop" |
| } |
| }, |
| "fields": { |
| "type": ["array", "null"], |
| "description": "An array of fields in which this treatment has occurred or will occur", |
| "items": { |
| "type": "string", |
| "description": "An individual field where this treatment has or will occur" |
| } |
| } |
| }, |
| "additionalProperties": False, |
| "required": [ |
| "name", |
| "description", |
| "crops", |
| "fields" |
| ] |
| |
| } |
| }, |
| "learnings": { |
| "type": ["array", "null"], |
| "description": "An array of lessons learned from this experiment", |
| "items": { |
| "type": "string", |
| "description": "An individual lesson learned" |
| } |
| }, |
| "variables": { |
| "type": "object", |
| "description": "Variables (ie factors) in this experiment. Some variables are constant (controlled) and some will vary in order to learn something (independent)", |
| "properties": { |
| "controlled": { |
| "type": ["array", "null"], |
| "description": "An array of controlled variables, which will be constant (controlled) across all trials", |
| "items": { |
| "type": "string", |
| "description": "An individual controlled variable, meaning a variable which is constant across all trials" |
| } |
| }, |
| "independent": { |
| "type": ["array", "null"], |
| "description": "An array of independent variables (ie treatments), which will be intentionally varied across one or more trials", |
| "items": { |
| "type": "string", |
| "description": "An individual independent variable (ie treatments), meaning a variable which will be intentionally varied across one or more trials" |
| } |
| }, |
| "outcome": { |
| "type": ["array", "null"], |
| "description": "An array of outcome variables (ie dependent or response variables) which is hypothesized to change across the trials", |
| "items": { |
| "type": "string", |
| "description": "An individual outcome variable (ie dependent or response variables)" |
| } |
| } |
| }, |
| "additionalProperties": False, |
| "required": [ |
| "controlled", |
| "independent", |
| "outcome" |
| ] |
| }, |
| "confounding_factors": { |
| "type": ["array", "null"], |
| "description": "An array of factors which may impact the outcomes of the experiment that were not planned for.", |
| "items": { |
| "type": "string", |
| "description": "An individual confounding factor" |
| } |
| } |
| }, |
| "additionalProperties": False, |
| "required": [ |
| "name", |
| "description", |
| "treatments", |
| "learnings", |
| "variables", |
| "confounding_factors" |
| ] |
| } |
|
|
| } |
| } |
| ] |
|
|
|
|
| def respond(message, tool_options, tool_name): |
| if tool_options == "Force Use Specific Tool": |
| message = client.messages.create( |
| model=MODEL_NAME, |
| max_tokens=4096, |
| tools=tools, |
| tool_choice={"type": "tool", "name": tool_name}, |
| messages=[ |
| { |
| "role": "user", |
| "content": message |
| } |
| ] |
| ) |
| json_response = None |
| for content in message.content: |
| if content.type == "tool_use" and content.name == tool_name: |
| json_response = content.input |
| break |
|
|
| if json_response: |
| return json_response |
| else: |
| print(f"Could not use {tool_name} on input data") |
| |
| elif tool_options == "Plain (No Tools)": |
| message = client.messages.create( |
| model=MODEL_NAME, |
| max_tokens=4096, |
| messages=[ |
| { |
| "role": "user", |
| "content": message |
| }, |
| ] |
| ).content[0].text |
|
|
| return message |
|
|
|
|
| with gr.Blocks() as demo: |
| input_textbox = gr.Textbox(label="Input Data:") |
| output_textbox = gr.Textbox(label="JSON Output:") |
| submit_button = gr.Button("Create JSONs") |
|
|
| radio_tool_settings = gr.Radio(["Force Use Specific Tool", "Plain (No Tools)"], label="Claude Tool Use Options") |
| radio_choose_tool = gr.Radio(["plantings_and_fields_schema", "interactions_schema", "trials_and_treatments_schema"], label="Claude Specific Tools Available", visible=False) |
|
|
| def show_tools(radio_tool_settings): |
| value = radio_tool_settings |
| if value == "Force Use Specific Tool": |
| return gr.Textbox(visible=bool(1)) |
| else: |
| return gr.Textbox(visible=bool(0)) |
| radio_tool_settings.change(show_tools, radio_tool_settings, radio_choose_tool) |
|
|
| submit_button.click( |
| fn=respond, |
| inputs=[input_textbox, radio_tool_settings, radio_choose_tool], |
| outputs=output_textbox |
| ) |
|
|
| if __name__ == "__main__": |
| demo.launch() |
|
|