feat: 新增追问模式和iOS本地化,重构后端输出模型

This commit is contained in:
qzl
2026-04-29 14:26:15 +08:00
parent f497afbff2
commit 16cb47e75a
39 changed files with 1346 additions and 600 deletions
+5 -5
View File
@@ -65,12 +65,12 @@ appBar: AppBar(
- When a repeated pattern emerges, extract a reusable component into `shared/widgets/` instead of building `AppBar` independently in each page.
## Divination Terminology (Must)
## Divination Terminology
- Divination domain terminology must use fixed Chinese terms in code contracts, protocol fields, and UI semantic labels.
- Do not localize or translate canonical terms such as: 六爻、爻、动爻、静爻、六亲、六神、世爻、应爻、伏神、月建、日辰、月破、日冲、空亡、五行旺衰。
- Signature level labels (`上上签/中上签/中下签`) may be localized for UI display only, while protocol/storage values remain canonical Chinese.
- l10n can translate explanatory copy, but must not alter canonical divination terminology semantics.
- Protocol/storage values and backend field names remain canonical Chinese (e.g. 官鬼, 妻财, 世, 应).
- Frontend hexagram detail MUST localize for English users: translate section headers, five-element labels, status values, and provide a legend mapping Chinese symbols to English equivalents.
- Yao row cells keep Chinese characters (compact display); a legend card above the rows provides English translations.
- AI English output uses Chinese parenthetical notes for key Liu Yao terms (e.g. "Officer (官鬼) line") so users can cross-reference with the Chinese characters shown in the hexagram detail.
## Localization Generation Rules (Must)
+7 -9
View File
@@ -1,25 +1,23 @@
# About Us
Welcome to MeiYao Divination, an AI-assisted platform for interpreting traditional Six-Line divination and opening a window into classical Chinese wisdom.
Welcome to MeeYao Divination, an AI-assisted cultural reference app focused on traditional Six-Line culture and the traditional wisdom of the I Ching.
Six-Line divination comes from the deep philosophical system of the *I Ching*. It reflects the ancient view that intention, time, and the changing world are connected. Once a hexagram is formed, it can be interpreted together with line texts and rules such as the Five Elements and GanZhi interactions to understand possible trends and outcomes.
Six-Line culture originates from the profound philosophical system of the I Ching. It embodies the traditional viewpoint of the connection between personal thoughts, timing and natural changes. By combining hexagram culture, traditional five-element theories and traditional GanZhi cultural concepts, users can explore traditional cultural connotations and life reference perspectives.
MeiYao Divination is built on this idea. Its core value is to help users step outside narrow thinking, understand contradictions, opportunities, and risks from a broader trend perspective, and make calmer, more thoughtful decisions. We hope AI can become a modern bridge to this traditional wisdom.
MeeYao Divination is designed based on traditional oriental culture. Our core goal is to help users broaden their thinking horizons, view daily choices and life status from a diverse cultural perspective, and maintain a rational and peaceful mindset in daily life. We hope modern AI technology can serve as a convenient way for everyone to understand and experience traditional Chinese culture.
---
## Company Info
**Developer:** Xunmee Technology (Shenzhen) Co., Ltd.
**Developer:** Ann Lee
**Contact Email:** xuyunlong@xunmee.com
**Privacy Policy:** Available at Settings → Privacy → Privacy Policy in the App
**Contact Email:** ann@xumee.com
---
## Important Disclaimer
All divination interpretations are generated by AI and for entertainment and reference only. They are not intended to replace professional guidance in business, finance, medical, legal, or any other formal fields. We do not guarantee the accuracy or reliability of the content, and users shall take full responsibility for any decisions they make.
All AI-generated content and cultural interpretation materials are for **entertainment, cultural appreciation and reference only**. This app does not provide professional advice of any kind, including but not limited to business, finance, investment, medical treatment, psychology, law, career or life decision-making. All generated content shall not be regarded as factual basis or decision-making guidance. The developer does not assume any responsibility for users' personal choices, behaviors and related consequences. Please treat traditional culture rationally and use this app with a rational attitude.
© 2026 MeiYao Divination. All Rights Reserved.
© 2026 Ann Lee. All Rights Reserved.
+87 -175
View File
@@ -1,251 +1,163 @@
# Privacy Policy
**Last Updated**: April 17, 2026
**Last Updated**: April 27, 2026
**Effective Date**: April 17, 2026
**Effective Date**: April 27, 2026
---
## 1. Who We Are
## Introduction
MeiYao Divination ("we," "us," or "our") is a mobile application developed and operated by Xunmee Technology (Shenzhen) Co., Ltd. This Privacy Policy explains how we collect, use, disclose, and protect your personal information when you use our mobile application (the "App").
Dear User, Welcome to MeeYao Divination (the "App"), independently developed and operated by an **individual developer** ("I", "me", "my"). I am committed to protecting your personal privacy and complying with applicable U.S. federal and state privacy laws, including the California Consumer Privacy Act (CCPA/CPRA), the Children's Online Privacy Protection Act (COPPA), CalOPPA, and other U.S. state privacy regulations.
**Contact Information:**
- Company: Xunmee Technology (Shenzhen) Co., Ltd.
- Email: privacy@xunmee.com
- Support Email: xuyunlong@xunmee.com
This Privacy Policy clearly explains:
- What personal information I collect
- How your data is used, stored and shared
- Your legal privacy rights under U.S. regulations
- How you can submit data requests
This policy applies to all users of this App. California residents are granted additional rights specified in Section 5.
---
## 2. Information We Collect
## 1. Information We Collect
### 2.1 Personal Information We Collect
I only collect necessary data to provide, maintain and optimize App cultural reference functions. All data is classified as Personal Information and Sensitive Personal Information (SPI) in accordance with CCPA/CPRA.
We collect information that you provide directly to us and information that is collected automatically when you use our App.
### 1.1 Information You Provide Directly
#### Information You Provide
- **Account Information**: Email address, verification code (required for account registration and security verification)
- **Profile Information**: Optional nickname or display name voluntarily set by you
- **Personal Content**: Your input questions, cultural interpretation records and local session content
- **Support Information**: Feedback, consultation messages you send for user assistance
- **Account Information**: When you create an account, we collect your email address and verification code.
- **Divination Content**: When you use our divination services, we collect your questions, inputs, divination results, and session history.
- **Customer Support**: If you contact us for support, we collect the information you provide in your message.
### 1.2 Information Collected Automatically
#### Information Collected Automatically
When you use the App, limited automatic data will be collected to ensure normal operation:
When you use our App, we and our third-party partners automatically collect:
- **Device Information**: Device model, operating system version, device settings
- **Usage Information**: Divination frequency, session duration, session history
- **Technical Information**: Access timestamps, time zone information
- **Attribution Data**: We use AppsFlyer and SKAdNetwork for attribution and marketing analytics. These services may collect device identifiers, IP addresses, and other information for advertising attribution purposes.
### 2.2 Categories of Personal Information Collected (Past 12 Months)
In the past 12 months, we have collected the following categories of personal information:
| Category | Collected | Examples |
|----------|-----------|----------|
| **A. Identifiers** | Yes | Email address |
| **B. Personal Information Categories** | No | N/A |
| **C. Protected Classification Characteristics** | No | N/A |
| **D. Commercial Information** | No | N/A |
| **E. Biometric Information** | No | N/A |
| **F. Internet or Other Electronic Network Activity Information** | Yes | Session duration, divination frequency, device information |
| **G. Geolocation Data** | No | N/A |
| **H. Sensory Data** | No | N/A |
| **I. Professional or Employment Information** | No | N/A |
| **J. Education Information** | No | N/A |
| **K. Inferences** | No | N/A |
- **Device Information**: Device model, operating system version, unique device identifier, device configuration
- **Technical Data**: IP address (for rough regional access recognition), access time, crash logs and operation performance data
- **Usage Data**: Function usage records, app stay duration and in-app interaction behavior
---
## 3. How We Use Your Personal Information
## 2. How We Use Your Information
We use the personal information we collect for the following business purposes:
Your information will only be used for the following legitimate and limited purposes:
- **To provide our services**: Process your divination queries, generate AI interpretations, store your session history, and deliver the core functionality of the App
- **To communicate with you**: Send you service-related communications, respond to your inquiries, and provide customer support
- **To improve our services**: Analyze usage patterns to enhance divination accuracy, fix bugs, and develop new features
- **To protect our services**: Detect and prevent fraud, abuse, and security issues
- **To comply with legal obligations**: Meet applicable legal, tax, and regulatory requirements
1. **Provide Core Functions**: Process your input content, generate AI cultural interpretation content, and record local usage records.
2. **Account Security**: Complete user verification, prevent abnormal login and protect your account security.
3. **Product Optimization**: Analyze anonymous usage data to fix bugs, optimize operation experience and improve product performance.
4. **User Assistance**: Reply to your feedback and solve your use problems.
5. **Service Reminders**: Push necessary system notices and policy update reminders.
6. **Legal Compliance**: Meet statutory compliance requirements and official platform review rules.
I will **not** use your personal sensitive content for commercial advertising or unauthorized marketing without your explicit consent.
---
## 4. How We Share Your Personal Information
## 3. Data Storage, Retention & Cross-Border Transfers
### 4.1 Service Providers
### 3.1 Storage Location
We share your personal information with third-party service providers who perform services on our behalf:
User data collected through this App may be stored on secure third-party cloud servers located in the United States. All cross-border data transmission adopts encrypted transmission protocols to ensure data security.
| Service Provider | Purpose | Category of Information Shared |
|------------------|---------|-------------------------------|
| **Amazon Web Services (AWS)** | Cloud hosting and infrastructure | All personal information stored in our systems |
| **AppsFlyer** | Attribution and marketing analytics | Device identifiers, IP addresses, usage information |
### 3.2 Retention Period
These service providers are contractually obligated to use your personal information only for the purposes we specify and are prohibited from selling or sharing it for their own purposes.
Data will only be retained within the necessary time limit:
### 4.2 Disclosure for Business Purposes
In the past 12 months, we have disclosed the following categories of personal information for business purposes:
| Category of Personal Information | Disclosed | Recipient Categories |
|---------------------------------|-----------|---------------------|
| **A. Identifiers** | Yes | Cloud hosting providers, analytics providers |
| **F. Internet or Other Electronic Network Activity Information** | Yes | Cloud hosting providers, analytics providers |
### 4.3 Sale of Personal Information
**We do not sell personal information.** In the past 12 months, we have not sold any personal information.
### 4.4 Sharing of Personal Information for Cross-Context Behavioral Advertising
**We do not share personal information for cross-context behavioral advertising.** In the past 12 months, we have not shared any personal information for cross-context behavioral advertising.
- **Account data**: Retained during your active use, and cleaned up reasonably after you cancel your account.
- **Personal content records**: Reserved within a reasonable cycle and regularly cleaned or anonymized.
- **Device and log data**: Automatically deleted after a limited period.
---
## 5. Your Privacy Rights (California Residents)
## 4. Sharing & Disclosure of Information
If you are a California resident, you have the following rights under the California Consumer Privacy Act (CCPA) and California Privacy Rights Act (CPRA):
### 4.1 Sale of Personal Information
### 5.1 Right to Know
**I do not sell, rent or trade your personal information** in any form, and will never sell your data for commercial benefits.
You have the right to request that we disclose what personal information we collect, use, disclose, and sell.
### 4.2 Sharing with Third-Party Service Providers
### 5.2 Right to Delete
I only share data with trusted third-party service providers necessary for App operation, and sign strict data protection restrictions:
You have the right to request that we delete any of your personal information that we have collected and retained, subject to certain exceptions.
- Cloud storage and server services
- App operation analysis, crash monitoring tools
- Apple official push and system service capabilities
### 5.3 Right to Correct
All third parties are prohibited from using your data for independent commercial purposes.
You have the right to request that we correct inaccurate personal information that we maintain about you.
### 4.3 Legal Disclosure
### 5.4 Right to Data Portability
Your data may be disclosed only in the following situations:
You have the right to request that we provide you with your personal information in a readily usable format that allows you to transmit the information to another entity without hindrance.
### 5.5 Right to Opt-Out of Sale or Sharing
**We do not sell or share personal information for cross-context behavioral advertising.** Therefore, you do not need to exercise this right with us.
### 5.6 Right to Limit Use of Sensitive Personal Information
We do not collect sensitive personal information as defined under CCPA/CPRA. Therefore, you do not need to exercise this right with us.
### 5.7 Right to Non-Discrimination
We will not discriminate against you for exercising any of your CCPA/CPRA rights.
- Required by laws, regulations, court orders or official government requests
- With your clear voluntary authorization and consent
- To protect personal legitimate rights and public safety
---
## 6. How to Exercise Your Rights
## 5. Your U.S. Privacy Rights (California Residents Included)
### 6.1 Submitting Requests
In accordance with CCPA/CPRA and U.S. local privacy laws, you enjoy the following rights:
To exercise your rights under the CCPA/CPRA, you may:
1. **Right to Know**: Inquire about the type and scope of personal data collected.
2. **Right to Access**: Obtain a copy of your personal usage data.
3. **Right to Deletion**: Apply to delete your account and related personal data.
4. **Right to Correction**: Modify incorrect personal information.
5. **Right to Data Portability**: Obtain your data in a readable format.
6. **Right to Opt-Out**: Reject non-essential data collection and irrelevant recommendation.
7. **Right to Limit Sensitive Data**: Restrict the use of your personal sensitive content.
8. **Right to Non-Discrimination**: No differential treatment for you to exercise privacy rights.
- **Email us**: privacy@xunmee.com
- **Use in-app features**: Settings → Privacy → Data Requests
### How to Exercise Your Rights
You do not need to create an account to submit a request.
You can submit data requests through the only dedicated contact method:
### 6.2 Verifying Your Identity
- **Contact Email**: ann@xumee.com
To protect your privacy and security, we will take reasonable steps to verify your identity before processing your request. This may include asking you to provide information that matches what we have on file for your account.
### 6.3 Response Time
We will respond to your request within **45 days** of receipt. If we need more time (up to 90 days total), we will inform you of the reason and extension period in writing.
### 6.4 Authorized Agent
You may designate an authorized agent to submit requests on your behalf. We may require the authorized agent to provide proof of authorization and verify their identity.
I will respond to your legitimate request within 45 days, and properly verify your identity to ensure data security before processing.
---
## 7. Data Retention
## 6. Children's Privacy (COPPA Compliance)
We retain your personal information for as long as necessary to fulfill the purposes for which it was collected, including:
This App is not oriented to users under the age of 13. I do not intentionally collect any personal information of minors under 13 years old.
- **Account Information**: Retained while your account is active and for 90 days after account deletion (to comply with legal obligations)
- **Divination Records**: Retained for 12 months, then deleted or anonymized
- **Technical/Usage Data**: Retained for 90 days, then anonymized
When your personal information is no longer needed, we will securely delete or anonymize it.
If you find that minor information has been improperly collected, please contact me via email in a timely manner, and I will completely delete the relevant data in accordance with COPPA regulations. Users aged 1317 need to use this App under the supervision and consent of their guardians.
---
## 8. Data Security
## 7. Data Security
We implement reasonable security measures to protect your personal information from unauthorized access, use, or disclosure, including:
I adopt industry-standard technical protection measures to protect your data:
- Encryption of data in transit using secure HTTPS/TLS protocols
- Access controls and authentication mechanisms for user data
- Regular security reviews and monitoring
- Encrypted storage and encrypted transmission to prevent data leakage
- Strict access restrictions and daily security management
- Regular abnormal monitoring and risk checking
However, no security system is 100% secure, and we cannot guarantee the absolute security of your personal information.
Please note that no network storage system can achieve absolute security, and I will always maintain the highest level of data protection measures.
---
## 9. Children's Privacy
## 8. Policy Changes
Our App is not intended for children under the age of 13. We do not knowingly collect personal information from children under 13.
If you believe we have collected personal information from a child under 13, please contact us immediately at privacy@xunmee.com. We will take steps to delete such information promptly.
Users between the ages of 13 and 17 must have parental or guardian consent to use our App.
This Privacy Policy may be updated irregularly to adapt to platform rules and legal adjustments. Important content changes will be notified through in-app prompts or email reminders in advance. Your continued use of the App after the update takes effect means that you agree to the revised policy.
---
## 10. Cross-Border Data Transfers
## 9. Contact Us
Your personal information may be transferred to and processed in the United States. By using our App, you consent to the transfer of your personal information to the United States.
If you have any questions, suggestions or privacy-related complaints about this Privacy Policy, please contact me:
We ensure that appropriate safeguards are in place for cross-border transfers, including:
**Developer Email**: ann@xumee.com
- Secure data transmission using encryption
- Contractual protections with service providers
- Compliance with applicable data protection laws
If you are a California resident and dissatisfied with the processing result, you can consult the local privacy regulatory authority.
---
## 11. Changes to This Privacy Policy
**Independent Individual Developer**
We may update this Privacy Policy from time to time. If we make material changes, we will notify you by:
- Posting the updated Privacy Policy in the App
- Updating the "Last Updated" date at the top of this policy
We encourage you to review this Privacy Policy periodically to stay informed about how we collect, use, and protect your personal information.
---
## 12. Contact Us
If you have any questions about this Privacy Policy or our privacy practices, please contact us at:
**Xunmee Technology (Shenzhen) Co., Ltd.**
- **Privacy Officer**: privacy@xunmee.com
- **Support Email**: xuyunlong@xunmee.com
- **Address**: [Full Street Address], Shenzhen, Guangdong, China
---
## 13. Additional Rights for California Residents
### 13.1 Right to Equal Service and Price
You have the right not to receive discriminatory treatment for exercising your privacy rights under the CCPA/CPRA.
### 13.2 Financial Incentive Programs
We do not currently offer any financial incentive programs for the collection, sale, or deletion of personal information.
### 13.3 Accessibility
This Privacy Policy and our "Do Not Sell My Personal Information" link (if applicable) are accessible to users with disabilities.
---
**Last Updated**: April 17, 2026
**Xunmee Technology (Shenzhen) Co., Ltd.**
**Last Updated**: April 27, 2026
+69 -45
View File
@@ -1,97 +1,121 @@
# Terms of Service (US Compliant Version)
# Terms of Service
**Last Updated:** April 15, 2026
**Last Updated:** April 27, 2026
---
## 1. Acceptance of Terms
MeiYao Divination (the "App") is developed, operated, and maintained by **Xunmee Technology (Shenzhen) Co., Ltd.** ("we," "us," or "our").
MeiYao Divination (the "App") is independently developed, owned and operated by an **individual developer** ("I", "me", "my").
By downloading, installing, registering, accessing, or using the App, you ("you" or "user") acknowledge that you have read, understood, and **unconditionally agree** to be bound by these Terms of Service ("Terms") and our **Privacy Policy**. If you do not agree, you may not use the App.
By downloading, installing, registering, accessing, or using the App, you ("you" or "user") acknowledge that you have read, understood, and unconditionally agree to be bound by these Terms of Service ("Terms") and my Privacy Policy. If you do not agree to these Terms, you must not use this App.
---
## 2. Age Requirement & COPPA Compliance
You represent and warrant that you are **at least 13 years of age** to use this App.
You represent and warrant that you are at least 13 years of age to use this App.
- This App is **not intended for use by children under 13**.
- We do not knowingly collect personal information from users under 13. If we become aware that a child under 13 has provided us with personal data, we will delete such information immediately.
- This App is not intended for children under 13 years old.
- I do not knowingly collect personal information from users under the age of 13. If I become aware that a minor under 13 has submitted personal data, I will take immediate action to delete such information.
---
## 3. Service Description
The App provides **AI-assisted Six-Line divination interpretation services** (including manual and automatic hexagram casting), rooted in traditional *I Ching* philosophy.
This App provides AI-assisted cultural interpretation content related to traditional I Ching and Six-Line culture, for daily reference and cultural appreciation only.
- All divination results and interpretations are **AI-generated and for entertainment and reference purposes only**.
- They are **not intended as professional advice** (financial, legal, medical, business, or otherwise).
- We do not guarantee accuracy, completeness, or reliability of any AI-generated content.
- Temporary service interruptions due to maintenance, technical failures, force majeure, or third-party issues do not constitute a breach of these Terms.
- All AI-generated content and cultural reference materials are for entertainment and personal reference purposes solely.
- Content shall not be regarded as professional advice, including without limitation finance, investment, law, medical treatment, career or business decision-making.
- I do not guarantee the accuracy, completeness or practicality of any AI-generated content within the App.
- Temporary service suspension caused by system maintenance, technical exceptions, network failure or force majeure shall not be deemed a breach of these Terms.
---
## 4. User Accounts & Data Privacy
- You must provide **true, accurate, and complete registration information** and keep it updated.
- You are responsible for maintaining the confidentiality of your account credentials and for all activities under your account.
- We collect and process necessary personal information as described in our **Privacy Policy**, in compliance with applicable laws including **CCPA/CPRA (California Consumer Privacy Act)**.
- California users have the right to access, delete, and opt out of the sale of their personal data as set forth in our Privacy Policy.
- You shall provide true, accurate and complete registration information and keep your information updated.
- You are solely responsible for safeguarding your account login credentials and for all activities conducted under your account.
- I collect and process user personal data strictly in accordance with the published Privacy Policy and comply with applicable U.S. privacy laws, including CCPA/CPRA.
- California residents hold relevant data access, deletion and privacy rights as stated in the Privacy Policy.
---
## 5. Intellectual Property
All content within the Appincluding software code, text, images, audio, video, trademarks, service marks, and design—is the exclusive property of Xunmee Technology (Shenzhen) Co., Ltd. and protected under **U.S. copyright law (DMCA)**, trademark law, and international treaties.
All intellectual property rights within the App, including but not limited to program code, text copy, graphic design, interface content, logos and visual elements, are exclusively owned by the individual developer and protected by U.S. copyright law (DMCA), trademark regulations and international intellectual property conventions.
You may not:
- Copy, modify, distribute, transmit, display, or create derivative works of the App or its content.
- Reverse engineer, decompile, disassemble, or attempt to extract source code from the App.
- Remove any copyright, trademark, or proprietary notices from the App.
- Copy, modify, edit, distribute, reproduce or create derivative works based on the App and its internal content.
- Reverse engineer, decompile, disassemble, crack or attempt to obtain the App's source code.
- Delete, cover or alter any copyright notice, proprietary mark and intellectual property statement in the App.
---
## 6. Prohibited User Conduct
You agree not to:
- Use the App for **illegal, harmful, fraudulent, or infringing activities**.
- Post or transmit content that is unlawful, defamatory, obscene, threatening, or violates third-party rights.
- Interfere with or disrupt the App's servers, networks, or security measures.
- Exploit any vulnerabilities for unauthorized access or commercial use.
- Make false or misleading claims regarding the App's divination results.
- Use the App for illegal, malicious, fraudulent or infringing behaviors.
- Publish or spread illegal, defamatory, obscene, threatening, violent or third-party infringing content.
- Attack, interfere or disrupt the App's operating environment, server and network stability.
- Exploit system vulnerabilities for unauthorized access, commercial profit or improper use.
- Exaggerate or falsely promote the functional effect and reference value of in-app content.
We reserve the right to **warn, restrict, suspend, or terminate accounts** that violate these rules, without prior notice, and may pursue legal action where appropriate.
I reserve the right to issue warnings, restrict functions, suspend or terminate your account without prior notice if you violate the above provisions, and reserve the right to pursue legal liability when necessary.
---
## 7. Disclaimer of Warranties (US Standard)
THE APP AND ALL SERVICES ARE PROVIDED **"AS IS" AND "AS AVAILABLE"**, WITHOUT WARRANTIES OF ANY KIND—EXPRESS OR IMPLIED—INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
THE APP AND ALL IN-APP FUNCTIONS ARE PROVIDED ON AN "AS IS" AND "AS AVAILABLE" BASIS, WITH NO EXPRESS OR IMPLIED WARRANTIES OF ANY KIND. THIS INCLUDES BUT IS NOT LIMITED TO IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD-PARTY RIGHTS.
WE DO NOT WARRANT THAT:
I DO NOT WARRANT THAT:
- The App will be uninterrupted, secure, error-free, or accurate.
- Results from the App will meet your expectations.
- AI-generated content is reliable or suitable for any purpose.
- The App will operate continuously, securely, error-free or without interruption.
- All generated cultural reference content will fully meet your expectations.
- The App and its functions are completely stable, virus-free or defect-free.
---
## 8. Limitation of Liability
TO THE FULLEST EXTENT PERMITTED BY LAW:
To the fullest extent permitted by applicable U.S. laws:
- IN NO EVENT SHALL XUNMEE TECHNOLOGY, ITS DIRECTORS, EMPLOYEES, OR AFFILIATES BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES ARISING FROM YOUR USE OF THE APP.
- OUR TOTAL AGGREGATE LIABILITY FOR ANY CLAIM RELATED TO THE APP SHALL NOT EXCEED THE TOTAL AMOUNT YOU PAID TO US (IF ANY) IN THE PAST 12 MONTHS.
- I shall not be liable for any indirect, incidental, special, consequential or compensatory damages arising from your use of the App.
- Under no circumstances shall I bear excessive liability for disputes, losses or risks caused by your independent judgment and personal decisions.
- As a free individual development application, no paid transaction relationship exists; all use risks shall be borne by the user.
---
## 9. Indemnification
You agree to **indemnify and hold harmless** Xunmee Technology from all claims, damages, losses, and expenses (including legal fees) arising from:
You agree to indemnify and hold the individual developer harmless from all claims, damages, losses, costs and reasonable legal expenses arising from:
- Your violation of these Terms.
- Your use or misuse of the App.
- Your infringement of third-party rights.
- Your violation of these Terms of Service.
- Improper use, abuse or unauthorized operation of the App.
- Any infringement of third-party intellectual property and legal rights caused by your published content.
---
## 10. Governing Law & Dispute Resolution
These Terms are governed by the **laws of the State of California, U.S.A.**, without regard to its conflict of laws principles.
These Terms shall be governed by and construed in accordance with the laws of the State of California, United States, excluding conflict of law rules.
Any dispute arising from these Terms shall first be resolved through good-faith negotiation. If unresolved, disputes shall be settled in the **state or federal courts located in Los Angeles County, California**, and you consent to the personal jurisdiction of such courts.
In case of any dispute arising from the use of this App, both parties shall first resolve the matter through friendly negotiation. If negotiation fails, disputes shall be submitted to the competent courts in Los Angeles County, California, for resolution.
---
## 11. Modifications to Terms
We reserve the right to **update or modify these Terms at any time**. We will notify users of material changes via in-app notice, email, or prominent posting. Your continued use after the effective date constitutes acceptance of the revised Terms.
I reserve the right to revise and update these Terms of Service at any time. Material rule changes will be notified via in-app reminders or official contact email. Your continued use of the App after the update takes effect means you fully accept the revised Terms.
---
## 12. Contact Information
For questions, concerns, or notices regarding these Terms:
If you have questions, feedback or legal inquiries about these Terms, please contact:
- **Company Name:** Xunmee Technology (Shenzhen) Co., Ltd.
- **Contact Email:** xuyunlong@xunmee.com
- **Privacy Policy:** [Insert your Privacy Policy URL here]
- **Developer**: Individual Independent Developer
- **Contact Email**: ann@xumee.com
+9 -11
View File
@@ -1,25 +1,23 @@
# 关于我们
欢迎来到觅爻签问,这是一个借助于 AI 解读传统六爻占卜的平台,为用户了解中国传统易学文化提供一个窗口
欢迎使用 觅爻 MeeYao,一款依托 AI 技术、以传统六爻文化与易经智慧为核心的传统文化参考工具
六爻占卜源于《周易》深邃的哲学体系,是古人探索世界运行规律的一种独特方法。古人认为宇宙万物相互关联,在你起卦时,你的心念与时空信息会凝结成卦象的方式呈现出来。得到卦象后,再结合《易经》中的爻辞和某些特定规律,如五行生克、干支冲合等,分析各要素间的发展趋势,最终推断出事物可能的走向
六爻文化源自博大精深的易经哲学体系,承载着古人对于心念、时序与天地变化相生相融的传统认知。结合卦象文化、五行理论及干支传统人文理念,帮助用户探索东方传统文化内涵,获得多元的生活参考视角
觅爻签问就是基于这样的思路而开发出来的平台,它的核心价值在于帮助你跳出局限思维,从事物全局和演变趋势的角度看清现状的矛盾、潜在机会和风险点,为你的判断和行动提供多一个维度的参考信息,让你能更理性、更周全地做决定。我们希望 AI 能成为连接这份古老智慧的现代桥梁
觅爻 MeeYao 根植于东方传统文脉,核心初衷是帮助用户跳出固有思维局限,以更开阔的视角看待日常抉择与生活状态,保持理性平和的心态。我们希望借助现代 AI 技术,让大众更轻松地了解、感受与体验中华传统经典文化
---
## 公司信息
## 开发者信息
**开发者**洵觅科技(深圳)有限公司
**开发者**Ann Lee
**联系邮箱**xuyunlong@xunmee.com
**隐私政策**[隐私政策链接]
**联系邮箱**ann@xumee.com
---
## 免责声明
## 重要免责声明
所有卦象解读结果均由 AI 生成,仅娱乐和参考,不应用作商业、金融、医疗、法律或其他专业领域的决策依据。我们不对内容的准确性或可靠性做出保证,用户须对自己所做的任何决策承担全部责任
本 App 所有 AI 生成内容与文化解读资料,仅娱乐、文化赏析与个人参考使用。本应用不提供任何专业指导建议,包括但不限于商业、金融、投资、医疗、心理、法律、职业及人生决策等领域。所有生成内容不得作为事实依据或行动决策的唯一标准。开发者不对用户的个人选择、行为及衍生后果承担任何法律责任。请理性看待传统文化,理性使用本应用
© 2026 觅爻签问。保留所有权利
© 2026 Ann Lee 保留所有权利
+151 -13
View File
@@ -1,25 +1,163 @@
# 隐私政策
**注意:本文档正在更新中**
**最后更新日期**2026年4月27日
英文正式稿已更新完成,简体中文版本将在英文稿确认后进行翻译。
请参考英文版本:
- [English Version](../en/privacy_policy.md)
**生效日期**2026年4月27日
---
**最后更新日期**:待定
## 引言
**生效日期**:待定
尊敬的用户,欢迎使用 米爻 MeeYao(以下简称"本应用"),本应用由**个人开发者**("我")独立开发和运营。我致力于保护您的个人隐私,并遵守适用的美国联邦和州隐私法律,包括《加州消费者隐私法》(CCPA/CPRA)、《儿童在线隐私保护法》(COPPA)、CalOPPA 以及其他美国州隐私法规。
本隐私政策清晰说明:
- 我收集哪些个人信息
- 您的数据如何被使用、存储和共享
- 您在美国法规下的法定隐私权利
- 如何提交数据请求
本政策适用于本应用的所有用户。加州居民享有第5节规定的额外权利。
---
本文档将在英文隐私政策正式稿确认后,按照以下原则进行翻译:
## 1. 我收集的信息
1. 保持与英文版本结构一致
2. 使用标准法律术语
3. 保留专业术语(如 CCPA、CPRA 等)
4. 符合中国法律文书规范
我只收集为提供、维护和优化应用文化参考功能所需的数据。所有数据根据 CCPA/CPRA 分类为个人信息和敏感个人信息(SPI)。
如有疑问,请联系:xuyunlong@xunmee.com
### 1.1 您直接提供的信息
- **账户信息**:电子邮箱地址、验证码(账户注册和安全验证所需)
- **个人资料**:您自愿设置的昵称或显示名称
- **个人内容**:您输入的问题、文化解读记录和本地会话内容
- **支持信息**:您发送的反馈、咨询消息
### 1.2 自动收集的信息
当您使用本应用时,将收集有限的自动数据以确保正常运行:
- **设备信息**:设备型号、操作系统版本、唯一设备标识符、设备配置
- **技术数据**:IP 地址(用于粗略区域访问识别)、访问时间、崩溃日志和操作性能数据
- **使用数据**:功能使用记录、应用停留时长和应用内交互行为
---
## 2. 我如何使用您的信息
您的信息仅用于以下合法且有限的目的:
1. **提供核心功能**:处理您的输入内容,生成 AI 文化解读内容,记录本地使用记录。
2. **账户安全**:完成用户验证,防止异常登录,保护您的账户安全。
3. **产品优化**:分析匿名使用数据以修复错误、优化操作体验和提升产品性能。
4. **用户协助**:回复您的反馈,解决您的使用问题。
5. **服务提醒**:推送必要的系统通知和政策更新提醒。
6. **法律合规**:满足法定合规要求和官方平台审核规则。
未经您的明确同意,我**不会**将您的个人敏感内容用于商业广告或未经授权的营销。
---
## 3. 数据存储、保留与跨境传输
### 3.1 存储位置
通过本应用收集的用户数据可能存储于位于美国的第三方安全云服务器上。所有跨境数据传输均采用加密传输协议以确保数据安全。
### 3.2 保留期限
数据仅在必要时限内保留:
- **账户数据**:在您活跃使用期间保留,注销账户后合理清理。
- **个人内容记录**:在合理周期内保留,定期清理或匿名化。
- **设备和日志数据**:在有限期限后自动删除。
---
## 4. 信息共享与披露
### 4.1 个人信息的出售
我**不以任何形式出售、出租或交易您的个人信息**,绝不会为商业利益出售您的数据。
### 4.2 与第三方服务提供商共享
我只与应用运行所需的可信赖第三方服务提供商共享数据,并签署严格的数据保护限制:
- 云存储和服务器服务
- 应用运营分析、崩溃监控工具
- 苹果官方推送和系统服务能力
所有第三方均被禁止将您的数据用于独立的商业目的。
### 4.3 法律披露
仅在以下情况下您的数据可能被披露:
- 法律、法规、法院命令或官方政府要求所规定
- 经您明确自愿授权和同意
- 为保护个人合法权益和公共安全
---
## 5. 您的美国隐私权利(包括加州居民)
根据 CCPA/CPRA 和美国地方隐私法律,您享有以下权利:
1. **知情权**:查询收集的个人数据类型和范围。
2. **访问权**:获取您的个人使用数据副本。
3. **删除权**:申请删除您的账户及相关个人数据。
4. **更正权**:修改不正确的个人信息。
5. **数据携带权**:以可读格式获取您的数据。
6. **选择退出权**:拒绝非必要数据收集和无关推荐。
7. **限制敏感数据权**:限制使用您的个人敏感内容。
8. **不受歧视权**:行使隐私权利不受差别待遇。
### 如何行使您的权利
您可以通过唯一指定联系方式提交数据请求:
- **联系邮箱**ann@xumee.com
我将在 45 天内回复您的合法请求,并在处理前妥善验证您的身份以确保数据安全。
---
## 6. 儿童隐私(COPPA 合规)
本应用不面向 13 岁以下用户。我不会故意收集 13 岁以下未成年人的任何个人信息。
如果您发现未成年人信息被不当收集,请及时通过邮箱联系我,我将按照 COPPA 法规完全删除相关数据。13-17 岁用户需在监护人监督和同意下使用本应用。
---
## 7. 数据安全
我采取行业标准的技术保护措施保护您的数据:
- 加密存储和加密传输以防止数据泄露
- 严格的访问限制和日常安全管理
- 定期异常监控和风险检查
请注意,没有任何网络存储系统能实现绝对安全,我将始终保持最高级别的数据保护措施。
---
## 8. 政策变更
本隐私政策可能会不定期更新以适应平台规则和法律调整。重要内容变更将通过应用内提示或邮件提醒提前通知。更新生效后您继续使用本应用,即表示您同意修订后的政策。
---
## 9. 联系我们
如果您对本隐私政策有任何疑问、建议或隐私相关投诉,请联系我:
**开发者邮箱**ann@xumee.com
如果您是加州居民且对处理结果不满意,可咨询当地隐私监管机构。
---
**独立个人开发者**
**最后更新日期**2026年4月27日
+73 -49
View File
@@ -1,97 +1,121 @@
# 服务条款(美国合规版本)
# 用户服务条款
**最后更新日期**2026 年 4 月 15
**最后更新日期**2026年4月27
## 1. 接受条款
---
觅爻签问(以下简称"本 APP")由**洵觅科技(深圳)有限公司**(以下简称"我们"、"我们公司"或"我们的")开发、运营和维护。
## 1. 条款接受
通过下载、安装、注册、访问或使用本 APP,您(以下简称"您"或"用户")确认您已阅读、理解并**无条件同意**受这些服务条款(以下简称"条款")和我们的**隐私政策**约束。如果您不同意,您不得使用本 APP
米爻 MeeYao(以下简称"本应用")由**个人开发者**("我")独立开发、拥有和运营
下载、安装、注册、访问或使用本应用,即表示您("您"或"用户")确认已阅读、理解并无条件同意受本服务条款("条款")及我的隐私政策约束。如果您不同意本条款,请勿使用本应用。
---
## 2. 年龄要求与 COPPA 合规
您声明并保证您使用本 APP 时**年满 13 周岁**
您声明并保证您年满 13 岁方可使用本应用
- APP**不适用于 13 岁以下儿童**
-不会故意收集 13 岁以下用户的个人信息。如果我们发现 13 岁以下儿童向我们提供了个人数据,我将立即删除此类信息。
-应用不面向 13 岁以下儿童。
- 我不会故意收集 13 岁以下用户的个人信息。如发现 13 岁以下未成年人提交了个人数据,我将立即采取行动删除该信息。
---
## 3. 服务说明
APP 提供**AI 辅助六爻占卜解读服务**(包括手动和自动起卦流程),基于传统《易经》哲学
应用提供与传统易经和六爻文化相关的 AI 辅助文化解读内容,仅供日常参考和文化赏析
- 所有占卜结果和解读均为 **AI 生成,仅供娱乐和参考目的**
- 它们**不作为专业建议**(金融、法律、医疗、商业或其他)
-不保证任何 AI 生成内容的准确性、完整性或可靠性。
- 由于维护、技术故障不可抗力或第三方问题导致的临时服务中断不构成违反本条款。
- 所有 AI 生成内容和文化参考资料仅供娱乐和个人参考目的。
- 内容不得视为专业建议,包括但不限于金融、投资、法律、医疗、职业或商业决策
- 我不保证本应用内任何 AI 生成内容的准确性、完整性或实用性。
- 因系统维护、技术异常、网络故障不可抗力导致的临时服务中断不视为违反本条款。
---
## 4. 用户账户与数据隐私
-必须提供**真实、准确和完整的注册信息**并保持更新。
-有责任维护账户凭证的保密性,并对您账户下的所有活动负责。
-们按照我们的**隐私政策**收集和处理必要的个人信息,遵守适用的法律,包括**加州消费者隐私法案(CCPA/CPRA**
- 加州用户有权按照隐私政策规定访问、删除和选择不出售其个人数据
-应提供真实、准确和完整的注册信息并保持信息更新。
-对保护账户登录凭据和账户下进行的所有活动负责。
-严格按照公布的隐私政策收集和处理用户个人数据,并遵守适用的美国隐私法律,包括 CCPA/CPRA。
- 加州居民享有隐私政策规定的数据访问、删除和隐私权利
---
## 5. 知识产权
APP 内的所有内容——包括软件代码、文本、图像、音频、视频、商标、服务标志和设计——均为洵觅科技(深圳)有限公司的专有财产,受**美国版权法(DMCA**、商标法和国际约保护。
应用内的所有知识产权,包括但不限于程序代码、文字内容、图形设计、界面内容、标识和视觉元素,均为个人开发者独有,受美国版权法(DMCA)、商标法和国际知识产权公约保护。
您不得:
- 复制、修改、分发、传输、展示或创建本 APP 或其内容的衍生作品。
- 对本 APP 进行反向工程、反编译、反汇编或尝试提取源代码。
- 删除本 APP 上的任何版权、商标或专有通知
- 复制、修改、编辑、分发、复制或基于本应用及其内部内容创作衍生作品。
- 反向工程、反编译、反汇编、破解或试图获取本应用源代码。
- 删除、覆盖或更改本应用中的任何版权声明、专有标记和知识产权声明
---
## 6. 禁止的用户行为
您同意不:
您同意不
- 将本 APP 用于**非法、有害、欺诈或侵权活动**
- 发布或传非法、诽谤、淫秽、威胁或侵犯第三方权利的内容。
- 干扰或破坏本 APP 的服务器网络或安全措施
- 利用任何漏洞进行未授权访问商业使用。
- 对本 APP 的占卜结果做出虚假或误导性声明
- 将本应用用于非法、恶意、欺诈或侵权行为
- 发布或传非法、诽谤、淫秽、威胁、暴力或侵犯第三方的内容。
- 攻击、干扰或破坏本应用的运行环境、服务器网络稳定性
- 利用系统漏洞进行未授权访问商业牟利或不当使用。
- 夸大或虚假宣传应用内内容的功能效果和参考价值
我们保留权利**警告、限制、暂停或终止**违反这些规则的账户,无需事先通知,并可在适当情况下追究法律责任。
如您违反上述规定,我保留不经事先通知发出警告、限制功能、暂停或终止您账户的权利,并保留必要时追究法律责任的权利
---
## 7. 免责声明(美国标准)
APP 和所有服务均按**"原样"和"可用"**提供,不提供任何形式的明示或示保证——包括但不限于适销性、适用于特定用途或不侵权的暗示保证。
应用及所有应用功能按"现状"和"可用"基础提供,不提供任何形式的明示或示保证包括但不限于适销性、特定用途适用性和不侵犯第三方权利的默示保证。
不保证:
我不保证:
- APP 将不间断、安全、无错误或准确
- 本 APP 的结果将满足您的期望。
- AI 生成的内容可靠或适用于任何目的
-应用将连续、安全、无错误或不间断运行
- 所有生成的文化参考内容将完全符合您的期望。
- 本应用及其功能完全稳定、无病毒或无缺陷
---
## 8. 责任限制
在法律允许的最大范围内:
适用美国法律允许的最大范围内:
- 在任何情况下,洵觅科技、其董事、员工或关联公司均不对您使用本 APP 而产生的任何间接、偶然、特殊、后果性或惩罚性损害承担责任。
- 我们对与本 APP 相关的任何索赔的总累积责任不得超过您在过去 12 个月内向我们支付的总额(如有)
- 不对您使用本应用产生的任何间接、偶然、特殊、后果性或补偿性损害承担责任。
- 在任何情况下,我都不对因您的独立判断和个人决定引起的争议、损失或风险承担过度责任
- 作为免费个人开发应用,不存在付费交易关系;所有使用风险由用户自行承担。
---
## 9. 赔偿
您同意**赔偿并使洵觅科技免受损害**所有索赔、损害、损失费用(包括法律费用),这些索赔、损害、损失和费用源于
您同意赔偿并使个人开发者免受因以下原因产生的所有索赔、损害、损失费用和合理法律费用:
- 您违反这些条款。
- 使用滥用本 APP
- 您侵犯第三方权利
- 您违反本服务条款。
- 不当使用滥用或未经授权操作本应用
-发布的内容导致的第三方知识产权和法律权利侵犯。
---
## 10. 适用法律与争议解决
这些条款受**美国加利福尼亚州法律**管辖,不考虑其法律冲突则。
条款受美国加利福尼亚州法律管辖并据其解释,排除法律冲突则。
这些条款引起的任何争议应首先通过真诚协商解决。如果未解决,争议应在位于加利福尼亚州洛杉矶县的**州或联邦法院**解决,您同意此类法院的个人管辖权
使用本应用产生的任何争议,双方应首先通过友好协商解决。协商不成的,争议应提交加利福尼亚州洛杉矶县有管辖权的法院解决
## 11. 条款的修改
---
我们保留权利**随时更新或修改这些条款**。我们将通过应用内通知、电子邮件或突出发布通知用户新的重大变更。生效日期后您继续使用即构成接受修订后的条款。
## 11. 条款修改
## 12. 联系信息
我保留随时修订和更新本服务条款的权利。重大规则变更将通过应用内提醒或官方联系邮箱通知。更新生效后您继续使用本应用,即表示您完全接受修订后的条款。
如需有关这些条款的问题、担忧或通知:
---
- **公司名称**:洵觅科技(深圳)有限公司
- **联系邮箱**xuyunlong@xunmee.com
- **隐私政策**:[在此插入您的隐私政策 URL]
## 12. 联系方式
如果您对本条款有疑问、反馈或法律咨询,请联系:
- **开发者**:独立个人开发者
- **联系邮箱**ann@xumee.com
+9 -11
View File
@@ -1,25 +1,23 @@
# 關於我們
歡迎來到覓爻簽問,這是一個借助於 AI 解讀傳統六爻占卜的平台,為用戶了解中國傳統易學文化提供一個窗口
歡迎使用 觅爻 MeeYao,一款依託 AI 技術、以傳統六爻文化與易經智慧為核心的傳統文化參考工具
六爻占卜源於《周易》深邃的哲學體系,是古人探索世界運行規律的一種獨特方法。古人認為宇宙萬物相互關聯,在你起卦時,你的心念與時空信息會凝結成卦象的方式呈現出來。得到卦象後,再結合《易經》中的爻辭和某些特定規律,如五行生剋、干支冲合等,分析各要素間的發展趨勢,最終推斷出事物可能的走向
六爻文化源自博大精深的易經哲學體系,承載著古人對於心念、時序與天地變化相生相融的傳統認知。結合卦象文化、五行理論及干支傳統人文理念,幫助用戶探索東方傳統文化內涵,獲得多元的生活參考視角
覓爻簽問就是基於這樣的思路而開發出來的平台,它的核心價值在於幫助你跳出局限思維,從事物全局和演變趨勢的角度看清現狀的矛盾、潛在機會和風險點,為你的判斷和行動提供多一個維度的參考信息,讓你能更理性、更周全地做決定。我們希望 AI 能成為連接這份古老智慧的現代橋樑
觅爻 MeeYao 根植於東方傳統文脈,核心初衷是幫助用戶跳出固有思維局限,以更開闊的視角看待日常抉擇與生活狀態,保持理性平和的心態。我們希望借助現代 AI 技術,讓大眾更輕鬆地了解、感受與體驗中華傳統經典文化
---
## 公司信息
## 開發者信息
**開發者**洵覓科技(深圳)有限公司
**開發者**Ann Lee
**聯繫郵箱**xuyunlong@xunmee.com
**隱私政策**[隱私政策連結]
**聯繫郵箱**ann@xumee.com
---
## 免責聲明
## 重要免責聲明
所有卦象解讀結果均由 AI 生成,僅娛樂和參考,不應用作商業、金融、醫療、法律或其他專業領域的決策依據。我們不對內容的準確性或可靠性做出保證,用戶須對自己所做的任何決策承擔全部責任
本 App 所有 AI 生成內容與文化解讀資料,僅娛樂、文化賞析與個人參考使用。本應用不提供任何專業指導建議,包括但不限於商業、金融、投資、醫療、心理、法律、職業及人生決策等領域。所有生成內容不得作為事實依據或行動決策的唯一標準。開發者不對用戶的個人選擇、行為及衍生後果承擔任何法律責任。請理性看待傳統文化,理性使用本應用
© 2026 覓爻簽問。保留所有權利
© 2026 Ann Lee 保留所有權利
+151 -13
View File
@@ -1,25 +1,163 @@
# 隱私政策
**注意:本文檔正在更新中**
**最後更新日期**2026年4月27日
英文正式稿已更新完成,繁體中文版本將在英文稿確認後進行翻譯。
請參考英文版本:
- [English Version](../en/privacy_policy.md)
**生效日期**2026年4月27日
---
**最後更新日期**:待定
## 引言
**生效日期**:待定
尊敬的用戶,歡迎使用 米爻 MeeYao(以下簡稱「本應用」),本應用由**個人開發者**(「我」)獨立開發和運營。我致力於保護您的個人隱私,並遵守適用的美國聯邦和州隱私法律,包括《加州消費者隱私法》(CCPA/CPRA)、《兒童在線隱私保護法》(COPPA)、CalOPPA 以及其他美國州隱私法規。
本隱私政策清晰說明:
- 我收集哪些個人信息
- 您的數據如何被使用、存儲和共享
- 您在美國法規下的法定隱私權利
- 如何提交數據請求
本政策適用於本應用的所有用戶。加州居民享有第5節規定的額外權利。
---
本文檔將在英文隱私政策正式稿確認後,按照以下原則進行翻譯:
## 1. 我收集的信息
1. 保持與英文版本結構一致
2. 使用標準法律術語
3. 保留專業術語(如 CCPA、CPRA 等)
4. 符合繁體中文法律文書規範
我只收集為提供、維護和優化應用文化參考功能所需的數據。所有數據根據 CCPA/CPRA 分類為個人信息和敏感個人信息(SPI)。
如有疑問,請聯繫:xuyunlong@xunmee.com
### 1.1 您直接提供的信息
- **賬戶信息**:電子郵箱地址、驗證驗證碼(賬戶註冊和安全驗證所需)
- **個人資料**:您自願設置的暱稱或顯示名稱
- **個人內容**:您輸入的問題、文化解讀記錄和本地會話內容
- **支持信息**:您發送的反饋、諮詢消息
### 1.2 自動收集的信息
當您使用本應用時,將收集有限的自動數據以確保正常運行:
- **設備信息**:設備型號、操作系統版本、唯一設備標識符、設備配置
- **技術數據**:IP 地址(用於粗略區域訪問識別)、訪問時間、崩潰日誌和操作性能數據
- **使用數據**:功能使用記錄、應用停留時長和應用內交互行為
---
## 2. 我如何使用您的信息
您的信息僅用於以下合法且有限的目的:
1. **提供核心功能**:處理您的輸入內容,生成 AI 文化解讀內容,記錄本地使用記錄。
2. **賬戶安全**:完成用戶驗證,防止異常登錄,保護您的賬戶安全。
3. **產品優化**:分析匿名使用數據以修復錯誤、優化操作體驗和提升產品性能。
4. **用戶協助**:回覆您的反饋,解決您的使用問題。
5. **服務提醒**:推送必要的系統通知和政策更新提醒。
6. **法律合規**:滿足法定合規要求和官方平台審核規則。
未經您的明確同意,我**不會**將您的個人敏感內容用於商業廣告或未經授權的營銷。
---
## 3. 數據存儲、保留與跨境傳輸
### 3.1 存儲位置
通過本應用收集的用戶數據可能存儲於位於美國的第三方安全雲服務器上。所有跨境數據傳輸均採用加密傳輸協議以確保數據安全。
### 3.2 保留期限
數據僅在必要時限內保留:
- **賬戶數據**:在您活躍使用期間保留,註銷賬戶後合理清理。
- **個人內容記錄**:在合理週期內保留,定期清理或匿名化。
- **設備和日誌數據**:在有限期限後自動刪除。
---
## 4. 信息共享與披露
### 4.1 個人信息的出售
我**不以任何形式出售、出租或交易您的個人信息**,絕不會為商業利益出售您的數據。
### 4.2 與第三方服務提供商共享
我只與應用運行所需的可信賴第三方服務提供商共享數據,並簽署嚴格的數據保護限制:
- 雲存儲和服務器服務
- 應用運營分析、崩潰監控工具
- 蘋果官方推送和系統服務能力
所有第三方均被禁止將您的數據用於獨立的商業目的。
### 4.3 法律披露
僅在以下情況下您的數據可能被披露:
- 法律、法規、法院命令或官方政府要求所規定
- 經您明確自願授權和同意
- 為保護個人合法權益和公共安全
---
## 5. 您的美國隱私權利(包括加州居民)
根據 CCPA/CPRA 和美國地方隱私法律,您享有以下權利:
1. **知情權**:查詢收集的個人數據類型和範圍。
2. **訪問權**:獲取您的個人使用數據副本。
3. **刪除權**:申請刪除您的賬戶及相關個人數據。
4. **更正權**:修改不正確的個人信息。
5. **數據攜帶權**:以可讀格式獲取您的數據。
6. **選擇退出權**:拒絕非必要數據收集和無關推薦。
7. **限制敏感數據權**:限制使用您的個人敏感內容。
8. **不受歧視權**:行使隱私權利不受差別待遇。
### 如何行使您的權利
您可以通過唯一指定聯繫方式提交數據請求:
- **聯繫郵箱**ann@xumee.com
我將在 45 天內回覆您的合法請求,並在處理前妥善驗證您的身份以確保數據安全。
---
## 6. 兒童隱私(COPPA 合規)
本應用不面向 13 歲以下用戶。我不會故意收集 13 歲以下未成年人的任何個人信息。
如果您發現未成年人信息被不當收集,請及時通過郵箱聯繫我,我將按照 COPPA 法規完全刪除相關數據。13-17 歲用戶需在監護人監督和同意下使用本應用。
---
## 7. 數據安全
我採取行業標準的技術保護措施保護您的數據:
- 加密存儲和加密傳輸以防止數據洩露
- 嚴格的訪問限制和日常安全管理
- 定期異常監控和風險檢查
請注意,沒有任何網絡存儲系統能實現絕對安全,我將始終保持最高級別的數據保護措施。
---
## 8. 政策變更
本隱私政策可能會不定期更新以適應平台規則和法律調整。重要內容變更將通過應用內提示或郵件提醒提前通知。更新生效後您繼續使用本應用,即表示您同意修訂後的政策。
---
## 9. 聯繫我們
如果您對本隱私政策有任何疑問、建議或隱私相關投訴,請聯繫我:
**開發者郵箱**ann@xumee.com
如果您是加州居民且對處理結果不滿意,可諮詢當地隱私監管機構。
---
**獨立個人開發者**
**最後更新日期**2026年4月27日
+74 -50
View File
@@ -1,97 +1,121 @@
# 服務條款(美國合規版本)
# 用戶服務條款
**最後更新日期**2026 年 4 月 15
**最後更新日期**2026年4月27
## 1. 接受條款
---
覓爻簽問(以下簡稱"本 APP")由**洵覓科技(深圳)有限公司**(以下簡稱"我們"、"我們公司"或"我們的")開發、運營和維護。
## 1. 條款接受
通過下載、安裝、註冊、訪問或使用本 APP,您(以下簡稱"您"或"用戶")確認您已閱讀、理解並**無條件同意**受這些服務條款(以下簡稱"條款")和我們的**隱私政策**約束。如果您不同意,您不得使用本 APP
米爻 MeeYao(以下簡稱「本應用」)由**個人開發者**(「我」)獨立開發、擁有和運營
下載、安裝、註冊、訪問或使用本應用,即表示您(「您」或「用戶」)確認已閱讀、理解並無條件同意受本服務條款(「條款」)及我的隱私政策約束。如果您不同意本條款,請勿使用本應用。
---
## 2. 年齡要求與 COPPA 合規
您聲明並保證您使用本 APP 時**年滿 13 週歲**
您聲明並保證您年滿 13 歲方可使用本應用
- APP**不適用於 13 歲以下兒童**
-不會故意收集 13 歲以下用戶的個人信息。如果我們發現 13 歲以下兒童向我們提供了個人數據,我將立即刪除此類信息。
-應用不面向 13 歲以下兒童。
- 我不會故意收集 13 歲以下用戶的個人信息。如發現 13 歲以下未成年人提交了個人數據,我將立即採取行動刪除該信息。
---
## 3. 服務說明
APP 提供**AI 輔助六爻占卜解讀服務**(包括手動和自動起卦流程),基於傳統《易經》哲學
應用提供與傳統易經和六爻文化相關的 AI 輔助文化解讀內容,僅供日常參考和文化賞析
- 所有占卜結果和解讀均為 **AI 生成,僅供娛樂和參考目的**
- 它們**不作為專業建議**(金融、法律、醫療、商業或其他)
-不保證任何 AI 生成內容的準確性、完整性或可靠性。
- 由於維護、技術故障不可抗力或第三方問題導致的臨時服務中斷不構成違反本條款。
- 所有 AI 生成內容和文化參考資料僅供娛樂和個人參考目的。
- 內容不得視為專業建議,包括但不限於金融、投資、法律、醫療、職業或商業決策
- 我不保證本應用內任何 AI 生成內容的準確性、完整性或實用性。
- 因系統維護、技術異常、網絡故障不可抗力導致的臨時服務中斷不視為違反本條款。
## 4. 用戶帳戶與數據隱私
---
- 您必須提供**真實、準確和完整的註冊信息**並保持更新。
- 您有責任維護帳戶憑證的保密性,並對您帳戶下的所有活動負責。
- 我們按照我們的**隱私政策**收集和處理必要的個人信息,遵守適用的法律,包括**加州消費者隱私法案(CCPA/CPRA**
- 加州用戶有權按照隱私政策的規定訪問、刪除和選擇不出售其個人數據
## 4. 用戶賬戶與數據隱私
- 您應提供真實、準確和完整的註冊信息,並保持信息更新
- 您對保護賬戶登錄憑據和賬戶下進行的所有活動負全責
- 我嚴格按照公布的隱私政策收集和處理用戶個人數據,並遵守適用的美國隱私法律,包括 CCPA/CPRA。
- 加州居民享有隱私政策中規定的數據訪問、刪除和隱私權利。
---
## 5. 知識產權
APP 內的所有內容——包括軟體代碼、文本、圖像、音頻、視頻、商標、服務標誌和設計——均為洵覓科技(深圳)有限公司的專有財產,受**美國版權法(DMCA**、商標法和國際約保護。
應用內的所有知識產權,包括但不限於程序代碼、文字內容、圖形設計、界面內容、標識和視覺元素,均為個人開發者獨有,受美國版權法(DMCA)、商標法和國際知識產權公約保護。
您不得:
- 複製、修改、分發、傳輸、展示或創建本 APP 或其內容的衍生作品。
- 對本 APP 進行反向工程、反編譯、反彙編或嘗試提取源代碼。
- 刪除本 APP 上的任何版權、商標或專有通知
- 複製、修改、編輯、分發、複製或基於本應用及其內部內容創作衍生作品。
- 反向工程、反編譯、反彙編、破解或試圖獲取本應用源代碼。
- 刪除、覆蓋或更改本應用中的任何版權聲明、專有標記和知識產權聲明
---
## 6. 禁止的用戶行為
您同意不:
您同意不
- 將本 APP 用於**非法、有害、欺詐或侵權活動**
- 發布或傳非法、誹謗、淫穢、威脅或侵犯第三方權利的內容。
- 干擾或破壞本 APP 的伺服器、網路或安全措施
- 利用任何漏洞進行未授權訪問商業使用。
- 對本 APP 的占卜結果做出虛假或誤導性聲明
- 將本應用用於非法、惡意、欺詐或侵權行為
- 發布或傳非法、誹謗、淫穢、威脅、暴力或侵犯第三方的內容。
- 攻擊、干擾或破壞本應用的運行環境、服務器和網絡穩定性
- 利用系統漏洞進行未授權訪問商業牟利或不當使用。
- 誇大或虛假宣傳應用內內容的功能效果和參考價值
我們保留權利**警告、限制、暫停或終止**違反這些規則的帳戶,無需事先通知,並可在適當情況下追究法律責任。
如您違反上述規定,我保留不經事先通知發出警告、限制功能、暫停或終止您賬戶的權利,並保留必要時追究法律責任的權利
---
## 7. 免責聲明(美國標準)
APP 和所有服務均按**"原樣"和"可用"**提供,不提供任何形式的明示或示保證——包括但不限於適銷性、適用於特定用途或不侵權的暗示保證。
應用及所有應用功能按「現狀」和「可用」基礎提供,不提供任何形式的明示或示保證包括但不限於適銷性、特定用途適用性和不侵犯第三方權利的默示保證。
不保證:
我不保證:
- APP 將不間斷、安全、無錯誤或準確
- 本 APP 的結果將滿足您的期望。
- AI 生成內容可靠或適用於任何目的
-應用將連續、安全、無錯誤或不間斷運行
- 所有生成的文化參考內容將完全符合您的期望。
- 本應用及其功能完全穩定、無病毒或無缺陷
---
## 8. 責任限制
在法律允許的最大範圍內:
適用美國法律允許的最大範圍內:
- 在任何情況下,洵覓科技、其董事、員工或關聯公司均不對您使用本 APP 而產生的任何間接、偶然、特殊、後果性或懲罰性損害承擔責任。
- 我們對與本 APP 相關的任何索賠的總累積責任不得超過您在過去 12 個月內向我們支付的總額(如有)
- 不對您使用本應用產生的任何間接、偶然、特殊、後果性或補償性損害承擔責任。
- 在任何情況下,我都不對因您的獨立判斷和個人決定引起的爭議、損失或風險承擔過度責任
- 作為免費個人開發應用,不存在付費交易關係;所有使用風險由用戶自行承擔。
---
## 9. 賠償
您同意**賠償並使洵覓科技免受損害**所有索賠、損害、損失費用(包括法律費用),這些索賠、損害、損失和費用源於
您同意賠償並使個人開發者免受因以下原因產生的所有索賠、損害、損失費用和合理法律費用:
- 您違反這些條款。
- 使用濫用本 APP
- 您侵犯第三方權利
- 您違反本服務條款。
- 不當使用濫用或未經授權操作本應用
-發布的內容導致的第三方知識產權和法律權利侵犯。
---
## 10. 適用法律與爭議解決
這些條款受**美國加利福尼亞州法律**管轄,不考慮其法律衝突則。
條款受美國加利福尼亞州法律管轄並據其解釋,排除法律衝突則。
這些條款引起的任何爭議應首先通過誠信協商解決。如果未解決,爭議應在位於加利福尼亞州洛杉磯縣的**州或聯邦法院**解決,您同意此類法院的個人管轄權
使用本應用產生的任何爭議,雙方應首先通過友好協商解決。協商不成的,爭議應提交加利福尼亞州洛杉磯縣有管轄權的法院解決
## 11. 條款的修改
---
我們保留權利**隨時更新或修改這些條款**。我們將通過應用內通知、電子郵件或突出發布通知用戶新的重大變更。生效日期後您繼續使用即構成接受修訂後的條款。
## 11. 條款修改
## 12. 聯繫信息
我保留隨時修訂和更新本服務條款的權利。重大規則變更將通過應用內提醒或官方聯繫郵箱通知。更新生效後您繼續使用本應用,即表示您完全接受修訂後的條款。
如需有關這些條款的問題、擔憂或通知:
---
- **公司名稱**:洵覓科技(深圳)有限公司
- **聯繫郵箱**xuyunlong@xunmee.com
- **隱私政策**:[在此插入您的隱私政策 URL]
## 12. 聯繫方式
如果您對本條款有疑問、反饋或法律諮詢,請聯繫:
- **開發者**:獨立個人開發者
- **聯繫郵箱**ann@xumee.com
+1 -1
View File
@@ -7,7 +7,7 @@
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Meeyao Qianwen</string>
<string>Meeyao</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
@@ -0,0 +1,4 @@
CFBundleDisplayName = "Meeyao";
NSPhotoLibraryUsageDescription = "Access your photo library to select and upload an avatar";
NSPhotoLibraryAddUsageDescription = "Save avatar processing results to your photo library";
NSMicrophoneUsageDescription = "Microphone access is required for voice follow-up questions";
@@ -0,0 +1,4 @@
CFBundleDisplayName = "觅爻";
NSPhotoLibraryUsageDescription = "需要访问您的相册以选择并上传头像";
NSPhotoLibraryAddUsageDescription = "需要将头像处理结果保存到您的相册";
NSMicrophoneUsageDescription = "需要麦克风权限用于语音追问";
@@ -0,0 +1,4 @@
CFBundleDisplayName = "覓爻";
NSPhotoLibraryUsageDescription = "需要存取您的相簿以選擇並上傳頭像";
NSPhotoLibraryAddUsageDescription = "需要將頭像處理結果儲存到您的相簿";
NSMicrophoneUsageDescription = "需要麥克風權限用於語音追問";
@@ -93,6 +93,7 @@ class DivinationApi {
advice: _asStringList(agentOutputRaw['advice']),
keywords: _asStringList(agentOutputRaw['keywords']),
answer: _asString(agentOutputRaw['answer']),
status: _parseStatus(agentOutputRaw['status']),
);
records.add(aggregate.toViewData(params));
} catch (error, stackTrace) {
@@ -479,6 +480,18 @@ List<String> _asStringList(Object? value) {
return value.whereType<String>().toList(growable: false);
}
DivinationRunStatus _parseStatus(Object? value) {
if (value is! String) {
return DivinationRunStatus.success;
}
return switch (value) {
'success' => DivinationRunStatus.success,
'failed' => DivinationRunStatus.failed,
'refused' => DivinationRunStatus.refused,
_ => DivinationRunStatus.success,
};
}
String _yaoTypeToText(YaoType type) {
return switch (type) {
YaoType.youngYang => '少阳',
@@ -60,6 +60,7 @@ class DivinationRunAggregate {
required this.advice,
required this.keywords,
required this.answer,
this.status = DivinationRunStatus.success,
});
final DerivedDivinationData derived;
@@ -70,6 +71,7 @@ class DivinationRunAggregate {
final List<String> advice;
final List<String> keywords;
final String answer;
final DivinationRunStatus status;
DivinationResultData toViewData(DivinationParams params) {
return DivinationResultData(
@@ -84,9 +86,9 @@ class DivinationRunAggregate {
signType: signLevel,
keywords: keywords.join(''),
focusPoints: focusPoints,
conclusion: _asBullet(conclusion),
conclusion: conclusion.join('\n'),
analysis: answer,
suggestion: _asBullet(advice),
suggestion: advice.join('\n'),
ganzhi: GanzhiData(
yearGanZhi: derived.ganzhi.yearGanZhi,
monthGanZhi: derived.ganzhi.monthGanZhi,
@@ -108,19 +110,9 @@ class DivinationRunAggregate {
targetYaoLines: derived.targetYaoInfoList
.map((line) => line.toViewModel())
.toList(growable: false),
status: status,
);
}
String _asBullet(List<String> lines) {
if (lines.isEmpty) {
return '';
}
return List<String>.generate(
lines.length,
(i) => '${i + 1}. ${lines[i]}',
growable: false,
).join('\n');
}
}
class DerivedDivinationData {
@@ -1,5 +1,7 @@
import 'divination_params.dart';
enum DivinationRunStatus { success, failed, refused }
class DivinationResultData {
const DivinationResultData({
this.threadId,
@@ -20,6 +22,7 @@ class DivinationResultData {
required this.wuXingStatus,
required this.yaoLines,
required this.targetYaoLines,
this.status = DivinationRunStatus.success,
});
final DivinationParams params;
@@ -40,8 +43,10 @@ class DivinationResultData {
final Map<String, String> wuXingStatus;
final List<YaoLineData> yaoLines;
final List<YaoLineData> targetYaoLines;
final DivinationRunStatus status;
bool get hasChangingYao => binaryCode != changedBinaryCode;
bool get isSuccess => status == DivinationRunStatus.success;
Map<String, dynamic> toJson() {
return <String, dynamic>{
@@ -65,6 +70,7 @@ class DivinationResultData {
'targetYaoLines': targetYaoLines
.map((line) => line.toJson())
.toList(growable: false),
'status': status.name,
};
}
@@ -117,8 +123,21 @@ class DivinationResultData {
return YaoLineData.fromJson(raw);
})
.toList(growable: false),
status: _parseStatus(json['status']),
);
}
static DivinationRunStatus _parseStatus(Object? value) {
if (value is! String) {
return DivinationRunStatus.success;
}
return switch (value) {
'success' => DivinationRunStatus.success,
'failed' => DivinationRunStatus.failed,
'refused' => DivinationRunStatus.refused,
_ => DivinationRunStatus.success,
};
}
}
List<String> _requiredStringList(Map<String, dynamic> json, String key) {
@@ -5,6 +5,7 @@ import '../../../../core/network/api_problem.dart';
import '../apis/divination_api.dart';
import '../models/divination_backend_models.dart';
import '../models/divination_params.dart';
import '../models/divination_result.dart';
class DivinationRunService {
const DivinationRunService({required DivinationApi api}) : _api = api;
@@ -38,6 +39,7 @@ class DivinationRunService {
List<String> advice = const <String>[];
List<String> keywords = const <String>[];
String answer = '';
DivinationRunStatus status = DivinationRunStatus.success;
await for (final event in _api.streamEvents(
threadId: threadId,
@@ -68,6 +70,7 @@ class DivinationRunService {
advice = _requiredStringList(event, 'advice');
keywords = _requiredStringList(event, 'keywords');
answer = _requiredString(event, 'answer');
status = _parseStatus(event['status']);
onTextMessageEnd?.call();
continue;
}
@@ -111,9 +114,22 @@ class DivinationRunService {
advice: advice,
keywords: keywords,
answer: answer,
status: status,
);
}
DivinationRunStatus _parseStatus(Object? value) {
if (value is! String) {
return DivinationRunStatus.success;
}
return switch (value) {
'success' => DivinationRunStatus.success,
'failed' => DivinationRunStatus.failed,
'refused' => DivinationRunStatus.refused,
_ => DivinationRunStatus.success,
};
}
String _requiredString(Map<String, dynamic> json, String key) {
final value = json[key];
if (value is! String || value.isEmpty) {
@@ -207,8 +207,6 @@ class _DivinationResultScreenState extends State<DivinationResultScreen> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_ResultHeader(data: widget.data),
const SizedBox(height: AppSpacing.md),
_SignCard(
key: _finalSignCardKey,
signType: widget.data.signType,
@@ -221,17 +219,17 @@ class _DivinationResultScreenState extends State<DivinationResultScreen> {
content: widget.data.conclusion,
),
const SizedBox(height: AppSpacing.md),
_FocusPointsCard(points: widget.data.focusPoints),
_AnalysisCard(
title: l10n.resultSuggestion,
content: widget.data.suggestion,
),
const SizedBox(height: AppSpacing.md),
_AnalysisCard(
title: l10n.resultAnalysis,
content: widget.data.analysis,
),
const SizedBox(height: AppSpacing.md),
_AnalysisCard(
title: l10n.resultSuggestion,
content: widget.data.suggestion,
),
_FocusPointsCard(points: widget.data.focusPoints),
const SizedBox(height: AppSpacing.md),
Container(
width: double.infinity,
@@ -270,6 +268,7 @@ class _DivinationResultScreenState extends State<DivinationResultScreen> {
),
const SizedBox(height: AppSpacing.md),
_InfoCard(data: widget.data),
if (widget.data.isSuccess) ...[
const SizedBox(height: AppSpacing.xl),
Text(
l10n.resultHexagramDetail,
@@ -277,6 +276,8 @@ class _DivinationResultScreenState extends State<DivinationResultScreen> {
),
const SizedBox(height: AppSpacing.md),
_HexagramDetailCard(data: widget.data),
] else
_HexagramDetailPlaceholder(status: widget.data.status),
],
),
),
@@ -412,27 +413,6 @@ class _DivinationResultScreenState extends State<DivinationResultScreen> {
}
}
class _ResultHeader extends StatelessWidget {
const _ResultHeader({required this.data});
final DivinationResultData data;
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
return Row(
children: [
Text(
l10n.resultAIAnalysis,
style: Theme.of(
context,
).textTheme.titleLarge?.copyWith(fontWeight: FontWeight.w700),
),
],
);
}
}
class _SignCard extends StatelessWidget {
const _SignCard({super.key, required this.signType});
@@ -543,8 +523,7 @@ class _FocusPointsCard extends StatelessWidget {
Widget build(BuildContext context) {
final colors = Theme.of(context).colorScheme;
final l10n = AppLocalizations.of(context)!;
final languageCode = Localizations.localeOf(context).languageCode;
final title = languageCode == 'en' ? 'Focus Points' : '断卦要点';
final title = l10n.resultFocusPoints;
if (points.isEmpty) {
return const SizedBox.shrink();
}
@@ -572,11 +551,7 @@ class _FocusPointsCard extends StatelessWidget {
const Spacer(),
TextButton(
onPressed: () {
final content = points
.asMap()
.entries
.map((e) => '${e.key + 1}. ${e.value}')
.join('\n');
final content = points.join('\n');
Clipboard.setData(ClipboardData(text: content));
Toast.show(
context,
@@ -589,28 +564,12 @@ class _FocusPointsCard extends StatelessWidget {
],
),
const SizedBox(height: AppSpacing.sm),
...List<Widget>.generate(points.length, (index) {
...points.map((point) {
return Padding(
padding: const EdgeInsets.only(bottom: AppSpacing.xs),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'${index + 1}. ',
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
color: colors.primary,
fontWeight: FontWeight.w700,
),
),
Expanded(
child: Text(
points[index],
style: Theme.of(
context,
).textTheme.bodyMedium?.copyWith(height: 1.55),
),
),
],
point,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(height: 1.55),
),
);
}),
@@ -781,6 +740,46 @@ class _InfoCard extends StatelessWidget {
}
}
class _HexagramDetailPlaceholder extends StatelessWidget {
const _HexagramDetailPlaceholder({required this.status});
final DivinationRunStatus status;
@override
Widget build(BuildContext context) {
final colors = Theme.of(context).colorScheme;
final l10n = AppLocalizations.of(context)!;
final message = switch (status) {
DivinationRunStatus.failed => l10n.resultHexagramDetailFailed,
DivinationRunStatus.refused => l10n.resultHexagramDetailRefused,
DivinationRunStatus.success => '',
};
return Padding(
padding: const EdgeInsets.only(top: AppSpacing.xl),
child: Card(
margin: EdgeInsets.zero,
color: colors.surfaceContainerHighest,
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(AppRadius.md),
),
child: Padding(
padding: const EdgeInsets.all(AppSpacing.xl),
child: Center(
child: Text(
message,
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
color: colors.onSurfaceVariant,
),
),
),
),
),
);
}
}
class _HexagramDetailCard extends StatelessWidget {
const _HexagramDetailCard({required this.data});
+24 -4
View File
@@ -382,9 +382,9 @@
"processingCardGenQuote": "Stillness at the proper time keeps one centered and steady in place.",
"processingCardKunTitle": "Kun • The Receptive Earth",
"processingCardKunQuote": "The Earth's condition is devoted receptivity; the noble one carries all with broad virtue.",
"ganZhiInfo": "干支信息",
"wuXingWangShuai": "五行旺衰",
"ganZhiKongWang": "空亡信息",
"ganZhiInfo": "Stem-Branch",
"wuXingWangShuai": "Five Elements",
"ganZhiKongWang": "Void",
"resultPillarColumn": "四柱",
"resultYearPillar": "年柱",
"resultMonthPillar": "月柱",
@@ -553,5 +553,25 @@
}
}
},
"retry": "Retry"
"retry": "Retry",
"resultFocusPoints": "Focus Points",
"wuXingMu": "Wood",
"wuXingHuo": "Fire",
"wuXingTu": "Earth",
"wuXingJin": "Metal",
"wuXingShui": "Water",
"wuXingWang": "Prosperous",
"wuXingXiang": "Strong",
"wuXingXiu": "Resting",
"wuXingQiu": "Imprisoned",
"wuXingSi": "Dead",
"yaoLegendTitle": "Symbol Guide",
"yaoColSpirit": "Spirit",
"yaoColRelation": "Relation",
"yaoColBranch": "Branch",
"yaoColElement": "Element",
"yaoColChange": "Chg",
"yaoColMark": "Mark",
"resultHexagramDetailFailed": "Interpretation failed. Hexagram details are unavailable.",
"resultHexagramDetailRefused": "Interpretation not supported. Please adjust your question and try again."
}
+120
View File
@@ -2558,6 +2558,126 @@ abstract class AppLocalizations {
/// In zh, this message translates to:
/// **'重试'**
String get retry;
/// No description provided for @resultFocusPoints.
///
/// In zh, this message translates to:
/// **'断卦要点'**
String get resultFocusPoints;
/// No description provided for @wuXingMu.
///
/// In zh, this message translates to:
/// **'木'**
String get wuXingMu;
/// No description provided for @wuXingHuo.
///
/// In zh, this message translates to:
/// **'火'**
String get wuXingHuo;
/// No description provided for @wuXingTu.
///
/// In zh, this message translates to:
/// **'土'**
String get wuXingTu;
/// No description provided for @wuXingJin.
///
/// In zh, this message translates to:
/// **'金'**
String get wuXingJin;
/// No description provided for @wuXingShui.
///
/// In zh, this message translates to:
/// **'水'**
String get wuXingShui;
/// No description provided for @wuXingWang.
///
/// In zh, this message translates to:
/// **'旺'**
String get wuXingWang;
/// No description provided for @wuXingXiang.
///
/// In zh, this message translates to:
/// **'相'**
String get wuXingXiang;
/// No description provided for @wuXingXiu.
///
/// In zh, this message translates to:
/// **'休'**
String get wuXingXiu;
/// No description provided for @wuXingQiu.
///
/// In zh, this message translates to:
/// **'囚'**
String get wuXingQiu;
/// No description provided for @wuXingSi.
///
/// In zh, this message translates to:
/// **'死'**
String get wuXingSi;
/// No description provided for @yaoLegendTitle.
///
/// In zh, this message translates to:
/// **'符号对照'**
String get yaoLegendTitle;
/// No description provided for @yaoColSpirit.
///
/// In zh, this message translates to:
/// **'六神'**
String get yaoColSpirit;
/// No description provided for @yaoColRelation.
///
/// In zh, this message translates to:
/// **'六亲'**
String get yaoColRelation;
/// No description provided for @yaoColBranch.
///
/// In zh, this message translates to:
/// **'地支'**
String get yaoColBranch;
/// No description provided for @yaoColElement.
///
/// In zh, this message translates to:
/// **'五行'**
String get yaoColElement;
/// No description provided for @yaoColChange.
///
/// In zh, this message translates to:
/// **'动'**
String get yaoColChange;
/// No description provided for @yaoColMark.
///
/// In zh, this message translates to:
/// **'标'**
String get yaoColMark;
/// No description provided for @resultHexagramDetailFailed.
///
/// In zh, this message translates to:
/// **'解卦失败,卦象详情暂不可用'**
String get resultHexagramDetailFailed;
/// No description provided for @resultHexagramDetailRefused.
///
/// In zh, this message translates to:
/// **'暂不支持解卦,请调整问题后重试'**
String get resultHexagramDetailRefused;
}
class _AppLocalizationsDelegate
+65 -3
View File
@@ -980,13 +980,13 @@ class AppLocalizationsEn extends AppLocalizations {
'The Earth\'s condition is devoted receptivity; the noble one carries all with broad virtue.';
@override
String get ganZhiInfo => '干支信息';
String get ganZhiInfo => 'Stem-Branch';
@override
String get wuXingWangShuai => '五行旺衰';
String get wuXingWangShuai => 'Five Elements';
@override
String get ganZhiKongWang => '空亡信息';
String get ganZhiKongWang => 'Void';
@override
String get resultPillarColumn => '四柱';
@@ -1353,4 +1353,66 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get retry => 'Retry';
@override
String get resultFocusPoints => 'Focus Points';
@override
String get wuXingMu => 'Wood';
@override
String get wuXingHuo => 'Fire';
@override
String get wuXingTu => 'Earth';
@override
String get wuXingJin => 'Metal';
@override
String get wuXingShui => 'Water';
@override
String get wuXingWang => 'Prosperous';
@override
String get wuXingXiang => 'Strong';
@override
String get wuXingXiu => 'Resting';
@override
String get wuXingQiu => 'Imprisoned';
@override
String get wuXingSi => 'Dead';
@override
String get yaoLegendTitle => 'Symbol Guide';
@override
String get yaoColSpirit => 'Spirit';
@override
String get yaoColRelation => 'Relation';
@override
String get yaoColBranch => 'Branch';
@override
String get yaoColElement => 'Element';
@override
String get yaoColChange => 'Chg';
@override
String get yaoColMark => 'Mark';
@override
String get resultHexagramDetailFailed =>
'Interpretation failed. Hexagram details are unavailable.';
@override
String get resultHexagramDetailRefused =>
'Interpretation not supported. Please adjust your question and try again.';
}
+120
View File
@@ -1294,6 +1294,66 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get retry => '重试';
@override
String get resultFocusPoints => '断卦要点';
@override
String get wuXingMu => '';
@override
String get wuXingHuo => '';
@override
String get wuXingTu => '';
@override
String get wuXingJin => '';
@override
String get wuXingShui => '';
@override
String get wuXingWang => '';
@override
String get wuXingXiang => '';
@override
String get wuXingXiu => '';
@override
String get wuXingQiu => '';
@override
String get wuXingSi => '';
@override
String get yaoLegendTitle => '符号对照';
@override
String get yaoColSpirit => '六神';
@override
String get yaoColRelation => '六亲';
@override
String get yaoColBranch => '地支';
@override
String get yaoColElement => '五行';
@override
String get yaoColChange => '';
@override
String get yaoColMark => '';
@override
String get resultHexagramDetailFailed => '解卦失败,卦象详情暂不可用';
@override
String get resultHexagramDetailRefused => '暂不支持解卦,请调整问题后重试';
}
/// The translations for Chinese, using the Han script (`zh_Hant`).
@@ -2353,4 +2413,64 @@ class AppLocalizationsZhHant extends AppLocalizationsZh {
@override
String get retry => '重試';
@override
String get resultFocusPoints => '斷卦要點';
@override
String get wuXingMu => '';
@override
String get wuXingHuo => '';
@override
String get wuXingTu => '';
@override
String get wuXingJin => '';
@override
String get wuXingShui => '';
@override
String get wuXingWang => '';
@override
String get wuXingXiang => '';
@override
String get wuXingXiu => '';
@override
String get wuXingQiu => '';
@override
String get wuXingSi => '';
@override
String get yaoLegendTitle => '符號對照';
@override
String get yaoColSpirit => '六神';
@override
String get yaoColRelation => '六親';
@override
String get yaoColBranch => '地支';
@override
String get yaoColElement => '五行';
@override
String get yaoColChange => '';
@override
String get yaoColMark => '';
@override
String get resultHexagramDetailFailed => '解卦失敗,卦象詳情暫不可用';
@override
String get resultHexagramDetailRefused => '暫不支持解卦,請調整問題後重試';
}
+21 -1
View File
@@ -553,5 +553,25 @@
}
}
},
"retry": "重试"
"retry": "重试",
"resultFocusPoints": "断卦要点",
"wuXingMu": "木",
"wuXingHuo": "火",
"wuXingTu": "土",
"wuXingJin": "金",
"wuXingShui": "水",
"wuXingWang": "旺",
"wuXingXiang": "相",
"wuXingXiu": "休",
"wuXingQiu": "囚",
"wuXingSi": "死",
"yaoLegendTitle": "符号对照",
"yaoColSpirit": "六神",
"yaoColRelation": "六亲",
"yaoColBranch": "地支",
"yaoColElement": "五行",
"yaoColChange": "动",
"yaoColMark": "标",
"resultHexagramDetailFailed": "解卦失败,卦象详情暂不可用",
"resultHexagramDetailRefused": "暂不支持解卦,请调整问题后重试"
}
+15 -1
View File
@@ -436,5 +436,19 @@
"type": "int"
}
}
}
},
"wuXingWang": "旺",
"wuXingXiang": "相",
"wuXingXiu": "休",
"wuXingQiu": "囚",
"wuXingSi": "死",
"yaoLegendTitle": "符號對照",
"yaoColSpirit": "六神",
"yaoColRelation": "六親",
"yaoColBranch": "地支",
"yaoColElement": "五行",
"yaoColChange": "動",
"yaoColMark": "標",
"resultHexagramDetailFailed": "解卦失敗,卦象詳情暫不可用",
"resultHexagramDetailRefused": "暫不支持解卦,請調整問題後重試"
}
+7 -2
View File
@@ -13,7 +13,7 @@ from core.logging import get_logger
from schemas.agent.forwarded_props import RuntimeMode
from schemas.enums import AgentChatMessageRole, AgentChatSessionStatus
from schemas.agent.system_agent import AgentType
from schemas.agent.runtime_models import AgentOutput, FollowUpOutput, ToolAgentOutput
from schemas.agent.runtime_models import FollowUpOutput, PersistedAgentOutput, ToolAgentOutput
from schemas.agent.visibility import SystemVisibilityBit, bit_mask
from schemas.domain.chat_message import AgentChatMessageMetadata
from schemas.domain.chat_session import SessionStateSnapshot
@@ -107,6 +107,11 @@ class SqlAlchemyEventStore:
content_value = self._event_value(event, "answer")
content = content_value if isinstance(content_value, str) else ""
if not content:
self._logger.warning(
"text_message_end skipped: empty answer",
run_id=self._event_value(event, "runId"),
status=self._event_value(event, "status"),
)
return
input_tokens = self._to_int(self._event_value(event, "inputTokens"))
@@ -148,7 +153,7 @@ class SqlAlchemyEventStore:
return
if runtime_mode == RuntimeMode.CHAT.value:
worker_output = AgentOutput.model_validate(worker_output_payload)
worker_output = PersistedAgentOutput.model_validate(worker_output_payload)
else:
worker_output = FollowUpOutput.model_validate(worker_output_payload)
agent_type = AgentType.WORKER
@@ -2,6 +2,8 @@ from __future__ import annotations
from core.agentscope.prompts.sections import wrap_section
from core.agentscope.prompts.worker_rules import (
get_follow_up_output_rules,
get_follow_up_role_playing,
get_worker_output_rules,
get_worker_role_playing,
)
@@ -13,8 +15,13 @@ def build_agent_prompt(
agent_type: AgentType,
llm_config: SystemAgentLLMConfig | None = None,
language: str = "zh-CN",
runtime_mode: str = "chat",
) -> str:
_ = agent_type, llm_config
if runtime_mode == "follow_up":
role_playing = get_follow_up_role_playing(language)
output_rules = get_follow_up_output_rules(language)
else:
role_playing = get_worker_role_playing(language)
output_rules = get_worker_output_rules(language)
content = f"[role_playing]\n{role_playing}\n\n[output_json_rules]\n{output_rules}"
@@ -111,6 +111,7 @@ def build_system_prompt(
llm_config: SystemAgentLLMConfig | None = None,
tools: Sequence[Tool | dict[str, Any]] | None = None,
now_utc: datetime | None = None,
runtime_mode: str = "chat",
) -> str:
sections: list[str | None] = [
_build_time_context(now_utc=now_utc),
@@ -119,6 +120,7 @@ def build_system_prompt(
agent_type=agent_type,
llm_config=llm_config,
language=language,
runtime_mode=runtime_mode,
),
build_tools_prompt(tools=tools) if tools else None,
]
@@ -9,12 +9,14 @@ _LANGUAGE_INSTRUCTIONS = {
"CRITICAL: YOUR ENTIRE RESPONSE MUST BE IN ENGLISH\n"
"═══════════════════════════════════════════════════════════════════════════════\n"
"- ALL text in answer, conclusion, advice, focus_points, keywords MUST be English\n"
"- Translate ALL Chinese terminology to English\n"
"- The ONLY Chinese allowed is the sign_level enum value\n"
"- If you write Chinese sentences, you have FAILED this task\n"
"- Write in natural, idiomatic American English that any ordinary person can understand\n"
"- The ONLY Chinese characters allowed in your response:\n"
" * sign_level enum values (上上签 / 中上签 / 中下签 / 下下签)\n"
" * Hexagram name on first mention only (e.g. 风山渐)\n"
"- If you write Chinese sentences in your English response, you have FAILED this task\n"
"═══════════════════════════════════════════════════════════════════════════════",
"═══════════════════════════════════════════════════════════════════════════════\n"
"REMINDER: RESPOND IN ENGLISH. Translate all Chinese terms to English.\n"
"REMINDER: Respond in English. Minimize Chinese characters. Write for ordinary people.\n"
"═══════════════════════════════════════════════════════════════════════════════",
),
"zh-Hant": (
@@ -42,7 +44,11 @@ _SCOPE_INSTRUCTIONS = {
"2. Question asks for Tarot, Ba Zi, Zi Wei, astrology, or other methods\n"
"3. Question is about non-divination topics (programming, weather, etc.)\n"
"\n"
"WHEN REFUSING: Set status=\"refused\" in your response JSON."
"WHEN REFUSING:\n"
"- Set status=\"refused\"\n"
"- Set sign_level=\"下下签\"\n"
"- Set answer to a brief explanation of why you cannot answer (in English)\n"
"- Leave conclusion, focus_points, advice, keywords as empty lists"
),
"zh-Hant": (
"【範圍檢查 - 以下情況請拒絕:】\n"
@@ -50,7 +56,11 @@ _SCOPE_INSTRUCTIONS = {
"2. 請求塔羅、八字、紫微、星座等其他方法\n"
"3. 問題與占卜無關(編程、天氣等)\n"
"\n"
"拒答時:在回應 JSON 中設置 status=\"refused\""
"拒答時:\n"
"- 設置 status=\"refused\"\n"
"- 設置 sign_level=\"下下签\"\n"
"- 設置 answer 為拒答原因簡述(使用繁體中文)\n"
"- conclusion、focus_points、advice、keywords 留空列表"
),
"zh-CN": (
"【范围检查 - 以下情况请拒绝:】\n"
@@ -58,7 +68,11 @@ _SCOPE_INSTRUCTIONS = {
"2. 请求塔罗、八字、紫微、星座等其他方法\n"
"3. 问题与占卜无关(编程、天气等)\n"
"\n"
"拒答时:在响应 JSON 中设置 status=\"refused\""
"拒答时:\n"
"- 设置 status=\"refused\"\n"
"- 设置 sign_level=\"下下签\"\n"
"- 设置 answer 为拒答原因简述(使用简体中文)\n"
"- conclusion、focus_points、advice、keywords 留空列表"
),
}
@@ -207,10 +207,10 @@ You must explicitly output your reasoning in the following order:
- Self/Response > moving lines > changing lines > Day/Month > still lines
[Expression Style]
Professional, precise, restrained. Speak like someone who truly reads hexagrams.
Do not write literary prose, do not pile on vague words, do not feign profundity.
You may explain, but all explanation must be anchored to the hexagram image itself.
Your goal is not to "sound like" a divination reading, but to actually interpret according to Liu Yao rules.
Write in natural, idiomatic American English. Speak like a wise, plain-spoken advisor — not a mystical fortune teller.
Do not use fortune-cookie language, vague metaphors, or poetic mysticism.
Every explanation must be grounded in the hexagram data, but expressed in terms an ordinary American would understand.
Your goal is to make ancient Chinese wisdom accessible and useful to a modern Western reader, not to sound esoteric or profound.
[Sign-Level Reference Anchoring]
Sign-level assessment should integrate hexagram backdrop and movement/change auspiciousness, referencing the following principles:
@@ -224,30 +224,112 @@ When the hexagram shows mixed auspicious and inauspicious signs, weigh "hexagram
_WORKER_OUTPUT_RULES_ZH_CN = """\
按输出要求严格返回对应的json对象。
conclusion必须结合本卦变卦与关键爻位,不可空谈,至少给出2-4条关键依据
focus_points:本次解读的核心关注点列表,每项为简短陈述,3-5项适中,应从卦象关键信息中提炼
advice:必须逐条对应卦象依据(哪一爻、何种生克冲合旺衰),给出可执行动作,优先回答:最该防什么、最该做什么、何时可推进、何时应暂缓
keywords:中文优先四字,必须来自本次卦象核心判断
answer:必须是完整解读,覆盖总体判断、当前态势、最终趋势、风险点、转机条件、行动优先级,多段文本段间用\\n\\n分隔,首段直指核心态势(偏吉/偏凶/先难后易/成中有阻等)
conclusion分条输出(至少3条),用语朴实直白,像一个正常人在说话
第1条:先说明这是什么卦,这个卦一般代表什么含义。用白话解释,不要引用古文或卦辞
第2条:结合卦象变动,说明可能有哪些变数和关键影响因素
后续条:给出一个正常人可以听懂的结论,如这件事能不能成、有利因素是什么、风险在哪里。可以用"可能""大概率""倾向于""暂时不太理想"等词汇下判断,不要模棱两可
focus_points:断卦要点,告诉读者这个卦具体该怎么看。每项一句话,3-5项。允许使用专业术语(如用神、忌神、世应、动爻、月建、日辰、旺衰、生克冲合等),但每条要点必须既有专业判断也有通俗结论。例如:"用神妻财旺相持世,财运根基稳固""忌神兄弟动而受制,竞争阻碍可化解""变爻回头生世,最终趋势向好"。不要写成建议或泛泛的分析
advice:行动建议+卦象原因。每条建议先给出最直白的行动指引(该做什么、怎么做),然后简要附上卦象依据说明为什么这样建议。每条至少2-3句话,要详实具体。覆盖方向:最该做什么、最该防什么、合适时机、何时暂缓。参考写法:"先从自己家里或办公室开始找,重点检查沙发缝隙和抽屉底部,因为变卦父母子水为世爻,暗示钱可能被覆盖物盖住或掉进角落。""回忆一下丢钱前接触过哪些人,尤其是同事或家人,因为兄弟爻主同辈,可能有人无意中捡到但还没还,可以委婉问一圈。"
keywords:中文四字词语,用词通俗、生活化,符合正常人的阅读理解。例如"可以推进""时机未到""注意风险""贵人相助"等。不要用玄奥冷僻的词。
answer:具体解析,必须用分点形式输出(和conclusion、advice一样分条)。这里可以引入对卦象爻位的深度解读,但要把专业概念用白话讲透,让没学过六爻的人也能看懂意思。不要云里雾里,不要大段古文引用。
sign_level:枚举值固定,必须且只能填以下四个值之一:上上签/中上签/中下签/下下签。"""
_WORKER_OUTPUT_RULES_ZH_HANT = """\
按輸出要求嚴格返回對應的json對象。
conclusion必須結合本卦變卦與關鍵爻位,不可空談,至少給出2-4條關鍵依據
focus_points:本次解讀的核心關注點列表,每項為簡短陳述,3-5項適中,應從卦象關鍵信息中提煉
advice:必須逐條對應卦象依據(哪一爻、何種生剋沖合旺衰),給出可執行動作,優先回答:最該防什麼、最該做什麼、何時可推進、何時應暫緩
keywords:繁體中文優先四字,必須來自本次卦象核心判斷
answer:必須是完整解讀,覆蓋總體判斷、當前態勢、最終趨勢、風險點、轉機條件、行動優先級,多段文本段間用\\n\\n分隔,首段直指核心態勢(偏吉/偏凶/先難後易/成中有阻等)
conclusion分條輸出(至少3條),用語樸實直白,像一個正常人在說話
第1條:先說明這是什麼卦,這個卦一般代表什麼含義。用白話解釋,不要引用古文或卦辭
第2條:結合卦象變動,說明可能有哪些變數和關鍵影響因素
後續條:給出一個正常人可以聽懂的結論,如這件事能不能成、有利因素是什麼、風險在哪裡。可以用"可能""大概率""傾向於""暫時不太理想"等詞彙下判斷,不要模稜兩可
focus_points:斷卦要點,告訴讀者這個卦具體該怎麼看。每項一句話,3-5項。允許使用專業術語(如用神、忌神、世應、動爻、月建、日辰、旺衰、生剋沖合等),但每條要點必須既有專業判斷也有通俗結論。例如:"用神妻財旺相持世,財運根基穩固""忌神兄弟動而受制,競爭阻礙可化解""變爻回頭生世,最終趨勢向好"。不要寫成建議或泛泛的分析
advice:行動建議+卦象原因。每條建議先給出最直白的行動指引(該做什麼、怎麼做),然後簡要附上卦象依據說明為什麼這樣建議。每條至少2-3句話,要詳實具體。覆蓋方向:最該做什麼、最該防什麼、合適時機、何時暫緩。參考寫法:"先從自己家裡或辦公室開始找,重點檢查沙發縫隙和抽屜底部,因為變卦父母子水為世爻,暗示錢可能被覆蓋物蓋住或掉進角落。""回憶一下丟錢前接觸過哪些人,尤其是同事或家人,因為兄弟爻主同輩,可能有人無意中撿到但還沒還,可以委婉問一圈。"
keywords:中文四字詞語,用詞通俗、生活化,符合正常人的閱讀理解。例如"可以推進""時機未到""注意風險""貴人相助"等。不要用玄奧冷僻的詞。
answer:具體解析,必須用分點形式輸出(和conclusion、advice一樣分條)。這裡可以引入對卦象爻位的深度解讀,但要把專業概念用白話講透,讓沒學過六爻的人也能看懂意思。不要雲裡霧裡,不要大段古文引用。
sign_level:此欄位為後端協議枚舉,必須且只能填以下四個值之一:上上签/中上签/中下签/下下签;其他文字內容仍必須使用繁體中文。"""
_WORKER_OUTPUT_RULES_EN = """\
Return the JSON object strictly following the output schema.
conclusion: Must tie back to the hexagram, changed lines, and key line positions. No vague claims. Provide 2-4 key findings.
focus_points: Core points of this reading, each as a brief statement. 3-5 items, distilled from the most significant chart elements.
advice: Each item must cite a specific chart element (which line, what element interaction or strength condition). Prioritize: biggest risk, top action, favorable timing, when to hold back.
keywords: 2-4 concise Liu Yao-style phrases translated into English, such as "Self weakened", "Wealth constrained", "Officer pressure", "moving line brings support", or "void then filled". Avoid Tarot-, astrology-, or karma-style phrasing.
answer: A complete reading covering overall judgment, current situation, final trend, risk points, turning conditions, and action priorities. Separate paragraphs with \\n\\n. The opening paragraph must state the core verdict directly (e.g. leaning auspicious / leaning inauspicious / difficulty-then-ease / success-with-obstacles).
sign_level: Must be exactly one of: 上上签 / 中上签 / 中下签 / 下下签. Always use the Chinese enum value regardless of language."""
═══════════════════════════════════════════════════════════════════════════════
CRITICAL: WRITE FOR ORDINARY AMERICAN READERS
═══════════════════════════════════════════════════════════════════════════════
- This is a divination app for everyday people, not scholars of Chinese metaphysics.
- Write in natural, idiomatic American English. Every sentence must make sense to someone who knows nothing about I Ching, Five Elements, or Chinese philosophy.
- DO NOT use Chinese characters anywhere except:
(a) the sign_level enum values (上上签 / 中上签 / 中下签 / 下下签)
(b) the hexagram name when first mentioned (e.g. "Hexagram 53 - 风山渐 (Gradual Progress)")
- NEVER write Chinese in parentheses to explain terms. Instead of "Strong(旺)", just say "strong" or explain "the element 旺, meaning strong or vigorous in this context".
- NEVER transliterate Chinese terms. Write concepts directly in English.
- Minimize ALL Chinese characters in your output. If it's not a sign_level or hexagram name, it should be English.
═══════════════════════════════════════════════════════════════════════════════
conclusion: A numbered list (at least 3 items), written in plain, conversational English.
Item 1: Name the hexagram and explain in everyday language what it generally suggests — like you are explaining it to a friend over coffee.
Item 2: Describe what key dynamics or possible changes the reading reveals, using ordinary concepts anyone can follow.
Item 3+: Give a clear, honest assessment an ordinary person can understand. Is the situation likely to work out? What could change things? What should they watch for? Use natural qualifiers like "likely", "looks promising", "may be difficult", "there is a real chance", "the odds favor", etc. Do not sound mystical, absolute, or like a fortune cookie.
focus_points: Judgment points — tell the reader specifically what the key interpretive elements are in this hexagram reading. 3-5 items, each one sentence. Use professional hexagram terms from the detail chart (six relations like Officer/Wealth/Parent/Children/Sibling, Self/Response, moving lines, Month Branch, Day Branch, prosperity/weakness, clash/union, generation/restriction). Each point must combine a technical observation with a plain-language conclusion. Examples: "The Wealth line is strong at the Self position — your financial foundation is solid." "The Sibling line moves but is constrained — competition will fade." "A changing line turns back to support the Self line — the overall outcome leans positive." Do NOT write these as advice or vague analysis.
advice: PURE action advice — tell the user what to DO, with ZERO hexagram content. Foreign users cannot understand Liu Yao terminology, so give only plain, direct life advice. EVERY ONE of the following is STRICTLY FORBIDDEN in advice:
- Any hexagram terminology: Officer, Wealth, Parent, Children, Sibling, Self line, Response line, moving line, changing line, line positions, Month Branch, Day Branch, Five Elements, prosperity/weakness, clash/union, generation/restriction, void, hidden, etc.
- Any hexagram-referencing phrases: "this hexagram shows/suggests/indicates...", "according to the lines...", "based on the reading...", "because the X line is...", "the hexagram type suggests..."
- Any Chinese characters, pinyin, or transliterated terms.
CORRECT example (pure advice, what we want): "Start by searching your home thoroughly — focus on low places, under furniture, and inside drawers. Ask family members or roommates if they've seen it. If nothing turns up right away, wait a day and check the same spots again, as things can surface where you least expect."
WRONG example (mixed with hexagram, what we must avoid): "Since the Wealth line is changing and moving toward the Self line, you should search around water sources or places covered by papers. The Sibling line suggests asking colleagues."
Each piece of advice must be at least 2-3 detailed, concrete sentences. Cover: what to actually do, what to watch out for, good timing, when to hold back.
keywords: 2-4 plain English phrases (3-6 words each), using everyday vocabulary. They should feel like natural takeaways, such as "A good time to act", "Watch your spending", "Help is coming", "Wait and see". Nothing mystical or jargon-like.
answer: A detailed breakdown in numbered sections (same format as conclusion and advice). Go deeper into the reading here, explaining the hexagram patterns and what they mean. CRITICAL RULE: if you use any technical concept (e.g. a line is "strong" or "weak", a clash, a hidden influence), you MUST immediately explain what that concept means in plain English. The reading should feel insightful and clear, not obscure. Write for someone curious who genuinely wants to understand, not for a fellow practitioner of Chinese metaphysics.
sign_level: Must be exactly one of: 上上签 / 中上签 / 中下签 / 下下签. Always use these Chinese enum values."""
_FOLLOW_UP_ROLE_PLAYING_ZH = """\
你是一名六爻解卦师,正在回答用户对上一轮解卦结果的追问。用户已经收到过完整的卦象解读,现在对这个结果有后续疑问。这是唯一的一轮追问,你必须给出明确的最终回答。
【核心原则】
- 直接回答用户的追问,给出明确结论,不要模棱两可。
- 可以引用上一轮的卦象信息来辅助回答,但不要复述整个卦象解读。
- 不要反问用户,不要以"你想了解哪方面?"等方式回复——这是唯一一次追问机会,直接给出你的判断。
- 保持专业但平实的语气,不要故弄玄虚。
"""
_FOLLOW_UP_ROLE_PLAYING_ZH_HANT = """\
你是一名六爻解卦師,正在回答使用者對上一輪解卦結果的追問。使用者已經收到過完整的卦象解讀,現在對這個結果有後續疑問。這是唯一的一輪追問,你必須給出明確的最終回答。
【核心原則】
- 直接回答使用者的追問,給出明確結論,不要模稜兩可。
- 可以引用上一輪的卦象資訊來輔助回答,但不要複述整個卦象解讀。
- 不要反問使用者,不要以"你想了解哪方面?"等方式回覆——這是唯一一次追問機會,直接給出你的判斷。
- 保持專業但平實的語氣,不要故弄玄虛。
"""
_FOLLOW_UP_ROLE_PLAYING_EN = """\
You are a Liu Yao divination advisor responding to a follow-up question. The user has already received a complete hexagram reading. They now have a follow-up question about that reading or its implications. This is the ONLY round of follow-up — you MUST give a definitive, final answer.
[Core Principles]
- Answer the user's follow-up question directly and give a clear, unambiguous conclusion.
- You may reference the previous reading when helpful, but do NOT repeat the entire hexagram analysis.
- Do NOT ask the user follow-up questions or say things like "what aspect would you like to know more about?" — this is their only follow-up chance, so give your judgment directly.
- Keep your tone professional but plain-spoken. Write in natural American English. Do not sound mystical.
"""
_FOLLOW_UP_OUTPUT_RULES_ZH_CN = """\
按输出要求返回对应的json对象。这是追问模式,只需要填 status 和 answer。
answer:直接回答用户的追问,给出明确的最终判断。不要重新做一遍完整解卦。不要反问用户。重点回答用户问什么,篇幅控制在必要范围内。
status:正常回答填"success",拒绝回答填"refused"
"""
_FOLLOW_UP_OUTPUT_RULES_ZH_HANT = """\
按輸出要求返回對應的json對象。這是追問模式,只需要填 status 和 answer。
answer:直接回答使用者的追問,給出明確的最終判斷。不要重新做一遍完整解卦。不要反問使用者。重點回答使用者問什麼,篇幅控制在必要範圍內。
status:正常回答填"success",拒絕回答填"refused"
"""
_FOLLOW_UP_OUTPUT_RULES_EN = """\
Return the JSON object. This is follow-up mode — only status and answer are needed.
answer: Answer the user's follow-up question directly with a clear, definitive judgment. Do NOT redo the full hexagram analysis. Do NOT ask the user follow-up questions. Focus on what the user asked, keep it concise but thorough.
status: Use "success" for normal responses, "refused" if the question should not be answered.
"""
def get_worker_role_playing(language: str) -> str:
@@ -264,3 +346,19 @@ def get_worker_output_rules(language: str) -> str:
if language.startswith("zh-Hant") or language.startswith("zh_Hant"):
return _WORKER_OUTPUT_RULES_ZH_HANT
return _WORKER_OUTPUT_RULES_ZH_CN
def get_follow_up_role_playing(language: str) -> str:
if language.startswith("en"):
return _FOLLOW_UP_ROLE_PLAYING_EN
if language.startswith("zh-Hant") or language.startswith("zh_Hant"):
return _FOLLOW_UP_ROLE_PLAYING_ZH_HANT
return _FOLLOW_UP_ROLE_PLAYING_ZH
def get_follow_up_output_rules(language: str) -> str:
if language.startswith("en"):
return _FOLLOW_UP_OUTPUT_RULES_EN
if language.startswith("zh-Hant") or language.startswith("zh_Hant"):
return _FOLLOW_UP_OUTPUT_RULES_ZH_HANT
return _FOLLOW_UP_OUTPUT_RULES_ZH_CN
@@ -46,7 +46,7 @@ class JsonReActAgent(ReActAgent):
*,
output_model: type[BaseModel],
) -> dict[str, Any]:
_, payload = await finalize_json_response(
_, result = await finalize_json_response(
model=self.model,
formatter=self.formatter,
base_messages=[
@@ -56,4 +56,4 @@ class JsonReActAgent(ReActAgent):
output_model=output_model,
retries=self._finalize_retries,
)
return payload
return result.model_dump(mode="json", by_alias=True)
+6 -12
View File
@@ -55,7 +55,7 @@ from core.agentscope.runtime.protocols import PipelineLike
@dataclass(frozen=True)
class StageExecutionResult:
message: Msg
payload: dict[str, Any]
validated_output: WorkerAgentOutputLite | FollowUpOutput
response_metadata: dict[str, Any]
@@ -242,7 +242,7 @@ class AgentScopeRunner:
derived_divination=derived_divination,
language=language,
)
worker_output = worker_output_model.model_validate(worker_result.payload)
worker_output = worker_result.validated_output
await self._emit_step_event(
pipeline=pipeline,
run_input=run_input,
@@ -284,9 +284,10 @@ class AgentScopeRunner:
llm_config=stage_config.llm_config,
tools=None,
now_utc=datetime.now(timezone.utc),
runtime_mode=runtime_mode.value,
)
_, worker_payload_raw = await finalize_json_response(
_, worker_payload = await finalize_json_response(
model=tracking_model,
formatter=formatter,
base_messages=[Msg("system", system_prompt, "system"), *input_messages],
@@ -294,7 +295,6 @@ class AgentScopeRunner:
retries=2,
language=language,
)
worker_payload = worker_output_model.model_validate(worker_payload_raw)
response_metadata = self._llm_pricing_service.build_usage_metadata(
model=stage_config.model_code,
usage_summary=tracking_model.usage_summary(),
@@ -312,9 +312,8 @@ class AgentScopeRunner:
name=stage_config.agent_type.value,
role="assistant",
content=worker_payload.answer,
metadata=worker_payload.model_dump(mode="json", exclude_none=True),
),
payload=worker_payload.model_dump(mode="json", exclude_none=True),
validated_output=worker_payload,
response_metadata=response_metadata,
)
@@ -336,7 +335,7 @@ class AgentScopeRunner:
question=raw_user_text, language=language
)
if derived_divination is not None and context_messages:
if context_messages:
last = context_messages[-1]
if last.role == "user":
context_messages[-1] = Msg(
@@ -346,11 +345,6 @@ class AgentScopeRunner:
)
return context_messages
if context_messages:
last = context_messages[-1]
if last.role == "user":
return context_messages
user_msg = Msg(name="user", role="user", content=user_text)
return [*context_messages, user_msg]
@@ -1,9 +1,8 @@
from __future__ import annotations
import json
import re
from collections.abc import Awaitable
from typing import Any, Protocol
from typing import Any, Protocol, TypeVar
from core.agentscope.utils.parsing import extract_text_content, parse_json_dict
from pydantic import BaseModel, ValidationError
@@ -14,6 +13,8 @@ from core.logging import get_logger
logger = get_logger("core.agentscope.utils.json_finalize")
T = TypeVar("T", bound=BaseModel)
class FormatterProtocol(Protocol):
def format(self, *args: Any, **kwargs: Any) -> Awaitable[Any]: ...
@@ -41,13 +42,13 @@ def build_json_finalize_instruction(
if language.startswith("en"):
language_part = """
═══════════════════════════════════════════════════════════════════════════════
ENGLISH OUTPUT REQUIRED - NO CHINESE SENTENCES ALLOWED
═══════════════════════════════════════════════════════════════════════════════
Return JSON only. All string values (except sign_level) must be in English.
Do NOT write Chinese sentences. Translate all terminology to English.
═══════════════════════════════════════════════════════════════════════════════
ENGLISH OUTPUT REQUIRED - MINIMIZE CHINESE CHARACTERS
═══════════════════════════════════════════════════════════════════════════════
Return JSON only. All string values (except sign_level and hexagram name) must be in English.
Write in natural American English for ordinary readers.
The sign_level MUST be one of: 上上签 / 中上签 / 中下签 / 下下签
═══════════════════════════════════════════════════════════════════════════════"""
═══════════════════════════════════════════════════════════════════════════════"""
elif language.startswith("zh-Hant"):
language_part = """
@@ -73,10 +74,10 @@ async def finalize_json_response(
model: Any,
formatter: FormatterProtocol,
base_messages: list[Msg],
output_model: type[BaseModel],
output_model: type[T],
retries: int,
language: str | None = None,
) -> tuple[Any, dict[str, Any]]:
) -> tuple[Any, T]:
schema_json = json.dumps(
output_model.model_json_schema(),
ensure_ascii=True,
@@ -119,59 +120,10 @@ async def finalize_json_response(
try:
validated = output_model.model_validate(payload)
validated_payload = validated.model_dump(
mode="json", by_alias=True, exclude_none=True
)
language_error = _validate_payload_language(
payload=validated_payload,
language=language,
)
if language_error:
logger.warning(
"json_finalize_language_retry",
output_model=output_model.__name__,
attempt=attempt,
language=language,
reason=language_error,
)
last_error = language_error
continue
return response, validated_payload
return response, validated
except ValidationError as exc:
last_error = str(exc)
raise RuntimeError(
f"failed to finalize structured output for {output_model.__name__}: {last_error}"
)
def _validate_payload_language(*, payload: dict[str, Any], language: str | None) -> str:
if language is None or not language.startswith("en"):
return ""
offenders = _collect_cjk_fields(payload, path="")
if not offenders:
return ""
return (
"English output required, but Chinese characters were found in user-visible "
f"JSON field(s): {', '.join(offenders[:8])}. Rewrite those values entirely in English. "
"Keep only sign_level as the required Chinese enum value."
)
def _collect_cjk_fields(value: Any, *, path: str) -> list[str]:
if isinstance(value, dict):
results: list[str] = []
for key, item in value.items():
if key == "sign_level":
continue
child_path = key if not path else f"{path}.{key}"
results.extend(_collect_cjk_fields(item, path=child_path))
return results
if isinstance(value, list):
results = []
for index, item in enumerate(value):
results.extend(_collect_cjk_fields(item, path=f"{path}[{index}]"))
return results
if isinstance(value, str) and re.search(r"[\u4e00-\u9fff]", value):
return [path or "<root>"]
return []
+4 -2
View File
@@ -6,8 +6,9 @@ from schemas.agent.forwarded_props import (
)
from schemas.agent.forwarded_props import RuntimeMode
from schemas.agent.runtime_models import (
AgentOutput,
PersistedAgentOutput,
RunStatus,
SignLevel,
ToolAgentOutput,
ToolStatus,
WorkerAgentOutputLite,
@@ -18,11 +19,12 @@ from schemas.agent.visibility import SystemVisibilityBit, VisibilityMask, bit_ma
__all__ = [
"AgentType",
"AgentOutput",
"PersistedAgentOutput",
"ForwardedPropsPayload",
"ClientTimeContext",
"RunStatus",
"RuntimeMode",
"SignLevel",
"SystemAgentLLMConfig",
"SystemVisibilityBit",
"ToolAgentOutput",
+21 -7
View File
@@ -1,7 +1,7 @@
from __future__ import annotations
from enum import Enum
from typing import Any, Literal
from typing import Any
from pydantic import BaseModel, ConfigDict, Field
@@ -20,6 +20,13 @@ class ToolStatus(str, Enum):
PARTIAL = "partial"
class SignLevel(str, Enum):
BEST = "上上签"
GOOD = "中上签"
MODERATE = "中下签"
WORST = "下下签"
class ErrorInfo(BaseModel):
model_config = ConfigDict(extra="forbid")
@@ -43,13 +50,13 @@ class ToolAgentOutput(BaseModel):
class WorkerAgentOutputLite(BaseModel):
model_config = ConfigDict(extra="forbid")
status: RunStatus = RunStatus.SUCCESS
sign_level: Literal["上上签", "中上签", "中下签", "下下签"] | None = None
status: RunStatus
sign_level: SignLevel
answer: str = Field(min_length=1, max_length=4000)
conclusion: list[str] = Field(default_factory=list, max_length=6)
focus_points: list[str] = Field(default_factory=list, max_length=6)
advice: list[str] = Field(default_factory=list, max_length=6)
keywords: list[str] = Field(default_factory=list, max_length=8)
answer: str = ""
error: ErrorInfo | None = None
@@ -61,14 +68,21 @@ class FollowUpOutput(BaseModel):
error: ErrorInfo | None = None
class AgentOutput(WorkerAgentOutputLite):
class PersistedAgentOutput(BaseModel):
model_config = ConfigDict(extra="forbid")
status: RunStatus
sign_level: SignLevel
answer: str = Field(min_length=1, max_length=4000)
conclusion: list[str] = Field(default_factory=list, max_length=6)
focus_points: list[str] = Field(default_factory=list, max_length=6)
advice: list[str] = Field(default_factory=list, max_length=6)
keywords: list[str] = Field(default_factory=list, max_length=8)
error: ErrorInfo | None = None
divination_derived: DerivedDivinationData | None = None
WorkerAgentOutput = WorkerAgentOutputLite
RuntimeAgentOutput = AgentOutput | FollowUpOutput
RuntimeAgentOutput = PersistedAgentOutput | FollowUpOutput
def resolve_worker_output_model(
+2 -2
View File
@@ -6,7 +6,7 @@ from typing import Any, ClassVar
from uuid import UUID
from pydantic import BaseModel, ConfigDict, Field
from schemas.agent.runtime_models import AgentOutput, FollowUpOutput
from schemas.agent.runtime_models import FollowUpOutput, PersistedAgentOutput
from ..agent import AgentType, ToolAgentOutput
@@ -25,7 +25,7 @@ class AgentChatMessageMetadata(BaseModel):
agent_type: AgentType | None = None
user_message_attachments: list[UserMessageAttachment] | None = None
tool_agent_output: ToolAgentOutput | None = None
agent_output: AgentOutput | FollowUpOutput | None = None
agent_output: PersistedAgentOutput | FollowUpOutput | None = None
class AgentChatMessage(BaseModel):
+3 -3
View File
@@ -7,7 +7,7 @@ from uuid import UUID
from pydantic import BaseModel, ConfigDict, Field
from schemas.agent.runtime_models import ErrorInfo
from schemas.agent.runtime_models import ErrorInfo, RunStatus, SignLevel
from schemas.domain.chat_message import AgentChatMessage
from schemas.domain.divination import DerivedDivinationData
@@ -220,8 +220,8 @@ class HistoryMessage(BaseModel):
class HistoryAgentOutput(BaseModel):
model_config = ConfigDict(extra="forbid")
status: Literal["success", "failed"] | None = None
sign_level: Literal["上上签", "中上签", "中下签", "下下签"] | None = None
status: RunStatus | None = None
sign_level: SignLevel | None = None
conclusion: list[str] = Field(default_factory=list)
focus_points: list[str] = Field(default_factory=list)
advice: list[str] = Field(default_factory=list)
@@ -2,10 +2,7 @@ from __future__ import annotations
from core.agentscope.prompts.agent_prompt import build_agent_prompt
from core.agentscope.prompts.system_prompt import build_system_prompt
from core.agentscope.prompts.user_prompt import (
build_divination_user_prompt,
build_follow_up_user_prompt,
)
from core.agentscope.prompts.user_prompt import build_follow_up_user_prompt
from schemas.agent.system_agent import AgentType, SystemAgentLLMConfig
@@ -17,7 +14,7 @@ def test_system_prompt_safety_has_refusal_rules_en() -> None:
)
assert "<!-- SAFETY_START -->" in prompt
assert "REFUSE IMMEDIATELY" in prompt
assert "-> REFUSE" in prompt
assert "Tarot" in prompt
assert "Ba Zi" in prompt
@@ -30,7 +27,7 @@ def test_system_prompt_safety_has_refusal_rules_zh() -> None:
)
assert "<!-- SAFETY_START -->" in prompt
assert "必须立即拒绝" in prompt
assert "必须拒绝" in prompt
assert "塔罗" in prompt
assert "八字" in prompt
@@ -76,7 +73,7 @@ def test_agent_prompt_keeps_only_identity_and_domain_flow() -> None:
)
assert "focus_points" in prompt
assert "段间用\\n\\n" in prompt
assert "断卦要点" in prompt
assert "[role_playing]" in prompt
assert "[output_json_rules]" in prompt
@@ -99,7 +96,7 @@ def test_system_prompt_requires_paragraph_breaks_for_answer() -> None:
language="zh-CN",
)
assert "段间用\\n\\n" in prompt
assert "具体解析" in prompt
def test_user_prompt_has_language_constraint_en() -> None:
+2 -2
View File
@@ -87,7 +87,7 @@ def test_build_instruction_no_language_constraint_when_none() -> None:
@pytest.mark.asyncio
async def test_finalize_json_response_returns_alias_keys() -> None:
model = _Model(payload={"ganzhi": {"yearGanZhi": "丙午"}})
_, payload = await finalize_json_response(
_, result = await finalize_json_response(
model=model,
formatter=_Formatter(),
base_messages=[],
@@ -95,4 +95,4 @@ async def test_finalize_json_response_returns_alias_keys() -> None:
retries=0,
)
assert payload == {"ganzhi": {"yearGanZhi": "丙午"}}
assert result.model_dump(mode="json", by_alias=True) == {"ganzhi": {"yearGanZhi": "丙午"}}