FarmOS Observations
AI-powered quick capture system — field observations, photos, voice notes, and issue reports.
When to Use This
What this skill handles: Field observations -- pest/disease/weed reports, crop condition notes, weather damage, soil issues, equipment problems spotted in the field, and photo-based scouting captures.
Trigger phrases: "found [pest/weed/disease] in field X", "beans look rough", "something is wrong with field 12", "create an observation", "log this problem", "any observations today?", "what has been reported in field X?"
What this does NOT handle: Equipment maintenance scheduling or fleet status (use farmos-equipment), task/work order creation (use farmos-tasks -- but the bot will offer to create a work order after logging an observation), weather forecasts or spray conditions (use farmos-weather).
Minimum viable input: Any mention of something observed in the field. "Beans look bad" is enough -- the bot will ask smart follow-ups.
Data Completeness
- 1. The
/api/integration/dashboard endpoint is for summary stats only — observation counts and pending reviews. Do NOT use it to list individual observations. - For listing observations, use
GET /api/observations with appropriate filters. This endpoint is paginated — use limit parameter and note the total. - Always state the count: "Found 7 observations this week in field 12" — not just a list without context.
- If results seem low, flag it: "Only seeing 2 observations this week — that may be incomplete, or the observations service may be having issues."
- If the service is down, say so plainly. Don't present empty results as "no observations."
API Base
http://100.102.77.110:8008
Note: The observations backend may have stability issues (restart loops reported). If endpoints don't respond, report that the observations service appears to be down.
Integration Endpoints (No Auth)
Dashboard
GET /api/integration/dashboard
Returns: Observation counts, recent activity, pending reviews.
Authenticated Endpoints (JWT Required)
Authentication
This skill accesses protected FarmOS endpoints that require a JWT token.
To get a token:
CODEBLOCK0
To use the token:
CODEBLOCK1
Token expiry: Tokens last 15 minutes. If you get a 401 response, request a new token.
List Observations
GET /api/observations?limit=10&field_id=12
Authorization: Bearer {token}
Observation Detail
GET /api/observations/{id}
Authorization: Bearer {token}
Returns: Full observation with AI analysis results, extracted entities, urgency score, and any created actions (tasks, maintenance records).
Create Observation
POST /api/observations
Authorization: Bearer {token}
Content-Type: multipart/form-data
Form fields:
- -
observation_type (required) — pest, disease, weed, weatherdamage, equipmentissue, soil, crop_condition, other - INLINECODE4 (required) — Text description of what was observed
- INLINECODE5 (optional) — low, medium, high (default: medium)
- INLINECODE6 (optional) — Numeric field ID
- INLINECODE7 (optional) — Numeric equipment ID
- INLINECODE8 (optional) — Image file attachment
Example using curl:
CODEBLOCK2
When crew reports a problem in #field-support or #field-ops, offer to create an observation. Extract as much detail as you can from the message (field, observation type, severity), then create the observation.
Usage Notes
- - Observations include urgency scores (1-10). Flag anything 7+ immediately.
- AI processing classifies type and extracts equipment/field/crop references.
- Observations may create tasks (via Task Manager) or maintenance records (via Equipment).
- If the service is down, let the user know and suggest they log the observation manually.
- The observation intake system is designed for photos from the field — the bot should be ready to accept image messages and route them here.
- Proactive observation creation: When crew mentions issues in channel conversations ("got a bunch of weeds in field 12", "header making a weird noise"), offer to log it as an observation. Don't create silently — ask first.
- Equipment observations: If the observation involves equipment, include
equipment_id when creating. This helps track equipment-specific recurring issues.
Smart Observation Detection
When a user reports something that sounds like a field observation, auto-detect as much as you can from the message before asking questions.
What to Detect
Field identification:
- - Explicit: "field 12", "F12", "the 12"
- By name: "the Byrd farm", "Kruckeberg", "home place" -- match to known field names
- From channel context: if the conversation was already about a specific field, carry that forward
- From user location: if they mention "the field I am in" or "out here", check recent context
Observation type -- see the Observation Type Detection table below.
Severity -- see the Severity Detection table below.
Specific pest/disease/weed identification:
- - Common Indiana pests: western corn rootworm, Japanese beetle, corn earworm, soybean aphid, bean leaf beetle, armyworm, black cutworm, stink bug
- Common diseases: tar spot, gray leaf spot, northern leaf blight, sudden death syndrome, white mold, frogeye leaf spot, Goss wilt, anthracnose
- Common weeds: waterhemp, marestail (horseweed), giant ragweed, common ragweed, Palmer amaranth, lambsquarters, foxtail, velvetleaf, morningglory
- If the reporter uses a colloquial name, map it: "buttonweed" -> common buttonweed, "volunteer corn" -> note as weed/volunteer
Equipment reference:
- - By name/number: "the 8250", "the Kinze", "the planter", "sprayer"
- By implication: "header won't raise" implies the combine (likely 8250)
Location within field:
- - Cardinal directions: "northeast corner", "south end"
- Landmarks: "near the waterway", "along the tree line", "by the road", "headlands", "terrace"
- Coverage: "whole field", "scattered", "in patches", "one spot"
Observation Type Detection
| Keywords / Signals | Observation Type |
|---|
| bug, insect, aphid, rootworm, armyworm, beetle, cutworm, earworm, stink bug, larva, grub | pest |
| tar spot, gray leaf spot, northern leaf blight, rust, rot, blight, lesion, spots on leaves, mold, wilt, SDS, anthracnose, frogeye |
disease |
| waterhemp, marestail, ragweed, foxtail, lambsquarters, Palmer, volunteer corn, weeds, escapes, resistance | weed |
| hail, wind damage, flood, frost, drought stress, storm, ice, lightning, washout, ponding | weather_damage |
| broken, leaking, stuck, noise, won't start, overheating, vibration, warning light, hydraulic, flat tire | equipment_issue |
| compaction, erosion, drainage, wet spots, tile, washout, ruts, soil test, pH | soil |
| stand count, emergence, color, lodging, population, uneven, stunted, yellowing, purpling, canopy | crop_condition |
If multiple types match (e.g., "yellowing leaves with spots" could be disease or crop_condition), pick the more specific one (disease in that case). If genuinely ambiguous, ask: "Is this more of a disease issue or general crop condition?"
Severity Detection
| Language Signals | Severity |
|---|
| "bad", "terrible", "everywhere", "whole field", "never seen this before", "worst I have seen", "out of control", "lost cause" | high |
| "some", "moderate", "spreading", "getting worse", "more than last week", "quite a bit", "a lot of" |
medium |
| "a few", "small patch", "just noticed", "isolated", "one spot", "not too bad", "just starting" | low |
Default to medium if the language is neutral or you cannot determine severity. Never guess high -- ask.
Follow-Up Questions (Smart)
When the report is sparse, ask targeted follow-up questions. Maximum 2-3 questions per interaction -- do not interrogate.
Question Bank (pick the most useful ones)
- - Scope: "How widespread is it? Just that spot or across the field?"
- Adjacent fields: "Have you seen this in adjacent fields?"
- Percentage: "Roughly what percentage of the field is affected?"
- Photos: "Any photos? A picture would help me nail down exactly what this is."
- Treatment history: "Was this field treated with anything recently?"
- Recurrence: "Is this the same issue you reported on [date]?" (only if a similar recent observation exists -- check observation history first)
- Timing: "When did you first notice this?"
- Trend: "Is it getting worse or holding steady?"
Which Questions to Ask
| Missing Info | Ask |
|---|
| No field identified | "Which field are you in?" (always ask this -- cannot create without a field) |
| No type identifiable |
"What are you seeing exactly? Weeds? Bugs? Crop damage? Equipment problem?" |
| Has type but no scope | "How widespread is it?" |
| Weed/pest report | "Any photos?" (visual ID is high value for these) |
| Sounds like recurring issue | "Is this the same issue from [date]?" |
Reporter-Adaptive Behavior
Detailed Reporters (agronomists, Brian, experienced crew)
- - They will say things like "Found western corn rootworm beetle damage in field 22, northeast corner, about 15% of the rows affected, adult count was 8 per plant"
- Auto-detect everything. Confirm the details. Create the observation.
- Skip redundant questions -- they have already given you what you need
- Example response: "Got it -- rootworm beetle damage in F22, northeast corner, ~15% of rows, 8 adults/plant. Severity: high. Creating the observation now."
Sparse Reporters (field crew, seasonal workers)
- - They will say things like "something's wrong with field 12" or "beans look bad"
- Ask 2-3 targeted follow-up questions. Do NOT interrogate.
- Pick the highest-value questions for the situation
- After 2-3 questions, create the observation with whatever you have
- Example exchange:
- Crew: "Beans look rough in 12"
- Bot: "What are you seeing -- weeds, bugs, disease, or just the crop looking off? And is it the whole field or just a section?"
- Crew: "Weeds. Northeast side mostly."
- Bot: "Got it. Creating an observation -- weed pressure in field 12, northeast section, medium severity. Want me to create a scouting work order for it too?"
Key Rules
- - Always offer before creating: "Want me to create an observation for this?" Do NOT create silently -- unless the user has explicitly asked you to create one.
- Exception: If the user directly says "Log this" or "Create an observation for...", that IS explicit permission -- go ahead and create.
- Never ask more than 3 follow-up questions. After 3, create with what you have and note what was unknown.
Post-Creation Actions
After successfully creating an observation, offer related actions:
- - Work order: "Want me to create a work order for this?" (especially for weed/pest/equipment issues that need action)
- Adjacent field check: "Should I check if adjacent fields have the same issue?" (useful for pest/disease/weed spread)
- Scouting task: "Want me to schedule a follow-up scouting trip?" (for observations that need monitoring)
- Equipment maintenance: If equipment_issue type, "Want me to log this against the equipment maintenance record?"
Only offer 1-2 of the most relevant follow-up actions. Do not overwhelm the reporter with options.
Urgency Escalation
Flag the operator immediately (in addition to creating the observation) for:
- - Crop damage at high severity -- potential yield loss, Brian needs to know
- Equipment safety -- hydraulic leak, structural failure, anything that could injure someone
- Chemical exposure -- drift, spill, re-entry violation, any chemical safety concern
- Pest/disease outbreak -- high severity pest or disease that could spread rapidly (tar spot, sudden death syndrome, heavy rootworm pressure)
- Weather damage at high severity -- hail, flood, significant storm damage
When escalating, send a concise alert: "URGENT: [type] reported in field [X] -- [one-line summary]. Severity: high. Observation #[id] created."
Do NOT escalate routine observations (low/medium severity, isolated issues, normal scouting finds).
Cross-Module Context
After creating or reviewing observations, connect to other modules:
Observations → Pattern Detection:
- - When a new observation is created, check for similar recent observations (same type, nearby fields, same week): "This is the third waterhemp observation this week across three different fields. Might be time for a blanket spray program rather than spot treatments."
- When listing observations, group by pattern when multiple share type/field/timeframe: "3 disease observations this week, all in the east fields. Could be spreading."
- Track escalation: "First report was low severity last Tuesday, now we're at high severity across 4 fields. This is moving fast."
Observations → Tasks:
- - After creating an observation, check farmos-tasks for existing work orders related to this field or issue: "There's already a scouting task open for field 22 from yesterday — want me to add this observation to it?"
- If no related task exists and the observation is actionable (pest, disease, weed at medium+ severity), offer to create one.
- Connect observation patterns to task suggestions: "Third waterhemp sighting this week — want me to create a blanket spray task?"
Observations → Weather:
- - Connect recent weather to observation context: "3 disease observations after last week's rain — moisture likely drove this."
- When a weather_damage observation is created, pull the actual weather data: "You're reporting hail damage in field 14. Records show we got 1.2 inches with possible hail Tuesday evening."
- Flag ongoing weather risk: "With more rain coming Thursday, expect this fungal pressure to continue."
Observations → Equipment:
- - If an observation leads to a task that requires specific equipment, check equipment availability: "If you're going to spray for this waterhemp, the sprayer is available — 153 hours, no maintenance due."
- For equipment_issue observations, cross-reference with farmos-equipment for that machine's maintenance history.
Cross-reference when it adds context. A simple "log this observation" doesn't need a full cross-module sweep. But when patterns emerge or observations drive action, connect the dots.
Image Understanding
When a photo accompanies an observation (the image description will appear in your context as [Image] Description: ...), use it to enhance the observation record.
Photo-Enhanced Detection
Use the image description to refine type and severity:
- - Photo of lesions on leaves -- identify disease characteristics (shape, color, pattern, location on leaf) -- refine observationtype to "disease" and attempt specific ID
- Photo of insects or insect damage -- identify species or damage pattern -- refine observationtype to "pest"
- Photo of weeds -- identify species from leaf shape, growth habit, flower/seed head -- refine observationtype to "weed"
- Photo of equipment in the field -- note the machine and any visible issues -- set observationtype to "equipmentissue" and include equipmentid
- Photo of crop conditions -- note growth stage, color, stand count, uniformity -- refine observationtype to "cropcondition"
- Photo of weather damage -- note damage pattern (hail bruising, wind lodging, flood line) -- set observationtype to "weatherdamage"
Always include the image description in the observation description field. Combine what the reporter said with what the photo shows:
"Reporter: Found some weird spots on the corn in field 12. Photo shows: rectangular tan lesions between leaf veins, approximately 1-3cm long, consistent with gray leaf spot (Cercospora zeae-maydis). Northeast section of field."
Photo Quality Handling
- - Clear photo: Use it confidently to refine detection. State what you see and your assessment.
- Unclear/blurry/dark photo: Say so honestly: "I can make out [what you can see] but the photo is too blurry/dark for a confident ID. Can you get a closer shot, or describe what you are seeing?"
- Photo does not match description: If the photo shows something different from what the reporter described, mention it: "You mentioned weeds but the photo looks like it might be disease lesions -- can you clarify?"
- Multiple issues visible: Note all of them: "I can see both waterhemp and what looks like tar spot lesions in this photo. Want me to create observations for both?"
Photo Prompt for Sparse Reports
When a reporter sends a text-only observation about something visual (pest, disease, weed, damage), and has NOT included a photo:
- - "Any photos? A picture would help me nail down exactly what this is." (already in the follow-up question bank)
- Do NOT demand photos. A text description is always enough to create an observation.
Attaching Photos to Observations
When creating an observation via POST /api/observations, include the photo as the photo form field if a MediaPath is available in your context. The image gets archived with the observation record for future reference.
FarmOS 观测
AI驱动的快速记录系统——田间观测、照片、语音笔记和问题报告。
何时使用此功能
此技能处理的内容: 田间观测——病虫害/杂草报告、作物状况记录、天气损害、土壤问题、田间发现的设备问题,以及基于照片的巡查记录。
触发短语: 在X号田发现了[害虫/杂草/病害],大豆看起来不太好,12号田有点问题,创建一条观测记录,记录这个问题,今天有什么观测记录吗?,X号田报告了什么?
此功能不处理的内容: 设备维护排程或车队状态(请使用farmos-equipment),任务/工单创建(请使用farmos-tasks——但机器人会在记录观测后主动提供创建工单),天气预报或喷洒条件(请使用farmos-weather)。
最低有效输入: 任何提及田间观察到的情况。大豆看起来不好就足够了——机器人会提出智能追问。
数据完整性
- 1. /api/integration/dashboard 端点仅用于汇总统计——观测记录数量和待审核记录。请勿用于列出单条观测记录。
- 列出观测记录时,使用 GET /api/observations 并添加适当的筛选条件。此端点支持分页——使用 limit 参数并注意总数。
- 始终说明数量:本周在12号田发现了7条观测记录——而不是仅仅列出记录而不提供背景信息。
- 如果结果似乎偏少,请标记出来:本周仅看到2条观测记录——这可能不完整,或者观测服务可能存在问题。
- 如果服务宕机,请直接说明。不要将空结果呈现为没有观测记录。
API基础地址
http://100.102.77.110:8008
注意: 观测后端可能存在稳定性问题(报告有重启循环)。如果端点无响应,请报告观测服务似乎已宕机。
集成端点(无需认证)
仪表盘
GET /api/integration/dashboard
返回:观测记录数量、近期活动、待审核记录。
认证端点(需要JWT)
认证
此技能访问受保护的FarmOS端点,需要JWT令牌。
获取令牌:
bash
TOKEN=$(~/clawd/scripts/farmos-auth.sh manager)
使用令牌:
bash
curl -H Authorization: Bearer $TOKEN http://100.102.77.110:8008/api/endpoint
令牌过期: 令牌有效期为15分钟。如果收到401响应,请请求新令牌。
列出观测记录
GET /api/observations?limit=10&field_id=12
Authorization: Bearer {token}
观测详情
GET /api/observations/{id}
Authorization: Bearer {token}
返回:完整观测记录,包含AI分析结果、提取的实体、紧急程度评分以及任何已创建的操作(任务、维护记录)。
创建观测记录
POST /api/observations
Authorization: Bearer {token}
Content-Type: multipart/form-data
表单字段:
- - observationtype(必填)—— pest(害虫)、disease(病害)、weed(杂草)、weatherdamage(天气损害)、equipmentissue(设备问题)、soil(土壤)、cropcondition(作物状况)、other(其他)
- description(必填)—— 观测内容的文字描述
- severity(可选)—— low(低)、medium(中)、high(高)(默认:medium)
- fieldid(可选)—— 田块数字ID
- equipmentid(可选)—— 设备数字ID
- photo(可选)—— 图片文件附件
使用curl的示例:
bash
curl -X POST http://100.102.77.110:8008/api/observations \
-H Authorization: Bearer $TOKEN \
-F observation_type=weed \
-F description=在水道附近的东北角发现了水麻 \
-F severity=high \
-F field_id=22 \
-F photo=@/path/to/photo.jpg
当工作人员在#field-support或#field-ops频道报告问题时,主动提供创建观测记录。 从消息中提取尽可能多的细节(田块、观测类型、严重程度),然后创建观测记录。
使用说明
- - 观测记录包含紧急程度评分(1-10分)。立即标记任何7分及以上的记录。
- AI处理会对类型进行分类并提取设备/田块/作物引用信息。
- 观测记录可能会创建任务(通过任务管理器)或维护记录(通过设备模块)。
- 如果服务宕机,请告知用户并建议他们手动记录观测信息。
- 观测录入系统专为田间照片设计——机器人应准备好接收图片消息并将其路由至此。
- 主动创建观测记录: 当工作人员在频道对话中提到问题(12号田有很多杂草,收割机发出奇怪的声音),主动提供将其记录为观测记录。不要静默创建——先询问。
- 设备观测记录: 如果观测记录涉及设备,创建时请包含 equipment_id。这有助于跟踪特定设备的重复性问题。
智能观测检测
当用户报告听起来像田间观测的内容时,在提问前尽可能自动检测信息。
需要检测的内容
田块识别:
- - 明确提及:12号田、F12、12号
- 按名称:Byrd农场、Kruckeberg、主场——匹配到已知田块名称
- 从频道上下文:如果对话已经涉及特定田块,延续该信息
- 从用户位置:如果他们提到我所在的田或这里,检查近期上下文
观测类型——请参见下方的观测类型检测表。
严重程度——请参见下方的严重程度检测表。
特定害虫/病害/杂草识别:
- - 印第安纳州常见害虫:西方玉米根虫、日本甲虫、玉米穗虫、大豆蚜虫、豆叶甲虫、行军虫、黑地老虎、蝽象
- 常见病害:焦斑病、灰斑病、北叶枯病、猝死综合征、白霉病、蛙眼叶斑病、戈斯枯萎病、炭疽病
- 常见杂草:水麻、加拿大蓬(马草)、巨豚草、普通豚草、帕尔默苋、藜、狗尾草、苘麻、牵牛花
- 如果报告人使用俗名,进行映射:buttonweed -> 普通钮扣草,volunteer corn -> 记录为杂草/自生苗
设备引用:
- - 按名称/编号:8250号、Kinze、播种机、喷雾机
- 通过暗示:割台抬不起来暗示是联合收割机(可能是8250)
田块内位置:
- - 基本方位:东北角、南端
- 地标:水道附近、沿树线、路边、地头、梯田
- 覆盖范围:整个田块、分散分布、成片出现、一个点
观测类型检测
| 关键词/信号 | 观测类型 |
|---|
| 虫子、昆虫、蚜虫、根虫、行军虫、甲虫、地老虎、穗虫、蝽象、幼虫、蛴螬 | pest(害虫) |
| 焦斑病、灰斑病、北叶枯病、锈病、腐烂、枯萎、病斑、叶片斑点、霉变、萎蔫、SDS、炭疽病、蛙眼病 |
disease(病害) |
| 水麻、加拿大蓬、豚草、狗尾草、藜、帕尔默苋、自生玉米、杂草、逃逸、抗性 | weed(杂草) |
| 冰雹、风灾、洪水、霜冻、干旱胁迫、暴风雨、冰、闪电、冲毁、积水 | weather_damage(天气损害) |
| 断裂、泄漏、卡住、异响、无法启动、过热、振动、警示灯、液压、轮胎没气 | equipment_issue(设备问题) |
| 压实、侵蚀、排水、湿点、暗管、冲毁、车辙、土壤测试、pH值 | soil(土壤) |
| 株数、出苗、颜色、倒伏、群体密度、不均匀、矮化、黄化、紫化、冠层 | crop_condition(作物状况) |
如果匹配多种类型(例如,叶片发黄有斑点可能是disease或crop_condition),选择更具体的那一种(此例中为disease)。如果确实模棱两可,请询问:这更像是病害问题还是一般作物状况?
严重程度检测
| 语言信号 | 严重程度 |
|---|
| 严重、糟糕、到处都是、整个田块、从未见过、见过最严重的、失控、没救了 | high(高) |
|